]>
Commit | Line | Data |
---|---|---|
fc512014 XL |
1 | // compile-flags: -C no-prepopulate-passes |
2 | ||
3 | #![crate_type = "lib"] | |
4 | ||
5 | #![feature(repr_simd, platform_intrinsics, min_const_generics)] | |
6 | #![allow(non_camel_case_types)] | |
7 | ||
8 | #[repr(simd)] | |
9 | #[derive(Copy, Clone)] | |
10 | pub struct M(pub f32, pub f32, pub f32, pub f32); | |
11 | ||
12 | #[repr(simd)] | |
13 | #[derive(Copy, Clone)] | |
14 | pub struct S<const N: usize>([f32; N]); | |
15 | ||
16 | extern "platform-intrinsic" { | |
17 | fn simd_extract<T, U>(x: T, idx: u32) -> U; | |
18 | fn simd_insert<T, U>(x: T, idx: u32, b: U) -> T; | |
19 | } | |
20 | ||
21 | // CHECK-LABEL: @extract_m | |
22 | #[no_mangle] | |
23 | pub unsafe fn extract_m(v: M, i: u32) -> f32 { | |
24 | // CHECK: extractelement <4 x float> %{{v|_3}}, i32 %i | |
25 | simd_extract(v, i) | |
26 | } | |
27 | ||
28 | // CHECK-LABEL: @extract_s | |
29 | #[no_mangle] | |
30 | pub unsafe fn extract_s(v: S<4>, i: u32) -> f32 { | |
31 | // CHECK: extractelement <4 x float> %{{v|_3}}, i32 %i | |
32 | simd_extract(v, i) | |
33 | } | |
34 | ||
35 | // CHECK-LABEL: @insert_m | |
36 | #[no_mangle] | |
37 | pub unsafe fn insert_m(v: M, i: u32, j: f32) -> M { | |
38 | // CHECK: insertelement <4 x float> %{{v|_4}}, float %j, i32 %i | |
39 | simd_insert(v, i, j) | |
40 | } | |
41 | ||
42 | // CHECK-LABEL: @insert_s | |
43 | #[no_mangle] | |
44 | pub unsafe fn insert_s(v: S<4>, i: u32, j: f32) -> S<4> { | |
45 | // CHECK: insertelement <4 x float> %{{v|_4}}, float %j, i32 %i | |
46 | simd_insert(v, i, j) | |
47 | } |