ZHCUAU3J January 2018 – March 2024
C7000 编译器支持向量类型的三态运算符,但是生成的代码将不是最优的,结果将逐通道进行评估。如果 src1
和 src2
是向量,请考虑以下示例:
int16 ex_ternary(int16 src1, int16 src2)
{
return (src1 > src2) ? (src1 - src2) : (src2 - src1);
}
为了生成更优化的代码,您应该改用 c7x.h
运行时支持头文件中列出的向量比较内在函数来构造向量谓词,以及向量选择内在函数 __select(vpred, ...)
。节 5.14.8 中对向量谓语进行了介绍。
或者,使用条件运算,例如 _add (vpred, ...)
和 _sub_cond (vpred, ...)
,来实现与以下示例中所示相同的行为。
int16 ex_ternary_supported(int16 src1, int16 src2)
{
vpred condition =__cmp_gt_pred(src1, src2);
int16 result1 = src1 - src2; // if-clause
int16 result2 = src2 - src1; // else-clause
return __select(condition, result1, result2); // Lane-dependent select operation
}