summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2004-03-17 16:40:56 +0000
committerAndi Gutmans <andi@php.net>2004-03-17 16:40:56 +0000
commitcedd0296e01713b04689bbc62922af56a82fbc02 (patch)
tree806e3220f87211daff60f5084184cb87c4d5c8f2
parent5569ad0626e84f21799154dedd4c274141a30991 (diff)
downloadphp-git-cedd0296e01713b04689bbc62922af56a82fbc02.tar.gz
- Improved patch for support multiplication on 64bit machines
-rw-r--r--Zend/zend_multiply.h21
1 files changed, 6 insertions, 15 deletions
diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
index eda4ca135e..81851b6f24 100644
--- a/Zend/zend_multiply.h
+++ b/Zend/zend_multiply.h
@@ -18,22 +18,13 @@
/* $Id$ */
-#define HALF (4*sizeof(long))
-#define UH(b) ((b) >> HALF)
-#define LH(a) ((a) & ~(-1L << HALF))
-
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
- long __mid,__upr,__res = (a) * (b); \
- if (-(long)(a) > 0 && -(long)(b) > 0) { /* overflow intended */ \
- __mid = UH(-(a))*LH(-(b)) + LH(-(a))*UH(-(b)); \
- __upr = UH(-(a))*UH(-(b)) + UH(__mid); \
- } else { \
- __mid = UH(a)*LH(b) + LH(a)*UH(b); \
- __upr = UH(a)*UH(b) + UH(__mid); \
- } \
- if (((usedval) = !((__upr==-1&&__res<0)||(!__upr&&__res>=0)))) { \
- (dval) = (double)(a)*(double)(b); \
+ long __lres = (a) * (b); \
+ double __dres = (double)(a) * (double)(b); \
+ double __delta = (double) __lres - __dres; \
+ if ( ((usedval) = (( __dres + __delta ) != __dres))) { \
+ (dval) = __dres; \
} else { \
- (lval) = __res; \
+ (lval) = __lres; \
} \
} while (0)