x86_64 выравнивание SSE: различия между GCC и Clang - PullRequest
0 голосов
/ 10 января 2019

У меня большая кодовая база, широко использующая встроенные функции SSE, которая была разработана в рамках GCC только для платформы x86_64. В стеке выделено много __m128 и float[4], которые при компиляции с GCC на x86_64 всегда выровнены по 16 байтам.

Мы тестируем clang, и он вылетает при неправильной загрузке и сохранении SSE, в переменных стека.

Кажется, я могу исправить все ошибки одну за другой __attribute__ ((aligned(16)))

Есть ли способ заставить clang согласовать все переменные с 16 байтами в глобальном масштабе? Я не могу найти ничего в документации.

1 Ответ

0 голосов
/ 10 января 2019

__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

, а затем объявить переменные, например ,::1006*

ALIGN(16) float[4] my_floats;
...