@@ -2,11 +2,12 @@ use super::argument::Argument;
2
2
use super :: config:: { AARCH_CONFIGURATIONS , POLY128_OSTREAM_DEF , build_notices} ;
3
3
use super :: format:: Indentation ;
4
4
use super :: intrinsic:: Intrinsic ;
5
- use crate :: common:: gen_c:: { compile_c, create_c_files, generate_c_program} ;
6
- use crate :: common:: gen_rust:: { compile_rust, create_rust_files, generate_rust_program} ;
5
+ use crate :: common:: gen_c:: { compile_c, create_c_filenames, generate_c_program} ;
6
+ use crate :: common:: gen_rust:: { compile_rust, create_rust_filenames, generate_rust_program} ;
7
+ use crate :: common:: write_file;
7
8
use itertools:: Itertools ;
8
9
use rayon:: prelude:: * ;
9
- use std:: io :: Write ;
10
+ use std:: collections :: BTreeMap ;
10
11
11
12
// The number of times each intrinsic will be called.
12
13
const PASSES : u32 = 20 ;
@@ -149,13 +150,14 @@ fn generate_rust_program_arm(intrinsic: &Intrinsic, target: &str) -> String {
149
150
}
150
151
151
152
fn compile_c_arm (
152
- intrinsics_name_list : Vec < String > ,
153
+ intrinsics_name_list : & Vec < String > ,
154
+ filename_mapping : BTreeMap < & String , String > ,
153
155
compiler : & str ,
154
156
target : & str ,
155
157
cxx_toolchain_dir : Option < & str > ,
156
158
) -> bool {
157
- let compiler_commands = intrinsics_name_list. iter ( ) . map ( |intrinsic_name|{
158
- let c_filename = format ! ( r#"c_programs/{ intrinsic_name}.cpp"# ) ;
159
+ let compiler_commands = intrinsics_name_list. iter ( ) . map ( |intrinsic_name| {
160
+ let c_filename = filename_mapping . get ( intrinsic_name) . unwrap ( ) ;
159
161
let flags = std:: env:: var ( "CPPFLAGS" ) . unwrap_or ( "" . into ( ) ) ;
160
162
let arch_flags = if target. contains ( "v7" ) {
161
163
"-march=armv8.6-a+crypto+crc+dotprod+fp16"
@@ -223,24 +225,29 @@ pub fn build_c(
223
225
target : & str ,
224
226
cxx_toolchain_dir : Option < & str > ,
225
227
) -> bool {
226
- let _ = std:: fs:: create_dir ( "c_programs" ) ;
227
228
let intrinsics_name_list = intrinsics
228
229
. par_iter ( )
229
230
. map ( |i| i. name . clone ( ) )
230
231
. collect :: < Vec < _ > > ( ) ;
231
- let file_mapping = create_c_files ( & intrinsics_name_list) ;
232
+ let filename_mapping = create_c_filenames ( & intrinsics_name_list) ;
232
233
233
234
intrinsics. par_iter ( ) . for_each ( |i| {
234
235
let c_code = generate_c_program_arm ( & [ "arm_neon.h" , "arm_acle.h" , "arm_fp16.h" ] , i, target) ;
235
- match file_mapping . get ( & i. name ) {
236
- Some ( mut file ) => file . write_all ( c_code. into_bytes ( ) . as_slice ( ) ) . unwrap ( ) ,
236
+ match filename_mapping . get ( & i. name ) {
237
+ Some ( filename ) => write_file ( filename , c_code) ,
237
238
None => { }
238
239
} ;
239
240
} ) ;
240
241
241
242
match compiler {
242
243
None => true ,
243
- Some ( compiler) => compile_c_arm ( intrinsics_name_list, compiler, target, cxx_toolchain_dir) ,
244
+ Some ( compiler) => compile_c_arm (
245
+ & intrinsics_name_list,
246
+ filename_mapping,
247
+ compiler,
248
+ target,
249
+ cxx_toolchain_dir,
250
+ ) ,
244
251
}
245
252
}
246
253
@@ -254,12 +261,12 @@ pub fn build_rust(
254
261
. par_iter ( )
255
262
. map ( |i| i. name . clone ( ) )
256
263
. collect :: < Vec < _ > > ( ) ;
257
- let file_mapping = create_rust_files ( & intrinsics_name_list) ;
264
+ let filename_mapping = create_rust_filenames ( & intrinsics_name_list) ;
258
265
259
266
intrinsics. par_iter ( ) . for_each ( |i| {
260
- let c_code = generate_rust_program_arm ( i, target) ;
261
- match file_mapping . get ( & i. name ) {
262
- Some ( mut file ) => file . write_all ( c_code . into_bytes ( ) . as_slice ( ) ) . unwrap ( ) ,
267
+ let rust_code = generate_rust_program_arm ( i, target) ;
268
+ match filename_mapping . get ( & i. name ) {
269
+ Some ( filename ) => write_file ( filename , rust_code ) ,
263
270
None => { }
264
271
}
265
272
} ) ;
0 commit comments