@@ -136,64 +136,18 @@ impl dsl::Format {
136
136
[ FixedReg ( _) , Imm ( _) ] => {
137
137
// No need to emit a ModRM byte: we know the register used.
138
138
}
139
- [ Mem ( dst) , Imm ( _) ] => {
140
- let digit = rex
141
- . digit
142
- . expect ( "REX digit must be set for operands: [RegMem, Imm]" ) ;
139
+ [ Mem ( mem) , Imm ( _) ] | [ RegMem ( mem) , Imm ( _) ] => {
140
+ let digit = rex. digit . unwrap ( ) ;
143
141
fmtln ! ( f, "let digit = 0x{digit:x};" ) ;
144
- fmtln ! (
145
- f,
146
- "emit_modrm_sib_disp(buf, off, digit, &self.{dst}, 0, None);"
147
- ) ;
142
+ fmtln ! ( f, "self.{mem}.encode_rex_suffixes(buf, off, digit, 0);" ) ;
148
143
}
149
- [ RegMem ( dst) , Imm ( _) ] => {
150
- let digit = rex
151
- . digit
152
- . expect ( "REX digit must be set for operands: [RegMem, Imm]" ) ;
153
- fmtln ! ( f, "let digit = 0x{digit:x};" ) ;
154
- f. add_block ( & format ! ( "match &self.{dst}" ) , |f| {
155
- fmtln ! ( f, "GprMem::Gpr({dst}) => emit_modrm(buf, digit, {dst}.enc())," ) ;
156
- fmtln ! ( f, "GprMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, digit, {dst}, 0, None)," ) ;
157
- } ) ;
158
- }
159
- [ Reg ( dst) , RegMem ( src) ] => {
160
- fmtln ! ( f, "let {dst} = self.{dst}.enc();" ) ;
161
- f. add_block ( & format ! ( "match &self.{src}" ) , |f| {
162
- match dst. bits ( ) {
163
- 128 => {
164
- fmtln ! ( f, "XmmMem::Xmm({src}) => emit_modrm(buf, {dst}, {src}.enc())," ) ;
165
- fmtln ! ( f, "XmmMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None)," ) ;
166
- }
167
- _ => {
168
- fmtln ! ( f, "GprMem::Gpr({src}) => emit_modrm(buf, {dst}, {src}.enc())," ) ;
169
- fmtln ! ( f, "GprMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None)," ) ;
170
- }
171
- } ;
172
- } ) ;
173
- }
174
- [ Mem ( dst) , Reg ( src) ] => {
175
- fmtln ! ( f, "let {src} = self.{src}.enc();" ) ;
176
- fmtln ! (
177
- f,
178
- "emit_modrm_sib_disp(buf, off, {src}, &self.{dst}, 0, None);"
179
- ) ;
180
- }
181
- [ RegMem ( dst) , Reg ( src) ]
182
- | [ RegMem ( dst) , Reg ( src) , Imm ( _) ]
183
- | [ RegMem ( dst) , Reg ( src) , FixedReg ( _) ] => {
184
- fmtln ! ( f, "let {src} = self.{src}.enc();" ) ;
185
- f. add_block ( & format ! ( "match &self.{dst}" ) , |f| {
186
- match src. bits ( ) {
187
- 128 => {
188
- fmtln ! ( f, "XmmMem::Xmm({dst}) => emit_modrm(buf, {src}, {dst}.enc())," ) ;
189
- fmtln ! ( f, "XmmMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None)," ) ;
190
- }
191
- _ => {
192
- fmtln ! ( f, "GprMem::Gpr({dst}) => emit_modrm(buf, {src}, {dst}.enc())," ) ;
193
- fmtln ! ( f, "GprMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None)," ) ;
194
- }
195
- } ;
196
- } ) ;
144
+ [ Reg ( reg) , RegMem ( mem) ]
145
+ | [ Mem ( mem) , Reg ( reg) ]
146
+ | [ RegMem ( mem) , Reg ( reg) ]
147
+ | [ RegMem ( mem) , Reg ( reg) , Imm ( _) ]
148
+ | [ RegMem ( mem) , Reg ( reg) , FixedReg ( _) ] => {
149
+ fmtln ! ( f, "let reg = self.{reg}.enc();" ) ;
150
+ fmtln ! ( f, "self.{mem}.encode_rex_suffixes(buf, off, reg, 0);" ) ;
197
151
}
198
152
unknown => unimplemented ! ( "unknown pattern: {unknown:?}" ) ,
199
153
}
0 commit comments