OSDN Git Service

2009-02-02 Paul Brook <paul@codesourcery.com>
authorpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Feb 2009 17:09:45 +0000 (17:09 +0000)
committerpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Feb 2009 17:09:45 +0000 (17:09 +0000)
gcc/
* config/arm/arm.md (arm_addsi3): Add r/r/k alternative.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143874 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.md

index a4c777c..8ed5b7f 100644 (file)
@@ -1,3 +1,7 @@
+2009-02-02  Paul Brook  <paul@codesourcery.com>
+
+       * config/arm/arm.md (arm_addsi3): Add r/r/k alternative.
+
 2009-02-02  Jakub Jelinek  <jakub@redhat.com>
 
        PR inline-asm/39058
index 0acf257..4eccd73 100644 (file)
   ""
 )
 
+;; The r/r/k alternative is required when reloading the address
+;;  (plus (reg rN) (reg sp)) into (reg rN).  In this case reload will
+;; put the duplicated register first, and not try the commutative version.
 (define_insn_and_split "*arm_addsi3"
-  [(set (match_operand:SI          0 "s_register_operand" "=r, !k,r, !k,r")
-       (plus:SI (match_operand:SI 1 "s_register_operand" "%rk,!k,rk,!k,rk")
-                (match_operand:SI 2 "reg_or_int_operand" "rI, rI,L, L,?n")))]
+  [(set (match_operand:SI          0 "s_register_operand" "=r, !k, r,r, !k,r")
+       (plus:SI (match_operand:SI 1 "s_register_operand" "%rk,!k, r,rk,!k,rk")
+                (match_operand:SI 2 "reg_or_int_operand" "rI, rI,!k,L, L,?n")))]
   "TARGET_32BIT"
   "@
    add%?\\t%0, %1, %2
    add%?\\t%0, %1, %2
+   add%?\\t%0, %2, %1
    sub%?\\t%0, %1, #%n2
    sub%?\\t%0, %1, #%n2
    #"
                      operands[1], 0);
   DONE;
   "
-  [(set_attr "length" "4,4,4,4,16")
+  [(set_attr "length" "4,4,4,4,4,16")
    (set_attr "predicable" "yes")]
 )