File tree Expand file tree Collapse file tree 1 file changed +33
-0
lines changed Expand file tree Collapse file tree 1 file changed +33
-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: 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+ }
You can’t perform that action at this time.
0 commit comments