Skip to main content

asmkit/x86/features/
MMX.rs

1use crate::x86::assembler::*;
2use crate::x86::operands::*;
3use super::super::opcodes::*;
4use crate::core::emitter::*;
5use crate::core::operand::*;
6
7/// A dummy operand that represents no register. Here just for simplicity.
8const NOREG: Operand = Operand::new();
9
10/// `MMX_EMMS` (EMMS). 
11/// Sets the values of all the tags in the x87 FPU tag word to empty (all 1s). This operation marks the x87 FPU data registers (which are aliased to the MMX technology registers) as available for use by x87 FPU floating-point instructions. (See Figure 8-7 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for the format of the x87 FPU tag word.) All other MMX instructions (other than the EMMS instruction) set all the tags in x87 FPU tag word to valid (all 0s).
12///
13///
14/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/EMMS.html).
15///
16/// Supported operand variants:
17///
18/// ```text
19/// +---+----------+
20/// | # | Operands |
21/// +---+----------+
22/// | 1 | (none)   |
23/// +---+----------+
24/// ```
25pub trait MmxEmmsEmitter {
26    fn mmx_emms(&mut self);
27}
28
29impl<'a> MmxEmmsEmitter for Assembler<'a> {
30    fn mmx_emms(&mut self) {
31        self.emit(MMX_EMMS, &NOREG, &NOREG, &NOREG, &NOREG);
32    }
33}
34
35/// `MMX_MOVD_G2M`.
36///
37/// Supported operand variants:
38///
39/// ```text
40/// +---+----------+
41/// | # | Operands |
42/// +---+----------+
43/// | 1 | Mm, Gpd  |
44/// | 2 | Mm, Mem  |
45/// +---+----------+
46/// ```
47pub trait MmxMovdG2mEmitter<A, B> {
48    fn mmx_movd_g2m(&mut self, op0: A, op1: B);
49}
50
51impl<'a> MmxMovdG2mEmitter<Mm, Gpd> for Assembler<'a> {
52    fn mmx_movd_g2m(&mut self, op0: Mm, op1: Gpd) {
53        self.emit(MMX_MOVD_G2MRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
54    }
55}
56
57impl<'a> MmxMovdG2mEmitter<Mm, Mem> for Assembler<'a> {
58    fn mmx_movd_g2m(&mut self, op0: Mm, op1: Mem) {
59        self.emit(MMX_MOVD_G2MRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
60    }
61}
62
63/// `MMX_MOVD_M2G`.
64///
65/// Supported operand variants:
66///
67/// ```text
68/// +---+----------+
69/// | # | Operands |
70/// +---+----------+
71/// | 1 | Gpd, Mm  |
72/// | 2 | Mem, Mm  |
73/// +---+----------+
74/// ```
75pub trait MmxMovdM2gEmitter<A, B> {
76    fn mmx_movd_m2g(&mut self, op0: A, op1: B);
77}
78
79impl<'a> MmxMovdM2gEmitter<Gpd, Mm> for Assembler<'a> {
80    fn mmx_movd_m2g(&mut self, op0: Gpd, op1: Mm) {
81        self.emit(MMX_MOVD_M2GRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
82    }
83}
84
85impl<'a> MmxMovdM2gEmitter<Mem, Mm> for Assembler<'a> {
86    fn mmx_movd_m2g(&mut self, op0: Mem, op1: Mm) {
87        self.emit(MMX_MOVD_M2GMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
88    }
89}
90
91/// `MMX_MOVQ` (MOVQ). 
92/// Copies a doubleword from the source operand (second operand) to the destination operand (first operand). The source and destination operands can be general-purpose registers, MMX technology registers, XMM registers, or 32-bit memory locations. This instruction can be used to move a doubleword to and from the low doubleword of an MMX technology register and a general-purpose register or a 32-bit memory location, or to and from the low doubleword of an XMM register and a general-purpose register or a 32-bit memory location. The instruction cannot be used to transfer data between MMX technology registers, between XMM registers, between general-purpose registers, or between memory locations.
93///
94///
95/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
96///
97/// Supported operand variants:
98///
99/// ```text
100/// +---+----------+
101/// | # | Operands |
102/// +---+----------+
103/// | 1 | Mem, Mm  |
104/// | 2 | Mm, Mem  |
105/// | 3 | Mm, Mm   |
106/// +---+----------+
107/// ```
108pub trait MmxMovqEmitter<A, B> {
109    fn mmx_movq(&mut self, op0: A, op1: B);
110}
111
112impl<'a> MmxMovqEmitter<Mm, Mm> for Assembler<'a> {
113    fn mmx_movq(&mut self, op0: Mm, op1: Mm) {
114        self.emit(MMX_MOVQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
115    }
116}
117
118impl<'a> MmxMovqEmitter<Mm, Mem> for Assembler<'a> {
119    fn mmx_movq(&mut self, op0: Mm, op1: Mem) {
120        self.emit(MMX_MOVQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
121    }
122}
123
124impl<'a> MmxMovqEmitter<Mem, Mm> for Assembler<'a> {
125    fn mmx_movq(&mut self, op0: Mem, op1: Mm) {
126        self.emit(MMX_MOVQMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
127    }
128}
129
130/// `MMX_MOVQ_G2M`.
131///
132/// Supported operand variants:
133///
134/// ```text
135/// +---+----------+
136/// | # | Operands |
137/// +---+----------+
138/// | 1 | Mm, Gpd  |
139/// | 2 | Mm, Mem  |
140/// +---+----------+
141/// ```
142pub trait MmxMovqG2mEmitter<A, B> {
143    fn mmx_movq_g2m(&mut self, op0: A, op1: B);
144}
145
146impl<'a> MmxMovqG2mEmitter<Mm, Gpd> for Assembler<'a> {
147    fn mmx_movq_g2m(&mut self, op0: Mm, op1: Gpd) {
148        self.emit(MMX_MOVQ_G2MRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
149    }
150}
151
152impl<'a> MmxMovqG2mEmitter<Mm, Mem> for Assembler<'a> {
153    fn mmx_movq_g2m(&mut self, op0: Mm, op1: Mem) {
154        self.emit(MMX_MOVQ_G2MRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
155    }
156}
157
158/// `MMX_MOVQ_M2G`.
159///
160/// Supported operand variants:
161///
162/// ```text
163/// +---+----------+
164/// | # | Operands |
165/// +---+----------+
166/// | 1 | Gpd, Mm  |
167/// | 2 | Mem, Mm  |
168/// +---+----------+
169/// ```
170pub trait MmxMovqM2gEmitter<A, B> {
171    fn mmx_movq_m2g(&mut self, op0: A, op1: B);
172}
173
174impl<'a> MmxMovqM2gEmitter<Gpd, Mm> for Assembler<'a> {
175    fn mmx_movq_m2g(&mut self, op0: Gpd, op1: Mm) {
176        self.emit(MMX_MOVQ_M2GRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
177    }
178}
179
180impl<'a> MmxMovqM2gEmitter<Mem, Mm> for Assembler<'a> {
181    fn mmx_movq_m2g(&mut self, op0: Mem, op1: Mm) {
182        self.emit(MMX_MOVQ_M2GMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
183    }
184}
185
186/// `MMX_PACKSSDW` (PACKSSDW). 
187/// Converts packed signed word integers into packed signed byte integers (PACKSSWB) or converts packed signed doubleword integers into packed signed word integers (PACKSSDW), using saturation to handle overflow conditions. See Figure 4-6 for an example of the packing operation.
188///
189///
190/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
191///
192/// Supported operand variants:
193///
194/// ```text
195/// +---+----------+
196/// | # | Operands |
197/// +---+----------+
198/// | 1 | Mm, Mem  |
199/// | 2 | Mm, Mm   |
200/// +---+----------+
201/// ```
202pub trait MmxPackssdwEmitter<A, B> {
203    fn mmx_packssdw(&mut self, op0: A, op1: B);
204}
205
206impl<'a> MmxPackssdwEmitter<Mm, Mm> for Assembler<'a> {
207    fn mmx_packssdw(&mut self, op0: Mm, op1: Mm) {
208        self.emit(MMX_PACKSSDWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
209    }
210}
211
212impl<'a> MmxPackssdwEmitter<Mm, Mem> for Assembler<'a> {
213    fn mmx_packssdw(&mut self, op0: Mm, op1: Mem) {
214        self.emit(MMX_PACKSSDWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
215    }
216}
217
218/// `MMX_PACKSSWB` (PACKSSWB). 
219/// Converts packed signed word integers into packed signed byte integers (PACKSSWB) or converts packed signed doubleword integers into packed signed word integers (PACKSSDW), using saturation to handle overflow conditions. See Figure 4-6 for an example of the packing operation.
220///
221///
222/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
223///
224/// Supported operand variants:
225///
226/// ```text
227/// +---+----------+
228/// | # | Operands |
229/// +---+----------+
230/// | 1 | Mm, Mem  |
231/// | 2 | Mm, Mm   |
232/// +---+----------+
233/// ```
234pub trait MmxPacksswbEmitter<A, B> {
235    fn mmx_packsswb(&mut self, op0: A, op1: B);
236}
237
238impl<'a> MmxPacksswbEmitter<Mm, Mm> for Assembler<'a> {
239    fn mmx_packsswb(&mut self, op0: Mm, op1: Mm) {
240        self.emit(MMX_PACKSSWBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
241    }
242}
243
244impl<'a> MmxPacksswbEmitter<Mm, Mem> for Assembler<'a> {
245    fn mmx_packsswb(&mut self, op0: Mm, op1: Mem) {
246        self.emit(MMX_PACKSSWBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
247    }
248}
249
250/// `MMX_PACKUSWB` (PACKUSWB). 
251/// Converts 4, 8, 16, or 32 signed word integers from the destination operand (first operand) and 4, 8, 16, or 32 signed word integers from the source operand (second operand) into 8, 16, 32 or 64 unsigned byte integers and stores the result in the destination operand. (See Figure 4-6 for an example of the packing operation.) If a signed word integer value is beyond the range of an unsigned byte integer (that is, greater than FFH or less than 00H), the saturated unsigned byte integer value of FFH or 00H, respectively, is stored in the destination.
252///
253///
254/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKUSWB.html).
255///
256/// Supported operand variants:
257///
258/// ```text
259/// +---+----------+
260/// | # | Operands |
261/// +---+----------+
262/// | 1 | Mm, Mem  |
263/// | 2 | Mm, Mm   |
264/// +---+----------+
265/// ```
266pub trait MmxPackuswbEmitter<A, B> {
267    fn mmx_packuswb(&mut self, op0: A, op1: B);
268}
269
270impl<'a> MmxPackuswbEmitter<Mm, Mm> for Assembler<'a> {
271    fn mmx_packuswb(&mut self, op0: Mm, op1: Mm) {
272        self.emit(MMX_PACKUSWBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
273    }
274}
275
276impl<'a> MmxPackuswbEmitter<Mm, Mem> for Assembler<'a> {
277    fn mmx_packuswb(&mut self, op0: Mm, op1: Mem) {
278        self.emit(MMX_PACKUSWBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
279    }
280}
281
282/// `MMX_PADDB` (PADDB). 
283/// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
284///
285///
286/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
287///
288/// Supported operand variants:
289///
290/// ```text
291/// +---+----------+
292/// | # | Operands |
293/// +---+----------+
294/// | 1 | Mm, Mem  |
295/// | 2 | Mm, Mm   |
296/// +---+----------+
297/// ```
298pub trait MmxPaddbEmitter<A, B> {
299    fn mmx_paddb(&mut self, op0: A, op1: B);
300}
301
302impl<'a> MmxPaddbEmitter<Mm, Mm> for Assembler<'a> {
303    fn mmx_paddb(&mut self, op0: Mm, op1: Mm) {
304        self.emit(MMX_PADDBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
305    }
306}
307
308impl<'a> MmxPaddbEmitter<Mm, Mem> for Assembler<'a> {
309    fn mmx_paddb(&mut self, op0: Mm, op1: Mem) {
310        self.emit(MMX_PADDBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
311    }
312}
313
314/// `MMX_PADDD` (PADDD). 
315/// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
316///
317///
318/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
319///
320/// Supported operand variants:
321///
322/// ```text
323/// +---+----------+
324/// | # | Operands |
325/// +---+----------+
326/// | 1 | Mm, Mem  |
327/// | 2 | Mm, Mm   |
328/// +---+----------+
329/// ```
330pub trait MmxPadddEmitter<A, B> {
331    fn mmx_paddd(&mut self, op0: A, op1: B);
332}
333
334impl<'a> MmxPadddEmitter<Mm, Mm> for Assembler<'a> {
335    fn mmx_paddd(&mut self, op0: Mm, op1: Mm) {
336        self.emit(MMX_PADDDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
337    }
338}
339
340impl<'a> MmxPadddEmitter<Mm, Mem> for Assembler<'a> {
341    fn mmx_paddd(&mut self, op0: Mm, op1: Mem) {
342        self.emit(MMX_PADDDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
343    }
344}
345
346/// `MMX_PADDQ` (PADDQ). 
347/// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
348///
349///
350/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
351///
352/// Supported operand variants:
353///
354/// ```text
355/// +---+----------+
356/// | # | Operands |
357/// +---+----------+
358/// | 1 | Mm, Mem  |
359/// | 2 | Mm, Mm   |
360/// +---+----------+
361/// ```
362pub trait MmxPaddqEmitter<A, B> {
363    fn mmx_paddq(&mut self, op0: A, op1: B);
364}
365
366impl<'a> MmxPaddqEmitter<Mm, Mm> for Assembler<'a> {
367    fn mmx_paddq(&mut self, op0: Mm, op1: Mm) {
368        self.emit(MMX_PADDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
369    }
370}
371
372impl<'a> MmxPaddqEmitter<Mm, Mem> for Assembler<'a> {
373    fn mmx_paddq(&mut self, op0: Mm, op1: Mem) {
374        self.emit(MMX_PADDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
375    }
376}
377
378/// `MMX_PADDSB` (PADDSB). 
379/// Performs a SIMD add of the packed signed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
380///
381///
382/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
383///
384/// Supported operand variants:
385///
386/// ```text
387/// +---+----------+
388/// | # | Operands |
389/// +---+----------+
390/// | 1 | Mm, Mem  |
391/// | 2 | Mm, Mm   |
392/// +---+----------+
393/// ```
394pub trait MmxPaddsbEmitter<A, B> {
395    fn mmx_paddsb(&mut self, op0: A, op1: B);
396}
397
398impl<'a> MmxPaddsbEmitter<Mm, Mm> for Assembler<'a> {
399    fn mmx_paddsb(&mut self, op0: Mm, op1: Mm) {
400        self.emit(MMX_PADDSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
401    }
402}
403
404impl<'a> MmxPaddsbEmitter<Mm, Mem> for Assembler<'a> {
405    fn mmx_paddsb(&mut self, op0: Mm, op1: Mem) {
406        self.emit(MMX_PADDSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
407    }
408}
409
410/// `MMX_PADDSW` (PADDSW). 
411/// Performs a SIMD add of the packed signed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
412///
413///
414/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
415///
416/// Supported operand variants:
417///
418/// ```text
419/// +---+----------+
420/// | # | Operands |
421/// +---+----------+
422/// | 1 | Mm, Mem  |
423/// | 2 | Mm, Mm   |
424/// +---+----------+
425/// ```
426pub trait MmxPaddswEmitter<A, B> {
427    fn mmx_paddsw(&mut self, op0: A, op1: B);
428}
429
430impl<'a> MmxPaddswEmitter<Mm, Mm> for Assembler<'a> {
431    fn mmx_paddsw(&mut self, op0: Mm, op1: Mm) {
432        self.emit(MMX_PADDSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
433    }
434}
435
436impl<'a> MmxPaddswEmitter<Mm, Mem> for Assembler<'a> {
437    fn mmx_paddsw(&mut self, op0: Mm, op1: Mem) {
438        self.emit(MMX_PADDSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
439    }
440}
441
442/// `MMX_PADDUSB` (PADDUSB). 
443/// Performs a SIMD add of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
444///
445///
446/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
447///
448/// Supported operand variants:
449///
450/// ```text
451/// +---+----------+
452/// | # | Operands |
453/// +---+----------+
454/// | 1 | Mm, Mem  |
455/// | 2 | Mm, Mm   |
456/// +---+----------+
457/// ```
458pub trait MmxPaddusbEmitter<A, B> {
459    fn mmx_paddusb(&mut self, op0: A, op1: B);
460}
461
462impl<'a> MmxPaddusbEmitter<Mm, Mm> for Assembler<'a> {
463    fn mmx_paddusb(&mut self, op0: Mm, op1: Mm) {
464        self.emit(MMX_PADDUSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
465    }
466}
467
468impl<'a> MmxPaddusbEmitter<Mm, Mem> for Assembler<'a> {
469    fn mmx_paddusb(&mut self, op0: Mm, op1: Mem) {
470        self.emit(MMX_PADDUSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
471    }
472}
473
474/// `MMX_PADDUSW` (PADDUSW). 
475/// Performs a SIMD add of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
476///
477///
478/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
479///
480/// Supported operand variants:
481///
482/// ```text
483/// +---+----------+
484/// | # | Operands |
485/// +---+----------+
486/// | 1 | Mm, Mem  |
487/// | 2 | Mm, Mm   |
488/// +---+----------+
489/// ```
490pub trait MmxPadduswEmitter<A, B> {
491    fn mmx_paddusw(&mut self, op0: A, op1: B);
492}
493
494impl<'a> MmxPadduswEmitter<Mm, Mm> for Assembler<'a> {
495    fn mmx_paddusw(&mut self, op0: Mm, op1: Mm) {
496        self.emit(MMX_PADDUSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
497    }
498}
499
500impl<'a> MmxPadduswEmitter<Mm, Mem> for Assembler<'a> {
501    fn mmx_paddusw(&mut self, op0: Mm, op1: Mem) {
502        self.emit(MMX_PADDUSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
503    }
504}
505
506/// `MMX_PADDW` (PADDW). 
507/// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
508///
509///
510/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
511///
512/// Supported operand variants:
513///
514/// ```text
515/// +---+----------+
516/// | # | Operands |
517/// +---+----------+
518/// | 1 | Mm, Mem  |
519/// | 2 | Mm, Mm   |
520/// +---+----------+
521/// ```
522pub trait MmxPaddwEmitter<A, B> {
523    fn mmx_paddw(&mut self, op0: A, op1: B);
524}
525
526impl<'a> MmxPaddwEmitter<Mm, Mm> for Assembler<'a> {
527    fn mmx_paddw(&mut self, op0: Mm, op1: Mm) {
528        self.emit(MMX_PADDWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
529    }
530}
531
532impl<'a> MmxPaddwEmitter<Mm, Mem> for Assembler<'a> {
533    fn mmx_paddw(&mut self, op0: Mm, op1: Mem) {
534        self.emit(MMX_PADDWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
535    }
536}
537
538/// `MMX_PAND` (PAND). 
539/// Performs a bitwise logical AND operation on the first source operand and second source operand and stores the result in the destination operand. Each bit of the result is set to 1 if the corresponding bits of the first and second operands are 1, otherwise it is set to 0.
540///
541///
542/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAND.html).
543///
544/// Supported operand variants:
545///
546/// ```text
547/// +---+----------+
548/// | # | Operands |
549/// +---+----------+
550/// | 1 | Mm, Mem  |
551/// | 2 | Mm, Mm   |
552/// +---+----------+
553/// ```
554pub trait MmxPandEmitter<A, B> {
555    fn mmx_pand(&mut self, op0: A, op1: B);
556}
557
558impl<'a> MmxPandEmitter<Mm, Mm> for Assembler<'a> {
559    fn mmx_pand(&mut self, op0: Mm, op1: Mm) {
560        self.emit(MMX_PANDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
561    }
562}
563
564impl<'a> MmxPandEmitter<Mm, Mem> for Assembler<'a> {
565    fn mmx_pand(&mut self, op0: Mm, op1: Mem) {
566        self.emit(MMX_PANDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
567    }
568}
569
570/// `MMX_PANDN` (PANDN). 
571/// Performs a bitwise logical NOT operation on the first source operand, then performs bitwise AND with second source operand and stores the result in the destination operand. Each bit of the result is set to 1 if the corresponding bit in the first operand is 0 and the corresponding bit in the second operand is 1, otherwise it is set to 0.
572///
573///
574/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PANDN.html).
575///
576/// Supported operand variants:
577///
578/// ```text
579/// +---+----------+
580/// | # | Operands |
581/// +---+----------+
582/// | 1 | Mm, Mem  |
583/// | 2 | Mm, Mm   |
584/// +---+----------+
585/// ```
586pub trait MmxPandnEmitter<A, B> {
587    fn mmx_pandn(&mut self, op0: A, op1: B);
588}
589
590impl<'a> MmxPandnEmitter<Mm, Mm> for Assembler<'a> {
591    fn mmx_pandn(&mut self, op0: Mm, op1: Mm) {
592        self.emit(MMX_PANDNRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
593    }
594}
595
596impl<'a> MmxPandnEmitter<Mm, Mem> for Assembler<'a> {
597    fn mmx_pandn(&mut self, op0: Mm, op1: Mem) {
598        self.emit(MMX_PANDNRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
599    }
600}
601
602/// `MMX_PCMPEQB` (PCMPEQB). 
603/// Performs a SIMD compare for equality of the packed bytes, words, or doublewords in the destination operand (first operand) and the source operand (second operand). If a pair of data elements is equal, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
604///
605///
606/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
607///
608/// Supported operand variants:
609///
610/// ```text
611/// +---+----------+
612/// | # | Operands |
613/// +---+----------+
614/// | 1 | Mm, Mem  |
615/// | 2 | Mm, Mm   |
616/// +---+----------+
617/// ```
618pub trait MmxPcmpeqbEmitter<A, B> {
619    fn mmx_pcmpeqb(&mut self, op0: A, op1: B);
620}
621
622impl<'a> MmxPcmpeqbEmitter<Mm, Mm> for Assembler<'a> {
623    fn mmx_pcmpeqb(&mut self, op0: Mm, op1: Mm) {
624        self.emit(MMX_PCMPEQBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
625    }
626}
627
628impl<'a> MmxPcmpeqbEmitter<Mm, Mem> for Assembler<'a> {
629    fn mmx_pcmpeqb(&mut self, op0: Mm, op1: Mem) {
630        self.emit(MMX_PCMPEQBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
631    }
632}
633
634/// `MMX_PCMPEQD` (PCMPEQD). 
635/// Performs a SIMD compare for equality of the packed bytes, words, or doublewords in the destination operand (first operand) and the source operand (second operand). If a pair of data elements is equal, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
636///
637///
638/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
639///
640/// Supported operand variants:
641///
642/// ```text
643/// +---+----------+
644/// | # | Operands |
645/// +---+----------+
646/// | 1 | Mm, Mem  |
647/// | 2 | Mm, Mm   |
648/// +---+----------+
649/// ```
650pub trait MmxPcmpeqdEmitter<A, B> {
651    fn mmx_pcmpeqd(&mut self, op0: A, op1: B);
652}
653
654impl<'a> MmxPcmpeqdEmitter<Mm, Mm> for Assembler<'a> {
655    fn mmx_pcmpeqd(&mut self, op0: Mm, op1: Mm) {
656        self.emit(MMX_PCMPEQDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
657    }
658}
659
660impl<'a> MmxPcmpeqdEmitter<Mm, Mem> for Assembler<'a> {
661    fn mmx_pcmpeqd(&mut self, op0: Mm, op1: Mem) {
662        self.emit(MMX_PCMPEQDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
663    }
664}
665
666/// `MMX_PCMPEQW` (PCMPEQW). 
667/// Performs a SIMD compare for equality of the packed bytes, words, or doublewords in the destination operand (first operand) and the source operand (second operand). If a pair of data elements is equal, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
668///
669///
670/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
671///
672/// Supported operand variants:
673///
674/// ```text
675/// +---+----------+
676/// | # | Operands |
677/// +---+----------+
678/// | 1 | Mm, Mem  |
679/// | 2 | Mm, Mm   |
680/// +---+----------+
681/// ```
682pub trait MmxPcmpeqwEmitter<A, B> {
683    fn mmx_pcmpeqw(&mut self, op0: A, op1: B);
684}
685
686impl<'a> MmxPcmpeqwEmitter<Mm, Mm> for Assembler<'a> {
687    fn mmx_pcmpeqw(&mut self, op0: Mm, op1: Mm) {
688        self.emit(MMX_PCMPEQWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
689    }
690}
691
692impl<'a> MmxPcmpeqwEmitter<Mm, Mem> for Assembler<'a> {
693    fn mmx_pcmpeqw(&mut self, op0: Mm, op1: Mem) {
694        self.emit(MMX_PCMPEQWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
695    }
696}
697
698/// `MMX_PCMPGTB` (PCMPGTB). 
699/// Performs an SIMD signed compare for the greater value of the packed byte, word, or doubleword integers in the destination operand (first operand) and the source operand (second operand). If a data element in the destination operand is greater than the corresponding date element in the source operand, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
700///
701///
702/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
703///
704/// Supported operand variants:
705///
706/// ```text
707/// +---+----------+
708/// | # | Operands |
709/// +---+----------+
710/// | 1 | Mm, Mem  |
711/// | 2 | Mm, Mm   |
712/// +---+----------+
713/// ```
714pub trait MmxPcmpgtbEmitter<A, B> {
715    fn mmx_pcmpgtb(&mut self, op0: A, op1: B);
716}
717
718impl<'a> MmxPcmpgtbEmitter<Mm, Mm> for Assembler<'a> {
719    fn mmx_pcmpgtb(&mut self, op0: Mm, op1: Mm) {
720        self.emit(MMX_PCMPGTBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
721    }
722}
723
724impl<'a> MmxPcmpgtbEmitter<Mm, Mem> for Assembler<'a> {
725    fn mmx_pcmpgtb(&mut self, op0: Mm, op1: Mem) {
726        self.emit(MMX_PCMPGTBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
727    }
728}
729
730/// `MMX_PCMPGTD` (PCMPGTD). 
731/// Performs an SIMD signed compare for the greater value of the packed byte, word, or doubleword integers in the destination operand (first operand) and the source operand (second operand). If a data element in the destination operand is greater than the corresponding date element in the source operand, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
732///
733///
734/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
735///
736/// Supported operand variants:
737///
738/// ```text
739/// +---+----------+
740/// | # | Operands |
741/// +---+----------+
742/// | 1 | Mm, Mem  |
743/// | 2 | Mm, Mm   |
744/// +---+----------+
745/// ```
746pub trait MmxPcmpgtdEmitter<A, B> {
747    fn mmx_pcmpgtd(&mut self, op0: A, op1: B);
748}
749
750impl<'a> MmxPcmpgtdEmitter<Mm, Mm> for Assembler<'a> {
751    fn mmx_pcmpgtd(&mut self, op0: Mm, op1: Mm) {
752        self.emit(MMX_PCMPGTDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
753    }
754}
755
756impl<'a> MmxPcmpgtdEmitter<Mm, Mem> for Assembler<'a> {
757    fn mmx_pcmpgtd(&mut self, op0: Mm, op1: Mem) {
758        self.emit(MMX_PCMPGTDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
759    }
760}
761
762/// `MMX_PCMPGTW` (PCMPGTW). 
763/// Performs an SIMD signed compare for the greater value of the packed byte, word, or doubleword integers in the destination operand (first operand) and the source operand (second operand). If a data element in the destination operand is greater than the corresponding date element in the source operand, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
764///
765///
766/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
767///
768/// Supported operand variants:
769///
770/// ```text
771/// +---+----------+
772/// | # | Operands |
773/// +---+----------+
774/// | 1 | Mm, Mem  |
775/// | 2 | Mm, Mm   |
776/// +---+----------+
777/// ```
778pub trait MmxPcmpgtwEmitter<A, B> {
779    fn mmx_pcmpgtw(&mut self, op0: A, op1: B);
780}
781
782impl<'a> MmxPcmpgtwEmitter<Mm, Mm> for Assembler<'a> {
783    fn mmx_pcmpgtw(&mut self, op0: Mm, op1: Mm) {
784        self.emit(MMX_PCMPGTWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
785    }
786}
787
788impl<'a> MmxPcmpgtwEmitter<Mm, Mem> for Assembler<'a> {
789    fn mmx_pcmpgtw(&mut self, op0: Mm, op1: Mem) {
790        self.emit(MMX_PCMPGTWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
791    }
792}
793
794/// `MMX_PMADDWD` (PMADDWD). 
795/// Multiplies the individual signed words of the destination operand (first operand) by the corresponding signed words of the source operand (second operand), producing temporary signed, doubleword results. The adjacent double-word results are then summed and stored in the destination operand. For example, the corresponding low-order words (15-0) and (31-16) in the source and destination operands are multiplied by one another and the double-word results are added together and stored in the low doubleword of the destination register (31-0). The same operation is performed on the other pairs of adjacent words. (Figure 4-11 shows this operation when using 64-bit operands).
796///
797///
798/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMADDWD.html).
799///
800/// Supported operand variants:
801///
802/// ```text
803/// +---+----------+
804/// | # | Operands |
805/// +---+----------+
806/// | 1 | Mm, Mem  |
807/// | 2 | Mm, Mm   |
808/// +---+----------+
809/// ```
810pub trait MmxPmaddwdEmitter<A, B> {
811    fn mmx_pmaddwd(&mut self, op0: A, op1: B);
812}
813
814impl<'a> MmxPmaddwdEmitter<Mm, Mm> for Assembler<'a> {
815    fn mmx_pmaddwd(&mut self, op0: Mm, op1: Mm) {
816        self.emit(MMX_PMADDWDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
817    }
818}
819
820impl<'a> MmxPmaddwdEmitter<Mm, Mem> for Assembler<'a> {
821    fn mmx_pmaddwd(&mut self, op0: Mm, op1: Mem) {
822        self.emit(MMX_PMADDWDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
823    }
824}
825
826/// `MMX_PMULHW` (PMULHW). 
827/// Performs a SIMD signed multiply of the packed signed word integers in the destination operand (first operand) and the source operand (second operand), and stores the high 16 bits of each intermediate 32-bit result in the destination operand. (Figure 4-12 shows this operation when using 64-bit operands.)
828///
829///
830/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULHW.html).
831///
832/// Supported operand variants:
833///
834/// ```text
835/// +---+----------+
836/// | # | Operands |
837/// +---+----------+
838/// | 1 | Mm, Mem  |
839/// | 2 | Mm, Mm   |
840/// +---+----------+
841/// ```
842pub trait MmxPmulhwEmitter<A, B> {
843    fn mmx_pmulhw(&mut self, op0: A, op1: B);
844}
845
846impl<'a> MmxPmulhwEmitter<Mm, Mm> for Assembler<'a> {
847    fn mmx_pmulhw(&mut self, op0: Mm, op1: Mm) {
848        self.emit(MMX_PMULHWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
849    }
850}
851
852impl<'a> MmxPmulhwEmitter<Mm, Mem> for Assembler<'a> {
853    fn mmx_pmulhw(&mut self, op0: Mm, op1: Mem) {
854        self.emit(MMX_PMULHWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
855    }
856}
857
858/// `MMX_PMULLW` (PMULLW). 
859/// Performs a SIMD signed multiply of the packed signed word integers in the destination operand (first operand) and the source operand (second operand), and stores the low 16 bits of each intermediate 32-bit result in the destination operand. (Figure 4-12 shows this operation when using 64-bit operands.)
860///
861///
862/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULLW.html).
863///
864/// Supported operand variants:
865///
866/// ```text
867/// +---+----------+
868/// | # | Operands |
869/// +---+----------+
870/// | 1 | Mm, Mem  |
871/// | 2 | Mm, Mm   |
872/// +---+----------+
873/// ```
874pub trait MmxPmullwEmitter<A, B> {
875    fn mmx_pmullw(&mut self, op0: A, op1: B);
876}
877
878impl<'a> MmxPmullwEmitter<Mm, Mm> for Assembler<'a> {
879    fn mmx_pmullw(&mut self, op0: Mm, op1: Mm) {
880        self.emit(MMX_PMULLWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
881    }
882}
883
884impl<'a> MmxPmullwEmitter<Mm, Mem> for Assembler<'a> {
885    fn mmx_pmullw(&mut self, op0: Mm, op1: Mem) {
886        self.emit(MMX_PMULLWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
887    }
888}
889
890/// `MMX_PMULUDQ` (PMULUDQ). 
891/// Multiplies the first operand (destination operand) by the second operand (source operand) and stores the result in the destination operand.
892///
893///
894/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULUDQ.html).
895///
896/// Supported operand variants:
897///
898/// ```text
899/// +---+----------+
900/// | # | Operands |
901/// +---+----------+
902/// | 1 | Mm, Mem  |
903/// | 2 | Mm, Mm   |
904/// +---+----------+
905/// ```
906pub trait MmxPmuludqEmitter<A, B> {
907    fn mmx_pmuludq(&mut self, op0: A, op1: B);
908}
909
910impl<'a> MmxPmuludqEmitter<Mm, Mm> for Assembler<'a> {
911    fn mmx_pmuludq(&mut self, op0: Mm, op1: Mm) {
912        self.emit(MMX_PMULUDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
913    }
914}
915
916impl<'a> MmxPmuludqEmitter<Mm, Mem> for Assembler<'a> {
917    fn mmx_pmuludq(&mut self, op0: Mm, op1: Mem) {
918        self.emit(MMX_PMULUDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
919    }
920}
921
922/// `MMX_POR` (POR). 
923/// Performs a bitwise logical OR operation on the source operand (second operand) and the destination operand (first operand) and stores the result in the destination operand. Each bit of the result is set to 1 if either or both of the corresponding bits of the first and second operands are 1; otherwise, it is set to 0.
924///
925///
926/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/POR.html).
927///
928/// Supported operand variants:
929///
930/// ```text
931/// +---+----------+
932/// | # | Operands |
933/// +---+----------+
934/// | 1 | Mm, Mem  |
935/// | 2 | Mm, Mm   |
936/// +---+----------+
937/// ```
938pub trait MmxPorEmitter<A, B> {
939    fn mmx_por(&mut self, op0: A, op1: B);
940}
941
942impl<'a> MmxPorEmitter<Mm, Mm> for Assembler<'a> {
943    fn mmx_por(&mut self, op0: Mm, op1: Mm) {
944        self.emit(MMX_PORRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
945    }
946}
947
948impl<'a> MmxPorEmitter<Mm, Mem> for Assembler<'a> {
949    fn mmx_por(&mut self, op0: Mm, op1: Mem) {
950        self.emit(MMX_PORRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
951    }
952}
953
954/// `MMX_PSLLD` (PSLLD). 
955/// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the left by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted left, the empty low-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-17 gives an example of shifting words in a 64-bit operand.
956///
957///
958/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
959///
960/// Supported operand variants:
961///
962/// ```text
963/// +---+----------+
964/// | # | Operands |
965/// +---+----------+
966/// | 1 | Mm, Imm  |
967/// | 2 | Mm, Mem  |
968/// | 3 | Mm, Mm   |
969/// +---+----------+
970/// ```
971pub trait MmxPslldEmitter<A, B> {
972    fn mmx_pslld(&mut self, op0: A, op1: B);
973}
974
975impl<'a> MmxPslldEmitter<Mm, Imm> for Assembler<'a> {
976    fn mmx_pslld(&mut self, op0: Mm, op1: Imm) {
977        self.emit(MMX_PSLLDRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
978    }
979}
980
981impl<'a> MmxPslldEmitter<Mm, Mm> for Assembler<'a> {
982    fn mmx_pslld(&mut self, op0: Mm, op1: Mm) {
983        self.emit(MMX_PSLLDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
984    }
985}
986
987impl<'a> MmxPslldEmitter<Mm, Mem> for Assembler<'a> {
988    fn mmx_pslld(&mut self, op0: Mm, op1: Mem) {
989        self.emit(MMX_PSLLDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
990    }
991}
992
993/// `MMX_PSLLQ` (PSLLQ). 
994/// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the left by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted left, the empty low-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-17 gives an example of shifting words in a 64-bit operand.
995///
996///
997/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
998///
999/// Supported operand variants:
1000///
1001/// ```text
1002/// +---+----------+
1003/// | # | Operands |
1004/// +---+----------+
1005/// | 1 | Mm, Imm  |
1006/// | 2 | Mm, Mem  |
1007/// | 3 | Mm, Mm   |
1008/// +---+----------+
1009/// ```
1010pub trait MmxPsllqEmitter<A, B> {
1011    fn mmx_psllq(&mut self, op0: A, op1: B);
1012}
1013
1014impl<'a> MmxPsllqEmitter<Mm, Imm> for Assembler<'a> {
1015    fn mmx_psllq(&mut self, op0: Mm, op1: Imm) {
1016        self.emit(MMX_PSLLQRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1017    }
1018}
1019
1020impl<'a> MmxPsllqEmitter<Mm, Mm> for Assembler<'a> {
1021    fn mmx_psllq(&mut self, op0: Mm, op1: Mm) {
1022        self.emit(MMX_PSLLQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1023    }
1024}
1025
1026impl<'a> MmxPsllqEmitter<Mm, Mem> for Assembler<'a> {
1027    fn mmx_psllq(&mut self, op0: Mm, op1: Mem) {
1028        self.emit(MMX_PSLLQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1029    }
1030}
1031
1032/// `MMX_PSLLW` (PSLLW). 
1033/// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the left by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted left, the empty low-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-17 gives an example of shifting words in a 64-bit operand.
1034///
1035///
1036/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
1037///
1038/// Supported operand variants:
1039///
1040/// ```text
1041/// +---+----------+
1042/// | # | Operands |
1043/// +---+----------+
1044/// | 1 | Mm, Imm  |
1045/// | 2 | Mm, Mem  |
1046/// | 3 | Mm, Mm   |
1047/// +---+----------+
1048/// ```
1049pub trait MmxPsllwEmitter<A, B> {
1050    fn mmx_psllw(&mut self, op0: A, op1: B);
1051}
1052
1053impl<'a> MmxPsllwEmitter<Mm, Imm> for Assembler<'a> {
1054    fn mmx_psllw(&mut self, op0: Mm, op1: Imm) {
1055        self.emit(MMX_PSLLWRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1056    }
1057}
1058
1059impl<'a> MmxPsllwEmitter<Mm, Mm> for Assembler<'a> {
1060    fn mmx_psllw(&mut self, op0: Mm, op1: Mm) {
1061        self.emit(MMX_PSLLWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1062    }
1063}
1064
1065impl<'a> MmxPsllwEmitter<Mm, Mem> for Assembler<'a> {
1066    fn mmx_psllw(&mut self, op0: Mm, op1: Mem) {
1067        self.emit(MMX_PSLLWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1068    }
1069}
1070
1071/// `MMX_PSRAD` (PSRAD). 
1072/// Shifts the bits in the individual data elements (words, doublewords or quadwords) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are filled with the initial value of the sign bit of the data element. If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for quadwords), each destination data element is filled with the initial value of the sign bit of the element. (Figure 4-18 gives an example of shifting words in a 64-bit operand.)
1073///
1074///
1075/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
1076///
1077/// Supported operand variants:
1078///
1079/// ```text
1080/// +---+----------+
1081/// | # | Operands |
1082/// +---+----------+
1083/// | 1 | Mm, Imm  |
1084/// | 2 | Mm, Mem  |
1085/// | 3 | Mm, Mm   |
1086/// +---+----------+
1087/// ```
1088pub trait MmxPsradEmitter<A, B> {
1089    fn mmx_psrad(&mut self, op0: A, op1: B);
1090}
1091
1092impl<'a> MmxPsradEmitter<Mm, Imm> for Assembler<'a> {
1093    fn mmx_psrad(&mut self, op0: Mm, op1: Imm) {
1094        self.emit(MMX_PSRADRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1095    }
1096}
1097
1098impl<'a> MmxPsradEmitter<Mm, Mm> for Assembler<'a> {
1099    fn mmx_psrad(&mut self, op0: Mm, op1: Mm) {
1100        self.emit(MMX_PSRADRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1101    }
1102}
1103
1104impl<'a> MmxPsradEmitter<Mm, Mem> for Assembler<'a> {
1105    fn mmx_psrad(&mut self, op0: Mm, op1: Mem) {
1106        self.emit(MMX_PSRADRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1107    }
1108}
1109
1110/// `MMX_PSRAW` (PSRAW). 
1111/// Shifts the bits in the individual data elements (words, doublewords or quadwords) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are filled with the initial value of the sign bit of the data element. If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for quadwords), each destination data element is filled with the initial value of the sign bit of the element. (Figure 4-18 gives an example of shifting words in a 64-bit operand.)
1112///
1113///
1114/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
1115///
1116/// Supported operand variants:
1117///
1118/// ```text
1119/// +---+----------+
1120/// | # | Operands |
1121/// +---+----------+
1122/// | 1 | Mm, Imm  |
1123/// | 2 | Mm, Mem  |
1124/// | 3 | Mm, Mm   |
1125/// +---+----------+
1126/// ```
1127pub trait MmxPsrawEmitter<A, B> {
1128    fn mmx_psraw(&mut self, op0: A, op1: B);
1129}
1130
1131impl<'a> MmxPsrawEmitter<Mm, Imm> for Assembler<'a> {
1132    fn mmx_psraw(&mut self, op0: Mm, op1: Imm) {
1133        self.emit(MMX_PSRAWRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1134    }
1135}
1136
1137impl<'a> MmxPsrawEmitter<Mm, Mm> for Assembler<'a> {
1138    fn mmx_psraw(&mut self, op0: Mm, op1: Mm) {
1139        self.emit(MMX_PSRAWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1140    }
1141}
1142
1143impl<'a> MmxPsrawEmitter<Mm, Mem> for Assembler<'a> {
1144    fn mmx_psraw(&mut self, op0: Mm, op1: Mem) {
1145        self.emit(MMX_PSRAWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1146    }
1147}
1148
1149/// `MMX_PSRLD` (PSRLD). 
1150/// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-19 gives an example of shifting words in a 64-bit operand.
1151///
1152///
1153/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
1154///
1155/// Supported operand variants:
1156///
1157/// ```text
1158/// +---+----------+
1159/// | # | Operands |
1160/// +---+----------+
1161/// | 1 | Mm, Imm  |
1162/// | 2 | Mm, Mem  |
1163/// | 3 | Mm, Mm   |
1164/// +---+----------+
1165/// ```
1166pub trait MmxPsrldEmitter<A, B> {
1167    fn mmx_psrld(&mut self, op0: A, op1: B);
1168}
1169
1170impl<'a> MmxPsrldEmitter<Mm, Imm> for Assembler<'a> {
1171    fn mmx_psrld(&mut self, op0: Mm, op1: Imm) {
1172        self.emit(MMX_PSRLDRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1173    }
1174}
1175
1176impl<'a> MmxPsrldEmitter<Mm, Mm> for Assembler<'a> {
1177    fn mmx_psrld(&mut self, op0: Mm, op1: Mm) {
1178        self.emit(MMX_PSRLDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1179    }
1180}
1181
1182impl<'a> MmxPsrldEmitter<Mm, Mem> for Assembler<'a> {
1183    fn mmx_psrld(&mut self, op0: Mm, op1: Mem) {
1184        self.emit(MMX_PSRLDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1185    }
1186}
1187
1188/// `MMX_PSRLQ` (PSRLQ). 
1189/// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-19 gives an example of shifting words in a 64-bit operand.
1190///
1191///
1192/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
1193///
1194/// Supported operand variants:
1195///
1196/// ```text
1197/// +---+----------+
1198/// | # | Operands |
1199/// +---+----------+
1200/// | 1 | Mm, Imm  |
1201/// | 2 | Mm, Mem  |
1202/// | 3 | Mm, Mm   |
1203/// +---+----------+
1204/// ```
1205pub trait MmxPsrlqEmitter<A, B> {
1206    fn mmx_psrlq(&mut self, op0: A, op1: B);
1207}
1208
1209impl<'a> MmxPsrlqEmitter<Mm, Imm> for Assembler<'a> {
1210    fn mmx_psrlq(&mut self, op0: Mm, op1: Imm) {
1211        self.emit(MMX_PSRLQRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1212    }
1213}
1214
1215impl<'a> MmxPsrlqEmitter<Mm, Mm> for Assembler<'a> {
1216    fn mmx_psrlq(&mut self, op0: Mm, op1: Mm) {
1217        self.emit(MMX_PSRLQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1218    }
1219}
1220
1221impl<'a> MmxPsrlqEmitter<Mm, Mem> for Assembler<'a> {
1222    fn mmx_psrlq(&mut self, op0: Mm, op1: Mem) {
1223        self.emit(MMX_PSRLQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1224    }
1225}
1226
1227/// `MMX_PSRLW` (PSRLW). 
1228/// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-19 gives an example of shifting words in a 64-bit operand.
1229///
1230///
1231/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
1232///
1233/// Supported operand variants:
1234///
1235/// ```text
1236/// +---+----------+
1237/// | # | Operands |
1238/// +---+----------+
1239/// | 1 | Mm, Imm  |
1240/// | 2 | Mm, Mem  |
1241/// | 3 | Mm, Mm   |
1242/// +---+----------+
1243/// ```
1244pub trait MmxPsrlwEmitter<A, B> {
1245    fn mmx_psrlw(&mut self, op0: A, op1: B);
1246}
1247
1248impl<'a> MmxPsrlwEmitter<Mm, Imm> for Assembler<'a> {
1249    fn mmx_psrlw(&mut self, op0: Mm, op1: Imm) {
1250        self.emit(MMX_PSRLWRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1251    }
1252}
1253
1254impl<'a> MmxPsrlwEmitter<Mm, Mm> for Assembler<'a> {
1255    fn mmx_psrlw(&mut self, op0: Mm, op1: Mm) {
1256        self.emit(MMX_PSRLWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1257    }
1258}
1259
1260impl<'a> MmxPsrlwEmitter<Mm, Mem> for Assembler<'a> {
1261    fn mmx_psrlw(&mut self, op0: Mm, op1: Mem) {
1262        self.emit(MMX_PSRLWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1263    }
1264}
1265
1266/// `MMX_PSUBB` (PSUBB). 
1267/// Performs a SIMD subtract of the packed integers of the source operand (second operand) from the packed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
1268///
1269///
1270/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
1271///
1272/// Supported operand variants:
1273///
1274/// ```text
1275/// +---+----------+
1276/// | # | Operands |
1277/// +---+----------+
1278/// | 1 | Mm, Mem  |
1279/// | 2 | Mm, Mm   |
1280/// +---+----------+
1281/// ```
1282pub trait MmxPsubbEmitter<A, B> {
1283    fn mmx_psubb(&mut self, op0: A, op1: B);
1284}
1285
1286impl<'a> MmxPsubbEmitter<Mm, Mm> for Assembler<'a> {
1287    fn mmx_psubb(&mut self, op0: Mm, op1: Mm) {
1288        self.emit(MMX_PSUBBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1289    }
1290}
1291
1292impl<'a> MmxPsubbEmitter<Mm, Mem> for Assembler<'a> {
1293    fn mmx_psubb(&mut self, op0: Mm, op1: Mem) {
1294        self.emit(MMX_PSUBBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1295    }
1296}
1297
1298/// `MMX_PSUBD` (PSUBD). 
1299/// Performs a SIMD subtract of the packed integers of the source operand (second operand) from the packed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
1300///
1301///
1302/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
1303///
1304/// Supported operand variants:
1305///
1306/// ```text
1307/// +---+----------+
1308/// | # | Operands |
1309/// +---+----------+
1310/// | 1 | Mm, Mem  |
1311/// | 2 | Mm, Mm   |
1312/// +---+----------+
1313/// ```
1314pub trait MmxPsubdEmitter<A, B> {
1315    fn mmx_psubd(&mut self, op0: A, op1: B);
1316}
1317
1318impl<'a> MmxPsubdEmitter<Mm, Mm> for Assembler<'a> {
1319    fn mmx_psubd(&mut self, op0: Mm, op1: Mm) {
1320        self.emit(MMX_PSUBDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1321    }
1322}
1323
1324impl<'a> MmxPsubdEmitter<Mm, Mem> for Assembler<'a> {
1325    fn mmx_psubd(&mut self, op0: Mm, op1: Mem) {
1326        self.emit(MMX_PSUBDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1327    }
1328}
1329
1330/// `MMX_PSUBQ` (PSUBQ). 
1331/// Subtracts the second operand (source operand) from the first operand (destination operand) and stores the result in the destination operand. When packed quadword operands are used, a SIMD subtract is performed. When a quadword result is too large to be represented in 64 bits (overflow), the result is wrapped around and the low 64 bits are written to the destination element (that is, the carry is ignored).
1332///
1333///
1334/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBQ.html).
1335///
1336/// Supported operand variants:
1337///
1338/// ```text
1339/// +---+----------+
1340/// | # | Operands |
1341/// +---+----------+
1342/// | 1 | Mm, Mem  |
1343/// | 2 | Mm, Mm   |
1344/// +---+----------+
1345/// ```
1346pub trait MmxPsubqEmitter<A, B> {
1347    fn mmx_psubq(&mut self, op0: A, op1: B);
1348}
1349
1350impl<'a> MmxPsubqEmitter<Mm, Mm> for Assembler<'a> {
1351    fn mmx_psubq(&mut self, op0: Mm, op1: Mm) {
1352        self.emit(MMX_PSUBQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1353    }
1354}
1355
1356impl<'a> MmxPsubqEmitter<Mm, Mem> for Assembler<'a> {
1357    fn mmx_psubq(&mut self, op0: Mm, op1: Mem) {
1358        self.emit(MMX_PSUBQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1359    }
1360}
1361
1362/// `MMX_PSUBSB` (PSUBSB). 
1363/// Performs a SIMD subtract of the packed signed integers of the source operand (second operand) from the packed signed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
1364///
1365///
1366/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
1367///
1368/// Supported operand variants:
1369///
1370/// ```text
1371/// +---+----------+
1372/// | # | Operands |
1373/// +---+----------+
1374/// | 1 | Mm, Mem  |
1375/// | 2 | Mm, Mm   |
1376/// +---+----------+
1377/// ```
1378pub trait MmxPsubsbEmitter<A, B> {
1379    fn mmx_psubsb(&mut self, op0: A, op1: B);
1380}
1381
1382impl<'a> MmxPsubsbEmitter<Mm, Mm> for Assembler<'a> {
1383    fn mmx_psubsb(&mut self, op0: Mm, op1: Mm) {
1384        self.emit(MMX_PSUBSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1385    }
1386}
1387
1388impl<'a> MmxPsubsbEmitter<Mm, Mem> for Assembler<'a> {
1389    fn mmx_psubsb(&mut self, op0: Mm, op1: Mem) {
1390        self.emit(MMX_PSUBSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1391    }
1392}
1393
1394/// `MMX_PSUBSW` (PSUBSW). 
1395/// Performs a SIMD subtract of the packed signed integers of the source operand (second operand) from the packed signed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
1396///
1397///
1398/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
1399///
1400/// Supported operand variants:
1401///
1402/// ```text
1403/// +---+----------+
1404/// | # | Operands |
1405/// +---+----------+
1406/// | 1 | Mm, Mem  |
1407/// | 2 | Mm, Mm   |
1408/// +---+----------+
1409/// ```
1410pub trait MmxPsubswEmitter<A, B> {
1411    fn mmx_psubsw(&mut self, op0: A, op1: B);
1412}
1413
1414impl<'a> MmxPsubswEmitter<Mm, Mm> for Assembler<'a> {
1415    fn mmx_psubsw(&mut self, op0: Mm, op1: Mm) {
1416        self.emit(MMX_PSUBSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1417    }
1418}
1419
1420impl<'a> MmxPsubswEmitter<Mm, Mem> for Assembler<'a> {
1421    fn mmx_psubsw(&mut self, op0: Mm, op1: Mem) {
1422        self.emit(MMX_PSUBSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1423    }
1424}
1425
1426/// `MMX_PSUBUSB` (PSUBUSB). 
1427/// Performs a SIMD subtract of the packed unsigned integers of the source operand (second operand) from the packed unsigned integers of the destination operand (first operand), and stores the packed unsigned integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
1428///
1429///
1430/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
1431///
1432/// Supported operand variants:
1433///
1434/// ```text
1435/// +---+----------+
1436/// | # | Operands |
1437/// +---+----------+
1438/// | 1 | Mm, Mem  |
1439/// | 2 | Mm, Mm   |
1440/// +---+----------+
1441/// ```
1442pub trait MmxPsubusbEmitter<A, B> {
1443    fn mmx_psubusb(&mut self, op0: A, op1: B);
1444}
1445
1446impl<'a> MmxPsubusbEmitter<Mm, Mm> for Assembler<'a> {
1447    fn mmx_psubusb(&mut self, op0: Mm, op1: Mm) {
1448        self.emit(MMX_PSUBUSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1449    }
1450}
1451
1452impl<'a> MmxPsubusbEmitter<Mm, Mem> for Assembler<'a> {
1453    fn mmx_psubusb(&mut self, op0: Mm, op1: Mem) {
1454        self.emit(MMX_PSUBUSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1455    }
1456}
1457
1458/// `MMX_PSUBUSW` (PSUBUSW). 
1459/// Performs a SIMD subtract of the packed unsigned integers of the source operand (second operand) from the packed unsigned integers of the destination operand (first operand), and stores the packed unsigned integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
1460///
1461///
1462/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
1463///
1464/// Supported operand variants:
1465///
1466/// ```text
1467/// +---+----------+
1468/// | # | Operands |
1469/// +---+----------+
1470/// | 1 | Mm, Mem  |
1471/// | 2 | Mm, Mm   |
1472/// +---+----------+
1473/// ```
1474pub trait MmxPsubuswEmitter<A, B> {
1475    fn mmx_psubusw(&mut self, op0: A, op1: B);
1476}
1477
1478impl<'a> MmxPsubuswEmitter<Mm, Mm> for Assembler<'a> {
1479    fn mmx_psubusw(&mut self, op0: Mm, op1: Mm) {
1480        self.emit(MMX_PSUBUSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1481    }
1482}
1483
1484impl<'a> MmxPsubuswEmitter<Mm, Mem> for Assembler<'a> {
1485    fn mmx_psubusw(&mut self, op0: Mm, op1: Mem) {
1486        self.emit(MMX_PSUBUSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1487    }
1488}
1489
1490/// `MMX_PSUBW` (PSUBW). 
1491/// Performs a SIMD subtract of the packed integers of the source operand (second operand) from the packed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
1492///
1493///
1494/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
1495///
1496/// Supported operand variants:
1497///
1498/// ```text
1499/// +---+----------+
1500/// | # | Operands |
1501/// +---+----------+
1502/// | 1 | Mm, Mem  |
1503/// | 2 | Mm, Mm   |
1504/// +---+----------+
1505/// ```
1506pub trait MmxPsubwEmitter<A, B> {
1507    fn mmx_psubw(&mut self, op0: A, op1: B);
1508}
1509
1510impl<'a> MmxPsubwEmitter<Mm, Mm> for Assembler<'a> {
1511    fn mmx_psubw(&mut self, op0: Mm, op1: Mm) {
1512        self.emit(MMX_PSUBWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1513    }
1514}
1515
1516impl<'a> MmxPsubwEmitter<Mm, Mem> for Assembler<'a> {
1517    fn mmx_psubw(&mut self, op0: Mm, op1: Mem) {
1518        self.emit(MMX_PSUBWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1519    }
1520}
1521
1522/// `MMX_PUNPCKHBW` (PUNPCKHBW). 
1523/// Unpacks and interleaves the high-order data elements (bytes, words, doublewords, or quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. Figure 4-20 shows the unpack operation for bytes in 64-bit operands. The low-order data elements are ignored.
1524///
1525///
1526/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
1527///
1528/// Supported operand variants:
1529///
1530/// ```text
1531/// +---+----------+
1532/// | # | Operands |
1533/// +---+----------+
1534/// | 1 | Mm, Mem  |
1535/// | 2 | Mm, Mm   |
1536/// +---+----------+
1537/// ```
1538pub trait MmxPunpckhbwEmitter<A, B> {
1539    fn mmx_punpckhbw(&mut self, op0: A, op1: B);
1540}
1541
1542impl<'a> MmxPunpckhbwEmitter<Mm, Mm> for Assembler<'a> {
1543    fn mmx_punpckhbw(&mut self, op0: Mm, op1: Mm) {
1544        self.emit(MMX_PUNPCKHBWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1545    }
1546}
1547
1548impl<'a> MmxPunpckhbwEmitter<Mm, Mem> for Assembler<'a> {
1549    fn mmx_punpckhbw(&mut self, op0: Mm, op1: Mem) {
1550        self.emit(MMX_PUNPCKHBWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1551    }
1552}
1553
1554/// `MMX_PUNPCKHDQ` (PUNPCKHDQ). 
1555/// Unpacks and interleaves the high-order data elements (bytes, words, doublewords, or quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. Figure 4-20 shows the unpack operation for bytes in 64-bit operands. The low-order data elements are ignored.
1556///
1557///
1558/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
1559///
1560/// Supported operand variants:
1561///
1562/// ```text
1563/// +---+----------+
1564/// | # | Operands |
1565/// +---+----------+
1566/// | 1 | Mm, Mem  |
1567/// | 2 | Mm, Mm   |
1568/// +---+----------+
1569/// ```
1570pub trait MmxPunpckhdqEmitter<A, B> {
1571    fn mmx_punpckhdq(&mut self, op0: A, op1: B);
1572}
1573
1574impl<'a> MmxPunpckhdqEmitter<Mm, Mm> for Assembler<'a> {
1575    fn mmx_punpckhdq(&mut self, op0: Mm, op1: Mm) {
1576        self.emit(MMX_PUNPCKHDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1577    }
1578}
1579
1580impl<'a> MmxPunpckhdqEmitter<Mm, Mem> for Assembler<'a> {
1581    fn mmx_punpckhdq(&mut self, op0: Mm, op1: Mem) {
1582        self.emit(MMX_PUNPCKHDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1583    }
1584}
1585
1586/// `MMX_PUNPCKHWD` (PUNPCKHWD). 
1587/// Unpacks and interleaves the high-order data elements (bytes, words, doublewords, or quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. Figure 4-20 shows the unpack operation for bytes in 64-bit operands. The low-order data elements are ignored.
1588///
1589///
1590/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
1591///
1592/// Supported operand variants:
1593///
1594/// ```text
1595/// +---+----------+
1596/// | # | Operands |
1597/// +---+----------+
1598/// | 1 | Mm, Mem  |
1599/// | 2 | Mm, Mm   |
1600/// +---+----------+
1601/// ```
1602pub trait MmxPunpckhwdEmitter<A, B> {
1603    fn mmx_punpckhwd(&mut self, op0: A, op1: B);
1604}
1605
1606impl<'a> MmxPunpckhwdEmitter<Mm, Mm> for Assembler<'a> {
1607    fn mmx_punpckhwd(&mut self, op0: Mm, op1: Mm) {
1608        self.emit(MMX_PUNPCKHWDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1609    }
1610}
1611
1612impl<'a> MmxPunpckhwdEmitter<Mm, Mem> for Assembler<'a> {
1613    fn mmx_punpckhwd(&mut self, op0: Mm, op1: Mem) {
1614        self.emit(MMX_PUNPCKHWDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1615    }
1616}
1617
1618/// `MMX_PUNPCKLBW` (PUNPCKLBW). 
1619/// Unpacks and interleaves the low-order data elements (bytes, words, doublewords, and quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. (Figure 4-22 shows the unpack operation for bytes in 64-bit operands.). The high-order data elements are ignored.
1620///
1621///
1622/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
1623///
1624/// Supported operand variants:
1625///
1626/// ```text
1627/// +---+----------+
1628/// | # | Operands |
1629/// +---+----------+
1630/// | 1 | Mm, Mem  |
1631/// | 2 | Mm, Mm   |
1632/// +---+----------+
1633/// ```
1634pub trait MmxPunpcklbwEmitter<A, B> {
1635    fn mmx_punpcklbw(&mut self, op0: A, op1: B);
1636}
1637
1638impl<'a> MmxPunpcklbwEmitter<Mm, Mm> for Assembler<'a> {
1639    fn mmx_punpcklbw(&mut self, op0: Mm, op1: Mm) {
1640        self.emit(MMX_PUNPCKLBWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1641    }
1642}
1643
1644impl<'a> MmxPunpcklbwEmitter<Mm, Mem> for Assembler<'a> {
1645    fn mmx_punpcklbw(&mut self, op0: Mm, op1: Mem) {
1646        self.emit(MMX_PUNPCKLBWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1647    }
1648}
1649
1650/// `MMX_PUNPCKLDQ` (PUNPCKLDQ). 
1651/// Unpacks and interleaves the low-order data elements (bytes, words, doublewords, and quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. (Figure 4-22 shows the unpack operation for bytes in 64-bit operands.). The high-order data elements are ignored.
1652///
1653///
1654/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
1655///
1656/// Supported operand variants:
1657///
1658/// ```text
1659/// +---+----------+
1660/// | # | Operands |
1661/// +---+----------+
1662/// | 1 | Mm, Mem  |
1663/// | 2 | Mm, Mm   |
1664/// +---+----------+
1665/// ```
1666pub trait MmxPunpckldqEmitter<A, B> {
1667    fn mmx_punpckldq(&mut self, op0: A, op1: B);
1668}
1669
1670impl<'a> MmxPunpckldqEmitter<Mm, Mm> for Assembler<'a> {
1671    fn mmx_punpckldq(&mut self, op0: Mm, op1: Mm) {
1672        self.emit(MMX_PUNPCKLDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1673    }
1674}
1675
1676impl<'a> MmxPunpckldqEmitter<Mm, Mem> for Assembler<'a> {
1677    fn mmx_punpckldq(&mut self, op0: Mm, op1: Mem) {
1678        self.emit(MMX_PUNPCKLDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1679    }
1680}
1681
1682/// `MMX_PUNPCKLWD` (PUNPCKLWD). 
1683/// Unpacks and interleaves the low-order data elements (bytes, words, doublewords, and quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. (Figure 4-22 shows the unpack operation for bytes in 64-bit operands.). The high-order data elements are ignored.
1684///
1685///
1686/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
1687///
1688/// Supported operand variants:
1689///
1690/// ```text
1691/// +---+----------+
1692/// | # | Operands |
1693/// +---+----------+
1694/// | 1 | Mm, Mem  |
1695/// | 2 | Mm, Mm   |
1696/// +---+----------+
1697/// ```
1698pub trait MmxPunpcklwdEmitter<A, B> {
1699    fn mmx_punpcklwd(&mut self, op0: A, op1: B);
1700}
1701
1702impl<'a> MmxPunpcklwdEmitter<Mm, Mm> for Assembler<'a> {
1703    fn mmx_punpcklwd(&mut self, op0: Mm, op1: Mm) {
1704        self.emit(MMX_PUNPCKLWDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1705    }
1706}
1707
1708impl<'a> MmxPunpcklwdEmitter<Mm, Mem> for Assembler<'a> {
1709    fn mmx_punpcklwd(&mut self, op0: Mm, op1: Mem) {
1710        self.emit(MMX_PUNPCKLWDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1711    }
1712}
1713
1714/// `MMX_PXOR` (PXOR). 
1715/// Performs a bitwise logical exclusive-OR (XOR) operation on the source operand (second operand) and the destination operand (first operand) and stores the result in the destination operand. Each bit of the result is 1 if the corresponding bits of the two operands are different; each bit is 0 if the corresponding bits of the operands are the same.
1716///
1717///
1718/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PXOR.html).
1719///
1720/// Supported operand variants:
1721///
1722/// ```text
1723/// +---+----------+
1724/// | # | Operands |
1725/// +---+----------+
1726/// | 1 | Mm, Mem  |
1727/// | 2 | Mm, Mm   |
1728/// +---+----------+
1729/// ```
1730pub trait MmxPxorEmitter<A, B> {
1731    fn mmx_pxor(&mut self, op0: A, op1: B);
1732}
1733
1734impl<'a> MmxPxorEmitter<Mm, Mm> for Assembler<'a> {
1735    fn mmx_pxor(&mut self, op0: Mm, op1: Mm) {
1736        self.emit(MMX_PXORRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1737    }
1738}
1739
1740impl<'a> MmxPxorEmitter<Mm, Mem> for Assembler<'a> {
1741    fn mmx_pxor(&mut self, op0: Mm, op1: Mem) {
1742        self.emit(MMX_PXORRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1743    }
1744}
1745
1746
1747impl<'a> Assembler<'a> {
1748    /// `MMX_EMMS` (EMMS). 
1749    /// Sets the values of all the tags in the x87 FPU tag word to empty (all 1s). This operation marks the x87 FPU data registers (which are aliased to the MMX technology registers) as available for use by x87 FPU floating-point instructions. (See Figure 8-7 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for the format of the x87 FPU tag word.) All other MMX instructions (other than the EMMS instruction) set all the tags in x87 FPU tag word to valid (all 0s).
1750    ///
1751    ///
1752    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/EMMS.html).
1753    ///
1754    /// Supported operand variants:
1755    ///
1756    /// ```text
1757    /// +---+----------+
1758    /// | # | Operands |
1759    /// +---+----------+
1760    /// | 1 | (none)   |
1761    /// +---+----------+
1762    /// ```
1763    #[inline]
1764    pub fn mmx_emms(&mut self)
1765    where Assembler<'a>: MmxEmmsEmitter {
1766        <Self as MmxEmmsEmitter>::mmx_emms(self);
1767    }
1768    /// `MMX_MOVD_G2M`.
1769    ///
1770    /// Supported operand variants:
1771    ///
1772    /// ```text
1773    /// +---+----------+
1774    /// | # | Operands |
1775    /// +---+----------+
1776    /// | 1 | Mm, Gpd  |
1777    /// | 2 | Mm, Mem  |
1778    /// +---+----------+
1779    /// ```
1780    #[inline]
1781    pub fn mmx_movd_g2m<A, B>(&mut self, op0: A, op1: B)
1782    where Assembler<'a>: MmxMovdG2mEmitter<A, B> {
1783        <Self as MmxMovdG2mEmitter<A, B>>::mmx_movd_g2m(self, op0, op1);
1784    }
1785    /// `MMX_MOVD_M2G`.
1786    ///
1787    /// Supported operand variants:
1788    ///
1789    /// ```text
1790    /// +---+----------+
1791    /// | # | Operands |
1792    /// +---+----------+
1793    /// | 1 | Gpd, Mm  |
1794    /// | 2 | Mem, Mm  |
1795    /// +---+----------+
1796    /// ```
1797    #[inline]
1798    pub fn mmx_movd_m2g<A, B>(&mut self, op0: A, op1: B)
1799    where Assembler<'a>: MmxMovdM2gEmitter<A, B> {
1800        <Self as MmxMovdM2gEmitter<A, B>>::mmx_movd_m2g(self, op0, op1);
1801    }
1802    /// `MMX_MOVQ` (MOVQ). 
1803    /// Copies a doubleword from the source operand (second operand) to the destination operand (first operand). The source and destination operands can be general-purpose registers, MMX technology registers, XMM registers, or 32-bit memory locations. This instruction can be used to move a doubleword to and from the low doubleword of an MMX technology register and a general-purpose register or a 32-bit memory location, or to and from the low doubleword of an XMM register and a general-purpose register or a 32-bit memory location. The instruction cannot be used to transfer data between MMX technology registers, between XMM registers, between general-purpose registers, or between memory locations.
1804    ///
1805    ///
1806    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
1807    ///
1808    /// Supported operand variants:
1809    ///
1810    /// ```text
1811    /// +---+----------+
1812    /// | # | Operands |
1813    /// +---+----------+
1814    /// | 1 | Mem, Mm  |
1815    /// | 2 | Mm, Mem  |
1816    /// | 3 | Mm, Mm   |
1817    /// +---+----------+
1818    /// ```
1819    #[inline]
1820    pub fn mmx_movq<A, B>(&mut self, op0: A, op1: B)
1821    where Assembler<'a>: MmxMovqEmitter<A, B> {
1822        <Self as MmxMovqEmitter<A, B>>::mmx_movq(self, op0, op1);
1823    }
1824    /// `MMX_MOVQ_G2M`.
1825    ///
1826    /// Supported operand variants:
1827    ///
1828    /// ```text
1829    /// +---+----------+
1830    /// | # | Operands |
1831    /// +---+----------+
1832    /// | 1 | Mm, Gpd  |
1833    /// | 2 | Mm, Mem  |
1834    /// +---+----------+
1835    /// ```
1836    #[inline]
1837    pub fn mmx_movq_g2m<A, B>(&mut self, op0: A, op1: B)
1838    where Assembler<'a>: MmxMovqG2mEmitter<A, B> {
1839        <Self as MmxMovqG2mEmitter<A, B>>::mmx_movq_g2m(self, op0, op1);
1840    }
1841    /// `MMX_MOVQ_M2G`.
1842    ///
1843    /// Supported operand variants:
1844    ///
1845    /// ```text
1846    /// +---+----------+
1847    /// | # | Operands |
1848    /// +---+----------+
1849    /// | 1 | Gpd, Mm  |
1850    /// | 2 | Mem, Mm  |
1851    /// +---+----------+
1852    /// ```
1853    #[inline]
1854    pub fn mmx_movq_m2g<A, B>(&mut self, op0: A, op1: B)
1855    where Assembler<'a>: MmxMovqM2gEmitter<A, B> {
1856        <Self as MmxMovqM2gEmitter<A, B>>::mmx_movq_m2g(self, op0, op1);
1857    }
1858    /// `MMX_PACKSSDW` (PACKSSDW). 
1859    /// Converts packed signed word integers into packed signed byte integers (PACKSSWB) or converts packed signed doubleword integers into packed signed word integers (PACKSSDW), using saturation to handle overflow conditions. See Figure 4-6 for an example of the packing operation.
1860    ///
1861    ///
1862    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
1863    ///
1864    /// Supported operand variants:
1865    ///
1866    /// ```text
1867    /// +---+----------+
1868    /// | # | Operands |
1869    /// +---+----------+
1870    /// | 1 | Mm, Mem  |
1871    /// | 2 | Mm, Mm   |
1872    /// +---+----------+
1873    /// ```
1874    #[inline]
1875    pub fn mmx_packssdw<A, B>(&mut self, op0: A, op1: B)
1876    where Assembler<'a>: MmxPackssdwEmitter<A, B> {
1877        <Self as MmxPackssdwEmitter<A, B>>::mmx_packssdw(self, op0, op1);
1878    }
1879    /// `MMX_PACKSSWB` (PACKSSWB). 
1880    /// Converts packed signed word integers into packed signed byte integers (PACKSSWB) or converts packed signed doubleword integers into packed signed word integers (PACKSSDW), using saturation to handle overflow conditions. See Figure 4-6 for an example of the packing operation.
1881    ///
1882    ///
1883    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
1884    ///
1885    /// Supported operand variants:
1886    ///
1887    /// ```text
1888    /// +---+----------+
1889    /// | # | Operands |
1890    /// +---+----------+
1891    /// | 1 | Mm, Mem  |
1892    /// | 2 | Mm, Mm   |
1893    /// +---+----------+
1894    /// ```
1895    #[inline]
1896    pub fn mmx_packsswb<A, B>(&mut self, op0: A, op1: B)
1897    where Assembler<'a>: MmxPacksswbEmitter<A, B> {
1898        <Self as MmxPacksswbEmitter<A, B>>::mmx_packsswb(self, op0, op1);
1899    }
1900    /// `MMX_PACKUSWB` (PACKUSWB). 
1901    /// Converts 4, 8, 16, or 32 signed word integers from the destination operand (first operand) and 4, 8, 16, or 32 signed word integers from the source operand (second operand) into 8, 16, 32 or 64 unsigned byte integers and stores the result in the destination operand. (See Figure 4-6 for an example of the packing operation.) If a signed word integer value is beyond the range of an unsigned byte integer (that is, greater than FFH or less than 00H), the saturated unsigned byte integer value of FFH or 00H, respectively, is stored in the destination.
1902    ///
1903    ///
1904    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKUSWB.html).
1905    ///
1906    /// Supported operand variants:
1907    ///
1908    /// ```text
1909    /// +---+----------+
1910    /// | # | Operands |
1911    /// +---+----------+
1912    /// | 1 | Mm, Mem  |
1913    /// | 2 | Mm, Mm   |
1914    /// +---+----------+
1915    /// ```
1916    #[inline]
1917    pub fn mmx_packuswb<A, B>(&mut self, op0: A, op1: B)
1918    where Assembler<'a>: MmxPackuswbEmitter<A, B> {
1919        <Self as MmxPackuswbEmitter<A, B>>::mmx_packuswb(self, op0, op1);
1920    }
1921    /// `MMX_PADDB` (PADDB). 
1922    /// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
1923    ///
1924    ///
1925    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
1926    ///
1927    /// Supported operand variants:
1928    ///
1929    /// ```text
1930    /// +---+----------+
1931    /// | # | Operands |
1932    /// +---+----------+
1933    /// | 1 | Mm, Mem  |
1934    /// | 2 | Mm, Mm   |
1935    /// +---+----------+
1936    /// ```
1937    #[inline]
1938    pub fn mmx_paddb<A, B>(&mut self, op0: A, op1: B)
1939    where Assembler<'a>: MmxPaddbEmitter<A, B> {
1940        <Self as MmxPaddbEmitter<A, B>>::mmx_paddb(self, op0, op1);
1941    }
1942    /// `MMX_PADDD` (PADDD). 
1943    /// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
1944    ///
1945    ///
1946    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
1947    ///
1948    /// Supported operand variants:
1949    ///
1950    /// ```text
1951    /// +---+----------+
1952    /// | # | Operands |
1953    /// +---+----------+
1954    /// | 1 | Mm, Mem  |
1955    /// | 2 | Mm, Mm   |
1956    /// +---+----------+
1957    /// ```
1958    #[inline]
1959    pub fn mmx_paddd<A, B>(&mut self, op0: A, op1: B)
1960    where Assembler<'a>: MmxPadddEmitter<A, B> {
1961        <Self as MmxPadddEmitter<A, B>>::mmx_paddd(self, op0, op1);
1962    }
1963    /// `MMX_PADDQ` (PADDQ). 
1964    /// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
1965    ///
1966    ///
1967    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
1968    ///
1969    /// Supported operand variants:
1970    ///
1971    /// ```text
1972    /// +---+----------+
1973    /// | # | Operands |
1974    /// +---+----------+
1975    /// | 1 | Mm, Mem  |
1976    /// | 2 | Mm, Mm   |
1977    /// +---+----------+
1978    /// ```
1979    #[inline]
1980    pub fn mmx_paddq<A, B>(&mut self, op0: A, op1: B)
1981    where Assembler<'a>: MmxPaddqEmitter<A, B> {
1982        <Self as MmxPaddqEmitter<A, B>>::mmx_paddq(self, op0, op1);
1983    }
1984    /// `MMX_PADDSB` (PADDSB). 
1985    /// Performs a SIMD add of the packed signed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
1986    ///
1987    ///
1988    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
1989    ///
1990    /// Supported operand variants:
1991    ///
1992    /// ```text
1993    /// +---+----------+
1994    /// | # | Operands |
1995    /// +---+----------+
1996    /// | 1 | Mm, Mem  |
1997    /// | 2 | Mm, Mm   |
1998    /// +---+----------+
1999    /// ```
2000    #[inline]
2001    pub fn mmx_paddsb<A, B>(&mut self, op0: A, op1: B)
2002    where Assembler<'a>: MmxPaddsbEmitter<A, B> {
2003        <Self as MmxPaddsbEmitter<A, B>>::mmx_paddsb(self, op0, op1);
2004    }
2005    /// `MMX_PADDSW` (PADDSW). 
2006    /// Performs a SIMD add of the packed signed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
2007    ///
2008    ///
2009    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
2010    ///
2011    /// Supported operand variants:
2012    ///
2013    /// ```text
2014    /// +---+----------+
2015    /// | # | Operands |
2016    /// +---+----------+
2017    /// | 1 | Mm, Mem  |
2018    /// | 2 | Mm, Mm   |
2019    /// +---+----------+
2020    /// ```
2021    #[inline]
2022    pub fn mmx_paddsw<A, B>(&mut self, op0: A, op1: B)
2023    where Assembler<'a>: MmxPaddswEmitter<A, B> {
2024        <Self as MmxPaddswEmitter<A, B>>::mmx_paddsw(self, op0, op1);
2025    }
2026    /// `MMX_PADDUSB` (PADDUSB). 
2027    /// Performs a SIMD add of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
2028    ///
2029    ///
2030    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
2031    ///
2032    /// Supported operand variants:
2033    ///
2034    /// ```text
2035    /// +---+----------+
2036    /// | # | Operands |
2037    /// +---+----------+
2038    /// | 1 | Mm, Mem  |
2039    /// | 2 | Mm, Mm   |
2040    /// +---+----------+
2041    /// ```
2042    #[inline]
2043    pub fn mmx_paddusb<A, B>(&mut self, op0: A, op1: B)
2044    where Assembler<'a>: MmxPaddusbEmitter<A, B> {
2045        <Self as MmxPaddusbEmitter<A, B>>::mmx_paddusb(self, op0, op1);
2046    }
2047    /// `MMX_PADDUSW` (PADDUSW). 
2048    /// Performs a SIMD add of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
2049    ///
2050    ///
2051    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
2052    ///
2053    /// Supported operand variants:
2054    ///
2055    /// ```text
2056    /// +---+----------+
2057    /// | # | Operands |
2058    /// +---+----------+
2059    /// | 1 | Mm, Mem  |
2060    /// | 2 | Mm, Mm   |
2061    /// +---+----------+
2062    /// ```
2063    #[inline]
2064    pub fn mmx_paddusw<A, B>(&mut self, op0: A, op1: B)
2065    where Assembler<'a>: MmxPadduswEmitter<A, B> {
2066        <Self as MmxPadduswEmitter<A, B>>::mmx_paddusw(self, op0, op1);
2067    }
2068    /// `MMX_PADDW` (PADDW). 
2069    /// Performs a SIMD add of the packed integers from the source operand (second operand) and the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
2070    ///
2071    ///
2072    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
2073    ///
2074    /// Supported operand variants:
2075    ///
2076    /// ```text
2077    /// +---+----------+
2078    /// | # | Operands |
2079    /// +---+----------+
2080    /// | 1 | Mm, Mem  |
2081    /// | 2 | Mm, Mm   |
2082    /// +---+----------+
2083    /// ```
2084    #[inline]
2085    pub fn mmx_paddw<A, B>(&mut self, op0: A, op1: B)
2086    where Assembler<'a>: MmxPaddwEmitter<A, B> {
2087        <Self as MmxPaddwEmitter<A, B>>::mmx_paddw(self, op0, op1);
2088    }
2089    /// `MMX_PAND` (PAND). 
2090    /// Performs a bitwise logical AND operation on the first source operand and second source operand and stores the result in the destination operand. Each bit of the result is set to 1 if the corresponding bits of the first and second operands are 1, otherwise it is set to 0.
2091    ///
2092    ///
2093    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAND.html).
2094    ///
2095    /// Supported operand variants:
2096    ///
2097    /// ```text
2098    /// +---+----------+
2099    /// | # | Operands |
2100    /// +---+----------+
2101    /// | 1 | Mm, Mem  |
2102    /// | 2 | Mm, Mm   |
2103    /// +---+----------+
2104    /// ```
2105    #[inline]
2106    pub fn mmx_pand<A, B>(&mut self, op0: A, op1: B)
2107    where Assembler<'a>: MmxPandEmitter<A, B> {
2108        <Self as MmxPandEmitter<A, B>>::mmx_pand(self, op0, op1);
2109    }
2110    /// `MMX_PANDN` (PANDN). 
2111    /// Performs a bitwise logical NOT operation on the first source operand, then performs bitwise AND with second source operand and stores the result in the destination operand. Each bit of the result is set to 1 if the corresponding bit in the first operand is 0 and the corresponding bit in the second operand is 1, otherwise it is set to 0.
2112    ///
2113    ///
2114    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PANDN.html).
2115    ///
2116    /// Supported operand variants:
2117    ///
2118    /// ```text
2119    /// +---+----------+
2120    /// | # | Operands |
2121    /// +---+----------+
2122    /// | 1 | Mm, Mem  |
2123    /// | 2 | Mm, Mm   |
2124    /// +---+----------+
2125    /// ```
2126    #[inline]
2127    pub fn mmx_pandn<A, B>(&mut self, op0: A, op1: B)
2128    where Assembler<'a>: MmxPandnEmitter<A, B> {
2129        <Self as MmxPandnEmitter<A, B>>::mmx_pandn(self, op0, op1);
2130    }
2131    /// `MMX_PCMPEQB` (PCMPEQB). 
2132    /// Performs a SIMD compare for equality of the packed bytes, words, or doublewords in the destination operand (first operand) and the source operand (second operand). If a pair of data elements is equal, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
2133    ///
2134    ///
2135    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
2136    ///
2137    /// Supported operand variants:
2138    ///
2139    /// ```text
2140    /// +---+----------+
2141    /// | # | Operands |
2142    /// +---+----------+
2143    /// | 1 | Mm, Mem  |
2144    /// | 2 | Mm, Mm   |
2145    /// +---+----------+
2146    /// ```
2147    #[inline]
2148    pub fn mmx_pcmpeqb<A, B>(&mut self, op0: A, op1: B)
2149    where Assembler<'a>: MmxPcmpeqbEmitter<A, B> {
2150        <Self as MmxPcmpeqbEmitter<A, B>>::mmx_pcmpeqb(self, op0, op1);
2151    }
2152    /// `MMX_PCMPEQD` (PCMPEQD). 
2153    /// Performs a SIMD compare for equality of the packed bytes, words, or doublewords in the destination operand (first operand) and the source operand (second operand). If a pair of data elements is equal, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
2154    ///
2155    ///
2156    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
2157    ///
2158    /// Supported operand variants:
2159    ///
2160    /// ```text
2161    /// +---+----------+
2162    /// | # | Operands |
2163    /// +---+----------+
2164    /// | 1 | Mm, Mem  |
2165    /// | 2 | Mm, Mm   |
2166    /// +---+----------+
2167    /// ```
2168    #[inline]
2169    pub fn mmx_pcmpeqd<A, B>(&mut self, op0: A, op1: B)
2170    where Assembler<'a>: MmxPcmpeqdEmitter<A, B> {
2171        <Self as MmxPcmpeqdEmitter<A, B>>::mmx_pcmpeqd(self, op0, op1);
2172    }
2173    /// `MMX_PCMPEQW` (PCMPEQW). 
2174    /// Performs a SIMD compare for equality of the packed bytes, words, or doublewords in the destination operand (first operand) and the source operand (second operand). If a pair of data elements is equal, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
2175    ///
2176    ///
2177    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
2178    ///
2179    /// Supported operand variants:
2180    ///
2181    /// ```text
2182    /// +---+----------+
2183    /// | # | Operands |
2184    /// +---+----------+
2185    /// | 1 | Mm, Mem  |
2186    /// | 2 | Mm, Mm   |
2187    /// +---+----------+
2188    /// ```
2189    #[inline]
2190    pub fn mmx_pcmpeqw<A, B>(&mut self, op0: A, op1: B)
2191    where Assembler<'a>: MmxPcmpeqwEmitter<A, B> {
2192        <Self as MmxPcmpeqwEmitter<A, B>>::mmx_pcmpeqw(self, op0, op1);
2193    }
2194    /// `MMX_PCMPGTB` (PCMPGTB). 
2195    /// Performs an SIMD signed compare for the greater value of the packed byte, word, or doubleword integers in the destination operand (first operand) and the source operand (second operand). If a data element in the destination operand is greater than the corresponding date element in the source operand, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
2196    ///
2197    ///
2198    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
2199    ///
2200    /// Supported operand variants:
2201    ///
2202    /// ```text
2203    /// +---+----------+
2204    /// | # | Operands |
2205    /// +---+----------+
2206    /// | 1 | Mm, Mem  |
2207    /// | 2 | Mm, Mm   |
2208    /// +---+----------+
2209    /// ```
2210    #[inline]
2211    pub fn mmx_pcmpgtb<A, B>(&mut self, op0: A, op1: B)
2212    where Assembler<'a>: MmxPcmpgtbEmitter<A, B> {
2213        <Self as MmxPcmpgtbEmitter<A, B>>::mmx_pcmpgtb(self, op0, op1);
2214    }
2215    /// `MMX_PCMPGTD` (PCMPGTD). 
2216    /// Performs an SIMD signed compare for the greater value of the packed byte, word, or doubleword integers in the destination operand (first operand) and the source operand (second operand). If a data element in the destination operand is greater than the corresponding date element in the source operand, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
2217    ///
2218    ///
2219    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
2220    ///
2221    /// Supported operand variants:
2222    ///
2223    /// ```text
2224    /// +---+----------+
2225    /// | # | Operands |
2226    /// +---+----------+
2227    /// | 1 | Mm, Mem  |
2228    /// | 2 | Mm, Mm   |
2229    /// +---+----------+
2230    /// ```
2231    #[inline]
2232    pub fn mmx_pcmpgtd<A, B>(&mut self, op0: A, op1: B)
2233    where Assembler<'a>: MmxPcmpgtdEmitter<A, B> {
2234        <Self as MmxPcmpgtdEmitter<A, B>>::mmx_pcmpgtd(self, op0, op1);
2235    }
2236    /// `MMX_PCMPGTW` (PCMPGTW). 
2237    /// Performs an SIMD signed compare for the greater value of the packed byte, word, or doubleword integers in the destination operand (first operand) and the source operand (second operand). If a data element in the destination operand is greater than the corresponding date element in the source operand, the corresponding data element in the destination operand is set to all 1s; otherwise, it is set to all 0s.
2238    ///
2239    ///
2240    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
2241    ///
2242    /// Supported operand variants:
2243    ///
2244    /// ```text
2245    /// +---+----------+
2246    /// | # | Operands |
2247    /// +---+----------+
2248    /// | 1 | Mm, Mem  |
2249    /// | 2 | Mm, Mm   |
2250    /// +---+----------+
2251    /// ```
2252    #[inline]
2253    pub fn mmx_pcmpgtw<A, B>(&mut self, op0: A, op1: B)
2254    where Assembler<'a>: MmxPcmpgtwEmitter<A, B> {
2255        <Self as MmxPcmpgtwEmitter<A, B>>::mmx_pcmpgtw(self, op0, op1);
2256    }
2257    /// `MMX_PMADDWD` (PMADDWD). 
2258    /// Multiplies the individual signed words of the destination operand (first operand) by the corresponding signed words of the source operand (second operand), producing temporary signed, doubleword results. The adjacent double-word results are then summed and stored in the destination operand. For example, the corresponding low-order words (15-0) and (31-16) in the source and destination operands are multiplied by one another and the double-word results are added together and stored in the low doubleword of the destination register (31-0). The same operation is performed on the other pairs of adjacent words. (Figure 4-11 shows this operation when using 64-bit operands).
2259    ///
2260    ///
2261    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMADDWD.html).
2262    ///
2263    /// Supported operand variants:
2264    ///
2265    /// ```text
2266    /// +---+----------+
2267    /// | # | Operands |
2268    /// +---+----------+
2269    /// | 1 | Mm, Mem  |
2270    /// | 2 | Mm, Mm   |
2271    /// +---+----------+
2272    /// ```
2273    #[inline]
2274    pub fn mmx_pmaddwd<A, B>(&mut self, op0: A, op1: B)
2275    where Assembler<'a>: MmxPmaddwdEmitter<A, B> {
2276        <Self as MmxPmaddwdEmitter<A, B>>::mmx_pmaddwd(self, op0, op1);
2277    }
2278    /// `MMX_PMULHW` (PMULHW). 
2279    /// Performs a SIMD signed multiply of the packed signed word integers in the destination operand (first operand) and the source operand (second operand), and stores the high 16 bits of each intermediate 32-bit result in the destination operand. (Figure 4-12 shows this operation when using 64-bit operands.)
2280    ///
2281    ///
2282    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULHW.html).
2283    ///
2284    /// Supported operand variants:
2285    ///
2286    /// ```text
2287    /// +---+----------+
2288    /// | # | Operands |
2289    /// +---+----------+
2290    /// | 1 | Mm, Mem  |
2291    /// | 2 | Mm, Mm   |
2292    /// +---+----------+
2293    /// ```
2294    #[inline]
2295    pub fn mmx_pmulhw<A, B>(&mut self, op0: A, op1: B)
2296    where Assembler<'a>: MmxPmulhwEmitter<A, B> {
2297        <Self as MmxPmulhwEmitter<A, B>>::mmx_pmulhw(self, op0, op1);
2298    }
2299    /// `MMX_PMULLW` (PMULLW). 
2300    /// Performs a SIMD signed multiply of the packed signed word integers in the destination operand (first operand) and the source operand (second operand), and stores the low 16 bits of each intermediate 32-bit result in the destination operand. (Figure 4-12 shows this operation when using 64-bit operands.)
2301    ///
2302    ///
2303    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULLW.html).
2304    ///
2305    /// Supported operand variants:
2306    ///
2307    /// ```text
2308    /// +---+----------+
2309    /// | # | Operands |
2310    /// +---+----------+
2311    /// | 1 | Mm, Mem  |
2312    /// | 2 | Mm, Mm   |
2313    /// +---+----------+
2314    /// ```
2315    #[inline]
2316    pub fn mmx_pmullw<A, B>(&mut self, op0: A, op1: B)
2317    where Assembler<'a>: MmxPmullwEmitter<A, B> {
2318        <Self as MmxPmullwEmitter<A, B>>::mmx_pmullw(self, op0, op1);
2319    }
2320    /// `MMX_PMULUDQ` (PMULUDQ). 
2321    /// Multiplies the first operand (destination operand) by the second operand (source operand) and stores the result in the destination operand.
2322    ///
2323    ///
2324    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULUDQ.html).
2325    ///
2326    /// Supported operand variants:
2327    ///
2328    /// ```text
2329    /// +---+----------+
2330    /// | # | Operands |
2331    /// +---+----------+
2332    /// | 1 | Mm, Mem  |
2333    /// | 2 | Mm, Mm   |
2334    /// +---+----------+
2335    /// ```
2336    #[inline]
2337    pub fn mmx_pmuludq<A, B>(&mut self, op0: A, op1: B)
2338    where Assembler<'a>: MmxPmuludqEmitter<A, B> {
2339        <Self as MmxPmuludqEmitter<A, B>>::mmx_pmuludq(self, op0, op1);
2340    }
2341    /// `MMX_POR` (POR). 
2342    /// Performs a bitwise logical OR operation on the source operand (second operand) and the destination operand (first operand) and stores the result in the destination operand. Each bit of the result is set to 1 if either or both of the corresponding bits of the first and second operands are 1; otherwise, it is set to 0.
2343    ///
2344    ///
2345    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/POR.html).
2346    ///
2347    /// Supported operand variants:
2348    ///
2349    /// ```text
2350    /// +---+----------+
2351    /// | # | Operands |
2352    /// +---+----------+
2353    /// | 1 | Mm, Mem  |
2354    /// | 2 | Mm, Mm   |
2355    /// +---+----------+
2356    /// ```
2357    #[inline]
2358    pub fn mmx_por<A, B>(&mut self, op0: A, op1: B)
2359    where Assembler<'a>: MmxPorEmitter<A, B> {
2360        <Self as MmxPorEmitter<A, B>>::mmx_por(self, op0, op1);
2361    }
2362    /// `MMX_PSLLD` (PSLLD). 
2363    /// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the left by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted left, the empty low-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-17 gives an example of shifting words in a 64-bit operand.
2364    ///
2365    ///
2366    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
2367    ///
2368    /// Supported operand variants:
2369    ///
2370    /// ```text
2371    /// +---+----------+
2372    /// | # | Operands |
2373    /// +---+----------+
2374    /// | 1 | Mm, Imm  |
2375    /// | 2 | Mm, Mem  |
2376    /// | 3 | Mm, Mm   |
2377    /// +---+----------+
2378    /// ```
2379    #[inline]
2380    pub fn mmx_pslld<A, B>(&mut self, op0: A, op1: B)
2381    where Assembler<'a>: MmxPslldEmitter<A, B> {
2382        <Self as MmxPslldEmitter<A, B>>::mmx_pslld(self, op0, op1);
2383    }
2384    /// `MMX_PSLLQ` (PSLLQ). 
2385    /// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the left by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted left, the empty low-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-17 gives an example of shifting words in a 64-bit operand.
2386    ///
2387    ///
2388    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
2389    ///
2390    /// Supported operand variants:
2391    ///
2392    /// ```text
2393    /// +---+----------+
2394    /// | # | Operands |
2395    /// +---+----------+
2396    /// | 1 | Mm, Imm  |
2397    /// | 2 | Mm, Mem  |
2398    /// | 3 | Mm, Mm   |
2399    /// +---+----------+
2400    /// ```
2401    #[inline]
2402    pub fn mmx_psllq<A, B>(&mut self, op0: A, op1: B)
2403    where Assembler<'a>: MmxPsllqEmitter<A, B> {
2404        <Self as MmxPsllqEmitter<A, B>>::mmx_psllq(self, op0, op1);
2405    }
2406    /// `MMX_PSLLW` (PSLLW). 
2407    /// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the left by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted left, the empty low-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-17 gives an example of shifting words in a 64-bit operand.
2408    ///
2409    ///
2410    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
2411    ///
2412    /// Supported operand variants:
2413    ///
2414    /// ```text
2415    /// +---+----------+
2416    /// | # | Operands |
2417    /// +---+----------+
2418    /// | 1 | Mm, Imm  |
2419    /// | 2 | Mm, Mem  |
2420    /// | 3 | Mm, Mm   |
2421    /// +---+----------+
2422    /// ```
2423    #[inline]
2424    pub fn mmx_psllw<A, B>(&mut self, op0: A, op1: B)
2425    where Assembler<'a>: MmxPsllwEmitter<A, B> {
2426        <Self as MmxPsllwEmitter<A, B>>::mmx_psllw(self, op0, op1);
2427    }
2428    /// `MMX_PSRAD` (PSRAD). 
2429    /// Shifts the bits in the individual data elements (words, doublewords or quadwords) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are filled with the initial value of the sign bit of the data element. If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for quadwords), each destination data element is filled with the initial value of the sign bit of the element. (Figure 4-18 gives an example of shifting words in a 64-bit operand.)
2430    ///
2431    ///
2432    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
2433    ///
2434    /// Supported operand variants:
2435    ///
2436    /// ```text
2437    /// +---+----------+
2438    /// | # | Operands |
2439    /// +---+----------+
2440    /// | 1 | Mm, Imm  |
2441    /// | 2 | Mm, Mem  |
2442    /// | 3 | Mm, Mm   |
2443    /// +---+----------+
2444    /// ```
2445    #[inline]
2446    pub fn mmx_psrad<A, B>(&mut self, op0: A, op1: B)
2447    where Assembler<'a>: MmxPsradEmitter<A, B> {
2448        <Self as MmxPsradEmitter<A, B>>::mmx_psrad(self, op0, op1);
2449    }
2450    /// `MMX_PSRAW` (PSRAW). 
2451    /// Shifts the bits in the individual data elements (words, doublewords or quadwords) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are filled with the initial value of the sign bit of the data element. If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for quadwords), each destination data element is filled with the initial value of the sign bit of the element. (Figure 4-18 gives an example of shifting words in a 64-bit operand.)
2452    ///
2453    ///
2454    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
2455    ///
2456    /// Supported operand variants:
2457    ///
2458    /// ```text
2459    /// +---+----------+
2460    /// | # | Operands |
2461    /// +---+----------+
2462    /// | 1 | Mm, Imm  |
2463    /// | 2 | Mm, Mem  |
2464    /// | 3 | Mm, Mm   |
2465    /// +---+----------+
2466    /// ```
2467    #[inline]
2468    pub fn mmx_psraw<A, B>(&mut self, op0: A, op1: B)
2469    where Assembler<'a>: MmxPsrawEmitter<A, B> {
2470        <Self as MmxPsrawEmitter<A, B>>::mmx_psraw(self, op0, op1);
2471    }
2472    /// `MMX_PSRLD` (PSRLD). 
2473    /// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-19 gives an example of shifting words in a 64-bit operand.
2474    ///
2475    ///
2476    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
2477    ///
2478    /// Supported operand variants:
2479    ///
2480    /// ```text
2481    /// +---+----------+
2482    /// | # | Operands |
2483    /// +---+----------+
2484    /// | 1 | Mm, Imm  |
2485    /// | 2 | Mm, Mem  |
2486    /// | 3 | Mm, Mm   |
2487    /// +---+----------+
2488    /// ```
2489    #[inline]
2490    pub fn mmx_psrld<A, B>(&mut self, op0: A, op1: B)
2491    where Assembler<'a>: MmxPsrldEmitter<A, B> {
2492        <Self as MmxPsrldEmitter<A, B>>::mmx_psrld(self, op0, op1);
2493    }
2494    /// `MMX_PSRLQ` (PSRLQ). 
2495    /// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-19 gives an example of shifting words in a 64-bit operand.
2496    ///
2497    ///
2498    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
2499    ///
2500    /// Supported operand variants:
2501    ///
2502    /// ```text
2503    /// +---+----------+
2504    /// | # | Operands |
2505    /// +---+----------+
2506    /// | 1 | Mm, Imm  |
2507    /// | 2 | Mm, Mem  |
2508    /// | 3 | Mm, Mm   |
2509    /// +---+----------+
2510    /// ```
2511    #[inline]
2512    pub fn mmx_psrlq<A, B>(&mut self, op0: A, op1: B)
2513    where Assembler<'a>: MmxPsrlqEmitter<A, B> {
2514        <Self as MmxPsrlqEmitter<A, B>>::mmx_psrlq(self, op0, op1);
2515    }
2516    /// `MMX_PSRLW` (PSRLW). 
2517    /// Shifts the bits in the individual data elements (words, doublewords, or quadword) in the destination operand (first operand) to the right by the number of bits specified in the count operand (second operand). As the bits in the data elements are shifted right, the empty high-order bits are cleared (set to 0). If the value specified by the count operand is greater than 15 (for words), 31 (for doublewords), or 63 (for a quadword), then the destination operand is set to all 0s. Figure 4-19 gives an example of shifting words in a 64-bit operand.
2518    ///
2519    ///
2520    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
2521    ///
2522    /// Supported operand variants:
2523    ///
2524    /// ```text
2525    /// +---+----------+
2526    /// | # | Operands |
2527    /// +---+----------+
2528    /// | 1 | Mm, Imm  |
2529    /// | 2 | Mm, Mem  |
2530    /// | 3 | Mm, Mm   |
2531    /// +---+----------+
2532    /// ```
2533    #[inline]
2534    pub fn mmx_psrlw<A, B>(&mut self, op0: A, op1: B)
2535    where Assembler<'a>: MmxPsrlwEmitter<A, B> {
2536        <Self as MmxPsrlwEmitter<A, B>>::mmx_psrlw(self, op0, op1);
2537    }
2538    /// `MMX_PSUBB` (PSUBB). 
2539    /// Performs a SIMD subtract of the packed integers of the source operand (second operand) from the packed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
2540    ///
2541    ///
2542    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
2543    ///
2544    /// Supported operand variants:
2545    ///
2546    /// ```text
2547    /// +---+----------+
2548    /// | # | Operands |
2549    /// +---+----------+
2550    /// | 1 | Mm, Mem  |
2551    /// | 2 | Mm, Mm   |
2552    /// +---+----------+
2553    /// ```
2554    #[inline]
2555    pub fn mmx_psubb<A, B>(&mut self, op0: A, op1: B)
2556    where Assembler<'a>: MmxPsubbEmitter<A, B> {
2557        <Self as MmxPsubbEmitter<A, B>>::mmx_psubb(self, op0, op1);
2558    }
2559    /// `MMX_PSUBD` (PSUBD). 
2560    /// Performs a SIMD subtract of the packed integers of the source operand (second operand) from the packed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
2561    ///
2562    ///
2563    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
2564    ///
2565    /// Supported operand variants:
2566    ///
2567    /// ```text
2568    /// +---+----------+
2569    /// | # | Operands |
2570    /// +---+----------+
2571    /// | 1 | Mm, Mem  |
2572    /// | 2 | Mm, Mm   |
2573    /// +---+----------+
2574    /// ```
2575    #[inline]
2576    pub fn mmx_psubd<A, B>(&mut self, op0: A, op1: B)
2577    where Assembler<'a>: MmxPsubdEmitter<A, B> {
2578        <Self as MmxPsubdEmitter<A, B>>::mmx_psubd(self, op0, op1);
2579    }
2580    /// `MMX_PSUBQ` (PSUBQ). 
2581    /// Subtracts the second operand (source operand) from the first operand (destination operand) and stores the result in the destination operand. When packed quadword operands are used, a SIMD subtract is performed. When a quadword result is too large to be represented in 64 bits (overflow), the result is wrapped around and the low 64 bits are written to the destination element (that is, the carry is ignored).
2582    ///
2583    ///
2584    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBQ.html).
2585    ///
2586    /// Supported operand variants:
2587    ///
2588    /// ```text
2589    /// +---+----------+
2590    /// | # | Operands |
2591    /// +---+----------+
2592    /// | 1 | Mm, Mem  |
2593    /// | 2 | Mm, Mm   |
2594    /// +---+----------+
2595    /// ```
2596    #[inline]
2597    pub fn mmx_psubq<A, B>(&mut self, op0: A, op1: B)
2598    where Assembler<'a>: MmxPsubqEmitter<A, B> {
2599        <Self as MmxPsubqEmitter<A, B>>::mmx_psubq(self, op0, op1);
2600    }
2601    /// `MMX_PSUBSB` (PSUBSB). 
2602    /// Performs a SIMD subtract of the packed signed integers of the source operand (second operand) from the packed signed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
2603    ///
2604    ///
2605    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
2606    ///
2607    /// Supported operand variants:
2608    ///
2609    /// ```text
2610    /// +---+----------+
2611    /// | # | Operands |
2612    /// +---+----------+
2613    /// | 1 | Mm, Mem  |
2614    /// | 2 | Mm, Mm   |
2615    /// +---+----------+
2616    /// ```
2617    #[inline]
2618    pub fn mmx_psubsb<A, B>(&mut self, op0: A, op1: B)
2619    where Assembler<'a>: MmxPsubsbEmitter<A, B> {
2620        <Self as MmxPsubsbEmitter<A, B>>::mmx_psubsb(self, op0, op1);
2621    }
2622    /// `MMX_PSUBSW` (PSUBSW). 
2623    /// Performs a SIMD subtract of the packed signed integers of the source operand (second operand) from the packed signed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with signed saturation, as described in the following paragraphs.
2624    ///
2625    ///
2626    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
2627    ///
2628    /// Supported operand variants:
2629    ///
2630    /// ```text
2631    /// +---+----------+
2632    /// | # | Operands |
2633    /// +---+----------+
2634    /// | 1 | Mm, Mem  |
2635    /// | 2 | Mm, Mm   |
2636    /// +---+----------+
2637    /// ```
2638    #[inline]
2639    pub fn mmx_psubsw<A, B>(&mut self, op0: A, op1: B)
2640    where Assembler<'a>: MmxPsubswEmitter<A, B> {
2641        <Self as MmxPsubswEmitter<A, B>>::mmx_psubsw(self, op0, op1);
2642    }
2643    /// `MMX_PSUBUSB` (PSUBUSB). 
2644    /// Performs a SIMD subtract of the packed unsigned integers of the source operand (second operand) from the packed unsigned integers of the destination operand (first operand), and stores the packed unsigned integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
2645    ///
2646    ///
2647    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
2648    ///
2649    /// Supported operand variants:
2650    ///
2651    /// ```text
2652    /// +---+----------+
2653    /// | # | Operands |
2654    /// +---+----------+
2655    /// | 1 | Mm, Mem  |
2656    /// | 2 | Mm, Mm   |
2657    /// +---+----------+
2658    /// ```
2659    #[inline]
2660    pub fn mmx_psubusb<A, B>(&mut self, op0: A, op1: B)
2661    where Assembler<'a>: MmxPsubusbEmitter<A, B> {
2662        <Self as MmxPsubusbEmitter<A, B>>::mmx_psubusb(self, op0, op1);
2663    }
2664    /// `MMX_PSUBUSW` (PSUBUSW). 
2665    /// Performs a SIMD subtract of the packed unsigned integers of the source operand (second operand) from the packed unsigned integers of the destination operand (first operand), and stores the packed unsigned integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with unsigned saturation, as described in the following paragraphs.
2666    ///
2667    ///
2668    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
2669    ///
2670    /// Supported operand variants:
2671    ///
2672    /// ```text
2673    /// +---+----------+
2674    /// | # | Operands |
2675    /// +---+----------+
2676    /// | 1 | Mm, Mem  |
2677    /// | 2 | Mm, Mm   |
2678    /// +---+----------+
2679    /// ```
2680    #[inline]
2681    pub fn mmx_psubusw<A, B>(&mut self, op0: A, op1: B)
2682    where Assembler<'a>: MmxPsubuswEmitter<A, B> {
2683        <Self as MmxPsubuswEmitter<A, B>>::mmx_psubusw(self, op0, op1);
2684    }
2685    /// `MMX_PSUBW` (PSUBW). 
2686    /// Performs a SIMD subtract of the packed integers of the source operand (second operand) from the packed integers of the destination operand (first operand), and stores the packed integer results in the destination operand. See Figure 9-4 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a SIMD operation. Overflow is handled with wraparound, as described in the following paragraphs.
2687    ///
2688    ///
2689    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
2690    ///
2691    /// Supported operand variants:
2692    ///
2693    /// ```text
2694    /// +---+----------+
2695    /// | # | Operands |
2696    /// +---+----------+
2697    /// | 1 | Mm, Mem  |
2698    /// | 2 | Mm, Mm   |
2699    /// +---+----------+
2700    /// ```
2701    #[inline]
2702    pub fn mmx_psubw<A, B>(&mut self, op0: A, op1: B)
2703    where Assembler<'a>: MmxPsubwEmitter<A, B> {
2704        <Self as MmxPsubwEmitter<A, B>>::mmx_psubw(self, op0, op1);
2705    }
2706    /// `MMX_PUNPCKHBW` (PUNPCKHBW). 
2707    /// Unpacks and interleaves the high-order data elements (bytes, words, doublewords, or quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. Figure 4-20 shows the unpack operation for bytes in 64-bit operands. The low-order data elements are ignored.
2708    ///
2709    ///
2710    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
2711    ///
2712    /// Supported operand variants:
2713    ///
2714    /// ```text
2715    /// +---+----------+
2716    /// | # | Operands |
2717    /// +---+----------+
2718    /// | 1 | Mm, Mem  |
2719    /// | 2 | Mm, Mm   |
2720    /// +---+----------+
2721    /// ```
2722    #[inline]
2723    pub fn mmx_punpckhbw<A, B>(&mut self, op0: A, op1: B)
2724    where Assembler<'a>: MmxPunpckhbwEmitter<A, B> {
2725        <Self as MmxPunpckhbwEmitter<A, B>>::mmx_punpckhbw(self, op0, op1);
2726    }
2727    /// `MMX_PUNPCKHDQ` (PUNPCKHDQ). 
2728    /// Unpacks and interleaves the high-order data elements (bytes, words, doublewords, or quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. Figure 4-20 shows the unpack operation for bytes in 64-bit operands. The low-order data elements are ignored.
2729    ///
2730    ///
2731    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
2732    ///
2733    /// Supported operand variants:
2734    ///
2735    /// ```text
2736    /// +---+----------+
2737    /// | # | Operands |
2738    /// +---+----------+
2739    /// | 1 | Mm, Mem  |
2740    /// | 2 | Mm, Mm   |
2741    /// +---+----------+
2742    /// ```
2743    #[inline]
2744    pub fn mmx_punpckhdq<A, B>(&mut self, op0: A, op1: B)
2745    where Assembler<'a>: MmxPunpckhdqEmitter<A, B> {
2746        <Self as MmxPunpckhdqEmitter<A, B>>::mmx_punpckhdq(self, op0, op1);
2747    }
2748    /// `MMX_PUNPCKHWD` (PUNPCKHWD). 
2749    /// Unpacks and interleaves the high-order data elements (bytes, words, doublewords, or quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. Figure 4-20 shows the unpack operation for bytes in 64-bit operands. The low-order data elements are ignored.
2750    ///
2751    ///
2752    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
2753    ///
2754    /// Supported operand variants:
2755    ///
2756    /// ```text
2757    /// +---+----------+
2758    /// | # | Operands |
2759    /// +---+----------+
2760    /// | 1 | Mm, Mem  |
2761    /// | 2 | Mm, Mm   |
2762    /// +---+----------+
2763    /// ```
2764    #[inline]
2765    pub fn mmx_punpckhwd<A, B>(&mut self, op0: A, op1: B)
2766    where Assembler<'a>: MmxPunpckhwdEmitter<A, B> {
2767        <Self as MmxPunpckhwdEmitter<A, B>>::mmx_punpckhwd(self, op0, op1);
2768    }
2769    /// `MMX_PUNPCKLBW` (PUNPCKLBW). 
2770    /// Unpacks and interleaves the low-order data elements (bytes, words, doublewords, and quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. (Figure 4-22 shows the unpack operation for bytes in 64-bit operands.). The high-order data elements are ignored.
2771    ///
2772    ///
2773    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
2774    ///
2775    /// Supported operand variants:
2776    ///
2777    /// ```text
2778    /// +---+----------+
2779    /// | # | Operands |
2780    /// +---+----------+
2781    /// | 1 | Mm, Mem  |
2782    /// | 2 | Mm, Mm   |
2783    /// +---+----------+
2784    /// ```
2785    #[inline]
2786    pub fn mmx_punpcklbw<A, B>(&mut self, op0: A, op1: B)
2787    where Assembler<'a>: MmxPunpcklbwEmitter<A, B> {
2788        <Self as MmxPunpcklbwEmitter<A, B>>::mmx_punpcklbw(self, op0, op1);
2789    }
2790    /// `MMX_PUNPCKLDQ` (PUNPCKLDQ). 
2791    /// Unpacks and interleaves the low-order data elements (bytes, words, doublewords, and quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. (Figure 4-22 shows the unpack operation for bytes in 64-bit operands.). The high-order data elements are ignored.
2792    ///
2793    ///
2794    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
2795    ///
2796    /// Supported operand variants:
2797    ///
2798    /// ```text
2799    /// +---+----------+
2800    /// | # | Operands |
2801    /// +---+----------+
2802    /// | 1 | Mm, Mem  |
2803    /// | 2 | Mm, Mm   |
2804    /// +---+----------+
2805    /// ```
2806    #[inline]
2807    pub fn mmx_punpckldq<A, B>(&mut self, op0: A, op1: B)
2808    where Assembler<'a>: MmxPunpckldqEmitter<A, B> {
2809        <Self as MmxPunpckldqEmitter<A, B>>::mmx_punpckldq(self, op0, op1);
2810    }
2811    /// `MMX_PUNPCKLWD` (PUNPCKLWD). 
2812    /// Unpacks and interleaves the low-order data elements (bytes, words, doublewords, and quadwords) of the destination operand (first operand) and source operand (second operand) into the destination operand. (Figure 4-22 shows the unpack operation for bytes in 64-bit operands.). The high-order data elements are ignored.
2813    ///
2814    ///
2815    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
2816    ///
2817    /// Supported operand variants:
2818    ///
2819    /// ```text
2820    /// +---+----------+
2821    /// | # | Operands |
2822    /// +---+----------+
2823    /// | 1 | Mm, Mem  |
2824    /// | 2 | Mm, Mm   |
2825    /// +---+----------+
2826    /// ```
2827    #[inline]
2828    pub fn mmx_punpcklwd<A, B>(&mut self, op0: A, op1: B)
2829    where Assembler<'a>: MmxPunpcklwdEmitter<A, B> {
2830        <Self as MmxPunpcklwdEmitter<A, B>>::mmx_punpcklwd(self, op0, op1);
2831    }
2832    /// `MMX_PXOR` (PXOR). 
2833    /// Performs a bitwise logical exclusive-OR (XOR) operation on the source operand (second operand) and the destination operand (first operand) and stores the result in the destination operand. Each bit of the result is 1 if the corresponding bits of the two operands are different; each bit is 0 if the corresponding bits of the operands are the same.
2834    ///
2835    ///
2836    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PXOR.html).
2837    ///
2838    /// Supported operand variants:
2839    ///
2840    /// ```text
2841    /// +---+----------+
2842    /// | # | Operands |
2843    /// +---+----------+
2844    /// | 1 | Mm, Mem  |
2845    /// | 2 | Mm, Mm   |
2846    /// +---+----------+
2847    /// ```
2848    #[inline]
2849    pub fn mmx_pxor<A, B>(&mut self, op0: A, op1: B)
2850    where Assembler<'a>: MmxPxorEmitter<A, B> {
2851        <Self as MmxPxorEmitter<A, B>>::mmx_pxor(self, op0, op1);
2852    }
2853}