OSECPUの仮想CPUの命令セット
リビジョン 0005
- 命令セットとしては リビジョン 0004 と同じですが、レジスタの主な用途が変更されています。
ver.0.12
NOP(); 00 1バイト命令 (no-operation)
LB(im8, im32); 01 [im8] [im32] 6バイト命令 (label)
LIMM(Rxx, im32); 02 [Rxx] [im32] 6バイト命令 (load-immediate)
PLIMM(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); 10 [Rxx] [Rxx] FF 4バイト命令 (copy)
OR(Rxx, Rxx, Rxx); 10 [Rxx] [Rxx] [Rxx] 4バイト命令 (or)
XOR(Rxx, Rxx, Rxx); 11 [Rxx] [Rxx] [Rxx] 4バイト命令 (xor)
AND(Rxx, Rxx, Rxx); 12 [Rxx] [Rxx] [Rxx] 4バイト命令 (and)
ADD(Rxx, Rxx, Rxx); 14 [Rxx] [Rxx] [Rxx] 4バイト命令 (add)
SUB(Rxx, Rxx, Rxx); 15 [Rxx] [Rxx] [Rxx] 4バイト命令 (subtract)
MUL(Rxx, Rxx, Rxx); 16 [Rxx] [Rxx] [Rxx] 4バイト命令 (multiply)
SHL(Rxx, Rxx, Rxx); 18 [Rxx] [Rxx] [Rxx] 4バイト命令 (shift-left)
SAR(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); 1E [Pxx] [Pxx] 3バイト命令 (pointer-copy)
1F [Pxx] [Pxx] [ty32] [ty32] 11バイト命令
CMPE(Rxx, Rxx, Rxx); 20 [Rxx] [Rxx] [Rxx] 4バイト命令 (compare-equal) (2項目と3項目を比較)
CMPNE(Rxx, Rxx, Rxx); 21 [Rxx] [Rxx] [Rxx] 4バイト命令 (compare-not-equal)
CMPL(Rxx, Rxx, Rxx); 22 [Rxx] [Rxx] [Rxx] 4バイト命令 (compare-less-than)
CMPGE(Rxx, Rxx, Rxx); 23 [Rxx] [Rxx] [Rxx] 4バイト命令 (compare-greater-or-equal)
CMPLE(Rxx, Rxx, Rxx); 24 [Rxx] [Rxx] [Rxx] 4バイト命令 (compare-less-or-equal)
CMPG(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); 28 [Rxx] [Pxx] [Pxx] 4バイト命令
PCMPEN(Rxx, Pxx); 28 [Rxx] [Pxx] FF 4バイト命令
PCMPNE(Rxx, Pxx, Pxx); 29 [Rxx] [Pxx] [Pxx] 4バイト命令
PCMPNEN(Rxx, Pxx); 29 [Rxx] [Pxx] FF 4バイト命令
PCMPL(Rxx, Pxx, Pxx); 2A [Rxx] [Pxx] [Pxx] 4バイト命令
PCMPGE(Rxx, Pxx, Pxx); 2B [Rxx] [Pxx] [Pxx] 4バイト命令
PCMPLE(Rxx, Pxx, Pxx); 2C [Rxx] [Pxx] [Pxx] 4バイト命令
PCMPG(Rxx, Pxx, Pxx); 2D [Rxx] [Pxx] [Pxx] 4バイト命令
- 整数レジスタ番号Rxxはすべて1バイトで記述(ただし0~63までしか指定できない)
- im32はビッグエンディアンで書きます(x86とは逆になって、バイナリダンプで読みやすい順序に)
ver.0.11以降
- 0A: PLMEM Pxx, typ32, Pxx, membchain
- 0B: PSMEM Pxx, typ32, Pxx, membchain
- 0C: LEA Pxx, typ32, Pxx, membchain
- 0D: 0D [imm8] アサートレベル指定
- 1C: PLMT0 Pxx, Pxx (pointer-limit-lower)
- 1D: PLMT1 Pxx, Pxx (pointer-limit-upper)
- 1F: PCST Pxx, Pxx, typ32, typ32 (pointer-cast)
レジスタの典型的な用法
- R00-R0F : テンポラリレジスタ
- R10-R3B : 普通のレジスタ
- R3C-R3F : 特別なレジスタ
- R3F: 条件比較慣用句指定用&演算命令即値慣用句指定用
- P00 : プログラムカウンタ
- P01 : ベースポインタ
- P02-P0F : テンポラリレジスタ
- P10-P1B : 普通のレジスタ
- P1C : 予約済み
- P1D : 予約済み
- P1E : リターンアドレス
- P1F : 予約済み
こめんと欄
- このページにこめんと欄はありません。このページの内容にコメントしたいときはimpressionsにお願いします。