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

Mars_WH   2016-3-29 10:33 楼主
  1. /*****************************************************************************/  
  2. /*  C6X.H v7.4.12                                                            */  
  3. /*****************************************************************************/  
  4.   
  5. #include "vect.h"  
  6.   
  7.   
  8.   typedef double   __float2_t;//__float2_t双精度浮点型  
  9.   
  10.   #define _lltof2  _lltod  
  11.   #define _f2toll  _dtoll    //将一个__float2_t解释成一个long long  
  12.   #define _ftof2   _ftod  
  13.   #define _hif2    _hif  
  14.   #define _lof2    _lof  
  15.   #define _f2tol   _dtol     //将一个__float2_t解释成一个__int40  
  16.   #define _ltof2   _ltod  
  17.   
  18.   #define _amem8_f2          _amemd8       //加载和存储8bytes,指针必须8byte对齐,必须包含c6x.h  
  19.   #define _amem8_f2_const    _amemd8_const //加载8bytes,指针必须8byte对齐,必须包含c6x.h  
  20.   #define _mem8_f2           _memd8        //从内存里加载一个64位值  
  21.   #define _mem8_f2_const     _memd8_const  
  22.   #define _fdmv_f2           _fdmv  
  23.   #define _hif2_128          _hid128  
  24.   #define _lof2_128          _lod128  
  25.   #define _f2to128           _dto128  
  26.   #define _fdmvd_f2          _fdmvd  
  27.   
  28.   
  29.   
  30.   
  31.   
  32. /*从src2里提取csta和cstb指定的区域且符号扩展到32位。提取出的区域先符号左移再右移。*/  
  33. int       _ext     (int src2,      unsigned csta, unsigned cstb);  
  34. int       _extr    (int src2,      int src1);//同上,区别左右移的位数由src1的低10位指定  
  35. unsigned  _extu    (unsigned src2, unsigned csta, unsigned cstb);//同上上,区别最后是0扩展到32位  
  36. unsigned  _extur   (unsigned src2, int src1);//同上,区别左右移的位数由src1的低10位指定  
  37.   
  38. /*通过cstb和csta指定需要置1的首位和尾位*/  
  39. unsigned  _set     (unsigned src, unsigned csta, unsigned cstb);  
  40. unsigned  _setr    (unsigned src2, int src1);//将src2中指定位置1,置1的首位和末位有src1的低10位指定  
  41.   
  42. /*通过cstb和csta指定需要清0的首位和尾位*/  
  43. unsigned  _clr     (unsigned src, unsigned csta, unsigned cstb);  
  44. unsigned  _clrr    (unsigned src2, int src1);//将src2中指定位清0,清0的首位和末位有src1的低10位指定  
  45.   
  46. /*将src1和src2相加,且饱和其结果*/  
  47. int       _sadd    (int,      int);  
  48. __int40_t _lsadd   (int, __int40_t);  
  49. /*从src1中减去src2并饱和结果*/  
  50. int       _ssub    (int src1,      int src2);  
  51. __int40_t _lssub   (int, __int40_t);  
  52.   
  53. /*将一个40bit的long转换成一个32bit的有符号int,如有需要,对结果进行饱和*/  
  54. int       _sat     (__int40_t);  
  55.   
  56. /*将src2左移src1位,结果饱和在32位*/  
  57. int       _sshl    (int src2,      unsigned src1);  
  58. /*把src1的高、低16位和src2的高、低16位分别相加,放入结果的高、低16位*/  
  59. int       _add2    (int,      int);  
  60. int       _sub2    (int,      int);/*把src1的高、低16位减去src2的高、低16位,放入结果的高、低16位*/  
  61.   
  62. /*有条件减和左移(常用于除法)*/  
  63. unsigned  _subc    (unsigned, unsigned);  
  64. /*搜索src2里面的1或0,1或0是由src1的LSB决定的,返回比特位变换的位数*/  
  65. unsigned  _lmbd    (unsigned src1, unsigned src2);  
  66. /*返回src的绝对值*/  
  67. int       _abs     (int src);  
  68. __int40_t _labs    (__int40_t src);  
  69.   
  70. /*返回src的冗余的符号比特位的个数,bit31是符号位,例如bit31往低位走,01b返回0,001b返回1,0001b返回2,00001b返回3*/  
  71. unsigned  _norm    (int);  
  72. unsigned  _lnorm   (__int40_t);  
  73.   
  74.   
  75. //16 LSBs * 16 LSBs  
  76. int       _mpy     (int src1,      int src2);/*src1和src2相乘,操作数默认为有符号*/  
  77. int       _mpyus   (unsigned src1, int src2);/*无符号src1和有符号src2相乘,S是用来确定哪个是有符号数(S)哪个是无符号数(U)*/  
  78. int       _mpysu   (int,      unsigned);  
  79. unsigned  _mpyu    (unsigned, unsigned);  
  80. //16 MSBs * 16 MSBs  
  81. int       _mpyh    (int,      int);  
  82. int       _mpyhus  (unsigned, int);  
  83. int       _mpyhsu  (int,      unsigned);  
  84. unsigned  _mpyhu   (unsigned, unsigned);  
  85. //16 MSBs * 16 LSBs  
  86. int       _mpyhl   (int,      int);  
  87. int       _mpyhuls (unsigned, int);  
  88. int       _mpyhslu (int,      unsigned);  
  89. //16 LSBs * 16 MSBs  
  90. int       _mpylh   (int,      int);  
  91. int       _mpyluhs (unsigned, int);  
  92. int       _mpylshu (int,      unsigned);  
  93. unsigned  _mpylhu  (unsigned, unsigned);  
  94. //与上面的乘法指令区别在何处  
  95. /*把src1的低16位和src2的低16位相乘,之后左移一位*/  
  96. int       _smpy    (int src1,      int src2);  
  97. int       _smpyhl  (int,      int);//高16位 * 低16位  
  98. int       _smpylh  (int,      int);//低16位 * 高16位  
  99. int       _smpyh   (int,      int);//把src1的高16位和src2的高16位相乘  
  100. /*将src1和src2中的2对16位有符号数相乘,然后左移1位,再进行饱和*/  
  101. long long _smpy2ll   (int,      int);  
  102. /*32位有符号数乘以32位有符号数,64位的结果左移1位然后饱和,然后将之后的结果的高32位写入dst*/  
  103. int       _smpy32    (int,       int);  
  104.   
  105.   
  106. /*返回double寄存器的高32位(奇数位寄存器)作为int型*/  
  107. unsigned  _hi(double);  
  108. /*返回double寄存器的高32位(奇数位寄存器)作为float型*/  
  109. float     _hif(double);  
  110. /*返回long long寄存器的高32位(奇数位寄存器)作为int型*/  
  111. unsigned  _hill(long long);  
  112. /*返回double寄存器的低32位(偶数位寄存器)作为int型*/  
  113. unsigned  _lo(double);  
  114. /*返回double寄存器的低32位(偶数位寄存器)作为float型*/  
  115. float     _lof(double);  
  116. /*返回long long寄存器的低32位(偶数位寄存器)作为int型*/  
  117. unsigned  _loll(long long);  
  118.   
  119. /*创建一个新的double寄存器来保存2个unsigned int的值,其中src2是高(奇数)寄存器,src1是低(偶数)寄存器*/  
  120. double    _itod(unsigned, unsigned);  
  121. /*创建一个新的double寄存器来保存2个float的值,其中src2是高(奇数)寄存器,src1是低(偶数)寄存器*/  
  122. double    _ftod(float,    float);  
  123. /*创建一个新的long long寄存器来保存2个unsigned int的值,其中src2是高(奇数)寄存器,src1是低(偶数)寄存器*/  
  124. long long _itoll(unsigned src2, unsigned src1);  
  125.   
  126. /*注意不是变换,是直接将寄存器中的值解释成整型或者浮点型*/  
  127. float     _itof(unsigned);      /* 将一个int寄存器重新解释成一个float型      */  
  128. unsigned  _ftoi(float);         /* 将float的比特位解释成unsigned int         */  
  129. __int40_t _dtol(double);        /* 将一个double寄存器重新解释成一个_int40_t型*/  
  130. double    _ltod(__int40_t);     /* 将一个__int40_t寄存器重新解释成一个double型*/  
  131. long long _dtoll(double);       /* 将一个double寄存器重新解释成一个long long型*/  
  132. double    _lltod(long long);    /* 将一个long long寄存器重新解释成double型    */  
  133.   
  134.   
  135.   /* Define pseudo intrinsics for some pseudo instructions */  
  136.   #ifndef _cmplt2  
  137.   #define _cmplt2(src1, src2) _cmpgt2((src2), (src1))  
  138.   #endif  
  139.   #ifndef _cmpltu4  
  140.   #define _cmpltu4(src1, src2) _cmpgtu4((src2), (src1))  
  141.   #endif  
  142.   #ifndef _dotpnrus2  
  143.   #define _dotpnrus2(src1, src2) _dotpnrsu2((src2), (src1))  
  144.   #endif  
  145.   #ifndef _dotpus4  
  146.   #define _dotpus4(src1, src2) _dotpsu4((src2), (src1))  
  147.   #endif  
  148.   #ifndef _mpyihll  
  149.   #define _mpyihll(src1, src2) _mpyhill((src2), (src1))  
  150.   #endif  
  151.   #ifndef _mpyihr  
  152.   #define _mpyihr(src1, src2) _mpyhir((src2), (src1))  
  153.   #endif  
  154.   #ifndef _mpyilll  
  155.   #define _mpyilll(src1, src2) _mpylill((src2), (src1))  
  156.   #endif  
  157.   #ifndef _mpyilr  
  158.   #define _mpyilr(src1, src2) _mpylir((src2), (src1))  
  159.   #endif  
  160.   #ifndef _mpyus4ll  
  161.   #define _mpyus4ll(src1, src2) _mpysu4ll((src2), (src1))  
  162.   #endif  
  163.   #ifndef _saddsu2  
  164.   #define _saddsu2(src1, src2) _saddus2((src2), (src1))  
  165.   #endif  
  166.   #ifndef _swap2  
  167.   #define _swap2(src) _packlh2((src), (src))  
  168.   #endif  
  169. /*把src1和src2的4对8bits相加,不会进行饱和,进位不会影响其他的8位数*/  
  170. int       _add4      (int,      int);  
  171. /*计算2对有符号16位数的平均值*/  
  172. int       _avg2      (int,      int);  
  173. /*计算4对有符号8位数的平均值*/  
  174. unsigned  _avgu4     (unsigned, unsigned);  
  175. /*比较2对16位数的值是否相等,结果放入dst的最低2位,相等返回1*/  
  176. int       _cmpeq2    (int,      int);  
  177. /*比较4对8位数的值是否相等,结果放入dst的最低4位,相等置1,否则为0*/  
  178. int       _cmpeq4    (int,      int);  
  179. /*比较2对有符号16位数,src1 > src2,置为1;否则为0.结果放入dst的最低2位*/  
  180. int       _cmpgt2    (int src1,      int src2);  
  181. /*比较4对无符号8位数,src1 > src2,置为1;否则为0.结果放入dst的最低4位*/  
  182. unsigned  _cmpgtu4   (unsigned src1, unsigned src2);  
  183.   
  184. /*将src1和src2中的2对16位有符号数进行点积(相加),结果被写成有符号32位int或者符号扩展为64位*/  
  185. int       _dotp2     (int ,      int);  
  186. __int40_t _ldotp2    (int,      int);  
  187. /*将src1和src2中的16位有符号数进行点积相减*/  
  188. int       _dotpn2    (int,      int);  
  189. /*src1和src2中的高16位的点积“减去”低16位的点积。src1中的数被当做有符号数,src2中的数被当做无符号数,再加上2^15,结果再带符号右移16位*/  
  190. int       _dotpnrsu2 (int src1,      unsigned src2);  
  191. /*src1和src2中的高16位的点积“加上”低16位的点积。src1中的数被当做有符号数,src2中的数被当做无符号数,再加上2^15,结果再带符号右移16位*/  
  192. int       _dotprsu2  (int,      unsigned);  
  193. /*将src1和src2的4对8位数进行相乘再求和,src1的每8位数被当做有符号数,src2的每8位数被当做无符号数*/  
  194. int       _dotpsu4   (int,      unsigned);  
  195. unsigned  _dotpu4    (unsigned, unsigned);//同上,都被当做无符号数  
  196.   
  197. /*将src1和src2的4对8位无符号数进行迦罗瓦域的乘法*/  
  198. int       _gmpy4     (int,      int);  
  199.   
  200. /*将src1和src2中的2对16位有符号数比较,取较大值*/  
  201. int       _max2      (int,      int);  
  202. /*将src1和src2中的4对8位无符号数比较,取较大值*/  
  203. unsigned  _maxu4     (unsigned, unsigned);  
  204. /*将src1和src2中的2对16位有符号数比较,取较小值*/  
  205. int       _min2      (int,      int);  
  206. /*将src1和src2中的4对8位无符号数比较,取较小值*/  
  207. unsigned  _minu4     (unsigned, unsigned);  
  208.   
  209.   
  210. /*将src1和src2中的2对16位有符号数分别相乘,将2个32位的结果写入long long中*/  
  211. long long _mpy2ll    (int,      int);  
  212. /*将src1中高16位作为1个16位有符号数乘以src2的32位有符号数,结果写入long long的低48位*/  
  213. long long _mpyhill   (int src1,      int src2);  
  214. /*将src1中低16位作为1个16位有符号数乘以src2的32位有符号数,结果写入long long的低48位*/  
  215. long long _mpylill   (int,      int);  
  216. /*将src1的高16位作为1个16位有符号数乘以src2的32位有符号数。乘积利用round模式通过加2^14转成32位,最后再右移15位*/  
  217. int       _mpyhir    (int,      int);  
  218. /*将src1的低16位作为1个16位有符号数乘以src2的32位有符号数。乘积利用round模式通过加2^14转成32位,最后再右移15位*/  
  219. int       _mpylir    (int,      int);  
  220. /*将src1的4个8位有符号乘src2的4个8位无符号数,得到4个16位有符号数,组成一个64位*/  
  221. long long _mpysu4ll  (int src1,      unsigned src2);  
  222. long long _mpyu4ll   (unsigned, unsigned);//同时,都是无符号数  
  223.   
  224. /*将src1的低16位放入返回值的高16位,src2的低16位放入返回值的低16位*/  
  225. unsigned  _pack2     (unsigned src1, unsigned src2);  
  226. /*将src1的高16位放入返回值的高16位,src2的高16位放入返回值的低16位*/  
  227. unsigned  _packh2    (unsigned, unsigned);  
  228. /*将src1(a_3|a_2|a_1|a_0)和src2(b_3|b_2|b_1|b_0)分成4对8位无符号数,返回a_3|a_1|b_3|b_1*/  
  229. unsigned  _packh4    (unsigned, unsigned);  
  230. /*将src1(a_3|a_2|a_1|a_0)和src2(b_3|b_2|b_1|b_0)分成4对8位无符号数,返回a_2|a_0|b_2|b_0*/  
  231. unsigned  _packl4    (unsigned, unsigned);  
  232. /*将src1(a_hi|a_lo)和src2(b_hi|b_lo)分成2对16位无符号数,返回a_hi|b_lo*/  
  233. unsigned  _packhl2   (unsigned, unsigned);  
  234. /*将src1(a_hi|a_lo)和src2(b_hi|b_lo)分成2对16位无符号数,返回a_lo|b_hi*/  
  235. unsigned  _packlh2   (unsigned, unsigned);  
  236. /*按照src1的最低5位的数去左移src2的32位,src1中剩下的高5-31位被忽略*/  
  237. unsigned  _rotl      (unsigned src1, unsigned src2);  
  238. /*将src1和src2中的2个16位有符号数相加,生成2个16位有符号数并饱和*/  
  239. int       _sadd2     (int,      int);  
  240. /*将src1和src2中的4对8位无符号数相加并饱和*/  
  241. unsigned  _saddu4    (unsigned, unsigned);  
  242. /*将src1中的2个16位无符号数和src2中的2个16位有符号数相加,得到2个16位无符号数并饱和*/  
  243. int       _saddus2   (unsigned src1, int src2);  
  244.   
  245. /*将src2左移1byte,然后将src1的最高1byte填充入src2左移后多出的位置*/  
  246. unsigned  _shlmb     (unsigned src1, unsigned src2);  
  247. /*将src2右移1byte,然后将src1的最高1byte填充入src2右移后多出的位置*/  
  248. unsigned  _shrmb     (unsigned src1, unsigned src2);  
  249. /*将src2的2个16位有符号数分别右移,右移位数由src1的低5位决定,多出的位置由符号位扩展*/  
  250. int       _shr2      (int src1,      unsigned src2);  
  251. /*将src2的2个16位有符号数分别右移,右移位数由src1的低5位决定,多出的位置由0扩展*/  
  252. unsigned  _shru2     (unsigned src1, unsigned src2);  
  253. /*将src1和src2中的1个32位有符号进行饱和到有符号16位,然后把src1的高16位,src2的饱和结果放入dst的低16位,不懂就看指令手册*/  
  254. int       _spack2    (int src1,      int src2);  
  255. /*将src1和src2中的2对16位有符号数饱和成8位无符号数*/  
  256. unsigned  _spacku4   (int,      int);  
  257. /* *
  258. * 将src2中的32位有符号数左移或右移,移位的数量由src1指定的比特数确定。
  259. * src1在[-31,31]之间,如果src1为正,src2则左移;如果src1为负,src2右移|src1|且符号位扩展
  260. * */  
  261. int       _sshvl     (int src2,      int src1);  
  262. /* *
  263. * 将src2中的32位有符号数左移或右移,移位的数量由src1指定的比特数确定。
  264. * src1在[-31,31]之间,如果src1为正,src2则右移且是符号位扩展;如果src1为负,src2左移|src1|
  265. * */  
  266. int       _sshvr     (int src2,      int src1);  
  267. /*将src1和src2中的4对8位数相减,不进行饱和*/  
  268. int       _sub4      (int src1,      int src2);  
  269. /*将src1和src2中的4对8位无符号数相减求绝对值*/  
  270. int       _subabs4   (int src1,      int src2);  
  271.   
  272. /*分别计算高、低16位的绝对值*/  
  273. int       _abs2      (int);  
  274. /*统计4对8位比特数是1的个数,写入结果对应位置*/  
  275. unsigned  _bitc4     (unsigned);  
  276. /*颠倒比特位的顺序*/  
  277. unsigned  _bitr      (unsigned);  
  278. /*将src中的比特位的奇数位和偶数位抽出来进行重组,偶数位放在低的16位,奇数位放在高的16位*/  
  279. unsigned  _deal      (unsigned);  
  280. /*将src的数据移入返回值中,利用了乘法流水线(延迟4cycle)*/  
  281. int       _mvd       (int src2);  
  282. /*将src2的高16和低16位进行交织abcdefghijklmnop|ABCDEFGHIJKLMNOP,返回aAbBcCdDeEfFgGhH|iIjJkKlLmMnNoOpP*/  
  283. unsigned  _shfl      (unsigned src2);  
  284. /*将src4个8位无符号数(ub_3|ub_2|ub_1|ub_0|)交换位置,返回(ub_2|ub_3|ub_0|ub_1|)*/  
  285. unsigned  _swap4     (unsigned);  
  286. /*扩展0(高16位2个8位数),(ub_3|ub_2|ub_1|ub_0|)-->(0|ub_3|0|ub_2|),每个分隔号代表1byte*/  
  287. unsigned  _unpkhu4   (unsigned);  
  288. /*扩展0(低16位2个8位数),(ub_3|ub_2|ub_1|ub_0|)-->(0|ub_1|0|ub_0|),每个分隔号代表1byte*/  
  289. unsigned  _unpklu4   (unsigned);  
  290. /*按src的最低2位进行扩展,bit1扩展高16位,bit0扩展低16位*/  
  291. unsigned  _xpnd2     (unsigned);  
  292. unsigned  _xpnd4     (unsigned);//同上,按src的最低4位进行扩展,例bit0扩展低8位。  
  293.   
  294. /*平行做2步,1.src1+src2->dst_o 2.src1-src2->dst_e,dst_o代表奇数寄存器,dst_e代表偶数寄存器*/  
  295. long long _addsub    (int src1,       int src2);  
  296. /*同上,分成2对16位有符号数进行ADD2和SUB2*/  
  297. long long _addsub2   (unsigned,  unsigned);  
  298. /* *
  299. * 饱和(src1低16位和src2高16位的点积加上src1高16位和src2低16位点积)赋给dst_e
  300. * sat((lsb16(src1) × msb16(src2)) + (msb16(src1) × lsb16(src2))) → dst_e
  301. * 有符号16位src1和src2的高16位的点积减去src1和src2低16位的点积赋给dst_o
  302. * (msb16(src1) × msb16(src2)) - (lsb16(src1) × lsb16(src2)) → dst_o
  303. * */  
  304. long long _cmpy      (unsigned src1,  unsigned src2);  
  305. /* *
  306. * sat((lsb16(src1) × msb16(src2)) + (msb16(src1) × lsb16(src2))) → tmp_e
  307. * msb16(sat(tmp_e + 00008000h)) → lsb16(dst)
  308. * sat((msb16(src1) × msb16(src2)) - (lsb16(src1) × lsb16(src2))) → tmp_o
  309. * msb16(sat(tmp_o + 00008000h)) → msb16(dst)
  310. * */  
  311. unsigned  _cmpyr     (unsigned,  unsigned);  
  312. /* *
  313. * sat((lsb16(src1) × msb16(src2)) + (msb16(src1) × lsb16(src2))) → tmp_e
  314. * msb16(sat((tmp_e + 00004000h) << 1)) → lsb16(dst)
  315. * sat((msb16(src1) × msb16(src2)) - (lsb16(src1) × lsb16(src2))) → tmp_o
  316. * msb16(sat((tmp_e + 00004000h) << 1)) → msb16(dst)
  317. * */  
  318. unsigned  _cmpyr1    (unsigned,  unsigned);  
  319. /*看TMS320C6000内联指令汇编的35页图示,完成点积和功能*/  
  320. long long _ddotph2   (long long, unsigned);  
  321. unsigned  _ddotph2r  (long long, unsigned);  
  322. long long _ddotpl2   (long long, unsigned);  
  323. unsigned  _ddotpl2r  (long long, unsigned);  
  324. long long _ddotp4    (unsigned src1,  unsigned src2);  
  325. /*数据打包看37页图示*/  
  326. long long _dpack2    (unsigned src1,  unsigned src2);  
  327. long long _dpackx2   (unsigned,  unsigned);  
  328. /*将两个寄存器移入一个寄存器一次性的*/  
  329. long long _dmv       (unsigned,  unsigned);  
  330. double    _fdmv      (float,     float);  
  331. /*迦罗瓦域上的乘法*/  
  332. unsigned  _gmpy      (unsigned,  unsigned);  
  333. /*进行32位乘32位。都是有符号数,64位结果都被写入dst*/  
  334. long long _mpy32ll   (int,       int);  
  335. /*进行32位乘32位。都是有符号数,64位结果中的低32位写入dst*/  
  336. int       _mpy32     (int,       int);  
  337. /*src1有符号32位乘以src2无符号32位=有符号64位*/  
  338. long long _mpy32su   (int,       unsigned);  
  339. long long _mpy32us   (unsigned,  int); //同上,无符号乘以有符号  
  340. long long _mpy32u    (unsigned,  unsigned);//同上上,都为无符号  
  341. /* *
  342. * 进行16位乘32位。将src1的高16位和低16位当做有符号16位;将src2的值当做有符号32位。
  343. * 乘积通过加上2^14 round到32位,然后结果右移15位。2个结果的低32位写入dst_o:dst_e
  344. * */  
  345. long long _mpy2ir    (unsigned src1,  int src2);  
  346. /*src1和src2的高16位,分别右移1位后饱和,放入32位结果中*/  
  347. unsigned  _rpack2    (unsigned src1,  unsigned src2);  
  348. /*并行进行1.饱和(src1+src2)->dst_o  2.饱和(src1-src2)->dst_e*/  
  349. long long _saddsub   (int,       int);  
  350. long long _saddsub2  (unsigned,  unsigned);//并行进行SADD2和SSUB2指令  
  351. /*不知道干嘛用的,看39页*/  
  352. long long _shfl3     (unsigned,  unsigned);  
  353. /*src1中的2个16位有符号数减去src2中的2个16位有符号数*/  
  354. int       _ssub2     (int src1,       int src2);  
  355. /*迦罗瓦乘法*/  
  356. unsigned  _xormpy    (unsigned,  unsigned);  
  357.   
  358.   
  359. long long  _dcmpyr1    (long long, long long);  
  360. long long  _dccmpyr1   (long long, long long);  
  361. long long  _cmpy32r1   (long long, long long);  
  362. long long  _ccmpy32r1  (long long, long long);  
  363. long long  _mpyu2      (unsigned,  unsigned);  
  364. /*4对8位有符号数点积相加*/  
  365. int        _dotp4h     (long long, long long);  
  366. long long  _dotp4hll   (long long, long long);  
  367. /*src1中的4对16位有符号数,src2中的4对16位无符号数,得到一个32位的点积和*/  
  368. int        _dotpsu4h   (long long, long long);  
  369. /*src1中的4对16位有符号数,src2中的4对16位无符号数,得到一个64位的点积和*/  
  370. long long  _dotpsu4hll (long long, long long);  
  371. /*src1的2个32位有符号数加上src2的2个32位有符号数*/  
  372. long long  _dadd       (long long src1, long long src2);  
  373. long long  _dadd_c     (int,       long long);  
  374.   
  375. long long  _dsadd      (long long, long long);  
  376. /*4对16位有符号数相加*/  
  377. long long  _dadd2      (long long, long long);  
  378. long long  _dsadd2     (long long, long long);  
  379. long long  _dsub       (long long, long long);  
  380. long long  _dssub      (long long, long long);  
  381. long long  _dssub2     (long long, long long);  
  382.   
  383. long long  _dapys2     (long long, long long);  
  384. long long  _dshr       (long long, unsigned);  
  385. long long  _dshru      (long long, unsigned);  
  386. long long  _dshl       (long long, unsigned);  
  387. long long  _dshr2      (long long, unsigned);  
  388. long long  _dshru2     (long long, unsigned);  
  389. unsigned   _shl2       (unsigned , unsigned);  
  390. long long  _dshl2      (long long, unsigned);  
  391. long long  _dxpnd4     (unsigned);  
  392. long long  _dxpnd2     (unsigned);  
  393. int        _crot90     (int);  
  394. long long  _dcrot90    (long long);  
  395. int        _crot270    (int);  
  396. long long  _dcrot270   (long long);  
  397. /*src1和src2中的4对16位有符号数比较,取大者放入dst*/  
  398. long long  _dmax2      (long long, long long);  
  399. long long  _dmin2      (long long, long long);  
  400. /*src1和src2中的8对8位有符号数比较,取大者放入dst*/  
  401. long long  _dmaxu4     (long long, long long);  
  402. long long  _dminu4     (long long, long long);  
  403.   
  404. /*4对16位比较,相等返回1,不等返回0*/  
  405. unsigned   _dcmpeq2    (long long, long long);  
  406. /*8对8位比较,相等返回1,不等返回0*/  
  407. unsigned   _dcmpeq4    (long long, long long);  
  408. /*4对16位比较,大于返回1,不大于返回0*/  
  409. unsigned   _dcmpgt2    (long long, long long);  
  410. /*8对8位比较,大于返回1,不大于返回0*/  
  411. unsigned   _dcmpgtu4   (long long, long long);  
  412.   
  413. /*4对16位有符号数求4个平均"(a+b+1)/2"*/  
  414. long long  _davg2      (long long, long long);  
  415. /*8对8位无符号数求8个平均*/  
  416. long long  _davgu4     (long long, long long);  
  417. /*有符号16位,无round模式,4个平均"(a+b)/2"*/  
  418. long long  _davgnr2    (long long, long long);  
  419. /*无符号8位,无round模式,8个平均*/  
  420. long long  _davgnru4   (long long, long long);  
  421. long long  _unpkbu4    (unsigned);  
  422. long long  _unpkh2     (unsigned);  
  423. long long  _unpkhu2    (unsigned);  
  424.   
  425. /*并行执行2个PACKL2*/  
  426. long long  _dpackl2    (long long, long long);  
  427. /*并行执行2个PACKH2*/  
  428. long long  _dpackh2    (long long, long long);  
  429. long long  _dpackhl2   (long long, long long);  
  430. /*并行执行PACKH4和PACKL4*/  
  431. long long  _dpacklh4   (unsigned,  unsigned);  
  432. long long  _dpackl4    (long long, long long);  
  433. long long  _dpackh4    (long long, long long);  
  434. long long  _dspacku4   (long long, long long);  
  435.   
  436. void       _mfence     ();  
  437. __float2_t _dmpysp     (__float2_t, __float2_t);  
  438. /*2路float型相加*/  
  439. __float2_t _daddsp     (__float2_t, __float2_t);  
  440. __float2_t _dsubsp     (__float2_t, __float2_t);  
  441. /*src中的16位有符号数转换成单精度浮点放入dst_e和dst_o中*/  
  442. __float2_t _dinthsp    (unsigned src);  
  443. /*src中的16位无符号数转换成单精度浮点放入dst_e和dst_o中*/  
  444. __float2_t _dinthspu   (unsigned);  
  445. /*src中的32位有符号转换成单精度浮点,放入dst_e和dst_o中*/  
  446. __float2_t _dintsp     (long long);  
  447. /*src中的32位无符号转换成单精度浮点,放入dst_e和dst_o中*/  
  448. __float2_t _dintspu    (long long);  
  449. unsigned   _dspinth    (__float2_t);  
  450. long long  _dspint     (__float2_t);  
  451.   
  452. int        _land       (int, int);  
  453. int        _landn      (int, int);  
  454. int        _lor        (int, int);  
  455. /*将2个寄存器移入1个寄存器中。一次进行2次移动,当处理很多double word时很有用。减去寄存器压力*/  
  456. long long  _dmvd       (int,       int);  
  457. double     _fdmvd      (float,     float);  
  458.   
  459. double     _complex_mpysp           (double, double); /* CMPYSP then DADDSP */  
  460. double     _complex_conjugate_mpysp (double, double); /* CMPYSP then DSUBSP */  
  461.   
  462. long long  _xorll_c    (int, long long);  
  463.   
  464. __x128_t   __BUILTIN _dcmpy      (long long, long long);  
  465. __x128_t   __BUILTIN _dccmpy     (long long, long long);  
  466. long long  __BUILTIN _cmatmpyr1  (long long, __x128_t);  
  467. long long  __BUILTIN _ccmatmpyr1 (long long, __x128_t);  
  468. __x128_t   __BUILTIN _cmatmpy    (long long, __x128_t);  
  469. __x128_t   __BUILTIN _ccmatmpy   (long long, __x128_t);  
  470. __x128_t   __BUILTIN _qsmpy32r1  (__x128_t,  __x128_t);  
  471. __x128_t   __BUILTIN _qmpy32     (__x128_t,  __x128_t);  
  472. __x128_t   __BUILTIN _dsmpy2     (long long, long long);  
  473. /*4对16位有符号数相乘,得到32位有符号数放入128位寄存器中*/  
  474. __x128_t   __BUILTIN _dmpy2      (long long, long long);  
  475. /*4对16位有符号数相乘,得到32位有符号数放入128位寄存器中*/  
  476. __x128_t   __BUILTIN _dmpyu2     (long long, long long);  
  477. /*将src1中8个8位有符号数乘以src2中8个8位无符号数,得到8个16位有符号数*/  
  478. __x128_t   __BUILTIN _dmpysu4    (long long src1, long long src2);  
  479. __x128_t   __BUILTIN _dmpyu4     (long long, long long);//同上,都是无符号  
  480. __x128_t   __BUILTIN _cmpysp     (__float2_t, __float2_t);  
  481. __x128_t   __BUILTIN _qmpysp     (__x128_t,  __x128_t);  
  482. /*执行2个dotp4h,都是有符号的*/  
  483. long long  __BUILTIN _ddotp4h    (__x128_t,  __x128_t);  
  484. /*执行2个dotpsu4h,一个有符号,一个无符号*/  
  485. long long  __BUILTIN _ddotpsu4h  (__x128_t,  __x128_t);  
  486.   
  487. __x128_t   __BUILTIN _ito128  (unsigned,  unsigned, unsigned, unsigned);  
  488. __x128_t   __BUILTIN _fto128  (float,     float,    float,    float);  
  489. __x128_t   __BUILTIN _llto128 (long long, long long);  
  490. __x128_t   __BUILTIN _dto128  (double,    double);  
  491.   
  492. long long  __BUILTIN _hi128   (__x128_t);  
  493. double     __BUILTIN _hid128  (__x128_t);  
  494. long long  __BUILTIN _lo128   (__x128_t);  
  495. double     __BUILTIN _lod128  (__x128_t);  
  496.   
  497. unsigned  __BUILTIN _get32_128  (__x128_t, __CONST(0,3) unsigned);  
  498. float     __BUILTIN _get32f_128 (__x128_t, __CONST(0,3) unsigned);  
  499.   
  500. __x128_t  __BUILTIN _dup32_128 (unsigned);  
  501.   
  502.   
  503.   
  504. extern __cregister volatile unsigned int AMR;  
  505. extern __cregister volatile unsigned int CSR;  
  506. extern __cregister volatile unsigned int IFR;  
  507. extern __cregister volatile unsigned int ISR;  
  508. extern __cregister volatile unsigned int ICR;  
  509. extern __cregister volatile unsigned int IER;  
  510. extern __cregister volatile unsigned int ISTP;  
  511. extern __cregister volatile unsigned int IRP;  
  512. extern __cregister volatile unsigned int NRP;  
  513.   
  514. extern __cregister volatile unsigned int GFPGFR;  
  515. extern __cregister volatile unsigned int DIER;  
  516.   
  517. extern __cregister volatile unsigned int REP;  
  518. extern __cregister volatile unsigned int TSCL;  
  519. extern __cregister volatile unsigned int TSCH;  
  520. extern __cregister volatile unsigned int ARP;  
  521. extern __cregister volatile unsigned int ILC;  
  522. extern __cregister volatile unsigned int RILC;  
  523. extern __cregister volatile unsigned int PCE1;  
  524. extern __cregister volatile unsigned int DNUM;  
  525. extern __cregister volatile unsigned int SSR;  
  526. extern __cregister volatile unsigned int GPLYA;  
  527. extern __cregister volatile unsigned int GPLYB;  
  528. extern __cregister volatile unsigned int TSR;  
  529. extern __cregister volatile unsigned int ITSR;  
  530. extern __cregister volatile unsigned int NTSR;  
  531. extern __cregister volatile unsigned int ECR;  
  532. extern __cregister volatile unsigned int EFR;  
  533. extern __cregister volatile unsigned int IERR;  
  534.   
  535. extern __cregister volatile unsigned int DMSG;  
  536. extern __cregister volatile unsigned int CMSG;  
  537. extern __cregister volatile unsigned int DT_DMA_ADDR;  
  538. extern __cregister volatile unsigned int DT_DMA_DATA;  
  539. extern __cregister volatile unsigned int DT_DMA_CNTL;  
  540. extern __cregister volatile unsigned int TCU_CNTL;  
  541. extern __cregister volatile unsigned int RTDX_REC_CNTL;  
  542. extern __cregister volatile unsigned int RTDX_XMT_CNTL;  
  543. extern __cregister volatile unsigned int RTDX_CFG;  
  544. extern __cregister volatile unsigned int RTDX_RDATA;  
  545. extern __cregister volatile unsigned int RTDX_WDATA;  
  546. extern __cregister volatile unsigned int RTDX_RADDR;  
  547. extern __cregister volatile unsigned int RTDX_WADDR;  
  548. extern __cregister volatile unsigned int MFREG0;  
  549. extern __cregister volatile unsigned int DBG_STAT;  
  550. extern __cregister volatile unsigned int BRK_EN;  
  551. extern __cregister volatile unsigned int HWBP0_CNT;  
  552. extern __cregister volatile unsigned int HWBP0;  
  553. extern __cregister volatile unsigned int HWBP1;  
  554. extern __cregister volatile unsigned int HWBP2;  
  555. extern __cregister volatile unsigned int HWBP3;  
  556. extern __cregister volatile unsigned int OVERLAY;  
  557. extern __cregister volatile unsigned int PC_PROF;  
  558. extern __cregister volatile unsigned int ATSR;  
  559. extern __cregister volatile unsigned int TRR;  
  560. extern __cregister volatile unsigned int TCRR;  


回复评论 (1)

楼主研究深入啊,开发板自己买的吗?多少大洋?
点赞  2016-3-29 10:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复