summaryrefslogtreecommitdiffstats
path: root/tests/assembly/closure-inherit-target-feature.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/assembly/closure-inherit-target-feature.rs')
-rw-r--r--tests/assembly/closure-inherit-target-feature.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/assembly/closure-inherit-target-feature.rs b/tests/assembly/closure-inherit-target-feature.rs
new file mode 100644
index 000000000..7acda76e2
--- /dev/null
+++ b/tests/assembly/closure-inherit-target-feature.rs
@@ -0,0 +1,60 @@
+// only-x86_64
+// ignore-sgx Tests incompatible with LVI mitigations
+// 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)
+}
+
+#[no_mangle]
+#[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)
+}