summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-06-06 01:57:19 +0300
committerDmitry Stogov <dmitry@zend.com>2018-06-06 01:57:19 +0300
commit18bc3afdcbd515dd43c8c207a2d3e56b0cd07220 (patch)
treeba8c2817c0da246be7c2c826bf0950edda2fb4c2
parent5de306ccd3c6a53ee0750436f23930598bc84dba (diff)
downloadphp-git-18bc3afdcbd515dd43c8c207a2d3e56b0cd07220.tar.gz
Micro-optimizations
-rw-r--r--Zend/zend_alloc.c13
-rw-r--r--Zend/zend_multiply.h32
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;