241 // Class for all long registers (excluding RCX and RSP)
242 reg_class long_no_rcx_reg %{
243 return _LONG_NO_RCX_REG_mask;
244 %}
245
246 // Class for all int registers (excluding RSP)
247 reg_class int_reg %{
248 return _INT_REG_mask;
249 %}
250
251 // Class for all int registers (excluding RAX, RDX, and RSP)
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 %}
260
261 // Class for all pointer registers (including RSP and RBP)
262 reg_class any_reg0_with_rbp(RAX, RAX_H,
263 RDX, RDX_H,
264 RBP, RBP_H,
265 RDI, RDI_H,
266 RSI, RSI_H,
267 RCX, RCX_H,
268 RBX, RBX_H,
269 RSP, RSP_H,
270 R8, R8_H,
271 R9, R9_H,
272 R10, R10_H,
273 R11, R11_H,
274 R12, R12_H,
275 R13, R13_H,
276 R14, R14_H,
277 R15, R15_H);
278
279 // Class for all pointer registers (including RSP, but excluding RBP)
280 reg_class any_reg0_no_rbp(RAX, RAX_H,
281 RDX, RDX_H,
282 RDI, RDI_H,
283 RSI, RSI_H,
284 RCX, RCX_H,
285 RBX, RBX_H,
286 RSP, RSP_H,
287 R8, R8_H,
288 R9, R9_H,
289 R10, R10_H,
290 R11, R11_H,
291 R12, R12_H,
292 R13, R13_H,
293 R14, R14_H,
294 R15, R15_H);
295
296 // Dynamic register class that selects at runtime between register classes
297 // any_reg_no_rbp and any_reg_with_rbp (depending on the value of the flag PreserveFramePointer).
298 // Equivalent to: return PreserveFramePointer ? any_reg_no_rbp : any_reg_with_rbp;
299 reg_class_dynamic any_reg0(any_reg0_no_rbp, any_reg0_with_rbp, %{ PreserveFramePointer %});
300
301 // Class for all pointer registers
302 reg_class ptr_reg0_with_rbp(RAX, RAX_H,
303 RDX, RDX_H,
304 RBP, RBP_H,
305 RDI, RDI_H,
306 RSI, RSI_H,
307 RCX, RCX_H,
308 RBX, RBX_H,
309 R8, R8_H,
310 R9, R9_H,
311 R10, R10_H,
312 R11, R11_H,
313 R13, R13_H,
314 R14, R14_H);
315
316 reg_class ptr_reg0_no_rbp(RAX, RAX_H,
317 RDX, RDX_H,
318 RDI, RDI_H,
319 RSI, RSI_H,
320 RCX, RCX_H,
321 RBX, RBX_H,
322 R8, R8_H,
323 R9, R9_H,
324 R10, R10_H,
325 R11, R11_H,
326 R13, R13_H,
327 R14, R14_H);
328
329 // Dynamic register class that selects between ptr_reg_no_rbp and ptr_reg_with_rbp.
330 reg_class_dynamic ptr_reg0(ptr_reg0_no_rbp, ptr_reg0_with_rbp, %{ PreserveFramePointer %});
331
332 // Class for all pointer registers (excluding RAX and RSP)
333 reg_class ptr_no_rax_reg0_with_rbp(RDX, RDX_H,
334 RBP, RBP_H,
335 RDI, RDI_H,
336 RSI, RSI_H,
337 RCX, RCX_H,
338 RBX, RBX_H,
339 R8, R8_H,
340 R9, R9_H,
341 R10, R10_H,
342 R11, R11_H,
343 R13, R13_H,
344 R14, R14_H);
345
346 // Class for all pointer registers (excluding RAX, RSP, and RBP)
347 reg_class ptr_no_rax_reg0_no_rbp(RDX, RDX_H,
348 RDI, RDI_H,
349 RSI, RSI_H,
350 RCX, RCX_H,
351 RBX, RBX_H,
352 R8, R8_H,
353 R9, R9_H,
354 R10, R10_H,
355 R11, R11_H,
356 R13, R13_H,
357 R14, R14_H);
358
359 // Dynamic register class that selects between ptr_no_rax_reg_no_rbp and ptr_no_rax_reg_with_rbp.
360 reg_class_dynamic ptr_no_rax_reg0(ptr_no_rax_reg0_no_rbp, ptr_no_rax_reg0_with_rbp, %{ PreserveFramePointer %});
361
362 // Class for all pointer registers (excluding RAX, RBX, and RSP)
363 reg_class ptr_no_rax_rbx_reg0_with_rbp(RDX, RDX_H,
364 RBP, RBP_H,
365 RDI, RDI_H,
366 RSI, RSI_H,
367 RCX, RCX_H,
368 R8, R8_H,
369 R9, R9_H,
370 R10, R10_H,
371 R11, R11_H,
372 R13, R13_H,
373 R14, R14_H);
374
375 // Class for all pointer registers (excluding RAX, RBX, RSP, and RBP)
376 reg_class ptr_no_rax_rbx_reg0_no_rbp(RDX, RDX_H,
377 RDI, RDI_H,
378 RSI, RSI_H,
379 RCX, RCX_H,
380 R8, R8_H,
381 R9, R9_H,
382 R10, R10_H,
383 R11, R11_H,
384 R13, R13_H,
385 R14, R14_H);
386
387 // Dynamic register class that selects between ptr_no_rax_rbx_reg_no_rbp and ptr_no_rax_rbx_reg_with_rbp.
388 reg_class_dynamic ptr_no_rax_rbx_reg0(ptr_no_rax_rbx_reg0_no_rbp, ptr_no_rax_rbx_reg0_with_rbp, %{ PreserveFramePointer %});
389
390 // Singleton class for RAX pointer register
391 reg_class ptr_rax_reg(RAX, RAX_H);
392
393 // Singleton class for RBX pointer register
394 reg_class ptr_rbx_reg(RBX, RBX_H);
395
396 // Singleton class for RSI pointer register
397 reg_class ptr_rsi_reg(RSI, RSI_H);
398
399 // Singleton class for RDI pointer register
400 reg_class ptr_rdi_reg(RDI, RDI_H);
401
402 // Singleton class for stack pointer
403 reg_class ptr_rsp_reg(RSP, RSP_H);
404
405 // Singleton class for TLS pointer
406 reg_class ptr_r15_reg(R15, R15_H);
407
408 // Class for all long registers (excluding RSP)
409 reg_class long_reg0_with_rbp(RAX, RAX_H,
410 RDX, RDX_H,
411 RBP, RBP_H,
412 RDI, RDI_H,
413 RSI, RSI_H,
414 RCX, RCX_H,
415 RBX, RBX_H,
416 R8, R8_H,
417 R9, R9_H,
418 R10, R10_H,
419 R11, R11_H,
420 R13, R13_H,
421 R14, R14_H);
422
423 // Class for all long registers (excluding RSP and RBP)
424 reg_class long_reg0_no_rbp(RAX, RAX_H,
425 RDX, RDX_H,
426 RDI, RDI_H,
427 RSI, RSI_H,
428 RCX, RCX_H,
429 RBX, RBX_H,
430 R8, R8_H,
431 R9, R9_H,
432 R10, R10_H,
433 R11, R11_H,
434 R13, R13_H,
435 R14, R14_H);
436
437 // Dynamic register class that selects between long_reg_no_rbp and long_reg_with_rbp.
438 reg_class_dynamic long_reg0(long_reg0_no_rbp, long_reg0_with_rbp, %{ PreserveFramePointer %});
439
440 // Class for all long registers (excluding RAX, RDX and RSP)
441 reg_class long_no_rax_rdx_reg0_with_rbp(RBP, RBP_H,
442 RDI, RDI_H,
443 RSI, RSI_H,
444 RCX, RCX_H,
445 RBX, RBX_H,
446 R8, R8_H,
447 R9, R9_H,
448 R10, R10_H,
449 R11, R11_H,
450 R13, R13_H,
451 R14, R14_H);
452
453 // Class for all long registers (excluding RAX, RDX, RSP, and RBP)
454 reg_class long_no_rax_rdx_reg0_no_rbp(RDI, RDI_H,
455 RSI, RSI_H,
456 RCX, RCX_H,
457 RBX, RBX_H,
458 R8, R8_H,
459 R9, R9_H,
460 R10, R10_H,
461 R11, R11_H,
462 R13, R13_H,
463 R14, R14_H);
464
465 // Dynamic register class that selects between long_no_rax_rdx_reg_no_rbp and long_no_rax_rdx_reg_with_rbp.
466 reg_class_dynamic long_no_rax_rdx_reg0(long_no_rax_rdx_reg0_no_rbp, long_no_rax_rdx_reg0_with_rbp, %{ PreserveFramePointer %});
467
468 // Class for all long registers (excluding RCX and RSP)
469 reg_class long_no_rcx_reg0_with_rbp(RBP, RBP_H,
470 RDI, RDI_H,
471 RSI, RSI_H,
472 RAX, RAX_H,
473 RDX, RDX_H,
474 RBX, RBX_H,
475 R8, R8_H,
476 R9, R9_H,
477 R10, R10_H,
478 R11, R11_H,
479 R13, R13_H,
480 R14, R14_H);
481
482 // Class for all long registers (excluding RCX, RSP, and RBP)
483 reg_class long_no_rcx_reg0_no_rbp(RDI, RDI_H,
484 RSI, RSI_H,
485 RAX, RAX_H,
486 RDX, RDX_H,
487 RBX, RBX_H,
488 R8, R8_H,
489 R9, R9_H,
490 R10, R10_H,
491 R11, R11_H,
492 R13, R13_H,
493 R14, R14_H);
494
495 // Dynamic register class that selects between long_no_rcx_reg_no_rbp and long_no_rcx_reg_with_rbp.
496 reg_class_dynamic long_no_rcx_reg0(long_no_rcx_reg0_no_rbp, long_no_rcx_reg0_with_rbp, %{ PreserveFramePointer %});
497
498 // Singleton class for RAX long register
499 reg_class long_rax_reg(RAX, RAX_H);
500
501 // Singleton class for RCX long register
502 reg_class long_rcx_reg(RCX, RCX_H);
503
504 // Singleton class for RDX long register
505 reg_class long_rdx_reg(RDX, RDX_H);
506
507 // Class for all int registers (excluding RSP)
508 reg_class int_reg0_with_rbp(RAX,
509 RDX,
510 RBP,
511 RDI,
512 RSI,
513 RCX,
514 RBX,
515 R8,
516 R9,
517 R10,
518 R11,
519 R13,
520 R14);
521
522 // Class for all int registers (excluding RSP and RBP)
523 reg_class int_reg0_no_rbp(RAX,
524 RDX,
525 RDI,
526 RSI,
527 RCX,
528 RBX,
529 R8,
530 R9,
531 R10,
532 R11,
533 R13,
534 R14);
535
536 // Dynamic register class that selects between int_reg_no_rbp and int_reg_with_rbp.
537 reg_class_dynamic int_reg0(int_reg0_no_rbp, int_reg0_with_rbp, %{ PreserveFramePointer %});
538
539 // Class for all int registers (excluding RCX and RSP)
540 reg_class int_no_rcx_reg0_with_rbp(RAX,
541 RDX,
542 RBP,
543 RDI,
544 RSI,
545 RBX,
546 R8,
547 R9,
548 R10,
549 R11,
550 R13,
551 R14);
552
553 // Class for all int registers (excluding RCX, RSP, and RBP)
554 reg_class int_no_rcx_reg0_no_rbp(RAX,
555 RDX,
556 RDI,
557 RSI,
558 RBX,
559 R8,
560 R9,
561 R10,
562 R11,
563 R13,
564 R14);
565
566 // Dynamic register class that selects between int_no_rcx_reg_no_rbp and int_no_rcx_reg_with_rbp.
567 reg_class_dynamic int_no_rcx_reg0(int_no_rcx_reg0_no_rbp, int_no_rcx_reg0_with_rbp, %{ PreserveFramePointer %});
568
569 // Class for all int registers (excluding RAX, RDX, and RSP)
570 reg_class int_no_rax_rdx_reg0_with_rbp(RBP,
571 RDI,
572 RSI,
573 RCX,
574 RBX,
575 R8,
576 R9,
577 R10,
578 R11,
579 R13,
580 R14);
581
582 // Class for all int registers (excluding RAX, RDX, RSP, and RBP)
583 reg_class int_no_rax_rdx_reg0_no_rbp(RDI,
584 RSI,
585 RCX,
586 RBX,
587 R8,
588 R9,
589 R10,
590 R11,
591 R13,
592 R14);
593
594 // Dynamic register class that selects between int_no_rax_rdx_reg_no_rbp and int_no_rax_rdx_reg_with_rbp.
595 reg_class_dynamic int_no_rax_rdx_reg0(int_no_rax_rdx_reg0_no_rbp, int_no_rax_rdx_reg0_with_rbp, %{ PreserveFramePointer %});
596
597 // Singleton class for RAX int register
598 reg_class int_rax_reg(RAX);
599
600 // Singleton class for RBX int register
601 reg_class int_rbx_reg(RBX);
602
603 // Singleton class for RCX int register
604 reg_class int_rcx_reg(RCX);
605
606 // Singleton class for RCX int register
607 reg_class int_rdx_reg(RDX);
608
609 // Singleton class for RCX int register
610 reg_class int_rdi_reg(RDI);
611
612 // Singleton class for instruction pointer
613 // reg_class ip_reg(RIP);
614
615 %}
616
645 #define RELOC_IMM64 Assembler::imm_operand
646 #define RELOC_DISP32 Assembler::disp32_operand
647
648 #define __ _masm.
649
650 RegMask _ANY_REG_mask;
651 RegMask _PTR_REG_mask;
652 RegMask _PTR_REG_NO_RBP_mask;
653 RegMask _PTR_NO_RAX_REG_mask;
654 RegMask _PTR_NO_RAX_RBX_REG_mask;
655 RegMask _LONG_REG_mask;
656 RegMask _LONG_NO_RAX_RDX_REG_mask;
657 RegMask _LONG_NO_RCX_REG_mask;
658 RegMask _INT_REG_mask;
659 RegMask _INT_NO_RAX_RDX_REG_mask;
660 RegMask _INT_NO_RCX_REG_mask;
661 RegMask _STACK_OR_PTR_REG_mask;
662 RegMask _STACK_OR_LONG_REG_mask;
663 RegMask _STACK_OR_INT_REG_mask;
664
665 #ifdef ASSERT
666 static bool same_mask(const RegMask &a, const RegMask &b) {
667 RegMask a_sub_b = a; a_sub_b.SUBTRACT(b);
668 RegMask b_sub_a = b; b_sub_a.SUBTRACT(a);
669 return a_sub_b.Size() == 0 && b_sub_a.Size() == 0;
670 }
671 #endif
672
673 void reg_mask_init() {
674 // _ALL_REG_mask is generated by adlc from the all_reg register class below.
675 // We derive a number of subsets from it.
676 _ANY_REG_mask = _ALL_REG_mask;
677
678 if (PreserveFramePointer) {
679 _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()));
680 _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next()));
681 }
682
683 _PTR_REG_mask = _ANY_REG_mask;
684 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg()));
685 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg()->next()));
686 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()));
687 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next()));
688 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()));
689 _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()->next()));
690
691 _STACK_OR_PTR_REG_mask = _PTR_REG_mask;
692 _STACK_OR_PTR_REG_mask.OR(STACK_OR_STACK_SLOTS_mask());
693
694 _PTR_REG_NO_RBP_mask = _PTR_REG_mask;
695 _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()));
696 _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next()));
697
698 _PTR_NO_RAX_REG_mask = _PTR_REG_mask;
699 _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()));
700 _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next()));
701
702 _PTR_NO_RAX_RBX_REG_mask = _PTR_NO_RAX_REG_mask;
703 _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()));
704 _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next()));
705
706 _LONG_REG_mask = _PTR_REG_mask;
707 _STACK_OR_LONG_REG_mask = _LONG_REG_mask;
708 _STACK_OR_LONG_REG_mask.OR(STACK_OR_STACK_SLOTS_mask());
709
710 _LONG_NO_RAX_RDX_REG_mask = _LONG_REG_mask;
711 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()));
712 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next()));
713 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg()));
714 _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next()));
715
716 _LONG_NO_RCX_REG_mask = _LONG_REG_mask;
717 _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg()));
718 _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next()));
719
720 _INT_REG_mask = _ALL_INT_REG_mask;
721 _INT_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg()));
722 if (PreserveFramePointer) {
723 _INT_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()));
724 }
725
726 _STACK_OR_INT_REG_mask = _INT_REG_mask;
727 _STACK_OR_INT_REG_mask.OR(STACK_OR_STACK_SLOTS_mask());
728
729 _INT_NO_RAX_RDX_REG_mask = _INT_REG_mask;
730 _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()));
731 _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg()));
732
733 _INT_NO_RCX_REG_mask = _INT_REG_mask;
734 _INT_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg()));
735
736 assert(same_mask(_ANY_REG_mask, ANY_REG0_mask()), "!");
737 assert(same_mask(_PTR_REG_mask, PTR_REG0_mask()), "!");
738 assert(same_mask(_PTR_REG_NO_RBP_mask, PTR_REG0_NO_RBP_mask()), "!");
739 assert(same_mask(_PTR_NO_RAX_REG_mask, PTR_NO_RAX_REG0_mask()), "!");
740 assert(same_mask(_PTR_NO_RAX_RBX_REG_mask, PTR_NO_RAX_RBX_REG0_mask()), "!");
741 assert(same_mask(_LONG_REG_mask, LONG_REG0_mask()), "!");
742 assert(same_mask(_LONG_NO_RAX_RDX_REG_mask, LONG_NO_RAX_RDX_REG0_mask()), "!");
743 assert(same_mask(_LONG_NO_RCX_REG_mask, LONG_NO_RCX_REG0_mask()), "!");
744 assert(same_mask(_INT_REG_mask, INT_REG0_mask()), "!");
745 assert(same_mask(_INT_NO_RAX_RDX_REG_mask, INT_NO_RAX_RDX_REG0_mask()), "!");
746 assert(same_mask(_INT_NO_RCX_REG_mask, INT_NO_RCX_REG0_mask()), "!");
747 }
748
749 static bool generate_vzeroupper(Compile* C) {
750 return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false; // Generate vzeroupper
751 }
752
753 static int clear_avx_size() {
754 return generate_vzeroupper(Compile::current()) ? 3: 0; // vzeroupper
755 }
756
757 // !!!!! Special hack to get all types of calls to specify the byte offset
758 // from the start of the call to the point where the return address
759 // will point.
760 int MachCallStaticJavaNode::ret_addr_offset()
761 {
762 int offset = 5; // 5 bytes from start of call to where return address points
763 offset += clear_avx_size();
764 return offset;
765 }
766
|
241 // Class for all long registers (excluding RCX and RSP)
242 reg_class long_no_rcx_reg %{
243 return _LONG_NO_RCX_REG_mask;
244 %}
245
246 // Class for all int registers (excluding RSP)
247 reg_class int_reg %{
248 return _INT_REG_mask;
249 %}
250
251 // Class for all int registers (excluding RAX, RDX, and RSP)
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 %}
260
261 // Singleton class for RAX pointer register
262 reg_class ptr_rax_reg(RAX, RAX_H);
263
264 // Singleton class for RBX pointer register
265 reg_class ptr_rbx_reg(RBX, RBX_H);
266
267 // Singleton class for RSI pointer register
268 reg_class ptr_rsi_reg(RSI, RSI_H);
269
270 // Singleton class for RDI pointer register
271 reg_class ptr_rdi_reg(RDI, RDI_H);
272
273 // Singleton class for stack pointer
274 reg_class ptr_rsp_reg(RSP, RSP_H);
275
276 // Singleton class for TLS pointer
277 reg_class ptr_r15_reg(R15, R15_H);
278
279 // Singleton class for RAX long register
280 reg_class long_rax_reg(RAX, RAX_H);
281
282 // Singleton class for RCX long register
283 reg_class long_rcx_reg(RCX, RCX_H);
284
285 // Singleton class for RDX long register
286 reg_class long_rdx_reg(RDX, RDX_H);
287
288 // Singleton class for RAX int register
289 reg_class int_rax_reg(RAX);
290
291 // Singleton class for RBX int register
292 reg_class int_rbx_reg(RBX);
293
294 // Singleton class for RCX int register
295 reg_class int_rcx_reg(RCX);
296
297 // Singleton class for RCX int register
298 reg_class int_rdx_reg(RDX);
299
300 // Singleton class for RCX int register
301 reg_class int_rdi_reg(RDI);
302
303 // Singleton class for instruction pointer
304 // reg_class ip_reg(RIP);
305
306 %}
307
336 #define RELOC_IMM64 Assembler::imm_operand
337 #define RELOC_DISP32 Assembler::disp32_operand
338
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 }
427
428 static bool generate_vzeroupper(Compile* C) {
429 return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false; // Generate vzeroupper
430 }
431
432 static int clear_avx_size() {
433 return generate_vzeroupper(Compile::current()) ? 3: 0; // vzeroupper
434 }
435
436 // !!!!! Special hack to get all types of calls to specify the byte offset
437 // from the start of the call to the point where the return address
438 // will point.
439 int MachCallStaticJavaNode::ret_addr_offset()
440 {
441 int offset = 5; // 5 bytes from start of call to where return address points
442 offset += clear_avx_size();
443 return offset;
444 }
445
|