mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 11:07:42 +00:00
32 lines
930 B
Rust
32 lines
930 B
Rust
![]() |
//@compile-flags: -Copt-level=3
|
||
|
|
||
|
#![crate_type = "lib"]
|
||
|
#![feature(repr_simd, core_intrinsics)]
|
||
|
|
||
|
#[allow(non_camel_case_types)]
|
||
|
#[derive(Clone, Copy)]
|
||
|
#[repr(simd)]
|
||
|
struct i32x4([i32; 4]);
|
||
|
|
||
|
#[inline(always)]
|
||
|
fn to_array4(a: i32x4) -> [i32; 4] {
|
||
|
a.0
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: simd_add_self_then_return_array(
|
||
|
// CHECK-SAME: ptr{{.+}}sret{{.+}}%[[RET:.+]],
|
||
|
// CHECK-SAME: ptr{{.+}}%a)
|
||
|
#[no_mangle]
|
||
|
pub fn simd_add_self_then_return_array(a: &i32x4) -> [i32; 4] {
|
||
|
// It would be nice to just ban `.0` into simd types,
|
||
|
// but until we do this has to keep working.
|
||
|
// See also <https://github.com/rust-lang/rust/issues/105439>
|
||
|
|
||
|
// CHECK: %[[T1:.+]] = load <4 x i32>, ptr %a
|
||
|
// CHECK: %[[T2:.+]] = shl <4 x i32> %[[T1]], {{splat \(i32 1\)|<i32 1, i32 1, i32 1, i32 1>}}
|
||
|
// CHECK: store <4 x i32> %[[T2]], ptr %[[RET]]
|
||
|
let a = *a;
|
||
|
let b = unsafe { core::intrinsics::simd::simd_add(a, a) };
|
||
|
to_array4(b)
|
||
|
}
|