| //@ 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; |
| } |