@@ -5,14 +5,17 @@ mod intrinsic;
5
5
mod types;
6
6
mod xml_parser;
7
7
8
- use crate :: common:: SupportedArchitectureTest ;
8
+ use rayon:: prelude:: * ;
9
+ use std:: fs;
10
+
9
11
use crate :: common:: cli:: ProcessedCli ;
10
12
use crate :: common:: compare:: compare_outputs;
13
+ use crate :: common:: gen_c:: { write_main_cpp, write_mod_cpp} ;
11
14
use crate :: common:: gen_rust:: compile_rust_programs;
12
15
use crate :: common:: intrinsic:: { Intrinsic , IntrinsicDefinition } ;
13
16
use 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 } ;
16
19
use crate :: x86:: config:: { F16_FORMATTING_DEF , X86_CONFIGURATIONS } ;
17
20
use config:: build_notices;
18
21
use intrinsic:: X86IntrinsicType ;
@@ -50,30 +53,67 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
50
53
}
51
54
52
55
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 ( ) ;
56
56
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" ] ;
57
60
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,
65
91
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:?}" ) ;
70
105
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:?}" ) ;
76
114
}
115
+
116
+ true
77
117
}
78
118
79
119
fn build_rust_file ( & self ) -> bool {
@@ -102,7 +142,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
102
142
}
103
143
104
144
fn compare_outputs ( & self ) -> bool {
105
- if let Some ( ref toolchain ) = self . cli_options . toolchain {
145
+ if self . cli_options . toolchain . is_some ( ) {
106
146
let intrinsics_name_list = self
107
147
. intrinsics
108
148
. iter ( )
@@ -111,8 +151,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
111
151
112
152
compare_outputs (
113
153
& intrinsics_name_list,
114
- toolchain,
115
- & self . cli_options . c_runner ,
154
+ & self . cli_options . runner ,
116
155
& self . cli_options . target ,
117
156
)
118
157
} else {
0 commit comments