< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page
rev 50904 : 8205523: Explicit barriers for interpreter
rev 50905 : [mq]: JDK-8205523-01-x86.patch


4338 // Note: monitorenter & exit are symmetric routines; which is reflected
4339 //       in the assembly code structure as well
4340 //
4341 // Stack layout:
4342 //
4343 // [expressions  ] <--- rsp               = expression stack top
4344 // ..
4345 // [expressions  ]
4346 // [monitor entry] <--- monitor block top = expression stack bot
4347 // ..
4348 // [monitor entry]
4349 // [frame data   ] <--- monitor block bot
4350 // ...
4351 // [saved rbp    ] <--- rbp
4352 void TemplateTable::monitorenter() {
4353   transition(atos, vtos);
4354 
4355   // check for NULL object
4356   __ null_check(rax);
4357 
4358   __ resolve_for_write(OOP_NOT_NULL, rax);
4359 
4360   const Address monitor_block_top(
4361         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
4362   const Address monitor_block_bot(
4363         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
4364   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
4365 
4366   Label allocated;
4367 
4368   Register rtop = LP64_ONLY(c_rarg3) NOT_LP64(rcx);
4369   Register rbot = LP64_ONLY(c_rarg2) NOT_LP64(rbx);
4370   Register rmon = LP64_ONLY(c_rarg1) NOT_LP64(rdx);
4371 
4372   // initialize entry pointer
4373   __ xorl(rmon, rmon); // points to free slot or NULL
4374 
4375   // find a free slot in the monitor block (result in rmon)
4376   {
4377     Label entry, loop, exit;
4378     __ movptr(rtop, monitor_block_top); // points to current entry,


4437 
4438   // store object
4439   __ movptr(Address(rmon, BasicObjectLock::obj_offset_in_bytes()), rax);
4440   __ lock_object(rmon);
4441 
4442   // check to make sure this monitor doesn't cause stack overflow after locking
4443   __ save_bcp();  // in case of exception
4444   __ generate_stack_overflow_check(0);
4445 
4446   // The bcp has already been incremented. Just need to dispatch to
4447   // next instruction.
4448   __ dispatch_next(vtos);
4449 }
4450 
4451 void TemplateTable::monitorexit() {
4452   transition(atos, vtos);
4453 
4454   // check for NULL object
4455   __ null_check(rax);
4456 
4457   __ resolve_for_write(OOP_NOT_NULL, rax);
4458 
4459   const Address monitor_block_top(
4460         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
4461   const Address monitor_block_bot(
4462         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
4463   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
4464 
4465   Register rtop = LP64_ONLY(c_rarg1) NOT_LP64(rdx);
4466   Register rbot = LP64_ONLY(c_rarg2) NOT_LP64(rbx);
4467 
4468   Label found;
4469 
4470   // find matching slot
4471   {
4472     Label entry, loop;
4473     __ movptr(rtop, monitor_block_top); // points to current entry,
4474                                         // starting with top-most entry
4475     __ lea(rbot, monitor_block_bot);    // points to word before bottom
4476                                         // of monitor block
4477     __ jmpb(entry);




4338 // Note: monitorenter & exit are symmetric routines; which is reflected
4339 //       in the assembly code structure as well
4340 //
4341 // Stack layout:
4342 //
4343 // [expressions  ] <--- rsp               = expression stack top
4344 // ..
4345 // [expressions  ]
4346 // [monitor entry] <--- monitor block top = expression stack bot
4347 // ..
4348 // [monitor entry]
4349 // [frame data   ] <--- monitor block bot
4350 // ...
4351 // [saved rbp    ] <--- rbp
4352 void TemplateTable::monitorenter() {
4353   transition(atos, vtos);
4354 
4355   // check for NULL object
4356   __ null_check(rax);
4357 
4358   __ resolve(IS_NOT_NULL, rax);
4359 
4360   const Address monitor_block_top(
4361         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
4362   const Address monitor_block_bot(
4363         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
4364   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
4365 
4366   Label allocated;
4367 
4368   Register rtop = LP64_ONLY(c_rarg3) NOT_LP64(rcx);
4369   Register rbot = LP64_ONLY(c_rarg2) NOT_LP64(rbx);
4370   Register rmon = LP64_ONLY(c_rarg1) NOT_LP64(rdx);
4371 
4372   // initialize entry pointer
4373   __ xorl(rmon, rmon); // points to free slot or NULL
4374 
4375   // find a free slot in the monitor block (result in rmon)
4376   {
4377     Label entry, loop, exit;
4378     __ movptr(rtop, monitor_block_top); // points to current entry,


4437 
4438   // store object
4439   __ movptr(Address(rmon, BasicObjectLock::obj_offset_in_bytes()), rax);
4440   __ lock_object(rmon);
4441 
4442   // check to make sure this monitor doesn't cause stack overflow after locking
4443   __ save_bcp();  // in case of exception
4444   __ generate_stack_overflow_check(0);
4445 
4446   // The bcp has already been incremented. Just need to dispatch to
4447   // next instruction.
4448   __ dispatch_next(vtos);
4449 }
4450 
4451 void TemplateTable::monitorexit() {
4452   transition(atos, vtos);
4453 
4454   // check for NULL object
4455   __ null_check(rax);
4456 
4457   __ resolve(IS_NOT_NULL, rax);
4458 
4459   const Address monitor_block_top(
4460         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
4461   const Address monitor_block_bot(
4462         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
4463   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
4464 
4465   Register rtop = LP64_ONLY(c_rarg1) NOT_LP64(rdx);
4466   Register rbot = LP64_ONLY(c_rarg2) NOT_LP64(rbx);
4467 
4468   Label found;
4469 
4470   // find matching slot
4471   {
4472     Label entry, loop;
4473     __ movptr(rtop, monitor_block_top); // points to current entry,
4474                                         // starting with top-most entry
4475     __ lea(rbot, monitor_block_bot);    // points to word before bottom
4476                                         // of monitor block
4477     __ jmpb(entry);


< prev index next >