about summary refs log tree commit diff
path: root/tests/codegen
diff options
context:
space:
mode:
authorokaneco <47607823+okaneco@users.noreply.github.com>2024-09-26 19:39:14 -0400
committerokaneco <47607823+okaneco@users.noreply.github.com>2024-11-06 02:22:00 -0500
commit1b5c02b7578879ebfcd54fdc6a4f86c49d2d9ecd (patch)
tree773c8aa893974704989785a470d9f60a2326da8e /tests/codegen
parentd7d67ad14b7c69325a3377bea83b9919398f9588 (diff)
downloadrust-1b5c02b7578879ebfcd54fdc6a4f86c49d2d9ecd.tar.gz
rust-1b5c02b7578879ebfcd54fdc6a4f86c49d2d9ecd.zip
Add `is_ascii` function optimized for x86-64 for [u8]
The new `is_ascii` function is optimized to use the
`pmovmskb` vector instruction which tests the high bit in a lane.
This corresponds to the same check of whether a byte is ASCII so
ASCII validity checking can be vectorized. This instruction
does not exist on other platforms so it is likely to regress performance
and is gated to all(target_arch = "x86_64", target_feature = "sse2").

Add codegen test
Remove crate::mem import for functions included in the prelude
Diffstat (limited to 'tests/codegen')
-rw-r--r--tests/codegen/slice-is-ascii.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/tests/codegen/slice-is-ascii.rs b/tests/codegen/slice-is-ascii.rs
new file mode 100644
index 00000000000..b1e97154609
--- /dev/null
+++ b/tests/codegen/slice-is-ascii.rs
@@ -0,0 +1,16 @@
+//@ only-x86_64
+//@ compile-flags: -C opt-level=3
+#![crate_type = "lib"]
+
+/// Check that the fast-path of `is_ascii` uses a `pmovmskb` instruction.
+/// Platforms lacking an equivalent instruction use other techniques for
+/// optimizing `is_ascii`.
+// CHECK-LABEL: @is_ascii_autovectorized
+#[no_mangle]
+pub fn is_ascii_autovectorized(s: &[u8]) -> bool {
+    // CHECK: load <32 x i8>
+    // CHECK-NEXT: icmp slt <32 x i8>
+    // CHECK-NEXT: bitcast <32 x i1>
+    // CHECK-NEXT: icmp eq i32
+    s.is_ascii()
+}