https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101639
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot
gnu.org
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
I have a prototype. For
bool f(int* p, long n)
{
bool r = true;
for(long i = 0; i < 16; ++i)
r &= (p[i] != 0);
return r;
}
it generates with AVX512
f:
.LFB0:
.cfi_startproc
vmovdqu32 (%rdi), %zmm0
vpxor %xmm1, %xmm1, %xmm1
vpcmpd $4, %zmm1, %zmm0, %k1
vpcmpeqd %xmm1, %xmm1, %xmm1
vpabsb %xmm1, %xmm0{%k1}{z}
vpshufd $238, %xmm0, %xmm1
vpandq %xmm1, %xmm0, %xmm0
vpshufd $85, %xmm0, %xmm1
vpandq %xmm1, %xmm0, %xmm0
vpshuflw $85, %xmm0, %xmm1
vpandq %xmm1, %xmm0, %xmm0
vpsrldq $1, %xmm0, %xmm1
vpandq %xmm1, %xmm0, %xmm0
vpextrb $0, %xmm0, %eax
andl $1, %eax
vzeroupper
ret
and with AVX2
f:
.LFB0:
.cfi_startproc
vpxor %xmm0, %xmm0, %xmm0
vpcmpeqd (%rdi), %ymm0, %ymm1
vpcmpeqd 32(%rdi), %ymm0, %ymm2
vpcmpeqd %ymm0, %ymm1, %ymm1
vpcmpeqd %ymm0, %ymm2, %ymm0
vpand %ymm0, %ymm1, %ymm1
vpcmpeqd %ymm0, %ymm0, %ymm0
vpsrld $31, %ymm0, %ymm0
vpand %ymm0, %ymm1, %ymm1
vextracti128 $0x1, %ymm1, %xmm0
vpand %xmm1, %xmm0, %xmm0
vpsrldq $8, %xmm0, %xmm1
vpand %xmm1, %xmm0, %xmm0
vpsrldq $4, %xmm0, %xmm1
vpand %xmm1, %xmm0, %xmm0
vmovd %xmm0, %eax
andl $1, %eax
vzeroupper
ret