十一、copy程序的优化
1、源代码:
Word16 i;
for (i = 0; i < L; i++)
{
y = x;
}
2、改编代码:
(1)要求数组长度能被 2 整除
Word32 i;
Word32 temp;
int *p1 = (int *)&x[0];
int *q1 = (int *)&y[0];
for (i = 0; i < L/2; i++)
{
temp = *p1++;
*q1++ = temp;
}
(2)要求数组长度能被 4 整除
Word32 i;
Word32 temp1, temp2;
Word32 *pin1, *pin2, *pout1, *pout2;
pin1 = (Word32 *)&x[0];
pin2 = (Word32 *)&x[2];
pout1= (Word32 *)&y[0];
pout2= (Word32 *)&y[2];
for (i = 0; i < L/4; i++)
{
temp1 = *pin1;
temp2 = *pin2;
pin1+=2;
pin2+=2;
*pout1= temp1;
*pout2= temp2;
pout1+=2;
pout2+=2;
}
3、优化方法说明:
把一次循 拷贝一个 word16 的数改为一次循环拷贝 2 个 word16 或4 个 word16 的数。
4、技巧:
充分利用 c6xx 一次读取32 位数的特性,并利用一个指令周期能读取两个数据的特点。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1、源代码:
Word16 i;
for (i = 0; i < L; i++)
{
x = 0;
}
2、改编代码:
(1)数组长度能被 2 整除
Word32 i;
int *x1 = (int *)&x[0];
for (i = 0; i < L/2; i++)
{
*x1++ = 0;
}
(2)数组长度能被 4 整除
Word32 i;
int *x1 = (int *)&x[0];
int *x2 = (int *)&x[2];
for (i = 0; i < L/4; i++)
{
*x1 = 0;
*x2 = 0;
x1++;
x2++;
x1++;
x2++;
}
3、优化方法说明:
把一次循环为一个 word16 的数赋值改为一次为 2个或 4 个 word16 的数赋值。
4、技巧:
充分利用C6XX一次读取32位数的特点, 并利用一个指令周期能读取两个数据的特点。
1、源代码
L_tmp0 = Mac_32_16(L_32, hi1, lo1, lo2);
2、改编代码:
L_tmp0=_sadd(_sadd(_smpyhl(hl32, lo2),
(_mpyus(hl32, lo2)>>16)<<1), L_32);
3、优化方法说明:
hl32 是32bit 的数, hi1 和 lo1 是 16bit的数, 且 hl32 = hi1<<16 + lo1 << 1 , 即 hi1 和 lo1分别是 hl32的高 16 位数和低 16 位数。 函数 Mac_32_16(L_32, hi1, lo1, lo2)实现 L_32 = L_32 + (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1
源代码是把一个 32 位的数拆成两个 16 位的数与一个 16 位的数相乘,优化后的代码不拆开 32 位的数,直接用 32 位的数与16 位的数相乘。运用这种方法必须保证 hl32 的最低一位数必须为 0,否则应用指令_clr(hl32, 0, 0)把最低位清零。
4、技巧:
源代码中的低 16 位数 lo1 是hl32 的低16 位右移一位得到的(留出一位符号位) 。在与lo2 相乘时又右移了 15 位,所以在改编代码中右移 16 位,并且是以无符号数与 lo2 相乘。
一周热门 更多>