#![allow(deprecated)]
use archmage::prelude::*;
#[arcane]
fn add_v3(_token: X64V3Token, a: f32, b: f32) -> f32 {
a + b
}
fn add_scalar(_token: ScalarToken, a: f32, b: f32) -> f32 {
a + b
}
#[arcane]
fn add_neon(_token: NeonToken, a: f32, b: f32) -> f32 {
a + b
}
#[cfg(target_arch = "wasm32")]
fn add_wasm128(_token: Wasm128Token, a: f32, b: f32) -> f32 {
a + b
}
#[cfg(all(target_arch = "x86_64", feature = "avx512"))]
#[arcane]
fn add_v4(_token: X64V4Token, a: f32, b: f32) -> f32 {
a + b
}
#[test]
fn incant_explicit_v4_feature_gate() {
let result = incant!(add(1.0, 2.0), [v4(avx512), v3, scalar]);
assert!((result - 3.0).abs() < 1e-6);
}
#[test]
fn incant_explicit_v4_cfg_gate() {
let result = incant!(add(1.0, 2.0), [v4(cfg(avx512)), v3, scalar]);
assert!((result - 3.0).abs() < 1e-6);
}
#[test]
fn incant_default_tiers() {
let result = incant!(add(1.0, 2.0));
assert!((result - 3.0).abs() < 1e-6);
}
#[arcane(cfg(avx512))]
fn guarded_v4(_token: X64V4Token, x: f32) -> f32 {
x * 2.0
}
#[arcane]
fn always_v3(_token: X64V3Token, x: f32) -> f32 {
x * 2.0
}
#[cfg(target_arch = "x86_64")]
#[test]
fn arcane_cfg_feature() {
if let Some(token) = X64V3Token::summon() {
let result = always_v3(token, 5.0);
assert!((result - 10.0).abs() < 1e-6);
}
}
#[rite(v3, cfg(avx512))]
fn rite_guarded() -> f32 {
42.0
}
#[rite(v3)]
fn rite_always() -> f32 {
42.0
}
#[autoversion(cfg(avx512))]
fn auto_sum(_token: SimdToken, data: &[f32]) -> f32 {
let mut sum = 0.0f32;
for &x in data {
sum += x;
}
sum
}
#[test]
fn autoversion_cfg_feature() {
let data = [1.0f32, 2.0, 3.0, 4.0];
let result = auto_sum(&data);
assert!((result - 10.0).abs() < 1e-6);
}
#[autoversion(v4(avx512), v3, neon)]
fn auto_with_tier_gate(_token: SimdToken, data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_tier_feature_gate() {
let data = [1.0f32, 2.0, 3.0];
let result = auto_with_tier_gate(&data);
assert!((result - 6.0).abs() < 1e-6);
}
#[autoversion(v4(cfg(avx512)), v3, neon)]
fn auto_with_cfg_gate(_token: SimdToken, data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_cfg_tier_gate() {
let data = [1.0f32, 2.0, 3.0];
let result = auto_with_cfg_gate(&data);
assert!((result - 6.0).abs() < 1e-6);
}
macro_rules! define_autoversioned {
($name:ident) => {
#[autoversion]
fn $name(_token: SimdToken, data: &[f32]) -> f32 {
let mut sum = 0.0f32;
for &x in data {
sum += x;
}
sum
}
};
}
define_autoversioned!(macro_sum);
#[test]
fn autoversion_in_macro_rules() {
let data = [1.0f32, 2.0, 3.0];
let result = macro_sum(&data);
assert!((result - 6.0).abs() < 1e-6);
}
macro_rules! define_conditional_autoversioned {
($name:ident) => {
#[autoversion(cfg(avx512))]
fn $name(_token: SimdToken, data: &[f32]) -> f32 {
data.iter().sum()
}
};
}
define_conditional_autoversioned!(conditional_macro_sum);
#[test]
fn autoversion_cfg_in_macro_rules() {
let data = [1.0f32, 2.0, 3.0, 4.0, 5.0];
let result = conditional_macro_sum(&data);
assert!((result - 15.0).abs() < 1e-6);
}