@@ -108,8 +108,16 @@ impl dsl::Format {
108108 fmtln ! ( f, "let {dst} = self.{dst}.enc();" ) ;
109109 fmtln ! ( f, "match &self.{src} {{" ) ;
110110 f. indent ( |f| {
111- fmtln ! ( f, "GprMem::Gpr({src}) => rex.emit_two_op(buf, {dst}, {src}.enc())," ) ;
112- fmtln ! ( f, "GprMem::Mem({src}) => {src}.emit_rex_prefix(rex, {dst}, buf)," ) ;
111+ match dst. bits ( ) {
112+ 128 => {
113+ fmtln ! ( f, "XmmMem::Xmm({src}) => rex.emit_two_op(buf, {dst}, {src}.enc())," ) ;
114+ fmtln ! ( f, "XmmMem::Mem({src}) => {src}.emit_rex_prefix(rex, {dst}, buf)," ) ;
115+ }
116+ _ => {
117+ fmtln ! ( f, "GprMem::Gpr({src}) => rex.emit_two_op(buf, {dst}, {src}.enc())," ) ;
118+ fmtln ! ( f, "GprMem::Mem({src}) => {src}.emit_rex_prefix(rex, {dst}, buf)," ) ;
119+ }
120+ } ;
113121 } ) ;
114122 fmtln ! ( f, "}}" ) ;
115123 }
@@ -118,9 +126,15 @@ impl dsl::Format {
118126 | [ RegMem ( dst) , Reg ( src) , FixedReg ( _) ] => {
119127 fmtln ! ( f, "let {src} = self.{src}.enc();" ) ;
120128 fmtln ! ( f, "match &self.{dst} {{" ) ;
121- f. indent ( |f| {
122- fmtln ! ( f, "GprMem::Gpr({dst}) => rex.emit_two_op(buf, {src}, {dst}.enc())," ) ;
123- fmtln ! ( f, "GprMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, {src}, buf)," ) ;
129+ f. indent ( |f| match src. bits ( ) {
130+ 128 => {
131+ fmtln ! ( f, "XmmMem::Xmm({dst}) => rex.emit_two_op(buf, {src}, {dst}.enc())," ) ;
132+ fmtln ! ( f, "XmmMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, {src}, buf)," ) ;
133+ }
134+ _ => {
135+ fmtln ! ( f, "GprMem::Gpr({dst}) => rex.emit_two_op(buf, {src}, {dst}.enc())," ) ;
136+ fmtln ! ( f, "GprMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, {src}, buf)," ) ;
137+ }
124138 } ) ;
125139 fmtln ! ( f, "}}" ) ;
126140 }
@@ -159,8 +173,22 @@ impl dsl::Format {
159173 fmtln ! ( f, "let {dst} = self.{dst}.enc();" ) ;
160174 fmtln ! ( f, "match &self.{src} {{" ) ;
161175 f. indent ( |f| {
162- fmtln ! ( f, "GprMem::Gpr({src}) => emit_modrm(buf, {dst}, {src}.enc())," ) ;
163- fmtln ! ( f, "GprMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None)," ) ;
176+ match dst. bits ( ) {
177+ 128 => {
178+ fmtln ! ( f, "XmmMem::Xmm({src}) => emit_modrm(buf, {dst}, {src}.enc())," ) ;
179+ fmtln ! (
180+ f,
181+ "XmmMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None),"
182+ ) ;
183+ }
184+ _ => {
185+ fmtln ! ( f, "GprMem::Gpr({src}) => emit_modrm(buf, {dst}, {src}.enc())," ) ;
186+ fmtln ! (
187+ f,
188+ "GprMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None),"
189+ ) ;
190+ }
191+ } ;
164192 } ) ;
165193 fmtln ! ( f, "}}" ) ;
166194 }
@@ -170,12 +198,25 @@ impl dsl::Format {
170198 fmtln ! ( f, "let {src} = self.{src}.enc();" ) ;
171199 fmtln ! ( f, "match &self.{dst} {{" ) ;
172200 f. indent ( |f| {
173- fmtln ! ( f, "GprMem::Gpr({dst}) => emit_modrm(buf, {src}, {dst}.enc())," ) ;
174- fmtln ! ( f, "GprMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None)," ) ;
201+ match src. bits ( ) {
202+ 128 => {
203+ fmtln ! ( f, "XmmMem::Xmm({dst}) => emit_modrm(buf, {src}, {dst}.enc())," ) ;
204+ fmtln ! (
205+ f,
206+ "XmmMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None),"
207+ ) ;
208+ }
209+ _ => {
210+ fmtln ! ( f, "GprMem::Gpr({dst}) => emit_modrm(buf, {src}, {dst}.enc())," ) ;
211+ fmtln ! (
212+ f,
213+ "GprMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None),"
214+ ) ;
215+ }
216+ } ;
175217 } ) ;
176218 fmtln ! ( f, "}}" ) ;
177219 }
178-
179220 unknown => unimplemented ! ( "unknown pattern: {unknown:?}" ) ,
180221 }
181222 }
0 commit comments