アセンブラでプログラムを開発する人向けの情報です。 C言語で開発する場合には、 飛ばしてBlackfin DSPに進みましょう。
SHARC DSPの命令セットの概要を説明します。 詳細は マニュアル (英語) を参照のこと。
SHARCプロセッサの命令は、 「演算」、「データ転送」、「条件判定」などの組み合わせで構成される。 「演算」は、1個〜3個の計算で構成される。 「演算」の詳細は後に示す。
用途 | シンボル | 説明 |
---|---|---|
即値など | <datan> |
n ビットの即値 |
<addrn> |
n ビットの絶対アドレス |
|
<reladdrn> |
n ビットの相対アドレス |
|
レジスタ | dregn |
データレジスタR15〜R0, F15〜F0 |
uregn |
任意のレジスタ | |
Ia |
DAG1のインデックスレジスタI7〜I0 。
データアドレスを保持する。 |
|
Mb |
DAG1の修正量レジスタM7〜M0 |
|
Ic |
DAG2のインデックスレジスタI15〜I8 。
データアドレスを保持する。 |
|
Md |
DAG2の修正量レジスタM15〜M8 |
|
Ba |
DAG1のベースアドレスレジスタB7〜B0 。
Ia, La と組み合わせて
リングバッファに使用する。
リングバッファの先頭アドレスを保持する。 |
|
La |
DAG1のバッファ長レジスタL7〜L0 。
Ia, Ba と組み合わせて
リングバッファに使用する。
0 にするとリングバッファにはならない。 |
|
Bc |
DAG2のベースアドレスレジスタB15〜B8 。
Ic, Lc と組み合わせて
リングバッファに使用する。
リングバッファの先頭アドレスを保持する。 |
|
Lc |
DAG2のバッファ長レジスタL15〜L8 。
Ic, Bc と組み合わせて
リングバッファに使用する。
0 にするとリングバッファにはならない。 |
|
X dreg | PE Xのデータレジスタ | |
Y dreg | PE Yのデータレジスタ | |
sreg | システムレジスタ | |
メモリ | DM(アドレス) |
データメモリ |
PM(アドレス) |
プログラムメモリ | |
Mem(アドレス) |
DM(アドレス) またはPM(アドレス) |
|
アドレス指定方式 | DM(Ia,Mb) |
Ia が実効アドレス。
メモリアクセス後に
IaにMb を加える。 |
PM(Ic,Md) |
Ic が実効アドレス。
メモリアクセス後に
IcにMd を加える。 |
|
DM(Mb,Ia) |
Ia+Mb が実効アドレス。
Ia は変化しない。 |
|
PM(Md,Ic) |
Ic+Md が実効アドレス。
Ic は変化しない。 |
|
DM(Ia,<data6>) |
Ia が実効アドレス。
メモリアクセス後に
Iaに<data6> を加える。 |
|
PM(Ic,<data6>) |
Ic が実効アドレス。
メモリアクセス後に
Icに<data6> を加える。 |
|
DM(<data6>,Ia) |
Ia+<data6> が実効アドレス。
Ia は変化しない。 |
|
PM(<data6>,Ic) |
Ic+<data6> が実効アドレス。
Ic は変化しない。 |
|
Mem(<data32>) |
<data32> が実効アドレス。 |
|
DM(<data32>,Ia) |
<data32>Ia が実効アドレス。
Ia は変化しない。 |
|
PM(<data32>,Ic) |
<data32>Ic が実効アドレス。
Ic は変化しない。 |
|
ロードストア | dreg1⇔DM(Ia,Mb) |
dreg1=DM(Ia,Mb) またはDM(Ia,Mb)=dreg1 |
dreg2⇔PM(Ic,Md) |
dreg2=PM(Ic,Md) またはPM(Ic,Md)=dreg2 |
|
ureg1⇔Mem(I/M) |
ureg1=DM(Ia,Mb) またはDM(Ia,Mb)=ureg1 またはureg1=PM(Ic,Md) またはPM(Ic,Md)=ureg1 またはureg1=DM(Mb,Ia) またはDM(Mb,Ia)=ureg1または ureg1=PM(Md,Ic) またはPM(Md,Ic)=ureg1 |
|
ureg1⇔Mem(I/<data6>) |
ureg1=DM(Ia,<data6>) またはDM(Ia,<data6>)=ureg1 またはureg1=PM(Ic,<data6>) またはPM(Ic,<data6>)=ureg1 ureg1=DM(<data6>,Ia) またはDM(<data6>,Ia)=ureg1 またはureg1=PM(<data6>,Ic) またはPM(<data6>,Ic)=ureg1 |
|
ureg1⇔Mem(<addr32>) |
ureg1=DM(<addr32>) またはDM(<addr32>)=ureg1 またはureg1=PM(<addr32>) またはPM(<addr32>)=ureg1 |
|
ureg1⇔Mem(<addr32>,I) |
ureg1=DM(<addr32>,Ia) またはDM(<addr32>,Ia)=ureg1 またはureg1=PM(<addr32>,Ic) またはPM(<addr32>,Ic)=ureg1 |
|
Mem(I,M) |
DM(Ia,Mb) またはPM(Ic,Md) |
|
アドレスレジスタ修正 | MODIFY (I,M) |
MODIFY (Ia,Mb) またはMODIFY (Ic,Md) |
分岐制御 | (分岐オプション) |
(DB) , (LA) , (CI) ,
(DB,LA) , (DB,CI) または無 |
(コールオプション) |
(DB) または無 |
|
(リターンオプション) |
(DB) , (LR) , (DB,LR) または無 |
|
終了条件 |
|
|
ビット操作 | ビット操作 | SET , CLR , TGL ,
TST , XOR |
|
説明 | 記法 | |
---|---|---|
1 | 演算とロードストア×2 | 演算, dreg1⇔DM(Ia,Mb), dreg2⇔PM(Ic,Md); |
2 | 演算、条件付 | IF 条件 演算; |
3 | 演算とロードストア、条件付 | IF 条件 演算, ureg1⇔Mem(I/M); |
4 | 演算とロードストア、条件付 | IF 条件 演算, ureg1⇔Mem(I/<data6>); |
5 | 演算とデータコピー、条件付 | IF 条件 演算, ureg1=ureg2; |
演算とデータ入れ換え、条件付 | IF 条件 演算, X dreg<->Y dreg; |
|
6 | 即値シフトとロードストア、条件付 | IF 条件 即値シフト, ureg1⇔Mem(I/M); |
7 | 演算とアドレスレジスタ修正、条件付 | IF 条件 演算, MODIFY (I/M); |
8 | 条件分岐 | IF 条件 JUMP <addr24> (分岐オプション); |
条件コール | IF 条件 CALL <addr24> (コールオプション); |
|
9 | 条件分岐と演算 | IF 条件 JUMP (Md,Ic); (分岐オプション), 演算; |
条件コールと演算 | IF 条件 CALL (Md,Ic); (コールオプション), 演算; |
|
10 | 条件分岐と演算とロードストア | IF 条件 JUMP (Md,Ic); (分岐オプション), 演算, dreg1⇔DM(Ia,Mb); |
11 | 条件サブルーチンリターン | IF 条件 RTS (リターンオプション), 演算; |
条件割込リターン | IF 条件 RTI (コールオプション), 演算; |
|
12 | DOループ | LCNTR=<data16>, DO <addr24> UNTIL LCE; |
13 | DOループ | DO <addr24> UNTIL 終了条件; |
14 | ロードストア | ureg1⇔Mem(<addr32>); |
15 | ロードストア | ureg1⇔Mem(<addr32>,I); |
16 | 即値のストア | Mem(I,M)=<data32>; |
17 | 即値の代入 | ureg=<data32>; |
18 | ビット操作 | BIT ビット操作 sreg <data32>; |
19 | インデックスレジスタ修正 | MODIFY (Ia,<data32>) |
ビット反転 | BITREV (Ia,<data32>) |
|
20 | Push/Pop | |
21 | 何もしない | NOP; |
22 | 割込待ち | IDLE; |
25 | Cjump/Rframe | |
|
用途 | 固定小数点 | 浮動小数点 | ||
---|---|---|---|---|
シンボル | 説明 | シンボル | 説明 | |
入力x | Rx |
R15〜R0 の一つ |
Fx |
F15〜F0 の一つ |
入力y | Ry |
Fy |
||
演算結果 | Rn |
Fn |
演算 | ニーモニック | 備考 | |
---|---|---|---|
固定小数点 | 浮動小数点 | ||
加算 | |||
減算 | |||
キャリー付き加算 | |||
ボロー付き減算 | |||
和の絶対値 | |||
差の絶対値 | |||
平均値 | |||
比較 | |||
絶対値の比較 | |||
キャリーを加算 | |||
ボローを減算 | |||
1を加算 | |||
1を減算 | |||
符号を反転 | |||
絶対値 | |||
コピー | フラグは変化する | ||
最大値 | |||
最小値 | |||
クリップ | 絶対値|Ry| or |Fy| 以下に |
演算 | ニーモニック | 備考 |
---|---|---|
固定小数点 | ||
論理積 | ||
論理和 | ||
排他的論理和 | ||
否定 |
演算 | ニーモニック | 備考 |
---|---|---|
浮動小数点 | ||
丸め | ||
スケーリング | Ry を加える |
|
仮数部を取り出す | ||
指数部を取り出す | ||
固定小数点に変換 | ||
固定小数点に変換 | Ry を加える |
|
浮動小数点に変換 | ||
固定小数点に変換 | Ry を加える |
|
逆数 | 8bit精度 | |
平方根の逆数 | 8bit精度 | |
符号をコピー |
固定小数点乗算は種類が非常に多いが今回はほとんど使わないので略。
演算 | ニーモニック | 備考 |
---|---|---|
浮動小数点 | ||
乗算 |
シフト命令は種類が非常に多いが今回はほとんど使わないので略。
組み合わせは限定されるが、複数の演算を同時に行うことができる。 乗算器とALUを同時に使用する演算の場合は、 それぞれの入力データとして指定できるレジスタも制限される。
用途 | 固定小数点 | 浮動小数点 | ||
---|---|---|---|---|
シンボル | 説明 | シンボル | 説明 | |
入力x | Rx |
R15〜R0 の一つ |
Fx |
F15〜F0 の一つ |
入力y | Ry |
Fy |
||
乗算結果 | Rm |
Fm |
||
加算結果 or ALU出力 | Ra |
Fa |
||
減算結果 | Rm |
Fm |
||
乗算器入力x | R3-0 |
R3〜R0 の一つ |
F3-0 |
F3〜F0 の一つ |
乗算器入力y | R7-4 |
R7〜R4 の一つ |
F7-4 |
F7〜F4 の一つ |
ALU入力x | R11-8 |
R11〜R8 の一つ |
F11-8 |
F11〜F8 の一つ |
ALU入力y | R15-12 |
R15〜R12 の一つ |
F15-12 |
F15〜F12 の一つ |
演算 | ニーモニック | 備考 |
---|---|---|
加算と減算 | ||
乗算と加算 | ||
乗算と減算 | ||
乗算と浮動小数点変換 | ||
乗算と固定小数点変換 | ||
乗算と平均値 | ||
乗算と絶対値 | ||
乗算と最大値 | ||
乗算と最小値 | ||
乗算と加算と減算 |
固定小数点のマルチファンクション演算は 種類が非常に多いが今回はほとんど使わないので略。
SHARC DSPでリングバッファを使用するには、
リングバッファの先頭アドレスを
Ba
レジスタに、
バッファのサイズをLa
レジスタに
格納します。
実際にデータを読み書きする際には、
インデックスレジスタIa
を使います。
Ba
,
La
,
Ia
は全て同じ番号で揃える必要があります。
Ba
レジスタに代入すると、
自動的にIa
レジスタにも
同じアドレスが代入されます。
修正量レジスタMb
には、
Ia
を変化させたい値を格納します。
1を加えたい場合には+1、1を減じたい場合には-1を格納します。
Ia
と
Mb
とは同じ番号である必要はありません。
ただし、同じDAGのレジスタである必要があります。
修正量Mb
が正のとき、
fk=DM(Ia,Mb);
というプログラムは、
fkに
データメモリのアドレスIa
に格納されている
データを読み出す
Ia
に
Mb
を加える
Iaが
Ba+La
より大きいときは、
Ia
から
La
を減じる
Mb
が負のときには、
fkに
データメモリのアドレスIa
に格納されている
データを読み出す
Ia
に
Mb
を加える
Iaが
Ba
より小さいときは、
Ia
に
La
を加える