RISC-Vベクトル拡張仕様書の読み直し。次はベクトル要素スライド命令。
16.2. ベクトルスライド命令
スライド命令は、ベクトルレジスタグループの要素を上下に移動させます。
Note: スライド操作は、任意のレジスタギャザー命令を使用するよりもはるかに効率的に実装できます。 実装では、特定のオフセット値を vslideup および vslidedown に最適化することができます。 特に、2の累乗オフセットは、他のオフセットよりも大幅に高速に動作する可能性があります。
すべての vslideup, vslidedown, v[f]slide1up, v[f]slide1down 命令において、vstart ≥ vl
の場合、 この命令は操作を行わず、書き込みベクトルレジスタを変更せずに残します。
Note: 結論として、 vl=0の時はvstart
に関わらず、書き込みベクトルレジスタのどの要素も更新されません。
末尾要素については、Tail agnostic/undisturbedポリシに基づいて適用されます。
スライド命令はマスクされていて、マスク要素 i が、書き込み 要素 i を書き込むかどうかを制御している場合があります。 非アクティブな要素については、Mask undisturbed/agnosticポリシーに従います。
16.2.1. ベクトルスライドアップ命令
vslideup.vx vd, vs2, rs1, vm # vd[i+rs1] = vs2[i] vslideup.vi vd, vs2, uimm, vm # vd[i+uimm] = vs2[i]
vslideup では、vl の値で、書き込みレジスタの最大要素数を指定します。 書き込みレジスタの開始インデックス (OFFSET) は、rs1 で指定された x レジスタの符号なし整数、 または XLEN ビットにゼロ拡張された 5 ビットの即値のいずれかを使用して指定できます。 XLEN > SEWの場合、OFFSET はSEWビットに切り捨てられません。 マスキングされておらず、かつ、 OFFSET < vl であれば、 OFFSET から vl -1 までの出力要素が書き込まれます。
vslideup の書き込みレジスタ要素の動作 OFFSET is amount to slideup, either from x register or a 5-bit immediate 0 < i < max(vstart, OFFSET) Unchanged max(vstart, OFFSET) <= i < vl vd[i] = vs2[i-OFFSET] if v0.mask[i] enabled vl <= i < VLMAX Follow tail policy
vslideup の書き込みベクトルレジスタグループはソースベクトルレジスタグループと重ならないようにしてください。
Note: オーバーラップしないという制約は、実行中の入力ベクトル上のWARハザードを回避し、非ゼロのvstart
での再起動を可能にします。
16.2.2. ベクトルスライドダウン命令
vslidedown.vx vd, vs2, rs1, vm # vd[i] = vs2[i+rs1] vslidedown.vi vd, vs2, uimm, vm # vd[i] = vs2[i+uimm]
vslidedown では、vl の値は、書き込まれる宛先要素の最大数を指定します。 vl
を過ぎた残りの要素は、現在の末尾ポリシ(Tail Agnostic とVector Mask Agnostic vta と vma 節)に従って処理されます。
ソースの開始インデックス (OFFSET) は、rs1 で指定された x レジスタの符号なし整数を使用して指定するか、 または XLEN ビットまでゼロ拡張された 5 ビットの即値を使用します。 XLEN > SEWの場合、OFFSETはSEWビットに切り捨てられません。
vslidedown behavior for source elements for element i in slide 0 <= i+OFFSET < VLMAX src[i] = vs2[i+OFFSET] VLMAX <= i+OFFSET src[i] = 0 vslidedown behavior for destination element i in slide 0 < i < vstart Unchanged vstart <= i < vl vd[i] = src[i] if v0.mask[i] enabled vl <= i < VLMAX Follow tail policy
16.2.3. ベクトル Slide1up
スライドのバリエーションとして、要素を1つ移動するだけでなく、 空いた要素の位置にスカラーの整数値を挿入できるものが用意されています。
vslide1up.vx vd, vs2, rs1, vm # vd[0]=x[rs1], vd[i+1] = vs2[i] vfslide1up.vf vd, vs2, rs1, vm # vd[0]=f[rs1], vd[i+1] = vs2[i]
vslide1up 命令は、要素0がアクティブであれば、x レジスタの引数を書き込みベクトルレジスタグループの要素0に配置し、 そうでなければ、書き込みベクトル要素の更新は、現在のMask Agnostic/Undisturbed ポリシに従います。 XLEN < SEWの場合、値はSEWビットに符号拡張されます。 XLEN > SEWの場合,最下位のビットがコピーされ、SEW-XLENの上位ビットは無視されます。
残りのアクティブな vl -1 要素は,ソースベクトルレジスタ群のインデックス i から書き込みベクトルレジスタ群のインデックス i+1 にコピーオーバーされます。
vl レジスタはソースの値で更新されるデスティネーション・ベクタ・レジスタ要素の最大数を指定し、 vl
を超えた残りの要素は現在の末尾ポリシ(Tail Agnostic とVector Mask Agnostic vta と vma節)に従って処理されます。
vslide1up behavior i < vstart unchanged 0 = i = vstart vd[i] = x[rs1] if v0.mask[i] enabled max(vstart, 1) <= i < vl vd[i] = vs2[i-1] if v0.mask[i] enabled vl <= i < VLMAX Follow tail policy
vslide1up 命令は、書き込みベクトルレジスタグループがソースのベクトルレジスタグループと重ならないことが必要です。 それ以外の場合は、命令のエンコーディングは予約されています。
vfslide1up 命令は類似して定義されていますが、そのスカラ引数をf
レジスタから供給します。
16.2.4. ベクトル Slide1down 命令
vslide1down 命令は,最初のvl
-1個のアクティブな要素の値を、 ソースベクトルレジスタグループのインデックス i+1 から書き込みベクトルレジスタ群のインデックスiにコピーします。
vl レジスタはソースの値で書き込まれる書き込みベクトルレジスタ要素の最大数を指定し、 vl を超えた残りの要素は現在の末尾ポリシ(Tail Agnostic とVector Mask Agnostic vta と vma節)に従って処理されます。
vslide1down.vx vd, vs2, rs1, vm # vd[i] = vs2[i+1], vd[vl-1]=x[rs1] vfslide1down.vf vd, vs2, rs1, vm # vd[i] = vs2[i+1], vd[vl-1]=f[rs1]
vslide1down 命令は、要素vl-1
がアクティブであれば、xレジスタの引数を書き込みベクトルレジスタの位置
vl -1に置き、 そうでなければ、書き込み要素は変更されません。 XLEN < SEWの場合、値はSEWビットに符号拡張されます。 XLEN > SEWの場合,最下位のビットがコピーされ,SEW-XLENの上位ビットは無視されます。
vslide1down behavior i < vstart unchanged vstart <= i < vl-1 vd[i] = vs2[i+1] if v0.mask[i] enabled vstart <= i = vl-1 vd[vl-1] = x[rs1] if v0.mask[i] enabled vl <= i < VLMAX Follow tail policy
vfslide1down 命令は同様に定義されていますが、スカラー引数はf
レジスタから供給されます。
Note: vslide1down 命令は、メモリを使用せず、他のベクタ・レジスタに影響を与えずに、ベクトルレジスタに値をロードするために使用できます。 これは、デバッガが複数回の vslide1down の呼び出しを繰り返すことで、ゆっくりではありますが、ベクトルレジスタの内容を変更するためのパスを提供します。