2016-05-06  Uros Bizjak  <ubiz...@gmail.com>

    * config/i386/i386.md (LEAMODE): New mode attribute.
    (plus to LEA splitter): Rewrite splitter using LEAMODE mode attribute.
    (ashift to LEA splitter): Rewrte splitter using SWI mode iterator
    and LEAMODE mode attribute.  Use VOIDmode const_0_to_3_operand as
    operand 2 predicate.
    (*lea<mode>_general_2): Use VOIDmode for const248_operand.
    (*lea<mode>_general_3): Ditto.
    (*lea<mode>_general_4): Use VOIDmode for const_0_to_3_operand.

Patch was bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Committed to mainline SVN.

Uros.
Index: i386.md
===================================================================
--- i386.md     (revision 235982)
+++ i386.md     (working copy)
@@ -1024,6 +1024,9 @@
 (define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")])
 (define_mode_attr dwi [(QI "hi") (HI "si") (SI "di") (DI "ti")])
 
+;; LEA mode corresponding to an integer mode
+(define_mode_attr LEAMODE [(QI "SI") (HI "SI") (SI "SI") (DI "DI")])
+
 ;; Half mode for double word integer modes.
 (define_mode_iterator DWIH [(SI "!TARGET_64BIT")
                            (DI "TARGET_64BIT")])
@@ -5710,32 +5713,6 @@
    (parallel [(set (match_dup 0) (plus:SWI48 (match_dup 0) (match_dup 2)))
              (clobber (reg:CC FLAGS_REG))])])
 
-;; Convert add to the lea pattern to avoid flags dependency.
-(define_split
-  [(set (match_operand:SWI 0 "register_operand")
-       (plus:SWI (match_operand:SWI 1 "register_operand")
-                 (match_operand:SWI 2 "<nonmemory_operand>")))
-   (clobber (reg:CC FLAGS_REG))]
-  "reload_completed && ix86_lea_for_add_ok (insn, operands)" 
-  [(const_int 0)]
-{
-  machine_mode mode = <MODE>mode;
-  rtx pat;
-
-  if (<MODE_SIZE> < GET_MODE_SIZE (SImode))
-    { 
-      mode = SImode; 
-      operands[0] = gen_lowpart (mode, operands[0]);
-      operands[1] = gen_lowpart (mode, operands[1]);
-      operands[2] = gen_lowpart (mode, operands[2]);
-    }
-
-  pat = gen_rtx_PLUS (mode, operands[1], operands[2]);
-
-  emit_insn (gen_rtx_SET (operands[0], pat));
-  DONE;
-})
-
 ;; Split non destructive adds if we cannot use lea.
 (define_split
   [(set (match_operand:DI 0 "register_operand")
@@ -5753,6 +5730,24 @@
 
 ;; Convert add to the lea pattern to avoid flags dependency.
 (define_split
+  [(set (match_operand:SWI 0 "register_operand")
+       (plus:SWI (match_operand:SWI 1 "register_operand")
+                 (match_operand:SWI 2 "<nonmemory_operand>")))
+   (clobber (reg:CC FLAGS_REG))]
+  "reload_completed && ix86_lea_for_add_ok (insn, operands)" 
+  [(set (match_dup 0)
+       (plus:<LEAMODE> (match_dup 1) (match_dup 2)))]
+{
+  if (<MODE>mode != <LEAMODE>mode)
+    {
+      operands[0] = gen_lowpart (<LEAMODE>mode, operands[0]);
+      operands[1] = gen_lowpart (<LEAMODE>mode, operands[1]);
+      operands[2] = gen_lowpart (<LEAMODE>mode, operands[2]);
+    }
+})
+
+;; Convert add to the lea pattern to avoid flags dependency.
+(define_split
   [(set (match_operand:DI 0 "register_operand")
        (zero_extend:DI
          (plus:SI (match_operand:SI 1 "register_operand")
@@ -6237,7 +6232,7 @@
   [(set (match_operand:SWI12 0 "register_operand" "=r")
        (plus:SWI12
          (mult:SWI12 (match_operand:SWI12 1 "index_register_operand" "l")
-                     (match_operand:SWI12 2 "const248_operand" "n"))
+                     (match_operand 2 "const248_operand" "n"))
          (match_operand:SWI12 3 "nonmemory_operand" "ri")))]
   "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
   "#"
@@ -6259,7 +6254,7 @@
        (plus:SWI12
          (plus:SWI12
            (mult:SWI12 (match_operand:SWI12 1 "index_register_operand" "l")
-                       (match_operand:SWI12 2 "const248_operand" "n"))
+                       (match_operand 2 "const248_operand" "n"))
            (match_operand:SWI12 3 "register_operand" "r"))
          (match_operand:SWI12 4 "immediate_operand" "i")))]
   "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
@@ -6285,8 +6280,8 @@
        (any_or:SWI12
          (ashift:SWI12
            (match_operand:SWI12 1 "index_register_operand" "l")
-           (match_operand:SWI12 2 "const_0_to_3_operand" "n"))
-         (match_operand:SWI12 3 "const_int_operand" "n")))]
+           (match_operand 2 "const_0_to_3_operand" "n"))
+         (match_operand 3 "const_int_operand" "n")))]
   "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    && ((unsigned HOST_WIDE_INT) INTVAL (operands[3])
        < (HOST_WIDE_INT_1U << INTVAL (operands[2])))"
@@ -6309,8 +6304,8 @@
        (any_or:SWI48
          (ashift:SWI48
            (match_operand:SWI48 1 "index_register_operand" "l")
-           (match_operand:SWI48 2 "const_0_to_3_operand" "n"))
-         (match_operand:SWI48 3 "const_int_operand" "n")))]
+           (match_operand 2 "const_0_to_3_operand" "n"))
+         (match_operand 3 "const_int_operand" "n")))]
   "(unsigned HOST_WIDE_INT) INTVAL (operands[3])
    < (HOST_WIDE_INT_1U << INTVAL (operands[2]))"
   "#"
@@ -10063,31 +10058,21 @@
 
 ;; Convert ashift to the lea pattern to avoid flags dependency.
 (define_split
-  [(set (match_operand 0 "register_operand")
-       (ashift (match_operand 1 "index_register_operand")
-                (match_operand:QI 2 "const_int_operand")))
+  [(set (match_operand:SWI 0 "register_operand")
+       (ashift:SWI (match_operand:SWI 1 "index_register_operand")
+                   (match_operand 2 "const_0_to_3_operand")))
    (clobber (reg:CC FLAGS_REG))]
-  "GET_MODE (operands[0]) == GET_MODE (operands[1])
-   && reload_completed
+  "reload_completed
    && REGNO (operands[0]) != REGNO (operands[1])"
-  [(const_int 0)]
+  [(set (match_dup 0)
+       (mult:<LEAMODE> (match_dup 1) (match_dup 2)))]
 {
-  machine_mode mode = GET_MODE (operands[0]);
-  rtx pat;
-
-  if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (SImode))
-    { 
-      mode = SImode; 
-      operands[0] = gen_lowpart (mode, operands[0]);
-      operands[1] = gen_lowpart (mode, operands[1]);
+  if (<MODE>mode != <LEAMODE>mode)
+    {
+      operands[0] = gen_lowpart (<LEAMODE>mode, operands[0]);
+      operands[1] = gen_lowpart (<LEAMODE>mode, operands[1]);
     }
-
-  operands[2] = gen_int_mode (1 << INTVAL (operands[2]), mode);
-
-  pat = gen_rtx_MULT (mode, operands[1], operands[2]);
-
-  emit_insn (gen_rtx_SET (operands[0], pat));
-  DONE;
+  operands[2] = GEN_INT (1 << INTVAL (operands[2]));
 })
 
 ;; Convert ashift to the lea pattern to avoid flags dependency.
@@ -10095,7 +10080,7 @@
   [(set (match_operand:DI 0 "register_operand")
        (zero_extend:DI
          (ashift:SI (match_operand:SI 1 "index_register_operand")
-                    (match_operand:QI 2 "const_int_operand"))))
+                    (match_operand 2 "const_0_to_3_operand"))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT && reload_completed
    && REGNO (operands[0]) != REGNO (operands[1])"
@@ -10103,7 +10088,7 @@
        (zero_extend:DI (mult:SI (match_dup 1) (match_dup 2))))]
 {
   operands[1] = gen_lowpart (SImode, operands[1]);
-  operands[2] = gen_int_mode (1 << INTVAL (operands[2]), SImode);
+  operands[2] = GEN_INT (1 << INTVAL (operands[2]));
 })
 
 ;; This pattern can't accept a variable shift count, since shifts by

Reply via email to