comparison src/cpu/x86/vm/cppInterpreter_x86.cpp @ 7482:989155e2d07a

Merge with hs25-b15.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 16 Jan 2013 01:34:24 +0100
parents fd74228fd5ca
children db9981fd3124
comparison
equal deleted inserted replaced
7381:6761a8f854a4 7482:989155e2d07a
609 // rsp - sender_sp 609 // rsp - sender_sp
610 610
611 // C++ interpreter only 611 // C++ interpreter only
612 // rsi/r13 - previous interpreter state pointer 612 // rsi/r13 - previous interpreter state pointer
613 613
614 const Address size_of_parameters(rbx, Method::size_of_parameters_offset());
615
616 // InterpreterRuntime::frequency_counter_overflow takes one argument 614 // InterpreterRuntime::frequency_counter_overflow takes one argument
617 // indicating if the counter overflow occurs at a backwards branch (non-NULL bcp). 615 // indicating if the counter overflow occurs at a backwards branch (non-NULL bcp).
618 // The call returns the address of the verified entry point for the method or NULL 616 // The call returns the address of the verified entry point for the method or NULL
619 // if the compilation did not complete (either went background or bailed out). 617 // if the compilation did not complete (either went background or bailed out).
620 __ movptr(rax, (int32_t)false); 618 __ movptr(rax, (int32_t)false);
975 // rsi/r13: previous interpreter state (if called from C++ interpreter) must preserve 973 // rsi/r13: previous interpreter state (if called from C++ interpreter) must preserve
976 // in any case. If called via c1/c2/call_stub rsi/r13 is junk (to use) but harmless 974 // in any case. If called via c1/c2/call_stub rsi/r13 is junk (to use) but harmless
977 // to save/restore. 975 // to save/restore.
978 address entry_point = __ pc(); 976 address entry_point = __ pc();
979 977
980 const Address size_of_parameters(rbx, Method::size_of_parameters_offset()); 978 const Address constMethod (rbx, Method::const_offset());
981 const Address size_of_locals (rbx, Method::size_of_locals_offset());
982 const Address invocation_counter(rbx, Method::invocation_counter_offset() + InvocationCounter::counter_offset()); 979 const Address invocation_counter(rbx, Method::invocation_counter_offset() + InvocationCounter::counter_offset());
983 const Address access_flags (rbx, Method::access_flags_offset()); 980 const Address access_flags (rbx, Method::access_flags_offset());
981 const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
984 982
985 // rsi/r13 == state/locals rdi == prevstate 983 // rsi/r13 == state/locals rdi == prevstate
986 const Register locals = rdi; 984 const Register locals = rdi;
987 985
988 // get parameter size (always needed) 986 // get parameter size (always needed)
987 __ movptr(rcx, constMethod);
989 __ load_unsigned_short(rcx, size_of_parameters); 988 __ load_unsigned_short(rcx, size_of_parameters);
990 989
991 // rbx: Method* 990 // rbx: Method*
992 // rcx: size of parameters 991 // rcx: size of parameters
993 __ pop(rax); // get return address 992 __ pop(rax); // get return address
994 // for natives the size of locals is zero 993 // for natives the size of locals is zero
995 994
996 // compute beginning of parameters /locals 995 // compute beginning of parameters /locals
996
997 __ lea(locals, Address(rsp, rcx, Address::times_ptr, -wordSize)); 997 __ lea(locals, Address(rsp, rcx, Address::times_ptr, -wordSize));
998 998
999 // initialize fixed part of activation frame 999 // initialize fixed part of activation frame
1000 1000
1001 // Assumes rax = return address 1001 // Assumes rax = return address
1105 1105
1106 // work registers 1106 // work registers
1107 const Register method = rbx; 1107 const Register method = rbx;
1108 const Register thread = LP64_ONLY(r15_thread) NOT_LP64(rdi); 1108 const Register thread = LP64_ONLY(r15_thread) NOT_LP64(rdi);
1109 const Register t = InterpreterRuntime::SignatureHandlerGenerator::temp(); // rcx|rscratch1 1109 const Register t = InterpreterRuntime::SignatureHandlerGenerator::temp(); // rcx|rscratch1
1110 const Address constMethod (method, Method::const_offset());
1111 const Address size_of_parameters(t, ConstMethod::size_of_parameters_offset());
1110 1112
1111 // allocate space for parameters 1113 // allocate space for parameters
1112 __ movptr(method, STATE(_method)); 1114 __ movptr(method, STATE(_method));
1113 __ verify_method_ptr(method); 1115 __ verify_method_ptr(method);
1114 __ load_unsigned_short(t, Address(method, Method::size_of_parameters_offset())); 1116 __ movptr(t, constMethod);
1117 __ load_unsigned_short(t, size_of_parameters);
1115 __ shll(t, 2); 1118 __ shll(t, 2);
1116 #ifdef _LP64 1119 #ifdef _LP64
1117 __ subptr(rsp, t); 1120 __ subptr(rsp, t);
1118 __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows 1121 __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows
1119 __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI) 1122 __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI)
1698 __ bind(dispatch_entry_2); 1701 __ bind(dispatch_entry_2);
1699 1702
1700 // save sender sp 1703 // save sender sp
1701 __ push(rcx); 1704 __ push(rcx);
1702 1705
1703 const Address size_of_parameters(rbx, Method::size_of_parameters_offset()); 1706 const Address constMethod (rbx, Method::const_offset());
1704 const Address size_of_locals (rbx, Method::size_of_locals_offset());
1705 const Address access_flags (rbx, Method::access_flags_offset()); 1707 const Address access_flags (rbx, Method::access_flags_offset());
1708 const Address size_of_parameters(rdx, ConstMethod::size_of_parameters_offset());
1709 const Address size_of_locals (rdx, ConstMethod::size_of_locals_offset());
1706 1710
1707 // const Address monitor_block_top (rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize); 1711 // const Address monitor_block_top (rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
1708 // const Address monitor_block_bot (rbp, frame::interpreter_frame_initial_sp_offset * wordSize); 1712 // const Address monitor_block_bot (rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
1709 // const Address monitor(rbp, frame::interpreter_frame_initial_sp_offset * wordSize - (int)sizeof(BasicObjectLock)); 1713 // const Address monitor(rbp, frame::interpreter_frame_initial_sp_offset * wordSize - (int)sizeof(BasicObjectLock));
1710 1714
1711 // get parameter size (always needed) 1715 // get parameter size (always needed)
1716 __ movptr(rdx, constMethod);
1712 __ load_unsigned_short(rcx, size_of_parameters); 1717 __ load_unsigned_short(rcx, size_of_parameters);
1713 1718
1714 // rbx: Method* 1719 // rbx: Method*
1715 // rcx: size of parameters 1720 // rcx: size of parameters
1716 __ load_unsigned_short(rdx, size_of_locals); // get size of locals in words 1721 __ load_unsigned_short(rdx, size_of_locals); // get size of locals in words
1987 1992
1988 // get method just executed 1993 // get method just executed
1989 __ movptr(rbx, STATE(_result._to_call._callee)); 1994 __ movptr(rbx, STATE(_result._to_call._callee));
1990 1995
1991 // callee left args on top of expression stack, remove them 1996 // callee left args on top of expression stack, remove them
1992 __ load_unsigned_short(rcx, Address(rbx, Method::size_of_parameters_offset())); 1997 __ movptr(rcx, constMethod);
1998 __ load_unsigned_short(rcx, Address(rcx, ConstMethod::size_of_parameters_offset()));
1999
1993 __ lea(rsp, Address(rsp, rcx, Address::times_ptr)); 2000 __ lea(rsp, Address(rsp, rcx, Address::times_ptr));
1994 2001
1995 __ movl(rcx, Address(rbx, Method::result_index_offset())); 2002 __ movl(rcx, Address(rbx, Method::result_index_offset()));
1996 ExternalAddress tosca_to_stack((address)CppInterpreter::_tosca_to_stack); 2003 ExternalAddress tosca_to_stack((address)CppInterpreter::_tosca_to_stack);
1997 // Address index(noreg, rax, Address::times_ptr); 2004 // Address index(noreg, rax, Address::times_ptr);
2157 // don't need a return address if reinvoking interpreter 2164 // don't need a return address if reinvoking interpreter
2158 2165
2159 // Make it look like call_stub calling conventions 2166 // Make it look like call_stub calling conventions
2160 2167
2161 // Get (potential) receiver 2168 // Get (potential) receiver
2162 __ load_unsigned_short(rcx, size_of_parameters); // get size of parameters in words 2169 // get size of parameters in words
2170 __ movptr(rcx, constMethod);
2171 __ load_unsigned_short(rcx, Address(rcx, ConstMethod::size_of_parameters_offset()));
2163 2172
2164 ExternalAddress recursive(CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation)); 2173 ExternalAddress recursive(CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation));
2165 __ pushptr(recursive.addr()); // make it look good in the debugger 2174 __ pushptr(recursive.addr()); // make it look good in the debugger
2166 2175
2167 InternalAddress entry(entry_point); 2176 InternalAddress entry(entry_point);