版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C6XX優(yōu)化經(jīng)驗(yàn)總結(jié)優(yōu)化經(jīng)驗(yàn)總結(jié)一、一、c6xc6x 的編譯的常用選項(xiàng)的編譯的常用選項(xiàng)(一)c6x的編譯程序?yàn)閏l6x.exe”使用的方法CI6xoptionsfilenamesCI6x:編譯程序Options:編譯選項(xiàng)Filenames:C或匯編源文件說明:編譯選項(xiàng)是一個(gè)字母或者兩個(gè)字母,對(duì)大小寫不敏感。編譯選項(xiàng)的前面需要有一個(gè)一”符號(hào)。一個(gè)字母的選項(xiàng)可以合并在一起。比如一 sgq”與一sgq”相同。兩個(gè)字母的選項(xiàng)如果第一個(gè)字母相同也可以合并在一起。 比如一mgt”與一mgmt相同。(二)有關(guān)優(yōu)化的選項(xiàng)-mt:表示在程序中沒有使用alaising技術(shù),這使得編譯器可以進(jìn)行比較好的優(yōu)化。-03
2、:對(duì)文件級(jí)別進(jìn)行最強(qiáng)的優(yōu)化,一般在編譯時(shí)應(yīng)該使用這個(gè)選項(xiàng)。但是在個(gè)別情況下使用這個(gè)選項(xiàng)優(yōu)化程序可能會(huì)出現(xiàn)錯(cuò)誤(-o2有相同現(xiàn)象,-o0和-o1不會(huì)出現(xiàn)錯(cuò)誤)??赡苁窃趦?yōu)化循環(huán),組織流水線的時(shí)候發(fā)生錯(cuò)誤。如果有這種現(xiàn)象出現(xiàn)可以同時(shí)使用-g選項(xiàng),程序優(yōu)化就不會(huì)出現(xiàn)錯(cuò)誤,但是優(yōu)化效果會(huì)下降。另外可以調(diào)整程序的表達(dá)方式,可能會(huì)避免編譯器發(fā)生錯(cuò)誤。-pm:在程序級(jí)別進(jìn)行優(yōu)化??梢詫⑺晕募?lián)合在一起進(jìn)行優(yōu)化,主要有去掉沒有被調(diào)用的函數(shù)、總是常數(shù)的變量以及沒有使用的函數(shù)返回值。 建議由程序員自己進(jìn)行這種優(yōu)化工作。 使用這個(gè)選項(xiàng)在win98下編譯可能會(huì)出現(xiàn)找不到編譯程序的情況。-msO:不使用冗余循環(huán)進(jìn)行優(yōu)
3、化,減小程序的大小。一般情況下這個(gè)選項(xiàng)對(duì)程序大小的優(yōu)化作用不明顯。-mhn:去掉流水線的epilog,減小程序的大小。這個(gè)選項(xiàng)的作用比較明顯。但是有可能出現(xiàn)讀取地址超出有效范圍的問題,所以要在數(shù)據(jù)段的開始和結(jié)尾處增加一些pading,或者在分配內(nèi)存時(shí)保證數(shù)組的前面和后面一段范圍內(nèi)都是有效的地址??蛇x的參數(shù)n給出這種pading的長(zhǎng)度字節(jié)數(shù)。(三)保留編譯和優(yōu)化信息的選項(xiàng)-k:保留優(yōu)化后生成匯編語言文件。-s:匯編語言文件中加入優(yōu)化信息,如果沒有則加入C語言源程序作為注釋。-mw:在匯編語言文件加入軟件流水線信息。(四)有關(guān)調(diào)試和剖析的選項(xiàng)-g:允許符號(hào)調(diào)試,在“out”文件中包含符號(hào)信息和行號(hào)
4、信息,可以在c語言級(jí)別進(jìn)行調(diào)試和剖析。使用聯(lián)合使用一g、一mt和一o3可以保證能夠進(jìn)行符號(hào)調(diào)試的情況下最大限度的優(yōu)化。-mg:允許profile優(yōu)化后的程序。在“out”文件中包含符號(hào)信息和很少的行號(hào)信息。允許在c語言的函數(shù)基本進(jìn)行剖析。如果聯(lián)合使用這兩個(gè)選項(xiàng),一g選項(xiàng)可能被忽略,結(jié)果與只用一mg相同。(五)其它類型-mln:生成大內(nèi)存模式的程序。一mIO:缺省情況下將集合變量(數(shù)組和結(jié)構(gòu))作為far型。-ml1:缺省情況下將全部函數(shù)作為far型-ml2:等于-ml0加-ml1-ml3:缺省情況下將全部數(shù)據(jù)和函數(shù)作為far型(六)建議使用的編譯方式CI6xgkmto3mwss“filename
5、方式1用于程序的調(diào)試,這種方式具有比較強(qiáng)的優(yōu)化能力,并且支持符號(hào)調(diào)試。在編譯的過程中不會(huì)發(fā)生錯(cuò)誤。由于生成的“out”文件中包含了符號(hào)信息和行號(hào)信息,所以比較大。CI6xkmgt03mwss“filename方式2用于程序的剖析(profile),這種方式的優(yōu)化能力幾乎最強(qiáng)(絕大多數(shù)情況下與方式3相同),并且支持對(duì)程序進(jìn)行profile。文件中只包含了符號(hào)信息和很少的行號(hào)信息,所以“out”文件比較小。CI6xkmto3mwss“filename方式3用于最終的發(fā)行版本程序, 可以對(duì)程序進(jìn)行最強(qiáng)的優(yōu)化, 并且去掉了全部的符號(hào)和行號(hào)信息,所以“out文件比較小。由多個(gè)文件組成的程序應(yīng)該編寫mak
6、efile,將編譯參數(shù)放在該文件中,并在其中說明使用的編譯器的版本號(hào)。(七)連接參數(shù)heap:指定堆的大小stack:指定棧的大小連接的各種選項(xiàng)應(yīng)該統(tǒng)一放在“cmd”文件中二、雙重循環(huán)和多重循環(huán)的優(yōu)化總結(jié)雙重循環(huán)多重循環(huán)看起來比較復(fù)雜,但實(shí)際上多重循環(huán)優(yōu)化方法比較簡(jiǎn)單,就在于一個(gè)字:拆,一旦完成這一步之后,多重循環(huán)就成為單層循環(huán),優(yōu)化就可以按照普通的單層循環(huán)來做了。多重循環(huán)的特點(diǎn)是在優(yōu)化器優(yōu)化時(shí)只在最內(nèi)層循環(huán)中形成一個(gè)pipeline,這樣循環(huán)語句就不能充分利用C6的軟件流水線,而且對(duì)于內(nèi)部循環(huán)的次數(shù)較少的情況,消耗在prolog和eplog上的cycle數(shù)也是不可忽視的。針對(duì)這種狀況可以考慮
7、將多重循環(huán)拆開形成一個(gè)單層循環(huán),可以拆外層循環(huán)也可以拆內(nèi)層循環(huán),一般視具體情況而定。這樣就可以充分利用優(yōu)化器構(gòu)成的Pipeline。如下例:voidfir2(constshortinput,constshortcoefs,shortout)inti,j;intsum=0;for(i=0;i40;i+)for(j=0;j15);內(nèi)層循環(huán)循環(huán)次數(shù)較少,運(yùn)算量也不大,資源方面只占用了一個(gè)乘法器,一個(gè)cycle只使用一次乘法器,而事實(shí)上我們可以在一個(gè)cycle內(nèi)使用兩個(gè)乘法器, 所以還可以充分利用另外的一個(gè)乘法器。因此考慮將內(nèi)層循環(huán)拆開來執(zhí)行,如下:voidfir2_u(constshortinput
8、,constshortcoefs,shortout)inti,j;intsum;for(i=0;i15);這樣雖然代碼長(zhǎng)度增加了,可變成了單循環(huán),所有的運(yùn)算都參加到pipeline中來,在Pipedloopkernal中產(chǎn)生每一個(gè)cycle內(nèi)都使用了兩個(gè)乘法器, 充分利用了DSP內(nèi)部的資源, 提高了運(yùn)行效率。又如下例:tot=4;for(k=0;k4;k+)max=0;for(i=k;i44;i+=STEP)s=0;for(j=i;j(Word32)0)max=s;tot=L_add(tot,L_shr(max,1);在這個(gè)多層循環(huán)中一共有三層循環(huán),而最內(nèi)層的循環(huán)的運(yùn)算量很小,只有一次乘累加操
9、作,而我們知道C6中一個(gè)packet中可以做兩個(gè)乘累加運(yùn)算,所以為了增加內(nèi)部循環(huán)的運(yùn)算,減少外部循環(huán)的層數(shù),我們可以將第一層循環(huán)的操作拆開,其負(fù)責(zé)的運(yùn)算加入到內(nèi)部循環(huán)中,也就是在內(nèi)層循環(huán)中一次做四次的乘累加運(yùn)算,這樣將多次操作形成pipeline,提高了運(yùn)行效率,優(yōu)化后的C代碼如下:tot=4;max0=0;max1=0;max2=0;max3=0;for(i=0;i16*/aReg=(aReg/65536);aReg=floor(aReg);/*(unsigned)low1*(signed)high2*/aReg+=(double)(Oxffff&L_var1)*(double)L_
10、shr(L_var2,16)*2.0;/*(unsigned)low2*(signed)high1*/aReg+=(double)(Oxffff&L_var2)*(double)L_shr(L_var1,16)*2.0;/*16*/aReg=(aReg/65536);aReg=floor(aReg);/*(signed)high1*(signed)high2*/aReg+=(double)(L_shr(L_var1,16)*(double)(L_shr(L_var2,16)*2.0;/*saturateresult.*/lvar=L_saturate(aReg);return(Ivar
11、);2、改編后的代碼:staticinlineWord32L_mpy_ll(Word32L_var1,Word32L_var2)Word32aReg_hh;Word40aReg,aReg,aReg_lh,aReg_hl;aReg_ll=(Word40)_mpyu(L_va門,L_var2)16;aRegh=(Word40)_mpyluhs(L_var1,L_var2);aReg_hl=(Word40)_mpyhslu(L_var1,L_var2);aReg_hh=_smpyh(L_va門,L_var2);aReg=_lsadd(aRegi_ll,sadd(aRegh,aReg_hl);aReg
12、=sadd(aReg15,aReg_hh);return(_sat(aReg);3、優(yōu)化方法說明:C6000編譯器提供的intrinsic可快速優(yōu)化C代碼,intrinsic用前下劃線表示同調(diào)用函數(shù)一樣可以調(diào)用它,即直接內(nèi)聯(lián)為C6000的函數(shù)。例如,在上例的源代碼中沒有使用intrinsics,每一行C代碼需多個(gè)指令周期,在改編后的代碼中,每一行代碼僅需一個(gè)指令周期。例如,“aRegil=(Word40)_mpyu(L_var1,L_var2)16”中“_mpy就是一個(gè)intrinsics函數(shù),它表示兩個(gè)無符號(hào)數(shù)的高16位相乘,結(jié)果返回。C6000支持的所有intrinsics指令及其功能參見
13、TMS320C6000系列DSP的原理與應(yīng)用一書的第265、266頁,該書還提供了另外的例子。這些內(nèi)聯(lián)函數(shù)定義在CCS所在的C6000/CGTOOLS/Include目錄下的C6X.h文件中。下面這個(gè)例子是C6000的“ProgrammersGuide”上提取的使用intrinsics優(yōu)化C代碼的例子。源代碼:intdotprod(constshort*a,constshort*b,unsignedintN)inti,sum=0;for(i=0;iN;i+)sum+=ai*bi;returnsum;改編后代碼:intdotprod(constint*a,constint*b,unsignedi
14、ntN)inti,sum1=0,sum2=0;for(i=0;i1);i+)sum1+=_mpy(ai,bi);sum2+=_mpyh(ai,bi);returnsum1+sum2;技巧:在C語言的調(diào)試全部通過以后,可以嘗試將盡可能多的語句使用intrinsics函數(shù)加以改編,尤其在循環(huán)體內(nèi),這種改編可以大幅度減少執(zhí)行時(shí)間。四、1、源代碼:voidfir_fxd1(shortinput,shortcoefs,shortout)inti,j;for(i=0;i40;i+)for(j=0;j16;j+)outi*16+j=coefsj*inputi+15-j;2、改編后的代碼:voidfir_fx
15、d2(constshortinput,constshortcoefs,shortout)inti,j;for(i=0;i40;i+)for(j=0;j16;j+)outi*16+j=coefsj*inputi+15-j;3、優(yōu)化方法說明:C6000編譯器如果確定兩條指令是不相關(guān)的, 則安排它們并行執(zhí)行。 關(guān)鍵字const可以指定一個(gè)變量或者一個(gè)變量的存儲(chǔ)單元保持不變。這有助于幫助編譯器確定指令的不相關(guān)性。例如上例中,源代碼不能并行執(zhí)行,而結(jié)果改編后的代碼可以并行執(zhí)行。4、技巧:使用const可以限定目標(biāo),確定存在于循環(huán)迭代中的存儲(chǔ)器的不相關(guān)性。五、1、源代碼:voidvecsum(short*
16、sum,short*in1,short*in2,unsignedintN)inti;for(i=0;i2;_nassert(N=20);for(i=0;isz;i+=2)sumi=_add2(in1i,in2i);sumi+1=_add2(in1i+1,in2i+1);3、優(yōu)化方法說明:源代碼中,函數(shù)變量的定義是short*sum,short*in1,short*in2,改編后的代碼函數(shù)變量是int*sum,constint*in1,constint*in2,整數(shù)類型由16位改編成32位,這時(shí)使用內(nèi)聯(lián)指令“_add2一次可以完成兩組16位整數(shù)的加法,效率提高一倍。注意這里還使用了關(guān)鍵字cons
17、t和內(nèi)聯(lián)指令_nassert優(yōu)化源代碼。4、技巧:用內(nèi)聯(lián)指令_add2、_mpyhl、_mpylh完成兩組16位數(shù)的加法和乘法,效率比單純16位數(shù)的加法和乘法提高一倍。六、六、ifif elsels 語句的優(yōu)化語句的優(yōu)化(一)1、源代碼:if(sub(Itpg,LTP_GAIN_THR1)=0)Ida-elseif(sub(ltpg,LTP_GAIN_THR2)LTP_GAIN_THR1)+(ltpgLTP_GAIN_THR2);(二)1、源代碼:if(adapt=0)if(filt5443)result=0;elseif(filt16;/Q15result=_ssub(16384,_smpy
18、(24660,filt)16);elseresult=0;2、改編后的代碼:filt1=_sshl(filt,18)16;tmp=_smpy(24660,filt1)16;result=_ssub(16384,tmp*(filt=0);result=result*(!(adapt!=0)|(filt5443);(三)1、源代碼:staticWord16saturate(Word32L_var1)Word16swOut;if(L_var1SW_MAX)swOut=SW_MAX;giOverflow=1;elseif(L_var1SW_MIN)swOut=SW_MIN;giOverflow=1;e
19、lseswOut=(Word16)L_va門;/*automatictypeconversion*/return(swOut);2、改編后的代碼:staticinlineWord32L_shl(Word32a,Word16b)return(Word32)(b)(-(b):_sshl(a),(b);3、優(yōu)化方法說明:如果在循環(huán)中出現(xiàn)if.else.語句,由于if.else.語句中有跳轉(zhuǎn)指令,而每個(gè)跳轉(zhuǎn)指令有5個(gè)延遲間隙,因此程序執(zhí)行時(shí)間延長(zhǎng);另外,循環(huán)內(nèi)跳轉(zhuǎn)也使軟件流水受到阻塞。直接使用邏輯判斷語句可以去除不必要的跳轉(zhuǎn)。例如在例1的源代碼最多有兩次跳轉(zhuǎn),而改編后不存在跳轉(zhuǎn)。例2和例3同樣也去掉了
20、跳轉(zhuǎn)。4、技巧:盡可能地用邏輯判斷語句替代if.else.語句,減少跳轉(zhuǎn)語句。七、七、1、源程序dm=0 x7FFF;for(j=0;jnsizm;j=add(j,1)if(dj=dm)dm=dj;jj=j;indexm=jj;2、優(yōu)化后的程序dm0=dm1=0 x7fff;d0=(Word16*)&d0;di=(Word16*)&d1;#pragmaMUST_ITERATE(32,256,64);for(j=0;jNsiz;j+=2)n0=*d0;d0+=2;n1=*d1;di+=2;if(n0jjO)?jj1:jjO;3、優(yōu)化說明求數(shù)組的最小值程序,優(yōu)化時(shí)為了提高程序效率在
21、一個(gè)循環(huán)之內(nèi)計(jì)算N=1,3,5和n=2,4,6的最小值,然后在比較二者的大小以求得整個(gè)數(shù)組的最小值。八、1、源程序for(k=0;k0)if(il_subfr)codei=add(codei,4096);codveck+=(2*L_SUBFR);elseif(il_subfr)codei=sub(codei,4096);index=add(index,16);if(indxtrack0)indxtrack=index;elseif(indexAindxtrack)&16)=0)if(sub(indxtrack,index)=0)indxtrack=shl(indxtrack&1
22、6),3)+shr(extract_l(L_mult(indxtrack&15),NB_POS),1)+(index&15);elseindxtrack=shl(index&16),3)+shr(extract_l(L_mult(index&15),NB_POS),1)+(indxtrack&15);elseif(sub(indxtrack&15),(index&15)=0)indxtrack=shl(index&16),3)+shr(extract_l(L_mult(index&15),15);elseindxtrack
23、=shl(indxtrack&16),3)+shr(extract_l(L_mult(indxtrack&15),2、優(yōu)化后的程序for(k=0;k16;track=i-index*5;con=(j0);codveck=codveck+110*con;index=index+(!con)*16;conn=(i0)?1:-1;codei=codei+4096*conn*cono;nO=index;tO=indxtrack;nl=n0&16;NB_POS),1)+(indxtrack&NB_POS),1)+(index&15);t1=to&16;n2
24、=nO&15;t2=tO&15;tmpO=(_sshl(n1,19)16)+n2*NB_POS+t2;tmpl=(_sshl(t1,19)16)+t2*NB_POS+n2;conp=(n1=t1)&(tOn0)|(n1!=t1)&(t2=n2);tmp=conp*tmp0+(!conp)*tmp1;if(t00)indxtrack=n0;elseindxtrack=tmp;3、優(yōu)化說明源程序中在循環(huán)中含有許多的if結(jié)構(gòu),在優(yōu)化時(shí)對(duì)if結(jié)構(gòu)首先進(jìn)行化簡(jiǎn),再將化簡(jiǎn)后的if結(jié)構(gòu)用條件運(yùn)算表達(dá)式進(jìn)行改寫,最后使循環(huán)可以Pipeline。九、1、源程序for(i=0;in
25、;i+)max=-32767;for(j=0;j=0)max=tmp2j;ix=j;tmp2ix=-32768;tmpi=ix;2、優(yōu)化后的程序if(n0n1)temp=n0;n0=n1;n1=temp;if(n1n2)temp=n1;n1=n2;n2=temp;if(n2n3)temp=n2;n2=n3;n3=temp;if(n3n4)temp=n3;n3=n4;n4=temp;if(n0n1)temp=n0;n0=n1;n1=temp;if(n1n2)temp=n1;n1=n2;n2=temp;if(n2n3)temp=n2;n2=n3;n3=temp;if(n0n1)temp=n0;n0
26、=n1;n1=temp;if(n1n2)returnn1;3、優(yōu)化說明源程序也為一個(gè)求中值的問題,由于已知循環(huán)次數(shù)固定為5,因此將循環(huán)展開使用if語句直接求取中值。十、1、源程序staticWord16Bin2int(Word16no_of_bits,Word16*bitstream)Word16value,i,bit;value=0;for(i=0;ino_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=35);for(i=
27、0;iloopmode;i+)value=value*2+*bitsp+;j-;if(j=0)*prm+=value;value=0;j=j1;j1=j2;j2=j3;j3=j4;j4=*bitnop+;3、優(yōu)化說明源程序按照數(shù)據(jù)位流定義取出參數(shù),為雙重循環(huán)結(jié)構(gòu),優(yōu)化中采用重新根據(jù)位流的bit長(zhǎng)度定義循環(huán)次數(shù),化簡(jiǎn)為單重循環(huán),然后優(yōu)化循環(huán),去除boundary,使pipeline的數(shù)目最小。十、十、copycopy 程序的優(yōu)化程序的優(yōu)化1、源代碼:Word16i;for(i=0;iL;i+)yi=xi;2、改編代碼:(1) 要求數(shù)組長(zhǎng)度能被2整除Word32i;Word32temp;int*p
28、1=(int*)&x0;int*q1=(int*)&y0;for(i=0;iL/2;i+)temp=*p1+;*q1+=temp;(2) 要求數(shù)組長(zhǎng)度能被4整除Word32i;Word32temp1,temp2;Word32*pin1,*pin2,*pout1,*pout2;pin1=(Word32*)&x0;pin2=(Word32*)&x2;pout1=(Word32冷&y0;pout2=(Word32冷&y2;for(i=0;iL/4;i+)tempi=*pin1;temp2=*pin2;pin1+=2;pin2+=2;*pout1=tem
29、pi;*pout2=temp2;pout1+=2;pout2+=2;3、優(yōu)化方法說明:把一次循環(huán)拷貝一個(gè)word16的數(shù)改為一次循環(huán)拷貝2個(gè)word16或4個(gè)word16的數(shù)。4、技巧:充分利用c6xx次讀取32位數(shù)的特性,并利用一個(gè)指令周期能讀取兩個(gè)數(shù)據(jù)的特點(diǎn)。十二、十二、set_zeroset_zero 程序的優(yōu)化程序的優(yōu)化1、源代碼:Word16i;for(i=0;iL;i+)xi=0;2、改編代碼:(1)數(shù)組長(zhǎng)度能被2整除Word32i;int*x1=(int*)&x0;for(i=0;iL/2;i+)*x1+=0;(2)數(shù)組長(zhǎng)度能被4整除Word32i;int*x1=(int
30、*)&x0;int*x2=(int*)&x2;for(i=0;iL/4;i+)*x1=0;*x2=0;x1+;x2+;x1+;x2+;3、優(yōu)化方法說明:把一次循環(huán)為一個(gè)word16的數(shù)賦值改為一次為2個(gè)或4個(gè)word16的數(shù)賦值。4、技巧:充分利用C6XX次讀取32位數(shù)的特點(diǎn),并利用一個(gè)指令周期能讀取兩個(gè)數(shù)據(jù)的特點(diǎn)。十十三、三、32bit 數(shù)與數(shù)與 16bit 數(shù)相乘數(shù)相乘1、源代碼:L_tmp0=Mac_32_16(L_32,hi1,Io1,Io2);2、改編代碼:L_tmp0=_sadd(_sadd(_smpyhl(hl32,Io2),(_mpyus(hl32,Io2)16
31、)vv1),L_32);3、優(yōu)化方法說明:hI32是32bit的數(shù),hi1和lol是16bit的數(shù),且hI32=hi1vv16+lolvv1,即hi1和lol分別是hI32的高16位數(shù)和低16位數(shù)。函數(shù)Mac_32_16(L_32,hi1,Io1,Io2).實(shí)現(xiàn)L_32=L_32+(hi1*lo2)vv1+(Io1*lo2)15)vv1源代碼是把一個(gè)32位的數(shù)拆成兩個(gè)16位的數(shù)與一個(gè)16位的數(shù)相乘,優(yōu)化后的代碼不拆開32位的數(shù),直接用32位的數(shù)與16位的數(shù)相乘。運(yùn)用這種方法必須保證hl32的最低一位數(shù)必須為0,否則應(yīng)用指令_clr(hl32,0,0)把最低位清零。4、技巧:源代碼中的低16位數(shù)
32、lol是hl32的低16位右移一位得到的(留出一位符號(hào)位)。在與Io2相乘時(shí)又右移了15位,所以在改編代碼中右移16位,并且是以無符號(hào)數(shù)與lo2相乘。十四、十四、32bit 數(shù)與數(shù)與 32bit 數(shù)相乘數(shù)相乘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)vv1)+(_mpyhslu(hl2_32,hl1_32)16)vv1),L_32);3、優(yōu)化方法說明:兩個(gè)32位的數(shù)相乘,不必分成四個(gè)16位的數(shù)相乘,直接用32
33、位相乘。其中:hl1_32=hi1v16+lo1v1,hl2_32=hi2v16+lo2v15+(lo1*hi2)15)vv14、技巧:低16位與高16位相乘時(shí),低16位使用的是無符號(hào)數(shù)。十五、十五、16 位除法的優(yōu)化位除法的優(yōu)化1、源代碼:Word16div_s(Word16var1,Word16var2)實(shí)現(xiàn)var1/var2Word16var_out=0;Word16iteration;Word32L_num=(Word32)var1;Word32L_denom=(Word32)var2;for(iteration=0;iteration15;iteration+)var_out=1;L
34、_num=L_denom)L_num=L_sub(L_num,L_denom);var_out=add(var_out,1);return(var_out);2、改編代碼:Word16div_s1(Word16var1,Word16var2)Word32var1int;Word32var2int;var1int=var116;var2int=var215;var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2in
35、t);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);var1int=_subc(var1int,var2int);varlint=_subc(va門int,var2int);varlint=_subc(var1int,var2int);varlint=_subc(var1int,var2int);varlint=_subc(var1int,var2int);return(varlint&Oxffff);3、優(yōu)化方法說明:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年全球及中國動(dòng)態(tài)運(yùn)動(dòng)傳感器行業(yè)營(yíng)銷動(dòng)態(tài)及盈利前景預(yù)測(cè)報(bào)告
- 2024-2030年全球及中國光束輪廓儀行業(yè)發(fā)展前景及投資戰(zhàn)略研究報(bào)告
- 2024-2030年全球及中國人工智能行業(yè)應(yīng)用狀況及投資運(yùn)作模式分析報(bào)告
- 2024-2030年全球與中國公路車行業(yè)發(fā)展現(xiàn)狀及投資經(jīng)營(yíng)模式分析報(bào)告
- 2024-2030年中國高端私人會(huì)所市場(chǎng)競(jìng)爭(zhēng)趨勢(shì)展望及投資經(jīng)營(yíng)模式分析報(bào)告
- 2024-2030年中國高折射玻璃微珠行業(yè)發(fā)展態(tài)勢(shì)及項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國餅干行業(yè)銷售預(yù)測(cè)及未來5發(fā)展趨勢(shì)報(bào)告
- 2024-2030年中國食品配料行業(yè)市場(chǎng)銷售模式及投資盈利分析報(bào)告
- 2024-2030年中國革基布無綜布行業(yè)發(fā)展?fàn)顩r規(guī)劃分析報(bào)告
- 2024-2030年中國鋁土礦行業(yè)發(fā)展趨勢(shì)預(yù)測(cè)規(guī)劃分析報(bào)告
- 如何培養(yǎng)孩子的自信心課件
- 中醫(yī)藥膳學(xué)全套課件
- 頸脊髓損傷-匯總課件
- 齒輪故障診斷完美課課件
- 2023年中國鹽業(yè)集團(tuán)有限公司校園招聘筆試題庫及答案解析
- 大班社會(huì)《特殊的車輛》課件
- 野生動(dòng)物保護(hù)知識(shí)講座課件
- 早教托育園招商加盟商業(yè)計(jì)劃書
- 光色變奏-色彩基礎(chǔ)知識(shí)與應(yīng)用課件-高中美術(shù)人美版(2019)選修繪畫
- 前列腺癌的放化療護(hù)理
- 機(jī)場(chǎng)英語-Airport-English課件
評(píng)論
0/150
提交評(píng)論