summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jose Colon Rodriguez2024-02-17 08:33:54 -0400
committerGravatar Jose Colon Rodriguez2024-02-17 08:33:54 -0400
commit7abd2683bdf8a3c66501e0a2cc644b9ca1ee5ff4 (patch)
tree4a51f51963d877ad1274d1b15bc6f49b8c6efe8d
parentSIMD strWidth ASCII optimization (diff)
downloadzg-7abd2683bdf8a3c66501e0a2cc644b9ca1ee5ff4.tar.gz
zg-7abd2683bdf8a3c66501e0a2cc644b9ca1ee5ff4.tar.xz
zg-7abd2683bdf8a3c66501e0a2cc644b9ca1ee5ff4.zip
isAsciiOnly SIMD tweaks
-rw-r--r--src/display_width.zig8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/display_width.zig b/src/display_width.zig
index b96f872..aed0ef1 100644
--- a/src/display_width.zig
+++ b/src/display_width.zig
@@ -15,8 +15,12 @@ pub fn codePointWidth(cp: u21) i3 {
15 return dwp.stage_2[dwp.stage_1[cp >> 8] + (cp & 0xff)]; 15 return dwp.stage_2[dwp.stage_1[cp >> 8] + (cp & 0xff)];
16} 16}
17 17
18// Returns true if `str` only contains ASCII bytes. Uses SIMD if possible.
18fn isAsciiOnly(str: []const u8) bool { 19fn isAsciiOnly(str: []const u8) bool {
19 const vec_len = simd.suggestVectorLength(u8) orelse @panic("No SIMD support."); 20 const vec_len = simd.suggestVectorLength(u8) orelse return for (str) |b| {
21 if (b > 127) break false;
22 } else true;
23
20 const Vec = @Vector(vec_len, u8); 24 const Vec = @Vector(vec_len, u8);
21 var i: usize = 0; 25 var i: usize = 0;
22 26
@@ -25,7 +29,7 @@ fn isAsciiOnly(str: []const u8) bool {
25 if (b > 127) break false; 29 if (b > 127) break false;
26 } else true; 30 } else true;
27 31
28 const v1 = str[i..].ptr[0..vec_len].*; 32 const v1 = str[0..vec_len].*;
29 const v2: Vec = @splat(127); 33 const v2: Vec = @splat(127);
30 if (@reduce(.Or, v1 > v2)) return false; 34 if (@reduce(.Or, v1 > v2)) return false;
31 } 35 }