Annotation of embedaddon/php/Zend/zend_multiply.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | Zend Engine                                                          |
                      4:    +----------------------------------------------------------------------+
                      5:    | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
                      6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 2.00 of the Zend license,     |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.zend.com/license/2_00.txt.                                |
                     11:    | If you did not receive a copy of the Zend license and are unable to  |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@zend.com so we can mail you a copy immediately.              |
                     14:    +----------------------------------------------------------------------+
                     15:    | Authors: Sascha Schumann <sascha@schumann.cx>                        |
                     16:    |          Ard Biesheuvel <ard@ard.nu>                                 |
                     17:    +----------------------------------------------------------------------+
                     18: */
                     19: 
                     20: /* $Id: zend_multiply.h 321634 2012-01-01 13:15:04Z felipe $ */
                     21: 
                     22: #if defined(__i386__) && defined(__GNUC__)
                     23: 
                     24: #define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {      \
                     25:        long __tmpvar;                                                                                                  \
                     26:        __asm__ ("imul %3,%0\n"                                                                                 \
                     27:                "adc $0,%1"                                                                                             \
                     28:                        : "=r"(__tmpvar),"=r"(usedval)                                                  \
                     29:                        : "0"(a), "r"(b), "1"(0));                                                              \
                     30:        if (usedval) (dval) = (double) (a) * (double) (b);                              \
                     31:        else (lval) = __tmpvar;                                                                                 \
                     32: } while (0)
                     33: 
                     34: #elif SIZEOF_LONG == 4 && defined(HAVE_ZEND_LONG64)
                     35: 
                     36: #define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {      \
                     37:        zend_long64 __result = (zend_long64) (a) * (zend_long64) (b);   \
                     38:        if (__result > LONG_MAX || __result < LONG_MIN) {                               \
                     39:                (dval) = (double) __result;                                                                     \
                     40:                (usedval) = 1;                                                                                          \
                     41:        } else {                                                                                                                \
                     42:                (lval) = (long) __result;                                                                       \
                     43:                (usedval) = 0;                                                                                          \
                     44:        }                                                                                                                               \
                     45: } while (0)
                     46: 
                     47: #else
                     48: 
                     49: #define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {              \
                     50:        long   __lres  = (a) * (b);                                                                                     \
                     51:        long double __dres  = (long double)(a) * (long double)(b);                                                      \
                     52:        long double __delta = (long double) __lres - __dres;                                                    \
                     53:        if ( ((usedval) = (( __dres + __delta ) != __dres))) {                          \
                     54:                (dval) = __dres;                                                                                                \
                     55:        } else {                                                                                                                        \
                     56:                (lval) = __lres;                                                                                                \
                     57:        }                                                                                                                                       \
                     58: } while (0)
                     59: 
                     60: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>