mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-08 07:34:07 +00:00
Fix xmm spill/restore broken by b1fb71fb
.
This commit is contained in:
parent
5a13fa69d9
commit
c5f4f607c9
23
src/lj_asm.c
23
src/lj_asm.c
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user