8341715: PPC64: ObjectMonitor::_owner should be reset unconditionally in nmethod unlocking
Reviewed-by: mdoerr, lucy
This commit is contained in:
parent
fa39e84d64
commit
f9208fadde
@ -2651,7 +2651,19 @@ void MacroAssembler::compiler_fast_lock_object(ConditionRegister flag, Register
|
||||
// flag == NE indicates failure
|
||||
bind(success);
|
||||
inc_held_monitor_count(temp);
|
||||
#ifdef ASSERT
|
||||
// Check that unlocked label is reached with flag == EQ.
|
||||
Label flag_correct;
|
||||
beq(flag, flag_correct);
|
||||
stop("compiler_fast_lock_object: Flag != EQ");
|
||||
#endif
|
||||
bind(failure);
|
||||
#ifdef ASSERT
|
||||
// Check that slow_path label is reached with flag == NE.
|
||||
bne(flag, flag_correct);
|
||||
stop("compiler_fast_lock_object: Flag != NE");
|
||||
bind(flag_correct);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MacroAssembler::compiler_fast_unlock_object(ConditionRegister flag, Register oop, Register box,
|
||||
@ -2701,17 +2713,12 @@ void MacroAssembler::compiler_fast_unlock_object(ConditionRegister flag, Registe
|
||||
bind(object_has_monitor);
|
||||
STATIC_ASSERT(markWord::monitor_value <= INT_MAX);
|
||||
addi(current_header, current_header, -(int)markWord::monitor_value); // monitor
|
||||
ld(temp, in_bytes(ObjectMonitor::owner_offset()), current_header);
|
||||
|
||||
// In case of LM_LIGHTWEIGHT, we may reach here with (temp & ObjectMonitor::ANONYMOUS_OWNER) != 0.
|
||||
// This is handled like owner thread mismatches: We take the slow path.
|
||||
cmpd(flag, temp, R16_thread);
|
||||
bne(flag, failure);
|
||||
|
||||
ld(displaced_header, in_bytes(ObjectMonitor::recursions_offset()), current_header);
|
||||
|
||||
addic_(displaced_header, displaced_header, -1);
|
||||
blt(CCR0, notRecursive); // Not recursive if negative after decrement.
|
||||
|
||||
// Recursive unlock
|
||||
std(displaced_header, in_bytes(ObjectMonitor::recursions_offset()), current_header);
|
||||
if (flag == CCR0) { // Otherwise, flag is already EQ, here.
|
||||
crorc(CCR0, Assembler::equal, CCR0, Assembler::equal); // Set CCR0 EQ
|
||||
@ -2752,7 +2759,19 @@ void MacroAssembler::compiler_fast_unlock_object(ConditionRegister flag, Registe
|
||||
// flag == NE indicates failure
|
||||
bind(success);
|
||||
dec_held_monitor_count(temp);
|
||||
#ifdef ASSERT
|
||||
// Check that unlocked label is reached with flag == EQ.
|
||||
Label flag_correct;
|
||||
beq(flag, flag_correct);
|
||||
stop("compiler_fast_unlock_object: Flag != EQ");
|
||||
#endif
|
||||
bind(failure);
|
||||
#ifdef ASSERT
|
||||
// Check that slow_path label is reached with flag == NE.
|
||||
bne(flag, flag_correct);
|
||||
stop("compiler_fast_unlock_object: Flag != NE");
|
||||
bind(flag_correct);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MacroAssembler::compiler_fast_lock_lightweight_object(ConditionRegister flag, Register obj, Register box,
|
||||
|
Loading…
x
Reference in New Issue
Block a user