< prev index next >

src/hotspot/cpu/x86/templateInterpreterGenerator_x86.cpp

Print this page




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 


< prev index next >