< prev index next >

src/cpu/aarch64/vm/assembler_aarch64.hpp

Print this page
rev 9227 : 8143067: aarch64: guarantee failure in javac
Summary: Fix adrp going out of range during code relocation
Reviewed-by: duke

@@ -230,10 +230,30 @@
     target &= ~mask;
     target |= uval;
     *(unsigned *)a = target;
   }
 
+#define aarch64_NOP 0xd503201f
+  static void patch_movk(address a, int pos, int msb, int lsb,
+                         unsigned long val, unsigned shift) {
+    address real_a = a + pos;
+
+    // Revert NOP to MOVK
+    if (*(uint32_t*)real_a == aarch64_NOP) {
+      uint32_t patch_val = (0b111100101<<23);
+
+      // Patch shift number.
+      patch_val |= ((shift/16)<<21);
+      // Patch dest register.
+      patch_val |= extract(*(uint32_t *)a, 4, 0);
+
+      *(uint32_t*)real_a = patch_val;
+    }
+
+    patch(real_a, msb, lsb, (val>>shift) & 0xffff);
+  }
+
   void f(unsigned val, int msb, int lsb) {
     int nbits = msb - lsb + 1;
     guarantee(val < (1U << nbits), "Field too big for insn");
     assert_cond(msb >= lsb);
     unsigned mask = (1U << nbits) - 1;
< prev index next >