#![allow(deprecated)] #![cfg(any(
target_arch = "x86_64",
target_arch = "aarch64",
target_arch = "wasm32"
))]
use archmage::prelude::*;
mod additive_append {
use super::*;
#[autoversion(+v1)]
fn sum_plus_v1(data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_plus_v1_dispatches() {
assert_eq!(sum_plus_v1(&[1.0, 2.0, 3.0]), 6.0);
}
#[cfg(target_arch = "x86_64")]
#[test]
fn autoversion_plus_v1_generates_v1_variant() {
let t = X64V1Token::summon().expect("v1 always available");
assert_eq!(sum_plus_v1_v1(t, &[10.0, 20.0]), 30.0);
}
#[cfg(target_arch = "x86_64")]
#[test]
fn autoversion_plus_v1_still_has_v3() {
if let Some(t) = X64V3Token::summon() {
assert_eq!(sum_plus_v1_v3(t, &[1.0, 2.0]), 3.0);
}
}
#[magetypes(+v2)]
fn mt_plus_v2(_token: Token, x: f32) -> f32 {
x + 1.0
}
#[test]
fn magetypes_plus_v2_scalar_exists() {
assert_eq!(mt_plus_v2_scalar(ScalarToken, 1.0), 2.0);
}
#[cfg(target_arch = "x86_64")]
#[test]
fn magetypes_plus_v2_generates_v2_variant() {
if let Some(t) = X64V2Token::summon() {
assert_eq!(mt_plus_v2_v2(t, 1.0), 2.0);
}
}
}
#[cfg(target_arch = "x86_64")]
mod additive_override {
use super::*;
#[autoversion(+v4)]
fn sum_unconditional_v4(data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_unconditional_v4_dispatches() {
assert_eq!(sum_unconditional_v4(&[1.0, 2.0, 3.0]), 6.0);
}
#[test]
fn autoversion_unconditional_v4_variant_exists() {
if let Some(t) = X64V4Token::summon() {
assert_eq!(sum_unconditional_v4_v4(t, &[10.0]), 10.0);
}
}
}
mod additive_default_fallback {
use super::*;
#[autoversion(+default)]
fn sum_with_default(data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_plus_default_dispatches() {
assert_eq!(sum_with_default(&[1.0, 2.0, 3.0]), 6.0);
}
#[test]
fn autoversion_plus_default_generates_default_variant() {
assert_eq!(sum_with_default_default(&[5.0, 5.0]), 10.0);
}
}
mod subtractive {
use super::*;
#[autoversion(-wasm128)]
fn sum_no_wasm(data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_minus_wasm_dispatches() {
assert_eq!(sum_no_wasm(&[1.0, 2.0, 3.0]), 6.0);
}
#[autoversion(-neon)]
fn sum_no_neon(data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_minus_neon_dispatches() {
assert_eq!(sum_no_neon(&[1.0, 2.0]), 3.0);
}
#[autoversion(-wasm128, -neon, +v1)]
fn sum_custom(data: &[f32]) -> f32 {
data.iter().sum()
}
#[test]
fn autoversion_combined_modifiers() {
assert_eq!(sum_custom(&[1.0, 2.0, 3.0, 4.0]), 10.0);
}
#[cfg(target_arch = "x86_64")]
#[test]
fn autoversion_combined_has_v1() {
let t = X64V1Token::summon().expect("v1 always available");
assert_eq!(sum_custom_v1(t, &[10.0]), 10.0);
}
}
#[cfg(target_arch = "x86_64")]
mod additive_cfg_gate {
use super::*;
#[cfg(feature = "avx512")]
#[arcane]
fn gated_incant_v4(_: X64V4Token, x: f32) -> f32 {
x * 4.0
}
#[allow(unexpected_cfgs)]
#[cfg(feature = "nonexistent_feature")]
#[arcane]
fn gated_incant_v3(_: X64V3Token, x: f32) -> f32 {
x * 3.0
}
fn gated_incant_scalar(_: ScalarToken, x: f32) -> f32 {
x * 1.0
}
#[allow(unexpected_cfgs)]
fn gated_dispatch(x: f32) -> f32 {
incant!(gated_incant(x), [+v3(cfg(nonexistent_feature))])
}
#[test]
fn incant_gated_v3_uses_best_available() {
let result = gated_dispatch(10.0);
assert!(result >= 10.0);
}
}
mod incant_modifiers {
use super::*;
#[cfg(all(target_arch = "x86_64", feature = "avx512"))]
#[arcane]
fn im_v4(_: X64V4Token, x: f32) -> f32 {
x + 4.0
}
#[arcane]
fn im_v3(_: X64V3Token, x: f32) -> f32 {
x + 3.0
}
fn im_v1(_: X64V1Token, x: f32) -> f32 {
x + 1.0
}
fn im_scalar(_: ScalarToken, x: f32) -> f32 {
x + 0.0
}
fn im_dispatch(x: f32) -> f32 {
incant!(im(x), [-neon, -wasm128, +v1])
}
#[test]
fn incant_with_modifiers() {
let result = im_dispatch(10.0);
assert!(result >= 10.0);
}
}
mod magetypes_modifiers {
use super::*;
#[magetypes(-wasm128, +v2)]
fn mt_mod(_token: Token, x: f32) -> f32 {
x + 1.0
}
#[test]
fn magetypes_modifier_scalar_works() {
assert_eq!(mt_mod_scalar(ScalarToken, 1.0), 2.0);
}
#[cfg(target_arch = "x86_64")]
#[test]
fn magetypes_modifier_v2_exists() {
if let Some(t) = X64V2Token::summon() {
assert_eq!(mt_mod_v2(t, 1.0), 2.0);
}
}
#[cfg(target_arch = "x86_64")]
#[test]
fn magetypes_modifier_v3_still_exists() {
if let Some(t) = X64V3Token::summon() {
assert_eq!(mt_mod_v3(t, 1.0), 2.0);
}
}
}