aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2002-03-14 15:09:13 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2002-03-14 15:09:13 +0000
commitc882c7acd5e1cbe262971ae6f5db277a88c4b0e4 (patch)
tree091a77383d5e02779d037a032b80317e6972c046 /gcc
parentd3f129b340ca8a3b6d67518791ea962db9c3e3f8 (diff)
downloadgcc-c882c7acd5e1cbe262971ae6f5db277a88c4b0e4.zip
gcc-c882c7acd5e1cbe262971ae6f5db277a88c4b0e4.tar.gz
gcc-c882c7acd5e1cbe262971ae6f5db277a88c4b0e4.tar.bz2
re PR target/5828 (gcc-3.0.4 on arm : floating point registers incorrectly reloaded)
PR target/5828 * arm.c (arm_output_epilogue): Fix floating-point register save adjustment when using a frame pointer. Co-Authored-By: Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com> From-SVN: r50771
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/arm/arm.c18
2 files changed, 19 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 84d0956..7095903 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2002-03-14 Richard Earnshaw <rearnsha@arm.com>
+ Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
+
+ PR target/5828
+ * arm.c (arm_output_epilogue): Fix floating-point register save
+ adjustment when using a frame pointer.
+
2002-03-14 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.h (FP_INC, UNITS_PER_FPVALUE): New macros.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 8e85957..921411a 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -7467,8 +7467,9 @@ arm_output_epilogue (really_return)
int reg;
unsigned long saved_regs_mask;
unsigned long func_type;
- /* If we need this, then it will always be at least this much. */
- int floats_offset = 12;
+ /* Floats_offset is the offset from the "virtual" frame. In an APCS
+ frame that is $fp + 4 for a non-variadic function. */
+ int floats_offset = 0;
rtx operands[3];
int frame_size = get_frame_size ();
FILE * f = asm_out_file;
@@ -7505,6 +7506,9 @@ arm_output_epilogue (really_return)
saved_regs_mask = arm_compute_save_reg_mask ();
+ /* XXX We should adjust floats_offset for any anonymous args, and then
+ re-adjust vfp_offset below to compensate. */
+
/* Compute how far away the floats will be. */
for (reg = 0; reg <= LAST_ARM_REGNUM; reg ++)
if (saved_regs_mask & (1 << reg))
@@ -7512,6 +7516,8 @@ arm_output_epilogue (really_return)
if (frame_pointer_needed)
{
+ int vfp_offset = 4;
+
if (arm_fpu_arch == FP_SOFT2)
{
for (reg = LAST_ARM_FP_REGNUM; reg >= FIRST_ARM_FP_REGNUM; reg--)
@@ -7519,7 +7525,7 @@ arm_output_epilogue (really_return)
{
floats_offset += 12;
asm_fprintf (f, "\tldfe\t%r, [%r, #-%d]\n",
- reg, FP_REGNUM, floats_offset);
+ reg, FP_REGNUM, floats_offset - vfp_offset);
}
}
else
@@ -7536,7 +7542,7 @@ arm_output_epilogue (really_return)
if (start_reg - reg == 3)
{
asm_fprintf (f, "\tlfm\t%r, 4, [%r, #-%d]\n",
- reg, FP_REGNUM, floats_offset);
+ reg, FP_REGNUM, floats_offset - vfp_offset);
start_reg = reg - 1;
}
}
@@ -7545,7 +7551,7 @@ arm_output_epilogue (really_return)
if (reg != start_reg)
asm_fprintf (f, "\tlfm\t%r, %d, [%r, #-%d]\n",
reg + 1, start_reg - reg,
- FP_REGNUM, floats_offset);
+ FP_REGNUM, floats_offset - vfp_offset);
start_reg = reg - 1;
}
}
@@ -7554,7 +7560,7 @@ arm_output_epilogue (really_return)
if (reg != start_reg)
asm_fprintf (f, "\tlfm\t%r, %d, [%r, #-%d]\n",
reg + 1, start_reg - reg,
- FP_REGNUM, floats_offset);
+ FP_REGNUM, floats_offset - vfp_offset);
}
/* saved_regs_mask should contain the IP, which at the time of stack