aarch64 架构没有多重存储和加载指令,即没有与 armv7 arch 中的 stm 和 ldm 等效的指令。相反,您必须使用 stp 和 ldp 指令来存储和加载寄存器对。
根据ARM参考手册:
http://www.element14.com/community/servlet/JiveServlet/previewBody/41836-102-1-229511/ARM.Reference_Manual.pdf
没有多寄存器 LDM、STM、PUSH 和 POP 指令,但可以使用非连续寄存器对的加载存储。
我的问题是,这里的不连续是什么意思或指的是什么?我的即时反应是,这意味着您不能在这些命令中使用连续编号的寄存器,例如
stp x0, x1, [sp, #-16]!
是非法的。但我不相信情况是这样。我已经看到示例代码正是这样做的,而且我还设法让(Apple 的)Clang 生成类似的代码,例如
stp x1, x0, [fp, #-16]!
我一生都无法思考连续性意味着什么。我认为这可能与使用重叠寄存器有关,例如
stp x0, x0, [sp, #-16]!
stp w0, x0, [sp, #-12]!
不过,我也见过示例代码执行此类操作(并不是说代码是正确的!)。如果是这种情况,我也会明确使用术语“重叠”而不是“连续”。
有任何想法吗?
主要是强调与A32(ARM)的对比LDRD/STRD指令*,只能加载一对连续的寄存器,其中最低的寄存器必须是偶数,即:
LDRD r0, r1, [sp] @ OK
LDRD r0, r7, [sp] @ <Rt> and <Rt2> are non-contiguous: invalid
LDRD r3, r4, [sp] @ Contiguous but <Rt> odd-numbered: invalid
[这是因为指令中只有空间来编码一个目标寄存器,因此架构必须有一种定义的方式来推断第二个目标寄存器。]
相比之下,A64LDP/STP编码有空间对两个目标寄存器进行编码,这意味着它们可以是任何顺序的任意两个寄存器,即它们是allowed不连续 -这是许可,而不是限制.
请注意,该特定文档是obsolete自完整版发布以来ARMv8 ARM,其中有适当的详细说明页面,应该稍微不那么模糊。
* The T32 (Thumb) encodings don't have this restriction, since the lack of a condition predicate means there's space to encode the second target register, much like A64.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)