From 89022b4c3e75fe06439c7edc8d61e330b6ede59c Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sun, 10 Apr 2011 16:57:09 +0200 Subject: [PATCH] Use lj_vm_tobit() on targets without FPU. --- src/lj_obj.h | 8 ++++++++ src/lj_opt_fold.c | 4 +--- src/lj_vm.h | 3 +++ 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) /* -- 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__) 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) 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) 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); #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);