1622 __ ldrh(chr2_reg, Address(str2_reg, limit_reg));
1623 __ subs(chr1_reg, chr1_reg, chr2_reg);
1624 if (result_reg != chr1_reg) {
1625 __ mov(result_reg, chr1_reg, ne);
1626 }
1627 __ b(Ldone, ne);
1628
1629 __ adds(limit_reg, limit_reg, sizeof(jchar));
1630 __ b(Lloop, ne);
1631
1632 // If strings are equal up to min length, return the length difference.
1633 if (result_reg != tmp2_reg) {
1634 __ mov(result_reg, tmp2_reg);
1635 }
1636
1637 // Otherwise, return the difference between the first mismatched chars.
1638 __ bind(Ldone);
1639 %}
1640
1641 enc_class enc_String_Equals(R0RegP str1, R1RegP str2, R2RegI cnt, iRegI result, iRegI tmp1, iRegI tmp2) %{
1642 Label Lword_loop, Lpost_word, Lchar, Lchar_loop, Ldone, Lequal;
1643 MacroAssembler _masm(&cbuf);
1644
1645 Register str1_reg = $str1$$Register;
1646 Register str2_reg = $str2$$Register;
1647 Register cnt_reg = $cnt$$Register; // int
1648 Register tmp1_reg = $tmp1$$Register;
1649 Register tmp2_reg = $tmp2$$Register;
1650 Register result_reg = $result$$Register;
1651
1652 assert_different_registers(str1_reg, str2_reg, cnt_reg, tmp1_reg, tmp2_reg, result_reg);
1653
1654 __ cmp(str1_reg, str2_reg); //same char[] ?
1655 __ b(Lequal, eq);
1656
1657 __ cbz_32(cnt_reg, Lequal); // count == 0
1658
1659 //rename registers
1660 Register limit_reg = cnt_reg;
1661 Register chr1_reg = tmp1_reg;
1662 Register chr2_reg = tmp2_reg;
1684 __ add(str1_reg, limit_reg, str1_reg);
1685 __ add(str2_reg, limit_reg, str2_reg);
1686 __ neg(limit_reg, limit_reg); //negate count
1687
1688 // Lchar_loop
1689 __ bind(Lchar_loop);
1690 __ ldrh(chr1_reg, Address(str1_reg, limit_reg));
1691 __ ldrh(chr2_reg, Address(str2_reg, limit_reg));
1692 __ cmp(chr1_reg, chr2_reg);
1693 __ b(Ldone, ne);
1694 __ adds(limit_reg, limit_reg, sizeof(jchar));
1695 __ b(Lchar_loop, ne);
1696
1697 __ bind(Lequal);
1698 __ mov(result_reg, 1); //equal
1699
1700 __ bind(Ldone);
1701 %}
1702
1703 enc_class enc_Array_Equals(R0RegP ary1, R1RegP ary2, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI result) %{
1704 Label Lvector, Ldone, Lloop, Lequal;
1705 MacroAssembler _masm(&cbuf);
1706
1707 Register ary1_reg = $ary1$$Register;
1708 Register ary2_reg = $ary2$$Register;
1709 Register tmp1_reg = $tmp1$$Register;
1710 Register tmp2_reg = $tmp2$$Register;
1711 Register tmp3_reg = $tmp3$$Register;
1712 Register result_reg = $result$$Register;
1713
1714 assert_different_registers(ary1_reg, ary2_reg, tmp1_reg, tmp2_reg, tmp3_reg, result_reg);
1715
1716 int length_offset = arrayOopDesc::length_offset_in_bytes();
1717 int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR);
1718
1719 // return true if the same array
1720 #ifdef AARCH64
1721 __ cmp(ary1_reg, ary2_reg);
1722 __ b(Lequal, eq);
1723
1724 __ mov(result_reg, 0);
|
1622 __ ldrh(chr2_reg, Address(str2_reg, limit_reg));
1623 __ subs(chr1_reg, chr1_reg, chr2_reg);
1624 if (result_reg != chr1_reg) {
1625 __ mov(result_reg, chr1_reg, ne);
1626 }
1627 __ b(Ldone, ne);
1628
1629 __ adds(limit_reg, limit_reg, sizeof(jchar));
1630 __ b(Lloop, ne);
1631
1632 // If strings are equal up to min length, return the length difference.
1633 if (result_reg != tmp2_reg) {
1634 __ mov(result_reg, tmp2_reg);
1635 }
1636
1637 // Otherwise, return the difference between the first mismatched chars.
1638 __ bind(Ldone);
1639 %}
1640
1641 enc_class enc_String_Equals(R0RegP str1, R1RegP str2, R2RegI cnt, iRegI result, iRegI tmp1, iRegI tmp2) %{
1642 Label Lchar, Lchar_loop, Ldone, Lequal;
1643 MacroAssembler _masm(&cbuf);
1644
1645 Register str1_reg = $str1$$Register;
1646 Register str2_reg = $str2$$Register;
1647 Register cnt_reg = $cnt$$Register; // int
1648 Register tmp1_reg = $tmp1$$Register;
1649 Register tmp2_reg = $tmp2$$Register;
1650 Register result_reg = $result$$Register;
1651
1652 assert_different_registers(str1_reg, str2_reg, cnt_reg, tmp1_reg, tmp2_reg, result_reg);
1653
1654 __ cmp(str1_reg, str2_reg); //same char[] ?
1655 __ b(Lequal, eq);
1656
1657 __ cbz_32(cnt_reg, Lequal); // count == 0
1658
1659 //rename registers
1660 Register limit_reg = cnt_reg;
1661 Register chr1_reg = tmp1_reg;
1662 Register chr2_reg = tmp2_reg;
1684 __ add(str1_reg, limit_reg, str1_reg);
1685 __ add(str2_reg, limit_reg, str2_reg);
1686 __ neg(limit_reg, limit_reg); //negate count
1687
1688 // Lchar_loop
1689 __ bind(Lchar_loop);
1690 __ ldrh(chr1_reg, Address(str1_reg, limit_reg));
1691 __ ldrh(chr2_reg, Address(str2_reg, limit_reg));
1692 __ cmp(chr1_reg, chr2_reg);
1693 __ b(Ldone, ne);
1694 __ adds(limit_reg, limit_reg, sizeof(jchar));
1695 __ b(Lchar_loop, ne);
1696
1697 __ bind(Lequal);
1698 __ mov(result_reg, 1); //equal
1699
1700 __ bind(Ldone);
1701 %}
1702
1703 enc_class enc_Array_Equals(R0RegP ary1, R1RegP ary2, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI result) %{
1704 Label Ldone, Lloop, Lequal;
1705 MacroAssembler _masm(&cbuf);
1706
1707 Register ary1_reg = $ary1$$Register;
1708 Register ary2_reg = $ary2$$Register;
1709 Register tmp1_reg = $tmp1$$Register;
1710 Register tmp2_reg = $tmp2$$Register;
1711 Register tmp3_reg = $tmp3$$Register;
1712 Register result_reg = $result$$Register;
1713
1714 assert_different_registers(ary1_reg, ary2_reg, tmp1_reg, tmp2_reg, tmp3_reg, result_reg);
1715
1716 int length_offset = arrayOopDesc::length_offset_in_bytes();
1717 int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR);
1718
1719 // return true if the same array
1720 #ifdef AARCH64
1721 __ cmp(ary1_reg, ary2_reg);
1722 __ b(Lequal, eq);
1723
1724 __ mov(result_reg, 0);
|