|
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! */ |
2 | 2 | /* begin file src/ada.cpp */ |
3 | 3 | #include "ada.h" |
4 | 4 | /* begin file src/checkers.cpp */ |
@@ -9810,6 +9810,17 @@ constexpr bool to_lower_ascii(char* input, size_t length) noexcept { |
9810 | 9810 | #if ADA_NEON |
9811 | 9811 | ada_really_inline bool has_tabs_or_newline( |
9812 | 9812 | 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) |
9813 | 9824 | size_t i = 0; |
9814 | 9825 | const uint8x16_t mask1 = vmovq_n_u8('\r'); |
9815 | 9826 | const uint8x16_t mask2 = vmovq_n_u8('\n'); |
@@ -9822,9 +9833,8 @@ ada_really_inline bool has_tabs_or_newline( |
9822 | 9833 | vceqq_u8(word, mask3)); |
9823 | 9834 | } |
9824 | 9835 | 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); |
9828 | 9838 | running = vorrq_u8(vorrq_u8(running, vorrq_u8(vceqq_u8(word, mask1), |
9829 | 9839 | vceqq_u8(word, mask2))), |
9830 | 9840 | vceqq_u8(word, mask3)); |
@@ -9834,6 +9844,17 @@ ada_really_inline bool has_tabs_or_newline( |
9834 | 9844 | #elif ADA_SSE2 |
9835 | 9845 | ada_really_inline bool has_tabs_or_newline( |
9836 | 9846 | 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) |
9837 | 9858 | size_t i = 0; |
9838 | 9859 | const __m128i mask1 = _mm_set1_epi8('\r'); |
9839 | 9860 | const __m128i mask2 = _mm_set1_epi8('\n'); |
@@ -9847,9 +9868,8 @@ ada_really_inline bool has_tabs_or_newline( |
9847 | 9868 | _mm_cmpeq_epi8(word, mask3)); |
9848 | 9869 | } |
9849 | 9870 | 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)); |
9853 | 9873 | running = _mm_or_si128( |
9854 | 9874 | _mm_or_si128(running, _mm_or_si128(_mm_cmpeq_epi8(word, mask1), |
9855 | 9875 | _mm_cmpeq_epi8(word, mask2))), |
|