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);

`