diff options
| author | Mike Pall <mike> | 2011-04-10 16:57:09 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-04-10 16:58:22 +0200 |
| commit | 89022b4c3e75fe06439c7edc8d61e330b6ede59c (patch) | |
| tree | 90f5be2a50fca371a20351b23f0f88c8ab141b00 | |
| parent | f089f3954c9be976faccc82661b4a7b00e70c3b0 (diff) | |
| download | luajit-89022b4c3e75fe06439c7edc8d61e330b6ede59c.tar.gz luajit-89022b4c3e75fe06439c7edc8d61e330b6ede59c.tar.bz2 luajit-89022b4c3e75fe06439c7edc8d61e330b6ede59c.zip | |
Use lj_vm_tobit() on targets without FPU.
| -rw-r--r-- | src/lj_obj.h | 8 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 4 | ||||
| -rw-r--r-- | 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) | |||
| 786 | 786 | ||
| 787 | /* -- Number to integer conversion ---------------------------------------- */ | 787 | /* -- Number to integer conversion ---------------------------------------- */ |
| 788 | 788 | ||
| 789 | #if !LJ_ARCH_HASFPU | ||
| 790 | LJ_ASMF int32_t lj_vm_tobit(double x); | ||
| 791 | #endif | ||
| 792 | |||
| 789 | static LJ_AINLINE int32_t lj_num2bit(lua_Number n) | 793 | static 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) | |||
| 541 | LJFOLD(TOBIT KNUM KNUM) | 541 | LJFOLD(TOBIT KNUM KNUM) |
| 542 | LJFOLDF(kfold_tobit) | 542 | LJFOLDF(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 | ||
| 549 | LJFOLD(CONV KINT IRCONV_NUM_INT) | 547 | 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); | |||
| 31 | #if LJ_HASJIT | 31 | #if LJ_HASJIT |
| 32 | LJ_ASMF double lj_vm_foldfpm(double x, int op); | 32 | LJ_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. */ |
| 36 | LJ_ASMF void lj_vm_record(void); | 39 | LJ_ASMF void lj_vm_record(void); |
