src/cpu/x86/vm/x86_64.ad
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot-comp Sdiff src/cpu/x86/vm

src/cpu/x86/vm/x86_64.ad

Print this page




 557 
 558 // !!!!! Special hack to get all types of calls to specify the byte offset
 559 //       from the start of the call to the point where the return address
 560 //       will point.
 561 int MachCallStaticJavaNode::ret_addr_offset()
 562 {
 563   int offset = 5; // 5 bytes from start of call to where return address points
 564   if (_method_handle_invoke)
 565     offset += preserve_SP_size();
 566   return offset;
 567 }
 568 
 569 int MachCallDynamicJavaNode::ret_addr_offset()
 570 {
 571   return 15; // 15 bytes from start of call to where return address points
 572 }
 573 
 574 // In os_cpu .ad file
 575 // int MachCallRuntimeNode::ret_addr_offset()
 576 
 577 // Indicate if the safepoint node needs the polling page as an input.
 578 // Since amd64 does not have absolute addressing but RIP-relative
 579 // addressing and the polling page is within 2G, it doesn't.
 580 bool SafePointNode::needs_polling_address_input()
 581 {
 582   return false;
 583 }
 584 
 585 //
 586 // Compute padding required for nodes which need alignment
 587 //
 588 
 589 // The address of the call instruction needs to be 4-byte aligned to
 590 // ensure that it does not span a cache line so that it can be patched.
 591 int CallStaticJavaDirectNode::compute_padding(int current_offset) const
 592 {
 593   current_offset += 1; // skip call opcode byte
 594   return round_to(current_offset, alignment_required()) - current_offset;
 595 }
 596 
 597 // The address of the call instruction needs to be 4-byte aligned to
 598 // ensure that it does not span a cache line so that it can be patched.
 599 int CallStaticJavaHandleNode::compute_padding(int current_offset) const
 600 {
 601   current_offset += preserve_SP_size();   // skip mov rbp, rsp
 602   current_offset += 1; // skip call opcode byte


 975                               // the hard way
 976 }
 977 
 978 int MachPrologNode::reloc() const
 979 {
 980   return 0; // a large enough number
 981 }
 982 
 983 //=============================================================================
 984 #ifndef PRODUCT
 985 void MachEpilogNode::format(PhaseRegAlloc* ra_, outputStream* st) const
 986 {
 987   Compile* C = ra_->C;
 988   int framesize = C->frame_slots() << LogBytesPerInt;
 989   assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
 990   // Remove word for return adr already pushed
 991   // and RBP
 992   framesize -= 2*wordSize;
 993 
 994   if (framesize) {
 995     st->print_cr("addq\trsp, %d\t# Destroy frame", framesize);
 996     st->print("\t");
 997   }
 998 
 999   st->print_cr("popq\trbp");
1000   if (do_polling() && C->is_method_compilation()) {
1001     st->print_cr("\ttestl\trax, [rip + #offset_to_poll_page]\t"
1002                   "# Safepoint: poll for GC");
1003     st->print("\t");








1004   }
1005 }
1006 #endif
1007 
1008 void MachEpilogNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
1009 {
1010   Compile* C = ra_->C;
1011   int framesize = C->frame_slots() << LogBytesPerInt;
1012   assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
1013   // Remove word for return adr already pushed
1014   // and RBP
1015   framesize -= 2*wordSize;
1016 
1017   // Note that VerifyStackAtCalls' Majik cookie does not change the frame size popped here
1018 
1019   if (framesize) {
1020     emit_opcode(cbuf, Assembler::REX_W);
1021     if (framesize < 0x80) {
1022       emit_opcode(cbuf, 0x83); // addq rsp, #framesize
1023       emit_rm(cbuf, 0x3, 0x00, RSP_enc);
1024       emit_d8(cbuf, framesize);
1025     } else {
1026       emit_opcode(cbuf, 0x81); // addq rsp, #framesize
1027       emit_rm(cbuf, 0x3, 0x00, RSP_enc);
1028       emit_d32(cbuf, framesize);
1029     }
1030   }
1031 
1032   // popq rbp
1033   emit_opcode(cbuf, 0x58 | RBP_enc);
1034 
1035   if (do_polling() && C->is_method_compilation()) {
1036     // testl %rax, off(%rip) // Opcode + ModRM + Disp32 == 6 bytes
1037     // XXX reg_mem doesn't support RIP-relative addressing yet
1038     cbuf.set_insts_mark();
1039     cbuf.relocate(cbuf.insts_mark(), relocInfo::poll_return_type, 0); // XXX
1040     emit_opcode(cbuf, 0x85); // testl
1041     emit_rm(cbuf, 0x0, RAX_enc, 0x5); // 00 rax 101 == 0x5
1042     // cbuf.insts_mark() is beginning of instruction
1043     emit_d32_reloc(cbuf, os::get_polling_page());
1044 //                    relocInfo::poll_return_type,
1045   }
1046 }
1047 
1048 uint MachEpilogNode::size(PhaseRegAlloc* ra_) const
1049 {
1050   Compile* C = ra_->C;
1051   int framesize = C->frame_slots() << LogBytesPerInt;
1052   assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
1053   // Remove word for return adr already pushed
1054   // and RBP
1055   framesize -= 2*wordSize;
1056 
1057   uint size = 0;
1058 
1059   if (do_polling() && C->is_method_compilation()) {
1060     size += 6;
1061   }
1062 
1063   // count popq rbp
1064   size++;
1065 
1066   if (framesize) {
1067     if (framesize < 0x80) {
1068       size += 4;
1069     } else if (framesize) {
1070       size += 7;
1071     }
1072   }
1073 
1074   return size;
1075 }
1076 
1077 int MachEpilogNode::reloc() const
1078 {
1079   return 2; // a large enough number
1080 }
1081 
1082 const Pipeline* MachEpilogNode::pipeline() const
1083 {
1084   return MachNode::pipeline_class();
1085 }
1086 
1087 int MachEpilogNode::safepoint_offset() const
1088 {
1089   return 0;
1090 }
1091 
1092 //=============================================================================
1093 
1094 enum RC {


3893     emit_opcode(cbuf, 0x11);
3894     encode_RegMem(cbuf, srcenc, RSP_enc, 0x4, 0, 0, false); // 2 bytes
3895 
3896     // call d2l_fixup
3897     cbuf.set_insts_mark();
3898     emit_opcode(cbuf, 0xE8);
3899     emit_d32_reloc(cbuf,
3900                    (int)
3901                    (StubRoutines::x86::d2l_fixup() - cbuf.insts_end() - 4),
3902                    runtime_call_Relocation::spec(),
3903                    RELOC_DISP32);
3904 
3905     // popq $dst
3906     if (dstenc >= 8) {
3907       emit_opcode(cbuf, Assembler::REX_B);
3908     }
3909     emit_opcode(cbuf, 0x58 | (dstenc & 7));
3910 
3911     // done:
3912   %}
3913 
3914   // Safepoint Poll.  This polls the safepoint page, and causes an
3915   // exception if it is not readable. Unfortunately, it kills
3916   // RFLAGS in the process.
3917   enc_class enc_safepoint_poll
3918   %{
3919     // testl %rax, off(%rip) // Opcode + ModRM + Disp32 == 6 bytes
3920     // XXX reg_mem doesn't support RIP-relative addressing yet
3921     cbuf.set_insts_mark();
3922     cbuf.relocate(cbuf.insts_mark(), relocInfo::poll_type, 0); // XXX
3923     emit_opcode(cbuf, 0x85); // testl
3924     emit_rm(cbuf, 0x0, RAX_enc, 0x5); // 00 rax 101 == 0x5
3925     // cbuf.insts_mark() is beginning of instruction
3926     emit_d32_reloc(cbuf, os::get_polling_page());
3927 //                    relocInfo::poll_type,
3928   %}
3929 %}
3930 
3931 
3932 
3933 //----------FRAME--------------------------------------------------------------
3934 // Definition of frame structure and management information.
3935 //
3936 //  S T A C K   L A Y O U T    Allocators stack-slot number
3937 //                             |   (to get allocators register number
3938 //  G  Owned by    |        |  v    add OptoReg::stack0())
3939 //  r   CALLER     |        |
3940 //  o     |        +--------+      pad to even-align allocators stack-slot
3941 //  w     V        |  pad0  |        numbers; owned by CALLER
3942 //  t   -----------+--------+----> Matcher::_in_arg_limit, unaligned
3943 //  h     ^        |   in   |  5
3944 //        |        |  args  |  4   Holes in incoming args owned by SELF
3945 //  |     |        |        |  3
3946 //  |     |        +--------+
3947 //  V     |        | old out|      Empty on Intel, window on Sparc
3948 //        |    old |preserve|      Must be even aligned.


4212 operand immP()
4213 %{
4214   match(ConP);
4215 
4216   op_cost(10);
4217   format %{ %}
4218   interface(CONST_INTER);
4219 %}
4220 
4221 // NULL Pointer Immediate
4222 operand immP0()
4223 %{
4224   predicate(n->get_ptr() == 0);
4225   match(ConP);
4226 
4227   op_cost(5);
4228   format %{ %}
4229   interface(CONST_INTER);
4230 %}
4231 









4232 // Pointer Immediate
4233 operand immN() %{
4234   match(ConN);
4235 
4236   op_cost(10);
4237   format %{ %}
4238   interface(CONST_INTER);
4239 %}
4240 
4241 // NULL Pointer Immediate
4242 operand immN0() %{
4243   predicate(n->get_narrowcon() == 0);
4244   match(ConN);
4245 
4246   op_cost(5);
4247   format %{ %}
4248   interface(CONST_INTER);
4249 %}
4250 
4251 operand immP31()


6547 instruct loadConP(rRegP dst, immP con) %{
6548   match(Set dst con);
6549 
6550   format %{ "movq    $dst, $con\t# ptr" %}
6551   ins_encode(load_immP(dst, con));
6552   ins_pipe(ialu_reg_fat); // XXX
6553 %}
6554 
6555 instruct loadConP0(rRegP dst, immP0 src, rFlagsReg cr)
6556 %{
6557   match(Set dst src);
6558   effect(KILL cr);
6559 
6560   ins_cost(50);
6561   format %{ "xorl    $dst, $dst\t# ptr" %}
6562   opcode(0x33); /* + rd */
6563   ins_encode(REX_reg_reg(dst, dst), OpcP, reg_reg(dst, dst));
6564   ins_pipe(ialu_reg);
6565 %}
6566 










6567 instruct loadConP31(rRegP dst, immP31 src, rFlagsReg cr)
6568 %{
6569   match(Set dst src);
6570   effect(KILL cr);
6571 
6572   ins_cost(60);
6573   format %{ "movl    $dst, $src\t# ptr (positive 32-bit)" %}
6574   ins_encode(load_immP31(dst, src));
6575   ins_pipe(ialu_reg);
6576 %}
6577 
6578 instruct loadConF(regF dst, immF con) %{
6579   match(Set dst con);
6580   ins_cost(125);
6581   format %{ "movss   $dst, [$constantaddress]\t# load from constant table: float=$con" %}
6582   ins_encode %{
6583     __ movflt($dst$$XMMRegister, $constantaddress($con));
6584   %}
6585   ins_pipe(pipe_slow);
6586 %}


12452 %}
12453 
12454 instruct cmpFastUnlock(rFlagsReg cr,
12455                        rRegP object, rax_RegP box, rRegP tmp)
12456 %{
12457   match(Set cr (FastUnlock object box));
12458   effect(TEMP tmp);
12459 
12460   ins_cost(300);
12461   format %{ "fastunlock $object, $box, $tmp" %}
12462   ins_encode(Fast_Unlock(object, box, tmp));
12463   ins_pipe(pipe_slow);
12464   ins_pc_relative(1);
12465 %}
12466 
12467 
12468 // ============================================================================
12469 // Safepoint Instructions
12470 instruct safePoint_poll(rFlagsReg cr)
12471 %{

12472   match(SafePoint);
12473   effect(KILL cr);
12474 
12475   format %{ "testl   rax, [rip + #offset_to_poll_page]\t"
12476             "# Safepoint: poll for GC" %}
12477   size(6); // Opcode + ModRM + Disp32 == 6 bytes
12478   ins_cost(125);
12479   ins_encode(enc_safepoint_poll);



















12480   ins_pipe(ialu_reg_mem);
12481 %}
12482 
12483 // ============================================================================
12484 // Procedure Call/Return Instructions
12485 // Call Java Static Instruction
12486 // Note: If this code changes, the corresponding ret_addr_offset() and
12487 //       compute_padding() functions will have to be adjusted.
12488 instruct CallStaticJavaDirect(method meth) %{
12489   match(CallStaticJava);
12490   predicate(!((CallStaticJavaNode*) n)->is_method_handle_invoke());
12491   effect(USE meth);
12492 
12493   ins_cost(300);
12494   format %{ "call,static " %}
12495   opcode(0xE8); /* E8 cd */
12496   ins_encode(Java_Static_Call(meth), call_epilog);
12497   ins_pipe(pipe_slow);
12498   ins_pc_relative(1);
12499   ins_alignment(4);




 557 
 558 // !!!!! Special hack to get all types of calls to specify the byte offset
 559 //       from the start of the call to the point where the return address
 560 //       will point.
 561 int MachCallStaticJavaNode::ret_addr_offset()
 562 {
 563   int offset = 5; // 5 bytes from start of call to where return address points
 564   if (_method_handle_invoke)
 565     offset += preserve_SP_size();
 566   return offset;
 567 }
 568 
 569 int MachCallDynamicJavaNode::ret_addr_offset()
 570 {
 571   return 15; // 15 bytes from start of call to where return address points
 572 }
 573 
 574 // In os_cpu .ad file
 575 // int MachCallRuntimeNode::ret_addr_offset()
 576 
 577 // Indicate if the safepoint node needs the polling page as an input,
 578 // it does if the polling page is more than disp32 away.

 579 bool SafePointNode::needs_polling_address_input()
 580 {
 581   return Assembler::is_polling_page_far();
 582 }
 583 
 584 //
 585 // Compute padding required for nodes which need alignment
 586 //
 587 
 588 // The address of the call instruction needs to be 4-byte aligned to
 589 // ensure that it does not span a cache line so that it can be patched.
 590 int CallStaticJavaDirectNode::compute_padding(int current_offset) const
 591 {
 592   current_offset += 1; // skip call opcode byte
 593   return round_to(current_offset, alignment_required()) - current_offset;
 594 }
 595 
 596 // The address of the call instruction needs to be 4-byte aligned to
 597 // ensure that it does not span a cache line so that it can be patched.
 598 int CallStaticJavaHandleNode::compute_padding(int current_offset) const
 599 {
 600   current_offset += preserve_SP_size();   // skip mov rbp, rsp
 601   current_offset += 1; // skip call opcode byte


 974                               // the hard way
 975 }
 976 
 977 int MachPrologNode::reloc() const
 978 {
 979   return 0; // a large enough number
 980 }
 981 
 982 //=============================================================================
 983 #ifndef PRODUCT
 984 void MachEpilogNode::format(PhaseRegAlloc* ra_, outputStream* st) const
 985 {
 986   Compile* C = ra_->C;
 987   int framesize = C->frame_slots() << LogBytesPerInt;
 988   assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
 989   // Remove word for return adr already pushed
 990   // and RBP
 991   framesize -= 2*wordSize;
 992 
 993   if (framesize) {
 994     st->print_cr("addq    rsp, %d\t# Destroy frame", framesize);
 995     st->print("\t");
 996   }
 997 
 998   st->print_cr("popq   rbp");
 999   if (do_polling() && C->is_method_compilation()) {


1000     st->print("\t");
1001     if (Assembler::is_polling_page_far()) {
1002       st->print_cr("movq   rscratch1, #polling_page_address\n\t"
1003                    "testl  rax, [rscratch1]\t"
1004                    "# Safepoint: poll for GC");
1005     } else {
1006       st->print_cr("testl  rax, [rip + #offset_to_poll_page]\t"
1007                    "# Safepoint: poll for GC");
1008     }
1009   }
1010 }
1011 #endif
1012 
1013 void MachEpilogNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
1014 {
1015   Compile* C = ra_->C;
1016   int framesize = C->frame_slots() << LogBytesPerInt;
1017   assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
1018   // Remove word for return adr already pushed
1019   // and RBP
1020   framesize -= 2*wordSize;
1021 
1022   // Note that VerifyStackAtCalls' Majik cookie does not change the frame size popped here
1023 
1024   if (framesize) {
1025     emit_opcode(cbuf, Assembler::REX_W);
1026     if (framesize < 0x80) {
1027       emit_opcode(cbuf, 0x83); // addq rsp, #framesize
1028       emit_rm(cbuf, 0x3, 0x00, RSP_enc);
1029       emit_d8(cbuf, framesize);
1030     } else {
1031       emit_opcode(cbuf, 0x81); // addq rsp, #framesize
1032       emit_rm(cbuf, 0x3, 0x00, RSP_enc);
1033       emit_d32(cbuf, framesize);
1034     }
1035   }
1036 
1037   // popq rbp
1038   emit_opcode(cbuf, 0x58 | RBP_enc);
1039 
1040   if (do_polling() && C->is_method_compilation()) {
1041     MacroAssembler _masm(&cbuf);
1042     AddressLiteral polling_page(os::get_polling_page(), relocInfo::poll_return_type);
1043     if (Assembler::is_polling_page_far()) {
1044       __ lea(rscratch1, polling_page);
1045       __ relocate(relocInfo::poll_return_type);
1046       __ testl(rax, Address(rscratch1, 0));
1047     } else {
1048       __ testl(rax, polling_page);
1049     }
1050   }
1051 }
1052 
1053 uint MachEpilogNode::size(PhaseRegAlloc* ra_) const
1054 {
1055   return MachNode::size(ra_); // too many variables; just compute it
1056                               // the hard way























1057 }
1058 
1059 int MachEpilogNode::reloc() const
1060 {
1061   return 2; // a large enough number
1062 }
1063 
1064 const Pipeline* MachEpilogNode::pipeline() const
1065 {
1066   return MachNode::pipeline_class();
1067 }
1068 
1069 int MachEpilogNode::safepoint_offset() const
1070 {
1071   return 0;
1072 }
1073 
1074 //=============================================================================
1075 
1076 enum RC {


3875     emit_opcode(cbuf, 0x11);
3876     encode_RegMem(cbuf, srcenc, RSP_enc, 0x4, 0, 0, false); // 2 bytes
3877 
3878     // call d2l_fixup
3879     cbuf.set_insts_mark();
3880     emit_opcode(cbuf, 0xE8);
3881     emit_d32_reloc(cbuf,
3882                    (int)
3883                    (StubRoutines::x86::d2l_fixup() - cbuf.insts_end() - 4),
3884                    runtime_call_Relocation::spec(),
3885                    RELOC_DISP32);
3886 
3887     // popq $dst
3888     if (dstenc >= 8) {
3889       emit_opcode(cbuf, Assembler::REX_B);
3890     }
3891     emit_opcode(cbuf, 0x58 | (dstenc & 7));
3892 
3893     // done:
3894   %}
















3895 %}
3896 
3897 
3898 
3899 //----------FRAME--------------------------------------------------------------
3900 // Definition of frame structure and management information.
3901 //
3902 //  S T A C K   L A Y O U T    Allocators stack-slot number
3903 //                             |   (to get allocators register number
3904 //  G  Owned by    |        |  v    add OptoReg::stack0())
3905 //  r   CALLER     |        |
3906 //  o     |        +--------+      pad to even-align allocators stack-slot
3907 //  w     V        |  pad0  |        numbers; owned by CALLER
3908 //  t   -----------+--------+----> Matcher::_in_arg_limit, unaligned
3909 //  h     ^        |   in   |  5
3910 //        |        |  args  |  4   Holes in incoming args owned by SELF
3911 //  |     |        |        |  3
3912 //  |     |        +--------+
3913 //  V     |        | old out|      Empty on Intel, window on Sparc
3914 //        |    old |preserve|      Must be even aligned.


4178 operand immP()
4179 %{
4180   match(ConP);
4181 
4182   op_cost(10);
4183   format %{ %}
4184   interface(CONST_INTER);
4185 %}
4186 
4187 // NULL Pointer Immediate
4188 operand immP0()
4189 %{
4190   predicate(n->get_ptr() == 0);
4191   match(ConP);
4192 
4193   op_cost(5);
4194   format %{ %}
4195   interface(CONST_INTER);
4196 %}
4197 
4198 operand immP_poll() %{
4199   predicate(n->get_ptr() != 0 && n->get_ptr() == (intptr_t)os::get_polling_page());
4200   match(ConP);
4201 
4202   // formats are generated automatically for constants and base registers
4203   format %{ %}
4204   interface(CONST_INTER);
4205 %}
4206 
4207 // Pointer Immediate
4208 operand immN() %{
4209   match(ConN);
4210 
4211   op_cost(10);
4212   format %{ %}
4213   interface(CONST_INTER);
4214 %}
4215 
4216 // NULL Pointer Immediate
4217 operand immN0() %{
4218   predicate(n->get_narrowcon() == 0);
4219   match(ConN);
4220 
4221   op_cost(5);
4222   format %{ %}
4223   interface(CONST_INTER);
4224 %}
4225 
4226 operand immP31()


6522 instruct loadConP(rRegP dst, immP con) %{
6523   match(Set dst con);
6524 
6525   format %{ "movq    $dst, $con\t# ptr" %}
6526   ins_encode(load_immP(dst, con));
6527   ins_pipe(ialu_reg_fat); // XXX
6528 %}
6529 
6530 instruct loadConP0(rRegP dst, immP0 src, rFlagsReg cr)
6531 %{
6532   match(Set dst src);
6533   effect(KILL cr);
6534 
6535   ins_cost(50);
6536   format %{ "xorl    $dst, $dst\t# ptr" %}
6537   opcode(0x33); /* + rd */
6538   ins_encode(REX_reg_reg(dst, dst), OpcP, reg_reg(dst, dst));
6539   ins_pipe(ialu_reg);
6540 %}
6541 
6542 instruct loadConP_poll(rRegP dst, immP_poll src) %{
6543   match(Set dst src);
6544   format %{ "movq    $dst, $src\t!ptr" %}
6545   ins_encode %{
6546     AddressLiteral polling_page(os::get_polling_page(), relocInfo::poll_type);
6547     __ lea($dst$$Register, polling_page);
6548   %}
6549   ins_pipe(ialu_reg_fat);
6550 %}
6551 
6552 instruct loadConP31(rRegP dst, immP31 src, rFlagsReg cr)
6553 %{
6554   match(Set dst src);
6555   effect(KILL cr);
6556 
6557   ins_cost(60);
6558   format %{ "movl    $dst, $src\t# ptr (positive 32-bit)" %}
6559   ins_encode(load_immP31(dst, src));
6560   ins_pipe(ialu_reg);
6561 %}
6562 
6563 instruct loadConF(regF dst, immF con) %{
6564   match(Set dst con);
6565   ins_cost(125);
6566   format %{ "movss   $dst, [$constantaddress]\t# load from constant table: float=$con" %}
6567   ins_encode %{
6568     __ movflt($dst$$XMMRegister, $constantaddress($con));
6569   %}
6570   ins_pipe(pipe_slow);
6571 %}


12437 %}
12438 
12439 instruct cmpFastUnlock(rFlagsReg cr,
12440                        rRegP object, rax_RegP box, rRegP tmp)
12441 %{
12442   match(Set cr (FastUnlock object box));
12443   effect(TEMP tmp);
12444 
12445   ins_cost(300);
12446   format %{ "fastunlock $object, $box, $tmp" %}
12447   ins_encode(Fast_Unlock(object, box, tmp));
12448   ins_pipe(pipe_slow);
12449   ins_pc_relative(1);
12450 %}
12451 
12452 
12453 // ============================================================================
12454 // Safepoint Instructions
12455 instruct safePoint_poll(rFlagsReg cr)
12456 %{
12457   predicate(!Assembler::is_polling_page_far());
12458   match(SafePoint);
12459   effect(KILL cr);
12460 
12461   format %{ "testl  rax, [rip + #offset_to_poll_page]\t"
12462             "# Safepoint: poll for GC" %}

12463   ins_cost(125);
12464   ins_encode %{
12465     AddressLiteral addr(os::get_polling_page(), relocInfo::poll_type);
12466     __ testl(rax, addr);
12467   %}
12468   ins_pipe(ialu_reg_mem);
12469 %}
12470 
12471 instruct safePoint_poll_far(rFlagsReg cr, rRegP poll)
12472 %{
12473   predicate(Assembler::is_polling_page_far());
12474   match(SafePoint poll);
12475   effect(KILL cr, USE poll);
12476 
12477   format %{ "testl  rax, [$poll]\t"
12478             "# Safepoint: poll for GC" %}
12479   ins_cost(125);
12480   ins_encode %{
12481     __ relocate(relocInfo::poll_type);
12482     __ testl(rax, Address($poll$$Register, 0));
12483   %}
12484   ins_pipe(ialu_reg_mem);
12485 %}
12486 
12487 // ============================================================================
12488 // Procedure Call/Return Instructions
12489 // Call Java Static Instruction
12490 // Note: If this code changes, the corresponding ret_addr_offset() and
12491 //       compute_padding() functions will have to be adjusted.
12492 instruct CallStaticJavaDirect(method meth) %{
12493   match(CallStaticJava);
12494   predicate(!((CallStaticJavaNode*) n)->is_method_handle_invoke());
12495   effect(USE meth);
12496 
12497   ins_cost(300);
12498   format %{ "call,static " %}
12499   opcode(0xE8); /* E8 cd */
12500   ins_encode(Java_Static_Call(meth), call_epilog);
12501   ins_pipe(pipe_slow);
12502   ins_pc_relative(1);
12503   ins_alignment(4);


src/cpu/x86/vm/x86_64.ad
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File