x64/LJ_GC64: Avoid store-to-load forwarding stall after stack restore.
Thanks to Sergey Kaplun. #1485
This commit is contained in:
parent
3c4f9fe205
commit
14d8a7a27d
@ -1112,10 +1112,12 @@ static void asm_tvptr(ASMState *as, Reg dest, IRRef ref, MSize mode)
|
|||||||
} else {
|
} else {
|
||||||
#if LJ_GC64
|
#if LJ_GC64
|
||||||
if (irref_isk(ref)) {
|
if (irref_isk(ref)) {
|
||||||
|
Reg tmp;
|
||||||
TValue k;
|
TValue k;
|
||||||
lj_ir_kvalue(as->J->L, &k, ir);
|
lj_ir_kvalue(as->J->L, &k, ir);
|
||||||
emit_movmroi(as, dest, 4, k.u32.hi);
|
tmp = ra_scratch(as, rset_exclude(RSET_GPR, dest));
|
||||||
emit_movmroi(as, dest, 0, k.u32.lo);
|
emit_rmro(as, XO_MOVto, tmp|REX_64, dest, 0);
|
||||||
|
emit_loadu64(as, tmp, k.u64);
|
||||||
} else {
|
} else {
|
||||||
/* TODO: 64 bit store + 32 bit load-modify-store is suboptimal. */
|
/* TODO: 64 bit store + 32 bit load-modify-store is suboptimal. */
|
||||||
Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, dest));
|
Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, dest));
|
||||||
@ -2787,8 +2789,9 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap)
|
|||||||
emit_i32(as, -1);
|
emit_i32(as, -1);
|
||||||
emit_rmro(as, XO_MOVmi, REX_64, RID_BASE, ofs);
|
emit_rmro(as, XO_MOVmi, REX_64, RID_BASE, ofs);
|
||||||
} else {
|
} else {
|
||||||
emit_movmroi(as, RID_BASE, ofs+4, k.u32.hi);
|
Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, RID_BASE));
|
||||||
emit_movmroi(as, RID_BASE, ofs, k.u32.lo);
|
emit_rmro(as, XO_MOVto, tmp|REX_64, RID_BASE, ofs);
|
||||||
|
emit_loadu64(as, tmp, k.u64);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
} else if (!irt_ispri(ir->t)) {
|
} else if (!irt_ispri(ir->t)) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user