Browse Source

ARM: Fix IR splitting for softfp XLOAD.

Mike Pall 13 years ago
parent
commit
fa1675baad
2 changed files with 15 additions and 5 deletions
  1. 3 1
      src/lj_asm.c
  2. 12 4
      src/lj_opt_split.c

+ 3 - 1
src/lj_asm.c

@@ -809,8 +809,10 @@ static void asm_snap_alloc(ASMState *as)
     IRRef ref = snap_ref(sn);
     if (!irref_isk(ref)) {
       asm_snap_alloc1(as, ref);
-      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM))
+      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) {
+	lua_assert(irt_type(IR(ref+1)->t) == IRT_SOFTFP);
 	asm_snap_alloc1(as, ref+1);
+      }
     }
   }
 }

+ 12 - 4
src/lj_opt_split.c

@@ -313,13 +313,21 @@ static void split_ir(jit_State *J)
       case IR_STRTO:
 	hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);
 	break;
-      case IR_XLOAD:
-	hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP),
-			split_ptr(J, oir, ir->op1), ir->op2);
-#if LJ_BE
+      case IR_XLOAD: {
+	IRIns inslo = *nir;  /* Save/undo the emit of the lo XLOAD. */
+	J->cur.nins--;
+	hi = split_ptr(J, oir, ir->op1);  /* Insert the hiref ADD. */
+	nref = lj_ir_nextins(J);
+	nir = IR(nref);
+	*nir = inslo;  /* Re-emit lo XLOAD immediately before hi XLOAD. */
+	hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP), hi, ir->op2);
+#if LJ_LE
+	ir->prev = nref;
+#else
 	ir->prev = hi; hi = nref;
 #endif
 	break;
+	}
       case IR_ASTORE: case IR_HSTORE: case IR_USTORE:
 	split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nir->op1, hisubst[ir->op2]);
 	break;