]>
Commit | Line | Data |
---|---|---|
c295e0f8 XL |
1 | // run-pass |
2 | // only-x86_64 | |
3 | ||
4 | #![feature(const_eval_select)] | |
064997fb | 5 | #![feature(core_intrinsics)] |
c295e0f8 XL |
6 | use std::intrinsics::const_eval_select; |
7 | use std::arch::x86_64::*; | |
8 | use std::mem::transmute; | |
9 | ||
10 | const fn eq_ct(x: [i32; 4], y: [i32; 4]) -> bool { | |
11 | x[0] == y[0] && x[1] == y[1] && x[2] == y[2] && x[3] == y[3] | |
12 | } | |
13 | ||
14 | fn eq_rt(x: [i32; 4], y: [i32; 4]) -> bool { | |
15 | unsafe { | |
16 | let x = _mm_loadu_si128(&x as *const _ as *const _); | |
17 | let y = _mm_loadu_si128(&y as *const _ as *const _); | |
18 | let r = _mm_cmpeq_epi32(x, y); | |
19 | let r = _mm_movemask_ps(transmute(r) ); | |
20 | r == 0b1111 | |
21 | } | |
22 | } | |
23 | ||
24 | const fn eq(x: [i32; 4], y: [i32; 4]) -> bool { | |
25 | unsafe { | |
26 | const_eval_select((x, y), eq_ct, eq_rt) | |
27 | } | |
28 | } | |
29 | ||
30 | fn main() { | |
31 | const X: bool = eq([0, 1, 2, 3], [0, 1, 2, 3]); | |
32 | assert_eq!(X, true); | |
33 | let x = eq([0, 1, 2, 3], [0, 1, 2, 3]); | |
34 | assert_eq!(x, true); | |
35 | ||
36 | const Y: bool = eq([0, 1, 2, 3], [0, 1, 3, 2]); | |
37 | assert_eq!(Y, false); | |
38 | let y = eq([0, 1, 2, 3], [0, 1, 3, 2]); | |
39 | assert_eq!(y, false); | |
40 | } |