FPGA開発日記

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

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

RISC-Vベクトル拡張仕様書の読み直し。浮動小数点算術演算命令。 ここでもWidening命令があり非常に厄介。全部取り払いたい。

github.com

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つの入力と別々の出力を持つ唯一のマスク可能な演算となります。