stp aarch64指令必须与“非连续寄存器对”一起使用

时间:2014-08-08 04:01:52

标签: assembly arm cpu-registers arm64

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

但是我看到示例代码也在做这类事情(并不是说代码是正确的!)。如果是这种情况,我也会明确地使用术语重叠而不是连续。

有什么想法吗?

1 个答案:

答案 0 :(得分:10)

它主要强调与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编码有足够的空间来编码两个目标寄存器,这意味着它们可以是任意顺序的任意两个寄存器,即它们允许是非连续的 - 是权限,而不是限制

请注意,自完整obsolete发布以来,该特定文档为ARMv8 ARM,其具有适当的详细说明页面,应略微不明确。

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