もっとシンプルなものにしよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
- | - | | | | | | | ! !
struct Register { union { u32 data32; u64 data64; s32 i32val; s64 i64val; f32 f32val; f64 f64val; void* ptr; // 64bit環境だとこれは8バイト。 }; };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
- | - | | - | ! | - | ! | | | | ! !
utility Hoge { static void func() { int a; // R01 int b; // R02 { int c; // R03 } int d; // R02 { int e; // R03 } d = (a + b) * d; // (a + b)が一時変数としてR03に格納される // R03 = a + b; // R02 = R03 * R02; } };
1 2 3 4 5 6 7 8
- | - | ! !
utility Hoge { static int GetOne() { return 1; // FR00 = 1 } };
1 2 3 4 5 6 7 8 9 10 11 12 13
- | | | | | - | | ! !
pod Vector3 { float x; float y; float z; void func(float addValue) { // FR01 : this // FR02 : addValue } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
- | | !
0: void func() 1:{ 2: int i = 3; 3: i = i + 4; 4:} # 命令コード Instruction: LOADC R01 0x0000 LOADC R02 0x0004 ADDI32 R01 R01 R02 RETURN # ローカル変数のレジスタマッピング情報 RegisterMap: R01: L2 i # コンパイル時に確定する定数のテーブル ConstantTable: 0x0000: 3 0x0004: 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
- | ! - | | !
0:int add(int a, int b) 1:{ 2: return a + b; 3:} 4:void func() 5:{ 6: int i = 3; 7: i = add(i , 4); 8:} # 命令コード Instruction: add: FUNCIN 0x03 0x03 // FunctionIn レジスタを3つ確保。そのうち,関数レジスタの内容を先頭から3つコピー。(戻り値が組み込み型なので本当は1つでいいのだけども,それは最適化でなんとかする) ADDI32 R00 R01 R02 // AddInt32 FUNCRT 0x03 // FunctionReturn レジスタを3つ解放。そのうち,R00を戻り値レジスタにコピー。 func: FUNCIN 0x02 0x00 LDSC32 SR00 0x0000 LDSC32 SR01 0x0004 LDFR FR01 SR00 // FuncReg01 = i LDFR FR02 SR01 // FuncReg02 = 4 CALL 0x0000 // addをコール LDRF SR00 FR00 // StackReg00 = FunctReg00
構文解析が終わった後,コード生成より前にやること。