Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![feature(stdsimd)]
- use std::simd::*;
- fn ascii(input: &[u8]) -> bool {
- let len = input.len();
- let amax = u8x16::splat(0x80);
- let mut err = u8x16::splat(0);
- let mut i = 0;
- // Doing this in faster:
- // input.simd_iter().simd_reduce(u8s(0), u8s(0), |acc, v| acc | v).ge(u8s(0x80)).
- while i + 15 < len {
- let n = u8x16::load_aligned(&input[i..i+15]);
- err |= n;
- i += 16;
- }
- let err: m8x16 = err.ge(amax);
- let mut tail_has_char: u8 = 0;
- while i < len {
- tail_has_char |= input[i];
- i += 1;
- }
- err.all() || tail_has_char & 0x80 == 0
- }
- fn main() {
- let bs = b"Hello\x99";
- println!("{:?}", ascii(bs));
- }
Add Comment
Please, Sign In to add comment