STP AAarch64 指令必须与"non-contiguous pair of registers"一起使用



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]!

是非法的。然而,我不相信这是事实。我见过这样做的示例代码,而且我还设法让(苹果的)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

[这是因为指令中只有空间编码一个目标寄存器,所以体系结构必须有一种定义的方法来推断第二个目标寄存器]

相比之下,A64 LDP/STP编码有空间编码两个目标寄存器,这意味着它们可以是任意顺序的任意两个寄存器,即允许不连续- 这是一种许可,而不是限制

请注意,自从完整的ARMv8发布以来,这个特定的文档已经过时了,它有适当的详细指令页,应该稍微不那么模棱两可。

* T32 (Thumb)编码没有这个限制,因为缺乏条件谓词意味着有空间来编码第二个目标寄存器,就像A64一样。

最新更新