@@ -2359,6 +2359,16 @@ encode %{
2359
2359
__ mv(tmp, (address)markWord::unused_mark().value());
2360
2360
__ sd(tmp, Address(box, BasicLock::displaced_header_offset_in_bytes()));
2361
2361
2362
+ __ beqz(flag, cont); // CAS success means locking succeeded
2363
+
2364
+ __ bne(flag, xthread, cont); // Check for recursive locking
2365
+
2366
+ // Recursive lock case
2367
+ __ mv(flag, zr);
2368
+ __ ld(tmp, Address(disp_hdr, ObjectMonitor::recursions_offset_in_bytes() - markWord::monitor_value));
2369
+ __ add(tmp, tmp, 1u);
2370
+ __ sd(tmp, Address(disp_hdr, ObjectMonitor::recursions_offset_in_bytes() - markWord::monitor_value));
2371
+
2362
2372
__ bind(cont);
2363
2373
%}
2364
2374
@@ -2404,10 +2414,19 @@ encode %{
2404
2414
__ add(tmp, tmp, -(int)markWord::monitor_value); // monitor
2405
2415
__ ld(flag, Address(tmp, ObjectMonitor::owner_offset_in_bytes()));
2406
2416
__ ld(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset_in_bytes()));
2417
+
2418
+ Label notRecursive;
2407
2419
__ xorr(flag, flag, xthread); // Will be 0 if we are the owner.
2408
- __ orr(flag, flag, disp_hdr); // Will be 0 if there are 0 recursions
2409
2420
__ bnez(flag, cont);
2410
2421
2422
+ __ beqz(disp_hdr, notRecursive); // Will be 0 if not recursive.
2423
+
2424
+ // Recursive lock
2425
+ __ addi(disp_hdr, disp_hdr, -1);
2426
+ __ sd(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset_in_bytes()));
2427
+ __ j(cont);
2428
+
2429
+ __ bind(notRecursive);
2411
2430
__ ld(flag, Address(tmp, ObjectMonitor::EntryList_offset_in_bytes()));
2412
2431
__ ld(disp_hdr, Address(tmp, ObjectMonitor::cxq_offset_in_bytes()));
2413
2432
__ orr(flag, flag, disp_hdr); // Will be 0 if both are 0.
0 commit comments