< prev index next >

src/hotspot/cpu/x86/x86_64.ad

Print this page
rev 53738 : [mq]: JDK-8217909.patch


 152                    RAX,         RAX_H,
 153                    RBP,         RBP_H,
 154                    R13,         R13_H,
 155                    R14,         R14_H,
 156                    R15,         R15_H,
 157                    RSP,         RSP_H);
 158 
 159 
 160 //----------Architecture Description Register Classes--------------------------
 161 // Several register classes are automatically defined based upon information in
 162 // this architecture description.
 163 // 1) reg_class inline_cache_reg           ( /* as def'd in frame section */ )
 164 // 2) reg_class compiler_method_oop_reg    ( /* as def'd in frame section */ )
 165 // 2) reg_class interpreter_method_oop_reg ( /* as def'd in frame section */ )
 166 // 3) reg_class stack_slots( /* one chunk of stack-based "registers" */ )
 167 //
 168 
 169 // Empty register class.
 170 reg_class no_reg();
 171 
 172 // Class for all pointer registers (including RSP and RBP)
 173 reg_class any_reg_with_rbp(RAX, RAX_H,
 174                            RDX, RDX_H,
 175                            RBP, RBP_H,
 176                            RDI, RDI_H,
 177                            RSI, RSI_H,
 178                            RCX, RCX_H,
 179                            RBX, RBX_H,
 180                            RSP, RSP_H,
 181                            R8,  R8_H,
 182                            R9,  R9_H,
 183                            R10, R10_H,
 184                            R11, R11_H,
 185                            R12, R12_H,
 186                            R13, R13_H,
 187                            R14, R14_H,
 188                            R15, R15_H);
 189 
 190 // Class for all pointer registers (including RSP, but excluding RBP)
 191 reg_class any_reg_no_rbp(RAX, RAX_H,
 192                          RDX, RDX_H,
 193                          RDI, RDI_H,
 194                          RSI, RSI_H,
 195                          RCX, RCX_H,
 196                          RBX, RBX_H,
 197                          RSP, RSP_H,
 198                          R8,  R8_H,
 199                          R9,  R9_H,
 200                          R10, R10_H,
 201                          R11, R11_H,
 202                          R12, R12_H,
 203                          R13, R13_H,
 204                          R14, R14_H,
 205                          R15, R15_H);
 206 
 207 // Dynamic register class that selects at runtime between register classes
 208 // any_reg_no_rbp and any_reg_with_rbp (depending on the value of the flag PreserveFramePointer).
 209 // Equivalent to: return PreserveFramePointer ? any_reg_no_rbp : any_reg_with_rbp;
 210 reg_class_dynamic any_reg(any_reg_no_rbp, any_reg_with_rbp, %{ PreserveFramePointer %});
 211 
 212 // Class for all pointer registers (excluding RSP)
 213 reg_class ptr_reg_with_rbp(RAX, RAX_H,
 214                            RDX, RDX_H,
 215                            RBP, RBP_H,
 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 
 227 // Class for all pointer registers (excluding RSP and RBP)
 228 reg_class ptr_reg_no_rbp(RAX, RAX_H,
 229                          RDX, RDX_H,
 230                          RDI, RDI_H,
 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 
 244 // Class for all pointer registers (excluding RAX and RSP)
 245 reg_class ptr_no_rax_reg_with_rbp(RDX, RDX_H,
 246                                   RBP, RBP_H,
 247                                   RDI, RDI_H,
 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,


 512 // Singleton class for RBX int register
 513 reg_class int_rbx_reg(RBX);
 514 
 515 // Singleton class for RCX int register
 516 reg_class int_rcx_reg(RCX);
 517 
 518 // Singleton class for RCX int register
 519 reg_class int_rdx_reg(RDX);
 520 
 521 // Singleton class for RCX int register
 522 reg_class int_rdi_reg(RDI);
 523 
 524 // Singleton class for instruction pointer
 525 // reg_class ip_reg(RIP);
 526 
 527 %}
 528 
 529 //----------SOURCE BLOCK-------------------------------------------------------
 530 // This is a block of C++ code which provides values, functions, and
 531 // definitions necessary in the rest of the architecture description





 532 source %{
 533 #define   RELOC_IMM64    Assembler::imm_operand
 534 #define   RELOC_DISP32   Assembler::disp32_operand
 535 
 536 #define __ _masm.


















 537 
 538 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
 540 }
 541 
 542 static int clear_avx_size() {
 543   return generate_vzeroupper(Compile::current()) ? 3: 0;  // vzeroupper
 544 }
 545 
 546 // !!!!! Special hack to get all types of calls to specify the byte offset
 547 //       from the start of the call to the point where the return address
 548 //       will point.
 549 int MachCallStaticJavaNode::ret_addr_offset()
 550 {
 551   int offset = 5; // 5 bytes from start of call to where return address points
 552   offset += clear_avx_size();
 553   return offset;
 554 }
 555 
 556 int MachCallDynamicJavaNode::ret_addr_offset()




 152                    RAX,         RAX_H,
 153                    RBP,         RBP_H,
 154                    R13,         R13_H,
 155                    R14,         R14_H,
 156                    R15,         R15_H,
 157                    RSP,         RSP_H);
 158 
 159 
 160 //----------Architecture Description Register Classes--------------------------
 161 // Several register classes are automatically defined based upon information in
 162 // this architecture description.
 163 // 1) reg_class inline_cache_reg           ( /* as def'd in frame section */ )
 164 // 2) reg_class compiler_method_oop_reg    ( /* as def'd in frame section */ )
 165 // 2) reg_class interpreter_method_oop_reg ( /* as def'd in frame section */ )
 166 // 3) reg_class stack_slots( /* one chunk of stack-based "registers" */ )
 167 //
 168 
 169 // Empty register class.
 170 reg_class no_reg();
 171 
 172 // Class for all pointer registers
 173 reg_class all_reg(RAX, RAX_H,
 174                   RDX, RDX_H,
 175                   RBP, RBP_H,
 176                   RDI, RDI_H,
 177                   RSI, RSI_H,
 178                   RCX, RCX_H,
 179                   RBX, RBX_H,
 180                   RSP, RSP_H,
 181                   R8,  R8_H,
 182                   R9,  R9_H,
 183                   R10, R10_H,
 184                   R11, R11_H,
 185                   R12, R12_H,
 186                   R13, R13_H,
 187                   R14, R14_H,
 188                   R15, R15_H);
 189 
 190 // Class for all pointer registers
 191 reg_class any_reg %{
 192   return _ANY_REG_mask;
 193 %}

















 194 
 195 // Class for all pointer registers (excluding RSP)
 196 reg_class ptr_reg %{
 197   return _PTR_REG_mask;
 198 %}



























 199 
 200 // Class for all pointer registers (excluding RAX and RSP)
 201 reg_class ptr_no_rax_reg_with_rbp(RDX, RDX_H,
 202                                   RBP, RBP_H,
 203                                   RDI, RDI_H,
 204                                   RSI, RSI_H,
 205                                   RCX, RCX_H,
 206                                   RBX, RBX_H,
 207                                   R8,  R8_H,
 208                                   R9,  R9_H,
 209                                   R10, R10_H,
 210                                   R11, R11_H,
 211                                   R13, R13_H,
 212                                   R14, R14_H);
 213 
 214 // Class for all pointer registers (excluding RAX, RSP, and RBP)
 215 reg_class ptr_no_rax_reg_no_rbp(RDX, RDX_H,
 216                                 RDI, RDI_H,
 217                                 RSI, RSI_H,
 218                                 RCX, RCX_H,


 468 // Singleton class for RBX int register
 469 reg_class int_rbx_reg(RBX);
 470 
 471 // Singleton class for RCX int register
 472 reg_class int_rcx_reg(RCX);
 473 
 474 // Singleton class for RCX int register
 475 reg_class int_rdx_reg(RDX);
 476 
 477 // Singleton class for RCX int register
 478 reg_class int_rdi_reg(RDI);
 479 
 480 // Singleton class for instruction pointer
 481 // reg_class ip_reg(RIP);
 482 
 483 %}
 484 
 485 //----------SOURCE BLOCK-------------------------------------------------------
 486 // This is a block of C++ code which provides values, functions, and
 487 // definitions necessary in the rest of the architecture description
 488 source_hpp %{
 489 extern RegMask _ANY_REG_mask;
 490 extern RegMask _PTR_REG_mask;
 491 %}
 492 
 493 source %{
 494 #define   RELOC_IMM64    Assembler::imm_operand
 495 #define   RELOC_DISP32   Assembler::disp32_operand
 496 
 497 #define __ _masm.
 498 
 499 RegMask _ANY_REG_mask;
 500 RegMask _PTR_REG_mask;
 501 
 502 void reg_mask_init() {
 503   // _ALL_REG_mask is generated by adlc from the all_reg register class below.
 504   // We derive a number of subsets from it.
 505   _ANY_REG_mask = _ALL_REG_mask;
 506   if (PreserveFramePointer) {
 507     _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()));
 508     _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next()));
 509   }
 510 
 511   _PTR_REG_mask = _ANY_REG_mask;
 512   _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()));
 513   _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next()));
 514  
 515 }
 516 
 517 static bool generate_vzeroupper(Compile* C) {
 518   return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false;  // Generate vzeroupper
 519 }
 520 
 521 static int clear_avx_size() {
 522   return generate_vzeroupper(Compile::current()) ? 3: 0;  // vzeroupper
 523 }
 524 
 525 // !!!!! Special hack to get all types of calls to specify the byte offset
 526 //       from the start of the call to the point where the return address
 527 //       will point.
 528 int MachCallStaticJavaNode::ret_addr_offset()
 529 {
 530   int offset = 5; // 5 bytes from start of call to where return address points
 531   offset += clear_avx_size();
 532   return offset;
 533 }
 534 
 535 int MachCallDynamicJavaNode::ret_addr_offset()


< prev index next >