Я пытаюсь создать приложение, которое использует pthreads и тип __m128 SSE. Согласно руководству GCC, выравнивание стека по умолчанию составляет 16 байтов. Для использования __m128 требуется выравнивание по 16 байтов.
Мой целевой процессор поддерживает SSE. Я использую компилятор GCC, который не поддерживает перестройку стека времени выполнения (например, -mstackrealign). Я не могу использовать любую другую версию компилятора GCC.
Мое тестовое приложение выглядит так:
#include <xmmintrin.h>
#include <pthread.h>
void *f(void *x){
__m128 y;
...
}
int main(void){
pthread_t p;
pthread_create(&p, NULL, f, NULL);
}
Приложение генерирует исключение и завершает работу. После простой отладки (printf "% p", & y) я обнаружил, что переменная y не выровнена по 16 байтам.
У меня вопрос: как правильно перестроить стек (16 байт), не используя флаги и атрибуты GCC (они не помогают)? Должен ли я использовать встроенный ассемблер GCC в этой функции потока f ()?