在AArch64中向/从堆栈中推送一个完整的128位NEON寄存器

时间:2016-10-26 20:02:10

标签: assembly stack arm arm64

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

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

但是,如何在AArch64中推送/弹出全部128位的NEON浮点寄存器?以下工作会吗? (我怀疑它不会减少/递增SP寄存器)

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

1 个答案:

答案 0 :(得分:1)

内存访问的简要说明(JOIN FETCH

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


此外,Qx寄存器也可以作为NEON / FTP Vx寄存器进行访问 (Floating-point and NEON scalar loads and stores
NEON and Floating-Point architecture

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


更实际的用法是保留所有" Callee保存的寄存器" (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