|
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);
|
|
0 commit comments