Skip to content

Commit c2da855

Browse files
committed
regression test for intrinsics may not inline properly on pclmulqdq
1 parent dc0bae1 commit c2da855

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Test for pclmulqdq intrinsics inlining across target_feature boundaries
2+
// Issue: https://github.com/rust-lang/rust/issues/139029
3+
//
4+
// When a function with target_feature calls another function without matching
5+
// target_feature attributes, the intrinsics may not inline properly, leading
6+
// to function calls instead of direct instructions.
7+
8+
//@ only-x86_64
9+
//@ compile-flags: -C opt-level=3
10+
11+
#![crate_type = "lib"]
12+
13+
use std::arch::x86_64 as arch;
14+
15+
// CHECK-label: @reduce128_caller
16+
// CHECK-NOT: fastcc
17+
// CHECK-NOT: define internal
18+
// CHECK: ret
19+
#[target_feature(enable = "pclmulqdq", enable = "sse2", enable = "sse4.1")]
20+
#[no_mangle]
21+
pub unsafe fn reduce128_caller(
22+
a: arch::__m128i,
23+
b: arch::__m128i,
24+
keys: arch::__m128i,
25+
) -> arch::__m128i {
26+
reduce128(a, b, keys)
27+
}
28+
29+
unsafe fn reduce128(a: arch::__m128i, b: arch::__m128i, keys: arch::__m128i) -> arch::__m128i {
30+
let t1 = arch::_mm_clmulepi64_si128(a, keys, 0x00);
31+
let t2 = arch::_mm_clmulepi64_si128(a, keys, 0x11);
32+
arch::_mm_xor_si128(arch::_mm_xor_si128(b, t1), t2)
33+
}

0 commit comments

Comments
 (0)