mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
perf(builder): add LSX fast_needs_escaping for LoongArch (#2727)
Use LSX intrinsics for the string-builder escape scan on LoongArch, matching the existing find_next_json_quotable_character LSX path. Fixes #2603
This commit is contained in:
@@ -173,6 +173,35 @@ simdjson_inline bool fast_needs_escaping(std::string_view view) {
|
||||
}
|
||||
return _mm_movemask_epi8(running) != 0;
|
||||
}
|
||||
#elif SIMDJSON_EXPERIMENTAL_HAS_LSX
|
||||
simdjson_inline bool fast_needs_escaping(std::string_view view) {
|
||||
if (view.size() < 16) {
|
||||
return simple_needs_escaping(view);
|
||||
}
|
||||
size_t i = 0;
|
||||
__m128i running = __lsx_vreplgr2vr_b(0);
|
||||
__m128i v34 = __lsx_vreplgr2vr_b(34);
|
||||
__m128i v92 = __lsx_vreplgr2vr_b(92);
|
||||
__m128i v32 = __lsx_vreplgr2vr_b(32);
|
||||
|
||||
for (; i + 15 < view.size(); i += 16) {
|
||||
__m128i word =
|
||||
__lsx_vld(reinterpret_cast<const char *>(view.data() + i), 0);
|
||||
__m128i chunk = __lsx_vseq_b(word, v34);
|
||||
chunk = __lsx_vor_v(chunk, __lsx_vseq_b(word, v92));
|
||||
chunk = __lsx_vor_v(chunk, __lsx_vslt_bu(word, v32));
|
||||
running = __lsx_vor_v(running, chunk);
|
||||
}
|
||||
if (i < view.size()) {
|
||||
__m128i word = __lsx_vld(
|
||||
reinterpret_cast<const char *>(view.data() + view.length() - 16), 0);
|
||||
__m128i chunk = __lsx_vseq_b(word, v34);
|
||||
chunk = __lsx_vor_v(chunk, __lsx_vseq_b(word, v92));
|
||||
chunk = __lsx_vor_v(chunk, __lsx_vslt_bu(word, v32));
|
||||
running = __lsx_vor_v(running, chunk);
|
||||
}
|
||||
return !__lsx_bz_v(running);
|
||||
}
|
||||
#elif SIMDJSON_EXPERIMENTAL_HAS_PPC64
|
||||
simdjson_inline bool fast_needs_escaping(std::string_view view) {
|
||||
if (view.size() < 16) {
|
||||
|
||||
Reference in New Issue
Block a user