|
| 1 | +mod compile; |
| 2 | +mod config; |
1 | 3 | mod constraint;
|
2 | 4 | mod intrinsic;
|
3 | 5 | mod types;
|
4 | 6 | mod xml_parser;
|
5 | 7 |
|
| 8 | +use std::fs::{self, File}; |
| 9 | +use rayon::prelude::*; |
| 10 | + |
6 | 11 | use crate::common::cli::ProcessedCli;
|
7 | 12 | use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
|
8 | 13 | use crate::common::intrinsic_helpers::TypeKind;
|
9 |
| -use crate::common::SupportedArchitectureTest; |
| 14 | +use crate::common::{SupportedArchitectureTest, chunk_info}; |
| 15 | +use crate::common::gen_c::{write_main_cpp, write_mod_cpp}; |
10 | 16 | use intrinsic::X86IntrinsicType;
|
11 | 17 | use xml_parser::get_xml_intrinsics;
|
| 18 | +use config::build_notices; |
12 | 19 |
|
13 | 20 | pub struct X86ArchitectureTest {
|
14 | 21 | intrinsics: Vec<Intrinsic<X86IntrinsicType>>,
|
@@ -42,7 +49,68 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
|
42 | 49 | }
|
43 | 50 |
|
44 | 51 | fn build_c_file(&self) -> bool {
|
45 |
| - todo!("build_c_file in X86ArchitectureTest is not implemented") |
| 52 | + let c_target = "aarch64"; |
| 53 | + let platform_headers = &["arm_neon.h", "arm_acle.h", "arm_fp16.h"]; |
| 54 | + |
| 55 | + let (chunk_size, chunk_count) = chunk_info(self.intrinsics.len()); |
| 56 | + |
| 57 | + let cpp_compiler_wrapped = compile::build_cpp_compilation(&self.cli_options); |
| 58 | + |
| 59 | + let notice = &build_notices("// "); |
| 60 | + fs::create_dir_all("c_programs").unwrap(); |
| 61 | + self.intrinsics |
| 62 | + .par_chunks(chunk_size) |
| 63 | + .enumerate() |
| 64 | + .map(|(i, chunk)| { |
| 65 | + let c_filename = format!("c_programs/mod_{i}.cpp"); |
| 66 | + let mut file = File::create(&c_filename).unwrap(); |
| 67 | + write_mod_cpp(&mut file, notice, c_target, platform_headers, chunk).unwrap(); |
| 68 | + |
| 69 | + // compile this cpp file into a .o file. |
| 70 | + // |
| 71 | + // This is done because `cpp_compiler_wrapped` is None when |
| 72 | + // the --generate-only flag is passed |
| 73 | + if let Some(cpp_compiler) = cpp_compiler_wrapped.as_ref() { |
| 74 | + let output = cpp_compiler |
| 75 | + .compile_object_file(&format!("mod_{i}.cpp"), &format!("mod_{i}.o"))?; |
| 76 | + assert!(output.status.success(), "{output:?}"); |
| 77 | + } |
| 78 | + |
| 79 | + Ok(()) |
| 80 | + }) |
| 81 | + .collect::<Result<(), std::io::Error>>() |
| 82 | + .unwrap(); |
| 83 | + |
| 84 | + let mut file = File::create("c_programs/main.cpp").unwrap(); |
| 85 | + write_main_cpp( |
| 86 | + &mut file, |
| 87 | + c_target, |
| 88 | + "\n", |
| 89 | + self.intrinsics.iter().map(|i| i.name.as_str()), |
| 90 | + ) |
| 91 | + .unwrap(); |
| 92 | + |
| 93 | + // This is done because `cpp_compiler_wrapped` is None when |
| 94 | + // the --generate-only flag is passed |
| 95 | + if let Some(cpp_compiler) = cpp_compiler_wrapped.as_ref() { |
| 96 | + // compile this cpp file into a .o file |
| 97 | + info!("compiling main.cpp"); |
| 98 | + let output = cpp_compiler |
| 99 | + .compile_object_file("main.cpp", "intrinsic-test-programs.o") |
| 100 | + .unwrap(); |
| 101 | + assert!(output.status.success(), "{output:?}"); |
| 102 | + |
| 103 | + let object_files = (0..chunk_count) |
| 104 | + .map(|i| format!("mod_{i}.o")) |
| 105 | + .chain(["intrinsic-test-programs.o".to_owned()]); |
| 106 | + |
| 107 | + let output = cpp_compiler |
| 108 | + .link_executable(object_files, "intrinsic-test-programs") |
| 109 | + .unwrap(); |
| 110 | + assert!(output.status.success(), "{output:?}"); |
| 111 | + } |
| 112 | + |
| 113 | + true |
46 | 114 | }
|
47 | 115 |
|
48 | 116 | fn build_rust_file(&self) -> bool {
|
|
0 commit comments