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