@@ -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 ;
@@ -54,26 +57,66 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
54
57
let target = & self . cli_options . target ;
55
58
let cxx_toolchain_dir = self . cli_options . cxx_toolchain_dir . as_deref ( ) ;
56
59
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" ] ;
57
63
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,
65
94
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 ( ) ;
70
100
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:?}" ) ;
76
117
}
118
+
119
+ true
77
120
}
78
121
79
122
fn build_rust_file ( & self ) -> bool {
@@ -102,7 +145,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
102
145
}
103
146
104
147
fn compare_outputs ( & self ) -> bool {
105
- if let Some ( ref toolchain ) = self . cli_options . toolchain {
148
+ if self . cli_options . toolchain . is_some ( ) {
106
149
let intrinsics_name_list = self
107
150
. intrinsics
108
151
. iter ( )
@@ -111,8 +154,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
111
154
112
155
compare_outputs (
113
156
& intrinsics_name_list,
114
- toolchain,
115
- & self . cli_options . c_runner ,
157
+ & self . cli_options . runner ,
116
158
& self . cli_options . target ,
117
159
)
118
160
} else {
0 commit comments