| 
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