]> granicus.if.org Git - php/commitdiff
- Improved patch for support multiplication on 64bit machines
authorAndi Gutmans <andi@php.net>
Wed, 17 Mar 2004 16:40:56 +0000 (16:40 +0000)
committerAndi Gutmans <andi@php.net>
Wed, 17 Mar 2004 16:40:56 +0000 (16:40 +0000)
Zend/zend_multiply.h

index eda4ca135ec56a01defb3bffc71baa6fd43a7bfc..81851b6f24fa735384cf6f6b49ede0ff9a49dda7 100644 (file)
 
 /* $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)