OSECPUの仮想CPUの命令セット
ver.0.00
NOP 00 1バイト命令
LOADINT Rxx, imm32 02 [Rxx] [imm32] 6バイト命令
COPYINT Rxx, Rxx 06 [Rxx] [Rxx] 3バイト命令
ADDINT Rxx, Rxx, Rxx 14 [Rxx] [Rxx] [Rxx] 4バイト命令
- 整数レジスタ番号Rxxはすべて1バイトで記述(ただし0~63までしか指定できない)
- 命令長が可変長であることが分かりにくかったので書き直しました
- imm32はビッグエンディアンで書きます(x86とは逆になって、バイナリダンプで読みやすい順序に)
ver.0.01
LABEL imm32 01 [imm32] 5バイト命令
LOADLBL Pxx, imm32 03 [Pxx] [imm32] 6バイト命令
COND Rxx 04 [Rxx] 2バイトプリフィクス
CONDN Rxx 05 [Rxx] 2バイトプリフィクス
COMPNE Rxx, Rxx, Rxx 21 [Rxx] [Rxx] [Rxx] 4バイト命令
- COMPNE命令は、2項目と3項目を比較し等しくなければ1項目に-1を代入、さもなくば0を代入
ver.0.02
- 20: COMPE
- 22: COMPL
- 23: COMPGE
- 24: COMPG
- 25: COMPLE
- 26: TESTZ
- 27: TESTNZ
- これらは全て3項演算型。つまり、10-1B,20-27はみんな命令フォーマットが同じ。
ver.0.03以降
- 07: COPYPTR
- 10: OR, XOR, AND, ?,
- 14: (ADD), SUB, MUL, ?,
- 18: SHL, SAR, DIV, MOD
- 08: READINT typ32, Rxx, Pxx, membchain (メモリアクセス)
- 09: WRITINT typ32, Rxx, Pxx, membchain
- 0A: READPTR typ32, Pxx, Pxx, membchain
- 0B: WRITPTR typ32, Pxx, Pxx, membchain
- 0C: LOADEA typ32, Pxx, Pxx, membchain
- 0D: 0D [imm8] テストコンディション(割り込み受付タイミング)プリフィクス
- 0E: ADDPTR typ32, Pxx, Pxx, Rxx
- 0F: SUBPTR typ32, Rxx, Pxx, Pxx
- 28-: COMPPE/NE/L/GE/G/LE Rxx, Pxx, Pxx
- 2E: COMPPNE Rxx, Pxx : ヌルポインタに等しい
- 2F: COMPPNN Rxx, Pxx : ヌルポインタではない
- ヌルポインタかどうかの判定には、適当なPxxとの比較ではなくて専用の命令を使うことになりました
- 1C: LMTPTR0 Pxx, Pxx
- 1D: LMTPTR1 Pxx, Pxx
- 1E: CASTPTR typ32, typ32, Pxx, Pxx
- 1F: 1F [imm8] アサートレベル指定
- 1E: ? (メモリアクセステストプリフィクス?) これは没方向で検討
特別なレジスタ
- R30~R3E : 定数が入っていることが期待される。これらのレジスタに対して演算命令で結果を格納することはできない。
- R3F : COMPcc命令の際に結果を格納することだけできるレジスタ。もちろんCOMPcc命令では、R00~R2Fに結果を入れることもできる。
- COMPcc(R3F,R??,R??); COND(R3F); LOADLBL(P00, ????????); という慣用句で使う。
- R3Fは他の使い方を許されていない。実際にはR3Fに値は格納されていない場合もある(JITの仕様による)。
- P00 : プログラムカウンタ
- ここへラベル値を代入するとそれがジャンプ命令となる。
- P01 : スタックフレームのポインタ
こめんと欄
- このページにこめんと欄はありません。このページの内容にコメントしたいときはimpressionsにお願いします。