RISC-Vベクトル拡張仕様書の読み直し。浮動小数点算術演算命令。 ここでもWidening命令があり非常に厄介。全部取り払いたい。
riscv-v-spec/v-spec.adoc at master · riscv/riscv-v-spec · GitHub
13. ベクトル浮動小数点命令
標準のベクトル浮動小数点命令では、16ビット、32ビット、64ビット、128ビットの要素をIEEE-754/2008互換の値として扱います。 ベクトル浮動小数点演算子のEEWが、サポートされているIEEE浮動小数点型に対応していない場合、 その命令のエンコーディングは予約されています。
Note: サポートされる浮動小数点要素の幅は、プロファイルによって異なります。 ベクトル浮動小数点命令では、サポートされているベクトル浮動小数点の要素幅に対応する スカラー浮動小数点拡張が有効であることが必要です。
Note: 特に16ビット半精度浮動小数点値をサポートするベクトルプロファイルでは、 f レジスタでのスカラ半精度浮動小数点サポートも実装する必要があります。 浮動小数点ユニット状態フィールド mstatus.FS が Off の場合、 ベクトル浮動小数点命令を実行しようとすると、不正な命令例外が発生します。 浮動小数点拡張状態(浮動小数点CSRや f レジスタなど)を変更するベクトル浮動小数点命令は、 mstatus.FS を Dirty に設定しなければなりません。
ベクトル浮動小数点命令は、NaNに関してはスカラ浮動小数点命令と同じ動作をします。
ベクトルスカラー演算のスカラ値は、 ベクトル算術演算命令エンコーディング で説明したように、 標準的なスカラ f レジスタから供給することができます。
13.1. ベクトル浮動小数点例外フラグ
アクティブな浮動小数点要素でのベクトル浮動小数点例外は、 fflags レジスタの標準FP例外フラグを設定します。 非アクティブな要素はFP例外フラグを設定しません。
13.2. ベクトル単一幅浮動小数点加減算命令
# 浮動小数点加算 vfadd.vv vd, vs2, vs1, vm # ベクトル-ベクトル vfadd.vf vd, vs2, rs1, vm # ベクトル-スカラ # 浮動小数点減算 vfsub.vv vd, vs2, vs1, vm # ベクトル-ベクトル vfsub.vf vd, vs2, rs1, vm # ベクトル-スカラ vd[i] = vs2[i] - f[rs1] vfrsub.vf vd, vs2, rs1, vm # スカラ-ベクトル vd[i] = f[rs1] - vs2[i]
13.3. ベクトル幅拡張浮動小数点加減算命令
# 浮動小数点幅拡張加減算命令, 2*SEW = SEW +/- SEW vfwadd.vv vd, vs2, vs1, vm # ベクトル-ベクトル vfwadd.vf vd, vs2, rs1, vm # ベクトル-スカラ vfwsub.vv vd, vs2, vs1, vm # ベクトル-ベクトル vfwsub.vf vd, vs2, rs1, vm # ベクトル-スカラ # 浮動小数点幅拡張加減算命令, 2*SEW = 2*SEW +/- SEW vfwadd.wv vd, vs2, vs1, vm # ベクトル-ベクトル vfwadd.wf vd, vs2, rs1, vm # ベクトル-スカラ vfwsub.wv vd, vs2, vs1, vm # ベクトル-ベクトル vfwsub.wf vd, vs2, rs1, vm # ベクトル-スカラ
13.4. ベクトル単一幅浮動小数点乗算除算命令
# 浮動小数点乗算 vfmul.vv vd, vs2, vs1, vm # ベクトル-ベクトル vfmul.vf vd, vs2, rs1, vm # ベクトル-スカラ # 浮動小数点除算 vfdiv.vv vd, vs2, vs1, vm # ベクトル-ベクトル vfdiv.vf vd, vs2, rs1, vm # ベクトル-スカラ # 浮動小数点逆除算 ベクトル = スカラ / ベクトル vfrdiv.vf vd, vs2, rs1, vm # scalar-vector, vd[i] = f[rs1]/vs2[i]
13.5. ベクトル幅拡張浮動小数点乗算命令
# 幅拡張浮動小数点乗算 vfwmul.vv vd, vs2, vs1, vm # ベクトル-ベクトル vfwmul.vf vd, vs2, rs1, vm # ベクトル-スカラ
13.6. ベクトル単一幅浮動小数点複合乗算加算命令
複合乗算加算の4種類すべてが提供されており、加算値または最初の乗算値のいずれかのオペランドを上書きする2つの破壊的な形式があります。
# FP multiply-accumulate, overwrites addend vfmacc.vv vd, vs1, vs2, vm # vd[i] = +(vs1[i] * vs2[i]) + vd[i] vfmacc.vf vd, rs1, vs2, vm # vd[i] = +(f[rs1] * vs2[i]) + vd[i] # FP negate-(multiply-accumulate), overwrites subtrahend vfnmacc.vv vd, vs1, vs2, vm # vd[i] = -(vs1[i] * vs2[i]) - vd[i] vfnmacc.vf vd, rs1, vs2, vm # vd[i] = -(f[rs1] * vs2[i]) - vd[i] # FP multiply-subtract-accumulator, overwrites subtrahend vfmsac.vv vd, vs1, vs2, vm # vd[i] = +(vs1[i] * vs2[i]) - vd[i] vfmsac.vf vd, rs1, vs2, vm # vd[i] = +(f[rs1] * vs2[i]) - vd[i] # FP negate-(multiply-subtract-accumulator), overwrites minuend vfnmsac.vv vd, vs1, vs2, vm # vd[i] = -(vs1[i] * vs2[i]) + vd[i] vfnmsac.vf vd, rs1, vs2, vm # vd[i] = -(f[rs1] * vs2[i]) + vd[i] # FP multiply-add, overwrites multiplicand vfmadd.vv vd, vs1, vs2, vm # vd[i] = +(vs1[i] * vd[i]) + vs2[i] vfmadd.vf vd, rs1, vs2, vm # vd[i] = +(f[rs1] * vd[i]) + vs2[i] # FP negate-(multiply-add), overwrites multiplicand vfnmadd.vv vd, vs1, vs2, vm # vd[i] = -(vs1[i] * vd[i]) - vs2[i] vfnmadd.vf vd, rs1, vs2, vm # vd[i] = -(f[rs1] * vd[i]) - vs2[i] # FP multiply-sub, overwrites multiplicand vfmsub.vv vd, vs1, vs2, vm # vd[i] = +(vs1[i] * vd[i]) - vs2[i] vfmsub.vf vd, rs1, vs2, vm # vd[i] = +(f[rs1] * vd[i]) - vs2[i] # FP negate-(multiply-sub), overwrites multiplicand vfnmsub.vv vd, vs1, vs2, vm # vd[i] = -(vs1[i] * vd[i]) + vs2[i] vfnmsub.vf vd, rs1, vs2, vm # vd[i] = -(f[rs1] * vd[i]) + vs2[i]
Note: スカラーFPのFMAエンコーディングで使用されていない2つの丸めモードを使用して、 いくつかの非破壊的なFMAを提供することは可能でしょう。 しかし、これは3つの入力と別々の出力を持つ唯一のマスク可能な演算となります。