命令セットアーキテクチャを考える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の仕様を確認しないといけない…
| 固定リンク
この記事へのコメントは終了しました。


コメント