@@ -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} ;
@@ -125,19 +127,20 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
125127 "aarch64"
126128 } ;
127129
130+ // Experimentally, keeping 2 cores free is fastest for cargo.
128131 let available_parallelism = std:: thread:: available_parallelism ( ) . unwrap ( ) . get ( ) ;
129- let chunk_size = self . intrinsics . len ( ) . div_ceil ( available_parallelism) ;
132+ let chunk_count = Ord :: min ( available_parallelism, self . intrinsics . len ( ) ) ;
133+ let chunk_size = self . intrinsics . len ( ) . div_ceil ( chunk_count) ;
130134
131135 let mut cargo = File :: create ( "rust_programs/Cargo.toml" ) . unwrap ( ) ;
132- write_cargo_toml ( & mut cargo, & [ ] ) . unwrap ( ) ;
136+ write_bin_cargo_toml ( & mut cargo, chunk_count ) . unwrap ( ) ;
133137
134138 let mut main_rs = File :: create ( "rust_programs/src/main.rs" ) . unwrap ( ) ;
135139 write_main_rs (
136140 & mut main_rs,
137- available_parallelism,
138- architecture,
141+ chunk_count,
139142 AARCH_CONFIGURATIONS ,
140- F16_FORMATTING_DEF ,
143+ "" ,
141144 self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
142145 )
143146 . unwrap ( ) ;
@@ -153,19 +156,41 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
153156 . map ( |( i, chunk) | {
154157 use std:: io:: Write ;
155158
156- let rust_filename = format ! ( "rust_programs/src/mod_{i}.rs" ) ;
159+ std:: fs:: create_dir_all ( format ! ( "rust_programs/mod_{i}/src" ) ) ?;
160+
161+ let rust_filename = format ! ( "rust_programs/mod_{i}/src/lib.rs" ) ;
157162 trace ! ( "generating `{rust_filename}`" ) ;
158163 let mut file = File :: create ( rust_filename) . unwrap ( ) ;
159164
160165 write ! ( file, "{notice}" ) ?;
161166
167+ writeln ! ( file, "#![feature(simd_ffi)]" ) ?;
168+ writeln ! ( file, "#![feature(f16)]" ) ?;
169+ writeln ! ( file, "#![allow(unused)]" ) ?;
170+
171+ // Cargo will spam the logs if these warnings are not silenced.
172+ writeln ! ( file, "#![allow(non_upper_case_globals)]" ) ?;
173+ writeln ! ( file, "#![allow(non_camel_case_types)]" ) ?;
174+ writeln ! ( file, "#![allow(non_snake_case)]" ) ?;
175+
176+ let cfg = AARCH_CONFIGURATIONS ;
177+ writeln ! ( file, "{cfg}" ) ?;
178+
162179 writeln ! ( file, "use core_arch::arch::{architecture}::*;" ) ?;
163- writeln ! ( file, "use crate::{{debug_simd_finish, debug_f16}};" ) ?;
180+
181+ let definitions = F16_FORMATTING_DEF ;
182+ writeln ! ( file, "{definitions}" ) ?;
164183
165184 for intrinsic in chunk {
166185 crate :: common:: gen_rust:: create_rust_test_module ( & mut file, intrinsic) ?;
167186 }
168187
188+ let toml_filename = format ! ( "rust_programs/mod_{i}/Cargo.toml" ) ;
189+ trace ! ( "generating `{toml_filename}`" ) ;
190+ let mut file = File :: create ( toml_filename) . unwrap ( ) ;
191+
192+ write_lib_cargo_toml ( & mut file, & format ! ( "mod_{i}" ) ) ?;
193+
169194 Ok ( ( ) )
170195 } )
171196 . collect :: < Result < ( ) , std:: io:: Error > > ( )
0 commit comments