com php-src: Fix bug #64729: compilation failure on x32: Zend/zend_alloc.c Zend/zend_multiply.h
| From: | Gustavo André dos Santos Lopes | Date: | Tue, 30 Apr 2013 17:28:24 +0000 |
| Subject: | com php-src: Fix bug #64729: compilation failure on x32: Zend/zend_alloc.c Zend/zend_multiply.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-72073@lists.php.net to get a copy of this message | ||
Commit: 514afd67b651bea834bdb84b7685b48e9e56ac21
Author: Gustavo Lopes <glopes@nebm.ist.utl.pt> Tue, 30 Apr 2013 19:00:31 +0200
Parents: 4a92ae34011ad2246500f27469f378b66d832976
Branches: PHP-5.4 PHP-5.5 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=514afd67b651bea834bdb84b7685b48e9e56ac21
Log:
Fix bug #64729: compilation failure on x32
Bugs:
https://bugs.php.net/64729
Changed paths:
M Zend/zend_alloc.c
M Zend/zend_multiply.h
Diff:
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 605e396..0bbd59a 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -672,7 +672,7 @@ static inline unsigned int zend_mm_high_bit(size_t _size)
#elif defined(__GNUC__) && defined(__x86_64__)
unsigned long n;
- __asm__("bsrq %1,%0\n\t" : "=r" (n) : "rm" (_size));
+ __asm__("bsr %1,%0\n\t" : "=r" (n) : "rm" (_size));
return (unsigned int)n;
#elif defined(_MSC_VER) && defined(_M_IX86)
__asm {
@@ -698,12 +698,12 @@ static inline unsigned int zend_mm_low_bit(size_t _size)
#elif defined(__GNUC__) && defined(__x86_64__)
unsigned long n;
- __asm__("bsfq %1,%0\n\t" : "=r" (n) : "rm" (_size));
+ __asm__("bsf %1,%0\n\t" : "=r" (n) : "rm" (_size));
return (unsigned int)n;
#elif defined(_MSC_VER) && defined(_M_IX86)
__asm {
bsf eax, _size
- }
+ }
#else
static const int offset[16] = {4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};
unsigned int n;
@@ -2481,12 +2481,22 @@ static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)
size_t res = nmemb;
unsigned long overflow = 0;
- __asm__ ("mulq %3\n\taddq %4,%0\n\tadcq %1,%1"
+#ifdef __ILP32__ /* x32 */
+# define LP_SUFF "l"
+#else /* amd64 */
+# define LP_SUFF "q"
+#endif
+
+ __asm__ ("mul" LP_SUFF " %3\n\t"
+ "add %4,%0\n\t"
+ "adc %1,%1"
: "=&a"(res), "=&d" (overflow)
: "%0"(res),
"rm"(size),
"rm"(offset));
+#undef LP_SUFF
+
if (UNEXPECTED(overflow)) {
zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation
(%zu * %zu + %zu)", nmemb, size, offset);
return 0;
diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
index c3c9657..092d3cd 100644
--- a/Zend/zend_multiply.h
+++ b/Zend/zend_multiply.h
@@ -35,8 +35,8 @@
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
long __tmpvar; \
- __asm__ ("imulq %3,%0\n" \
- "adcq $0,%1" \
+ __asm__ ("imul %3,%0\n" \
+ "adc $0,%1" \
: "=r"(__tmpvar),"=r"(usedval) \
: "0"(a), "r"(b), "1"(0)); \
if (usedval) (dval) = (double) (a) * (double) (b); \