(a: &[u64], b: &[u64], out: &mut [u64])
| 163 | #[cfg(target_arch = "x86_64")] |
| 164 | #[target_feature(enable = "avx2")] |
| 165 | unsafe fn avx2_or_inner(a: &[u64], b: &[u64], out: &mut [u64]) { |
| 166 | use std::arch::x86_64::*; |
| 167 | unsafe { |
| 168 | let len = a.len().min(b.len()).min(out.len()); |
| 169 | let chunks = len / 4; |
| 170 | for i in 0..chunks { |
| 171 | let va = _mm256_loadu_si256(a.as_ptr().add(i * 4).cast()); |
| 172 | let vb = _mm256_loadu_si256(b.as_ptr().add(i * 4).cast()); |
| 173 | let result = _mm256_or_si256(va, vb); |
| 174 | _mm256_storeu_si256(out.as_mut_ptr().add(i * 4).cast(), result); |
| 175 | } |
| 176 | for i in (chunks * 4)..len { |
| 177 | let va = if i < a.len() { a[i] } else { 0 }; |
| 178 | let vb = if i < b.len() { b[i] } else { 0 }; |
| 179 | out[i] = va | vb; |
| 180 | } |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | #[cfg(target_arch = "x86_64")] |
| 185 | fn avx2_or(a: &[u64], b: &[u64], out: &mut [u64]) { |
no test coverage detected