@@ -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} ;
@@ -125,19 +127,20 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
125
127
"aarch64"
126
128
} ;
127
129
130
+ // Experimentally, keeping 2 cores free is fastest for cargo.
128
131
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) ;
130
134
131
135
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 ( ) ;
133
137
134
138
let mut main_rs = File :: create ( "rust_programs/src/main.rs" ) . unwrap ( ) ;
135
139
write_main_rs (
136
140
& mut main_rs,
137
- available_parallelism,
138
- architecture,
141
+ chunk_count,
139
142
AARCH_CONFIGURATIONS ,
140
- F16_FORMATTING_DEF ,
143
+ "" ,
141
144
self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
142
145
)
143
146
. unwrap ( ) ;
@@ -153,19 +156,41 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
153
156
. map ( |( i, chunk) | {
154
157
use std:: io:: Write ;
155
158
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" ) ;
157
162
trace ! ( "generating `{rust_filename}`" ) ;
158
163
let mut file = File :: create ( rust_filename) . unwrap ( ) ;
159
164
160
165
write ! ( file, "{notice}" ) ?;
161
166
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
+
162
179
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}" ) ?;
164
183
165
184
for intrinsic in chunk {
166
185
crate :: common:: gen_rust:: create_rust_test_module ( & mut file, intrinsic) ?;
167
186
}
168
187
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
+
169
194
Ok ( ( ) )
170
195
} )
171
196
. collect :: < Result < ( ) , std:: io:: Error > > ( )
0 commit comments