< 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 >