@@ -4,15 +4,20 @@ mod intrinsic;
44mod  json_parser; 
55mod  types; 
66
7+ use  std:: fs:: File ; 
8+ 
9+ use  rayon:: prelude:: * ; 
10+ 
11+ use  crate :: arm:: config:: POLY128_OSTREAM_DEF ; 
712use  crate :: common:: SupportedArchitectureTest ; 
813use  crate :: common:: cli:: ProcessedCli ; 
914use  crate :: common:: compare:: compare_outputs; 
10- use  crate :: common:: gen_c:: compile_c_programs ; 
15+ use  crate :: common:: gen_c:: { write_main_cpp ,  write_mod_cpp } ; 
1116use  crate :: common:: gen_rust:: compile_rust_programs; 
1217use  crate :: common:: intrinsic:: { Intrinsic ,  IntrinsicDefinition } ; 
1318use  crate :: common:: intrinsic_helpers:: TypeKind ; 
14- use  crate :: common:: write_file:: { write_c_testfiles ,   write_rust_testfiles} ; 
15- use  config:: { AARCH_CONFIGURATIONS ,  F16_FORMATTING_DEF ,  POLY128_OSTREAM_DEF ,   build_notices} ; 
19+ use  crate :: common:: write_file:: write_rust_testfiles; 
20+ use  config:: { AARCH_CONFIGURATIONS ,  F16_FORMATTING_DEF ,  build_notices} ; 
1621use  intrinsic:: ArmIntrinsicType ; 
1722use  json_parser:: get_neon_intrinsics; 
1823
@@ -21,6 +26,13 @@ pub struct ArmArchitectureTest {
2126    cli_options :  ProcessedCli , 
2227} 
2328
29+ fn  chunk_info ( intrinsic_count :  usize )  -> ( usize ,  usize )  { 
30+     let  available_parallelism = std:: thread:: available_parallelism ( ) . unwrap ( ) . get ( ) ; 
31+     let  chunk_size = intrinsic_count. div_ceil ( Ord :: min ( available_parallelism,  intrinsic_count) ) ; 
32+ 
33+     ( chunk_size,  intrinsic_count. div_ceil ( chunk_size) ) 
34+ } 
35+ 
2436impl  SupportedArchitectureTest  for  ArmArchitectureTest  { 
2537    fn  create ( cli_options :  ProcessedCli )  -> Box < Self >  { 
2638        let  a32 = cli_options. target . contains ( "v7" ) ; 
@@ -51,24 +63,58 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
5163    } 
5264
5365    fn  build_c_file ( & self )  -> bool  { 
54-         let  target = & self . cli_options . target ; 
5566        let  c_target = "aarch64" ; 
67+         let  platform_headers = & [ "arm_neon.h" ,  "arm_acle.h" ,  "arm_fp16.h" ] ; 
5668
57-         let  intrinsics_name_list = write_c_testfiles ( 
58-             & self 
59-                 . intrinsics 
60-                 . iter ( ) 
61-                 . map ( |i| i as  & dyn  IntrinsicDefinition < _ > ) 
62-                 . collect :: < Vec < _ > > ( ) , 
63-             target, 
69+         let  ( chunk_size,  chunk_count)  = chunk_info ( self . intrinsics . len ( ) ) ; 
70+ 
71+         let  cpp_compiler = compile:: build_cpp_compilation ( & self . cli_options ) . unwrap ( ) ; 
72+ 
73+         let  notice = & build_notices ( "// " ) ; 
74+         self . intrinsics 
75+             . par_chunks ( chunk_size) 
76+             . enumerate ( ) 
77+             . map ( |( i,  chunk) | { 
78+                 let  c_filename = format ! ( "c_programs/mod_{i}.cpp" ) ; 
79+                 let  mut  file = File :: create ( & c_filename) . unwrap ( ) ; 
80+                 write_mod_cpp ( & mut  file,  notice,  c_target,  platform_headers,  chunk) . unwrap ( ) ; 
81+ 
82+                 // compile this cpp file into a .o file 
83+                 let  output = cpp_compiler
84+                     . compile_object_file ( & format ! ( "mod_{i}.cpp" ) ,  & format ! ( "mod_{i}.o" ) ) ?; 
85+                 assert ! ( output. status. success( ) ) ; 
86+ 
87+                 Ok ( ( ) ) 
88+             } ) 
89+             . collect :: < Result < ( ) ,  std:: io:: Error > > ( ) 
90+             . unwrap ( ) ; 
91+ 
92+         let  mut  file = File :: create ( "c_programs/main.cpp" ) . unwrap ( ) ; 
93+         write_main_cpp ( 
94+             & mut  file, 
6495            c_target, 
65-             & [ "arm_neon.h" ,  "arm_acle.h" ,  "arm_fp16.h" ] , 
66-             & build_notices ( "// " ) , 
67-             & [ POLY128_OSTREAM_DEF ] , 
68-         ) ; 
96+             POLY128_OSTREAM_DEF , 
97+             self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) , 
98+         ) 
99+         . unwrap ( ) ; 
100+ 
101+         // compile this cpp file into a .o file 
102+         info ! ( "compiling main.cpp" ) ; 
103+         let  output = cpp_compiler
104+             . compile_object_file ( "main.cpp" ,  "intrinsic-test-programs.o" ) 
105+             . unwrap ( ) ; 
106+         assert ! ( output. status. success( ) ) ; 
107+ 
108+         let  object_files = ( 0 ..chunk_count) 
109+             . map ( |i| format ! ( "mod_{i}.o" ) ) 
110+             . chain ( [ "intrinsic-test-programs.o" . to_owned ( ) ] ) ; 
111+ 
112+         let  output = cpp_compiler
113+             . link_executable ( object_files,  "intrinsic-test-programs" ) 
114+             . unwrap ( ) ; 
115+         assert ! ( output. status. success( ) ) ; 
69116
70-         let  pipeline = compile:: build_cpp_compilation ( & self . cli_options ) . unwrap ( ) ; 
71-         compile_c_programs ( & pipeline,  & intrinsics_name_list) 
117+         true 
72118    } 
73119
74120    fn  build_rust_file ( & self )  -> bool  { 
0 commit comments