< prev index next >
src/hotspot/cpu/aarch64/jniFastGetField_aarch64.cpp
Print this page
rev 50100 : 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
*** 89,122 ****
__ lsr(roffset, c_rarg2, 2); // offset
assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
speculative_load_pclist[count] = __ pc(); // Used by the segfault handler
switch (type) {
! case T_BOOLEAN: __ ldrb (result, Address(robj, roffset)); break;
! case T_BYTE: __ ldrsb (result, Address(robj, roffset)); break;
! case T_CHAR: __ ldrh (result, Address(robj, roffset)); break;
! case T_SHORT: __ ldrsh (result, Address(robj, roffset)); break;
! case T_FLOAT: __ ldrw (result, Address(robj, roffset)); break;
! case T_INT: __ ldrsw (result, Address(robj, roffset)); break;
case T_DOUBLE:
! case T_LONG: __ ldr (result, Address(robj, roffset)); break;
! default: ShouldNotReachHere();
}
- // counter_addr is address dependent on result.
- __ eor(rcounter_addr, rcounter_addr, result);
- __ eor(rcounter_addr, rcounter_addr, result);
__ ldrw(rscratch1, safepoint_counter_addr);
__ cmpw(rcounter, rscratch1);
__ br (Assembler::NE, slow);
-
- switch (type) {
- case T_FLOAT: __ fmovs(v0, result); break;
- case T_DOUBLE: __ fmovd(v0, result); break;
- default: __ mov(r0, result); break;
- }
__ ret(lr);
slowcase_entry_pclist[count++] = __ pc();
__ bind(slow);
address slow_case_addr;
--- 89,115 ----
__ lsr(roffset, c_rarg2, 2); // offset
assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
speculative_load_pclist[count] = __ pc(); // Used by the segfault handler
+ __ access_load_at(type, IN_HEAP, noreg /* tos: r0/v0 */, Address(robj, roffset), noreg, noreg);
+
+ // Ensure that field has finished loading before loading the safepoint_counter.
switch (type) {
! case T_FLOAT:
case T_DOUBLE:
! __ membar(MacroAssembler::LoadLoad);
! break;
! default:
! // counter_addr is address dependent on result.
! __ eor(rcounter_addr, rcounter_addr, r0);
! __ eor(rcounter_addr, rcounter_addr, r0);
}
__ ldrw(rscratch1, safepoint_counter_addr);
__ cmpw(rcounter, rscratch1);
__ br (Assembler::NE, slow);
__ ret(lr);
slowcase_entry_pclist[count++] = __ pc();
__ bind(slow);
address slow_case_addr;
< prev index next >