Path: blob/main/crates/polars-compute/src/if_then_else/scalar.rs
6939 views
use std::mem::MaybeUninit;12pub fn if_then_else_scalar_rest<T: Copy>(3mask: u64,4if_true: &[T],5if_false: &[T],6out: &mut [MaybeUninit<T>],7) {8assert!(if_true.len() == out.len()); // Removes bounds checks in inner loop.9let true_it = if_true.iter().copied();10let false_it = if_false.iter().copied();11for (i, (t, f)) in true_it.zip(false_it).enumerate() {12let src = if (mask >> i) & 1 != 0 { t } else { f };13out[i] = MaybeUninit::new(src);14}15}1617pub fn if_then_else_broadcast_false_scalar_rest<T: Copy>(18mask: u64,19if_true: &[T],20if_false: T,21out: &mut [MaybeUninit<T>],22) {23assert!(if_true.len() == out.len()); // Removes bounds checks in inner loop.24let true_it = if_true.iter().copied();25for (i, t) in true_it.enumerate() {26let src = if (mask >> i) & 1 != 0 { t } else { if_false };27out[i] = MaybeUninit::new(src);28}29}3031pub fn if_then_else_broadcast_both_scalar_rest<T: Copy>(32mask: u64,33if_true: T,34if_false: T,35out: &mut [MaybeUninit<T>],36) {37for (i, dst) in out.iter_mut().enumerate() {38let src = if (mask >> i) & 1 != 0 {39if_true40} else {41if_false42};43*dst = MaybeUninit::new(src);44}45}4647pub fn if_then_else_scalar_64<T: Copy>(48mask: u64,49if_true: &[T; 64],50if_false: &[T; 64],51out: &mut [MaybeUninit<T>; 64],52) {53// This generated the best autovectorized code on ARM, and branchless everywhere.54if_then_else_scalar_rest(mask, if_true, if_false, out)55}5657pub fn if_then_else_broadcast_false_scalar_64<T: Copy>(58mask: u64,59if_true: &[T; 64],60if_false: T,61out: &mut [MaybeUninit<T>; 64],62) {63// This generated the best autovectorized code on ARM, and branchless everywhere.64if_then_else_broadcast_false_scalar_rest(mask, if_true, if_false, out)65}6667pub fn if_then_else_broadcast_both_scalar_64<T: Copy>(68mask: u64,69if_true: T,70if_false: T,71out: &mut [MaybeUninit<T>; 64],72) {73// This generated the best autovectorized code on ARM, and branchless everywhere.74if_then_else_broadcast_both_scalar_rest(mask, if_true, if_false, out)75}767778