@@ -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
@@ -51,24 +56,57 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
5156 }
5257
5358 fn build_c_file ( & self ) -> bool {
54- let target = & self . cli_options . target ;
5559 let c_target = "aarch64" ;
60+ let platform_headers = & [ "arm_neon.h" , "arm_acle.h" , "arm_fp16.h" ] ;
5661
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,
64- c_target,
65- & [ "arm_neon.h" , "arm_acle.h" , "arm_fp16.h" ] ,
66- & build_notices ( "// " ) ,
67- & [ POLY128_OSTREAM_DEF ] ,
68- ) ;
62+ let available_parallelism = std:: thread:: available_parallelism ( ) . unwrap ( ) . get ( ) ;
63+ let chunk_size = self . intrinsics . len ( ) . div_ceil ( available_parallelism) ;
6964
7065 let pipeline = compile:: build_cpp_compilation ( & self . cli_options ) . unwrap ( ) ;
71- compile_c_programs ( & pipeline, & intrinsics_name_list)
66+
67+ let notice = & build_notices ( "// " ) ;
68+ self . intrinsics
69+ . par_chunks ( chunk_size)
70+ . enumerate ( )
71+ . map ( |( i, chunk) | {
72+ let c_filename = format ! ( "c_programs/mod_{i}.cpp" ) ;
73+ let mut file = File :: create ( & c_filename) . unwrap ( ) ;
74+ write_mod_cpp ( & mut file, notice, c_target, platform_headers, chunk) . unwrap ( ) ;
75+
76+ // compile this cpp file into a .o file
77+ let output = pipeline. run ( & [ ] , & [ format ! ( "mod_{i}.cpp" ) ] , & format ! ( "mod_{i}.o" ) ) ?;
78+ assert ! ( output. status. success( ) ) ;
79+
80+ Ok ( ( ) )
81+ } )
82+ . collect :: < Result < ( ) , std:: io:: Error > > ( )
83+ . unwrap ( ) ;
84+
85+ let mut file = File :: create ( "c_programs/main.cpp" ) . unwrap ( ) ;
86+ write_main_cpp (
87+ & mut file,
88+ c_target,
89+ POLY128_OSTREAM_DEF ,
90+ self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
91+ )
92+ . unwrap ( ) ;
93+
94+ // Files to include in the final link step.
95+ let mut includes = vec ! [ ] ;
96+ for i in 0 ..Ord :: min ( available_parallelism, self . intrinsics . len ( ) ) {
97+ includes. push ( format ! ( "mod_{i}.o" ) ) ;
98+ }
99+
100+ let output = pipeline
101+ . run (
102+ & includes,
103+ & [ "main.cpp" . to_string ( ) ] ,
104+ "intrinsic-test-programs" ,
105+ )
106+ . unwrap ( ) ;
107+ assert ! ( output. status. success( ) ) ;
108+
109+ true
72110 }
73111
74112 fn build_rust_file ( & self ) -> bool {
0 commit comments