28.6.5.1. GCC x86 intrinsics
Good official cheatsheet with all intrinsics and what they expand to: https://software.intel.com/sites/landingpage/IntrinsicsGuide
The functions use the the following naming convention:
<vector_size>_<intrin_op>_<suffix>
where:
-
<vector_size>:-
mm: 128-bit vectors (SSE) -
mm256: 256-bit vectors (AVX and AVX2) -
mm512: 512-bit vectors (AVX512)
-
-
<intrin_op>: operation of the intrinsic function, e.g. add, sub, mul, etc. -
<suffix>: data type:-
ps: 4 floats (Packed Single) -
pd: 2 doubles (Packed Double) -
ss: 1 float (Single Single), often the lowest order one -
sd: 1 double (Single Double) -
si128: 128-bits of integers of any size -
ep<int_type>integer types, e.g.:-
epi32: 32 bit signed integers -
epu16: 16 bit unsigned integers
-
-
Data types:
-
__m128: four floats -
__m128d: two doubles -
__m128i: integers: 8 x 16-bit, 4 x 32-bit, 2 x 64-bit
The headers to include are clarified at: https://stackoverflow.com/questions/11228855/header-files-for-x86-simd-intrinsics
x86intrin.h everything mmintrin.h MMX xmmintrin.h SSE emmintrin.h SSE2 pmmintrin.h SSE3 tmmintrin.h SSSE3 smmintrin.h SSE4.1 nmmintrin.h SSE4.2 ammintrin.h SSE4A wmmintrin.h AES immintrin.h AVX zmmintrin.h AVX512
Present in gcc-7_3_0-release tree at: gcc/config/i386/x86intrin.h.
Bibliography: