« 命令セットアーキテクチャを考える9 (ビット操作命令) | トップページ | マザボ変更その後(その2) »

2014/06/13

命令セットアーキテクチャを考える10 (浮動小数点数演算命令)

ようやく、浮動小数点演算命令にたどり着きました。


[浮動小数点数演算命令]:6命令

fadd [v] [sp|dp|qp] FRs,FRt,FRd

・FRsとFRtの内容を浮動小数点数として加算した結果をFRdに格納する。
・単精度モードの場合、FRs及びFRtの下位32ビットを単精度浮動小数点数として計算し、FRdの下位32ビットに格納する。
・倍精度モードの場合、FRs及びFRtの64ビットを倍精度浮動小数点数として計算し、FRdの64ビットに格納する。
・四倍精度モードの場合、FRs及びFRtのそれぞれ連続する二本のレジスタを連結した128ビットを四倍精度浮動小数点数として計算し、FRdの連続する二本のレジスタに格納する。FRs,FRt,FRdはすべて偶数レジスタでなくてはならない。
・計算結果によって、CCR1の内容がセットされる。

・SIMDモードの場合、FRs及びFRtのぞれぞれ連続する四本のレジスタを使って、32bit*8、64bit*4、128bit*2のデータとして演算に使用される。結果は、FRdの連続する四本のレジスタに32bit*8、64bit*4、128bit*2として格納される。
・SIMDモードの場合、CCR1は変化しない。結果の絶対値が最大値を超えた場合には符号付きの最大値が、計算できない場合にはNaNが返る。
・SIMDモードの場合、レジスタ番号はすべて偶数でなくてはならない。(4の倍数でなくてもよい) レジスタ番号としてFR62は指定できない。

fsub [v] [sp|dp|qp] FRs,FRt,FRd

・FRsの内容からFRtの内容を減算するほかはfaddと同様。

fmult [v] [sp|dp|qp] FRs,FRt,FRd

・FRsの内容とFRtの内容を乗算するほかはfaddと同様。

fdiv [v] [sp|dp|qp] FRs,FRt,FRd

・FRsの内容からFRtの内容を除算するほかはfaddと同様。


・正規化数以外(最大値、非正規化数、NaNなど)を含む四則演算結果については別途検討が必要。基本的にはIEEE754に準拠する。


frcp [v] [sp|dp|qp] FRs,FRd

・FRsの逆数(reciprocal)の近似値をFRdに格納する。
・単精度モードの場合、FRs及びFRtの下位32ビットを単精度浮動小数点数として計算し、FRdの下位32ビットに格納する。
・倍精度モードの場合、FRs及びFRtの64ビットを倍精度浮動小数点数として計算し、FRdの64ビットに格納する。
・四倍精度モードの場合、FRs及びFRtのそれぞれ連続する二本のレジスタを連結した128ビットを四倍精度浮動小数点数として計算し、FRdの連続する二本のレジスタに格納する。FRs,FRt,FRdはすべて偶数レジスタでなくてはならない。
・計算結果によって、CCR1の内容がセットされる。FRsの内容がゼロ(正負ともに)の場合は0除算例外が発生する。

・SIMDモードの場合、FRs及びFRtのそれぞれ連続する四本のレジスタを使って、32bit*8、64bit*4、128bit*2のデータとして演算に使用される。結果は、FRdの連続する四本のレジスタに32bit*8、64bit*4、128bit*2として格納される。
・SIMDモードの場合、CCR1は変化しない。0除算例外割り込みも発生しない。(最大値が返る)計算できない場合にはNaNが返る。
・SIMDモードの場合、レジスタ番号はすべて偶数でなくてはならない。(4の倍数でなくてもよい) ただし、FR62は指定できない。

frsqrt [v] [sp|dp|qp] FRs,FRd

・FRsの平方根の逆数(reciprocal of square root)の近似値が格納されるほかはfrcpと同様。
・FRsの内容が負(-0を除く)であった場合には、例外が発生する。FRsの内容がゼロ(±0)の場合にはゼロ除算例外が発生する。


[擬似命令]

fcopy [v] [sp|dp|qp] FRs,FRd

・FRsの内容をFRdにコピーする。
・アセンブラが「fadd [v] [sp|dp|qp] FRs,FR0,FRd」に変換する。

fclear [v] [sp|dp|qp] FRd

・FRdの内容をゼロクリアする。
・アセンブラが「fadd [v] [sp|dp|qp] FR0,FR0,FRd」に変換する。


[水平演算命令]:2命令

fhadd [sp|dp|qp] FRs,FRd

・ニーモニックの先頭の"h"はhorizontalを意味する。
・FRsから連続する四本のFRレジスタの内容を、single*8またはdouble*4またはquad*2の浮動小数点データとして、その総和を計算し、FRdに格納する。FRsは偶数レジスタでなければならない。quadモードの場合はFRdも偶数レジスタでなければならない。

fhmult [sp|dp|qp] FRs,FRd

・乗算であることの他はfhaddと同様。


[特殊定数値ロード命令]:1命令

fspcnum [v] [sp|dp|qp] =imm,FRd

・特殊な定数値(special number)をFRdに格納する。特殊な定数値はimmで指定する。
・imm=0:+0.0、imm=1:+1.0、imm=2:e、imm=3:π …
・immは10ビットあるので、ROMの容量に余裕があれば、最大1024個まで定義できる。
・アセンブラソースプログラム上、即値を直接記述しても分かりにくいので、
zero equ 0
one equ 1
e equ 2
pai equ 3

のように定義しておくと、アセンブラソースプログラムを読みやすく理解しやすくできる。

・四倍精度モードの場合、FRdから連続する二本のレジスタに格納される。FRdは偶数レジスタでなければならない。
・SIMDモードの場合は、FRdから連続する四本のレジスタに、32bit×8、64bit×4、128bit×2個の同じ値が格納される。FRdは偶数レジスタでなければならない。(4の倍数である必要はない)
・ロードした値に基づいてCCR1がセットされる。SIMDモードの場合もCCR1がセットされる。


[精度変換命令]:2命令

fup [sp|dp] FRs,FRd

・FRsの浮動小数点数の精度を拡張し(単精度→倍精度、倍精度→四倍精度)、FRdに格納する。
・倍精度→四倍精度の場合、FRdから連続する二本のレジスタに格納される。FRdは偶数レジスタでなければならない。
・変換後の値に基づいてCCR1がセットされる。

fdown [dp|qp] FRs,FRd

・FRsの浮動小数点数の精度を縮小し(倍精度→単精度、四倍精度→倍精度)、FRdに格納する。
・四倍精度→倍精度の場合、FRsから連続する二本のレジスタに格納されたデータを変換する。FRsは偶数レジスタでなければならない。
・変換後の値に基づいてCCR1がセットされる。

・SIMDモードは必要か。レジスタの使い方が他の命令のSIMDモードとはちょっと変則的になるが。


[擬似命令]

fsp2dp FRs,FRd → fup sp FRs,FRd
fdp2qp FRs.FRd → fup dp FRs,FRd
fqp2dp FRs,FRd → fdown qp FRs,FRd
fdp2sp FRs,FRd → fdown dp FRs,FRd


[汎用レジスタ転送命令]:4

gr2fr [1|2|4|8] Rs,FRd

・Rsで指定される汎用レジスタの内容を、FRdで指定される浮動小数点レジスタにビットパターンとしてコピーする。
・CCR1の内容は変化しない。

fr2gr [1|2|4|8] FRs,Rd

・FRsで指定される浮動小数点レジスタの内容を、Rdで指定される汎用レジスタにビットパターンとしてコピーする。
・CCR0の内容は変化しない。

・複数レジスタ指定は、アセンブラが複数命令に展開したほうがいいか?

int2fp [hw|w|dw] Rs,FRd

・Rsの内容を符号付き二進数とみなし、浮動小数点数に変換し、FRdに格納する。
・half-wordモードの場合はRsの下位16ビットを単精度浮動小数点数に、wordモードの場合はRsの下位32bitを倍精度浮動小数点数に、double-wordモードの場合はRsの64bit全体を四倍精度浮動小数点数に変換する。double-wordモードの場合には、FRdは偶数レジスタである必要がある。
・変換結果に応じて、CCR1をセットする。

fp2int [sp|dp|qp] FRs,Rd

・FRsの内容を整数(符号付き二進数)に変換し、Rdに格納する。小数点以下は切り捨てる。
・単精度/倍精度/四倍精度の浮動小数点数を、すべてdouble-wordの整数に変換する。
・変換結果に応じて、CCR0をセットする。

・丸め方法はIEEE 754の仕様を確認しないといけない…

|

« 命令セットアーキテクチャを考える9 (ビット操作命令) | トップページ | マザボ変更その後(その2) »

コメント

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

トラックバック


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

« 命令セットアーキテクチャを考える9 (ビット操作命令) | トップページ | マザボ変更その後(その2) »