为什么 aarch64 force qword aligned even transferred size is dword?

why aarch64 force qword aligned even transferred size is dword?

下面的汇编代码将在 Xcode6.1.1 目标上导致 "exc_bad_access code=259" 在 iPad air2.

    // SP default 16 aligned on function entry,
    sub sp,sp,#8
    st1 {v8.1d},[sp],#8

而新版本不会

    sub sp,sp,#16
    st1 {v8.1d},[sp],#8

我在

上找到 ARMv8_ISA 文档提及 "aligned"

第 $3 章:大多数加载和存储都允许未对齐的地址,包括...SIMD 寄存器 第 $5.8.24.1 章:...a post-增量立即偏移量,如果存在,则必须为 8/16/24/32/48/64,具体取决于传输的元素数量。

以上代码传输大小为dword(8bytes),为什么要强制对齐qword?顺便说一句,我没有在 Android ndk r10 上测试过它,所以我不确定它是否受 aarch64 或 Xcode 的限制? 有什么建议吗?谢谢!

您确定是 "st1" 指令导致了崩溃吗?

您可以使用以下代码进行检查:

sub sp,sp,#16
st1 {v8.1d},[sp],#16

我在 x64 上遇到了类似的问题;这是另一条指令需要正确对齐的堆栈并导致崩溃。

--- 编辑 ---

对不起。我混淆了“[sp, #16]”和“[sp], #16”。

如果 "[sp], #16" 是 post-increment 那么测试应该是这样的:

sub sp,sp,#16
st1 {v8.1d},[sp,#8]
add sp,sp,#8

或者:

sub sp,sp,#8
st1 {v8.1d},[sp]