Guest User

Untitled

a guest
May 22nd, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.70 KB | None | 0 0
  1. #![feature(stdsimd)]
  2. use std::simd::*;
  3.  
  4. fn ascii(input: &[u8]) -> bool {
  5. let len = input.len();
  6. let amax = u8x16::splat(0x80);
  7. let mut err = u8x16::splat(0);
  8.  
  9. let mut i = 0;
  10.  
  11. // Doing this in faster:
  12. // input.simd_iter().simd_reduce(u8s(0), u8s(0), |acc, v| acc | v).ge(u8s(0x80)).
  13. while i + 15 < len {
  14. let n = u8x16::load_aligned(&input[i..i+15]);
  15. err |= n;
  16. i += 16;
  17. }
  18.  
  19. let err: m8x16 = err.ge(amax);
  20.  
  21. let mut tail_has_char: u8 = 0;
  22. while i < len {
  23. tail_has_char |= input[i];
  24. i += 1;
  25. }
  26.  
  27. err.all() || tail_has_char & 0x80 == 0
  28. }
  29.  
  30. fn main() {
  31. let bs = b"Hello\x99";
  32.  
  33. println!("{:?}", ascii(bs));
  34. }
Add Comment
Please, Sign In to add comment