< prev index next >

src/hotspot/cpu/x86/x86_64.ad

Print this page
rev 53791 : [mq]: JDK-8217909.patch
rev 53792 : [mq]: JDK-8217909-03.patch


 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 


< prev index next >