4843 BIND(NOMATCH); 4844 mov(result, -1); 4845 b(DONE); 4846 BIND(MATCH); 4847 add(result, result_tmp, cnt2_neg, ASR, str2_chr_shift); 4848 BIND(DONE); 4849 } 4850 4851 typedef void (MacroAssembler::* chr_insn)(Register Rt, const Address &adr); 4852 typedef void (MacroAssembler::* uxt_insn)(Register Rd, Register Rn); 4853 4854 void MacroAssembler::string_indexof_char(Register str1, Register cnt1, 4855 Register ch, Register result, 4856 Register tmp1, Register tmp2, Register tmp3) 4857 { 4858 Label CH1_LOOP, HAS_ZERO, DO1_SHORT, DO1_LOOP, MATCH, NOMATCH, DONE; 4859 Register cnt1_neg = cnt1; 4860 Register ch1 = rscratch1; 4861 Register result_tmp = rscratch2; 4862 4863 cmp(cnt1, (u1)4); 4864 br(LT, DO1_SHORT); 4865 4866 orr(ch, ch, ch, LSL, 16); 4867 orr(ch, ch, ch, LSL, 32); 4868 4869 sub(cnt1, cnt1, 4); 4870 mov(result_tmp, cnt1); 4871 lea(str1, Address(str1, cnt1, Address::uxtw(1))); 4872 sub(cnt1_neg, zr, cnt1, LSL, 1); 4873 4874 mov(tmp3, 0x0001000100010001); 4875 4876 BIND(CH1_LOOP); 4877 ldr(ch1, Address(str1, cnt1_neg)); 4878 eor(ch1, ch, ch1); 4879 sub(tmp1, ch1, tmp3); 4880 orr(tmp2, ch1, 0x7fff7fff7fff7fff); 4881 bics(tmp1, tmp1, tmp2); 4882 br(NE, HAS_ZERO); | 4843 BIND(NOMATCH); 4844 mov(result, -1); 4845 b(DONE); 4846 BIND(MATCH); 4847 add(result, result_tmp, cnt2_neg, ASR, str2_chr_shift); 4848 BIND(DONE); 4849 } 4850 4851 typedef void (MacroAssembler::* chr_insn)(Register Rt, const Address &adr); 4852 typedef void (MacroAssembler::* uxt_insn)(Register Rd, Register Rn); 4853 4854 void MacroAssembler::string_indexof_char(Register str1, Register cnt1, 4855 Register ch, Register result, 4856 Register tmp1, Register tmp2, Register tmp3) 4857 { 4858 Label CH1_LOOP, HAS_ZERO, DO1_SHORT, DO1_LOOP, MATCH, NOMATCH, DONE; 4859 Register cnt1_neg = cnt1; 4860 Register ch1 = rscratch1; 4861 Register result_tmp = rscratch2; 4862 4863 cbz(cnt1, NOMATCH); 4864 4865 cmp(cnt1, (u1)4); 4866 br(LT, DO1_SHORT); 4867 4868 orr(ch, ch, ch, LSL, 16); 4869 orr(ch, ch, ch, LSL, 32); 4870 4871 sub(cnt1, cnt1, 4); 4872 mov(result_tmp, cnt1); 4873 lea(str1, Address(str1, cnt1, Address::uxtw(1))); 4874 sub(cnt1_neg, zr, cnt1, LSL, 1); 4875 4876 mov(tmp3, 0x0001000100010001); 4877 4878 BIND(CH1_LOOP); 4879 ldr(ch1, Address(str1, cnt1_neg)); 4880 eor(ch1, ch, ch1); 4881 sub(tmp1, ch1, tmp3); 4882 orr(tmp2, ch1, 0x7fff7fff7fff7fff); 4883 bics(tmp1, tmp1, tmp2); 4884 br(NE, HAS_ZERO); |