188 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, |
188 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, |
189 Register index, |
189 Register index, |
190 int bcp_offset) { |
190 int bcp_offset) { |
191 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); |
191 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); |
192 assert(cache != index, "must use different registers"); |
192 assert(cache != index, "must use different registers"); |
193 load_unsigned_word(index, Address(r13, bcp_offset)); |
193 load_unsigned_short(index, Address(r13, bcp_offset)); |
194 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); |
194 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); |
195 assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below"); |
195 assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below"); |
196 // convert from field index to ConstantPoolCacheEntry index |
196 // convert from field index to ConstantPoolCacheEntry index |
197 shll(index, 2); |
197 shll(index, 2); |
198 } |
198 } |
201 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, |
201 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, |
202 Register tmp, |
202 Register tmp, |
203 int bcp_offset) { |
203 int bcp_offset) { |
204 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); |
204 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); |
205 assert(cache != tmp, "must use different register"); |
205 assert(cache != tmp, "must use different register"); |
206 load_unsigned_word(tmp, Address(r13, bcp_offset)); |
206 load_unsigned_short(tmp, Address(r13, bcp_offset)); |
207 assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below"); |
207 assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below"); |
208 // convert from field index to ConstantPoolCacheEntry index |
208 // convert from field index to ConstantPoolCacheEntry index |
209 // and from word offset to byte offset |
209 // and from word offset to byte offset |
210 shll(tmp, 2 + LogBytesPerWord); |
210 shll(tmp, 2 + LogBytesPerWord); |
211 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); |
211 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); |
1061 test_method_data_pointer(c_rarg3, verify_continue); // If mdp is zero, continue |
1061 test_method_data_pointer(c_rarg3, verify_continue); // If mdp is zero, continue |
1062 get_method(rbx); |
1062 get_method(rbx); |
1063 |
1063 |
1064 // If the mdp is valid, it will point to a DataLayout header which is |
1064 // If the mdp is valid, it will point to a DataLayout header which is |
1065 // consistent with the bcp. The converse is highly probable also. |
1065 // consistent with the bcp. The converse is highly probable also. |
1066 load_unsigned_word(c_rarg2, |
1066 load_unsigned_short(c_rarg2, |
1067 Address(c_rarg3, in_bytes(DataLayout::bci_offset()))); |
1067 Address(c_rarg3, in_bytes(DataLayout::bci_offset()))); |
1068 addptr(c_rarg2, Address(rbx, methodOopDesc::const_offset())); |
1068 addptr(c_rarg2, Address(rbx, methodOopDesc::const_offset())); |
1069 lea(c_rarg2, Address(c_rarg2, constMethodOopDesc::codes_offset())); |
1069 lea(c_rarg2, Address(c_rarg2, constMethodOopDesc::codes_offset())); |
1070 cmpptr(c_rarg2, r13); |
1070 cmpptr(c_rarg2, r13); |
1071 jcc(Assembler::equal, verify_continue); |
1071 jcc(Assembler::equal, verify_continue); |
1072 // rbx: method |
1072 // rbx: method |