如果我没记错的话ldrb r3, [r1], #1
,需要 3 个指令周期,同样add r4, r1, #2
需要 1 个指令周期,这里不讨论互锁延迟,但我很困惑需要多少个周期cmp r4, r3
?
请注意:它是带有 ARM9TDMI 流水线时序的 ARM ASSEMBLY。
如果我没记错的话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 的互锁,需要两个互锁循环。str
并且cmp
是单循环。bne
是三个周期。有关流水线阶段,请参见第 2.2 节。它大约需要九个周期。部分来自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
然而,这又是一条指令。