@@ -5,14 +5,17 @@ mod intrinsic;
55mod types;
66mod xml_parser;
77
8- use crate :: common:: SupportedArchitectureTest ;
8+ use rayon:: prelude:: * ;
9+ use std:: fs;
10+
911use crate :: common:: cli:: ProcessedCli ;
1012use crate :: common:: compare:: compare_outputs;
13+ use crate :: common:: gen_c:: { write_main_cpp, write_mod_cpp} ;
1114use crate :: common:: gen_rust:: compile_rust_programs;
1215use crate :: common:: intrinsic:: { Intrinsic , IntrinsicDefinition } ;
1316use crate :: common:: intrinsic_helpers:: TypeKind ;
14- use crate :: common:: write_file:: { write_c_testfiles , write_rust_testfiles} ;
15- use crate :: x86 :: compile :: compile_c_x86 ;
17+ use crate :: common:: write_file:: write_rust_testfiles;
18+ use crate :: common :: { SupportedArchitectureTest , chunk_info } ;
1619use crate :: x86:: config:: { F16_FORMATTING_DEF , X86_CONFIGURATIONS } ;
1720use config:: build_notices;
1821use intrinsic:: X86IntrinsicType ;
@@ -54,26 +57,66 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
5457 let target = & self . cli_options . target ;
5558 let cxx_toolchain_dir = self . cli_options . cxx_toolchain_dir . as_deref ( ) ;
5659 let c_target = "x86_64" ;
60+ let ( chunk_size, chunk_count) = chunk_info ( self . intrinsics . len ( ) ) ;
61+ let notice = & build_notices ( "// " ) ;
62+ let platform_headers = & [ "immintrin.h" ] ;
5763
58- let intrinsics_name_list = write_c_testfiles (
59- & self
60- . intrinsics
61- . iter ( )
62- . map ( |i| i as & dyn IntrinsicDefinition < _ > )
63- . collect :: < Vec < _ > > ( ) ,
64- target,
64+ let cpp_compiler = compile:: build_cpp_compilation ( & self . cli_options ) ;
65+
66+ match fs:: exists ( "c_programs" ) {
67+ Ok ( false ) => fs:: create_dir ( "c_programs" ) . unwrap ( ) ,
68+ Ok ( true ) => { }
69+ _ => return false ,
70+ }
71+
72+ self . intrinsics
73+ . par_chunks ( chunk_size)
74+ . enumerate ( )
75+ . map ( |( i, chunk) | {
76+ let c_filename = format ! ( "c_programs/mod_{i}.cpp" ) ;
77+ let mut file = fs:: File :: create ( & c_filename) . unwrap ( ) ;
78+ write_mod_cpp ( & mut file, notice, c_target, platform_headers, chunk) . unwrap ( ) ;
79+
80+ // compile this cpp file into a .o file
81+ if let Some ( compiler) = cpp_compiler. as_ref ( ) {
82+ let output = compiler
83+ . compile_object_file ( & format ! ( "mod_{i}.cpp" ) , & format ! ( "mod_{i}.o" ) ) ?;
84+ assert ! ( output. status. success( ) , "{output:?}" ) ;
85+ }
86+ Ok ( ( ) )
87+ } )
88+ . collect :: < Result < ( ) , std:: io:: Error > > ( )
89+ . unwrap ( ) ;
90+
91+ let mut file = fs:: File :: create ( "c_programs/main.cpp" ) . unwrap ( ) ;
92+ write_main_cpp (
93+ & mut file,
6594 c_target,
66- & [ "immintrin.h" ] ,
67- & build_notices ( "// " ) ,
68- & [ ] ,
69- ) ;
95+ "" ,
96+ Vec :: from ( platform_headers) ,
97+ self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
98+ )
99+ . unwrap ( ) ;
70100
71- match compiler {
72- None => true ,
73- Some ( compiler) => {
74- compile_c_x86 ( & intrinsics_name_list, compiler, target, cxx_toolchain_dir)
75- }
101+ // compile this cpp file into a .o file
102+ if let Some ( compiler) = cpp_compiler. as_ref ( ) {
103+ info ! ( "compiling main.cpp" ) ;
104+ let output = compiler
105+ . compile_object_file ( "main.cpp" , "intrinsic-test-programs.o" )
106+ . unwrap ( ) ;
107+ assert ! ( output. status. success( ) , "{output:?}" ) ;
108+
109+ let object_files = ( 0 ..chunk_count)
110+ . map ( |i| format ! ( "mod_{i}.o" ) )
111+ . chain ( [ "intrinsic-test-programs.o" . to_owned ( ) ] ) ;
112+
113+ let output = compiler
114+ . link_executable ( object_files, "intrinsic-test-programs" )
115+ . unwrap ( ) ;
116+ assert ! ( output. status. success( ) , "{output:?}" ) ;
76117 }
118+
119+ true
77120 }
78121
79122 fn build_rust_file ( & self ) -> bool {
@@ -102,7 +145,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
102145 }
103146
104147 fn compare_outputs ( & self ) -> bool {
105- if let Some ( ref toolchain ) = self . cli_options . toolchain {
148+ if self . cli_options . toolchain . is_some ( ) {
106149 let intrinsics_name_list = self
107150 . intrinsics
108151 . iter ( )
@@ -111,8 +154,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
111154
112155 compare_outputs (
113156 & intrinsics_name_list,
114- toolchain,
115- & self . cli_options . c_runner ,
157+ & self . cli_options . runner ,
116158 & self . cli_options . target ,
117159 )
118160 } else {
0 commit comments