From f05ffd4a0b890ba9901211044ecbc504359a2232 Mon Sep 17 00:00:00 2001 From: Madhav Madhusoodanan Date: Wed, 16 Apr 2025 16:02:11 +0530 Subject: [PATCH] Added a macro to simplify IntrinsicType definitions --- .../intrinsic-test/src/arm/intrinsic.rs | 45 +-------------- .../src/common/intrinsic_types.rs | 56 +++++++++++++++++++ 2 files changed, 59 insertions(+), 42 deletions(-) diff --git a/library/stdarch/crates/intrinsic-test/src/arm/intrinsic.rs b/library/stdarch/crates/intrinsic-test/src/arm/intrinsic.rs index 126e4712f991..38aa3eb697a3 100644 --- a/library/stdarch/crates/intrinsic-test/src/arm/intrinsic.rs +++ b/library/stdarch/crates/intrinsic-test/src/arm/intrinsic.rs @@ -1,53 +1,14 @@ use super::constraint::Constraint; +use crate::base_intrinsictype_trait_def_macro; use crate::common::argument::ArgumentList; use crate::common::format::Indentation; use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition}; use crate::common::intrinsic_types::{ - BaseIntrinsicTypeDefinition, IntrinsicType, IntrinsicTypeDefinition, TypeKind, + BaseIntrinsicTypeDefinition, IntrinsicTypeDefinition, TypeKind, }; use crate::common::types::Language; -#[derive(Debug, Clone, PartialEq)] -pub struct ArmIntrinsicType(pub IntrinsicType); - -impl BaseIntrinsicTypeDefinition for ArmIntrinsicType { - fn kind(&self) -> TypeKind { - self.0.kind() - } - fn inner_size(&self) -> u32 { - self.0.inner_size() - } - fn num_lanes(&self) -> u32 { - self.0.num_lanes() - } - fn num_vectors(&self) -> u32 { - self.0.num_vectors() - } - fn is_simd(&self) -> bool { - self.0.is_simd() - } - fn is_ptr(&self) -> bool { - self.0.is_ptr() - } - fn c_scalar_type(&self) -> String { - self.0.c_scalar_type() - } - fn rust_scalar_type(&self) -> String { - self.0.rust_scalar_type() - } - fn c_promotion(&self) -> &str { - self.0.c_promotion() - } - fn populate_random(&self, indentation: Indentation, loads: u32, language: &Language) -> String { - self.0.populate_random(indentation, loads, language) - } - fn is_rust_vals_array_const(&self) -> bool { - self.0.is_rust_vals_array_const() - } - fn as_call_param_c(&self, name: &String) -> String { - self.0.as_call_param_c(name) - } -} +base_intrinsictype_trait_def_macro! {ArmIntrinsicType} impl IntrinsicDefinition for Intrinsic { fn arguments(&self) -> ArgumentList { diff --git a/library/stdarch/crates/intrinsic-test/src/common/intrinsic_types.rs b/library/stdarch/crates/intrinsic-test/src/common/intrinsic_types.rs index 9a08ec066c10..9cd74fa71f5c 100644 --- a/library/stdarch/crates/intrinsic-test/src/common/intrinsic_types.rs +++ b/library/stdarch/crates/intrinsic-test/src/common/intrinsic_types.rs @@ -350,3 +350,59 @@ pub trait IntrinsicTypeDefinition: BaseIntrinsicTypeDefinition { unimplemented!("Different architectures must implement rust_type!") } } + +/// Defines the basic structure of achitecture-specific derivatives +/// of IntrinsicType. +#[macro_export] +macro_rules! base_intrinsictype_trait_def_macro { + ($T:ident) => { + use crate::common::intrinsic_types::IntrinsicType; + + #[derive(Debug, Clone, PartialEq)] + pub struct $T(pub IntrinsicType); + + impl BaseIntrinsicTypeDefinition for $T { + fn kind(&self) -> TypeKind { + self.0.kind() + } + fn inner_size(&self) -> u32 { + self.0.inner_size() + } + fn num_lanes(&self) -> u32 { + self.0.num_lanes() + } + fn num_vectors(&self) -> u32 { + self.0.num_vectors() + } + fn is_simd(&self) -> bool { + self.0.is_simd() + } + fn is_ptr(&self) -> bool { + self.0.is_ptr() + } + fn c_scalar_type(&self) -> String { + self.0.c_scalar_type() + } + fn rust_scalar_type(&self) -> String { + self.0.rust_scalar_type() + } + fn c_promotion(&self) -> &str { + self.0.c_promotion() + } + fn populate_random( + &self, + indentation: Indentation, + loads: u32, + language: &Language, + ) -> String { + self.0.populate_random(indentation, loads, language) + } + fn is_rust_vals_array_const(&self) -> bool { + self.0.is_rust_vals_array_const() + } + fn as_call_param_c(&self, name: &String) -> String { + self.0.as_call_param_c(name) + } + } + }; +}