741 ldub(Lbcp, bcp_offset, tmp); 742 } else { 743 ShouldNotReachHere(); 744 } 745 } 746 747 748 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Register tmp, 749 int bcp_offset, size_t index_size) { 750 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); 751 assert_different_registers(cache, tmp); 752 assert_not_delayed(); 753 get_cache_index_at_bcp(cache, tmp, bcp_offset, index_size); 754 // convert from field index to ConstantPoolCacheEntry index and from 755 // word index to byte offset 756 sll(tmp, exact_log2(in_words(ConstantPoolCacheEntry::size()) * BytesPerWord), tmp); 757 add(LcpoolCache, tmp, cache); 758 } 759 760 761 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, Register tmp, 762 int bcp_offset, size_t index_size) { 763 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); 764 assert_different_registers(cache, tmp); 765 assert_not_delayed(); 766 if (index_size == sizeof(u2)) { 767 get_2_byte_integer_at_bcp(bcp_offset, cache, tmp, Unsigned); 768 } else { 769 ShouldNotReachHere(); // other sizes not supported here 770 } 771 // convert from field index to ConstantPoolCacheEntry index 772 // and from word index to byte offset 773 sll(tmp, exact_log2(in_words(ConstantPoolCacheEntry::size()) * BytesPerWord), tmp); 774 // skip past the header 775 add(tmp, in_bytes(constantPoolCacheOopDesc::base_offset()), tmp); 776 // construct pointer to cache entry 777 add(LcpoolCache, tmp, cache); 778 } 779 780 | 741 ldub(Lbcp, bcp_offset, tmp); 742 } else { 743 ShouldNotReachHere(); 744 } 745 } 746 747 748 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Register tmp, 749 int bcp_offset, size_t index_size) { 750 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); 751 assert_different_registers(cache, tmp); 752 assert_not_delayed(); 753 get_cache_index_at_bcp(cache, tmp, bcp_offset, index_size); 754 // convert from field index to ConstantPoolCacheEntry index and from 755 // word index to byte offset 756 sll(tmp, exact_log2(in_words(ConstantPoolCacheEntry::size()) * BytesPerWord), tmp); 757 add(LcpoolCache, tmp, cache); 758 } 759 760 761 void InterpreterMacroAssembler::get_cache_and_index_and_bytecode_at_bcp(Register cache, 762 Register temp, 763 Register bytecode, 764 int byte_no, 765 int bcp_offset, 766 size_t index_size) { 767 get_cache_and_index_at_bcp(cache, temp, bcp_offset, index_size); 768 ld_ptr(cache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::indices_offset(), bytecode); 769 const int shift_count = (1 + byte_no) * BitsPerByte; 770 srl( bytecode, shift_count, bytecode); 771 and3(bytecode, 0xFF, bytecode); 772 } 773 774 775 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, Register tmp, 776 int bcp_offset, size_t index_size) { 777 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); 778 assert_different_registers(cache, tmp); 779 assert_not_delayed(); 780 if (index_size == sizeof(u2)) { 781 get_2_byte_integer_at_bcp(bcp_offset, cache, tmp, Unsigned); 782 } else { 783 ShouldNotReachHere(); // other sizes not supported here 784 } 785 // convert from field index to ConstantPoolCacheEntry index 786 // and from word index to byte offset 787 sll(tmp, exact_log2(in_words(ConstantPoolCacheEntry::size()) * BytesPerWord), tmp); 788 // skip past the header 789 add(tmp, in_bytes(constantPoolCacheOopDesc::base_offset()), tmp); 790 // construct pointer to cache entry 791 add(LcpoolCache, tmp, cache); 792 } 793 794 |