# HG changeset patch # User Nobuyasu Oshiro # Date 1325895418 -32400 # Node ID fb5994f49abddde5256d638f6cbd3d979633cf13 # Parent 07c5304622ace48effa6cf0ede3457c26bcf1cf2 modify diff -r 07c5304622ac -r fb5994f49abd presen/index.html --- a/presen/index.html Sat Jan 07 08:27:46 2012 +0900 +++ b/presen/index.html Sat Jan 07 09:16:58 2012 +0900 @@ -656,7 +656,7 @@ } -

Intel64 ではレジスタが増えていてfastcallは標準でつくようになっている。

+

Intel64 ではレジスタが増えていてfastcallの機能は標準でつくようになっている。

@@ -665,6 +665,7 @@
  • fastcall属性の付与によりMicro-C版に速度で勝るようになった。

  • +
    @@ -801,22 +802,6 @@ --> -

    環境付き継続:実装の問題

    @@ -901,9 +886,8 @@
    引数渡しに使われるレジスタの数(gcc)
    -
  • GCC版の最適化無しの場合、引数を全て一時変数に代入するという処理が入る。 - その為に明らかに遅くなっていることが分かる。
  • -
  • だがGCCの最適化有りの場合はMicro-C版よりも早い。
  • +
  • 最適化無しだと、引数を全て一時変数に代入するGCCは遅い。 + だが、最適化にかければ不要な代入は減りMicro-C版より早くなる。
  • @@ -1018,6 +1002,120 @@
    +
    +

    環境付き継続

    + + + + + + + + + + + + +
    生成する為のコード生成されるTree
    +
    +
    +    case RID_CbC_RET:
    +{
    +  tree value, stmt, label, tlab, decl;
    +  c_parser_consume_token (parser);
    +
    +  stmt = c_begin_stmt_expr ();
    +  cbc_return_f = c_parser_peek_token (parser)->value;
    +  location_t location = c_parser_peek_token (parser)->location;
    +
    +  /* create label. (__label__ _cbc_exit0;) */
    +  label = get_identifier ("_cbc_exit0");
    +  tlab = declare_label (label);
    +  C_DECLARED_LABEL_FLAG (tlab) = 1;
    +  add_stmt (build_stmt (location, DECL_EXPR, tlab));
    +
    +  /* declare retval.  (int retval;) */
    +  tree decl_cond =
    +    build_decl (location, VAR_DECL, get_identifier ("retval"),
    +		TREE_TYPE (TREE_TYPE (current_function_decl)));
    +  TREE_STATIC (decl_cond) = 1;
    +  TREE_USED (decl_cond) = 1;
    +
    +  /* Use thread-local */
    +  DECL_TLS_MODEL (decl_cond) = decl_default_tls_model (decl_cond);
    +  DECL_NONLOCAL (decl_cond) = 1;
    +  add_stmt (build_stmt(location, DECL_EXPR,  pushdecl (decl_cond)));
    +
    +  /* define nested function.  */
    +  decl =
    +    cbc_finish_nested_function (location, label, decl_cond);
    +  TREE_USED(decl) = 1;
    +
    +  /* define if-ed goto label and return statement. */
    +  cbc_finish_labeled_goto (location, label, decl_cond);
    +
    +  /* get pointer to nested function.  */
    +  value = build_addr (decl , current_function_decl);
    +  TREE_USED (current_function_decl) = 1;
    +  SET_EXPR_LOCATION (value, location);
    +  add_stmt (value);
    +
    +  TREE_SIDE_EFFECTS (stmt) = 1;
    +  expr.value = c_finish_stmt_expr (location, stmt);
    +  expr.original_code = ERROR_MARK;
    +}
    +			 
    +
    + +
    +
    + +
    +

    環境付き継続

    + + + + + + + + + +
    生成しているコード生成されるTree
    +
    +
    +//goto c1(__return, __environment);
    +goto c1(({
    +	  __label__ _cbc_exit0;
    +	  static int retval;
    +	  void _cbc_internal_return(int retval_, void *_envp) {
    +	    retval = retval_;
    +	    goto _cbc_exit0; 
    +          }
    +	  if (0) { 
    +            _cbc_exit0:
    +	    return retval; 
    +          }
    +	  _cbc_internal_return;
    +	}), __environment);
    +	  
    +
    + +
    +
    + +
    +

    +
  • 引数の並びの上書きにコピーが無い。
  • +
    +__code cs_a(int a, int b) {
    +  goto cs_b(b,a);
    +}
    +	  
    + +
    + +