FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (23. ベクトルスライド命令)

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 の呼び出しを繰り返すことで、ゆっくりではありますが、ベクトルレジスタの内容を変更するためのパスを提供します。