Skip to content

Commit 8027682

Browse files
Aleksei Voitylovpull[bot]
authored andcommitted
8321515: ARM32: Move method resolution information out of the cpCache properly
Reviewed-by: shade
1 parent 6112455 commit 8027682

File tree

3 files changed

+29
-19
lines changed

3 files changed

+29
-19
lines changed

src/hotspot/cpu/arm/interp_masm_arm.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,15 +303,19 @@ void InterpreterMacroAssembler::load_field_entry(Register cache, Register index,
303303
}
304304

305305
void InterpreterMacroAssembler::load_method_entry(Register cache, Register index, int bcp_offset) {
306+
assert_different_registers(cache, index);
307+
306308
// Get index out of bytecode pointer
307309
get_index_at_bcp(index, bcp_offset, cache /* as tmp */, sizeof(u2));
310+
311+
// sizeof(ResolvedMethodEntry) is not a power of 2 on Arm, so can't use shift
308312
mov(cache, sizeof(ResolvedMethodEntry));
309313
mul(index, index, cache); // Scale the index to be the entry index * sizeof(ResolvedMethodEntry)
310314

311315
// load constant pool cache pointer
312316
ldr(cache, Address(FP, frame::interpreter_frame_cache_offset * wordSize));
313317
// Get address of method entries array
314-
ldr(cache, Address(cache, ConstantPoolCache::method_entries_offset()));
318+
ldr(cache, Address(cache, in_bytes(ConstantPoolCache::method_entries_offset())));
315319
add(cache, cache, Array<ResolvedMethodEntry>::base_offset_in_bytes());
316320
add(cache, cache, index);
317321
}

src/hotspot/cpu/arm/templateInterpreterGenerator_arm.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,17 +370,16 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
370370
if (index_size == sizeof(u4)) {
371371
__ load_resolved_indy_entry(Rcache, Rindex);
372372
__ ldrh(Rcache, Address(Rcache, in_bytes(ResolvedIndyEntry::num_parameters_offset())));
373-
__ check_stack_top();
374-
__ add(Rstack_top, Rstack_top, AsmOperand(Rcache, lsl, Interpreter::logStackElementSize));
375373
} else {
376374
// Pop N words from the stack
377375
assert(index_size == sizeof(u2), "Can only be u2");
378376
__ load_method_entry(Rcache, Rindex);
379-
__ ldrh(Rcache, Address(Rcache, in_bytes(ResolvedIndyEntry::num_parameters_offset())));
380-
__ check_stack_top();
381-
__ add(Rstack_top, Rstack_top, AsmOperand(Rcache, lsl, Interpreter::logStackElementSize));
377+
__ ldrh(Rcache, Address(Rcache, in_bytes(ResolvedMethodEntry::num_parameters_offset())));
382378
}
383379

380+
__ check_stack_top();
381+
__ add(Rstack_top, Rstack_top, AsmOperand(Rcache, lsl, Interpreter::logStackElementSize));
382+
384383
__ convert_retval_to_tos(state);
385384

386385
__ check_and_handle_popframe();

src/hotspot/cpu/arm/templateTable_arm.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3666,15 +3666,15 @@ void TemplateTable::prepare_invoke(Register Rcache, Register recv) {
36663666
// load receiver if needed (after extra argument is pushed so parameter size is correct)
36673667
if (load_receiver) {
36683668
__ ldrh(recv, Address(Rcache, in_bytes(ResolvedMethodEntry::num_parameters_offset())));
3669-
Address recv_addr = __ receiver_argument_address(Rstack_top, Rtemp, recv);
3670-
__ ldr(recv, recv_addr);
3669+
__ add(recv, Rstack_top, AsmOperand(recv, lsl, Interpreter::logStackElementSize));
3670+
__ ldr(recv, Address(recv, -Interpreter::stackElementSize));
36713671
__ verify_oop(recv);
36723672
}
36733673

36743674
// load return address
36753675
{ const address table = (address) Interpreter::invoke_return_entry_table_for(code);
3676-
__ mov_slow(Rtemp, table);
3677-
__ ldr(LR, Address::indexed_ptr(Rtemp, ret_type));
3676+
__ mov_slow(LR, table);
3677+
__ ldr(LR, Address::indexed_ptr(LR, ret_type));
36783678
}
36793679
}
36803680

@@ -3744,10 +3744,13 @@ void TemplateTable::invokevirtual(int byte_no) {
37443744
void TemplateTable::invokespecial(int byte_no) {
37453745
transition(vtos, vtos);
37463746
assert(byte_no == f1_byte, "use this argument");
3747+
37473748
const Register Rrecv = R2_tmp;
3748-
load_resolved_method_entry_special_or_static(R2_tmp, // ResolvedMethodEntry*
3749+
const Register Rflags = R3_tmp;
3750+
3751+
load_resolved_method_entry_special_or_static(Rrecv, // ResolvedMethodEntry*
37493752
Rmethod, // Method*
3750-
R3_tmp); // Flags
3753+
Rflags); // Flags
37513754
prepare_invoke(Rrecv, Rrecv);
37523755
__ verify_oop(Rrecv);
37533756
__ null_check(Rrecv, Rtemp);
@@ -3760,12 +3763,16 @@ void TemplateTable::invokespecial(int byte_no) {
37603763
void TemplateTable::invokestatic(int byte_no) {
37613764
transition(vtos, vtos);
37623765
assert(byte_no == f1_byte, "use this argument");
3763-
load_resolved_method_entry_special_or_static(R2_tmp, // ResolvedMethodEntry*
3766+
3767+
const Register Rrecv = R2_tmp;
3768+
const Register Rflags = R3_tmp;
3769+
3770+
load_resolved_method_entry_special_or_static(Rrecv, // ResolvedMethodEntry*
37643771
Rmethod, // Method*
3765-
R3_tmp); // Flags
3766-
prepare_invoke(R2_tmp, R2_tmp);
3772+
Rflags); // Flags
3773+
prepare_invoke(Rrecv, Rrecv);
37673774
// do the call
3768-
__ profile_call(R2_tmp);
3775+
__ profile_call(Rrecv);
37693776
__ jump_from_interpreted(Rmethod);
37703777
}
37713778

@@ -3788,10 +3795,10 @@ void TemplateTable::invokeinterface(int byte_no) {
37883795
const Register Rflags = R3_tmp;
37893796
const Register Rklass = R2_tmp; // Note! Same register with Rrecv
37903797

3791-
load_resolved_method_entry_interface(R2_tmp, // ResolvedMethodEntry*
3792-
R1_tmp, // Klass*
3798+
load_resolved_method_entry_interface(Rrecv, // ResolvedMethodEntry*
3799+
Rinterf, // Klass*
37933800
Rmethod, // Method* or itable/vtable index
3794-
R3_tmp); // Flags
3801+
Rflags); // Flags
37953802
prepare_invoke(Rrecv, Rrecv);
37963803

37973804
// First check for Object case, then private interface method,

0 commit comments

Comments
 (0)