@@ -10,9 +10,13 @@ use std::fs::{self, File};
10
10
11
11
use crate :: common:: cli:: ProcessedCli ;
12
12
use crate :: common:: gen_c:: { write_main_cpp, write_mod_cpp} ;
13
+ use crate :: common:: gen_rust:: {
14
+ compile_rust_programs, write_bin_cargo_toml, write_lib_cargo_toml, write_lib_rs, write_main_rs,
15
+ } ;
13
16
use crate :: common:: intrinsic:: { Intrinsic , IntrinsicDefinition } ;
14
17
use crate :: common:: intrinsic_helpers:: TypeKind ;
15
18
use crate :: common:: { SupportedArchitectureTest , chunk_info} ;
19
+ use crate :: x86:: config:: { F16_FORMATTING_DEF , X86_CONFIGURATIONS } ;
16
20
use config:: build_notices;
17
21
use intrinsic:: X86IntrinsicType ;
18
22
use xml_parser:: get_xml_intrinsics;
@@ -114,7 +118,60 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
114
118
}
115
119
116
120
fn build_rust_file ( & self ) -> bool {
117
- todo ! ( "build_rust_file in X86ArchitectureTest is not implemented" )
121
+ std:: fs:: create_dir_all ( "rust_programs/src" ) . unwrap ( ) ;
122
+
123
+ let architecture = if self . cli_options . target . contains ( "v7" ) {
124
+ "arm"
125
+ } else {
126
+ "aarch64"
127
+ } ;
128
+
129
+ let ( chunk_size, chunk_count) = chunk_info ( self . intrinsics . len ( ) ) ;
130
+
131
+ let mut cargo = File :: create ( "rust_programs/Cargo.toml" ) . unwrap ( ) ;
132
+ write_bin_cargo_toml ( & mut cargo, chunk_count) . unwrap ( ) ;
133
+
134
+ let mut main_rs = File :: create ( "rust_programs/src/main.rs" ) . unwrap ( ) ;
135
+ write_main_rs (
136
+ & mut main_rs,
137
+ chunk_count,
138
+ X86_CONFIGURATIONS ,
139
+ "" ,
140
+ self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
141
+ )
142
+ . unwrap ( ) ;
143
+
144
+ let target = & self . cli_options . target ;
145
+ let toolchain = self . cli_options . toolchain . as_deref ( ) ;
146
+ let linker = self . cli_options . linker . as_deref ( ) ;
147
+
148
+ let notice = & build_notices ( "// " ) ;
149
+ self . intrinsics
150
+ . par_chunks ( chunk_size)
151
+ . enumerate ( )
152
+ . map ( |( i, chunk) | {
153
+ std:: fs:: create_dir_all ( format ! ( "rust_programs/mod_{i}/src" ) ) ?;
154
+
155
+ let rust_filename = format ! ( "rust_programs/mod_{i}/src/lib.rs" ) ;
156
+ trace ! ( "generating `{rust_filename}`" ) ;
157
+ let mut file = File :: create ( rust_filename) ?;
158
+
159
+ let cfg = X86_CONFIGURATIONS ;
160
+ let definitions = F16_FORMATTING_DEF ;
161
+ write_lib_rs ( & mut file, architecture, notice, cfg, definitions, chunk) ?;
162
+
163
+ let toml_filename = format ! ( "rust_programs/mod_{i}/Cargo.toml" ) ;
164
+ trace ! ( "generating `{toml_filename}`" ) ;
165
+ let mut file = File :: create ( toml_filename) . unwrap ( ) ;
166
+
167
+ write_lib_cargo_toml ( & mut file, & format ! ( "mod_{i}" ) ) ?;
168
+
169
+ Ok ( ( ) )
170
+ } )
171
+ . collect :: < Result < ( ) , std:: io:: Error > > ( )
172
+ . unwrap ( ) ;
173
+
174
+ compile_rust_programs ( toolchain, target, linker)
118
175
}
119
176
120
177
fn compare_outputs ( & self ) -> bool {
0 commit comments