C6000点滴学习:c6000系列的C代码优化(五)

2019-07-23 14:10发布

八、 循环内部存在 if判断程序的优化
         1、源程序  
      
  • for (k = 0; k < NB_PULSE; k++)
  •     {
  •         i = codvec[k];
  •         j = sign;
  •         index = mult(i, Q15_1_5);
  •         track = sub(i, extract_l(L_shr(L_mult(index, 5), 1)));
  •         if (j > 0)
  •         {
  •             if (i < l_subfr) code = add(code, 4096);
  •              codvec[k] += (2 * L_SUBFR);
  •         }
  •         else
  •         {
  •             if (i < l_subfr) code = sub(code, 4096);
  •             index = add(index, 16);
  •         }
  •         if (indx[track] < 0)
  •         {
  •             indx[track] = index;
  •         }
  •         else
  •         {
  •             if (((index ^ indx[track]) & 16) == 0)
  •             {
  •                 if (sub(indx[track], index) <= 0)
  •                 {
  •                     indx[track] = shl((indx[track] & 16), 3)
  •                    + shr(extract_l(L_mult((indx[track]&15), NB_POS)), 1) + (index & 15);
  •                 }
  •                 else
  •                 {   indx[track] = shl((index & 16), 3)
  •                    + shr(extract_l(L_mult((index & 15),NB_POS)), 1) + (indx[track] & 15);
  •                 }
  •             }
  •             else
  •             {
  •                 if (sub((indx[track] & 15), (index & 15)) <= 0)
  •                 {
  •                     indx[track] = shl((index & 16), 3)
  •                   + shr(extract_l(L_mult((index & 15),NB_POS)), 1) + (indx[track] & 15)
  •                 }
  •                 else
  •                 {   indx[track] = shl((indx[track] & 16), 3)
  •                     + shr(extract_l(L_mult((indx[track] & 15),NB_POS)), 1) + (index & 1
  •                 }
  •             }
  •         }
  •     }

复制代码

         2、优化后的程序  
     
  •    for (k = 0; k < 8; k++)
  •     {
  •         i         = codvec[k];
  •         j         = sign;
  •         index           = _smpy(i, 6554)>>16;
  •         track         = i - index*5;
  •         con              = (j > 0);
  •                 codvec[k]    = codvec[k] + 110*con;
  •                            index     = index + (!con)*16;
  •         conn      = (i < l_subfr);
  •         cono    = (j > 0)? 1:-1;
  •         code  = code + 4096*conn*cono;
  •                            n0   = index;
  •                            t0   = indx[track];
  •                            n1   = n0&16;
  •                            t1   = t0&16;
  •                            n2   = n0&15;
  •                            t2   = t0&15;
  •         tmp0    = (_sshl(n1,19)>>16) + n2*NB_POS + t2;
  •         tmp1    = (_sshl(t1,19)>>16) + t2*NB_POS + n2;
  •         conp    = (((n1 == t1)&&(t0 > n0))||((n1 != t1)&&(t2 <= n2)));
  •                            tmp   = conp*tmp0 + (!conp)*tmp1;
  •         if (t0 < 0)
  •             indx[track] = n0;
  •         else
  •             indx[track] = tmp;
  • }

复制代码

         3、优化说明  
         源程序中在循环中含有许多的 if 结构,在优化时对 if 结构首先进行化简,再将化简后的 if结构用条件运算表达式进行改写,最后使循环可以 Pipeline。  
         九、 少量中值问题的优化
         1、源程序  
      
  • for (i = 0; i < n; i++)
  •     {
  •             max = -32767;
  •             for (j = 0; j < n; j++)
  •             {
  •                     if (sub (tmp2[j], max) >= 0)
  •                             {
  •                                 max = tmp2[j];
  •                                 ix = j;
  •                     }
  •                      }
  •                      tmp2[ix] = -32768;
  •                      tmp = ix;
  •         }

复制代码

         2、优化后的程序  
      
  • if (n0>n1) {temp=n0;n0=n1;n1=temp;}
  •        if (n1>n2) {temp=n1;n1=n2;n2=temp;}
  •        if (n2>n3) {temp=n2;n2=n3;n3=temp;}
  •        if (n3>n4) {temp=n3;n3=n4;n4=temp;}
  •        if (n0>n1) {temp=n0;n0=n1;n1=temp;}
  •        if (n1>n2) {temp=n1;n1=n2;n2=temp;}
  •        if (n2>n3) {temp=n2;n2=n3;n3=temp;}
  •        if (n0>n1) {temp=n0;n0=n1;n1=temp;}
  •        if (n1>n2) {return n1;}

复制代码

         3、优化说明  
         源程序也为一个求中值的问题,由于已知循环次数固定为 5,因此将循环展开使用 if语句直接求取中值。  
         十、 位操作优化
         1、源程序  

  • static Word16 Bin2int (Word16 no_of_bits,    Word16 *bitstream)
  • {
  •     Word16 value, i, bit;
  •     value = 0;
  •         for (i = 0; i < no_of_bits; i++)
  •     {
  •         value = shl (value, 1);
  •         bit = *bitstream++;
  •         if (sub (bit, BIT_1) == 0)
  •         value = add (value, 1);
  •     }
  •     return (value);
  • }
  •         for (i = 0; i < prmno[mode]; i++)
  •     {
  •         prm = Bin2int (bitno[mode], bits);
  •         bits += bitno[mode];
  •     }

复制代码
       2、优化后的程序  
   
  • value = 0;
  •     bitsp = bits;
  •     bitnop= &bitno[mode][0];
  •     j  = *bitnop++;
  •     j1 = *bitnop++;
  •     j2 = *bitnop++;
  •     j3 = *bitnop++;
  •     j4 = *bitnop++;
  •     _nassert(loop[mode]>=35);
  •         for (i = 0; i < loop[mode]; i++)
  •     {
  •         value = value*2 + *bitsp++;
  •         j--;
  •         if (j == 0)
  •         {
  •            *prm++ = value;
  •            value = 0;
  •            j  = j1;
  •            j1 = j2;
  •            j2 = j3;
  •            j3 = j4;
  •            j4 = *bitnop++;
  •         }
  •     }

复制代码
       3、优化说明  
         源程序按照数据位流定义取出参数,为双重循环结构,优化中采用重新根据位流的 bit长度定义循环次数,化简为单重循环,然后优化循环,去除 boundary,使 pipeline 的数目最小。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。