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