可能重复:
Qt、GCC、SSE 和堆栈对齐
我正在将模拟器从 TinyPTC 转换为 WxWidgets。一些图形例程使用 SSE 内在函数进行了优化。在 GUI 的初始化过程中,初始状态被渲染一次,所有的 SSE 例程都可以正常工作。但是,如果我稍后从事件处理程序中调用它们,我会得到一个 SIGSEGV。
起初我认为这些是一些奇怪的对齐问题,但它甚至发生在:
__m128i zero = _mm_setzero_si128();
当我用非优化代码替换 SSE 例程时,一切正常。
我想事件处理发生在与初始化不同的线程中。从不同线程使用 SSE 时有什么需要注意的吗?还有什么可能导致这种行为?
SIGSEGV 发生在一条movdqa %xmm0, -40(%ebp)
指令上(其中有几个)。如果我用 编译-O1
,movdqa
指令会被完全优化掉,程序运行良好。正如评论中已经指出的那样,这似乎是堆栈的对齐问题。
这是 CodeLite 为编译而生成的命令:
g++ -c "x:/some/folder/sse.cpp" -g -O1 -Wall -std=gnu++0x -msse3
-mthreads -DHAVE_W32API_H -D__WXMSW__ -D__WXDEBUG__ -D_UNICODE
-ID:\CodeLite\wxWidgets\lib\gcc_dll\mswud -ID:\CodeLite\wxWidgets\include
-DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -o ./Debug/sse.o -I.
有什么不寻常的吗?WxWidgets 是否有可能在某处更改对齐设置?