| //@ compile-flags: -Copt-level=3 |
| #![crate_type = "lib"] |
| #![no_std] |
| #![feature(repr_simd, core_intrinsics)] |
| use core::intrinsics::simd::simd_splat; |
| |
| #[path = "../../auxiliary/minisimd.rs"] |
| mod minisimd; |
| use minisimd::*; |
| |
| // Test that `simd_splat` produces the canonical LLVM splat sequence. |
| |
| #[no_mangle] |
| unsafe fn int(x: u16) -> u16x2 { |
| // CHECK-LABEL: int |
| // CHECK: start: |
| // CHECK-NEXT: %0 = insertelement <2 x i16> poison, i16 %x, i64 0 |
| // CHECK-NEXT: %1 = shufflevector <2 x i16> %0, <2 x i16> poison, <2 x i32> zeroinitializer |
| // CHECK-NEXT: store |
| // CHECK-NEXT: ret |
| simd_splat(x) |
| } |
| |
| #[no_mangle] |
| unsafe fn float(x: f32) -> f32x4 { |
| // CHECK-LABEL: float |
| // CHECK: start: |
| // CHECK-NEXT: %0 = insertelement <4 x float> poison, float %x, i64 0 |
| // CHECK-NEXT: %1 = shufflevector <4 x float> %0, <4 x float> poison, <4 x i32> zeroinitializer |
| // CHECK-NEXT: store |
| // CHECK-NEXT: ret |
| simd_splat(x) |
| } |