LDM/STM 或其等效指令(如 Thumb 指令 PUSH 或 POP)的執行週期數總是比 LDR/STR 或 LDRD/STRD 多(假設命中快取),因此暫存器結果延遲增加。將 LDM/STM 指令替換成 LDR/STR 或 LDRD/STRD 儘管會增加程式碼空間,但速度可能會更快。
LDMSTM_1 - 多重載入/儲存 1 個暫存器
使用常規的“載入/儲存”總是更好,因為速度更快。
LDMSTM_2 - 多重載入/儲存 2 個暫存器
使用“載入/儲存”雙字或兩條 LDR/STR 指令總是更好;因為速度更快,也節省程式碼空間。
LDMSTM_3 - 多重載入/儲存 2 個以上暫存器
如果要優化時間(程式碼執行很多次),建議使用 LDR/STR 或 LDRD/STRD 程式碼序列。如果要優化程式碼空間,建議使用 LDM/STM。
傳輸的暫存器越多,可從擴充套件的序列中獲得的增益百分比就越低。
原始程式碼
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 替代第二條與第三條指令。
原始程式碼
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 位元組。