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
6 changes: 5 additions & 1 deletion scripts/verify-baseline-static/allowlist-aarch64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

# ----------------------------------------------------------------------------
# Bun's Highway SVE/SVE2 targets. Gate: hwy::SupportedTargets via getauxval(AT_HWCAP).
# (80 symbols)
# (84 symbols)
# ----------------------------------------------------------------------------
_ZN3bun10N_SVE2_12810MemMemImplEPKhmS2_m [SVE]
_ZN3bun10N_SVE2_12815CopyU16ToU8ImplEPKtmPh [SVE]
Expand All @@ -26,6 +26,7 @@ _ZN3bun10N_SVE2_12836ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [S
_ZN3bun10N_SVE2_12838IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [SVE]
_ZN3bun10N_SVE2_12846IndexOfInterestingCharacterInStringLiteralImplEPKhmh [SVE]
_ZN3bun10N_SVE2_12846IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [SVE]
_ZN3bun10N_SVE2_12849IndexOfInterestingCharacterInMultilineCommentImplEPKhm [SVE]
_ZN3bun10N_SVE2_12849IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [SVE]
_ZN3bun5N_SVE10MemMemImplEPKhmS2_m [SVE]
_ZN3bun5N_SVE15CopyU16ToU8ImplEPKtmPh [SVE]
Expand All @@ -46,6 +47,7 @@ _ZN3bun5N_SVE36ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [S
_ZN3bun5N_SVE38IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [SVE]
_ZN3bun5N_SVE46IndexOfInterestingCharacterInStringLiteralImplEPKhmh [SVE]
_ZN3bun5N_SVE46IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [SVE]
_ZN3bun5N_SVE49IndexOfInterestingCharacterInMultilineCommentImplEPKhm [SVE]
_ZN3bun5N_SVE49IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [SVE]
_ZN3bun6N_SVE210MemMemImplEPKhmS2_m [SVE]
_ZN3bun6N_SVE215CopyU16ToU8ImplEPKtmPh [SVE]
Expand All @@ -66,6 +68,7 @@ _ZN3bun6N_SVE236ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [S
_ZN3bun6N_SVE238IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [SVE]
_ZN3bun6N_SVE246IndexOfInterestingCharacterInStringLiteralImplEPKhmh [SVE]
_ZN3bun6N_SVE246IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [SVE]
_ZN3bun6N_SVE249IndexOfInterestingCharacterInMultilineCommentImplEPKhm [SVE]
_ZN3bun6N_SVE249IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [SVE]
_ZN3bun9N_SVE_25610MemMemImplEPKhmS2_m [SVE]
_ZN3bun9N_SVE_25615CopyU16ToU8ImplEPKtmPh [SVE]
Expand All @@ -86,6 +89,7 @@ _ZN3bun9N_SVE_25636ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [S
_ZN3bun9N_SVE_25638IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [SVE]
_ZN3bun9N_SVE_25646IndexOfInterestingCharacterInStringLiteralImplEPKhmh [SVE]
_ZN3bun9N_SVE_25646IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [SVE]
_ZN3bun9N_SVE_25649IndexOfInterestingCharacterInMultilineCommentImplEPKhm [SVE]
_ZN3bun9N_SVE_25649IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [SVE]


Expand Down
8 changes: 7 additions & 1 deletion scripts/verify-baseline-static/allowlist-x64-windows.txt
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ ctiMasmProbeTrampolineAVX [AVX]

# ----------------------------------------------------------------------------
# Highway. MSVC-mangled bun::N_AVX* names.
# (120 symbols)
# (126 symbols)
# ----------------------------------------------------------------------------
bun::N_AVX10_2::ContainsNewlineOrNonASCIIOrQuoteImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX10_2::CopyAsciiPrefixImpl [AVX, AVX512BW, AVX512F, AVX512VL]
Expand All @@ -449,6 +449,7 @@ bun::N_AVX10_2::FirstNonAscii16Impl [AVX, AVX51
bun::N_AVX10_2::FirstNonAscii8Impl [AVX, AVX512BW]
bun::N_AVX10_2::IndexOfAnyCharImpl [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_FP16]
bun::N_AVX10_2::IndexOfCharImpl [AVX, AVX512BW, BMI2]
bun::N_AVX10_2::IndexOfInterestingCharacterInMultilineCommentImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX10_2::IndexOfInterestingCharacterInStringLiteralImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX10_2::IndexOfNeedsEscapeForJavaScriptStringImplBacktick [AVX, AVX512BW, AVX512F]
bun::N_AVX10_2::IndexOfNeedsEscapeForJavaScriptStringImplQuote [AVX, AVX512BW, AVX512F]
Expand All @@ -469,6 +470,7 @@ bun::N_AVX2::FirstNonAscii16Impl [AVX, AVX2,
bun::N_AVX2::FirstNonAscii8Impl [AVX, AVX2]
bun::N_AVX2::IndexOfAnyCharImpl [AVX, AVX2]
bun::N_AVX2::IndexOfCharImpl [AVX, AVX2]
bun::N_AVX2::IndexOfInterestingCharacterInMultilineCommentImpl [AVX, AVX2]
bun::N_AVX2::IndexOfInterestingCharacterInStringLiteralImpl [AVX, AVX2]
bun::N_AVX2::IndexOfNeedsEscapeForJavaScriptStringImplBacktick [AVX, AVX2]
bun::N_AVX2::IndexOfNeedsEscapeForJavaScriptStringImplQuote [AVX, AVX2]
Expand All @@ -489,6 +491,7 @@ bun::N_AVX3::FirstNonAscii16Impl [AVX, AVX51
bun::N_AVX3::FirstNonAscii8Impl [AVX, AVX512BW]
bun::N_AVX3::IndexOfAnyCharImpl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3::IndexOfCharImpl [AVX, AVX512BW, BMI2]
bun::N_AVX3::IndexOfInterestingCharacterInMultilineCommentImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3::IndexOfInterestingCharacterInStringLiteralImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3::IndexOfNeedsEscapeForJavaScriptStringImplBacktick [AVX, AVX512BW, AVX512F]
bun::N_AVX3::IndexOfNeedsEscapeForJavaScriptStringImplQuote [AVX, AVX512BW, AVX512F]
Expand All @@ -509,6 +512,7 @@ bun::N_AVX3_DL::FirstNonAscii16Impl [AVX, AVX51
bun::N_AVX3_DL::FirstNonAscii8Impl [AVX, AVX512BW]
bun::N_AVX3_DL::IndexOfAnyCharImpl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_DL::IndexOfCharImpl [AVX, AVX512BW, BMI2]
bun::N_AVX3_DL::IndexOfInterestingCharacterInMultilineCommentImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3_DL::IndexOfInterestingCharacterInStringLiteralImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3_DL::IndexOfNeedsEscapeForJavaScriptStringImplBacktick [AVX, AVX512BW, AVX512F]
bun::N_AVX3_DL::IndexOfNeedsEscapeForJavaScriptStringImplQuote [AVX, AVX512BW, AVX512F]
Expand All @@ -529,6 +533,7 @@ bun::N_AVX3_SPR::FirstNonAscii16Impl [AVX, AVX51
bun::N_AVX3_SPR::FirstNonAscii8Impl [AVX, AVX512BW]
bun::N_AVX3_SPR::IndexOfAnyCharImpl [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_FP16]
bun::N_AVX3_SPR::IndexOfCharImpl [AVX, AVX512BW, BMI2]
bun::N_AVX3_SPR::IndexOfInterestingCharacterInMultilineCommentImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3_SPR::IndexOfInterestingCharacterInStringLiteralImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3_SPR::IndexOfNeedsEscapeForJavaScriptStringImplBacktick [AVX, AVX512BW, AVX512F]
bun::N_AVX3_SPR::IndexOfNeedsEscapeForJavaScriptStringImplQuote [AVX, AVX512BW, AVX512F]
Expand All @@ -549,6 +554,7 @@ bun::N_AVX3_ZEN4::FirstNonAscii16Impl [AVX, AVX51
bun::N_AVX3_ZEN4::FirstNonAscii8Impl [AVX, AVX512BW]
bun::N_AVX3_ZEN4::IndexOfAnyCharImpl [AVX, AVX512BW, AVX512F, AVX512VL]
bun::N_AVX3_ZEN4::IndexOfCharImpl [AVX, AVX512BW, BMI2]
bun::N_AVX3_ZEN4::IndexOfInterestingCharacterInMultilineCommentImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3_ZEN4::IndexOfInterestingCharacterInStringLiteralImpl [AVX, AVX512BW, AVX512F]
bun::N_AVX3_ZEN4::IndexOfNeedsEscapeForJavaScriptStringImplBacktick [AVX, AVX512BW, AVX512F]
bun::N_AVX3_ZEN4::IndexOfNeedsEscapeForJavaScriptStringImplQuote [AVX, AVX512BW, AVX512F]
Expand Down
8 changes: 7 additions & 1 deletion scripts/verify-baseline-static/allowlist-x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ ctiMasmProbeTrampolineAVX [AVX]

# ----------------------------------------------------------------------------
# Bun's Highway SIMD. Gate: HWY_DYNAMIC_DISPATCH via hwy::SupportedTargets.
# (120 symbols)
# (126 symbols)
# ----------------------------------------------------------------------------
_ZN3bun10N_AVX3_SPR10MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun10N_AVX3_SPR15CopyU16ToU8ImplEPKtmPh [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_VBMI]
Expand All @@ -480,6 +480,7 @@ _ZN3bun10N_AVX3_SPR36ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [
_ZN3bun10N_AVX3_SPR38IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun10N_AVX3_SPR46IndexOfInterestingCharacterInStringLiteralImplEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun10N_AVX3_SPR46IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun10N_AVX3_SPR49IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun10N_AVX3_SPR49IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun11N_AVX3_ZEN410MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun11N_AVX3_ZEN415CopyU16ToU8ImplEPKtmPh [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_VBMI]
Expand All @@ -500,6 +501,7 @@ _ZN3bun11N_AVX3_ZEN436ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [
_ZN3bun11N_AVX3_ZEN438IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun11N_AVX3_ZEN446IndexOfInterestingCharacterInStringLiteralImplEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun11N_AVX3_ZEN446IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun11N_AVX3_ZEN449IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun11N_AVX3_ZEN449IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun6N_AVX210MemMemImplEPKhmS2_m [AVX, AVX2]
_ZN3bun6N_AVX215CopyU16ToU8ImplEPKtmPh [AVX, AVX2]
Expand All @@ -520,6 +522,7 @@ _ZN3bun6N_AVX236ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [
_ZN3bun6N_AVX238IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [AVX, AVX2]
_ZN3bun6N_AVX246IndexOfInterestingCharacterInStringLiteralImplEPKhmh [AVX, AVX2]
_ZN3bun6N_AVX246IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [AVX, AVX2]
_ZN3bun6N_AVX249IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX2]
_ZN3bun6N_AVX249IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX2]
_ZN3bun6N_AVX310MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun6N_AVX315CopyU16ToU8ImplEPKtmPh [AVX, AVX512BW, AVX512F, AVX512VL]
Expand All @@ -540,6 +543,7 @@ _ZN3bun6N_AVX336ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [
_ZN3bun6N_AVX338IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun6N_AVX346IndexOfInterestingCharacterInStringLiteralImplEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun6N_AVX346IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun6N_AVX349IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun6N_AVX349IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX10_210MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun9N_AVX10_215CopyU16ToU8ImplEPKtmPh [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_VBMI]
Expand All @@ -560,6 +564,7 @@ _ZN3bun9N_AVX10_236ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [
_ZN3bun9N_AVX10_238IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX10_246IndexOfInterestingCharacterInStringLiteralImplEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX10_246IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX10_249IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX10_249IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX3_DL10MemMemImplEPKhmS2_m [AVX, AVX512BW, AVX512F, BMI1]
_ZN3bun9N_AVX3_DL15CopyU16ToU8ImplEPKtmPh [AVX, AVX512BW, AVX512F, AVX512VL, AVX512_VBMI]
Expand All @@ -580,6 +585,7 @@ _ZN3bun9N_AVX3_DL36ContainsNewlineOrNonASCIIOrQuoteImplEPKhm [
_ZN3bun9N_AVX3_DL38IndexOfNewlineOrNonASCIIOrHashOrAtImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX3_DL46IndexOfInterestingCharacterInStringLiteralImplEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX3_DL46IndexOfNeedsEscapeForJavaScriptStringImplQuoteEPKhmh [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX3_DL49IndexOfInterestingCharacterInMultilineCommentImplEPKhm [AVX, AVX512BW, AVX512F]
_ZN3bun9N_AVX3_DL49IndexOfNeedsEscapeForJavaScriptStringImplBacktickEPKhmh [AVX, AVX512BW, AVX512F]


Expand Down
40 changes: 40 additions & 0 deletions src/highway/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ unsafe extern "C" {
quote: u8,
) -> usize;

fn highway_index_of_interesting_character_in_multiline_comment(
text: *const u8,
text_len: usize,
) -> usize;

fn highway_index_of_newline_or_non_ascii(haystack: *const u8, haystack_len: usize) -> usize;

fn highway_index_of_newline_or_non_ascii_or_hash_or_at(
Expand Down Expand Up @@ -121,6 +126,41 @@ pub fn index_of_interesting_character_in_string_literal(
Some(result)
}

/// Useful for scanning the body of `/* ... */` block comments.
/// Scans for:
/// - `*` (potential `*/` terminator)
/// - `\n`, `\r`
/// - Non-ASCII characters (so the caller decodes U+2028/U+2029 and other
/// multi-byte sequences one code point at a time)
#[inline(always)]
pub fn index_of_interesting_character_in_multiline_comment(slice: &[u8]) -> Option<usize> {
if slice.is_empty() {
return None;
}

// SAFETY: slice.ptr/len are a valid readable range.
let result = unsafe {
highway_index_of_interesting_character_in_multiline_comment(slice.as_ptr(), slice.len())
};

if result == slice.len() {
return None;
}

if cfg!(debug_assertions) {
let haystack_char = slice[result];
if !(haystack_char > 127
|| haystack_char == b'*'
|| haystack_char == b'\r'
|| haystack_char == b'\n')
{
panic!("Invalid character found in indexOfInterestingCharacterInMultilineComment");
}
}

Some(result)
}

#[inline(always)]
pub fn index_of_newline_or_non_ascii(haystack: &[u8]) -> Option<usize> {
debug_assert!(!haystack.is_empty());
Expand Down
58 changes: 16 additions & 42 deletions src/js_parser/lexer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2441,25 +2441,14 @@ lexer_impl_header! {
)?;
}
_ => {
if Environment::ENABLE_SIMD {
if self.code_point < 128 {
let remainder = &contents[self.current..];
if remainder.len() >= 512 {
match skip_to_interesting_character_in_multiline_comment(
remainder,
) {
Some(off) => {
self.current += off as usize;
self.end = self.current.saturating_sub(1);
self.step_with(contents);
continue;
}
None => {
self.step_with(contents);
continue;
}
}
}
if self.code_point < 128 {
let remainder = &contents[self.current..];
if remainder.len() >= 512 {
self.current +=
skip_to_interesting_character_in_multiline_comment(remainder);
self.end = self.current.saturating_sub(1);
self.step_with(contents);
continue;
}
}

Expand Down Expand Up @@ -4158,29 +4147,14 @@ impl PragmaArg {
}
}

fn skip_to_interesting_character_in_multiline_comment(text_: &[u8]) -> Option<u32> {
// PERF(port): Zig uses portable @Vector SIMD here. Rust port uses scalar; could
// swap to bun_highway or core::simd. Logic preserved (returns offset of first
// '*' / '\r' / '\n' / non-ASCII byte, truncated to chunks of `ascii_vector_size`).
// TODO(port): SIMD reimplementation
let vsize = strings::ASCII_VECTOR_SIZE;
let text_end_len = text_.len() & !(vsize - 1);
debug_assert!(text_end_len.is_multiple_of(vsize));
debug_assert!(text_end_len <= text_.len());

let mut off: usize = 0;
while off < text_end_len {
let chunk = &text_[off..off + vsize];
for (j, &b) in chunk.iter().enumerate() {
if b > 127 || b == b'*' || b == b'\r' || b == b'\n' {
debug_assert!(j < vsize);
return Some((off + j) as u32);
}
}
off += vsize;
}

Some(off as u32)
/// Byte offset of the next character `scan_multi_line_comment_body` has to
/// inspect one code point at a time: the first `*` (potential `*/`
/// terminator), `\r` / `\n` (newline tracking for ASI), or non-ASCII byte
/// (U+2028/U+2029 and other multi-byte sequences). Returns `text_.len()` when
/// the rest of the input has no such byte — the comment is unterminated, so
/// the caller's next `step()` lands on EOF and reports the error.
fn skip_to_interesting_character_in_multiline_comment(text_: &[u8]) -> usize {
bun_highway::index_of_interesting_character_in_multiline_comment(text_).unwrap_or(text_.len())
}

fn index_of_interesting_character_in_string_literal(text_: &[u8], quote: u8) -> Option<usize> {
Expand Down
Loading
Loading