i386: Use int_nonimmediate_operand more
authorUros Bizjak <ubizjak@gmail.com>
Tue, 5 May 2020 09:31:52 +0000 (11:31 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Tue, 5 May 2020 09:33:55 +0000 (11:33 +0200)
Pattern explosing and manual mode checks can be avoided by using
int_nonimmediate_operand special predicate.

While there, rewrite *x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>
to a combine pass splitter.

* config/i386/i386.md (*testqi_ext_3): Use
int_nonimmediate_operand instead of manual mode checks.
(*x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>):
Use int_nonimmediate_operand predicate.  Rewrite
define_insn_and_split pattern to a combine pass splitter.

gcc/ChangeLog
gcc/config/i386/i386.md

index aa904548808047af8c8f1e254831ad477b8b9c4d..8c46dcd92c3fcd26c85f112c9a4729436401888b 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-05  Uroš Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.md (*testqi_ext_3): Use
+       int_nonimmediate_operand instead of manual mode checks.
+       (*x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>):
+       Use int_nonimmediate_operand predicate.  Rewrite
+       define_insn_and_split pattern to a combine pass splitter.
+
 2020-05-05  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * configure.ac <i[34567]86-*-*>: Add --32 to tls_as_opt on Solaris.
index 76c0086723120dc3ccf79b294b4e25baa02dce6d..5cad481fd9f038d8e88e6537b927bf38e52035d4 100644 (file)
   [(set (match_operand 0 "flags_reg_operand")
         (match_operator 1 "compare_operator"
          [(zero_extract:SWI248
-            (match_operand 2 "nonimmediate_operand" "rm")
+            (match_operand 2 "int_nonimmediate_operand" "rm")
             (match_operand 3 "const_int_operand" "n")
             (match_operand 4 "const_int_operand" "n"))
           (const_int 0)]))]
-  "((TARGET_64BIT && GET_MODE (operands[2]) == DImode)
-    || GET_MODE (operands[2]) == SImode
-    || GET_MODE (operands[2]) == HImode
-    || GET_MODE (operands[2]) == QImode)
-   /* Ensure that resulting mask is zero or sign extended operand.  */
-   && INTVAL (operands[4]) >= 0
+  "/* Ensure that resulting mask is zero or sign extended operand.  */
+   INTVAL (operands[4]) >= 0
    && ((INTVAL (operands[3]) > 0
        && INTVAL (operands[3]) + INTVAL (operands[4]) <= 32)
        || (<MODE>mode == DImode
    (set_attr "mode" "<MODE>")
    (set_attr "length_immediate" "0")])
 
-(define_insn_and_split "*x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>"
-  [(set (match_operand:SWI48 0 "register_operand" "=r")
+(define_split
+  [(set (match_operand:SWI48 0 "register_operand")
        (neg:SWI48
          (leu:SWI48
-           (match_operand:SWI 1 "nonimmediate_operand" "<SWI:r>m")
-           (match_operand:SWI 2 "<SWI:immediate_operand>" "<SWI:i>"))))
-   (clobber (reg:CC FLAGS_REG))]
-  "CONST_INT_P (operands[2])
+           (match_operand 1 "int_nonimmediate_operand")
+           (match_operand 2 "const_int_operand"))))]
+  "x86_64_immediate_operand (operands[2], VOIDmode)
    && INTVAL (operands[2]) != -1
    && INTVAL (operands[2]) != 2147483647"
-  "#"
-  ""
   [(set (reg:CC FLAGS_REG) (compare:CC (match_dup 1) (match_dup 2)))
    (parallel [(set (match_dup 0)
                   (neg:SWI48 (ltu:SWI48 (reg:CC FLAGS_REG) (const_int 0))))