< 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,239 **** --- 230,259 ---- 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 >