Move common 32/64 bit in-memory FP constants to jit_State.
Prerequisite for immovable IR. Contributed by Peter Cawley.
This commit is contained in:
@@ -393,8 +393,7 @@ static void asm_tointg(ASMState *as, IRIns *ir, Reg left)
|
||||
emit_asi(as, PPCI_XORIS, RID_TMP, dest, 0x8000);
|
||||
emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);
|
||||
emit_lsptr(as, PPCI_LFS, (fbias & 31),
|
||||
(void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),
|
||||
RSET_GPR);
|
||||
(void *)&as->J->k32[LJ_K32_2P52_2P31], RSET_GPR);
|
||||
emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);
|
||||
emit_fb(as, PPCI_FCTIWZ, tmp, left);
|
||||
}
|
||||
@@ -433,13 +432,11 @@ static void asm_conv(ASMState *as, IRIns *ir)
|
||||
Reg left = ra_alloc1(as, lref, allow);
|
||||
Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, left));
|
||||
Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest));
|
||||
const float *kbias;
|
||||
if (irt_isfloat(ir->t)) emit_fb(as, PPCI_FRSP, dest, dest);
|
||||
emit_fab(as, PPCI_FSUB, dest, dest, fbias);
|
||||
emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);
|
||||
kbias = (const float *)lj_ir_k64_find(as->J, U64x(59800004,59800000));
|
||||
if (st == IRT_U32) kbias++;
|
||||
emit_lsptr(as, PPCI_LFS, (fbias & 31), (void *)kbias,
|
||||
emit_lsptr(as, PPCI_LFS, (fbias & 31),
|
||||
&as->J->k32[st == IRT_U32 ? LJ_K32_2P52 : LJ_K32_2P52_2P31],
|
||||
rset_clear(allow, hibias));
|
||||
emit_tai(as, PPCI_STW, st == IRT_U32 ? left : RID_TMP,
|
||||
RID_SP, SPOFS_TMPLO);
|
||||
@@ -472,8 +469,7 @@ static void asm_conv(ASMState *as, IRIns *ir)
|
||||
emit_fb(as, PPCI_FCTIWZ, tmp, tmp);
|
||||
emit_fab(as, PPCI_FSUB, tmp, left, tmp);
|
||||
emit_lsptr(as, PPCI_LFS, (tmp & 31),
|
||||
(void *)lj_ir_k64_find(as->J, U64x(4f000000,00000000)),
|
||||
RSET_GPR);
|
||||
(void *)&as->J->k32[LJ_K32_2P31], RSET_GPR);
|
||||
} else {
|
||||
emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);
|
||||
emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);
|
||||
@@ -974,7 +970,7 @@ static void asm_sload(ASMState *as, IRIns *ir)
|
||||
emit_fab(as, PPCI_FSUB, dest, dest, fbias);
|
||||
emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);
|
||||
emit_lsptr(as, PPCI_LFS, (fbias & 31),
|
||||
(void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),
|
||||
(void *)&as->J->k32[LJ_K32_2P52_2P31],
|
||||
rset_clear(allow, hibias));
|
||||
emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPLO);
|
||||
emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);
|
||||
|
||||
Reference in New Issue
Block a user