ベクター レジスタの一部をアップデートするため、upd_v()
(128 ビット)、upd_w()
(256 ビット)、および upd_x()
(512 ビット) 組み込み関数が提供されています。
注記: アップデートを使用すると、ベクターのその他の部分はアライブ状態に保ちながら、ベクターの一部が新しいデータでアップデートされます。ベクターは、複数のアップデートを実行してもアライブ状態に保持されます。不必要に多くのベクターがアライブ状態に保持されると、レジスタ溢れが発生し、パフォーマンスに影響することがあります。
ベクターの一部を抽出するため、ext_v()
、ext_w()
、および ext_x()
および組み込み関数が提供されています。
個々の要素をアップデートまたは抽出するには、upd_elem()
および ext_elem()
組み込み関数を使用します。これらの組み込み関数は、ロードまたはストアする値が連続のメモリ位置にない場合に使用します。1 つのベクターのロードまたはストアには、複数サイクルかかります。次の例は、ベクター v1
の 0 番目の要素を a
の値である 100 でアップデートします。
int a = 100;
v4int32 v1 = upd_elem(undef_v4int32(), 0, a);
もう 1 つの重要な使用方法は、データをスカラー ユニットに移動し、反転または sqrt を実行することです。次の例は、ベクター vf
の 0 番目の要素を抽出し、スカラー変数 f
に格納します。
v4float vf;
float f=ext_elem(vf,0);
float i_f=invsqrt(f);
shft_elem()
組み込み関数を使用すると、ベクターの冒頭に新しい要素を挿入し、ほかの要素を 1 ずつシフトできます。
アキュムレータ レジスタは、
ups
組み込み関数によりベクター レジスタからアップデートできます。アキュムレータ レジスタは、upd_hi
および upd_lo
組み込み関数で半分アップデートすることも可能です。//From v16int32 to v16acc48
v16int32 v;
v16acc48 acc = upd_lo(acc, ups(ext_w(v, 0), 0));
acc = upd_hi(acc, ups(ext_w(v, 1), 0));