https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115161
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Trying #include <emmintrin.h> int main () { float f = 0x0.8p+33f; float __attribute__((vector_size (16))) vf = { 0x0.8p+33f, 0x0.8p+33f, 0x0.8p+33f, 0x0.8p+33f }; int a = f; int __attribute__((vector_size (16))) vi = __builtin_convertvector (vf, int __attribute__((vector_size (16)))); int __attribute__((vector_size (16))) vi2 = (int __attribute__((vector_size (16)))) _mm_cvttps_epi32 ((__m128) vf); __builtin_printf ("%d\n", a); __builtin_printf ("{%d, %d, %d, %d}\n", vi[0], vi[1], vi[2], vi[3]); __builtin_printf ("{%d, %d, %d, %d}\n", vi2[0], vi2[1], vi2[2], vi2[3]); } with gcc and clang both with -O0 and -O2, this prints -2147483648 {-2147483648, -2147483648, -2147483648, -2147483648} {-2147483648, -2147483648, -2147483648, -2147483648} with both compilers at -O0, clang at -O2 prints -1720305736 {8524448, 0, 1, 135169} {-2147483648, -2147483648, -2147483648, -2147483648} i.e. complete garbage for the non-intrinsic cases, but what the HW does for the intrinsic cases, while gcc at -O2 prints 2147483647 {2147483647, 2147483647, 2147483647, 2147483647} {2147483647, 2147483647, 2147483647, 2147483647} i.e. treats intrinsics and non-intrinsics the same. GCC behaves this way consistently since GCC 9 (before __builtin_convertvector hasn't been supported), but if the vi related lines are commented out, even GCC 4.7 works that way.