summaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c15
1 files changed, 15 insertions, 0 deletions
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;