< prev index next >
src/hotspot/cpu/aarch64/jniFastGetField_aarch64.cpp
Print this page
rev 50376 : [mq]: JDK-8203172.patch
*** 89,121 ****
__ 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);
--- 89,126 ----
__ lsr(roffset, c_rarg2, 2); // offset
assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
speculative_load_pclist[count] = __ pc(); // Used by the segfault handler
+
+ // Ensure that field has finished loading before loading the safepoint_counter.
+ // We must not load into r0 yet. It's also c_rarg0 and would clobber the JNIEnv* pointer.
switch (type) {
! case T_FLOAT:
case T_DOUBLE:
! __ access_load_at(type, IN_HEAP, noreg /* tos: r0/v0 */, Address(robj, roffset), noreg, noreg);
! __ membar(MacroAssembler::LoadLoad);
! break;
! default:
! __ access_load_at(type, IN_HEAP, result, Address(robj, roffset), noreg, noreg);
// 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:
! case T_DOUBLE:
! // Result is already in v0. Nothing to do.
! break;
! default:
! // Move result over to r0.
! __ mov(r0, result);
}
__ ret(lr);
slowcase_entry_pclist[count++] = __ pc();
__ bind(slow);
< prev index next >