aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/msp430
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2014-01-13 14:17:45 -0500
committerDJ Delorie <dj@gcc.gnu.org>2014-01-13 14:17:45 -0500
commitfb28dac0ff5f7c9943e53a36dc8b6ab05bef0520 (patch)
tree8e52ce60f78867347d1d225030648e00b2b503cc /gcc/config/msp430
parent03b9e8e48dfb02c43661102ce25d968dd4b2e09d (diff)
downloadgcc-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.md13
-rw-r--r--gcc/config/msp430/msp430.c4
-rw-r--r--gcc/config/msp430/msp430.md6
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"