FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (20. 浮動小数点その他の命令)

RISC-Vベクトル拡張仕様書の読み直し。浮動小数点のその他の命令。MIN/MAXとか、比較命令とか。

github.com

github.com


13.11. ベクトル浮動小数点MIN/MAX命令

ベクトル浮動小数点 vfmin および vfmax 命令は、RISC-V F/D/Q 拡張のバージョン 2.2 における対応するスカラ浮動小数点命令と同じ動作をします。

    # 浮動小数点最小値
    vfmin.vv vd, vs2, vs1, vm   # ベクトル-ベクトル
    vfmin.vf vd, vs2, rs1, vm   # ベクトル-スカラ

    # 浮動小数点最大値
    vfmax.vv vd, vs2, vs1, vm   # ベクトル-ベクトル
    vfmax.vf vd, vs2, rs1, vm   # ベクトル-スカラ

13.12. ベクトル浮動小数点符号挿入命令

スカラの符号挿入命令のベクトル版です。 結果は符号ビットを除くすべてのビットを、ベクトルのvs2オペランドから取得します。

    vfsgnj.vv vd, vs2, vs1, vm   # ベクトル-ベクトル
    vfsgnj.vf vd, vs2, rs1, vm   # ベクトル-スカラ

    vfsgnjn.vv vd, vs2, vs1, vm  # ベクトル-ベクトル
    vfsgnjn.vf vd, vs2, rs1, vm  # ベクトル-スカラ

    vfsgnjx.vv vd, vs2, vs1, vm  # ベクトル-ベクトル
    vfsgnjx.vf vd, vs2, rs1, vm  # ベクトル-スカラ

Note: 浮動小数点値のベクトルは、両方のソースオペランドを同じベクトルオペランドに設定したサインインジェクション命令を使用して否定演算をすることができます。 アセンブリ疑似命令 vfneg.vd,vs = vfsgnjn.vv vd,vs,vs を定義することができます。

Note: 浮動小数点要素のベクトルの絶対値は、両方のソースオペランドが同じベクトルオペランドに設定された符号挿入命令を使用して計算することができます。 アセンブリ疑似命令 vfabs.vd,vs = vfsgnjx.vv vd,vs,vs を定義できます。

13.13. ベクトル浮動小数点比較命令

これらのベクトルFP比較命令は、2つのソースオペランドを比較し、比較結果をマスクレジスタに書き込みます。 書き込みマスクベクトルは常に単一のベクトルレジスタに保持され、その要素のレイアウトは マスクレジスタのレイアウト 節で説明されています。 書き込みマスクレジスタはソースベクトルマスクレジスタ(v0)と同じであってもかまいません。 比較はマスクレジスタを書き込むため、常にTail-agnosticポリシーで動作します。

比較命令は、スカラ浮動小数点比較命令の文法に従います。 vmfeq と vmfne は NaN 入力の信号に対してのみ無効な操作という例外を発生させます。 vmflt、 vmfle、 vmfgt、 vmfge は、シグナリング NaN 入力とサイレント NaN 入力の両方で無効な操作に関する例外を発生させます。 vmfne は、どちらかのオペランドが NaN のときに出力要素に 1 を書き込みますが、 他の比較ではどちらかのオペランドが NaN のときに 0 を書き込みます。

    # 等価比較
    vmfeq.vv vd, vs2, vs1, vm  # ベクトル-ベクトル
    vmfeq.vf vd, vs2, rs1, vm  # ベクトル-スカラ

    # 非等価比較
    vmfne.vv vd, vs2, vs1, vm  # ベクトル-ベクトル
    vmfne.vf vd, vs2, rs1, vm  # ベクトル-スカラ

    # 小なり比較
    vmflt.vv vd, vs2, vs1, vm  # ベクトル-ベクトル
    vmflt.vf vd, vs2, rs1, vm  # ベクトル-スカラ

    # 以下比較
    vmfle.vv vd, vs2, vs1, vm  # ベクトル-ベクトル
    vmfle.vf vd, vs2, rs1, vm  # ベクトル-スカラ

    # 大なり比較
    vmfgt.vf vd, vs2, rs1, vm  # ベクトル-スカラ

    # 以上比較
    vmfge.vf vd, vs2, rs1, vm  # ベクトル-スカラ
比較            アセンブリ言語マッピング   アセンブリ言語疑似命令

va < vb         vmflt.vv vd, va, vb, vm
va <= vb        vmfle.vv vd, va, vb, vm
va > vb         vmflt.vv vd, vb, va, vm    vmfgt.vv vd, va, vb, vm
va >= vb        vmfle.vv vd, vb, va, vm    vmfge.vv vd, va, vb, vm

va < f          vmflt.vf vd, va, f, vm
va <= f         vmfle.vf vd, va, f, vm
va > f          vmfgt.vf vd, va, f, vm
va >= f         vmfge.vf vd, va, f, vm

va, vb ベクトルレジスタグループ
f      スカラ浮動小数点レジスタ

Note: すべての形式を提供することとは、NaNに対する順序付けられていない比較を正しく処理するために必要です。

Note: C99浮動小数点のquiet比較は、以下のように、どちらかの入力がNaNの場合に信号の比較をマスクすることで実装できます。 比較対象が非 NaN 定数の場合は、中間の2つの命令を省略できます。

    # isgreater() の実装例
    vmfeq.vv v0, va, va        # AがNaNでない場合にのみセットされる
    vmfeq.vv v1, vb, vb        # BがNaNでない場合にのみセットされる
    vmand.mm v0, v0, v1        # AとBに順序関係があるときのみセットされる
    vmfgt.vv v0, va, vb, v0.t  #  従って、順序関係がある値の場合にのみフラグが設定される

Note: 上記のシーケンスでは、2つ目の vmfeq 命令をマスクして vmand 命令を削除したくなりますが、 より効率的なシーケンスでは、va の要素に quiet NaN が含まれ、vb の対応する要素に signaling NaN が含まれている場合に、 不正な例外を発生させることができません。

13.14. ベクトル浮動小数点分類命令

スカラ分類命令と同様に動作する単項のベクトル-ベクトル命令です。

    vfclass.v vd, vs2, vm   # ベクトル-ベクトル

この命令で生成された10ビットのマスクは、結果要素の最下位ビットに配置されます。 結果の上位(SEW-10)ビットには0が入ります。 この命令はSEW=16b以上でのみ定義されているため、結果は常に書き込み要素に収まります。

13.15. ベクトル浮動小数点マージ命令

ベクトルスカラ浮動小数点マージ命令が提供されています。 この命令は、マスク値に関係なく、vstartからvlの現在のベクトル長までのすべてのボディ要素で動作します。

vfmerge.vfm 命令は、マスクされた命令 (vm=0) としてエンコードされます。 マスク値がゼロの要素では、最初のベクトルオペランドが書き込み要素にコピーされ、そうでない場合は、スカラ浮動小数レジスタ値が書き込み要素にコピーされます。

vfmerge.vfm vd, vs2, rs1, v0  # vd[i] = v0.mask[i] ? f[rs1] : vs2[i]

13.16. ベクトル浮動小数点移動命令

ベクトル浮動小数点移動命令は、浮動小数点のスカラオペランドをベクトルレジスタグループに 転送 します。 この命令は、スカラ f レジスタ値をベクトルレジスタグループのすべてのアクティブな要素にコピーします。 この命令はマスクされた命令(vm=1)としてエンコードされます。 この命令は、vs2 フィールドが v0 に設定されていなければならず、vs2 の他の値はすべて予約されています。

vfmv.v.f vd, rs1  # vd[i] = f[rs1]

Note: vfmv.v.f 命令は、vfmerge.vfm 命令とエンコーディングを共有しますが、vm=1 および vs2=v0 となります。