@@ -303,6 +303,58 @@ ada_really_inline size_t find_next_host_delimiter_special(
303303 }
304304 return size_t (view.length ());
305305}
306+ #elif ADA_LSX
307+ ada_really_inline size_t find_next_host_delimiter_special (
308+ std::string_view view, size_t location) noexcept {
309+ // first check for short strings in which case we do it naively.
310+ if (view.size () - location < 16 ) { // slow path
311+ for (size_t i = location; i < view.size (); i++) {
312+ if (view[i] == ' :' || view[i] == ' /' || view[i] == ' \\ ' ||
313+ view[i] == ' ?' || view[i] == ' [' ) {
314+ return i;
315+ }
316+ }
317+ return size_t (view.size ());
318+ }
319+ // fast path for long strings (expected to be common)
320+ size_t i = location;
321+ const __m128i mask1 = __lsx_vrepli_b (' :' );
322+ const __m128i mask2 = __lsx_vrepli_b (' /' );
323+ const __m128i mask3 = __lsx_vrepli_b (' \\ ' );
324+ const __m128i mask4 = __lsx_vrepli_b (' ?' );
325+ const __m128i mask5 = __lsx_vrepli_b (' [' );
326+
327+ for (; i + 15 < view.size (); i += 16 ) {
328+ __m128i word = __lsx_vld ((const __m128i*)(view.data () + i), 0 );
329+ __m128i m1 = __lsx_vseq_b (word, mask1);
330+ __m128i m2 = __lsx_vseq_b (word, mask2);
331+ __m128i m3 = __lsx_vseq_b (word, mask3);
332+ __m128i m4 = __lsx_vseq_b (word, mask4);
333+ __m128i m5 = __lsx_vseq_b (word, mask5);
334+ __m128i m =
335+ __lsx_vor_v (__lsx_vor_v (__lsx_vor_v (m1, m2), __lsx_vor_v (m3, m4)), m5);
336+ int mask = __lsx_vpickve2gr_hu (__lsx_vmsknz_b (m), 0 );
337+ if (mask != 0 ) {
338+ return i + trailing_zeroes (mask);
339+ }
340+ }
341+ if (i < view.size ()) {
342+ __m128i word =
343+ __lsx_vld ((const __m128i*)(view.data () + view.length () - 16 ), 0 );
344+ __m128i m1 = __lsx_vseq_b (word, mask1);
345+ __m128i m2 = __lsx_vseq_b (word, mask2);
346+ __m128i m3 = __lsx_vseq_b (word, mask3);
347+ __m128i m4 = __lsx_vseq_b (word, mask4);
348+ __m128i m5 = __lsx_vseq_b (word, mask5);
349+ __m128i m =
350+ __lsx_vor_v (__lsx_vor_v (__lsx_vor_v (m1, m2), __lsx_vor_v (m3, m4)), m5);
351+ int mask = __lsx_vpickve2gr_hu (__lsx_vmsknz_b (m), 0 );
352+ if (mask != 0 ) {
353+ return view.length () - 16 + trailing_zeroes (mask);
354+ }
355+ }
356+ return size_t (view.length ());
357+ }
306358#else
307359// : / [ \\ ?
308360static constexpr std::array<uint8_t , 256 > special_host_delimiters =
@@ -436,6 +488,53 @@ ada_really_inline size_t find_next_host_delimiter(std::string_view view,
436488 }
437489 return size_t (view.length ());
438490}
491+ #elif ADA_LSX
492+ ada_really_inline size_t find_next_host_delimiter (std::string_view view,
493+ size_t location) noexcept {
494+ // first check for short strings in which case we do it naively.
495+ if (view.size () - location < 16 ) { // slow path
496+ for (size_t i = location; i < view.size (); i++) {
497+ if (view[i] == ' :' || view[i] == ' /' || view[i] == ' ?' ||
498+ view[i] == ' [' ) {
499+ return i;
500+ }
501+ }
502+ return size_t (view.size ());
503+ }
504+ // fast path for long strings (expected to be common)
505+ size_t i = location;
506+ const __m128i mask1 = __lsx_vrepli_b (' :' );
507+ const __m128i mask2 = __lsx_vrepli_b (' /' );
508+ const __m128i mask4 = __lsx_vrepli_b (' ?' );
509+ const __m128i mask5 = __lsx_vrepli_b (' [' );
510+
511+ for (; i + 15 < view.size (); i += 16 ) {
512+ __m128i word = __lsx_vld ((const __m128i*)(view.data () + i), 0 );
513+ __m128i m1 = __lsx_vseq_b (word, mask1);
514+ __m128i m2 = __lsx_vseq_b (word, mask2);
515+ __m128i m4 = __lsx_vseq_b (word, mask4);
516+ __m128i m5 = __lsx_vseq_b (word, mask5);
517+ __m128i m = __lsx_vor_v (__lsx_vor_v (m1, m2), __lsx_vor_v (m4, m5));
518+ int mask = __lsx_vpickve2gr_hu (__lsx_vmsknz_b (m), 0 );
519+ if (mask != 0 ) {
520+ return i + trailing_zeroes (mask);
521+ }
522+ }
523+ if (i < view.size ()) {
524+ __m128i word =
525+ __lsx_vld ((const __m128i*)(view.data () + view.length () - 16 ), 0 );
526+ __m128i m1 = __lsx_vseq_b (word, mask1);
527+ __m128i m2 = __lsx_vseq_b (word, mask2);
528+ __m128i m4 = __lsx_vseq_b (word, mask4);
529+ __m128i m5 = __lsx_vseq_b (word, mask5);
530+ __m128i m = __lsx_vor_v (__lsx_vor_v (m1, m2), __lsx_vor_v (m4, m5));
531+ int mask = __lsx_vpickve2gr_hu (__lsx_vmsknz_b (m), 0 );
532+ if (mask != 0 ) {
533+ return view.length () - 16 + trailing_zeroes (mask);
534+ }
535+ }
536+ return size_t (view.length ());
537+ }
439538#else
440539// : / [ ?
441540static constexpr std::array<uint8_t , 256 > host_delimiters = []() consteval {
0 commit comments