Skip to content

Commit 448e336

Browse files
Added a macro to simplify <Arch>IntrinsicType definitions
1 parent 2058ab6 commit 448e336

File tree

2 files changed

+58
-42
lines changed

2 files changed

+58
-42
lines changed

crates/intrinsic-test/src/arm/intrinsic.rs

+3-42
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,12 @@ use crate::common::argument::ArgumentList;
33
use crate::common::format::Indentation;
44
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
55
use crate::common::intrinsic_types::{
6-
BaseIntrinsicTypeDefinition, IntrinsicType, IntrinsicTypeDefinition, TypeKind,
6+
BaseIntrinsicTypeDefinition, IntrinsicTypeDefinition, TypeKind,
77
};
88
use crate::common::types::Language;
9+
use crate::base_intrinsictype_trait_def_macro;
910

10-
#[derive(Debug, Clone, PartialEq)]
11-
pub struct ArmIntrinsicType(pub IntrinsicType);
12-
13-
impl BaseIntrinsicTypeDefinition for ArmIntrinsicType {
14-
fn kind(&self) -> TypeKind {
15-
self.0.kind()
16-
}
17-
fn inner_size(&self) -> u32 {
18-
self.0.inner_size()
19-
}
20-
fn num_lanes(&self) -> u32 {
21-
self.0.num_lanes()
22-
}
23-
fn num_vectors(&self) -> u32 {
24-
self.0.num_vectors()
25-
}
26-
fn is_simd(&self) -> bool {
27-
self.0.is_simd()
28-
}
29-
fn is_ptr(&self) -> bool {
30-
self.0.is_ptr()
31-
}
32-
fn c_scalar_type(&self) -> String {
33-
self.0.c_scalar_type()
34-
}
35-
fn rust_scalar_type(&self) -> String {
36-
self.0.rust_scalar_type()
37-
}
38-
fn c_promotion(&self) -> &str {
39-
self.0.c_promotion()
40-
}
41-
fn populate_random(&self, indentation: Indentation, loads: u32, language: &Language) -> String {
42-
self.0.populate_random(indentation, loads, language)
43-
}
44-
fn is_rust_vals_array_const(&self) -> bool {
45-
self.0.is_rust_vals_array_const()
46-
}
47-
fn as_call_param_c(&self, name: &String) -> String {
48-
self.0.as_call_param_c(name)
49-
}
50-
}
11+
base_intrinsictype_trait_def_macro!{ArmIntrinsicType}
5112

5213
impl IntrinsicDefinition<ArmIntrinsicType, Constraint> for Intrinsic<ArmIntrinsicType, Constraint> {
5314
fn arguments(&self) -> ArgumentList<ArmIntrinsicType, Constraint> {

crates/intrinsic-test/src/common/intrinsic_types.rs

+55
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,58 @@ pub trait IntrinsicTypeDefinition: BaseIntrinsicTypeDefinition {
350350
unimplemented!("Different architectures must implement rust_type!")
351351
}
352352
}
353+
354+
/// Defines the basic structure of achitecture-specific derivatives
355+
/// of IntrinsicType.
356+
#[macro_export]
357+
macro_rules! base_intrinsictype_trait_def_macro {
358+
($T:ident) => {
359+
use crate::common::intrinsic_types::IntrinsicType;
360+
361+
#[derive(Debug, Clone, PartialEq)]
362+
pub struct $T(pub IntrinsicType);
363+
364+
impl BaseIntrinsicTypeDefinition for $T {
365+
fn kind(&self) -> TypeKind {
366+
self.0.kind()
367+
}
368+
fn inner_size(&self) -> u32 {
369+
self.0.inner_size()
370+
}
371+
fn num_lanes(&self) -> u32 {
372+
self.0.num_lanes()
373+
}
374+
fn num_vectors(&self) -> u32 {
375+
self.0.num_vectors()
376+
}
377+
fn is_simd(&self) -> bool {
378+
self.0.is_simd()
379+
}
380+
fn is_ptr(&self) -> bool {
381+
self.0.is_ptr()
382+
}
383+
fn c_scalar_type(&self) -> String {
384+
self.0.c_scalar_type()
385+
}
386+
fn rust_scalar_type(&self) -> String {
387+
self.0.rust_scalar_type()
388+
}
389+
fn c_promotion(&self) -> &str {
390+
self.0.c_promotion()
391+
}
392+
fn populate_random(&self,
393+
indentation: Indentation,
394+
loads: u32,
395+
language: &Language
396+
) -> String {
397+
self.0.populate_random(indentation, loads, language)
398+
}
399+
fn is_rust_vals_array_const(&self) -> bool {
400+
self.0.is_rust_vals_array_const()
401+
}
402+
fn as_call_param_c(&self, name: &String) -> String {
403+
self.0.as_call_param_c(name)
404+
}
405+
}
406+
};
407+
}

0 commit comments

Comments
 (0)