src/cpu/sparc/vm/templateInterpreter_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8026328 Cdiff src/cpu/sparc/vm/templateInterpreter_sparc.cpp

src/cpu/sparc/vm/templateInterpreter_sparc.cpp

Print this page

        

*** 151,215 **** __ should_not_reach_here(); return entry; } ! address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) { ! TosState incoming_state = state; ! ! Label cont; ! address compiled_entry = __ pc(); ! address entry = __ pc(); #if !defined(_LP64) && defined(COMPILER2) // All return values are where we want them, except for Longs. C2 returns // longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1. // Since the interpreter will return longs in G1 and O0/O1 in the 32bit // build even if we are returning from interpreted we just do a little // stupid shuffing. // Note: I tried to make c2 return longs in O0/O1 and G1 so we wouldn't have to // do this here. Unfortunately if we did a rethrow we'd see an machepilog node // first which would move g1 -> O0/O1 and destroy the exception we were throwing. ! if (incoming_state == ltos) { __ srl (G1, 0, O1); __ srlx(G1, 32, O0); } #endif // !_LP64 && COMPILER2 - __ bind(cont); - // The callee returns with the stack possibly adjusted by adapter transition // We remove that possible adjustment here. // All interpreter local registers are untouched. Any result is passed back // in the O0/O1 or float registers. Before continuing, the arguments must be // popped from the java expression stack; i.e., Lesp must be adjusted. __ mov(Llast_SP, SP); // Remove any adapter added stack space. - Label L_got_cache, L_giant_index; const Register cache = G3_scratch; ! const Register size = G1_scratch; ! if (EnableInvokeDynamic) { ! __ ldub(Address(Lbcp, 0), G1_scratch); // Load current bytecode. ! __ cmp_and_br_short(G1_scratch, Bytecodes::_invokedynamic, Assembler::equal, Assembler::pn, L_giant_index); ! } ! __ get_cache_and_index_at_bcp(cache, G1_scratch, 1); ! __ bind(L_got_cache); ! __ ld_ptr(cache, ConstantPoolCache::base_offset() + ! ConstantPoolCacheEntry::flags_offset(), size); ! __ and3(size, 0xFF, size); // argument size in words ! __ sll(size, Interpreter::logStackElementSize, size); // each argument size in bytes ! __ add(Lesp, size, Lesp); // pop arguments ! __ dispatch_next(state, step); ! // out of the main line of code... ! if (EnableInvokeDynamic) { ! __ bind(L_giant_index); ! __ get_cache_and_index_at_bcp(cache, G1_scratch, 1, sizeof(u4)); ! __ ba_short(L_got_cache); ! } return entry; } --- 151,198 ---- __ should_not_reach_here(); return entry; } ! address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) { address entry = __ pc(); + #if !defined(_LP64) && defined(COMPILER2) // All return values are where we want them, except for Longs. C2 returns // longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1. // Since the interpreter will return longs in G1 and O0/O1 in the 32bit // build even if we are returning from interpreted we just do a little // stupid shuffing. // Note: I tried to make c2 return longs in O0/O1 and G1 so we wouldn't have to // do this here. Unfortunately if we did a rethrow we'd see an machepilog node // first which would move g1 -> O0/O1 and destroy the exception we were throwing. ! if (state == ltos) { __ srl (G1, 0, O1); __ srlx(G1, 32, O0); } #endif // !_LP64 && COMPILER2 // The callee returns with the stack possibly adjusted by adapter transition // We remove that possible adjustment here. // All interpreter local registers are untouched. Any result is passed back // in the O0/O1 or float registers. Before continuing, the arguments must be // popped from the java expression stack; i.e., Lesp must be adjusted. __ mov(Llast_SP, SP); // Remove any adapter added stack space. const Register cache = G3_scratch; ! const Register index = G1_scratch; ! __ get_cache_and_index_at_bcp(cache, index, 1, index_size); ! const Register flags = cache; ! __ ld_ptr(cache, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset(), flags); ! const Register parameter_size = flags; ! __ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, parameter_size); // argument size in words ! __ sll(parameter_size, Interpreter::logStackElementSize, parameter_size); // each argument size in bytes ! __ add(Lesp, parameter_size, Lesp); // pop arguments ! __ dispatch_next(state, step); return entry; }
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File