Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use packed_simd::{m8x64, shuffle, u8x64};
- fn shuffle_right(v: u8x64) -> u8x64 {
- shuffle!(
- v,
- [
- 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62
- ]
- )
- }
- fn shuffle_left(v: u8x64) -> u8x64 {
- shuffle!(
- v,
- [
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0
- ]
- )
- }
- fn step(src: &[u8x64; 52], dst: &mut [u8x64; 52]) {
- let mask = m8x64::new(
- false, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
- true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
- true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
- true, true, true, true, true, true, false, false, false, false, false, false, false, false,
- false, false, false, false, false,
- );
- let open = u8x64::splat(0);
- let tree = u8x64::splat(1);
- let lumber = u8x64::splat(2);
- for (dst, src) in dst[1..51].iter_mut().zip(src.windows(3)) {
- let t = src[0];
- let c = src[1];
- let b = src[2];
- let tl = shuffle_left(t);
- let tr = shuffle_right(t);
- let l = shuffle_left(c);
- let r = shuffle_right(c);
- let bl = shuffle_left(b);
- let br = shuffle_right(b);
- let tree_tl = tl & tree;
- let tree_tr = tr & tree;
- let tree_l = l & tree;
- let tree_r = r & tree;
- let tree_bl = bl & tree;
- let tree_br = br & tree;
- let tree_t = t & tree;
- let tree_b = b & tree;
- let tree_counts = tree_tl + tree_tr + tree_l + tree_r + tree_bl + tree_br + tree_t + tree_b;
- let new_open = tree_counts.ge(u8x64::splat(3)).select(tree, open);
- let lumber_tl = tl & lumber;
- let lumber_tr = tr & lumber;
- let lumber_l = l & lumber;
- let lumber_r = r & lumber;
- let lumber_bl = bl & lumber;
- let lumber_br = br & lumber;
- let lumber_t = t & lumber;
- let lumber_b = b & lumber;
- let lumber_counts_times_two = lumber_tl
- + lumber_tr
- + lumber_l
- + lumber_r
- + lumber_bl
- + lumber_br
- + lumber_t
- + lumber_b;
- let new_tree = lumber_counts_times_two
- .ge(u8x64::splat(6))
- .select(lumber, tree);
- let new_lumber = (tree_counts.ge(u8x64::splat(1))
- | lumber_counts_times_two.ge(u8x64::splat(2)))
- .select(lumber, open);
- let is_lumber = c.eq(lumber);
- let is_tree = c.eq(tree);
- let new_cells = is_tree.select(new_tree, is_lumber.select(new_lumber, new_open));
- *dst = mask.select(new_cells, u8x64::splat(0));
- }
- }
Add Comment
Please, Sign In to add comment