Skip to content

Commit b5cd7ef

Browse files
xmas92TheRealMDoerr
andcommittedMar 4, 2024
8319901: Recursive lightweight locking: ppc64le implementation
Co-authored-by: Martin Doerr <mdoerr@openjdk.org> Reviewed-by: mdoerr, rrich
1 parent 0583f73 commit b5cd7ef

9 files changed

+444
-100
lines changed
 

‎src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp

-3
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,6 @@ void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rb
155155
verify_oop(Roop, FILE_AND_LINE);
156156

157157
if (LockingMode == LM_LIGHTWEIGHT) {
158-
ld(Rmark, oopDesc::mark_offset_in_bytes(), Roop);
159-
andi_(R0, Rmark, markWord::monitor_value);
160-
bne(CCR0, slow_int);
161158
lightweight_unlock(Roop, Rmark, slow_int);
162159
} else if (LockingMode == LM_LEGACY) {
163160
// Check if it is still a light weight lock, this is is true if we see

‎src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@
3636
#endif
3737
#define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
3838

39+
40+
void C2_MacroAssembler::fast_lock_lightweight(ConditionRegister flag, Register obj, Register box,
41+
Register tmp1, Register tmp2, Register tmp3) {
42+
compiler_fast_lock_lightweight_object(flag, obj, tmp1, tmp2, tmp3);
43+
}
44+
45+
void C2_MacroAssembler::fast_unlock_lightweight(ConditionRegister flag, Register obj, Register box,
46+
Register tmp1, Register tmp2, Register tmp3) {
47+
compiler_fast_unlock_lightweight_object(flag, obj, tmp1, tmp2, tmp3);
48+
}
49+
3950
// Intrinsics for CompactStrings
4051

4152
// Compress char[] to byte[] by compressing 16 bytes at once.

‎src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
// C2_MacroAssembler contains high-level macros for C2
2929

3030
public:
31+
// Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in .ad file.
32+
void fast_lock_lightweight(ConditionRegister flag, Register obj, Register box,
33+
Register tmp1, Register tmp2, Register tmp3);
34+
void fast_unlock_lightweight(ConditionRegister flag, Register obj, Register box,
35+
Register tmp1, Register tmp2, Register tmp3);
36+
3137
// Intrinsics for CompactStrings
3238
// Compress char[] to byte[] by compressing 16 bytes at once.
3339
void string_compress_16(Register src, Register dst, Register cnt,

‎src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp

+3-20
Original file line numberDiff line numberDiff line change
@@ -970,9 +970,6 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) {
970970

971971
// markWord displaced_header = obj->mark().set_unlocked();
972972

973-
// Load markWord from object into header.
974-
ld(header, oopDesc::mark_offset_in_bytes(), object);
975-
976973
if (DiagnoseSyncOnValueBasedClasses != 0) {
977974
load_klass(tmp, object);
978975
lwz(tmp, in_bytes(Klass::access_flags_offset()), tmp);
@@ -981,9 +978,11 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) {
981978
}
982979

983980
if (LockingMode == LM_LIGHTWEIGHT) {
984-
lightweight_lock(object, /* mark word */ header, tmp, slow_case);
981+
lightweight_lock(object, header, tmp, slow_case);
985982
b(count_locking);
986983
} else if (LockingMode == LM_LEGACY) {
984+
// Load markWord from object into header.
985+
ld(header, oopDesc::mark_offset_in_bytes(), object);
987986

988987
// Set displaced_header to be (markWord of object | UNLOCK_VALUE).
989988
ori(header, header, markWord::unlocked_value);
@@ -1115,22 +1114,6 @@ void InterpreterMacroAssembler::unlock_object(Register monitor) {
11151114
ld(object, in_bytes(BasicObjectLock::obj_offset()), monitor);
11161115

11171116
if (LockingMode == LM_LIGHTWEIGHT) {
1118-
// Check for non-symmetric locking. This is allowed by the spec and the interpreter
1119-
// must handle it.
1120-
Register tmp = current_header;
1121-
// First check for lock-stack underflow.
1122-
lwz(tmp, in_bytes(JavaThread::lock_stack_top_offset()), R16_thread);
1123-
cmplwi(CCR0, tmp, (unsigned)LockStack::start_offset());
1124-
ble(CCR0, slow_case);
1125-
// Then check if the top of the lock-stack matches the unlocked object.
1126-
addi(tmp, tmp, -oopSize);
1127-
ldx(tmp, tmp, R16_thread);
1128-
cmpd(CCR0, tmp, object);
1129-
bne(CCR0, slow_case);
1130-
1131-
ld(header, oopDesc::mark_offset_in_bytes(), object);
1132-
andi_(R0, header, markWord::monitor_value);
1133-
bne(CCR0, slow_case);
11341117
lightweight_unlock(object, header, slow_case);
11351118
} else {
11361119
addi(object_mark_addr, object, oopDesc::mark_offset_in_bytes());

0 commit comments

Comments
 (0)
Please sign in to comment.