hotspot/src/cpu/x86/vm/x86_32.ad
changeset 17094 29c4955396d2
parent 16624 9dbd4b210bf9
child 17095 24f63661bb5e
equal deleted inserted replaced
17001:1ce8485b1907 17094:29c4955396d2
  1255     return 4;
  1255     return 4;
  1256   }
  1256   }
  1257 }
  1257 }
  1258 
  1258 
  1259 //=============================================================================
  1259 //=============================================================================
  1260 
       
  1261 // emit call stub, compiled java to interpreter
       
  1262 void emit_java_to_interp(CodeBuffer &cbuf ) {
       
  1263   // Stub is fixed up when the corresponding call is converted from calling
       
  1264   // compiled code to calling interpreted code.
       
  1265   // mov rbx,0
       
  1266   // jmp -1
       
  1267 
       
  1268   address mark = cbuf.insts_mark();  // get mark within main instrs section
       
  1269 
       
  1270   // Note that the code buffer's insts_mark is always relative to insts.
       
  1271   // That's why we must use the macroassembler to generate a stub.
       
  1272   MacroAssembler _masm(&cbuf);
       
  1273 
       
  1274   address base =
       
  1275   __ start_a_stub(Compile::MAX_stubs_size);
       
  1276   if (base == NULL)  return;  // CodeBuffer::expand failed
       
  1277   // static stub relocation stores the instruction address of the call
       
  1278   __ relocate(static_stub_Relocation::spec(mark), RELOC_IMM32);
       
  1279   // static stub relocation also tags the Method* in the code-stream.
       
  1280   __ mov_metadata(rbx, (Metadata*)NULL);  // method is zapped till fixup time
       
  1281   // This is recognized as unresolved by relocs/nativeInst/ic code
       
  1282   __ jump(RuntimeAddress(__ pc()));
       
  1283 
       
  1284   __ end_a_stub();
       
  1285   // Update current stubs pointer and restore insts_end.
       
  1286 }
       
  1287 // size of call stub, compiled java to interpretor
       
  1288 uint size_java_to_interp() {
       
  1289   return 10;  // movl; jmp
       
  1290 }
       
  1291 // relocation entries for call stub, compiled java to interpretor
       
  1292 uint reloc_java_to_interp() {
       
  1293   return 4;  // 3 in emit_java_to_interp + 1 in Java_Static_Call
       
  1294 }
       
  1295 
       
  1296 //=============================================================================
       
  1297 #ifndef PRODUCT
  1260 #ifndef PRODUCT
  1298 void MachUEPNode::format( PhaseRegAlloc *ra_, outputStream* st ) const {
  1261 void MachUEPNode::format( PhaseRegAlloc *ra_, outputStream* st ) const {
  1299   st->print_cr(  "CMP    EAX,[ECX+4]\t# Inline cache check");
  1262   st->print_cr(  "CMP    EAX,[ECX+4]\t# Inline cache check");
  1300   st->print_cr("\tJNE    SharedRuntime::handle_ic_miss_stub");
  1263   st->print_cr("\tJNE    SharedRuntime::handle_ic_miss_stub");
  1301   st->print_cr("\tNOP");
  1264   st->print_cr("\tNOP");
  1907                      opt_virtual_call_Relocation::spec(), RELOC_IMM32 );
  1870                      opt_virtual_call_Relocation::spec(), RELOC_IMM32 );
  1908     } else {
  1871     } else {
  1909       emit_d32_reloc(cbuf, ($meth$$method - (int)(cbuf.insts_end()) - 4),
  1872       emit_d32_reloc(cbuf, ($meth$$method - (int)(cbuf.insts_end()) - 4),
  1910                      static_call_Relocation::spec(), RELOC_IMM32 );
  1873                      static_call_Relocation::spec(), RELOC_IMM32 );
  1911     }
  1874     }
  1912     if (_method) {  // Emit stub for static call
  1875     if (_method) {  // Emit stub for static call.
  1913       emit_java_to_interp(cbuf);
  1876       CompiledStaticCall::emit_to_interp_stub(cbuf);
  1914     }
  1877     }
  1915   %}
  1878   %}
  1916 
  1879 
  1917   enc_class Java_Dynamic_Call (method meth) %{    // JAVA DYNAMIC CALL
  1880   enc_class Java_Dynamic_Call (method meth) %{    // JAVA DYNAMIC CALL
  1918     MacroAssembler _masm(&cbuf);
  1881     MacroAssembler _masm(&cbuf);