https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116675
Bug ID: 116675
Summary: No blend constant permute for V8HImode with just SSE2
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: rguenth at gcc dot gnu.org
Target Milestone: ---
The ix86_expand_vec_perm_const says a blend of two V8HImode vectors isn't
supported with just SSE2. The vec_perm_indices is { 0, 9, 2, 11, 4, 13, 6, 15
}
and a fallback should be two bitwise ANDs with a constant mask followed
by a bitwise IOR.
With SSSE3 we get
pshufb .LC0(%rip), %xmm0
pshufb .LC1(%rip), %xmm1
por %xmm1, %xmm0
clang can do
movaps .LCPI0_0(%rip), %xmm2 # xmm2 =
[65535,0,65535,0,65535,0,65535,0]
andps %xmm2, %xmm0
andnps %xmm1, %xmm2
orps %xmm2, %xmm0
with just SSE2.
typedef unsigned short v8hi __attribute__((vector_size(16)));
v8hi foo (v8hi a, v8hi b)
{
return __builtin_shufflevector (a, b, 0, 9, 2, 11, 4, 13, 6, 15);
}