对于 ARM Aarch64 的 NEON 编码,如何将寄存器推送到堆栈?似乎 STMFD 不是 Aarch64 指令集的一部分?
Posted
技术标签:
【中文标题】对于 ARM Aarch64 的 NEON 编码,如何将寄存器推送到堆栈?似乎 STMFD 不是 Aarch64 指令集的一部分?【英文标题】:For the NEON coding for ARM Arch64,How do you push the registers to the stack??Seems like STMFD is not a part of the instruction set on Arch64? 【发布时间】:2014-02-22 07:19:20 【问题描述】:对于 ARM Arch64 的 NEON 编码,如何将寄存器压入堆栈??好像 STMFD 不是 Arch64 上指令集的一部分?你只是将寄存器对一一保存到堆栈中?
【问题讨论】:
在这种情况下,我通常只是通过使用-S
标志生成程序集来查看编译器是如何做到的。
【参考方案1】:
AArch64 设计者特意去掉了STM
/LDM
指令,大概是为了简化指令调度和故障处理。
3.5 内存加载-存储 3.5.1 批量转账
A64 中不存在 LDM、STM、PUSH 和 POP 指令,但是可以使用 LDP 构建批量传输 和 STP 指令加载和存储一对独立的 来自连续内存位置的寄存器,并且支持 访问普通内存时未对齐的地址。 LDNP 和 STNP 指令还提供“流式传输”或“非临时”提示 数据不需要保留在缓存中。 PRFM (预取内存)指令还包括“流式传输”或 “非临时”访问,并允许将预取定位到 特定的缓存级别。
(来自ARMv8 ISA Overview)
所以是的,你应该使用多个 STP
/LDP
指令来代替。
【讨论】:
但是这段代码“linux/arch/arm64/kvm/hyp.S”使用了AARCH64的push和pop指令。 @AmitSinghTomar 对我来说似乎是 GNU 汇编程序扩展。它可能被翻译成stp/ldp。尝试组装和拆卸它。 你能举例说明如何将一个完整的 V 寄存器推入/弹出堆栈吗?STP
和 LDP
采用 2 个 64 位寄存器,但 NEON V 寄存器是 128 位。
我也很想看看这样的例子。
@gregoiregentil @SergeRogatch 来自我周围的随机可执行文件:STP D9, D8, [SP,#-0x10]!
。我想要保存完整的 Qn,您首先必须将上半部分移动到单独的 D 寄存器中,但由于 ABI 只需要保留 D regs(参见 IHI0055B),这通常不是问题。以上是关于对于 ARM Aarch64 的 NEON 编码,如何将寄存器推送到堆栈?似乎 STMFD 不是 Aarch64 指令集的一部分?的主要内容,如果未能解决你的问题,请参考以下文章
Aarch64 NEON 中的 UADDL 与 UADDL2
Debug系列aarch64下unrecognized command line option ‘-mfpu=neon‘