86 |
86 |
87 Node* adr_last_Java_pc = basic_plus_adr(top(), |
87 Node* adr_last_Java_pc = basic_plus_adr(top(), |
88 thread, |
88 thread, |
89 in_bytes(JavaThread::frame_anchor_offset()) + |
89 in_bytes(JavaThread::frame_anchor_offset()) + |
90 in_bytes(JavaFrameAnchor::last_Java_pc_offset())); |
90 in_bytes(JavaFrameAnchor::last_Java_pc_offset())); |
91 #if defined(SPARC) || defined(IA64) |
91 #if defined(SPARC) |
92 Node* adr_flags = basic_plus_adr(top(), |
92 Node* adr_flags = basic_plus_adr(top(), |
93 thread, |
93 thread, |
94 in_bytes(JavaThread::frame_anchor_offset()) + |
94 in_bytes(JavaThread::frame_anchor_offset()) + |
95 in_bytes(JavaFrameAnchor::flags_offset())); |
95 in_bytes(JavaFrameAnchor::flags_offset())); |
96 #endif /* defined(SPARC) || defined(IA64) */ |
96 #endif /* defined(SPARC) */ |
97 |
97 |
98 |
98 |
99 // Drop in the last_Java_sp. last_Java_fp is not touched. |
99 // Drop in the last_Java_sp. last_Java_fp is not touched. |
100 // Always do this after the other "last_Java_frame" fields are set since |
100 // Always do this after the other "last_Java_frame" fields are set since |
101 // as soon as last_Java_sp != NULL the has_last_Java_frame is true and |
101 // as soon as last_Java_sp != NULL the has_last_Java_frame is true and |
102 // users will look at the other fields. |
102 // users will look at the other fields. |
103 // |
103 // |
104 Node *adr_sp = basic_plus_adr(top(), thread, in_bytes(JavaThread::last_Java_sp_offset())); |
104 Node *adr_sp = basic_plus_adr(top(), thread, in_bytes(JavaThread::last_Java_sp_offset())); |
105 #ifndef IA64 |
|
106 Node *last_sp = basic_plus_adr(top(), frameptr(), (intptr_t) STACK_BIAS); |
105 Node *last_sp = basic_plus_adr(top(), frameptr(), (intptr_t) STACK_BIAS); |
107 store_to_memory(NULL, adr_sp, last_sp, T_ADDRESS, NoAlias); |
106 store_to_memory(NULL, adr_sp, last_sp, T_ADDRESS, NoAlias); |
108 #endif |
|
109 |
107 |
110 // Set _thread_in_native |
108 // Set _thread_in_native |
111 // The order of stores into TLS is critical! Setting _thread_in_native MUST |
109 // The order of stores into TLS is critical! Setting _thread_in_native MUST |
112 // be last, because a GC is allowed at any time after setting it and the GC |
110 // be last, because a GC is allowed at any time after setting it and the GC |
113 // will require last_Java_pc and last_Java_sp. |
111 // will require last_Java_pc and last_Java_sp. |
208 } |
206 } |
209 |
207 |
210 //----------------------------- |
208 //----------------------------- |
211 |
209 |
212 // Clear last_Java_sp |
210 // Clear last_Java_sp |
213 #ifdef IA64 |
|
214 if( os::is_MP() ) insert_mem_bar(Op_MemBarRelease); |
|
215 #endif |
|
216 |
|
217 store_to_memory(NULL, adr_sp, null(), T_ADDRESS, NoAlias); |
211 store_to_memory(NULL, adr_sp, null(), T_ADDRESS, NoAlias); |
218 #ifdef IA64 |
|
219 if (os::is_MP() && UseMembar) insert_mem_bar(new MemBarVolatileNode()); |
|
220 #endif // def IA64 |
|
221 // Clear last_Java_pc and (optionally)_flags |
212 // Clear last_Java_pc and (optionally)_flags |
222 store_to_memory(NULL, adr_last_Java_pc, null(), T_ADDRESS, NoAlias); |
213 store_to_memory(NULL, adr_last_Java_pc, null(), T_ADDRESS, NoAlias); |
223 #if defined(SPARC) || defined(IA64) |
214 #if defined(SPARC) |
224 store_to_memory(NULL, adr_flags, intcon(0), T_INT, NoAlias); |
215 store_to_memory(NULL, adr_flags, intcon(0), T_INT, NoAlias); |
225 #endif /* defined(SPARC) || defined(IA64) */ |
216 #endif /* defined(SPARC) */ |
226 #ifdef IA64 |
217 #ifdef IA64 |
227 Node* adr_last_Java_fp = basic_plus_adr(top(), thread, in_bytes(JavaThread::last_Java_fp_offset())); |
218 Node* adr_last_Java_fp = basic_plus_adr(top(), thread, in_bytes(JavaThread::last_Java_fp_offset())); |
228 if( os::is_MP() ) insert_mem_bar(Op_MemBarRelease); |
219 if( os::is_MP() ) insert_mem_bar(Op_MemBarRelease); |
229 store_to_memory(NULL, adr_last_Java_fp, null(), T_ADDRESS, NoAlias); |
220 store_to_memory(NULL, adr_last_Java_fp, null(), T_ADDRESS, NoAlias); |
230 #endif |
221 #endif |