| //@ build-pass |
| //@ compile-flags: -Copt-level=3 |
| //@ only-x86_64 |
| // ignore-tidy-linelength |
| |
| // regression test for https://github.com/rust-lang/rust/issues/110707 |
| // in --release we were optimizing to invalid bitcasts, due to a combination of MIR inlining and |
| // mostly bad repr(simd) lowering which prevented even basic splats from working |
| |
| #![crate_type = "rlib"] |
| #![feature(portable_simd)] |
| use std::simd::*; |
| use std::arch::x86_64::*; |
| |
| #[target_feature(enable = "sse4.1")] |
| pub unsafe fn fast_round_sse(i: f32x8) -> f32x8 { |
| let a = i.to_array(); |
| let [low, high]: [[f32; 4]; 2] = |
| unsafe { std::mem::transmute::<[f32; 8], [[f32; 4]; 2]>(a) }; |
| |
| let low = f32x4::from(_mm_round_ps::<{_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC}>(f32x4::from_array(low).into())); |
| let high = f32x4::from(_mm_round_ps::<{_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC}>(f32x4::from_array(high).into())); |
| |
| let a: [f32; 8] = |
| unsafe { std::mem::transmute::<[[f32; 4]; 2], [f32; 8]>([low.to_array(), high.to_array()]) }; |
| f32x8::from_array(a) |
| } |