FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (12. ベクトルロード命令のバリエーション1)

RISC-Vベクトル拡張仕様書の読み直し。次はベクトルロード命令。

github.com

github.com


7.3. ベクトルロードストア幅のエンコーディング

ベクトルのロードとストアは、命令に直接EEWがエンコードされています。 対応するEMULはEMUL = (EEW/SEW)*LMULとして計算されます。 EMULが範囲外(EMUL>8またはEMUL<1/8)になる場合は、命令のエンコーディングは予約されます。 ベクトルレジスタグループには、選択されたEMULに対応する正当なレジスタ指定子がなければならず、 それ以外の命令エンコーディングは予約済みとみなされます。

ベクトルユニットストライドおよび定数ストライドでは、データ値に命令でエンコードされたEEW/EMULを使用し、 ベクトルインデックスロードおよびストアでは、インデックス値に命令でエンコードされたEEW/EMULを使用し、 データ値に vtype でエンコードされたSEW/LMULを使用します。

ベクトルのロード・ストアは、標準的なスカラー浮動小数点の ロード・ストアが明示していない幅の値を使ってエンコードされます。

mew ビット(inst[28])は、128ビット以上の拡張メモリサイズをエンコードするために使用されることが期待されますが、 これらのエンコードは現時点では 予約 です。

サポートされているすべてのSEW設定のEEWのベクターロード/ストアは、実装で提供されなければなりません。 サポートされていないEEW幅のベクターロード・ストアエンコーディングは予約済みです。

7.4. ベクトルユニットストライド命令

    # ベクトルユニットストライドロードストア命令

    # vd は書き込みレジスタ, rs1 はベースアドレス, vm はマスクエンコーディング (v0.t or <missing>)
    vle8.v    vd, (rs1), vm  #    8-bit ユニットストライドロード
    vle16.v   vd, (rs1), vm  #   16-bit ユニットストライドロード
    vle32.v   vd, (rs1), vm  #   32-bit ユニットストライドロード
    vle64.v   vd, (rs1), vm  #   64-bit ユニットストライドロード
    # vle128.v  vd, (rs1), vm  #  128-bit ユニットストライドロード、予約済み
    # vle256.v  vd, (rs1), vm  #  256-bit ユニットストライドロード、予約済み
    # vle512.v  vd, (rs1), vm  #  512-bit ユニットストライドロード、予約済み
    # vle1024.v vd, (rs1), vm  # 1024-bit ユニットストライドロード、予約済み

    # vs3はストアデータ, rs1はベースアドレス, vmはマスクエンコーディング (v0.t or <missing>)
    vse8.v    vs3, (rs1), vm  #    8-bit ユニットストライドストア
    vse16.v   vs3, (rs1), vm  #   16-bit ユニットストライドストア
    vse32.v   vs3, (rs1), vm  #   32-bit ユニットストライドストア
    vse64.v   vs3, (rs1), vm  #   64-bit ユニットストライドストア
    # vse128.v  vs3, (rs1), vm  #  128-bit ユニットストライドストア、予約済み
    # vse256.v  vs3, (rs1), vm  #  256-bit ユニットストライドストア、予約済み
    # vse512.v  vs3, (rs1), vm  #  512-bit ユニットストライドストア、予約済み
    # vse1024.v vs3, (rs1), vm  # 1024-bit ユニットストライドストア、予約済み

マスク値をメモリとの間で転送するために、ユニットストライドのロード/ストアが追加されました。 これは、実効ベクトル長が evl=ceil(vl/8) (つまりEMUL=1)であることと、 転送先のレジスタが常にテールアグノスティックポリシーで書き込まれることを除けば、 マスクなしのバイトロード/ストア(EEW=8)と同じ動作をします。

    # ベクトルユニットストライドマスクロード命令
    vlm.v vd, (rs1)   #  ceil(vl/8)バイト長だけバイトデータをロードする

    # ベクトルユニットストライドマスクストア命令
    vsm.v vs3, (rs1)  #  ceil(vl/8)バイト長だけバイトデータをストアする

vlm.v と vsm.v は、vle8.v と vse8.v と同様に width[2:0]=0 でエンコードされますが、 lumop と sumop のエンコードが異なることで区別されます。 vlm.v と vsm.v はバイトロードとストアとして動作するので、 これらの命令では vstart はバイト単位になります。

Note: 以前のアセンブラニーモニックである vle1.v と vse1.v は、 これらの命令と他の要素のロード/ストア命令で長さの扱いが異なるため、混乱を招きました。 ソフトウェアの混乱を避けるために、これらの古いアセンブラニーモニックエイリアスとして残されています。 Note: マスクロード/ストアを提供する主な動機は、 データパス間の配線を減らすためにデータを内部で再配置するマシンをサポートすることです。 また、 vl を変更する必要がないため、マスクのスピル/フィルのコストを削減することができます。

7.5. ベクトルストライド命令

    # ベクトルストライドロードストア命令

    # vdは書き込みレジスタ, rs1はベースレジスタ, rs2はバイトストライド
    vlse8.v    vd, (rs1), rs2, vm  #    8-bit ストライドロード命令
    vlse16.v   vd, (rs1), rs2, vm  #   16-bit ストライドロード命令
    vlse32.v   vd, (rs1), rs2, vm  #   32-bit ストライドロード命令
    vlse64.v   vd, (rs1), rs2, vm  #   64-bit ストライドロード命令
    # vlse128.v  vd, (rs1), rs2, vm  #  128-bit ストライドロード命令、予約済み
    # vlse256.v  vd, (rs1), rs2, vm  #  256-bit ストライドロード命令、予約済み
    # vlse512.v  vd, (rs1), rs2, vm  #  512-bit ストライドロード命令、予約済み
    # vlse1024.v vd, (rs1), rs2, vm  # 1024-bit ストライドロード命令、予約済み

    # vs3 store data, rs1 base address, rs2 byte stride
    vsse8.v    vs3, (rs1), rs2, vm  #    8-bit ストライドストア命令
    vsse16.v   vs3, (rs1), rs2, vm  #   16-bit ストライドストア命令
    vsse32.v   vs3, (rs1), rs2, vm  #   32-bit ストライドストア命令
    vsse64.v   vs3, (rs1), rs2, vm  #   64-bit ストライドストア命令
    # vsse128.v  vs3, (rs1), rs2, vm  #  128-bit ストライドストア命令、予約済み
    # vsse256.v  vs3, (rs1), rs2, vm  #  256-bit ストライドストア命令、予約済み
    # vsse512.v  vs3, (rs1), rs2, vm  #  512-bit ストライドストア命令、予約済み
    # vsse1024.v vs3, (rs1), rs2, vm  # 1024-bit ストライドストア命令、予約済み

負の数のストライドとゼロストライドに対応しています。

ストライド命令内の要素アクセスは、互いに順序付けられていません。

rs2=x0の場合、実装はアクティブな要素の数よりも少ないメモリ操作を実行することが許されますが、必須ではありません。 また、同じ静的に同じ命令の異なる動的な実行において、異なる数のメモリ操作を実行することができます。

Note: すべてのメモリ・アクセスの実行を要求する意図がある場合は、 即時ストライドが 0 のときに rs2 に x0 形式を使用しないように、 コンパイラーは注意しなければなりません。 rs2!=x0 で x[rs2]=0 の場合、実装はアクティブな要素ごとに1回のメモリアクセスを 行わなければなりません(ただし、これらのアクセスは順序付けられません)。

Note: 同じメモリアドレスへの順序付きベクターアクセスを繰り返す必要がある場合は、 順序付きインデックス操作を使用することができます。

7.6. ベクトルインデックス命令

    # ベクトルインデックスロードストア命令

    # ベクトル順序無しインデックスロード命令
    # vdは書き込みベクトルレジスタ, rs1はベースアドレス, vs2はインデックス
    vluxei8.v    vd, (rs1), vs2, vm  # unordered  8-bit SEWデータのインデックスロード命令
    vluxei16.v   vd, (rs1), vs2, vm  # unordered 16-bit SEWデータのインデックスロード命令
    vluxei32.v   vd, (rs1), vs2, vm  # unordered 32-bit SEWデータのインデックスロード命令
    vluxei64.v   vd, (rs1), vs2, vm  # unordered 64-bit SEWデータのインデックスロード命令

    # ベクトル順序付きインデックスロード命令
    # vdは書き込みベクトルレジスタ, rs1はベースアドレス, vs2はインデックス
    vloxei8.v    vd, (rs1), vs2, vm  # ordered  8-bit SEWデータのインデックスロード命令
    vloxei16.v   vd, (rs1), vs2, vm  # ordered 16-bit SEWデータのインデックスロード命令
    vloxei32.v   vd, (rs1), vs2, vm  # ordered 32-bit SEWデータのインデックスロード命令
    vloxei64.v   vd, (rs1), vs2, vm  # ordered 64-bit SEWデータのインデックスロード命令

    # ベクトル順序無しインデックスストア命令
    # vs3はストアデータ, rs1はベースアドレス, vs2はインデックス
    vsuxei8.v   vs3, (rs1), vs2, vm # unordered  8-bit SEWデータのインデックスストア命令
    vsuxei16.v  vs3, (rs1), vs2, vm # unordered 16-bit SEWデータのインデックスストア命令
    vsuxei32.v  vs3, (rs1), vs2, vm # unordered 32-bit SEWデータのインデックスストア命令
    vsuxei64.v  vs3, (rs1), vs2, vm # unordered 64-bit SEWデータのインデックスストア命令

    # ベクトル順序付きインデックスストア命令
    # vs3はストアデータ, rs1はベースアドレス, vs2はインデックス
    vsoxei8.v    vs3, (rs1), vs2, vm  # ordered  8-bit SEWデータのインデックスストア命令
    vsoxei16.v   vs3, (rs1), vs2, vm  # ordered 16-bit SEWデータのインデックスストア命令
    vsoxei32.v   vs3, (rs1), vs2, vm  # ordered 32-bit SEWデータのインデックスストア命令
    vsoxei64.v   vs3, (rs1), vs2, vm  # ordered 64-bit SEWデータのインデックスストア命令

Note: インデックス付きロード/ストアのアセンブラ構文では、 静的にエンコードされたEEWがデータではなくインデックスであることを示すために、 ex の代わりに eix を使用しています。 Note: インデックス付き操作のニーモニックには、順序なしと順序付きを区別するための"U"または"O"がありますが、 他のベクトルアドレッシングモードには文字がありません。 この方法は、一貫性に欠けるかもしれませんが、VSXEIが以前は"順序付き"を意味していたように、 既存のソフトウェアの混乱を最小限に抑えることができます。 また、移行中にオペコードを別名として保持することで、ソフトウェアの解約を減らすことができます。