DSP汇编中的结构体参数传入及使用、双条件操作
我的板子是c6740,开发中遇到几个汇编问题求教:
1. 结构体参数传入及使用
比如一个实现简单游程编码的测试程序,如下:
struct _STREAM
{
BYTE *buffer;
int size; //buffer长度
}
void encode(BYTE *pSrc, datasize, STREAM *pDstStream)
在DSP汇编中,A4接收pSrc,B4接收datasize, 问题:
--那哪个寄存器接收*pDstStream?是正常的A6接收,还是有特殊的寄存器?
--如何对结构体成员操作,如把数据存到buffer、size++等
2. 在汇编中如何写双条件判断语句啊?
如下面源程序中的!input && datasize?
while(!input && datasize)
{
numZeros++;
GetNextInput(input);
}
3.优化
如实现上面功能的汇编程序,因为程序需要一个字节一个字节去判断,然后进行操作,程序中有比较多的循环操作,
所以,在汇编中会出现比较多的NOP指令,这样程序性能会比较低吧?请问应该如何去提高程序性能呢?
[
本帖最后由 breeze505 于 2012-5-9 11:04 编辑 ]
此帖出自
小平头技术问答
* ===================== LOOP KERNEL ============================== *
MV .L1 A6, A_loopcount
loop:
LDB .D1T1 *A4++[1], A_x1
LDB .D2T2 *B4++[1], B_y1
SUB .L1 A_loopcount, 1, A_loopcount
CMPGT .L1 A_loopcount, 6, A_tmp
[A_tmp] B .S2 condition1
[A_tmp]ADDKPC loop, B3, 4
NOP 4
CMPGT .L1 A_loopcount, 3, A_tmp
[A_tmp] B .S2 condition2
[A_tmp]ADDKPC loop, B3, 4
NOP 4
CMPGT .L1 A_loopcount, 0, A_tmp
[A_tmp]B .S2 condition3
[A_tmp]ADDKPC loop, B3, 4
NOP 4
*===================== LOOP EPILOG ============================== *
[!A_loopcount]B .S2 B3 ;return
|| MVK .S1 1,A4 ;return 1
NOP 4
* ================= LOOP PROLOG ============================ *
condition1:
ADD .S1X A_x1, B_y1, A_sum
STB .D2T1 A_sum, *B_s++[1]
[A_loopcount] B .S2 B3
nop 5
condition2:
SUB .S1X A_x1, B_y1, A_sum
STB .D2T1 A_sum, *B_s++[1]
[A_loopcount] B .S2 B3
nop 5
condition3:
MPY .M1x A_x1, B_y1, A_sum
nop 1
STB .D2T1 A_sum, *B_s++[1]
[A_loopcount] B .S2 B3
nop 5
.end
因为这只是我的测试程序,我的正式程序比较长,所以写了个测试程序验证下这个结构是否能正常的执行。
;** --------------------------------------------------------------------------*
MV .L2X A4,B23 ; |50|
SUB .L1X A6,B4,A4 ; |55|
|| MVK .S1 640,A3 ; |55|
|| MVK .S2 664,B6 ; |55|
|| SUB .L2 B4,B23,B7 ; |55|
|| SUB .D2 B23,B4,B8 ; |55|
|| ADD .D1 4,A6,A16
CMPLT .L1 A4,A3,A4 ; |55|
|| SUB .S2X B4,A6,B5 ; |55|
|| CMPLT .L2 B8,B6,B6 ; |55|
|| MVK .S1 0x4000,A25
|| ADD .D1 2,A6,A5
CMPLT .L2 B5,14,B5 ; |55|
|| CMPLT .L1X B7,A3,A3 ; |55|
|| MV .S1 A25,A17
AND .L2X B5,A4,B5
|| AND .L1X A3,B6,A3
|| MVK .S1 0xa0,A4
XOR .L2 1,B5,B5
|| XOR .L1 1,A3,A3
MV .L2X A4,B6 ; |55|
AND .L1X A3,B5,A0 ; |55|
|| MV .L2 B23,B5
[ A0] B .S2 $C$L4 ; |55|
|| MV .L1X B4,A3
|| MV .S1 A0,A1 ; guard predicate rewrite
|| [!A0] LDH .D1T1 *+A6(10),A5
[!A1] MV .L2X A17,B22
|| [!A0] LDH .D1T2 *+A6(2),B21
[!A0] MV .L2X A3,B20
|| [!A0] LDH .D1T1 *A6,A7
[!A0] LDH .D1T1 *A16,A8
[!A0] LDH .D1T1 *+A16(2),A9
[!A0] LDH .D1T1 *+A16(4),A16
; BRANCHCC OCCURS {$C$L4} ; |55|
;** --------------------------------------------------------------------------*
SUB .L1X B6,1,A0
|| LDH .D1T1 *+A6(12),A6
;*----------------------------------------------------------------------------*
;* SOFTWARE PIPELINE INFORMATION
;*
;* Loop source line : 55
;* Loop opening brace source line : 56
;* Loop closing brace source line : 72
;* Known Minimum Trip Count : 160
;* Known Maximum Trip Count : 160
;* Known Max Trip Count Factor : 160
;* Loop Carried Dependency Bound(^) : 25
;* Unpartitioned Resource Bound : 11
;* Partitioned Resource Bound(*) : 13
;* Resource Partition:
;* A-side B-side
;* .L units 1 6
;* .S units 8 7
;* .D units 0 5
;* .M units 12 9
;* .X cross paths 13* 12
;* .T address paths 3 5
;* Long read paths 0 0
;* Long write paths 0 0
;* Logical ops (.LS) 0 13 (.L or .S unit)
;* Addition ops (.LSD) 0 0 (.L or .S or .D unit)
;* Bound(.L .S .LS) 5 13*
;* Bound(.L .S .D .LS .LSD) 3 11
;*
;* Searching for software pipeline schedule at ...
;* ii = 25 Did not find schedule
;* ii = 26 Schedule found with 1 iterations in parallel
;* Done
;*
;* Loop is interruptible
;* Collapsed epilog stages : 0
;* Collapsed prolog stages : 0
;*
;* Minimum safe trip count : 1
;*----------------------------------------------------------------------------*
$C$L1: ; PIPED LOOP PROLOG
;** --------------------------------------------------------------------------*
$C$L2: ; PIPED LOOP KERNEL
LDNDW .D2T2 *-B23(8),B25:B24 ; |58| <0,0> ^
NOP 1
LDNDW .D2T2 *-B23(24),B17:B16 ; |58| <0,2>
LDNDW .D2T2 *-B23(16),B19:B18 ; |58| <0,3>
NOP 1
SMPYHL .M2 B24,B22,B5 ; |71| <0,5> ^
SHR .S2 B24,1,B6 ; |71| <0,6>
|| SMPYHL .M2 B25,B22,B4 ; |71| <0,6> ^
SMPYHL .M1X B16,A6,A21 ; |71| <0,7>
|| SMPYHL .M2 B25,B21,B6 ; |71| <0,7>
|| SHR .S2 B25,1,B5 ; |71| <0,7>
|| SSUB .L2 B6,B5,B7 ; |71| <0,7> ^
SMPYHL .M1X B17,A5,A3 ; |71| <0,8>
|| SHR .S2 B16,1,B25 ; |71| <0,8>
|| SMPYHL .M2 B19,B22,B8 ; |71| <0,8>
|| SSUB .L2 B5,B4,B4 ; |71| <0,8> ^
SMPYHL .M1X B24,A8,A4 ; |71| <0,9>
|| SHR .S2 B19,1,B4 ; |71| <0,9>
|| SMPY .M2 B21,B4,B5 ; |71| <0,9> ^
LDW .D2T2 *B23++,B7 ; |71| <0,10>
|| SHR .S2 B18,1,B8 ; |71| <0,10>
|| SMPYHL .M2 B18,B22,B4 ; |71| <0,10>
|| SSUB .L2 B4,B8,B9 ; |71| <0,10>
|| SMPY .M1X A8,B7,A17 ; |71| <0,10> ^
SMPYHL .M1X B19,A9,A18 ; |71| <0,11>
|| SHR .S2 B5,15,B5 ; |71| <0,11> ^
SMPYHL .M2 B17,B22,B6 ; |71| <0,12>
|| SSUB .L2 B8,B4,B4 ; |71| <0,12>
|| SMPY .M1X A9,B9,A17 ; |71| <0,12>
|| SADD .S2 B6,B5,B5 ; |71| <0,12> ^
|| SHR .S1 A17,15,A19 ; |71| <0,12> ^
SMPYHL .M1X B18,A16,A20 ; |71| <0,13>
|| SHR .S2 B17,1,B8 ; |71| <0,13>
|| SMPYHL .M2 B16,B22,B9 ; |71| <0,13>
|| SADD .L2X B5,A4,B5 ; |71| <0,13> ^
SSUB .L2 B8,B6,B5 ; |71| <0,14>
|| SMPY .M1X A16,B4,A4 ; |71| <0,14>
|| SHR .S1 A17,15,A17 ; |71| <0,14>
|| SADD .S2X B5,A19,B4 ; |71| <0,14> ^
SHR .S1X B7,1,A18 ; |71| <0,15>
|| SSUB .L2 B25,B9,B6 ; |71| <0,15>
|| SADD .S2X B4,A18,B4 ; |71| <0,15> ^
SMPYHL .M2 B7,B22,B5 ; |71| <0,16>
|| SMPY .M1X A5,B5,A17 ; |71| <0,16>
|| SHR .S1 A4,15,A4 ; |71| <0,16>
|| SADD .L2X B4,A17,B4 ; |71| <0,16> ^
SMPY .M1X A6,B6,A19 ; |71| <0,17>
|| SADD .L2X B4,A20,B4 ; |71| <0,17> ^
SMPYHL .M1X B7,A7,A4 ; |71| <0,18>
|| SHR .S1 A17,15,A17 ; |71| <0,18>
|| SADD .L2X B4,A4,B4 ; |71| <0,18> ^
SSUB .L1X A18,B5,A3 ; |71| <0,19>
|| SHR .S1 A19,15,A18 ; |71| <0,19>
|| SADD .L2X B4,A3,B4 ; |71| <0,19> ^
SMPY .M1 A7,A3,A3 ; |71| <0,20>
|| SADD .L2X B4,A17,B4 ; |71| <0,20> ^
|| [ A0] BDEC .S1 $C$L2,A0 ; |55| <0,20>
SADD .L2X B4,A21,B4 ; |71| <0,21> ^
SHR .S1 A3,15,A3 ; |71| <0,22>
|| SADD .L2X B4,A18,B4 ; |71| <0,22> ^
SADD .L2X B4,A4,B4 ; |71| <0,23> ^
SADD .L2X B4,A3,B4 ; |71| <0,24> ^
STW .D2T2 B4,*B20++ ; |71| <0,25> ^
;** --------------------------------------------------------------------------*
$C$L3: ; PIPED LOOP EPILOG
;** --------------------------------------------------------------------------*
BNOP .S1 $C$L8,5 ; |55|
; BRANCH OCCURS {$C$L8} ; |55|
;** --------------------------------------------------------------------------*
$C$L4:
SUB .L1 A4,1,A3
|| LDH .D1T1 *+A5(10),A22
;*----------------------------------------------------------------------------*
$C$L5: ; PIPED LOOP PROLOG
SPLOOPD 11 ;33 ; (P)
|| LDH .D1T2 *+A5(6),B22
|| SUB .L1X B5,8,A26
|| MVC .S2X A3,ILC
;** --------------------------------------------------------------------------*
$C$L6: ; PIPED LOOP KERNEL
LDNDW .D1T1 *A26++(4),A17:A16 ; |57| (P) <0,0>
SPMASK D1
|| LDH .D1T2 *+A5(4),B21
SPMASK D1
|| LDH .D1T2 *+A5(2),B20
SPMASK D1,D2
|| LDH .D1T1 *A5,A24
|| SUB .D2 B5,16,B17
LDNDW .D2T2 *B17++(4),B19:B18 ; |58| (P) <0,4>
SPMASK D1
|| LDH .D1T1 *A6,A23
|| SHR .S1 A17,1,A6 ; |71| (P) <0,5>
SPMASK L1,D1
|| LDH .D1T1 *+A5(8),A21
|| MV .L1X B5,A4
|| SHR .S1 A16,1,A7 ; |71| (P) <0,6>
|| SMPYHL .M1 A17,A25,A5 ; |71| (P) <0,6>
SPMASK D1
|| SUB .D1 A4,24,A19
|| SMPYHL .M2X A16,B20,B6 ; |71| (P) <0,7>
|| SMPYHL .M1 A16,A25,A4 ; |71| (P) <0,7>
SMPYHL .M1 A17,A24,A4 ; |71| (P) <0,8>
|| SSUB .L1 A6,A5,A5 ; |71| (P) <0,8>
|| LDNDW .D1T1 *A19++(4),A9:A8 ; |58| (P) <0,8>
SHR .S2 B19,1,B7 ; |71| (P) <0,9>
|| SSUB .L1 A7,A4,A3 ; |71| (P) <0,9>
SPMASK L1
|| MV .L1X B4,A20
|| SMPYHL .M2 B19,B21,B4 ; |71| (P) <0,10>
SMPY .M1 A24,A5,A5 ; |71| (P) <0,11>
SMPYHL .M2X B18,A25,B16 ; |71| (P) <0,12>
|| SHR .S2 B18,1,B9 ; |71| (P) <0,12>
SMPYHL .M2X B19,A25,B9 ; |71| (P) <0,13>
|| SHR .S1 A5,15,A5 ; |71| (P) <0,13>
SSUB .L2 B9,B16,B8 ; |71| (P) <0,14>
|| SMPY .M2X B20,A3,B9 ; |71| (P) <0,14>
|| SADD .S1 A4,A5,A5 ; |71| (P) <0,14>
|| SMPYHL .M1 A9,A25,A28 ; |71| (P) <0,14>
SHR .S2X A8,1,B8 ; |71| (P) <0,15>
|| SMPY .M2 B22,B8,B9 ; |71| (P) <0,15>
|| SSUB .L2 B7,B9,B7 ; |71| (P) <0,15>
|| SMPYHL .M1 A8,A25,A27 ; |71| (P) <0,15>
SPMASK L1
|| MV .L1X B5,A18
|| SHR .S2 B9,15,B5 ; |71| (P) <0,16>
|| SADD .L2X A5,B6,B6 ; |71| (P) <0,16>
|| SMPYHL .M2 B18,B22,B5 ; |71| (P) <0,16>
SADD .L2 B6,B5,B7 ; |71| (P) <0,17>
|| SMPY .M2 B21,B7,B7 ; |71| (P) <0,17>
|| SHR .S2X A9,1,B6 ; |71| (P) <0,17>
SHR .S2 B9,15,B9 ; |71| (P) <0,18>
|| SADD .L2 B7,B4,B4 ; |71| (P) <0,18>
|| LDW .D1T1 *A18++,A6 ; |71| (P) <0,18>
SHR .S2 B7,15,B7 ; |71| (P) <0,19>
|| SSUB .L2X B6,A28,B16 ; |71| (P) <0,19>
SADD .L2 B4,B7,B4 ; |71| (P) <0,20>
|| SMPY .M2X A21,B16,B5 ; |71| (P) <0,20>
|| SMPYHL .M1 A9,A21,A17 ; |71| (P) <0,20>
SADD .S2 B4,B5,B8 ; |71| (P) <0,21>
|| SSUB .L2X B8,A27,B4 ; |71| (P) <0,21>
|| SMPYHL .M1 A8,A22,A7 ; |71| (P) <0,21>
SADD .L2 B8,B9,B16 ; |71| <0,22>
|| SMPY .M2X A22,B4,B5 ; |71| <0,22>
|| SHR .S2 B5,15,B8 ; |71| <0,22>
SHR .S1 A6,1,A16 ; |71| <0,23>
|| SMPYHL .M1 A6,A25,A6 ; |71| <0,23>
SADD .L1X B16,A17,A17 ; |71| <0,24>
|| SHR .S2 B5,15,B5 ; |71| <0,24>
|| SMPYHL .M1 A6,A23,A3 ; |71| <0,24>
SADD .L1X A17,B8,A4 ; |71| <0,25>
SADD .S1 A4,A7,A6 ; |71| <0,26>
|| SSUB .L1 A16,A6,A4 ; |71| <0,26>
SADD .L1X A6,B5,A4 ; |71| <0,27>
|| SMPY .M1 A23,A4,A3 ; |71| <0,27>
SADD .L1 A4,A3,A4 ; |71| <0,28>
SHR .S1 A3,15,A3 ; |71| <0,29>
SADD .S1 A4,A3,A3 ; |71| <0,30>
SPKERNEL 1,10
|| STW .D1T1 A3,*A20++ ; |71| <0,31>
;** --------------------------------------------------------------------------*
$C$L7: ; PIPED LOOP EPILOG
;** --------------------------------------------------------------------------*
$C$L8:
RETNOP .S2 B3,5 ; |75|
; BRANCH OCCURS {B3} ; |75|
请问这个怎么优化.....................................
一周热门 更多>