* OSECPUの仮想CPUの命令セット
-(by [[K]], 2013.03.25)

* リビジョン 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.05以降
** ver.0.05
-08: READINT Rxx, typ32, Pxx, membchain (メモリアクセス)
-09: WRITINT Rxx, typ32, Pxx, membchain
-0D: COPYPTR Pxx, Pxx
-0E: ADDPTR Pxx, typ32, Pxx, Rxx
** ver.0.07予定
-0F: DIFFPTR Rxx, typ32, Pxx, Pxx
-28-2D: COMPPE/NE/L/GE/G/LE Rxx, Pxx, Pxx

** ver.0.08以降
-05: ?
-06: ?
-07: ?

-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 Pxx, Pxx
-0E: ADDPTR Pxx, typ32, Pxx, Rxx
-0F: DIFFPTR Rxx, typ32, Pxx, Pxx

-18: SHL, SAR, DIV, MOD

-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の仕様による)。
---この場合CMP+Jccに変換されている。
-P00 : プログラムカウンタ
--ここへラベル値を代入するとそれがジャンプ命令となる。
-P01 : スタックフレームのポインタ


** こめんと欄
-このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS