summaryrefslogtreecommitdiff
path: root/chapter21/src/main/java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-22 10:45:43 -0700
committerCliff Click <cliffc@acm.org>2026-10-22 10:45:43 -0700
commitdbcaebdefff26658debc29cae284ad4aa0da4c65 (patch)
tree27821f9692d7e59bdb22aba855ff577b59fc6fd0 /chapter21/src/main/java
parent7edca9823ec8ef0aed10c88fa07ef969792aab77 (diff)
downloadSimple-dbcaebdefff26658debc29cae284ad4aa0da4c65.tar.gz
Simple-dbcaebdefff26658debc29cae284ad4aa0da4c65.zip
Split out incomplete type analysis
Diffstat (limited to 'chapter21/src/main/java')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java5
1 files changed, 3 insertions, 2 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java
index 1f2b6a37..d4443f4c 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java
@@ -37,8 +37,9 @@ public class TFPARM extends ConstantNode implements MachNode, RIPRelSize {
// opstart of add
int next = opStart + opLen;
int adrp_delta = delta >> 12;
- // patch upper 20 bits via adrp
- enc.patch4(opStart, Arm64.adrp(1, adrp_delta & 0b11, 0b10000, adrp_delta >> 2, rpc));
+ // ADRP splits a signed page offset into two unsigned bit fields.
+ // Mask the high field too, including for an address below this PC.
+ enc.patch4(opStart, Arm64.adrp(1, adrp_delta & 0b11, 0b10000, (adrp_delta >> 2) & 0x7FFFF, rpc));
// low 12 bits via add
enc.patch4(next, Arm64.imm_inst_l(Arm64.OPI_ADD, delta & 0xfff, rpc));
} else {