On Wed, Mar 2, 2016 at 1:19 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> Hi!
>
> As mentioned in the PR, kmovb/w uses 8/16 bit memory or %k? register,
> only if it uses GPR it uses 32-bit register.
> Therefore, this patch ensures that %k[01] is only used if the operand
> matches "r" constraint, but not when it matches "m" constraint ("k"
> constraint has not been using that already before).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2016-03-02  Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/70028
>         * config/i386/i386.md (kmovw): Move m constraint to 2nd alternative.
>         (*movhi_internal): Put mask moves from and to memory separately
>         from moves from/to GPRs.
>
>         * gcc.target/i386/pr70028.c: New test.
>
> --- gcc/config/i386/i386.md.jj  2016-02-10 16:01:58.000000000 +0100
> +++ gcc/config/i386/i386.md     2016-03-01 20:06:10.724647196 +0100
> @@ -2442,7 +2442,7 @@ (define_insn "*movsi_internal"
>  (define_insn "kmovw"
>    [(set (match_operand:HI 0 "nonimmediate_operand" "=k,k")
>         (unspec:HI
> -         [(match_operand:HI 1 "nonimmediate_operand" "rm,k")]
> +         [(match_operand:HI 1 "nonimmediate_operand" "r,km")]
>           UNSPEC_KMOV))]
>    "!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512F"
>    "@
> @@ -2454,8 +2454,8 @@ (define_insn "kmovw"
>
>
>  (define_insn "*movhi_internal"
> -  [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k,rm")
> -       (match_operand:HI 1 "general_operand"      "r ,rn,rm,rn,rm,k,k"))]
> +  [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k, r,m")
> +       (match_operand:HI 1 "general_operand"      "r ,rn,rm,rn,r,km,k,k"))]
>    "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
>  {
>    switch (get_attr_type (insn))
> @@ -2469,7 +2469,8 @@ (define_insn "*movhi_internal"
>        switch (which_alternative)
>          {
>         case 4: return "kmovw\t{%k1, %0|%0, %k1}";
> -       case 5: return "kmovw\t{%1, %0|%0, %1}";
> +       case 5: /* FALLTHRU */
> +       case 7: return "kmovw\t{%1, %0|%0, %1}";
>         case 6: return "kmovw\t{%1, %k0|%k0, %1}";
>         default: gcc_unreachable ();
>         }
> @@ -2482,7 +2483,7 @@ (define_insn "*movhi_internal"
>      }
>  }
>    [(set (attr "type")
> -     (cond [(eq_attr "alternative" "4,5,6")
> +     (cond [(eq_attr "alternative" "4,5,6,7")
>               (const_string "mskmov")
>             (match_test "optimize_function_for_size_p (cfun)")
>               (const_string "imov")
> @@ -2499,7 +2500,7 @@ (define_insn "*movhi_internal"
>            ]
>            (const_string "imov")))
>      (set (attr "prefix")
> -      (if_then_else (eq_attr "alternative" "4,5,6")
> +      (if_then_else (eq_attr "alternative" "4,5,6,7")
>         (const_string "vex")
>         (const_string "orig")))
>      (set (attr "mode")
> --- gcc/testsuite/gcc.target/i386/pr70028.c.jj  2016-03-01 20:11:09.142593365 
> +0100
> +++ gcc/testsuite/gcc.target/i386/pr70028.c     2016-03-01 20:13:52.122377175 
> +0100
> @@ -0,0 +1,19 @@
> +/* PR target/70028 */
> +/* { dg-do assemble { target int128 } } */
> +/* { dg-require-effective-target avx512bw } */

Just a nit ... can above two lines be swapped, so we have:

/* { dg-do assemble { target avx512bw } } */
/* { dg-require-effective-target int128 } */

This way, we can easily grep through the testcases for required ISAs.

Otherwise, the patch looks good to be, but let's wait for Kirill for
the final say.

Uros.

Reply via email to