https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83402
--- Comment #1 from Steven Munroe <munroesj at gcc dot gnu.org> --- Similarly doe _mm_slli_epi64 for any const value > 15 and < 32. So: if (__builtin_constant_p(__B)) { if (__B < 32) lshift = (__v2du) vec_splat_s32(__B); else lshift = (__v2du) vec_splats((unsigned long long)__B); } else lshift = (__v2du) vec_splats ((unsigned int) __B); should be something like: if (__builtin_constant_p(__B) && (__B < 16)) { lshift = (__v2du) vec_splat_s32(__B); } else lshift = (__v2du) vec_splats ((unsigned int) __B); It is Ok in this case to use a splat word form because the vector shift left doubleword will only use the low order 6-bits of of each doubleword of the shift vctor.