upd_v()
、upd_w()
和 upd_x()
内部函数是专为更新矢量寄存器的某些部分而提供的,用于执行 128 位 (v)、256 位 (w) 和 512 位 (x) 更新。
注释: 更新会以新数据覆盖更大的矢量中的一部分,矢量其余部分则保持活动。此更大的矢量中保持活动的部分在执行多次更新期间均保持不变。如有过多矢量保持非必要活动状态,那么可能发生寄存器溢出,并影响性能。
同样,ext_v()
、ext_w()
和 ext_x()
内部函数是专为抽取矢量的某些部分而提供的。
upd_elem()
和 ext_elem()
内部函数是专为更新或抽取个别元素而提供的。如果加载或存储的值并非位于连续存储器位置中,并且需要多个时钟周期才能完成一个矢量的加载或存储,则必须使用这些值。在以下示例中,矢量 v1
的第 0 个元素会以 a
的值来加以更新,该值为 100。
int a = 100;
v4int32 v1 = upd_elem(undef_v4int32(), 0, a);
另一个重要的用法是将数据移至标量单元并执行倒数或平方根运算。在以下示例中,将抽取矢量 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));