changeset 6680:afddad5b59a9

8211064, PR3669: [AArch64] Interpreter and c1 don't correctly handle jboolean results in native calls Contributed-by: apetushkov Reviewed-by: aph
author aph
date Mon, 18 Feb 2019 02:22:41 +0000
parents d02c48af060b
children f796e9ab0bfd
files src/cpu/aarch64/vm/assembler_aarch64.cpp src/cpu/aarch64/vm/assembler_aarch64.hpp src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp
diffstat 4 files changed, 15 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/aarch64/vm/assembler_aarch64.cpp	Mon Jan 07 06:00:06 2019 +0000
+++ b/src/cpu/aarch64/vm/assembler_aarch64.cpp	Mon Feb 18 02:22:41 2019 +0000
@@ -2259,6 +2259,15 @@
 #endif
 }
 
+void MacroAssembler::c2bool(Register x) {
+  // implements x == 0 ? 0 : 1
+  // note: must only look at least-significant byte of x
+  //       since C-style booleans are stored in one byte
+  //       only! (was bug)
+  tst(x, 0xff);
+  cset(x, Assembler::NE);
+}
+
 void MacroAssembler::ic_call(address entry) {
   RelocationHolder rh = virtual_call_Relocation::spec(pc());
   // address const_ptr = long_constant((jlong)Universe::non_oop_word());
--- a/src/cpu/aarch64/vm/assembler_aarch64.hpp	Mon Jan 07 06:00:06 2019 +0000
+++ b/src/cpu/aarch64/vm/assembler_aarch64.hpp	Mon Feb 18 02:22:41 2019 +0000
@@ -3008,6 +3008,9 @@
   void store_check_part_1(Register obj);
   void store_check_part_2(Register obj);
 
+  // C 'boolean' to Java boolean: x == 0 ? 0 : 1
+  void c2bool(Register x);
+
   // oop manipulations
   void load_klass(Register dst, Register src);
   void store_klass(Register dst, Register src);
--- a/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp	Mon Jan 07 06:00:06 2019 +0000
+++ b/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp	Mon Feb 18 02:22:41 2019 +0000
@@ -1926,7 +1926,7 @@
 
   // Unpack native results.
   switch (ret_type) {
-  case T_BOOLEAN: __ ubfx(r0, r0, 0, 8);            break;
+  case T_BOOLEAN: __ c2bool(r0);                     break;
   case T_CHAR   : __ ubfx(r0, r0, 0, 16);            break;
   case T_BYTE   : __ sbfx(r0, r0, 0, 8);            break;
   case T_SHORT  : __ sbfx(r0, r0, 0, 16);            break;
--- a/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp	Mon Jan 07 06:00:06 2019 +0000
+++ b/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp	Mon Feb 18 02:22:41 2019 +0000
@@ -298,8 +298,8 @@
         BasicType type) {
     address entry = __ pc();
   switch (type) {
-  case T_BOOLEAN: __ uxtb(r0, r0);        break;
-  case T_CHAR   : __ uxth(r0, r0);       break;
+  case T_BOOLEAN: __ c2bool(r0);          break;
+  case T_CHAR   : __ uxth(r0, r0);        break;
   case T_BYTE   : __ sxtb(r0, r0);        break;
   case T_SHORT  : __ sxth(r0, r0);        break;
   case T_INT    : __ uxtw(r0, r0);        break;  // FIXME: We almost certainly don't need this