[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