Hello,
On 20 Oct 14:36, Jakub Jelinek wrote:
> On Tue, Oct 14, 2014 at 11:18:28AM +0400, Kirill Yukhin wrote:
> >     * config/i386/sse.md (define_mode_iterator VI_AVX2): Extend
> >     to support AVX-512BW.
> >     (define_mode_iterator VI124_AVX2_48_AVX512F): Remove.
> >     (define_expand "<plusminus_insn><mode>3"): Remove masking support.
> >     (define_insn "*<plusminus_insn><mode>3"): Ditto.
> >     (define_expand "<plusminus_insn><VI48_AVX512VL:mode>3_mask"): New.
> >     (define_expand "<plusminus_insn><VI12_AVX512VL:mode>3_mask"): Ditto.
> >     (define_insn "*<plusminus_insn><VI48_AVX512VL:mode>3_mask"): Ditto.
> >     (define_insn "*<plusminus_insn><VI12_AVX512VL:mode>3_mask"): Ditto.
> >     (define_expand "<sse2_avx2>_andnot<mode>3"): Remove masking support.
> >     (define_insn "*andnot<mode>3"): Ditto.
> >     (define_expand "<sse2_avx2>_andnot<VI48_AVX512VL:mode>3_mask"): New.
> >     (define_expand "<sse2_avx2>_andnot<VI12_AVX512VL:mode>3_mask"): Ditto.
> >     (define_insn "*andnot<VI48_AVX512VL:mode>3<mask_name>"): Ditto.
> >     (define_insn "*andnot<VI12_AVX512VL:mode>3<mask_name>"): Ditto.
> >     (define_insn "*abs<mode>2"): Remove masking support.
> >     (define_insn "abs<VI48_AVX512VL:mode>2_mask"): New.
> >     (define_insn "abs<VI12_AVX512VL:mode>2_mask"): Ditto.
> >     (define_expand "abs<mode>2"): Use VI_AVX2 mode iterator.
> 
> Unfortunately this caused PR63600.  The problem is that VI_AVX2
> mode iterator includes V2DI and for AVX2 also V4DI, but for pre-ssse3
> ix86_expand_sse2_abs doesn't handle V2DI (and can't easily, we don't have
> PSRAQ instruction), for ssse3 there is no vpabsq instruction, and for
> avx2 neither.
> We can handle V2DI/V4DI only for TARGET_AVX512VL, and V8DI for
> TARGET_AVX512F.
> Thus, IMHO the mode iterator on at least
> (define_insn "*abs<mode>2"
> and on
> (define_expand "abs<mode>2"
> is wrong, should not include V2DI/V4DI unless TARGET_AVX512VL
> (so new (or ressurrected, was that VI124_AVX2_48_AVX512F?)
> specialized mode iterator?).


This patch removes absq insn patterns for non-AVX-512 targets.


gcc/
        * config/i386/sse.md (define_mode_iterator VI_AVX2): Restore to 128-,
        256- bit integer modes only.
        (define_mode_iterator VI_AVX2_AVX512): New.
        (define_expand "neg<mode>2"): Use VI_AVX2_AVX512 mode iterator.
        (define_expand "<plusminus_insn><mode>3"): Ditto.
        (define_insn "*<plusminus_insn><mode>3"): Ditto.
        (define_expand "<sse2_avx2>_andnot<mode>3"): Ditto.
        (define_mode_iterator VI1248_AVX512VL_AVX512BW): New.
        (define_insn "abs<VI1248_AVX512VL_AVX512BW:mode>2"): Ditto.

Bootstrap in progress. AVX-512 tests pass.

Is it ok for trunk?

--
Thanks, K

    AVX-512. Disable absq for non AVX-512 targets.

diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index fd40623..74aca48 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -271,6 +271,11 @@
    (V4DI "TARGET_AVX") V2DI])
 
 (define_mode_iterator VI_AVX2
+  [(V32QI "TARGET_AVX2") V16QI
+   (V16HI "TARGET_AVX2") V8HI
+   (V8SI "TARGET_AVX2") V4SI])
+
+(define_mode_iterator VI_AVX2_AVX512
   [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX2") V16QI
    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI
    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX2") V4SI
@@ -9142,18 +9147,18 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (define_expand "neg<mode>2"
-  [(set (match_operand:VI_AVX2 0 "register_operand")
-       (minus:VI_AVX2
+  [(set (match_operand:VI_AVX2_AVX512 0 "register_operand")
+       (minus:VI_AVX2_AVX512
          (match_dup 2)
-         (match_operand:VI_AVX2 1 "nonimmediate_operand")))]
+         (match_operand:VI_AVX2_AVX512 1 "nonimmediate_operand")))]
   "TARGET_SSE2"
   "operands[2] = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));")
 
 (define_expand "<plusminus_insn><mode>3"
-  [(set (match_operand:VI_AVX2 0 "register_operand")
-       (plusminus:VI_AVX2
-         (match_operand:VI_AVX2 1 "nonimmediate_operand")
-         (match_operand:VI_AVX2 2 "nonimmediate_operand")))]
+  [(set (match_operand:VI_AVX2_AVX512 0 "register_operand")
+       (plusminus:VI_AVX2_AVX512
+         (match_operand:VI_AVX2_AVX512 1 "nonimmediate_operand")
+         (match_operand:VI_AVX2_AVX512 2 "nonimmediate_operand")))]
   "TARGET_SSE2"
   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
 
@@ -9180,10 +9185,10 @@
   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
 
 (define_insn "*<plusminus_insn><mode>3"
-  [(set (match_operand:VI_AVX2 0 "register_operand" "=x,v")
-       (plusminus:VI_AVX2
-         (match_operand:VI_AVX2 1 "nonimmediate_operand" "<comm>0,v")
-         (match_operand:VI_AVX2 2 "nonimmediate_operand" "xm,vm")))]
+  [(set (match_operand:VI_AVX2_AVX512 0 "register_operand" "=x,v")
+       (plusminus:VI_AVX2_AVX512
+         (match_operand:VI_AVX2_AVX512 1 "nonimmediate_operand" "<comm>0,v")
+         (match_operand:VI_AVX2_AVX512 2 "nonimmediate_operand" "xm,vm")))]
   "TARGET_SSE2
    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
   "@
@@ -10715,10 +10720,10 @@
 })
 
 (define_expand "<sse2_avx2>_andnot<mode>3"
-  [(set (match_operand:VI_AVX2 0 "register_operand")
-       (and:VI_AVX2
-         (not:VI_AVX2 (match_operand:VI_AVX2 1 "register_operand"))
-         (match_operand:VI_AVX2 2 "nonimmediate_operand")))]
+  [(set (match_operand:VI_AVX2_AVX512 0 "register_operand")
+       (and:VI_AVX2_AVX512
+         (not:VI_AVX2_AVX512 (match_operand:VI_AVX2_AVX512 1 
"register_operand"))
+         (match_operand:VI_AVX2_AVX512 2 "nonimmediate_operand")))]
   "TARGET_SSE2")
 
 (define_expand "<sse2_avx2>_andnot<mode>3_mask"
@@ -13836,6 +13841,20 @@
     }
 })
 
+(define_mode_iterator VI1248_AVX512VL_AVX512BW
+   [V8DI (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")
+    V16SI (V64QI "TARGET_AVX512BW") (V32HI "TARGET_AVX512BW")])
+
+(define_insn "abs<mode>2"
+  [(set (match_operand:VI1248_AVX512VL_AVX512BW 0 "register_operand" "=v")
+       (abs:VI1248_AVX512VL_AVX512BW
+         (match_operand:VI1248_AVX512VL_AVX512BW 1 "nonimmediate_operand" 
"vm")))]
+  "TARGET_AVX512F"
+  "vpabs<ssemodesuffix>\t{%1, %0|%0, %1}"
+  [(set_attr "type" "sselog1")
+   (set_attr "prefix" "evex")
+   (set_attr "mode" "<sseinsnmode>")])
+
 (define_insn "abs<mode>2"
   [(set (match_operand:MMXMODEI 0 "register_operand" "=y")
        (abs:MMXMODEI

Reply via email to