فهرست منبع

Use lj_vm_tobit() on targets without FPU.

Mike Pall 14 سال پیش
والد
کامیت
89022b4c3e
3فایلهای تغییر یافته به همراه12 افزوده شده و 3 حذف شده
  1. 8 0
      src/lj_obj.h
  2. 1 3
      src/lj_opt_fold.c
  3. 3 0
      src/lj_vm.h

+ 8 - 0
src/lj_obj.h

@@ -786,11 +786,19 @@ static LJ_AINLINE void copyTV(lua_State *L, TValue *o1, const TValue *o2)
 
 /* -- Number to integer conversion ---------------------------------------- */
 
+#if !LJ_ARCH_HASFPU
+LJ_ASMF int32_t lj_vm_tobit(double x);
+#endif
+
 static LJ_AINLINE int32_t lj_num2bit(lua_Number n)
 {
+#if LJ_ARCH_HASFPU
   TValue o;
   o.n = n + 6755399441055744.0;  /* 2^52 + 2^51 */
   return (int32_t)o.u32.lo;
+#else
+  return lj_vm_tobit(n);
+#endif
 }
 
 #if LJ_TARGET_X86 && !defined(__SSE2__)

+ 1 - 3
src/lj_opt_fold.c

@@ -541,9 +541,7 @@ LJFOLDF(kfold_add_kptr)
 LJFOLD(TOBIT KNUM KNUM)
 LJFOLDF(kfold_tobit)
 {
-  TValue tv;
-  tv.n = knumleft + knumright;
-  return INTFOLD((int32_t)tv.u32.lo);
+  return INTFOLD(lj_num2bit(knumleft));
 }
 
 LJFOLD(CONV KINT IRCONV_NUM_INT)

+ 3 - 0
src/lj_vm.h

@@ -31,6 +31,9 @@ LJ_ASMF double lj_vm_foldarith(double x, double y, int op);
 #if LJ_HASJIT
 LJ_ASMF double lj_vm_foldfpm(double x, int op);
 #endif
+#if !LJ_ARCH_HASFPU
+/* Declared in lj_obj.h: LJ_ASMF int32_t lj_vm_tobit(double x); */
+#endif
 
 /* Dispatch targets for recording and hooks. */
 LJ_ASMF void lj_vm_record(void);