Rev2のベタ命令セット
(1) 基本構成
- 最初に4バイトのシグネチャがある。
05 EC 02 00
- ちなみにこの末尾の00はサブリビジョンで、将来のバージョンでは01や02になる可能性がある。
- なお、OSECPU-VM命令セットは、他の様々な用途に応用される可能性があると思うが、その場合は、このシグネチャを強要しない(推奨もしない)。それぞれがそれぞれの方法でOSECPU-VMの命令セットであることを判断する。
- というか、そもそもここに書く命令セットは「ベタ」であって、サイズの追及もされていない冗長なものなので、これをそのまま応用することはないような気もする。
- シグネチャの後は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 | bit | imm | r | | | | | LIMM(r, imm); | |
03 | uimm | p | | | | | | PLIMM(p, uimm); | |
04 | r | | | | | | | CND(r); | CND命令は下位1bitしか見ない |
08 | bit | p | typ | 0 | r | | | LMEM(r, typ, p, 0); | |
09 | bit | r | p | typ | 0 | | | SMEM(r, typ, p, 0); | bitはtypのビット数以上 |
0A | p1 | typ | 0 | p0 | | | | PLMEM(p0, typ, p1, 0); | |
0B | p0 | p1 | typ | 0 | | | | PSMEM(p0, typ, p1, 0); | |
0E | bit | r | p1 | typ | p0 | | | PADD(p0, typ, p1, r); | |
0F | bit | p0 | p1 | typ | r | | | PDIF(r, typ, p0, p1); | |
10 | bit | r1 | r2 | r0 | | | | OR(r0, r1, r2); | r1=r2にすると、CP(r0,r1);になる |
11 | bit | r1 | r2 | r0 | | | | XOR(r0, r1, r2); | |
12 | bit | r1 | r2 | r0 | | | | AND(r0, r1, r2); | |
13 | bit | r1 | r2 | r0 | | | | SBX(r0, r1, r2); | 符号ビット拡張、r2はR3Fしか指定できない |
14 | bit | r1 | r2 | r0 | | | | ADD(r0, r1, r2); | |
15 | bit | r1 | r2 | r0 | | | | SUB(r0, r1, r2); | |
16 | bit | r1 | r2 | r0 | | | | MUL(r0, r1, r2); | |
18 | bit | r1 | r2 | r0 | | | | SHL(r0, r1, r2); | |
19 | bit | r1 | r2 | r0 | | | | SAR(r0, r1, r2); | |
1A | bit | r1 | r2 | r0 | | | | DIV(r0, r1, r2); | |
1B | bit | r1 | r2 | r0 | | | | MOD(r0, r1, r2); | |
- 2013年のころのバイトコードと比較すると、データの流れが左から右になっている。
- typはpの直後に来る。
- bitってなんですか?
- Rxxの演算精度のこと。bit=32の場合、Rxxは32bitかそれ以上で計算してほしいということ。
- これが何のために必要かというと、今まではcharの演算で済むときでさえ無条件で32bit演算していたわけで、これは32bitのCPUでは大して問題にならないとしても、8bitのCPUにとっては大きなロスになる。bitを指定できないとこの無駄をVMは「気づくことすらできなかった」が、bitが入ることこれを反映して無駄を取り除けるようになる。
- 「第3世代OSASK」では、bitは64や256などを指定してもよくなる。
- このようにアーキテクチャが固有の標準bitを持たないことを「ビットフリー」ということにする。
こめんと欄