diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib_math.c | 4 | ||||
| -rw-r--r-- | src/lj_ffrecord.c | 16 | ||||
| -rw-r--r-- | 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) | |||
| 53 | LJLIB_PUSH(0.017453292519943295) | 53 | LJLIB_PUSH(0.017453292519943295) |
| 54 | LJLIB_ASM_(math_rad) LJLIB_REC(math_degrad) | 54 | LJLIB_ASM_(math_rad) LJLIB_REC(math_degrad) |
| 55 | 55 | ||
| 56 | LJLIB_ASM(math_atan2) LJLIB_REC(math_binary IR_ATAN2) | 56 | LJLIB_ASM(math_atan2) LJLIB_REC(.) |
| 57 | { | 57 | { |
| 58 | lj_lib_checknum(L, 1); | 58 | lj_lib_checknum(L, 1); |
| 59 | lj_lib_checknum(L, 2); | 59 | lj_lib_checknum(L, 2); |
| @@ -62,7 +62,7 @@ LJLIB_ASM(math_atan2) LJLIB_REC(math_binary IR_ATAN2) | |||
| 62 | LJLIB_ASM_(math_pow) LJLIB_REC(.) | 62 | LJLIB_ASM_(math_pow) LJLIB_REC(.) |
| 63 | LJLIB_ASM_(math_fmod) | 63 | LJLIB_ASM_(math_fmod) |
| 64 | 64 | ||
| 65 | LJLIB_ASM(math_ldexp) LJLIB_REC(math_binary IR_LDEXP) | 65 | LJLIB_ASM(math_ldexp) LJLIB_REC(.) |
| 66 | { | 66 | { |
| 67 | lj_lib_checknum(L, 1); | 67 | lj_lib_checknum(L, 1); |
| 68 | #if LJ_DUALNUM && !LJ_TARGET_X86ORX64 | 68 | #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) | |||
| 434 | J->base[0] = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, J->base[0]), rd->data); | 434 | J->base[0] = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, J->base[0]), rd->data); |
| 435 | } | 435 | } |
| 436 | 436 | ||
| 437 | /* Record binary math.* functions math.atan2 and math.ldexp. */ | 437 | /* Record math.atan2. */ |
| 438 | static void LJ_FASTCALL recff_math_binary(jit_State *J, RecordFFData *rd) | 438 | static void LJ_FASTCALL recff_math_atan2(jit_State *J, RecordFFData *rd) |
| 439 | { | ||
| 440 | TRef tr = lj_ir_tonum(J, J->base[0]); | ||
| 441 | TRef tr2 = lj_ir_tonum(J, J->base[1]); | ||
| 442 | J->base[0] = emitir(IRTN(IR_ATAN2), tr, tr2); | ||
| 443 | UNUSED(rd); | ||
| 444 | } | ||
| 445 | |||
| 446 | /* Record math.ldexp. */ | ||
| 447 | static void LJ_FASTCALL recff_math_ldexp(jit_State *J, RecordFFData *rd) | ||
| 439 | { | 448 | { |
| 440 | TRef tr = lj_ir_tonum(J, J->base[0]); | 449 | TRef tr = lj_ir_tonum(J, J->base[0]); |
| 441 | #if LJ_TARGET_X86ORX64 | 450 | #if LJ_TARGET_X86ORX64 |
| @@ -443,7 +452,8 @@ static void LJ_FASTCALL recff_math_binary(jit_State *J, RecordFFData *rd) | |||
| 443 | #else | 452 | #else |
| 444 | TRef tr2 = lj_opt_narrow_toint(J, J->base[1]); | 453 | TRef tr2 = lj_opt_narrow_toint(J, J->base[1]); |
| 445 | #endif | 454 | #endif |
| 446 | J->base[0] = emitir(IRTN(rd->data), tr, tr2); | 455 | J->base[0] = emitir(IRTN(IR_LDEXP), tr, tr2); |
| 456 | UNUSED(rd); | ||
| 447 | } | 457 | } |
| 448 | 458 | ||
| 449 | /* Record math.asin, math.acos, math.atan. */ | 459 | /* 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 @@ | |||
| 8 | #define lj_opt_fold_c | 8 | #define lj_opt_fold_c |
| 9 | #define LUA_CORE | 9 | #define LUA_CORE |
| 10 | 10 | ||
| 11 | #include <math.h> | ||
| 12 | |||
| 11 | #include "lj_obj.h" | 13 | #include "lj_obj.h" |
| 12 | 14 | ||
| 13 | #if LJ_HASJIT | 15 | #if LJ_HASJIT |
| @@ -177,6 +179,17 @@ LJFOLDF(kfold_numarith) | |||
| 177 | return lj_ir_knum(J, y); | 179 | return lj_ir_knum(J, y); |
| 178 | } | 180 | } |
| 179 | 181 | ||
| 182 | LJFOLD(LDEXP KNUM KINT) | ||
| 183 | LJFOLDF(kfold_ldexp) | ||
| 184 | { | ||
| 185 | #if LJ_TARGET_X86ORX64 | ||
| 186 | UNUSED(J); | ||
| 187 | return NEXTFOLD; | ||
| 188 | #else | ||
| 189 | return lj_ir_knum(J, ldexp(knumleft, fright->i)); | ||
| 190 | #endif | ||
| 191 | } | ||
| 192 | |||
| 180 | LJFOLD(FPMATH KNUM any) | 193 | LJFOLD(FPMATH KNUM any) |
| 181 | LJFOLDF(kfold_fpmath) | 194 | LJFOLDF(kfold_fpmath) |
| 182 | { | 195 | { |
| @@ -839,9 +852,11 @@ LJFOLDF(simplify_numpow_kx) | |||
| 839 | lua_Number n = knumleft; | 852 | lua_Number n = knumleft; |
| 840 | if (n == 2.0) { /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */ | 853 | if (n == 2.0) { /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */ |
| 841 | fins->o = IR_CONV; | 854 | fins->o = IR_CONV; |
| 855 | #if LJ_TARGET_X86ORX64 | ||
| 842 | fins->op1 = fins->op2; | 856 | fins->op1 = fins->op2; |
| 843 | fins->op2 = IRCONV_NUM_INT; | 857 | fins->op2 = IRCONV_NUM_INT; |
| 844 | fins->op2 = (IRRef1)lj_opt_fold(J); | 858 | fins->op2 = (IRRef1)lj_opt_fold(J); |
| 859 | #endif | ||
| 845 | fins->op1 = (IRRef1)lj_ir_knum_one(J); | 860 | fins->op1 = (IRRef1)lj_ir_knum_one(J); |
| 846 | fins->o = IR_LDEXP; | 861 | fins->o = IR_LDEXP; |
| 847 | return RETRYFOLD; | 862 | return RETRYFOLD; |
