Minor bugfixes.  Committed to head and 4.9 branch.

        * config/msp430/msp430.md (split): Don't allow subregs when
        splitting SImode adds.
        (andneghi): Fix subtraction logic.
        * config/msp430/predicates.md (msp430_nonsubreg_or_imm_operand): New.

Index: config/msp430/predicates.md
===================================================================
--- config/msp430/predicates.md (revision 210652)
+++ config/msp430/predicates.md (working copy)
@@ -70,11 +70,15 @@
                     || INTVAL (op) == ~8
                     || INTVAL (op) == ~(-1) "))))
 
 (define_predicate "msp430_nonsubreg_operand"
   (match_code "reg,mem"))
 
+(define_predicate "msp430_nonsubreg_or_imm_operand"
+  (ior (match_operand 0 "msp430_nonsubreg_operand")
+       (match_operand 0 "immediate_operand")))
+
 ; TRUE for constants which are bit positions for zero_extract
 (define_predicate "msp430_bitpos"
   (and (match_code "const_int")
        (match_test ("   INTVAL (op) >= 0
                     && INTVAL (op) <= 15 "))))
Index: config/msp430/msp430.md
===================================================================
--- config/msp430/msp430.md     (revision 210652)
+++ config/msp430/msp430.md     (working copy)
@@ -359,14 +359,14 @@
 
 ; Split an SImode add into two HImode adds, keeping track of the carry
 ; so that gcc knows when it can and can't optimize away the two
 ; halves.
 (define_split
   [(set (match_operand:SI          0 "msp430_nonsubreg_operand")
-       (plus:SI (match_operand:SI 1 "nonimmediate_operand")
-                (match_operand:SI 2 "general_operand")))
+       (plus:SI (match_operand:SI 1 "msp430_nonsubreg_operand")
+                (match_operand:SI 2 "msp430_nonsubreg_or_imm_operand")))
    ]
   ""
   [(parallel [(set (match_operand:HI 3 "nonimmediate_operand" "=&rm")
                   (plus:HI (match_dup 4)
                            (match_dup 5)))
              (set (reg:BI CARRY)
@@ -1314,15 +1314,15 @@
   [(set (match_operand:HI                 0 "register_operand" "=r")
        (and:HI (neg:HI (match_operand:HI 1 "register_operand"  "r"))
                (match_operand            2 "immediate_operand" "n")))]
   ""
   "*
     if (REGNO (operands[0]) != REGNO (operands[1]))
-      return \"MOV.W\t%1, %0 { SUB.W\t#0, %0 { AND.W\t%2, %0\";
+      return \"MOV.W\t%1, %0 { INV.W\t%0 { INC.W\t%0 { AND.W\t%2, %0\";
     else
-      return \"SUB.W\t#0, %0 { AND.W\t%2, %0\";
+      return \"INV.W\t%0 { INC.W\t%0 { AND.W\t%2, %0\";
   "
   )
 
 (define_insn "mulhisi3"
   [(set (match_operand:SI                          0 "register_operand" "=r")
        (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%0"))

Reply via email to