< prev index next >

src/cpu/aarch64/vm/aarch64.ad

Print this page
rev 11237 : 8156943: aarch64: string compare does not support CompactStrings
Summary: Implement LL encoding for StrComp intrinsic
Reviewed-by: aph

*** 3328,3338 **** //============================================================================= const bool Matcher::match_rule_supported(int opcode) { switch (opcode) { - case Op_StrComp: case Op_StrIndexOf: if (CompactStrings) return false; break; default: break; --- 3328,3337 ----
*** 14946,14956 **** // 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); %} ins_pipe(pipe_class_memory); %} instruct string_indexof(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2, --- 14945,14971 ---- // 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, StrIntrinsicNode::UU); ! %} ! ins_pipe(pipe_class_memory); ! %} ! ! instruct string_compareL(iRegP_R1 str1, iRegI_R2 cnt1, iRegP_R3 str2, iRegI_R4 cnt2, ! iRegI_R0 result, iRegP_R10 tmp1, rFlagsReg cr) ! %{ ! predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); ! match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); ! effect(KILL tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); ! ! format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result # KILL $tmp1" %} ! ins_encode %{ ! __ string_compare($str1$$Register, $str2$$Register, ! $cnt1$$Register, $cnt2$$Register, $result$$Register, ! $tmp1$$Register, StrIntrinsicNode::LL); %} ins_pipe(pipe_class_memory); %} instruct string_indexof(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
< prev index next >