]> gcc.gnu.org Git - gcc.git/commitdiff
i386.md (QImode add pattern): Support lea instruction.
authorJan Hubicka <hubicka@freesoft.cz>
Thu, 15 Apr 1999 01:38:29 +0000 (03:38 +0200)
committerJeff Law <law@gcc.gnu.org>
Thu, 15 Apr 1999 01:38:29 +0000 (19:38 -0600)
        * i386.md (QImode add pattern): Support lea instruction.
        (HImode add pattern): Likewise.

Co-Authored-By: Jeffrey A Law <law@cygnus.com>
From-SVN: r26468

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

index 30d9a68c27623596297d52a9fc13bce57141c4b1..b69eeda0156ea3a8570874a590419b34fe3e9db3 100644 (file)
@@ -1,6 +1,9 @@
 Thu Apr 15 01:03:21 1999  Jan Hubicka <hubicka@freesoft.cz>
                          Jeff Law <law@cygnus.com>
 
+       * i386.md (QImode add pattern): Support lea instruction.
+       (HImode add pattern): Likewise.
+
        * i386.md (ashlsi patterns): Call output_ashl instead of output_ashlsi3.
        (ashlqi): Use expander, separate LEA and SAL / ADD patterns; call
        output_ashl.
index 39a06f2b233608c02b1ec789230424d9da72ce88..28e35e44179d7c08fe765f12bad033242ece722f 100644 (file)
   "IX86_EXPAND_BINARY_OPERATOR (PLUS, HImode, operands);")
 
 (define_insn ""
-  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r")
-       (plus:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0")
-                (match_operand:HI 2 "general_operand" "ri,rm")))]
+  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r,?r")
+       (plus:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,r")
+                (match_operand:HI 2 "general_operand" "ri,rm,ri")))]
   "ix86_binary_operator_ok (PLUS, HImode, operands)"
   "*
 {
+  if (REG_P (operands[0]) && REG_P (operands[1])
+      && (REG_P (operands[2]) || CONSTANT_P (operands[2]))
+      && REGNO (operands[0]) != REGNO (operands[1]))
+    {
+      if (operands[2] == stack_pointer_rtx) 
+       abort ();
+
+      CC_STATUS_INIT;
+      operands[1]
+       = gen_rtx_PLUS (SImode,
+                       gen_rtx_REG (SImode, REGNO (operands[1])),
+                       (! REG_P (operands[2])
+                        ? operands[2]
+                        : gen_rtx_REG (SImode, REGNO (operands[2]))));
+      operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));
+      return AS2 (lea%L0,%a1,%0);
+    }
+
   /* ??? what about offsettable memory references? */
   if (!TARGET_PENTIUMPRO /* partial stalls are just too painful to risk. */
       && QI_REG_P (operands[0])
   "IX86_EXPAND_BINARY_OPERATOR (PLUS, QImode, operands);")
 
 (define_insn ""
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q")
-       (plus:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0")
-                (match_operand:QI 2 "general_operand" "qn,qmn")))]
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q,?q")
+       (plus:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,q")
+                (match_operand:QI 2 "general_operand" "qn,qmn,qn")))]
   "ix86_binary_operator_ok (PLUS, QImode, operands)"
   "*
 {
+  if (REG_P (operands[0]) && REG_P (operands[1])
+      && (REG_P (operands[2]) || CONSTANT_P (operands[2]))
+      && (REGNO (operands[0]) != REGNO (operands[1])
+         || NON_QI_REG_P (operands[1])
+         || (REG_P (operands[2]) && NON_QI_REG_P (operands[2]))))
+    {
+      if (operands[2] == stack_pointer_rtx) 
+       abort ();
+
+      CC_STATUS_INIT;
+      operands[1]
+       = gen_rtx_PLUS (SImode,
+                       gen_rtx_REG (SImode, REGNO (operands[1])),
+                       (! REG_P (operands[2])
+                        ? operands[2]
+                        : gen_rtx_REG (SImode, REGNO (operands[2]))));
+      operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));
+      return AS2 (lea%L0,%a1,%0);
+    }
   if (operands[2] == const1_rtx)
     return AS1 (inc%B0,%0);
 
This page took 0.091906 seconds and 5 git commands to generate.