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

Reply via email to