@@ -8,7 +8,9 @@ ADA_PUSH_DISABLE_ALL_WARNINGS
8
8
ADA_POP_DISABLE_WARNINGS
9
9
10
10
#include < algorithm>
11
- #if ADA_NEON
11
+ #if ADA_SVE
12
+ #include < arm_sve.h>
13
+ #elif ADA_NEON
12
14
#include < arm_neon.h>
13
15
#elif ADA_SSE2
14
16
#include < emmintrin.h>
@@ -44,7 +46,27 @@ constexpr bool to_lower_ascii(char* input, size_t length) noexcept {
44
46
}
45
47
return non_ascii == 0 ;
46
48
}
47
- #if ADA_NEON
49
+ #endif
50
+ #if ADA_SVE
51
+ ada_really_inline bool has_tabs_or_newline (
52
+ std::string_view user_input) noexcept {
53
+ const svuint8_t mask1 = svdup_n_u8 (' \r ' );
54
+ const svuint8_t mask2 = svdup_n_u8 (' \n ' );
55
+ const svuint8_t mask3 = svdup_n_u8 (' \t ' );
56
+ svbool_t running = svdup_n_b8 (false );
57
+ const size_t lanes = svcntb ();
58
+ for (size_t i = 0 ; i < user_input.size (); i += lanes) {
59
+ const svbool_t mask = svwhilelt_b8_u64 (i, user_input.size ());
60
+ svuint8_t word = svld1_u8 (mask, (const uint8_t *)user_input.data () + i);
61
+ running = svorr_b_z (mask,
62
+ svorr_b_z (mask, running,
63
+ svorr_b_z (mask, svcmpeq_u8 (mask, word, mask1),
64
+ svcmpeq_u8 (mask, word, mask2))),
65
+ svcmpeq_u8 (mask, word, mask3));
66
+ }
67
+ return svptest_any (running);
68
+ }
69
+ #elif ADA_NEON
48
70
ada_really_inline bool has_tabs_or_newline (
49
71
std::string_view user_input) noexcept {
50
72
size_t i = 0 ;
0 commit comments