Merge

Fri, 25 Oct 2013 12:40:10 -0700

author
adlertz
date
Fri, 25 Oct 2013 12:40:10 -0700
changeset 6042
7ae254fd0b3c
parent 6041
f01788f13696
parent 6040
cbe8ba0fb8fc
child 6044
bfdb530cdffa
child 6045
a196f1aaec86

Merge

     1.1 --- a/src/cpu/sparc/vm/cppInterpreter_sparc.cpp	Fri Oct 25 10:13:40 2013 +0200
     1.2 +++ b/src/cpu/sparc/vm/cppInterpreter_sparc.cpp	Fri Oct 25 12:40:10 2013 -0700
     1.3 @@ -365,7 +365,7 @@
     1.4    return entry;
     1.5  }
     1.6  
     1.7 -address CppInterpreter::return_entry(TosState state, int length) {
     1.8 +address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
     1.9    // make it look good in the debugger
    1.10    return CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation) + frame::pc_return_offset;
    1.11  }
     2.1 --- a/src/cpu/sparc/vm/templateInterpreter_sparc.cpp	Fri Oct 25 10:13:40 2013 +0200
     2.2 +++ b/src/cpu/sparc/vm/templateInterpreter_sparc.cpp	Fri Oct 25 12:40:10 2013 -0700
     2.3 @@ -153,13 +153,9 @@
     2.4  }
     2.5  
     2.6  
     2.7 -address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
     2.8 -  TosState incoming_state = state;
     2.9 +address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) {
    2.10 +  address entry = __ pc();
    2.11  
    2.12 -  Label cont;
    2.13 -  address compiled_entry = __ pc();
    2.14 -
    2.15 -  address entry = __ pc();
    2.16  #if !defined(_LP64) && defined(COMPILER2)
    2.17    // All return values are where we want them, except for Longs.  C2 returns
    2.18    // longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1.
    2.19 @@ -170,14 +166,12 @@
    2.20    // do this here. Unfortunately if we did a rethrow we'd see an machepilog node
    2.21    // first which would move g1 -> O0/O1 and destroy the exception we were throwing.
    2.22  
    2.23 -  if (incoming_state == ltos) {
    2.24 +  if (state == ltos) {
    2.25      __ srl (G1,  0, O1);
    2.26      __ srlx(G1, 32, O0);
    2.27    }
    2.28  #endif // !_LP64 && COMPILER2
    2.29  
    2.30 -  __ bind(cont);
    2.31 -
    2.32    // The callee returns with the stack possibly adjusted by adapter transition
    2.33    // We remove that possible adjustment here.
    2.34    // All interpreter local registers are untouched. Any result is passed back
    2.35 @@ -186,29 +180,18 @@
    2.36  
    2.37    __ mov(Llast_SP, SP);   // Remove any adapter added stack space.
    2.38  
    2.39 -  Label L_got_cache, L_giant_index;
    2.40    const Register cache = G3_scratch;
    2.41 -  const Register size  = G1_scratch;
    2.42 -  if (EnableInvokeDynamic) {
    2.43 -    __ ldub(Address(Lbcp, 0), G1_scratch);  // Load current bytecode.
    2.44 -    __ cmp_and_br_short(G1_scratch, Bytecodes::_invokedynamic, Assembler::equal, Assembler::pn, L_giant_index);
    2.45 -  }
    2.46 -  __ get_cache_and_index_at_bcp(cache, G1_scratch, 1);
    2.47 -  __ bind(L_got_cache);
    2.48 -  __ ld_ptr(cache, ConstantPoolCache::base_offset() +
    2.49 -                   ConstantPoolCacheEntry::flags_offset(), size);
    2.50 -  __ and3(size, 0xFF, size);                   // argument size in words
    2.51 -  __ sll(size, Interpreter::logStackElementSize, size); // each argument size in bytes
    2.52 -  __ add(Lesp, size, Lesp);                    // pop arguments
    2.53 +  const Register index  = G1_scratch;
    2.54 +  __ get_cache_and_index_at_bcp(cache, index, 1, index_size);
    2.55 +
    2.56 +  const Register flags = cache;
    2.57 +  __ ld_ptr(cache, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset(), flags);
    2.58 +  const Register parameter_size = flags;
    2.59 +  __ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, parameter_size);  // argument size in words
    2.60 +  __ sll(parameter_size, Interpreter::logStackElementSize, parameter_size);     // each argument size in bytes
    2.61 +  __ add(Lesp, parameter_size, Lesp);                                           // pop arguments
    2.62    __ dispatch_next(state, step);
    2.63  
    2.64 -  // out of the main line of code...
    2.65 -  if (EnableInvokeDynamic) {
    2.66 -    __ bind(L_giant_index);
    2.67 -    __ get_cache_and_index_at_bcp(cache, G1_scratch, 1, sizeof(u4));
    2.68 -    __ ba_short(L_got_cache);
    2.69 -  }
    2.70 -
    2.71    return entry;
    2.72  }
    2.73  
     3.1 --- a/src/cpu/sparc/vm/templateTable_sparc.cpp	Fri Oct 25 10:13:40 2013 +0200
     3.2 +++ b/src/cpu/sparc/vm/templateTable_sparc.cpp	Fri Oct 25 12:40:10 2013 -0700
     3.3 @@ -2932,9 +2932,7 @@
     3.4    ConstantPoolCacheEntry::verify_tos_state_shift();
     3.5    // load return address
     3.6    {
     3.7 -    const address table_addr = (is_invokeinterface || is_invokedynamic) ?
     3.8 -        (address)Interpreter::return_5_addrs_by_index_table() :
     3.9 -        (address)Interpreter::return_3_addrs_by_index_table();
    3.10 +    const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
    3.11      AddressLiteral table(table_addr);
    3.12      __ set(table, temp);
    3.13      __ sll(ra, LogBytesPerWord, ra);
    3.14 @@ -2984,7 +2982,7 @@
    3.15    __ verify_oop(O0_recv);
    3.16  
    3.17    // get return address
    3.18 -  AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
    3.19 +  AddressLiteral table(Interpreter::invoke_return_entry_table());
    3.20    __ set(table, Rtemp);
    3.21    __ srl(Rret, ConstantPoolCacheEntry::tos_state_shift, Rret);          // get return type
    3.22    // Make sure we don't need to mask Rret after the above shift
    3.23 @@ -3026,7 +3024,7 @@
    3.24    __ profile_final_call(O4);
    3.25  
    3.26    // get return address
    3.27 -  AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
    3.28 +  AddressLiteral table(Interpreter::invoke_return_entry_table());
    3.29    __ set(table, Rtemp);
    3.30    __ srl(Rret, ConstantPoolCacheEntry::tos_state_shift, Rret);          // get return type
    3.31    // Make sure we don't need to mask Rret after the above shift
     4.1 --- a/src/cpu/x86/vm/cppInterpreter_x86.cpp	Fri Oct 25 10:13:40 2013 +0200
     4.2 +++ b/src/cpu/x86/vm/cppInterpreter_x86.cpp	Fri Oct 25 12:40:10 2013 -0700
     4.3 @@ -367,7 +367,7 @@
     4.4    return entry;
     4.5  }
     4.6  
     4.7 -address CppInterpreter::return_entry(TosState state, int length) {
     4.8 +address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
     4.9    // make it look good in the debugger
    4.10    return CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation);
    4.11  }
     5.1 --- a/src/cpu/x86/vm/templateInterpreter_x86_32.cpp	Fri Oct 25 10:13:40 2013 +0200
     5.2 +++ b/src/cpu/x86/vm/templateInterpreter_x86_32.cpp	Fri Oct 25 12:40:10 2013 -0700
     5.3 @@ -150,13 +150,12 @@
     5.4  }
     5.5  
     5.6  
     5.7 -address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
     5.8 -  TosState incoming_state = state;
     5.9 +address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) {
    5.10    address entry = __ pc();
    5.11  
    5.12  #ifdef COMPILER2
    5.13    // The FPU stack is clean if UseSSE >= 2 but must be cleaned in other cases
    5.14 -  if ((incoming_state == ftos && UseSSE < 1) || (incoming_state == dtos && UseSSE < 2)) {
    5.15 +  if ((state == ftos && UseSSE < 1) || (state == dtos && UseSSE < 2)) {
    5.16      for (int i = 1; i < 8; i++) {
    5.17          __ ffree(i);
    5.18      }
    5.19 @@ -164,7 +163,7 @@
    5.20      __ empty_FPU_stack();
    5.21    }
    5.22  #endif
    5.23 -  if ((incoming_state == ftos && UseSSE < 1) || (incoming_state == dtos && UseSSE < 2)) {
    5.24 +  if ((state == ftos && UseSSE < 1) || (state == dtos && UseSSE < 2)) {
    5.25      __ MacroAssembler::verify_FPU(1, "generate_return_entry_for compiled");
    5.26    } else {
    5.27      __ MacroAssembler::verify_FPU(0, "generate_return_entry_for compiled");
    5.28 @@ -172,12 +171,12 @@
    5.29  
    5.30    // In SSE mode, interpreter returns FP results in xmm0 but they need
    5.31    // to end up back on the FPU so it can operate on them.
    5.32 -  if (incoming_state == ftos && UseSSE >= 1) {
    5.33 +  if (state == ftos && UseSSE >= 1) {
    5.34      __ subptr(rsp, wordSize);
    5.35      __ movflt(Address(rsp, 0), xmm0);
    5.36      __ fld_s(Address(rsp, 0));
    5.37      __ addptr(rsp, wordSize);
    5.38 -  } else if (incoming_state == dtos && UseSSE >= 2) {
    5.39 +  } else if (state == dtos && UseSSE >= 2) {
    5.40      __ subptr(rsp, 2*wordSize);
    5.41      __ movdbl(Address(rsp, 0), xmm0);
    5.42      __ fld_d(Address(rsp, 0));
    5.43 @@ -194,33 +193,22 @@
    5.44    __ restore_bcp();
    5.45    __ restore_locals();
    5.46  
    5.47 -  if (incoming_state == atos) {
    5.48 +  if (state == atos) {
    5.49      Register mdp = rbx;
    5.50      Register tmp = rcx;
    5.51      __ profile_return_type(mdp, rax, tmp);
    5.52    }
    5.53  
    5.54 -  Label L_got_cache, L_giant_index;
    5.55 -  if (EnableInvokeDynamic) {
    5.56 -    __ cmpb(Address(rsi, 0), Bytecodes::_invokedynamic);
    5.57 -    __ jcc(Assembler::equal, L_giant_index);
    5.58 -  }
    5.59 -  __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u2));
    5.60 -  __ bind(L_got_cache);
    5.61 -  __ movl(rbx, Address(rbx, rcx,
    5.62 -                    Address::times_ptr, ConstantPoolCache::base_offset() +
    5.63 -                    ConstantPoolCacheEntry::flags_offset()));
    5.64 -  __ andptr(rbx, 0xFF);
    5.65 -  __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale()));
    5.66 +  const Register cache = rbx;
    5.67 +  const Register index = rcx;
    5.68 +  __ get_cache_and_index_at_bcp(cache, index, 1, index_size);
    5.69 +
    5.70 +  const Register flags = cache;
    5.71 +  __ movl(flags, Address(cache, index, Address::times_ptr, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()));
    5.72 +  __ andl(flags, ConstantPoolCacheEntry::parameter_size_mask);
    5.73 +  __ lea(rsp, Address(rsp, flags, Interpreter::stackElementScale()));
    5.74    __ dispatch_next(state, step);
    5.75  
    5.76 -  // out of the main line of code...
    5.77 -  if (EnableInvokeDynamic) {
    5.78 -    __ bind(L_giant_index);
    5.79 -    __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u4));
    5.80 -    __ jmp(L_got_cache);
    5.81 -  }
    5.82 -
    5.83    return entry;
    5.84  }
    5.85  
     6.1 --- a/src/cpu/x86/vm/templateInterpreter_x86_64.cpp	Fri Oct 25 10:13:40 2013 +0200
     6.2 +++ b/src/cpu/x86/vm/templateInterpreter_x86_64.cpp	Fri Oct 25 12:40:10 2013 -0700
     6.3 @@ -166,7 +166,7 @@
     6.4  }
     6.5  
     6.6  
     6.7 -address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
     6.8 +address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) {
     6.9    address entry = __ pc();
    6.10  
    6.11    // Restore stack bottom in case i2c adjusted stack
    6.12 @@ -183,28 +183,16 @@
    6.13      __ profile_return_type(mdp, rax, tmp);
    6.14    }
    6.15  
    6.16 -  Label L_got_cache, L_giant_index;
    6.17 -  if (EnableInvokeDynamic) {
    6.18 -    __ cmpb(Address(r13, 0), Bytecodes::_invokedynamic);
    6.19 -    __ jcc(Assembler::equal, L_giant_index);
    6.20 -  }
    6.21 -  __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u2));
    6.22 -  __ bind(L_got_cache);
    6.23 -  __ movl(rbx, Address(rbx, rcx,
    6.24 -                       Address::times_ptr,
    6.25 -                       in_bytes(ConstantPoolCache::base_offset()) +
    6.26 -                       3 * wordSize));
    6.27 -  __ andl(rbx, 0xFF);
    6.28 -  __ lea(rsp, Address(rsp, rbx, Address::times_8));
    6.29 +  const Register cache = rbx;
    6.30 +  const Register index = rcx;
    6.31 +  __ get_cache_and_index_at_bcp(cache, index, 1, index_size);
    6.32 +
    6.33 +  const Register flags = cache;
    6.34 +  __ movl(flags, Address(cache, index, Address::times_ptr, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()));
    6.35 +  __ andl(flags, ConstantPoolCacheEntry::parameter_size_mask);
    6.36 +  __ lea(rsp, Address(rsp, flags, Interpreter::stackElementScale()));
    6.37    __ dispatch_next(state, step);
    6.38  
    6.39 -  // out of the main line of code...
    6.40 -  if (EnableInvokeDynamic) {
    6.41 -    __ bind(L_giant_index);
    6.42 -    __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u4));
    6.43 -    __ jmp(L_got_cache);
    6.44 -  }
    6.45 -
    6.46    return entry;
    6.47  }
    6.48  
     7.1 --- a/src/cpu/x86/vm/templateTable_x86_32.cpp	Fri Oct 25 10:13:40 2013 +0200
     7.2 +++ b/src/cpu/x86/vm/templateTable_x86_32.cpp	Fri Oct 25 12:40:10 2013 -0700
     7.3 @@ -2925,9 +2925,7 @@
     7.4    ConstantPoolCacheEntry::verify_tos_state_shift();
     7.5    // load return address
     7.6    {
     7.7 -    const address table_addr = (is_invokeinterface || is_invokedynamic) ?
     7.8 -        (address)Interpreter::return_5_addrs_by_index_table() :
     7.9 -        (address)Interpreter::return_3_addrs_by_index_table();
    7.10 +    const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
    7.11      ExternalAddress table(table_addr);
    7.12      __ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr)));
    7.13    }
     8.1 --- a/src/cpu/x86/vm/templateTable_x86_64.cpp	Fri Oct 25 10:13:40 2013 +0200
     8.2 +++ b/src/cpu/x86/vm/templateTable_x86_64.cpp	Fri Oct 25 12:40:10 2013 -0700
     8.3 @@ -2980,9 +2980,7 @@
     8.4    ConstantPoolCacheEntry::verify_tos_state_shift();
     8.5    // load return address
     8.6    {
     8.7 -    const address table_addr = (is_invokeinterface || is_invokedynamic) ?
     8.8 -        (address)Interpreter::return_5_addrs_by_index_table() :
     8.9 -        (address)Interpreter::return_3_addrs_by_index_table();
    8.10 +    const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
    8.11      ExternalAddress table(table_addr);
    8.12      __ lea(rscratch1, table);
    8.13      __ movptr(flags, Address(rscratch1, flags, Address::times_ptr));
     9.1 --- a/src/cpu/zero/vm/cppInterpreter_zero.cpp	Fri Oct 25 10:13:40 2013 +0200
     9.2 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp	Fri Oct 25 12:40:10 2013 -0700
     9.3 @@ -1006,7 +1006,7 @@
     9.4    istate->set_stack_limit(stack_base - method->max_stack() - 1);
     9.5  }
     9.6  
     9.7 -address CppInterpreter::return_entry(TosState state, int length) {
     9.8 +address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
     9.9    ShouldNotCallThis();
    9.10    return NULL;
    9.11  }
    10.1 --- a/src/cpu/zero/vm/globals_zero.hpp	Fri Oct 25 10:13:40 2013 +0200
    10.2 +++ b/src/cpu/zero/vm/globals_zero.hpp	Fri Oct 25 12:40:10 2013 -0700
    10.3 @@ -57,6 +57,8 @@
    10.4  // GC Ergo Flags
    10.5  define_pd_global(uintx, CMSYoungGenPerWorker, 16*M);  // default max size of CMS young gen, per GC worker thread
    10.6  
    10.7 +define_pd_global(uintx, TypeProfileLevel, 0);
    10.8 +
    10.9  #define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct)
   10.10  
   10.11  #endif // CPU_ZERO_VM_GLOBALS_ZERO_HPP
    11.1 --- a/src/share/vm/interpreter/abstractInterpreter.hpp	Fri Oct 25 10:13:40 2013 +0200
    11.2 +++ b/src/share/vm/interpreter/abstractInterpreter.hpp	Fri Oct 25 12:40:10 2013 -0700
    11.3 @@ -158,8 +158,8 @@
    11.4    // Runtime support
    11.5  
    11.6    // length = invoke bytecode length (to advance to next bytecode)
    11.7 -  static address    deopt_entry   (TosState state, int length) { ShouldNotReachHere(); return NULL; }
    11.8 -  static address    return_entry  (TosState state, int length) { ShouldNotReachHere(); return NULL; }
    11.9 +  static address deopt_entry(TosState state, int length) { ShouldNotReachHere(); return NULL; }
   11.10 +  static address return_entry(TosState state, int length, Bytecodes::Code code) { ShouldNotReachHere(); return NULL; }
   11.11  
   11.12    static address    rethrow_exception_entry()                   { return _rethrow_exception_entry; }
   11.13  
    12.1 --- a/src/share/vm/interpreter/cppInterpreter.hpp	Fri Oct 25 10:13:40 2013 +0200
    12.2 +++ b/src/share/vm/interpreter/cppInterpreter.hpp	Fri Oct 25 12:40:10 2013 -0700
    12.3 @@ -78,7 +78,7 @@
    12.4    static address    stack_result_to_stack(int index)            { return _stack_to_stack[index]; }
    12.5    static address    stack_result_to_native(int index)           { return _stack_to_native_abi[index]; }
    12.6  
    12.7 -  static address    return_entry  (TosState state, int length);
    12.8 +  static address    return_entry  (TosState state, int length, Bytecodes::Code code);
    12.9    static address    deopt_entry   (TosState state, int length);
   12.10  
   12.11  #ifdef TARGET_ARCH_x86
    13.1 --- a/src/share/vm/interpreter/interpreter.cpp	Fri Oct 25 10:13:40 2013 +0200
    13.2 +++ b/src/share/vm/interpreter/interpreter.cpp	Fri Oct 25 12:40:10 2013 -0700
    13.3 @@ -329,15 +329,21 @@
    13.4  //------------------------------------------------------------------------------------------------------------------------
    13.5  // Deoptimization support
    13.6  
    13.7 -// If deoptimization happens, this function returns the point of next bytecode to continue execution
    13.8 +/**
    13.9 + * If a deoptimization happens, this function returns the point of next bytecode to continue execution.
   13.10 + */
   13.11  address AbstractInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) {
   13.12    assert(method->contains(bcp), "just checkin'");
   13.13 -  Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
   13.14 +
   13.15 +  // Get the original and rewritten bytecode.
   13.16 +  Bytecodes::Code code = Bytecodes::java_code_at(method, bcp);
   13.17    assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
   13.18 -  int             bci    = method->bci_from(bcp);
   13.19 -  int             length = -1; // initial value for debugging
   13.20 +
   13.21 +  const int bci = method->bci_from(bcp);
   13.22 +
   13.23    // compute continuation length
   13.24 -  length = Bytecodes::length_at(method, bcp);
   13.25 +  const int length = Bytecodes::length_at(method, bcp);
   13.26 +
   13.27    // compute result type
   13.28    BasicType type = T_ILLEGAL;
   13.29  
   13.30 @@ -393,7 +399,7 @@
   13.31    return
   13.32      is_top_frame
   13.33      ? Interpreter::deopt_entry (as_TosState(type), length)
   13.34 -    : Interpreter::return_entry(as_TosState(type), length);
   13.35 +    : Interpreter::return_entry(as_TosState(type), length, code);
   13.36  }
   13.37  
   13.38  // If deoptimization happens, this function returns the point where the interpreter reexecutes
    14.1 --- a/src/share/vm/interpreter/templateInterpreter.cpp	Fri Oct 25 10:13:40 2013 +0200
    14.2 +++ b/src/share/vm/interpreter/templateInterpreter.cpp	Fri Oct 25 12:40:10 2013 -0700
    14.3 @@ -184,8 +184,9 @@
    14.4  EntryPoint TemplateInterpreter::_continuation_entry;
    14.5  EntryPoint TemplateInterpreter::_safept_entry;
    14.6  
    14.7 -address    TemplateInterpreter::_return_3_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
    14.8 -address    TemplateInterpreter::_return_5_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
    14.9 +address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
   14.10 +address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
   14.11 +address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
   14.12  
   14.13  DispatchTable TemplateInterpreter::_active_table;
   14.14  DispatchTable TemplateInterpreter::_normal_table;
   14.15 @@ -237,22 +238,37 @@
   14.16  #endif // !PRODUCT
   14.17  
   14.18    { CodeletMark cm(_masm, "return entry points");
   14.19 +    const int index_size = sizeof(u2);
   14.20      for (int i = 0; i < Interpreter::number_of_return_entries; i++) {
   14.21        Interpreter::_return_entry[i] =
   14.22          EntryPoint(
   14.23 -          generate_return_entry_for(itos, i),
   14.24 -          generate_return_entry_for(itos, i),
   14.25 -          generate_return_entry_for(itos, i),
   14.26 -          generate_return_entry_for(atos, i),
   14.27 -          generate_return_entry_for(itos, i),
   14.28 -          generate_return_entry_for(ltos, i),
   14.29 -          generate_return_entry_for(ftos, i),
   14.30 -          generate_return_entry_for(dtos, i),
   14.31 -          generate_return_entry_for(vtos, i)
   14.32 +          generate_return_entry_for(itos, i, index_size),
   14.33 +          generate_return_entry_for(itos, i, index_size),
   14.34 +          generate_return_entry_for(itos, i, index_size),
   14.35 +          generate_return_entry_for(atos, i, index_size),
   14.36 +          generate_return_entry_for(itos, i, index_size),
   14.37 +          generate_return_entry_for(ltos, i, index_size),
   14.38 +          generate_return_entry_for(ftos, i, index_size),
   14.39 +          generate_return_entry_for(dtos, i, index_size),
   14.40 +          generate_return_entry_for(vtos, i, index_size)
   14.41          );
   14.42      }
   14.43    }
   14.44  
   14.45 +  { CodeletMark cm(_masm, "invoke return entry points");
   14.46 +    const TosState states[] = {itos, itos, itos, itos, ltos, ftos, dtos, atos, vtos};
   14.47 +    const int invoke_length = Bytecodes::length_for(Bytecodes::_invokestatic);
   14.48 +    const int invokeinterface_length = Bytecodes::length_for(Bytecodes::_invokeinterface);
   14.49 +    const int invokedynamic_length = Bytecodes::length_for(Bytecodes::_invokedynamic);
   14.50 +
   14.51 +    for (int i = 0; i < Interpreter::number_of_return_addrs; i++) {
   14.52 +      TosState state = states[i];
   14.53 +      Interpreter::_invoke_return_entry[i] = generate_return_entry_for(state, invoke_length, sizeof(u2));
   14.54 +      Interpreter::_invokeinterface_return_entry[i] = generate_return_entry_for(state, invokeinterface_length, sizeof(u2));
   14.55 +      Interpreter::_invokedynamic_return_entry[i] = generate_return_entry_for(state, invokedynamic_length, sizeof(u4));
   14.56 +    }
   14.57 +  }
   14.58 +
   14.59    { CodeletMark cm(_masm, "earlyret entry points");
   14.60      Interpreter::_earlyret_entry =
   14.61        EntryPoint(
   14.62 @@ -298,13 +314,6 @@
   14.63      }
   14.64    }
   14.65  
   14.66 -  for (int j = 0; j < number_of_states; j++) {
   14.67 -    const TosState states[] = {btos, ctos, stos, itos, ltos, ftos, dtos, atos, vtos};
   14.68 -    int index = Interpreter::TosState_as_index(states[j]);
   14.69 -    Interpreter::_return_3_addrs_by_index[index] = Interpreter::return_entry(states[j], 3);
   14.70 -    Interpreter::_return_5_addrs_by_index[index] = Interpreter::return_entry(states[j], 5);
   14.71 -  }
   14.72 -
   14.73    { CodeletMark cm(_masm, "continuation entry points");
   14.74      Interpreter::_continuation_entry =
   14.75        EntryPoint(
   14.76 @@ -534,9 +543,46 @@
   14.77  //------------------------------------------------------------------------------------------------------------------------
   14.78  // Entry points
   14.79  
   14.80 -address TemplateInterpreter::return_entry(TosState state, int length) {
   14.81 +/**
   14.82 + * Returns the return entry table for the given invoke bytecode.
   14.83 + */
   14.84 +address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
   14.85 +  switch (code) {
   14.86 +  case Bytecodes::_invokestatic:
   14.87 +  case Bytecodes::_invokespecial:
   14.88 +  case Bytecodes::_invokevirtual:
   14.89 +  case Bytecodes::_invokehandle:
   14.90 +    return Interpreter::invoke_return_entry_table();
   14.91 +  case Bytecodes::_invokeinterface:
   14.92 +    return Interpreter::invokeinterface_return_entry_table();
   14.93 +  case Bytecodes::_invokedynamic:
   14.94 +    return Interpreter::invokedynamic_return_entry_table();
   14.95 +  default:
   14.96 +    fatal(err_msg("invalid bytecode: %s", Bytecodes::name(code)));
   14.97 +    return NULL;
   14.98 +  }
   14.99 +}
  14.100 +
  14.101 +/**
  14.102 + * Returns the return entry address for the given top-of-stack state and bytecode.
  14.103 + */
  14.104 +address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
  14.105    guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
  14.106 -  return _return_entry[length].entry(state);
  14.107 +  const int index = TosState_as_index(state);
  14.108 +  switch (code) {
  14.109 +  case Bytecodes::_invokestatic:
  14.110 +  case Bytecodes::_invokespecial:
  14.111 +  case Bytecodes::_invokevirtual:
  14.112 +  case Bytecodes::_invokehandle:
  14.113 +    return _invoke_return_entry[index];
  14.114 +  case Bytecodes::_invokeinterface:
  14.115 +    return _invokeinterface_return_entry[index];
  14.116 +  case Bytecodes::_invokedynamic:
  14.117 +    return _invokedynamic_return_entry[index];
  14.118 +  default:
  14.119 +    assert(!Bytecodes::is_invoke(code), err_msg("invoke instructions should be handled separately: %s", Bytecodes::name(code)));
  14.120 +    return _return_entry[length].entry(state);
  14.121 +  }
  14.122  }
  14.123  
  14.124  
    15.1 --- a/src/share/vm/interpreter/templateInterpreter.hpp	Fri Oct 25 10:13:40 2013 +0200
    15.2 +++ b/src/share/vm/interpreter/templateInterpreter.hpp	Fri Oct 25 12:40:10 2013 -0700
    15.3 @@ -120,8 +120,9 @@
    15.4    static EntryPoint _continuation_entry;
    15.5    static EntryPoint _safept_entry;
    15.6  
    15.7 -  static address    _return_3_addrs_by_index[number_of_return_addrs];     // for invokevirtual   return entries
    15.8 -  static address    _return_5_addrs_by_index[number_of_return_addrs];     // for invokeinterface return entries
    15.9 +  static address _invoke_return_entry[number_of_return_addrs];           // for invokestatic, invokespecial, invokevirtual return entries
   15.10 +  static address _invokeinterface_return_entry[number_of_return_addrs];  // for invokeinterface return entries
   15.11 +  static address _invokedynamic_return_entry[number_of_return_addrs];    // for invokedynamic return entries
   15.12  
   15.13    static DispatchTable _active_table;                           // the active    dispatch table (used by the interpreter for dispatch)
   15.14    static DispatchTable _normal_table;                           // the normal    dispatch table (used to set the active table in normal mode)
   15.15 @@ -161,12 +162,15 @@
   15.16    static address*   normal_table()                              { return _normal_table.table_for(); }
   15.17  
   15.18    // Support for invokes
   15.19 -  static address*   return_3_addrs_by_index_table()             { return _return_3_addrs_by_index; }
   15.20 -  static address*   return_5_addrs_by_index_table()             { return _return_5_addrs_by_index; }
   15.21 -  static int        TosState_as_index(TosState state);          // computes index into return_3_entry_by_index table
   15.22 +  static address*   invoke_return_entry_table()                 { return _invoke_return_entry; }
   15.23 +  static address*   invokeinterface_return_entry_table()        { return _invokeinterface_return_entry; }
   15.24 +  static address*   invokedynamic_return_entry_table()          { return _invokedynamic_return_entry; }
   15.25 +  static int        TosState_as_index(TosState state);
   15.26  
   15.27 -  static address    return_entry  (TosState state, int length);
   15.28 -  static address    deopt_entry   (TosState state, int length);
   15.29 +  static address* invoke_return_entry_table_for(Bytecodes::Code code);
   15.30 +
   15.31 +  static address deopt_entry(TosState state, int length);
   15.32 +  static address return_entry(TosState state, int length, Bytecodes::Code code);
   15.33  
   15.34    // Safepoint support
   15.35    static void       notice_safepoints();                        // stops the thread when reaching a safepoint
    16.1 --- a/src/share/vm/interpreter/templateInterpreterGenerator.hpp	Fri Oct 25 10:13:40 2013 +0200
    16.2 +++ b/src/share/vm/interpreter/templateInterpreterGenerator.hpp	Fri Oct 25 12:40:10 2013 -0700
    16.3 @@ -53,7 +53,7 @@
    16.4    address generate_ClassCastException_handler();
    16.5    address generate_ArrayIndexOutOfBounds_handler(const char* name);
    16.6    address generate_continuation_for(TosState state);
    16.7 -  address generate_return_entry_for(TosState state, int step);
    16.8 +  address generate_return_entry_for(TosState state, int step, size_t index_size);
    16.9    address generate_earlyret_entry_for(TosState state);
   16.10    address generate_deopt_entry_for(TosState state, int step);
   16.11    address generate_safept_entry_for(TosState state, address runtime_entry);
    17.1 --- a/src/share/vm/oops/method.cpp	Fri Oct 25 10:13:40 2013 +0200
    17.2 +++ b/src/share/vm/oops/method.cpp	Fri Oct 25 12:40:10 2013 -0700
    17.3 @@ -1515,7 +1515,10 @@
    17.4        return bp->orig_bytecode();
    17.5      }
    17.6    }
    17.7 -  ShouldNotReachHere();
    17.8 +  {
    17.9 +    ResourceMark rm;
   17.10 +    fatal(err_msg("no original bytecode found in %s at bci %d", name_and_sig_as_C_string(), bci));
   17.11 +  }
   17.12    return Bytecodes::_shouldnotreachhere;
   17.13  }
   17.14  
    18.1 --- a/src/share/vm/runtime/arguments.cpp	Fri Oct 25 10:13:40 2013 +0200
    18.2 +++ b/src/share/vm/runtime/arguments.cpp	Fri Oct 25 12:40:10 2013 -0700
    18.3 @@ -3723,6 +3723,10 @@
    18.4      // Doing the replace in parent maps helps speculation
    18.5      FLAG_SET_DEFAULT(ReplaceInParentMaps, true);
    18.6    }
    18.7 +#ifndef X86
    18.8 +  // Only on x86 for now
    18.9 +  FLAG_SET_DEFAULT(TypeProfileLevel, 0);
   18.10 +#endif
   18.11  #endif
   18.12  
   18.13    if (PrintAssembly && FLAG_IS_DEFAULT(DebugNonSafepoints)) {
    19.1 --- a/src/share/vm/runtime/handles.cpp	Fri Oct 25 10:13:40 2013 +0200
    19.2 +++ b/src/share/vm/runtime/handles.cpp	Fri Oct 25 12:40:10 2013 -0700
    19.3 @@ -45,7 +45,7 @@
    19.4  oop* HandleArea::allocate_handle(oop obj) {
    19.5    assert(_handle_mark_nesting > 1, "memory leak: allocating handle outside HandleMark");
    19.6    assert(_no_handle_mark_nesting == 0, "allocating handle inside NoHandleMark");
    19.7 -  assert(obj->is_oop(), "sanity check");
    19.8 +  assert(obj->is_oop(), err_msg("not an oop: " INTPTR_FORMAT, (intptr_t*) obj));
    19.9    return real_allocate_handle(obj);
   19.10  }
   19.11  

mercurial