This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/88461] New: AVX512: gcc should keep value in kN registers if possible


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88461

            Bug ID: 88461
           Summary: AVX512: gcc should keep value in kN registers if
                    possible
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bugzilla@poradnik-webmastera.com
  Target Milestone: ---

I tried to write piece of code which used new AVX512 logic instructions which
works on kN registers. It turned out that gcc was moving intermediate values
back and forth between kN and eax, what resulted in very poor code.

Example was compiled using gcc 8.2 with -O3 -march=skylake-avx512

[code]
#include <immintrin.h>
#include <stdint.h>

int test(uint16_t* data, int a)
{
    __m128i v = _mm_load_si128((const __m128i*)data);
    __mmask8 m = _mm_testn_epi16_mask(v, v);
    m = _kshiftli_mask16(m, 1);
    m = _kandn_mask16(m, a);
    return m;
}
[/code]

[asm]
test(unsigned short*, int):
        vmovdqa64       xmm0, XMMWORD PTR [rdi]
        kmovw   k5, esi
        vptestnmw       k1, xmm0, xmm0
        kmovb   eax, k1
        kmovw   k2, eax
        kshiftlw        k0, k2, 1
        kmovw   eax, k0
        movzx   eax, al
        kmovw   k4, eax
        kandnw  k3, k4, k5
        kmovw   eax, k3
        movzx   eax, al
        ret
[/asm]

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]