This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于C6000 SPLOOPD汇编指令的一些请教

一个加法c程序代码:

void testADD1(int *a,int *b,int *c,int NUM){
int i;
for(i=0;i<NUM;i++){
c[i]=a[i]+b[i];
}
}

对应的汇编代码为:

.sect ".text"
.clink
.global _testADD2

;******************************************************************************
;* FUNCTION NAME: testADD1 *
;* *
;* Regs Modified : A3,A4,A5,B0,B4,B5 *
;* Regs Used : A3,A4,A5,A6,B0,B3,B4,B5,B6 *
;* Local Frame Size : 0 Args + 0 Auto + 0 Save = 0 byte *
;******************************************************************************
_testADD2: ;参数传递分被对应的寄存器为A4 B4 A6 B6
;** --------------------------------------------------------------------------*

CMPGT .L2 B6,0,B0 ; |11| if(B6>0) B0=1;else B0=0;
|| MV .L1 A6,A5 ; |9| 第三个参数A6赋值给A5

[!B0] BNOP .S1 $C$L4,5 ; |11| 执行5个空指令后再跳转
|| [ B0] SUB .L2 B6,1,B5 ; B5=B6-1
;两个指令是并行的,以B0是否为0为条件

; BRANCHCC OCCURS {$C$L4} ; |11|
;*----------------------------------------------------------------------------*
;* SOFTWARE PIPELINE INFORMATION
;*
;* Loop found in file : ../src/AMStest.c
;* Loop source line : 11
;* Loop opening brace source line : 11
;* Loop closing brace source line : 13
;* Known Minimum Trip Count : 1
;* Known Max Trip Count Factor : 1
;* Loop Carried Dependency Bound(^) : 7
;* Unpartitioned Resource Bound : 2
;* Partitioned Resource Bound(*) : 2
;* Resource Partition:
;* A-side B-side
;* .L units 0 0
;* .S units 0 0
;* .D units 2* 1
;* .M units 0 0
;* .X cross paths 1 0
;* .T address paths 2* 1
;* Long read paths 0 0
;* Long write paths 0 0
;* Logical ops (.LS) 0 0 (.L or .S unit)
;* Addition ops (.LSD) 1 0 (.L or .S or .D unit)
;* Bound(.L .S .LS) 0 0
;* Bound(.L .S .D .LS .LSD) 1 1
;*
;* Searching for software pipeline schedule at ...
;* ii = 7 Schedule found with 2 iterations in parallel
;* Done
;*
;* Loop will be splooped
;* Collapsed epilog stages : 0
;* Collapsed prolog stages : 0
;* Minimum required memory pad : 0 bytes
;*
;* Minimum safe trip count : 1
;*----------------------------------------------------------------------------*
$C$L1: ; PIPED LOOP PROLOG

SPLOOPD 7 ;14 ; (P)
|| MV .L2 B4,B5 ;第2个参数传递到B4
|| MVC .S2 B5,ILC

;** --------------------------------------------------------------------------*
$C$L2: ; PIPED LOOP KERNEL

LDW .D1T1 *A4++,A3 ; |12| (P) <0,0> ^
|| LDW .D2T2 *B5++,B4 ; |12| (P) <0,0> ^

NOP 4 ; 加载指令需要有4个delay slot,因为下面需要使用到A3.B4,所以需要等上4个时钟周期
ADD .L1X B4,A3,A3 ; |12| (P) <0,5> ^
STW .D1T1 A3,*A5++ ; |12| (P) <0,6> ^
SPKERNEL 0,1
;** --------------------------------------------------------------------------*
$C$L3: ; PIPED LOOP EPILOG
;** --------------------------------------------------------------------------*
$C$L4:
RETNOP .S2 B3,5 ; |14|放回地址放在B3中
; BRANCH OCCURS {B3} ; |14|

我想请教的是SPLOOPD ii中Iii为什么是7,还有从哪里可以看出循环的次数为寄存器B6的值