2023-09-22 21:19:39 +00:00
|
|
|
//@ only-x86_64
|
2023-10-23 12:23:28 +00:00
|
|
|
//@ ignore-sgx Tests incompatible with LVI mitigations
|
2023-09-22 21:19:39 +00:00
|
|
|
//@ 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
|
2024-05-29 03:57:23 +00:00
|
|
|
#[inline(never)]
|
|
|
|
|x, y| _mm_blend_ps(x, y, 0b0101)
|
2023-09-22 21:19:39 +00:00
|
|
|
};
|
|
|
|
f(x, y)
|
|
|
|
}
|
|
|
|
|
2023-10-07 00:29:42 +00:00
|
|
|
#[no_mangle]
|
2023-09-22 21:19:39 +00:00
|
|
|
#[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
|
2024-05-29 03:57:23 +00:00
|
|
|
#[inline(never)]
|
|
|
|
|x, y| unsafe { _mm_blend_ps(x, y, 0b0101) }
|
2023-09-22 21:19:39 +00:00
|
|
|
};
|
|
|
|
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 = {
|
2024-05-29 03:57:23 +00:00
|
|
|
#[inline]
|
|
|
|
|x, y| unsafe { _mm_blend_ps(x, y, 0b0101) }
|
2023-09-22 21:19:39 +00:00
|
|
|
};
|
|
|
|
f(x, y)
|
|
|
|
}
|