Skip to content

Instantly share code, notes, and snippets.

@rednaxelafx
Created March 30, 2012 09:47
Show Gist options
  • Save rednaxelafx/2250418 to your computer and use it in GitHub Desktop.
Save rednaxelafx/2250418 to your computer and use it in GitHub Desktop.
Incorrect comments in fast-path lightweight unlocking code in the interpreter. Diff against current jdk8/jdk8/hotspot
diff -r 39e5c6153285 src/cpu/x86/vm/interp_masm_x86_32.cpp
--- a/src/cpu/x86/vm/interp_masm_x86_32.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/interp_masm_x86_32.cpp Fri Mar 30 17:44:51 2012 +0800
@@ -782,7 +782,7 @@
if (os::is_MP()) lock();
cmpxchgptr(header_reg, Address(obj_reg, 0));
- // zero for recursive case
+ // zero for successful CAS
jcc(Assembler::zero, done);
// Call the runtime routine for slow case.
diff -r 39e5c6153285 src/cpu/x86/vm/interp_masm_x86_64.cpp
--- a/src/cpu/x86/vm/interp_masm_x86_64.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/interp_masm_x86_64.cpp Fri Mar 30 17:44:51 2012 +0800
@@ -794,7 +794,7 @@
if (os::is_MP()) lock();
cmpxchgptr(header_reg, Address(obj_reg, 0));
- // zero for recursive case
+ // zero for successful CAS
jcc(Assembler::zero, done);
// Call the runtime routine for slow case.
diff -r 39e5c6153285 src/cpu/x86/vm/frame_x86.hpp
--- a/src/cpu/x86/vm/frame_x86.hpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/frame_x86.hpp Fri Mar 30 20:46:04 2012 +0800
@@ -35,22 +35,22 @@
// A frame is comprised of {pc, fp, sp}
// ------------------------------ Asm interpreter ----------------------------------------
// Layout of asm interpreter frame:
-// [expression stack ] * <- sp
-// [monitors ] \
-// ... | monitor block size
-// [monitors ] /
-// [monitor block size ]
-// [byte code index/pointr] = bcx() bcx_offset
-// [pointer to locals ] = locals() locals_offset
-// [constant pool cache ] = cache() cache_offset
-// [methodData ] = mdp() mdx_offset
-// [methodOop ] = method() method_offset
-// [last sp ] = last_sp() last_sp_offset
-// [old stack pointer ] (sender_sp) sender_sp_offset
-// [old frame pointer ] <- fp = link()
-// [return pc ]
-// [oop temp ] (only for native calls)
-// [locals and parameters ]
+// [expression stack ] * <- sp
+// [monitors ] \ <- monitor_block_top == expression stack bottom
+// ... | monitor block size
+// [monitors ] /
+// [pointer to monitor block top ] <- monitor_block_bottom = monitor_end() monitor_block_top_offset
+// [byte code index/pointer ] = bcx() bcx_offset
+// [pointer to locals ] = locals() locals_offset
+// [constant pool cache ] = cache() cache_offset
+// [methodData ] = mdp() mdx_offset
+// [methodOop ] = method() method_offset
+// [last sp ] = last_sp() last_sp_offset
+// [old stack pointer ] (sender_sp) sender_sp_offset
+// [old frame pointer ] <- fp = link()
+// [return pc ]
+// [oop temp ] (only for native calls)
+// [locals and parameters ]
// <- sender sp
// ------------------------------ Asm interpreter ----------------------------------------
diff -r 39e5c6153285 src/cpu/x86/vm/interp_masm_x86_32.cpp
--- a/src/cpu/x86/vm/interp_masm_x86_32.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/interp_masm_x86_32.cpp Fri Mar 30 20:46:04 2012 +0800
@@ -782,7 +782,7 @@
if (os::is_MP()) lock();
cmpxchgptr(header_reg, Address(obj_reg, 0));
- // zero for recursive case
+ // zero for successful lightweight unlock
jcc(Assembler::zero, done);
// Call the runtime routine for slow case.
diff -r 39e5c6153285 src/cpu/x86/vm/interp_masm_x86_64.cpp
--- a/src/cpu/x86/vm/interp_masm_x86_64.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/interp_masm_x86_64.cpp Fri Mar 30 20:46:04 2012 +0800
@@ -794,7 +794,7 @@
if (os::is_MP()) lock();
cmpxchgptr(header_reg, Address(obj_reg, 0));
- // zero for recursive case
+ // zero for successful lightweight unlock
jcc(Assembler::zero, done);
// Call the runtime routine for slow case.
diff -r 39e5c6153285 src/cpu/x86/vm/templateInterpreter_x86_32.cpp
--- a/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Fri Mar 30 20:46:04 2012 +0800
@@ -1625,12 +1625,12 @@
#endif
interpreter_frame->interpreter_frame_set_locals(locals);
- BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin();
- BasicObjectLock* monbot = montop - moncount;
- interpreter_frame->interpreter_frame_set_monitor_end(monbot);
+ BasicObjectLock* monbot = interpreter_frame->interpreter_frame_monitor_begin();
+ BasicObjectLock* montop = monbot - moncount;
+ interpreter_frame->interpreter_frame_set_monitor_end(montop);
// Set last_sp
- intptr_t* rsp = (intptr_t*) monbot -
+ intptr_t* rsp = (intptr_t*) montop -
tempcount*Interpreter::stackElementWords -
popframe_extra_args;
interpreter_frame->interpreter_frame_set_last_sp(rsp);
diff -r 39e5c6153285 src/cpu/x86/vm/templateInterpreter_x86_64.cpp
--- a/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Fri Mar 30 20:46:04 2012 +0800
@@ -1637,12 +1637,12 @@
#endif
interpreter_frame->interpreter_frame_set_locals(locals);
- BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin();
- BasicObjectLock* monbot = montop - moncount;
- interpreter_frame->interpreter_frame_set_monitor_end(monbot);
+ BasicObjectLock* monbot = interpreter_frame->interpreter_frame_monitor_begin();
+ BasicObjectLock* montop = monbot - moncount;
+ interpreter_frame->interpreter_frame_set_monitor_end(montop);
// Set last_sp
- intptr_t* esp = (intptr_t*) monbot -
+ intptr_t* esp = (intptr_t*) montop -
tempcount*Interpreter::stackElementWords -
popframe_extra_args;
interpreter_frame->interpreter_frame_set_last_sp(esp);
diff -r 39e5c6153285 src/cpu/x86/vm/templateTable_x86_32.cpp
--- a/src/cpu/x86/vm/templateTable_x86_32.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/templateTable_x86_32.cpp Fri Mar 30 20:46:04 2012 +0800
@@ -3512,7 +3512,9 @@
// check for NULL object
__ null_check(rax);
+ // address of pointer to monitor block top
const Address monitor_block_top(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
+ // address of monitor block bottom
const Address monitor_block_bot(rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
const int entry_size = ( frame::interpreter_frame_monitor_size() * wordSize);
Label allocated;
@@ -3545,11 +3547,11 @@
// allocate one if there's no free slot
{ Label entry, loop;
// 1. compute new pointers // rsp: old expression stack top
- __ movptr(rdx, monitor_block_bot); // rdx: old expression stack bottom
+ __ movptr(rdx, monitor_block_top); // rdx: old expression stack bottom
__ subptr(rsp, entry_size); // move expression stack top
- __ subptr(rdx, entry_size); // move expression stack bottom
+ __ subptr(rdx, entry_size); // calculate new expression stack bottom
__ mov(rcx, rsp); // set start value for copy loop
- __ movptr(monitor_block_bot, rdx); // set new monitor block top
+ __ movptr(monitor_block_top, rdx); // set new monitor block top / expression stack bottom
__ jmp(entry);
// 2. move expression stack contents
__ bind(loop);
diff -r 39e5c6153285 src/cpu/x86/vm/templateTable_x86_64.cpp
--- a/src/cpu/x86/vm/templateTable_x86_64.cpp Thu Mar 29 13:02:11 2012 -0700
+++ b/src/cpu/x86/vm/templateTable_x86_64.cpp Fri Mar 30 20:46:04 2012 +0800
@@ -3559,8 +3559,10 @@
// check for NULL object
__ null_check(rax);
+ // address of pointer to monitor block top
const Address monitor_block_top(
rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
+ // address of monitor block bottom
const Address monitor_block_bot(
rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
@@ -3605,11 +3607,11 @@
{
Label entry, loop;
// 1. compute new pointers // rsp: old expression stack top
- __ movptr(c_rarg1, monitor_block_bot); // c_rarg1: old expression stack bottom
+ __ movptr(c_rarg1, monitor_block_top); // c_rarg1: old expression stack bottom
__ subptr(rsp, entry_size); // move expression stack top
- __ subptr(c_rarg1, entry_size); // move expression stack bottom
+ __ subptr(c_rarg1, entry_size); // calculate new expression stack bottom
__ mov(c_rarg3, rsp); // set start value for copy loop
- __ movptr(monitor_block_bot, c_rarg1); // set new monitor block bottom
+ __ movptr(monitor_block_top, c_rarg1); // set new monitor block top / expression stack bottom
__ jmp(entry);
// 2. move expression stack contents
__ bind(loop);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment