【问题标题】:Push and pop a full 128-bit NEON register to/from the stack in AArch64在 AArch64 中将一个完整的 128 位 NEON 寄存器推入/弹出堆栈
【发布时间】:2017-03-09 08:17:06
【问题描述】:

我在 AArch64 中找到了如何使用 STP/LDP 推送/弹出 64 位寄存器对的文档。我了解他们可以将 128 位 NEON 浮点寄存器的低 64 位作为参数,例如:

@ Push D0, D1
STP D0, D1, [SP, #-16]!
@ Pop D0, D1
LDP D0, D1, [SP], #16

但是,如何在 AArch64 中压入/弹出 NEON 浮点寄存器的完整 128 位?下面的工作吗? (我怀疑它不会减少/增加SP 寄存器)

STR Q0, [SP, #-16]!
LDR Q0, [SP], #16

【问题讨论】:

  • 我不明白为什么它不会更新SP。无论如何,如有疑问,请使用调试器:)
  • 当您尝试组装/运行它时发生了什么?你的指令集参考对此事有什么看法?
  • @Ross Ridge - stp q0, q1, [sp, #-(16*2)] 怎么样! ?
  • @Notlikethat,我还没有这样做,因为基础设施尚未设置。现在只是编码/设计。
  • 您意识到 ABI 只要求您存储前 64 位,对吧?您是为了遵守调用约定而保存寄存器,还是因为您需要为自己的目的而保存它们?

标签: assembly stack arm arm64


【解决方案1】:

内存访问的简要说明在这里(Floating-point and NEON scalar loads and stores

STR Q0, [sp, #-16]!      // Save 128b (16B)
STP Q0, Q1, [sp, #-32]!  // Save 2x128b (2 x 16B = 32B)


Qx 寄存器也可以作为 NEON/FTP Vx 寄存器访问。
(NEON and Floating-Point architecture)
(Vector register sizes)

st1 {v0.2d}, [sp]  // Save Q0 (V0 is 'vector' alias)


更实际的用法是保留所有“被调用者保存的寄存器”(v8-v15)

sub sp, sp, #func_stack_size
st1 { v8.2d,  v9.2d, v10.2d, v11.2d}, [sp], #64
st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp], #64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2016-12-04
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多