< prev index next >
src/cpu/aarch64/vm/aarch64.ad
Print this page
rev 11237 : 8156839: aarch64: indexOf does not support CompactStrings
Summary: Add support for LL,UL and LU to indexOf intrinsic
Reviewed-by: aph
*** 3329,3339 ****
const bool Matcher::match_rule_supported(int opcode) {
switch (opcode) {
case Op_StrComp:
- case Op_StrIndexOf:
if (CompactStrings) return false;
break;
default:
break;
}
--- 3329,3338 ----
*** 14951,14996 ****
$tmp1$$Register);
%}
ins_pipe(pipe_class_memory);
%}
! instruct string_indexof(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
%{
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU);
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result" %}
ins_encode %{
__ string_indexof($str1$$Register, $str2$$Register,
$cnt1$$Register, $cnt2$$Register,
$tmp1$$Register, $tmp2$$Register,
$tmp3$$Register, $tmp4$$Register,
! -1, $result$$Register);
%}
ins_pipe(pipe_class_memory);
%}
! instruct string_indexof_con(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
iRegI tmp3, iRegI tmp4, rFlagsReg cr)
%{
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU);
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1,
TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result" %}
ins_encode %{
int icnt2 = (int)$int_cnt2$$constant;
__ string_indexof($str1$$Register, $str2$$Register,
$cnt1$$Register, zr,
$tmp1$$Register, $tmp2$$Register,
$tmp3$$Register, $tmp4$$Register,
! icnt2, $result$$Register);
%}
ins_pipe(pipe_class_memory);
%}
instruct string_equalsL(iRegP_R1 str1, iRegP_R3 str2, iRegI_R4 cnt,
--- 14950,15115 ----
$tmp1$$Register);
%}
ins_pipe(pipe_class_memory);
%}
! instruct string_indexofUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
%{
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU);
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result (UU)" %}
ins_encode %{
__ string_indexof($str1$$Register, $str2$$Register,
$cnt1$$Register, $cnt2$$Register,
$tmp1$$Register, $tmp2$$Register,
$tmp3$$Register, $tmp4$$Register,
! -1, $result$$Register, StrIntrinsicNode::UU);
%}
ins_pipe(pipe_class_memory);
%}
! instruct string_indexofLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
! iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
! %{
! predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
! match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
! effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
! TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result (LL)" %}
!
! ins_encode %{
! __ string_indexof($str1$$Register, $str2$$Register,
! $cnt1$$Register, $cnt2$$Register,
! $tmp1$$Register, $tmp2$$Register,
! $tmp3$$Register, $tmp4$$Register,
! -1, $result$$Register, StrIntrinsicNode::LL);
! %}
! ins_pipe(pipe_class_memory);
! %}
!
! instruct string_indexofUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
! iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
! %{
! predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
! match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
! effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
! TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result (UL)" %}
!
! ins_encode %{
! __ string_indexof($str1$$Register, $str2$$Register,
! $cnt1$$Register, $cnt2$$Register,
! $tmp1$$Register, $tmp2$$Register,
! $tmp3$$Register, $tmp4$$Register,
! -1, $result$$Register, StrIntrinsicNode::UL);
! %}
! ins_pipe(pipe_class_memory);
! %}
!
! instruct string_indexofLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
! iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
! %{
! predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LU);
! match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
! effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
! TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result (LU)" %}
!
! ins_encode %{
! __ string_indexof($str1$$Register, $str2$$Register,
! $cnt1$$Register, $cnt2$$Register,
! $tmp1$$Register, $tmp2$$Register,
! $tmp3$$Register, $tmp4$$Register,
! -1, $result$$Register, StrIntrinsicNode::LU);
! %}
! ins_pipe(pipe_class_memory);
! %}
!
! instruct string_indexof_conUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
iRegI tmp3, iRegI tmp4, rFlagsReg cr)
%{
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU);
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1,
TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result (UU)" %}
!
! ins_encode %{
! int icnt2 = (int)$int_cnt2$$constant;
! __ string_indexof($str1$$Register, $str2$$Register,
! $cnt1$$Register, zr,
! $tmp1$$Register, $tmp2$$Register,
! $tmp3$$Register, $tmp4$$Register,
! icnt2, $result$$Register, StrIntrinsicNode::UU);
! %}
! ins_pipe(pipe_class_memory);
! %}
!
! instruct string_indexof_conLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
! immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
! iRegI tmp3, iRegI tmp4, rFlagsReg cr)
! %{
! predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
! match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
! effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1,
! TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result (LL)" %}
!
! ins_encode %{
! int icnt2 = (int)$int_cnt2$$constant;
! __ string_indexof($str1$$Register, $str2$$Register,
! $cnt1$$Register, zr,
! $tmp1$$Register, $tmp2$$Register,
! $tmp3$$Register, $tmp4$$Register,
! icnt2, $result$$Register, StrIntrinsicNode::LL);
! %}
! ins_pipe(pipe_class_memory);
! %}
!
! instruct string_indexof_conUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
! immI_1 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
! iRegI tmp3, iRegI tmp4, rFlagsReg cr)
! %{
! predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
! match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
! effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1,
! TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result (UL)" %}
!
! ins_encode %{
! int icnt2 = (int)$int_cnt2$$constant;
! __ string_indexof($str1$$Register, $str2$$Register,
! $cnt1$$Register, zr,
! $tmp1$$Register, $tmp2$$Register,
! $tmp3$$Register, $tmp4$$Register,
! icnt2, $result$$Register, StrIntrinsicNode::UL);
! %}
! ins_pipe(pipe_class_memory);
! %}
!
! instruct string_indexof_conLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
! immI_1 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
! iRegI tmp3, iRegI tmp4, rFlagsReg cr)
! %{
! predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LU);
! match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
! effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1,
! TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
! format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result (LU)" %}
ins_encode %{
int icnt2 = (int)$int_cnt2$$constant;
__ string_indexof($str1$$Register, $str2$$Register,
$cnt1$$Register, zr,
$tmp1$$Register, $tmp2$$Register,
$tmp3$$Register, $tmp4$$Register,
! icnt2, $result$$Register, StrIntrinsicNode::LU);
%}
ins_pipe(pipe_class_memory);
%}
instruct string_equalsL(iRegP_R1 str1, iRegP_R3 str2, iRegI_R4 cnt,
< prev index next >