RISC-Vベクトル拡張仕様書の読み直し。Widening / Narrowing 算術演算命令について。この辺も挙動が難しくて死にそうになる命令群。
10.2. 幅拡張ベクトル算術演算命令
いくつかのベクトル演算命令は、書き込みベクトルレジスタグループがEEW=2*SEW
およびEMUL=2*LMUL
を持つ幅拡張 演算が定義されています。
第1ベクトルレジスタグループのオペランドは、単一幅または二倍幅のいずれかです。 これらは通常、オペコードの前に vw というプレフィックスを付けて記述され、 ベクトル浮動小数点演算の場合は vfw となります。
ベクトル幅拡張算術演算命令のアセンブリ構文パタン # 2つの1倍幅ソースで2倍幅の結果: 2*SEW = SEW op SEW vwop.vv vd, vs2, vs1, vm # 整数 vector-vector vd[i] = vs2[i] op vs1[i] vwop.vx vd, vs2, rs1, vm # 整数 vector-scalar vd[i] = vs2[i] op x[rs1] # 1番目のソースオペランドが2倍幅, 2番目のソースオペランドが1倍幅, 結果が2倍幅: 2*SEW = SEW op SEW vwop.wv vd, vs2, vs1, vm # 整数 vector-vector vd[i] = vs2[i] op vs1[i] vwop.wx vd, vs2, rs1, vm # 整数 vector-scalar vd[i] = vs2[i] op x[rs1]
Note: 元々、オペコードにはw
という接尾語が使われていましたが、 2倍幅整数のワードサイズの演算を意味する w という接尾語と混同される恐れがあったため、 w はプレフィックスに移されました。
Note: 浮動小数点の拡大演算は、fw*
と書かれるスカラ拡大浮動小数点演算との整合性をとるために、 vwf*
から vfw*
に変更されました。
Note: 整数の乗算加算では、アキュムレータのサイズを EEW=4*SEW
(すなわち、4*SEW += SEW*SEW
) に増やすという別の幅拡張オプションが考えられます。 これらは4倍にするために、オペコードの前に vq*
という接頭語を付けることで区別されます。 これらは、現時点では含まれていませんが、将来の拡張で追加される可能性があります。
すべての幅拡張命令において、書き込みのEEWおよびEMULの値はサポートされているコンフィギュレーションでなければならず、 そうでない場合は命令のエンコーディングは予約されています。
書き込みベクトルレジスタグループは、書き込みのEMULに有効なベクトルレジスタ番号を使って指定しなければならず、 そうでない場合は命令エンコーディングは予約されます。
Note: この制約は,非ゼロの vstart による再起動をサポートするために必要です。
Note: vw<op>.wv vd, vs2, vs1
形式の命令では、vd が vs2 に等しくても許されます。
10.3. ベクトル幅縮小算術演算命令
2 倍幅のソースベクトルを 1 倍幅の書き込みベクトルに変換する命令がいくつか用意されています。 これらの命令は、EEW/EMUL=2SEW/2LMULのベクトルレジスタグループを、 現在のSEW/LMUL設定のベクトルレジスタグループに変換します。
EEW > ELENまたはEMUL > 8の場合、命令のエンコーディングは予約されています。
Note: 別の設計上の候補は、SEW/LMULをソースベクトルレジスタグループのサイズを定義するものとして扱うことでした。 ここでの選択は、選択されたアプローチがより少ない vtype の変更を必要とするという信念に基づいています。 ソースおよび書き込みベクトルレジスタグループは、ソースおよび書き込みのEMUL値に対してそれぞれ正当な ベクトルレジスタ番号で指定されなければならず、そうでなければ命令エンコーディングは予約されます。
第2のソースベクトルレジスタグループ(vs1
で指定)がある場合、 これは結果と同じ(より狭い)幅を持ちます(すなわち、EEW=SEW)。
Note: 結果と同じEEWとEMULを持つ第2のソースベクトルレジスタ群を上書きしても安全です。
アセンブラでこれらの命令を区別するためにオペコードにvn*
というプレフィックスをつけたり、 浮動小数点オペコードを絞り込むために vfn* というプレフィックスをつけたりします。 2倍幅ソースベクトルレジスタグループは、 ソースオペランドのサフィックスに w を付けて表します(例: vnsra.wv)。
Note: マスク・レジスタを設定する比較演算も、暗黙のうちに幅縮小演算となります。