Add note on ughbletchness of ADRP.
authorTaylor R Campbell <campbell@mumble.net>
Fri, 25 Jan 2019 04:21:09 +0000 (04:21 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 21 Aug 2019 21:34:06 +0000 (21:34 +0000)
src/compiler/machines/aarch64/instr1.scm

index 7a2cda8f24a72b75985d7e7c96c6f418d7b1215c..f55a1ad5e6f76b5cad0fe900e580902e93992093 100644 (file)
@@ -1297,6 +1297,14 @@ USA.
 ;; Macro used for assembling variable-width instructions which can't
 ;; just defer to the variable-width ADR because we prohibit variable
 ;; width within variable width.
+;;
+;; XXX OOPS!  This doesn't actually work, because ADRP actually
+;; computes PC - (PC mod 2^12) + 2^12*offset, not PC + 2^12*offset.
+;; Either we need to know where we are in a page (which can change from
+;; GC to GC because compiled blocks are only float-aligned, not
+;; page-aligned), or we need to generate extra code to find and add PC
+;; mod 2^12, which looks like it'll require another temporary register.
+;; Ugh!
 
 (define-instruction ADRP-ADD
   ((X (? Rd) (@PCO (? offset signed-33)))