Skip to content

Commit 266636d

Browse files
Aleksei VoitylovDmitry Samersoff
Aleksei Voitylov
authored and
Dmitry Samersoff
committedOct 13, 2023
8315940: ARM32: Move field resolution information out of the cpCache
Reviewed-by: dsamersoff
1 parent e490cf9 commit 266636d

File tree

3 files changed

+205
-159
lines changed

3 files changed

+205
-159
lines changed
 

‎src/hotspot/cpu/arm/interp_masm_arm.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "oops/markWord.hpp"
3838
#include "oops/method.hpp"
3939
#include "oops/methodData.hpp"
40+
#include "oops/resolvedFieldEntry.hpp"
4041
#include "oops/resolvedIndyEntry.hpp"
4142
#include "prims/jvmtiExport.hpp"
4243
#include "prims/jvmtiThreadState.hpp"
@@ -312,6 +313,36 @@ void InterpreterMacroAssembler::load_resolved_indy_entry(Register cache, Registe
312313
add(cache, cache, index);
313314
}
314315

316+
void InterpreterMacroAssembler::load_field_entry(Register cache, Register index, int bcp_offset) {
317+
// Get index out of bytecode pointer
318+
assert_different_registers(cache, index);
319+
320+
get_index_at_bcp(index, bcp_offset, cache /*as tmp*/, sizeof(u2));
321+
322+
// Scale the index to be the entry index * sizeof(ResolvedFieldEntry)
323+
// sizeof(ResolvedFieldEntry) is 16 on Arm, so using shift
324+
if (is_power_of_2(sizeof(ResolvedFieldEntry))) {
325+
// load constant pool cache pointer
326+
ldr(cache, Address(FP, frame::interpreter_frame_cache_offset * wordSize));
327+
// Get address of field entries array
328+
ldr(cache, Address(cache, in_bytes(ConstantPoolCache::field_entries_offset())));
329+
330+
add(cache, cache, Array<ResolvedFieldEntry>::base_offset_in_bytes());
331+
add(cache, cache, AsmOperand(index, lsl, log2i_exact(sizeof(ResolvedFieldEntry))));
332+
}
333+
else {
334+
mov(cache, sizeof(ResolvedFieldEntry));
335+
mul(index, index, cache);
336+
// load constant pool cache pointer
337+
ldr(cache, Address(FP, frame::interpreter_frame_cache_offset * wordSize));
338+
339+
// Get address of field entries array
340+
ldr(cache, Address(cache, in_bytes(ConstantPoolCache::field_entries_offset())));
341+
add(cache, cache, Array<ResolvedFieldEntry>::base_offset_in_bytes());
342+
add(cache, cache, index);
343+
}
344+
}
345+
315346
// Generate a subtype check: branch to not_subtype if sub_klass is
316347
// not a subtype of super_klass.
317348
// Profiling code for the subtype check failure (profile_typecheck_failed)

‎src/hotspot/cpu/arm/interp_masm_arm.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
102102
void load_resolved_klass_at_offset(Register Rcpool, Register Rindex, Register Rklass);
103103

104104
void load_resolved_indy_entry(Register cache, Register index);
105+
void load_field_entry(Register cache, Register index, int bcp_offset = 1);
105106

106107
void pop_ptr(Register r);
107108
void pop_i(Register r = R0_tos);

0 commit comments

Comments
 (0)
Please sign in to comment.