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 |