@@ -13,7 +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, write_cargo_toml, write_main_rs} ;
16+ use crate :: common:: gen_rust:: {
17+ compile_rust_programs, write_bin_cargo_toml, write_lib_cargo_toml, write_main_rs,
18+ } ;
1719use crate :: common:: intrinsic:: Intrinsic ;
1820use crate :: common:: intrinsic_helpers:: TypeKind ;
1921use config:: { AARCH_CONFIGURATIONS , F16_FORMATTING_DEF , build_notices} ;
@@ -137,19 +139,20 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
137139 "aarch64"
138140 } ;
139141
142+ // Experimentally, keeping 2 cores free is fastest for cargo.
140143 let available_parallelism = std:: thread:: available_parallelism ( ) . unwrap ( ) . get ( ) ;
141- let chunk_size = self . intrinsics . len ( ) . div_ceil ( available_parallelism) ;
144+ let chunk_count = Ord :: min ( available_parallelism, self . intrinsics . len ( ) ) ;
145+ let chunk_size = self . intrinsics . len ( ) . div_ceil ( chunk_count) ;
142146
143147 let mut cargo = File :: create ( "rust_programs/Cargo.toml" ) . unwrap ( ) ;
144- write_cargo_toml ( & mut cargo, & [ ] ) . unwrap ( ) ;
148+ write_bin_cargo_toml ( & mut cargo, chunk_count ) . unwrap ( ) ;
145149
146150 let mut main_rs = File :: create ( "rust_programs/src/main.rs" ) . unwrap ( ) ;
147151 write_main_rs (
148152 & mut main_rs,
149- available_parallelism,
150- architecture,
153+ chunk_count,
151154 AARCH_CONFIGURATIONS ,
152- F16_FORMATTING_DEF ,
155+ "" ,
153156 self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
154157 )
155158 . unwrap ( ) ;
@@ -165,19 +168,41 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
165168 . map ( |( i, chunk) | {
166169 use std:: io:: Write ;
167170
168- let rust_filename = format ! ( "rust_programs/src/mod_{i}.rs" ) ;
171+ std:: fs:: create_dir_all ( format ! ( "rust_programs/mod_{i}/src" ) ) ?;
172+
173+ let rust_filename = format ! ( "rust_programs/mod_{i}/src/lib.rs" ) ;
169174 trace ! ( "generating `{rust_filename}`" ) ;
170175 let mut file = File :: create ( rust_filename) . unwrap ( ) ;
171176
172177 write ! ( file, "{notice}" ) ?;
173178
179+ writeln ! ( file, "#![feature(simd_ffi)]" ) ?;
180+ writeln ! ( file, "#![feature(f16)]" ) ?;
181+ writeln ! ( file, "#![allow(unused)]" ) ?;
182+
183+ // Cargo will spam the logs if these warnings are not silenced.
184+ writeln ! ( file, "#![allow(non_upper_case_globals)]" ) ?;
185+ writeln ! ( file, "#![allow(non_camel_case_types)]" ) ?;
186+ writeln ! ( file, "#![allow(non_snake_case)]" ) ?;
187+
188+ let cfg = AARCH_CONFIGURATIONS ;
189+ writeln ! ( file, "{cfg}" ) ?;
190+
174191 writeln ! ( file, "use core_arch::arch::{architecture}::*;" ) ?;
175- writeln ! ( file, "use crate::{{debug_simd_finish, debug_f16}};" ) ?;
192+
193+ let definitions = F16_FORMATTING_DEF ;
194+ writeln ! ( file, "{definitions}" ) ?;
176195
177196 for intrinsic in chunk {
178197 crate :: common:: gen_rust:: create_rust_test_module ( & mut file, intrinsic) ?;
179198 }
180199
200+ let toml_filename = format ! ( "rust_programs/mod_{i}/Cargo.toml" ) ;
201+ trace ! ( "generating `{toml_filename}`" ) ;
202+ let mut file = File :: create ( toml_filename) . unwrap ( ) ;
203+
204+ write_lib_cargo_toml ( & mut file, & format ! ( "mod_{i}" ) ) ?;
205+
181206 Ok ( ( ) )
182207 } )
183208 . collect :: < Result < ( ) , std:: io:: Error > > ( )
0 commit comments