blob: 08dc2d38702cdd5fe2d32f287aec83190b311cef [file] [log] [blame]
mod argument;
mod compile;
mod config;
mod intrinsic;
mod json_parser;
mod types;
use crate::common::SupportedArchitectureTest;
use crate::common::cli::ProcessedCli;
use crate::common::compile_c::CppCompilation;
use crate::common::intrinsic::Intrinsic;
use crate::common::intrinsic_helpers::TypeKind;
use intrinsic::ArmIntrinsicType;
use json_parser::get_neon_intrinsics;
pub struct ArmArchitectureTest {
intrinsics: Vec<Intrinsic<ArmIntrinsicType>>,
cli_options: ProcessedCli,
}
impl SupportedArchitectureTest for ArmArchitectureTest {
type IntrinsicImpl = ArmIntrinsicType;
fn cli_options(&self) -> &ProcessedCli {
&self.cli_options
}
fn intrinsics(&self) -> &[Intrinsic<ArmIntrinsicType>] {
&self.intrinsics
}
const NOTICE: &str = config::NOTICE;
const PLATFORM_C_HEADERS: &[&str] = &["arm_neon.h", "arm_acle.h", "arm_fp16.h"];
const PLATFORM_C_DEFINITIONS: &str = config::POLY128_OSTREAM_DEF;
const PLATFORM_C_FORWARD_DECLARATIONS: &str = config::POLY128_OSTREAM_DECL;
const PLATFORM_RUST_DEFINITIONS: &str = config::F16_FORMATTING_DEF;
const PLATFORM_RUST_CFGS: &str = config::AARCH_CONFIGURATIONS;
fn cpp_compilation(&self) -> Option<CppCompilation> {
compile::build_cpp_compilation(&self.cli_options)
}
fn create(cli_options: ProcessedCli) -> Self {
let a32 = cli_options.target.contains("v7");
let mut intrinsics = get_neon_intrinsics(&cli_options.filename, &cli_options.target)
.expect("Error parsing input file");
intrinsics.sort_by(|a, b| a.name.cmp(&b.name));
let mut intrinsics = intrinsics
.into_iter()
// Not sure how we would compare intrinsic that returns void.
.filter(|i| i.results.kind() != TypeKind::Void)
.filter(|i| i.results.kind() != TypeKind::BFloat)
.filter(|i| !i.arguments.iter().any(|a| a.ty.kind() == TypeKind::BFloat))
// Skip pointers for now, we would probably need to look at the return
// type to work out how many elements we need to point to.
.filter(|i| !i.arguments.iter().any(|a| a.is_ptr()))
.filter(|i| !i.arguments.iter().any(|a| a.ty.inner_size() == 128))
.filter(|i| !cli_options.skip.contains(&i.name))
.filter(|i| !(a32 && i.arch_tags == vec!["A64".to_string()]))
.collect::<Vec<_>>();
intrinsics.dedup();
Self {
intrinsics,
cli_options,
}
}
}