« 命令セットアーキテクチャを考える5 (load/store系命令) | トップページ | 命令セットアーキテクチャを考える7 (論理演算命令) »

2014/06/11

命令セットアーキテクチャを考える6 (整数演算命令)

続いて、整数演算系の命令を定義します。

[整数演算系命令]:12命令


add [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd

・RsとRtの内容を符号付き二進数として加算し、結果をRdに格納する。
・byteモードの場合は下位8bit、half-wordモードの場合は下位16bit、wordモードの場合は下位32bitのみが演算に使用され、Rdの下位ビットに格納される。使用されない上位ビットは変更されない。
・演算結果により、CCR0のcondition code bitがセットされる。(正/負/零、オーバーフローなど)
・Immidiateモードの場合、Rtの代わりにimm(10bit)を指定する。immは、符号付き2進数として扱われ、必要に応じて符号拡張が行われる。

・SIMDモードの場合、レジスタ内のデータを8bit*8、16bit*4、32bit*2のデータとして演算に使用される。
・SIMDモードには、double-word指定はできない。(エラーにはならないが、64bitデータが一つしかないので普通の加算命令と同じになる)
・condition code bitは変化しない。加算結果が最大値を超えた場合には最大値が、最小値(負数で絶対値が最大のもの)を超えた場合は最小値がセットされる(飽和演算)。
・即値指定の場合、第三オペランドは8bit/16bit/32bitに符号拡張されたものが必要回数繰り返しされたものと見なされる。

sub [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd

・Rsの内容からRtの内容を減算した結果が、Rdに格納される。
・それ以外は加算命令と同様である。

mult [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd

・byteモードの場合はRs及びRt(またはimmの符号拡張された値)の下位8bit、half-wordモードの場合は下位16bit、wordモードの場合は下位32bitのみが演算に使用され、Rdの下位ビット16bit、32bit及び64bitに格納こされる。
・double-wordモードの場合、RdとRsの乗算結果、Rd及び連続する汎用レジスタに格納される。Rdは偶数レジスタでなければならない。

・SIMDモードの場合、演算結果は、Rd及び連続する汎用レジスタの下位ビットから格納される。Rdは偶数レジスタでなければならない。

div [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd

・byteモードの場合は被除数をRs、除数をRt(またはimmの符号拡張された値)とし、byteモードの場合は下位8bit、half-wordモードの場合は下位16bit、wordモードの場合は下位32bit、double-wordモードの場合は64bitすべて演算に使用され、除算結果をRdの下位8bit、16bit、32bit及び64bitに格納し、剰余をRdに連続するレジスタの下位8bit、16bit、32bit及び64bitに格納する。
・Rdは偶数レジスタでなければならない。

・SIMDモードの場合、演算結果は、Rd及び連続する汎用レジスタに格納される。Rdは偶数レジスタでなければならない。
・SIMDモードの場合、0除算割り込みも発生しない。(除算結果として被除数の符号の付いた最大値が返り、剰余として0が返る)

addl [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
subl [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
multu [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
divu [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd

・末尾に"l""u"が付く命令は、logicalunsignedの意味で、符号なし二進数としての演算を行う。
・immも符号なし二進数とみなし、必要に応じて拡張される
・それ以外は符号付き二進数演算命令と同様である。

# 加算と減算は、符号付きも符号なしも計算後のビットパターンは同じなので、別命令とすることをやめた。(2018/03/21)


hadd [b|hw|w] Rs,Rd

・ニーモニックの先頭の "h"は、horizontalを意味する。
・SIMD命令で利用されるパックデータの合計を計算する。
・byteモードの場合、Rsのレジスタ内容を8bit×8個を加算し、Rdの下位8bitに格納する。
・同様に、half-wordモードの場合、16bitデータ×4個、wordモードの場合、32bitデータ×2個を加算する。
・演算結果により、CCR0がセットされる。

haddu [b|hw|w] Rs,Rd

・上記と同様で、符号なし二進数として加算する。

hmult [b|hw|w] Rs,Rd

・haddと同様に乗算。
・演算結果は、Byteモードの場合は下位16bitに、half-wordモードの場合は下位32bitに、wordモードの場合は64bitに格納する。

hmultu [b|hw|w] Rs,Rd

・同様に、符号無し二進数として乗算する。


[擬似命令]

copy [b|hw|w|dw] Rs,Rd → add [b|hw|w|dw] Rs,R0,Rd

・レジスタ間のデータ複写(転送)命令は、Rsとゼロレジスタの加算結果(減算結果でもいいけど)Rdに格納する命令で代用する。

clear [b|hw|w|dw] Rd : add [b|hw|w|dw] R0,R0,Rd

・レジスタ内容のゼロクリアは、ゼロレジスタ同士の加算結果をRdに格納する命令で代用する。

comp [b|hw|w|dw] Rs,{Rt|=imm} → sub [b|hw|w|dw] Rs,Rt,R0
ucomp [b|hw|w|dw] Rs,{Rt|=imm} → usub [b|hw|w|dw] Rs,Rt,R0

・レジスタ同士または(及び即値)との比較は、減算命令により代用する。減算結果の格納先をゼロレジスタに指定する。

|

« 命令セットアーキテクチャを考える5 (load/store系命令) | トップページ | 命令セットアーキテクチャを考える7 (論理演算命令) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 命令セットアーキテクチャを考える6 (整数演算命令):

« 命令セットアーキテクチャを考える5 (load/store系命令) | トップページ | 命令セットアーキテクチャを考える7 (論理演算命令) »