| //@ revisions: x86_64 aarch64 |
| //@ assembly-output: emit-asm |
| //@ compile-flags: --crate-type=lib -O |
| //@[aarch64] only-aarch64 |
| //@[x86_64] only-x86_64 |
| //@[x86_64] compile-flags: -Ctarget-feature=+sse3 |
| //@ ignore-sgx Test incompatible with LVI mitigations |
| #![feature(portable_simd)] |
| #![feature(core_intrinsics)] |
| use std::intrinsics::simd as intrinsics; |
| use std::simd::*; |
| // Regression test for https://github.com/rust-lang/rust/issues/130028 |
| // This intrinsic produces much worse code if you use +0.0 instead of -0.0 because |
| // +0.0 isn't as easy to algebraically reassociate, even using LLVM's reassoc attribute! |
| // It would emit about an extra fadd, depending on the architecture. |
| |
| // CHECK-LABEL: reduce_fadd_negative_zero |
| pub unsafe fn reduce_fadd_negative_zero(v: f32x4) -> f32 { |
| // x86_64: addps |
| // x86_64-NEXT: movshdup |
| // x86_64-NEXT: addss |
| // x86_64-NOT: xorps |
| |
| // aarch64: faddp |
| // aarch64-NEXT: faddp |
| |
| // CHECK-NOT: {{f?}}add{{p?s*}} |
| // CHECK: ret |
| intrinsics::simd_reduce_add_unordered(v) |
| } |