@@ -68,18 +68,14 @@ impl dsl::Format {
68
68
fn generate_rex_prefix ( & self , f : & mut Formatter , rex : & dsl:: Rex ) {
69
69
use dsl:: OperandKind :: { FixedReg , Imm , Mem , Reg , RegMem } ;
70
70
f. empty_line ( ) ;
71
- f. comment ( "Emit REX prefix." ) ;
71
+ f. comment ( "Possibly emit REX prefix." ) ;
72
72
73
73
let find_8bit_registers =
74
74
|l : & dsl:: Location | l. bits ( ) == 8 && matches ! ( l. kind( ) , Reg ( _) | RegMem ( _) ) ;
75
- if self . locations ( ) . any ( find_8bit_registers) {
76
- fmtln ! ( f, "let mut rex = {};" , rex. generate_flags( ) ) ;
77
- for op in self . locations ( ) . copied ( ) . filter ( find_8bit_registers) {
78
- fmtln ! ( f, "self.{op}.always_emit_if_8bit_needed(&mut rex);" ) ;
79
- }
80
- } else {
81
- fmtln ! ( f, "let rex = {};" , rex. generate_flags( ) ) ;
82
- }
75
+ let uses_8bit = self . locations ( ) . any ( find_8bit_registers) ;
76
+ fmtln ! ( f, "let uses_8bit = {uses_8bit};" ) ;
77
+ fmtln ! ( f, "let w_bit = {};" , rex. w) ;
78
+ let bits = "w_bit, uses_8bit" ;
83
79
84
80
match self . operands_by_kind ( ) . as_slice ( ) {
85
81
[ FixedReg ( dst) , Imm ( _) ] => {
@@ -89,92 +85,41 @@ impl dsl::Format {
89
85
"we expect no digit for operands: [FixedReg, Imm]"
90
86
) ;
91
87
fmtln ! ( f, "let digit = 0;" ) ;
92
- fmtln ! ( f, "rex.emit_two_op(buf, digit, self.{dst}.enc());" ) ;
88
+ fmtln ! ( f, "let dst = self.{dst}.enc();" ) ;
89
+ fmtln ! ( f, "let rex = RexPrefix::with_digit(digit, dst, {bits});" ) ;
93
90
}
94
91
[ Mem ( dst) , Imm ( _) ] => {
95
92
let digit = rex
96
93
. digit
97
94
. expect ( "REX digit must be set for operands: [Mem, Imm]" ) ;
98
95
fmtln ! ( f, "let digit = 0x{digit:x};" ) ;
99
- fmtln ! ( f, "self.{dst}.emit_rex_prefix(rex, digit, buf );" ) ;
96
+ fmtln ! ( f, "let rex = self.{dst}.as_rex_prefix( digit, {bits} );" ) ;
100
97
}
101
98
[ RegMem ( dst) , Imm ( _) ] => {
102
99
let digit = rex
103
100
. digit
104
101
. expect ( "REX digit must be set for operands: [RegMem, Imm]" ) ;
105
102
fmtln ! ( f, "let digit = 0x{digit:x};" ) ;
106
- f. add_block ( & format ! ( "match &self.{dst}" ) , |f| {
107
- fmtln ! (
108
- f,
109
- "GprMem::Gpr({dst}) => rex.emit_two_op(buf, digit, {dst}.enc()),"
110
- ) ;
111
- fmtln ! (
112
- f,
113
- "GprMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, digit, buf),"
114
- ) ;
115
- } ) ;
103
+ fmtln ! ( f, "let rex = self.{dst}.as_rex_prefix(digit, {bits});" ) ;
116
104
}
117
105
[ Reg ( dst) , RegMem ( src) ] => {
118
- fmtln ! ( f, "let {dst} = self.{dst}.enc();" ) ;
119
- f. add_block ( & format ! ( "match &self.{src}" ) , |f| {
120
- match dst. bits ( ) {
121
- 128 => {
122
- fmtln ! (
123
- f,
124
- "XmmMem::Xmm({src}) => rex.emit_two_op(buf, {dst}, {src}.enc()),"
125
- ) ;
126
- fmtln ! (
127
- f,
128
- "XmmMem::Mem({src}) => {src}.emit_rex_prefix(rex, {dst}, buf),"
129
- ) ;
130
- }
131
- _ => {
132
- fmtln ! (
133
- f,
134
- "GprMem::Gpr({src}) => rex.emit_two_op(buf, {dst}, {src}.enc()),"
135
- ) ;
136
- fmtln ! (
137
- f,
138
- "GprMem::Mem({src}) => {src}.emit_rex_prefix(rex, {dst}, buf),"
139
- ) ;
140
- }
141
- } ;
142
- } ) ;
106
+ fmtln ! ( f, "let dst = self.{dst}.enc();" ) ;
107
+ fmtln ! ( f, "let rex = self.{src}.as_rex_prefix(dst, {bits});" ) ;
143
108
}
144
109
[ Mem ( dst) , Reg ( src) ] => {
145
- fmtln ! ( f, "let { src} = self.{src}.enc();" ) ;
146
- fmtln ! ( f, "self.{dst}.emit_rex_prefix(rex , {src}, buf );" ) ;
110
+ fmtln ! ( f, "let src = self.{src}.enc();" ) ;
111
+ fmtln ! ( f, "let rex = self.{dst}.as_rex_prefix(src , {bits} );" ) ;
147
112
}
148
113
[ RegMem ( dst) , Reg ( src) ]
149
114
| [ RegMem ( dst) , Reg ( src) , Imm ( _) ]
150
115
| [ RegMem ( dst) , Reg ( src) , FixedReg ( _) ] => {
151
- fmtln ! ( f, "let {src} = self.{src}.enc();" ) ;
152
- f. add_block ( & format ! ( "match &self.{dst}" ) , |f| match src. bits ( ) {
153
- 128 => {
154
- fmtln ! (
155
- f,
156
- "XmmMem::Xmm({dst}) => rex.emit_two_op(buf, {src}, {dst}.enc()),"
157
- ) ;
158
- fmtln ! (
159
- f,
160
- "XmmMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, {src}, buf),"
161
- ) ;
162
- }
163
- _ => {
164
- fmtln ! (
165
- f,
166
- "GprMem::Gpr({dst}) => rex.emit_two_op(buf, {src}, {dst}.enc()),"
167
- ) ;
168
- fmtln ! (
169
- f,
170
- "GprMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, {src}, buf),"
171
- ) ;
172
- }
173
- } ) ;
116
+ fmtln ! ( f, "let src = self.{src}.enc();" ) ;
117
+ fmtln ! ( f, "let rex = self.{dst}.as_rex_prefix(src, {bits});" ) ;
174
118
}
175
-
176
119
unknown => unimplemented ! ( "unknown pattern: {unknown:?}" ) ,
177
120
}
121
+
122
+ fmtln ! ( f, "rex.encode(buf);" ) ;
178
123
}
179
124
180
125
fn generate_modrm_byte ( & self , f : & mut Formatter , rex : & dsl:: Rex ) {
@@ -271,13 +216,3 @@ impl dsl::Format {
271
216
}
272
217
}
273
218
}
274
-
275
- impl dsl:: Rex {
276
- fn generate_flags ( & self ) -> & str {
277
- if self . w {
278
- "RexFlags::set_w()"
279
- } else {
280
- "RexFlags::clear_w()"
281
- }
282
- }
283
- }
0 commit comments