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