ZHCUAQ1F july 2015 – april 2023
C6000 编译器可识别多种内在函数运算符。一些汇编语句难以或无法用 C/C++ 表达,而内在函数能够表达这类语句的含义。内在函数的用法与函数类似;可将 C/C++ 变量与这些内在函数结合使用,就像在任何普通函数中一样。
内在函数通过前导下划线指定,可像调用函数一样进行访问。例如:
int x1, x2, y;
y = _sadd(x1, x2);
在某些情况下,编译器可能不会使用与内在函数完全对应的汇编语言指令。在这类情况下,程序的含义不会改变。
列举内在函数的表格适用于以下器件系列:
表 8-4 对 C6000 内在函数进行了汇总,并说明了哪个器件支持哪个内在函数。
内在函数 | C6400+ | C6740 | C6600 |
---|---|---|---|
_abs | 是 | 是 | 是 |
_abs2 | 是 | 是 | 是 |
_add2 | 是 | 是 | 是 |
_add4 | 是 | 是 | 是 |
_addsub | 是 | 是 | 是 |
_addsub2 | 是 | 是 | 是 |
_amem2 | 是 | 是 | 是 |
_amem2_const | 是 | 是 | 是 |
_amem4 | 是 | 是 | 是 |
_amem4_const | 是 | 是 | 是 |
_amem8 | 是 | 是 | 是 |
_amem8_const | 是 | 是 | 是 |
_amem8_f2 | 是 | 是 | 是 |
_amem8_f2_const | 是 | 是 | 是 |
_amemd8 | 是 | 是 | 是 |
_amemd8_const | 是 | 是 | 是 |
_avg2 | 是 | 是 | 是 |
_avgu4 | 是 | 是 | 是 |
_bitc4 | 是 | 是 | 是 |
_bitr | 是 | 是 | 是 |
_ccmatmpy | 是 | ||
_ccmatmpyr1 | 是 | ||
_ccmpy32r1 | 是 | ||
_clr | 是 | 是 | 是 |
_clrr | 是 | 是 | 是 |
_cmatmpy | 是 | ||
_cmatmpyr1 | 是 | ||
_cmpeq2 | 是 | 是 | 是 |
_cmpeg4 | 是 | 是 | 是 |
_cmpgt2 | 是 | 是 | 是 |
_cmpgtu4 | 是 | 是 | 是 |
_cmplt2 | 是 | 是 | 是 |
_cmpltu4 | 是 | 是 | 是 |
_cmpy | 是 | 是 | 是 |
_cmpy32r1 | 是 | ||
_cmpyr | 是 | 是 | 是 |
_cmpyr1 | 是 | 是 | 是 |
_cmpysp | 是 | ||
_complex_conjugate_mpysp | 是 | ||
_complex_mpysp | 是 | ||
_crot270 | 是 | ||
_crot90 | 是 | ||
_dadd | 是 | ||
_dadd2 | 是 | ||
_daddsp | 是 | ||
_dadd_c | 是 | ||
_dapys2 | 是 | ||
_davg2 | 是 | ||
_davgnr2 | 是 | ||
_davgnru4 | 是 | ||
_davgu4 | 是 | ||
_dccmpyr1 | 是 | ||
_dcmpeq2 | 是 | ||
_dcmpeq4 | 是 | ||
_dcmpgt2 | 是 | ||
_dcmpgtu4 | 是 | ||
_dccmpy | 是 | ||
_dcmpy | 是 | ||
_dcmpyr1 | 是 | ||
_dcrot90 | 是 | ||
_dcrot270 | 是 | ||
_ddotp4 | 是 | 是 | 是 |
_ddotp4h | 是 | ||
_ddotph2 | 是 | 是 | 是 |
_ddotph2r | 是 | 是 | 是 |
_ddotpl2 | 是 | 是 | 是 |
_ddotpl2r | 是 | 是 | 是 |
_ddotpsu4h | 是 | ||
_deal | 是 | 是 | 是 |
_dinthsp | 是 | ||
_dinthspu | 是 | ||
_dintsp | 是 | ||
_dintspu | 是 | ||
_dmax2 | 是 | ||
_dmaxu4 | 是 | ||
_dmin2 | 是 | ||
_dminu4 | 是 | ||
_dmpy2 | 是 | ||
_dmpysp | 是 | ||
_dmpysu4 | 是 | ||
_dmpyu2 | 是 | ||
_dmpyu4 | 是 | ||
_dmv | 是 | 是 | 是 |
_dmvd | 是 | ||
_dotp2 | 是 | 是 | 是 |
_dotp4h | 是 | ||
_dotp4hll | 是 | ||
_dotpn2 | 是 | 是 | 是 |
_dotpnrsu2 | 是 | 是 | 是 |
_dotpnrus2 | 是 | 是 | 是 |
_dotprsu2 | 是 | 是 | 是 |
_dotpsu4 | 是 | 是 | 是 |
_dotpus4 | 是 | 是 | 是 |
_dotpsu4h | 是 | ||
_dotpsu4hll | 是 | ||
_dotpu4 | 是 | 是 | 是 |
_dpack2 | 是 | 是 | 是 |
_dpackh2 | 是 | ||
_dpackh4 | 是 | ||
_dpacklh2 | 是 | ||
_dpacklh4 | 是 | ||
_dpackl2 | 是 | ||
_dpackl4 | 是 | ||
_dpackx2 | 是 | 是 | 是 |
_dpint | 是 | 是 | |
_dsadd | 是 | ||
_dsadd2 | 是 | ||
_dshl | 是 | ||
_dshl2 | 是 | ||
_dshr | 是 | ||
_dshr2 | 是 | ||
_dshru | 是 | ||
_dshru2 | 是 | ||
_dsmpy2 | 是 | ||
_dspacku4 | 是 | ||
_dspint | 是 | ||
_dspinth | 是 | ||
_dssub | 是 | ||
_dssub2 | 是 | ||
_dsub | 是 | ||
_dsub2 | 是 | ||
_dsubsp | 是 | ||
_dtol | 是 | 是 | 是 |
_dtoll | 是 | 是 | 是 |
_dxpnd2 | 是 | ||
_dxpnd4 | 是 | ||
_ext | 是 | 是 | 是 |
_extr | 是 | 是 | 是 |
_extu | 是 | 是 | 是 |
_extur | 是 | 是 | 是 |
_f2tol | 是 | 是 | |
_f2toll | 是 | 是 | |
_fabs | 是 | 是 | |
_fabsf | 是 | 是 | |
_fdmvd_f2 | 是 | ||
_fdmv_f2 | 是 | 是 | 是 |
_ftoi | 是 | 是 | 是 |
_gmpy | 是 | 是 | 是 |
_gmpy4 | 是 | 是 | 是 |
_hi | 是 | 是 | 是 |
_hill | 是 | 是 | 是 |
_itod | 是 | 是 | 是 |
_itof | 是 | 是 | 是 |
_itoll | 是 | 是 | 是 |
_labs | 是 | 是 | 是 |
_land | 是 | ||
_landn | 是 | ||
_ldotp2 | 是 | 是 | 是 |
_lmbd | 是 | 是 | 是 |
_lnorm | 是 | 是 | 是 |
_lo | 是 | 是 | 是 |
_loll | 是 | 是 | 是 |
_lor | 是 | ||
_lsadd | 是 | 是 | 是 |
_lssub | 是 | 是 | 是 |
_ltod | 是 | 是 | 是 |
_lltod | 是 | 是 | 是 |
_lltof2 | 是 | 是 | |
_ltof2 | 是 | 是 | |
_max2 | 是 | 是 | 是 |
_maxu4 | 是 | 是 | 是 |
_mfence | 是 | ||
_min2 | 是 | 是 | 是 |
_minu4 | 是 | 是 | 是 |
_mem2 | 是 | 是 | 是 |
_mem2_const | 是 | 是 | 是 |
_mem4 | 是 | 是 | 是 |
_mem4_const | 是 | 是 | 是 |
_mem8 | 是 | 是 | 是 |
_mem8_const | 是 | 是 | 是 |
_mem8_f2 | 是 | 是 | |
_mem8_f2_const | 是 | 是 | |
_memd8 | 是 | 是 | 是 |
_memd8_const | 是 | 是 | 是 |
_mpy | 是 | 是 | 是 |
_mpy2ir | 是 | 是 | 是 |
_mpy2ll | 是 | 是 | 是 |
_mpy32 | 是 | 是 | 是 |
_mpy32ll | 是 | 是 | 是 |
_mpy32su | 是 | 是 | 是 |
_mpy32u | 是 | 是 | 是 |
_mpy32us | 是 | 是 | 是 |
_mpyh | 是 | 是 | 是 |
_mpyhill | 是 | 是 | 是 |
_mpyihll | 是 | 是 | 是 |
_mpyilll | 是 | 是 | 是 |
_mpyhir | 是 | 是 | 是 |
_mpyihr | 是 | 是 | 是 |
_mpyilr | 是 | 是 | 是 |
_mpyhl | 是 | 是 | 是 |
_mpyhlu | 是 | 是 | 是 |
_mpyhslu | 是 | 是 | 是 |
_mpyhsu | 是 | 是 | 是 |
_myphu | 是 | 是 | 是 |
_mpyhuls | 是 | 是 | 是 |
_mpyhus | 是 | 是 | 是 |
_mpyidll | 是 | 是 | |
_mpylh | 是 | 是 | 是 |
_mpylhu | 是 | 是 | 是 |
_mpylill | 是 | 是 | 是 |
_mpylir | 是 | 是 | 是 |
_mpylshu | 是 | 是 | 是 |
_mpyluhs | 是 | 是 | 是 |
_mpysp2dp | 是 | 是 | |
_mpyspdp | 是 | 是 | |
_mpysu | 是 | 是 | 是 |
_mpysu4ll | 是 | 是 | 是 |
_mpyus4ll | 是 | 是 | 是 |
_mpyu | 是 | 是 | 是 |
_mpyu2 | 是 | ||
_mpyu4ll | 是 | 是 | 是 |
_mpyus | 是 | 是 | 是 |
_mvd | 是 | 是 | 是 |
_nassert | 是 | 是 | 是 |
_norm | 是 | 是 | 是 |
_pack2 | 是 | 是 | 是 |
_packh2 | 是 | 是 | 是 |
_packh4 | 是 | 是 | 是 |
_packhl2 | 是 | 是 | 是 |
_packl4 | 是 | 是 | 是 |
_packlh2 | 是 | 是 | 是 |
_qmpy32 | 是 | ||
_qmpysp | 是 | ||
_qsmpy32r1 | 是 | ||
_rcpdp | 是 | 是 | |
_rcpsp | 是 | 是 | |
_rsqrdp | 是 | 是 | |
_rsqrsp | 是 | 是 | |
_rotl | 是 | 是 | 是 |
_rpack2 | 是 | 是 | 是 |
_sadd | 是 | 是 | 是 |
_sadd2 | 是 | 是 | 是 |
_saddsub | 是 | 是 | 是 |
_saddsub2 | 是 | 是 | 是 |
_saddu4 | 是 | 是 | 是 |
_saddus2 | 是 | 是 | 是 |
_saddsu2 | 是 | 是 | 是 |
_sat | 是 | 是 | 是 |
_set | 是 | 是 | 是 |
_setr | 是 | 是 | 是 |
_shfl | 是 | 是 | 是 |
_shfl3 | 是 | 是 | 是 |
_shl2 | 是 | ||
_shlmb | 是 | 是 | 是 |
_shr2 | 是 | 是 | 是 |
_shrmb | 是 | 是 | 是 |
_shru2 | 是 | 是 | 是 |
_smpy | 是 | 是 | 是 |
_smpy2ll | 是 | 是 | 是 |
_smpy32 | 是 | 是 | 是 |
_smpyh | 是 | 是 | 是 |
_smpyhl | 是 | 是 | 是 |
_smpylh | 是 | 是 | 是 |
_spack2 | 是 | 是 | 是 |
_spacku4 | 是 | 是 | 是 |
_spint | 是 | 是 | |
_sshl | 是 | 是 | 是 |
_sshvl | 是 | 是 | 是 |
_sshvr | 是 | 是 | 是 |
_ssub | 是 | 是 | 是 |
_ssub2 | 是 | 是 | 是 |
_sub2 | 是 | 是 | 是 |
_sub4 | 是 | 是 | 是 |
_subabs4 | 是 | 是 | 是 |
_subc | 是 | 是 | 是 |
_swap2 | 是 | 是 | 是 |
_swap4 | 是 | 是 | 是 |
_unpkbu4 | 是 | ||
_unpkh2 | 是 | ||
_unpkhu2 | 是 | ||
_unpkhu4 | 是 | 是 | 是 |
_unpklu4 | 是 | 是 | 是 |
_xorll_c | 是 | ||
_xormpy | 是 | 是 | 是 |
_xpnd2 | 是 | 是 | 是 |
_xpnd4 | 是 | 是 | 是 |
表 8-5 中列出的内在函数能够在所有 C6000 器件上使用。它们对应于所示的 C6000 汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南。
如需特定于 C6740 和 C6600 的内在函数列表,请参阅表 8-6。如需特定于 C6600 的内在函数列表,请参阅表 8-7。
以下表格中列出的某些项目实际上已作为指向内在函数的宏命令在 c6x.h 头文件中定义。此头文件位于编译器的“include”目录中。您的代码必须包含此头文件,才能使用所述的宏命令。
C/C++ 编译器内在函数 | 汇编 指令 | 说明 |
---|---|---|
int _abs (int src); __int40_t _labs (__int40_t src); | ABS | 返回 src 的饱和绝对值 |
int _abs2 (int src); | ABS2 | 计算每个 16 位值的绝对值 |
int _add2 (int src1, int src2); | ADD2 | 将 src1 的上半部分和下半部分加到 src2 的上半部分和下半部分并返回结果。下半部分相加的任何溢出均不影响上半部分相加。 |
int _add4 (int src1, int src2); | ADD4 | 对几对打包的 8 位数字执行二进制补码加法 |
long long _addsub (int src1, int src2); | ADDSUB | 并行执行加法和减法。 |
long long _addsub2 (int src1, int src2); | ADDSUB2 | 并行执行 ADD2 和 SUB2。 |
ushort & _amem2 (void *ptr); | LDHU STH | 允许对齐加载 2 个字节并将其存储至存储器。指针必须与两字节边界对齐。(1) |
const ushort & _amem2_const (const void *ptr); | LDHU | 允许从存储器对齐加载 2 个字节。指针必须与两字节边界对齐。(1) |
unsigned & _amem4 (void *ptr); | LDW STW | 允许对齐加载 4 个字节并将其存储至存储器。指针必须与四字节边界对齐。(1) |
const unsigned & _amem4_const (const void *ptr); | LDW | 允许从存储器对齐加载 4 个字节。指针必须与四字节边界对齐。(1) |
long long & _amem8 (void *ptr); | LDDW STDW | 允许对齐加载 8 个字节并将其存储至存储器。指针必须与八字节边界对齐。将使用 LDDW 或 STDW 指令。 |
const long long & _amem8_const (const void *ptr); | LDW/LDW LDDW | 允许从存储器对齐加载 8 个字节。指针必须与八字节边界对齐。(2) |
__float2_t & _amem8_f2(void * ptr); | LDDW STDW | 允许对齐加载 8 个字节并将其存储至存储器。指针必须与八字节边界对齐。这被定义为一个宏命令。必须包含 c6x.h。(2)(1) |
const __float2_t & _amem8_f2_const(void * ptr); | LDDW | 允许从存储器对齐加载 8 个字节。指针必须与八字节边界对齐。这被定义为一个宏命令。必须包含 c6x.h。(2)(1) |
double & _amemd8 (void *ptr); | LDDW STDW | 允许对齐加载 8 个字节并将其存储至存储器。指针必须与八字节边界对齐。(1)(2) 将使用 LDDW 或 STDW 指令。 |
const double & _amemd8_const (const void *ptr); | LDW/LDW LDDW | 允许从存储器对齐加载 8 个字节。指针必须与八字节边界对齐。(1)(2) |
int _avg2 (int src1, int src2); | AVG2 | 计算每对有符号 16 位值的平均值 |
unsigned _avgu4 (unsigned src1, unsigned src2); | AVGU4 | 计算每对无符号 8 位值的平均值 |
unsigned _bitc4 (unsigned src); | BITC4 | 对于 src 中的每个 8 位数量,该数目的 1 位会写入返回值中的对应位置 |
unsigned _bitr (unsigned src); | BITR | 反转位的顺序 |
unsigned _clr (unsigned src2, unsigned csta, unsigned cstb); | CLR | 清除 src2 中的指定字段。要清除字段的起始位和结束位分别由 csta 和 cstb 指定。 |
unsigned _clrr (unsigned src2, int src1); | CLR | 清除 src2 中的指定字段。要清除字段的起始位和结束位由 src1 的低 10 位指定。 |
int _cmpeq2 (int src1, int src2); | CMPEQ2 | 对每对 16 位值执行等式比较。等式结果被打包至返回值的两个最低有效位。 |
int _cmpeq4 (int src1, int src2); | CMPEQ4 | 对每对 8 位值执行等式比较。等式结果被打包至返回值的四个最低有效位。 |
int _cmpgt2 (int src1, int src2); | CMPGT2 | 比较每对有符号 16 位值。结果被打包至返回值的两个最低有效位。 |
unsigned _cmpgtu4 (unsigned src1, unsigned src2); | CMPGTU4 | 比较每对无符号 8 位值。结果被打包至返回值的四个最低有效位。 |
int _cmplt2 (int src1, int src2); | CMPLT2 | 交换操作数并调用 _cmpgt2。这被定义为一个宏命令。必须包含 c6x.h。 |
unsigned _cmpltu4 (unsigned src1, unsigned src2); | CMPLTU4 | 交换操作数并调用 _cmpgtu4。这被定义为一个宏命令。必须包含 c6x.h。 |
long long _cmpy (unsigned src1, unsigned src2); unsigned _cmpyr (unsigned src1, unsigned src2); unsigned _cmpyr1 (unsigned src1, unsigned src2 ); | CMPY CMPYR CMPYR1 | 执行各种复数乘法运算。 |
long long _ddotp4 (unsigned src1, unsigned src2); | DDOTP4 | 同时执行两个 DOTP2 运算。 |
long long _ddotph2 (long long src1, unsigned src2); long long _ddotpl2 (long long src1, unsigned src2); unsigned _ddotph2r (long long src1, unsigned src2); unsigned _ddotpl2r (long long src1, unsigned src2); | DDOTPH2 DDOTPL2 DDOTPH2R DDOTPL2 | 对两对有符号 16 位打包值执行各种双点积运算。 |
unsigned _deal (unsigned src); | DEAL | 将 src 的偶数位和奇数位分别提取到两个 16 位值中。 |
long long _dmv (int src1, int src2); | DMV | 将 src1 置于超长整型值的 32 个 MSB 中,将 src2 置于超长整型值的 32 个 LSB 中。另请参阅 _itoll()。 |
int _dotp2 (int src1, int src2); __int40_t _ldotp2 (int src1, int src2); | DOTP2 DOTP2 | src1 和 src2 的有符号低 16 位值之积加上 src1 和 src2 的有符号高 16 位值之积。在使用 _dotp2 的情况下,有符号结果会被写入单个 32 位寄存器。在使用 _ldotp2 的情况下,有符号结果会被写入一个 64 位寄存器对。 |
int _dotpn2 (int src1, int src2); | DOTPN2 | src1 和 src2 的有符号高 16 位值之积减去 src1 和 src2 的有符号低 16 位值之积。 |
int _dotpnrsu2 (int src1, unsigned src2); | DOTPNRSU2 | src1 和 src2 的高 16 位值之积减去 src1 和 src2 的低 16 位值之积。src1 中的值被视为有符号打包数量;src2 中的值被视为无符号打包数量。2^15 相加,结果为向右移 16 位的符号。 |
int _dotpnrus2 (unsigned src1, int src2); | DOTPNRUS2 | 交换操作数并调用 _dotpnrsu2。这被定义为一个宏命令。必须包含 c6x.h。 |
int _dotprsu2 (int src1, unsigned src2); | DOTPRSU2 | src1 和 src2 的低 16 位值之积加上 src1 和 src2 的高 16 位值之积。src1 中的值被视为有符号打包数量;src2 中的值被被视为无符号打包数量。2^15 相加,结果为移动 16 位的符号。 |
int _dotpsu4 (int src1, unsigned src2); int _dotpus4 (unsigned src1, int src2); unsigned _dotpu4 (unsigned src1, unsigned src2); | DOTPSU4 DOTPUS4 DOTPU4 | 对于 src1 和 src2 中的每对 8 位值,将 src1 中的 8 位值乘以 src2 中的 8 位值。将四个乘积相加。 _dotpus4 被定义为一个宏命令。必须包含 c6x.h。 |
long long _dpack2 (unsigned src1, unsigned src2); | DPACK2 | 并行执行 PACK2 和 PACKH2 运算。 |
long long _dpackx2 (unsigned src1, unsigned src2); | DPACKX2 | 并行执行 PACKLH2 和 PACKX2 运算。 |
__int40_t _dtol (double src); | 将双精度寄存器对重新解释为一个 __int40_t(存储为寄存器对)。 | |
long long _dtoll (double src); | 将双精度寄存器对 src 重新解释为一个超长整型寄存器对。 | |
int _ext (int src2, unsigned csta, unsigned cstb); | EXT | 提取 src2 中的指定字段,并加符号扩展至 32 位。提取操作通过先向左移位再有符号向右移位来执行;csta 和 cstb 分别为向左移位和向右移位的位数。 |
int _extr (int src2, int src1); | EXT | 提取 src2 中的指定字段,并加符号扩展至 32 位。提取操作通过先向左移位再有符号向右移位来执行;向左移位和向右移位的位数由 src1 的低 10 位指定。 |
unsigned _extu (unsigned src2, unsigned csta , unsigned cstb); | EXTU | 提取 src2 中的指定字段,并加零扩展至 32 位。提取操作通过先向左移位再无符号向右移位来执行;csta 和 cstb 分别为向左移位和向右移位的位数。 |
unsigned _extur (unsigned src2, int src1); | EXTU | 提取 src2 中的指定字段,并加零扩展至 32 位。提取操作通过先向左移位再无符号向右移位来执行;向左移位和向右移位的位数由 src1 的低 10 位指定。 |
__float2_t _fdmv_f2(float src1, float src2); | DMV | 将 src1 置于 __float2_t 的 32 个 LSB 中并将 src2 置于 __float2_t 的 32 个 MSB 中。另请参阅 _itoll()。这被定义为一个宏命令。必须包含 c6x.h。 |
unsigned _ftoi (float src); | 将浮点型中的位重新解释为无符号值。例如: _ftoi (1.0) == 1065353216U | |
unsigned _gmpy (unsigned src1, unsigned src2); | GMPY | 执行伽罗瓦域乘法。 |
int _gmpy4 (int src1, int src2); | GMPY4 | 对 src1 中的四个值与 src2 中的四个并行值执行伽罗瓦域乘法。四个乘积被打包至返回值中。 |
unsigned _hi (double src); | 返回双精度寄存器对的高位(奇数)寄存器 | |
unsigned _hill (long long src); | 返回超长整型寄存器对的高位(奇数)寄存器 | |
double _itod (unsigned src2, unsigned src1); | 通过重新解释两个无符号值来构建一个新的双精度寄存器对,其中 src2 为高位(奇数)寄存器,而 src1 为低位(偶数)寄存器 | |
float _itof (unsigned src); | 将无符号型中的位重新解释为浮点值。例如: _itof (0x3f800000) = 1.0 | |
long long _itoll (unsigned src2, unsigned src1); | 通过重新解释两个无符号值来构建一个新的超长整型寄存器对,其中 src2 为高位(奇数)寄存器,而 src1 为低位(偶数)寄存器 | |
unsigned _lmbd (unsigned src1, unsigned src2); | LMBD | 搜索 src2 的最左侧 1 或 0,具体由 src1 的 LSB 决定。返回最多到变更位的位数。 |
unsigned _lo (double src); | 返回一个双精度寄存器对的低位(偶数)寄存器 | |
unsigned _loll (long long src); | 返回超长整型寄存器对的低位(偶数)寄存器 | |
double _ltod (__int40_t src); | 将一个 __int40_t 寄存器对 src 重新解释为一个双精度寄存器对。 | |
double _lltod (long long src); | 将超长整型寄存器对 src 重新解释为一个双精度寄存器对。 | |
int _max2 (int src1, int src2); int _min2 (int src1, int src2); unsigned _maxu4 (unsigned src1, unsigned src2); unsigned _minu4 (unsigned src1, unsigned src2); | MAX2 MIN2 MAXU4 MINU4 | 将每对值中的较大值/较小值置于返回值中的相应位置。值可以是 16 位有符号值或 8 位无符号值。 |
ushort & _mem2 (void * ptr); | LDB/LDB STB/STB | 允许未对齐加载 2 个字节并将其存储至存储器(1) |
const ushort & _mem2_const (const void * ptr); | LDB/LDB | 允许将 2 个字节未对齐加载到存储器(1) |
unsigned & _mem4 (void * ptr); | LDNW STNW | 允许未对齐加载 4 个字节并将其存储至存储器(1) |
const unsigned & _mem4_const (const void * ptr); | LDNW | 允许从存储器未对齐加载 4 个字节(1) |
long long & _mem8 (void * ptr); | LDNDW STNDW | 允许未对齐加载 8 个字节并将其存储至存储器(1) |
const long long & _mem8_const (const void * ptr); | LDNDW | 允许从存储器未对齐加载 8 个字节(1) |
double & _memd8 (void * ptr); | LDNDW STNDW | 允许未对齐加载 8 个字节并将其存储至存储器(2)(1) |
const double & _memd8_const (const void * ptr); | LDNDW | 允许从存储器未对齐加载 8 个字节(2)(1) |
int _mpy (int src1, int src2); int _mpyus (unsigned src1, int src2); int _mpysu (int src1, unsigned src2); unsigned _mpyu (unsigned src1, unsigned src2); | MPY MPYUS MPYSU MPYU | 将 src1 的 16 个 LSB 乘以 src2 的 16 个 LSB 并返回结果。值可以为有符号值或无符号值。 |
long long _mpy2ir (int src1, int src2); | MPY2IR | 执行两个 16 x 32 乘法。两个结果都向右移 15 位以得到舍入结果。 |
long long _mpy2ll (int src1, int src2); | MPY2 | 返回 src1 和 src2 中低 16 位值和高 16 位值之积 |
int _mpy32 (int src1, int src2); | MPY32 | 返回 32 x 32 乘法的 32 个 LSB。 |
long long _mpy32ll (int src1, int src2); long long _mpy32su (int src1, int src2); long long _mpy32us (unsigned src1, int src2); long long _mpy32u (unsigned src1, unsigned src2); | MPY32 MPY32SU MPY32US MPY32U | 返回 32 x 32 乘法的全部 64 位。值可以为有符号值或无符号值。 |
int _mpyh (int src1, int src2); int _mpyhus (unsigned src1, int src2); int _mpyhsu (int src1, unsigned src2); unsigned _mpyhu (unsigned src1, unsigned src2); | MPYH MPYHUS MPYHSU MPYHU | 将 src1 的 16 个 MSB 乘以 src2 的 16 个 MSB 并返回结果。值可以为有符号值或无符号值。 |
long long _mpyhill (int src1, int src2); long long _mpylill (int src1, int src2); | MPYHI MPYLI | 生成有符号 16 x 32 乘法。结果将保存在返回类型的低 48 位中。可以使用 src1 的高或低 16 位。 |
int _mpyhir (int src1, int src2); int _mpylir (int src1, int src2); | MPYHIR MPYLIR | 生成有符号 16 x 32 乘法。结果会向右移 15 位。可以使用 src1 的高或低 16 位。 |
int _mpyhl (int src1, int src2); int _mpyhuls (unsigned src1, int src2); int _mpyhslu (int src1, unsigned src2); unsigned _mpyhlu (unsigned src1, unsigned src2); | MPYHL MPYHULS MPYHSLU MPYHLU | 将 src1 的 16 个 MSB 乘以 src2 的 16 个 LSB 并返回结果。值可以为有符号值或无符号值。 |
long long _mpyihll (int src1, int src2); long long _mpyilll (int src1, int src2); | MPYIH MPYIL | 交换操作数并调用 _mpyhill。这被定义为一个宏命令。必须包含 c6x.h。 交换操作数并调用 _mpylill。这被定义为一个宏命令。必须包含 c6x.h。 |
int _mpyihr (int src1, int src2); int _mpyilr (int src1, int src2); | MPYIHR MPYILR | 交换操作数并调用 _mpyhir。这被定义为一个宏命令。必须包含 c6x.h。 交换操作数并调用 _mpylir。这被定义为一个宏命令。必须包含 c6x.h。 |
int _mpylh (int src1, int src2); int _mpyluhs (unsigned src1, int src2); int _mpylshu (int src1, unsigned src2); unsigned _mpylhu (unsigned src1, unsigned src2); | MPYLH MPYLUHS MPYLSHU MPYLHU | 将 src1 的 16 个 LSB 乘以 src2 的 16 个 MSB 并返回结果。值可以为有符号值或无符号值。 |
long long _mpysu4ll (int src1, unsigned src2); long long _mpyus4ll (unsigned src1, int src2); long long _mpyu4ll (unsigned src1, unsigned src2); | MPYSU4 MPYUS4 MPYU4 | 对于 src1 和 src2 中的每个 8 位数值,执行 8 位 x 8 位乘法。四个 16 位结果被打包至一个 64 位结果。结果可以是有符号值或无符号值。 _mpyus4ll 被定义为一个宏命令。必须包含 c6x.h。 |
int _mvd (int src2); | MVD | 使用乘法器流水线在四个周期内将数据从 src2 移到返回值 |
void _nassert (int src); | 不生成任何代码。告诉优化器,通过 assert 函数声明的表达式为 true;这可以提示优化器什么样的优化可能有效。 | |
unsigned _norm (int src); unsigned _lnorm (__int40_t src); | NORM | 返回最多到 src 第一个非冗余符号位的位数。 |
unsigned _pack2 (unsigned src1, unsigned src2); unsigned _packh2 (unsigned src1, unsigned src2); | PACK2 PACKH2 | src1 和 src2 的下半字/上半字将保存在返回值中。 |
unsigned _packh4 (unsigned src1, unsigned src2); unsigned _packl4 (unsigned src1, unsigned src2); | PACKH4 PACKL4 | 将备用字节打包至返回值。可以打包高位或低位字节。 |
unsigned _packhl2 (unsigned src1, unsigned src2); unsigned _packlh2 (unsigned src1, unsigned src2); | PACKHL2 PACKLH2 | src1 的上半字/下半字将保存在返回值的上半字中。src2 的下半字/上半字将保存在返回值的下半字中。 |
unsigned _rotl (unsigned src1, unsigned src2); | ROTL | 将 src1 向左旋转 src2 中指定的量 |
int _rpack2 (int src1, int src2); | RPACK2 | 将 src1 和 src2 向左移 1 位并进行饱和处理。移位后 src1 的 16 个 MSB 将保存在 32 位输出的 16 个 MSB 中。移位后 src2 的 16 个 MSB 将保存在 32 位输出的 16 个 LSB 中。 |
int _sadd (int src1, int src2); __int40_t _lsadd (int src1, __int40_t src2); | SADD | 将 src1 和 src2 相加并对结果进行饱和处理。返回结果。 |
int _sadd2 (int src1, int src2); int _saddus2 (unsigned src1, int src2); int _saddsu2 (int src1, unsigned src2); | SADD2 SADDUS2 SADDSU2 | 在 src1 和 src2 中的 16 位值对之间执行饱和加法。src1 的值可以是有符号值或无符号值。 _saddsu2 被定义为一个宏命令。必须包含 c6x.h。 |
long long _saddsub (unsigned src1, unsigned src2); | SADDSUB | 并行执行饱和加法与饱和减法。 |
long long _saddsub2 (unsigned src1, unsigned src2); | SADDSUB2 | 并行执行 SADD2 和 SSUB2。 |
unsigned _saddu4 (unsigned src1, unsigned src2); | SADDU4 | 在 src1 和 src2 中的 8 位无符号值对之间执行饱和加法。 |
int _sat (__int40_t src2); | SAT | 将 40 位长整型值转换为 32 位有符号整型值并在必要时使其饱和。 |
unsigned _set (unsigned src2, unsigned csta , unsigned cstb); | SET | 将 src2 中的指定字段全部设置位 1 并返回 src2 值。要设置字段的起始位和结束位分别由 csta 和 cstb 指定。 |
unsigned _setr (unit src2, int src1); | SET | 将 src2 中的指定字段全部设置位 1 并返回 src2 值。要设置字段的起始位和结束位由 src1 的低 10 位指定。 |
unsigned _shfl (unsigned src2); | SHFL | src2 的低 16 位将保存在偶数位处,而 src 的高 16 位将保存在奇数位处。 |
long long _shfl3 (unsigned src1, unsigned src2); | SHFL3 | 从 src1 取出两个 16 位值并从 src2 取出 16 个 LSB 来执行 3 路交错,从而得到一个 48 位结果。 |
unsigned _shlmb (unsigned src1, unsigned src2); unsigned _shrmb (unsigned src1, unsigned src2); | SHLMB SHRMB | 将 src2 向左/向右移动一个字节,并且 src1 的最高/最低有效字节会合并到最低/最高有效字节位置。 |
int _shr2 (int src1, unsigned src2); unsigned _shru2 (unsigned src1, unsigned src2); | SHR2 SHRU2 | 对于 src1 中的每个 16 位数,该数均会以算术或逻辑方法向右移动 src2 位数。src1 可以包含有符号值或无符号值。 |
int _smpy (int src1, int src2); int _smpyh (int src1, int src2); int _smpyhl (int src1, int src2); int _smpylh (int src1, int src2); | SMPY SMPYH SMPYHL SMPYLH | 将 src1 乘以 src2,再将结果向左移 1 位并返回结果。如果结果为 0x80000000,则将结果饱和处理为 0x7FFFFFFF |
long long _smpy2ll (int src1, int src2); | SMPY2 | 对几对有符号打包 16 位值执行 16 位乘法,再向左多移动 1 位,并饱和处理为 64 位结果。 |
int _smpy32 (int src1, int src2); | SMPY32 | 返回 32 x 32 乘法向左移 1 位后的 32 个 MSB。 |
int _spack2 (int src1, int src2); | SPACK2 | 将两个有符号 32 位值饱和处理为 16 位值并打包到返回值 |
unsigned _spacku4 (int src1, int src2); | SPACKU4 | 将四个有符号 16 位值饱和处理为 8 位值并打包到返回值 |
int _sshl (int src2, unsigned src1); | SSHL | 将 src2 向左移动 src1 中所含内容对应的位数,将结果饱和处理为 32 位,然后返回结果 |
int _sshvl (int src2, int src1); int _sshvr (int src2, int src1); | SSHVL SSHVR | 将 src2 向左/向右移动 src1 位。如果移动后的值大于 MAX_INT 或小于 MIN_INT,则对结果进行饱和处理。 |
int _ssub (int src1, int src2); __int40_t _lssub (int src1, __int40_t src2); | SSUB | 从 src1 中减去 src2,对结果进行饱和处理,然后返回结果。 |
int _ssub2 (int src1, int src2); | SSUB2 | 从 src1 的上半部分和下半部分中减去 src2 的上半部分和下半部分并对每个结果进行饱和处理。 |
int _sub4 (int src1, int src2); | SUB4 | 对几对打包的 8 位值执行二进制补码减法 |
int _subabs4 (int src1, int src2); | SUBABS4 | 计算每对打包无符号 8 位值之差的绝对值 |
unsigned _subc (unsigned src1, unsigned src2); | SUBC | 条件减法除法步骤 |
int _sub2 (int src1, int src2); | SUB2 | 从 src1 的上半部分和下半部分中减去 src2 的上半部分和下半部分并返回结果。下半部分减法中的借位不影响上半部分减法。 |
unsigned _swap4 (unsigned src); | SWAP4 | 交换每个 16 位值内的字节对(字节序交换)。 |
unsigned _swap2 (unsigned src); | SWAP2 | 调用 _packlh2。这被定义为一个宏命令。必须包含 c6x.h。 |
unsigned _unpkhu4 (unsigned src); | UNPKHU4 | 将两个高位无符号 8 位值解压到无符号打包 16 位值 |
unsigned _unpklu4 (unsigned src); | UNPKLU4 | 将两个低位无符号 8 位值解压到无符号打包 16 位值 |
unsigned _xormpy (unsigned src1, unsigned src2); | XORMPY | 执行伽罗瓦域乘法 |
unsigned _xpnd2 (unsigned src); | XPND2 | src 的位 1 和位 0 会分别复制到结果的上半字和下半字。 |
unsigned _xpnd4 (unsigned src); | XPND4 | src 的位 3 和位 0 会复制到结果的字节 3 至 0。 |
表 8-6 中列出的内在函数适用于 C6740 和 C6600 器件,但不适用于 C6400+ 器件。所列内在函数对应于所示的 C6000 汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南。
如需通用 C6000 内在函数列表,请参阅表 8-5。如需特定于 C6600 的内在函数列表,请参阅表 8-7。
C/C++ 编译器内在函数 | 汇编指令 | 说明 |
---|---|---|
int _dpint (double src); | DPINT | 使用由 CSR 寄存器设置的舍入模式,将 64 位双精度值转换为 32 位有符号整型值。 |
__int40_t _f2tol(__float2_t src); | 将一个 __float2_t 寄存器对 src 重新解释为一个 __int40_t(存储为寄存器对)。这被定义为一个宏命令。必须包含 c6x.h。 | |
__float2_t _f2toll(__float2_t src); | 将一个 __float2_t 寄存器对重新解释为一个超长整型寄存器对。这被定义为一个宏命令。必须包含 c6x.h。 | |
double _fabs (double src); float _fabsf (float src); | ABSDP ABSSP | 返回 src 的绝对值。 |
__float2_t _lltof2(long long src); | 将一个超长整型寄存器对重新解释为一个 __float2_t 寄存器对。这被定义为一个宏命令。必须包含 c6x.h。 | |
__float2_t _ltof2(__int40_t src); | 将一个 __int40_t 寄存器对重新解释为一个 __float2_t 寄存器对。这被定义为一个宏命令。必须包含 c6x.h。 | |
__float2_t & _mem8_f2(void * ptr); | LDNDW STNDW | 允许未对齐加载 8 个字节并将其存储至存储器。(1)这被定义为一个宏命令。必须包含 c6x.h。 |
const __float2_t & _mem8_f2_const(void * ptr); | LDNDW STNDW | 允许从存储器未对齐加载 8 个字节。(1)这被定义为一个宏命令。必须包含 c6x.h。 |
long long _mpyidll (int src1, int src2); | MPYID | 生成有符号整数乘法。结果被保存在一个寄存器对中。 |
double_mpysp2dp (float src1, float src2); | MPYSP2DP | 生成双精度浮点乘法。结果被保存在一个寄存器对中。 |
double_mpyspdp (float src1, double src2); | MPYSPDP | 生成双精度浮点乘法。结果被保存在一个寄存器对中。 |
double _rcpdp (double src); | RCPDP | 计算近似的 64 位双精度倒数。 |
float _rcpsp (float src); | RCPSP | 计算近似的 32 位浮点倒数。 |
double _rsqrdp (double src); | RSQRDP | 计算近似的 64 位双精度平方根倒数。 |
float _rsqrsp (float src); | RSQRSP | 计算近似的 32 位浮点平方根倒数。 |
int _spint (float src); | SPINT | 使用由 CSR 寄存器设置的舍入模式,将 32 位浮点值转换为 32 位有符号整型值。 |
仅 C6600 器件支持表 8-7中列出的内在函数。这些内在函数是对表 8-5和表 8-6所列内在函数的补充。所列内在函数对应于所示的汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南。
C/C++ 编译器内在函数 | 汇编指令 | 说明 |
---|---|---|
ADDDP | 不存在内在函数。使用 C 语言原生函数 a + b,其中 a 和 b 为双精度值。 | |
ADDSP | 不存在内在函数。使用 C 语言原生函数 a + b,其中 a 和 b 为浮点值。 | |
AND | 不存在内在函数:使用 C 语言原生函数"a & b",其中 a 和 b 为超长整型值。 | |
ANDN | 不存在内在函数:使用 C 语言原生函数"a & ~b",其中 a 和 b 为超长整型值。 | |
FMPYDP | 不存在内在函数。使用 C 语言原生函数 a * b,其中 a 和 b 为双精度值。 | |
OR | 不存在内在函数:使用 C 语言原生函数"a | b",其中 a 和 b 为超长整型值。 | |
SUBDP | 不存在内在函数。使用 C 语言原生函数 a - b,其中 a 和 b 为双精度值。 | |
SUBSP | 不存在内在函数。使用 C 语言原生函数 a - b,其中 a 和 b 为浮点值。 | |
XOR | 不存在内在函数:使用 C 语言原生函数"a ^ b",其中 a 和 b 为超长整型值。另请参阅 _xorll_c()。 | |
__x128_t _ccmatmpy (long long src1, __x128_t src2); | CCMATMPY | 将共轭的 1x2 复数向量乘以 2x2 复数矩阵,生成两个 64 位结果。有关 __x128_t 容器类型的详细信息,请参阅节 8.6.7。 |
long long _ccmatmpyr1 (long long src1, __x128_t src2); | CCMATMPYR1 | 将复共轭的 1x2 复数向量乘以 2x2 复数矩阵,生成两个 32 位复数结果。 |
long long _ccmpy32r1 (long long src1, long long src2); | CCMPY32R1 | 32 位共轭复数乘以 Q31 数并进行舍入处理。 |
__x128_t _cmatmpy (long long src1, __x128_t src2); | CMATMPY | 将 1x2 向量乘以 2x2 复数矩阵,生成两个 64 位复数结果。 |
long long _cmatmpyr1 (long long src1, __x128_t src2); | CMATMPYR1 | 将 1x2 复数向量乘以 2x2 复数矩阵,生成两个 32 位复数结果。 |
long long _cmpy32r1 (long long src1, long long src2); | CMPY32R1 | 32 位复数乘以 Q31 数字并进行舍入处理。 |
__x128_t _cmpysp (__float2_t src1, __float2_t src2); | CMPYSP | 对两个复数的复数乘法执行乘法运算(另请参阅 _complex_mpysp 和 _complex_conjugate_mpysp。) |
double _complex_conjugate_mpysp (double src1, double src2); | CMPYSP DSUBSP | 通过执行 CMPYSP 和 DSUBSP 来执行复数共轭乘法。 |
double _complex_mpysp (double src1, double src2); | CMPYSP DADDSP | 通过执行 CMPYSP 和 DADDSP 来执行复数乘法。 |
int _crot90 (int src); | CROT90 | 将复数旋转 90 度。 |
int _crot270 (int src); | CROT270 | 将复数旋转 270 度。 |
long long _dadd (long long src1, long long src2); | DADD | 对有符号 32 位值进行两路 SIMD 加法,生成两个有符号 32 位结果。 |
long long _dadd2 (long long src1, long long src2); | DADD2 | 对打包的有符号 16 位值进行四路 SIMD 加法,生成四个有符号 16 位结果。(两路 _add2) |
__float2_t _daddsp (__float2_t src1, __float2_t src2); | DADDSP | 对 32 位单精度数字进行两路 SIMD 加法。 |
long long _dadd_c (scst5 immediate src1, long long src2); | DADD | 将两个有符号 32 位值与 src2 中的一个常数(-16 至 15)相加,生成两个有符号 32 位结果。 |
long long _dapys2 (long long src1, long long src2); | DAPYS2 | 使用 src1 的符号位确定是将 src2 中的四个 16 位值乘以 1 还是 -1。产生四个有符号 16 位结果。(如果 src1 和 src2 是同一寄存器对,则相当于两路 _abs2。) |
long long _davg2 (long long src1, long long src2); | DAVG2 | 对有符号 16 位值求四路 SIMD 平均值并进行舍入处理。(两路 _avg2) |
long long _davgnr2 (long long src1, long long src2); | DAVGNR2 | 对有符号 16 位值求四路 SIMD 平均值但不进行舍入处理。 |
long long _davgnru4 (long long src1, long long src2); | DAVGNRU4 | 对无符号 8 位值求八路 SIMD 平均值但不进行舍入处理。 |
long long _davgu4 (long long src1, long long src2); | DAVGU4 | 对无符号 8 位值求八路 SIMD 平均值并进行舍入处理。(两路 _avgu4) |
long long _dccmpyr1 (long long src1, long long src2); | DCCMPYR1 | 对 src2 的共轭复数进行两路 SIMD 复数乘法并进行舍入处理 (_cmpyr1)。 |
unsigned _dcmpeq2 (long long src1, long long src2); | DCMPEQ2 | 对有符号 16 位值进行四路 SIMD 比较。结果被打包至返回值的四个最低有效位。(两路 _cmpeq2) |
unsigned _dcmpeq4 (long long src1, long long src2); | DCMPEQ4 | 对无符号 8 位值进行八路 SIMD 比较。结果被打包至返回值的八个最低有效位。(两路 _cmpeq4) |
unsigned _dcmpgt2 (long long src1, long long src2); | DCMPGT2 | 对有符号 16 位值进行四路 SIMD 比较。结果被打包至返回值的四个最低有效位。(两路 _cmpgt2) |
unsigned _dcmpgtu4 (long long src1, long long src2); | DCMPGTU4 | 对无符号 8 位值进行八路 SIMD 比较。结果被打包至返回值的八个最低有效位。(两路 _cmpgtu4) |
__x128_t _dccmpy (long long src1, long long src2); | DCCMPY | 对两组打包的复数与 src2 的共轭复数执行两个复数乘法运算。 |
__x128_t _dcmpy (long long src1, long long src2); | DCMPY | 对两组打包的复数执行两个复数乘法运算。(两路 SIMD _cmpy) |
long long _dcmpyr1 (long long src1, long long src2); | DCMPYR1 | 两路 SIMD 复数乘法并进行舍入处理 (_cmpyr1)。 |
long long _dcrot90 (long long src); | DCROT90 | _crot90 的两路 SIMD 版本。 |
long long _dcrot270 (long long src); | DCROT270 | _crot270 的两路 SIMD 版本。 |
long long _ddotp4h (__x128_t src1, __x128_t src2 ); | DDOTP4H | 对四组打包的 16 位值执行两个点积运算。(两路 _dotp4h) |
long long _ddotpsu4h (__x128_t src1, __x128_t src2 ); | DDOTPSU4H | 对四组打包的 16 位值执行两个点积运算。(两路 _dotpsu4h) |
__float2_t _dinthsp (int src); | DINTHSP | 将两个打包的有符号 16 位值转换为两个单精度浮点值。 |
__float2_t _dinthspu (unsigned src); | DINTHSPU | 将两个打包的无符号 16 位值转换为两个单精度浮点值。 |
__float2_t _dintsp(long long src); | DINTSP | 将两个 32 位有符号整数转换为两个单精度浮点值。 |
__float2_t _dintspu(long long src); | DINTSPU | 将两个 32 位无符号整数转换为两个单精度浮点值。 |
long long _dmax2 (long long src1, long long src2); | DMAX2 | 对 16 位有符号值进行四路 SIMD 取最大值,生成四个有符号 16 位结果。(两路 _max2) |
long long _dmaxu4 (long long src1, long long src2); | DMAXU4 | 对无符号 8 位值进行 8 路 SIMD 取最大值,生成八个无符号 8 位结果。(两路 _maxu4) |
long long _dmin2 (long long src1, long long src2); | DMIN2 | 对 16 位有符号值进行四路 SIMD 取最小值,生成四个有符号 16 位结果。(两路 _min2) |
long long _dminu4 (long long src1, long long src2); | DMINU4 | 对无符号 8 位值进行 8 路 SIMD 取最小值,生成八个无符号 8 位结果。(两路 _minu4) |
__x128_t _dmpy2 (long long src1, long long src2); | DMPY2 | 对 16 位有符号值进行四路 SIMD 乘法,生成四个有符号 32 位结果。(两路 _mpy2) |
__float2_t _dmpysp (__float2_t src1, __float2_t src2); | DMPYSP | 两路单精度浮点乘法,生成两个单精度结果。 |
__x128_t _dmpysu4 (long long src1, long long src2); | DMPYSU4 | 对 8 位有符号值与 8 位无符号值执行八路 SIMD 乘法,生成八个有符号 16 位结果。(两路 _mpysu4) |
__x128_t _dmpyu2 (long long src1, long long src2); | DMPYU2 | 对 16 位无符号值进行四路 SIMD 乘法,生成四个无符号 32 位结果。(两路 _mpyu2) |
__x128_t _dmpyu4 (long long src1, long long src2); | DMPYU4 | 对 8 位有符号值进行八路 SIMD 乘法,生成八个有符号 16 位结果。(两路 _mpyu4) |
long long _dmvd (int src1, int src2 ); | DMVD | 将 src1 置于超长整型低位寄存器中,将 src2 置于超长整型高位寄存器中。执行四个周期。另请参阅 _dmv()、_fdmv_f2 和 _itoll()。 |
int _dotp4h (long long src1, long long src2 ); | DOTP4H | 将两组四个有符号 16 位值相乘并返回 32 位和。 |
long long _dotp4hll (long long src1, long long src2 ); | DOTP4H | 将两组四个有符号 16 位值相乘并返回 64 位和。 |
int _dotpsu4h (long long src1, long long src2); | DOTPSU4H | 将四个有符号 16 位值与四个无符号 16 值相乘并返回 32 位和。 |
long long _dotpsu4hll (long long src1, long long src2); | DOTPSU4H | 将四个有符号 16 位值与四个无符号 16 值相乘并返回 64 位和。 |
long long _dpackh2 (long long src1, long long src2); | DPACKH2 | 两路 _packh2。 |
long long _dpackh4 (long long src1, long long src2); | DPACKH4 | 两路 _packh4。 |
long long _dpacklh2 (long long src1, long long src2); | DPACKLH2 | 两路 _packlh2。 |
long long _dpacklh4 (unsigned src1, unsigned src2); | DPACKLH4 | 执行 _packl4 和 _packh4。_packl4 的输出保存在结果的低位寄存器中,而 _packh4 的输出保存在结果的高位寄存器中。 |
long long _dpackl2 (long long src1, long long src2); | DPACKL2 | 两路 _packl2。 |
long long _dpackl4 (long long src1, long long src2); | DPACKL4 | 两路 _packl4。 |
long long _dsadd (long long src1, long long src2); | DSADD | 对有符号 32 位值进行两路 SIMD 饱和加法,生成两个有符号 32 位结果。(两路 _sadd) |
long long _dsadd2 (long long src1, long long src2); | DSADD2 | 对有符号 16 位值进行四路 SIMD 饱和加法,生成四个有符号 16 位结果。(两路 _sadd2) |
long long _dshl (long long src1, unsigned src2); | DSHL | 使两个有符号 32 位值向左移位,位数等于 src2 参数中的单个值。 |
long long _dshl2 (long long src1, unsigned src2); | DSHL2 | 使四个有符号 16 位值向左移位,位数等于 src2 参数中的单个值。(两路 _shl2) |
long long _dshr (long long src1, unsigned src2); | DSHR | 使两个有符号 32 位值向右移位,位数等于 src2 参数中的单个值。 |
long long _dshr2 (long long src1, unsigned src2); | DSHR2 | 使四个有符号 16 位值向右移位,位数等于 src2 参数中的单个值。(两路 _shr2) |
long long _dshru (long long src1, unsigned src2); | DSHRU | 使两个无符号 32 位值向右移位,位数等于 src2 参数中的单个值。 |
long long _dshru2 (long long src1, unsigned src2); | DSHRU2 | 使四个无符号 16 位值向右移位,位数等于 src2 参数中的单个值。(两路 _shru2) |
__x128_t _dsmpy2 (long long src1, long long src2); | DSMPY2 | 对有符号 16 位值执行四路 SIMD 乘法,再向左移 1 位并进行饱和处理,生成四个有符号 32 位结果。(两路 _smpy2) |
long long _dspacku4 (long long src1, long long src2); | DSPACKU4 | 两路 _spacku4。 |
long long _dspint (__float2_t src); | DSPINT | 将两个打包的单精度浮点值转换为两个有符号 32 位值。 |
unsigned _dspinth (__float2_t src); | DSPINTH | 将两个打包的单精度浮点值转换为两个打包的有符号 16 位值。 |
long long _dssub (long long src1, long long src2); | DSSUB | 对 32 位有符号值进行两路 SIMD 饱和减法,生成两个有符号 32 位结果。 |
long long _dssub2 (long long src1, long long src2); | DSSUB2 | 对有符号 16 位值进行四路 SIMD 饱和减法,生成四个有符号 16 位结果。(两路 _ssub2) |
long long _dsub (long long src1, long long src2); | DSUB | 对 32 位有符号值进行两路 SIMD 减法,生成两个有符号 32 位结果。 |
long long _dsub2 (long long src1, long long src2); | DSUB2 | 对有符号 16 位值进行四路 SIMD 减法,生成四个有符号 16 位结果。(两路 _sub2) |
__float2_t _dsubsp (__float2_t src1, __float2_t src2); | DSUBSP | 对 32 位单精度数进行两路 SIMD 减法。 |
long long _dxpnd2 (unsigned src); | DXPND2 | 将四个低位展开到四个 16 位字段。 |
long long _dxpnd4 (unsigned src); | DXPND4 | 将八个低位展开到八个 8 位字段。 |
__float2_t _fdmvd_f2(float src1, float src2); | DMVD | 将 src1 置于 __float2_t 的低位寄存器中并将 src2 置于 __float2_t 的高位寄存器中。执行四个周期。另请参阅 _dmv()、_dmvd() 和 _itoll()。这被定义为一个宏命令。必须包含 c6x.h。 |
int _land (int src1, int src2); | LAND | 对 src1 和 src2 进行逻辑与运算。 |
int _landn (int src1, int src2); | LANDN | 对 src1 进行逻辑与运算并对 src2 进行逻辑非运算;例如,src1 AND ~src2。 |
int _lor (int src1, int src2); | LOR | 对 src1 和 src2 进行逻辑或运算。 |
void _mfence(); | MFENCE | 在存储器系统繁忙期间使 CPU 停顿。 |
long long _mpyu2 (unsigned src1, unsigned src2 ); | MPYU2 | 对 16 位无符号值进行两路 SIMD 乘法,生成两个无符号 32 位结果。 |
__x128_t _qmpy32 (__x128_t src1, __x128_t src2); | QMPY32 | 对 32 位有符号值进行四路 SIMD 乘法,生成四个 32 位结果。(四路 _mpy32) |
__x128_t _qmpysp (__x128_t src1, __x128_t src2); | QMPYSP | 进行四路 SIMD 32 位单精度乘法,生成四个 32 位单精度结果。 |
__x128_t _qsmpy32r1 (__x128_t src1, __x128_t src2); | QSMPY32R1 | 进行 4 路 SIMD 小数 32 位 x 32 位乘法,其中每个结果值均会向右移 31 位并进行舍入处理。在 Q31 小数体系中,这会将结果归一化到 -1 和 1 之间。 |
unsigned _shl2 (unsigned src1, unsigned src2); | SHL2 | 将两个有符号 16 位值向左移位,位数等于 src2 参数中的单个值。 |
long long _unpkbu4 (unsigned src); | UNPKBU4 | 将四个 8 位无符号值解压到四个 16 位无符号值。(另请参阅 _unpklu4 和 _unpkhu4) |
long long _unpkh2 (unsigned src); | UNPKH2 | 将两个有符号 16 位值解压到两个有符号 32 位值。 |
long long _unpkhu2 (unsigned src); | UNPKHU2 | 将两个无符号 16 位值解压到两个无符号 32 位值。 |
long long _xorll_c (scst5 immediate src1, long long src2); | XOR | 对 src1 与 src2 的高 32 位和低 32 位部分执行异或运算(对常数执行 SIMD 异或运算)。 |