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 字节。