165 // will allow deoptimization at this safepoint to find all possible |
198 // will allow deoptimization at this safepoint to find all possible |
166 // debug-info recordings, as well as let GC find all oops. |
199 // debug-info recordings, as well as let GC find all oops. |
167 |
200 |
168 OopMapSet *oop_maps = new OopMapSet(); |
201 OopMapSet *oop_maps = new OopMapSet(); |
169 OopMap* map = new OopMap(frame_size_in_slots, 0); |
202 OopMap* map = new OopMap(frame_size_in_slots, 0); |
170 map->set_callee_saved(VMRegImpl::stack2reg( rax_off + additional_frame_slots), rax->as_VMReg()); |
203 |
171 map->set_callee_saved(VMRegImpl::stack2reg( rcx_off + additional_frame_slots), rcx->as_VMReg()); |
204 #define STACK_OFFSET(x) VMRegImpl::stack2reg((x) + additional_frame_slots) |
172 map->set_callee_saved(VMRegImpl::stack2reg( rdx_off + additional_frame_slots), rdx->as_VMReg()); |
205 |
173 map->set_callee_saved(VMRegImpl::stack2reg( rbx_off + additional_frame_slots), rbx->as_VMReg()); |
206 map->set_callee_saved(STACK_OFFSET( rax_off ), rax->as_VMReg()); |
|
207 map->set_callee_saved(STACK_OFFSET( rcx_off ), rcx->as_VMReg()); |
|
208 map->set_callee_saved(STACK_OFFSET( rdx_off ), rdx->as_VMReg()); |
|
209 map->set_callee_saved(STACK_OFFSET( rbx_off ), rbx->as_VMReg()); |
174 // rbp location is known implicitly by the frame sender code, needs no oopmap |
210 // rbp location is known implicitly by the frame sender code, needs no oopmap |
175 // and the location where rbp was saved by is ignored |
211 // and the location where rbp was saved by is ignored |
176 map->set_callee_saved(VMRegImpl::stack2reg( rsi_off + additional_frame_slots), rsi->as_VMReg()); |
212 map->set_callee_saved(STACK_OFFSET( rsi_off ), rsi->as_VMReg()); |
177 map->set_callee_saved(VMRegImpl::stack2reg( rdi_off + additional_frame_slots), rdi->as_VMReg()); |
213 map->set_callee_saved(STACK_OFFSET( rdi_off ), rdi->as_VMReg()); |
178 map->set_callee_saved(VMRegImpl::stack2reg( r8_off + additional_frame_slots), r8->as_VMReg()); |
214 map->set_callee_saved(STACK_OFFSET( r8_off ), r8->as_VMReg()); |
179 map->set_callee_saved(VMRegImpl::stack2reg( r9_off + additional_frame_slots), r9->as_VMReg()); |
215 map->set_callee_saved(STACK_OFFSET( r9_off ), r9->as_VMReg()); |
180 map->set_callee_saved(VMRegImpl::stack2reg( r10_off + additional_frame_slots), r10->as_VMReg()); |
216 map->set_callee_saved(STACK_OFFSET( r10_off ), r10->as_VMReg()); |
181 map->set_callee_saved(VMRegImpl::stack2reg( r11_off + additional_frame_slots), r11->as_VMReg()); |
217 map->set_callee_saved(STACK_OFFSET( r11_off ), r11->as_VMReg()); |
182 map->set_callee_saved(VMRegImpl::stack2reg( r12_off + additional_frame_slots), r12->as_VMReg()); |
218 map->set_callee_saved(STACK_OFFSET( r12_off ), r12->as_VMReg()); |
183 map->set_callee_saved(VMRegImpl::stack2reg( r13_off + additional_frame_slots), r13->as_VMReg()); |
219 map->set_callee_saved(STACK_OFFSET( r13_off ), r13->as_VMReg()); |
184 map->set_callee_saved(VMRegImpl::stack2reg( r14_off + additional_frame_slots), r14->as_VMReg()); |
220 map->set_callee_saved(STACK_OFFSET( r14_off ), r14->as_VMReg()); |
185 map->set_callee_saved(VMRegImpl::stack2reg( r15_off + additional_frame_slots), r15->as_VMReg()); |
221 map->set_callee_saved(STACK_OFFSET( r15_off ), r15->as_VMReg()); |
186 map->set_callee_saved(VMRegImpl::stack2reg(xmm0_off + additional_frame_slots), xmm0->as_VMReg()); |
222 map->set_callee_saved(STACK_OFFSET(xmm0_off ), xmm0->as_VMReg()); |
187 map->set_callee_saved(VMRegImpl::stack2reg(xmm1_off + additional_frame_slots), xmm1->as_VMReg()); |
223 map->set_callee_saved(STACK_OFFSET(xmm1_off ), xmm1->as_VMReg()); |
188 map->set_callee_saved(VMRegImpl::stack2reg(xmm2_off + additional_frame_slots), xmm2->as_VMReg()); |
224 map->set_callee_saved(STACK_OFFSET(xmm2_off ), xmm2->as_VMReg()); |
189 map->set_callee_saved(VMRegImpl::stack2reg(xmm3_off + additional_frame_slots), xmm3->as_VMReg()); |
225 map->set_callee_saved(STACK_OFFSET(xmm3_off ), xmm3->as_VMReg()); |
190 map->set_callee_saved(VMRegImpl::stack2reg(xmm4_off + additional_frame_slots), xmm4->as_VMReg()); |
226 map->set_callee_saved(STACK_OFFSET(xmm4_off ), xmm4->as_VMReg()); |
191 map->set_callee_saved(VMRegImpl::stack2reg(xmm5_off + additional_frame_slots), xmm5->as_VMReg()); |
227 map->set_callee_saved(STACK_OFFSET(xmm5_off ), xmm5->as_VMReg()); |
192 map->set_callee_saved(VMRegImpl::stack2reg(xmm6_off + additional_frame_slots), xmm6->as_VMReg()); |
228 map->set_callee_saved(STACK_OFFSET(xmm6_off ), xmm6->as_VMReg()); |
193 map->set_callee_saved(VMRegImpl::stack2reg(xmm7_off + additional_frame_slots), xmm7->as_VMReg()); |
229 map->set_callee_saved(STACK_OFFSET(xmm7_off ), xmm7->as_VMReg()); |
194 map->set_callee_saved(VMRegImpl::stack2reg(xmm8_off + additional_frame_slots), xmm8->as_VMReg()); |
230 map->set_callee_saved(STACK_OFFSET(xmm8_off ), xmm8->as_VMReg()); |
195 map->set_callee_saved(VMRegImpl::stack2reg(xmm9_off + additional_frame_slots), xmm9->as_VMReg()); |
231 map->set_callee_saved(STACK_OFFSET(xmm9_off ), xmm9->as_VMReg()); |
196 map->set_callee_saved(VMRegImpl::stack2reg(xmm10_off + additional_frame_slots), xmm10->as_VMReg()); |
232 map->set_callee_saved(STACK_OFFSET(xmm10_off), xmm10->as_VMReg()); |
197 map->set_callee_saved(VMRegImpl::stack2reg(xmm11_off + additional_frame_slots), xmm11->as_VMReg()); |
233 map->set_callee_saved(STACK_OFFSET(xmm11_off), xmm11->as_VMReg()); |
198 map->set_callee_saved(VMRegImpl::stack2reg(xmm12_off + additional_frame_slots), xmm12->as_VMReg()); |
234 map->set_callee_saved(STACK_OFFSET(xmm12_off), xmm12->as_VMReg()); |
199 map->set_callee_saved(VMRegImpl::stack2reg(xmm13_off + additional_frame_slots), xmm13->as_VMReg()); |
235 map->set_callee_saved(STACK_OFFSET(xmm13_off), xmm13->as_VMReg()); |
200 map->set_callee_saved(VMRegImpl::stack2reg(xmm14_off + additional_frame_slots), xmm14->as_VMReg()); |
236 map->set_callee_saved(STACK_OFFSET(xmm14_off), xmm14->as_VMReg()); |
201 map->set_callee_saved(VMRegImpl::stack2reg(xmm15_off + additional_frame_slots), xmm15->as_VMReg()); |
237 map->set_callee_saved(STACK_OFFSET(xmm15_off), xmm15->as_VMReg()); |
202 |
238 |
203 // %%% These should all be a waste but we'll keep things as they were for now |
239 // %%% These should all be a waste but we'll keep things as they were for now |
204 if (true) { |
240 if (true) { |
205 map->set_callee_saved(VMRegImpl::stack2reg( raxH_off + additional_frame_slots), |
241 map->set_callee_saved(STACK_OFFSET( raxH_off ), rax->as_VMReg()->next()); |
206 rax->as_VMReg()->next()); |
242 map->set_callee_saved(STACK_OFFSET( rcxH_off ), rcx->as_VMReg()->next()); |
207 map->set_callee_saved(VMRegImpl::stack2reg( rcxH_off + additional_frame_slots), |
243 map->set_callee_saved(STACK_OFFSET( rdxH_off ), rdx->as_VMReg()->next()); |
208 rcx->as_VMReg()->next()); |
244 map->set_callee_saved(STACK_OFFSET( rbxH_off ), rbx->as_VMReg()->next()); |
209 map->set_callee_saved(VMRegImpl::stack2reg( rdxH_off + additional_frame_slots), |
|
210 rdx->as_VMReg()->next()); |
|
211 map->set_callee_saved(VMRegImpl::stack2reg( rbxH_off + additional_frame_slots), |
|
212 rbx->as_VMReg()->next()); |
|
213 // rbp location is known implicitly by the frame sender code, needs no oopmap |
245 // rbp location is known implicitly by the frame sender code, needs no oopmap |
214 map->set_callee_saved(VMRegImpl::stack2reg( rsiH_off + additional_frame_slots), |
246 map->set_callee_saved(STACK_OFFSET( rsiH_off ), rsi->as_VMReg()->next()); |
215 rsi->as_VMReg()->next()); |
247 map->set_callee_saved(STACK_OFFSET( rdiH_off ), rdi->as_VMReg()->next()); |
216 map->set_callee_saved(VMRegImpl::stack2reg( rdiH_off + additional_frame_slots), |
248 map->set_callee_saved(STACK_OFFSET( r8H_off ), r8->as_VMReg()->next()); |
217 rdi->as_VMReg()->next()); |
249 map->set_callee_saved(STACK_OFFSET( r9H_off ), r9->as_VMReg()->next()); |
218 map->set_callee_saved(VMRegImpl::stack2reg( r8H_off + additional_frame_slots), |
250 map->set_callee_saved(STACK_OFFSET( r10H_off ), r10->as_VMReg()->next()); |
219 r8->as_VMReg()->next()); |
251 map->set_callee_saved(STACK_OFFSET( r11H_off ), r11->as_VMReg()->next()); |
220 map->set_callee_saved(VMRegImpl::stack2reg( r9H_off + additional_frame_slots), |
252 map->set_callee_saved(STACK_OFFSET( r12H_off ), r12->as_VMReg()->next()); |
221 r9->as_VMReg()->next()); |
253 map->set_callee_saved(STACK_OFFSET( r13H_off ), r13->as_VMReg()->next()); |
222 map->set_callee_saved(VMRegImpl::stack2reg( r10H_off + additional_frame_slots), |
254 map->set_callee_saved(STACK_OFFSET( r14H_off ), r14->as_VMReg()->next()); |
223 r10->as_VMReg()->next()); |
255 map->set_callee_saved(STACK_OFFSET( r15H_off ), r15->as_VMReg()->next()); |
224 map->set_callee_saved(VMRegImpl::stack2reg( r11H_off + additional_frame_slots), |
256 map->set_callee_saved(STACK_OFFSET(xmm0H_off ), xmm0->as_VMReg()->next()); |
225 r11->as_VMReg()->next()); |
257 map->set_callee_saved(STACK_OFFSET(xmm1H_off ), xmm1->as_VMReg()->next()); |
226 map->set_callee_saved(VMRegImpl::stack2reg( r12H_off + additional_frame_slots), |
258 map->set_callee_saved(STACK_OFFSET(xmm2H_off ), xmm2->as_VMReg()->next()); |
227 r12->as_VMReg()->next()); |
259 map->set_callee_saved(STACK_OFFSET(xmm3H_off ), xmm3->as_VMReg()->next()); |
228 map->set_callee_saved(VMRegImpl::stack2reg( r13H_off + additional_frame_slots), |
260 map->set_callee_saved(STACK_OFFSET(xmm4H_off ), xmm4->as_VMReg()->next()); |
229 r13->as_VMReg()->next()); |
261 map->set_callee_saved(STACK_OFFSET(xmm5H_off ), xmm5->as_VMReg()->next()); |
230 map->set_callee_saved(VMRegImpl::stack2reg( r14H_off + additional_frame_slots), |
262 map->set_callee_saved(STACK_OFFSET(xmm6H_off ), xmm6->as_VMReg()->next()); |
231 r14->as_VMReg()->next()); |
263 map->set_callee_saved(STACK_OFFSET(xmm7H_off ), xmm7->as_VMReg()->next()); |
232 map->set_callee_saved(VMRegImpl::stack2reg( r15H_off + additional_frame_slots), |
264 map->set_callee_saved(STACK_OFFSET(xmm8H_off ), xmm8->as_VMReg()->next()); |
233 r15->as_VMReg()->next()); |
265 map->set_callee_saved(STACK_OFFSET(xmm9H_off ), xmm9->as_VMReg()->next()); |
234 map->set_callee_saved(VMRegImpl::stack2reg(xmm0H_off + additional_frame_slots), |
266 map->set_callee_saved(STACK_OFFSET(xmm10H_off), xmm10->as_VMReg()->next()); |
235 xmm0->as_VMReg()->next()); |
267 map->set_callee_saved(STACK_OFFSET(xmm11H_off), xmm11->as_VMReg()->next()); |
236 map->set_callee_saved(VMRegImpl::stack2reg(xmm1H_off + additional_frame_slots), |
268 map->set_callee_saved(STACK_OFFSET(xmm12H_off), xmm12->as_VMReg()->next()); |
237 xmm1->as_VMReg()->next()); |
269 map->set_callee_saved(STACK_OFFSET(xmm13H_off), xmm13->as_VMReg()->next()); |
238 map->set_callee_saved(VMRegImpl::stack2reg(xmm2H_off + additional_frame_slots), |
270 map->set_callee_saved(STACK_OFFSET(xmm14H_off), xmm14->as_VMReg()->next()); |
239 xmm2->as_VMReg()->next()); |
271 map->set_callee_saved(STACK_OFFSET(xmm15H_off), xmm15->as_VMReg()->next()); |
240 map->set_callee_saved(VMRegImpl::stack2reg(xmm3H_off + additional_frame_slots), |
|
241 xmm3->as_VMReg()->next()); |
|
242 map->set_callee_saved(VMRegImpl::stack2reg(xmm4H_off + additional_frame_slots), |
|
243 xmm4->as_VMReg()->next()); |
|
244 map->set_callee_saved(VMRegImpl::stack2reg(xmm5H_off + additional_frame_slots), |
|
245 xmm5->as_VMReg()->next()); |
|
246 map->set_callee_saved(VMRegImpl::stack2reg(xmm6H_off + additional_frame_slots), |
|
247 xmm6->as_VMReg()->next()); |
|
248 map->set_callee_saved(VMRegImpl::stack2reg(xmm7H_off + additional_frame_slots), |
|
249 xmm7->as_VMReg()->next()); |
|
250 map->set_callee_saved(VMRegImpl::stack2reg(xmm8H_off + additional_frame_slots), |
|
251 xmm8->as_VMReg()->next()); |
|
252 map->set_callee_saved(VMRegImpl::stack2reg(xmm9H_off + additional_frame_slots), |
|
253 xmm9->as_VMReg()->next()); |
|
254 map->set_callee_saved(VMRegImpl::stack2reg(xmm10H_off + additional_frame_slots), |
|
255 xmm10->as_VMReg()->next()); |
|
256 map->set_callee_saved(VMRegImpl::stack2reg(xmm11H_off + additional_frame_slots), |
|
257 xmm11->as_VMReg()->next()); |
|
258 map->set_callee_saved(VMRegImpl::stack2reg(xmm12H_off + additional_frame_slots), |
|
259 xmm12->as_VMReg()->next()); |
|
260 map->set_callee_saved(VMRegImpl::stack2reg(xmm13H_off + additional_frame_slots), |
|
261 xmm13->as_VMReg()->next()); |
|
262 map->set_callee_saved(VMRegImpl::stack2reg(xmm14H_off + additional_frame_slots), |
|
263 xmm14->as_VMReg()->next()); |
|
264 map->set_callee_saved(VMRegImpl::stack2reg(xmm15H_off + additional_frame_slots), |
|
265 xmm15->as_VMReg()->next()); |
|
266 } |
272 } |
267 |
273 |
268 return map; |
274 return map; |
269 } |
275 } |
270 |
276 |
271 void RegisterSaver::restore_live_registers(MacroAssembler* masm) { |
277 void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_vectors) { |
272 if (frame::arg_reg_save_area_bytes != 0) { |
278 if (frame::arg_reg_save_area_bytes != 0) { |
273 // Pop arg register save area |
279 // Pop arg register save area |
274 __ addptr(rsp, frame::arg_reg_save_area_bytes); |
280 __ addptr(rsp, frame::arg_reg_save_area_bytes); |
275 } |
281 } |
|
282 #ifdef COMPILER2 |
|
283 if (restore_vectors) { |
|
284 // Restore upper half of YMM registes. |
|
285 assert(UseAVX > 0, "256bit vectors are supported only with AVX"); |
|
286 assert(MaxVectorSize == 32, "only 256bit vectors are supported now"); |
|
287 __ vinsertf128h(xmm0, Address(rsp, 0)); |
|
288 __ vinsertf128h(xmm1, Address(rsp, 16)); |
|
289 __ vinsertf128h(xmm2, Address(rsp, 32)); |
|
290 __ vinsertf128h(xmm3, Address(rsp, 48)); |
|
291 __ vinsertf128h(xmm4, Address(rsp, 64)); |
|
292 __ vinsertf128h(xmm5, Address(rsp, 80)); |
|
293 __ vinsertf128h(xmm6, Address(rsp, 96)); |
|
294 __ vinsertf128h(xmm7, Address(rsp,112)); |
|
295 __ vinsertf128h(xmm8, Address(rsp,128)); |
|
296 __ vinsertf128h(xmm9, Address(rsp,144)); |
|
297 __ vinsertf128h(xmm10, Address(rsp,160)); |
|
298 __ vinsertf128h(xmm11, Address(rsp,176)); |
|
299 __ vinsertf128h(xmm12, Address(rsp,192)); |
|
300 __ vinsertf128h(xmm13, Address(rsp,208)); |
|
301 __ vinsertf128h(xmm14, Address(rsp,224)); |
|
302 __ vinsertf128h(xmm15, Address(rsp,240)); |
|
303 __ addptr(rsp, 256); |
|
304 } |
|
305 #else |
|
306 assert(!restore_vectors, "vectors are generated only by C2"); |
|
307 #endif |
276 // Recover CPU state |
308 // Recover CPU state |
277 __ pop_CPU_state(); |
309 __ pop_CPU_state(); |
278 // Get the rbp described implicitly by the calling convention (no oopMap) |
310 // Get the rbp described implicitly by the calling convention (no oopMap) |
279 __ pop(rbp); |
311 __ pop(rbp); |
280 } |
312 } |