diff options
author | Mike Pall <mike> | 2021-05-22 13:31:48 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2021-05-22 13:31:48 +0200 |
commit | 5783ba1bf73c53ca56e64ed0c462c62224f0393c (patch) | |
tree | f9cc610239d7194db6cd6b7ee925bb970a5dadf3 | |
parent | aa7ac6606872e4e21f92400d8491564ace10f259 (diff) | |
download | luajit-5783ba1bf73c53ca56e64ed0c462c62224f0393c.tar.gz luajit-5783ba1bf73c53ca56e64ed0c462c62224f0393c.tar.bz2 luajit-5783ba1bf73c53ca56e64ed0c462c62224f0393c.zip |
DynASM/ARM64: Fix ADRP encoding with absolute address.
Thanks to Dmitry Stogov.
-rw-r--r-- | dynasm/dasm_arm64.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/dynasm/dasm_arm64.h b/dynasm/dasm_arm64.h index 8d1d9a96..d6da4528 100644 --- a/dynasm/dasm_arm64.h +++ b/dynasm/dasm_arm64.h | |||
@@ -473,7 +473,13 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
473 | } | 473 | } |
474 | break; | 474 | break; |
475 | case DASM_REL_A: { | 475 | case DASM_REL_A: { |
476 | ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n) - (ptrdiff_t)cp + 4; | 476 | ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n); |
477 | if ((ins & 0x3000) == 0x3000) { /* ADRP */ | ||
478 | ins &= ~0x1000; | ||
479 | na = (na >> 12) - (((ptrdiff_t)cp - 4) >> 12); | ||
480 | } else { | ||
481 | na = na - (ptrdiff_t)cp + 4; | ||
482 | } | ||
477 | n = (int)na; | 483 | n = (int)na; |
478 | CK((ptrdiff_t)n == na, RANGE_REL); | 484 | CK((ptrdiff_t)n == na, RANGE_REL); |
479 | goto patchrel; | 485 | goto patchrel; |