gpt4 book ai didi

assembly - stp aarch64指令必须与 "non-contiguous pair of registers"一起使用

转载 作者:行者123 更新时间:2023-12-01 23:34:13 24 4
gpt4 key购买 nike

aarch64 架构没有多重存储和加载指令,即没有与 armv7 arch 中的 stm 和 ldm 等效的指令。相反,您必须使用 stp 和 ldp 指令来存储和加载寄存器对。

根据ARM引用手册:

http://www.element14.com/community/servlet/JiveServlet/previewBody/41836-102-1-229511/ARM.Reference_Manual.pdf

There are no multiple register LDM, STM, PUSH and POP instructions, but load-store of a non-> contiguous pair of registers is available.

我的问题是,这里的非连续是什么意思或指的是什么?我的即时 react 是,这意味着您不能在这些命令中使用连续编号的寄存器,例如

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

[这是因为指令中只有空间来编码一个目标寄存器,因此架构必须有一种定义的方式来推断第二个目标寄存器。]

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

请注意,该特定文档是 obsolete自发布完整版ARMv8 ARM ,其中有适当的详细说明页面,应该稍微不那么模糊。

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

关于assembly - stp aarch64指令必须与 "non-contiguous pair of registers"一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25195861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com