This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Commit: MSP430: Fix bugs in MSP430 backend
- From: Nick Clifton <nickc at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 29 Apr 2014 14:58:25 +0100
- Subject: Commit: MSP430: Fix bugs in MSP430 backend
- Authentication-results: sourceware.org; auth=none
Hi Guys,
I am applying the patch below to the mainline and 4.9 branch. It
fixes a few problems in the MSP430 backend. Specifically:
* The %O operand operator did not allow for the extra bytes pushed
onto the stack in large mode.
* The mulhisi3 pattern was disabled inside interrupt handlers when
in fact it is interrupt safe.
* The umulsidi3 pattern used the wrong address for the second
operand.
Tested with an msp430-elf toolchain with no regressions.
Cheers
Nick
gcc/ChangeLog
2014-04-29 Nick Clifton <nickc@redhat.com>
* config/msp430/msp430.md (umulsidi): Fix typo.
(mulhisi3): Enable even inside interrupt handlers.
* config/msp430/msp430.c (msp430_print_operand): %O: Allow for the
bigger return address pushed in large mode.
Index: gcc/config/msp430/msp430.c
===================================================================
--- gcc/config/msp430/msp430.c (revision 209897)
+++ gcc/config/msp430/msp430.c (working copy)
@@ -2162,7 +2162,7 @@
because builtins are expanded before the frame layout is determined. */
fprintf (file, "%d",
msp430_initial_elimination_offset (ARG_POINTER_REGNUM, STACK_POINTER_REGNUM)
- - 2);
+ - (TARGET_LARGE ? 4 : 2));
return;
case 'J':
Index: gcc/config/msp430/msp430.md
===================================================================
--- gcc/config/msp430/msp430.md (revision 209897)
+++ gcc/config/msp430/msp430.md (working copy)
@@ -1321,7 +1321,7 @@
[(set (match_operand:SI 0 "register_operand" "=r")
(mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%0"))
(sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))]
- "optimize > 2 && msp430_hwmult_type != NONE && ! msp430_is_interrupt_func ()"
+ "optimize > 2 && msp430_hwmult_type != NONE"
"*
if (msp430_use_f5_series_hwmult ())
return \"PUSH.W sr { DINT { MOV.W %1, &0x04C2 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0 { POP.W sr\";
@@ -1365,6 +1365,6 @@
if (msp430_use_f5_series_hwmult ())
return \"PUSH.W sr { DINT { MOV.W %L1, &0x04D0 { MOV.W %H1, &0x04D2 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0 { POP.W sr\";
else
- return \"PUSH.W sr { DINT { MOV.W %L1, &0x0140 { MOV.W %H1, &0x0141 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0 { POP.W sr\";
+ return \"PUSH.W sr { DINT { MOV.W %L1, &0x0140 { MOV.W %H1, &0x0142 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0 { POP.W sr\";
"
)