@@ -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( ) , "{output:?}" ) ;
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( ) , "{output:?}" ) ;
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( ) , "{output:?}" ) ;
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