メモ Edit

コード生成 Edit

もっとシンプルなものにしよう。

レジスタの概要 Edit

  • 1つのレジスタのサイズは4バイト。
  • レジスタ数は暫定で64。
  • s64,f64など64bitな値型はレジスタに格納することができないのでstructやpodなどと同じ扱いを受ける。
  • ↑64bitな値型を頻繁に使うことはないという判断。

変数とレジスタ Edit

  • ローカル変数は全てレジスタに割り当てられる。
  • スコープを考慮してレジスタの使用数はなるべく少なくて済むように最適化される。
  • 一時変数もレジスタに割り当てられる。
    すべてを展開すべてを収束
      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; // R00
        int b; // R01
        {
            int c; // R03
        }
        int d; // R02
        {
            int e; // R03
        }
        d = (a + b) * d; 
        // (a + b)が一時変数としてR03に格納される
        // R03 = a + b; 
        // R02 = R03 * R02;
    }
    };

引数とレジスタ Edit

  • 引数は先頭から順番にレジスタに割り当てられる。
  • 非staticなメンバ関数はR00にthisポインタが割り当てられる。
    すべてを展開すべてを収束
      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)
        {
            // R00 : this
            // R01 : addValue
        }
    }
    

戻り値とレジスタ Edit

  • 戻り値はR00に格納される。
    すべてを展開すべてを収束
      1
      2
      3
      4
      5
      6
      7
      8
    
     
    -
    |
    -
    |
    !
    !
     
    
    utility Hoge
    {
        static int GetOne()
        {
            return 1; // R00 = 1
        }
    };
    

アセンブラのイメージ Edit

すべてを展開すべてを収束
  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   R00 0x0000
  LOADC   R01 0x0004
  ADDI32  R00 R00 R01
  RETURN
 
# レジスタのマッピング情報
RegisterMap:
  R00: L2 i 
 
# コンパイル時に確定する定数のテーブル
ConstantTable:
  0x0000: 3
  0x0004: 4

命令コード Edit

命令書式コメント
LDCLDC Reg ConstantTableIndexConstantTableの値を指定レジスタにロード
LDRLDR Reg1 Reg2Reg2の値をReg1にロード
LDPTRLDPTR Reg1 Reg2Reg2の値をアドレスとみなし,Reg2が指す値を取得する
ADDxxxADDI32 Reg1 Reg2 Reg3Reg1 = Reg2 + Reg3
SUBxxxSUBI32 Reg1 Reg2 Reg3Reg1 = Reg2 - Reg3
MULxxxMULS32 Reg1 Reg2 Reg3Reg1 = Reg2 * Reg3
DIVxxxMULS32 Reg1 Reg2 Reg3Reg1 = Reg2 / Reg3
MODxxxMODS32 Reg1 Reg2 Reg3Reg1 = Reg2 % Reg3
PUSHREGPUSHREG PushRegisterCount
POPREGPOPREG PopRegisterCount
PUSHPUSH PushStackSize
POPPOP PopStackSize
CALLCALL SymbolTableIndex
RETURNRETURN

    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS