竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU 演算(ALU)命令

<<   作成日時 : 2009/09/12 22:35   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 全汎用レジスタには、ユーザモードからはアクセスできないフラグC,V,N,Zが付いていて、演算結果により変化する。

C:符号なし加算結果の桁あふれ(キャリー)または符号なし減算の桁借り(ボロー)または飽和加減算時の飽和
V:符号付き演算のオーバーフロー
N:負
Z:ゼロ

ゼロレジスタ(GR0)もフラグを持つ。この場合は演算結果に指定された時に値は捨てられフラグのみセットされる。
フラグは条件分岐命令、条件移動命令によって参照される。条件判断のパターンは今のところARM,SPARCに合わせている。

以下の演算命令は、GRs2の位置を符号付き即値で置き換えることができる。(例: ADD GR1,imm,GR2)
また、演算命令ではできるだけ例外は発生させない。

・加減算命令
ADD GRs1,GRs2,GRd 加算 符号なしキャリーでCフラグ立つ
ADDC GRs1,GRs2,GRd キャリー付き加算
ADDUU GRs1,GRs2,GRd 飽和加算 ソース:符号なし 結果:符号なし 上方向の飽和でCフラグ立つ(0xffff,32ビットレジスタモード時の場合)
ADDUS GRs1,GRs2,GRd 飽和加算 ソース:符号なし 結果:符号付き 上方向の飽和でCフラグ立つ(0x7fff,32ビットレジスタモード時の場合)
ADDSS GRs1,GRs2,GRd 飽和加算 ソース:符号付き 結果:符号付き 上方向の飽和でCフラグ立つ(0x7fff,32ビットレジスタモード時の場合)
SUB GRs1,GRs2,GRd 減算 符号なしボローでCフラグ立つ
SUBC GRs1,GRs2,GRd ボロー付き減算
SUBUU GRs1,GRs2,GRd 飽和減算 ソース:符号なし 結果:符号なし 下方向の飽和でCフラグ立つ(0x0000,32ビットレジスタモード時の場合) 
SUBUS GRs1,GRs2,GRd 飽和減算 ソース:符号なし 結果:符号付き 下方向の飽和でCフラグ立つ(0x8000,32ビットレジスタモード時の場合)
SUBSS GRs1,GRs2,GRd 飽和減算 ソース:符号付き 結果:符号付き 下方向の飽和でCフラグ立つ(0x8000,32ビットレジスタモード時の場合)
・SIMD加減算命令
SBADD GRs1,GRs2,GRd 8ビット幅(1バイト)単位でのSIMD加算
SWADD GRs1,GRs2,GRd 16ビット幅(2バイト)単位でのSIMD加算
SSADD GRs1,GRs2,GRd 32ビット幅(4バイト)単位でのSIMD加算
同様に
S{B,W,S}ADDC
S{B,W,S}ADDUU
S{B,W,S}ADDUS
S{B,W,S}ADDSS
S{B,W,S}SUB
S{B,W,S}SUBC
S{B,W,S}SUBUU
S{B,W,S}SUBUS
S{B,W,S}SUBSS
もある。
※ADDC,SUBCは命令セットに入り切れなければなくしてもよい。(1)汎用レジスタのビット数が多い、(2)条件分岐命令との組み合わせで多倍長演算は実現できる、(3)SIMD演算ではあまり意味がないため。

・シフト命令
SLL GRs1,GRs2,GRd 論理左シフト。GRs1を対象にシフト量はGRs2で指定(0〜レジスタ長まで)。
SRL GRs1,GRs2,GRd 論理右シフト。GRs1を対象にシフト量はGRs2で指定(0〜レジスタ長まで)。
SRA GRs1,GRs2,GRd 算術右シフト。GRs1を対象にシフト量はGRs2で指定(0〜レジスタ長まで)。
・SIMDシフト命令
S{B,W,S}SLL GRs1,GRs2,GRd
S{B,W,S}SRL GRs1,GRs2,GRd
S{B,W,S}SRA GRs1,GRs2,GRd
それぞれ8ビット幅(1バイト)、16ビット幅(2バイト)32ビット幅(4バイト)単位でのシフト。シフト量はビット幅の範囲内。
※シフト量範囲外における例外は発生しない。シフト量が負ならゼロ扱い、シフト量が上限を超えたら上限まで。

・論理演算命令 これらにはSIMD命令はない。
OR GRs1,GRs2,GRd ○
AND GRs1,GRs2,GRd ○
ORN GRs1,GRs2,GRd ○
ANDN GRs1,GRs2,GRd ○
NOR GRs1,GRs2,GRd
NAND GRs1,GRs2,GRd
NORN GRs1,GRs2,GRd
NANDN GRs1,GRs2,GRd
XOR GRs1,GRs2,GRd ○
XORN GRs1,GRs2,GRd ○
ニーモニックの末尾にNが付くものはGRs2反転。先頭にNが付くものは結果が反転。
NEG 2の補数はSUB命令とゼロレジスタで実現する。
NOT 1の補数はORNなどで実現する。
最低限、○が付いた命令があればいい。

・乗算命令
MUL GRs1,GRs2,GRd ソース同士の乗算結果の下半分をGRdに格納。(32ビット×32ビットなら[31:0]を格納)
UMULH GRs1,GRs2,GRd ソース同士の乗算結果の上半分をGRdに格納。(32ビット×32ビットなら[63:32]を格納)
 GRs1,GRs2が符号なしのとき:UMULHの結果が上位ビット
 GRs1,GRs2が符号付きのとき:UMULHの結果−GRs1のMSB×GRs2−GRs2のMSB×GRs1 ※これはAlphaを参考にした。
・SIMD乗算命令
SBMUL 8ビット×8ビット=16ビットで格納される
SWMUL 16ビット×16ビット=32ビットで格納される
SSMUL 32ビット×32ビット=64ビットで格納される
 ソース側のビットアサインは要検討。2オペランド命令で可能かもしれない。

・除算命令 入れたくないなあ。命令の定義だけしてエミュレーションすることにしておこうか。
UDIV GRs1,GRs2,GRd 符号なし除算
SDIV GRs1,GRs2,GRd 符号付き除算
※0除算による例外が発生する。
除算命令はSIMDになじまない。演算にかかるサイクルが内容によってまちまちなので、演算結果がいちばん遅いものに待ち合わせる必要がある。

基本的な演算命令は、ビット操作を除いてほぼ入っているはず。その他のSIMD命令については要調査。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
URL(任意)
本 文




ぼくのかんがえたさいきょうCPU 演算(ALU)命令 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる