フロントエンドバイトコードの仕様
(1)
- 1: LB命令
- 1:
- LB(0, ...);を生成します。optはゼロで、ラベル番号は直前に生成したラベル番号+1が自動的に指定されます。
- 41(op):
- LB(opt, no);を生成します。opt=op&0xff;で、no=「直前に生成したラベル番号+1」+op/256;になります。
- 2: LIMM命令, CP命令
- 2(imm)(reg0):
- immの値が定数を表しているときは、LIMM(32, reg0, imm);命令を生成します。32の部分をほかの数値にさせることもできて、その際はimmやreg0の部分でプリフィックスをつけて指定することになります。
- immの値がレジスタを表しているときは、CP(32, reg0, reg1);命令を生成します。32の部分をほかの数値にさせることもできて、その際はimmやreg0の部分でプリフィックスをつけて指定することになります。
- immは以下のルールでエンコードされています。
- 4ビットモードのとき:
- rep0はリピートレジスタ0を表していて、直前に代入されたRxxレジスタを意味します。
- 8ビットモードのとき:
80...96 | 0x0~0x16 |
97...9f | 下記の表を参照 |
a0...ae | R00~R0E |
af | R3F |
b0...b7 | rep0~rep7 |
b8...bf | -0x8~-0x1 |
97 | 98 | 99 | 9a | 9b | 9c | 9d | 9e | 9f |
0x20 | 0x18 | 0x40 | 0x80 | 0x100 | 0xff | 0x7f | 0x3f | 0x1f |
(早くも力尽きた・・・)
- 3: PLIMM命令
- 3(imm):
- PLIMM(P3F, ...);を生成します。ラベル番号は直前に生成したラベル番号+immが使われます。しかし、この命令がデータラベルを指し示すことはないため、ラベル番号は単純な加算、減算ではなく、1つ先、2つ先、1つ前、2つ前・・・の分岐可能なラベルという意味に解釈されます。またoptが2や3のラベルを指し示すこともできず、それらもスキップしながら目的のラベル番号を探します。
- 43(imm)(preg):
- PLIMM(Pxx, ...);を生成します。ラベル番号は直前に生成したラベル番号+immが使われます。しかし、この命令がopt=1以外のラベルを指し示すことはないため、ラベル番号は単純な加算、減算ではなく、1つ先、2つ先、1つ前、2つ前・・・の代入可能なラベルという意味に解釈されます。