# HG changeset patch # User aph # Date 1447933638 0 # Thu Nov 19 11:47:18 2015 +0000 # Node ID 892360651afbff36ce343dd85dc63ebc0d7e6dcf # Parent 6100ab176973758e7a19cab7feb9319d67f0650a 8143219: AArch64 broken by 8141132: JEP 254: Compact Strings Reviewed-by: kvn diff --git a/src/cpu/aarch64/vm/aarch64.ad b/src/cpu/aarch64/vm/aarch64.ad --- a/src/cpu/aarch64/vm/aarch64.ad +++ b/src/cpu/aarch64/vm/aarch64.ad @@ -4306,7 +4306,6 @@ int disp = $mem$$disp; if (index == -1) { __ prfm(Address(base, disp), PSTL1KEEP); - __ nop(); } else { Register index_reg = as_Register(index); if (disp == 0) { @@ -14167,6 +14166,9 @@ format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result # KILL $tmp1" %} ins_encode %{ + // Count is in 8-bit bytes; non-Compact chars are 16 bits. + __ asrw($cnt1$$Register, $cnt1$$Register, 1); + __ asrw($cnt2$$Register, $cnt2$$Register, 1); __ string_compare($str1$$Register, $str2$$Register, $cnt1$$Register, $cnt2$$Register, $result$$Register, $tmp1$$Register); @@ -14223,6 +14225,8 @@ format %{ "String Equals $str1,$str2,$cnt -> $result // KILL $tmp" %} ins_encode %{ + // Count is in 8-bit bytes; non-Compact chars are 16 bits. + __ asrw($cnt$$Register, $cnt$$Register, 1); __ string_equals($str1$$Register, $str2$$Register, $cnt$$Register, $result$$Register, $tmp$$Register); diff --git a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp --- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp +++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp @@ -4033,13 +4033,16 @@ Register cnt2_neg = cnt2; Register result_tmp = tmp4; - // Note, inline_string_indexOf() generates checks: - // if (substr.count > string.count) return -1; - // if (substr.count == 0) return 0; - // We have two strings, a source string in str2, cnt2 and a pattern string // in str1, cnt1. Find the 1st occurence of pattern in source or return -1. + // if (substr.count > string.count) return -1; + cmp(cnt1, cnt2); + br(Assembler::GT, NOMATCH); + + // Note, inline_string_indexOf() generates checks: + // if (substr.count == 0) return 0; + // For larger pattern and source we use a simplified Boyer Moore algorithm. // With a small pattern and source we use linear scan.