RISC-Vベクトル拡張仕様書の読み直し。ベクトルロード命令の続き。 セグメントアクセスとかが増えてきてこの辺は非常にグロい部分。そもそもEEWとSEWでメモリアクセスは挙動が違うのに、非常に複雑になってしまっている... 他の算術演算と一緒でEEWとSEWを統一してほしいな。
7.7. ユニットストライドFault-Only-Firstロード
ユニットストライドfault-only-first load命令は、データに依存した終了条件を持つループ("while "ループ)をベクトル化するために使用されます。 これらの命令は、要素0で発生した同期例外によるトラップのみを取得することを除いて、 通常のロードと同様に実行されます。 要素 > 0 で例外が発生した場合、対応するトラップは取られず、 ベクタ長 vl は例外が発生したであろう要素のインデックスに縮小されます。
ロード命令は、トラップが報告された要素のインデックスを超えて、アクティブな書き込みベクトルレジスタグループの要素を上書きする可能性があります。 同様に、fault-only-firstのロード命令では、書き込みレジスタの要素が、ベクターの長さを切り詰める原因となる要素を超えて更新されることがあります(ただし、元のベクターの長さを超えることはありません)。 これらの疑似更新の値は、アドレスされたメモリ位置のメモリ内の値と一致する必要はありません。 非占有のメモリ位置は、対応する要素のロード操作がトラップやベクトル長のトリミングによって再起動されないことがわかっている場合にのみアクセスできます。
# ベクトルユニットストライドfault-only-firstロード # vdは書き込みレジスタ, rs1はベースアドレス, vmはマスクエンコーディング (v0.t もしくは<指定なし>) vle8ff.v vd, (rs1), vm # 8-bit ユニットストライドfault-only-firstロード vle16ff.v vd, (rs1), vm # 16-bit ユニットストライドfault-only-firstロード vle32ff.v vd, (rs1), vm # 32-bit ユニットストライドfault-only-firstロード vle64ff.v vd, (rs1), vm # 64-bit ユニットストライドfault-only-firstロード # vle128ff.v vd, (rs1), vm # 128-bit ユニットストライドfault-only-firstロード(予約) # vle256ff.v vd, (rs1), vm # 256-bit ユニットストライドfault-only-firstロード(予約) # vle512ff.v vd, (rs1), vm # 512-bit ユニットストライドfault-only-firstロード(予約) # vle1024ff.v vd, (rs1), vm # 1024-bit ユニットストライドfault-only-firstロード(予約)
Note: fault-on-firstのロードは、有効な実効アドレスを調べるために使用される可能性があるため、 セキュリティ上の懸念があります。 ストライドおよびスキャッター/ギャザーのfault-on-firstロード命令は、エンコーディング空間がないため提供されていません。 また、より大きなセキュリティホールとなる可能性があり、ソフトウェアはトラップを経験することなく、 複数のランダムなページのアクセス性を簡単にチェックすることができます。 ユニットストライド版では、既知の領域とすぐに隣接する領域のプロービングしかできないため、セキュリティに大きな影響はありません。 将来のベクトル拡張では、非連続アクセスの fault-only-first を可能にするセキュリティ緩和策が実装される可能性があります。
例外が発生しない場合でも、実装では vl より少ない要素を処理し、それに応じて vl を減らすことが許可されていますが、 vstart=0 かつ vl>0 の場合は、少なくとも 1 つの要素を処理する必要があります。
fault-on-firstロード命令が割り込みによるトラップを発生する場合、 実装は vl を削減せず、代わりに vstart の値を設定する必要があります。
Note: fault-only-first 命令が最初の要素の後にデバッグ・データ・ウォッチポイント・トラップをトリガーする場合、 実装は vl を減らすのではなく、イベントが失われる可能性があるため、 デバッグ・トラップをトリガーするべきです。
7.8. ベクトルロードストアセグメント命令
この命令サブセットには、ISAの文字列名 Zvlsseg が与えられています。
ベクトルロード/ストアセグメント命令は、メモリ上の複数の連続したフィールドを、 連続した番号のベクトルレジスタとの間で移動します。
Note: これらの操作は、構造体の各フィールドを別々のベクトルレジスタにアンパックすることで、 "構造体の配列"データタイプの操作をサポートします。 ベクトル命令の符号化における3ビットの nf フィールドは、セグメントごとのフィールド数 NFIELDS よりも1つ少ない符号なし整数です。
EMULの設定は、EMUL * NFIELDS ≤ 8となるようにしなければならず、 そうでない場合は、命令のエンコーディングは予約されています。
EMUL * NFIELDSは、セグメント化されたロード/ストア命令でタッチされる基本的なベクトルレジスタの数を表しています。 この制約により、この合計はアーキテクチャレジスタファイルの1/4以下となり、EMUL=8の通常の演算と同じになります。
各フィールドは、連続した番号のベクトルレジスタグループに保持されます。 EMUL>1の場合、各フィールドは複数の連続した番号のベクトルレジスタで保持されるベクトルレジスタグループを占有し、 各フィールドのベクトルレジスタグループは通常のベクトルレジスタアライメント制約に従わなければなりません (例えば、EMUL=2、NFIELDS=4の場合、各フィールドのベクトルレジスタグループは偶数のベクトルレジスタで開始しなければなりませんが、 8の倍数のベクトルレジスタ番号で開始する必要はありません)。
セグメント・ロードまたはストアによってアクセスされるベクトルレジスタ番号が31を超えてインクリメントされる場合、 その命令エンコーディングは予約されています。
Note: この制約は、より多くのアドレス可能なベクトルレジスタを持つ、 将来のより長い命令エンコーディングとの前方互換性を確保するためのものです。 vl レジスタは、移動する構造体の数を示しており、 これは各ベクトルレジスタグループに転送される要素の数と同じです。 マスキングは構造体全体のレベルでも適用されます。
セグメントロードおよびストアでは、各セグメント内のフィールドにアクセスするために使用される個々のメモリアクセスは、 順序付きのインデックス付きのセグメントロードおよびストアであっても、お互いに順序付けられていません。
トラップが発生した場合、vstart は構造体の単位になります。 構造体へのアクセスの途中でトラップが発生した場合、 構造体へのアクセスのサブセットを実行するかどうかは、実装で定義されています。