@@ -51,9 +51,25 @@ impl dsl::Inst {
5151 }
5252 }
5353
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 ) {
5773 let params = comma_join (
5874 self . format
5975 . operands
@@ -69,29 +85,13 @@ impl dsl::Inst {
6985 ) ;
7086
7187 fmtln ! ( f, "#[must_use]" ) ;
72- fmtln ! ( f, "pub fn {variant_name}<R: Registers> ({params}) -> Inst<R> {{" ) ;
88+ fmtln ! ( f, "pub fn new ({params}) -> Self {{" ) ;
7389 f. indent ( |f| {
74- fmtln ! ( f, "Inst::{variant_name}({variant_name} {{ {args} }}) " , ) ;
90+ fmtln ! ( f, "Self {{ {args} }}" , ) ;
7591 } ) ;
7692 fmtln ! ( f, "}}" ) ;
7793 }
7894
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-
9595 /// `fn encode(&self, ...) { ... }`
9696 fn generate_encode_function ( & self , f : & mut Formatter ) {
9797 let off = if self . format . uses_memory ( ) . is_some ( ) {
@@ -191,23 +191,35 @@ impl dsl::Inst {
191191 let impl_block = self . generate_impl_block_start ( ) ;
192192 let struct_name = self . struct_name_with_generic ( ) ;
193193 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+ } ) ;
208208 fmtln ! ( f, "}}" ) ;
209+ }
209210
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+ } ) ;
211223 fmtln ! ( f, "}}" ) ;
212224 }
213225
@@ -245,7 +257,7 @@ impl dsl::Inst {
245257 // TODO: parameterize CraneliftRegisters?
246258 fmtln ! ( f, "fn x64_{struct_name}(&mut self, {params}) -> {ret_ty} {{" , ) ;
247259 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( );" ) ;
249261 fmtln ! ( f, "self.lower_ctx.emit(MInst::External {{ inst }});" ) ;
250262 fmtln ! ( f, "{ret_val}" ) ;
251263 } ) ;
0 commit comments