This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Commit: MSP430: Fix bugs in MSP430 backend


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\";
   "
 )


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]