< prev index next > src/hotspot/cpu/x86/macroAssembler_x86.cpp
Print this page
void MacroAssembler::encode_and_move_klass_not_null(Register dst, Register src) {
BLOCK_COMMENT("encode_and_move_klass_not_null {");
assert_different_registers(src, dst);
if (CompressedKlassPointers::base() != nullptr) {
! movptr(dst, -(intptr_t)CompressedKlassPointers::base());
addq(dst, src);
} else {
movptr(dst, src);
}
if (CompressedKlassPointers::shift() != 0) {
void MacroAssembler::encode_and_move_klass_not_null(Register dst, Register src) {
BLOCK_COMMENT("encode_and_move_klass_not_null {");
assert_different_registers(src, dst);
if (CompressedKlassPointers::base() != nullptr) {
! if (AOTCodeCache::is_on_for_dump()) {
+ movptr(dst, ExternalAddress(CompressedKlassPointers::base_addr()));
+ negq(dst);
+ } else {
+ movptr(dst, -(intptr_t)CompressedKlassPointers::base());
+ }
addq(dst, src);
} else {
movptr(dst, src);
}
if (CompressedKlassPointers::shift() != 0) {
if (CompressedKlassPointers::base() == nullptr &&
CompressedKlassPointers::shift() == 0) {
// The best case scenario is that there is no base or shift. Then it is already
// a pointer that needs nothing but a register rename.
! movl(dst, src);
} else {
if (CompressedKlassPointers::shift() <= Address::times_8) {
if (CompressedKlassPointers::base() != nullptr) {
! movptr(dst, (intptr_t)CompressedKlassPointers::base());
} else {
xorq(dst, dst);
}
if (CompressedKlassPointers::shift() != 0) {
assert(CompressedKlassPointers::shift() == Address::times_8, "klass not aligned on 64bits?");
if (CompressedKlassPointers::base() == nullptr &&
CompressedKlassPointers::shift() == 0) {
// The best case scenario is that there is no base or shift. Then it is already
// a pointer that needs nothing but a register rename.
! movptr(dst, src);
} else {
if (CompressedKlassPointers::shift() <= Address::times_8) {
if (CompressedKlassPointers::base() != nullptr) {
! if (AOTCodeCache::is_on_for_dump()) {
+ movptr(dst, ExternalAddress(CompressedKlassPointers::base_addr()));
+ } else {
+ movptr(dst, (intptr_t)CompressedKlassPointers::base());
+ }
} else {
xorq(dst, dst);
}
if (CompressedKlassPointers::shift() != 0) {
assert(CompressedKlassPointers::shift() == Address::times_8, "klass not aligned on 64bits?");
} else {
addq(dst, src);
}
} else {
if (CompressedKlassPointers::base() != nullptr) {
! const intptr_t base_right_shifted =
! (intptr_t)CompressedKlassPointers::base() >> CompressedKlassPointers::shift();
! movptr(dst, base_right_shifted);
} else {
xorq(dst, dst);
}
addq(dst, src);
shlq(dst, CompressedKlassPointers::shift());
} else {
addq(dst, src);
}
} else {
if (CompressedKlassPointers::base() != nullptr) {
! if (AOTCodeCache::is_on_for_dump()) {
! movptr(dst, ExternalAddress(CompressedKlassPointers::base_addr()));
! shrq(dst, CompressedKlassPointers::shift());
+ } else {
+ const intptr_t base_right_shifted =
+ (intptr_t)CompressedKlassPointers::base() >> CompressedKlassPointers::shift();
+ movptr(dst, base_right_shifted);
+ }
} else {
xorq(dst, dst);
}
addq(dst, src);
shlq(dst, CompressedKlassPointers::shift());
Assembler::cmp_narrow_oop(dst, CompressedKlassPointers::encode(k), rspec);
}
void MacroAssembler::reinit_heapbase() {
if (UseCompressedOops) {
! if (Universe::heap() != nullptr) {
if (CompressedOops::base() == nullptr) {
MacroAssembler::xorptr(r12_heapbase, r12_heapbase);
} else {
mov64(r12_heapbase, (int64_t)CompressedOops::base());
}
} else {
movptr(r12_heapbase, ExternalAddress(CompressedOops::base_addr()));
Assembler::cmp_narrow_oop(dst, CompressedKlassPointers::encode(k), rspec);
}
void MacroAssembler::reinit_heapbase() {
if (UseCompressedOops) {
! if (Universe::heap() != nullptr) { // GC was initialized
if (CompressedOops::base() == nullptr) {
MacroAssembler::xorptr(r12_heapbase, r12_heapbase);
+ } else if (AOTCodeCache::is_on_for_dump()) {
+ movptr(r12_heapbase, ExternalAddress(CompressedOops::base_addr()));
} else {
mov64(r12_heapbase, (int64_t)CompressedOops::base());
}
} else {
movptr(r12_heapbase, ExternalAddress(CompressedOops::base_addr()));
< prev index next >