多重加载/存储 n 个寄存器/警告

来源:互联网 发布:707的医药软件 编辑:程序博客网 时间:2024/06/07 06:04

转自:http://scc.qibebt.cas.cn/docs/optimization/VTune(TM)%20User's%20Guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/XScale_HH/LipsXSc/Load_Store_Multiple_of_n_Register.htm

XSC_LDMSTM_N

解释

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。

 备注

传输的寄存器越多,可从扩展的序列中获得的增益百分比就越低。

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