@@ -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 ;
@@ -50,30 +53,67 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
5053 }
5154
5255 fn build_c_file ( & self ) -> bool {
53- let compiler = self . cli_options . cpp_compiler . as_deref ( ) ;
54- let target = & self . cli_options . target ;
55- let cxx_toolchain_dir = self . cli_options . cxx_toolchain_dir . as_deref ( ) ;
5656 let c_target = "x86_64" ;
57+ let ( chunk_size, chunk_count) = chunk_info ( self . intrinsics . len ( ) ) ;
58+ let notice = & build_notices ( "// " ) ;
59+ let platform_headers = & [ "immintrin.h" ] ;
5760
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,
61+ let cpp_compiler = compile:: build_cpp_compilation ( & self . cli_options ) ;
62+
63+ match fs:: exists ( "c_programs" ) {
64+ Ok ( false ) => fs:: create_dir ( "c_programs" ) . unwrap ( ) ,
65+ Ok ( true ) => { }
66+ _ => return false ,
67+ }
68+
69+ self . intrinsics
70+ . par_chunks ( chunk_size)
71+ . enumerate ( )
72+ . map ( |( i, chunk) | {
73+ let c_filename = format ! ( "c_programs/mod_{i}.cpp" ) ;
74+ let mut file = fs:: File :: create ( & c_filename) . unwrap ( ) ;
75+ write_mod_cpp ( & mut file, notice, c_target, platform_headers, chunk) . unwrap ( ) ;
76+
77+ // compile this cpp file into a .o file
78+ if let Some ( compiler) = cpp_compiler. as_ref ( ) {
79+ let output = compiler
80+ . compile_object_file ( & format ! ( "mod_{i}.cpp" ) , & format ! ( "mod_{i}.o" ) ) ?;
81+ assert ! ( output. status. success( ) , "{output:?}" ) ;
82+ }
83+ Ok ( ( ) )
84+ } )
85+ . collect :: < Result < ( ) , std:: io:: Error > > ( )
86+ . unwrap ( ) ;
87+
88+ let mut file = fs:: File :: create ( "c_programs/main.cpp" ) . unwrap ( ) ;
89+ write_main_cpp (
90+ & mut file,
6591 c_target,
66- & [ "immintrin.h" ] ,
67- & build_notices ( "// " ) ,
68- & [ ] ,
69- ) ;
92+ "" ,
93+ Vec :: from ( platform_headers) ,
94+ self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
95+ )
96+ . unwrap ( ) ;
97+
98+ // compile this cpp file into a .o file
99+ if let Some ( compiler) = cpp_compiler. as_ref ( ) {
100+ info ! ( "compiling main.cpp" ) ;
101+ let output = compiler
102+ . compile_object_file ( "main.cpp" , "intrinsic-test-programs.o" )
103+ . unwrap ( ) ;
104+ assert ! ( output. status. success( ) , "{output:?}" ) ;
70105
71- match compiler {
72- None => true ,
73- Some ( compiler) => {
74- compile_c_x86 ( & intrinsics_name_list, compiler, target, cxx_toolchain_dir)
75- }
106+ let object_files = ( 0 ..chunk_count)
107+ . map ( |i| format ! ( "mod_{i}.o" ) )
108+ . chain ( [ "intrinsic-test-programs.o" . to_owned ( ) ] ) ;
109+
110+ let output = compiler
111+ . link_executable ( object_files, "intrinsic-test-programs" )
112+ . unwrap ( ) ;
113+ assert ! ( output. status. success( ) , "{output:?}" ) ;
76114 }
115+
116+ true
77117 }
78118
79119 fn build_rust_file ( & self ) -> bool {
@@ -102,7 +142,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
102142 }
103143
104144 fn compare_outputs ( & self ) -> bool {
105- if let Some ( ref toolchain ) = self . cli_options . toolchain {
145+ if self . cli_options . toolchain . is_some ( ) {
106146 let intrinsics_name_list = self
107147 . intrinsics
108148 . iter ( )
@@ -111,8 +151,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
111151
112152 compare_outputs (
113153 & intrinsics_name_list,
114- toolchain,
115- & self . cli_options . c_runner ,
154+ & self . cli_options . runner ,
116155 & self . cli_options . target ,
117156 )
118157 } else {
0 commit comments