ARM: Fix math.ldexp() recording and folding.
This commit is contained in:
parent
7bad42a3ba
commit
7683f39786
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -8,6 +8,8 @@
|
||||
#define lj_opt_fold_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#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;
|
||||
|
Loading…
Reference in New Issue
Block a user