Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions scripts/verify-baseline-static/allowlist-aarch64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
# (133 symbols)
# ----------------------------------------------------------------------------
_ZN3bun10N_SVE2_12810MemMemImplEPKhmS2_m [SVE]
_ZN3bun10N_SVE2_12811MemRMemImplEPKhmS2_m [SVE]
_ZN3bun10N_SVE2_12812MemMem16ImplEPKtmS2_m [SVE]
_ZN3bun10N_SVE2_12813MemRMem16ImplEPKtmS2_m [SVE]
_ZN3bun10N_SVE2_12813JsonIndexImplEPKhmmPjPmS4_S3_ [SVE]
_ZN3bun10N_SVE2_12814DecodeHex8ImplEPKhPhm [SVE]
_ZN3bun10N_SVE2_12814LowerAsciiImplEPKhmPh [SVE]
Expand Down Expand Up @@ -42,6 +45,9 @@ _ZN3bun10N_SVE2_12846IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [S
_ZN3bun10N_SVE2_12849IndexOfInterestingCharacterInMultilineCommentImplEPKhm [SVE]
_ZN3bun10N_SVE2_12849IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [SVE]
_ZN3bun5N_SVE10MemMemImplEPKhmS2_m [SVE]
_ZN3bun5N_SVE11MemRMemImplEPKhmS2_m [SVE]
_ZN3bun5N_SVE12MemMem16ImplEPKtmS2_m [SVE]
_ZN3bun5N_SVE13MemRMem16ImplEPKtmS2_m [SVE]
_ZN3bun5N_SVE14DecodeHex8ImplEPKhPhm [SVE]
_ZN3bun5N_SVE14LowerAsciiImplEPKhmPh [SVE]
_ZN3bun5N_SVE15CopyU16ToU8ImplEPKtmPh [SVE]
Expand Down Expand Up @@ -75,6 +81,9 @@ _ZN3bun5N_SVE46IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [S
_ZN3bun5N_SVE49IndexOfInterestingCharacterInMultilineCommentImplEPKhm [SVE]
_ZN3bun5N_SVE49IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [SVE]
_ZN3bun6N_SVE210MemMemImplEPKhmS2_m [SVE]
_ZN3bun6N_SVE211MemRMemImplEPKhmS2_m [SVE]
_ZN3bun6N_SVE212MemMem16ImplEPKtmS2_m [SVE]
_ZN3bun6N_SVE213MemRMem16ImplEPKtmS2_m [SVE]
_ZN3bun6N_SVE214DecodeHex8ImplEPKhPhm [SVE]
_ZN3bun6N_SVE214LowerAsciiImplEPKhmPh [SVE]
_ZN3bun6N_SVE215CopyU16ToU8ImplEPKtmPh [SVE]
Expand Down Expand Up @@ -108,6 +117,9 @@ _ZN3bun6N_SVE246IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [S
_ZN3bun6N_SVE249IndexOfInterestingCharacterInMultilineCommentImplEPKhm [SVE]
_ZN3bun6N_SVE249IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [SVE]
_ZN3bun9N_SVE_25610MemMemImplEPKhmS2_m [SVE]
_ZN3bun9N_SVE_25611MemRMemImplEPKhmS2_m [SVE]
_ZN3bun9N_SVE_25612MemMem16ImplEPKtmS2_m [SVE]
_ZN3bun9N_SVE_25613MemRMem16ImplEPKtmS2_m [SVE]
_ZN3bun9N_SVE_25614DecodeHex8ImplEPKhPhm [SVE]
_ZN3bun9N_SVE_25614LowerAsciiImplEPKhmPh [SVE]
_ZN3bun9N_SVE_25615CopyU16ToU8ImplEPKtmPh [SVE]
Expand Down
16 changes: 16 additions & 0 deletions scripts/verify-baseline-static/allowlist-x64-windows.txt
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,9 @@ bun::N_AVX2::IndexOfSpaceOrNewlineOrNonASCIIImpl [AVX, AVX2]
bun::N_AVX2::LowerAscii16Impl [AVX, AVX2]
bun::N_AVX2::LowerAsciiImpl [AVX, AVX2]
bun::N_AVX2::MemMemImpl [AVX, AVX2]
bun::N_AVX2::MemRMemImpl [AVX, AVX2]
bun::N_AVX2::MemMem16Impl [AVX, AVX2, BMI2]
bun::N_AVX2::MemRMem16Impl [AVX, AVX2, BMI2]
bun::N_AVX2::JsonIndexImpl [AVX, AVX2, BMI1, BMI2]
bun::N_AVX2::VisibleLatin1WidthExcludeANSIImpl [AVX, AVX2, BMI1, BMI2]
bun::N_AVX2::VisibleLatin1WidthImpl [AVX, AVX2]
Expand Down Expand Up @@ -536,6 +539,10 @@ bun::N_AVX3::IndexOfSpaceOrNewlineOrNonASCIIImpl [AVX, AVX51
bun::N_AVX3::LowerAscii16Impl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3::LowerAsciiImpl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3::MemMemImpl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3::MemRMemImpl [AVX, AVX512BW, AVX512F, BMI2]
bun::N_AVX3::MemMem16Impl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3::MemRMem16Impl [AVX, AVX512F]
bun::N_AVX3::MemMemReverse<unsigned short> [AVX, AVX512BW, AVX512F, BMI2]
bun::N_AVX3::JsonIndexImpl [AVX, AVX512BW, AVX512F, AVX512VL, BMI1, BMI2]
bun::N_AVX3::VisibleLatin1WidthExcludeANSIImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL, BMI1, BMI2]
bun::N_AVX3::VisibleLatin1WidthImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL]
Expand Down Expand Up @@ -570,6 +577,9 @@ bun::N_AVX3_DL::IndexOfSpaceOrNewlineOrNonASCIIImpl [AVX, AVX51
bun::N_AVX3_DL::LowerAscii16Impl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_DL::LowerAsciiImpl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_DL::MemMemImpl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3_DL::MemRMemImpl [AVX, AVX512BW, AVX512F, BMI2]
bun::N_AVX3_DL::MemMem16Impl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3_DL::MemRMem16Impl [AVX, AVX512F]
bun::N_AVX3_DL::JsonIndexImpl [AVX, AVX512BW, AVX512F, AVX512VL, BMI1, BMI2, GFNI]
bun::N_AVX3_DL::VisibleLatin1WidthExcludeANSIImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL, BMI1, BMI2]
bun::N_AVX3_DL::VisibleLatin1WidthImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL]
Expand Down Expand Up @@ -604,6 +614,9 @@ bun::N_AVX3_SPR::IndexOfSpaceOrNewlineOrNonASCIIImpl [AVX, AVX51
bun::N_AVX3_SPR::LowerAscii16Impl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_SPR::LowerAsciiImpl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_SPR::MemMemImpl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3_SPR::MemRMemImpl [AVX, AVX512BW, AVX512F, BMI2]
bun::N_AVX3_SPR::MemMem16Impl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3_SPR::MemRMem16Impl [AVX, AVX512F]
bun::N_AVX3_SPR::JsonIndexImpl [AVX, AVX512BW, AVX512F, AVX512VL, BMI1, BMI2, GFNI]
bun::N_AVX3_SPR::VisibleLatin1WidthExcludeANSIImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL, BMI1, BMI2]
bun::N_AVX3_SPR::VisibleLatin1WidthImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL]
Expand Down Expand Up @@ -638,6 +651,9 @@ bun::N_AVX3_ZEN4::IndexOfSpaceOrNewlineOrNonASCIIImpl [AVX, AVX51
bun::N_AVX3_ZEN4::LowerAscii16Impl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_ZEN4::LowerAsciiImpl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_ZEN4::MemMemImpl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3_ZEN4::MemRMemImpl [AVX, AVX512BW, AVX512F, BMI2]
bun::N_AVX3_ZEN4::MemMem16Impl [AVX, AVX512BW, AVX512F, BMI1]
bun::N_AVX3_ZEN4::MemRMem16Impl [AVX, AVX512F]
bun::N_AVX3_ZEN4::JsonIndexImpl [AVX, AVX512BW, AVX512F, AVX512VL, BMI1, BMI2, GFNI]
bun::N_AVX3_ZEN4::VisibleLatin1WidthExcludeANSIImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL, BMI1, BMI2]
bun::N_AVX3_ZEN4::VisibleLatin1WidthImpl [AVX, AVX2, AVX512BW, AVX512DQ, AVX512F, AVX512VL]
Expand Down
16 changes: 16 additions & 0 deletions scripts/verify-baseline-static/allowlist-x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,9 @@ ctiMasmProbeTrampolineAVX [AVX]
# (203 symbols)
# ----------------------------------------------------------------------------
_ZN3bun10N_AVX3_SPR10MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun10N_AVX3_SPR11MemRMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI2]
_ZN3bun10N_AVX3_SPR12MemMem16ImplEPKtmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun10N_AVX3_SPR13MemRMem16ImplEPKtmS2_m [AVX, AVX512F]
_ZN3bun10N_AVX3_SPR13JsonIndexImplEPKhmmPjPmS4_S3_ [AVX, AVX512BW, AVX512F, BMI1, BMI2, GFNI]
_ZN3bun10N_AVX3_SPR14DecodeHex8ImplEPKhPhm [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_VBMI, GFNI]
_ZN3bun10N_AVX3_SPR14LowerAsciiImplEPKhmPh [AVX, AVX512BW, AVX512F, AVX512VL]
Expand Down Expand Up @@ -496,6 +499,9 @@ _ZN3bun10N_AVX3_SPR46IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [
_ZN3bun10N_AVX3_SPR49IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun10N_AVX3_SPR49IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun11N_AVX3_ZEN410MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun11N_AVX3_ZEN411MemRMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI2]
_ZN3bun11N_AVX3_ZEN412MemMem16ImplEPKtmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun11N_AVX3_ZEN413MemRMem16ImplEPKtmS2_m [AVX, AVX512F]
_ZN3bun11N_AVX3_ZEN413JsonIndexImplEPKhmmPjPmS4_S3_ [AVX, AVX512BW, AVX512F, BMI1, BMI2, GFNI]
_ZN3bun11N_AVX3_ZEN414DecodeHex8ImplEPKhPhm [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_VBMI, GFNI]
_ZN3bun11N_AVX3_ZEN414LowerAsciiImplEPKhmPh [AVX, AVX512BW, AVX512F, AVX512VL]
Expand Down Expand Up @@ -530,6 +536,9 @@ _ZN3bun11N_AVX3_ZEN446IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [
_ZN3bun11N_AVX3_ZEN449IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun11N_AVX3_ZEN449IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun6N_AVX210MemMemImplEPKhmS2_m [AVX, AVX2]
_ZN3bun6N_AVX211MemRMemImplEPKhmS2_m [AVX, AVX2]
_ZN3bun6N_AVX212MemMem16ImplEPKtmS2_m [AVX, AVX2, BMI2]
_ZN3bun6N_AVX213MemRMem16ImplEPKtmS2_m [AVX, AVX2, BMI2]
_ZN3bun6N_AVX213JsonIndexImplEPKhmmPjPmS4_S3_ [AVX, AVX2, BMI1, BMI2]
_ZN3bun6N_AVX214DecodeHex8ImplEPKhPhm [AVX, AVX2]
_ZN3bun6N_AVX214LowerAsciiImplEPKhmPh [AVX, AVX2]
Expand Down Expand Up @@ -564,6 +573,10 @@ _ZN3bun6N_AVX246IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [
_ZN3bun6N_AVX249IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX2]
_ZN3bun6N_AVX249IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX2]
_ZN3bun6N_AVX310MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun6N_AVX311MemRMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI2]
_ZN3bun6N_AVX312MemMem16ImplEPKtmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun6N_AVX313MemMemReverseItEEmPKT_mS4_mmmPm [AVX, AVX512BW, AVX512F, BMI2]
_ZN3bun6N_AVX313MemRMem16ImplEPKtmS2_m [AVX, AVX512F]
_ZN3bun6N_AVX313JsonIndexImplEPKhmmPjPmS4_S3_ [AVX, AVX512BW, AVX512F, BMI1, BMI2]
_ZN3bun6N_AVX314DecodeHex8ImplEPKhPhm [AVX, AVX2, AVX512BW, AVX512F, AVX512VL]
_ZN3bun6N_AVX314LowerAsciiImplEPKhmPh [AVX, AVX512BW, AVX512F, AVX512VL]
Expand Down Expand Up @@ -631,6 +644,9 @@ _ZN3bun9N_AVX10_246IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [
_ZN3bun9N_AVX10_249IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX10_249IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX3_DL10MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun9N_AVX3_DL11MemRMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI2]
_ZN3bun9N_AVX3_DL12MemMem16ImplEPKtmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun9N_AVX3_DL13MemRMem16ImplEPKtmS2_m [AVX, AVX512F]
_ZN3bun9N_AVX3_DL13JsonIndexImplEPKhmmPjPmS4_S3_ [AVX, AVX512BW, AVX512F, BMI1, BMI2, GFNI]
_ZN3bun9N_AVX3_DL14DecodeHex8ImplEPKhPhm [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_VBMI, GFNI]
_ZN3bun9N_AVX3_DL14LowerAsciiImplEPKhmPh [AVX, AVX512BW, AVX512F, AVX512VL]
Expand Down
153 changes: 153 additions & 0 deletions src/jsc/bindings/BufferStringSearch.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
// Two-Way substring search (Crochemore & Perrin, 1991): O(n + m) time,
// O(1) space. Linear-time fallback for the SIMD kernels in highway_strings.cpp.
// Derived from the public-domain musl libc memmem; templated on Char and
// driven through an index-reversing Vector so one body serves forward/reverse.
Comment thread
robobun marked this conversation as resolved.

#pragma once

#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <cstring>

namespace bun {
namespace stringsearch {

template<typename T>
class Vector {
public:
Vector(const T* data, size_t length, bool isForward)
: start_(data)
, length_(length)
, is_forward_(isForward)
{
}

size_t length() const { return length_; }
bool forward() const { return is_forward_; }

T operator[](size_t index) const
{
return start_[is_forward_ ? index : (length_ - index - 1)];
}

private:
const T* start_;
size_t length_;
bool is_forward_;
};

// Critical factorization: on return, *period is the period of the maximal
// suffix and the function returns its start index.
Comment thread
robobun marked this conversation as resolved.
template<typename Char>
static size_t MaximalSuffix(Vector<Char> needle, size_t* period, bool order)
{
size_t ms = static_cast<size_t>(-1);
size_t j = 0, k = 1, p = 1;
const size_t l = needle.length();
while (j + k < l) {
Char a = needle[j + k];
Char b = needle[ms + k];
if (a == b) {
if (k == p) {
j += p;
k = 1;
} else {
k++;
}
} else if ((order ? a > b : a < b)) {
j += k;
k = 1;
p = j - ms;
} else {
ms = j++;
k = p = 1;
}
}
*period = p;
return ms;
}

template<typename Char>
static size_t TwoWay(Vector<Char> haystack, Vector<Char> needle, size_t start_index)
{
const size_t n = haystack.length();
const size_t m = needle.length();

size_t p0, p1;
size_t ms0 = MaximalSuffix(needle, &p0, true);
size_t ms1 = MaximalSuffix(needle, &p1, false);
size_t ms, p;
if (ms0 + 1 > ms1 + 1) {
ms = ms0;
p = p0;
} else {
ms = ms1;
p = p1;
}

// Periodic if needle[0..ms] == needle[p..p+ms]; ms+1 wraps to 0 for ms == -1.
bool periodic = true;
for (size_t i = 0, e = ms + 1; i < e; i++) {
if (needle[i] != needle[i + p]) {
periodic = false;
break;
}
}
size_t mem0;
if (periodic) {
mem0 = m - p;
} else {
mem0 = 0;
p = std::max(ms + 1, m - ms - 1) + 1;
}

size_t pos = start_index;
size_t mem = 0;
while (pos + m <= n) {
// Right half: [max(ms+1, mem), m).
size_t k = std::max(ms + 1, mem);
while (k < m && needle[k] == haystack[pos + k])
k++;
if (k < m) {
pos += k - ms;
mem = 0;
continue;
}
// Left half: (mem, ms].
k = ms + 1;
while (k > mem && needle[k - 1] == haystack[pos + k - 1])
k--;
if (k <= mem) return pos;
pos += p;
mem = mem0;
}
return n;
}

} // namespace stringsearch

// Returns the match index, or haystack_length if not found.
// Requires needle_length > 0 and haystack_length >= needle_length.
Comment thread
robobun marked this conversation as resolved.
template<typename Char>
size_t SearchString(const Char* haystack, size_t haystack_length,
const Char* needle, size_t needle_length,
size_t start_index, bool is_forward)
{
stringsearch::Vector<Char> v_needle(needle, needle_length, is_forward);
stringsearch::Vector<Char> v_haystack(haystack, haystack_length, is_forward);
size_t diff = haystack_length - needle_length;
size_t relative_start_index;
if (is_forward) {
relative_start_index = start_index;
} else if (diff < start_index) {
relative_start_index = 0;
} else {
relative_start_index = diff - start_index;
}
size_t pos = stringsearch::TwoWay(v_haystack, v_needle, relative_start_index);
if (pos == haystack_length) return haystack_length;
return is_forward ? pos : (diff - pos);
}

} // namespace bun
Loading
Loading