もっとシンプルなものにしよう。
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; // SR01 int b; // SR02 { int c; // SR03 } int d; // SR02 { int e; // SR03 } d = (a + b) * d; // (a + b)が一時変数としてSR03に格納される // SR03 = a + b; // SR02 = 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 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
- | ! - | | !
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: DFUNC 0x0000 DLINE 1 // '{'の位置 FUNCET 0x03 0x03 DLINE 2 ADDI32 R00 R01 R02 DLINE 3 // '}'の位置 FUNCLV 0x03 func: DFUNC 0x0001 DLINE 5 FUNCET 0x02 0x00 DLINE 6 LDSRC4 SR00 0x0000 DLINE 7 LDSRC4 SR01 0x0004 LDFRSR FR01 SR00 LDFRSR FR02 SR01 CALL 0x0000 LDRF SR00 FR00 FUNCLV 0x02 # コンパイル時に確定する定数のテーブル ConstantTable: 0x0000: 3 0x0004: 4 SymbolTable: 0x0000: int add(int,int) 0x0004: void func()
構文解析が終わった後,コード生成より前にやること。