[Bug c/108191] New: Add support to usage of *intrin.h without -mavx512f -mavx512cd
luoyonggang at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Dec 21 04:48:24 GMT 2022
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);
```
More information about the Gcc-bugs
mailing list