Skip to content

Commit 96e8c44

Browse files
committed
implement has_tabs_or_newline in Arm SVE
1 parent a0fee5e commit 96e8c44

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

include/ada/common_defs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,10 @@ namespace ada {
292292
#define ADA_SSE2 1
293293
#endif
294294

295+
#if defined(__ARM_FEATURE_SVE)
296+
#define ADA_SVE 1
297+
#endif
298+
295299
#if defined(__aarch64__) || defined(_M_ARM64)
296300
#define ADA_NEON 1
297301
#endif

src/unicode.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ ADA_PUSH_DISABLE_ALL_WARNINGS
88
ADA_POP_DISABLE_WARNINGS
99

1010
#include <algorithm>
11-
#if ADA_NEON
11+
#if ADA_SVE
12+
#include <arm_sve.h>
13+
#elif ADA_NEON
1214
#include <arm_neon.h>
1315
#elif ADA_SSE2
1416
#include <emmintrin.h>
@@ -44,7 +46,27 @@ constexpr bool to_lower_ascii(char* input, size_t length) noexcept {
4446
}
4547
return non_ascii == 0;
4648
}
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
4870
ada_really_inline bool has_tabs_or_newline(
4971
std::string_view user_input) noexcept {
5072
size_t i = 0;

0 commit comments

Comments
 (0)