FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (14. ベクトル算術演算命令1)

RISC-Vベクトル拡張仕様書の読み直し。ベクトル算術演算命令。この辺りはv0.8からあまり変わっていないと思う。


10. ベクトル算術演算命令

ベクトル演算命令では、OP-FPに隣接する新しいメジャーオペコード(OP-V = 10101112)を使用します。 3ビットの funct3 フィールドは、ベクトル命令のサブカテゴリを定義するのに使われます。

10.1. ベクトル算術演算命令エンコーディング

funct3 フィールによりオペランドのタイプとソース位置をエンコードします。

funct3[2:0] カテゴリ オペランド スカラオペランドの型
0 0 0 OPIVV ベクトル-ベクトル N/A
0 0 1 OPFVV ベクトル-ベクトル N/A
0 1 0 OPMVV ベクトル-ベクトル N/A
0 1 1 OPIVI ベクトル-即値 imm[4:0]
1 0 0 OPIVX ベクトル-スカラ GPR x レジスタ rs1
1 0 1 OPFVF ベクトル-スカラ FP f レジスタ rs1
1 1 0 OPMVX ベクトル-スカラ GPR x レジスタ rs1
1 1 1 OPCFG スカラ-即値 GPR x レジスタ rs1 & rs2/imm

整数演算は、オペコードに応じて符号なしまたは2の補数の符号付き整数演算で行われます。

Note: ここでは、固定小数点演算を整数演算とみなします。 すべての標準ベクトル浮動小数点演算は、IEEE-754/2008 規格に準拠しています。 すべてのベクトル浮動小数点演算は、frm レジスタのダイナミック丸めモードを使用します。 丸めモードに依存しない命令であっても、ベクトル浮動小数点演算命令で無効な丸めモードが含まれている場合や、 vl=0 の場合、または vstart ≥ vl の場合の frm フィールドの使用は予約されています。

Note: すべてのベクトル浮動小数点コードは、frm に有効な値があるかどうかに依存します。 実装では、制御ロジックを単純化するために、丸めモードが無効なときにすべてのベクトルFP命令が例外を報告するようにすることができます。 ベクトル演算は、vs2vs1でそれぞれ指定されたベクトルレジスタグループから、 オペランドの2つのベクトルを取ります。

ベクトル・スカラー演算には3つの形式がありますが、いずれの場合も、 vs2 で指定されたベクトルレジスタ群から1つのベクトルのオペランドを取り、 3つの代替ソースのうちの1つから2つ目のスカラーソースのオペランドを取ります。

整数演算の場合、スカラーは rs1 フィールドでエンコードされた5ビットの即値になります。 この値は、特に指定がない限り、SEWビットに符号拡張されます。

整数演算では、スカラーは rs1 で指定されたスカラー x レジスタから取ることができます。 XLEN>SEWの場合、特に指定がない限り、x レジスタの最下位SEWビットが使用されます。 XLEN<SEWの場合、xレジスタからの値はSEWビットに符号拡張されます。 浮動小数点演算の場合、スカラはスカラ f レジスタから取得できます。 FLEN > SEWの場合、fレジスタの値が有効なNaNボックス値であるかどうかがチェックされ、 その場合は`f レジスタの最下位SEWビットが使用され、そうでない場合は正規のNaN値が使用されます。 浮動小数点ベクトルオペランドのEEWがサポートされていない浮動小数点型の幅であるベクトル命令(FLEN < SEWの場合を含む)は予約されています。

Note: 一部の命令では、5ビット即値をゼロ拡張し、アセンブリ構文で即値をuimm命名してこれを示します。

Note: 提案されているZfinxのバリエーションは、x レジスタから浮動小数点のスカラー引数を取ります。 ベクトル演算命令は、vm フィールドの制御下でマスクされます。

# ベクトル2項算術演算命令のアセンブリ構文パタン

# ベクトル演算の結果はvm(v0.t, <指定なし>)によりマスクされる
vop.vv  vd, vs2, vs1, vm  # 整数 ベクトル-ベクトル vd[i] = vs2[i] op vs1[i]
vop.vx  vd, vs2, rs1, vm  # 整数 ベクトル-スカラ   vd[i] = vs2[i] op x[rs1]
vop.vi  vd, vs2, imm, vm  # 整数 ベクトル-即値     vd[i] = vs2[i] op imm

vfop.vv  vd, vs2, vs1, vm # 浮動小数点 ベクトル-ベクトル 演算 vd[i] = vs2[i] fop vs1[i]
vfop.vf  vd, vs2, rs1, vm # 浮動小数点 ベクトル-スカラ 演算   vd[i] = vs2[i] fop f[rs1]

Note: このエンコーディングでは、vs2 が第1オペランドで、rs1/imm が第2オペランドです。 これは、標準的なスカラの順序とは逆です。 この配列は、1つのスカラレジスタのみを読み出す命令は rs1 から読み出すという既存のエンコーディング規約を維持し、 5ビットの即値はrs1フィールドから供給されます。

# ベクトル3項算術演算命令(multiply-add)のアセンブリ構文パタン

# 加算入力値を上書きする整数演算
vop.vv vd, vs1, vs2, vm  # vd[i] = vs1[i] * vs2[i] + vd[i]
vop.vx vd, rs1, vs2, vm  # vd[i] = x[rs1] * vs2[i] + vd[i]

# 乗算入力値を上書きする整数演算
vop.vv vd, vs1, vs2, vm  # vd[i] = vs1[i] * vd[i] + vs2[i]
vop.vx vd, rs1, vs2, vm  # vd[i] = x[rs1] * vd[i] + vs2[i]

# 加算入力値を上書きする浮動小数点演算
vfop.vv vd, vs1, vs2, vm  # vd[i] = vs1[i] * vs2[i] + vd[i]
vfop.vf vd, rs1, vs2, vm  # vd[i] = f[rs1] * vs2[i] + vd[i]

# 乗算入力値を上書きする浮動小数点演算
vfop.vv vd, vs1, vs2, vm  # vd[i] = vs1[i] * vd[i] + vs2[i]
vfop.vf vd, rs1, vs2, vm  # vd[i] = f[rs1] * vd[i] + vs2[i]

Note: 三項乗算加算演算では、アセンブラの構文において常に書き込みベクトルレジスタが最初に置かれ、 次に rs1 または vs1 、そして vs2 の順になります。 この順序では、乗算オペランドが常に隣り合っているため、 これらの三項演算のアセンブラをより自然に読むことができます。