@@ -13,7 +13,9 @@ use crate::common::SupportedArchitectureTest;
13
13
use crate :: common:: cli:: ProcessedCli ;
14
14
use crate :: common:: compare:: compare_outputs;
15
15
use 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
+ } ;
17
19
use crate :: common:: intrinsic:: Intrinsic ;
18
20
use crate :: common:: intrinsic_helpers:: TypeKind ;
19
21
use config:: { AARCH_CONFIGURATIONS , F16_FORMATTING_DEF , build_notices} ;
@@ -137,19 +139,20 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
137
139
"aarch64"
138
140
} ;
139
141
142
+ // Experimentally, keeping 2 cores free is fastest for cargo.
140
143
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) ;
142
146
143
147
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 ( ) ;
145
149
146
150
let mut main_rs = File :: create ( "rust_programs/src/main.rs" ) . unwrap ( ) ;
147
151
write_main_rs (
148
152
& mut main_rs,
149
- available_parallelism,
150
- architecture,
153
+ chunk_count,
151
154
AARCH_CONFIGURATIONS ,
152
- F16_FORMATTING_DEF ,
155
+ "" ,
153
156
self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
154
157
)
155
158
. unwrap ( ) ;
@@ -165,19 +168,41 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
165
168
. map ( |( i, chunk) | {
166
169
use std:: io:: Write ;
167
170
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" ) ;
169
174
trace ! ( "generating `{rust_filename}`" ) ;
170
175
let mut file = File :: create ( rust_filename) . unwrap ( ) ;
171
176
172
177
write ! ( file, "{notice}" ) ?;
173
178
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
+
174
191
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}" ) ?;
176
195
177
196
for intrinsic in chunk {
178
197
crate :: common:: gen_rust:: create_rust_test_module ( & mut file, intrinsic) ?;
179
198
}
180
199
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
+
181
206
Ok ( ( ) )
182
207
} )
183
208
. collect :: < Result < ( ) , std:: io:: Error > > ( )
0 commit comments