< prev index next >

src/cpu/sparc/vm/templateInterpreterGenerator_sparc.cpp

Print this page

        

*** 55,71 **** // Size of interpreter code. Increase if too small. Interpreter will // fail with a guarantee ("not enough space for interpreter generation"); // if too small. // Run with +PrintInterpreter to get the VM to print out the size. // Max size with JVMTI ! #ifdef _LP64 ! // The sethi() instruction generates lots more instructions when shell ! // stack limit is unlimited, so that's why this is much bigger. int TemplateInterpreter::InterpreterCodeSize = 260 * K; - #else - int TemplateInterpreter::InterpreterCodeSize = 230 * K; - #endif // Generation of Interpreter // // The TemplateInterpreterGenerator generates the interpreter into Interpreter::_code. --- 55,67 ---- // Size of interpreter code. Increase if too small. Interpreter will // fail with a guarantee ("not enough space for interpreter generation"); // if too small. // Run with +PrintInterpreter to get the VM to print out the size. // Max size with JVMTI ! // The sethi() instruction generates lots more instructions when shell ! // stack limit is unlimited, so that's why this is much bigger. int TemplateInterpreter::InterpreterCodeSize = 260 * K; // Generation of Interpreter // // The TemplateInterpreterGenerator generates the interpreter into Interpreter::_code.
*** 73,117 **** #define __ _masm-> //---------------------------------------------------------------------------------------------------- - #ifndef _LP64 - address TemplateInterpreterGenerator::generate_slow_signature_handler() { - address entry = __ pc(); - Argument argv(0, true); - - // We are in the jni transition frame. Save the last_java_frame corresponding to the - // outer interpreter frame - // - __ set_last_Java_frame(FP, noreg); - // make sure the interpreter frame we've pushed has a valid return pc - __ mov(O7, I7); - __ mov(Lmethod, G3_scratch); - __ mov(Llocals, G4_scratch); - __ save_frame(0); - __ mov(G2_thread, L7_thread_cache); - __ add(argv.address_in_frame(), O3); - __ mov(G2_thread, O0); - __ mov(G3_scratch, O1); - __ call(CAST_FROM_FN_PTR(address, InterpreterRuntime::slow_signature_handler), relocInfo::runtime_call_type); - __ delayed()->mov(G4_scratch, O2); - __ mov(L7_thread_cache, G2_thread); - __ reset_last_Java_frame(); - - // load the register arguments (the C code packed them as varargs) - for (Argument ldarg = argv.successor(); ldarg.is_register(); ldarg = ldarg.successor()) { - __ ld_ptr(ldarg.address_in_frame(), ldarg.as_register()); - } - __ ret(); - __ delayed()-> - restore(O0, 0, Lscratch); // caller's Lscratch gets the result handler - return entry; - } - - - #else // LP64 passes floating point arguments in F1, F3, F5, etc. instead of // O0, O1, O2 etc.. // Doubles are passed in D0, D2, D4 // We store the signature of the first 16 arguments in the first argument // slot because it will be overwritten prior to calling the native --- 69,78 ----
*** 204,214 **** __ ret(); __ delayed()-> restore(O0, 0, Lscratch); // caller's Lscratch gets the result handler return entry; } - #endif void TemplateInterpreterGenerator::generate_counter_overflow(Label& Lcontinue) { // Generate code to initiate compilation on the counter overflow. --- 165,174 ----
*** 251,278 **** // result potentially in F0/F1: save it across calls const Address& d_tmp = InterpreterMacroAssembler::d_tmp; // save and restore any potential method result value around the unlocking operation __ stf(FloatRegisterImpl::D, F0, d_tmp); - #ifdef _LP64 __ stx(O0, l_tmp); - #else - __ std(O0, l_tmp); - #endif } void TemplateInterpreterGenerator::restore_native_result(void) { const Address& l_tmp = InterpreterMacroAssembler::l_tmp; const Address& d_tmp = InterpreterMacroAssembler::d_tmp; // Restore any method result value __ ldf(FloatRegisterImpl::D, d_tmp, F0); - #ifdef _LP64 __ ldx(l_tmp, O0); - #else - __ ldd(l_tmp, O0); - #endif } address TemplateInterpreterGenerator::generate_exception_handler_common(const char* name, const char* message, bool pass_oop) { assert(!pass_oop || message == NULL, "either oop or message but not both"); address entry = __ pc(); --- 211,230 ----
*** 338,363 **** if (state == atos) { __ profile_return_type(O0, G3_scratch, G1_scratch); } - #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. --- 290,299 ----
*** 440,452 **** case T_BOOLEAN: __ subcc(G0, O0, G0); __ addc(G0, 0, Itos_i); break; // !0 => true; 0 => false case T_CHAR : __ sll(O0, 16, O0); __ srl(O0, 16, Itos_i); break; // cannot use and3, 0xFFFF too big as immediate value! case T_BYTE : __ sll(O0, 24, O0); __ sra(O0, 24, Itos_i); break; case T_SHORT : __ sll(O0, 16, O0); __ sra(O0, 16, Itos_i); break; case T_LONG : - #ifndef _LP64 - __ mov(O1, Itos_l2); // move other half of long - #endif // ifdef or no ifdef, fall through to the T_INT case case T_INT : __ mov(O0, Itos_i); break; case T_VOID : /* nothing to do */ break; case T_FLOAT : assert(F0 == Ftos_f, "fix this code" ); break; case T_DOUBLE : assert(F0 == Ftos_d, "fix this code" ); break; case T_OBJECT : --- 376,385 ----
*** 882,894 **** Register mirror = LcpoolCache; __ load_mirror(mirror, Lmethod); __ st_ptr(mirror, FP, (frame::interpreter_frame_mirror_offset * wordSize) + STACK_BIAS); __ get_constant_pool_cache( LcpoolCache ); // set LcpoolCache __ sub(FP, rounded_vm_local_words * BytesPerWord, Lmonitors ); // set Lmonitors - #ifdef _LP64 __ add( Lmonitors, STACK_BIAS, Lmonitors ); // Account for 64 bit stack bias - #endif __ sub(Lmonitors, BytesPerWord, Lesp); // set Lesp // setup interpreter activation registers __ sub(Gargs, BytesPerWord, Llocals); // set Llocals --- 815,825 ----
*** 1479,1494 **** __ reset_last_Java_frame(); // Move the result handler address __ mov(Lscratch, G3_scratch); // return possible result to the outer frame - #ifndef __LP64 - __ mov(O0, I0); - __ restore(O1, G0, O1); - #else __ restore(O0, G0, O0); - #endif /* __LP64 */ // Move result handler to expected register __ mov(G3_scratch, Lscratch); // Back in normal (native) interpreter frame. State is thread_in_native_trans --- 1410,1420 ----
*** 1552,1572 **** __ unlock_object(O1); restore_native_result(); } - #if defined(COMPILER2) && !defined(_LP64) - - // C2 expects long results in G1 we can't tell if we're returning to interpreted - // or compiled so just be safe. - - __ sllx(O0, 32, G1); // Shift bits into high G1 - __ srl (O1, 0, O1); // Zero extend O1 - __ or3 (O1, G1, G1); // OR 64 bits into G1 - - #endif /* COMPILER2 && !_LP64 */ - // dispose of return address and remove activation #ifdef ASSERT { Label ok; __ cmp_and_brx_short(I5_savedSP, FP, Assembler::greaterEqualUnsigned, Assembler::pt, ok); --- 1478,1487 ----
< prev index next >