* 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]]にお願いします。

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