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

* リビジョン 0006
-基本的にはリビジョン0005と同じです。
-アセンブラ表記を追加しました。
--定数レジスタの概念がとりあえずなくなりました。今後復活させるとしても、R38以降にする予定です。
//-定数レジスタの概念がとりあえずなくなりました。今後復活させるとしても、R38以降にする予定です。
** ver.0.24
 NOP();                                                  00                           1バイト命令 (no-operation)
 LB(im8, im32);                                          01 [im8] [im32]              6バイト命令 (label)
 LIMM(Rxx, im32);            %(Rxx = im32);              02 [Rxx] [im32]              6バイト命令 (load-immediate)
 PLIMM(Pxx, im32);           %(Pxx = im32);              03 [Pxx] [im32]              6バイト命令 (pointer-load-immediate)
 CND(Rxx);                                               04 [Rxx]                     2バイトプリフィクス (condition)
 
 LMEM(Rxx, ty32, Pxx); mc                                08 [Rxx] [ty32] [Pxx] mc     (8+4n)バイト命令 (load-memory, load-member)
 SMEM(Rxx, ty32, Pxx); mc                                09 [Rxx] [ty32] [Pxx] mc     (8+4n)バイト命令 (store-memory, store-member)
 
 PADD(Pxx, ty32, Pxx, Rxx);                              0E [Pxx] [ty32] [Pxx] [Rxx]  8バイト命令 (pointer-add)
 PDIF(Rxx, ty32, Pxx, Pxx);                              0F [Rxx] [ty32] [Pxx] [Pxx]  8バイト命令 (pointer-diff)
 CP(Rxx, Rxx);               %(Rxx = Rxx);               10 [Rxx] [Rxx] FF            4バイト命令 (copy)
 OR(Rxx, Rxx, Rxx);          %(Rxx = Rxx |  Rxx);        10 [Rxx] [Rxx] [Rxx]         4バイト命令 (or)
 XOR(Rxx, Rxx, Rxx);         %(Rxx = Rxx ^  Rxx);        11 [Rxx] [Rxx] [Rxx]         4バイト命令 (xor)
 AND(Rxx, Rxx, Rxx);         %(Rxx = Rxx &  Rxx);        12 [Rxx] [Rxx] [Rxx]         4バイト命令 (and)
 
 ADD(Rxx, Rxx, Rxx);         %(Rxx = Rxx +  Rxx);        14 [Rxx] [Rxx] [Rxx]         4バイト命令 (add)
 SUB(Rxx, Rxx, Rxx);         %(Rxx = Rxx -  Rxx);        15 [Rxx] [Rxx] [Rxx]         4バイト命令 (subtract)
 MUL(Rxx, Rxx, Rxx);         %(Rxx = Rxx *  Rxx);        16 [Rxx] [Rxx] [Rxx]         4バイト命令 (multiply)
 
 SHL(Rxx, Rxx, Rxx);         %(Rxx = Rxx << Rxx);        18 [Rxx] [Rxx] [Rxx]         4バイト命令 (shift-left)
 SAR(Rxx, Rxx, Rxx);         %(Rxx = Rxx >> Rxx);        19 [Rxx] [Rxx] [Rxx]         4バイト命令 (shift-arithmetic-right)
                                                         1A [Rxx] [Rxx] [Rxx]         4バイト命令
                                                         1B [Rxx] [Rxx] [Rxx]         4バイト命令
                                                         1C [Pxx] [Pxx]               3バイト命令
                                                         1D [Pxx] [Pxx]               3バイト命令
 PCP(Pxx, Pxx);              %(Pxx = Pxx);               1E [Pxx] [Pxx]               3バイト命令 (pointer-copy)
                                                         1F [Pxx] [Pxx] [ty32] [ty32] 11バイト命令
 CMPE(Rxx, Rxx, Rxx);        %(Rxx = Rxx == Rxx);        20 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-equal) (2項目と3項目を比較)
 CMPNE(Rxx, Rxx, Rxx);       %(Rxx = Rxx != Rxx);        21 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-not-equal)
 CMPL(Rxx, Rxx, Rxx);        %(Rxx = Rxx <  Rxx);        22 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-less-than)
 CMPGE(Rxx, Rxx, Rxx);       %(Rxx = Rxx >= Rxx);        23 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-greater-or-equal)
 CMPLE(Rxx, Rxx, Rxx);       %(Rxx = Rxx <= Rxx);        24 [Rxx] [Rxx] [Rxx]         4バイト命令 (compare-less-or-equal)
 CMPG(Rxx, Rxx, Rxx);        %(Rxx = Rxx >  Rxx);        25 [Rxx] [Rxx] [Rxx]         4バイト命令
 TSTZ(Rxx, Rxx, Rxx);                                    26 [Rxx] [Rxx] [Rxx]         4バイト命令
 TSTNZ(Rxx, Rxx, Rxx);                                   27 [Rxx] [Rxx] [Rxx]         4バイト命令
 PCMPE(Rxx, Pxx, Pxx);       %(Rxx = Pxx == Pxx);        28 [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPEN(Rxx, Pxx);                                       28 [Rxx] [Pxx] FF            4バイト命令
 PCMPNE(Rxx, Pxx, Pxx);      %(Rxx = Pxx != Pxx);        29 [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPNEN(Rxx, Pxx);                                      29 [Rxx] [Pxx] FF            4バイト命令
 PCMPL(Rxx, Pxx, Pxx);       %(Rxx = Pxx <  Pxx);        2A [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPGE(Rxx, Pxx, Pxx);      %(Rxx = Pxx >= Pxx);        2B [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPLE(Rxx, Pxx, Pxx);      %(Rxx = Pxx <= Pxx);        2C [Rxx] [Pxx] [Pxx]         4バイト命令
 PCMPG(Rxx, Pxx, Pxx);       %(Rxx = Pxx >  Pxx);        2D [Rxx] [Pxx] [Pxx]         4バイト命令
-整数レジスタ番号Rxxはすべて1バイトで記述(ただし0~63までしか指定できない)
-im32はビッグエンディアンで書きます(x86とは逆になって、バイナリダンプで読みやすい順序に)

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

-0A: PLMEM Pxx, typ32, Pxx, membchain
-0B: PSMEM Pxx, typ32, Pxx, membchain
-0C: LEA Pxx, typ32, Pxx, membchain
-0D: 0D [imm8] アサートレベル指定

-1A: DIV, MOD


-1C: PLMT0 Pxx, Pxx (pointer-limit-lower)
-1D: PLMT1 Pxx, Pxx (pointer-limit-upper)
-1F: PCST Pxx, Pxx, typ32, typ32 (pointer-cast)

** 即値指定のやり方
-PADD, OR~MOD, CMPccの命令では、2項目、3項目のRxxで、定数を指定することができます。
-やりかたは、LIMM(R3F, imm);をその命令の直前につけて、命令の中では定数にしたいところをR3Fで埋めてください。
--よくわからなかったら、osecpu_asm.hのADDI()の定義を見てください。
-ADDやANDのように2項目でも3項目でも結果に違いがないときは、3項目にR3Fをおいてください(2項目は定数置換の対象にならないこともありえます)。
-結果的に、CMPcc(R3F, Rxx, R3F);みたいに、R3Fが二度出てしまうこともありますが、問題ありませんので安心してください。第一項のR3Fは定数置換の対象ではありません。

** レジスタの典型的な用法
-R00-R0F : テンポラリレジスタ
-R10-R37 : 普通のレジスタ
-R38-R3B : 一応リザーブ
-R3C-R3F : 特別なレジスタ
--R3F: 条件比較慣用句指定用&演算命令即値慣用句指定用
-P00 : プログラムカウンタ
-P01 : ベースポインタ
-P02-P0F : テンポラリレジスタ
-P10-P1B : 普通のレジスタ
-P1C : 予約済み
-P1D : 予約済み
-P1E : リターンアドレス
-P1F : 予約済み

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

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