TI DSP TMS320C66x学习笔记之内联指令(c6x.h中文注释)(六)

/*****************************************************************************/
/*  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是高(奇
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值