]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm.h (CONDITIONAL_REGISTER_USAGE): If flag_pic, never use PIC_OFFSET_TABLE_REGNUM...
authorRichard Earnshaw <rearnsha@arm.com>
Sat, 19 Jun 1999 05:37:07 +0000 (05:37 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Sat, 19 Jun 1999 05:37:07 +0000 (05:37 +0000)
* arm.h (CONDITIONAL_REGISTER_USAGE): If flag_pic, never use
PIC_OFFSET_TABLE_REGNUM for general alloaction.
(INITIAL_ELIMINATION_OFFSET): Count the fact that the PIC register
must be stacked if it is used for PIC accesses.
* arm.c (use_return_insn): Handle PIC register specially.
(output_return_instruction): Likewise.
(output_func_{prologue,epilogue}): Likewise.
(output_expand_prologue): Likewise.

From-SVN: r27606

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.h

index c169d75365010092161d281b1dbc167bc2711673..586c99c21b9376e070da9c923f6fa8dddaac050f 100644 (file)
@@ -1,3 +1,14 @@
+Sat Jun 19 05:25:05 1999  Richard Earnshaw (rearnsha@arm.com)
+
+       * arm.h (CONDITIONAL_REGISTER_USAGE): If flag_pic, never use
+       PIC_OFFSET_TABLE_REGNUM for general alloaction.
+       (INITIAL_ELIMINATION_OFFSET): Count the fact that the PIC register
+       must be stacked if it is used for PIC accesses.
+       * arm.c (use_return_insn): Handle PIC register specially.
+       (output_return_instruction): Likewise.
+       (output_func_{prologue,epilogue}): Likewise.
+       (output_expand_prologue): Likewise.
+
 Fri Jun 18 15:44:18 1999  Richard Henderson  <rth@cygnus.com>
 
        * alpha.c (alpha_expand_block_move): Use get_insns rather than
index 1ba5edd2e1b46275296ee8b8e4925d5521a39f17..fef2b2ccecdb98e63f981d8a5a0431c6d3192b5e 100644 (file)
@@ -583,9 +583,14 @@ use_return_insn (iscond)
     return 0;
   if ((iscond && arm_is_strong)
       || TARGET_THUMB_INTERWORK)
-    for (regno = 0; regno < 16; regno++)
-      if (regs_ever_live[regno] && ! call_used_regs[regno])
+    {
+      for (regno = 0; regno < 16; regno++)
+       if (regs_ever_live[regno] && ! call_used_regs[regno])
+         return 0;
+
+      if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
        return 0;
+    }
       
   /* Can't be done if any of the FPU regs are pushed, since this also
      requires an insn */
@@ -5319,6 +5324,9 @@ output_return_instruction (operand, really_return, reverse)
     if (regs_ever_live[reg] && ! call_used_regs[reg])
       live_regs++;
 
+  if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
+    live_regs++;
+
   if (live_regs || (regs_ever_live[14] && ! lr_save_eliminated))
     live_regs++;
 
@@ -5338,7 +5346,9 @@ output_return_instruction (operand, really_return, reverse)
                reverse ? "ldm%?%D0fd\t%|sp!, {" : "ldm%?%d0fd\t%|sp!, {");
 
       for (reg = 0; reg <= 10; reg++)
-        if (regs_ever_live[reg] && ! call_used_regs[reg])
+        if (regs_ever_live[reg] 
+           && (! call_used_regs[reg]
+               || (flag_pic && reg == PIC_OFFSET_TABLE_REGNUM)))
           {
            strcat (instr, "%|");
             strcat (instr, reg_names[reg]);
@@ -5498,6 +5508,9 @@ output_func_prologue (f, frame_size)
     if (regs_ever_live[reg] && ! call_used_regs[reg])
       live_regs_mask |= (1 << reg);
 
+  if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
+    live_regs_mask |= (1 << PIC_OFFSET_TABLE_REGNUM);
+
   if (frame_pointer_needed)
     live_regs_mask |= 0xD800;
   else if (regs_ever_live[14])
@@ -5574,6 +5587,12 @@ output_func_epilogue (f, frame_size)
        floats_offset += 4;
       }
 
+  if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
+    {
+      live_regs_mask |= (1 << PIC_OFFSET_TABLE_REGNUM);
+      floats_offset += 4;
+    }
+
   if (frame_pointer_needed)
     {
       if (arm_fpu_arch == FP_SOFT2)
@@ -5834,12 +5853,17 @@ arm_expand_prologue ()
     store_arg_regs = 1;
 
   if (! volatile_func)
-    for (reg = 0; reg <= 10; reg++)
-      if (regs_ever_live[reg] && ! call_used_regs[reg])
-       live_regs_mask |= 1 << reg;
+    {
+      for (reg = 0; reg <= 10; reg++)
+       if (regs_ever_live[reg] && ! call_used_regs[reg])
+         live_regs_mask |= 1 << reg;
+
+      if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
+       live_regs_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
 
-  if (! volatile_func && regs_ever_live[14])
-    live_regs_mask |= 0x4000;
+      if (regs_ever_live[14])
+       live_regs_mask |= 0x4000;
+    }
 
   if (frame_pointer_needed)
     {
index 7b5cd49037652b25180026d3a0531b61202e044d..3c133a01b0e4cac9e6db53cd264f4c5e3806bbef 100644 (file)
@@ -726,7 +726,7 @@ extern const char * structure_size_string;
   if (flag_pic)                                                \
     {                                                  \
       fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;         \
-      call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 0;     \
+      call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;     \
     }                                                  \
   else if (TARGET_APCS_STACK)                          \
     {                                                  \
@@ -1263,6 +1263,9 @@ do {                                                                      \
           for (regno = 0; regno <= 10; regno++)                                \
            if (regs_ever_live[regno] && ! call_used_regs[regno])       \
              saved_hard_reg = 1, offset += 4;                          \
+         /* PIC register is a fixed reg, so call_used_regs set.  */    \
+         if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])      \
+           saved_hard_reg = 1, offset += 4;                            \
           for (regno = 16; regno <=23; regno++)                                \
            if (regs_ever_live[regno] && ! call_used_regs[regno])       \
              offset += 12;                                             \