// only-x86_64 // assembly-output: emit-asm // make sure the feature is not enabled at compile-time // compile-flags: -C opt-level=3 -C target-feature=-sse4.1 -C llvm-args=-x86-asm-syntax=intel #![feature(target_feature_11)] #![crate_type = "rlib"] use std::arch::x86_64::{__m128, _mm_blend_ps}; #[no_mangle] pub unsafe fn sse41_blend_nofeature(x: __m128, y: __m128) -> __m128 { let f = { // check that _mm_blend_ps is not being inlined into the closure // CHECK-LABEL: {{sse41_blend_nofeature.*closure.*:}} // CHECK-NOT: blendps // CHECK: {{call .*_mm_blend_ps.*}} // CHECK-NOT: blendps // CHECK: ret #[inline(never)] |x, y| _mm_blend_ps(x, y, 0b0101) }; f(x, y) } #[target_feature(enable = "sse4.1")] pub fn sse41_blend_noinline(x: __m128, y: __m128) -> __m128 { let f = { // check that _mm_blend_ps is being inlined into the closure // CHECK-LABEL: {{sse41_blend_noinline.*closure.*:}} // CHECK-NOT: _mm_blend_ps // CHECK: blendps // CHECK-NOT: _mm_blend_ps // CHECK: ret #[inline(never)] |x, y| unsafe { _mm_blend_ps(x, y, 0b0101) } }; f(x, y) } #[no_mangle] #[target_feature(enable = "sse4.1")] pub fn sse41_blend_doinline(x: __m128, y: __m128) -> __m128 { // check that the closure and _mm_blend_ps are being inlined into the function // CHECK-LABEL: sse41_blend_doinline: // CHECK-NOT: {{sse41_blend_doinline.*closure.*}} // CHECK-NOT: _mm_blend_ps // CHECK: blendps // CHECK-NOT: {{sse41_blend_doinline.*closure.*}} // CHECK-NOT: _mm_blend_ps // CHECK: ret let f = { #[inline] |x, y| unsafe { _mm_blend_ps(x, y, 0b0101) } }; f(x, y) }