/*****************************************************************************/
/* C6X.H v7.4.12 */
/*****************************************************************************/
#include "vect.h"
typedef double __float2_t;//__float2_t双精度浮点型
#define _lltof2 _lltod
#define _f2toll _dtoll //将一个__float2_t解释成一个long long
#define _ftof2 _ftod
#define _hif2 _hif
#define _lof2 _lof
#define _f2tol _dtol //将一个__float2_t解释成一个__int40
#define _ltof2 _ltod
#define _amem8_f2 _amemd8 //加载和存储8bytes,指针必须8byte对齐,必须包含c6x.h
#define _amem8_f2_const _amemd8_const //加载8bytes,指针必须8byte对齐,必须包含c6x.h
#define _mem8_f2 _memd8 //从内存里加载一个64位值
#define _mem8_f2_const _memd8_const
#define _fdmv_f2 _fdmv
#define _hif2_128 _hid128
#define _lof2_128 _lod128
#define _f2to128 _dto128
#define _fdmvd_f2 _fdmvd
/*从src2里提取csta和cstb指定的区域且符号扩展到32位。提取出的区域先符号左移再右移。*/
int _ext (int src2, unsigned csta, unsigned cstb);
int _extr (int src2, int src1);//同上,区别左右移的位数由src1的低10位指定
unsigned _extu (unsigned src2, unsigned csta, unsigned cstb);//同上上,区别最后是0扩展到32位
unsigned _extur (unsigned src2, int src1);//同上,区别左右移的位数由src1的低10位指定
/*通过cstb和csta指定需要置1的首位和尾位*/
unsigned _set (unsigned src, unsigned csta, unsigned cstb);
unsigned _setr (unsigned src2, int src1);//将src2中指定位置1,置1的首位和末位有src1的低10位指定
/*通过cstb和csta指定需要清0的首位和尾位*/
unsigned _clr (unsigned src, unsigned csta, unsigned cstb);
unsigned _clrr (unsigned src2, int src1);//将src2中指定位清0,清0的首位和末位有src1的低10位指定
/*将src1和src2相加,且饱和其结果*/
int _sadd (int, int);
__int40_t _lsadd (int, __int40_t);
/*从src1中减去src2并饱和结果*/
int _ssub (int src1, int src2);
__int40_t _lssub (int, __int40_t);
/*将一个40bit的long转换成一个32bit的有符号int,如有需要,对结果进行饱和*/
int _sat (__int40_t);
/*将src2左移src1位,结果饱和在32位*/
int _sshl (int src2, unsigned src1);
/*把src1的高、低16位和src2的高、低16位分别相加,放入结果的高、低16位*/
int _add2 (int, int);
int _sub2 (int, int);/*把src1的高、低16位减去src2的高、低16位,放入结果的高、低16位*/
/*有条件减和左移(常用于除法)*/
unsigned _subc (unsigned, unsigned);
/*搜索src2里面的1或0,1或0是由src1的LSB决定的,返回比特位变换的位数*/
unsigned _lmbd (unsigned src1, unsigned src2);
/*返回src的绝对值*/
int _abs (int src);
__int40_t _labs (__int40_t src);
/*返回src的冗余的符号比特位的个数,bit31是符号位,例如bit31往低位走,01b返回0,001b返回1,0001b返回2,00001b返回3*/
unsigned _norm (int);
unsigned _lnorm (__int40_t);
//16 LSBs * 16 LSBs
int _mpy (int src1, int src2);/*src1和src2相乘,操作数默认为有符号*/
int _mpyus (unsigned src1, int src2);/*无符号src1和有符号src2相乘,S是用来确定哪个是有符号数(S)哪个是无符号数(U)*/
int _mpysu (int, unsigned);
unsigned _mpyu (unsigned, unsigned);
//16 MSBs * 16 MSBs
int _mpyh (int, int);
int _mpyhus (unsigned, int);
int _mpyhsu (int, unsigned);
unsigned _mpyhu (unsigned, unsigned);
//16 MSBs * 16 LSBs
int _mpyhl (int, int);
int _mpyhuls (unsigned, int);
int _mpyhslu (int, unsigned);
//16 LSBs * 16 MSBs
int _mpylh (int, int);
int _mpyluhs (unsigned, int);
int _mpylshu (int, unsigned);
unsigned _mpylhu (unsigned, unsigned);
//与上面的乘法指令区别在何处
/*把src1的低16位和src2的低16位相乘,之后左移一位*/
int _smpy (int src1, int src2);
int _smpyhl (int, int);//高16位 * 低16位
int _smpylh (int, int);//低16位 * 高16位
int _smpyh (int, int);//把src1的高16位和src2的高16位相乘
/*将src1和src2中的2对16位有符号数相乘,然后左移1位,再进行饱和*/
long long _smpy2ll (int, int);
/*32位有符号数乘以32位有符号数,64位的结果左移1位然后饱和,然后将之后的结果的高32位写入dst*/
int _smpy32 (int, int);
/*返回double寄存器的高32位(奇数位寄存器)作为int型*/
unsigned _hi(double);
/*返回double寄存器的高32位(奇数位寄存器)作为float型*/
float _hif(double);
/*返回long long寄存器的高32位(奇数位寄存器)作为int型*/
unsigned _hill(long long);
/*返回double寄存器的低32位(偶数位寄存器)作为int型*/
unsigned _lo(double);
/*返回double寄存器的低32位(偶数位寄存器)作为float型*/
float _lof(double);
/*返回long long寄存器的低32位(偶数位寄存器)作为int型*/
unsigned _loll(long long);
/*创建一个新的double寄存器来保存2个unsigned int的值,其中src2是高(奇数)寄存器,src1是低(偶数)寄存器*/
double _itod(unsigned, unsigned);
/*创建一个新的double寄存器来保存2个float的值,其中src2是高(奇数)寄存器,src1是低(偶数)寄存器*/
double _ftod(float, float);
/*创建一个新的long long寄存器来保存2个unsigned int的值,其中src2是高(奇数)寄存器,src1是低(偶数)寄存器*/
long long _itoll(unsigned src2, unsigned src1);
/*注意不是变换,是直接将寄存器中的值解释成整型或者浮点型*/
float _itof(unsigned); /* 将一个int寄存器重新解释成一个float型 */
unsigned _ftoi(f