diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index 01784ea05c..a4ec8e418e 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -3309,6 +3309,7 @@ static int can_fast_double(int arith, int cmp, int two_args) #define jit_bantiltr_d_fppop(d, s1, s2) jit_bantiltr_d(d, s1, s2) #define jit_beqr_d_fppop(d, s1, s2) jit_beqr_d(d, s1, s2) #define jit_bantieqr_d_fppop(d, s1, s2) jit_bantieqr_d(d, s1, s2) +#define jit_extr_l_d_fppush(rd, rs) jit_extr_l_d(rd, rs) #endif static int generate_alloc_double(mz_jit_state *jitter) @@ -3320,7 +3321,7 @@ static int generate_alloc_double(mz_jit_state *jitter) jit_addi_p(JIT_R0, JIT_V1, GC_OBJHEAD_SIZE); (void)jit_stxi_d_fppop(&((Scheme_Double *)0x0)->double_val, JIT_R0, JIT_FPR1); # else - (void)jit_sti_d_fppop(&double_result, JIT_FPR1); + (void)jit_sti_d_fppop(&double_result, JIT_FPR1); JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); mz_prepare(0); (void)mz_finish(malloc_double); @@ -4067,7 +4068,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj } else if (arith == 12) { /* exact->inexact */ jit_rshi_l(JIT_R0, JIT_R0, 1); - jit_extr_l_d_fppush(JIT_FPR0, JIT_R0); + jit_extr_l_d_fppush(JIT_FPR1, JIT_R0); CHECK_LIMIT(); __END_SHORT_JUMPS__(branch_short); generate_alloc_double(jitter); diff --git a/src/mzscheme/src/lightning/ppc/fp-common.h b/src/mzscheme/src/lightning/ppc/fp-common.h index 907fdc4d95..8bf4acfc7d 100644 --- a/src/mzscheme/src/lightning/ppc/fp-common.h +++ b/src/mzscheme/src/lightning/ppc/fp-common.h @@ -52,6 +52,8 @@ #endif #endif +#define jit_extr_l_d(rd, rs) jit_extr_i_d(rd, rs) + #ifndef jit_addr_f #define jit_addr_f(rd,s1,s2) jit_addr_d(rd,s1,s2) #define jit_subr_f(rd,s1,s2) jit_subr_d(rd,s1,s2) diff --git a/src/mzscheme/src/lightning/ppc/fp.h b/src/mzscheme/src/lightning/ppc/fp.h index 79e61b20c6..f92f2240b1 100644 --- a/src/mzscheme/src/lightning/ppc/fp.h +++ b/src/mzscheme/src/lightning/ppc/fp.h @@ -221,4 +221,18 @@ STFIWXrrr(7,JIT_SP,JIT_AUX), \ LWZrm((rd),-4,JIT_SP)) +/* Uses JIT_FPR5 as scratch: */ +#define jit_extr_i_d(rd, rs) (jit_movi_l(JIT_AUX, 0x43300000), \ + jit_stxi_l(-8, JIT_SP, JIT_AUX), \ + jit_movi_l(JIT_AUX, 0x80000000), \ + jit_stxi_l(-4, JIT_SP, JIT_AUX), \ + LFDrri(JIT_FPR(5), JIT_SP, -8), \ + jit_movi_l(JIT_AUX, 0x43300000), \ + STWrm(JIT_AUX, -8, JIT_SP), \ + XORISrri(JIT_AUX, rs, 0x8000), \ + STWrm(JIT_AUX, -4, JIT_SP), \ + LFDrri(rd, JIT_SP, -8), \ + FSUBDrrr(rd, rd, JIT_FPR(5))) + + #endif /* __lightning_asm_h */