我有一个广泛使用SSE内联函数的大型代码库,该代码库仅在GCC下为x86_64平台开发。堆栈上分配了很多__m128
和float[4]
,在x86_64上使用 GCC 进行编译时,它们始终与 16 字节对齐。
我们正在测试 clang,它在堆栈变量上未对齐的 SSE 加载和存储上崩溃。
似乎我可以一一修复所有错误__attribute__ ((aligned(16)))
有没有办法强制 clang 将所有变量全局对齐到 16 个字节?我在文档中找不到任何内容。
__m128
局部变量应与任何编译器对齐 16 字节,并且不需要任何额外的工作。 float[4]
只有 4 个字节对齐,因此您需要为这些添加合适的指令。大多数人为此使用宏,例如
#ifdef _MSC_VER
// MSVC...
#define ALIGN(n) declspec(align(n))
#else
// the civilised world...
#define ALIGN(n) __attribute__ ((aligned(n)))
#endif
然后声明变量
,例如:ALIGN(16) float[4] my_floats;