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); |