From 9d3c09ed53f1cdc5ac38e79bf6a66a47a2b33277 Mon Sep 17 00:00:00 2001 From: Madhav Madhusoodanan Date: Mon, 14 Apr 2025 06:10:27 +0530 Subject: [PATCH] added target field within `IntrinsicType` to perform target level checking cleanly --- .../crates/intrinsic-test/src/arm/argument.rs | 4 ++-- .../crates/intrinsic-test/src/arm/json_parser.rs | 16 +++++++++++----- .../stdarch/crates/intrinsic-test/src/arm/mod.rs | 4 ++-- .../crates/intrinsic-test/src/arm/types.rs | 14 +++++++++++--- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/library/stdarch/crates/intrinsic-test/src/arm/argument.rs b/library/stdarch/crates/intrinsic-test/src/arm/argument.rs index 5edfca0b3688..43976b81490a 100644 --- a/library/stdarch/crates/intrinsic-test/src/arm/argument.rs +++ b/library/stdarch/crates/intrinsic-test/src/arm/argument.rs @@ -79,10 +79,10 @@ impl Argument { } // ARM-specific - pub fn from_c(pos: usize, arg: &str, arg_prep: Option) -> Argument { + pub fn from_c(pos: usize, arg: &str, arg_prep: Option, target: &String) -> Argument { let (ty, var_name) = Self::type_and_name_from_c(arg); - let ty = IntrinsicType::from_c(ty) + let ty = IntrinsicType::from_c(ty, target) .unwrap_or_else(|_| panic!("Failed to parse argument '{arg}'")); let constraint = arg_prep.and_then(|a| a.try_into().ok()); diff --git a/library/stdarch/crates/intrinsic-test/src/arm/json_parser.rs b/library/stdarch/crates/intrinsic-test/src/arm/json_parser.rs index 630af311d196..b914c4fffab6 100644 --- a/library/stdarch/crates/intrinsic-test/src/arm/json_parser.rs +++ b/library/stdarch/crates/intrinsic-test/src/arm/json_parser.rs @@ -41,7 +41,10 @@ struct JsonIntrinsic { architectures: Vec, } -pub fn get_neon_intrinsics(filename: &Path) -> Result, Box> { +pub fn get_neon_intrinsics( + filename: &Path, + target: &String, +) -> Result, Box> { let file = std::fs::File::open(filename)?; let reader = std::io::BufReader::new(file); let json: Vec = serde_json::from_reader(reader).expect("Couldn't parse JSON"); @@ -50,7 +53,7 @@ pub fn get_neon_intrinsics(filename: &Path) -> Result, Box Result, Box Result> { +fn json_to_intrinsic( + mut intr: JsonIntrinsic, + target: &String, +) -> Result> { let name = intr.name.replace(['[', ']'], ""); - let results = IntrinsicType::from_c(&intr.return_type.value)?; + let results = IntrinsicType::from_c(&intr.return_type.value, target)?; let mut args_prep = intr.args_prep.as_mut(); let args = intr @@ -72,7 +78,7 @@ fn json_to_intrinsic(mut intr: JsonIntrinsic) -> Result Self { let a32 = cli_options.target.contains("v7"); - let mut intrinsics = - get_neon_intrinsics(&cli_options.filename).expect("Error parsing input file"); + 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)); diff --git a/library/stdarch/crates/intrinsic-test/src/arm/types.rs b/library/stdarch/crates/intrinsic-test/src/arm/types.rs index a27651a3c055..a579e9699d62 100644 --- a/library/stdarch/crates/intrinsic-test/src/arm/types.rs +++ b/library/stdarch/crates/intrinsic-test/src/arm/types.rs @@ -97,6 +97,8 @@ pub enum IntrinsicType { /// rows encoded in the type (e.g. uint8x8_t). /// A value of `None` can be assumed to be 1 though. vec_len: Option, + + target: String, }, } @@ -393,6 +395,7 @@ impl IntrinsicType { bit_len: Some(bl), simd_len, vec_len, + target, .. } => { let quad = if simd_len.unwrap_or(1) * bl > 64 { @@ -400,6 +403,8 @@ impl IntrinsicType { } else { "" }; + + let choose_workaround = language == Language::C && target.contains("v7"); format!( "vld{len}{quad}_{type}{size}", type = match k { @@ -407,7 +412,8 @@ impl IntrinsicType { TypeKind::Int => "s", TypeKind::Float => "f", // The ACLE doesn't support 64-bit polynomial loads on Armv7 - TypeKind::Poly => if language == Language::C && *bl == 64 {"s"} else {"p"}, + // if armv7 and bl == 64, use "s", else "p" + TypeKind::Poly => if choose_workaround && *bl == 64 {"s"} else {"p"}, x => todo!("get_load_function TypeKind: {:#?}", x), }, size = bl, @@ -462,7 +468,7 @@ impl IntrinsicType { } /// ARM-specific - pub fn from_c(s: &str) -> Result { + pub fn from_c(s: &str, target: &String) -> Result { const CONST_STR: &str = "const"; if let Some(s) = s.strip_suffix('*') { let (s, constant) = match s.trim().strip_suffix(CONST_STR) { @@ -472,7 +478,7 @@ impl IntrinsicType { let s = s.trim_end(); Ok(IntrinsicType::Ptr { constant, - child: Box::new(IntrinsicType::from_c(s)?), + child: Box::new(IntrinsicType::from_c(s, target)?), }) } else { // [const ]TYPE[{bitlen}[x{simdlen}[x{vec_len}]]][_t] @@ -507,6 +513,7 @@ impl IntrinsicType { bit_len: Some(bit_len), simd_len, vec_len, + target: target.to_string(), }) } else { let kind = start.parse::()?; @@ -520,6 +527,7 @@ impl IntrinsicType { bit_len, simd_len: None, vec_len: None, + target: target.to_string(), }) } }