On Mon, Sep 5, 2016 at 7:07 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> Hi!
>
> On Fri, Aug 05, 2016 at 02:22:39PM +0200, Uros Bizjak wrote:
>> 2016-08-05  Uros Bizjak  <ubiz...@gmail.com>
>>
>>     * config/i386/i386.md (*zero_extendsidi2): Add (*r,*k) alternative.
>>     (zero_extend<mode>di2): Ditto.
>>     (*zero_extend<mode>si2): Ditto.
>>     (*zero_extendqihi2): Ditto.
>
> As the PR says, unfortunately not all kmov instructions are supported by all
> AVX512F supporting ISAs, kmovb is AVX512DQ, kmovw is AVX512F and kmovd and
> kmovq are AVX512BW.
>
> Thus, the following patch enables those alternatives only when the
> instructions are available.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, tested also with sde
> -knl on the avx512f-* testcase.  Ok for trunk?
>
> 2016-09-05  Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/77476
>         * config/i386/i386.md (isa): Add x64_avx512bw.
>         (*zero_extendsidi2): For alternative 11 use x64_avx512bw isa.
>         (kmov_isa): New mode attr.
>         (zero_extend<mode>di2): Use <kmov_isa> isa for the last alternative.
>         (*zero_extend<mode>si2): Likewise.
>         (*zero_extendqihi2): Use avx512dq isa for the last alternative.
>
>         * gcc.target/i386/avx512f-pr77476.c: New test.
>         * gcc.target/i386/avx512bw-pr77476.c: New test.
>         * gcc.target/i386/avx512dq-pr77476.c: New test.

OK.

Thanks,
Uros.

> --- gcc/config/i386/i386.md.jj  2016-08-29 12:17:41.000000000 +0200
> +++ gcc/config/i386/i386.md     2016-09-05 10:35:53.404313654 +0200
> @@ -799,7 +799,7 @@ (define_attr "isa" "base,x64,x64_sse4,x6
>                     sse2,sse2_noavx,sse3,sse4,sse4_noavx,avx,noavx,
>                     avx2,noavx2,bmi,bmi2,fma4,fma,avx512f,noavx512f,
>                     fma_avx512f,avx512bw,noavx512bw,avx512dq,noavx512dq,
> -                   avx512vl,noavx512vl,x64_avx512dq"
> +                   avx512vl,noavx512vl,x64_avx512dq,x64_avx512bw"
>    (const_string "base"))
>
>  (define_attr "enabled" ""
> @@ -812,6 +812,8 @@ (define_attr "enabled" ""
>            (symbol_ref "TARGET_64BIT && TARGET_AVX")
>          (eq_attr "isa" "x64_avx512dq")
>            (symbol_ref "TARGET_64BIT && TARGET_AVX512DQ")
> +        (eq_attr "isa" "x64_avx512bw")
> +          (symbol_ref "TARGET_64BIT && TARGET_AVX512BW")
>          (eq_attr "isa" "nox64") (symbol_ref "!TARGET_64BIT")
>          (eq_attr "isa" "sse2") (symbol_ref "TARGET_SSE2")
>          (eq_attr "isa" "sse2_noavx")
> @@ -3735,12 +3737,14 @@ (define_insn "*zero_extendsidi2"
>    [(set (attr "isa")
>       (cond [(eq_attr "alternative" "0,1,2")
>               (const_string "nox64")
> -           (eq_attr "alternative" "3,7,11")
> +           (eq_attr "alternative" "3,7")
>               (const_string "x64")
>             (eq_attr "alternative" "8")
>               (const_string "x64_sse4")
>             (eq_attr "alternative" "10")
>               (const_string "sse2")
> +           (eq_attr "alternative" "11")
> +             (const_string "x64_avx512bw")
>            ]
>            (const_string "*")))
>     (set (attr "type")
> @@ -3804,6 +3808,9 @@ (define_split
>     (set (match_dup 4) (const_int 0))]
>    "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
>
> +(define_mode_attr kmov_isa
> +  [(QI "avx512dq") (HI "avx512f") (SI "avx512bw") (DI "avx512bw")])
> +
>  (define_insn "zero_extend<mode>di2"
>    [(set (match_operand:DI 0 "register_operand" "=r,*r")
>         (zero_extend:DI
> @@ -3812,7 +3819,8 @@ (define_insn "zero_extend<mode>di2"
>    "@
>     movz{<imodesuffix>l|x}\t{%1, %k0|%k0, %1}
>     kmov<mskmodesuffix>\t{%1, %k0|%k0, %1}"
> -  [(set_attr "type" "imovx,mskmov")
> +  [(set_attr "isa" "*,<kmov_isa>")
> +   (set_attr "type" "imovx,mskmov")
>     (set_attr "mode" "SI")])
>
>  (define_expand "zero_extend<mode>si2"
> @@ -3863,7 +3871,8 @@ (define_insn "*zero_extend<mode>si2"
>    "@
>     movz{<imodesuffix>l|x}\t{%1, %0|%0, %1}
>     kmov<mskmodesuffix>\t{%1, %0|%0, %1}"
> -  [(set_attr "type" "imovx,mskmov")
> +  [(set_attr "isa" "*,<kmov_isa>")
> +   (set_attr "type" "imovx,mskmov")
>     (set_attr "mode" "SI,<MODE>")])
>
>  (define_expand "zero_extendqihi2"
> @@ -3914,6 +3923,7 @@ (define_insn "*zero_extendqihi2"
>     movz{bl|x}\t{%1, %k0|%k0, %1}
>     kmovb\t{%1, %k0|%k0, %1}"
>    [(set_attr "type" "imovx,mskmov")
> +   (set_attr "isa" "*,avx512dq")
>     (set_attr "mode" "SI,QI")])
>
>  (define_insn_and_split "*zext<mode>_doubleword_and"
> --- gcc/testsuite/gcc.target/i386/avx512f-pr77476.c.jj  2016-09-05 
> 10:23:42.108364379 +0200
> +++ gcc/testsuite/gcc.target/i386/avx512f-pr77476.c     2016-09-05 
> 10:23:26.000000000 +0200
> @@ -0,0 +1,76 @@
> +/* PR target/77476 */
> +/* { dg-do run } */
> +/* { dg-options "-O2 -mavx512f" } */
> +/* { dg-require-effective-target avx512f } */
> +
> +#ifndef PR77476_TEST
> +#include "avx512f-check.h"
> +#define PR77476_TEST avx512f_test
> +#endif
> +
> +unsigned short s;
> +unsigned int i;
> +unsigned long long l;
> +
> +void
> +f1 (void)
> +{
> +  unsigned char a = 0xff;
> +  asm volatile ("" : "+Yk" (a));
> +  s = a;
> +}
> +
> +void
> +f2 (void)
> +{
> +  unsigned char a = 0xff;
> +  asm volatile ("" : "+Yk" (a));
> +  i = a;
> +}
> +
> +void
> +f3 (void)
> +{
> +  unsigned char a = 0xff;
> +  asm volatile ("" : "+Yk" (a));
> +  l = a;
> +}
> +
> +void
> +f4 (void)
> +{
> +  unsigned short a = 0xffff;
> +  asm volatile ("" : "+Yk" (a));
> +  i = a;
> +}
> +
> +void
> +f5 (void)
> +{
> +  unsigned short a = 0xffff;
> +  asm volatile ("" : "+Yk" (a));
> +  l = a;
> +}
> +
> +#ifdef __AVX512BW__
> +void
> +f6 (void)
> +{
> +  unsigned int a = 0xffffffff;
> +  asm volatile ("" : "+Yk" (a));
> +  l = a;
> +}
> +#endif
> +
> +static void
> +PR77476_TEST ()
> +{
> +  f1 (); if (s != 0xff) __builtin_abort (); s = 0;
> +  f2 (); if (i != 0xff) __builtin_abort (); i = 0;
> +  f3 (); if (l != 0xff) __builtin_abort (); l = 0;
> +  f4 (); if (i != 0xffff) __builtin_abort (); i = 0;
> +  f5 (); if (l != 0xffff) __builtin_abort (); l = 0;
> +#ifdef __AVX512BW__
> +  f6 (); if (l != 0xffffffff) __builtin_abort (); l = 0;
> +#endif
> +}
> --- gcc/testsuite/gcc.target/i386/avx512bw-pr77476.c.jj 2016-09-05 
> 10:24:07.078055576 +0200
> +++ gcc/testsuite/gcc.target/i386/avx512bw-pr77476.c    2016-09-05 
> 10:24:37.870674759 +0200
> @@ -0,0 +1,9 @@
> +/* PR target/77476 */
> +/* { dg-do run } */
> +/* { dg-options "-O2 -mavx512bw" } */
> +/* { dg-require-effective-target avx512bw } */
> +
> +#include "avx512bw-check.h"
> +#define PR77476_TEST avx512bw_test
> +
> +#include "avx512f-pr77476.c"
> --- gcc/testsuite/gcc.target/i386/avx512dq-pr77476.c.jj 2016-09-05 
> 10:24:57.617430548 +0200
> +++ gcc/testsuite/gcc.target/i386/avx512dq-pr77476.c    2016-09-05 
> 10:25:26.406074515 +0200
> @@ -0,0 +1,9 @@
> +/* PR target/77476 */
> +/* { dg-do run } */
> +/* { dg-options "-O2 -mavx512dq" } */
> +/* { dg-require-effective-target avx512dq } */
> +
> +#include "avx512dq-check.h"
> +#define PR77476_TEST avx512dq_test
> +
> +#include "avx512f-pr77476.c"
>
>
>         Jakub

Reply via email to