Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/templateInterpreter_x86_32.cpp @ 622:56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
Summary: minor assembler enhancements preparing for method handles
Reviewed-by: kvn
author | jrose |
---|---|
date | Wed, 04 Mar 2009 09:58:39 -0800 |
parents | dc3ad84615cf |
children | 7bb995fbd3c0 |
comparison
equal
deleted
inserted
replaced
621:19f25e603e7b | 622:56aae7be60d4 |
---|---|
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 |