Fix scaling of PC offsets: they're byte offsets, not word offsets.
authorTaylor R Campbell <campbell@mumble.net>
Sat, 19 Jan 2019 23:57:08 +0000 (23:57 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 21 Aug 2019 21:34:04 +0000 (21:34 +0000)
src/microcode/cmpintmd/aarch64.c
src/microcode/cmpintmd/aarch64.h

index 6bf4bfc88946db0f3ac736438ccb9b930d9df90b..db565c8124d5be8c7eca1a8fa0609b97a4f0428c 100644 (file)
@@ -183,7 +183,7 @@ skip_compiled_closure_padding (insn_t * start)
 SCHEME_OBJECT
 compiled_closure_entry_to_target (insn_t * entry)
 {
-  return (MAKE_CC_ENTRY (entry + (((int64_t *) entry)[-1])));
+  return (MAKE_CC_ENTRY (CC_ENTRY_ADDRESS_PC (entry)));
 }
 \f
 /* Execution caches (UUO links)
index cae5abf0f8e674f7a059b37cf90d138c9ddedafb..2e9c232af9db1601fe4d01068a7f9c2f5001be9f 100644 (file)
@@ -182,16 +182,19 @@ struct cc_entry
 /* We don't put GC trap code before an entry any more.  */
 #define CC_ENTRY_GC_TRAP_SIZE 0
 
-/* A compiled entry address points to _after_ the PC offset that, when
-   added to the entry address, gives the address of instructions for
-   the CPU to execute.
+/* A compiled entry address points to _after_ the PC byte offset that,
+   when added to the entry address, gives the address of instructions
+   for the CPU to execute.
 
-   XXX This is suboptimal because aarch64 does not have immediate
-   negative load offsets, but putting the offset after the label causes
-   other annoying issues.  */
+  PC offset is in units of bytes, not instruction words.  Since it's 64
+  bits, there's no advantage to using units of words.  There's no
+  disadvantage either, except that we'd have to update all the code
+  that assumes byte offsets rather than word (or object) offsets to
+  scale them appropriately.  */
 
 #define CC_ENTRY_ADDRESS_PTR(e)                (e)
-#define CC_ENTRY_ADDRESS_PC(e)         ((e) + (((const int64_t *) (e))[-1]))
+#define CC_ENTRY_ADDRESS_PC(e)                 \
+  ((insn_t *) (((char *) (e)) + (((const int64_t *) (e))[-1])))
 
 /* A compiled return address points to a jump instruction that jumps to
    the continuation's body.  */