https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108191
Bug ID: 108191 Summary: Add support to usage of *intrin.h without -mavx512f -mavx512cd Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: luoyonggang at gmail dot com Target Milestone: --- This is for getting the following command to be works ``` gcc -fPIC -O2 -D__SSE3__=1 -D__SSSE3__=1 \ -D__SSE4_1__=1 -D__SSE4_2__=1 -D__SSE4A__=1 \ -D__POPCNT__=1 -D__XSAVE__=1 -D__CRC32__=1 \ -D__AVX__=1 -D__AVX2__=1 \ -D__FP_FAST_FMAF32=1 \ -D__FP_FAST_FMAF64=1 \ -D__FP_FAST_FMAF=1 \ -D__FP_FAST_FMAF32x=1 \ -D__AVX512F__=1 -D__AVX512CD__=1 test.c ``` That is generating code for SSE2 only, and we can using #include <x86intrin.h> by using runtime flags. Indeed, MSVC are aready can did that, if gcc can also support for that, we can reduce the usage of inline assembly, because MSVC(x64) doesn't support for inline assembly, so that we can reduce the code complex The content of test.c is: ``` #if defined(_MSC_VER) #include <intrin.h> #else #include <x86intrin.h> #endif #include <math.h> static inline int util_iround(float f) { __m128 m = _mm_set_ss(f); return _mm_cvtss_i32(m); } int util_iround_outside(int x, float y) { return x + util_iround(y); } ``` The compile error is something like: ``` In file included from C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/immintrin.h:35, from C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/x86intrin.h:32, from test.c:4: C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/pmmintrin.h: In function '_mm_addsub_ps': C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/pmmintrin.h:53:3: error: cannot convert a value of type 'int' to vector type '__vector(4) float' which has different size 53 | return (__m128) __builtin_ia32_addsubps ((__v4sf)__X, (__v4sf)__Y); | ^~~~~~ C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/pmmintrin.h: In function '_mm_hadd_ps': C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/pmmintrin.h:59:3: error: cannot convert a value of type 'int' to vector type '__vector(4) float' which has different size 59 | return (__m128) __builtin_ia32_haddps ((__v4sf)__X, (__v4sf)__Y); | ^~~~~~ C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/pmmintrin.h: In function '_mm_hsub_ps': C:/CI-Tools/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/12.2.0/include/pmmintrin.h:65:3: error: cannot convert a value of type 'int' to vector type '__vector(4) float' which has different size 65 | return (__m128) __builtin_ia32_hsubps ((__v4sf)__X, (__v4sf)__Y); ```