重複の可能性:
Qt、GCC、SSE、およびスタック アライメント
シミュレーターを TinyPTC から WxWidgets に変換しています。一部のグラフィックス ルーチンは、SSE 組み込み関数で最適化されています。GUI の初期化中に、初期状態が 1 回レンダリングされ、すべての 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 が配置設定をどこかで変更する可能性はありますか?