Skip to content

Commit ffa35d8

Browse files
Matias Saavedra SilvazifeihanRealFYangTheRealMDoerroffamitkumar
committed
8301997: Move method resolution information out of the cpCache
Co-authored-by: Gui Cao <[email protected]> Co-authored-by: Fei Yang <[email protected]> Co-authored-by: Martin Doerr <[email protected]> Co-authored-by: Amit Kumar <[email protected]> Reviewed-by: coleenp, adinn, fparain
1 parent 891d8cf commit ffa35d8

File tree

79 files changed

+2034
-2745
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+2034
-2745
lines changed

src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp

Lines changed: 13 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "oops/methodData.hpp"
3939
#include "oops/resolvedFieldEntry.hpp"
4040
#include "oops/resolvedIndyEntry.hpp"
41+
#include "oops/resolvedMethodEntry.hpp"
4142
#include "prims/jvmtiExport.hpp"
4243
#include "prims/jvmtiThreadState.hpp"
4344
#include "runtime/basicLock.hpp"
@@ -201,64 +202,6 @@ void InterpreterMacroAssembler::get_cache_index_at_bcp(Register index,
201202
}
202203
}
203204

204-
// Return
205-
// Rindex: index into constant pool
206-
// Rcache: address of cache entry - ConstantPoolCache::base_offset()
207-
//
208-
// A caller must add ConstantPoolCache::base_offset() to Rcache to get
209-
// the true address of the cache entry.
210-
//
211-
void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache,
212-
Register index,
213-
int bcp_offset,
214-
size_t index_size) {
215-
assert_different_registers(cache, index);
216-
assert_different_registers(cache, rcpool);
217-
get_cache_index_at_bcp(index, bcp_offset, index_size);
218-
assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below");
219-
// convert from field index to ConstantPoolCacheEntry
220-
// aarch64 already has the cache in rcpool so there is no need to
221-
// install it in cache. instead we pre-add the indexed offset to
222-
// rcpool and return it in cache. All clients of this method need to
223-
// be modified accordingly.
224-
add(cache, rcpool, index, Assembler::LSL, 5);
225-
}
226-
227-
228-
void InterpreterMacroAssembler::get_cache_and_index_and_bytecode_at_bcp(Register cache,
229-
Register index,
230-
Register bytecode,
231-
int byte_no,
232-
int bcp_offset,
233-
size_t index_size) {
234-
get_cache_and_index_at_bcp(cache, index, bcp_offset, index_size);
235-
// We use a 32-bit load here since the layout of 64-bit words on
236-
// little-endian machines allow us that.
237-
// n.b. unlike x86 cache already includes the index offset
238-
lea(bytecode, Address(cache,
239-
ConstantPoolCache::base_offset()
240-
+ ConstantPoolCacheEntry::indices_offset()));
241-
ldarw(bytecode, bytecode);
242-
const int shift_count = (1 + byte_no) * BitsPerByte;
243-
ubfx(bytecode, bytecode, shift_count, BitsPerByte);
244-
}
245-
246-
void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
247-
Register tmp,
248-
int bcp_offset,
249-
size_t index_size) {
250-
assert(cache != tmp, "must use different register");
251-
get_cache_index_at_bcp(tmp, bcp_offset, index_size);
252-
assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below");
253-
// convert from field index to ConstantPoolCacheEntry index
254-
// and from word offset to byte offset
255-
assert(exact_log2(in_bytes(ConstantPoolCacheEntry::size_in_bytes())) == 2 + LogBytesPerWord, "else change next line");
256-
ldr(cache, Address(rfp, frame::interpreter_frame_cache_offset * wordSize));
257-
// skip past the header
258-
add(cache, cache, in_bytes(ConstantPoolCache::base_offset()));
259-
add(cache, cache, tmp, Assembler::LSL, 2 + LogBytesPerWord); // construct pointer to cache entry
260-
}
261-
262205
void InterpreterMacroAssembler::get_method_counters(Register method,
263206
Register mcs, Label& skip) {
264207
Label has_counters;
@@ -295,18 +238,6 @@ void InterpreterMacroAssembler::load_resolved_klass_at_offset(
295238
ldr(klass, Address(klass, Array<Klass*>::base_offset_in_bytes()));
296239
}
297240

298-
void InterpreterMacroAssembler::load_resolved_method_at_index(int byte_no,
299-
Register method,
300-
Register cache) {
301-
const int method_offset = in_bytes(
302-
ConstantPoolCache::base_offset() +
303-
((byte_no == TemplateTable::f2_byte)
304-
? ConstantPoolCacheEntry::f2_offset()
305-
: ConstantPoolCacheEntry::f1_offset()));
306-
307-
ldr(method, Address(cache, method_offset)); // get f1 Method*
308-
}
309-
310241
// Generate a subtype check: branch to ok_is_subtype if sub_klass is a
311242
// subtype of super_klass.
312243
//
@@ -1866,3 +1797,15 @@ void InterpreterMacroAssembler::load_field_entry(Register cache, Register index,
18661797
add(cache, cache, Array<ResolvedFieldEntry>::base_offset_in_bytes());
18671798
lea(cache, Address(cache, index));
18681799
}
1800+
1801+
void InterpreterMacroAssembler::load_method_entry(Register cache, Register index, int bcp_offset) {
1802+
// Get index out of bytecode pointer
1803+
get_cache_index_at_bcp(index, bcp_offset, sizeof(u2));
1804+
mov(cache, sizeof(ResolvedMethodEntry));
1805+
mul(index, index, cache); // Scale the index to be the entry index * sizeof(ResolvedMethodEntry)
1806+
1807+
// Get address of field entries array
1808+
ldr(cache, Address(rcpool, ConstantPoolCache::method_entries_offset()));
1809+
add(cache, cache, Array<ResolvedMethodEntry>::base_offset_in_bytes());
1810+
lea(cache, Address(cache, index));
1811+
}

src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
140140
}
141141

142142
void get_unsigned_2_byte_index_at_bcp(Register reg, int bcp_offset);
143-
void get_cache_and_index_at_bcp(Register cache, Register index, int bcp_offset, size_t index_size = sizeof(u2));
144-
void get_cache_and_index_and_bytecode_at_bcp(Register cache, Register index, Register bytecode, int byte_no, int bcp_offset, size_t index_size = sizeof(u2));
145-
void get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset, size_t index_size = sizeof(u2));
146143
void get_cache_index_at_bcp(Register index, int bcp_offset, size_t index_size = sizeof(u2));
147144
void get_method_counters(Register method, Register mcs, Label& skip);
148145

@@ -152,8 +149,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
152149
// load cpool->resolved_klass_at(index);
153150
void load_resolved_klass_at_offset(Register cpool, Register index, Register klass, Register temp);
154151

155-
void load_resolved_method_at_index(int byte_no, Register method, Register cache);
156-
157152
void pop_ptr(Register r = r0);
158153
void pop_i(Register r = r0);
159154
void pop_l(Register r = r0);
@@ -324,6 +319,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
324319

325320
void load_resolved_indy_entry(Register cache, Register index);
326321
void load_field_entry(Register cache, Register index, int bcp_offset = 1);
322+
void load_method_entry(Register cache, Register index, int bcp_offset = 1);
327323
};
328324

329325
#endif // CPU_AARCH64_INTERP_MASM_AARCH64_HPP

src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "oops/methodData.hpp"
4343
#include "oops/oop.inline.hpp"
4444
#include "oops/resolvedIndyEntry.hpp"
45+
#include "oops/resolvedMethodEntry.hpp"
4546
#include "prims/jvmtiExport.hpp"
4647
#include "prims/jvmtiThreadState.hpp"
4748
#include "runtime/arguments.hpp"
@@ -493,10 +494,9 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
493494
__ add(esp, esp, cache, Assembler::LSL, 3);
494495
} else {
495496
// Pop N words from the stack
496-
__ get_cache_and_index_at_bcp(cache, index, 1, index_size);
497-
__ ldr(cache, Address(cache, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()));
498-
__ andr(cache, cache, ConstantPoolCacheEntry::parameter_size_mask);
499-
497+
assert(index_size == sizeof(u2), "Can only be u2");
498+
__ load_method_entry(cache, index);
499+
__ load_unsigned_short(cache, Address(cache, in_bytes(ResolvedMethodEntry::num_parameters_offset())));
500500
__ add(esp, esp, cache, Assembler::LSL, 3);
501501
}
502502

0 commit comments

Comments
 (0)