===================================================================
@@ -917,13 +917,13 @@
)
(define_insn "epilogue_helper"
[(unspec_volatile [(match_operand 0 "immediate_operand" "i")] UNS_EPILOGUE_HELPER)]
""
- "BR%Q0\t#__mspabi_func_epilog_%0"
+ "BR%Q0\t#__mspabi_func_epilog_%J0"
)
(define_insn "prologue_start_marker"
[(unspec_volatile [(const_int 0)] UNS_PROLOGUE_START_MARKER)]
""
@@ -950,13 +950,13 @@
(match_operand 1 ""))]
""
""
)
(define_insn "call_internal"
- [(call (mem:HI (match_operand 0 "general_operand" "rmi"))
+ [(call (mem:HI (match_operand 0 "general_operand" "rYci"))
(match_operand 1 ""))]
""
"CALL%Q0\t%0"
)
(define_expand "call_value"
@@ -966,13 +966,13 @@
""
""
)
(define_insn "call_value_internal"
[(set (match_operand 0 "register_operand" "=r")
- (call (mem:HI (match_operand 1 "general_operand" "rmi"))
+ (call (mem:HI (match_operand 1 "general_operand" "rYci"))
(match_operand 2 "")))]
""
"CALL%Q0\t%1"
)
(define_insn "msp_return"
===================================================================
@@ -67,6 +67,19 @@
(and (match_code "plus" "0")
(and (match_code "reg" "00")
(match_test ("CONST_INT_P (XEXP (XEXP (op, 0), 1))"))
(match_test ("IN_RANGE (INTVAL (XEXP (XEXP (op, 0), 1)), -1 << 15, (1 << 15)-1)"))))
(match_code "reg" "0")
)))
+
+(define_constraint "Yc"
+ "Memory reference, for CALL - we can't use SP"
+ (and (match_code "mem")
+ (match_code "mem" "0")
+ (not (ior
+ (and (match_code "plus" "00")
+ (and (match_code "reg" "000")
+ (match_test ("REGNO (XEXP (XEXP (op, 0), 0)) != SP_REGNO"))))
+ (and (match_code "reg" "0")
+ (match_test ("REGNO (XEXP (XEXP (op, 0), 0)) != SP_REGNO")))
+ ))))
+
===================================================================
@@ -1917,12 +1917,13 @@ msp430_print_operand_addr (FILE * file,
/* A low 16-bits of int/lower of register pair
B high 16-bits of int/higher of register pair
C bits 32-47 of a 64-bit value/reg 3 of a DImode value
D bits 48-63 of a 64-bit value/reg 4 of a DImode value
H like %B (for backwards compatibility)
I inverse of value
+ J an integer without a # prefix
L like %A (for backwards compatibility)
O offset of the top of the stack
Q like X but generates an A postfix
R inverse of condition code, unsigned.
X X instruction postfix in large mode
Y value - 4
@@ -1947,13 +1948,12 @@ msp430_print_operand (FILE * file, rtx o
return;
case 'Y':
gcc_assert (CONST_INT_P (op));
/* Print the constant value, less four. */
fprintf (file, "#%ld", INTVAL (op) - 4);
return;
- /* case 'D': used for "decimal without '#'" */
case 'I':
if (GET_CODE (op) == CONST_INT)
{
/* Inverse of constants */
int i = INTVAL (op);
fprintf (file, "%d", ~i);
@@ -2107,12 +2107,14 @@ msp430_print_operand (FILE * file, rtx o
because builtins are expanded before the frame layout is determined. */
fprintf (file, "%d",
msp430_initial_elimination_offset (ARG_POINTER_REGNUM, STACK_POINTER_REGNUM)
- 2);
return;
+ case 'J':
+ gcc_assert (GET_CODE (op) == CONST_INT);
case 0:
break;
default:
output_operand_lossage ("invalid operand prefix");
return;
}