Rev2のベタ命令セット(バックエンド命令セット)
(1) 基本構成
- 最初に3バイトのシグネチャがある。
05 E2 00
- なお、OSECPU-VM命令セットは、他の様々な用途に応用される可能性があると思うが、その場合は、このシグネチャを強要しない(推奨もしない)。それぞれがそれぞれの方法でOSECPU-VMリビジョン2のバックエンドの命令セットであることを判断する。
- というか、そもそもここに書く命令セットは「ベタ」であって、サイズの追及もされていない冗長なものなので、これをそのまま応用することはないような気もする。
- シグネチャの後はhh4エンコードで命令列を並べる。データ系命令以外はこれに従う。
- hh4: http://osask.net/w/634.html
- [Q]なぜ以前のようにバイト列で定義しないのですか?
- [A]OSECPU-VMは32bitに限定されない仕様に近づくから。・・・完全に32bitの制約が無くなるのが「第三世代OSASK」で、OSECPU-VMはそのうちの32bit以下だけをサポートしたものに相当する。
- 32bit前提じゃなくなると、immやtypが32bit固定だとは言いにくくなる。だから単純なバイト列では規定できない。それで可変ビット長なhh4を採用。hh4なら固定ビット長方式もできる。
- 命令表: (rはRxxのこと、pはPxxのこと、bitは定数32を入れておくとよい、uimmは符号なし整数のこと)
| +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | 命令表記 | 説明 | | 00 | | | | | | | | NOP(); | | | 01 | uimm | opt | | | | | | LB(opt, uimm); | | | 02 | imm | r | bit | | | | | LIMM(bit, r, imm); | | | 03 | uimm | p | | | | | | PLIMM(p, uimm); | | | 04 | r | | | | | | | CND(r); | CND命令は下位1bitしか見ない | | 05 | | | | | | | | (reserve) | API特別構文用 | | 06 | | | | | | | | (reserve) | ループ構文用 | | 07 | | | | | | | | (reserve) | ループ構文用 | | 08 | p | typ | 0 | r | bit | | | LMEM(bit, r, typ, p, 0); | | | 09 | r | bit | p | typ | 0 | | | SMEM(bit, r, typ, p, 0); | | | 0A | p1 | typ | 0 | p0 | | | | -PLMEM(p0, typ, p1, 0); | | | 0B | p0 | p1 | typ | 0 | | | | -PSMEM(p0, typ, p1, 0); | | | 0C | | | | | | | | (LEA) | | | 0D | | | | | | | | (reserve) | 型指定プリフィクス用 | | 0E | p1 | typ | r | bit | p0 | | | PADD(bit, p0, typ, p1, r); | | | 0F | p0 | p1 | typ | r | bit | | | -PDIF(r, typ, p0, p1); | | | 10 | r1 | r2 | r0 | bit | | | | OR(bit, r0, r1, r2); | r1=r2にすると、CP(r0,r1);になる | | 11 | r1 | r2 | r0 | bit | | | | XOR(bit, r0, r1, r2); | | | 12 | r1 | r2 | r0 | bit | | | | AND(bit, r0, r1, r2); | | | 13 | r1 | r2 | r0 | bit | | | | SBX(bit, r0, r1, r2); | 符号ビット拡張、r2はR3Fしか指定できない | | 14 | r1 | r2 | r0 | bit | | | | ADD(bit, r0, r1, r2); | | | 15 | r1 | r2 | r0 | bit | | | | SUB(bit, r0, r1, r2); | | | 16 | r1 | r2 | r0 | bit | | | | MUL(bit, r0, r1, r2); | | | 17 | | | | | | | | | | | 18 | r1 | r2 | r0 | bit | | | | SHL(bit, r0, r1, r2); | | | 19 | r1 | r2 | r0 | bit | | | | SAR(bit, r0, r1, r2); | | | 1A | r1 | r2 | r0 | bit | | | | DIV(bit, r0, r1, r2); | | | 1B | r1 | r2 | r0 | bit | | | | MOD(bit, r0, r1, r2); | | | 1C | | | | | | | | (PLMT0) | | | 1D | | | | | | | | (PLMT1) | | | 1E | p1 | p0 | | | | | | PCP(p0, p1); | | | 1F | | | | | | | | (PCST) | | | 20 | r1 | r2 | bit1 | r0 | bit0 | | | CMPE(bit0, bit1, r0, r1, r2); | bit1はr1とr2のbit、bit0はr0のbit | | 21 | | | | | | | | CMPNE | | | 22 | | | | | | | | CMPL | | | 23 | | | | | | | | CMPGE | | | 24 | | | | | | | | CMPLE | | | 25 | | | | | | | | CMPG | | | 26 | | | | | | | | TSTZ | | | 27 | | | | | | | | TSTNZ | | | 28 | p0 | p1 | r | bit | | | | -PCMPE(r, p0, p1); | | | 29 | | | | | | | | PCMPNE | | | 2A | | | | | | | | PCMPL | | | 2B | | | | | | | | PCMPGE | | | 2C | | | | | | | | PCMPLE | | | 2D | | | | | | | | PCMPG | | | 2E | typ | len | ... | | | | | data | typもlenもuimm, data部分はhh4エンコードをしない生データ | | 2F | uimm | | | | | | | (reserve) | 各種プリフィクス | | 30 | r0 | bit0 | r1 | bit1 | p | | | talloc | r0はtyp、r1は個数、bit0はr0のbit、bit1はr1のbit | | 31 | p | r0 | bit0 | r1 | bit1 | | | tfree | | | 32 | r0 | bit0 | r1 | bit1 | p | | | malloc | | | 33 | p | r0 | bit0 | r1 | bit1 | | | mfree | | | 34 | | | | | | | | | | | 35 | | | | | | | | | | | 36 | | | | | | | | | | | 37 | | | | | | | | | | | 38 | | | | | | | | (reserve) | PALMEM構文用 | | 39 | | | | | | | | (reserve) | PASMEM構文用 | | 3A | | | | | | | | (reserve) | PAPLMEM構文用 | | 3B | | | | | | | | (reserve) | PAPSMEM構文用 | | 3C | rn | bit0 | pn | fn | bit1 | 0 | | ENTER | rn,pn,fnはuimmで保存する個数、bit0はRxxのbit、bit1はFxxのbit | | 3D | rn | bit0 | pn | fn | bit1 | 0 | | LEAVE | | | 3E | | | | | | | | (reserve) | call構文用 | | 3F | | | | | | | | (reserve) | call構文用 | | 40 | mod | fimm | f | bit | | | | FLIMM | | | 41 | f1 | bit1 | f0 | bit0 | | | | FCP | bit0>bit1でもよい(つまり精度拡張にも使える) | | 42 | r | bit1 | f | bit0 | | | | CNVIF | | | 43 | f | bit1 | r | bit0 | | | | CNVFI | | | 44 | | | | | | | | (FLMEM) | | | 45 | | | | | | | | (FSMEM) | | | 46 | | | | | | | | (reserve) | PAFLMEM構文用 | | 47 | | | | | | | | (reserve) | PAFSMEM構文用 | | 48 | f1 | f2 | bit1 | r | bit0 | | | FCMPE | | | 49 | | | | | | | | FCMPNE | | | 4A | | | | | | | | FCMPL | | | 4B | | | | | | | | FCMPGE | | | 4C | | | | | | | | FCMPLE | | | 4D | | | | | | | | FCMPG | | | 4E | | | | | | | | | NaN検出用の命令にするかも | | 4F | | | | | | | | | NaN検出用の命令にするかも | | 50 | | | | | | | | FADD | | | 51 | | | | | | | | FSUB | | | 52 | | | | | | | | FMUL | | | 53 | | | | | | | | FDIV | | | 54 | | | | | | | | (reserve) | | | 55 | | | | | | | | (reserve) | | | 56 | | | | | | | | (reserve) | | | 57 | | | | | | | | (reserve) | | | 58 | | | | | | | | FCOS | | | 59 | | | | | | | | FSIN | | | 5A | | | | | | | | FTAN | | | 5B | | | | | | | | (reserve) | FCOSIN構文用 | | 78 | | | | | | | | (reserve) | bit/bit1オーバーライド構文用 | | 79 | | | | | | | | (reserve) | bit0オーバーライド構文用 | | FD | imm | dr | | | | | | LIDR | load imm. to debug register | | FE | uimm | len | | | | | | remark | |
- 2013年のころのバイトコードと比較すると、データの流れが左から右になっている。
- typはpの直後に来る。
- bitってなんですか?
- Rxxの演算精度のこと。bit=32の場合、Rxxは32bitかそれ以上で計算してほしいということ。
- これが何のために必要かというと、今まではcharの演算で済むときでさえ無条件で32bit演算していたわけで、これは32bitのCPUでは大して問題にならないとしても、8bitのCPUにとっては大きなロスになる。bitを指定できないとこの無駄をVMは「気づくことすらできなかった」が、bitが入ることでこれを反映して無駄を取り除けるようになる。
- 「第三世代OSASK」では、bitは64や256などを指定してもよくなる。
- このようにアーキテクチャが固有の標準bitを持たないことを「ビットフリー」ということにする。
- C0~DFまでは独自拡張用に開けておくので勝手に使って構わない。
- E0~EFは内部エラー通知用。
こめんと欄
|