如果我没有错的话,ldrb r3, [r1], #1
将需要3个指令周期,类似地,add r4, r1, #2
将需要1个指令周期这里不讨论联锁延迟,但我不知道cmp r4, r3
需要多少个周期?
请注意:它是带有ARM9TDMI管道计时的ARM ASSEMBLY。
你的问题与你的同学相似,使用的代码相似
环路核心是
ldrb r3, [r1], #1 ; 3 cycles
eor r3, r3, r2 ; 1 cycle
strb r3, [r0], #1 ; 1 cycle
cmp ip, r0 ; 1 cycle
bne .L3 ; 3 cycles
ldrb
,eor r3,r3,r2
是一个类似于图7.2的联锁,需要两个联锁循环- CCD_ 6和CCD_
- CCD_ 8是三个循环
有关管道阶段,请参见第2.2节。大约需要9个周期。章节来自ARM9TDMI TRM。
ldmia [r1], {r4,r5,r6,r7,r8,r9,r10,r11} # 3 cycle
eor r4,r4,r2 # 1 cycle
eor r5,r5,r2 # 1 cycle
eor r6,r6,r2 # 1 cycle
eor r7,r7,r2 # 1 cycle
eor r8,r8,r2 # 1 cycle
eor r9,r9,r2 # 1 cycle
eor r10,r10,r2 # 1 cycle
eor r11,r11,r2 # 1 cycle
stmia [r0], {r4,r5,r6,r7,r8,r9,r10,r11} # 1 cycle
对于32字节的传输来说,这是12个周期,因此速度大约是它的24倍。如图7-4所示,首先使用R4是有益的。
在13个循环时,此交替循环将花费更长的时间。
invert:
ldrb r5, [r1], #1 ; 3 cycles
eor r5, r5, r2 ; 1 cycle
strb r5, [r0], #1 ; 1 cycle
add r4, r4, #1 ; 1 cycle
cmp r4, r3 ; 1 cycle
bxge lr ; 3 cycles
b invert ; 3 cycles
这种修改给出了9个循环,与gcc、相同
invert:
ldrb r5, [r1], #1 ; 2 cycles
add r4, r4, #1 ; 1 cycle
eor r5, r5, r2 ; 1 cycle
strb r5, [r0], #1 ; 1 cycle
cmp r4, r3 ; 1 cycle
blt invert ; 3 cycles
bx lr ; 0 cycles, not in loop
然而,这是另一条指令。