公開日:2022/04/02
20th Season
#20-4 32ビットに拡張するゾ(付録)
このページは、本HPで作成したオリジナル32ビットCPUコアNihoniumの命令セットマニュアルです。
詳細については、以下リンクから本文を参照してください。
本文へ戻る。
Nihonium Instruction Set Manual
Nihonium CPUコア概要
Nihoniumは、シンプルな32ビットCPUコアです。ハーバードアーキテクチャを採用しており、命令コードを16ビットフェッチバスから読み込んで実行します。同じく16ビットのメモリバスを通して、CPU外部のRAMやI/Oユニット(メモリマップドI/O)などのリソースにアクセスすることが出来ます。
フェッチバスは16ビットアドレスバスを持っており、従ってプログラムメモリ空間は最大64Kバイトです。
メモリバスは32ビットアドレスバスを持っているため、データメモリ空間は最大4Gバイトです。
命令コードは基本的に16ビット固定長で、フェッチバス上の16ビットワード境界に乗っていることを前提とします。言い換えると、常に偶数バイトアドレスから16ビット命令コードが配置されています。一部、16/32ビット即値を取る命令などに2〜3ワードの多ワード長命令が存在します。
プログラムカウンタpcはリセット信号で0x0000に初期化されるので、Nihoniumリセット解除後、常に0x0000番地の命令から実行を開始します。
- 凡例:
- Rd: 転送先レジスタ。汎用レジスタ(r0〜r7)のいずれか。
- Rs: 転送元レジスタ。汎用レジスタ(r0〜r7)のいずれか。
- Rn: 汎用レジスタ(r0〜r7)のいずれか。
- Rd’: 命令実行後のRdレジスタ、またはその値。
- Rc: 制御レジスタ(sr,pc,sp,iv,tr)のいずれか。
- dsp11: 分岐命令の変位量。11ビット符号付整数。
- imm8: 即値。8ビット符号無整数。
- 32ビットレジスタとの演算では、imm8を32ビットにゼロ拡張して使用する。
- [Rn]: 汎用レジスタRnの間接アドレッシング。
- 汎用レジスタRnの値をアドレスと見て、そのアドレスにあるデータにアクセスすることを表す。
- [--Sp]: スタックポインタのプリデクリメント間接アドレッシング。
- スタックポインタspを先にデクリメント(−2)してから、Spが示すアドレスにデータを書き込む。
- [Sp++]: スタックポインタのポストインクリメント間接アドレッシング。
- スタックポインタspが示すアドレスに格納されたデータを読み出した後で、Spをインクリメント(+2)する。
- [Sp+Rn]/[Sp,Rn]: スタックポインタからの相対間接アドレッシング。
- スタックポインタspに汎用レジスタRnの値を加算したアドレスにアクセスする。
- [Tr:Rn]/[Tr,Rn]: 32ビット拡張アドレスを示すレジスタペアの間接アドレッシング。
- 一時レジスタtrを上位16ビット、汎用レジスタRnを下位16ビットアドレスとする32ビット拡張アドレス指定となる。
- Rn[k]: レジスタRnのビットkを表す。
- MSB(Most Significant Bit)がk=31、LSB(Least Significant Bit)がk=0。
- k=32として、演算結果のキャリ出力を表現する場合がある。
- k=−1として、右シフト演算結果のシフトアウト出力を表現する場合がある。
- Sr[C]などとして、状態レジスタsrのCフラグ(ビット)を表す場合がある。
- Rn[a:b]: レジスタRnのビット範囲(第aビット〜第bビット)を表す。
- {…,…}: { }内に記載したデータを上位ビットから順に結合したデータを表す。
- 動作: 「動作:」記述中の演算子(!,×,÷)は、各々、ビット毎論理NOT、算術乗算、除算演算子を表す。その他の演算子はC言語などと同じ。
- 状態: 「状態:」記述中の演算子(×,+,^,!)は、各々、ビット毎論理AND、OR、EOR、NOT演算子を表す。
Nihoniumは、状態レジスタsrのNHビットによって、汎用レジスタと演算器(ALU)のビット幅を16/32ビットから選択して使用することができます。
リセット解除後のデフォルトではNH=0となっており、Nihoniumは16ビットモードで動作しています。NH=0の16ビットモードでは、オリジナル16ビットCPUコアMoscoviumとオブジェクトコードレベルの後方互換性を保っています。
SrレジスタのNH=1にセットすることで、32ビットモードで実行することができます。32ビットに拡張された汎用レジスタと演算器(ALU)を使って高速処理が可能です。
Moscoviumシリーズ
Moscoviumシリーズは、オリジナル16ビットCPUコアであるMoscoviumを起点とする、スケーラブルなCPUコアシリーズです。詳しくは、こちらをご参照ください。
プログラマモデル
Nihonium(NH=1)のプログラマモデルは以下図の通りです。
※SrレジスタのNHビット=0設定時のプログラマモデルはMoscoviumと同じです。
汎用レジスタ8本(r0〜r7)と、状態レジスタsr、プログラムカウンタpc、スタックポインタsp、割り込みベクタiv、一時レジスタtrの構成です。すべてのレジスタはリセット解除後、0x0000に初期化されています。汎用レジスタ8本には2組の汎用レジスタバンクが有って、Srレジスタの設定ビット(B0)にて、切り替えて使用することが可能です。
制御レジスタ
Srは状態レジスタです。演算結果を示すフラグビット(N,C,V,Z)等、CPUの状態を示すビットを備えています。以下、Moscoviumと異なるビットに関して説明します。その他のビットはMoscoviumと同じなので、こちらの説明をご覧ください。
状態ビット:
- ML:32ビット乗算結果(初期値0)
- 16×16ビットの乗算では、積は32ビット長となります。
- 乗算命令(muls命令、mulu命令)実行時、32ビット長の演算結果を取得するか否かを選択するビットです。
- NHビットとの組み合わせで、設定可能な値が異なります。
- NH=0の場合:
- ML=0: 16×16=32ビット演算を実施して、積32ビットの下位16ビットだけが結果として戻ります。
- ML=1: 16×16=32ビット演算を実施して、積32ビットを2個の汎用レジスタに分割してセットします。
- NH=1の場合:
- ML=0に設定してください。NH=1&ML=1の設定は禁止です。
- 32ビットモード(NH=1)では、32×32ビット乗算の結果、64ビット積の内、下位32ビットが汎用レジスタにセットされます。
- 上位32ビットは取得できません。
- なお、乗算命令(mulsr命令、mulur命令)を使う場合、MLビットの意味が反転します。
- ※MLビットに関しては、初期値であるML=0で使う事を強く推奨します。
- MLビットは、mulsr命令、mulur命令を追加したことで、設定を変更する必要がなくなったため。
- 将来廃止する可能性を排除しないので、現行プログラムについても、修正することを推奨する。
-
NH:16/32ビットモード選択(初期値0)
- Nihoniumの汎用レジスタや演算器(ALU)等の内部処理ビット幅を設定するビットです。
- NH=0: 内部処理が16ビットのモードとなります。Moscoviumと互換動作となります。
- NH=1: 内部処理が32ビットのモードとなります。
- BK1,BK0:汎用レジスタバンク番号(初期値0)
- 汎用レジスタのバンク番号BK={BK1,BK0}を指定します。
- NH=0では、BK=0〜3のバンク指定が可能です。
- NH=1では、BK1ビットの設定は無視され、BK=0または1のバンク指定が可能となります。
Pcはプログラムカウンタです。Moscoviumと同じなので、こちらの説明をご覧ください。
Spはスタックポインタです。Nihoniumでは、Spは32ビットに拡張されています。それ以外はMoscoviumと同じなので、こちらの説明をご覧ください。
Ivは割り込みベクタです。Moscoviumと同じなので、こちらの説明をご覧ください。
Trは一時レジスタです。Nihoniumでは、Trは32ビットに拡張されています。Nihoniumの一時レジスタtrは、基本的にCPUリソースとして、ユーザ使用を制限します。
ベクタ割り込み方式
Moscoviumと同じなので、こちらの説明をご覧ください。
単精度浮動小数演算ユニット(Single precision FPU)
コンパイルオプションで単精度浮動小数演算ユニット(Single precision FPU、以下S-FPUと記す)を選択すると、単精度浮動小数演算を実行する命令が使用可能となります。
単精度浮動小数(IEEE 754 binary32)は、C言語で一般的に適用されているfloat型(32ビット)の浮動小数表現です。
float型のバイナリデータは以下図のような形式となっています。
符号(Sx)1ビット、指数(Ex’)8ビット、仮数(Fx’)23ビットの計32ビットです(↓)。
float型X=(−1)Sx×0x1.<Fx’>×2Ex’−127
32ビットCPUであるNihoniumにとって、非常に扱い易いサイズの浮動小数値です。Nihoniumの汎用レジスタ(32ビット)をそのまま浮動小数レジスタに転用して、レジスタ間の演算を実行するコプロセッサがSingle precision FPU(S-FPU)であり、コンパイルオプションで有り/無しを選択できるようになっています。
float型で表現可能な数値は、−3.4028235e+38〜+3.4028235e+38、±INF(無限大)、±0、NaN(非数)となっていて、IEEE754に規定されている非正規化数は、全て0と見なして演算します。
- INF=0x7f80_0000
- −INF=0xff80_0000
- (−)NaN=0xffc0_0000
- NihoniumのS-FPUでは+NaNは発生しないので、以降単にNaNと記します。
- 0=0x0000_0000
- −0=0x8000_0000
- SNGL_MAX=3.4028235e+38=0x7f7f_ffff
- −SNGL_MAX=−3.4028235e+38=0xff7f_ffff
仮数Fxの有効ビット数が23ビットなので、10進数換算ではlog10(223)≒6.924と、有効数字7桁弱ほどです。
※尚、複数パタンの表現が可能なNaNや、未対応の非正規化数が入力された場合、各々NaN(0xffc0_0000)とゼロへ縮退して処理します。
その他の有益な情報を以下にまとめておきます。
非有限値との演算:
- half型の解説記事と同様なのでこちらを参照してください。
- ただし、half型 → float型と読み替えてください。
大小比較:
- half型の解説記事と同様なのでこちらを参照してください。
- ただし、half型 → float型と読み替えてください。
FPUのコンパイルオプション:
- H-FPUまたはS-FPUを選択できる。
- 半精度浮動小数演算ユニットH-FPUを無効にする場合:
- 単精度浮動小数演算ユニットS-FPUを無効にする場合:
- 有効にする場合は、「`define」をコメントするか、「`undef」してください。
- 両方とも非選択(FPUなし版)は可能ですが、両方同時には選択できません。
- H-FPUを選択した場合:
- 16ビットモード(NH=0)、32ビットモード(NH=1)の両モードでH-FPUを使った命令を実行可能です。
- S-FPUを選択した場合:
- 32ビットモード(NH=1)だけでS-FPUを使った命令を実行可能です。
- 16ビットモード(NH=0)では、S-FPU命令の実行禁止です。
- H-FPU命令とS-FPU命令はオペコードが同じなので、NH=0を設定していても、命令を実行してしまうと回路が動作してしまいます。
- 正常な動作とはなりません。挙動についても保証しません。
- FPUなしを選択した場合:
- H-FPU命令やS-FPU命令を実行することは可能ですが、何を実行しても、演算結果としてゼロ(0)が返ります。
命令コード
Moscoviumと同じなので、こちらの説明をご覧ください。
命令セット一覧
以下に命令セットの形式順で命令セット一覧表を示します。
リンク先では、NH=1設定時の動作について記載しています。NH=0の動作はMoscoviumと同じですので、「Moscovium命令セットマニュアル」をご覧ください。
No. |
Inst |
Opr1 |
Opr2 |
Type |
Memo |
O15
(1b)
|
RiBr
(4b)
|
RR
(5b)
|
R
(3b)
|
NO
(11b)
|
1 |
nop |
− |
− |
NO |
no operation |
0 |
0 |
− |
− |
0 |
2 |
pause |
− |
− |
NO |
pause until interrupt request coming |
0 |
0 |
− |
− |
1 |
3 |
rtnw |
− |
− |
NO |
return from jalw |
0 |
0 |
− |
− |
2 |
4 |
rti |
− |
− |
NO |
return from interrupt |
0 |
0 |
− |
− |
3 |
5 |
link |
imm16 |
− |
NO |
link and allocate |
0 |
0 |
− |
− |
8 |
6 |
unlk |
− |
− |
NO |
unlink and free |
0 |
0 |
− |
− |
9 |
7 |
brn |
− |
− |
NO |
branch never |
0 |
0 |
− |
− |
10 |
8 |
rtnl |
− |
− |
NO |
return from jall |
0 |
0 |
− |
− |
11 |
9 |
bra |
dsp11 |
(always) |
BR |
branch always |
0 |
1 |
− |
− |
− |
10 |
bne |
dsp11 |
(Z=0) |
BR |
branch if not equal |
0 |
2 |
− |
− |
− |
11 |
beq |
dsp11 |
(Z=1) |
BR |
branch if equal |
0 |
3 |
− |
− |
− |
12 |
bcc |
dsp11 |
(C=0) |
BR |
branch if carry clear |
0 |
4 |
− |
− |
− |
13 |
blo |
dsp11 |
(C=0) |
BR |
branch if lower (unsigned) |
0 |
4 |
− |
− |
− |
14 |
bcs |
dsp11 |
(C=1) |
BR |
branch if carry set |
0 |
5 |
− |
− |
− |
15 |
bhs |
dsp11 |
(C=1) |
BR |
branch if higher or same (unsigned) |
0 |
5 |
− |
− |
− |
16 |
bpl |
dsp11 |
(N=0) |
BR |
branch if plus or zero |
0 |
6 |
− |
− |
− |
17 |
bmi |
dsp11 |
(N=1) |
BR |
branch if minus |
0 |
7 |
− |
− |
− |
18 |
bvc |
dsp11 |
(V=0) |
BR |
branch if overflow clear |
0 |
8 |
− |
− |
− |
19 |
bvs |
dsp11 |
(V=1) |
BR |
branch if overflow set |
0 |
9 |
− |
− |
− |
20 |
bge |
dsp11 |
(N^V=0) |
BR |
branch if greater or equal (signed) |
0 |
10 |
− |
− |
− |
21 |
blt |
dsp11 |
(N^V=1) |
BR |
branch if less than (signed) |
0 |
11 |
− |
− |
− |
22 |
fadd |
Rd |
Rs |
RR |
float add |
0 |
14 |
0 |
− |
− |
23 |
fsub |
Rd |
Rs |
RR |
float subtract |
0 |
14 |
1 |
− |
− |
24 |
fmul |
Rd |
Rs |
RR |
float multiply |
0 |
14 |
2 |
− |
− |
25 |
fdiv |
Rd |
Rs |
RR |
float divide |
0 |
14 |
3 |
− |
− |
26 |
fneg |
Rd |
Rs |
RR |
float negate sign |
0 |
14 |
4 |
− |
− |
27 |
fsngl |
Rd |
Rs |
RR |
cast uint32 to float |
0 |
14 |
5 |
− |
− |
28 |
fuint |
Rd |
Rs |
RR |
cast float to uint32 |
0 |
14 |
6 |
− |
− |
29 |
ffrac |
Rd |
Rs |
RR |
float obtain fraction |
0 |
14 |
7 |
− |
− |
30 |
fmvsg |
Rd |
Rs |
RR |
float move sign bit |
0 |
14 |
8 |
− |
− |
31 |
fsat |
Rd |
Rs |
RR |
float saturate infinite number |
0 |
14 |
9 |
− |
− |
32 |
fcmp |
Rd |
Rs |
RR |
float compare |
0 |
14 |
10 |
− |
− |
33 |
fdown |
Rd |
Rs |
RR |
float round down to zero |
0 |
14 |
11 |
− |
− |
34 |
hadd |
Rd |
Rs |
RR |
half add |
0 |
14 |
0 |
− |
− |
35 |
hsub |
Rd |
Rs |
RR |
half subtract |
0 |
14 |
1 |
− |
− |
36 |
hmul |
Rd |
Rs |
RR |
half multiply |
0 |
14 |
2 |
− |
− |
37 |
hdiv |
Rd |
Rs |
RR |
half divide |
0 |
14 |
3 |
− |
− |
38 |
hneg |
Rd |
Rs |
RR |
half negate sign |
0 |
14 |
4 |
− |
− |
39 |
hhalf |
Rd |
Rs |
RR |
cast uint16 to half |
0 |
14 |
5 |
− |
− |
40 |
huint |
Rd |
Rs |
RR |
cast half to uint16 |
0 |
14 |
6 |
− |
− |
41 |
hfrac |
Rd |
Rs |
RR |
half obtain fraction |
0 |
14 |
7 |
− |
− |
42 |
hmvsg |
Rd |
Rs |
RR |
half move sign bit |
0 |
14 |
8 |
− |
− |
43 |
hsat |
Rd |
Rs |
RR |
half saturate infinite number |
0 |
14 |
9 |
− |
− |
44 |
hcmp |
Rd |
Rs |
RR |
half compare |
0 |
14 |
10 |
− |
− |
45 |
hdown |
Rd |
Rs |
RR |
half round down to zero |
0 |
14 |
11 |
− |
− |
46 |
mulur |
Rd |
Rs |
RR |
multiply unsigned reversal |
0 |
14 |
16 |
− |
− |
47 |
mulsr |
Rd |
Rs |
RR |
multiply signed reversal |
0 |
14 |
17 |
− |
− |
48 |
divur |
Rd |
Rs |
RR |
divide unsigned reversal |
0 |
14 |
18 |
− |
− |
49 |
divsr |
Rd |
Rs |
RR |
divide signed reversal |
0 |
14 |
19 |
− |
− |
50 |
csft |
Rd |
Rs |
RR |
rotate shift with c flag |
0 |
14 |
23 |
− |
− |
51 |
ldl |
Rd |
Rs |
RR |
load data long word |
0 |
14 |
24 |
− |
− |
52 |
stl |
Rd |
Rs |
RR |
store data long word |
0 |
14 |
25 |
− |
− |
53 |
ldlsp |
Rd |
Rs |
RR |
load data long word sp relative |
0 |
14 |
26 |
− |
− |
54 |
stlsp |
Rd |
Rs |
RR |
store data long word sp relative |
0 |
14 |
27 |
− |
− |
55 |
ldbx |
Rd |
Rs |
RR |
load data byte extended address |
0 |
14 |
28 |
- |
- |
56 |
stbx |
Rd |
Rs |
RR |
store data byte extended address |
0 |
14 |
29 |
- |
- |
57 |
ldwx |
Rd |
Rs |
RR |
load data word extended address |
0 |
14 |
30 |
- |
- |
58 |
stwx |
Rd |
Rs |
RR |
store data word extended address |
0 |
14 |
31 |
- |
- |
59 |
or |
Rd |
Rs |
RR |
bitwise or |
0 |
15 |
0 |
− |
− |
60 |
and |
Rd |
Rs |
RR |
bitwise and |
0 |
15 |
1 |
− |
− |
61 |
eor |
Rd |
Rs |
RR |
bitwise exclusive or |
0 |
15 |
2 |
− |
− |
62 |
mov |
Rd |
Rs |
RR |
move |
0 |
15 |
3 |
− |
− |
63 |
movtc |
Rc |
Rs |
RR |
move to control register |
0 |
15 |
4 |
− |
− |
64 |
movfc |
Rd |
Rc |
RR |
move from control register |
0 |
15 |
5 |
− |
− |
65 |
add |
Rd |
Rs |
RR |
add |
0 |
15 |
6 |
− |
− |
66 |
adc |
Rd |
Rs |
RR |
add with carry |
0 |
15 |
7 |
− |
− |
67 |
sub |
Rd |
Rs |
RR |
subtract |
0 |
15 |
8 |
− |
− |
68 |
sbb |
Rd |
Rs |
RR |
subtract with borrow |
0 |
15 |
9 |
− |
− |
69 |
cmp |
Rd |
Rs |
RR |
compare |
0 |
15 |
10 |
− |
− |
70 |
cmb |
Rd |
Rs |
RR |
compare with borrow |
0 |
15 |
11 |
− |
− |
71 |
ldb |
Rd |
Rs |
RR |
load data byte |
0 |
15 |
12 |
− |
− |
72 |
stb |
Rd |
Rs |
RR |
store data byte |
0 |
15 |
13 |
− |
− |
73 |
ldw |
Rd |
Rs |
RR |
load data word |
0 |
15 |
14 |
− |
− |
74 |
stw |
Rd |
Rs |
RR |
store data word |
0 |
15 |
15 |
− |
− |
75 |
lsft |
Rd |
Rn |
RR |
logical shift |
0 |
15 |
16 |
− |
− |
76 |
asft |
Rd |
Rn |
RR |
arithmetical shift |
0 |
15 |
17 |
− |
− |
77 |
ldwsp |
Rd |
Rn |
RR |
load data word sp relative |
0 |
15 |
18 |
− |
− |
78 |
stwsp |
Rn |
Rd |
RR |
store data word sp relative |
0 |
15 |
19 |
− |
− |
79 |
mulu |
Rd |
Rs |
RR |
multiply unsigned |
0 |
15 |
20 |
− |
− |
80 |
muls |
Rd |
Rs |
RR |
multiply signed |
0 |
15 |
21 |
− |
− |
81 |
divu |
Rd |
Rs |
RR |
divide unsigned |
0 |
15 |
22 |
− |
− |
82 |
divs |
Rd |
Rs |
RR |
divide signed |
0 |
15 |
23 |
− |
− |
83 |
sbbz |
Rd |
− |
R |
subtract zero with borrow |
0 |
15 |
28 |
0 |
− |
84 |
cmbz |
Rd |
− |
R |
compare zero with borrow |
0 |
15 |
28 |
1 |
− |
85 |
ldli |
Rd |
imm32 |
R |
load data long word immediate |
0 |
15 |
29 |
0 |
− |
86 |
cendl |
Rd |
− |
R |
convert endian long word |
0 |
15 |
29 |
1 |
− |
87 |
pushl |
Rs |
− |
R |
push register long word on stack |
0 |
15 |
29 |
2 |
− |
88 |
popl |
Rd |
− |
R |
pop register long word from stack |
0 |
15 |
29 |
3 |
− |
89 |
pushcl |
Rc |
− |
R |
push control register long word on stack |
0 |
15 |
29 |
4 |
− |
90 |
popcl |
Rc |
− |
R |
pop control register long word from stack |
0 |
15 |
29 |
5 |
− |
91 |
adcz |
Rd |
− |
R |
add zero with carry |
0 |
15 |
29 |
6 |
− |
92 |
jall |
Rn |
− |
R |
jump and link long word stack |
0 |
15 |
29 |
7 |
− |
93 |
jmp |
Rn |
− |
R |
jump |
0 |
15 |
30 |
0 |
− |
94 |
jalw |
Rn |
− |
R |
jump and link word stack |
0 |
15 |
30 |
1 |
− |
95 |
sesrl |
imm3 |
− |
R |
set sr low byte |
0 |
15 |
30 |
2 |
− |
96 |
sesrh |
imm3 |
− |
R |
set sr high byte |
0 |
15 |
30 |
3 |
− |
97 |
clsrl |
imm3 |
− |
R |
clear sr low byte |
0 |
15 |
30 |
4 |
− |
98 |
clsrh |
imm3 |
− |
R |
clear sr high byte |
0 |
15 |
30 |
5 |
− |
99 |
exsgl |
Rd |
− |
R |
extend sign bit long word |
0 |
15 |
30 |
6 |
− |
100 |
exzrl |
Rd |
− |
R |
extend zero bit long word |
0 |
15 |
30 |
7 |
− |
101 |
neg |
Rd |
− |
R |
negate sign |
0 |
15 |
31 |
0 |
− |
102 |
not |
Rd |
− |
R |
bitwise not |
0 |
15 |
31 |
1 |
− |
103 |
cendw |
Rd |
− |
R |
convert endian word |
0 |
15 |
31 |
2 |
− |
104 |
exsgw |
Rd |
− |
R |
extend sign bit word |
0 |
15 |
31 |
3 |
− |
105 |
pushw |
Rs |
− |
R |
push register word on stack |
0 |
15 |
31 |
4 |
− |
106 |
popw |
Rd |
− |
R |
pop register word from stack |
0 |
15 |
31 |
5 |
− |
107 |
pushcw |
Rc |
− |
R |
push control register word on stack |
0 |
15 |
31 |
6 |
− |
108 |
popcw |
Rc |
− |
R |
pop control register word from stack |
0 |
15 |
31 |
7 |
− |
109 |
ori |
Rd |
imm8 |
RI |
bitwise or immediate |
1 |
0 |
− |
− |
− |
110 |
andi |
Rd |
imm8 |
RI |
bitwise and immediate |
1 |
1 |
− |
− |
− |
111 |
eori |
Rd |
imm8 |
RI |
bitwise exclusive or immediate |
1 |
2 |
− |
− |
− |
112 |
addi |
Rd |
imm8 |
RI |
add immediate |
1 |
3 |
− |
− |
− |
113 |
subi |
Rd |
imm8 |
RI |
subtract immediate |
1 |
4 |
− |
− |
− |
114 |
cmpi |
Rd |
imm8 |
RI |
compare immediate |
1 |
5 |
− |
− |
− |
115 |
ldbiu |
Rd |
imm8 |
RI |
load data immediate unsigned byte |
1 |
6 |
− |
− |
− |
116 |
ldbil |
Rd |
imm8 |
RI |
load data immediate low byte |
1 |
7 |
− |
− |
− |
117 |
ldbih |
Rd |
imm8 |
RI |
load data immediate high byte |
1 |
8 |
− |
− |
− |
118 |
ldcl |
Rc |
imm8 |
RI |
load data immediate control register low byte |
1 |
9 |
− |
− |
− |
119 |
ldch |
Rc |
imm8 |
RI |
load data immediate control register high byte |
1 |
10 |
− |
− |
− |
120 |
lsfti |
Rd |
imm8 |
RI |
logical shift immediate |
1 |
11 |
− |
− |
− |
121 |
asfti |
Rd |
imm8 |
RI |
arithmetical shift immediate |
1 |
12 |
− |
− |
− |
122 |
csfti |
Rd |
imm8 |
RI |
rotate shift with c flag immediate |
1 |
13 |
− |
− |
− |
命令セット
各命令をアルファベット昇順で説明します。
以下すべて、NH=1設定時の動作について記載しています。NH=0の動作はMoscoviumと同じですので、「Moscovium命令セットマニュアル」をご覧ください。
Moscoviumで定義されていてNihoniumでは未定義な命令を、以下にまとめておきます。
- 固定レジスタペアを使う除算命令:
- divlu/divls/divlq/divlr/divlqr/divlrr
adc (add with carry)
- 書式: adc Rd,Rs
- 動作: Rd’=Rd+Rs+Sr[C]
- 2つのレジスタ値と状態レジスタsrのCフラグ値を加算して、Rdに書き戻す。
- 複数レジスタ加算実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=Rd’[32]
- V=Rd[31]×Rs[31]×(!Rd’[31])+(!Rd[31])×(!Rs[31])×Rd’[31]
- Z=(Rd’=0)×Sr[Z]
adcz (add zero with carry)
- 書式: adcz Rd
- 動作: Rd’=Rd+0+Sr[C]
- レジスタ値と状態レジスタsrのCフラグ値を加算して、Rdに書き戻す。
- 複数レジスタ加算実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=Rd’[32]
- V=(!Rd[31])×Rd’[31]
- Z=(Rd’=0)×Sr[Z]
add (add)
- 書式: add Rd,Rs
- 動作: Rd’=Rd+Rs
- 汎用レジスタRd,Rsを加算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=Rd’[32]
- V=Rd[31]×Rs[31]×(!Rd’[31])+(!Rd[31])×(!Rs[31])×Rd’[31]
- Z=(Rd’=0)
addi (add immediate)
- 書式: addi Rd,imm8
- 動作: Rd’=Rd+uint8(imm8)
- 汎用レジスタRdに即値imm8(8ビット符号無整数)を加算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=Rd’[32]
- V=(!Rd[31])×Rd’[31]
- Z=(Rd’=0)
and (bitwise and)
- 書式: and Rd,Rs
- 動作: Rd’=Rd&Rs
- 汎用レジスタRd,Rsをビット毎論理AND演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
andi (bitwise and immediate)
- 書式: andi Rd,imm8
- 動作: Rd’=Rd&uint8(imm8)
- 汎用レジスタRdと即値imm8を論理AND演算して、Rdに書き戻す。
- imm8は8ビット符号無整数なので、Rd’の上位24ビットは常に0x0000_00となる。
- 実行: 1サイクル
- 状態:
asft (arithmetical shift)
- 書式: asft Rd,Rn
- 動作: Rd’=int32(Rd)<<int6(Rn[5:0])
- 汎用レジスタ値Rdを算術シフト演算して、Rdに書き戻す。
- シフト量はRnレジスタ値の下位6ビットを6ビット符号付整数と見て、int6(Rn[5:0])>0なら左シフト、int6(Rn[5:0])<0なら右シフト。
- シフト可能な範囲は−32〜31ビット。
- int6(Rn[5:0])=0だとRdは変化しない。
- Rnの上位26ビットは無視。
- 算術シフト演算では、Rdの32ビット以上のビットは符号拡張、0ビット未満のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=(int6(Rn)≧0)?Rd’[32]:Rd’[−1]
- V=(int6(Rn)<0)?0:Rd’[32]^Rd’[31]
- Z=(Rd’=0)
asfti (arithmetical shift immediate)
- 書式: asfti Rd,imm8
- 動作: Rd’=int32(Rd)<<int6(imm8)
- 汎用レジスタ値Rdを算術シフト演算して、Rdに書き戻す。
- シフト量は即値imm8の下位6ビットを6ビット符号付整数と見て、int6(imm8)>0なら左シフト、int6(imm8)<0なら右シフト。
- シフト可能な範囲は−32〜31ビット。
- int6(imm8)=0だとRdは変化しない。
- imm8の上位2ビットは無視。
- 算術シフト演算では、Rdの32ビット以上のビットは符号拡張、0ビット未満のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=(int6(imm8)≧0)?Rd’[32]:Rd’[−1]
- V=(int6(imm8)<0)?0:Rd’[32]^Rd’[31]
- Z=(Rd’=0)
bcc (branch if carry clear)
- 書式: bcc dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (!Sr[C]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 直前命令が「cmp Rd,Rs」の場合、Rd,Rsを符号無整数とみなして、Rd≧Rsの時に条件!Sr[C]が成立する。
- 命令コードはbhs命令と同じ。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bcs (branch if carry set)
- 書式: bcs dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[C]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 直前命令が「cmp Rd,Rs」の場合、Rd,Rsを符号無整数とみなして、Rd<Rsの時に条件Sr[C]が成立する。
- 命令コードはblo命令と同じ。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
beq (branch if equal)
- 書式: beq dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[Z]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bge (branch if greater or equal;signed)
- 書式: bge dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (!(Sr[N]^Sr[V])) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 直前命令が「cmp Rd,Rs」の場合、Rd,Rsを符号付整数とみなして、Rd≧Rsの時に条件!Sr[N]^Sr[V]が成立する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bhs (branch if higher or same;unsigned)
- 書式: bhs dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (!Sr[C]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 直前命令が「cmp Rd,Rs」の場合、Rd,Rsを符号無整数とみなして、Rd≧Rsの時に条件!Sr[C]が成立する。
- 命令コードはbcc命令と同じ。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
blo (branch if lower;unsigned)
- 書式: blo dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[C]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 直前命令が「cmp Rd,Rs」の場合、Rd,Rsを符号無整数とみなして、Rd<Rsの時に条件Sr[C]が成立する。
- 命令コードはbcs命令と同じ。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
blt (branch if less than;signed)
- 書式: blt dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[N]^Sr[V]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 直前命令が「cmp Rd,Rs」の場合、Rd,Rsを符号付整数とみなして、Rd<Rsの時に条件Sr[N]^Sr[V]が成立する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bmi (branch if minus)
- 書式: bmi dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[N]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bne (branch if not equal)
- 書式: bne dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (!Sr[Z]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bpl (branch if plus or zero)
- 書式: bpl dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[N]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bra (branch always)
- 書式: bra dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 実行: 2サイクル
- 状態: 変化しない。
brn (branch never)
- 書式: brn
- 動作: なし
- 分岐しない分岐命令なので、動作としてはnop命令と同じです。
- スーパスケイラ版CPUでは、必ず、スロット0に単独で発行され、他の命令と並列実行されることの無い命令です(詳細はこちら)。
- 実行: 1サイクル
- 状態: 変化しない。
bvc (branch if overflow clear)
- 書式: bvc dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[V]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
bvs (branch if overflow set)
- 書式: bvs dsp11
- dsp11は11ビット符号付ディスプレースメント。
- 動作: if (Sr[V]) Pc’=Pc+int11(dsp11)×2
- 分岐先アドレスは常に偶数のため、dsp11は最下位ビットが省略されており、2倍してアドレス計算に用いる。
- 条件不成立時は、次の命令を実行する。
- 実行: 1/2サイクル(条件不成立時/成立時)
- 状態: 変化しない。
cendl (convert endian long word)
- 書式: cendl Rd
- 動作: Rd’={Rd[7:0],Rd[15:8],Rd[23:16],Rd[31:24]}
- 汎用レジスタRdのエンディアンを変換(BE⇔LE)して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
cendw (convert endian word)
- 書式: cendw Rd
- Rdは汎用レジスタ(r0〜r7)。
- 別名cendも使用可能。
- 動作: Rd’={Rd[23:16],Rd[31:24],Rd[7:0],Rd[15:8]}
- 汎用レジスタRdのエンディアンをワード単位で変換(BE⇔LE)して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
clsrh (clear sr high byte's bit)
- 書式: clsrh imm3
- 動作: Sr[8+imm3]=0
- 状態レジスタsrの第(8+imm3)ビットを0にクリアする。
- 実行: 1サイクル
- 状態: 変化しない
clsrl (clear sr low byte's bit)
- 書式: clsrl imm3
- 動作: Sr[imm3]=0
- 状態レジスタsrの第imm3ビットを0にクリアする。
- 実行: 1サイクル
- 状態: 変化しない
- ただし、imm3が演算フラグを指す場合は、そのフラグがクリアされる。
cmb (compare with borrow)
- 書式: cmb Rd,Rs
- 動作: Rd−Rs−Sr[C]
- 2つのレジスタ値と状態レジスタsrのCフラグ値を減算して、状態レジスタの各フラグを更新する。
- 複数レジスタ比較実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rs[31])×(!Rd’[31])+(!Rd[31])×Rs[31]×Rd’[31]
- Z=(Rd’=0)×Sr[Z]
cmbz (compare zero with borrow)
- 書式: cmbz Rd
- 動作: Rd−0−Sr[C]
- レジスタ値と状態レジスタsrのCフラグ値を減算して、状態レジスタの各フラグを更新する。
- 複数レジスタ比較実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rd’[31])
- Z=(Rd’=0)×Sr[Z]
cmp (compare)
- 書式: cmp Rd,Rs
- 動作: Rd−Rs
- 汎用レジスタRdからRsを減算して、状態レジスタの各フラグを更新する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rs[31])×(!Rd’[31])+(!Rd[31])×Rs[31]×Rd’[31]
- Z=(Rd’=0)
cmpi (compare immediate)
- 書式: cmpi Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 動作: Rd−uint8(imm8)
- 汎用レジスタRdから即値imm8(8ビット符号無整数)を減算して、状態レジスタの各フラグを更新する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rd’[31])
- Z=(Rd’=0)
csft (rotate shift with c flag)
- 書式: csft Rd,Rn
- 動作: {Sr’[C],Rd’}={Sr[C],uint32(Rd)}<<int6(Rn[5:0])
- 汎用レジスタ値Rdと状態レジスタsrのキャリCフラグ値を回転シフト演算して、Rdに書き戻す。
- シフト量はRnレジスタ値の下位6ビットを6ビット符号付整数と見て、int6(Rn[5:0])>0なら左シフト、int6(Rn[5:0])<0なら右シフト。
- シフト可能な範囲は−32〜31ビット。
- int6(Rn[5:0])=0だとRdは変化しない。
- Rnの上位26ビットは無視。
- 回転シフト演算では、累積シフトビット数が33の倍数となると、Rd,Sr[C]に関して元の値に戻る。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=(int6(Rn)≧0)?Rd’[32]:Rd’[−1]
- V=0
- Z=(Rd’=0)
csfti (rotate shift with c flag immediate)
- 書式: csfti Rd,imm8
- 動作: {Sr’[C],Rd’}={Sr[C],uint32(Rd)}<<int6(imm8)
- 汎用レジスタ値Rdと状態レジスタsrのキャリCフラグ値を回転シフト演算して、Rdに書き戻す。
- シフト量は即値imm8の下位6ビットを6ビット符号付整数と見て、int6(imm8)>0なら左シフト、int6(imm8)<0なら右シフト。
- シフト可能な範囲は−32〜31ビット。
- int6(imm8)=0だとRdは変化しない。
- imm8の上位2ビットは無視。
- 回転シフト演算では、累積シフトビット数が33の倍数となると、Rd,Sr[C]に関して元の値に戻る。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=(int6(imm8)≧0)?Rd’[32]:Rd’[−1]
- V=0
- Z=(Rd’=0)
divs (divide signed)
- 書式: divs Rd,Rs
- 動作: Rd’=int32(Rd)÷Rs; if (Sr[DR]) Rs’=int32(Rd)%Rs
- 32ビット符号付除算を実行する。
- 状態レジスタsrのDRビット=0の場合には、剰余は取得せずRsは変化しない。
- ゼロ除算(Rs=0)は結果が正しくないため実行禁止。
- 実行: ((10〜13)+DR)サイクル
- 状態: 変化しない。
divsr (divide signed reversal)
- 書式: divsr Rd,Rs
- 動作: Rd’=int32(Rd)÷Rs; if (!Sr[DR]) Rs’=int32(Rd)%Rs
- 32ビット符号付除算を実行する。
- 状態レジスタsrのDRビット=1の場合には、剰余は取得せずRsは変化しない。
- divs命令とは、DRビットの意味が反転する(→ reversal)。
- ゼロ除算(Rs=0)は結果が正しくないため実行禁止。
- 実行: ((10〜13)+(1−DR))サイクル
- 状態: 変化しない。
divu (divide unsigned)
- 書式: divu Rd,Rs
- 動作: Rd’=uint32(Rd)÷Rs; if (Sr[DR]) Rs’=uint32(Rd)%Rs
- 32ビット符号無除算を実行する。
- 状態レジスタsrのDRビット=0の場合には、剰余は取得せずRsは変化しない。
- ゼロ除算(Rs=0)は結果が正しくないため実行禁止。
- 実行: (10+DR)サイクル
- 状態: 変化しない。
divur (divide unsigned reversal)
- 書式: divur Rd,Rs
- 動作: Rd’=uint32(Rd)÷Rs; if (!Sr[DR]) Rs’=uint32(Rd)%Rs
- 32ビット符号無除算を実行する。
- 状態レジスタsrのDRビット=1の場合には、剰余は取得せずRsは変化しない。
- divu命令とは、DRビットの意味が反転する(→ reversal)。
- ゼロ除算(Rs=0)は結果が正しくないため実行禁止。
- 実行: (10+(1−DR))サイクル
- 状態: 変化しない。
eor (bitwise exclusive or)
- 書式: eor Rd,Rs
- 動作: Rd’=Rd^Rs
- 汎用レジスタRd,Rsをビット毎論理EOR(Exclusive OR)演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
eori (bitwise exclusive or immediate)
- 書式: eori Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 動作: Rd’=Rd^uint8(imm8)
- 汎用レジスタRdと即値imm8(8ビット符号無整数)をビット毎論理EOR(Exclusive OR)演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
exsgl (extend sign bit long word)
- 書式: exsgl Rd
- 動作: Rd’=int16(Rd[15:0])
- 汎用レジスタRdの下位16ビットデータを32ビットに符号拡張して、Rdに書き戻す。
- 元のRdの上位16ビットは無視して、符号拡張によって上書きする。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
exsgw (extend sign bit word)
- 書式: exsgw Rd
- Rdは汎用レジスタ(r0〜r7)。
- 別名exsgも使用可能。
- 動作: Rd’=int8(Rd[7:0])
- 汎用レジスタRdの下位8ビットデータを32ビットに符号拡張して、Rdに書き戻す。
- 元のRdの上位24ビットは無視して、符号拡張によって上書きする。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
exzrl (extend zero bit long word)
- 書式: exzrl Rd
- 動作: Rd’=uint16(Rd[15:0])
- 汎用レジスタRdの下位16ビットデータを32ビットにゼロ拡張して、Rdに書き戻す。
- 元のRdの上位16ビットは無視して、ゼロ拡張によって上書きする。
- 実行: 1サイクル
- 状態:
fadd (float add)
- 書式: fadd Rd,Rs
- 動作: Rd’=Rd+Rs
- 汎用レジスタRd,Rsをfloat型(単精度浮動小数)と見て加算し、Rdに書き戻す。
- S-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態: 変化しない。
fcmp (float compare)
- 書式: fcmp Rd,Rs
- 動作: Rd−Rs
- 汎用レジスタRd,Rsをfloat型(単精度浮動小数)と見て減算し、状態レジスタの各フラグを更新する。
- Nフラグ: Rd−Rs=NaNまたは、Rd−Rs<0の場合にN=1となる。それ以外のケースではN=0。
- Cフラグ: Rd−Rs=±0または、Rd=Rs=±INF、Rd=Rs=NaNの場合にC=1となる。それ以外のケースではC=0。
- Vフラグ: Rd−Rs=NaNの時、V=1となる。それ以外のケースではV=0。
- Zフラグ: Rd−Rs=±0の時、Z=1となる。それ以外のケースではZ=0。
- 命令実行後、Rd,Rsレジスタ値は変化しない。
- S-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態:
- N=(Rd−Rs=NaN)+(Rd−Rs<0)
- C=(Rd−Rs=±0)+(Rd=Rs=±INF)+(Rd=Rs=NaN)
- V=(Rd−Rs=NaN)
- Z=(Rd−Rs=±0)
fdiv (float divide)
- 書式: fdiv Rd,Rs
- 動作: Rd’=Rd÷Rs
- 汎用レジスタRd,Rsをfloat型(単精度浮動小数)と見て除算し、Rdに書き戻す。
- S-FPU搭載時のみ有効な命令。
- 実行: (3〜7)サイクル
- 状態: 変化しない。
fdown (float round down to zero)
- 書式: fdown Rd,Rs
- 動作: Rd’=sgn(Rs)×floor(abs(Rs))
- 汎用レジスタRsをfloat型(単精度浮動小数)と見て、Rsの小数点以下をゼロ方向へ切り捨てた値をRdに転送する。
- 言い換えると、Rsをfloat型のまま、整数に変換してRdに転送する。
- Rsの符号はRdでも保存される。動作式の通り、本命令の動作はfloor()関数とは異なることに注意。
- S-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
ffrac (float obtain fraction)
- 書式: ffrac Rd,Rs
- 動作: Rd=uint32(abs(Rs)×232)
- 汎用レジスタRsをfloat型(単精度浮動小数)と見て、小数点以下32ビットバイナリ値をRdに転送する。
- Rsが整数または、abs(Rs)<2-32の場合は、Rd=0が返る。
- Rs=±INFまたはRs=NaNだった場合、Rd=0が返る。
- 例)Rs=float (1.25)だった場合、ffrac命令実行後のRd=0x4000_0000。
- Rd÷232が元の小数値なので、0x4000_0000÷232=0.25であり、Rsの小数点以下の数値が得られた。
- S-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態: 変化しない。
fsngl (cast uint32 to float)
- 書式: fsngl Rd,Rs
- 動作: Rd=float(Rs)
- 汎用レジスタRsをuint32型(32ビット符号無整数)と見て、float型(単精度浮動小数)にキャストしてRdに転送する。
- Rs(uint32)の冗長ビットは無視して切り捨てる。
- S-FPU搭載時のみ有効な命令。
- 実行: (3〜6)サイクル
- 状態: 変化しない。
fmul (float multiply)
- 書式: fmul Rd,Rs
- 動作: Rd’=Rd×Rs
- 汎用レジスタRd,Rsをfloat型(単精度浮動小数)と見て乗算し、Rdに書き戻す。
- S-FPU搭載時のみ有効な命令。
- 実行: 3サイクル
- 状態: 変化しない。
fmvsg (float move sign bit)
- 書式: fmvsg Rd,Rs
- 動作: Rd’=Rd×sgn(Rd)×sgn(Rs)
- 汎用レジスタRd,Rsをfloat型(単精度浮動小数)と見て、Rsの符号ビットをRdの符号ビットに転送する。
- Rdの符号ビット以外の意味に変化は無い。
- S-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
fneg (float negate sign)
- 書式: fneg Rd,Rs
- 動作: Rd=−Rs
- 汎用レジスタRsをfloat型(単精度浮動小数)と見て、Rsの符号を反転してRdに転送する。
- S-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
fsat (float saturate infinite number)
- 書式: fsat Rd,Rs
- 動作: Rd=(Rs=±INF)?±3.4028235e+38:(Rs=−0)?0:Rs
- 汎用レジスタRsをfloat型(単精度浮動小数)と見て、無限大(±INF)を有限の絶対値最大値(±3.4028235e+38,0x7f7f_ffffまたは0xff7f_ffff)に変換してRdに転送する。
- 大小比較などで扱いにくい負号付きゼロ値(−0)も、ゼロ(0)に縮退する。
- S-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
fsub (float subtract)
- 書式: fsub Rd,Rs
- 動作: Rd’=Rd−Rs
- 汎用レジスタRd,Rsをfloat型(単精度浮動小数)と見て減算し、Rdに書き戻す。
- S-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態: 変化しない。
fuint (cast float to uint32)
- 書式: fuint Rd,Rs
- 動作: Rd=uint32(abs(Rs))
- 汎用レジスタRsをfloat型(単精度浮動小数)と見て、Rsの絶対値abs (Rs)をuint32型(32ビット符号無整数)にキャストしてRdに転送する。
- 小数点以下の数値は切り捨てとなる。uint32範囲外の上位ビットも、無視される。
- Rs=±INFまたはRs=NaNの場合はRd=0が返る。有限値範囲と重なっているので、huint命令実行前にRsの値を確認して場合分けが必要。
- S-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態: 変化しない。
hadd (half add)
- 書式: hadd Rd,Rs
- 動作: Rd’=Rd+Rs
- 汎用レジスタRd,Rsをhalf型(半精度浮動小数)と見て加算し、Rdに書き戻す。
- H-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態: 変化しない。
hcmp (half compare)
- 書式: hcmp Rd,Rs
- 動作: Rd−Rs
- 汎用レジスタRd,Rsをhalf型(半精度浮動小数)と見て減算し、状態レジスタの各フラグを更新する。
- Nフラグ: Rd−Rs=NaNまたは、Rd−Rs<0の場合にN=1となる。それ以外のケースではN=0。
- Cフラグ: Rd−Rs=±0または、Rd=Rs=±INF、Rd=Rs=NaNの場合にC=1となる。それ以外のケースではC=0。
- Vフラグ: Rd−Rs=NaNの時、V=1となる。それ以外のケースではV=0。
- Zフラグ: Rd−Rs=±0の時、Z=1となる。それ以外のケースではZ=0。
- 命令実行後、Rd,Rsレジスタ値は変化しない。
- H-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態:
- N=(Rd−Rs=NaN)+(Rd−Rs<0)
- C=(Rd−Rs=±0)+(Rd=Rs=±INF)+(Rd=Rs=NaN)
- V=(Rd−Rs=NaN)
- Z=(Rd−Rs=±0)
hdiv (half divide)
- 書式: hdiv Rd,Rs
- 動作: Rd’=Rd÷Rs
- 汎用レジスタRd,Rsをhalf型(半精度浮動小数)と見て除算し、Rdに書き戻す。
- H-FPU搭載時のみ有効な命令。
- 実行: (6〜7)サイクル
- 状態: 変化しない。
hdown (half round down to zero)
- 書式: hdown Rd,Rs
- 動作: Rd’=sgn(Rs)×floor(abs(Rs))
- 汎用レジスタRsをhalf型(半精度浮動小数)と見て、Rsの小数点以下をゼロ方向へ切り捨てた値をRdに転送する。
- 言い換えると、Rsをhalf型のまま、整数に変換してRdに転送する。
- Rsの符号はRdでも保存される。動作式の通り、本命令の動作はfloor()関数とは異なることに注意。
- H-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
hfrac (half obtain fraction)
- 書式: hfrac Rd,Rs
- 動作: Rd=uint16(abs(Rs)×65,536)
- 汎用レジスタRsをhalf型(半精度浮動小数)と見て、小数点以下16ビットバイナリ値をRdに転送する。
- Rs=±INFまたはRs=NaNだった場合、Rd=0が返る。
- 例)Rs=half (1.25)だった場合、hfrac命令実行後のRd=0x4000。
- Rd÷65,536が元の小数値なので、0x4000÷65,536=0.25であり、Rsの小数点以下の数値が得られた。
- H-FPU搭載時のみ有効な命令。
- 実行: (3〜7)サイクル
- 状態: 変化しない。
hhalf (cast uint16 to half)
- 書式: hhalf Rd,Rs
- 動作: Rd=half(Rs)
- 汎用レジスタRsをuint16型(16ビット符号無整数)と見て、half型(半精度浮動小数)にキャストしてRdに転送する。
- Rs(uint16)の冗長ビットは無視して切り捨てる。Rs>65,504の場合はRs=half (65,504)となる。
- H-FPU搭載時のみ有効な命令。
- 実行: (3〜5)サイクル
- 状態: 変化しない。
hmul (half multiply)
- 書式: hmul Rd,Rs
- 動作: Rd’=Rd×Rs
- 汎用レジスタRd,Rsをhalf型(半精度浮動小数)と見て乗算し、Rdに書き戻す。
- H-FPU搭載時のみ有効な命令。
- 実行: (3〜4)サイクル
- 状態: 変化しない。
hmvsg (half move sign bit)
- 書式: hmvsg Rd,Rs
- 動作: Rd’=Rd×sgn(Rd)×sgn(Rs)
- 汎用レジスタRd,Rsをhalf型(半精度浮動小数)と見て、Rsの符号ビットをRdの符号ビットに転送する。
- Rdの符号ビット以外の意味に変化は無い。
- H-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
hneg (half negate sign)
- 書式: hneg Rd,Rs
- 動作: Rd=−Rs
- 汎用レジスタRsをhalf型(半精度浮動小数)と見て、Rsの符号を反転してRdに転送する。
- H-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
hsat (half saturate infinite number)
- 書式: hsat Rd,Rs
- 動作: Rd=(Rs=±INF)?±65,504:(Rs=−0)?0:Rs
- 汎用レジスタRsをhalf型(半精度浮動小数)と見て、無限大(±INF)を有限の絶対値最大値(65,504)に変換してRdに転送する。
- 大小比較などで扱いにくい負号付きゼロ値(−0)も、ゼロ(0)に縮退する。
- H-FPU搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
hsub (half subtract)
- 書式: hsub Rd,Rs
- 動作: Rd’=Rd−Rs
- 汎用レジスタRd,Rsをhalf型(半精度浮動小数)と見て減算し、Rdに書き戻す。
- H-FPU搭載時のみ有効な命令。
- 実行: (3〜8)サイクル
- 状態: 変化しない。
huint (cast half to uint16)
- 書式: huint Rd,Rs
- 動作: Rd=uint16(abs(Rs))
- 汎用レジスタRsをhalf型(半精度浮動小数)と見て、Rsの絶対値abs (Rs)をuint16型(16ビット符号無整数)にキャストしてRdに転送する。
- 小数点以下の数値は切り捨てとなる。
- Rs=±INFの場合はRd=0、Rs=NaNの場合はRd=0x0040〜0xffc0が返る(NaN仮数部の左詰め、通常はRd=0x8000)。有限値範囲0〜65,504と重なっているので、huint命令実行前にRsの値を確認して場合分けが必要。
- H-FPU搭載時のみ有効な命令。
- 実行: (3〜7)サイクル
- 状態: 変化しない。
jall (jump and link long word stack)
- 書式: jall Rn
- 動作: [--Sp]=uint32(Pc); Pc=Rn[15:0]
- 現在のプログラムカウンタpcをスタックに積んだ後、汎用レジスタRnの指し示すアドレスへ分岐する。
- Pcは16ビット長なので、32ビットにゼロ拡張してスタックに積む。
- Pcは16ビットなので、Rnの下位16ビットが有効。
- jall命令実行時点で、Pcはjall命令の次の命令アドレスを指し示しているため、分岐先でrtnl命令を実行することで、jall命令の次命令に復帰できる。
- 実行: (N+2)サイクル
- スタックポインタsp設定領域のロングワードライトサイクル数N。
- 状態: 変化しない。
jalw (jump and link word stack)
- 書式: jalw Rn
- 動作: [--Sp]=uint16(Pc); Pc=Rn[15:0]
- 現在のプログラムカウンタpcをスタックに積んだ後、汎用レジスタRnの指し示すアドレスへ分岐する。
- Pcは16ビットなので、Rnの下位16ビットが有効。
- jalw命令実行時点で、Pcはjalw命令の次の命令アドレスを指し示しているため、分岐先でrtnw命令を実行することで、jalw命令の次命令に復帰できる。
- 別名jalも使用可能。
- 実行: (N+2)サイクル
- スタックポインタsp設定領域のワードライトサイクル数N。
- 状態: 変化しない。
jmp (jump)
- 書式: jmp Rn
- 動作: Pc=Rn[15:0]
- 汎用レジスタRnの指し示すアドレスへ分岐する。
- Pcは16ビットなので、Rnの下位16ビットが有効。
- 実行: 2サイクル
- 状態: 変化しない。
ldb (load data byte)
- 書式: ldb Rd,[Rs]
- 動作: Rd=uint8([Rs])
- 汎用レジスタRsの指し示す32ビットアドレスから8ビットバイトデータを読み出して汎用レジスタRdに転送する。
- 読み出したデータは8ビット符号無整数なので、Rdの上位24ビットは常に0x0000_00。
- 実行: (N+1)サイクル
- 状態: 変化しない。
ldbx (load data byte extended address)
- 書式: ldbx Rd,[Tr:Rs]
- Rd,Rsは汎用レジスタ(r0〜r7)。Trは一時レジスタ。
- 動作: Rd=uint8([Tr:Rs])
- 一時レジスタtr[15:0]を上位16ビット、汎用レジスタRs[15:0]を下位16ビットとする32ビット拡張アドレスから8ビットバイトデータを読み出して汎用レジスタRdに転送する。
- 読み出したデータは8ビット符号無整数なので、Rdの上位24ビットは常に0x0000_00。
- Moscoviumとの互換性維持のための命令。Nihoniumでは、ldb命令の使用を推奨する。
- 実行: (N+1)サイクル
- 状態: 変化しない。
ldbih (load data immediate high byte)
- 書式: ldbih Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 別名ldihも使用可能。
- 動作: Rd’={0x0000,imm8,Rd[7:0]}
- 汎用レジスタRdの第15〜8ビットに即値imm8を転送する。
- Rdの上位16ビットは常に0x0000、下位8ビットは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
ldbil (load data immediate low byte)
- 書式: ldbil Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 別名ldilも使用可能。
- 動作: Rd’={0x0000,Rd[15:8],imm8}
- 汎用レジスタRdの下位8ビットに即値imm8を転送する。
- Rdの上位16ビットは常に0x0000、第15〜8ビットは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
ldbiu (load data immediate unsigned byte)
- 書式: ldbiu Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 別名ldiuも使用可能。
- 動作: Rd=uint8(imm8)
- 汎用レジスタRdに即値imm8を転送する。
- imm8を32ビットにゼロ拡張して転送するので、Rdの上位24ビットは常に0x0000_00が転送される。
- 実行: 1サイクル
- 状態: 変化しない。
ldch (load data immediate control register high byte)
- 書式: ldch Rc,imm8
- Rcは制御レジスタ(sr,sp,iv,tr)。imm8は符号無8ビット即値。
- 動作: Rc’={0x0000,imm8,Rc[7:0]}
- 制御レジスタRcの第15〜8ビットに即値imm8を転送する。
- Rcの下位8ビットは変化しない。
- Rcがスタックポインタspまたは一時レジスタtrだった場合、上位16ビットは常に0x0000が転送される。
- 実行: 1サイクル
- 状態: 変化しない。
ldcl (load data immediate control register low byte)
- 書式: ldcl Rc,imm8
- Rcは制御レジスタ(sr,sp,iv,tr)。imm8は符号無8ビット即値。
- 動作: Rc’={0x0000,Rc[15:8],imm8}
- 制御レジスタRcの下位8ビットに即値imm8を転送する。
- Rcの第15〜8ビットは変化しない。
- Rcがスタックポインタspまたは一時レジスタtrだった場合、上位16ビットは常に0x0000が転送される。
- 実行: 1サイクル
- 状態: 変化しない。
- ただし、Rcが状態レジスタsrの場合は、imm8の値が状態フラグ(N,C,V,Z)にセットされる。
ldl (load data long word)
- 書式: ldl Rd,[Rs]
- 動作: Rd=uint32([Rs])
- 汎用レジスタRsの指し示す32ビットアドレスから32ビットロングワードデータを読み出して汎用レジスタRdに転送する。
- Rsが奇数アドレスであってはならない。
- 実行: (N+1)サイクル
- 状態: 変化しない。
ldli (load data long word immediate)
- 書式: ldli Rd,imm32
- Rdは汎用レジスタ(r0〜r7)。imm32は符号無32ビット即値。
- 動作: Rd=imm32
- 汎用レジスタRdに即値imm32を転送する。
- 本命令は、3ワード命令。
- 実行: 3サイクル
- 状態: 変化しない。
ldlsp (load data long word sp relative)
- 書式: ldlsp Rd,[Sp+Rn]
- Rd,Rnは汎用レジスタ(r0〜r7)。Spはスタックポインタ。
- 動作: Tr=Sp+Rn; Rd=uint32([Tr])
- スタックポインタspに汎用レジスタRnを加算したアドレスから、32ビットロングワードデータを読み出して汎用レジスタRdに転送する。
- Sp+Rnが奇数アドレスであってはならない。
- 一時レジスタtrを使用してデータを破壊する。
- 実行: (N+2)サイクル
- 状態: 変化しない
ldw (load data word)
- 書式: ldw Rd,[Rs]
- 動作: Rd=uint16([Rs])
- 汎用レジスタRsの指し示す32ビットアドレスから16ビットワードデータを読み出して汎用レジスタRdに転送する。
- 読み出したデータは16ビット符号無整数なので、Rdの上位16ビットは常に0x0000が転送される。
- Rsが奇数アドレスであってはならない。
- 実行: (N+1)サイクル
- 状態: 変化しない。
ldwsp (load data word sp relative)
- 書式: ldwsp Rd,[Sp+Rn]
- Rd,Rnは汎用レジスタ(r0〜r7)。Spはスタックポインタ。
- 別名ldspも使用可能。
- 動作: Tr=Sp+Rn; Rd=uint16([Tr])
- スタックポインタspに汎用レジスタRnを加算したアドレスから、16ビットワードデータを読み出して汎用レジスタRdに転送する。
- 読み出したデータは16ビット符号無整数なので、Rdの上位16ビットは常に0x0000が転送される。
- Sp+Rnが奇数アドレスであってはならない。
- 一時レジスタtrを使用してデータを破壊する。
- 実行: (N+2)サイクル
- 状態: 変化しない
ldwx (load data word extended address)
- 書式: ldwx Rd,[Tr:Rs]
- Rd,Rsは汎用レジスタ(r0〜r7)。Trは一時レジスタ。
- 動作: Rd=uint16([Tr:Rs])
- 一時レジスタtr[15:0]を上位16ビット、汎用レジスタRs[15:0]を下位16ビットとする32ビット拡張アドレスから16ビットワードデータを読み出して汎用レジスタRdに転送する。
- 読み出したデータは16ビット符号無整数なので、Rdの上位16ビットは常に0x0000が転送される。
- Rsが奇数アドレスであってはならない。
- Moscoviumとの互換性維持のための命令。Nihoniumでは、ldw命令の使用を推奨する。
- 実行: (N+1)サイクル
- 状態: 変化しない。
link (link and allocate)
- 書式: link imm16
- 動作: Tr=Sp; Sp−=uint16(imm16); [--Sp]=uint32(Tr[31:0])
- スタックにimm16バイトのデータ領域を確保して、確保する前のスタックポインタsp(32ビット)をスタックに積む。
- imm16が奇数であってはならない。
- 一時レジスタtrを使用してデータを破壊する。
- 本命令は、2ワード命令。
- 本命令で確保したスタックフレームの解放はunlk命令を使用可能。
- 実行: (N+2)サイクル
- スタックポインタsp設定領域のロングワードライトサイクル数N。
- 状態: 変化しない。
lsft (logical shift)
- 書式: lsft Rd,Rn
- 動作: Rd’=uint32(Rd)<<int6(Rn[5:0])
- 汎用レジスタ値Rdを論理シフト演算して、Rdに書き戻す。
- シフト量はRnレジスタ値の下位6ビットを6ビット符号付整数と見て、int6(Rn[5:0])>0なら左シフト、int6(Rn[5:0])<0なら右シフト。
- シフト可能な範囲は−32〜31ビット。
- int6(Rn[5:0])=0だとRdは変化しない。
- Rnの上位26ビットは無視。
- 論理シフト演算では、Rdの31〜0ビット範囲外のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=(int6(Rn)≧0)?Rd’[32]:Rd’[−1]
- V=(int6(Rn)<0)?0:Rd’[32]^Rd’[31]
- Z=(Rd’=0)
lsfti (logical shift immediate)
- 書式: lsfti Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 動作: Rd’=uint32(Rd)<<int6(imm8)
- 汎用レジスタ値Rdを論理シフト演算して、Rdに書き戻す。
- シフト量は即値imm8の下位6ビットを6ビット符号付整数と見て、int6(imm8)>0なら左シフト、int6(imm8)<0なら右シフト。
- シフト可能な範囲は−32〜31ビット。
- int6(imm8)=0だとRdは変化しない。
- imm8の上位2ビットは無視。
- 論理シフト演算では、Rdの31〜0ビット範囲外のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=(int6(imm8)≧0)?Rd’[32]:Rd’[−1]
- V=(int6(imm8)<0)?0:Rd’[32]^Rd’[31]
- Z=(Rd’=0)
mov (move)
- 書式: mov Rd,Rs
- 動作: Rd=Rs
- 実行: 1サイクル
- 状態:
- N=Rd[31]
- C=0
- V=0
- Z=(Rd=0)
movfc (move from control register)
- 書式: movfc Rd,Rc
- Rdは汎用レジスタ(r0〜r7)、Rcは制御レジスタ(sr,pc,sp,iv,tr)。
- 動作: Rd=Rc
- 制御レジスタRcを汎用レジスタRdに転送する。
- スタックポインタsp、一時レジスタtrは32ビット幅なので、すべてのデータがRdに転送される。
- それ以外の制御レジスタは16ビット幅なので、Rdの上位16ビットは常に0x0000となる。
- 実行: 1サイクル
- 状態:
- N=Rd[31]
- C=0
- V=0
- Z=(Rd=0)
movtc (move to control register)
- 書式: movtc Rc,Rs
- Rcは制御レジスタ(sr,sp,iv,tr)、Rsは汎用レジスタ(r0〜r7)。
- 動作: Rc=Rs
- 汎用レジスタRsを制御レジスタRcに転送する。
- スタックポインタsp、一時レジスタtrは32ビット幅なので、Rsの全ビットが転送される。
- それ以外の制御レジスタは16ビット幅なので、Rsの下位16ビットだけが転送される。
- 実行: 1サイクル
- 状態:
- N=Rc[31]
- C=0
- V=0
- Z=(Rc=0)
- ただし、Rcが状態レジスタsrの場合は、転送した値が状態フラグ(N,C,V,Z)にセットされる。
muls (multiply signed)
- 書式: muls Rd,Rs
- 動作: Rd’=int32(Rd)×Rs
- 32×32=32ビット符号付乗算を実行する。
- 一般に32×32ビット乗算結果(積)は64ビット長となる。
- 状態レジスタsrのMLビット=0の場合には、Rdに積の下位32ビットが転送され、Rsは変化しない。
- 状態レジスタsrのMLビット=1(かつNHビット=1)として本命令を実行することは禁止とする。実行した場合、Rsのデータは破壊される。
- 実行: 2サイクル
- 状態: 変化しない。
mulsr (multiply signed reversal)
- 書式: mulsr Rd,Rs
- 動作: Rd’=int32(Rd)×Rs;
- 32×32=32ビット符号付乗算を実行する。
- 一般に32×32ビット乗算結果(積)は64ビット長となる。
- 状態レジスタsrのMLビット=1の場合には、Rdに積の下位32ビットが転送され、Rsは変化しない。
- 状態レジスタsrのMLビット=0(かつNHビット=1)として本命令を実行することは禁止とする。実行した場合、Rsのデータは破壊される。
- muls命令とは、MLビットの意味が反転する(→ reversal)。
- 実行: 2サイクル
- 状態: 変化しない。
mulu (multiply unsigned)
- 書式: mulu Rd,Rs
- 動作: Rd’=uint32(Rd)×Rs
- 32×32=32ビット符号無乗算を実行する。
- 一般に32×32ビット乗算結果(積)は64ビット長となる。
- 状態レジスタsrのMLビット=0の場合には、Rdに積の下位32ビットが転送され、Rsは変化しない。
- 状態レジスタsrのMLビット=1(かつNHビット=1)として本命令を実行することは禁止とする。実行した場合、Rsのデータは破壊される。
- 実行: 2サイクル
- 状態: 変化しない。
mulur (multiply unsigned reversal)
- 書式: mulur Rd,Rs
- 動作: Rd’=uint32(Rd)×Rs;
- 32×32=32ビット符号無乗算を実行する。
- 一般に32×32ビット乗算結果(積)は64ビット長となる。
- 状態レジスタsrのMLビット=1の場合には、Rdに積の下位32ビットが転送され、Rsは変化しない。
- 状態レジスタsrのMLビット=0(かつNHビット=1)として本命令を実行することは禁止とする。実行した場合、Rsのデータは破壊される。
- mulu命令とは、MLビットの意味が反転する(→ reversal)。
- 乗算コプロセッサ搭載時のみ有効な命令。
- 実行: 2サイクル
- 状態: 変化しない。
neg (negate sign)
- 書式: neg Rd
- 動作: Rd’=−Rd(=!Rd+1)
- 汎用レジスタRdの値を符号反転(2の補数表現)して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×Rd’[31]
- Z=(Rd’=0)
nop (no operation)
- 書式: nop
- 動作: なし
- 実行: 1サイクル
- 状態: 変化しない。
not (bitwise not)
- 書式: not Rd
- 動作: Rd’=!Rd
- 汎用レジスタRdの値をビット毎論理NOT演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
or (bitwise or)
- 書式: or Rd,Rs
- 動作: Rd’=Rd|Rs
- 汎用レジスタRd,Rsをビット毎論理OR演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
ori (bitwise or immediate)
- 書式: ori Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 動作: Rd’=Rd|uint8(imm8)
- 汎用レジスタRdと即値imm8(8ビット符号無整数)をビット毎論理OR演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=0
- V=0
- Z=(Rd’=0)
pause (pause until interrupt request coming)
- 書式: pause
- 動作: while (!IRQ) ;
- 割り込み要求が来るまで一時停止する。
- 割り込み要求が来ると、
- 状態レジスタsrのIE[1:0]>割り込みレベルだった場合には、割り込み処理を開始する。
- 状態レジスタsrのIE[1:0]≦割り込みレベルだった場合には、次の命令を実行する。
- CPUに対する割り込み要求以外の条件では、pause命令から抜けられない。
- 実行: 1サイクル以上
- 状態: 変化しない
popcl (pop control register long word from stack)
- 書式: popcl Rc
- 動作: Rc=uint32([Sp++])
- 制御レジスタRcをスタックから取り出す。
- スタックから取り出したデータは32ビット符号無整数なので、
- Rcが16ビットレジスタだった場合、下位16ビットがRc[15:0]に読み込まれる。
- Rcが一時レジスタtrの場合、32ビットデータが読み込まれる。
- 実行: (N+1)サイクル
- スタックポインタsp設定領域のワードリードサイクル数N。
- 状態: 変化しない。
- ただし、Rcが状態レジスタsrの場合は、スタックから取り出した値が状態フラグ(N,C,V,Z)にセットされる。
popcw (pop control register word from stack)
- 書式: popcw Rc
- 動作: Rc=uint16([Sp++])
- 制御レジスタRcをスタックから取り出す。
- スタックから取り出したデータは16ビット符号無整数なので、Rcが一時レジスタtrだった場合、Trの上位16ビットは常に0x0000となる。
- 別名popcも使用可能。
- 実行: (N+1)サイクル
- スタックポインタsp設定領域のワードリードサイクル数N。
- 状態: 変化しない。
- ただし、Rcが状態レジスタsrの場合は、スタックから取り出した値が状態フラグ(N,C,V,Z)にセットされる。
popl (pop register long word from stack)
- 書式: popl Rd
- 動作: Rd=uint32([Sp++])
- 実行: (N+1)サイクル
- スタックポインタsp設定領域のロングワードリードサイクル数N。
- 状態: 変化しない。
popw (pop register word from stack)
- 書式: popw Rd
- Rdは汎用レジスタ(r0〜r7)。
- 別名popも使用可能。
- 動作: Rd=uint16([Sp++])
- 汎用レジスタRdをスタックから取り出す。
- スタックから取り出したデータは16ビット符号無整数なので、Rdの上位16ビットは常に0x0000となる。
- 実行: (N+1)サイクル
- スタックポインタsp設定領域のワードリードサイクル数N。
- 状態: 変化しない。
pushcl (push control register long word on stack)
- 書式: pushcl Rc
- 動作: [--Sp]=uint32(Rc)
- 制御レジスタRcをスタックへ積む。
- Rcが16ビットレジスタの場合、上位16ビットをゼロ拡張してスタックに積む。
- Rcが一時レジスタtrの場合、32ビットデータをスタックに積む。
- 実行: Nサイクル
- スタックポインタsp設定領域のワードライトサイクル数N。
- 状態: 変化しない。
pushcw (push control register word on stack)
- 書式: pushcw Rc
- 動作: [--Sp]=uint16(Rc[15:0])
- 制御レジスタRcをスタックへ積む。
- Rcが一時レジスタtrだった場合、スタックに積むのはTrの下位16ビットだけとなる。
- 別名pushcも使用可能。
- 実行: Nサイクル
- スタックポインタsp設定領域のワードライトサイクル数N。
- 状態: 変化しない。
pushl (push register long word on stack)
- 書式: pushl Rs
- 動作: [--Sp]=uint32(Rs[31:0])
- 実行: Nサイクル
- スタックポインタsp設定領域のロングワードライトサイクル数N。
- 状態: 変化しない。
pushw (push register word on stack)
- 書式: pushw Rs
- Rsは汎用レジスタ(r0〜r7)。
- 別名pushも使用可能。
- 動作: [--Sp]=uint16(Rs[15:0])
- 汎用レジスタRsをスタックへ積む。
- スタックへ積むのは、Rsの下位16ビットだけとなる。
- 実行: Nサイクル
- スタックポインタsp設定領域のワードライトサイクル数N。
- 状態: 変化しない。
rti (return from interrupt)
- 書式: rti
- 動作: Sr=uint16([Sp++]); Pc=uint16([Sp++])
- スタックから、状態レジスタsr→プログラムカウンタpcの順で取り出す。
- 本命令の次命令は実行されず、スタックから取り出した新しいPcの指し示すアドレスから命令をフェッチして実行する。
- 実行: (2×N+2)サイクル
- スタックポインタsp設定領域のワードリードサイクル数N。
- 状態: 変化しない
- ただし、スタックから取り出した値が状態フラグ(N,C,V,Z)にセットされる。
rtnl (return from jall)
- 書式: rtnl
- 動作: Pc=uint32([Sp++])
- プログラムカウンタpcをスタックから取り出す。
- スタックからロングワードデータを読み出し、それを戻り先アドレスとして分岐する。
- 現在のPcは16ビット長なので、読み出した32ビットアドレスの下位16ビットが有効。
- 本命令の次命令は実行されず、スタックから取り出した新しいPcの指し示すアドレスから命令をフェッチして実行する。
- 実行: (N+2)サイクル
- スタックポインタsp設定領域のロングワードリードサイクル数N。
- 状態: 変化しない。
rtnw (return from jalw)
- 書式: rtnw
- 動作: Pc=uint16([Sp++])
- プログラムカウンタpcをスタックから取り出す。
- 本命令の次命令は実行されず、スタックから取り出した新しいPcの指し示すアドレスから命令をフェッチして実行する。
- 別名rtnも使用可能。
- 実行: (N+2)サイクル
- スタックポインタsp設定領域のワードリードサイクル数N。
- 状態: 変化しない。
sbb (subtract with borrow)
- 書式: sbb Rd,Rs
- 動作: Rd’=Rd−Rs−Sr[C]
- 2つのレジスタ値と状態レジスタsrのCフラグ値を減算して、Rdに書き戻す。
- 複数レジスタ減算実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rs[31])×(!Rd’[31])+(!Rd[31])×Rs[31]×Rd’[31]
- Z=(Rd’=0)×Sr[Z]
sbbz (subtract zero with borrow)
- 書式: sbbz Rd
- 動作: Rd’=Rd−0−Sr[C]
- レジスタ値と状態レジスタsrのCフラグ値を減算して、Rdに書き戻す。
- 複数レジスタ減算実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rd’[31])
- Z=(Rd’=0)×Sr[Z]
sesrh (set sr high byte's bit)
- 書式: sesrh imm3
- 動作: Sr[8+imm3]=1
- 状態レジスタsrの第(8+imm3)ビットを1にセットする。
- 実行: 1サイクル
- 状態: 変化しない
sesrl (set sr low byte's bit)
- 書式: sesrl imm3
- 動作: Sr[imm3]=1
- 状態レジスタsrの第imm3ビットを1にセットする。
- 実行: 1サイクル
- 状態: 変化しない
- ただし、imm3が演算フラグを指す場合は、そのフラグがセットされる。
stb (store data byte)
- 書式: stb [Rd],Rs
- 動作: [Rd]=uint8(Rs[7:0])
- 汎用レジスタRdの指し示す32ビットアドレスへ8ビットバイトデータを書き込む。
- 書き込むデータは汎用レジスタRsの下位8ビット。
- 実行: Nサイクル
- 状態: 変化しない。
stbx (store data byte extended address)
- 書式: stbx [Tr:Rd],Rs
- Rd,Rsは汎用レジスタ(r0〜r7)。Trは一時レジスタ。
- 動作: [Tr:Rd]=uint8(Rs[7:0])
- 一時レジスタtr[15:0]を上位16ビット、汎用レジスタRd[15:0]を下位16ビットとする32ビット拡張アドレスへ8ビットバイトデータを書き込む。
- 書き込むデータは汎用レジスタRsの下位8ビット。
- Moscoviumとの互換性維持のための命令。Nihoniumでは、stb命令の使用を推奨する。
- 実行: Nサイクル
- 状態: 変化しない。
stl (store data long word)
- 書式: stl [Rd],Rs
- 動作: [Rd]=uint32(Rs[31:0])
- 汎用レジスタRdの指し示す32ビットアドレスへ32ビットロングワードデータを書き込む。
- Rdが奇数アドレスであってはならない。
- 実行: Nサイクル
- 状態: 変化しない。
stlsp (store data long word sp relative)
- 書式: stlsp [Sp+Rn],Rs
- Rn,Rsは汎用レジスタ(r0〜r7)。Spはスタックポインタ。
- 動作: Tr=Sp+Rn; [Tr]=uint32(Rs[31:0])
- スタックポインタspに汎用レジスタRnを加算したアドレスへ、32ビットロングワードデータを書き込む。
- Sp+Rnが奇数アドレスであってはならない。
- 一時レジスタtrを使用してデータを破壊する。
- 実行: (N+1)サイクル
- 状態: 変化しない
stw (store data word)
- 書式: stw [Rd],Rs
- 動作: [Rd]=uint16(Rs[15:0])
- 汎用レジスタRdの指し示す32ビットアドレスへ16ビットワードデータを書き込む。
- 書き込むデータは汎用レジスタRsの下位16ビット。
- Rdが奇数アドレスであってはならない。
- 実行: Nサイクル
- 状態: 変化しない。
stwsp (store data word sp relative)
- 書式: stwsp [Sp+Rn],Rs
- Rn,Rsは汎用レジスタ(r0〜r7)。Spはスタックポインタ。
- 別名stspも使用可能。
- 動作: Tr=Sp+Rn; [Tr]=uint16(Rs[15:0])
- スタックポインタspに汎用レジスタRnを加算したアドレスへ、16ビットワードデータを書き込む。
- 書き込むデータは汎用レジスタRsの下位16ビット。
- Sp+Rnが奇数アドレスであってはならない。
- 一時レジスタtrを使用してデータを破壊する。
- 実行: (N+1)サイクル
- 状態: 変化しない
stwx (store data word extended address)
- 書式: stwx [Tr:Rd],Rs
- Rd,Rsは汎用レジスタ(r0〜r7)。Trは一時レジスタ。
- 動作: [Tr:Rd]=uint16(Rs[15:0])
- 一時レジスタtr[15:0]を上位16ビット、汎用レジスタRd[15:0]を下位16ビットとする32ビット拡張アドレスへ16ビットワードデータを書き込む。
- 書き込むデータは汎用レジスタRsの下位16ビット。
- Rdが奇数アドレスであってはならない。
- Moscoviumとの互換性維持のための命令。Nihoniumでは、stw命令の使用を推奨する。
- 実行: Nサイクル
- 状態: 変化しない。
sub (subtract)
- 書式: sub Rd,Rs
- 動作: Rd’=Rd−Rs
- 汎用レジスタRdからRsを減算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rs[31])×(!Rd’[31])+(!Rd[31])×Rs[31]×Rd’[31]
- Z=(Rd’=0)
subi (subtract immediate)
- 書式: subi Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 動作: Rd’=Rd−uint8(imm8)
- 汎用レジスタRdから即値imm8(8ビット符号無整数)を減算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[31]
- C=!Rd’[32]
- V=Rd[31]×(!Rd’[31])
- Z=(Rd’=0)
unlk (unlink and free)
- 書式: unlk
- 動作: Sp’=uint32([Sp++])
- link命令で確保したスタックフレームを開放して、元のスタックポインタspを回復する。
- 実行: (N+1)サイクル
- スタックポインタsp設定領域のロングワードリードサイクル数N。
- 状態: 変化しない。
アセンブラ
アセンブラの入手方法、文法などについて記載されたマニュアルはこちらをご参照ください。
改訂履歴
日付 |
項目 |
備考 |
2024/08/31 |
新規命令 |
hdown命令を追加した。 |
2023/07/01 |
新規命令 |
adcz命令、sbbz命令、cmbz命令を追加した。 |
2023/05/20 |
新規命令 |
divur命令、divsr命令、mulur命令、mulsr命令を追加した。 |
2023/03/18 |
新規命令 |
ロングワードスタック命令を追加した。
jall命令、rtnl命令、pushcl命令、popcl命令
|
2023/03/11 |
32ビットバス対応 |
メモリバスを32ビットに拡張した。 |
2023/02/11 |
S-FPU命令 |
Single precision FPU命令を追加した。 |
2022/10/22 |
割り込み機能の強化 |
割り込み許可レベルSr[IE1,IE0]を拡張した。
割り込みベクタivのVEビットを追加した。
|
2022/06/04 |
新規命令 |
回転シフト演算命令(csft命令、csfti命令)を追加した。 |
2022/05/21 |
スーパスケイラ版Nihonium-SS |
追記。 |
2022/04/02 |
Nihonium命令セットマニュアル |
作成。 |