@@ -13,10 +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;
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 ;
18
18
use crate :: common:: intrinsic_helpers:: TypeKind ;
19
- use crate :: common:: write_file:: write_rust_testfiles;
20
19
use config:: { AARCH_CONFIGURATIONS , F16_FORMATTING_DEF , build_notices} ;
21
20
use intrinsic:: ArmIntrinsicType ;
22
21
use json_parser:: get_neon_intrinsics;
@@ -118,26 +117,61 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
118
117
}
119
118
120
119
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" ) {
122
123
"arm"
123
124
} else {
124
125
"aarch64"
125
126
} ;
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
+
126
145
let target = & self . cli_options . target ;
127
146
let toolchain = self . cli_options . toolchain . as_deref ( ) ;
128
147
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
- ) ;
139
148
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)
141
175
}
142
176
143
177
fn compare_outputs ( & self ) -> bool {
0 commit comments