Mercurial > hg > release > icedtea7-forest-2.6 > hotspot
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