[Bug c/83402] New: PPC64 implementation of ./rs6000/emmintrin.h gives out of range for _mm_slli_epi32
munroesj at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 12 20:42:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83402
Bug ID: 83402
Summary: PPC64 implementation of ./rs6000/emmintrin.h gives out
of range for _mm_slli_epi32
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: munroesj at gcc dot gnu.org
Target Milestone: ---
The rs6000/emmintrin.h implementation of _mm_slli_epi32 reports:
error: argument 1 must be a 5-bit signed literal
For constant shift values > 15.
The implementation uses vec_splat_s32 (Vector Splat Immediate Signed Word) for
const shift values to generate the shift count for vec_vslw (Vector Shift Left
Word). This is preferred to the more expensive vec_splats.
The immediate field of vspltisw is 5 bits but it is sign extended and the shift
rang must be positive. This limits the immediate range for vspltisw to 0-15
(not the required 0-31).
The current implementation uses:
if (__builtin_constant_p(__B))
lshift = (__v4su) vec_splat_s32(__B);
else
lshift = vec_splats ((unsigned int) __B);
so we need something like:
if (__builtin_constant_p(__B) && (__B < 16))
More information about the Gcc-bugs
mailing list