多重載入/儲存 n 個暫存器/警告

XSC_LDMSTM_N

解釋

LDM/STM 或其等效指令(如 Thumb 指令 PUSH 或 POP)的執行週期數總是比 LDR/STR 或 LDRD/STRD 多(假設命中快取),因此暫存器結果延遲增加。將 LDM/STM 指令替換成 LDR/STR 或 LDRD/STRD 儘管會增加程式碼空間,但速度可能會更快。

建議

備註

傳輸的暫存器越多,可從擴充套件的序列中獲得的增益百分比就越低。

示例 1

原始程式碼

LDM r0!, {r1,r2,r3,r4,r5};

替代性方案 1

LDR  r1, [r0], #4
LDR  r2, [r0], #4
LDR  r3, [r0], #4
LDR  r4, [r0], #4
LDR  r5, [r0], #4

 

替代性方案 2

LDR  r1, [r0], #4
LDR  r2, [r0], #4
LDR  r3, [r0], #4
LDRD r4, [r0], #8

備註

LDRD 具有對齊限制。Rd(目標暫存器)必須是第偶數個,EA(有效地址)必須是 8 位元組對齊的。

跟在 LDRD 後面的任何記憶體操作指令都會產生暫停,因此最好不要像上面的“替代性方案 2”那樣,使用 LDRD r2, [r0], #8 替代第二條與第三條指令。

示例 2

原始程式碼

STM r0!, {r1,r2,r3,r4,r5}

替代性方案 1

STR  r1, [r0], #4
STR  r2, [r0], #4
STR  r3, [r0], #4
STR  r4, [r0], #4
STR  r5, [r0], #4

替代性方案 2

STR  r1, [r0], #4
STRD r2, [r0], #8
STRD r4, [r0], #8

備註

STRD 有對齊限制。Rd 應該是偶數,EA 必須對齊 8 位元組。