SHARC DSPの命令セット


注意

 アセンブラでプログラムを開発する人向けの情報です。 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〜B0Ia, Laと組み合わせて リングバッファに使用する。 リングバッファの先頭アドレスを保持する。
La DAG1のバッファ長レジスタL7〜L0Ia, Baと組み合わせて リングバッファに使用する。 0にするとリングバッファにはならない。
Bc DAG2のベースアドレスレジスタB15〜B8Ic, Lcと組み合わせて リングバッファに使用する。 リングバッファの先頭アドレスを保持する。
Lc DAG2のバッファ長レジスタL15〜L8Ic, 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 条件 JUMP (PC,<reladdr24>) (分岐オプション);
条件コール IF 条件 CALL <addr24> (コールオプション);
IF 条件 CALL (PC,<reladdr24>) (コールオプション);
9 条件分岐と演算 IF 条件 JUMP (Md,Ic); (分岐オプション), 演算;
IF 条件 JUMP (Md,Ic); (分岐オプション), ELSE 演算;
IF 条件 JUMP (PC,<reladdr6>) (分岐オプション), 演算;
IF 条件 JUMP (PC,<reladdr6>) (分岐オプション), ELSE 演算;
条件コールと演算 IF 条件 CALL (Md,Ic); (コールオプション), 演算;
IF 条件 CALL (Md,Ic); (コールオプション), ELSE 演算;
IF 条件 CALL (PC,<reladdr6>) (コールオプション), 演算;
IF 条件 CALL (PC,<reladdr6>) (コールオプション), ELSE 演算;
10 条件分岐と演算とロードストア IF 条件 JUMP (Md,Ic); (分岐オプション), 演算, dreg1⇔DM(Ia,Mb);
IF 条件 JUMP (Md,Ic); (分岐オプション), ELSE 演算, dreg1⇔DM(Ia,Mb);
IF 条件 JUMP (PC,<reladdr6>) (分岐オプション), 演算, dreg1⇔DM(Ia,Mb);
IF 条件 JUMP (PC,<reladdr6>) (分岐オプション), ELSE 演算, dreg1⇔DM(Ia,Mb);
11 条件サブルーチンリターン IF 条件 RTS (リターンオプション), 演算;
IF 条件 RTS (リターンオプション), ELSE 演算;
条件割込リターン IF 条件 RTI (コールオプション), 演算;
IF 条件 RTS (コールオプション), ELSE 演算;
12 DOループ LCNTR=<data16>, DO <addr24> UNTIL LCE;
LCNTR=<data16>, DO (PC,<reladdr24>); UNTIL LCE;
LCNTR=ureg, DO <addr24> UNTIL LCE;
LCNTR=ureg, DO (PC,<reladdr24>) UNTIL LCE;
13 DOループ DO <addr24> UNTIL 終了条件;
DO (PC,<reladdr24>); 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>)
MODIFY (Ic,<data32>)
ビット反転 BITREV (Ia,<data32>)
BITREV (Ic,<data32>)
20 Push/Pop  
21 何もしない NOP;
22 割込待ち IDLE;
25 Cjump/Rframe  

演算

レジスタ記法

レジスタ記法
用途 固定小数点 浮動小数点
シンボル 説明 シンボル 説明
入力x Rx R15〜R0の一つ Fx F15〜F0の一つ
入力y Ry Fy
演算結果 Rn Fn

ALU算術演算

ALU算術演算
演算 ニーモニック 備考
固定小数点 浮動小数点
加算 Rn=Rx+Ry Fn=Fx+Fy  
減算 Rn=Rx−Ry Fn=Fx−Fy  
キャリー付き加算 Rn=Rx+Ry+CI    
ボロー付き減算 Rn=Rx−Ry+CI−1    
和の絶対値   Fn=ABS(Fx+Fy)  
差の絶対値   Fn=ABS(Fx−Fy)  
平均値 Rn=(Rx+Ry)/2 Fn=(Fx+Fy)/2  
比較 COMP(Rx, Ry) COMP(Fx, Fy)  
絶対値の比較 COMPU(Rx, Ry)    
キャリーを加算 Rn=Rx+CI    
ボローを減算 Rn=Rx+CI−1    
1を加算 Rn=Rx+1    
1を減算 Rn=Rx−1    
符号を反転 Rn=−Rx Fn=−Fx  
絶対値 Rn=ABS Rx Fn=ABS Fx  
コピー Rn=PASS Rx Fn=PASS Fx フラグは変化する
最大値 Rn=MAX(Rx,Ry) Fn=MAX(Fx,Fy)  
最小値 Rn=MIN(Rx,Ry) Fn=MIN(Fx,Fy)  
クリップ Rn=CLIP Rx BY Ry Fn=CLIP Fx BY Fy 絶対値|Ry| or |Fy|以下に

ALU論理演算

ALU論理演算
演算 ニーモニック 備考
固定小数点
論理積 Rn=Rx AND Ry  
論理和 Rn=Rx OR Ry  
排他的論理和 Rn=Rx XOR Ry  
否定 Rn=NOT Rx  

ALU浮動小数点特殊演算

ALU浮動小数点特殊演算
演算 ニーモニック 備考
浮動小数点
丸め Fn=RND Fx  
スケーリング Fn=SCALB Fx BY Ry Fxの指数部にRyを加える
仮数部を取り出す Rn=MANT Fx  
指数部を取り出す Rn=LOGB Fx  
固定小数点に変換 Rn=FIX Fx  
固定小数点に変換 Rn=FIX Fx BY Ry Fxの指数部にRyを加える
浮動小数点に変換 Fn=FLOAT Rx  
固定小数点に変換 Fn=FLOAT Rx BY Ry Fnの指数部にRyを加える
逆数 Fn=RECIPS Fx 8bit精度
平方根の逆数 Fn=RSQRTS Fx 8bit精度
符号をコピー Fn=Fx COPYSIGHN Ry  

乗算

 固定小数点乗算は種類が非常に多いが今回はほとんど使わないので略。

浮動小数点乗算
演算 ニーモニック 備考
浮動小数点
乗算 Fn=Fx * Fy  

シフタ

 シフト命令は種類が非常に多いが今回はほとんど使わないので略。

マルチファンクションのレジスタ記法

 組み合わせは限定されるが、複数の演算を同時に行うことができる。 乗算器と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の一つ

浮動小数点のマルチファンクション

浮動小数点のマルチファンクション
演算 ニーモニック 備考
加算と減算 Fa=Fx+Fy, Fs=Fx−Fy  
乗算と加算 Fm=F3-0*F7-4, Fa=F11-8+F15-12  
乗算と減算 Fm=F3-0*F7-4, Fa=F11-8−F15-12  
乗算と浮動小数点変換 Fm=F3-0*F7-4, Fa=FLOAT R11-8 BY R15-12  
乗算と固定小数点変換 Fm=F3-0*F7-4, Ra=FIX F11-8 BY R15-12  
乗算と平均値 Fm=F3-0*F7-4, Fa=(F11-8+F15-12)/2  
乗算と絶対値 Fm=F3-0*F7-4, Fa=ABS F11-8  
乗算と最大値 Fm=F3-0*F7-4, Fa=MAX(F11-8,F15-12)  
乗算と最小値 Fm=F3-0*F7-4, Fa=MIN(F11-8,F15-12)  
乗算と加算と減算 Fm=F3-0*F7-4, Fa=F11-8+F15-12, Fs=F11-8−F15-12  

固定小数点のマルチファンクション

 固定小数点のマルチファンクション演算は 種類が非常に多いが今回はほとんど使わないので略。


リングバッファの使い方

 SHARC DSPでリングバッファを使用するには、 リングバッファの先頭アドレスを Baレジスタに、 バッファのサイズをLaレジスタに 格納します。 実際にデータを読み書きする際には、 インデックスレジスタIaを使います。 Ba, La, Iaは全て同じ番号で揃える必要があります。 Baレジスタに代入すると、 自動的にIaレジスタにも 同じアドレスが代入されます。

 修正量レジスタMbには、 Iaを変化させたい値を格納します。 1を加えたい場合には+1、1を減じたい場合には-1を格納します。 IaMbとは同じ番号である必要はありません。 ただし、同じDAGのレジスタである必要があります。

 修正量Mbが正のとき、

  fk=DM(Ia,Mb);
というプログラムは、
  1. データレジスタfkに データメモリのアドレスIaに格納されている データを読み出す
  2. IaMbを加える
  3. IaBa+La より大きいときは、 Iaから Laを減じる
という処理を行います。 Mbが負のときには、
  1. データレジスタfkに データメモリのアドレスIaに格納されている データを読み出す
  2. IaMbを加える
  3. IaBa より小さいときは、 IaLaを加える
となります。


[上へ] [戻る 第3世代SHARC DSP] [目次] [次へ SHARCでFIRフィルタ]