|
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