* OSECPUの仮想CPUの命令セット -(by [[K]], 2013.03.26) * リビジョン 0003 ** ver.0.07 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バイトプリフィクス READINT Rxx, ty32, Pxx, mc 08 [Rxx] [ty32] [Pxx] mc (8+4n)バイト WRITINT Rxx, ty32, Pxx, mc 09 [Rxx] [ty32] [Pxx] mc (8+4n)バイト READINT Rxx, ty32, Pxx, mc 08 [Rxx] [ty32] [Pxx] mc (8+4n)バイト命令 WRITINT Rxx, ty32, Pxx, mc 09 [Rxx] [ty32] [Pxx] mc (8+4n)バイト命令 ADDPTR Pxx, ty32, Pxx, Rxx 0E [Pxx] [ty32] [Pxx] [Rxx] 8バイト DIFFPTR Rxx, ty32, Pxx, Pxx 0F [Rxx] [ty32] [Pxx] [Pxx] 8バイト ADDPTR Pxx, ty32, Pxx, Rxx 0E [Pxx] [ty32] [Pxx] [Rxx] 8バイト命令 DIFFPTR Rxx, ty32, Pxx, Pxx 0F [Rxx] [ty32] [Pxx] [Pxx] 8バイト命令 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バイト命令 18 [Rxx] [Rxx] [Rxx] 4バイト命令 19 [Rxx] [Rxx] [Rxx] 4バイト命令 1A [Rxx] [Rxx] [Rxx] 4バイト命令 1B [Rxx] [Rxx] [Rxx] 4バイト命令 1C [Pxx] [Pxx] 3バイト命令 1D [Pxx] [Pxx] 3バイト命令 COPYPTR Pxx, Pxx 1E [Pxx] [Pxx] 3バイト命令 1F [Pxx] [Pxx] [ty32] [ty32] 11バイト命令 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バイト命令 COMPPE Rxx, Pxx, Pxx 28 [Rxx] [Pxx] [Pxx] 4バイト命令 COMPPEN Rxx, Pxx 28 [Rxx] [Pxx] FF 4バイト命令 COMPPNE Rxx, Pxx, Pxx 29 [Rxx] [Pxx] [Pxx] 4バイト命令 COMPPNEN Rxx, Pxx 29 [Rxx] [Pxx] FF 4バイト命令 COMPPL Rxx, Pxx, Pxx 2A [Rxx] [Pxx] [Pxx] 4バイト命令 COMPPGE Rxx, Pxx, Pxx 2B [Rxx] [Pxx] [Pxx] 4バイト命令 COMPPLE Rxx, Pxx, Pxx 2C [Rxx] [Pxx] [Pxx] 4バイト命令 COMPPG Rxx, Pxx, Pxx 2D [Rxx] [Pxx] [Pxx] 4バイト命令 -整数レジスタ番号Rxxはすべて1バイトで記述(ただし0~63までしか指定できない) -im32はビッグエンディアンで書きます(x86とは逆になって、バイナリダンプで読みやすい順序に) ** ver.0.08以降 -05: ? -06: ? -07: ? -0A: READPTR Pxx, typ32, Pxx, membchain -0B: WRITPTR Pxx, typ32, Pxx, membchain -0C: LOADEA Pxx, typ32, Pxx, membchain -0D: 0D [imm8] アサートレベル指定 -18: SHL, SAR, DIV, MOD -1C: LMTPTR0 Pxx, Pxx -1D: LMTPTR1 Pxx, Pxx -1F: CASTPTR Pxx, Pxx, typ32, typ32 ** 特別なレジスタ -R30~R3F : 定数が入っていることが期待される。これらのレジスタに対して演算命令で結果を格納することはできない。LOADINT以外では代入できない。 -R3C~R3F : 一時定数レジスタ --このレジスタの値は短期間で使う。つまり関数内で保存とかしなくていい。多分割り込みやタスクスイッチでも保存されない(註:OSECPUでは割り込みやタスクスイッチが起きる場所が限定されているのでこんな仕様でも全く問題ない)。 --JITCがこの代入コードを生成しないこともありうる。 -R2F : COMPcc命令の際に結果を格納することだけできるレジスタ。もちろんCOMPcc命令では、R00~R2Eに結果を入れることもできる。 --COMPcc(R2F,R??,R??); COND(R2F); LOADLBL(P00, ????????); という慣用句で使う。 --R2Fは他の使い方を許されていない。実際にはR2Fに値は格納されていない場合もある(JITの仕様による)。 ---この場合CMP+Jccに変換されている。 -P00 : プログラムカウンタ --ここへラベル値を代入するとそれがジャンプ命令となる。 -P01 : スタックフレームのポインタ ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。