Long Comp_En(short *Dpnt)
{ int i;
long Rez;
short Temp[60];
for (i=0;i<60;i ++) Temp [i] = shr(Dpnt[i],(short) 2);
Rez=(long) 0;
for (i=0; i <60; i ++) Rez=L_mac(Rez,Temp[i],Temp[i]);
return Rez;
}
相应的线性汇编程序如下:
.global _Comp_En ;函数名定义,对c变量前加_
_Comp_En .cproc Dpnt;函数头定义,Dpnt是参数
.reg Rez,Rez1,Rez2,1 ;寄存器定义,不必考虑实际的寄存器分配
.reg t1,t2,x1,c1,m1,m2
zero Rez
zero Rez1
zero Rez2
mv Dpnt,c1
mvk 30,i ;确定循环次数。因为用LDW代替LDH,循五环次数减少一半。
loop1 .trip 30
ldw *c1++,x1
sh1 x1,16,t1
shr t1,2,t1
shr x1,2,t2 ;将两个循环合在一起,又减少了一半的从内存取数据的时间。
smpyh t1,t1,m1
smpyh t2,t2,m2
sadd Rez1,m1,Rez1
sadd Rez2,m2,Rez2
[i] sub i,1,i ;循环计数器从30递减
[i] b loop1
sadd Rez1,Rez2,Rez
.return Rez
.endproc
消耗时间(时钟周期):C语言为32971;线性汇编语言为93。
2.3 使用线性汇编改写复杂函数中的循环体
当函数的逻辑关系复杂,判断、跳转、函数调用情况特别多时,上面方法的效果就会在打折扣。这时可以使用线性汇编将其中的循环部分改写成一个函数,以优化后的函数调用代替环部分,而不是优化整个复杂函数。
高速数字信号处理器件的应用范围越来越广,特别是在移动通信领域中,软件无线电、智能天线等新技术的实都需要强大的实时数字信号处理的支持。TMS320C6000系列DSP完全可以满足此类要求。但目前对于并行DSP技术的软硬件开发还处在摸索阶段,如何充分利用高速DSP的资源,是这方面的研究重点。本文研究了最新推出的TMS320C6000的优化策略,从工程和系统的角度总结出一套既能满足实时性又能保证开发时效性的实用的优化编程方法,以供分飨。