< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Print this page
*** 5255,25 ***
    }
    if (data == src)
      mov(dst, src);
  }
  
! void  MacroAssembler::decode_heap_oop(Register d, Register s) {
  #ifdef ASSERT
    verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
  #endif
    if (CompressedOops::base() == nullptr) {
      if (CompressedOops::shift() != 0) {
        lsl(d, s, CompressedOops::shift());
      } else if (d != s) {
        mov(d, s);
      }
    } else {
      Label done;
      if (d != s)
        mov(d, s);
!     cbz(s, done);
      add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
      bind(done);
    }
    verify_oop_msg(d, "broken oop in decode_heap_oop");
  }
--- 5255,28 ---
    }
    if (data == src)
      mov(dst, src);
  }
  
! void  MacroAssembler::decode_heap_oop(Register d, Register s, Label* L_null_target) {
  #ifdef ASSERT
    verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
  #endif
    if (CompressedOops::base() == nullptr) {
      if (CompressedOops::shift() != 0) {
        lsl(d, s, CompressedOops::shift());
      } else if (d != s) {
        mov(d, s);
      }
+     if (L_null_target != nullptr) {
+       cbz(d, *L_null_target);
+     }
    } else {
      Label done;
      if (d != s)
        mov(d, s);
!     cbz(d, L_null_target != nullptr ? *L_null_target : done);
      add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
      bind(done);
    }
    verify_oop_msg(d, "broken oop in decode_heap_oop");
  }
< prev index next >