Browse Source

fixed a bug: STD/LDD was generated on odd-numbered reg

ceriel 27 years ago
parent
commit
044f3c9814
1 changed files with 10 additions and 0 deletions
  1. 10 0
      mach/sparc/ce/ce.src/ms_reg.c

+ 10 - 0
mach/sparc/ce/ce.src/ms_reg.c

@@ -211,6 +211,14 @@ reg_info *e1, *e2;
   return (e1->offset - e2->offset);
 }
 
+static int even(s)
+char *s;
+{
+  int l = strlen(s);
+  /* Assume ASCII, where even-numbered characters (0,2,4,6,8) are even. */
+  return ! (s[l-1] & 1);
+}
+
 static save_float_regs()
 {
   int i;
@@ -220,6 +228,7 @@ static save_float_regs()
   for (i = 0, offset= 0; i < nr_flt_vars; i++, offset += 8)
 	if ((i+1 < nr_flt_vars &&
 		flt_dat[i].offset == flt_dat[i+1].offset-4 &&
+		even(flt_dat[i].reg) &&
 		flt_dat[i].size == EM_FSIZE &&
 		flt_dat[i+1].size == EM_FSIZE)
 		|| (flt_dat[i].size == EM_DSIZE)) {
@@ -240,6 +249,7 @@ load_float_regs()
   for (i = 0, offset= 0; i < nr_flt_vars; i++, offset += 8)
 	if ((i+1 < nr_flt_vars &&
 		flt_dat[i].offset == flt_dat[i+1].offset-4 &&
+		even(flt_dat[i].reg) &&
 		flt_dat[i].size == EM_FSIZE &&
 		flt_dat[i+1].size == EM_FSIZE)
 		|| (flt_dat[i].size == EM_DSIZE)) {