Mercurial > hg > truffle
comparison src/cpu/x86/vm/cppInterpreter_x86.cpp @ 625:2f2f54ed12ce
Merge
author | kvn |
---|---|
date | Tue, 10 Mar 2009 08:52:16 -0700 |
parents | 56aae7be60d4 |
children | 7bb995fbd3c0 |
comparison
equal
deleted
inserted
replaced
620:bcedf688d882 | 625:2f2f54ed12ce |
---|---|
511 __ movptr(STATE(_stack), rsp); // set current expression stack tos | 511 __ movptr(STATE(_stack), rsp); // set current expression stack tos |
512 | 512 |
513 // compute full expression stack limit | 513 // compute full expression stack limit |
514 | 514 |
515 const Address size_of_stack (rbx, methodOopDesc::max_stack_offset()); | 515 const Address size_of_stack (rbx, methodOopDesc::max_stack_offset()); |
516 __ load_unsigned_word(rdx, size_of_stack); // get size of expression stack in words | 516 __ load_unsigned_short(rdx, size_of_stack); // get size of expression stack in words |
517 __ negptr(rdx); // so we can subtract in next step | 517 __ negptr(rdx); // so we can subtract in next step |
518 // Allocate expression stack | 518 // Allocate expression stack |
519 __ lea(rsp, Address(rsp, rdx, Address::times_ptr)); | 519 __ lea(rsp, Address(rsp, rdx, Address::times_ptr)); |
520 __ movptr(STATE(_stack_limit), rsp); | 520 __ movptr(STATE(_stack_limit), rsp); |
521 } | 521 } |
657 // locals + overhead, in bytes | 657 // locals + overhead, in bytes |
658 const Address size_of_stack (rbx, methodOopDesc::max_stack_offset()); | 658 const Address size_of_stack (rbx, methodOopDesc::max_stack_offset()); |
659 // Always give one monitor to allow us to start interp if sync method. | 659 // Always give one monitor to allow us to start interp if sync method. |
660 // Any additional monitors need a check when moving the expression stack | 660 // Any additional monitors need a check when moving the expression stack |
661 const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize; | 661 const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize; |
662 __ load_unsigned_word(rax, size_of_stack); // get size of expression stack in words | 662 __ load_unsigned_short(rax, size_of_stack); // get size of expression stack in words |
663 __ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), one_monitor)); | 663 __ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), one_monitor)); |
664 __ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size)); | 664 __ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size)); |
665 | 665 |
666 #ifdef ASSERT | 666 #ifdef ASSERT |
667 Label stack_base_okay, stack_size_okay; | 667 Label stack_base_okay, stack_size_okay; |
861 __ jmp(xreturn_path); | 861 __ jmp(xreturn_path); |
862 | 862 |
863 __ bind(notByte); | 863 __ bind(notByte); |
864 __ cmpl(rdx, stos); | 864 __ cmpl(rdx, stos); |
865 __ jcc(Assembler::notEqual, notShort); | 865 __ jcc(Assembler::notEqual, notShort); |
866 __ load_signed_word(rax, field_address); | 866 __ load_signed_short(rax, field_address); |
867 __ jmp(xreturn_path); | 867 __ jmp(xreturn_path); |
868 | 868 |
869 __ bind(notShort); | 869 __ bind(notShort); |
870 __ cmpl(rdx, ctos); | 870 __ cmpl(rdx, ctos); |
871 __ jcc(Assembler::notEqual, notChar); | 871 __ jcc(Assembler::notEqual, notChar); |
872 __ load_unsigned_word(rax, field_address); | 872 __ load_unsigned_short(rax, field_address); |
873 __ jmp(xreturn_path); | 873 __ jmp(xreturn_path); |
874 | 874 |
875 __ bind(notChar); | 875 __ bind(notChar); |
876 #ifdef ASSERT | 876 #ifdef ASSERT |
877 Label okay; | 877 Label okay; |
935 | 935 |
936 // rsi/r13 == state/locals rdi == prevstate | 936 // rsi/r13 == state/locals rdi == prevstate |
937 const Register locals = rdi; | 937 const Register locals = rdi; |
938 | 938 |
939 // get parameter size (always needed) | 939 // get parameter size (always needed) |
940 __ load_unsigned_word(rcx, size_of_parameters); | 940 __ load_unsigned_short(rcx, size_of_parameters); |
941 | 941 |
942 // rbx: methodOop | 942 // rbx: methodOop |
943 // rcx: size of parameters | 943 // rcx: size of parameters |
944 __ pop(rax); // get return address | 944 __ pop(rax); // get return address |
945 // for natives the size of locals is zero | 945 // for natives the size of locals is zero |
1060 const Register t = InterpreterRuntime::SignatureHandlerGenerator::temp(); // rcx|rscratch1 | 1060 const Register t = InterpreterRuntime::SignatureHandlerGenerator::temp(); // rcx|rscratch1 |
1061 | 1061 |
1062 // allocate space for parameters | 1062 // allocate space for parameters |
1063 __ movptr(method, STATE(_method)); | 1063 __ movptr(method, STATE(_method)); |
1064 __ verify_oop(method); | 1064 __ verify_oop(method); |
1065 __ load_unsigned_word(t, Address(method, methodOopDesc::size_of_parameters_offset())); | 1065 __ load_unsigned_short(t, Address(method, methodOopDesc::size_of_parameters_offset())); |
1066 __ shll(t, 2); | 1066 __ shll(t, 2); |
1067 #ifdef _LP64 | 1067 #ifdef _LP64 |
1068 __ subptr(rsp, t); | 1068 __ subptr(rsp, t); |
1069 __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows | 1069 __ subptr(rsp, frame::arg_reg_save_area_bytes); // windows |
1070 __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI) | 1070 __ andptr(rsp, -16); // must be 16 byte boundary (see amd64 ABI) |
1657 // const Address monitor_block_top (rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize); | 1657 // const Address monitor_block_top (rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize); |
1658 // const Address monitor_block_bot (rbp, frame::interpreter_frame_initial_sp_offset * wordSize); | 1658 // const Address monitor_block_bot (rbp, frame::interpreter_frame_initial_sp_offset * wordSize); |
1659 // const Address monitor(rbp, frame::interpreter_frame_initial_sp_offset * wordSize - (int)sizeof(BasicObjectLock)); | 1659 // const Address monitor(rbp, frame::interpreter_frame_initial_sp_offset * wordSize - (int)sizeof(BasicObjectLock)); |
1660 | 1660 |
1661 // get parameter size (always needed) | 1661 // get parameter size (always needed) |
1662 __ load_unsigned_word(rcx, size_of_parameters); | 1662 __ load_unsigned_short(rcx, size_of_parameters); |
1663 | 1663 |
1664 // rbx: methodOop | 1664 // rbx: methodOop |
1665 // rcx: size of parameters | 1665 // rcx: size of parameters |
1666 __ load_unsigned_word(rdx, size_of_locals); // get size of locals in words | 1666 __ load_unsigned_short(rdx, size_of_locals); // get size of locals in words |
1667 | 1667 |
1668 __ subptr(rdx, rcx); // rdx = no. of additional locals | 1668 __ subptr(rdx, rcx); // rdx = no. of additional locals |
1669 | 1669 |
1670 // see if we've got enough room on the stack for locals plus overhead. | 1670 // see if we've got enough room on the stack for locals plus overhead. |
1671 generate_stack_overflow_check(); // C++ | 1671 generate_stack_overflow_check(); // C++ |
1947 | 1947 |
1948 // get method just executed | 1948 // get method just executed |
1949 __ movptr(rbx, STATE(_result._to_call._callee)); | 1949 __ movptr(rbx, STATE(_result._to_call._callee)); |
1950 | 1950 |
1951 // callee left args on top of expression stack, remove them | 1951 // callee left args on top of expression stack, remove them |
1952 __ load_unsigned_word(rcx, Address(rbx, methodOopDesc::size_of_parameters_offset())); | 1952 __ load_unsigned_short(rcx, Address(rbx, methodOopDesc::size_of_parameters_offset())); |
1953 __ lea(rsp, Address(rsp, rcx, Address::times_ptr)); | 1953 __ lea(rsp, Address(rsp, rcx, Address::times_ptr)); |
1954 | 1954 |
1955 __ movl(rcx, Address(rbx, methodOopDesc::result_index_offset())); | 1955 __ movl(rcx, Address(rbx, methodOopDesc::result_index_offset())); |
1956 ExternalAddress tosca_to_stack((address)CppInterpreter::_tosca_to_stack); | 1956 ExternalAddress tosca_to_stack((address)CppInterpreter::_tosca_to_stack); |
1957 // Address index(noreg, rax, Address::times_ptr); | 1957 // Address index(noreg, rax, Address::times_ptr); |
2117 // don't need a return address if reinvoking interpreter | 2117 // don't need a return address if reinvoking interpreter |
2118 | 2118 |
2119 // Make it look like call_stub calling conventions | 2119 // Make it look like call_stub calling conventions |
2120 | 2120 |
2121 // Get (potential) receiver | 2121 // Get (potential) receiver |
2122 __ load_unsigned_word(rcx, size_of_parameters); // get size of parameters in words | 2122 __ load_unsigned_short(rcx, size_of_parameters); // get size of parameters in words |
2123 | 2123 |
2124 ExternalAddress recursive(CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation)); | 2124 ExternalAddress recursive(CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation)); |
2125 __ pushptr(recursive.addr()); // make it look good in the debugger | 2125 __ pushptr(recursive.addr()); // make it look good in the debugger |
2126 | 2126 |
2127 InternalAddress entry(entry_point); | 2127 InternalAddress entry(entry_point); |