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

转自: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 字节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值