< 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 >