< prev index next >

src/hotspot/cpu/x86/x86_64.ad

Print this page

        

@@ -2114,10 +2114,11 @@
   enc_class Java_To_Runtime(method meth) %{
     // No relocation needed
     MacroAssembler _masm(&cbuf);
     __ mov64(r10, (int64_t) $meth$$method);
     __ call(r10);
+    __ post_call_nop();
   %}
 
   enc_class Java_To_Interpreter(method meth)
   %{
     // CALL Java_To_Interpreter

@@ -2127,17 +2128,19 @@
     // CALL directly to the runtime
     emit_d32_reloc(cbuf,
                    (int) ($meth$$method - ((intptr_t) cbuf.insts_end()) - 4),
                    runtime_call_Relocation::spec(),
                    RELOC_DISP32);
+    __ post_call_nop();
   %}
 
   enc_class Java_Static_Call(method meth)
   %{
     // JAVA STATIC CALL
     // CALL to fixup routine.  Fixup routine uses ScopeDesc info to
     // determine who we intended to call.
+    MacroAssembler _masm(&cbuf);
     cbuf.set_insts_mark();
     $$$emit8$primary;
 
     if (!_method) {
       emit_d32_reloc(cbuf, (int) ($meth$$method - ((intptr_t) cbuf.insts_end()) - 4),

@@ -2158,15 +2161,17 @@
       }
 #if INCLUDE_AOT
       CompiledStaticCall::emit_to_aot_stub(cbuf, mark);
 #endif
     }
+    __ post_call_nop();
   %}
 
   enc_class Java_Dynamic_Call(method meth) %{
     MacroAssembler _masm(&cbuf);
     __ ic_call((address)$meth$$method, resolved_method_index(cbuf));
+    __ post_call_nop();
   %}
 
   enc_class Java_Compiled_Call(method meth)
   %{
     // JAVA COMPILED CALL

@@ -2174,19 +2179,21 @@
 
     // XXX XXX offset is 128 is 1.5 NON-PRODUCT !!!
     // assert(-0x80 <= disp && disp < 0x80, "compiled_code_offset isn't small");
 
     // callq *disp(%rax)
+    MacroAssembler _masm(&cbuf);
     cbuf.set_insts_mark();
     $$$emit8$primary;
     if (disp < 0x80) {
       emit_rm(cbuf, 0x01, $secondary, RAX_enc); // R/M byte
       emit_d8(cbuf, disp); // Displacement
     } else {
       emit_rm(cbuf, 0x02, $secondary, RAX_enc); // R/M byte
       emit_d32(cbuf, disp); // Displacement
     }
+    __ post_call_nop();
   %}
 
   enc_class reg_opc_imm(rRegI dst, immI8 shift)
   %{
     // SAL, SAR, SHR

@@ -11618,10 +11625,24 @@
                         $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register);
   %}
   ins_pipe( pipe_slow );
 %}
 
+instruct getFP(rRegL dst) %{
+  match(Set dst (GetFP));
+  effect(DEF dst);
+  ins_cost(1);
+ 
+  ins_encode %{
+    // Remove wordSize for return addr which is already pushed.
+    int framesize = Compile::current()->frame_size_in_bytes() - wordSize;
+    Address base(rsp, framesize);
+    __ lea($dst$$Register, base);
+  %}
+  ins_pipe(ialu_reg_reg_long);
+%}
+
 //----------Overflow Math Instructions-----------------------------------------
 
 instruct overflowAddI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2)
 %{
   match(Set cr (OverflowAddI op1 op2));
< prev index next >