aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-05-27 02:03:02 +0200
committerMike Pall <mike>2011-05-27 02:03:02 +0200
commit7683f39786ab05f02dc20307a49dfaf1a1972d7d (patch)
tree1f28dd67667291f63a0d528830cab0b65df4c7d5 /src
parent7bad42a3ba453311334f8e0b4e4a4ea24c13b979 (diff)
downloadluajit-7683f39786ab05f02dc20307a49dfaf1a1972d7d.tar.gz
luajit-7683f39786ab05f02dc20307a49dfaf1a1972d7d.tar.bz2
luajit-7683f39786ab05f02dc20307a49dfaf1a1972d7d.zip
ARM: Fix math.ldexp() recording and folding.
Diffstat (limited to 'src')
-rw-r--r--src/lib_math.c4
-rw-r--r--src/lj_ffrecord.c16
-rw-r--r--src/lj_opt_fold.c15
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)
53LJLIB_PUSH(0.017453292519943295) 53LJLIB_PUSH(0.017453292519943295)
54LJLIB_ASM_(math_rad) LJLIB_REC(math_degrad) 54LJLIB_ASM_(math_rad) LJLIB_REC(math_degrad)
55 55
56LJLIB_ASM(math_atan2) LJLIB_REC(math_binary IR_ATAN2) 56LJLIB_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)
62LJLIB_ASM_(math_pow) LJLIB_REC(.) 62LJLIB_ASM_(math_pow) LJLIB_REC(.)
63LJLIB_ASM_(math_fmod) 63LJLIB_ASM_(math_fmod)
64 64
65LJLIB_ASM(math_ldexp) LJLIB_REC(math_binary IR_LDEXP) 65LJLIB_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. */
438static void LJ_FASTCALL recff_math_binary(jit_State *J, RecordFFData *rd) 438static 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. */
447static 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
182LJFOLD(LDEXP KNUM KINT)
183LJFOLDF(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
180LJFOLD(FPMATH KNUM any) 193LJFOLD(FPMATH KNUM any)
181LJFOLDF(kfold_fpmath) 194LJFOLDF(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;