Annotation of embedaddon/php/Zend/zend_multiply.h, revision 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>