Skip to content

Commit 553892e

Browse files
Fixed merge conflicts with master
1 parent a321ab4 commit 553892e

File tree

8 files changed

+101
-107
lines changed

8 files changed

+101
-107
lines changed

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ use std::fs;
1010
use rayon::prelude::*;
1111

1212
use crate::arm::config::POLY128_OSTREAM_DEF;
13-
use crate::common::SupportedArchitectureTest;
1413
use crate::common::cli::ProcessedCli;
1514
use crate::common::compare::compare_outputs;
1615
use crate::common::gen_c::{write_main_cpp, write_mod_cpp};
1716
use crate::common::gen_rust::compile_rust_programs;
1817
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
1918
use crate::common::intrinsic_helpers::TypeKind;
2019
use crate::common::write_file::write_rust_testfiles;
20+
use crate::common::{SupportedArchitectureTest, chunk_info};
2121
use config::{AARCH_CONFIGURATIONS, F16_FORMATTING_DEF, build_notices};
2222
use intrinsic::ArmIntrinsicType;
2323
use json_parser::get_neon_intrinsics;
@@ -27,13 +27,6 @@ pub struct ArmArchitectureTest {
2727
cli_options: ProcessedCli,
2828
}
2929

30-
fn chunk_info(intrinsic_count: usize) -> (usize, usize) {
31-
let available_parallelism = std::thread::available_parallelism().unwrap().get();
32-
let chunk_size = intrinsic_count.div_ceil(Ord::min(available_parallelism, intrinsic_count));
33-
34-
(chunk_size, intrinsic_count.div_ceil(chunk_size))
35-
}
36-
3730
impl SupportedArchitectureTest for ArmArchitectureTest {
3831
fn create(cli_options: ProcessedCli) -> Box<Self> {
3932
let a32 = cli_options.target.contains("v7");
@@ -102,6 +95,7 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
10295
&mut file,
10396
c_target,
10497
POLY128_OSTREAM_DEF,
98+
Vec::from(platform_headers),
10599
self.intrinsics.iter().map(|i| i.name.as_str()),
106100
)
107101
.unwrap();

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ impl IntrinsicTypeDefinition for ArmIntrinsicType {
121121
}
122122
}
123123

124-
fn from_c(s: &str, target: &str) -> Result<Self, String> {
124+
fn from_c(s: &str) -> Result<Self, String> {
125125
const CONST_STR: &str = "const";
126126
let mut metadata: HashMap<String, String> = HashMap::new();
127127
metadata.insert("type".to_string(), s.to_string());
@@ -131,7 +131,7 @@ impl IntrinsicTypeDefinition for ArmIntrinsicType {
131131
None => (s, false),
132132
};
133133
let s = s.trim_end();
134-
let temp_return = ArmIntrinsicType::from_c(s, target);
134+
let temp_return = ArmIntrinsicType::from_c(s);
135135
temp_return.map(|mut op| {
136136
op.ptr = true;
137137
op.ptr_constant = constant;
@@ -172,7 +172,7 @@ impl IntrinsicTypeDefinition for ArmIntrinsicType {
172172
bit_len: Some(bit_len),
173173
simd_len,
174174
vec_len,
175-
target: target.to_string(),
175+
metadata,
176176
}))
177177
} else {
178178
let kind = start.parse::<TypeKind>()?;
@@ -188,7 +188,7 @@ impl IntrinsicTypeDefinition for ArmIntrinsicType {
188188
bit_len,
189189
simd_len: None,
190190
vec_len: None,
191-
target: target.to_string(),
191+
metadata,
192192
}))
193193
}
194194
}

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

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -63,25 +63,6 @@ where
6363
}
6464
}
6565

66-
pub fn from_c(
67-
pos: usize,
68-
arg: &str,
69-
target: &str,
70-
constraint: Option<Constraint>,
71-
) -> Argument<T> {
72-
let (ty, var_name) = Self::type_and_name_from_c(arg);
73-
74-
let ty =
75-
T::from_c(ty, target).unwrap_or_else(|_| panic!("Failed to parse argument '{arg}'"));
76-
77-
Argument {
78-
pos,
79-
name: String::from(var_name),
80-
ty: ty,
81-
constraint,
82-
}
83-
}
84-
8566
fn as_call_param_c(&self) -> String {
8667
self.ty.as_call_param_c(&self.name)
8768
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub fn generate_c_constraint_blocks<'a, T: IntrinsicTypeDefinition + 'a>(
4040
};
4141

4242
let body_indentation = indentation.nested();
43-
for i in current.constraint.iter().flat_map(|c| c.to_range()) {
43+
for i in current.constraint.iter().flat_map(|c| c.to_vector()) {
4444
let ty = current.ty.c_type();
4545

4646
writeln!(w, "{indentation}{{")?;
@@ -140,12 +140,13 @@ pub fn write_main_cpp<'a>(
140140
w: &mut impl std::io::Write,
141141
architecture: &str,
142142
arch_specific_definitions: &str,
143+
headers: Vec<&str>,
143144
intrinsics: impl Iterator<Item = &'a str> + Clone,
144145
) -> std::io::Result<()> {
145146
writeln!(w, "#include <iostream>")?;
146147
writeln!(w, "#include <string>")?;
147148

148-
for header in ["arm_neon.h", "arm_acle.h", "arm_fp16.h"] {
149+
for header in headers.iter() {
149150
writeln!(w, "#include <{header}>")?;
150151
}
151152

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ pub trait IntrinsicTypeDefinition: Deref<Target = IntrinsicType> {
332332
fn get_lane_function(&self) -> String;
333333

334334
/// can be implemented in an `impl` block
335-
fn from_c(_s: &str, _target: &str) -> Result<Self, String>
335+
fn from_c(_s: &str) -> Result<Self, String>
336336
where
337337
Self: Sized;
338338

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,10 @@ pub trait SupportedArchitectureTest {
2323
fn build_rust_file(&self) -> bool;
2424
fn compare_outputs(&self) -> bool;
2525
}
26+
27+
pub fn chunk_info(intrinsic_count: usize) -> (usize, usize) {
28+
let available_parallelism = std::thread::available_parallelism().unwrap().get();
29+
let chunk_size = intrinsic_count.div_ceil(Ord::min(available_parallelism, intrinsic_count));
30+
31+
(chunk_size, intrinsic_count.div_ceil(chunk_size))
32+
}
Lines changed: 20 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
use crate::common::compile_c::CompilationCommandBuilder;
2-
use crate::common::gen_c::compile_c_programs;
1+
use crate::common::cli::ProcessedCli;
2+
use crate::common::compile_c::{CompilationCommandBuilder, CppCompilation};
3+
4+
pub fn build_cpp_compilation(config: &ProcessedCli) -> Option<CppCompilation> {
5+
let cpp_compiler = config.cpp_compiler.as_ref()?;
36

4-
pub fn compile_c_x86(
5-
intrinsics_name_list: &[String],
6-
compiler: &str,
7-
target: &str,
8-
cxx_toolchain_dir: Option<&str>,
9-
) -> bool {
107
// -ffp-contract=off emulates Rust's approach of not fusing separate mul-add operations
118
let mut command = CompilationCommandBuilder::new()
129
.add_arch_flags(vec![
@@ -24,55 +21,27 @@ pub fn compile_c_x86(
2421
"adx",
2522
"aes",
2623
])
27-
.set_compiler(compiler)
28-
.set_target(target)
24+
.set_compiler(cpp_compiler)
25+
.set_target(&config.target)
2926
.set_opt_level("2")
30-
.set_cxx_toolchain_dir(cxx_toolchain_dir)
27+
.set_cxx_toolchain_dir(config.cxx_toolchain_dir.as_deref())
3128
.set_project_root("c_programs")
3229
.add_extra_flags(vec!["-ffp-contract=off", "-Wno-narrowing"]);
3330

34-
// if !target.contains("64") {
35-
// command = command.add_arch_flags(vec!["faminmax", "lut", "sha3"]);
36-
// }
37-
38-
/*
39-
* clang++ cannot link an aarch64_be object file, so we invoke
40-
* aarch64_be-unknown-linux-gnu's C++ linker. This ensures that we
41-
* are testing the intrinsics against LLVM.
42-
*
43-
* Note: setting `--sysroot=<...>` which is the obvious thing to do
44-
* does not work as it gets caught up with `#include_next <stdlib.h>`
45-
* not existing...
46-
*/
47-
// if target.contains("aarch64_be") {
48-
// command = command
49-
// .set_linker(
50-
// cxx_toolchain_dir.unwrap_or("").to_string() + "/bin/aarch64_be-none-linux-gnu-g++",
51-
// )
52-
// .set_include_paths(vec![
53-
// "/include",
54-
// "/aarch64_be-none-linux-gnu/include",
55-
// "/aarch64_be-none-linux-gnu/include/c++/14.2.1",
56-
// "/aarch64_be-none-linux-gnu/include/c++/14.2.1/aarch64_be-none-linux-gnu",
57-
// "/aarch64_be-none-linux-gnu/include/c++/14.2.1/backward",
58-
// "/aarch64_be-none-linux-gnu/libc/usr/include",
59-
// ]);
60-
// }
61-
62-
if !compiler.contains("clang") {
31+
if !cpp_compiler.contains("clang") {
6332
command = command.add_extra_flag("-flax-vector-conversions");
6433
}
6534

66-
let compiler_commands = intrinsics_name_list
67-
.iter()
68-
.map(|intrinsic_name| {
69-
command
70-
.clone()
71-
.set_input_name(intrinsic_name)
72-
.set_output_name(intrinsic_name)
73-
.make_string()
74-
})
75-
.collect::<Vec<_>>();
35+
let cpp_compiler = command.into_cpp_compilation();
36+
37+
// if config.target.contains("aarch64_be") {
38+
// let Some(ref cxx_toolchain_dir) = config.cxx_toolchain_dir else {
39+
// panic!(
40+
// "target `{}` must specify `cxx_toolchain_dir`",
41+
// config.target
42+
// )
43+
// };
44+
// }
7645

77-
compile_c_programs(&compiler_commands)
46+
Some(cpp_compiler)
7847
}

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

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@ mod intrinsic;
55
mod types;
66
mod xml_parser;
77

8-
use crate::common::SupportedArchitectureTest;
8+
use rayon::prelude::*;
9+
use std::fs;
10+
911
use crate::common::cli::ProcessedCli;
1012
use crate::common::compare::compare_outputs;
13+
use crate::common::gen_c::{write_main_cpp, write_mod_cpp};
1114
use crate::common::gen_rust::compile_rust_programs;
1215
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
1316
use crate::common::intrinsic_helpers::TypeKind;
14-
use crate::common::write_file::{write_c_testfiles, write_rust_testfiles};
15-
use crate::x86::compile::compile_c_x86;
17+
use crate::common::write_file::write_rust_testfiles;
18+
use crate::common::{SupportedArchitectureTest, chunk_info};
1619
use crate::x86::config::{F16_FORMATTING_DEF, X86_CONFIGURATIONS};
1720
use config::build_notices;
1821
use intrinsic::X86IntrinsicType;
@@ -54,26 +57,66 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
5457
let target = &self.cli_options.target;
5558
let cxx_toolchain_dir = self.cli_options.cxx_toolchain_dir.as_deref();
5659
let c_target = "x86_64";
60+
let (chunk_size, chunk_count) = chunk_info(self.intrinsics.len());
61+
let notice = &build_notices("// ");
62+
let platform_headers = &["immintrin.h"];
5763

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,
64+
let cpp_compiler = compile::build_cpp_compilation(&self.cli_options);
65+
66+
match fs::exists("c_programs") {
67+
Ok(false) => fs::create_dir("c_programs").unwrap(),
68+
Ok(true) => {}
69+
_ => return false,
70+
}
71+
72+
self.intrinsics
73+
.par_chunks(chunk_size)
74+
.enumerate()
75+
.map(|(i, chunk)| {
76+
let c_filename = format!("c_programs/mod_{i}.cpp");
77+
let mut file = fs::File::create(&c_filename).unwrap();
78+
write_mod_cpp(&mut file, notice, c_target, platform_headers, chunk).unwrap();
79+
80+
// compile this cpp file into a .o file
81+
if let Some(compiler) = cpp_compiler.as_ref() {
82+
let output = compiler
83+
.compile_object_file(&format!("mod_{i}.cpp"), &format!("mod_{i}.o"))?;
84+
assert!(output.status.success(), "{output:?}");
85+
}
86+
Ok(())
87+
})
88+
.collect::<Result<(), std::io::Error>>()
89+
.unwrap();
90+
91+
let mut file = fs::File::create("c_programs/main.cpp").unwrap();
92+
write_main_cpp(
93+
&mut file,
6594
c_target,
66-
&["immintrin.h"],
67-
&build_notices("// "),
68-
&[],
69-
);
95+
"",
96+
Vec::from(platform_headers),
97+
self.intrinsics.iter().map(|i| i.name.as_str()),
98+
)
99+
.unwrap();
70100

71-
match compiler {
72-
None => true,
73-
Some(compiler) => {
74-
compile_c_x86(&intrinsics_name_list, compiler, target, cxx_toolchain_dir)
75-
}
101+
// compile this cpp file into a .o file
102+
if let Some(compiler) = cpp_compiler.as_ref() {
103+
info!("compiling main.cpp");
104+
let output = compiler
105+
.compile_object_file("main.cpp", "intrinsic-test-programs.o")
106+
.unwrap();
107+
assert!(output.status.success(), "{output:?}");
108+
109+
let object_files = (0..chunk_count)
110+
.map(|i| format!("mod_{i}.o"))
111+
.chain(["intrinsic-test-programs.o".to_owned()]);
112+
113+
let output = compiler
114+
.link_executable(object_files, "intrinsic-test-programs")
115+
.unwrap();
116+
assert!(output.status.success(), "{output:?}");
76117
}
118+
119+
true
77120
}
78121

79122
fn build_rust_file(&self) -> bool {
@@ -102,7 +145,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
102145
}
103146

104147
fn compare_outputs(&self) -> bool {
105-
if let Some(ref toolchain) = self.cli_options.toolchain {
148+
if self.cli_options.toolchain.is_some() {
106149
let intrinsics_name_list = self
107150
.intrinsics
108151
.iter()
@@ -111,8 +154,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
111154

112155
compare_outputs(
113156
&intrinsics_name_list,
114-
toolchain,
115-
&self.cli_options.c_runner,
157+
&self.cli_options.runner,
116158
&self.cli_options.target,
117159
)
118160
} else {

0 commit comments

Comments
 (0)