ZHCUAQ1F july 2015 – april 2023
表 7-9 列出了能够接受矢量参数并返回矢量结果的内置函数。除非另有规定,否则该函数应用于矢量中的每个元素。也就是说,结果矢量中的每个元素都是将函数应用于源矢量中相应元素的结果。除非另有规定,否则所有参数的矢量类型和返回的矢量必须相同。
函数 | 描述 | 支持的矢量类型 |
---|---|---|
__hadd( x, y ) | 使用 (x + y) >> 1 返回平均值。中间和不会模溢出。x、y 的矢量类型以及返回的矢量必须相同。 | short to short16 uchar to uchar16 |
__rhadd( x, y ) | 使用 (x + y + 1) >> 1 进行四舍五入返回平均值。中间和不会模溢出。 | short to short16 uchar to uchar16 |
__max( x, y ) | 返回所返回矢量的每个元素中 x 和 y 的较大值。 | short to short16 uchar to uchar16 |
__min( x, y ) | 返回所返回矢量的每个元素中 x 和 y 的较小值。 | short to short16 uchar to uchar16 |
__add_sat( x, y ) | 返回 x + y 并使结果饱和。也就是说,如果存在溢出,则返回类型范围内的最大值。 | short to short16 ushort to ushort16 uchar to uchar16 int to int16 |
__sub_sat( x, y ) | 返回 x - y 并使结果饱和。也就是说,如果存在溢出,则返回该类型在范围内的最大值。 | short to short16 int to int16 |
__abs_diff( x, y ) | 使用 | x - y | 返回绝对差值,无溢出。 | uchar to uchar16 |
__abs( x ) | 使用 | x | 返回绝对值 | short to short16 |
__popcount( x ) | 返回 x 中的非零位的数量。 | uchar to uchar16 |
__mpy_ext( x, y ) | 扩展精度乘法。 | short to short16 ushort to ushort16 char to char16 uchar to uchar16 |
__mpy_fx_ext( x, y ) | 定点乘法。 | short to short16 |
__conj_cmpy( x, y ) | 共轭复数乘法。 | cfloat to cfloat8 |
__cmpy_ext( x, y ) | 扩展精度复数乘法。 | cshort to cshort8 |
__cmpyr_fx( x, y ) | 涉及四舍五入的定点复数乘法。 | cshort to cshort8 |
__cmpy_fx( x, y ) | 定点复数乘法。 | cshort to cshort8 cint to cint8 |
__conj_cmpy_fx( x, y ) | 定点共轭复数乘法。(仅 C6600) | cint to cint8 |
__crot90( x ) | 旋转 90 度。(仅 C6600) | cshort to cshort8 |
__crot270( x ) | 旋转 270 度。(仅 C6600) | cshort to cshort8 |
__dot_ext( x, y ) | 使用 x • y 的扩展精度点积。 | short2 因子给出 int 结果 char4 因子给出 int 结果 uchar4 因子给出 uint 结果 short4 因子给出 int 结果(仅 C6600) short4 和 ushort4 因子给出 int 结果(仅 C6600) |
__dot_extll( x, y ) | 使用 x • y 的扩展精度点积。 | short2 因子给出 longlong 结果 short4 因子给出 longlong 结果(仅 C6600) short4 和 ushort4 因子给出 longlong 结果(仅 C6600) |
__dot_fx( x, y ) | 使用 x • y 的定点点积。 | short2 • ushort2 = int |
__gmpy( x, y ) | 伽罗瓦域乘法。 | uchar4 |
__ddot_ext( x, y ) | 扩展精度双向点积。 | short2 • char4 = int4 short8 • short8 = int2 (仅 C6600) short8 • ushort8 = int2 (仅 C6600) |
__mpy_fx( x, y ) | 定点乘法。 | short2 * int = int2 int4 * int4 = int4 (仅 C6600) |
__apply_sign( x, y ) | 使用 x 的符号位来确定是将 y 中的四个 16 位值乘以 1 还是 -1。产生四个有符号 16 位结果。此函数是 _dapys2() 内在函数的别名。(仅 C6600) | short4 |
__cmpy_conj_ext( x, y ) | 扩展精度复数乘法共轭。(仅 C6600) | cshort2 * cshort2 = cint2 |
__cmpy_conj_fx( x, y ) | 定点复数乘法共轭。(仅 C6600) | cshort2 * cshort2 = cshort2 |
__cmatmpy_ext( x, y ) | 扩展精度复数矩阵乘法。(仅 C6600) | cshort2 * cshort4 = cint2 |
__conj_cmatmpy_ext( x, y ) | 扩展精度复数矩阵乘法共轭。(仅 C6600) | cshort2 * cshort4 = cint2 |
__cmatmpy_fx( x, y ) | 定点复数矩阵乘法。(仅 C6600) | cshort2 * cshort4 = cshort2 |
__conj_cmatmpy_fx( x, y ) | 定点复数矩阵乘法共轭。(仅 C6600) | cshort2 * cshort4 = cshort2 |
所有支持的矢量内置函数的原型都列在 "c6x_vec.h" 头文件中,该文件位于“代码生成工具”安装程序的“包含”子目录中。有关矢量内置函数的完整列表,请参阅 "c6x_vec.h"。
以下示例 vbif_ex.c 文件使用带有矢量的 __add_sat() 和 __sub_sat() 内置函数:
#include <stdio.h>
#include <c6x_vec.h>
void print_short4(char *s, short4 v)
{
printf("%s", s);
printf(" <%d, %d, %d, %d>\n", v.x, v.y, v.z, v.w);
}
int main()
{
short4 va = (short4) (1, 2, 3, -32766);
short4 vb = (short4) (5, 32767, -13, 17);
short4 vc = va + vb;
short4 vd = va - vb;
short4 ve = __add_sat(va, vb);
short4 vf = __sub_sat(va, vb);
print_short4("va=", va);
print_short4("vb=", vb);
print_short4("vc=(va+vb)=", vc);
print_short4("vd=(va-vb)=", vd);
print_short4("ve=__add_sat(va,vb)=", ve);
print_short4("vf=__sub_sat(va,vb)=", vf);
return 0;
}
编译示例如下:
%> cl6x -mv6400 --vectypes -o1 -k vbif_ex.c -z -o vbif_ex.out -llnk.cmd
请注意,lnk.cmd 文件包含对 rts6400.lib 的引用。rts6400.libs 库包含 c6x_veclib.obj,其定义了内置函数 __add_sat() 和 __sub_sat()。
运行此示例会生成以下输出:
va= <1, 2, 3, -32766>
vb= <5, 32767, -13, 17>
vc=(va+vb)= <6, -32767, -10, -32749>
vd=(va-vb)= <-4, -32765, 16, 32753>
ve=__add_sat(va,vb)= <6, 32767, -10, -32749>
vf=__sub_sat(va,vb)= <-4, -32765, 16, -32768>