aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-10 16:57:09 +0200
committerMike Pall <mike>2011-04-10 16:58:22 +0200
commit89022b4c3e75fe06439c7edc8d61e330b6ede59c (patch)
tree90f5be2a50fca371a20351b23f0f88c8ab141b00 /src
parentf089f3954c9be976faccc82661b4a7b00e70c3b0 (diff)
downloadluajit-89022b4c3e75fe06439c7edc8d61e330b6ede59c.tar.gz
luajit-89022b4c3e75fe06439c7edc8d61e330b6ede59c.tar.bz2
luajit-89022b4c3e75fe06439c7edc8d61e330b6ede59c.zip
Use lj_vm_tobit() on targets without FPU.
Diffstat (limited to 'src')
-rw-r--r--src/lj_obj.h8
-rw-r--r--src/lj_opt_fold.c4
-rw-r--r--src/lj_vm.h3
3 files changed, 12 insertions, 3 deletions
diff --git a/src/lj_obj.h b/src/lj_obj.h
index 19a2345f..43f3d6ad 100644
--- a/src/lj_obj.h
+++ b/src/lj_obj.h
@@ -786,11 +786,19 @@ static LJ_AINLINE void copyTV(lua_State *L, TValue *o1, const TValue *o2)
786 786
787/* -- Number to integer conversion ---------------------------------------- */ 787/* -- Number to integer conversion ---------------------------------------- */
788 788
789#if !LJ_ARCH_HASFPU
790LJ_ASMF int32_t lj_vm_tobit(double x);
791#endif
792
789static LJ_AINLINE int32_t lj_num2bit(lua_Number n) 793static LJ_AINLINE int32_t lj_num2bit(lua_Number n)
790{ 794{
795#if LJ_ARCH_HASFPU
791 TValue o; 796 TValue o;
792 o.n = n + 6755399441055744.0; /* 2^52 + 2^51 */ 797 o.n = n + 6755399441055744.0; /* 2^52 + 2^51 */
793 return (int32_t)o.u32.lo; 798 return (int32_t)o.u32.lo;
799#else
800 return lj_vm_tobit(n);
801#endif
794} 802}
795 803
796#if LJ_TARGET_X86 && !defined(__SSE2__) 804#if LJ_TARGET_X86 && !defined(__SSE2__)
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 44a55709..48f2c40d 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -541,9 +541,7 @@ LJFOLDF(kfold_add_kptr)
541LJFOLD(TOBIT KNUM KNUM) 541LJFOLD(TOBIT KNUM KNUM)
542LJFOLDF(kfold_tobit) 542LJFOLDF(kfold_tobit)
543{ 543{
544 TValue tv; 544 return INTFOLD(lj_num2bit(knumleft));
545 tv.n = knumleft + knumright;
546 return INTFOLD((int32_t)tv.u32.lo);
547} 545}
548 546
549LJFOLD(CONV KINT IRCONV_NUM_INT) 547LJFOLD(CONV KINT IRCONV_NUM_INT)
diff --git a/src/lj_vm.h b/src/lj_vm.h
index 036ada7d..55b92c83 100644
--- a/src/lj_vm.h
+++ b/src/lj_vm.h
@@ -31,6 +31,9 @@ LJ_ASMF double lj_vm_foldarith(double x, double y, int op);
31#if LJ_HASJIT 31#if LJ_HASJIT
32LJ_ASMF double lj_vm_foldfpm(double x, int op); 32LJ_ASMF double lj_vm_foldfpm(double x, int op);
33#endif 33#endif
34#if !LJ_ARCH_HASFPU
35/* Declared in lj_obj.h: LJ_ASMF int32_t lj_vm_tobit(double x); */
36#endif
34 37
35/* Dispatch targets for recording and hooks. */ 38/* Dispatch targets for recording and hooks. */
36LJ_ASMF void lj_vm_record(void); 39LJ_ASMF void lj_vm_record(void);