diff options
author | DJ Delorie <dj@redhat.com> | 2014-01-13 14:17:45 -0500 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2014-01-13 14:17:45 -0500 |
commit | fb28dac0ff5f7c9943e53a36dc8b6ab05bef0520 (patch) | |
tree | 8e52ce60f78867347d1d225030648e00b2b503cc /gcc/config/msp430 | |
parent | 03b9e8e48dfb02c43661102ce25d968dd4b2e09d (diff) | |
download | gcc-fb28dac0ff5f7c9943e53a36dc8b6ab05bef0520.zip gcc-fb28dac0ff5f7c9943e53a36dc8b6ab05bef0520.tar.gz gcc-fb28dac0ff5f7c9943e53a36dc8b6ab05bef0520.tar.bz2 |
msp430.md (call_internal): Don't allow memory references with SP as the base register.
* 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.
From-SVN: r206586
Diffstat (limited to 'gcc/config/msp430')
-rw-r--r-- | gcc/config/msp430/constraints.md | 13 | ||||
-rw-r--r-- | gcc/config/msp430/msp430.c | 4 | ||||
-rw-r--r-- | gcc/config/msp430/msp430.md | 6 |
3 files changed, 19 insertions, 4 deletions
diff --git a/gcc/config/msp430/constraints.md b/gcc/config/msp430/constraints.md index 5b1ff4a..8ab057f 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 39e2d31..d49b9a4 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 eea4da0..6a40fd9 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" |