diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 15697e5a9c7..5c674bc5b44 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2014-01-10 DJ Delorie + + * config/msp430/msp430.md (call_internal): Don't allow memory + references with SP as the base register. + (call_value_internal): Likewise. + * config/msp430/constraints.md (Yc): New. For memory references + that don't use SP as a base register. + + * config/msp430/msp430.c (msp430_print_operand): Add 'J' to mean + "an integer without a # prefix" + * config/msp430/msp430.md (epilogue_helper): Use it. + 2014-01-13 Jakub Jelinek PR target/59617 diff --git a/gcc/config/msp430/constraints.md b/gcc/config/msp430/constraints.md index 5b1ff4a6a33..8ab057fd1c9 100644 --- a/gcc/config/msp430/constraints.md +++ b/gcc/config/msp430/constraints.md @@ -70,3 +70,16 @@ (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"))) + )))) + diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index 39e2d312377..d49b9a46374 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -1920,6 +1920,7 @@ msp430_print_operand_addr (FILE * file, rtx addr) 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 @@ -1950,7 +1951,6 @@ msp430_print_operand (FILE * file, rtx op, int letter) /* 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) { @@ -2110,6 +2110,8 @@ msp430_print_operand (FILE * file, rtx op, int letter) - 2); return; + case 'J': + gcc_assert (GET_CODE (op) == CONST_INT); case 0: break; default: diff --git a/gcc/config/msp430/msp430.md b/gcc/config/msp430/msp430.md index eea4da098d9..6a40fd9e292 100644 --- a/gcc/config/msp430/msp430.md +++ b/gcc/config/msp430/msp430.md @@ -920,7 +920,7 @@ (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" ) @@ -953,7 +953,7 @@ ) (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" @@ -969,7 +969,7 @@ (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"