Fix xmm spill/restore broken by b1fb71fb.

This commit is contained in:
Mike Pall 2010-12-05 22:39:36 +01:00
parent 5a13fa69d9
commit c5f4f607c9

View File

@ -680,7 +680,10 @@ static Reg ra_releasetmp(ASMState *as, IRRef ref)
/* Generic move between two regs. */ /* Generic move between two regs. */
static void ra_movrr(ASMState *as, IRIns *ir, Reg r1, Reg r2) static void ra_movrr(ASMState *as, IRIns *ir, Reg r1, Reg r2)
{ {
emit_rr(as, r1 < RID_MAX_GPR ? XO_MOV : XMM_MOVRR(as), REX_64IR(ir, r1), r2); if (r1 < RID_MAX_GPR)
emit_rr(as, XO_MOV, REX_64IR(ir, r1), r2);
else
emit_rr(as, XMM_MOVRR(as), r1, r2);
} }
/* Restore a register (marked as free). Rematerialize or force a spill. */ /* Restore a register (marked as free). Rematerialize or force a spill. */
@ -698,8 +701,10 @@ static Reg ra_restore(ASMState *as, IRRef ref)
if (!rset_test(as->weakset, r)) { /* Only restore non-weak references. */ if (!rset_test(as->weakset, r)) { /* Only restore non-weak references. */
ra_modified(as, r); ra_modified(as, r);
RA_DBGX((as, "restore $i $r", ir, r)); RA_DBGX((as, "restore $i $r", ir, r));
emit_rmro(as, r < RID_MAX_GPR ? XO_MOV : XMM_MOVRM(as), if (r < RID_MAX_GPR)
REX_64IR(ir, r), RID_ESP, ofs); emit_rmro(as, XO_MOV, REX_64IR(ir, r), RID_ESP, ofs);
else
emit_rmro(as, XMM_MOVRM(as), r, RID_ESP, ofs);
} }
return r; return r;
} }
@ -709,8 +714,10 @@ static Reg ra_restore(ASMState *as, IRRef ref)
static void ra_save(ASMState *as, IRIns *ir, Reg r) static void ra_save(ASMState *as, IRIns *ir, Reg r)
{ {
RA_DBGX((as, "save $i $r", ir, r)); RA_DBGX((as, "save $i $r", ir, r));
emit_rmro(as, r < RID_MAX_GPR ? XO_MOVto : XO_MOVSDto, if (r < RID_MAX_GPR)
REX_64IR(ir, r), RID_ESP, sps_scale(ir->s)); emit_rmro(as, XO_MOVto, REX_64IR(ir, r), RID_ESP, sps_scale(ir->s));
else
emit_rmro(as, XO_MOVSDto, r, RID_ESP, sps_scale(ir->s));
} }
#define MINCOST(r) \ #define MINCOST(r) \
@ -3213,8 +3220,10 @@ static void asm_head_side(ASMState *as)
if (ra_hasspill(regsp_spill(rs))) { if (ra_hasspill(regsp_spill(rs))) {
int32_t ofs = sps_scale(regsp_spill(rs)); int32_t ofs = sps_scale(regsp_spill(rs));
ra_free(as, r); ra_free(as, r);
emit_rmro(as, r < RID_MAX_GPR ? XO_MOV : XMM_MOVRM(as), if (r < RID_MAX_GPR)
REX_64IR(ir, r), RID_ESP, ofs); emit_rmro(as, XO_MOV, REX_64IR(ir, r), RID_ESP, ofs);
else
emit_rmro(as, XMM_MOVRM(as), r, RID_ESP, ofs);
checkmclim(as); checkmclim(as);
} }
} }