forked from solvespace/solvespace
-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
System information
- SolveSpace version: c65e31b
- Operating system: Build on Ubuntu 22.04.1 LTS (on WSL2)
Expected behavior
Actual behavior
Build fails with followgin error.
It seems to use SSE2 instructions but compiler not allowed.
[ 90%] Building CXX object extlib/angle/CMakeFiles/ANGLE.dir/src/libANGLE/renderer/d3d/RendererD3D.cpp.ob [264/9194]
[ 91%] Building CXX object extlib/angle/CMakeFiles/ANGLE.dir/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp.obj In file included from /usr/lib/gcc/i686-w64-mingw32/10-win32/include/xmmintrin.h:1316, from /usr/lib/gcc/i686-w64-mingw32/10-win32/include/immintrin.h:29, from /usr/lib/gcc/i686-w64-mingw32/10-win32/include/x86intrin.h:32, from /usr/share/mingw-w64/include/intrin.h:73, from /home/user/src/solvespace-solvespace/extlib/angle/src/common/platform.h:48, from /home/user/src/solvespace-solvespace/extlib/angle/src/common/angleutils.h:12, from /home/user/src/solvespace-solvespace/extlib/angle/src/common/debug.h:16, from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/RefCountObject.h:15,
from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/angletypes.h:13,
from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/renderer/d3d/loadimage.h:12,
from /home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/renderer/d3d/loadimageSSE2.cpp:11:
/usr/lib/gcc/i686-w64-mingw32/10-win32/include/emmintrin.h: In function ‘void rx::LoadA8ToBGRA8_SSE2(size_t, size_t, siz ‘
e_t, const uint8_t*, size_t, size_t, uint8_t*, size_t, size_t)’:
/usr/lib/gcc/i686-w64-mingw32/10-win32/include/emmintrin.h:770’: error: inlining failed in call to ‘always_inline’ ‘__m ‘ ’ ‘128i _mm_setzero_si128()’: target specific option mismatch
770 | _mm_setzero_si128 (void)
| ^~~~~~~~~~~~~~~~~
/home/user/src/solvespace-solvespace/extlib/angle/src/libANGLE/renderer/d3d/loadimageSSE2.cpp:27:41: note: called from here
27 | __m128i zeroWide = _mm_setzero_si128();
| ~~~~~~~~~~~~~~~~~^~
...
Additional information
In default, Visual Studio for 32-bit executable uses SSE2 (/arch:SSE2 is default for x86.)
https://docs.microsoft.com/en-us/cpp/build/reference/arch-x86?view=msvc-170
In MinGW for 32-bit executable, SSE2 is opt-in.
CMAKE_SYSTEM_PROCESSOR variable in CMakeList.txt is not set under MinGW. So existing "-msse2" related scripts is not working for MinGW 32-bit.
Patching
Use -mfpmath=sse -msse2 alywas under MinGW. For 32-bit, required. For 64-bit, not required but no side-effect.
(Including the patch of #7 )
Current:
Lines 91 to 98 in c65e31b
| if(MINGW) | |
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc") | |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++") | |
| # Link 32 bit SolveSpace with --large-address-aware which allows it to access | |
| # up to 3GB on a properly configured 32 bit Windows and up to 4GB on 64 bit. | |
| # See https://msdn.microsoft.com/en-us/library/aa366778 | |
| set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware") | |
| endif() |
Suggest:
if(MINGW)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc -mfpmath=sse -msse2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++ -mfpmath=sse -msse2")
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
# Link 32 bit SolveSpace with --large-address-aware which allows it to access
# up to 3GB on a properly configured 32 bit Windows and up to 4GB on 64 bit.
# See https://msdn.microsoft.com/en-us/library/aa366778
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware")
endif()
endif()
Metadata
Metadata
Assignees
Labels
No labels