forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#116078 - eduardosm:closure-inherit-target-fea…
…ture, r=Mark-Simulacrum Add assembly test to make sure that inlining works as expected when closures inherit target features Closes rust-lang#108338 (the added test proves that it is working correctly)
- Loading branch information
Showing
1 changed file
with
58 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
// only-x86_64 | ||
// assembly-output: emit-asm | ||
// make sure the feature is not enabled at compile-time | ||
// compile-flags: -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) | ||
} |