summaryrefslogtreecommitdiff
path: root/src/lib_math.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-27 01:36:59 +0100
committerMike Pall <mike>2011-02-27 01:36:59 +0100
commitcead25f928ac606fc1a13882b818913aab3635a9 (patch)
tree92121b401f76f4b2891ebac0f710b0a921ce13b1 /src/lib_math.c
parentc031d4b6a06eab94e8d9b837ec6dc257899a4ae1 (diff)
downloadluajit-cead25f928ac606fc1a13882b818913aab3635a9.tar.gz
luajit-cead25f928ac606fc1a13882b818913aab3635a9.tar.bz2
luajit-cead25f928ac606fc1a13882b818913aab3635a9.zip
DUALNUM: Handle integer type in x86/x64 interpreter and libraries.
Diffstat (limited to 'src/lib_math.c')
-rw-r--r--src/lib_math.c40
1 files changed, 37 insertions, 3 deletions
diff --git a/src/lib_math.c b/src/lib_math.c
index 46841e08..5843e2f5 100644
--- a/src/lib_math.c
+++ b/src/lib_math.c
@@ -21,12 +21,17 @@
21 21
22LJLIB_ASM(math_abs) LJLIB_REC(.) 22LJLIB_ASM(math_abs) LJLIB_REC(.)
23{ 23{
24 lj_lib_checknum(L, 1); 24 lj_lib_checknumber(L, 1);
25 return FFH_RETRY; 25 return FFH_RETRY;
26} 26}
27LJLIB_ASM_(math_floor) LJLIB_REC(math_round IRFPM_FLOOR) 27LJLIB_ASM_(math_floor) LJLIB_REC(math_round IRFPM_FLOOR)
28LJLIB_ASM_(math_ceil) LJLIB_REC(math_round IRFPM_CEIL) 28LJLIB_ASM_(math_ceil) LJLIB_REC(math_round IRFPM_CEIL)
29LJLIB_ASM_(math_sqrt) LJLIB_REC(math_unary IRFPM_SQRT) 29
30LJLIB_ASM(math_sqrt) LJLIB_REC(math_unary IRFPM_SQRT)
31{
32 lj_lib_checknum(L, 1);
33 return FFH_RETRY;
34}
30LJLIB_ASM_(math_log) LJLIB_REC(math_unary IRFPM_LOG) 35LJLIB_ASM_(math_log) LJLIB_REC(math_unary IRFPM_LOG)
31LJLIB_ASM_(math_log10) LJLIB_REC(math_unary IRFPM_LOG10) 36LJLIB_ASM_(math_log10) LJLIB_REC(math_unary IRFPM_LOG10)
32LJLIB_ASM_(math_exp) LJLIB_REC(math_unary IRFPM_EXP) 37LJLIB_ASM_(math_exp) LJLIB_REC(math_unary IRFPM_EXP)
@@ -61,7 +66,7 @@ LJLIB_ASM_(math_fmod)
61LJLIB_ASM(math_min) LJLIB_REC(math_minmax IR_MIN) 66LJLIB_ASM(math_min) LJLIB_REC(math_minmax IR_MIN)
62{ 67{
63 int i = 0; 68 int i = 0;
64 do { lj_lib_checknum(L, ++i); } while (L->base+i < L->top); 69 do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top);
65 return FFH_RETRY; 70 return FFH_RETRY;
66} 71}
67LJLIB_ASM_(math_max) LJLIB_REC(math_minmax IR_MAX) 72LJLIB_ASM_(math_max) LJLIB_REC(math_minmax IR_MAX)
@@ -137,13 +142,42 @@ LJLIB_CF(math_random) LJLIB_REC(.)
137 u.u64 = lj_math_random_step(rs); 142 u.u64 = lj_math_random_step(rs);
138 d = u.d - 1.0; 143 d = u.d - 1.0;
139 if (n > 0) { 144 if (n > 0) {
145#if LJ_DUALNUM
146 int isint = 1;
147 double r1;
148 lj_lib_checknumber(L, 1);
149 if (tvisint(L->base)) {
150 r1 = (lua_Number)intV(L->base);
151 } else {
152 isint = 0;
153 r1 = numV(L->base);
154 }
155#else
140 double r1 = lj_lib_checknum(L, 1); 156 double r1 = lj_lib_checknum(L, 1);
157#endif
141 if (n == 1) { 158 if (n == 1) {
142 d = floor(d*r1) + 1.0; /* d is an int in range [1, r1] */ 159 d = floor(d*r1) + 1.0; /* d is an int in range [1, r1] */
143 } else { 160 } else {
161#if LJ_DUALNUM
162 double r2;
163 lj_lib_checknumber(L, 2);
164 if (tvisint(L->base+1)) {
165 r2 = (lua_Number)intV(L->base+1);
166 } else {
167 isint = 0;
168 r2 = numV(L->base+1);
169 }
170#else
144 double r2 = lj_lib_checknum(L, 2); 171 double r2 = lj_lib_checknum(L, 2);
172#endif
145 d = floor(d*(r2-r1+1.0)) + r1; /* d is an int in range [r1, r2] */ 173 d = floor(d*(r2-r1+1.0)) + r1; /* d is an int in range [r1, r2] */
146 } 174 }
175#if LJ_DUALNUM
176 if (isint) {
177 setintV(L->top-1, lj_num2int(d));
178 return 1;
179 }
180#endif
147 } /* else: d is a double in range [0, 1] */ 181 } /* else: d is a double in range [0, 1] */
148 setnumV(L->top++, d); 182 setnumV(L->top++, d);
149 return 1; 183 return 1;