Skip to content

Commit baf1eba

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

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
//@ assembly-output: emit-asm
9+
//@ only-x86_64-unknown-linux-gnu
10+
//@ compile-flags: -C opt-level=3
11+
12+
#![crate_type = "lib"]
13+
14+
use std::arch::x86_64 as arch;
15+
16+
// CHECK-NOT: jmp
17+
// CHECK-NOT: call
18+
// CHECK: pclmulqdq
19+
// CHECK: ret
20+
21+
#[target_feature(enable = "pclmulqdq", enable = "sse2", enable = "sse4.1")]
22+
#[no_mangle]
23+
pub unsafe fn reduce128_caller(
24+
a: arch::__m128i,
25+
b: arch::__m128i,
26+
keys: arch::__m128i,
27+
) -> arch::__m128i {
28+
reduce128(a, b, keys)
29+
}
30+
31+
unsafe fn reduce128(a: arch::__m128i, b: arch::__m128i, keys: arch::__m128i) -> arch::__m128i {
32+
let t1 = arch::_mm_clmulepi64_si128(a, keys, 0x00);
33+
let t2 = arch::_mm_clmulepi64_si128(a, keys, 0x11);
34+
arch::_mm_xor_si128(arch::_mm_xor_si128(b, t1), t2)
35+
}

0 commit comments

Comments
 (0)