@@ -51,9 +51,25 @@ impl dsl::Inst {
51
51
}
52
52
}
53
53
54
- // `fn <inst>(<params>) -> Inst { ... }`
55
- pub fn generate_variant_constructor ( & self , f : & mut Formatter ) {
56
- let variant_name = self . name ( ) ;
54
+ /// `impl <inst> { ... }`
55
+ pub fn generate_struct_impl ( & self , f : & mut Formatter ) {
56
+ let impl_block = self . generate_impl_block_start ( ) ;
57
+ let struct_name = self . struct_name_with_generic ( ) ;
58
+ fmtln ! ( f, "{impl_block} {struct_name} {{" ) ;
59
+ f. indent ( |f| {
60
+ self . generate_new_function ( f) ;
61
+ f. empty_line ( ) ;
62
+ self . generate_encode_function ( f) ;
63
+ f. empty_line ( ) ;
64
+ self . generate_visit_function ( f) ;
65
+ f. empty_line ( ) ;
66
+ self . generate_features_function ( f) ;
67
+ } ) ;
68
+ fmtln ! ( f, "}}" ) ;
69
+ }
70
+
71
+ // `fn new(<params>) -> Self { ... }`
72
+ pub fn generate_new_function ( & self , f : & mut Formatter ) {
57
73
let params = comma_join (
58
74
self . format
59
75
. operands
@@ -69,29 +85,13 @@ impl dsl::Inst {
69
85
) ;
70
86
71
87
fmtln ! ( f, "#[must_use]" ) ;
72
- fmtln ! ( f, "pub fn {variant_name}<R: Registers> ({params}) -> Inst<R> {{" ) ;
88
+ fmtln ! ( f, "pub fn new ({params}) -> Self {{" ) ;
73
89
f. indent ( |f| {
74
- fmtln ! ( f, "Inst::{variant_name}({variant_name} {{ {args} }}) " , ) ;
90
+ fmtln ! ( f, "Self {{ {args} }}" , ) ;
75
91
} ) ;
76
92
fmtln ! ( f, "}}" ) ;
77
93
}
78
94
79
- /// `impl <inst> { ... }`
80
- pub fn generate_struct_impl ( & self , f : & mut Formatter ) {
81
- let impl_block = self . generate_impl_block_start ( ) ;
82
- let struct_name = self . struct_name_with_generic ( ) ;
83
- fmtln ! ( f, "{impl_block} {struct_name} {{" ) ;
84
-
85
- f. indent_push ( ) ;
86
- self . generate_encode_function ( f) ;
87
- f. empty_line ( ) ;
88
- self . generate_visit_function ( f) ;
89
- f. empty_line ( ) ;
90
- self . generate_features_function ( f) ;
91
- f. indent_pop ( ) ;
92
- fmtln ! ( f, "}}" ) ;
93
- }
94
-
95
95
/// `fn encode(&self, ...) { ... }`
96
96
fn generate_encode_function ( & self , f : & mut Formatter ) {
97
97
let off = if self . format . uses_memory ( ) . is_some ( ) {
@@ -191,23 +191,35 @@ impl dsl::Inst {
191
191
let impl_block = self . generate_impl_block_start ( ) ;
192
192
let struct_name = self . struct_name_with_generic ( ) ;
193
193
fmtln ! ( f, "{impl_block} std::fmt::Display for {struct_name} {{" ) ;
194
- f. indent_push ( ) ;
195
- fmtln ! ( f, "fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {{" ) ;
196
-
197
- f . indent_push ( ) ;
198
- for op in & self . format . operands {
199
- let location = op. location ;
200
- let to_string = location . generate_to_string ( op . extension ) ;
201
- fmtln ! ( f , "let {location} = {to_string};" ) ;
202
- }
203
-
204
- let inst_name = & self . mnemonic ;
205
- let ordered_ops = self . format . generate_att_style_operands ( ) ;
206
- fmtln ! ( f, "write!(f, \" {inst_name} {ordered_ops} \" ) " ) ;
207
- f . indent_pop ( ) ;
194
+ f. indent ( |f| {
195
+ fmtln ! ( f, "fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {{" ) ;
196
+ f . indent ( |f| {
197
+ for op in & self . format . operands {
198
+ let location = op . location ;
199
+ let to_string = location . generate_to_string ( op. extension ) ;
200
+ fmtln ! ( f , " let {location} = {to_string};" ) ;
201
+ }
202
+ let inst_name = & self . mnemonic ;
203
+ let ordered_ops = self . format . generate_att_style_operands ( ) ;
204
+ fmtln ! ( f , "write!(f, \" {inst_name} {ordered_ops} \" )" ) ;
205
+ } ) ;
206
+ fmtln ! ( f, "}} " ) ;
207
+ } ) ;
208
208
fmtln ! ( f, "}}" ) ;
209
+ }
209
210
210
- f. indent_pop ( ) ;
211
+ /// `impl From<struct> for Inst { ... }`
212
+ pub fn generate_from_impl ( & self , f : & mut Formatter ) {
213
+ let struct_name_r = self . struct_name_with_generic ( ) ;
214
+ let variant_name = self . name ( ) ;
215
+ fmtln ! ( f, "impl<R: Registers> From<{struct_name_r}> for Inst<R> {{" ) ;
216
+ f. indent ( |f| {
217
+ fmtln ! ( f, "fn from(inst: {struct_name_r}) -> Self {{" , ) ;
218
+ f. indent ( |f| {
219
+ fmtln ! ( f, "Self::{variant_name}(inst)" ) ;
220
+ } ) ;
221
+ fmtln ! ( f, "}}" ) ;
222
+ } ) ;
211
223
fmtln ! ( f, "}}" ) ;
212
224
}
213
225
@@ -245,7 +257,7 @@ impl dsl::Inst {
245
257
// TODO: parameterize CraneliftRegisters?
246
258
fmtln ! ( f, "fn x64_{struct_name}(&mut self, {params}) -> {ret_ty} {{" , ) ;
247
259
f. indent ( |f| {
248
- fmtln ! ( f, "let inst = cranelift_assembler_x64::build ::{struct_name}({args});" ) ;
260
+ fmtln ! ( f, "let inst = cranelift_assembler_x64::inst ::{struct_name}::new ({args}).into( );" ) ;
249
261
fmtln ! ( f, "self.lower_ctx.emit(MInst::External {{ inst }});" ) ;
250
262
fmtln ! ( f, "{ret_val}" ) ;
251
263
} ) ;
0 commit comments