欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    线性汇编优化代码.ppt

    • 资源ID:5373759       资源大小:1.16MB        全文页数:84页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    线性汇编优化代码.ppt

    第5章 线性汇编优化代码,5.1 汇编优化器选项与伪指令,5.2 编写并行代码,5.3 软件流水,5.4 多周期循环的模迭代,5.5 循环传递路径,5.6 循环中的IF-Then-Else语句,5.7 循环展开,5.8 生命太长问题,5.9 消除冗余取数,5.10 存储体,5.11 软件流水外循环,5.12 同内循环一起条件执行外循环,5.13 通用目标文件格式(COFF),5.1 汇编优化器选项与伪指令,(1)-on选项(2)-mt选项和no_mdep伪指令(3).mdep伪指令(4).mptr伪指令(5).trip伪指令,5.2 编写并行代码,5.2.1 点积的C代码a)定点点积的C代码int dotp(short a,short b)int sum,i;sum=0;for(i=0;i100;i+)sum+=ai*bi;return(sum);,5.2.1 点积的C代码,b)浮点点积的C代码float dotp(float a,float b)int i;float sum;sum=0;for(i=0;i100;i+)sum+=ai*bi;return(sum);,5.2.2 C代码转换为线性汇编,【例5.4】定点点积的C代码内循环的线性汇编指令。LDH.D1*A4+,A2;从存储器加载aiLDH.D1*A3+,A5;从存储器加载bi MPY.M1 A2,A5,A6;ai*biADD.L1 A6,A7,A7;sum+=(ai*bi)SUB.S1 A1,1,A1;递减循环计数器A1 B.S2 LOOP;跳转到循环,5.2.2 C代码转换为线性汇编,【例5.5】浮点点积的C代码内循环的线性汇编指令LDW.D1*A4+,A2;从存储器加载ai LDW.D2*A3+,A5;从存储器加载bi MPYSP.M1 A2,A5,A6;ai*biADDSP.L1 A6,A7,A7;sum+=(ai*bi)SUB.S1 A1,1,A1;递减循环计数器A1 B.S2 LOOP;跳转到循环,5.2.3 画相关性图,1.定点点积图5-1为例5.4中定点点积汇编指令的相关性图以及相应的寄存器分配。,5.2.3 画相关性图,2.浮点点积图5-2给出了例5.5浮点点积的相关图以及相应的寄存器分配框图。,5.2.4 非并行汇编代码与并行汇编代码,1.定点点积【例5.6】定点点积的非并行汇编代码。MVK.S1 100,A1;建立循环计数器ZERO.L1 A7;累加器清零LOOP:LDH.D1*A4+,A2;从存储器加载aiLDH.D1*A3+,A5;从存储器加载biNOP 4;为LDH延迟一个时隙MPY.M1 A2,A5,A6;ai*biNOP;为MPY延迟一个时隙ADD.L1 A6,A7,A7;sum+=(ai*bi)SUB.S1 A1,1,A1;循环计数器递减A1 B.S2 LOOP;跳转到LOOP处NOP 5;为LOOP延迟时隙;此处发生跳转,5.2.4 非并行汇编代码与并行汇编代码,用同一个功能单元分配两个LDH指令,这样会降低循环的性能,因此,重新安排功能单元以使代码并行执行,其相关性图如图5-3所示,并行汇编代码见例5.7。,5.2.4 非并行汇编代码与并行汇编代码,【例5.7】定点点积的并行汇编代码。MVK.S1 100,A1;建立循环计数器|ZERO.L1 A7;累加器清零LOOP:LDH.D1*A4+,A2;从存储器加载ai|LDH.D2*B4+,B2;从存储器加载biSUB.S1 A1,1,A1;循环计数器递减A1 B.S2 LOOP;跳转到loopNOP 2;为LDH延迟时隙MPY.M1X A2,B2,A6;ai*biNOP;为MPY延迟时隙ADD.L1 A6,A7,A7;sum+=(ai*bi);此处发生跳转e,5.2.4 非并行汇编代码与并行汇编代码,【例5.8】浮点点积的非并行汇编代码MVK.S1 100,A1;建立循环计数器ZERO.L1 A7;累加器清零LOOP:LDW.D1*A4+,A2;从存储器加载aiLDW.D1*A3+,A5;从存储器加载biNOP 4;为LDW延迟时隙MPYSP.M1 A2,A5,A6;ai*biNOP 3;为MPYSP延迟时隙ADDSP.L1 A6,A7,A7;sum+=(ai*bi)NOP 3;为ADDSP延迟时隙SUB.S1 A1,1,A1;循环计数器递减A1 B.S2 LOOP;跳转到loopNOP 5;为跳转延迟时隙;此处发生跳转,5.2.4 非并行汇编代码与并行汇编代码,分配两个LDW指令用了同一个功能单元,从而降低了循环的性能,因此,重新安排功能单元以使代码并行执行,其相关性图如图5-4所示,并行汇编代码如例5.9。,5.2.4 非并行汇编代码与并行汇编代码,【例5.9】浮点点积的并行汇编代码MVK.S1 100,A1;建立循环计数器|ZERO.L1 A7;累加器清零LOOP:LDW.D1*A4+,A2;从存储体中加载ai|LDW.D2*B4+,B2;从存储体中加载bi SUB.S1 A1,1,A1;循环计数器递减NOP 2;LDW 延迟时隙A1 B.S2 LOOP;跳转到loopMPYSP.M1X A2,B2,A6;ai*biNOP 3;MPYSP延迟时隙ADDSP.L1 A6,A7,A7;sum+=(ai*bi);此处发生跳转,5.2.4 非并行汇编代码与并行汇编代码,2.性能比较表5-1为定点点积/浮点点积的非并行与并行汇编代码的性能比较。,5.2.5 适用字访问短型数据与使用双字访问,1.点积C代码的循环展开2.C代码转换为线性汇编3.画相关性图4.线性汇编资源分配5.最后的汇编代码,5.3 软件流水,5.3.1 模迭代间隔编排表1.定点实例2.浮点实例3.确定最小迭代间隔4.建立一个完全流水的编排表5.用多个周期指令交错累加,5.3.2 使用汇编优化器产生优化循环,【例5.20】完整的定点点积的线性汇编代码。.global _dotp_dotp:.cproc a,b.reg sum,sum0,sum1,cntr.reg ai_i1,bi_i1,pi,pi1MVK 50,cntr;cntr=100/2ZERO sum0;相乘的结果 result=0ZERO sum1;相乘的结果 result=0LOOP:.trip 50LDW*a+,ai_i1;从存储体加载 ai 计算最后的结果.return sum.endproc,5.3.2 使用汇编优化器产生优化循环,【例5.21】完整的浮点点积的线性汇编代码.global _dotp_dotp:.cproc a,b.reg sum,sum0,sum1,a,b.reg ai1:ai,bi1:bi,pi,pi1MVK 50,cntr;cntr=100/2ZERO sum0;相乘的结果result=0ZERO sum1;相乘的结果result=0LOOP:.trip 50LDDW*a+,ai1:ai;从存储体加载ai 计算最后的结果.return sum.endproc,5.3.2 最后的汇编,1.定点的例子2.浮点的例子3.消除额外指令(1)定点点积的例子(2)浮点点积的例子4.循环灌入(1)定点点积的例子(2)浮点点积的例子5.移除多余的SUB指令6.性能比较,5.4 多周期循环的模迭代,5.4.1 转换C代码为线性汇编【例5.30】加权矢量和内核循环的线性汇编代码。LDH*aptr+,ai;aiLDH*bptr+,bi;biMPY m,ai,pi;m*aiSHR pi,15,pi_scaled;(m*ai)15ADD pi_scaled,bi,ci;ci=(m*ai)15+biSTH ci,*cptr+;存储 cicntrSUB cntr,1,cntr;循环计数器递减cntrB LOOP;跳转到 loop,5.4.2 确定最小迭代间隔,1.展开的加权矢量和的C代码2.转换展开的内核循环为线性汇编3.确定新的最小迭代间隔,5.4.3 画相关性图,图5-11把相关性图均匀分成了两个部分,最小迭代间隔为2。,5.4.4 线性汇编资源分配,【例5.33】带资源分配的加权矢量和的线性汇编程序。LDW.D2*A4+,A2;ai 跳转至 loop,5.4.5 模迭代间隔编排,1.资源冲突2.生命太长3.解决生命生命太长的问题4.安排剩余指令,5.4.6 使用汇编优化器出来加权矢量和,例5.34为加权矢量和的线性汇编,该代码作为汇编优化器的输入,由汇编优化器产生软件流水循环。【例5.34】加权矢量和的线性汇编。,5.4.7 最后汇编,该代码包括如下优化:,由于第次迭代的STHci+1与第+1次迭代的STHci并行执行,为防止STHci+执行次,而STHci执行次,对循环限定执行49次,但在循环退出后安排ADD ci+1和STHci+指令;用于ADD指令的mask由MVK和MVKH指令设置;数组C的奇元素指针也在前面填充部分设置。【例5.35】加权矢量和汇编代码。,5.5 循环传递路径,5.5.1 将C代码的内核循环转换为线性汇编【例5.37】IIR内核循环的线性汇编。LDH*xptr+,xi;xi+1MPY c1,xi,p0;c1*xiLDH*xptr,xi+1;xi+1MPY c2,xi+1,p1;c2*xi+1ADD p0,p1,s0;c1*xi+c2*xi+1LDH*yptr+,yi;yiMPY c3,yi,p2;c3*yiADD s0,p2,s1;c1*xi+c2*xi+1+c3*yiSHR s1,15,yi+1;yi+1STH yi+1,*yptr;存储 yi+1cntrSUB cntr,1,cntr;循环计数器递减cntrB LOOP;跳转至loop,5.5.2 画相关性图,图5-15是IIR滤波器的相关性图,从存yi+1到取yi之间形成了一个循环传递路径,由于存取指令使用相同的存储器流水线。,5.5.3 确定最小迭代间隔,1.画新的相关性图图5-16中所示是一个循环传递路径为4(2+1+1)的新的相关性图,因为MPY p2指令能够直接从寄存器中读取yi+1,因此循环传递路径可以减少6个周期,,5.5.3 确定最小迭代间隔,2.新的TMS320C6x指令(内核循环)【例5.38】循环传递路径较小的IIR内核循环的线性汇编。LDH*xptr+,xi;xi+1MPY c1,xi,p0;c1*xiLDH*xptr,xi+1;xi+1MPY c2,xi+1,p1;c2*xi+1ADD p0,p1,s0;c1*xi+c2*xi+1MPY c3,y,p2;c3*yiADD s0,p2,s1;c1*xi+c2*xi+1+c3*yiSHR s1,15,y;yi+1STH y,*yptr+;存储 yi+1cntrSUB cntr,1,cntr;循环计数器递减cntrB LOOP;跳转至loop,5.5.4 线性汇编资源分配,【例5.39】带分配资源的IIR内核循环线性汇编。LDH.D1*A4+,A2;xi+1MPY.M1 A6,A2,A5;c1*xiLDH.D1*A4,A3;xi+1MPY.M1X B6,A3,A7;c2*xi+1ADD.L1 A5,A7,A9;c1*xi+c2*xi+1MPY.M2X A8,B2,B3;c3*yiADD.L2X B3,A9,B5;c1*xi+c2*xi+1+c3*yiSHR.S2 B5,15,B2;yi+1STH.D2 B2,*B4+;存储 yi+1A1 SUB.L1 A1,1,A1;循环计数器递减A1 B.S1 LOOP;跳转至loop,5.5.5 线模迭代间隔安排,表5-14是IIR滤波器的模迭代间隔表,表中SHR指令及时在周期10结束,以便下次迭代的MPY p2在周期11读取其结果。,5.5.6 使用汇编优化器处理IIR滤波器,【例5.40】IIR滤波器的线性汇编。.global _iir_iir:.cproc x,y,c1,c2,c3.reg xi,xi1,yi1.reg p0,p1,p2,s0,s1,cntrMVK 100,cntr;cntr=100LDH.D2*y+,yi1;yi+1LOOP:.trip 100LDH.D1*x+,xi;xiMPY.M1 c1,xi,p0;c1*xiLDH.D1*x,xi1;xi+1MPY.M1X c2,xi1,p1;c2*xi+1ADD.L1 p0,p1,s0;c1*xi+c2*xi+1MPY.M2X c3,yi1,p2;c3*yiADD.L2X s0,p2,s1;c1*xi+c2*xi+1+c3*yiSHR.S2 s1,15,yi1;yi+1STH.D2 yi1,*y+;存储 yi+1cntr SUB.L1 cntr,1,cntr;循环计数器递减cntr B.S1 LOOP;跳转至 loop.endproc,5.5.7 最后汇编,例5.41是IIR滤波器的最后汇编代码,代码中,循环外有一个取y0指令,除此之外没有取y数组指令,执行该代码需要408个周期(4100)+8)。【例5.41】IIR滤波器的汇编代码。,5.6 循环中的IF-Then-Else语句,5.6.1 IF-Then-Else的C代码【例5.42】IF-Then-Else的C代码。int if_then(short a,int codeword,int mask,short theta)int i,sum,cond;sum=0;for(i=0;i 32;i+)cond=codeword,5.6.2 转换C代码为线性汇编,【例5.43】IF-Then-Else内核循环的线性汇编。AND codeword,mask,cond;cond=codeword 循环,5.6.3 画相关性图,图5-17是If-Then-ElseC代码的相关性图。,5.6.4 确定最小迭代间隔,从表5-15中可以看出,没有一个资源是使用超过两次的,因此,最小迭代间隔仍然为2。,5.6.5 线性汇编资源分配,【例5.44】If-Then-Else代码的线性汇编。.global _if_then_if_then:.cproc a,cword,mask,theta.reg cond,if,ai,sum,cntrMVK 32,cntr;cntr=32ZERO sum;sum=0LOOP:.trip 32AND.S2X cword,mask,cond;cond=codeword 循环.return sum.endproc,5.6.6 最后汇编,例5.45是软件流水后的最后汇编代码,该循环代码的性能为70个周期。【例5.45】If-Then-Else 汇编代码。,5.6.7 性能比较,【例5.46】循环次数大于3的If-Then-Else汇编代码。,5.7 循环展开,5.7.1 展开IF-Then-Else的C代码【例5.47】if-Then-Else的C代码。,5.7.2 C代码转换会线性汇编,【例5.48】循环展开的If-Then-Else内核线性汇编。AND codeword,maski,condi;condi=codeword 循环,5.7.3 画相关性图,可以画出循环展开后的If-Then-Else代码的相关性图如图5-18所示,A侧有9条指令,B侧有7条指令。,5.7.4 确定最小迭代间隔,从表5-16中看出,没有一个资源使用超过两次,所以最小迭代间隔仍然为3。,5.7.5 线性汇编资源安排,划分好相关性图并确定最小迭代间隔为3以后,便可对指令安排功能单元和寄存器,但安排中必须确保没有资源使用多于3次。例5.49所示为带功能单元和寄存器的线性汇编代码。【例5.49】完全循环展开的If-Then-Else的线性汇编。,5.7.6 最后汇编,例5.50给出了软件流水的最后汇编代码,该循环的执行周期数为53。【例5.50】展开的If-Then-Else汇编代码。,5.8 生命太长问题,5.8.1 具有生命太长问题的C代码例5.51所示是具有生命太长问题的C代码,该代码不能靠重新安排父指令解决生命太长问题,尽管从C代码中不能明显地看出来。【例5.51】具有生命太长问题的C代码。,5.8.2 C代码转换为线性汇编,【例5.52】生命太长内核循环的线性汇编。LDH*aptr+,ai;从存储体加载aiLDH*bptr+,bi;从存储体加载biMPY ai,c,a0;a0=ai*cSHR a0,15,a1;a1=a0 15MPY a1,d,a2;a2=a1*dADD a2,a0,a3;a3=a2+a0ADD sum0,a3,sum0;sum0+=a3MPY bi,c,b0;b0=bi*cSHR b0,15,b1;b1=b0 15MPY b1,e,b2;b2=b1*eADD b2,b0,b3;b3=b2+b0ADD sum1,b3,sum1;sum1+=b3cntrSUB cntr,1,cntr;循环计数器递减cntrB LOOP;跳转到loop,5.8.3 画相关性图,图5-19所示为生命太长代码相关性图,该算法包含3个各自独立的图,其中两个独立图中有分开的联合路径,从a0到a3与从b0到b3。,5.8.4 确定最小迭代间隔,根据图5-19的相关性图和线性汇编指令可得出生命太长代码的资源表如表5-17所示。,5.8.4 确定最小迭代间隔,图5-20是加MV指令的新相关图,该图左边的叉路由MV指令分成两段。,5.8.5 线性汇编资源安排,例5.53是根据相关图得出的安排功能单元的线性汇编,此处使用了两个2x和一个1x通路,c、d、和e可以载入循环外的另一端寄存器中。【例5.53】生命太长代码的线性汇编。,5.8.6 带MV指令的最后汇编,例5.54是带有MV指令的生命太长代码的最后汇编代码,执行该代码需要212个周期(200*100+11+1)。【例5.54】带有MV指令的生命太长代码的最后汇编代码。,5.9 消除冗余取数,5.9.1 转换C代码为线性汇编【例5.57】FIR滤波器内核循环的线性汇编。LDH.D2*x_1+2,x1;x1=xj+i+1LDH.D1*h+2,h0;h0=hiMPY.M1 x0,h0,p00;x0*h0MPY.M1X x1,h0,p10;x1*h0ADD.L1 p00,sum0,sum0;sum0+=x0*h0ADD.L2X p10,sum1,sum1;sum1+=x1*h0LDH.D1*x+2,x0;x0=xj+i+2LDH.D2*h_1+2,h1;h1=hi+1MPY.M2 x1,h1,p01;x1*h1MPY.M2X x0,h1,p11;x0*h1ADD.L1X p01,sum0,sum0;sum0+=x1*h1ADD.L2 p11,sum1,sum1;sum1+=x0*h1ctr SUB.S2 ctr,1,ctr;循环计数器递减ctr B.S2 LOOP;跳转至loop,5.9.2 画相关性图,图5-21是消除冗余取后的FIR滤波器的相关性图。,5.9.3 确定最小迭代间隔,表5-18是FIR滤波器代码的资源表,可以确定最小迭代间隔为2,这意味着每个周期可执行两个乘累加操作。,5.9.4 线性汇编资源分配,【例5.58】例 FIR滤波器的线性汇编。,5.9.5 最后汇编,该嵌套循环执行的总周期数为2350,此处每个外循环都有15个周期的开销:9个周期执行内环填充;6个周期执行到外环的跳转。【例5.59】例消除冗余取指令的最终FIR滤波器汇编代码。,5.10 存储体,5.10.1 FIR滤波器的内核循环【例5.60】FIR滤波器最后汇编代码的内核循环。LOOP:ADD.L2X A8,B9,B9;sum1+=x1*h0|ADD.L1 A7,A9,A9;sum0+=x0*h0|MPY.M2 B1,B0,B7;*x1*h1|MPY.M1X B1,A1,A8;*x1*h0|B2 B.S2 LOOP;*跳转至内循环|LDH.D1*A5+2,A1;*h0=hi|LDH.D2*B5+2,B1;*x1=xj+i+1ADD.L1X B7,A9,A9;sum0+=x1*h1|ADD.L2 B8,B9,B9;sum1+=x0*h1|MPY.M2X A0,B0,B8;*x0*h1|MPY.M1 A0,A1,A7;*x0*h0|B2 SUB.S2 B2,1,B2;*内循环计数器递减|LDH.D2*B4+2,B0;*h1=hi+1|LDH.D1*A4+2,A0;*x0=xj+i+2,5.10.1 FIR滤波器的内核循环,画出数组的奇偶元素的读取安排在同一循环周期内的FIR滤波器相关图,如图5-24所示。,5.10.2 展开的FIR滤波器的C代码,例5.61是展开内核循环后的FIR滤波器C代码,该方法增加了安排指令的灵活性,而在不考虑数组存储形式和存储器block的情况下,写出不产生存储体冲突的FIR滤波器代码。【例5.61】展开内核循环后的FIR滤波器C代码。,5.10.3 将C代码转换为线性汇编,例5.62为循环展开的FIR滤波器C代码内核循环的线性汇编。【例5.62】展开的FIR滤波器内核循环线性汇编。,5.10.4 画相关性图,图5-25是不存在存储器冲突的FIR滤波器的相关性图。,5.10.5 含有.mptr命令的展开后FIR线性汇编,例5.63给出了具有.mptr伪指令的展开FIR滤波器内核循环的线性汇编,.mptr伪指令允许汇编优化器根据特定指针寄存器和存储器访问信息,确定两个存储器操作是否存在bank冲突。【例5.63】展开的FIR滤波器线性汇编。,5.10.6 线性汇编资源分配,随着一个循环内的指令数的增加,对该循环内的每个数值安排特定的寄存器越来越困难,由于TMS320C6000仅有32个寄存器,如果一个循环内有33条指令,且每一条指令都有一个数值,则这些数值不能单独占用一个寄存器,而是由该循环中不在相同周期存活的数值分享寄存器,手工安排寄存器虽然不复杂,但是可能会很慢。,5.10.7 确定最小迭代间隔,如表5-19所示为FIR滤波器代码资源,没有存储器冲突的FIR滤波器的最小迭代间隔应该是4,这意味着每周期完成2个乘累加。,5.10.8 最后汇编,例5.64是消除冗余取和无存储器冲突的FIR滤波器的最后汇编代码,该代码的执行周期数为2402(50(8*4+10+6)+2),其外环开销为16个周期。【例5.64】消除冗余取和无存储器冲突的FIR滤波器汇编代码。,5.11 软件流水外循环,5.11.1 展开FIR滤波器的C代码【例5.65】循环展开后的FIR滤波器C代码。,5.11.2 最后汇编,例5.66是软件流水外环的FIR滤波器的最后汇编代码。在内循环后的每条指令注释中使用了e、p或o标记,分别表示指令是排空、填充和外环指令。【例5.66】消除冗余取、无存储器冲突和软件流水外环的FIR滤波器汇编代码。,5.12 同内循环一起条件执行外循环,5.12.1 展开FIR滤波器的C代码【例5.67】展开后的FIR滤波器C代码。,5.12.2 将内核循环的C代码转换为线性汇编,【例5.68】展开后的FIR内核循环的线性汇编。,5.12.3 将外环的C代码转换为线性汇编,【例5.69】FIR滤波器外环线性汇编。sctr SUB sctr,1,sctr;存储循环计数器递减!sctr SHR sum07,15,y0;(sum0 15)!sctr SHR sum17,15,y1;(sum1 15)!sctrSTH y0,*y+2;yj=(sum0 15)!sctr STH y1,*y_1+2;yj+1=(sum1 15)!sctr MVK 4,sctr;复位存储循环计数器pctr SUB pctr,1,pctr;复位循环计数器指针递减!pctr SUB x,rstx2,x;复位 x ptr!pctr SUB x_1,rstx1,x_1;复位 x_1 ptr!pctr SUB h,rsth1,h;复位 h ptr!pctr SUB h_1,rsth2,h_1;复位 h_1 ptr!pctr MVK 4,pctr;复位指针复位循环计数器,5.12.4 展开FIR滤波器的C代码,由例5.70可看出内循环与外循环总指令数为38条,显然不能使用4周期循环,为减少外环开销,又不降低内环吞吐量,必须再展开一次内循环,例为展开后的FIR滤波器C代码,其每次内环迭代处理8个元素。【例5.70】展开的FIR滤波器C代码。,5.12.5 C代码转换为线性汇编(内核循环),该代码中指令有如下的调整:,使用LDW指令代替LDH指令,以减少循环的取指数;移位和存储指令紧跟在LDW指令后;sum0和sum1的第一个ADD指令是存储计数的条件执行指令,因为当sctr=0时,一个内循环已结束,新的内循环第一次迭代开始启动,第一个ADD不应该将p00与前次循环的sum07相加;sum0的第一个ADD和第一个MPY p00的结果写入同一寄存器,第2个ADD读取p00与p01。【例5.71】条件地执行外环的FIR滤波器线性汇编。,5.12.6 确定最小迭代间隔,根据表5-20可得出最小迭代将为8,这意味着每个周期仍执行两个乘累加。,5.12.7 最后汇编,例5.72给出了外环条件地与内环并行执行的FIR滤波器的最后汇编代码。【例5.72】FIR滤波器最后汇编代码。,5.12.8 性能比较,该代码的循环计数为1612:50(84+0)+12,并且消除了外循环带来的开销,表5-21为FIR滤波器代码的性能比较。,5.13 通用目标文件格式(COFF),5.13.1 段(sections)图5-26所示为一个假想的目标存储器和目标文件各个段之间的关系。,5.13.2 汇编器对段的处理,1.未初始化段2.初始化段3.命名段4.子段5.使用SECTIONS伪指令,5.13.3 连接器对段的处理,1.默认的存储器分配图5-28所示为把两个文件连接到一起的过程。,5.13.3 连接器对段的处理,2.在存储器映射图内放置各段图5-28解释了连接器组合各个段的缺省方法,有时用户可能不想用缺省的方法,例如,可能不想把所有的.text组合成单一的.text段;或者可能想把一个命名段置于一个.data段通常所在的位置。绝大多数存储器映像图含有不同长度不同类型的存储器(RAM ROM EPROM等)用户可能希望把一个段放在一种指定类型的存储器内。,

    注意事项

    本文(线性汇编优化代码.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开