我正在使用基于GCC 4.6.1的MinGW64构建来为Windows 64位目标进行开发。我正在尝试使用新的英特尔AVX指令,我的命令行参数是-march=corei7-avx -mtune=corei7-avx -mavx
。
然而,当在堆栈上分配局部变量时,我遇到了分段错误(segmentation fault)问题。GCC使用对齐移动指令VMOVAPS
和VMOVAPD
来移动__m256
和__m256d
型别,这些指令要求32字节对齐。然而,Windows 64位的栈仅有16字节对齐。
如何将GCC的堆栈对齐改为32字节?
我已经尝试过使用-mstackrealign
,但无济于事,因为它只能对齐到16字节。我也无法让__attribute__((force_align_arg_pointer))
有效,因为它仍然只会对齐到16个字节。我还没有找到其他可以解决此问题的编译器选项。非常感谢任何帮助。
编辑:
我尝试使用-mpreferred-stack-boundary=5
,但GCC说不支持5这个数值。我已经没有其他想法了。
__attribute__ ((aligned (32)))
也不被尊重?例如,如果您使用__m256 x __attribute__ ((aligned (32)))
。 - nosand $-32, %rsp
(或任何更高的对齐方式)来对需要溢出__m256
、__m512
或任何您使用alignas(32)
声明的对象或任何高于16的对象的函数进行堆栈对齐。MinGW gcc没有使用相同的序列来保存原始的rsp
并对其进行对齐,这似乎是一个奇怪的错误。 - Peter Cordes