< prev index next >

src/hotspot/cpu/x86/interp_masm_x86.cpp

Print this page




1106 
1107     NOT_LP64(get_thread(rthread);)
1108 
1109     cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
1110     jcc(Assembler::equal, no_reserved_zone_enabling);
1111 
1112     cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
1113     jcc(Assembler::lessEqual, no_reserved_zone_enabling);
1114 
1115     call_VM_leaf(
1116       CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
1117     call_VM(noreg, CAST_FROM_FN_PTR(address,
1118                    InterpreterRuntime::throw_delayed_StackOverflowError));
1119     should_not_reach_here();
1120 
1121     bind(no_reserved_zone_enabling);
1122   }
1123 
1124   // Code below is taking care of recycling TLVB memory, no safepoint should
1125   // occur between this point and the end of the remove_activation() method
1126   Label vtbuffer_slow, vtbuffer_done, no_buffered_value_returned;
1127   const Register thread1 = NOT_LP64(rcx) LP64_ONLY(r15_thread);
1128   const uintptr_t chunk_mask = VTBufferChunk::chunk_mask();





1129   NOT_LP64(get_thread(thread1));
1130   cmpptr(Address(thread1, JavaThread::return_buffered_value_offset()), (intptr_t)NULL_WORD);
1131   jcc(Assembler::equal, no_buffered_value_returned);
1132   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
1133   call_VM_leaf(CAST_FROM_FN_PTR(address,
1134                                   InterpreterRuntime::return_value_step2), rax, rbx);
1135   NOT_LP64(get_thread(thread1));
1136   get_vm_result(rax, thread1);
1137   jmp(vtbuffer_done);
1138   bind(no_buffered_value_returned);


1139   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
1140   NOT_LP64(get_thread(thread1));
1141   movptr(rcx, Address(thread1, JavaThread::vt_alloc_ptr_offset()));
1142   cmpptr(rbx, rcx);
1143   jcc(Assembler::equal, vtbuffer_done);
1144   andptr(rbx, chunk_mask);
1145   andptr(rcx, chunk_mask);
1146   cmpptr(rbx, rcx);
1147   jcc(Assembler::notEqual, vtbuffer_slow);
1148   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
1149   movptr(Address(thread1, JavaThread::vt_alloc_ptr_offset()), rbx);
1150   jmp(vtbuffer_done);
1151   bind(vtbuffer_slow);
1152   push(state);
1153   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
1154   call_VM_leaf(CAST_FROM_FN_PTR(address,
1155                                   InterpreterRuntime::recycle_vtbuffer), rbx);
1156   pop(state);
1157   bind(vtbuffer_done);
1158 
1159   // remove activation
1160   // get sender sp
1161   movptr(rbx,
1162          Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
1163 
1164   if (load_values) {
1165     // We are returning a value type, load its fields into registers
1166 #ifndef _LP64
1167     super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
1168 #else
1169     load_klass(rdi, rax);
1170     movptr(rdi, Address(rdi, ValueKlass::unpack_handler_offset()));
1171 
1172     Label skip;
1173     testptr(rdi, rdi);
1174     jcc(Assembler::equal, skip);
1175 
1176     // Load fields from a buffered value with a value class specific
1177     // handler




1106 
1107     NOT_LP64(get_thread(rthread);)
1108 
1109     cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
1110     jcc(Assembler::equal, no_reserved_zone_enabling);
1111 
1112     cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
1113     jcc(Assembler::lessEqual, no_reserved_zone_enabling);
1114 
1115     call_VM_leaf(
1116       CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
1117     call_VM(noreg, CAST_FROM_FN_PTR(address,
1118                    InterpreterRuntime::throw_delayed_StackOverflowError));
1119     should_not_reach_here();
1120 
1121     bind(no_reserved_zone_enabling);
1122   }
1123 
1124   // Code below is taking care of recycling TLVB memory, no safepoint should
1125   // occur between this point and the end of the remove_activation() method

1126   const Register thread1 = NOT_LP64(rcx) LP64_ONLY(r15_thread);
1127   const uintptr_t chunk_mask = VTBufferChunk::chunk_mask();
1128 
1129   Label TLVB_cleanup_done;
1130   if (state == qtos) {
1131     Label no_buffered_value_returned;
1132     if (ReturnValuesInThreadLocalBuffer) {
1133       NOT_LP64(get_thread(thread1));
1134       cmpptr(Address(thread1, JavaThread::return_buffered_value_offset()), (intptr_t)NULL_WORD);
1135       jcc(Assembler::equal, no_buffered_value_returned);
1136       movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
1137       call_VM_leaf(CAST_FROM_FN_PTR(address,
1138           InterpreterRuntime::relocate_return_value), rax, rbx);
1139       NOT_LP64(get_thread(thread1));
1140       get_vm_result(rax, thread1);
1141       jmp(TLVB_cleanup_done); // clean up has been performed during relocation
1142       bind(no_buffered_value_returned);
1143     }
1144   }
1145   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
1146   NOT_LP64(get_thread(thread1));
1147   movptr(rcx, Address(thread1, JavaThread::vt_alloc_ptr_offset()));
1148   cmpptr(rbx, rcx);
1149   jcc(Assembler::equal, TLVB_cleanup_done);








1150   push(state);
1151   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
1152   call_VM_leaf(CAST_FROM_FN_PTR(address,
1153       InterpreterRuntime::recycle_vtbuffer), rbx);
1154   pop(state);
1155   bind(TLVB_cleanup_done);
1156 
1157   // remove activation
1158   // get sender sp
1159   movptr(rbx,
1160          Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
1161 
1162   if (load_values) {
1163     // We are returning a value type, load its fields into registers
1164 #ifndef _LP64
1165     super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
1166 #else
1167     load_klass(rdi, rax);
1168     movptr(rdi, Address(rdi, ValueKlass::unpack_handler_offset()));
1169 
1170     Label skip;
1171     testptr(rdi, rdi);
1172     jcc(Assembler::equal, skip);
1173 
1174     // Load fields from a buffered value with a value class specific
1175     // handler


< prev index next >