mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-03 10:47:16 +00:00

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