我在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
答案 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