660 __ jmp(xreturn_path); |
660 __ jmp(xreturn_path); |
661 |
661 |
662 __ bind(notByte); |
662 __ bind(notByte); |
663 __ cmpl(rdx, stos); |
663 __ cmpl(rdx, stos); |
664 __ jcc(Assembler::notEqual, notShort); |
664 __ jcc(Assembler::notEqual, notShort); |
665 __ load_signed_word(rax, field_address); |
665 __ load_signed_short(rax, field_address); |
666 __ jmp(xreturn_path); |
666 __ jmp(xreturn_path); |
667 |
667 |
668 __ bind(notShort); |
668 __ bind(notShort); |
669 __ cmpl(rdx, ctos); |
669 __ cmpl(rdx, ctos); |
670 __ jcc(Assembler::notEqual, notChar); |
670 __ jcc(Assembler::notEqual, notChar); |
671 __ load_unsigned_word(rax, field_address); |
671 __ load_unsigned_short(rax, field_address); |
672 __ jmp(xreturn_path); |
672 __ jmp(xreturn_path); |
673 |
673 |
674 __ bind(notChar); |
674 __ bind(notChar); |
675 #ifdef ASSERT |
675 #ifdef ASSERT |
676 Label okay; |
676 Label okay; |
721 const Address size_of_parameters(rbx, methodOopDesc::size_of_parameters_offset()); |
721 const Address size_of_parameters(rbx, methodOopDesc::size_of_parameters_offset()); |
722 const Address invocation_counter(rbx, methodOopDesc::invocation_counter_offset() + InvocationCounter::counter_offset()); |
722 const Address invocation_counter(rbx, methodOopDesc::invocation_counter_offset() + InvocationCounter::counter_offset()); |
723 const Address access_flags (rbx, methodOopDesc::access_flags_offset()); |
723 const Address access_flags (rbx, methodOopDesc::access_flags_offset()); |
724 |
724 |
725 // get parameter size (always needed) |
725 // get parameter size (always needed) |
726 __ load_unsigned_word(rcx, size_of_parameters); |
726 __ load_unsigned_short(rcx, size_of_parameters); |
727 |
727 |
728 // native calls don't need the stack size check since they have no expression stack |
728 // native calls don't need the stack size check since they have no expression stack |
729 // and the arguments are already on the stack and we only add a handful of words |
729 // and the arguments are already on the stack and we only add a handful of words |
730 // to the stack |
730 // to the stack |
731 |
731 |
836 const Register t = rcx; |
836 const Register t = rcx; |
837 |
837 |
838 // allocate space for parameters |
838 // allocate space for parameters |
839 __ get_method(method); |
839 __ get_method(method); |
840 __ verify_oop(method); |
840 __ verify_oop(method); |
841 __ load_unsigned_word(t, Address(method, methodOopDesc::size_of_parameters_offset())); |
841 __ load_unsigned_short(t, Address(method, methodOopDesc::size_of_parameters_offset())); |
842 __ shlptr(t, Interpreter::logStackElementSize()); |
842 __ shlptr(t, Interpreter::logStackElementSize()); |
843 __ addptr(t, 2*wordSize); // allocate two more slots for JNIEnv and possible mirror |
843 __ addptr(t, 2*wordSize); // allocate two more slots for JNIEnv and possible mirror |
844 __ subptr(rsp, t); |
844 __ subptr(rsp, t); |
845 __ andptr(rsp, -(StackAlignmentInBytes)); // gcc needs 16 byte aligned stacks to do XMM intrinsics |
845 __ andptr(rsp, -(StackAlignmentInBytes)); // gcc needs 16 byte aligned stacks to do XMM intrinsics |
846 |
846 |
1153 const Address size_of_locals (rbx, methodOopDesc::size_of_locals_offset()); |
1153 const Address size_of_locals (rbx, methodOopDesc::size_of_locals_offset()); |
1154 const Address invocation_counter(rbx, methodOopDesc::invocation_counter_offset() + InvocationCounter::counter_offset()); |
1154 const Address invocation_counter(rbx, methodOopDesc::invocation_counter_offset() + InvocationCounter::counter_offset()); |
1155 const Address access_flags (rbx, methodOopDesc::access_flags_offset()); |
1155 const Address access_flags (rbx, methodOopDesc::access_flags_offset()); |
1156 |
1156 |
1157 // get parameter size (always needed) |
1157 // get parameter size (always needed) |
1158 __ load_unsigned_word(rcx, size_of_parameters); |
1158 __ load_unsigned_short(rcx, size_of_parameters); |
1159 |
1159 |
1160 // rbx,: methodOop |
1160 // rbx,: methodOop |
1161 // rcx: size of parameters |
1161 // rcx: size of parameters |
1162 |
1162 |
1163 // rsi: sender_sp (could differ from sp+wordSize if we were called via c2i ) |
1163 // rsi: sender_sp (could differ from sp+wordSize if we were called via c2i ) |
1164 |
1164 |
1165 __ load_unsigned_word(rdx, size_of_locals); // get size of locals in words |
1165 __ load_unsigned_short(rdx, size_of_locals); // get size of locals in words |
1166 __ subl(rdx, rcx); // rdx = no. of additional locals |
1166 __ subl(rdx, rcx); // rdx = no. of additional locals |
1167 |
1167 |
1168 // see if we've got enough room on the stack for locals plus overhead. |
1168 // see if we've got enough room on the stack for locals plus overhead. |
1169 generate_stack_overflow_check(); |
1169 generate_stack_overflow_check(); |
1170 |
1170 |
1556 __ jcc(Assembler::notZero, caller_not_deoptimized); |
1556 __ jcc(Assembler::notZero, caller_not_deoptimized); |
1557 |
1557 |
1558 // Compute size of arguments for saving when returning to deoptimized caller |
1558 // Compute size of arguments for saving when returning to deoptimized caller |
1559 __ get_method(rax); |
1559 __ get_method(rax); |
1560 __ verify_oop(rax); |
1560 __ verify_oop(rax); |
1561 __ load_unsigned_word(rax, Address(rax, in_bytes(methodOopDesc::size_of_parameters_offset()))); |
1561 __ load_unsigned_short(rax, Address(rax, in_bytes(methodOopDesc::size_of_parameters_offset()))); |
1562 __ shlptr(rax, Interpreter::logStackElementSize()); |
1562 __ shlptr(rax, Interpreter::logStackElementSize()); |
1563 __ restore_locals(); |
1563 __ restore_locals(); |
1564 __ subptr(rdi, rax); |
1564 __ subptr(rdi, rax); |
1565 __ addptr(rdi, wordSize); |
1565 __ addptr(rdi, wordSize); |
1566 // Save these arguments |
1566 // Save these arguments |