【文章內容簡介】
指令編程的特點為 : ?用間接尋址方式獲得操作數,且只能用 AR2~AR5; ?占用的程序空間??; ?運行的速度快。 SZU- TI DSPs Lab Dr. JI ZHEN 31 雙操作數乘法 (例 ) 例 : 編制求解 ???201iayiix 的程序段。 本例主要說明在迭代運算過程中,利用雙操作數指令可以節(jié)省機器周期。迭代次數越多,節(jié)省的機器周期數也越多。 單操作數指令方案 雙操作數指令方案 LD 0 , B LD 0 , B STM a , AR 2 STM a , AR2 STM x , AR 3 STM x , AR3 STM 1 9 , BR C STM 1 9 , BRC RP TB do ne 1 RP TB do ne 1 LD *AR2+ , T 2T MPY *AR2 , *AR3+ , A 3T MPY *AR3+ , A AD D A , B AD D A , B do ne: STH B , @y do ne: STH B , @y STL B , @y+ 1 STL B , @y+ 1 節(jié)省的總機器周期數 =1T*N( 迭代次數 )= NT 。 編制求乘法累加和的程序段 SZU- TI DSPs Lab Dr. JI ZHEN 32 雙操作數乘法 (例 ) 例 : 進一步優(yōu)化 上 一 頁 中求解 ???201iayiix 的程序段。 上 一 頁 中,利用雙操作數指令進行乘法累加運算,完成 N 項乘積求和需 2N 個機器周期。 如果將乘法累加器單元、多總線以及硬件循環(huán)操作結合在一起,可以形成一個 優(yōu)化的乘法累加程序。 完成一個 N 項乘積求和的操作,只需要 N+2 個機器周期。 程序如下 : STM x , AR2 STM a , AR3 R P T Z A , 19 。2 個機器周期 M A C * A R 2 + , *AR3+ , A 。1 個機器周期 S T H A , @y S T L A , @y+1 SZU- TI DSPs Lab Dr. JI ZHEN 33 c54x可以利用長操作數 (32位 )進行長字運算。長字指令如: ? DLD Lmem, dst 。dst= Lmem ? DST src, Lmem 。Lmem = src ? DADD Lmem , src[, dst] 。dst= src+Lmem ? DSUB Lmem , src[, dst] 。dst= srcLmem ? DRSUB Lmem , src[, dst] 。dst= Lmem src SZU- TI DSPs Lab Dr. JI ZHEN 34 ?長操作數在存儲器的排列方法 ?偶地址排列法 ?奇地址排列法 ?長操作數地址排列法 ?指令中給出的地址為偶地址 ?存儲器中低地址存放高 16位 ?存儲器中高地址存放底 16位 SZU- TI DSPs Lab Dr. JI ZHEN 35 偶地址排列法舉例 DLD *AR3+, A 執(zhí)行前: 執(zhí)行后: A=00 0000 0000 A=00 6CAC BD90 AR3=0100 AR3=0102 ( 0100h) =6CAC( 高字)( 0100h) =6CAC ( 0101h) =BD90( 低字)( 0101h) =BD90 長操作數在存儲器的排列方法 奇地址排列法舉例 DLD *AR3+, A 執(zhí)行前: 執(zhí)行后: A=00 0000 0000 A=00 BD90 6CAC AR3=0101 AR3=0103 ( 0100h) =6CAC( 低字)( 0100h) =6CAC ( 0101h) =BD90( 高字)( 0101h) =BD90 SZU- TI DSPs Lab Dr. JI ZHEN 36 長字運算(例) 例: 計算 Z32=X32+Y32 標準運算 長字運算 LD @xhi, 16, A DLD @xhi, A ADDS @xlo, A DADD @yhi, A ADD @yhi, 16, A DST A, @zhi ADDS @ylo, A (3個字, 3個 T) STH A, @zhi STL A, @zlo (6個字, 6個 T) 符號位不擴展的加法 SZU- TI DSPs Lab Dr. JI ZHEN 37 8. 并行運算(例) ? 同時利用 D總線和 E總線 ? 4種并行運算指令: ? 并行 加載 和 乘法 指令 ? 并行 加載 和 存儲 指令 ? 并行 存儲 和 乘法 指令 ? 并行 存儲 和 加 /減法 指令 SZU- TI DSPs Lab Dr. JI ZHEN 38 并行運算 (例 ) 例: 編寫計算 z=x+y 和 f=e+d 程序段 .bss x, 3 .bss d, 3 STM x, AR5 STM d, AR2 LD 0, ASM LD *AR5+, 16, A ADD *AR5+, 16, A ST A, *AR5 ||LD *AR2+, B ADD *AR2+, 16, B STH B, *AR2 SZU- TI DSPs Lab Dr. JI ZHEN 39 64位加 /減法運算 例:編寫計算 Z64=W64+X64Y64 的程序段 W, X, Y和結果 Z都是 64位數,它們都是由兩個 32位的長字組成。利用長字指令可以完成 64位數的加 /減法。 DLD @w1, A 。A=w1w0 DADD @x1, A 。A=w1w0+x1x0, 產生進位 C DLD @w3, B 。B=w3w2 ADDC @x2, B 。B=w3w2+x2+C ADD @x3, 16, B 。B=w3w2+16x3 DSUB @y1, A 。A=w1w0+x1x0y1y0, 產生借位 C’ DST A, @z1 。z1z0=w1w0+x1x0y1y0 SUBB @y2, B 。B=w3w2+x3x2+Cy2C’ SUB @y3, 16, B 。B=w3w2+x3x2+Cy3y2C’ DST B, @z3 。z3z2=w3w2+x3x2+Cy3y2C’ 由于沒有長字帶進(借)位加 /減法指令,上述程序中只能用 16位帶進(借)位指令 ADDC和 SUBB。 SZU- TI DSPs Lab Dr. JI ZHEN 40 32位乘法運算 SZU- TI DSPs Lab Dr. JI ZHEN 41 32位乘法運算 例:編寫計算 W32=X32*Y32 的程序段 W, X, Y和結果 Z都是 64位數,它們都是由兩個 32位的長字組成。利用長字指令可以完成 64位數的加 /減法。 STM x0, AR2 STM y0, AR3 LD *AR2, T 。T=x0 MPYU *AR3+, A 。A=u(x0)*u(y0) STL A, @w0 。w0=u(x0)*u(y0) LD A, 16, A 。A=A16 MACSU *AR2+, *AR3, A 。A+=s(y1)*u(x0) MACSU *AR3+, *AR2, A 。A+=s(x1)*u(y0) STL A, @w1 。w1=A LD A, 16, A 。A=A16 MAC *AR2, *AR3, A ; A+=s(x1)*s(y1) STL A, @w2 。w2=A的底 16位 STH A, @w3 。w3=A的高 16位 SZU- TI DSPs Lab Dr. JI ZHEN 42 32位乘法運算 (續(xù) ) 程序中利用的兩條乘法指令 ? MACSU Xmem, Ymem, src ; 帶符號數與無符號數相乘并累加 ; src= S(Xmem)*U(Ymem)+src ? MAC Xmem, Ymem, src ; 帶符號數與帶符號數相乘并累加 ; src=S(Xmem)*S(Ymem)+src ? MPYU Smem, dst 。無符號數相乘 。dst=U(T)*U(Smem) SZU- TI DSPs Lab Dr. JI ZHEN 43 8 小數