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>