fix problem in x86_64 FP JIT with jit_{ldi,sti}_d and 64-bit addresses
svn: r8666
This commit is contained in:
parent
eef1637fe8
commit
c5f2b03221
|
@ -358,7 +358,6 @@ static void *generate_one(mz_jit_state *old_jitter,
|
||||||
#ifdef MZ_PRECISE_GC
|
#ifdef MZ_PRECISE_GC
|
||||||
register_traversers();
|
register_traversers();
|
||||||
#endif
|
#endif
|
||||||
/* printf("zap!\n"); */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
|
@ -155,6 +155,13 @@ union jit_double_imm {
|
||||||
jit_ldr_d_fppush((rd), _ESP), \
|
jit_ldr_d_fppush((rd), _ESP), \
|
||||||
ADDQir(8, _ESP))
|
ADDQir(8, _ESP))
|
||||||
|
|
||||||
|
#ifdef JIT_X86_64
|
||||||
|
#define jit_ldi_d_fppush(rd, is) \
|
||||||
|
(MOVQrr(JIT_R0, JIT_REXTMP), \
|
||||||
|
MOVQir(((long)is), JIT_R0), \
|
||||||
|
jit_ldr_d_fppush(rd, JIT_R0), \
|
||||||
|
MOVQrr(JIT_REXTMP, JIT_R0))
|
||||||
|
#else
|
||||||
#define jit_ldi_f(rd, is) \
|
#define jit_ldi_f(rd, is) \
|
||||||
((rd) == 0 ? (FSTPr (0), FLDSm((is), 0, 0, 0)) \
|
((rd) == 0 ? (FSTPr (0), FLDSm((is), 0, 0, 0)) \
|
||||||
: (FLDSm((is), 0, 0, 0), FSTPr ((rd) + 1)))
|
: (FLDSm((is), 0, 0, 0), FSTPr ((rd) + 1)))
|
||||||
|
@ -164,6 +171,7 @@ union jit_double_imm {
|
||||||
: (FPX(), FLDLm((is), 0, 0, 0), FSTPr ((rd) + 1)))
|
: (FPX(), FLDLm((is), 0, 0, 0), FSTPr ((rd) + 1)))
|
||||||
|
|
||||||
#define jit_ldi_d_fppush(rd, is) (FPX(), FLDLm((is), 0, 0, 0))
|
#define jit_ldi_d_fppush(rd, is) (FPX(), FLDLm((is), 0, 0, 0))
|
||||||
|
#endif
|
||||||
|
|
||||||
#define jit_ldr_f(rd, rs) \
|
#define jit_ldr_f(rd, rs) \
|
||||||
((rd) == 0 ? (FSTPr (0), FPX(), FLDSm(0, (rs), 0, 0)) \
|
((rd) == 0 ? (FSTPr (0), FPX(), FLDSm(0, (rs), 0, 0)) \
|
||||||
|
@ -202,14 +210,25 @@ union jit_double_imm {
|
||||||
#define jit_stxr_f(d1, d2, rs) jit_fxch ((rs), FPX(), FSTSm(0, (d1), (d2), 1))
|
#define jit_stxr_f(d1, d2, rs) jit_fxch ((rs), FPX(), FSTSm(0, (d1), (d2), 1))
|
||||||
#define jit_stxi_d(id, rd, rs) jit_fxch ((rs), FPX(), FSTLm((id), (rd), 0, 0))
|
#define jit_stxi_d(id, rd, rs) jit_fxch ((rs), FPX(), FSTLm((id), (rd), 0, 0))
|
||||||
#define jit_stxr_d(d1, d2, rs) jit_fxch ((rs), FPX(), FSTLm(0, (d1), (d2), 1))
|
#define jit_stxr_d(d1, d2, rs) jit_fxch ((rs), FPX(), FSTLm(0, (d1), (d2), 1))
|
||||||
|
|
||||||
|
#ifdef JIT_X86_64
|
||||||
|
#define jit_sti_d_fppop(is, rd) \
|
||||||
|
(MOVQrr(JIT_R0, JIT_REXTMP), \
|
||||||
|
MOVQir(((long)is), JIT_R0), \
|
||||||
|
jit_str_d_fppop(JIT_R0, rd), \
|
||||||
|
MOVQrr(JIT_REXTMP, JIT_R0))
|
||||||
|
#else
|
||||||
#define jit_sti_f(id, rs) jit_fxch ((rs), FPX(), FSTSm((id), 0, 0, 0))
|
#define jit_sti_f(id, rs) jit_fxch ((rs), FPX(), FSTSm((id), 0, 0, 0))
|
||||||
#define jit_str_f(rd, rs) jit_fxch ((rs), FPX(), FSTSm(0, (rd), 0, 0))
|
#define jit_str_f(rd, rs) jit_fxch ((rs), FPX(), FSTSm(0, (rd), 0, 0))
|
||||||
#define jit_sti_d(id, rs) jit_fxch ((rs), FPX(), FSTLm((id), 0, 0, 0))
|
#define jit_sti_d(id, rs) jit_fxch ((rs), FPX(), FSTLm((id), 0, 0, 0))
|
||||||
#define jit_str_d(rd, rs) jit_fxch ((rs), FPX(), FSTLm(0, (rd), 0, 0))
|
#define jit_str_d(rd, rs) jit_fxch ((rs), FPX(), FSTLm(0, (rd), 0, 0))
|
||||||
|
|
||||||
#define jit_sti_d_fppop(id, rs) (FPX(), FSTPLm((id), 0, 0, 0))
|
#define jit_sti_d_fppop(id, rs) (FPX(), FSTPLm((id), 0, 0, 0))
|
||||||
|
#endif
|
||||||
#define jit_stxi_d_fppop(id, rd, rs) (FPX(), FSTPLm((id), (rd), 0, 0))
|
#define jit_stxi_d_fppop(id, rd, rs) (FPX(), FSTPLm((id), (rd), 0, 0))
|
||||||
|
|
||||||
|
#define jit_str_d_fppop(rd, rs) (FPX(), FSTLm(0, (rd), 0, 0))
|
||||||
|
|
||||||
/* Assume round to near mode */
|
/* Assume round to near mode */
|
||||||
#define jit_floorr_d_i(rd, rs) \
|
#define jit_floorr_d_i(rd, rs) \
|
||||||
(FLDr (rs), jit_floor2((rd), ((rd) == _EDX ? _EAX : _EDX)))
|
(FLDr (rs), jit_floor2((rd), ((rd) == _EDX ? _EAX : _EDX)))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user