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]

Re: RFA: Add an FPIC set of multilibs to the MN10300 port


Hi Richard,

Have you tried using CALL_REALLY_USED_REGISTERS?  I.e. define
CALL_REALLY_USED_REGISTERS to be the same as CALL_USED_REGISTERS,
except that the former marks a2 as call-saved.

I had not considered this (because I did not know of the existence of the macro), but you are right, it is a good idea.


So Jeff, Alex - here is a third version of the patch, using Richard's suggestion and updating the code in mn10300.c to check the call_really_used[] array rather than the call_used[] array. Tested with an mn10300-elf toolchain with no regressions in the gcc testsuite and a lot of improvements for the results when compiling with -fpic.

May I apply this version of the patch please ?

Cheers
  Nick

gcc/ChangeLog
2008-10-27  Nick Clifton  <nickc@redhat.com>

	* config/mn10300/mn10300.h (CALL_REALLY_USED_REGISTERS): Define.
	* config/mn10300/mn10300.c (fp_regs_to_save): Test the
	call_really_used_regs array rather than the call_used_regs array.
	(mn10300_get_live_callee_saved_regs, expand_prologue,
	expand_epilogue, output_tst): Likewise.

Index: gcc/config/mn10300/mn10300.h
===================================================================
--- gcc/config/mn10300/mn10300.h	(revision 141372)
+++ gcc/config/mn10300/mn10300.h	(working copy)
@@ -171,6 +171,13 @@
   , 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 \
   }
 
+/* Note: The definition of CALL_REALLY_USED_REGISTERS is not
+   redundant.  It is needed when compiling in PIC mode because
+   the a2 register becomes fixed (and hence must be marked as
+   call_used) but in order to preserve the ABI it is not marked
+   as call_really_used.  */
+#define CALL_REALLY_USED_REGISTERS CALL_USED_REGISTERS
+
 #define REG_ALLOC_ORDER \
   { 0, 1, 4, 5, 2, 3, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 8, 9 \
   , 42, 43, 44, 45, 46, 47, 48, 49, 34, 35, 36, 37, 38, 39, 40, 41 \
Index: gcc/config/mn10300/mn10300.c
===================================================================
--- gcc/config/mn10300/mn10300.c	(revision 141324)
+++ gcc/config/mn10300/mn10300.c	(working copy)
@@ -540,7 +540,7 @@
     return 0;
 
   for (i = FIRST_FP_REGNUM; i <= LAST_FP_REGNUM; ++i)
-    if (df_regs_ever_live_p (i) && ! call_used_regs[i])
+    if (df_regs_ever_live_p (i) && ! call_really_used_regs[i])
       ++n;
 
   return n;
@@ -617,7 +617,7 @@
 
   mask = 0;
   for (i = 0; i <= LAST_EXTENDED_REGNUM; i++)
-    if (df_regs_ever_live_p (i) && ! call_used_regs[i])
+    if (df_regs_ever_live_p (i) && ! call_really_used_regs[i])
       mask |= (1 << i);
   if ((mask & 0x3c000) != 0)
     mask |= 0x3c000;
@@ -804,7 +804,7 @@
 	 frame pointer, size is nonzero and the user hasn't
 	 changed the calling conventions of a0.  */
       if (! frame_pointer_needed && size
-	  && call_used_regs[FIRST_ADDRESS_REGNUM]
+	  && call_really_used_regs [FIRST_ADDRESS_REGNUM]
 	  && ! fixed_regs[FIRST_ADDRESS_REGNUM])
 	{
 	  /* Insn: add -(size + 4 * num_regs_to_save), sp.  */
@@ -828,7 +828,7 @@
 
       /* Consider alternative save_a0_no_merge if the user hasn't
 	 changed the calling conventions of a0.  */
-      if (call_used_regs[FIRST_ADDRESS_REGNUM]
+      if (call_really_used_regs [FIRST_ADDRESS_REGNUM]
 	  && ! fixed_regs[FIRST_ADDRESS_REGNUM])
 	{
 	  /* Insn: add -4 * num_regs_to_save, sp.  */
@@ -910,7 +910,7 @@
 
       /* Now actually save the FP registers.  */
       for (i = FIRST_FP_REGNUM; i <= LAST_FP_REGNUM; ++i)
-	if (df_regs_ever_live_p (i) && ! call_used_regs[i])
+	if (df_regs_ever_live_p (i) && ! call_really_used_regs [i])
 	  {
 	    rtx addr;
 
@@ -1046,7 +1046,7 @@
 
 	  /* Consider using a1 in post-increment mode, as long as the
 	     user hasn't changed the calling conventions of a1.  */
-	  if (call_used_regs[FIRST_ADDRESS_REGNUM+1]
+	  if (call_really_used_regs [FIRST_ADDRESS_REGNUM + 1]
 	      && ! fixed_regs[FIRST_ADDRESS_REGNUM+1])
 	    {
 	      /* Insn: mov sp,a1.  */
@@ -1114,7 +1114,7 @@
 	reg = gen_rtx_POST_INC (SImode, reg);
 
       for (i = FIRST_FP_REGNUM; i <= LAST_FP_REGNUM; ++i)
-	if (df_regs_ever_live_p (i) && ! call_used_regs[i])
+	if (df_regs_ever_live_p (i) && ! call_really_used_regs [i])
 	  {
 	    rtx addr;
 
@@ -1687,7 +1687,7 @@
 	  && REGNO_REG_CLASS (REGNO (SET_DEST (set))) != EXTENDED_REGS
 	  && REGNO (SET_DEST (set)) != REGNO (operand)
 	  && (!past_call
-	      || !call_used_regs[REGNO (SET_DEST (set))]))
+	      || ! call_really_used_regs [REGNO (SET_DEST (set))]))
 	{
 	  rtx xoperands[2];
 	  xoperands[0] = operand;
@@ -1706,7 +1706,7 @@
 	  && REGNO_REG_CLASS (REGNO (SET_DEST (set))) == EXTENDED_REGS
 	  && REGNO (SET_DEST (set)) != REGNO (operand)
 	  && (!past_call
-	      || !call_used_regs[REGNO (SET_DEST (set))]))
+	      || ! call_really_used_regs [REGNO (SET_DEST (set))]))
 	{
 	  rtx xoperands[2];
 	  xoperands[0] = operand;

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