Move select_unpredictable
to the hint
module · rust-lang/rust@5d90ccb (original) (raw)
`@@ -2,7 +2,7 @@
`
2
2
``
3
3
`use crate::mem::{self, ManuallyDrop, MaybeUninit};
`
4
4
`use crate::slice::sort::shared::FreezeMarker;
`
5
``
`-
use crate::{intrinsics, ptr, slice};
`
``
5
`+
use crate::{hint, intrinsics, ptr, slice};
`
6
6
``
7
7
`// It's important to differentiate between SMALL_SORT_THRESHOLD performance for
`
8
8
`// small slices and small-sort performance sorting small sub-slices as part of
`
`@@ -408,8 +408,8 @@ where
`
408
408
`// }
`
409
409
``
410
410
`// The goal is to generate cmov instructions here.
`
411
``
`-
let v_a_swap = should_swap.select_unpredictable(v_b, v_a);
`
412
``
`-
let v_b_swap = should_swap.select_unpredictable(v_a, v_b);
`
``
411
`+
let v_a_swap = hint::select_unpredictable(should_swap, v_b, v_a);
`
``
412
`+
let v_b_swap = hint::select_unpredictable(should_swap, v_a, v_b);
`
413
413
``
414
414
`let v_b_swap_tmp = ManuallyDrop::new(ptr::read(v_b_swap));
`
415
415
` ptr::copy(v_a_swap, v_a, 1);
`
`@@ -640,15 +640,15 @@ pub unsafe fn sort4_stable<T, F: FnMut(&T, &T) -> bool>(
`
640
640
`// 1, 1 | c b a d
`
641
641
`let c3 = is_less(&*c, &*a);
`
642
642
`let c4 = is_less(&*d, &*b);
`
643
``
`-
let min = c3.select_unpredictable(c, a);
`
644
``
`-
let max = c4.select_unpredictable(b, d);
`
645
``
`-
let unknown_left = c3.select_unpredictable(a, c4.select_unpredictable(c, b));
`
646
``
`-
let unknown_right = c4.select_unpredictable(d, c3.select_unpredictable(b, c));
`
``
643
`+
let min = hint::select_unpredictable(c3, c, a);
`
``
644
`+
let max = hint::select_unpredictable(c4, b, d);
`
``
645
`+
let unknown_left = hint::select_unpredictable(c3, a, hint::select_unpredictable(c4, c, b));
`
``
646
`+
let unknown_right = hint::select_unpredictable(c4, d, hint::select_unpredictable(c3, b, c));
`
647
647
``
648
648
`// Sort the last two unknown elements.
`
649
649
`let c5 = is_less(&*unknown_right, &*unknown_left);
`
650
``
`-
let lo = c5.select_unpredictable(unknown_right, unknown_left);
`
651
``
`-
let hi = c5.select_unpredictable(unknown_left, unknown_right);
`
``
650
`+
let lo = hint::select_unpredictable(c5, unknown_right, unknown_left);
`
``
651
`+
let hi = hint::select_unpredictable(c5, unknown_left, unknown_right);
`
652
652
``
653
653
` ptr::copy_nonoverlapping(min, dst, 1);
`
654
654
` ptr::copy_nonoverlapping(lo, dst.add(1), 1);
`