ZHCUAQ1G June 2015 – August 2025
C6000 编译器可识别多种内在函数运算符。一些汇编语句难以或无法用 C/C++ 表达,而内在函数能够表达这类语句的含义。内在函数的用法与函数类似;可将 C/C++ 变量与这些内在函数结合使用,就像在任何普通函数中一样。
内在函数通过前导下划线指定,可像调用函数一样进行访问。例如:
int x1, x2, y;
y = _sadd(x1, x2);在某些情况下,编译器可能不会使用与内在函数完全对应的汇编语言指令。在这类情况下,程序的含义不会改变。
列举内在函数的表格适用于以下器件系列:
表 8-5 对 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-6 中列出的内在函数能够在所有 C6000 器件上使用。它们对应于所示的 C6000 汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南。
如需特定于 C6740 和 C6600 的内在函数列表,请参阅表 8-7。如需特定于 C6600 的内在函数列表,请参阅表 8-8。
以下表格中列出的某些项目实际上已作为指向内在函数的宏命令在 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-7 中列出的内在函数适用于 C6740 和 C6600 器件,但不适用于 C6400+ 器件。所列内在函数对应于所示的 C6000 汇编语言指令。更多信息,请参阅TMS320C6000 CPU 和指令集参考指南。
如需通用 C6000 内在函数列表,请参阅表 8-6。如需特定于 C6600 的内在函数列表,请参阅表 8-8。
| 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-8中列出的内在函数。这些内在函数是对表 8-6和表 8-7所列内在函数的补充。所列内在函数对应于所示的汇编语言指令。更多信息,请参阅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 异或运算)。 |