[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-cvs
Subject:    [PHP-CVS] [php-src] jit-arm64: Imroved code for constants loading
From:       Dmitry Stogov <noreply () php ! net>
Date:       2021-04-30 14:44:55
Message-ID: cWCkk0pTt9nAgIHvqPgwdaxCNppUYebeiuZ8W7g0 () main ! php ! net
[Download RAW message or body]

Author: Dmitry Stogov (dstogov)
Date: 2021-04-30T17:44:23+03:00

Commit: https://github.com/php/php-src/commit/f81f8f5aefe4f0ae0eee55fa4868b8a04b94d6e2
Raw diff: https://github.com/php/php-src/commit/f81f8f5aefe4f0ae0eee55fa4868b8a04b94d6e2.diff

Imroved code for constants loading

Changed paths:
  M  ext/opcache/jit/zend_jit_arm64.dasc


Diff:

diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc
index 549e61f030d4..66042b2afe4a 100644
--- a/ext/opcache/jit/zend_jit_arm64.dasc
+++ b/ext/opcache/jit/zend_jit_arm64.dasc
@@ -201,29 +201,75 @@ static int logical_immediate_p (uint64_t value, uint32_t reg_size)
 
 |.macro LOAD_ADDR, reg, addr
 |	// 48-bit virtual address
-|	mov reg, #((uintptr_t)(addr) & 0xffff)
-|	movk reg, #(((uintptr_t)(addr) >> 16) & 0xffff), lsl #16
-|	movk reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
+||	if (((uintptr_t)(addr)) == 0) {
+|		mov reg, xzr
+||	} else if (((uintptr_t)(addr)) <= MOVZ_IMM) {
+| 		movz reg, #((uint64_t)(addr))
+||	} else if ((uintptr_t)(addr) & 0xffff) {
+|		movz reg, #((uintptr_t)(addr) & 0xffff)
+||		if (((uintptr_t)(addr) >> 16) & 0xffff) {
+|			movk reg, #(((uintptr_t)(addr) >> 16) & 0xffff), lsl #16
+||		}
+||		if (((uintptr_t)(addr) >> 32) & 0xffff) {
+|			movk reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
+||		}
+||	} else if (((uintptr_t)(addr) >> 16) & 0xffff) {
+|		movz reg, #(((uintptr_t)(addr) >> 16) & 0xffff), lsl #16
+||		if (((uintptr_t)(addr) >> 32) & 0xffff) {
+|			movk reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
+||		}
+||	} else {
+|		movz reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
+||	}
 |.endmacro
 
 // Type cast to unsigned is used to avoid undefined behavior.
 |.macro LOAD_32BIT_VAL, reg, val
-||	if (((uintptr_t)(val)) <= MOVZ_IMM) {
-|		movz reg, #val
+||	if (((uint32_t)(val)) <= MOVZ_IMM) {
+|		movz reg, #((uint32_t)(val))
+||	} else if (((uint32_t)(val) & 0xffff)) {
+|		movz reg, #((uint32_t)(val) & 0xffff)
+||		if ((((uint32_t)(val) >> 16) & 0xffff)) {
+|			movk reg, #(((uint32_t)(val) >> 16) & 0xffff), lsl #16
+||		}
 ||	} else {
-|		mov reg, #((uint32_t)(val) & 0xffff)
-|		movk reg, #(((uint32_t)(val) >> 16) & 0xffff), lsl #16
+|		movz reg, #(((uint32_t)(val) >> 16) & 0xffff), lsl #16
 ||	}
 |.endmacro
 
 |.macro LOAD_64BIT_VAL, reg, val
-||	if (((uintptr_t)(val)) <= MOVZ_IMM) {
-|		movz reg, #val
+||	if (((uint64_t)(val)) == 0) {
+|		mov reg, xzr
+||	} else if (((uint64_t)(val)) <= MOVZ_IMM) {
+|		movz reg, #((uint64_t)(val))
+||	} else if (~((uint64_t)(val)) <= MOVZ_IMM) {
+| 		movn reg, #(~((uint64_t)(val)))
+||	} else if ((uint64_t)(val) & 0xffff) {
+|		movz reg, #((uint64_t)(val) & 0xffff)
+||		if (((uint64_t)(val) >> 16) & 0xffff) {
+|			movk reg, #(((uint64_t)(val) >> 16) & 0xffff), lsl #16
+||		}
+||		if (((uint64_t)(val) >> 32) & 0xffff) {
+|			movk reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
+||		}
+||		if ((((uint64_t)(val) >> 48) & 0xffff)) {
+|			movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
+||		}
+||	} else if (((uint64_t)(val) >> 16) & 0xffff) {
+|		movz reg, #(((uint64_t)(val) >> 16) & 0xffff), lsl #16
+||		if (((uint64_t)(val) >> 32) & 0xffff) {
+|			movk reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
+||		}
+||		if ((((uint64_t)(val) >> 48) & 0xffff)) {
+|			movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
+||		}
+||	} else if (((uint64_t)(val) >> 32) & 0xffff) {
+|		movz reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
+||		if ((((uint64_t)(val) >> 48) & 0xffff)) {
+|			movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
+||		}
 ||	} else {
-|		mov reg, #((uint64_t)(val) & 0xffff)
-|		movk reg, #(((uint64_t)(val) >> 16) & 0xffff), lsl #16
-|		movk reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
-|		movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
+|		movz reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
 ||	}
 |.endmacro
 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic