C语言 x86_64 SSE对齐:GCC和Clang之间的差异



我有一个广泛使用SSE内联函数的大型代码库,该代码库仅在GCC下为x86_64平台开发。堆栈上分配了很多__m128float[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;

最新更新