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}