Skip to content

Commit accc019

Browse files
feat: implemented build_rust_file of x86 module
1 parent 989a8ff commit accc019

File tree

1 file changed

+58
-1
lines changed
  • crates/intrinsic-test/src/x86

1 file changed

+58
-1
lines changed

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

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@ use std::fs::{self, File};
1010

1111
use crate::common::cli::ProcessedCli;
1212
use crate::common::gen_c::{write_main_cpp, write_mod_cpp};
13+
use crate::common::gen_rust::{
14+
compile_rust_programs, write_bin_cargo_toml, write_lib_cargo_toml, write_lib_rs, write_main_rs,
15+
};
1316
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
1417
use crate::common::intrinsic_helpers::TypeKind;
1518
use crate::common::{SupportedArchitectureTest, chunk_info};
19+
use crate::x86::config::{F16_FORMATTING_DEF, X86_CONFIGURATIONS};
1620
use config::build_notices;
1721
use intrinsic::X86IntrinsicType;
1822
use xml_parser::get_xml_intrinsics;
@@ -114,7 +118,60 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
114118
}
115119

116120
fn build_rust_file(&self) -> bool {
117-
todo!("build_rust_file in X86ArchitectureTest is not implemented")
121+
std::fs::create_dir_all("rust_programs/src").unwrap();
122+
123+
let architecture = if self.cli_options.target.contains("v7") {
124+
"arm"
125+
} else {
126+
"aarch64"
127+
};
128+
129+
let (chunk_size, chunk_count) = chunk_info(self.intrinsics.len());
130+
131+
let mut cargo = File::create("rust_programs/Cargo.toml").unwrap();
132+
write_bin_cargo_toml(&mut cargo, chunk_count).unwrap();
133+
134+
let mut main_rs = File::create("rust_programs/src/main.rs").unwrap();
135+
write_main_rs(
136+
&mut main_rs,
137+
chunk_count,
138+
X86_CONFIGURATIONS,
139+
"",
140+
self.intrinsics.iter().map(|i| i.name.as_str()),
141+
)
142+
.unwrap();
143+
144+
let target = &self.cli_options.target;
145+
let toolchain = self.cli_options.toolchain.as_deref();
146+
let linker = self.cli_options.linker.as_deref();
147+
148+
let notice = &build_notices("// ");
149+
self.intrinsics
150+
.par_chunks(chunk_size)
151+
.enumerate()
152+
.map(|(i, chunk)| {
153+
std::fs::create_dir_all(format!("rust_programs/mod_{i}/src"))?;
154+
155+
let rust_filename = format!("rust_programs/mod_{i}/src/lib.rs");
156+
trace!("generating `{rust_filename}`");
157+
let mut file = File::create(rust_filename)?;
158+
159+
let cfg = X86_CONFIGURATIONS;
160+
let definitions = F16_FORMATTING_DEF;
161+
write_lib_rs(&mut file, architecture, notice, cfg, definitions, chunk)?;
162+
163+
let toml_filename = format!("rust_programs/mod_{i}/Cargo.toml");
164+
trace!("generating `{toml_filename}`");
165+
let mut file = File::create(toml_filename).unwrap();
166+
167+
write_lib_cargo_toml(&mut file, &format!("mod_{i}"))?;
168+
169+
Ok(())
170+
})
171+
.collect::<Result<(), std::io::Error>>()
172+
.unwrap();
173+
174+
compile_rust_programs(toolchain, target, linker)
118175
}
119176

120177
fn compare_outputs(&self) -> bool {

0 commit comments

Comments
 (0)