ARM: Fix IR splitting for softfp XLOAD.

This commit is contained in:
Mike Pall 2011-11-11 01:07:34 +01:00
parent 4bcf2b40fe
commit fa1675baad
2 changed files with 15 additions and 5 deletions

View File

@ -809,8 +809,10 @@ static void asm_snap_alloc(ASMState *as)
IRRef ref = snap_ref(sn); IRRef ref = snap_ref(sn);
if (!irref_isk(ref)) { if (!irref_isk(ref)) {
asm_snap_alloc1(as, 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); asm_snap_alloc1(as, ref+1);
}
} }
} }
} }

View File

@ -313,13 +313,21 @@ static void split_ir(jit_State *J)
case IR_STRTO: case IR_STRTO:
hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref); hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);
break; break;
case IR_XLOAD: case IR_XLOAD: {
hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP), IRIns inslo = *nir; /* Save/undo the emit of the lo XLOAD. */
split_ptr(J, oir, ir->op1), ir->op2); J->cur.nins--;
#if LJ_BE 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; ir->prev = hi; hi = nref;
#endif #endif
break; break;
}
case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_ASTORE: case IR_HSTORE: case IR_USTORE:
split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nir->op1, hisubst[ir->op2]); split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nir->op1, hisubst[ir->op2]);
break; break;