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