RISC-Vベクトル拡張仕様書の読み直し。次はベクトルロード命令。
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が以前は"順序付き"を意味していたように、 既存のソフトウェアの混乱を最小限に抑えることができます。 また、移行中にオペコードを別名として保持することで、ソフトウェアの解約を減らすことができます。