Skip to content

Commit 13e790b

Browse files
committed
implement has_tabs_or_newline in Arm SVE
1 parent a0fee5e commit 13e790b

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

Diff for: include/ada/common_defs.h

+4
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

Diff for: src/unicode.cpp

+23-2
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,26 @@ constexpr bool to_lower_ascii(char* input, size_t length) noexcept {
4446
}
4547
return non_ascii == 0;
4648
}
47-
#if ADA_NEON
49+
#if ADA_SVE
50+
ada_really_inline bool has_tabs_or_newline(
51+
std::string_view user_input) noexcept {
52+
const svuint8_t mask1 = svdup_n_u8('\r');
53+
const svuint8_t mask2 = svdup_n_u8('\n');
54+
const svuint8_t mask3 = svdup_n_u8('\t');
55+
svbool_t running = svdup_n_b8(false);
56+
const size_t lanes = svcntb();
57+
for (size_t i = 0; i < user_input.size(); i += lanes) {
58+
const svbool_t mask = svwhilelt_b8_u64(i, user_input.size());
59+
svuint8_t word = svld1_u8(mask, (const uint8_t*)user_input.data() + i);
60+
running = svorr_b_z(mask,
61+
svorr_b_z(mask, running,
62+
svorr_b_z(mask, svcmpeq_u8(mask, word, mask1),
63+
svcmpeq_u8(mask, word, mask2))),
64+
svcmpeq_u8(mask, word, mask3));
65+
}
66+
return svptest_any(running);
67+
}
68+
#elif ADA_NEON
4869
ada_really_inline bool has_tabs_or_newline(
4970
std::string_view user_input) noexcept {
5071
size_t i = 0;

0 commit comments

Comments
 (0)