diff options
| -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; |
