This is the mail archive of the 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]

Fix off-by-one when computing VRSAVE on rs6000

vregno is the next register to use, so it is not actually in use, so
we do need to have a bit set in the VRSAVE mask if we're going to be
using it.

This usually has no effect on Darwin, because Darwin groups the
registers into sets of 4 when doing the saving.

Bootstrapped & tested on powerpc-darwin.

- Geoffrey Keating <>

===File ~/patches/rs6000-vrsaveoffbyone.patch===============
2003-11-05  Geoffrey Keating  <>

	* config/rs6000/rs6000.c (compute_vrsave_mask): Correct off-by-one

Index: config/rs6000/rs6000.c
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.541
diff -u -p -u -p -r1.541 rs6000.c
--- config/rs6000/rs6000.c	3 Nov 2003 21:44:08 -0000	1.541
+++ config/rs6000/rs6000.c	5 Nov 2003 18:12:20 -0000
@@ -10109,7 +10128,7 @@ compute_vrsave_mask (void)
      them in again.  More importantly, the mask we compute here is
      used to generate CLOBBERs in the set_vrsave insn, and we do not
      wish the argument registers to die.  */
-  for (i = cfun->args_info.vregno; i >= ALTIVEC_ARG_MIN_REG; --i)
+  for (i = cfun->args_info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
     mask &= ~ALTIVEC_REG_BIT (i);
   /* Similarly, remove the return value from the set.  */

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