mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	 291da71b2a
			
		
	
	
		291da71b2a
		
	
	
	
	
		
			
			This uses the feature gate for https://github.com/rust-lang/rust/issues/143352, but is described in https://github.com/rust-lang/rfcs/pull/3820 which is strongly tied to the experiment.
		
			
				
	
	
		
			34 lines
		
	
	
		
			817 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			817 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ only-x86_64
 | |
| //@ assembly-output: emit-asm
 | |
| //@ compile-flags: -C opt-level=3 -C target-feature=-avx2
 | |
| //@ ignore-sgx Tests incompatible with LVI mitigations
 | |
| 
 | |
| #![feature(effective_target_features)]
 | |
| 
 | |
| use std::arch::x86_64::{__m256i, _mm256_add_epi32, _mm256_setzero_si256};
 | |
| use std::ops::Add;
 | |
| 
 | |
| #[derive(Clone, Copy)]
 | |
| struct AvxU32(__m256i);
 | |
| 
 | |
| impl Add<AvxU32> for AvxU32 {
 | |
|     type Output = Self;
 | |
| 
 | |
|     #[no_mangle]
 | |
|     #[inline(never)]
 | |
|     #[unsafe(force_target_feature(enable = "avx2"))]
 | |
|     fn add(self, oth: AvxU32) -> AvxU32 {
 | |
|         // CHECK-LABEL: add:
 | |
|         // CHECK-NOT: callq
 | |
|         // CHECK: vpaddd
 | |
|         // CHECK: retq
 | |
|         Self(_mm256_add_epi32(self.0, oth.0))
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     assert!(is_x86_feature_detected!("avx2"));
 | |
|     let v = AvxU32(unsafe { _mm256_setzero_si256() });
 | |
|     v + v;
 | |
| }
 |