diff options
| author | okaneco <47607823+okaneco@users.noreply.github.com> | 2024-09-26 19:39:14 -0400 |
|---|---|---|
| committer | okaneco <47607823+okaneco@users.noreply.github.com> | 2024-11-06 02:22:00 -0500 |
| commit | 1b5c02b7578879ebfcd54fdc6a4f86c49d2d9ecd (patch) | |
| tree | 773c8aa893974704989785a470d9f60a2326da8e /tests/codegen | |
| parent | d7d67ad14b7c69325a3377bea83b9919398f9588 (diff) | |
| download | rust-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.rs | 16 |
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() +} |
