打印

c6000系列的C代码优化(六)

[复制链接]
821|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangfeng33|  楼主 | 2014-10-11 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
十一、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 位数的特性,并利用一个指令周期能读取两个数据的特点。   

相关帖子

沙发
huangfeng33|  楼主 | 2014-10-11 19:16 | 只看该作者
十二、set_zero 程序的优化  
       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位数的特点, 并利用一个指令周期能读取两个数据的特点。   

使用特权

评论回复
板凳
huangfeng33|  楼主 | 2014-10-11 19:17 | 只看该作者
十三、32bit数与 16bit 数相乘  
       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 相乘。  

使用特权

评论回复
地板
huangfeng33|  楼主 | 2014-10-11 19:18 | 只看该作者
十四、32bit数与 32bit 数相乘  
       1、源代码:
L_tmp = Mac_32 (L_32, hi1, lo1, hi2, lo2);   
2、改编代码:
L_tmp = _sadd(_sadd(_smpyh(hl1_32, hl2_32),   
     ((_mpyhslu(hl1_32, hl2_32)>>16)<<1)+((_mpyhslu(hl2_32, hl1_32)>>16)<<1)), L_32);  
3、优化方法说明:  
       两个 32位的数相乘,不必分成四个 16 位的数相乘,直接用 32 位相乘。其中:
hl1_32 = hi1<<16 + lo1<<1,       hl2_32 = hi2 <<16 + lo2 <<1  。  
源代码实现:
L_32 = L_32 + (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15) <<1   
、技巧:  
       低 16 位与高16 位相乘时,低 16 位使用的是无符号数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝