@@ -13,10 +13,9 @@ use crate::common::SupportedArchitectureTest;
1313use crate :: common:: cli:: ProcessedCli ;
1414use crate :: common:: compare:: compare_outputs;
1515use crate :: common:: gen_c:: { write_main_cpp, write_mod_cpp} ;
16- use crate :: common:: gen_rust:: compile_rust_programs;
17- use crate :: common:: intrinsic:: { Intrinsic , IntrinsicDefinition } ;
16+ use crate :: common:: gen_rust:: { compile_rust_programs, write_cargo_toml , write_main_rs } ;
17+ use crate :: common:: intrinsic:: Intrinsic ;
1818use crate :: common:: intrinsic_helpers:: TypeKind ;
19- use crate :: common:: write_file:: write_rust_testfiles;
2019use config:: { AARCH_CONFIGURATIONS , F16_FORMATTING_DEF , build_notices} ;
2120use intrinsic:: ArmIntrinsicType ;
2221use json_parser:: get_neon_intrinsics;
@@ -118,26 +117,61 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
118117 }
119118
120119 fn build_rust_file ( & self ) -> bool {
121- let rust_target = if self . cli_options . target . contains ( "v7" ) {
120+ std:: fs:: create_dir_all ( "rust_programs/src" ) . unwrap ( ) ;
121+
122+ let architecture = if self . cli_options . target . contains ( "v7" ) {
122123 "arm"
123124 } else {
124125 "aarch64"
125126 } ;
127+
128+ let available_parallelism = std:: thread:: available_parallelism ( ) . unwrap ( ) . get ( ) ;
129+ let chunk_size = self . intrinsics . len ( ) . div_ceil ( available_parallelism) ;
130+
131+ let mut cargo = File :: create ( "rust_programs/Cargo.toml" ) . unwrap ( ) ;
132+ write_cargo_toml ( & mut cargo, & [ ] ) . unwrap ( ) ;
133+
134+ let mut main_rs = File :: create ( "rust_programs/src/main.rs" ) . unwrap ( ) ;
135+ write_main_rs (
136+ & mut main_rs,
137+ available_parallelism,
138+ architecture,
139+ AARCH_CONFIGURATIONS ,
140+ F16_FORMATTING_DEF ,
141+ self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
142+ )
143+ . unwrap ( ) ;
144+
126145 let target = & self . cli_options . target ;
127146 let toolchain = self . cli_options . toolchain . as_deref ( ) ;
128147 let linker = self . cli_options . linker . as_deref ( ) ;
129- let intrinsics_name_list = write_rust_testfiles (
130- self . intrinsics
131- . iter ( )
132- . map ( |i| i as & dyn IntrinsicDefinition < _ > )
133- . collect :: < Vec < _ > > ( ) ,
134- rust_target,
135- & build_notices ( "// " ) ,
136- F16_FORMATTING_DEF ,
137- AARCH_CONFIGURATIONS ,
138- ) ;
139148
140- compile_rust_programs ( intrinsics_name_list, toolchain, target, linker)
149+ let notice = & build_notices ( "// " ) ;
150+ self . intrinsics
151+ . par_chunks ( chunk_size)
152+ . enumerate ( )
153+ . map ( |( i, chunk) | {
154+ use std:: io:: Write ;
155+
156+ let rust_filename = format ! ( "rust_programs/src/mod_{i}.rs" ) ;
157+ trace ! ( "generating `{rust_filename}`" ) ;
158+ let mut file = File :: create ( rust_filename) . unwrap ( ) ;
159+
160+ write ! ( file, "{notice}" ) ?;
161+
162+ writeln ! ( file, "use core_arch::arch::{architecture}::*;" ) ?;
163+ writeln ! ( file, "use crate::{{debug_simd_finish, debug_f16}};" ) ?;
164+
165+ for intrinsic in chunk {
166+ crate :: common:: gen_rust:: create_rust_test_module ( & mut file, intrinsic) ?;
167+ }
168+
169+ Ok ( ( ) )
170+ } )
171+ . collect :: < Result < ( ) , std:: io:: Error > > ( )
172+ . unwrap ( ) ;
173+
174+ compile_rust_programs ( toolchain, target, linker)
141175 }
142176
143177 fn compare_outputs ( & self ) -> bool {
0 commit comments