1- use std:: arch:: x86_64:: * ;
1+ use std:: { arch:: x86_64:: * , mem :: MaybeUninit } ;
22
33use aoc_runner_derive:: aoc;
44
@@ -17,8 +17,10 @@ const KEPT_BITS: i8 = 0b011;
1717unsafe fn part1_inner ( s : & [ u8 ] ) -> u64 {
1818 let mut sum = 0 ;
1919
20- let mut keys = heapless:: Vec :: < __m256i , 512 > :: new ( ) ;
21- let mut holes = heapless:: Vec :: < __m256i , 512 > :: new ( ) ;
20+ let mut keys = [ MaybeUninit :: < __m256i > :: uninit ( ) ; 512 ] ;
21+ let mut keys_i = 0 ;
22+ let mut holes = [ MaybeUninit :: < __m256i > :: uninit ( ) ; 512 ] ;
23+ let mut holes_i = 0 ;
2224
2325 let mut i = 0 ;
2426
@@ -43,8 +45,9 @@ unsafe fn part1_inner(s: &[u8]) -> u64 {
4345 ) ;
4446
4547 if is_key {
46- for o in & holes {
47- let collisions = _mm256_cmpeq_epi8 ( d, * o) ;
48+ for i in 0 ..holes_i {
49+ let o = holes. get_unchecked ( i) . assume_init_read ( ) ;
50+ let collisions = _mm256_cmpeq_epi8 ( d, o) ;
4851 let collisions = _mm256_movemask_epi8 ( collisions) ;
4952 sum += ( collisions == 0 ) as u64 ;
5053 }
@@ -59,10 +62,12 @@ unsafe fn part1_inner(s: &[u8]) -> u64 {
5962 0 , 0 , 0 , 0 , 0 , -1 , -1 , -1 ,
6063 ) ,
6164 ) ;
62- keys. push_unchecked ( d) ;
65+ keys. get_unchecked_mut ( keys_i) . write ( d) ;
66+ keys_i += 1 ;
6367 } else {
64- for o in & keys {
65- let collisions = _mm256_cmpeq_epi8 ( d, * o) ;
68+ for i in 0 ..keys_i {
69+ let o = keys. get_unchecked ( i) . assume_init_read ( ) ;
70+ let collisions = _mm256_cmpeq_epi8 ( d, o) ;
6671 let collisions = _mm256_movemask_epi8 ( collisions) ;
6772 sum += ( collisions == 0 ) as u64 ;
6873 }
@@ -77,7 +82,8 @@ unsafe fn part1_inner(s: &[u8]) -> u64 {
7782 0 , 0 , 0 , 0 , 0 , -1 , -1 , -1 ,
7883 ) ,
7984 ) ;
80- holes. push_unchecked ( d) ;
85+ holes. get_unchecked_mut ( holes_i) . write ( d) ;
86+ holes_i += 1 ;
8187 }
8288
8389 i += DS ;
0 commit comments