diff options
| author | Mike Pall <mike> | 2020-05-22 04:53:35 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2020-05-22 04:53:35 +0200 |
| commit | 5655be4546d9177890c69f0d0accac4773ff0887 (patch) | |
| tree | 794518da2d5a42ec79013eda0c92f7f1e4e8d3ce | |
| parent | c5b8e9168bae3efb6eb0fe2d4c9466c57fa5f971 (diff) | |
| download | luajit-5655be4546d9177890c69f0d0accac4773ff0887.tar.gz luajit-5655be4546d9177890c69f0d0accac4773ff0887.tar.bz2 luajit-5655be4546d9177890c69f0d0accac4773ff0887.zip | |
Cleanup math function compilation and fix inconsistencies.
| -rw-r--r-- | src/lib_math.c | 22 | ||||
| -rw-r--r-- | src/lj_asm.c | 8 | ||||
| -rw-r--r-- | src/lj_asm_arm.h | 1 | ||||
| -rw-r--r-- | src/lj_asm_arm64.h | 1 | ||||
| -rw-r--r-- | src/lj_asm_mips.h | 1 | ||||
| -rw-r--r-- | src/lj_asm_ppc.h | 1 | ||||
| -rw-r--r-- | src/lj_asm_x86.h | 2 | ||||
| -rw-r--r-- | src/lj_ffrecord.c | 19 | ||||
| -rw-r--r-- | src/lj_ir.h | 4 | ||||
| -rw-r--r-- | src/lj_ircall.h | 14 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 25 | ||||
| -rw-r--r-- | src/lj_opt_split.c | 3 | ||||
| -rw-r--r-- | src/lj_target_x86.h | 6 | ||||
| -rw-r--r-- | src/lj_vmmath.c | 6 |
14 files changed, 48 insertions, 65 deletions
diff --git a/src/lib_math.c b/src/lib_math.c index 02aa21d7..4cc2ba6e 100644 --- a/src/lib_math.c +++ b/src/lib_math.c | |||
| @@ -33,17 +33,17 @@ LJLIB_ASM(math_sqrt) LJLIB_REC(math_unary IRFPM_SQRT) | |||
| 33 | lj_lib_checknum(L, 1); | 33 | lj_lib_checknum(L, 1); |
| 34 | return FFH_RETRY; | 34 | return FFH_RETRY; |
| 35 | } | 35 | } |
| 36 | LJLIB_ASM_(math_log10) LJLIB_REC(math_unary IRFPM_LOG10) | 36 | LJLIB_ASM_(math_log10) LJLIB_REC(math_call IRCALL_log10) |
| 37 | LJLIB_ASM_(math_exp) LJLIB_REC(math_unary IRFPM_EXP) | 37 | LJLIB_ASM_(math_exp) LJLIB_REC(math_call IRCALL_exp) |
| 38 | LJLIB_ASM_(math_sin) LJLIB_REC(math_unary IRFPM_SIN) | 38 | LJLIB_ASM_(math_sin) LJLIB_REC(math_call IRCALL_sin) |
| 39 | LJLIB_ASM_(math_cos) LJLIB_REC(math_unary IRFPM_COS) | 39 | LJLIB_ASM_(math_cos) LJLIB_REC(math_call IRCALL_cos) |
| 40 | LJLIB_ASM_(math_tan) LJLIB_REC(math_unary IRFPM_TAN) | 40 | LJLIB_ASM_(math_tan) LJLIB_REC(math_call IRCALL_tan) |
| 41 | LJLIB_ASM_(math_asin) LJLIB_REC(math_atrig FF_math_asin) | 41 | LJLIB_ASM_(math_asin) LJLIB_REC(math_call IRCALL_asin) |
| 42 | LJLIB_ASM_(math_acos) LJLIB_REC(math_atrig FF_math_acos) | 42 | LJLIB_ASM_(math_acos) LJLIB_REC(math_call IRCALL_acos) |
| 43 | LJLIB_ASM_(math_atan) LJLIB_REC(math_atrig FF_math_atan) | 43 | LJLIB_ASM_(math_atan) LJLIB_REC(math_call IRCALL_atan) |
| 44 | LJLIB_ASM_(math_sinh) LJLIB_REC(math_htrig IRCALL_sinh) | 44 | LJLIB_ASM_(math_sinh) LJLIB_REC(math_call IRCALL_sinh) |
| 45 | LJLIB_ASM_(math_cosh) LJLIB_REC(math_htrig IRCALL_cosh) | 45 | LJLIB_ASM_(math_cosh) LJLIB_REC(math_call IRCALL_cosh) |
| 46 | LJLIB_ASM_(math_tanh) LJLIB_REC(math_htrig IRCALL_tanh) | 46 | LJLIB_ASM_(math_tanh) LJLIB_REC(math_call IRCALL_tanh) |
| 47 | LJLIB_ASM_(math_frexp) | 47 | LJLIB_ASM_(math_frexp) |
| 48 | LJLIB_ASM_(math_modf) | 48 | LJLIB_ASM_(math_modf) |
| 49 | 49 | ||
diff --git a/src/lj_asm.c b/src/lj_asm.c index 68d28fb0..20d63731 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -1657,14 +1657,13 @@ static void asm_ir(ASMState *as, IRIns *ir) | |||
| 1657 | case IR_NEG: asm_neg(as, ir); break; | 1657 | case IR_NEG: asm_neg(as, ir); break; |
| 1658 | #if LJ_SOFTFP32 | 1658 | #if LJ_SOFTFP32 |
| 1659 | case IR_DIV: case IR_POW: case IR_ABS: | 1659 | case IR_DIV: case IR_POW: case IR_ABS: |
| 1660 | case IR_ATAN2: case IR_LDEXP: case IR_FPMATH: case IR_TOBIT: | 1660 | case IR_LDEXP: case IR_FPMATH: case IR_TOBIT: |
| 1661 | lua_assert(0); /* Unused for LJ_SOFTFP32. */ | 1661 | lua_assert(0); /* Unused for LJ_SOFTFP32. */ |
| 1662 | break; | 1662 | break; |
| 1663 | #else | 1663 | #else |
| 1664 | case IR_DIV: asm_div(as, ir); break; | 1664 | case IR_DIV: asm_div(as, ir); break; |
| 1665 | case IR_POW: asm_pow(as, ir); break; | 1665 | case IR_POW: asm_pow(as, ir); break; |
| 1666 | case IR_ABS: asm_abs(as, ir); break; | 1666 | case IR_ABS: asm_abs(as, ir); break; |
| 1667 | case IR_ATAN2: asm_atan2(as, ir); break; | ||
| 1668 | case IR_LDEXP: asm_ldexp(as, ir); break; | 1667 | case IR_LDEXP: asm_ldexp(as, ir); break; |
| 1669 | case IR_FPMATH: asm_fpmath(as, ir); break; | 1668 | case IR_FPMATH: asm_fpmath(as, ir); break; |
| 1670 | case IR_TOBIT: asm_tobit(as, ir); break; | 1669 | case IR_TOBIT: asm_tobit(as, ir); break; |
| @@ -2158,11 +2157,6 @@ static void asm_setup_regsp(ASMState *as) | |||
| 2158 | as->modset = RSET_SCRATCH; | 2157 | as->modset = RSET_SCRATCH; |
| 2159 | break; | 2158 | break; |
| 2160 | #if !LJ_SOFTFP | 2159 | #if !LJ_SOFTFP |
| 2161 | case IR_ATAN2: | ||
| 2162 | #if LJ_TARGET_X86 | ||
| 2163 | if (as->evenspill < 4) /* Leave room to call atan2(). */ | ||
| 2164 | as->evenspill = 4; | ||
| 2165 | #endif | ||
| 2166 | #if !LJ_TARGET_X86ORX64 | 2160 | #if !LJ_TARGET_X86ORX64 |
| 2167 | case IR_LDEXP: | 2161 | case IR_LDEXP: |
| 2168 | #endif | 2162 | #endif |
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index d2579349..ccb8ccb6 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h | |||
| @@ -1510,7 +1510,6 @@ static void asm_mul(ASMState *as, IRIns *ir) | |||
| 1510 | #define asm_div(as, ir) asm_fparith(as, ir, ARMI_VDIV_D) | 1510 | #define asm_div(as, ir) asm_fparith(as, ir, ARMI_VDIV_D) |
| 1511 | #define asm_pow(as, ir) asm_callid(as, ir, IRCALL_lj_vm_powi) | 1511 | #define asm_pow(as, ir) asm_callid(as, ir, IRCALL_lj_vm_powi) |
| 1512 | #define asm_abs(as, ir) asm_fpunary(as, ir, ARMI_VABS_D) | 1512 | #define asm_abs(as, ir) asm_fpunary(as, ir, ARMI_VABS_D) |
| 1513 | #define asm_atan2(as, ir) asm_callid(as, ir, IRCALL_atan2) | ||
| 1514 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) | 1513 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) |
| 1515 | #endif | 1514 | #endif |
| 1516 | 1515 | ||
diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h index f640b91b..da857355 100644 --- a/src/lj_asm_arm64.h +++ b/src/lj_asm_arm64.h | |||
| @@ -1455,7 +1455,6 @@ static void asm_pow(ASMState *as, IRIns *ir) | |||
| 1455 | #define asm_mulov(as, ir) asm_mul(as, ir) | 1455 | #define asm_mulov(as, ir) asm_mul(as, ir) |
| 1456 | 1456 | ||
| 1457 | #define asm_abs(as, ir) asm_fpunary(as, ir, A64I_FABS) | 1457 | #define asm_abs(as, ir) asm_fpunary(as, ir, A64I_FABS) |
| 1458 | #define asm_atan2(as, ir) asm_callid(as, ir, IRCALL_atan2) | ||
| 1459 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) | 1458 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) |
| 1460 | 1459 | ||
| 1461 | static void asm_mod(ASMState *as, IRIns *ir) | 1460 | static void asm_mod(ASMState *as, IRIns *ir) |
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index a242904e..8b5efc35 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h | |||
| @@ -1838,7 +1838,6 @@ static void asm_abs(ASMState *as, IRIns *ir) | |||
| 1838 | } | 1838 | } |
| 1839 | #endif | 1839 | #endif |
| 1840 | 1840 | ||
| 1841 | #define asm_atan2(as, ir) asm_callid(as, ir, IRCALL_atan2) | ||
| 1842 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) | 1841 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) |
| 1843 | 1842 | ||
| 1844 | static void asm_arithov(ASMState *as, IRIns *ir) | 1843 | static void asm_arithov(ASMState *as, IRIns *ir) |
diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h index afcd6b7a..d9e4ad04 100644 --- a/src/lj_asm_ppc.h +++ b/src/lj_asm_ppc.h | |||
| @@ -1387,7 +1387,6 @@ static void asm_neg(ASMState *as, IRIns *ir) | |||
| 1387 | } | 1387 | } |
| 1388 | 1388 | ||
| 1389 | #define asm_abs(as, ir) asm_fpunary(as, ir, PPCI_FABS) | 1389 | #define asm_abs(as, ir) asm_fpunary(as, ir, PPCI_FABS) |
| 1390 | #define asm_atan2(as, ir) asm_callid(as, ir, IRCALL_atan2) | ||
| 1391 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) | 1390 | #define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp) |
| 1392 | 1391 | ||
| 1393 | static void asm_arithov(ASMState *as, IRIns *ir, PPCIns pi) | 1392 | static void asm_arithov(ASMState *as, IRIns *ir, PPCIns pi) |
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index bf818f5a..d5cd6326 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h | |||
| @@ -1957,8 +1957,6 @@ static void asm_fpmath(ASMState *as, IRIns *ir) | |||
| 1957 | } | 1957 | } |
| 1958 | } | 1958 | } |
| 1959 | 1959 | ||
| 1960 | #define asm_atan2(as, ir) asm_callid(as, ir, IRCALL_atan2) | ||
| 1961 | |||
| 1962 | static void asm_ldexp(ASMState *as, IRIns *ir) | 1960 | static void asm_ldexp(ASMState *as, IRIns *ir) |
| 1963 | { | 1961 | { |
| 1964 | int32_t ofs = sps_scale(ir->s); /* Use spill slot or temp slots. */ | 1962 | int32_t ofs = sps_scale(ir->s); /* Use spill slot or temp slots. */ |
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 436d5037..42049511 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
| @@ -563,7 +563,7 @@ static void LJ_FASTCALL recff_math_atan2(jit_State *J, RecordFFData *rd) | |||
| 563 | { | 563 | { |
| 564 | TRef tr = lj_ir_tonum(J, J->base[0]); | 564 | TRef tr = lj_ir_tonum(J, J->base[0]); |
| 565 | TRef tr2 = lj_ir_tonum(J, J->base[1]); | 565 | TRef tr2 = lj_ir_tonum(J, J->base[1]); |
| 566 | J->base[0] = emitir(IRTN(IR_ATAN2), tr, tr2); | 566 | J->base[0] = lj_ir_call(J, IRCALL_atan2, tr, tr2); |
| 567 | UNUSED(rd); | 567 | UNUSED(rd); |
| 568 | } | 568 | } |
| 569 | 569 | ||
| @@ -580,22 +580,7 @@ static void LJ_FASTCALL recff_math_ldexp(jit_State *J, RecordFFData *rd) | |||
| 580 | UNUSED(rd); | 580 | UNUSED(rd); |
| 581 | } | 581 | } |
| 582 | 582 | ||
| 583 | /* Record math.asin, math.acos, math.atan. */ | 583 | static void LJ_FASTCALL recff_math_call(jit_State *J, RecordFFData *rd) |
| 584 | static void LJ_FASTCALL recff_math_atrig(jit_State *J, RecordFFData *rd) | ||
| 585 | { | ||
| 586 | TRef y = lj_ir_tonum(J, J->base[0]); | ||
| 587 | TRef x = lj_ir_knum_one(J); | ||
| 588 | uint32_t ffid = rd->data; | ||
| 589 | if (ffid != FF_math_atan) { | ||
| 590 | TRef tmp = emitir(IRTN(IR_MUL), y, y); | ||
| 591 | tmp = emitir(IRTN(IR_SUB), x, tmp); | ||
| 592 | tmp = emitir(IRTN(IR_FPMATH), tmp, IRFPM_SQRT); | ||
| 593 | if (ffid == FF_math_asin) { x = tmp; } else { x = y; y = tmp; } | ||
| 594 | } | ||
| 595 | J->base[0] = emitir(IRTN(IR_ATAN2), y, x); | ||
| 596 | } | ||
| 597 | |||
| 598 | static void LJ_FASTCALL recff_math_htrig(jit_State *J, RecordFFData *rd) | ||
| 599 | { | 584 | { |
| 600 | TRef tr = lj_ir_tonum(J, J->base[0]); | 585 | TRef tr = lj_ir_tonum(J, J->base[0]); |
| 601 | J->base[0] = emitir(IRTN(IR_CALLN), tr, rd->data); | 586 | J->base[0] = emitir(IRTN(IR_CALLN), tr, rd->data); |
diff --git a/src/lj_ir.h b/src/lj_ir.h index 6bbe0a33..60e335c2 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h | |||
| @@ -75,7 +75,6 @@ | |||
| 75 | _(NEG, N , ref, ref) \ | 75 | _(NEG, N , ref, ref) \ |
| 76 | \ | 76 | \ |
| 77 | _(ABS, N , ref, ref) \ | 77 | _(ABS, N , ref, ref) \ |
| 78 | _(ATAN2, N , ref, ref) \ | ||
| 79 | _(LDEXP, N , ref, ref) \ | 78 | _(LDEXP, N , ref, ref) \ |
| 80 | _(MIN, C , ref, ref) \ | 79 | _(MIN, C , ref, ref) \ |
| 81 | _(MAX, C , ref, ref) \ | 80 | _(MAX, C , ref, ref) \ |
| @@ -178,8 +177,7 @@ LJ_STATIC_ASSERT((int)IR_XLOAD + IRDELTA_L2S == (int)IR_XSTORE); | |||
| 178 | /* FPMATH sub-functions. ORDER FPM. */ | 177 | /* FPMATH sub-functions. ORDER FPM. */ |
| 179 | #define IRFPMDEF(_) \ | 178 | #define IRFPMDEF(_) \ |
| 180 | _(FLOOR) _(CEIL) _(TRUNC) /* Must be first and in this order. */ \ | 179 | _(FLOOR) _(CEIL) _(TRUNC) /* Must be first and in this order. */ \ |
| 181 | _(SQRT) _(EXP) _(EXP2) _(LOG) _(LOG2) _(LOG10) \ | 180 | _(SQRT) _(EXP2) _(LOG) _(LOG2) \ |
| 182 | _(SIN) _(COS) _(TAN) \ | ||
| 183 | _(OTHER) | 181 | _(OTHER) |
| 184 | 182 | ||
| 185 | typedef enum { | 183 | typedef enum { |
diff --git a/src/lj_ircall.h b/src/lj_ircall.h index f4f3f781..35c02dc0 100644 --- a/src/lj_ircall.h +++ b/src/lj_ircall.h | |||
| @@ -21,6 +21,7 @@ typedef struct CCallInfo { | |||
| 21 | 21 | ||
| 22 | #define CCI_OTSHIFT 16 | 22 | #define CCI_OTSHIFT 16 |
| 23 | #define CCI_OPTYPE(ci) ((ci)->flags >> CCI_OTSHIFT) /* Get op/type. */ | 23 | #define CCI_OPTYPE(ci) ((ci)->flags >> CCI_OTSHIFT) /* Get op/type. */ |
| 24 | #define CCI_TYPE(ci) (((ci)->flags>>CCI_OTSHIFT) & IRT_TYPE) | ||
| 24 | #define CCI_OPSHIFT 24 | 25 | #define CCI_OPSHIFT 24 |
| 25 | #define CCI_OP(ci) ((ci)->flags >> CCI_OPSHIFT) /* Get op. */ | 26 | #define CCI_OP(ci) ((ci)->flags >> CCI_OPSHIFT) /* Get op. */ |
| 26 | 27 | ||
| @@ -172,6 +173,14 @@ typedef struct CCallInfo { | |||
| 172 | _(ANY, lj_mem_newgco, 2, FS, PGC, CCI_L) \ | 173 | _(ANY, lj_mem_newgco, 2, FS, PGC, CCI_L) \ |
| 173 | _(ANY, lj_math_random_step, 1, FS, NUM, CCI_CASTU64) \ | 174 | _(ANY, lj_math_random_step, 1, FS, NUM, CCI_CASTU64) \ |
| 174 | _(ANY, lj_vm_modi, 2, FN, INT, 0) \ | 175 | _(ANY, lj_vm_modi, 2, FN, INT, 0) \ |
| 176 | _(ANY, log10, 1, N, NUM, XA_FP) \ | ||
| 177 | _(ANY, exp, 1, N, NUM, XA_FP) \ | ||
| 178 | _(ANY, sin, 1, N, NUM, XA_FP) \ | ||
| 179 | _(ANY, cos, 1, N, NUM, XA_FP) \ | ||
| 180 | _(ANY, tan, 1, N, NUM, XA_FP) \ | ||
| 181 | _(ANY, asin, 1, N, NUM, XA_FP) \ | ||
| 182 | _(ANY, acos, 1, N, NUM, XA_FP) \ | ||
| 183 | _(ANY, atan, 1, N, NUM, XA_FP) \ | ||
| 175 | _(ANY, sinh, 1, N, NUM, XA_FP) \ | 184 | _(ANY, sinh, 1, N, NUM, XA_FP) \ |
| 176 | _(ANY, cosh, 1, N, NUM, XA_FP) \ | 185 | _(ANY, cosh, 1, N, NUM, XA_FP) \ |
| 177 | _(ANY, tanh, 1, N, NUM, XA_FP) \ | 186 | _(ANY, tanh, 1, N, NUM, XA_FP) \ |
| @@ -183,14 +192,9 @@ typedef struct CCallInfo { | |||
| 183 | _(FPMATH, lj_vm_ceil, 1, N, NUM, XA_FP) \ | 192 | _(FPMATH, lj_vm_ceil, 1, N, NUM, XA_FP) \ |
| 184 | _(FPMATH, lj_vm_trunc, 1, N, NUM, XA_FP) \ | 193 | _(FPMATH, lj_vm_trunc, 1, N, NUM, XA_FP) \ |
| 185 | _(FPMATH, sqrt, 1, N, NUM, XA_FP) \ | 194 | _(FPMATH, sqrt, 1, N, NUM, XA_FP) \ |
| 186 | _(ANY, exp, 1, N, NUM, XA_FP) \ | ||
| 187 | _(ANY, lj_vm_exp2, 1, N, NUM, XA_FP) \ | 195 | _(ANY, lj_vm_exp2, 1, N, NUM, XA_FP) \ |
| 188 | _(ANY, log, 1, N, NUM, XA_FP) \ | 196 | _(ANY, log, 1, N, NUM, XA_FP) \ |
| 189 | _(ANY, lj_vm_log2, 1, N, NUM, XA_FP) \ | 197 | _(ANY, lj_vm_log2, 1, N, NUM, XA_FP) \ |
| 190 | _(ANY, log10, 1, N, NUM, XA_FP) \ | ||
| 191 | _(ANY, sin, 1, N, NUM, XA_FP) \ | ||
| 192 | _(ANY, cos, 1, N, NUM, XA_FP) \ | ||
| 193 | _(ANY, tan, 1, N, NUM, XA_FP) \ | ||
| 194 | _(ANY, lj_vm_powi, 2, N, NUM, XA_FP) \ | 198 | _(ANY, lj_vm_powi, 2, N, NUM, XA_FP) \ |
| 195 | _(ANY, pow, 2, N, NUM, XA2_FP) \ | 199 | _(ANY, pow, 2, N, NUM, XA2_FP) \ |
| 196 | _(ANY, atan2, 2, N, NUM, XA2_FP) \ | 200 | _(ANY, atan2, 2, N, NUM, XA2_FP) \ |
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index cefd69c8..ae65e15a 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
| @@ -173,7 +173,6 @@ LJFOLD(ADD KNUM KNUM) | |||
| 173 | LJFOLD(SUB KNUM KNUM) | 173 | LJFOLD(SUB KNUM KNUM) |
| 174 | LJFOLD(MUL KNUM KNUM) | 174 | LJFOLD(MUL KNUM KNUM) |
| 175 | LJFOLD(DIV KNUM KNUM) | 175 | LJFOLD(DIV KNUM KNUM) |
| 176 | LJFOLD(ATAN2 KNUM KNUM) | ||
| 177 | LJFOLD(LDEXP KNUM KNUM) | 176 | LJFOLD(LDEXP KNUM KNUM) |
| 178 | LJFOLD(MIN KNUM KNUM) | 177 | LJFOLD(MIN KNUM KNUM) |
| 179 | LJFOLD(MAX KNUM KNUM) | 178 | LJFOLD(MAX KNUM KNUM) |
| @@ -213,6 +212,30 @@ LJFOLDF(kfold_fpmath) | |||
| 213 | return lj_ir_knum(J, y); | 212 | return lj_ir_knum(J, y); |
| 214 | } | 213 | } |
| 215 | 214 | ||
| 215 | LJFOLD(CALLN KNUM any) | ||
| 216 | LJFOLDF(kfold_fpcall1) | ||
| 217 | { | ||
| 218 | const CCallInfo *ci = &lj_ir_callinfo[fins->op2]; | ||
| 219 | if (CCI_TYPE(ci) == IRT_NUM) { | ||
| 220 | double y = ((double (*)(double))ci->func)(knumleft); | ||
| 221 | return lj_ir_knum(J, y); | ||
| 222 | } | ||
| 223 | return NEXTFOLD; | ||
| 224 | } | ||
| 225 | |||
| 226 | LJFOLD(CALLN CARG IRCALL_atan2) | ||
| 227 | LJFOLDF(kfold_fpcall2) | ||
| 228 | { | ||
| 229 | if (irref_isk(fleft->op1) && irref_isk(fleft->op2)) { | ||
| 230 | const CCallInfo *ci = &lj_ir_callinfo[fins->op2]; | ||
| 231 | double a = ir_knum(IR(fleft->op1))->n; | ||
| 232 | double b = ir_knum(IR(fleft->op2))->n; | ||
| 233 | double y = ((double (*)(double, double))ci->func)(a, b); | ||
| 234 | return lj_ir_knum(J, y); | ||
| 235 | } | ||
| 236 | return NEXTFOLD; | ||
| 237 | } | ||
| 238 | |||
| 216 | LJFOLD(POW KNUM KINT) | 239 | LJFOLD(POW KNUM KINT) |
| 217 | LJFOLDF(kfold_numpow) | 240 | LJFOLDF(kfold_numpow) |
| 218 | { | 241 | { |
diff --git a/src/lj_opt_split.c b/src/lj_opt_split.c index ee7cf0f9..e526b49d 100644 --- a/src/lj_opt_split.c +++ b/src/lj_opt_split.c | |||
| @@ -426,9 +426,6 @@ static void split_ir(jit_State *J) | |||
| 426 | } | 426 | } |
| 427 | hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_floor + ir->op2); | 427 | hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_floor + ir->op2); |
| 428 | break; | 428 | break; |
| 429 | case IR_ATAN2: | ||
| 430 | hi = split_call_ll(J, hisubst, oir, ir, IRCALL_atan2); | ||
| 431 | break; | ||
| 432 | case IR_LDEXP: | 429 | case IR_LDEXP: |
| 433 | hi = split_call_li(J, hisubst, oir, ir, IRCALL_ldexp); | 430 | hi = split_call_li(J, hisubst, oir, ir, IRCALL_ldexp); |
| 434 | break; | 431 | break; |
diff --git a/src/lj_target_x86.h b/src/lj_target_x86.h index 71c930fe..fd72c71d 100644 --- a/src/lj_target_x86.h +++ b/src/lj_target_x86.h | |||
| @@ -228,16 +228,10 @@ typedef enum { | |||
| 228 | /* Note: little-endian byte-order! */ | 228 | /* Note: little-endian byte-order! */ |
| 229 | XI_FLDZ = 0xeed9, | 229 | XI_FLDZ = 0xeed9, |
| 230 | XI_FLD1 = 0xe8d9, | 230 | XI_FLD1 = 0xe8d9, |
| 231 | XI_FLDLG2 = 0xecd9, | ||
| 232 | XI_FLDLN2 = 0xedd9, | ||
| 233 | XI_FDUP = 0xc0d9, /* Really fld st0. */ | 231 | XI_FDUP = 0xc0d9, /* Really fld st0. */ |
| 234 | XI_FPOP = 0xd8dd, /* Really fstp st0. */ | 232 | XI_FPOP = 0xd8dd, /* Really fstp st0. */ |
| 235 | XI_FPOP1 = 0xd9dd, /* Really fstp st1. */ | 233 | XI_FPOP1 = 0xd9dd, /* Really fstp st1. */ |
| 236 | XI_FRNDINT = 0xfcd9, | 234 | XI_FRNDINT = 0xfcd9, |
| 237 | XI_FSIN = 0xfed9, | ||
| 238 | XI_FCOS = 0xffd9, | ||
| 239 | XI_FPTAN = 0xf2d9, | ||
| 240 | XI_FPATAN = 0xf3d9, | ||
| 241 | XI_FSCALE = 0xfdd9, | 235 | XI_FSCALE = 0xfdd9, |
| 242 | XI_FYL2X = 0xf1d9, | 236 | XI_FYL2X = 0xf1d9, |
| 243 | 237 | ||
diff --git a/src/lj_vmmath.c b/src/lj_vmmath.c index e89405d7..36178f29 100644 --- a/src/lj_vmmath.c +++ b/src/lj_vmmath.c | |||
| @@ -48,7 +48,6 @@ double lj_vm_foldarith(double x, double y, int op) | |||
| 48 | case IR_NEG - IR_ADD: return -x; break; | 48 | case IR_NEG - IR_ADD: return -x; break; |
| 49 | case IR_ABS - IR_ADD: return fabs(x); break; | 49 | case IR_ABS - IR_ADD: return fabs(x); break; |
| 50 | #if LJ_HASJIT | 50 | #if LJ_HASJIT |
| 51 | case IR_ATAN2 - IR_ADD: return atan2(x, y); break; | ||
| 52 | case IR_LDEXP - IR_ADD: return ldexp(x, (int)y); break; | 51 | case IR_LDEXP - IR_ADD: return ldexp(x, (int)y); break; |
| 53 | case IR_MIN - IR_ADD: return x < y ? x : y; break; | 52 | case IR_MIN - IR_ADD: return x < y ? x : y; break; |
| 54 | case IR_MAX - IR_ADD: return x > y ? x : y; break; | 53 | case IR_MAX - IR_ADD: return x > y ? x : y; break; |
| @@ -129,14 +128,9 @@ double lj_vm_foldfpm(double x, int fpm) | |||
| 129 | case IRFPM_CEIL: return lj_vm_ceil(x); | 128 | case IRFPM_CEIL: return lj_vm_ceil(x); |
| 130 | case IRFPM_TRUNC: return lj_vm_trunc(x); | 129 | case IRFPM_TRUNC: return lj_vm_trunc(x); |
| 131 | case IRFPM_SQRT: return sqrt(x); | 130 | case IRFPM_SQRT: return sqrt(x); |
| 132 | case IRFPM_EXP: return exp(x); | ||
| 133 | case IRFPM_EXP2: return lj_vm_exp2(x); | 131 | case IRFPM_EXP2: return lj_vm_exp2(x); |
| 134 | case IRFPM_LOG: return log(x); | 132 | case IRFPM_LOG: return log(x); |
| 135 | case IRFPM_LOG2: return lj_vm_log2(x); | 133 | case IRFPM_LOG2: return lj_vm_log2(x); |
| 136 | case IRFPM_LOG10: return log10(x); | ||
| 137 | case IRFPM_SIN: return sin(x); | ||
| 138 | case IRFPM_COS: return cos(x); | ||
| 139 | case IRFPM_TAN: return tan(x); | ||
| 140 | default: lua_assert(0); | 134 | default: lua_assert(0); |
| 141 | } | 135 | } |
| 142 | return 0; | 136 | return 0; |
