< prev index next >

hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86.cpp

Print this page




1152     __ increment(rsp, wordSize);
1153     __ get_thread(thread);
1154 #else
1155     __ mov(c_rarg0, r15_thread);
1156     __ mov(r12, rsp); // remember sp (can only use r12 if not using call_VM)
1157     __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows
1158     __ andptr(rsp, -16); // align stack as required by ABI
1159     __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, JavaThread::check_special_condition_for_native_trans)));
1160     __ mov(rsp, r12); // restore sp
1161     __ reinit_heapbase();
1162 #endif // _LP64
1163     __ bind(Continue);
1164   }
1165 
1166   // change thread state
1167   __ movl(Address(thread, JavaThread::thread_state_offset()), _thread_in_Java);
1168 
1169   // reset_last_Java_frame
1170   __ reset_last_Java_frame(thread, true, true);
1171 





1172   // reset handle block
1173   __ movptr(t, Address(thread, JavaThread::active_handles_offset()));
1174   __ movl(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD);
1175 
1176   // If result is an oop unbox and store it in frame where gc will see it
1177   // and result handler will pick it up
1178 
1179   {
1180     Label no_oop, store_result;
1181     __ lea(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT)));
1182     __ cmpptr(t, Address(rbp, frame::interpreter_frame_result_handler_offset*wordSize));
1183     __ jcc(Assembler::notEqual, no_oop);
1184     // retrieve result
1185     __ pop(ltos);
1186     __ testptr(rax, rax);
1187     __ jcc(Assembler::zero, store_result);
1188     __ movptr(rax, Address(rax, 0));
1189     __ bind(store_result);
1190     __ movptr(Address(rbp, frame::interpreter_frame_oop_temp_offset*wordSize), rax);
1191     // keep stack depth as expected by pushing oop which will eventually be discarded




1152     __ increment(rsp, wordSize);
1153     __ get_thread(thread);
1154 #else
1155     __ mov(c_rarg0, r15_thread);
1156     __ mov(r12, rsp); // remember sp (can only use r12 if not using call_VM)
1157     __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows
1158     __ andptr(rsp, -16); // align stack as required by ABI
1159     __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, JavaThread::check_special_condition_for_native_trans)));
1160     __ mov(rsp, r12); // restore sp
1161     __ reinit_heapbase();
1162 #endif // _LP64
1163     __ bind(Continue);
1164   }
1165 
1166   // change thread state
1167   __ movl(Address(thread, JavaThread::thread_state_offset()), _thread_in_Java);
1168 
1169   // reset_last_Java_frame
1170   __ reset_last_Java_frame(thread, true, true);
1171 
1172   if (CheckJNICalls) {
1173     // clear_pending_jni_exception_check
1174     __ movptr(Address(thread, JavaThread::pending_jni_exception_check_fn_offset()), NULL_WORD);
1175   }
1176 
1177   // reset handle block
1178   __ movptr(t, Address(thread, JavaThread::active_handles_offset()));
1179   __ movl(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD);
1180 
1181   // If result is an oop unbox and store it in frame where gc will see it
1182   // and result handler will pick it up
1183 
1184   {
1185     Label no_oop, store_result;
1186     __ lea(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT)));
1187     __ cmpptr(t, Address(rbp, frame::interpreter_frame_result_handler_offset*wordSize));
1188     __ jcc(Assembler::notEqual, no_oop);
1189     // retrieve result
1190     __ pop(ltos);
1191     __ testptr(rax, rax);
1192     __ jcc(Assembler::zero, store_result);
1193     __ movptr(rax, Address(rax, 0));
1194     __ bind(store_result);
1195     __ movptr(Address(rbp, frame::interpreter_frame_oop_temp_offset*wordSize), rax);
1196     // keep stack depth as expected by pushing oop which will eventually be discarded


< prev index next >