TMS320C6000内联指令汇编

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

内联指令汇编指令简要描述图示int_abs(intsrc);int_labs(__int40_tsrc)ABS返回src的绝对值int_add2(intsrc1,intsrc2)ADD2把src1的高、低16位和src2的高、低16位分别相加,放入结果的高、低16位ushort&_amem2(void*ptr);LDHUSTHU从内存中加载一个halfword到dst里,必须2byte对齐(读或存)constushort&_amem2_const(constvoid*ptr);LDHU必须2byte对齐(读)unsigned&_amem4(void*ptr);LDWSTW必须4byte对齐(读或存)constunsigned&_amem4_const(constvoid*ptr);LDW必须4byte对齐(读)double&_amemd8(void*ptr);LDW/LDWSTW/STW必须8byte对齐(读或存)constdouble&_amemd8_const(constvoid*ptr);LDDW必须8byte对齐(读)unsigned_clr(unsignedsrc2,unsignedcsta,unsignedcstb);CLR指定了从需要清0的首位和末位unsigned_clrr(unsignedsrc2,intsrc1);CLR将src2中指定位清0,清0的首位和末位由src1的低10位指定__int40_t_dtol(doublesrc);将一个double寄存器重新解释成一个__int40_tlonglong_dtoll(doublesrc);将一个double寄存器重新解释成一个longlongint_ext(intsrc2,unsignedcsta,unsignedcstb);EXT从src2里提取csta和cstb指定的区域且符号扩展到32位。提取出的区域先符号左移再右移。int_extr(intsrc2,intsrc1);EXT同上,区别:左右移的位数由src1的低10位指定unsigned_extu(unsignedsrc2,unsignedcsta,unsignedcstb);EXTU同上上,区别最后是0扩展到32位。unsigned_extur(unsignedsrc2,intsrc1);EXTU同上,区别:左右移的位数由src1的低10位指定例:_ftoi(1.0)==1065353216Uunsigned_ftoi(floatsrc);将float的比特位解释成unsignedunsigned_hi(doublesrc);返回double寄存器的高位(奇数位)unsigned_hill(longlongsrc);返回longlong寄存器的高位(奇数位)double_itod(unsignedsrc2,unsignedsrc1);创建一个新的double寄存器为了解释2个unsigned的值,其中src2是高(奇数)寄存器,src1是低(偶数)寄存器float_itof(unsignedsrc);将unsigned中的比特位解释成float例:_itof(0x3f800000)=1.0longlong_itoll(unsignedsrc2,unsignedsrc1);创建一个新的longlong寄存器为了解释2个unsigned的值,其中src2是高(奇数)寄存器,src1是低(偶数)unsigned_lmbd(unsignedsrc1,unsignedsrc2);LMBD搜索src2里面的1或0,1或0是由src1的LSB决定的,返回比特位变化的位数unsigned_lo(doublesrc);返回double寄存器的低(奇数)寄存器unsigned_loll(longlongsrc);返回longlong寄存器的低(奇数)寄存器double_ltod(__int40_tsrc);把一个__int40_t寄存器解释成一个double寄存器double_lltod(longlongsrc);把一个longlong寄存器解释成一个double寄存器int_mpy(intsrc1,intsrc2);MPYSrc1和src2相乘,操作数默认为有符号的int_mpyus(unsignedsrc1,intsrc2);MPYUS无符号src1和有符号src2相乘,S是用来那个是有符号的操作数,当两个操作数都是有符号的或者无符号的int_mpysu(intsrc1,unsignedsrc2);MPYSU同上unsigned_mpyu(unsignedsrc1,unsignedsrc2);MPYU同上上上,默认为无符号int_mpyh(intsrc1,intsrc2);MPYH同上,区别见图示int_mpyhus(unsignedsrc1,intsrc2);MPYHUSint_mpyhsu(intsrc1,unsignedsrc2);MPYHSUunsigned_mpyhu(unsignedsrc1,unsignedsrc2);MPYHUint_mpyhl(intsrc1,intsrc2);MPYHL同上,区别见图示int_mpyhuls(unsignedsrc1,intsrc2);MPYHULSint_mpyhslu(intsrc1,unsignedsrc2);MPYHSLUunsigned_mpyhlu(unsignedsrc1,unsignedsrc2);MPYHLUint_mpylh(intsrc1,intsrc2);MPYLHint_mpyluhs(unsignedsrc1,intsrc2);MPYLUHSint_mpylshu(intsrc1,unsignedsrc2);MPYLSHUunsigned_mpylhu(unsignedsrc1,unsignedsrc2);MPYLHUvoid_nassert(intsrc);不生成代码,告诉优化器一些事情unsigned_norm(intsrc);unsigned_lnorm(__int40_tsrc);NORM返回src2的冗余的符号比特位的个数,具体见图示int_sadd(intsrc1,intsrc2);long_lsadd(intsrc1,__int40_tsrc2);SADD将src1和src2相加,且饱和其结果int_sat(__int40_tsrc2);SAT将一个40比特的long转换为一个32比特的有符号int,如有需要,对结果进行饱和unsigned_set(unsignedsrc2,unsignedcsta,unsignedcstb);SET将src2中指定的区域置位1,指定的区域由csta和cstb指定unsigned_setr(unitsrc2,intsrc1);SETint_smpy(intsrc1,intsrc2);SMPY把src1的低16位和src2的低16位相乘int_smpyh(intsrc1,intsrc2);SMPYH高16位int_smpyhl(intsrc1,intsrc2);SMPYHLint_smpylh(intsrc1,intsrc2);SMPYLHint_sshl(intsrc2,unsignedsrc1);SSHL以src1操作数将src2左移,并且将结果饱和在32位int_ssub(intsrc1,intsrc2);__int40_t_lssub(intsrc1,__int40_tsrc2);SSUB从src1中减去src2,并饱和结果(src1-src2)unsigned_subc(unsignedsrc1,unsignedsrc2);SUBC有条件的减和左移(常用于除法)int_sub2(intsrc1,intsrc2);SUB2把src1的高低16位分别减去src2的高低16位。任何低16位的借位不会影响高16位。int_abs2(intsrc);ABS2计算16位的绝对值int_add4(intsrc1,intsrc2);ADD4把src1和src2的4对8位数相加。不会进行饱和,进位不会影响其他的8位数longlong&_amem8(void*ptr);LDDWSTDW加载和存储8bytes,指针必须8byte对齐constlonglong&_amem8_const(constvoid*ptr);LDDW加载8bytes,指针必须8byte对齐__float2_t&_amem8_f2(void*ptr);LDDWSTDW加载和存储8bytes,指针必须8byte对齐,必须包含c6x.hconst__float2_t&_amem8_f2_const(void*ptr);LDDW加载8bytes,指针必须8byte对齐,必须包含c6x.hdouble&_amemd8(void*ptr);LDDWSTDWconstdouble&_amemd8_const(constvoid*ptr);LDDWint_avg2(intsrc1,intsrc2);AVG2计算每对有符号16位置的平均值unsigned_avgu4(unsigned,unsigned);AVGU4计算每对有符号8位数的平均值unsigned_bitc4(unsignedsrc);BITC4统计每个8位的比特位是1的个数,写入结果对应位置unsigned_bitr(unsignedsrc);BITR翻转比特位的顺序int_cmpeq2(intsrc1,intsrc2);CMPEQ2比较每16位的值是否相等,结果放入dst的最低2位int_cmpeq4(intsrc1,intsrc2);CMPEQ4比较每8位的值是否相等,结果放入dst的最低4位,相等置1,否则为0int_cmpgt2(intsrc1,intsrc2);CMPGT2每16位有符号比较,src1src2,置为1;否则置为0。结果放入dst的最低2位unsigned_cmpgtu4(unsignedsrc1,unsignedsrc2);CMPGTU4每8位无符号比较,src1src2,置为1;否则置为0。结果放入dst的最低4位unsigned_deal(unsignedsrc);DEAL将src中的比特位的奇数位和偶数位抽出来进行重组,偶数位放在低的16位,奇数位放在高的16位int_dotp2(intsrc1,intsrc2);__int40_t_ldotp2(intsrc1,intsrc2);DOTP2DOTP2将src1中的和src2中的16位有符号对进行点积,结果被写成有符号32位int或者符号扩展为64位int_dotpn2(intsrc1,intsrc2);DOTPN2将src1和src2中的16位有符号数进行点积相减int_dotpnrsu2(intsrc1,unsignedsrc2);DOTPNRSU2Src1和src2的高16位的点积减去低16位的点积。Src1中的数被当做有符号,src2中的数被当做无符号,再加上2^15,结果再符号右移16位int_dotprsu2(intsrc1,unsignedsrc2);DOTPRSU2Src1和src2的高16位的点积加上低16位的点积。Src1中的数被当做有符号,src2中的数被当做无符号,再加上2^15,结果再符号右移16位int_dotpsu4(intsrc1,unsignedsrc2);DOTPSU4将src1和src2的每8位进行相乘再求和,src1的每8位数被当做有符号,src2的每8位数被当做无符号unsigned_dotpu4(unsignedsrc1,unsignedsrc2);DOTPU4都被当做无符号的int_gmpy4(intsrc1,intsrc2);GMPY4将src1和src2的4个无符号进行伽罗瓦域的乘法int_max2(intsrc1,intsrc2);MAX2将src1和src2的2个有符号16位整数比较,取较大值int_min2(intsrc1,i

1 / 59
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功