0

如果我没记错的话ldrb r3, [r1], #1 ,需要 3 个指令周期,同样add r4, r1, #2需要 1 个指令周期,这里不讨论互锁延迟,但我很困惑需要多少个周期cmp r4, r3

请注意:它是带有 ARM9TDMI 流水线时序的 ARM ASSEMBLY。

4

1 回答 1

1

您的问题与您的同学相似并使用相似的代码

循环核心是,

        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

然而,这又是一条指令。

于 2021-03-28T17:33:09.723 回答