diff mbox

[msp430] fix addneghi and add split

Message ID 201405202000.s4KK0REB003826@greed.delorie.com
State New
Headers show

Commit Message

DJ Delorie May 20, 2014, 8 p.m. UTC
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.
diff mbox

Patch

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"))