< prev index next >
src/hotspot/cpu/arm/templateInterpreterGenerator_arm.cpp
Print this page
rev 54026 : 8213845: ARM32: Interpreter doesn't call result handler after native calls
Summary: Fix mapping of native jboolean result to 0..1 on ARM32
Reviewed-by: aph
Contributed-by: christoph.goettschkes@microdoc.com
@@ -349,20 +349,16 @@
return entry;
}
address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) {
-#ifdef AARCH64
address entry = __ pc();
switch (type) {
- case T_BOOLEAN:
- __ tst(R0, 0xff);
- __ cset(R0, ne);
- break;
- case T_CHAR : __ zero_extend(R0, R0, 16); break;
- case T_BYTE : __ sign_extend(R0, R0, 8); break;
- case T_SHORT : __ sign_extend(R0, R0, 16); break;
+ case T_BOOLEAN: __ c2bool(R0); break;
+ case T_CHAR : AARCH64_ONLY(__ zero_extend(R0, R0, 16);) break;
+ case T_BYTE : AARCH64_ONLY(__ sign_extend(R0, R0, 8);) break;
+ case T_SHORT : AARCH64_ONLY(__ sign_extend(R0, R0, 16);) break;
case T_INT : // fall through
case T_LONG : // fall through
case T_VOID : // fall through
case T_FLOAT : // fall through
case T_DOUBLE : /* nothing to do */ break;
@@ -370,23 +366,14 @@
// retrieve result from frame
__ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize));
// and verify it
__ verify_oop(R0);
break;
- default : ShouldNotReachHere();
+ default : __ should_not_reach_here(); break;
}
__ ret();
return entry;
-#else
- // Result handlers are not used on 32-bit ARM
- // since the returned value is already in appropriate format.
- __ should_not_reach_here(); // to avoid empty code block
-
- // The result handler non-zero indicates an object is returned and this is
- // used in the native entry code.
- return type == T_OBJECT ? (address)(-1) : NULL;
-#endif // AARCH64
}
address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) {
address entry = __ pc();
__ push(state);
@@ -1214,18 +1201,13 @@
}
// Unbox oop result, e.g. JNIHandles::resolve result if it's an oop.
{
Label Lnot_oop;
-#ifdef AARCH64
__ mov_slow(Rtemp, AbstractInterpreter::result_handler(T_OBJECT));
__ cmp(Rresult_handler, Rtemp);
__ b(Lnot_oop, ne);
-#else // !AARCH64
- // For ARM32, Rresult_handler is -1 for oop result, 0 otherwise.
- __ cbz(Rresult_handler, Lnot_oop);
-#endif // !AARCH64
Register value = AARCH64_ONLY(Rsaved_result) NOT_AARCH64(Rsaved_result_lo);
__ resolve_jobject(value, // value
Rtemp, // tmp1
R1_tmp); // tmp2
// Store resolved result in frame for GC visibility.
@@ -1294,29 +1276,18 @@
__ mov(R0, Rsaved_result);
__ fmov_d(D0, Dsaved_result);
__ blr(Rresult_handler);
#else
- __ cmp(Rresult_handler, 0);
- __ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize), ne);
- __ mov(R0, Rsaved_result_lo, eq);
+ __ mov(R0, Rsaved_result_lo);
__ mov(R1, Rsaved_result_hi);
#ifdef __ABI_HARD__
// reload native FP result
__ fcpyd(D0, D8);
#endif // __ABI_HARD__
-
-#ifdef ASSERT
- if (VerifyOops) {
- Label L;
- __ cmp(Rresult_handler, 0);
- __ b(L, eq);
- __ verify_oop(R0);
- __ bind(L);
- }
-#endif // ASSERT
+ __ blx(Rresult_handler);
#endif // AARCH64
// Restore FP/LR, sender_sp and return
#ifdef AARCH64
__ ldr(Rtemp, Address(FP, frame::interpreter_frame_sender_sp_offset * wordSize));
< prev index next >