瀏覽代碼

ARM: Fix math.ldexp() recording and folding.

Mike Pall 14 年之前
父節點
當前提交
7683f39786
共有 3 個文件被更改,包括 30 次插入5 次删除
  1. 2 2
      src/lib_math.c
  2. 13 3
      src/lj_ffrecord.c
  3. 15 0
      src/lj_opt_fold.c

+ 2 - 2
src/lib_math.c

@@ -53,7 +53,7 @@ LJLIB_ASM_(math_deg)		LJLIB_REC(math_degrad)
 LJLIB_PUSH(0.017453292519943295)
 LJLIB_PUSH(0.017453292519943295)
 LJLIB_ASM_(math_rad)		LJLIB_REC(math_degrad)
 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, 1);
   lj_lib_checknum(L, 2);
   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_pow)		LJLIB_REC(.)
 LJLIB_ASM_(math_fmod)
 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);
   lj_lib_checknum(L, 1);
 #if LJ_DUALNUM && !LJ_TARGET_X86ORX64
 #if LJ_DUALNUM && !LJ_TARGET_X86ORX64

+ 13 - 3
src/lj_ffrecord.c

@@ -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);
   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]);
   TRef tr = lj_ir_tonum(J, J->base[0]);
 #if LJ_TARGET_X86ORX64
 #if LJ_TARGET_X86ORX64
@@ -443,7 +452,8 @@ static void LJ_FASTCALL recff_math_binary(jit_State *J, RecordFFData *rd)
 #else
 #else
   TRef tr2 = lj_opt_narrow_toint(J, J->base[1]);
   TRef tr2 = lj_opt_narrow_toint(J, J->base[1]);
 #endif
 #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. */
 /* Record math.asin, math.acos, math.atan. */

+ 15 - 0
src/lj_opt_fold.c

@@ -8,6 +8,8 @@
 #define lj_opt_fold_c
 #define lj_opt_fold_c
 #define LUA_CORE
 #define LUA_CORE
 
 
+#include <math.h>
+
 #include "lj_obj.h"
 #include "lj_obj.h"
 
 
 #if LJ_HASJIT
 #if LJ_HASJIT
@@ -177,6 +179,17 @@ LJFOLDF(kfold_numarith)
   return lj_ir_knum(J, y);
   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)
 LJFOLD(FPMATH KNUM any)
 LJFOLDF(kfold_fpmath)
 LJFOLDF(kfold_fpmath)
 {
 {
@@ -839,9 +852,11 @@ LJFOLDF(simplify_numpow_kx)
   lua_Number n = knumleft;
   lua_Number n = knumleft;
   if (n == 2.0) {  /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */
   if (n == 2.0) {  /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */
     fins->o = IR_CONV;
     fins->o = IR_CONV;
+#if LJ_TARGET_X86ORX64
     fins->op1 = fins->op2;
     fins->op1 = fins->op2;
     fins->op2 = IRCONV_NUM_INT;
     fins->op2 = IRCONV_NUM_INT;
     fins->op2 = (IRRef1)lj_opt_fold(J);
     fins->op2 = (IRRef1)lj_opt_fold(J);
+#endif
     fins->op1 = (IRRef1)lj_ir_knum_one(J);
     fins->op1 = (IRRef1)lj_ir_knum_one(J);
     fins->o = IR_LDEXP;
     fins->o = IR_LDEXP;
     return RETRYFOLD;
     return RETRYFOLD;