692 |
692 |
693 Label xreturn_path; |
693 Label xreturn_path; |
694 // Need to differentiate between igetfield, agetfield, bgetfield etc. |
694 // Need to differentiate between igetfield, agetfield, bgetfield etc. |
695 // because they are different sizes. |
695 // because they are different sizes. |
696 // Get the type from the constant pool cache |
696 // Get the type from the constant pool cache |
697 __ srl(G1_scratch, ConstantPoolCacheEntry::tosBits, G1_scratch); |
697 __ srl(G1_scratch, ConstantPoolCacheEntry::tos_state_shift, G1_scratch); |
698 // Make sure we don't need to mask G1_scratch for tosBits after the above shift |
698 // Make sure we don't need to mask G1_scratch after the above shift |
699 ConstantPoolCacheEntry::verify_tosBits(); |
699 ConstantPoolCacheEntry::verify_tos_state_shift(); |
700 __ cmp(G1_scratch, atos ); |
700 __ cmp(G1_scratch, atos ); |
701 __ br(Assembler::equal, true, Assembler::pt, xreturn_path); |
701 __ br(Assembler::equal, true, Assembler::pt, xreturn_path); |
702 __ delayed()->ld_ptr(Otos_i, G3_scratch, Otos_i); |
702 __ delayed()->ld_ptr(Otos_i, G3_scratch, Otos_i); |
703 __ cmp(G1_scratch, itos); |
703 __ cmp(G1_scratch, itos); |
704 __ br(Assembler::equal, true, Assembler::pt, xreturn_path); |
704 __ br(Assembler::equal, true, Assembler::pt, xreturn_path); |
1660 locals = Lesp_ptr + parm_words; |
1660 locals = Lesp_ptr + parm_words; |
1661 int delta = local_words - parm_words; |
1661 int delta = local_words - parm_words; |
1662 int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0; |
1662 int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0; |
1663 *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS; |
1663 *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS; |
1664 } else { |
1664 } else { |
1665 assert(caller->is_compiled_frame() || caller->is_entry_frame() || caller->is_ricochet_frame(), "only possible cases"); |
1665 assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases"); |
1666 // Don't have Lesp available; lay out locals block in the caller |
1666 // Don't have Lesp available; lay out locals block in the caller |
1667 // adjacent to the register window save area. |
1667 // adjacent to the register window save area. |
1668 // |
1668 // |
1669 // Compiled frames do not allocate a varargs area which is why this if |
1669 // Compiled frames do not allocate a varargs area which is why this if |
1670 // statement is needed. |
1670 // statement is needed. |