ZHCUAU3J January 2018 – March 2024
可以将流地址生成器 (SA) 配置为导致生成包含 0 的 SA 矢量断言,此类断言可用于屏蔽加载或存储的组成部分。当以这种方式配置 SA 并且加载或存储基于 SA 时,除非在程序源代码中明确指定了矢量断言,否则不会指定矢量断言是否应用于操作。
以下定义适用于本节中 SA 和存储器操作的代码示例:
根据这些定义,断言的操作实际上是未断言操作的超集,因为所有未断言操作都可以表示为断言的操作。
如果指针 P1 的值源自另一个指针 P2,则 P1 定义为基于 P2。例如,如果 ptr = __SA0()
,则 ptr
基于 SA0。类似地,如果 ptr1 = __SA0()
且 ptr2 = (ptr1 + 0)
,则 ptr1
和 ptr2
均基于 SA0。
下述 C 示例显示了各种存储和加载操作。对于每种操作类型,都会为需要未断言的操作或允许断言的操作的 SA 配置显示生成定义明确的行为或不明确行为的示例。
存储操作
*__SA0ADV(int16, baseptr) = data; // Normal store
__vstore_packl(__SA0ADV(int8, baseptr), data); // Specialized store
int16 *ptr = __SA0ADV(int16, baseptr);
*ptr = data;
无,因为 SA 配置为仅执行未断言的操作。下面所示的断言的存储操作在这一配置中也定义明确,尽管它们可能会更慢一些。
__vpred vp = __SA0_VPRED(int16);
int16 *ptr = __SA0ADV(int16, baseptr);
__vstore_pred(vp, ptr, data); // Normal store with explicit predication
__vpred vp = __SA0_VPRED(int8);
int8 *ptr = __SA0ADV(int8, baseptr);
__vstore_pred_packl(vp, ptr, data); // Specialized store with explicit predication
*__SA0ADV(int16, baseptr) = data; // May be predicated
__vstore_packl(__SA0ADV(int8, baseptr), data); // May be predicated
int16 *ptr = __SA0ADV(int16, baseptr);
*ptr = data; // May be predicated
加载操作
int16 x = *__SA0ADV(int16, baseptr); // Normal load
ushort32 x = __vload_unpack_short(__SA0ADV(uchar32, baseptr); // Specialized load
int16 *ptr = __SA0ADV(int16, baseptr);
int16 x = *ptr;
无,因为 SA 配置为执行未断言的操作。下面所示的断言的加载操作在这一配置中也定义明确,尽管它们可能会更慢一些。
__vpred vp = __SA0_VPRED(int16);
int16 x = *__SA0ADV(int16, baseptr); // Normal load
x = select(vp, x, (int16)(0)); // Apply predication
__vpred vp = __SA0_VPRED(int16);
int16 *ptr = __SA0ADV(int16, baseptr);
int16 x = __vload_pred(vp, ptr); // Normal load, explicit predication
__vpred vp = __SA0_VPRED(uchar32);
uchar32 *ptr = __SA0ADV(uchar32, baseptr);
ushort32 x = __vload_pred_unpack_short(vp, ptr); // Specialized load, explicit predication
int16 x = *__SA0ADV(int16, baseptr); // May be predicated
ushort32 x = __vload_unpack_short(__SA0ADV(uchar32, baseptr); // May be predicated
int16 *ptr = __SA0ADV(int16, baseptr);
int16 x = *ptr // May be predicated