File tree Expand file tree Collapse file tree 1 file changed +34
-0
lines changed Expand file tree Collapse file tree 1 file changed +34
-0
lines changed Original file line number Diff line number Diff line change 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: call
17+ // CHECK: call <2 x i64> @llvm.x86.pclmulqdq
18+ // CHECK: call <2 x i64> @llvm.x86.pclmulqdq
19+ // CHECK-NOT: call
20+ #[ target_feature( enable = "pclmulqdq" , enable = "sse2" , enable = "sse4.1" ) ]
21+ #[ no_mangle]
22+ pub unsafe fn reduce128_caller (
23+ a : arch:: __m128i ,
24+ b : arch:: __m128i ,
25+ keys : arch:: __m128i ,
26+ ) -> arch:: __m128i {
27+ reduce128 ( a, b, keys)
28+ }
29+
30+ unsafe fn reduce128 ( a : arch:: __m128i , b : arch:: __m128i , keys : arch:: __m128i ) -> arch:: __m128i {
31+ let t1 = arch:: _mm_clmulepi64_si128 ( a, keys, 0x00 ) ;
32+ let t2 = arch:: _mm_clmulepi64_si128 ( a, keys, 0x11 ) ;
33+ arch:: _mm_xor_si128 ( arch:: _mm_xor_si128 ( b, t1) , t2)
34+ }
You can’t perform that action at this time.
0 commit comments