1- /* auto-generated on 2023-09-29 13:28:16 -0400. Do not edit! */
1+ /* auto-generated on 2023-09-30 20:34:30 -0400. Do not edit! */
22/* begin file src/ada.cpp */
33#include "ada.h"
44/* begin file src/checkers.cpp */
@@ -9810,6 +9810,17 @@ constexpr bool to_lower_ascii(char* input, size_t length) noexcept {
98109810#if ADA_NEON
98119811ada_really_inline bool has_tabs_or_newline(
98129812 std::string_view user_input) noexcept {
9813+ // first check for short strings in which case we do it naively.
9814+ if (user_input.size() < 16) { // slow path
9815+ for (size_t i = 0; i < user_input.size(); i++) {
9816+ if (user_input[i] == '\r' || user_input[i] == '\n' ||
9817+ user_input[i] == '\t') {
9818+ return true;
9819+ }
9820+ }
9821+ return false;
9822+ }
9823+ // fast path for long strings (expected to be common)
98139824 size_t i = 0;
98149825 const uint8x16_t mask1 = vmovq_n_u8('\r');
98159826 const uint8x16_t mask2 = vmovq_n_u8('\n');
@@ -9822,9 +9833,8 @@ ada_really_inline bool has_tabs_or_newline(
98229833 vceqq_u8(word, mask3));
98239834 }
98249835 if (i < user_input.size()) {
9825- uint8_t buffer[16]{};
9826- memcpy(buffer, user_input.data() + i, user_input.size() - i);
9827- uint8x16_t word = vld1q_u8((const uint8_t*)user_input.data() + i);
9836+ uint8x16_t word =
9837+ vld1q_u8((const uint8_t*)user_input.data() + user_input.length() - 16);
98289838 running = vorrq_u8(vorrq_u8(running, vorrq_u8(vceqq_u8(word, mask1),
98299839 vceqq_u8(word, mask2))),
98309840 vceqq_u8(word, mask3));
@@ -9834,6 +9844,17 @@ ada_really_inline bool has_tabs_or_newline(
98349844#elif ADA_SSE2
98359845ada_really_inline bool has_tabs_or_newline(
98369846 std::string_view user_input) noexcept {
9847+ // first check for short strings in which case we do it naively.
9848+ if (user_input.size() < 16) { // slow path
9849+ for (size_t i = 0; i < user_input.size(); i++) {
9850+ if (user_input[i] == '\r' || user_input[i] == '\n' ||
9851+ user_input[i] == '\t') {
9852+ return true;
9853+ }
9854+ }
9855+ return false;
9856+ }
9857+ // fast path for long strings (expected to be common)
98379858 size_t i = 0;
98389859 const __m128i mask1 = _mm_set1_epi8('\r');
98399860 const __m128i mask2 = _mm_set1_epi8('\n');
@@ -9847,9 +9868,8 @@ ada_really_inline bool has_tabs_or_newline(
98479868 _mm_cmpeq_epi8(word, mask3));
98489869 }
98499870 if (i < user_input.size()) {
9850- alignas(16) uint8_t buffer[16]{};
9851- memcpy(buffer, user_input.data() + i, user_input.size() - i);
9852- __m128i word = _mm_load_si128((const __m128i*)buffer);
9871+ __m128i word = _mm_loadu_si128(
9872+ (const __m128i*)(user_input.data() + user_input.length() - 16));
98539873 running = _mm_or_si128(
98549874 _mm_or_si128(running, _mm_or_si128(_mm_cmpeq_epi8(word, mask1),
98559875 _mm_cmpeq_epi8(word, mask2))),
0 commit comments