1073 float_handler.addr()); 1074 __ jcc(Assembler::equal, push_double); 1075 __ cmpptr(Address(rbp, (frame::interpreter_frame_oop_temp_offset + 1)*wordSize), 1076 double_handler.addr()); 1077 __ jcc(Assembler::notEqual, L); 1078 __ bind(push_double); 1079 __ push_d(); // FP values are returned using the FPU, so push FPU contents (even if UseSSE > 0). 1080 __ bind(L); 1081 } 1082 #else 1083 __ push(dtos); 1084 #endif // _LP64 1085 1086 __ push(ltos); 1087 1088 // change thread state 1089 NOT_LP64(__ get_thread(thread)); 1090 __ movl(Address(thread, JavaThread::thread_state_offset()), 1091 _thread_in_native_trans); 1092 1093 if (os::is_MP()) { 1094 if (UseMembar) { 1095 // Force this write out before the read below 1096 __ membar(Assembler::Membar_mask_bits( 1097 Assembler::LoadLoad | Assembler::LoadStore | 1098 Assembler::StoreLoad | Assembler::StoreStore)); 1099 } else { 1100 // Write serialization page so VM thread can do a pseudo remote membar. 1101 // We use the current thread pointer to calculate a thread specific 1102 // offset to write to within the page. This minimizes bus traffic 1103 // due to cache line collision. 1104 __ serialize_memory(thread, rcx); 1105 } 1106 } 1107 1108 #ifndef _LP64 1109 if (AlwaysRestoreFPU) { 1110 // Make sure the control word is correct. 1111 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std())); 1112 } 1113 #endif // _LP64 1114 1115 // check for safepoint operation in progress and/or pending suspend requests 1116 { 1117 Label Continue; 1118 Label slow_path; 1119 1120 #ifndef _LP64 1121 __ safepoint_poll(slow_path, thread, noreg); 1122 #else 1123 __ safepoint_poll(slow_path, r15_thread, rscratch1); 1124 #endif 1125 | 1073 float_handler.addr()); 1074 __ jcc(Assembler::equal, push_double); 1075 __ cmpptr(Address(rbp, (frame::interpreter_frame_oop_temp_offset + 1)*wordSize), 1076 double_handler.addr()); 1077 __ jcc(Assembler::notEqual, L); 1078 __ bind(push_double); 1079 __ push_d(); // FP values are returned using the FPU, so push FPU contents (even if UseSSE > 0). 1080 __ bind(L); 1081 } 1082 #else 1083 __ push(dtos); 1084 #endif // _LP64 1085 1086 __ push(ltos); 1087 1088 // change thread state 1089 NOT_LP64(__ get_thread(thread)); 1090 __ movl(Address(thread, JavaThread::thread_state_offset()), 1091 _thread_in_native_trans); 1092 1093 if (UseMembar) { 1094 // Force this write out before the read below 1095 __ membar(Assembler::Membar_mask_bits( 1096 Assembler::LoadLoad | Assembler::LoadStore | 1097 Assembler::StoreLoad | Assembler::StoreStore)); 1098 } else { 1099 // Write serialization page so VM thread can do a pseudo remote membar. 1100 // We use the current thread pointer to calculate a thread specific 1101 // offset to write to within the page. This minimizes bus traffic 1102 // due to cache line collision. 1103 __ serialize_memory(thread, rcx); 1104 } 1105 1106 #ifndef _LP64 1107 if (AlwaysRestoreFPU) { 1108 // Make sure the control word is correct. 1109 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std())); 1110 } 1111 #endif // _LP64 1112 1113 // check for safepoint operation in progress and/or pending suspend requests 1114 { 1115 Label Continue; 1116 Label slow_path; 1117 1118 #ifndef _LP64 1119 __ safepoint_poll(slow_path, thread, noreg); 1120 #else 1121 __ safepoint_poll(slow_path, r15_thread, rscratch1); 1122 #endif 1123 |