< prev index next >
src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp
Print this page
*** 60,69 ****
--- 60,73 ----
// Load object header
movptr(hdr, Address(obj, hdr_offset));
// and mark it as unlocked
orptr(hdr, markOopDesc::unlocked_value);
+ if (EnableValhalla && !UseBiasedLocking) {
+ // Mask always_locked bit such that we go to the slow path if object is a value type
+ andptr(hdr, ~markOopDesc::biased_lock_bit_in_place);
+ }
// save unlocked object header into the displaced header location on the stack
movptr(Address(disp_hdr, 0), hdr);
// test if object header is still the same (i.e. unlocked), and if so, store the
// displaced header address in the object header - if it is not the same, get the
// object header instead
*** 148,158 ****
}
void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
assert_different_registers(obj, klass, len);
! if (UseBiasedLocking && !len->is_valid()) {
assert_different_registers(obj, klass, len, t1, t2);
movptr(t1, Address(klass, Klass::prototype_header_offset()));
movptr(Address(obj, oopDesc::mark_offset_in_bytes()), t1);
} else {
// This assumes that all prototype bits fit in an int32_t
--- 152,163 ----
}
void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
assert_different_registers(obj, klass, len);
! if ((UseBiasedLocking || EnableValhalla) && !len->is_valid()) {
! // Need to copy markOopDesc::always_locked_pattern for values.
assert_different_registers(obj, klass, len, t1, t2);
movptr(t1, Address(klass, Klass::prototype_header_offset()));
movptr(Address(obj, oopDesc::mark_offset_in_bytes()), t1);
} else {
// This assumes that all prototype bits fit in an int32_t
< prev index next >