公開日:2023/07/01
26th Season
#26-3 Moscoviumのスケールダウン
このページは、本HPで作成したオリジナル8ビットCPUコアTennessineの命令セットマニュアルです。
詳細については、以下リンクから本文を参照してください。
本文へ戻る。
Tennessine Instruction Set Manual
Tennessine CPUコア概要
Tennessineは、シンプルな8ビットCPUコアです。ハーバードアーキテクチャを採用しており、命令コードを16ビットフェッチバスから読み込んで実行します。同じく16ビットのメモリバスを通して、CPU外部のRAMやI/Oユニット(メモリマップドI/O)などのリソースにアクセスすることが出来ます。
フェッチバス、メモリバス共、16ビットアドレスバスを持っており、従ってメモリ空間は最大64Kバイトです。
命令コードは16ビット固定長で、フェッチバス上の16ビットワード境界に乗っていることを前提とします。言い換えると、常に偶数バイトアドレスから16ビット命令コードが配置されています。
プログラムカウンタpcはリセット信号で0x0000に初期化されるので、Tennessineリセット解除後、常に0x0000番地の命令から実行を開始します。
- 凡例:
- Rd: 転送先レジスタ。汎用レジスタ(r0〜r7)のいずれか。
- Rs: 転送元レジスタ。汎用レジスタ(r0〜r7)のいずれか。
- Rn: 汎用レジスタ(r0〜r7)のいずれか。
- Rd’: 命令実行後のRdレジスタ、またはその値。
- Qn: 汎用レジスタRnの裏レジスタ。
- Qn:Rn: 16ビットレジスタペア。
- 各8ビットの汎用レジスタを、上位8ビットQnおよび下位8ビットRnとして使用する場合の表記。
- 本ドキュメントでの表記のみに使用する。
- アセンブラソースでは、「Qn:Rn」の表現はエラーとなる。
- Rc: 制御レジスタ(sr,pc,sp,iv)のいずれか。
- dsp11: 分岐命令の変位量。11ビット符号付整数。
- imm8: 即値。8ビット符号無整数。
- [Rn]: 汎用レジスタRnの間接アドレッシング。
- 裏レジスタQnとのレジスタペアQn:Rnをアドレスと見て、そのアドレスにあるデータにアクセスすることを表す。
- 本ドキュメントでは、[Qn:Rn]と表記する場合もある。
- アセンブラソースでは、「Qn:Rn」の表現はエラーとなる。
- [--Sp]: スタックポインタのプリデクリメント間接アドレッシング。
- スタックポインタspを先にデクリメント(−2)してから、Spが示すアドレスにデータを書き込む。
- [Sp++]: スタックポインタのポストインクリメント間接アドレッシング。
- スタックポインタspが示すアドレスに格納されたデータを読み出した後で、Spをインクリメント(+2)する。
- Rn[k]: レジスタRnのビットkを表す。
- MSB(Most Significant Bit)がk=7、LSB(Least Significant Bit)がk=0。
- k=8として、演算結果のキャリ出力を表現する場合がある。
- k=−1として、右シフト演算結果のシフトアウト出力を表現する場合がある。
- Sr[C]などとして、状態レジスタsrのCフラグ(ビット)を表す場合がある。
- Rn[a:b]: レジスタRnのビット範囲(第aビット〜第bビット)を表す。
- {…,…}: { }内に記載したデータを上位ビットから順に結合したデータを表す。
- 動作: 「動作:」記述中の演算子(!,×,÷)は、各々、ビット毎論理NOT、算術乗算、除算演算子を表す。その他の演算子はC言語などと同じ。
- 状態: 「状態:」記述中の演算子(×,+,^,!)は、各々、ビット毎論理AND、OR、EOR、NOT演算子を表す。
Moscoviumシリーズ
Moscoviumシリーズは、オリジナル16ビットCPUコアであるMoscoviumを起点とする、スケーラブルなCPUコアシリーズです。詳しくは、こちらをご参照ください。
プログラマモデル
Tennessineのプログラマモデルは以下図の通りです。
汎用レジスタ8本(r0〜r7)と、状態レジスタsr、プログラムカウンタpc、スタックポインタsp、割り込みベクタivの構成です。すべてのレジスタはリセット解除後、0x0000に初期化されています。汎用レジスタ8本(r0〜r7)には裏レジスタ(q0〜q7)が有って、cendw命令によって、表と裏の記憶データをレジスタ毎に入れ替えて使用することが可能です。
主にメモリアクセス命令では、暗黙的に裏レジスタとのレジスタペアQn:Rnを使って、16ビットアドレスや16ビットデータを指定します。その他の演算命令では、8ビット演算を実行するため、演算対象は表のRnレジスタ8ビットです。裏レジスタQnを演算対象に指定することはできません。
制御レジスタ
Srは状態レジスタです。Moscoviumからのサブセットとなっています。同じ名前のビットはMoscoviumと同じなので、こちらの説明をご覧ください。
Pcはプログラムカウンタです。Moscoviumと同じなので、こちらの説明をご覧ください。
Spはスタックポインタです。Moscoviumと同じなので、こちらの説明をご覧ください。
Ivは割り込みベクタです。Moscoviumと同じなので、こちらの説明をご覧ください。
TrはTennessineには存在しません。書き込みは無効、読み出すと常に0x0000が読み出されます。
ベクタ割り込み方式
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 |
brn |
− |
− |
NO |
branch never |
0 |
0 |
− |
− |
10 |
6 |
bra |
dsp11 |
(always) |
BR |
branch always |
0 |
1 |
− |
− |
− |
7 |
bne |
dsp11 |
(Z=0) |
BR |
branch if not equal |
0 |
2 |
− |
− |
− |
8 |
beq |
dsp11 |
(Z=1) |
BR |
branch if equal |
0 |
3 |
− |
− |
− |
9 |
bcc |
dsp11 |
(C=0) |
BR |
branch if carry clear |
0 |
4 |
− |
− |
− |
10 |
blo |
dsp11 |
(C=0) |
BR |
branch if lower (unsigned) |
0 |
4 |
− |
− |
− |
11 |
bcs |
dsp11 |
(C=1) |
BR |
branch if carry set |
0 |
5 |
− |
− |
− |
12 |
bhs |
dsp11 |
(C=1) |
BR |
branch if higher or same (unsigned) |
0 |
5 |
− |
− |
− |
13 |
bpl |
dsp11 |
(N=0) |
BR |
branch if plus or zero |
0 |
6 |
− |
− |
− |
14 |
bmi |
dsp11 |
(N=1) |
BR |
branch if minus |
0 |
7 |
− |
− |
− |
15 |
bvc |
dsp11 |
(V=0) |
BR |
branch if overflow clear |
0 |
8 |
− |
− |
− |
16 |
bvs |
dsp11 |
(V=1) |
BR |
branch if overflow set |
0 |
9 |
− |
− |
− |
17 |
bge |
dsp11 |
(N^V=0) |
BR |
branch if greater or equal (signed) |
0 |
10 |
− |
− |
− |
18 |
blt |
dsp11 |
(N^V=1) |
BR |
branch if less than (signed) |
0 |
11 |
− |
− |
− |
19 |
mulur |
Rd |
Rs |
RR |
multiply unsigned reversal |
0 |
14 |
16 |
− |
− |
20 |
mulsr |
Rd |
Rs |
RR |
multiply signed reversal |
0 |
14 |
17 |
− |
− |
21 |
csft |
Rd |
Rs |
RR |
rotate shift with c flag |
0 |
14 |
23 |
− |
− |
22 |
or |
Rd |
Rs |
RR |
bitwise or |
0 |
15 |
0 |
− |
− |
23 |
and |
Rd |
Rs |
RR |
bitwise and |
0 |
15 |
1 |
− |
− |
24 |
eor |
Rd |
Rs |
RR |
bitwise exclusive or |
0 |
15 |
2 |
− |
− |
25 |
mov |
Rd |
Rs |
RR |
move |
0 |
15 |
3 |
− |
− |
26 |
movtc |
Rc |
Rs |
RR |
move to control register |
0 |
15 |
4 |
− |
− |
27 |
movfc |
Rd |
Rc |
RR |
move from control register |
0 |
15 |
5 |
− |
− |
28 |
add |
Rd |
Rs |
RR |
add |
0 |
15 |
6 |
− |
− |
29 |
adc |
Rd |
Rs |
RR |
add with carry |
0 |
15 |
7 |
− |
− |
30 |
sub |
Rd |
Rs |
RR |
subtract |
0 |
15 |
8 |
− |
− |
31 |
sbb |
Rd |
Rs |
RR |
subtract with borrow |
0 |
15 |
9 |
− |
− |
32 |
cmp |
Rd |
Rs |
RR |
compare |
0 |
15 |
10 |
− |
− |
33 |
cmb |
Rd |
Rs |
RR |
compare with borrow |
0 |
15 |
11 |
− |
− |
34 |
ldb |
Rd |
Rs |
RR |
load data byte |
0 |
15 |
12 |
− |
− |
35 |
stb |
Rd |
Rs |
RR |
store data byte |
0 |
15 |
13 |
− |
− |
36 |
ldw |
Rd |
Rs |
RR |
load data word |
0 |
15 |
14 |
− |
− |
37 |
stw |
Rd |
Rs |
RR |
store data word |
0 |
15 |
15 |
− |
− |
38 |
lsft |
Rd |
Rn |
RR |
logical shift |
0 |
15 |
16 |
− |
− |
39 |
asft |
Rd |
Rn |
RR |
arithmetical shift |
0 |
15 |
17 |
− |
− |
40 |
mulu |
Rd |
Rs |
RR |
multiply unsigned |
0 |
15 |
20 |
− |
− |
41 |
muls |
Rd |
Rs |
RR |
multiply signed |
0 |
15 |
21 |
− |
− |
42 |
sbbz |
Rd |
− |
R |
subtract zero with borrow |
0 |
15 |
28 |
0 |
− |
43 |
cmbz |
Rd |
− |
R |
compare zero with borrow |
0 |
15 |
28 |
1 |
− |
44 |
adcz |
Rd |
− |
R |
add zero with carry |
0 |
15 |
29 |
6 |
− |
45 |
jmp |
Rn |
− |
R |
jump |
0 |
15 |
30 |
0 |
− |
46 |
jalw |
Rn |
− |
R |
jump and link word stack |
0 |
15 |
30 |
1 |
− |
47 |
sesrl |
imm3 |
− |
R |
set sr low byte |
0 |
15 |
30 |
2 |
− |
48 |
sesrh |
imm3 |
− |
R |
set sr high byte |
0 |
15 |
30 |
3 |
− |
49 |
clsrl |
imm3 |
− |
R |
clear sr low byte |
0 |
15 |
30 |
4 |
− |
50 |
clsrh |
imm3 |
− |
R |
clear sr high byte |
0 |
15 |
30 |
5 |
− |
51 |
neg |
Rd |
− |
R |
negate sign |
0 |
15 |
31 |
0 |
− |
52 |
not |
Rd |
− |
R |
bitwise not |
0 |
15 |
31 |
1 |
− |
53 |
cendw |
Rd |
− |
R |
convert endian word |
0 |
15 |
31 |
2 |
− |
54 |
exsgw |
Rd |
− |
R |
extend sign bit word |
0 |
15 |
31 |
3 |
− |
55 |
pushw |
Rs |
− |
R |
push register word on stack |
0 |
15 |
31 |
4 |
− |
56 |
popw |
Rd |
− |
R |
pop register word from stack |
0 |
15 |
31 |
5 |
− |
57 |
pushcw |
Rc |
− |
R |
push control register word on stack |
0 |
15 |
31 |
6 |
− |
58 |
popcw |
Rc |
− |
R |
pop control register word from stack |
0 |
15 |
31 |
7 |
− |
59 |
ori |
Rd |
imm8 |
RI |
bitwise or immediate |
1 |
0 |
− |
− |
− |
60 |
andi |
Rd |
imm8 |
RI |
bitwise and immediate |
1 |
1 |
− |
− |
− |
61 |
eori |
Rd |
imm8 |
RI |
bitwise exclusive or immediate |
1 |
2 |
− |
− |
− |
62 |
addi |
Rd |
imm8 |
RI |
add immediate |
1 |
3 |
− |
− |
− |
63 |
subi |
Rd |
imm8 |
RI |
subtract immediate |
1 |
4 |
− |
− |
− |
64 |
cmpi |
Rd |
imm8 |
RI |
compare immediate |
1 |
5 |
− |
− |
− |
65 |
ldbiu |
Rd |
imm8 |
RI |
load data immediate unsigned byte |
1 |
6 |
− |
− |
− |
66 |
ldbil |
Rd |
imm8 |
RI |
load data immediate low byte |
1 |
7 |
− |
− |
− |
67 |
ldbih |
Rd |
imm8 |
RI |
load data immediate high byte |
1 |
8 |
− |
− |
− |
68 |
ldcl |
Rc |
imm8 |
RI |
load data immediate control register low byte |
1 |
9 |
− |
− |
− |
69 |
ldch |
Rc |
imm8 |
RI |
load data immediate control register high byte |
1 |
10 |
− |
− |
− |
70 |
lsfti |
Rd |
imm8 |
RI |
logical shift immediate |
1 |
11 |
− |
− |
− |
71 |
asfti |
Rd |
imm8 |
RI |
arithmetical shift immediate |
1 |
12 |
− |
− |
− |
72 |
csfti |
Rd |
imm8 |
RI |
rotate shift with c flag immediate |
1 |
13 |
− |
− |
− |
命令セット
各命令をアルファベット昇順で説明します。
Tennessineの命令セットは、Moscoviumのサブセットとなっています。以下、Tennessineで使用可能な命令についてのみ、記載しています。Tennessineで定義されていない命令を実行すると、nop命令と同じ動作となります。
Moscoviumで定義されていてTennessineでは未定義な命令を、以下にまとめておきます。
- 固定レジスタペアを使う除算命令:
- divlu/divls/divlq/divlr/divlqr/divlrr
- 除算命令:
- 浮動小数演算命令:
- hadd/hsub/hmul/hdiv/hneg/hhalf/huint/hfrac/hmvsg/hsat/hcmp/hdown
- Trレジスタを使うメモリアクセス命令:
- ldbx/stbx/ldwx/stwx/ldwsp/stwsp
- 制御レジスタ: Tr
- 書き込みは無効、読み出しは常に0x0000が読み出される。
他にも、汎用レジスタの表/裏構成や「裏:表」形式の16ビットレジスタペアを暗黙に使う命令等、Moscoviumとは動作の異なる命令が有ります、以下仕様で確認してください。
adc (add with carry)
- 書式: adc Rd,Rs
- 動作: Rd’=Rd+Rs+Sr[C]
- 2つのレジスタ値と状態レジスタsrのCフラグ値を加算して、Rdに書き戻す。
- 複数レジスタ加算実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=Rd’[8]
- V=Rd[7]×Rs[7]×(!Rd’[7])+(!Rd[7])×(!Rs[7])×Rd’[7]
- 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’[7]
- C=Rd’[8]
- V=(!Rd[7])×Rd’[7]
- Z=(Rd’=0)×Sr[Z]
add (add)
- 書式: add Rd,Rs
- 動作: Rd’=Rd+Rs
- 汎用レジスタRd,Rsを加算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=Rd’[8]
- V=Rd[7]×Rs[7]×(!Rd’[7])+(!Rd[7])×(!Rs[7])×Rd’[7]
- Z=(Rd’=0)
addi (add immediate)
- 書式: addi Rd,imm8
- 動作: Rd’=Rd+uint8(imm8)
- 汎用レジスタRdに即値imm8(8ビット符号無整数)を加算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=Rd’[8]
- V=(!Rd[7])×Rd’[7]
- Z=(Rd’=0)
and (bitwise and)
- 書式: and Rd,Rs
- 動作: Rd’=Rd&Rs
- 汎用レジスタRd,Rsをビット毎論理AND演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=0
- V=0
- Z=(Rd’=0)
andi (bitwise and immediate)
- 書式: andi Rd,imm8
- 動作: Rd’=Rd&uint8(imm8)
- 汎用レジスタRdと即値imm8を論理AND演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
asft (arithmetical shift)
- 書式: asft Rd,Rn
- 動作: Rd’=int8(Rd)<<int4(Rn[3:0])
- 汎用レジスタ値Rdを算術シフト演算して、Rdに書き戻す。
- シフト量はRnレジスタ値の下位4ビットを4ビット符号付整数と見て、int4(Rn[3:0])>0なら左シフト、int4(Rn[3:0])<0なら右シフト。
- シフト可能な範囲は−8〜7ビット。
- int4(Rn[3:0])=0だとRdは変化しない。
- Rnの上位4ビットは無視。
- 算術シフト演算では、Rdの8ビット以上のビットは符号拡張、0ビット未満のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=(int4(Rn)≧0)?Rd’[8]:Rd’[−1]
- V=(int4(Rn)<0)?0:Rd’[8]^Rd’[7]
- Z=(Rd’=0)
asfti (arithmetical shift immediate)
- 書式: asfti Rd,imm8
- 動作: Rd’=int8(Rd)<<int4(imm8)
- 汎用レジスタ値Rdを算術シフト演算して、Rdに書き戻す。
- シフト量は即値imm8の下位4ビットを4ビット符号付整数と見て、int4(imm8)>0なら左シフト、int4(imm8)<0なら右シフト。
- シフト可能な範囲は−8〜7ビット。
- int4(imm8)=0だとRdは変化しない。
- imm8の上位4ビットは無視。
- 算術シフト演算では、Rdの8ビット以上のビットは符号拡張、0ビット未満のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=(int4(imm8)≧0)?Rd’[8]:Rd’[−1]
- V=(int4(imm8)<0)?0:Rd’[8]^Rd’[7]
- 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サイクル(条件不成立時/成立時)
- 状態: 変化しない。
cendw (convert endian word)
- 書式: cendw Rd
- Rdは汎用レジスタ(r0〜r7)。
- 別名cendも使用可能。
- 動作: Qd’=Rd; Rd’=Qd
- 裏レジスタQdとのレジスタペアQd:Rdに対して、エンディアンを変換(BE⇔LE)して、書き戻す。
- 即ち、QdとRdのデータが入れ替わる。
- 実行: 1サイクル
- 状態: 変化しない
- ※Moscoviumのcendw命令と異なり、状態フラグ(N,C,V,Z)が変化しないことに注意。
clsrh (clear sr high byte's bit)
- 書式: clsrh imm3
- 動作: Sr[8+imm3]=0
- 状態レジスタsrの第(8+imm3)ビットを0にクリアする。
- ※Tennessineでは、Srレジスタの上位バイトに書き換え可能なビットが存在しないため、機能しない。
- 実行: 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’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rs[7])×(!Rd’[7])+(!Rd[7])×Rs[7]×Rd’[7]
- Z=(Rd’=0)×Sr[Z]
cmbz (compare zero with borrow)
- 書式: cmbz Rd
- 動作: Rd−0−Sr[C]
- レジスタ値と状態レジスタsrのCフラグ値を減算して、状態レジスタの各フラグを更新する。
- 複数レジスタ比較実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rd’[7])
- Z=(Rd’=0)×Sr[Z]
cmp (compare)
- 書式: cmp Rd,Rs
- 動作: Rd−Rs
- 汎用レジスタRdからRsを減算して、状態レジスタの各フラグを更新する。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rs[7])×(!Rd’[7])+(!Rd[7])×Rs[7]×Rd’[7]
- Z=(Rd’=0)
cmpi (compare immediate)
- 書式: cmpi Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 動作: Rd−uint8(imm8)
- 汎用レジスタRdから即値imm8(8ビット符号無整数)を減算して、状態レジスタの各フラグを更新する。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rd’[7])
- Z=(Rd’=0)
csft (rotate shift with c flag)
- 書式: csft Rd,Rn
- 動作: {Sr’[C],Rd’}={Sr[C],uint8(Rd)}<<int4(Rn[3:0])
- 汎用レジスタ値Rdと状態レジスタsrのキャリCフラグ値を回転シフト演算して、Rdに書き戻す。
- シフト量はRnレジスタ値の下位4ビットを4ビット符号付整数と見て、int4(Rn[3:0])>0なら左シフト、int4(Rn[3:0])<0なら右シフト。
- シフト可能な範囲は−8〜7ビット。
- int4(Rn[3:0])=0だとRdは変化しない。
- Rnの上位4ビットは無視。
- 回転シフト演算では、累積シフトビット数が9の倍数となると、Rd,Sr[C]に関して元の値に戻る。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=(int4(Rn)≧0)?Rd’[8]:Rd’[−1]
- V=0
- Z=(Rd’=0)
csfti (rotate shift with c flag immediate)
- 書式: csfti Rd,imm8
- 動作: {Sr’[C],Rd’}={Sr[C],uint8(Rd)}<<int4(imm8)
- 汎用レジスタ値Rdと状態レジスタsrのキャリCフラグ値を回転シフト演算して、Rdに書き戻す。
- シフト量は即値imm8の下位4ビットを4ビット符号付整数と見て、int4(imm8)>0なら左シフト、int4(imm8)<0なら右シフト。
- シフト可能な範囲は−8〜7ビット。
- int4(imm8)=0だとRdは変化しない。
- imm8の上位4ビットは無視。
- 回転シフト演算では、累積シフトビット数が9の倍数となると、Rd,Sr[C]に関して元の値に戻る。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=(int4(imm8)≧0)?Rd’[8]:Rd’[−1]
- V=0
- Z=(Rd’=0)
eor (bitwise exclusive or)
- 書式: eor Rd,Rs
- 動作: Rd’=Rd^Rs
- 汎用レジスタRd,Rsをビット毎論理EOR(Exclusive OR)演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- 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’[7]
- C=0
- V=0
- Z=(Rd’=0)
exsgw (extend sign bit word)
- 書式: exsgw Rd
- Rdは汎用レジスタ(r0〜r7)。
- 別名exsgも使用可能。
- 動作: Qd’=(Rd[7])?0xff:0x00
- 裏レジスタQdとのレジスタペアQd:Rdに対して、下位8ビットのRdを符号拡張して書き戻す。
- 元のQdは無視して、符号拡張によって上書きする。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=0
- V=0
- Z=(Rd’=0)
jalw (jump and link word stack)
- 書式: jalw Rn
- 動作: [--Sp]=uint16(Pc); Pc=Qn:Rn
- 現在のプログラムカウンタpcをスタックに積んだ後、汎用レジスタRnの指し示すアドレスへ分岐する。
- アドレス指定は、裏レジスタQnとのレジスタペアQn:Rnと見なし、16ビットとなる。
- jalw命令実行時点で、Pcはjalw命令の次の命令アドレスを指し示しているため、分岐先でrtnw命令を実行することで、jalw命令の次命令に復帰できる。
- 別名jalも使用可能。
- 実行: 3サイクル
- 状態: 変化しない。
jmp (jump)
- 書式: jmp Rn
- 動作: Pc=Qn:Rn
- 汎用レジスタRnの指し示すアドレスへ分岐する。
- アドレス指定は、裏レジスタQnとのレジスタペアQn:Rnと見なし、16ビットとなる。
- 実行: 2サイクル
- 状態: 変化しない。
ldb (load data byte)
- 書式: ldb Rd,[Rs]
- 動作: Qd:Rd=uint8([Qs:Rs])
- 汎用レジスタRsの指し示すアドレスから8ビットバイトデータを読み出して汎用レジスタRdに転送する。
- 読み出した8ビットデータは16ビットにゼロ拡張して、裏レジスタQdとのレジスタペアQd:Rdに転送する。
- アドレス指定は、裏レジスタQsとのレジスタペアQs:Rsと見なし、16ビットとなる。
- 実行: 2サイクル
- 状態: 変化しない。
ldbih (load data immediate high byte)
- 書式: ldbih Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 別名ldihも使用可能。
- 動作: Qd’=imm8
- 汎用レジスタRdの裏レジスタQdに即値imm8を転送する。
- Rdは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
ldbil (load data immediate low byte)
- 書式: ldbil Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 別名ldilも使用可能。
- 動作: Rd’=imm8
- 汎用レジスタRdに即値imm8を転送する。
- 裏レジスタQdは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
ldbiu (load data immediate unsigned byte)
- 書式: ldbiu Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 別名ldiuも使用可能。
- 動作: Qd:Rd=uint8(imm8)
- 汎用レジスタRdに即値imm8を転送する。
- 転送先は裏レジスタQdとのレジスタペアQd:Rd。
- imm8を16ビットにゼロ拡張して転送するので、Qdには常に0x00が転送される。
- 実行: 1サイクル
- 状態: 変化しない。
ldch (load data immediate control register high byte)
- 書式: ldch Rc,imm8
- Rcは制御レジスタ(sr,sp,iv)。imm8は符号無8ビット即値。
- 動作: Rc’={imm8,Rc[7:0]}
- 制御レジスタRcの上位8ビットに即値imm8を転送する。
- Rcの下位8ビットは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
ldcl (load data immediate control register low byte)
- 書式: ldcl Rc,imm8
- Rcは制御レジスタ(sr,sp,iv,tr)。imm8は符号無8ビット即値。
- 動作: Rc’={Rc[15:8],imm8}
- 制御レジスタRcの下位8ビットに即値imm8を転送する。
- Rcの上位8ビットは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
- ただし、Rcが状態レジスタsrの場合は、imm8の値が状態フラグ(N,C,V,Z)にセットされる。
ldw (load data word)
- 書式: ldw Rd,[Rs]
- 動作: Qd:Rd=uint16([Qs:Rs])
- 汎用レジスタRsの指し示すアドレスから16ビットワードデータを読み出して汎用レジスタRdに転送する。
- 読み出した16ビットデータは、裏レジスタQdとのレジスタペアQd:Rdに転送される。
- アドレス指定は、裏レジスタQsとのレジスタペアQs:Rsと見なし、16ビットとなる。
- Rsが奇数アドレスであってはならない。
- 実行: 2サイクル
- 状態: 変化しない。
lsft (logical shift)
- 書式: lsft Rd,Rn
- 動作: Rd’=uint8(Rd)<<int4(Rn[3:0])
- 汎用レジスタ値Rdを論理シフト演算して、Rdに書き戻す。
- シフト量はRnレジスタ値の下位4ビットを4ビット符号付整数と見て、int4(Rn[3:0])>0なら左シフト、int4(Rn[3:0])<0なら右シフト。
- シフト可能な範囲は−8〜7ビット。
- int4(Rn[3:0])=0だとRdは変化しない。
- Rnの上位4ビットは無視。
- 論理シフト演算では、Rdの7〜0ビット範囲外のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=(int4(Rn)≧0)?Rd’[8]:Rd’[−1]
- V=(int4(Rn)<0)?0:Rd’[8]^Rd’[7]
- Z=(Rd’=0)
lsfti (logical shift immediate)
- 書式: lsfti Rd,imm8
- Rdは汎用レジスタ(r0〜r7)。imm8は符号無8ビット即値。
- 動作: Rd’=uint8(Rd)<<int4(imm8)
- 汎用レジスタ値Rdを論理シフト演算して、Rdに書き戻す。
- シフト量は即値imm8の下位4ビットを4ビット符号付整数と見て、int4(imm8)>0なら左シフト、int4(imm8)<0なら右シフト。
- シフト可能な範囲は−8〜7ビット。
- int4(imm8)=0だとRdは変化しない。
- imm8の上位4ビットは無視。
- 論理シフト演算では、Rdの7〜0ビット範囲外のビットは0と見なす。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=(int4(imm8)≧0)?Rd’[8]:Rd’[−1]
- V=(int4(imm8)<0)?0:Rd’[8]^Rd’[7]
- Z=(Rd’=0)
mov (move)
- 書式: mov Rd,Rs
- 動作: Rd=Rs
- 汎用レジスタRsをRdに転送する。
- 裏レジスタQdは変化しない。
- 実行: 1サイクル
- 状態:
movfc (move from control register)
- 書式: movfc Rd,Rc
- Rdは汎用レジスタ(r0〜r7)、Rcは制御レジスタ(sr,pc,sp,iv)。
- 動作: Qd:Rd=Rc
- 制御レジスタRcを汎用レジスタRdに転送する。
- 制御レジスタは16ビット幅なので、裏レジスタQdとのレジスタペアQd:Rdに転送する。
- ※算術論理演算器(ALU)が8ビット幅のため、状態レジスタの演算フラグが正しくないことに注意。
- 実行: 1サイクル
- 状態:
movtc (move to control register)
- 書式: movtc Rc,Rs
- Rcは制御レジスタ(sr,sp,iv)、Rsは汎用レジスタ(r0〜r7)。
- 動作: Rc=Qs:Rs
- 汎用レジスタRsを制御レジスタRcに転送する。
- 制御レジスタは16ビット幅なので、裏レジスタQsとのレジスタペアQs:Rsから転送する。
- ※算術論理演算器(ALU)が8ビット幅のため、状態レジスタの演算フラグが正しくないことに注意。
- 実行: 1サイクル
- 状態:
- N=Rc[7]
- C=0
- V=0
- Z=(Rc=0)
- ただし、Rcが状態レジスタsrの場合は、転送した値が状態フラグ(N,C,V,Z)にセットされる。
muls (multiply signed)
- 書式: muls Rd,Rs
- 動作: Rd’=int8(Rd)×Rs;
- 8×8=8ビット符号付乗算を実行する。
- 一般に8×8ビット乗算結果(積)は16ビット長となる。
- Rdに積の下位8ビットが転送され、Rsは変化しない。
- 裏レジスタQdは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
mulsr (multiply signed reversal)
- 書式: mulsr Rd,Rs
- 動作: Qd’:Rd’=int8(Rd)×Rs
- 8×8=16ビット符号付乗算を実行する。
- 一般に8×8ビット乗算結果(積)は16ビット長となる。
- 裏レジスタQdとのレジスタペアQd:Rdに16ビットの積が転送され、Rsは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
mulu (multiply unsigned)
- 書式: mulu Rd,Rs
- 動作: Rd’=uint8(Rd)×Rs
- 8×8=8ビット符号無乗算を実行する。
- 一般に8×8ビット乗算結果(積)は16ビット長となる。
- Rdに積の下位8ビットが転送され、Rsは変化しない。
- 裏レジスタQdは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
mulur (multiply unsigned reversal)
- 書式: mulur Rd,Rs
- 動作: Qd’:Rd’=uint8(Rd)×Rs
- 8×8=16ビット符号無乗算を実行する。
- 一般に8×8ビット乗算結果(積)は16ビット長となる。
- 裏レジスタQdとのレジスタペアQd:Rdに16ビットの積が転送され、Rsは変化しない。
- 実行: 1サイクル
- 状態: 変化しない。
neg (negate sign)
- 書式: neg Rd
- 動作: Rd’=−Rd(=!Rd+1)
- 汎用レジスタRdの値を符号反転(2の補数表現)して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=!Rd’[8]
- V=Rd[7]×Rd’[7]
- Z=(Rd’=0)
nop (no operation)
- 書式: nop
- 動作: なし
- 実行: 1サイクル
- 状態: 変化しない。
not (bitwise not)
- 書式: not Rd
- 動作: Rd’=!Rd
- 汎用レジスタRdの値をビット毎論理NOT演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=0
- V=0
- Z=(Rd’=0)
or (bitwise or)
- 書式: or Rd,Rs
- 動作: Rd’=Rd|Rs
- 汎用レジスタRd,Rsをビット毎論理OR演算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- 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’[7]
- 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サイクル以上
- 状態: 変化しない
popcw (pop control register word from stack)
- 書式: popcw Rc
- 動作: Rc=uint16([Sp++])
- 制御レジスタRcをスタックから取り出す。
- 別名popcも使用可能。
- 実行: 2サイクル
- 状態: 変化しない。
- ただし、Rcが状態レジスタsrの場合は、スタックから取り出した値が状態フラグ(N,C,V,Z)にセットされる。
popw (pop register word from stack)
- 書式: popw Rd
- Rdは汎用レジスタ(r0〜r7)。
- 別名popも使用可能。
- 動作: Qd:Rd=uint16([Sp++])
- 汎用レジスタRdをスタックから取り出す。
- 裏レジスタQdとのレジスタペアQd:Rdへ転送する。
- 実行: 2サイクル
- 状態: 変化しない。
pushcw (push control register word on stack)
- 書式: pushcw Rc
- 動作: [--Sp]=uint16(Rc)
- 制御レジスタRcをスタックへ積む。
- 別名pushcも使用可能。
- 実行: 1サイクル
- 状態: 変化しない。
pushw (push register word on stack)
- 書式: pushw Rs
- Rsは汎用レジスタ(r0〜r7)。
- 別名pushも使用可能。
- 動作: [--Sp]=uint16(Qs:Rs)
- 汎用レジスタRsをスタックへ積む。
- 裏レジスタQsとのレジスタペアQs:Rsとして転送する。
- 実行: 1サイクル
- 状態: 変化しない。
rti (return from interrupt)
- 書式: rti
- 動作: Sr=uint16([Sp++]); Pc=uint16([Sp++])
- スタックから、状態レジスタsr→プログラムカウンタpcの順で取り出す。
- 本命令の次命令は実行されず、スタックから取り出した新しいPcの指し示すアドレスから命令をフェッチして実行する。
- 実行: 4サイクル
- 状態: 変化しない
- ただし、スタックから取り出した値が状態フラグ(N,C,V,Z)にセットされる。
rtnw (return from jalw)
- 書式: rtnw
- 動作: Pc=uint16([Sp++])
- プログラムカウンタpcをスタックから取り出す。
- 本命令の次命令は実行されず、スタックから取り出した新しいPcの指し示すアドレスから命令をフェッチして実行する。
- 別名rtnも使用可能。
- 実行: 3サイクル
- 状態: 変化しない。
sbb (subtract with borrow)
- 書式: sbb Rd,Rs
- 動作: Rd’=Rd−Rs−Sr[C]
- 2つのレジスタ値と状態レジスタsrのCフラグ値を減算して、Rdに書き戻す。
- 複数レジスタ減算実行時のゼロ判定が可能な様に、直前のSr[Z]フラグ値を継承する。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rs[7])×(!Rd’[7])+(!Rd[7])×Rs[7]×Rd’[7]
- 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’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rd’[7])
- Z=(Rd’=0)×Sr[Z]
sesrh (set sr high byte's bit)
- 書式: sesrh imm3
- 動作: Sr[8+imm3]=1
- 状態レジスタsrの第(8+imm3)ビットを1にセットする。
- ※Tennessineでは、Srレジスタの上位バイトに書き換え可能なビットが存在しないため、機能しない。
- 実行: 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
- 動作: [Qd:Rd]=uint8(Rs[7:0])
- 汎用レジスタRdの指し示すアドレスへ8ビットバイトデータを書き込む。
- 書き込むデータは汎用レジスタRsの8ビット。
- アドレス指定は、裏レジスタQdとのレジスタペアQd:Rdと見なし、16ビットとなる。
- 実行: 1サイクル
- 状態: 変化しない。
stw (store data word)
- 書式: stw [Rd],Rs
- 動作: [Qd:Rd]=uint16(Qs:Rs)
- 汎用レジスタRdの指し示すアドレスへ16ビットワードデータを書き込む。
- 書き込みデータは、裏レジスタQsとのレジスタペアQs:Rsで指定される16ビットとなる。
- アドレス指定は、裏レジスタQdとのレジスタペアQd:Rdと見なし、16ビットとなる。
- Rdが奇数アドレスであってはならない。
- 実行: 1サイクル
- 状態: 変化しない。
sub (subtract)
- 書式: sub Rd,Rs
- 動作: Rd’=Rd−Rs
- 汎用レジスタRdからRsを減算して、Rdに書き戻す。
- 実行: 1サイクル
- 状態:
- N=Rd’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rs[7])×(!Rd’[7])+(!Rd[7])×Rs[7]×Rd’[7]
- 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’[7]
- C=!Rd’[8]
- V=Rd[7]×(!Rd’[7])
- Z=(Rd’=0)
アセンブラ
アセンブラの入手方法、文法などについて記載されたマニュアルはこちらをご参照ください。
改訂履歴
日付 |
項目 |
備考 |
2024/03/16 |
プログラマモデル更新 |
状態レジスタsrにIDフィールドを追加。 |
2023/07/01 |
Tennessine命令セットマニュアル |
作成。 |