diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-06-06 01:57:19 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-06-06 01:57:19 +0300 |
commit | 18bc3afdcbd515dd43c8c207a2d3e56b0cd07220 (patch) | |
tree | ba8c2817c0da246be7c2c826bf0950edda2fb4c2 | |
parent | 5de306ccd3c6a53ee0750436f23930598bc84dba (diff) | |
download | php-git-18bc3afdcbd515dd43c8c207a2d3e56b0cd07220.tar.gz |
Micro-optimizations
-rw-r--r-- | Zend/zend_alloc.c | 13 | ||||
-rw-r--r-- | Zend/zend_multiply.h | 32 |
2 files changed, 31 insertions, 14 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 30f98ff50c..b9cea3eb9b 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2569,13 +2569,13 @@ ZEND_API void* ZEND_FASTCALL _safe_realloc(void *ptr, size_t nmemb, size_t size, return perealloc(ptr, zend_safe_address_guarded(nmemb, size, offset), 1); } - ZEND_API void* ZEND_FASTCALL _ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) { void *p; - p = _safe_emalloc(nmemb, size, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - memset(p, 0, size * nmemb); + size = zend_safe_address_guarded(nmemb, size, 0); + p = emalloc_rel(size); + memset(p, 0, size); return p; } @@ -2904,8 +2904,11 @@ ZEND_API void * __zend_malloc(size_t len) ZEND_API void * __zend_calloc(size_t nmemb, size_t len) { - void *tmp = _safe_malloc(nmemb, len, 0); - memset(tmp, 0, nmemb * len); + void *tmp; + + len = zend_safe_address_guarded(nmemb, len, 0); + tmp = __zend_malloc(len); + memset(tmp, 0, len); return tmp; } diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h index 26853a3cbf..fe045a3185 100644 --- a/Zend/zend_multiply.h +++ b/Zend/zend_multiply.h @@ -161,11 +161,18 @@ static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, si size_t res = nmemb; size_t m_overflow = 0; - __asm__ ("mull %3\n\taddl %4,%0\n\tadcl $0,%1" + if (ZEND_CONST_COND(offset == 0, 0)) { + __asm__ ("mull %3\n\tadcl $0,%1" + : "=&a"(res), "=&d" (m_overflow) + : "%0"(res), + "rm"(size)); + } else { + __asm__ ("mull %3\n\taddl %4,%0\n\tadcl $0,%1" : "=&a"(res), "=&d" (m_overflow) : "%0"(res), "rm"(size), "rm"(offset)); + } if (UNEXPECTED(m_overflow)) { *overflow = 1; @@ -188,14 +195,21 @@ static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, si # define LP_SUFF "q" #endif - __asm__ ("mul" LP_SUFF " %3\n\t" - "add %4,%0\n\t" - "adc $0,%1" - : "=&a"(res), "=&d" (m_overflow) - : "%0"(res), - "rm"(size), - "rm"(offset)); - + if (ZEND_CONST_COND(offset == 0, 0)) { + __asm__ ("mul" LP_SUFF " %3\n\t" + "adc $0,%1" + : "=&a"(res), "=&d" (m_overflow) + : "%0"(res), + "rm"(size)); + } else { + __asm__ ("mul" LP_SUFF " %3\n\t" + "add %4,%0\n\t" + "adc $0,%1" + : "=&a"(res), "=&d" (m_overflow) + : "%0"(res), + "rm"(size), + "rm"(offset)); + } #undef LP_SUFF if (UNEXPECTED(m_overflow)) { *overflow = 1; |