* OSECPUの仮想CPUの命令セット -(by [[K]], 2013.03.19) * リビジョン 0001 ** 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 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: 0D [imm8] テストコンディション(割り込み受付タイミング)プリフィクス (廃止検討中) --これはLABEL命令の前にのみ付けられる -0E: ADDPTR Pxx, typ32, Pxx, Rxx -0F: SUBPTR Rxx, typ32, 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 Pxx, Pxx, typ32, typ32 -1E: CASTPTR Pxx, Pxx, typ32, typ32 (→0Dへ?) -1F: 1F [imm8] アサートレベル指定 (→05へ?) -1E: ? (メモリアクセステストプリフィクス?) これは没方向で検討 ** 特別なレジスタ -R30~R3E : 定数が入っていることが期待される。これらのレジスタに対して演算命令で結果を格納することはできない。 -R3C~R3E : 一時定数レジスタ --このレジスタの値は短期間で使う。つまり関数内で保存とかしなくていい。多分割り込みやタスクスイッチでも保存されない(註:OSECPUでは割り込みやタスクスイッチが起きる場所が限定されているのでこんな仕様でも全く問題ない)。 -R3F : COMPcc命令の際に結果を格納することだけできるレジスタ。もちろんCOMPcc命令では、R00~R2Fに結果を入れることもできる。 --COMPcc(R3F,R??,R??); COND(R3F); LOADLBL(P00, ????????); という慣用句で使う。 --R3Fは他の使い方を許されていない。実際にはR3Fに値は格納されていない場合もある(JITの仕様による)。 ---この場合CMP+Jccに変換されている。 -P00 : プログラムカウンタ --ここへラベル値を代入するとそれがジャンプ命令となる。 -P01 : スタックフレームのポインタ ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。