From a002273d09bb3ca1af318065a98373d438281c24 Mon Sep 17 00:00:00 2001 From: Simon Klee Date: Fri, 9 Jan 2026 14:56:17 +0100 Subject: [PATCH] perf(utf8): optimize wrap breaks Refactored `findWrapBreaks` to remove data dependencies. The old implementation chained `@select` calls serially. The new one uses bitwise ORs on boolean vectors, allowing the CPU to check all character classes (whitespace, punctuation, brackets) in parallel instructions. --- packages/core/src/zig/utf8.zig | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/core/src/zig/utf8.zig b/packages/core/src/zig/utf8.zig index 56cc42d69..e4d8d1f24 100644 --- a/packages/core/src/zig/utf8.zig +++ b/packages/core/src/zig/utf8.zig @@ -204,29 +204,29 @@ pub fn findWrapBreaks(text: []const u8, result: *WrapBreakResult, width_method: var match_mask: @Vector(vector_len, bool) = @splat(false); // Check whitespace - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat(' ')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('\t')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat(' '))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('\t'))); // Check dashes and slashes - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('-')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('/')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('\\')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('-'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('/'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('\\'))); // Check punctuation - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('.')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat(',')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat(';')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat(':')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('!')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('?')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('.'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat(','))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat(';'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat(':'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('!'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('?'))); // Check brackets - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('(')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat(')')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('[')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat(']')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('{')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); - match_mask = @select(bool, chunk == @as(@Vector(vector_len, u8), @splat('}')), @as(@Vector(vector_len, bool), @splat(true)), match_mask); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('('))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat(')'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('['))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat(']'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('{'))); + match_mask = match_mask | (chunk == @as(@Vector(vector_len, u8), @splat('}'))); // Convert boolean mask to integer bitmask for faster iteration var bitmask: u16 = 0;