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

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: