lua-users home
lua-l archive

Re: Fast integer arithmetic

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Enrico Colombini <erix@erix.it> writes:
> I just put this at the end of luaconf.h.
To make progress on supporting integer operations, you must change
src/lvm.c so that it correctly handles integer divide by zero. I've
enclosed a patch that addresses this issue. It also provides integer
exponentiation. 
John
diff -ur olua-5.1.3/src/lvm.c lua-5.1.3/src/lvm.c
--- olua-5.1.3/src/lvm.c	2007年12月28日 10:32:23.000000000 -0500
+++ lua-5.1.3/src/lvm.c	2008年02月20日 10:27:15.000000000 -0500
@@ -27,6 +27,37 @@
 #include "lvm.h"
 
 
+#if defined LUA_NUMBER_INTEGRAL
+#define luai_znumdiv(a,b)	\
+ ((b)==0?			\
+ (luaG_runerror(L,"divide by zero"),0): \
+ luai_numdiv(a,b))
+#define luai_znummod(a,b)	\
+ ((b)==0?			\
+ (luaG_runerror(L,"modulo by zero"),0): \
+ luai_nummod(a,b))
+
+LUA_NUMBER luai_ipow(LUA_NUMBER a, LUA_NUMBER b) {
+ if (b < 0)
+ return 0;
+ else if (b == 0)
+ return 1;
+ else {
+ LUA_NUMBER c = 1;
+ for (;;) {
+ if (b & 1)
+	c *= a;
+ b = b >> 1;
+ if (b == 0)
+	return c;
+ a *= a;
+ }
+ }
+}
+#else
+#define luai_znumdiv(a,b)	(luai_numdiv(a,b))
+#define luai_znummod(a,b)	(luai_nummod(a,b))
+#endif
 
 /* limit for table tag-method chains (to avoid loops) */
 #define MAXTAGLOOP	100
@@ -321,8 +352,8 @@
 case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break;
 case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break;
 case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break;
- case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break;
- case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break;
+ case TM_DIV: setnvalue(ra, luai_znumdiv(nb, nc)); break;
+ case TM_MOD: setnvalue(ra, luai_znummod(nb, nc)); break;
 case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break;
 case TM_UNM: setnvalue(ra, luai_numunm(nb)); break;
 default: lua_assert(0); break;
@@ -480,11 +511,11 @@
 continue;
 }
 case OP_DIV: {
- arith_op(luai_numdiv, TM_DIV);
+ arith_op(luai_znumdiv, TM_DIV);
 continue;
 }
 case OP_MOD: {
- arith_op(luai_nummod, TM_MOD);
+ arith_op(luai_znummod, TM_MOD);
 continue;
 }
 case OP_POW: {
Only in lua-5.1.3/src: lvm.c~

AltStyle によって変換されたページ (->オリジナル) /