i386.md (LEAMODE): New mode attribute.
authorUros Bizjak <uros@gcc.gnu.org>
Fri, 6 May 2016 21:14:20 +0000 (23:14 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 6 May 2016 21:14:20 +0000 (23:14 +0200)
* 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.

From-SVN: r235987

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

index 103dd6675401d1e221695a678054c1b29ad3ba5f..156359254af1ab8bf1cc9843ff924ee6e9394cd8 100644 (file)
@@ -1,3 +1,14 @@
+2016-05-06  Uros Bizjak  <ubizjak@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.
+
 2016-05-06  Jakub Jelinek  <jakub@redhat.com>
 
        * genmddump.c (main): Convert argv from char ** to const char **.
@@ -34,8 +45,7 @@
 
 2016-05-06  David Malcolm  <dmalcolm@redhat.com>
 
-       * genattr-common.c (main): Convert argv from
-       char ** to const char **.
+       * genattr-common.c (main): Convert argv from char ** to const char **.
        * genattr.c (main): Likewise.
        * genattrtab.c (main): Likewise.
        * genautomata.c (initiate_automaton_gen): Likewise.
index 8bebba7be021ff3210d2ecf91b050e2e9facd0f8..2b7ff31a0185429423679052f2244652fa003181 100644 (file)
 (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")])
    (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")
              (clobber (reg:CC FLAGS_REG))])]
   "operands[3] = gen_lowpart (SImode, operands[0]);")
 
+;; 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")
   [(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)"
   "#"
        (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)"
        (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])))"
        (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]))"
   "#"
 
 ;; 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.
   [(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])"
        (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