38 lines
890 B
Rust
38 lines
890 B
Rust
//@ compile-flags: -O
|
|
//@ assembly-output: emit-asm
|
|
//@ only-x86_64
|
|
|
|
#![crate_type = "lib"]
|
|
#![feature(struct_target_features)]
|
|
|
|
// Check that a struct_target_features type causes the compiler to effectively inline intrinsics.
|
|
|
|
use std::arch::x86_64::*;
|
|
|
|
#[target_feature(enable = "avx")]
|
|
struct Avx {}
|
|
|
|
#[target_feature(enable = "fma")]
|
|
struct Fma {}
|
|
|
|
pub fn add_simple(_: Avx, v: __m256) -> __m256 {
|
|
// CHECK-NOT: call
|
|
// CHECK: vaddps
|
|
unsafe { _mm256_add_ps(v, v) }
|
|
}
|
|
|
|
pub fn add_complex_type(_: (&Avx, ()), v: __m256) -> __m256 {
|
|
// CHECK-NOT: call
|
|
// CHECK: vaddps
|
|
unsafe { _mm256_add_ps(v, v) }
|
|
}
|
|
|
|
pub fn add_fma_combined(_: (&Avx, &Fma), v: __m256) -> (__m256, __m256) {
|
|
// CHECK-NOT: call
|
|
// CHECK-DAG: vaddps
|
|
let r1 = unsafe { _mm256_add_ps(v, v) };
|
|
// CHECK-DAG: vfmadd213ps
|
|
let r2 = unsafe { _mm256_fmadd_ps(v, v, v) };
|
|
(r1, r2)
|
|
}
|