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

src/cpu/sparc/vm/templateInterpreter_sparc.cpp

Print this page

        

*** 188,200 **** 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(G1_scratch, Bytecodes::_invokedynamic); ! __ br(Assembler::equal, false, Assembler::pn, L_giant_index); ! __ delayed()->nop(); } __ get_cache_and_index_at_bcp(cache, G1_scratch, 1); __ bind(L_got_cache); __ ld_ptr(cache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::flags_offset(), size); --- 188,198 ---- 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, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::flags_offset(), size);
*** 205,216 **** // 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(false, L_got_cache); ! __ delayed()->nop(); } return entry; } --- 203,213 ---- // 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; }
*** 219,231 **** address entry = __ pc(); __ get_constant_pool_cache(LcpoolCache); // load LcpoolCache { Label L; Address exception_addr(G2_thread, Thread::pending_exception_offset()); __ ld_ptr(exception_addr, Gtemp); // Load pending exception. ! __ tst(Gtemp); ! __ brx(Assembler::equal, false, Assembler::pt, L); ! __ delayed()->nop(); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_pending_exception)); __ should_not_reach_here(); __ bind(L); } __ dispatch_next(state, step); --- 216,226 ---- address entry = __ pc(); __ get_constant_pool_cache(LcpoolCache); // load LcpoolCache { Label L; Address exception_addr(G2_thread, Thread::pending_exception_offset()); __ ld_ptr(exception_addr, Gtemp); // Load pending exception. ! __ br_null_short(Gtemp, Assembler::pt, L); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_pending_exception)); __ should_not_reach_here(); __ bind(L); } __ dispatch_next(state, step);
*** 302,322 **** const int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift; Label no_mdo, done; if (ProfileInterpreter) { // If no method data exists, go to profile_continue. __ ld_ptr(Lmethod, methodOopDesc::method_data_offset(), G4_scratch); ! __ br_null(G4_scratch, false, Assembler::pn, no_mdo); ! __ delayed()->nop(); // Increment counter Address mdo_invocation_counter(G4_scratch, in_bytes(methodDataOopDesc::invocation_counter_offset()) + in_bytes(InvocationCounter::counter_offset())); __ increment_mask_and_jump(mdo_invocation_counter, increment, mask, G3_scratch, Lscratch, Assembler::zero, overflow); ! __ ba(false, done); ! __ delayed()->nop(); } // Increment counter in methodOop __ bind(no_mdo); Address invocation_counter(Lmethod, --- 297,315 ---- const int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift; Label no_mdo, done; if (ProfileInterpreter) { // If no method data exists, go to profile_continue. __ ld_ptr(Lmethod, methodOopDesc::method_data_offset(), G4_scratch); ! __ br_null_short(G4_scratch, Assembler::pn, no_mdo); // Increment counter Address mdo_invocation_counter(G4_scratch, in_bytes(methodDataOopDesc::invocation_counter_offset()) + in_bytes(InvocationCounter::counter_offset())); __ increment_mask_and_jump(mdo_invocation_counter, increment, mask, G3_scratch, Lscratch, Assembler::zero, overflow); ! __ ba_short(done); } // Increment counter in methodOop __ bind(no_mdo); Address invocation_counter(Lmethod,
*** 338,359 **** if (ProfileInterpreter && profile_method != NULL) { // Test to see if we should create a method data oop AddressLiteral profile_limit((address)&InvocationCounter::InterpreterProfileLimit); __ load_contents(profile_limit, G3_scratch); ! __ cmp(O0, G3_scratch); ! __ br(Assembler::lessUnsigned, false, Assembler::pn, *profile_method_continue); ! __ delayed()->nop(); // if no method data exists, go to profile_method __ test_method_data_pointer(*profile_method); } AddressLiteral invocation_limit((address)&InvocationCounter::InterpreterInvocationLimit); __ load_contents(invocation_limit, G3_scratch); __ cmp(O0, G3_scratch); ! __ br(Assembler::greaterEqualUnsigned, false, Assembler::pn, *overflow); __ delayed()->nop(); } } --- 331,350 ---- if (ProfileInterpreter && profile_method != NULL) { // Test to see if we should create a method data oop AddressLiteral profile_limit((address)&InvocationCounter::InterpreterProfileLimit); __ load_contents(profile_limit, G3_scratch); ! __ cmp_and_br_short(O0, G3_scratch, Assembler::lessUnsigned, Assembler::pn, *profile_method_continue); // if no method data exists, go to profile_method __ test_method_data_pointer(*profile_method); } AddressLiteral invocation_limit((address)&InvocationCounter::InterpreterInvocationLimit); __ load_contents(invocation_limit, G3_scratch); __ cmp(O0, G3_scratch); ! __ br(Assembler::greaterEqualUnsigned, false, Assembler::pn, *overflow); // Far distance __ delayed()->nop(); } }
*** 408,442 **** Address saved_exception_pc(G2_thread, JavaThread::saved_exception_pc_offset()); Label after_frame_check; assert_different_registers(Rframe_size, Rscratch, Rscratch2); ! __ set( page_size, Rscratch ); ! __ cmp( Rframe_size, Rscratch ); - __ br( Assembler::lessEqual, false, Assembler::pt, after_frame_check ); - __ delayed()->nop(); - // get the stack base, and in debug, verify it is non-zero __ ld_ptr( G2_thread, Thread::stack_base_offset(), Rscratch ); #ifdef ASSERT Label base_not_zero; ! __ cmp( Rscratch, G0 ); ! __ brx( Assembler::notEqual, false, Assembler::pn, base_not_zero ); ! __ delayed()->nop(); __ stop("stack base is zero in generate_stack_overflow_check"); __ bind(base_not_zero); #endif // get the stack size, and in debug, verify it is non-zero assert( sizeof(size_t) == sizeof(intptr_t), "wrong load size" ); __ ld_ptr( G2_thread, Thread::stack_size_offset(), Rscratch2 ); #ifdef ASSERT Label size_not_zero; ! __ cmp( Rscratch2, G0 ); ! __ brx( Assembler::notEqual, false, Assembler::pn, size_not_zero ); ! __ delayed()->nop(); __ stop("stack size is zero in generate_stack_overflow_check"); __ bind(size_not_zero); #endif // compute the beginning of the protected zone minus the requested frame size --- 399,426 ---- Address saved_exception_pc(G2_thread, JavaThread::saved_exception_pc_offset()); Label after_frame_check; assert_different_registers(Rframe_size, Rscratch, Rscratch2); ! __ set(page_size, Rscratch); ! __ cmp_and_br_short(Rframe_size, Rscratch, Assembler::lessEqual, Assembler::pt, after_frame_check); // get the stack base, and in debug, verify it is non-zero __ ld_ptr( G2_thread, Thread::stack_base_offset(), Rscratch ); #ifdef ASSERT Label base_not_zero; ! __ br_notnull_short(Rscratch, Assembler::pn, base_not_zero); __ stop("stack base is zero in generate_stack_overflow_check"); __ bind(base_not_zero); #endif // get the stack size, and in debug, verify it is non-zero assert( sizeof(size_t) == sizeof(intptr_t), "wrong load size" ); __ ld_ptr( G2_thread, Thread::stack_size_offset(), Rscratch2 ); #ifdef ASSERT Label size_not_zero; ! __ br_notnull_short(Rscratch2, Assembler::pn, size_not_zero); __ stop("stack size is zero in generate_stack_overflow_check"); __ bind(size_not_zero); #endif // compute the beginning of the protected zone minus the requested frame size
*** 448,460 **** // SP, which would take another register __ add( Rscratch, Rframe_size, Rscratch ); // the frame is greater than one page in size, so check against // the bottom of the stack ! __ cmp( SP, Rscratch ); ! __ brx( Assembler::greater, false, Assembler::pt, after_frame_check ); ! __ delayed()->nop(); // Save the return address as the exception pc __ st_ptr(O7, saved_exception_pc); // the stack will overflow, throw an exception --- 432,442 ---- // SP, which would take another register __ add( Rscratch, Rframe_size, Rscratch ); // the frame is greater than one page in size, so check against // the bottom of the stack ! __ cmp_and_brx_short(SP, Rscratch, Assembler::greater, Assembler::pt, after_frame_check); // Save the return address as the exception pc __ st_ptr(O7, saved_exception_pc); // the stack will overflow, throw an exception
*** 622,634 **** // do nothing for empty methods (do not even increment invocation counter) if ( UseFastEmptyMethods) { // If we need a safepoint check, generate full interpreter entry. AddressLiteral sync_state(SafepointSynchronize::address_of_state()); __ set(sync_state, G3_scratch); ! __ cmp(G3_scratch, SafepointSynchronize::_not_synchronized); ! __ br(Assembler::notEqual, false, Assembler::pn, slow_path); ! __ delayed()->nop(); // Code: _return __ retl(); __ delayed()->mov(O5_savedSP, SP); --- 604,614 ---- // do nothing for empty methods (do not even increment invocation counter) if ( UseFastEmptyMethods) { // If we need a safepoint check, generate full interpreter entry. AddressLiteral sync_state(SafepointSynchronize::address_of_state()); __ set(sync_state, G3_scratch); ! __ cmp_and_br_short(G3_scratch, SafepointSynchronize::_not_synchronized, Assembler::notEqual, Assembler::pn, slow_path); // Code: _return __ retl(); __ delayed()->mov(O5_savedSP, SP);
*** 662,679 **** // Check if we need to reach a safepoint and generate full interpreter // frame if so. AddressLiteral sync_state(SafepointSynchronize::address_of_state()); __ load_contents(sync_state, G3_scratch); __ cmp(G3_scratch, SafepointSynchronize::_not_synchronized); ! __ br(Assembler::notEqual, false, Assembler::pn, slow_path); ! __ delayed()->nop(); // Check if local 0 != NULL __ ld_ptr(Gargs, G0, Otos_i ); // get local 0 ! __ tst(Otos_i); // check if local 0 == NULL and go the slow path ! __ brx(Assembler::zero, false, Assembler::pn, slow_path); ! __ delayed()->nop(); // read first instruction word and extract bytecode @ 1 and index @ 2 // get first 4 bytes of the bytecodes (big endian!) __ ld_ptr(G5_method, methodOopDesc::const_offset(), G1_scratch); --- 642,657 ---- // Check if we need to reach a safepoint and generate full interpreter // frame if so. AddressLiteral sync_state(SafepointSynchronize::address_of_state()); __ load_contents(sync_state, G3_scratch); __ cmp(G3_scratch, SafepointSynchronize::_not_synchronized); ! __ cmp_and_br_short(G3_scratch, SafepointSynchronize::_not_synchronized, Assembler::notEqual, Assembler::pn, slow_path); // Check if local 0 != NULL __ ld_ptr(Gargs, G0, Otos_i ); // get local 0 ! // check if local 0 == NULL and go the slow path ! __ br_null_short(Otos_i, Assembler::pn, slow_path); // read first instruction word and extract bytecode @ 1 and index @ 2 // get first 4 bytes of the bytecodes (big endian!) __ ld_ptr(G5_method, methodOopDesc::const_offset(), G1_scratch);
*** 695,707 **** // If not, need the slow path. ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset(); __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::indices_offset(), G1_scratch); __ srl(G1_scratch, 2*BitsPerByte, G1_scratch); __ and3(G1_scratch, 0xFF, G1_scratch); ! __ cmp(G1_scratch, Bytecodes::_getfield); ! __ br(Assembler::notEqual, false, Assembler::pn, slow_path); ! __ delayed()->nop(); // Get the type and return field offset from the constant pool cache __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), G1_scratch); __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), G3_scratch); --- 673,683 ---- // If not, need the slow path. ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset(); __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::indices_offset(), G1_scratch); __ srl(G1_scratch, 2*BitsPerByte, G1_scratch); __ and3(G1_scratch, 0xFF, G1_scratch); ! __ cmp_and_br_short(G1_scratch, Bytecodes::_getfield, Assembler::notEqual, Assembler::pn, slow_path); // Get the type and return field offset from the constant pool cache __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), G1_scratch); __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), G3_scratch);
*** 785,797 **** // continue and the thread will safepoint at the next bytecode dispatch. // Check if local 0 != NULL // If the receiver is null then it is OK to jump to the slow path. __ ld_ptr(Gargs, G0, Otos_i ); // get local 0 ! __ tst(Otos_i); // check if local 0 == NULL and go the slow path ! __ brx(Assembler::zero, false, Assembler::pn, slow_path); ! __ delayed()->nop(); // Load the value of the referent field. if (Assembler::is_simm13(referent_offset)) { __ load_heap_oop(Otos_i, referent_offset, Otos_i); --- 761,772 ---- // continue and the thread will safepoint at the next bytecode dispatch. // Check if local 0 != NULL // If the receiver is null then it is OK to jump to the slow path. __ ld_ptr(Gargs, G0, Otos_i ); // get local 0 ! // check if local 0 == NULL and go the slow path ! __ cmp_and_brx_short(Otos_i, 0, Assembler::equal, Assembler::pn, slow_path); // Load the value of the referent field. if (Assembler::is_simm13(referent_offset)) { __ load_heap_oop(Otos_i, referent_offset, Otos_i);
*** 950,962 **** // get signature handler { Label L; Address signature_handler(Lmethod, methodOopDesc::signature_handler_offset()); __ ld_ptr(signature_handler, G3_scratch); ! __ tst(G3_scratch); ! __ brx(Assembler::notZero, false, Assembler::pt, L); ! __ delayed()->nop(); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::prepare_native_call), Lmethod); __ ld_ptr(signature_handler, G3_scratch); __ bind(L); } --- 925,935 ---- // get signature handler { Label L; Address signature_handler(Lmethod, methodOopDesc::signature_handler_offset()); __ ld_ptr(signature_handler, G3_scratch); ! __ br_notnull_short(G3_scratch, Assembler::pt, L); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::prepare_native_call), Lmethod); __ ld_ptr(signature_handler, G3_scratch); __ bind(L); }
*** 1017,1029 **** __ ld_ptr(O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1); __ ld_ptr(O1, mirror_offset, O1); #ifdef ASSERT if (!PrintSignatureHandlers) // do not dirty the output with this { Label L; ! __ tst(O1); ! __ brx(Assembler::notZero, false, Assembler::pt, L); ! __ delayed()->nop(); __ stop("mirror is missing"); __ bind(L); } #endif // ASSERT __ st_ptr(O1, Lscratch2, 0); --- 990,1000 ---- __ ld_ptr(O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1); __ ld_ptr(O1, mirror_offset, O1); #ifdef ASSERT if (!PrintSignatureHandlers) // do not dirty the output with this { Label L; ! __ br_notnull_short(O1, Assembler::pt, L); __ stop("mirror is missing"); __ bind(L); } #endif // ASSERT __ st_ptr(O1, Lscratch2, 0);
*** 1036,1048 **** // Oops are boxed in-place on the stack, with handles copied to arguments. // The result handler is in Lscratch. O0 will shortly hold the JNIEnv*. #ifdef ASSERT { Label L; ! __ tst(O0); ! __ brx(Assembler::notZero, false, Assembler::pt, L); ! __ delayed()->nop(); __ stop("native entry point is missing"); __ bind(L); } #endif // ASSERT --- 1007,1017 ---- // Oops are boxed in-place on the stack, with handles copied to arguments. // The result handler is in Lscratch. O0 will shortly hold the JNIEnv*. #ifdef ASSERT { Label L; ! __ br_notnull_short(O0, Assembler::pt, L); __ stop("native entry point is missing"); __ bind(L); } #endif // ASSERT
*** 1077,1089 **** Address thread_state(G2_thread, JavaThread::thread_state_offset()); #ifdef ASSERT { Label L; __ ld(thread_state, G3_scratch); ! __ cmp(G3_scratch, _thread_in_Java); ! __ br(Assembler::equal, false, Assembler::pt, L); ! __ delayed()->nop(); __ stop("Wrong thread state in native stub"); __ bind(L); } #endif // ASSERT __ set(_thread_in_native, G3_scratch); --- 1046,1056 ---- Address thread_state(G2_thread, JavaThread::thread_state_offset()); #ifdef ASSERT { Label L; __ ld(thread_state, G3_scratch); ! __ cmp_and_br_short(G3_scratch, _thread_in_Java, Assembler::equal, Assembler::pt, L); __ stop("Wrong thread state in native stub"); __ bind(L); } #endif // ASSERT __ set(_thread_in_native, G3_scratch);
*** 1132,1144 **** __ cmp(G3_scratch, SafepointSynchronize::_not_synchronized); Label L; __ br(Assembler::notEqual, false, Assembler::pn, L); __ delayed()->ld(G2_thread, JavaThread::suspend_flags_offset(), G3_scratch); ! __ cmp(G3_scratch, 0); ! __ br(Assembler::equal, false, Assembler::pt, no_block); ! __ delayed()->nop(); __ bind(L); // Block. Save any potential method result value before the operation and // use a leaf call to leave the last_Java_frame setup undisturbed. save_native_result(); --- 1099,1109 ---- __ cmp(G3_scratch, SafepointSynchronize::_not_synchronized); Label L; __ br(Assembler::notEqual, false, Assembler::pn, L); __ delayed()->ld(G2_thread, JavaThread::suspend_flags_offset(), G3_scratch); ! __ cmp_and_br_short(G3_scratch, 0, Assembler::equal, Assembler::pt, no_block); __ bind(L); // Block. Save any potential method result value before the operation and // use a leaf call to leave the last_Java_frame setup undisturbed. save_native_result();
*** 1183,1195 **** { Label no_oop, store_result; __ set((intptr_t)AbstractInterpreter::result_handler(T_OBJECT), G3_scratch); ! __ cmp(G3_scratch, Lscratch); ! __ brx(Assembler::notEqual, false, Assembler::pt, no_oop); ! __ delayed()->nop(); __ addcc(G0, O0, O0); __ brx(Assembler::notZero, true, Assembler::pt, store_result); // if result is not NULL: __ delayed()->ld_ptr(O0, 0, O0); // unbox it __ mov(G0, O0); --- 1148,1158 ---- { Label no_oop, store_result; __ set((intptr_t)AbstractInterpreter::result_handler(T_OBJECT), G3_scratch); ! __ cmp_and_brx_short(G3_scratch, Lscratch, Assembler::notEqual, Assembler::pt, no_oop); __ addcc(G0, O0, O0); __ brx(Assembler::notZero, true, Assembler::pt, store_result); // if result is not NULL: __ delayed()->ld_ptr(O0, 0, O0); // unbox it __ mov(G0, O0);
*** 1204,1216 **** // handle exceptions (exception handling will handle unlocking!) { Label L; Address exception_addr(G2_thread, Thread::pending_exception_offset()); __ ld_ptr(exception_addr, Gtemp); ! __ tst(Gtemp); ! __ brx(Assembler::equal, false, Assembler::pt, L); ! __ delayed()->nop(); // Note: This could be handled more efficiently since we know that the native // method doesn't have an exception handler. We could directly return // to the exception handler for the caller. __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_pending_exception)); __ should_not_reach_here(); --- 1167,1177 ---- // handle exceptions (exception handling will handle unlocking!) { Label L; Address exception_addr(G2_thread, Thread::pending_exception_offset()); __ ld_ptr(exception_addr, Gtemp); ! __ br_null_short(Gtemp, Assembler::pt, L); // Note: This could be handled more efficiently since we know that the native // method doesn't have an exception handler. We could directly return // to the exception handler for the caller. __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_pending_exception)); __ should_not_reach_here();
*** 1243,1255 **** // dispose of return address and remove activation #ifdef ASSERT { Label ok; ! __ cmp(I5_savedSP, FP); ! __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pt, ok); ! __ delayed()->nop(); __ stop("bad I5_savedSP value"); __ should_not_reach_here(); __ bind(ok); } #endif --- 1204,1214 ---- // dispose of return address and remove activation #ifdef ASSERT { Label ok; ! __ cmp_and_brx_short(I5_savedSP, FP, Assembler::greaterEqualUnsigned, Assembler::pt, ok); __ stop("bad I5_savedSP value"); __ should_not_reach_here(); __ bind(ok); } #endif
*** 1427,1438 **** // We have decided to profile this method in the interpreter __ bind(profile_method); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method)); __ set_method_data_pointer_for_bcp(); ! __ ba(false, profile_method_continue); ! __ delayed()->nop(); } // handle invocation counter overflow __ bind(invocation_counter_overflow); generate_counter_overflow(Lcontinue); --- 1386,1396 ---- // We have decided to profile this method in the interpreter __ bind(profile_method); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method)); __ set_method_data_pointer_for_bcp(); ! __ ba_short(profile_method_continue); } // handle invocation counter overflow __ bind(invocation_counter_overflow); generate_counter_overflow(Lcontinue);
*** 1854,1866 **** // Note that we don't compare the return PC against the // deoptimization blob's unpack entry because of the presence of // adapter frames in C2. Label caller_not_deoptimized; __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, InterpreterRuntime::interpreter_contains), I7); ! __ tst(O0); ! __ brx(Assembler::notEqual, false, Assembler::pt, caller_not_deoptimized); ! __ delayed()->nop(); const Register Gtmp1 = G3_scratch; const Register Gtmp2 = G1_scratch; // Compute size of arguments for saving when returning to deoptimized caller --- 1812,1822 ---- // Note that we don't compare the return PC against the // deoptimization blob's unpack entry because of the presence of // adapter frames in C2. Label caller_not_deoptimized; __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, InterpreterRuntime::interpreter_contains), I7); ! __ br_notnull_short(O0, Assembler::pt, caller_not_deoptimized); const Register Gtmp1 = G3_scratch; const Register Gtmp2 = G1_scratch; // Compute size of arguments for saving when returning to deoptimized caller
*** 1990,2003 **** // Helper for vtos entry point generation void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t, address& bep, address& cep, address& sep, address& aep, address& iep, address& lep, address& fep, address& dep, address& vep) { assert(t->is_valid() && t->tos_in() == vtos, "illegal template"); Label L; ! aep = __ pc(); __ push_ptr(); __ ba(false, L); __ delayed()->nop(); ! fep = __ pc(); __ push_f(); __ ba(false, L); __ delayed()->nop(); ! dep = __ pc(); __ push_d(); __ ba(false, L); __ delayed()->nop(); ! lep = __ pc(); __ push_l(); __ ba(false, L); __ delayed()->nop(); iep = __ pc(); __ push_i(); bep = cep = sep = iep; // there aren't any vep = __ pc(); __ bind(L); // fall through generate_and_dispatch(t); } --- 1946,1959 ---- // Helper for vtos entry point generation void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t, address& bep, address& cep, address& sep, address& aep, address& iep, address& lep, address& fep, address& dep, address& vep) { assert(t->is_valid() && t->tos_in() == vtos, "illegal template"); Label L; ! aep = __ pc(); __ push_ptr(); __ ba_short(L); ! fep = __ pc(); __ push_f(); __ ba_short(L); ! dep = __ pc(); __ push_d(); __ ba_short(L); ! lep = __ pc(); __ push_l(); __ ba_short(L); iep = __ pc(); __ push_i(); bep = cep = sep = iep; // there aren't any vep = __ pc(); __ bind(L); // fall through generate_and_dispatch(t); }
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File