diff options
author | Andi Gutmans <andi@php.net> | 2004-03-17 16:40:56 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2004-03-17 16:40:56 +0000 |
commit | cedd0296e01713b04689bbc62922af56a82fbc02 (patch) | |
tree | 806e3220f87211daff60f5084184cb87c4d5c8f2 /Zend/zend_multiply.h | |
parent | 5569ad0626e84f21799154dedd4c274141a30991 (diff) | |
download | php-git-cedd0296e01713b04689bbc62922af56a82fbc02.tar.gz |
- Improved patch for support multiplication on 64bit machines
Diffstat (limited to 'Zend/zend_multiply.h')
-rw-r--r-- | Zend/zend_multiply.h | 21 |
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) |