< 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


 215     target &= ~mask;
 216     target |= val;
 217     *(unsigned *)a = target;
 218   }
 219 
 220   static void spatch(address a, int msb, int lsb, long val) {
 221     int nbits = msb - lsb + 1;
 222     long chk = val >> (nbits - 1);
 223     guarantee (chk == -1 || chk == 0, "Field too big for insn");
 224     unsigned uval = val;
 225     unsigned mask = (1U << nbits) - 1;
 226     uval &= mask;
 227     uval <<= lsb;
 228     mask <<= lsb;
 229     unsigned target = *(unsigned *)a;
 230     target &= ~mask;
 231     target |= uval;
 232     *(unsigned *)a = target;
 233   }
 234 




















 235   void f(unsigned val, int msb, int lsb) {
 236     int nbits = msb - lsb + 1;
 237     guarantee(val < (1U << nbits), "Field too big for insn");
 238     assert_cond(msb >= lsb);
 239     unsigned mask = (1U << nbits) - 1;
 240     val <<= lsb;
 241     mask <<= lsb;
 242     insn |= val;
 243     assert_cond((bits & mask) == 0);
 244 #ifdef ASSERT
 245     bits |= mask;
 246 #endif
 247   }
 248 
 249   void f(unsigned val, int bit) {
 250     f(val, bit, bit);
 251   }
 252 
 253   void sf(long val, int msb, int lsb) {
 254     int nbits = msb - lsb + 1;




 215     target &= ~mask;
 216     target |= val;
 217     *(unsigned *)a = target;
 218   }
 219 
 220   static void spatch(address a, int msb, int lsb, long val) {
 221     int nbits = msb - lsb + 1;
 222     long chk = val >> (nbits - 1);
 223     guarantee (chk == -1 || chk == 0, "Field too big for insn");
 224     unsigned uval = val;
 225     unsigned mask = (1U << nbits) - 1;
 226     uval &= mask;
 227     uval <<= lsb;
 228     mask <<= lsb;
 229     unsigned target = *(unsigned *)a;
 230     target &= ~mask;
 231     target |= uval;
 232     *(unsigned *)a = target;
 233   }
 234 
 235 #define aarch64_NOP 0xd503201f
 236   static void patch_movk(address a, int pos, int msb, int lsb,
 237                          unsigned long val, unsigned shift) {
 238     address real_a = a + pos;
 239 
 240     // Revert NOP to MOVK
 241     if (*(uint32_t*)real_a == aarch64_NOP) {
 242       uint32_t patch_val = (0b111100101<<23);
 243 
 244       // Patch shift number.
 245       patch_val |= ((shift/16)<<21);
 246       // Patch dest register.
 247       patch_val |= extract(*(uint32_t *)a, 4, 0);
 248 
 249       *(uint32_t*)real_a = patch_val;
 250     }
 251 
 252     patch(real_a, msb, lsb, (val>>shift) & 0xffff);
 253   }
 254 
 255   void f(unsigned val, int msb, int lsb) {
 256     int nbits = msb - lsb + 1;
 257     guarantee(val < (1U << nbits), "Field too big for insn");
 258     assert_cond(msb >= lsb);
 259     unsigned mask = (1U << nbits) - 1;
 260     val <<= lsb;
 261     mask <<= lsb;
 262     insn |= val;
 263     assert_cond((bits & mask) == 0);
 264 #ifdef ASSERT
 265     bits |= mask;
 266 #endif
 267   }
 268 
 269   void f(unsigned val, int bit) {
 270     f(val, bit, bit);
 271   }
 272 
 273   void sf(long val, int msb, int lsb) {
 274     int nbits = msb - lsb + 1;


< prev index next >