521 // and safer anyway in case of JSR292 adaptations.
522
523 __ pop(rax); // return address must be moved if SP is changed
524 __ mov(rsp, rsi);
525 __ push(rax);
526
527 // Note: the restored frame is not necessarily interpreted.
528 // Use the shared runtime version of the StackOverflowError.
529 assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "stub not yet generated");
530 __ jump(ExternalAddress(StubRoutines::throw_StackOverflowError_entry()));
531 // all done with frame size check
532 __ bind(after_frame_check_pop);
533 __ pop(rsi);
534
535 __ bind(after_frame_check);
536 }
537
538 // Allocate monitor and lock method (asm interpreter)
539 // rbx, - Method*
540 //
541 void InterpreterGenerator::lock_method(void) {
542 // synchronize method
543 const Address access_flags (rbx, Method::access_flags_offset());
544 const Address monitor_block_top (rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
545 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
546
547 #ifdef ASSERT
548 { Label L;
549 __ movl(rax, access_flags);
550 __ testl(rax, JVM_ACC_SYNCHRONIZED);
551 __ jcc(Assembler::notZero, L);
552 __ stop("method doesn't need synchronization");
553 __ bind(L);
554 }
555 #endif // ASSERT
556 // get synchronization object
557 { Label done;
558 const int mirror_offset = in_bytes(Klass::java_mirror_offset());
559 __ movl(rax, access_flags);
560 __ testl(rax, JVM_ACC_STATIC);
561 __ movptr(rax, Address(rdi, Interpreter::local_offset_in_bytes(0))); // get receiver (assume this is frequent case)
|
521 // and safer anyway in case of JSR292 adaptations.
522
523 __ pop(rax); // return address must be moved if SP is changed
524 __ mov(rsp, rsi);
525 __ push(rax);
526
527 // Note: the restored frame is not necessarily interpreted.
528 // Use the shared runtime version of the StackOverflowError.
529 assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "stub not yet generated");
530 __ jump(ExternalAddress(StubRoutines::throw_StackOverflowError_entry()));
531 // all done with frame size check
532 __ bind(after_frame_check_pop);
533 __ pop(rsi);
534
535 __ bind(after_frame_check);
536 }
537
538 // Allocate monitor and lock method (asm interpreter)
539 // rbx, - Method*
540 //
541 void TemplateInterpreterGenerator::lock_method() {
542 // synchronize method
543 const Address access_flags (rbx, Method::access_flags_offset());
544 const Address monitor_block_top (rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
545 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
546
547 #ifdef ASSERT
548 { Label L;
549 __ movl(rax, access_flags);
550 __ testl(rax, JVM_ACC_SYNCHRONIZED);
551 __ jcc(Assembler::notZero, L);
552 __ stop("method doesn't need synchronization");
553 __ bind(L);
554 }
555 #endif // ASSERT
556 // get synchronization object
557 { Label done;
558 const int mirror_offset = in_bytes(Klass::java_mirror_offset());
559 __ movl(rax, access_flags);
560 __ testl(rax, JVM_ACC_STATIC);
561 __ movptr(rax, Address(rdi, Interpreter::local_offset_in_bytes(0))); // get receiver (assume this is frequent case)
|