Skip to content

Commit e72631d

Browse files
moved more code generation functionality to common
1 parent 5ac0c71 commit e72631d

File tree

6 files changed

+238
-223
lines changed

6 files changed

+238
-223
lines changed
+2-208
Original file line numberDiff line numberDiff line change
@@ -1,162 +1,7 @@
1-
use super::config::{AARCH_CONFIGURATIONS, POLY128_OSTREAM_DEF, build_notices};
2-
use super::intrinsic::ArmIntrinsicType;
3-
use crate::common::argument::Argument;
41
use crate::common::compile_c::CompilationCommandBuilder;
5-
use crate::common::gen_c::{compile_c, create_c_filenames, generate_c_program};
6-
use crate::common::gen_rust::{compile_rust, create_rust_filenames, generate_rust_program};
7-
use crate::common::indentation::Indentation;
8-
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
9-
use crate::common::intrinsic_helpers::IntrinsicTypeDefinition;
10-
use crate::common::write_file;
11-
use itertools::Itertools;
12-
use rayon::prelude::*;
2+
use crate::common::gen_c::compile_c;
133

14-
// The number of times each intrinsic will be called.
15-
const PASSES: u32 = 20;
16-
17-
fn gen_code_c(
18-
indentation: Indentation,
19-
intrinsic: &Intrinsic<ArmIntrinsicType>,
20-
constraints: &[&Argument<ArmIntrinsicType>],
21-
name: String,
22-
target: &str,
23-
) -> String {
24-
if let Some((current, constraints)) = constraints.split_last() {
25-
let range = current
26-
.constraint
27-
.iter()
28-
.map(|c| c.to_range())
29-
.flat_map(|r| r.into_iter());
30-
31-
let body_indentation = indentation.nested();
32-
range
33-
.map(|i| {
34-
format!(
35-
"{indentation}{{\n\
36-
{body_indentation}{ty} {name} = {val};\n\
37-
{pass}\n\
38-
{indentation}}}",
39-
name = current.name,
40-
ty = current.ty.c_type(),
41-
val = i,
42-
pass = gen_code_c(
43-
body_indentation,
44-
intrinsic,
45-
constraints,
46-
format!("{name}-{i}"),
47-
target,
48-
)
49-
)
50-
})
51-
.join("\n")
52-
} else {
53-
intrinsic.generate_loop_c(indentation, &name, PASSES, target)
54-
}
55-
}
56-
57-
fn generate_c_program_arm(
58-
header_files: &[&str],
59-
intrinsic: &Intrinsic<ArmIntrinsicType>,
60-
target: &str,
61-
) -> String {
62-
let constraints = intrinsic
63-
.arguments
64-
.iter()
65-
.filter(|&i| i.has_constraint())
66-
.collect_vec();
67-
68-
let indentation = Indentation::default();
69-
generate_c_program(
70-
build_notices("// ").as_str(),
71-
header_files,
72-
"aarch64",
73-
&[POLY128_OSTREAM_DEF],
74-
intrinsic
75-
.arguments
76-
.gen_arglists_c(indentation, PASSES)
77-
.as_str(),
78-
gen_code_c(
79-
indentation.nested(),
80-
intrinsic,
81-
constraints.as_slice(),
82-
Default::default(),
83-
target,
84-
)
85-
.as_str(),
86-
)
87-
}
88-
89-
fn gen_code_rust(
90-
indentation: Indentation,
91-
intrinsic: &Intrinsic<ArmIntrinsicType>,
92-
constraints: &[&Argument<ArmIntrinsicType>],
93-
name: String,
94-
) -> String {
95-
println!("{}", name);
96-
if let Some((current, constraints)) = constraints.split_last() {
97-
let range = current
98-
.constraint
99-
.iter()
100-
.map(|c| c.to_range())
101-
.flat_map(|r| r.into_iter());
102-
103-
let body_indentation = indentation.nested();
104-
range
105-
.map(|i| {
106-
format!(
107-
"{indentation}{{\n\
108-
{body_indentation}const {name}: {ty} = {val};\n\
109-
{pass}\n\
110-
{indentation}}}",
111-
name = current.name,
112-
ty = current.ty.rust_type(),
113-
val = i,
114-
pass = gen_code_rust(
115-
body_indentation,
116-
intrinsic,
117-
constraints,
118-
format!("{name}-{i}")
119-
)
120-
)
121-
})
122-
.join("\n")
123-
} else {
124-
intrinsic.generate_loop_rust(indentation, &name, PASSES)
125-
}
126-
}
127-
128-
fn generate_rust_program_arm(intrinsic: &Intrinsic<ArmIntrinsicType>, target: &str) -> String {
129-
let constraints = intrinsic
130-
.arguments
131-
.iter()
132-
.filter(|i| i.has_constraint())
133-
.collect_vec();
134-
135-
let indentation = Indentation::default();
136-
let final_target = if target.contains("v7") {
137-
"arm"
138-
} else {
139-
"aarch64"
140-
};
141-
generate_rust_program(
142-
build_notices("// ").as_str(),
143-
AARCH_CONFIGURATIONS,
144-
final_target,
145-
intrinsic
146-
.arguments
147-
.gen_arglists_rust(indentation.nested(), PASSES)
148-
.as_str(),
149-
gen_code_rust(
150-
indentation.nested(),
151-
intrinsic,
152-
&constraints,
153-
Default::default(),
154-
)
155-
.as_str(),
156-
)
157-
}
158-
159-
fn compile_c_arm(
4+
pub fn compile_c_arm(
1605
intrinsics_name_list: &Vec<String>,
1616
compiler: &str,
1627
target: &str,
@@ -217,54 +62,3 @@ fn compile_c_arm(
21762

21863
compile_c(&compiler_commands)
21964
}
220-
221-
pub fn build_c(
222-
intrinsics: &Vec<Intrinsic<ArmIntrinsicType>>,
223-
compiler: Option<&str>,
224-
target: &str,
225-
cxx_toolchain_dir: Option<&str>,
226-
) -> bool {
227-
let intrinsics_name_list = intrinsics
228-
.par_iter()
229-
.map(|i| i.name.clone())
230-
.collect::<Vec<_>>();
231-
let filename_mapping = create_c_filenames(&intrinsics_name_list);
232-
233-
intrinsics.par_iter().for_each(|i| {
234-
let c_code = generate_c_program_arm(&["arm_neon.h", "arm_acle.h", "arm_fp16.h"], i, target);
235-
match filename_mapping.get(&i.name) {
236-
Some(filename) => write_file(filename, c_code),
237-
None => {}
238-
};
239-
});
240-
241-
match compiler {
242-
None => true,
243-
Some(compiler) => compile_c_arm(&intrinsics_name_list, compiler, target, cxx_toolchain_dir),
244-
}
245-
}
246-
247-
pub fn build_rust(
248-
intrinsics: &[Intrinsic<ArmIntrinsicType>],
249-
toolchain: Option<&str>,
250-
target: &str,
251-
linker: Option<&str>,
252-
) -> bool {
253-
let intrinsics_name_list = intrinsics
254-
.par_iter()
255-
.map(|i| i.name.clone())
256-
.collect::<Vec<_>>();
257-
let filename_mapping = create_rust_filenames(&intrinsics_name_list);
258-
259-
intrinsics.par_iter().for_each(|i| {
260-
let rust_code = generate_rust_program_arm(i, target);
261-
match filename_mapping.get(&i.name) {
262-
Some(filename) => write_file(filename, rust_code),
263-
None => {}
264-
}
265-
});
266-
267-
let intrinsics_name_list = intrinsics.iter().map(|i| i.name.as_str()).collect_vec();
268-
269-
compile_rust(&intrinsics_name_list, toolchain, target, linker)
270-
}

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

+46-14
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ mod intrinsic;
44
mod json_parser;
55
mod types;
66

7+
use crate::arm::functions::compile_c_arm;
78
use crate::arm::intrinsic::ArmIntrinsicType;
89
use crate::common::SupportedArchitectureTest;
910
use crate::common::cli::ProcessedCli;
1011
use crate::common::compare::compare_outputs;
11-
use crate::common::intrinsic::Intrinsic;
12+
use crate::common::functions::{write_c_testfiles, write_rust_testfiles};
13+
use crate::common::gen_rust::compile_rust;
14+
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
1215
use crate::common::intrinsic_helpers::{BaseIntrinsicTypeDefinition, TypeKind};
13-
use functions::{build_c, build_rust};
16+
use config::{AARCH_CONFIGURATIONS, POLY128_OSTREAM_DEF, build_notices};
1417
use json_parser::get_neon_intrinsics;
1518

1619
pub struct ArmArchitectureTest {
@@ -48,21 +51,50 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
4851
}
4952

5053
fn build_c_file(&self) -> bool {
51-
build_c(
52-
&self.intrinsics,
53-
self.cli_options.cpp_compiler.as_deref(),
54-
&self.cli_options.target,
55-
self.cli_options.cxx_toolchain_dir.as_deref(),
56-
)
54+
let compiler = self.cli_options.cpp_compiler.as_deref();
55+
let target = &self.cli_options.target;
56+
let cxx_toolchain_dir = self.cli_options.cxx_toolchain_dir.as_deref();
57+
58+
let intrinsics_name_list = write_c_testfiles(
59+
&self
60+
.intrinsics
61+
.iter()
62+
.map(|i| i as &dyn IntrinsicDefinition<_>)
63+
.collect::<Vec<_>>(),
64+
target,
65+
&["arm_neon.h", "arm_acle.h", "arm_fp16.h"],
66+
&build_notices("// "),
67+
&[POLY128_OSTREAM_DEF],
68+
);
69+
70+
match compiler {
71+
None => true,
72+
Some(compiler) => {
73+
compile_c_arm(&intrinsics_name_list, compiler, target, cxx_toolchain_dir)
74+
}
75+
}
5776
}
5877

5978
fn build_rust_file(&self) -> bool {
60-
build_rust(
61-
&self.intrinsics,
62-
self.cli_options.toolchain.as_deref(),
63-
&self.cli_options.target,
64-
self.cli_options.linker.as_deref(),
65-
)
79+
let final_target = if self.cli_options.target.contains("v7") {
80+
"arm"
81+
} else {
82+
"aarch64"
83+
};
84+
let target = &self.cli_options.target;
85+
let toolchain = self.cli_options.toolchain.as_deref();
86+
let linker = self.cli_options.linker.as_deref();
87+
let intrinsics_name_list = write_rust_testfiles(
88+
self.intrinsics
89+
.iter()
90+
.map(|i| i as &dyn IntrinsicDefinition<_>)
91+
.collect::<Vec<_>>(),
92+
final_target,
93+
&build_notices("// "),
94+
AARCH_CONFIGURATIONS,
95+
);
96+
97+
compile_rust(intrinsics_name_list, toolchain, target, linker)
6698
}
6799

68100
fn compare_outputs(&self) -> bool {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use super::intrinsic_helpers::IntrinsicTypeDefinition;
2+
use crate::common::gen_c::create_c_filenames;
3+
use crate::common::gen_rust::create_rust_filenames;
4+
use crate::common::intrinsic::IntrinsicDefinition;
5+
use crate::common::write_file;
6+
7+
pub fn write_c_testfiles<T: IntrinsicTypeDefinition + Sized>(
8+
intrinsics: &Vec<&dyn IntrinsicDefinition<T>>,
9+
target: &str,
10+
headers: &[&str],
11+
notice: &str,
12+
arch_specific_definitions: &[&str],
13+
) -> Vec<String> {
14+
let intrinsics_name_list = intrinsics
15+
.iter()
16+
.map(|i| i.name().clone())
17+
.collect::<Vec<_>>();
18+
let filename_mapping = create_c_filenames(&intrinsics_name_list);
19+
20+
intrinsics.iter().for_each(|i| {
21+
let c_code = i.generate_c_program(headers, target, notice, arch_specific_definitions);
22+
match filename_mapping.get(&i.name()) {
23+
Some(filename) => write_file(filename, c_code),
24+
None => {}
25+
};
26+
});
27+
28+
intrinsics_name_list
29+
}
30+
31+
pub fn write_rust_testfiles<T: IntrinsicTypeDefinition>(
32+
intrinsics: Vec<&dyn IntrinsicDefinition<T>>,
33+
rust_target: &str,
34+
notice: &str,
35+
cfg: &str,
36+
) -> Vec<String> {
37+
let intrinsics_name_list = intrinsics
38+
.iter()
39+
.map(|i| i.name().clone())
40+
.collect::<Vec<_>>();
41+
let filename_mapping = create_rust_filenames(&intrinsics_name_list);
42+
43+
intrinsics.iter().for_each(|i| {
44+
let rust_code = i.generate_rust_program(rust_target, notice, cfg);
45+
match filename_mapping.get(&i.name()) {
46+
Some(filename) => write_file(filename, rust_code),
47+
None => {}
48+
}
49+
});
50+
51+
intrinsics_name_list
52+
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fn main() {{
2929
}
3030

3131
pub fn compile_rust(
32-
binaries: &[&str],
32+
binaries: Vec<String>,
3333
toolchain: Option<&str>,
3434
target: &str,
3535
linker: Option<&str>,

0 commit comments

Comments
 (0)