# HG changeset patch # User Nobuyasu Oshiro # Date 1325150384 -32400 # Node ID 9dc6013b0559bcc8638ab86e609d50be7e4768c8 # Parent 1399414ea3f670670d21b43365b6094908960400 modify explanation of tce diff -r 1399414ea3f6 -r 9dc6013b0559 presen/index.html --- a/presen/index.html Thu Dec 29 16:01:24 2011 +0900 +++ b/presen/index.html Thu Dec 29 18:19:44 2011 +0900 @@ -247,11 +247,11 @@

GCC

-
  • CbCの実装においてはGeneric Tree生成部分とRTLへの変換部分に修正が加えられる。
  • - +

    -
  • Generic Tree生成部分について触れてみる。
  • +
  • CbCの実装においてはGeneric Tree生成部分とRTLへの変換部分に修正が加えられる。
  • +
  • Generic Tree生成部分について詳しく触れてみる。
  • @@ -259,10 +259,17 @@
  • Generic Treeではソースコードの内容が FUNCTION_TYPE, CALL_EXPR, MODIFY_EXPR 等と言った形で表される。
  • + + + + + + + @@ -302,7 +309,7 @@
    値の代入:MODIFY_EXPR 関数呼び出し:CALL_EXPR
    命令b = a * 10func(a,10)
    Generic
    Tree
    -
  • CbCの実装においてこのGeneric Treeの生成を意識していくことになる。
  • +
  • CbCの実装においてこのGeneric Treeの生成を意識していくことになる。
  • @@ -412,7 +419,7 @@
  • i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。
  • 関数に『__attribute__ ((fastcall))』をつけることで使えるようになる。
  • -
  • __code で宣言された関数は自動でfastcall属性が付与されるように。
  • +
  • __codeで宣言された関数は自動でfastcall属性が付与されるように以下のコードを挿入。
  •  if(!TARGET_64BIT) {
    @@ -452,15 +459,77 @@
           

    CbCの実装:TCE

    Tail Call Elimination(TCE):末尾除去

    -
  • 関数呼び出しをcallではなくjmp命令で行ことでreturnを1度で済ませる最適化。
  • - +
      +
    • 関数呼び出しをcallではなくjmp命令で行う最適化。
    • +
    +
  • 以下のソースの場合 関数a から関数b へjmp命令で処理が移る。
  • + + + + +
    + +
    +int main() {
    +  int a = f(2);
    +  printf("main:num=%d\n",num);
    +  return 0;
    +}
    +int a(int num) {
    +  return g(num+5);
    +}
    +int b(int num) {
    +  printf("g:a = %d\n",num);
    +  return num+3;
    +}	  
    +	
    +	
    +
    + +
    +
    + +
    +

    CbCの実装:TCEの動作

  • CbCにおけるコードセグメントへの継続はこのTCEを用いて実装されている。
  • +
      +
    • jmp命令により呼び出し元関数と同じ範囲のスタックを使うことになる。
    • +
    +

    + +

    +
  • TCEにかかるには条件が幾つかある。
  • CbCの実装:TCE

    -
  • TCEにより関数へjmp命令で処理を移すことを利用。
  • +
  • TCEにかかる条件
  • +
      +
    1. caller側とcallee側の戻値の型の一致している。
    2. +
    3. 関数呼び出しがリターン直前に行われている。
    4. +
    5. 呼出先関数の引数に用いられるスタックサイズが呼出元のそれより少ない。
    6. +
    7. 引数の並びのコピーに上書きがない。
    8. +
    +
    + +
    +

    CbCの実装:TCE

    +
  • 条件を回避する為以下の実装にする。
  • +
      +
    1. 型はvoid型で統一。
    2. +
    3. gotoの直後にreturnを置く。
    4. +
    5. スタックサイズは固定。
    6. +
    7. 引数は一旦、一時変数にコピーする。
    8. +
    +
    +
    + +
    +

    CbCの実装:TCE

    +
  • コードセグメントの継続 -> TCEにより吐かれるjmp命令を利用。
  • +

    具体的な実装内容

      diff -r 1399414ea3f6 -r 9dc6013b0559 presen/omni/func_call.graffle --- a/presen/omni/func_call.graffle Thu Dec 29 16:01:24 2011 +0900 +++ b/presen/omni/func_call.graffle Thu Dec 29 18:19:44 2011 +0900 @@ -44,66 +44,12 @@ Creator Nobuyasu Oshiro DisplayScale - 1 0/72 in = 1 0/72 in + 1 0/72 in = 1.0000 in GraphDocumentVersion 8 GraphicsList - AllowLabelDrop - - Class - LineGraphic - ID - 76 - Points - - {302.5, 202.25} - {318.5, 202.25} - - Style - - stroke - - HeadArrow - FilledArrow - HeadScale - 0.82857084274291992 - TailArrow - 0 - TailScale - 0.5 - - - - - AllowLabelDrop - - Class - LineGraphic - ID - 75 - Points - - {202.75, 228.25} - {218.75, 228.25} - - Style - - stroke - - HeadArrow - FilledArrow - HeadScale - 0.82857084274291992 - TailArrow - 0 - TailScale - 0.5 - - - - Bounds {{148.5, 334.59875}, {58, 22}} Class @@ -558,93 +504,6 @@ Bounds - {{40.5, 276.75}, {69, 22}} - Class - ShapedGraphic - ID - 50 - Magnets - - {1, 1} - {1, -1} - {-1, -1} - {-1, 1} - {0, 1} - {0, -1} - {1, 0} - {-1, 0} - {-0.5, -0.233518} - {-0.49144199, 0.26006299} - {0.50711799, -0.224086} - {0.50711799, 0.26717901} - {-0.27430999, -0.47402799} - {0.27978, -0.47847801} - {0.29393801, 0.54304397} - {-0.28623199, 0.55380398} - - Shape - Rectangle - Style - - fill - - Draws - NO - - shadow - - Draws - NO - - stroke - - Draws - NO - - - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc - -\f0\fs28 \cf0 Stack\ -Pointer} - VerticalPad - 0 - - - - AllowLabelDrop - - Class - LineGraphic - ID - 49 - Points - - {102.5, 287.25} - {118.5, 287.25} - - Style - - stroke - - HeadArrow - FilledArrow - HeadScale - 0.82857084274291992 - TailArrow - 0 - TailScale - 0.5 - - - - - Bounds {{305.5, 148}, {58, 22}} Class ShapedGraphic @@ -999,7 +858,7 @@ MasterSheets ModificationDate - 2011-12-28 16:28:04 +0000 + 2011-12-29 09:00:29 +0000 Modifier Nobuyasu Oshiro NotesVisible @@ -1080,7 +939,7 @@ Frame - {{328, 65}, {693, 938}} + {{449, 64}, {693, 938}} ListView OutlineWidth diff -r 1399414ea3f6 -r 9dc6013b0559 presen/pix/continuation.png Binary file presen/pix/continuation.png has changed