mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
03b9e8e48d
commit
fb28dac0ff
|
|
@ -1,3 +1,15 @@
|
||||||
|
2014-01-10 DJ Delorie <dj@redhat.com>
|
||||||
|
|
||||||
|
* 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 <jakub@redhat.com>
|
2014-01-13 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR target/59617
|
PR target/59617
|
||||||
|
|
|
||||||
|
|
@ -70,3 +70,16 @@
|
||||||
(match_test ("IN_RANGE (INTVAL (XEXP (XEXP (op, 0), 1)), -1 << 15, (1 << 15)-1)"))))
|
(match_test ("IN_RANGE (INTVAL (XEXP (XEXP (op, 0), 1)), -1 << 15, (1 << 15)-1)"))))
|
||||||
(match_code "reg" "0")
|
(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")))
|
||||||
|
))))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
D bits 48-63 of a 64-bit value/reg 4 of a DImode value
|
||||||
H like %B (for backwards compatibility)
|
H like %B (for backwards compatibility)
|
||||||
I inverse of value
|
I inverse of value
|
||||||
|
J an integer without a # prefix
|
||||||
L like %A (for backwards compatibility)
|
L like %A (for backwards compatibility)
|
||||||
O offset of the top of the stack
|
O offset of the top of the stack
|
||||||
Q like X but generates an A postfix
|
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. */
|
/* Print the constant value, less four. */
|
||||||
fprintf (file, "#%ld", INTVAL (op) - 4);
|
fprintf (file, "#%ld", INTVAL (op) - 4);
|
||||||
return;
|
return;
|
||||||
/* case 'D': used for "decimal without '#'" */
|
|
||||||
case 'I':
|
case 'I':
|
||||||
if (GET_CODE (op) == CONST_INT)
|
if (GET_CODE (op) == CONST_INT)
|
||||||
{
|
{
|
||||||
|
|
@ -2110,6 +2110,8 @@ msp430_print_operand (FILE * file, rtx op, int letter)
|
||||||
- 2);
|
- 2);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case 'J':
|
||||||
|
gcc_assert (GET_CODE (op) == CONST_INT);
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -920,7 +920,7 @@
|
||||||
(define_insn "epilogue_helper"
|
(define_insn "epilogue_helper"
|
||||||
[(unspec_volatile [(match_operand 0 "immediate_operand" "i")] UNS_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"
|
(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 ""))]
|
(match_operand 1 ""))]
|
||||||
""
|
""
|
||||||
"CALL%Q0\t%0"
|
"CALL%Q0\t%0"
|
||||||
|
|
@ -969,7 +969,7 @@
|
||||||
|
|
||||||
(define_insn "call_value_internal"
|
(define_insn "call_value_internal"
|
||||||
[(set (match_operand 0 "register_operand" "=r")
|
[(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 "")))]
|
(match_operand 2 "")))]
|
||||||
""
|
""
|
||||||
"CALL%Q0\t%1"
|
"CALL%Q0\t%1"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue