167 // |
167 // |
168 |
168 |
169 // Empty register class. |
169 // Empty register class. |
170 reg_class no_reg(); |
170 reg_class no_reg(); |
171 |
171 |
172 // Class for all pointer registers (including RSP and RBP) |
172 // Class for all pointer/long registers |
173 reg_class any_reg_with_rbp(RAX, RAX_H, |
173 reg_class all_reg(RAX, RAX_H, |
174 RDX, RDX_H, |
174 RDX, RDX_H, |
175 RBP, RBP_H, |
175 RBP, RBP_H, |
176 RDI, RDI_H, |
176 RDI, RDI_H, |
177 RSI, RSI_H, |
177 RSI, RSI_H, |
178 RCX, RCX_H, |
178 RCX, RCX_H, |
179 RBX, RBX_H, |
179 RBX, RBX_H, |
180 RSP, RSP_H, |
180 RSP, RSP_H, |
181 R8, R8_H, |
181 R8, R8_H, |
182 R9, R9_H, |
182 R9, R9_H, |
183 R10, R10_H, |
183 R10, R10_H, |
184 R11, R11_H, |
184 R11, R11_H, |
185 R12, R12_H, |
185 R12, R12_H, |
186 R13, R13_H, |
186 R13, R13_H, |
187 R14, R14_H, |
187 R14, R14_H, |
188 R15, R15_H); |
188 R15, R15_H); |
189 |
189 |
190 // Class for all pointer registers (including RSP, but excluding RBP) |
190 // Class for all int registers |
191 reg_class any_reg_no_rbp(RAX, RAX_H, |
191 reg_class all_int_reg(RAX |
192 RDX, RDX_H, |
192 RDX, |
193 RDI, RDI_H, |
193 RBP, |
194 RSI, RSI_H, |
194 RDI, |
195 RCX, RCX_H, |
195 RSI, |
196 RBX, RBX_H, |
196 RCX, |
197 RSP, RSP_H, |
197 RBX, |
198 R8, R8_H, |
198 R8, |
199 R9, R9_H, |
199 R9, |
200 R10, R10_H, |
200 R10, |
201 R11, R11_H, |
201 R11, |
202 R12, R12_H, |
202 R12, |
203 R13, R13_H, |
203 R13, |
204 R14, R14_H, |
204 R14); |
205 R15, R15_H); |
205 |
206 |
206 // Class for all pointer registers |
207 // Dynamic register class that selects at runtime between register classes |
207 reg_class any_reg %{ |
208 // any_reg_no_rbp and any_reg_with_rbp (depending on the value of the flag PreserveFramePointer). |
208 return _ANY_REG_mask; |
209 // Equivalent to: return PreserveFramePointer ? any_reg_no_rbp : any_reg_with_rbp; |
209 %} |
210 reg_class_dynamic any_reg(any_reg_no_rbp, any_reg_with_rbp, %{ PreserveFramePointer %}); |
|
211 |
210 |
212 // Class for all pointer registers (excluding RSP) |
211 // Class for all pointer registers (excluding RSP) |
213 reg_class ptr_reg_with_rbp(RAX, RAX_H, |
212 reg_class ptr_reg %{ |
214 RDX, RDX_H, |
213 return _PTR_REG_mask; |
215 RBP, RBP_H, |
214 %} |
216 RDI, RDI_H, |
|
217 RSI, RSI_H, |
|
218 RCX, RCX_H, |
|
219 RBX, RBX_H, |
|
220 R8, R8_H, |
|
221 R9, R9_H, |
|
222 R10, R10_H, |
|
223 R11, R11_H, |
|
224 R13, R13_H, |
|
225 R14, R14_H); |
|
226 |
215 |
227 // Class for all pointer registers (excluding RSP and RBP) |
216 // Class for all pointer registers (excluding RSP and RBP) |
228 reg_class ptr_reg_no_rbp(RAX, RAX_H, |
217 reg_class ptr_reg_no_rbp %{ |
229 RDX, RDX_H, |
218 return _PTR_REG_NO_RBP_mask; |
230 RDI, RDI_H, |
219 %} |
231 RSI, RSI_H, |
|
232 RCX, RCX_H, |
|
233 RBX, RBX_H, |
|
234 R8, R8_H, |
|
235 R9, R9_H, |
|
236 R10, R10_H, |
|
237 R11, R11_H, |
|
238 R13, R13_H, |
|
239 R14, R14_H); |
|
240 |
|
241 // Dynamic register class that selects between ptr_reg_no_rbp and ptr_reg_with_rbp. |
|
242 reg_class_dynamic ptr_reg(ptr_reg_no_rbp, ptr_reg_with_rbp, %{ PreserveFramePointer %}); |
|
243 |
220 |
244 // Class for all pointer registers (excluding RAX and RSP) |
221 // Class for all pointer registers (excluding RAX and RSP) |
245 reg_class ptr_no_rax_reg_with_rbp(RDX, RDX_H, |
222 reg_class ptr_no_rax_reg %{ |
246 RBP, RBP_H, |
223 return _PTR_NO_RAX_REG_mask; |
247 RDI, RDI_H, |
224 %} |
248 RSI, RSI_H, |
|
249 RCX, RCX_H, |
|
250 RBX, RBX_H, |
|
251 R8, R8_H, |
|
252 R9, R9_H, |
|
253 R10, R10_H, |
|
254 R11, R11_H, |
|
255 R13, R13_H, |
|
256 R14, R14_H); |
|
257 |
|
258 // Class for all pointer registers (excluding RAX, RSP, and RBP) |
|
259 reg_class ptr_no_rax_reg_no_rbp(RDX, RDX_H, |
|
260 RDI, RDI_H, |
|
261 RSI, RSI_H, |
|
262 RCX, RCX_H, |
|
263 RBX, RBX_H, |
|
264 R8, R8_H, |
|
265 R9, R9_H, |
|
266 R10, R10_H, |
|
267 R11, R11_H, |
|
268 R13, R13_H, |
|
269 R14, R14_H); |
|
270 |
|
271 // Dynamic register class that selects between ptr_no_rax_reg_no_rbp and ptr_no_rax_reg_with_rbp. |
|
272 reg_class_dynamic ptr_no_rax_reg(ptr_no_rax_reg_no_rbp, ptr_no_rax_reg_with_rbp, %{ PreserveFramePointer %}); |
|
273 |
225 |
274 // Class for all pointer registers (excluding RAX, RBX, and RSP) |
226 // Class for all pointer registers (excluding RAX, RBX, and RSP) |
275 reg_class ptr_no_rax_rbx_reg_with_rbp(RDX, RDX_H, |
227 reg_class ptr_no_rax_rbx_reg %{ |
276 RBP, RBP_H, |
228 return _PTR_NO_RAX_RBX_REG_mask; |
277 RDI, RDI_H, |
229 %} |
278 RSI, RSI_H, |
230 |
279 RCX, RCX_H, |
231 // Class for all long registers (excluding RSP) |
280 R8, R8_H, |
232 reg_class long_reg %{ |
281 R9, R9_H, |
233 return _LONG_REG_mask; |
282 R10, R10_H, |
234 %} |
283 R11, R11_H, |
235 |
284 R13, R13_H, |
236 // Class for all long registers (excluding RAX, RDX and RSP) |
285 R14, R14_H); |
237 reg_class long_no_rax_rdx_reg %{ |
286 |
238 return _LONG_NO_RAX_RDX_REG_mask; |
287 // Class for all pointer registers (excluding RAX, RBX, RSP, and RBP) |
239 %} |
288 reg_class ptr_no_rax_rbx_reg_no_rbp(RDX, RDX_H, |
240 |
289 RDI, RDI_H, |
241 // Class for all long registers (excluding RCX and RSP) |
290 RSI, RSI_H, |
242 reg_class long_no_rcx_reg %{ |
291 RCX, RCX_H, |
243 return _LONG_NO_RCX_REG_mask; |
292 R8, R8_H, |
244 %} |
293 R9, R9_H, |
245 |
294 R10, R10_H, |
246 // Class for all int registers (excluding RSP) |
295 R11, R11_H, |
247 reg_class int_reg %{ |
296 R13, R13_H, |
248 return _INT_REG_mask; |
297 R14, R14_H); |
249 %} |
298 |
250 |
299 // Dynamic register class that selects between ptr_no_rax_rbx_reg_no_rbp and ptr_no_rax_rbx_reg_with_rbp. |
251 // Class for all int registers (excluding RAX, RDX, and RSP) |
300 reg_class_dynamic ptr_no_rax_rbx_reg(ptr_no_rax_rbx_reg_no_rbp, ptr_no_rax_rbx_reg_with_rbp, %{ PreserveFramePointer %}); |
252 reg_class int_no_rax_rdx_reg %{ |
|
253 return _INT_NO_RAX_RDX_REG_mask; |
|
254 %} |
|
255 |
|
256 // Class for all int registers (excluding RCX and RSP) |
|
257 reg_class int_no_rcx_reg %{ |
|
258 return _INT_NO_RCX_REG_mask; |
|
259 %} |
301 |
260 |
302 // Singleton class for RAX pointer register |
261 // Singleton class for RAX pointer register |
303 reg_class ptr_rax_reg(RAX, RAX_H); |
262 reg_class ptr_rax_reg(RAX, RAX_H); |
304 |
263 |
305 // Singleton class for RBX pointer register |
264 // Singleton class for RBX pointer register |
315 reg_class ptr_rsp_reg(RSP, RSP_H); |
274 reg_class ptr_rsp_reg(RSP, RSP_H); |
316 |
275 |
317 // Singleton class for TLS pointer |
276 // Singleton class for TLS pointer |
318 reg_class ptr_r15_reg(R15, R15_H); |
277 reg_class ptr_r15_reg(R15, R15_H); |
319 |
278 |
320 // Class for all long registers (excluding RSP) |
|
321 reg_class long_reg_with_rbp(RAX, RAX_H, |
|
322 RDX, RDX_H, |
|
323 RBP, RBP_H, |
|
324 RDI, RDI_H, |
|
325 RSI, RSI_H, |
|
326 RCX, RCX_H, |
|
327 RBX, RBX_H, |
|
328 R8, R8_H, |
|
329 R9, R9_H, |
|
330 R10, R10_H, |
|
331 R11, R11_H, |
|
332 R13, R13_H, |
|
333 R14, R14_H); |
|
334 |
|
335 // Class for all long registers (excluding RSP and RBP) |
|
336 reg_class long_reg_no_rbp(RAX, RAX_H, |
|
337 RDX, RDX_H, |
|
338 RDI, RDI_H, |
|
339 RSI, RSI_H, |
|
340 RCX, RCX_H, |
|
341 RBX, RBX_H, |
|
342 R8, R8_H, |
|
343 R9, R9_H, |
|
344 R10, R10_H, |
|
345 R11, R11_H, |
|
346 R13, R13_H, |
|
347 R14, R14_H); |
|
348 |
|
349 // Dynamic register class that selects between long_reg_no_rbp and long_reg_with_rbp. |
|
350 reg_class_dynamic long_reg(long_reg_no_rbp, long_reg_with_rbp, %{ PreserveFramePointer %}); |
|
351 |
|
352 // Class for all long registers (excluding RAX, RDX and RSP) |
|
353 reg_class long_no_rax_rdx_reg_with_rbp(RBP, RBP_H, |
|
354 RDI, RDI_H, |
|
355 RSI, RSI_H, |
|
356 RCX, RCX_H, |
|
357 RBX, RBX_H, |
|
358 R8, R8_H, |
|
359 R9, R9_H, |
|
360 R10, R10_H, |
|
361 R11, R11_H, |
|
362 R13, R13_H, |
|
363 R14, R14_H); |
|
364 |
|
365 // Class for all long registers (excluding RAX, RDX, RSP, and RBP) |
|
366 reg_class long_no_rax_rdx_reg_no_rbp(RDI, RDI_H, |
|
367 RSI, RSI_H, |
|
368 RCX, RCX_H, |
|
369 RBX, RBX_H, |
|
370 R8, R8_H, |
|
371 R9, R9_H, |
|
372 R10, R10_H, |
|
373 R11, R11_H, |
|
374 R13, R13_H, |
|
375 R14, R14_H); |
|
376 |
|
377 // Dynamic register class that selects between long_no_rax_rdx_reg_no_rbp and long_no_rax_rdx_reg_with_rbp. |
|
378 reg_class_dynamic long_no_rax_rdx_reg(long_no_rax_rdx_reg_no_rbp, long_no_rax_rdx_reg_with_rbp, %{ PreserveFramePointer %}); |
|
379 |
|
380 // Class for all long registers (excluding RCX and RSP) |
|
381 reg_class long_no_rcx_reg_with_rbp(RBP, RBP_H, |
|
382 RDI, RDI_H, |
|
383 RSI, RSI_H, |
|
384 RAX, RAX_H, |
|
385 RDX, RDX_H, |
|
386 RBX, RBX_H, |
|
387 R8, R8_H, |
|
388 R9, R9_H, |
|
389 R10, R10_H, |
|
390 R11, R11_H, |
|
391 R13, R13_H, |
|
392 R14, R14_H); |
|
393 |
|
394 // Class for all long registers (excluding RCX, RSP, and RBP) |
|
395 reg_class long_no_rcx_reg_no_rbp(RDI, RDI_H, |
|
396 RSI, RSI_H, |
|
397 RAX, RAX_H, |
|
398 RDX, RDX_H, |
|
399 RBX, RBX_H, |
|
400 R8, R8_H, |
|
401 R9, R9_H, |
|
402 R10, R10_H, |
|
403 R11, R11_H, |
|
404 R13, R13_H, |
|
405 R14, R14_H); |
|
406 |
|
407 // Dynamic register class that selects between long_no_rcx_reg_no_rbp and long_no_rcx_reg_with_rbp. |
|
408 reg_class_dynamic long_no_rcx_reg(long_no_rcx_reg_no_rbp, long_no_rcx_reg_with_rbp, %{ PreserveFramePointer %}); |
|
409 |
|
410 // Singleton class for RAX long register |
279 // Singleton class for RAX long register |
411 reg_class long_rax_reg(RAX, RAX_H); |
280 reg_class long_rax_reg(RAX, RAX_H); |
412 |
281 |
413 // Singleton class for RCX long register |
282 // Singleton class for RCX long register |
414 reg_class long_rcx_reg(RCX, RCX_H); |
283 reg_class long_rcx_reg(RCX, RCX_H); |
415 |
284 |
416 // Singleton class for RDX long register |
285 // Singleton class for RDX long register |
417 reg_class long_rdx_reg(RDX, RDX_H); |
286 reg_class long_rdx_reg(RDX, RDX_H); |
418 |
|
419 // Class for all int registers (excluding RSP) |
|
420 reg_class int_reg_with_rbp(RAX, |
|
421 RDX, |
|
422 RBP, |
|
423 RDI, |
|
424 RSI, |
|
425 RCX, |
|
426 RBX, |
|
427 R8, |
|
428 R9, |
|
429 R10, |
|
430 R11, |
|
431 R13, |
|
432 R14); |
|
433 |
|
434 // Class for all int registers (excluding RSP and RBP) |
|
435 reg_class int_reg_no_rbp(RAX, |
|
436 RDX, |
|
437 RDI, |
|
438 RSI, |
|
439 RCX, |
|
440 RBX, |
|
441 R8, |
|
442 R9, |
|
443 R10, |
|
444 R11, |
|
445 R13, |
|
446 R14); |
|
447 |
|
448 // Dynamic register class that selects between int_reg_no_rbp and int_reg_with_rbp. |
|
449 reg_class_dynamic int_reg(int_reg_no_rbp, int_reg_with_rbp, %{ PreserveFramePointer %}); |
|
450 |
|
451 // Class for all int registers (excluding RCX and RSP) |
|
452 reg_class int_no_rcx_reg_with_rbp(RAX, |
|
453 RDX, |
|
454 RBP, |
|
455 RDI, |
|
456 RSI, |
|
457 RBX, |
|
458 R8, |
|
459 R9, |
|
460 R10, |
|
461 R11, |
|
462 R13, |
|
463 R14); |
|
464 |
|
465 // Class for all int registers (excluding RCX, RSP, and RBP) |
|
466 reg_class int_no_rcx_reg_no_rbp(RAX, |
|
467 RDX, |
|
468 RDI, |
|
469 RSI, |
|
470 RBX, |
|
471 R8, |
|
472 R9, |
|
473 R10, |
|
474 R11, |
|
475 R13, |
|
476 R14); |
|
477 |
|
478 // Dynamic register class that selects between int_no_rcx_reg_no_rbp and int_no_rcx_reg_with_rbp. |
|
479 reg_class_dynamic int_no_rcx_reg(int_no_rcx_reg_no_rbp, int_no_rcx_reg_with_rbp, %{ PreserveFramePointer %}); |
|
480 |
|
481 // Class for all int registers (excluding RAX, RDX, and RSP) |
|
482 reg_class int_no_rax_rdx_reg_with_rbp(RBP, |
|
483 RDI, |
|
484 RSI, |
|
485 RCX, |
|
486 RBX, |
|
487 R8, |
|
488 R9, |
|
489 R10, |
|
490 R11, |
|
491 R13, |
|
492 R14); |
|
493 |
|
494 // Class for all int registers (excluding RAX, RDX, RSP, and RBP) |
|
495 reg_class int_no_rax_rdx_reg_no_rbp(RDI, |
|
496 RSI, |
|
497 RCX, |
|
498 RBX, |
|
499 R8, |
|
500 R9, |
|
501 R10, |
|
502 R11, |
|
503 R13, |
|
504 R14); |
|
505 |
|
506 // Dynamic register class that selects between int_no_rax_rdx_reg_no_rbp and int_no_rax_rdx_reg_with_rbp. |
|
507 reg_class_dynamic int_no_rax_rdx_reg(int_no_rax_rdx_reg_no_rbp, int_no_rax_rdx_reg_with_rbp, %{ PreserveFramePointer %}); |
|
508 |
287 |
509 // Singleton class for RAX int register |
288 // Singleton class for RAX int register |
510 reg_class int_rax_reg(RAX); |
289 reg_class int_rax_reg(RAX); |
511 |
290 |
512 // Singleton class for RBX int register |
291 // Singleton class for RBX int register |
527 %} |
306 %} |
528 |
307 |
529 //----------SOURCE BLOCK------------------------------------------------------- |
308 //----------SOURCE BLOCK------------------------------------------------------- |
530 // This is a block of C++ code which provides values, functions, and |
309 // This is a block of C++ code which provides values, functions, and |
531 // definitions necessary in the rest of the architecture description |
310 // definitions necessary in the rest of the architecture description |
|
311 source_hpp %{ |
|
312 |
|
313 extern RegMask _ANY_REG_mask; |
|
314 extern RegMask _PTR_REG_mask; |
|
315 extern RegMask _PTR_REG_NO_RBP_mask; |
|
316 extern RegMask _PTR_NO_RAX_REG_mask; |
|
317 extern RegMask _PTR_NO_RAX_RBX_REG_mask; |
|
318 extern RegMask _LONG_REG_mask; |
|
319 extern RegMask _LONG_NO_RAX_RDX_REG_mask; |
|
320 extern RegMask _LONG_NO_RCX_REG_mask; |
|
321 extern RegMask _INT_REG_mask; |
|
322 extern RegMask _INT_NO_RAX_RDX_REG_mask; |
|
323 extern RegMask _INT_NO_RCX_REG_mask; |
|
324 |
|
325 extern RegMask _STACK_OR_PTR_REG_mask; |
|
326 extern RegMask _STACK_OR_LONG_REG_mask; |
|
327 extern RegMask _STACK_OR_INT_REG_mask; |
|
328 |
|
329 inline const RegMask& STACK_OR_PTR_REG_mask() { return _STACK_OR_PTR_REG_mask; } |
|
330 inline const RegMask& STACK_OR_LONG_REG_mask() { return _STACK_OR_LONG_REG_mask; } |
|
331 inline const RegMask& STACK_OR_INT_REG_mask() { return _STACK_OR_INT_REG_mask; } |
|
332 |
|
333 %} |
|
334 |
532 source %{ |
335 source %{ |
533 #define RELOC_IMM64 Assembler::imm_operand |
336 #define RELOC_IMM64 Assembler::imm_operand |
534 #define RELOC_DISP32 Assembler::disp32_operand |
337 #define RELOC_DISP32 Assembler::disp32_operand |
535 |
338 |
536 #define __ _masm. |
339 #define __ _masm. |
|
340 |
|
341 RegMask _ANY_REG_mask; |
|
342 RegMask _PTR_REG_mask; |
|
343 RegMask _PTR_REG_NO_RBP_mask; |
|
344 RegMask _PTR_NO_RAX_REG_mask; |
|
345 RegMask _PTR_NO_RAX_RBX_REG_mask; |
|
346 RegMask _LONG_REG_mask; |
|
347 RegMask _LONG_NO_RAX_RDX_REG_mask; |
|
348 RegMask _LONG_NO_RCX_REG_mask; |
|
349 RegMask _INT_REG_mask; |
|
350 RegMask _INT_NO_RAX_RDX_REG_mask; |
|
351 RegMask _INT_NO_RCX_REG_mask; |
|
352 RegMask _STACK_OR_PTR_REG_mask; |
|
353 RegMask _STACK_OR_LONG_REG_mask; |
|
354 RegMask _STACK_OR_INT_REG_mask; |
|
355 |
|
356 static bool need_r12_heapbase() { |
|
357 return UseCompressedOops || UseCompressedClassPointers || UseZGC; |
|
358 } |
|
359 |
|
360 void reg_mask_init() { |
|
361 // _ALL_REG_mask is generated by adlc from the all_reg register class below. |
|
362 // We derive a number of subsets from it. |
|
363 _ANY_REG_mask = _ALL_REG_mask; |
|
364 |
|
365 if (PreserveFramePointer) { |
|
366 _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); |
|
367 _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); |
|
368 } |
|
369 if (need_r12_heapbase()) { |
|
370 _ANY_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg())); |
|
371 _ANY_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg()->next())); |
|
372 } |
|
373 |
|
374 _PTR_REG_mask = _ANY_REG_mask; |
|
375 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg())); |
|
376 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); |
|
377 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg())); |
|
378 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()->next())); |
|
379 |
|
380 _STACK_OR_PTR_REG_mask = _PTR_REG_mask; |
|
381 _STACK_OR_PTR_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); |
|
382 |
|
383 _PTR_REG_NO_RBP_mask = _PTR_REG_mask; |
|
384 _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); |
|
385 _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); |
|
386 |
|
387 _PTR_NO_RAX_REG_mask = _PTR_REG_mask; |
|
388 _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); |
|
389 _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); |
|
390 |
|
391 _PTR_NO_RAX_RBX_REG_mask = _PTR_NO_RAX_REG_mask; |
|
392 _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg())); |
|
393 _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); |
|
394 |
|
395 _LONG_REG_mask = _PTR_REG_mask; |
|
396 _STACK_OR_LONG_REG_mask = _LONG_REG_mask; |
|
397 _STACK_OR_LONG_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); |
|
398 |
|
399 _LONG_NO_RAX_RDX_REG_mask = _LONG_REG_mask; |
|
400 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); |
|
401 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); |
|
402 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg())); |
|
403 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next())); |
|
404 |
|
405 _LONG_NO_RCX_REG_mask = _LONG_REG_mask; |
|
406 _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg())); |
|
407 _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next())); |
|
408 |
|
409 _INT_REG_mask = _ALL_INT_REG_mask; |
|
410 if (PreserveFramePointer) { |
|
411 _INT_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); |
|
412 } |
|
413 if (need_r12_heapbase()) { |
|
414 _INT_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg())); |
|
415 } |
|
416 |
|
417 _STACK_OR_INT_REG_mask = _INT_REG_mask; |
|
418 _STACK_OR_INT_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); |
|
419 |
|
420 _INT_NO_RAX_RDX_REG_mask = _INT_REG_mask; |
|
421 _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); |
|
422 _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg())); |
|
423 |
|
424 _INT_NO_RCX_REG_mask = _INT_REG_mask; |
|
425 _INT_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg())); |
|
426 } |
537 |
427 |
538 static bool generate_vzeroupper(Compile* C) { |
428 static bool generate_vzeroupper(Compile* C) { |
539 return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false; // Generate vzeroupper |
429 return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false; // Generate vzeroupper |
540 } |
430 } |
541 |
431 |