comparison src/cpu/x86/vm/cppInterpreter_x86.cpp @ 14726:92aa6797d639

Backed out merge changeset: b51e29501f30 Backed out merge revision to its first parent (8f483e200405)
author Doug Simon <doug.simon@oracle.com>
date Mon, 24 Mar 2014 21:30:43 +0100
parents d3f14809b051
children
comparison
equal deleted inserted replaced
14719:0bdd0d157040 14726:92aa6797d639
572 Label done; 572 Label done;
573 const Address invocation_counter(rax, 573 const Address invocation_counter(rax,
574 MethodCounters::invocation_counter_offset() + 574 MethodCounters::invocation_counter_offset() +
575 InvocationCounter::counter_offset()); 575 InvocationCounter::counter_offset());
576 const Address backedge_counter (rax, 576 const Address backedge_counter (rax,
577 MethodCounters::backedge_counter_offset() + 577 MethodCounter::backedge_counter_offset() +
578 InvocationCounter::counter_offset()); 578 InvocationCounter::counter_offset());
579 579
580 __ get_method_counters(rbx, rax, done); 580 __ get_method_counters(rbx, rax, done);
581 581
582 if (ProfileInterpreter) { 582 if (ProfileInterpreter) {
980 // rsi/r13: previous interpreter state (if called from C++ interpreter) must preserve 980 // rsi/r13: previous interpreter state (if called from C++ interpreter) must preserve
981 // in any case. If called via c1/c2/call_stub rsi/r13 is junk (to use) but harmless 981 // in any case. If called via c1/c2/call_stub rsi/r13 is junk (to use) but harmless
982 // to save/restore. 982 // to save/restore.
983 address entry_point = __ pc(); 983 address entry_point = __ pc();
984 984
985 const Address constMethod (rbx, Method::const_offset());
985 const Address access_flags (rbx, Method::access_flags_offset()); 986 const Address access_flags (rbx, Method::access_flags_offset());
987 const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
986 988
987 // rsi/r13 == state/locals rdi == prevstate 989 // rsi/r13 == state/locals rdi == prevstate
988 const Register locals = rdi; 990 const Register locals = rdi;
989 991
990 // get parameter size (always needed) 992 // get parameter size (always needed)
991 { 993 __ movptr(rcx, constMethod);
992 const Address constMethod (rbx, Method::const_offset()); 994 __ load_unsigned_short(rcx, size_of_parameters);
993 const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
994 __ movptr(rcx, constMethod);
995 __ load_unsigned_short(rcx, size_of_parameters);
996 }
997 995
998 // rbx: Method* 996 // rbx: Method*
999 // rcx: size of parameters 997 // rcx: size of parameters
1000 __ pop(rax); // get return address 998 __ pop(rax); // get return address
1001 // for natives the size of locals is zero 999 // for natives the size of locals is zero
1111 1109
1112 // work registers 1110 // work registers
1113 const Register method = rbx; 1111 const Register method = rbx;
1114 const Register thread = LP64_ONLY(r15_thread) NOT_LP64(rdi); 1112 const Register thread = LP64_ONLY(r15_thread) NOT_LP64(rdi);
1115 const Register t = InterpreterRuntime::SignatureHandlerGenerator::temp(); // rcx|rscratch1 1113 const Register t = InterpreterRuntime::SignatureHandlerGenerator::temp(); // rcx|rscratch1
1116 1114 const Address constMethod (method, Method::const_offset());
1117 // allocate space for parameters 1115 const Address size_of_parameters(t, ConstMethod::size_of_parameters_offset());
1116
1117 // allocate space for parameters
1118 __ movptr(method, STATE(_method)); 1118 __ movptr(method, STATE(_method));
1119 __ verify_method_ptr(method); 1119 __ verify_method_ptr(method);
1120 { 1120 __ movptr(t, constMethod);
1121 const Address constMethod (method, Method::const_offset()); 1121 __ load_unsigned_short(t, size_of_parameters);
1122 const Address size_of_parameters(t, ConstMethod::size_of_parameters_offset());
1123 __ movptr(t, constMethod);
1124 __ load_unsigned_short(t, size_of_parameters);
1125 }
1126 __ shll(t, 2); 1122 __ shll(t, 2);
1127 #ifdef _LP64 1123 #ifdef _LP64
1128 __ subptr(rsp, t); 1124 __ subptr(rsp, t);
1129 __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows 1125 __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows
1130 __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI) 1126 __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI)
2223 case Interpreter::native : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false); break; 2219 case Interpreter::native : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false); break;
2224 case Interpreter::native_synchronized : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true); break; 2220 case Interpreter::native_synchronized : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true); break;
2225 case Interpreter::empty : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry(); break; 2221 case Interpreter::empty : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry(); break;
2226 case Interpreter::accessor : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry(); break; 2222 case Interpreter::accessor : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry(); break;
2227 case Interpreter::abstract : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry(); break; 2223 case Interpreter::abstract : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry(); break;
2224 case Interpreter::method_handle : entry_point = ((InterpreterGenerator*)this)->generate_method_handle_entry(); break;
2228 2225
2229 case Interpreter::java_lang_math_sin : // fall thru 2226 case Interpreter::java_lang_math_sin : // fall thru
2230 case Interpreter::java_lang_math_cos : // fall thru 2227 case Interpreter::java_lang_math_cos : // fall thru
2231 case Interpreter::java_lang_math_tan : // fall thru 2228 case Interpreter::java_lang_math_tan : // fall thru
2232 case Interpreter::java_lang_math_abs : // fall thru 2229 case Interpreter::java_lang_math_abs : // fall thru
2233 case Interpreter::java_lang_math_log : // fall thru 2230 case Interpreter::java_lang_math_log : // fall thru
2234 case Interpreter::java_lang_math_log10 : // fall thru 2231 case Interpreter::java_lang_math_log10 : // fall thru
2235 case Interpreter::java_lang_math_sqrt : // fall thru 2232 case Interpreter::java_lang_math_sqrt : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind); break;
2236 case Interpreter::java_lang_math_pow : // fall thru
2237 case Interpreter::java_lang_math_exp : // fall thru
2238 entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind); break;
2239 case Interpreter::java_lang_ref_reference_get 2233 case Interpreter::java_lang_ref_reference_get
2240 : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; 2234 : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;
2241 default : ShouldNotReachHere(); break; 2235 default : ShouldNotReachHere(); break;
2242 } 2236 }
2243 2237
2455 // BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address, interpreter_frame->fp()); 2449 // BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address, interpreter_frame->fp());
2456 } 2450 }
2457 return frame_size/BytesPerWord; 2451 return frame_size/BytesPerWord;
2458 } 2452 }
2459 2453
2460 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
2461 switch (method_kind(m)) {
2462 case Interpreter::java_lang_math_sin : // fall thru
2463 case Interpreter::java_lang_math_cos : // fall thru
2464 case Interpreter::java_lang_math_tan : // fall thru
2465 case Interpreter::java_lang_math_abs : // fall thru
2466 case Interpreter::java_lang_math_log : // fall thru
2467 case Interpreter::java_lang_math_log10 : // fall thru
2468 case Interpreter::java_lang_math_sqrt : // fall thru
2469 case Interpreter::java_lang_math_pow : // fall thru
2470 case Interpreter::java_lang_math_exp :
2471 return false;
2472 default:
2473 return true;
2474 }
2475 }
2476
2477
2478 #endif // CC_INTERP (all) 2454 #endif // CC_INTERP (all)