From 7683f39786ab05f02dc20307a49dfaf1a1972d7d Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 27 May 2011 02:03:02 +0200 Subject: ARM: Fix math.ldexp() recording and folding. --- src/lib_math.c | 4 ++-- src/lj_ffrecord.c | 16 +++++++++++++--- src/lj_opt_fold.c | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/lib_math.c b/src/lib_math.c index fb038b1d..24501139 100644 --- a/src/lib_math.c +++ b/src/lib_math.c @@ -53,7 +53,7 @@ LJLIB_ASM_(math_deg) LJLIB_REC(math_degrad) LJLIB_PUSH(0.017453292519943295) LJLIB_ASM_(math_rad) LJLIB_REC(math_degrad) -LJLIB_ASM(math_atan2) LJLIB_REC(math_binary IR_ATAN2) +LJLIB_ASM(math_atan2) LJLIB_REC(.) { lj_lib_checknum(L, 1); lj_lib_checknum(L, 2); @@ -62,7 +62,7 @@ LJLIB_ASM(math_atan2) LJLIB_REC(math_binary IR_ATAN2) LJLIB_ASM_(math_pow) LJLIB_REC(.) LJLIB_ASM_(math_fmod) -LJLIB_ASM(math_ldexp) LJLIB_REC(math_binary IR_LDEXP) +LJLIB_ASM(math_ldexp) LJLIB_REC(.) { lj_lib_checknum(L, 1); #if LJ_DUALNUM && !LJ_TARGET_X86ORX64 diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 8cc42406..067f66cf 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c @@ -434,8 +434,17 @@ static void LJ_FASTCALL recff_math_unary(jit_State *J, RecordFFData *rd) J->base[0] = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, J->base[0]), rd->data); } -/* Record binary math.* functions math.atan2 and math.ldexp. */ -static void LJ_FASTCALL recff_math_binary(jit_State *J, RecordFFData *rd) +/* Record math.atan2. */ +static void LJ_FASTCALL recff_math_atan2(jit_State *J, RecordFFData *rd) +{ + TRef tr = lj_ir_tonum(J, J->base[0]); + TRef tr2 = lj_ir_tonum(J, J->base[1]); + J->base[0] = emitir(IRTN(IR_ATAN2), tr, tr2); + UNUSED(rd); +} + +/* Record math.ldexp. */ +static void LJ_FASTCALL recff_math_ldexp(jit_State *J, RecordFFData *rd) { TRef tr = lj_ir_tonum(J, J->base[0]); #if LJ_TARGET_X86ORX64 @@ -443,7 +452,8 @@ static void LJ_FASTCALL recff_math_binary(jit_State *J, RecordFFData *rd) #else TRef tr2 = lj_opt_narrow_toint(J, J->base[1]); #endif - J->base[0] = emitir(IRTN(rd->data), tr, tr2); + J->base[0] = emitir(IRTN(IR_LDEXP), tr, tr2); + UNUSED(rd); } /* Record math.asin, math.acos, math.atan. */ diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 2e61abe4..f2980e6f 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c @@ -8,6 +8,8 @@ #define lj_opt_fold_c #define LUA_CORE +#include + #include "lj_obj.h" #if LJ_HASJIT @@ -177,6 +179,17 @@ LJFOLDF(kfold_numarith) return lj_ir_knum(J, y); } +LJFOLD(LDEXP KNUM KINT) +LJFOLDF(kfold_ldexp) +{ +#if LJ_TARGET_X86ORX64 + UNUSED(J); + return NEXTFOLD; +#else + return lj_ir_knum(J, ldexp(knumleft, fright->i)); +#endif +} + LJFOLD(FPMATH KNUM any) LJFOLDF(kfold_fpmath) { @@ -839,9 +852,11 @@ LJFOLDF(simplify_numpow_kx) lua_Number n = knumleft; if (n == 2.0) { /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */ fins->o = IR_CONV; +#if LJ_TARGET_X86ORX64 fins->op1 = fins->op2; fins->op2 = IRCONV_NUM_INT; fins->op2 = (IRRef1)lj_opt_fold(J); +#endif fins->op1 = (IRRef1)lj_ir_knum_one(J); fins->o = IR_LDEXP; return RETRYFOLD; -- cgit v1.2.3-55-g6feb