asmkit/x86/features/SSE2.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/// `LFENCE` (LFENCE).
11/// Performs a serializing operation on all load-from-memory instructions that were issued prior the LFENCE instruction. Specifically, LFENCE does not execute until all prior instructions have completed locally, and no later instruction begins execution until LFENCE completes. In particular, an instruction that loads from memory and that precedes an LFENCE receives data from memory prior to completion of the LFENCE. (An LFENCE that follows an instruction that stores to memory might complete before the data being stored have become globally visible.) Instructions following an LFENCE may be fetched from memory before the LFENCE, but they will not execute (even speculatively) until the LFENCE completes.
12///
13///
14/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/LFENCE.html).
15///
16/// Supported operand variants:
17///
18/// ```text
19/// +---+----------+
20/// | # | Operands |
21/// +---+----------+
22/// | 1 | (none) |
23/// +---+----------+
24/// ```
25pub trait LfenceEmitter {
26 fn lfence(&mut self);
27}
28
29impl<'a> LfenceEmitter for Assembler<'a> {
30 fn lfence(&mut self) {
31 self.emit(LFENCE, &NOREG, &NOREG, &NOREG, &NOREG);
32 }
33}
34
35/// `MFENCE`.
36///
37/// Supported operand variants:
38///
39/// ```text
40/// +---+----------+
41/// | # | Operands |
42/// +---+----------+
43/// | 1 | (none) |
44/// +---+----------+
45/// ```
46pub trait MfenceEmitter {
47 fn mfence(&mut self);
48}
49
50impl<'a> MfenceEmitter for Assembler<'a> {
51 fn mfence(&mut self) {
52 self.emit(MFENCE, &NOREG, &NOREG, &NOREG, &NOREG);
53 }
54}
55
56/// `MMX_CVTPD2PI` (CVTPD2PI).
57/// Converts two packed double precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand).
58///
59///
60/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPD2PI.html).
61///
62/// Supported operand variants:
63///
64/// ```text
65/// +---+----------+
66/// | # | Operands |
67/// +---+----------+
68/// | 1 | Mm, Mem |
69/// | 2 | Mm, Xmm |
70/// +---+----------+
71/// ```
72pub trait MmxCvtpd2piEmitter<A, B> {
73 fn mmx_cvtpd2pi(&mut self, op0: A, op1: B);
74}
75
76impl<'a> MmxCvtpd2piEmitter<Mm, Xmm> for Assembler<'a> {
77 fn mmx_cvtpd2pi(&mut self, op0: Mm, op1: Xmm) {
78 self.emit(MMX_CVTPD2PIRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
79 }
80}
81
82impl<'a> MmxCvtpd2piEmitter<Mm, Mem> for Assembler<'a> {
83 fn mmx_cvtpd2pi(&mut self, op0: Mm, op1: Mem) {
84 self.emit(MMX_CVTPD2PIRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
85 }
86}
87
88/// `MMX_CVTPI2PD` (CVTPI2PD).
89/// Converts two packed signed doubleword integers in the source operand (second operand) to two packed double precision floating-point values in the destination operand (first operand).
90///
91///
92/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPI2PD.html).
93///
94/// Supported operand variants:
95///
96/// ```text
97/// +---+----------+
98/// | # | Operands |
99/// +---+----------+
100/// | 1 | Xmm, Mem |
101/// | 2 | Xmm, Mm |
102/// +---+----------+
103/// ```
104pub trait MmxCvtpi2pdEmitter<A, B> {
105 fn mmx_cvtpi2pd(&mut self, op0: A, op1: B);
106}
107
108impl<'a> MmxCvtpi2pdEmitter<Xmm, Mm> for Assembler<'a> {
109 fn mmx_cvtpi2pd(&mut self, op0: Xmm, op1: Mm) {
110 self.emit(MMX_CVTPI2PDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
111 }
112}
113
114impl<'a> MmxCvtpi2pdEmitter<Xmm, Mem> for Assembler<'a> {
115 fn mmx_cvtpi2pd(&mut self, op0: Xmm, op1: Mem) {
116 self.emit(MMX_CVTPI2PDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
117 }
118}
119
120/// `MMX_CVTPI2PS` (CVTPI2PS).
121/// Converts two packed signed doubleword integers in the source operand (second operand) to two packed single precision floating-point values in the destination operand (first operand).
122///
123///
124/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPI2PS.html).
125///
126/// Supported operand variants:
127///
128/// ```text
129/// +---+----------+
130/// | # | Operands |
131/// +---+----------+
132/// | 1 | Xmm, Mem |
133/// | 2 | Xmm, Mm |
134/// +---+----------+
135/// ```
136pub trait MmxCvtpi2psEmitter<A, B> {
137 fn mmx_cvtpi2ps(&mut self, op0: A, op1: B);
138}
139
140impl<'a> MmxCvtpi2psEmitter<Xmm, Mm> for Assembler<'a> {
141 fn mmx_cvtpi2ps(&mut self, op0: Xmm, op1: Mm) {
142 self.emit(MMX_CVTPI2PSRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
143 }
144}
145
146impl<'a> MmxCvtpi2psEmitter<Xmm, Mem> for Assembler<'a> {
147 fn mmx_cvtpi2ps(&mut self, op0: Xmm, op1: Mem) {
148 self.emit(MMX_CVTPI2PSRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
149 }
150}
151
152/// `MMX_CVTPS2PI` (CVTPS2PI).
153/// Converts two packed single precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand).
154///
155///
156/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPS2PI.html).
157///
158/// Supported operand variants:
159///
160/// ```text
161/// +---+----------+
162/// | # | Operands |
163/// +---+----------+
164/// | 1 | Mm, Mem |
165/// | 2 | Mm, Xmm |
166/// +---+----------+
167/// ```
168pub trait MmxCvtps2piEmitter<A, B> {
169 fn mmx_cvtps2pi(&mut self, op0: A, op1: B);
170}
171
172impl<'a> MmxCvtps2piEmitter<Mm, Xmm> for Assembler<'a> {
173 fn mmx_cvtps2pi(&mut self, op0: Mm, op1: Xmm) {
174 self.emit(MMX_CVTPS2PIRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
175 }
176}
177
178impl<'a> MmxCvtps2piEmitter<Mm, Mem> for Assembler<'a> {
179 fn mmx_cvtps2pi(&mut self, op0: Mm, op1: Mem) {
180 self.emit(MMX_CVTPS2PIRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
181 }
182}
183
184/// `MMX_CVTTPD2PI` (CVTTPD2PI).
185/// Converts two packed double precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand). The source operand can be an XMM register or a 128-bit memory location. The destination operand is an MMX technology register.
186///
187///
188/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPD2PI.html).
189///
190/// Supported operand variants:
191///
192/// ```text
193/// +---+----------+
194/// | # | Operands |
195/// +---+----------+
196/// | 1 | Mm, Mem |
197/// | 2 | Mm, Xmm |
198/// +---+----------+
199/// ```
200pub trait MmxCvttpd2piEmitter<A, B> {
201 fn mmx_cvttpd2pi(&mut self, op0: A, op1: B);
202}
203
204impl<'a> MmxCvttpd2piEmitter<Mm, Xmm> for Assembler<'a> {
205 fn mmx_cvttpd2pi(&mut self, op0: Mm, op1: Xmm) {
206 self.emit(MMX_CVTTPD2PIRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
207 }
208}
209
210impl<'a> MmxCvttpd2piEmitter<Mm, Mem> for Assembler<'a> {
211 fn mmx_cvttpd2pi(&mut self, op0: Mm, op1: Mem) {
212 self.emit(MMX_CVTTPD2PIRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
213 }
214}
215
216/// `MMX_CVTTPS2PI` (CVTTPS2PI).
217/// Converts two packed single precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand). The source operand can be an XMM register or a 64-bit memory location. The destination operand is an MMX technology register. When the source operand is an XMM register, the two single precision floating-point values are contained in the low quadword of the register.
218///
219///
220/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPS2PI.html).
221///
222/// Supported operand variants:
223///
224/// ```text
225/// +---+----------+
226/// | # | Operands |
227/// +---+----------+
228/// | 1 | Mm, Mem |
229/// | 2 | Mm, Xmm |
230/// +---+----------+
231/// ```
232pub trait MmxCvttps2piEmitter<A, B> {
233 fn mmx_cvttps2pi(&mut self, op0: A, op1: B);
234}
235
236impl<'a> MmxCvttps2piEmitter<Mm, Xmm> for Assembler<'a> {
237 fn mmx_cvttps2pi(&mut self, op0: Mm, op1: Xmm) {
238 self.emit(MMX_CVTTPS2PIRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
239 }
240}
241
242impl<'a> MmxCvttps2piEmitter<Mm, Mem> for Assembler<'a> {
243 fn mmx_cvttps2pi(&mut self, op0: Mm, op1: Mem) {
244 self.emit(MMX_CVTTPS2PIRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
245 }
246}
247
248/// `MOVNTI` (MOVNTI).
249/// Moves the doubleword integer in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to minimize cache pollution during the write to memory. The source operand is a general-purpose register. The destination operand is a 32-bit memory location.
250///
251///
252/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVNTI.html).
253///
254/// Supported operand variants:
255///
256/// ```text
257/// +---+----------+
258/// | # | Operands |
259/// +---+----------+
260/// | 1 | Mem, Gpd |
261/// | 2 | Mem, Gpq |
262/// +---+----------+
263/// ```
264pub trait MovntiEmitter<A, B> {
265 fn movnti(&mut self, op0: A, op1: B);
266}
267
268impl<'a> MovntiEmitter<Mem, Gpd> for Assembler<'a> {
269 fn movnti(&mut self, op0: Mem, op1: Gpd) {
270 self.emit(MOVNTI32MR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
271 }
272}
273
274impl<'a> MovntiEmitter<Mem, Gpq> for Assembler<'a> {
275 fn movnti(&mut self, op0: Mem, op1: Gpq) {
276 self.emit(MOVNTI64MR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
277 }
278}
279
280/// `SSE_ADDPD` (ADDPD).
281/// Adds two, four or eight packed double precision floating-point values from the first source operand to the second source operand, and stores the packed double precision floating-point result in the destination operand.
282///
283///
284/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ADDPD.html).
285///
286/// Supported operand variants:
287///
288/// ```text
289/// +---+----------+
290/// | # | Operands |
291/// +---+----------+
292/// | 1 | Xmm, Mem |
293/// | 2 | Xmm, Xmm |
294/// +---+----------+
295/// ```
296pub trait SseAddpdEmitter<A, B> {
297 fn sse_addpd(&mut self, op0: A, op1: B);
298}
299
300impl<'a> SseAddpdEmitter<Xmm, Xmm> for Assembler<'a> {
301 fn sse_addpd(&mut self, op0: Xmm, op1: Xmm) {
302 self.emit(SSE_ADDPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
303 }
304}
305
306impl<'a> SseAddpdEmitter<Xmm, Mem> for Assembler<'a> {
307 fn sse_addpd(&mut self, op0: Xmm, op1: Mem) {
308 self.emit(SSE_ADDPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
309 }
310}
311
312/// `SSE_ADDSD` (ADDSD).
313/// Adds the low double precision floating-point values from the second source operand and the first source operand and stores the double precision floating-point result in the destination operand.
314///
315///
316/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ADDSD.html).
317///
318/// Supported operand variants:
319///
320/// ```text
321/// +---+----------+
322/// | # | Operands |
323/// +---+----------+
324/// | 1 | Xmm, Mem |
325/// | 2 | Xmm, Xmm |
326/// +---+----------+
327/// ```
328pub trait SseAddsdEmitter<A, B> {
329 fn sse_addsd(&mut self, op0: A, op1: B);
330}
331
332impl<'a> SseAddsdEmitter<Xmm, Xmm> for Assembler<'a> {
333 fn sse_addsd(&mut self, op0: Xmm, op1: Xmm) {
334 self.emit(SSE_ADDSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
335 }
336}
337
338impl<'a> SseAddsdEmitter<Xmm, Mem> for Assembler<'a> {
339 fn sse_addsd(&mut self, op0: Xmm, op1: Mem) {
340 self.emit(SSE_ADDSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
341 }
342}
343
344/// `SSE_ANDNPD` (ANDNPD).
345/// Performs a bitwise logical AND NOT of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
346///
347///
348/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ANDNPD.html).
349///
350/// Supported operand variants:
351///
352/// ```text
353/// +---+----------+
354/// | # | Operands |
355/// +---+----------+
356/// | 1 | Xmm, Mem |
357/// | 2 | Xmm, Xmm |
358/// +---+----------+
359/// ```
360pub trait SseAndnpdEmitter<A, B> {
361 fn sse_andnpd(&mut self, op0: A, op1: B);
362}
363
364impl<'a> SseAndnpdEmitter<Xmm, Xmm> for Assembler<'a> {
365 fn sse_andnpd(&mut self, op0: Xmm, op1: Xmm) {
366 self.emit(SSE_ANDNPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
367 }
368}
369
370impl<'a> SseAndnpdEmitter<Xmm, Mem> for Assembler<'a> {
371 fn sse_andnpd(&mut self, op0: Xmm, op1: Mem) {
372 self.emit(SSE_ANDNPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
373 }
374}
375
376/// `SSE_ANDPD` (ANDPD).
377/// Performs a bitwise logical AND of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
378///
379///
380/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ANDPD.html).
381///
382/// Supported operand variants:
383///
384/// ```text
385/// +---+----------+
386/// | # | Operands |
387/// +---+----------+
388/// | 1 | Xmm, Mem |
389/// | 2 | Xmm, Xmm |
390/// +---+----------+
391/// ```
392pub trait SseAndpdEmitter<A, B> {
393 fn sse_andpd(&mut self, op0: A, op1: B);
394}
395
396impl<'a> SseAndpdEmitter<Xmm, Xmm> for Assembler<'a> {
397 fn sse_andpd(&mut self, op0: Xmm, op1: Xmm) {
398 self.emit(SSE_ANDPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
399 }
400}
401
402impl<'a> SseAndpdEmitter<Xmm, Mem> for Assembler<'a> {
403 fn sse_andpd(&mut self, op0: Xmm, op1: Mem) {
404 self.emit(SSE_ANDPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
405 }
406}
407
408/// `SSE_CMPPD` (CMPPD).
409/// Performs a SIMD compare of the packed double precision floating-point values in the second source operand and the first source operand and returns the result of the comparison to the destination operand. The comparison predicate operand (immediate byte) specifies the type of comparison performed on each pair of packed values in the two source operands.
410///
411///
412/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CMPPD.html).
413///
414/// Supported operand variants:
415///
416/// ```text
417/// +---+---------------+
418/// | # | Operands |
419/// +---+---------------+
420/// | 1 | Xmm, Mem, Imm |
421/// | 2 | Xmm, Xmm, Imm |
422/// +---+---------------+
423/// ```
424pub trait SseCmppdEmitter<A, B, C> {
425 fn sse_cmppd(&mut self, op0: A, op1: B, op2: C);
426}
427
428impl<'a> SseCmppdEmitter<Xmm, Xmm, Imm> for Assembler<'a> {
429 fn sse_cmppd(&mut self, op0: Xmm, op1: Xmm, op2: Imm) {
430 self.emit(SSE_CMPPDRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
431 }
432}
433
434impl<'a> SseCmppdEmitter<Xmm, Mem, Imm> for Assembler<'a> {
435 fn sse_cmppd(&mut self, op0: Xmm, op1: Mem, op2: Imm) {
436 self.emit(SSE_CMPPDRMI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
437 }
438}
439
440/// `SSE_CMPSD` (CMPSD).
441/// Compares the byte, word, doubleword, or quadword specified with the first source operand with the byte, word, doubleword, or quadword specified with the second source operand and sets the status flags in the EFLAGS register according to the results.
442///
443///
444/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CMPS%3ACMPSB%3ACMPSW%3ACMPSD%3ACMPSQ.html).
445///
446/// Supported operand variants:
447///
448/// ```text
449/// +---+---------------+
450/// | # | Operands |
451/// +---+---------------+
452/// | 1 | Xmm, Mem, Imm |
453/// | 2 | Xmm, Xmm, Imm |
454/// +---+---------------+
455/// ```
456pub trait SseCmpsdEmitter<A, B, C> {
457 fn sse_cmpsd(&mut self, op0: A, op1: B, op2: C);
458}
459
460impl<'a> SseCmpsdEmitter<Xmm, Xmm, Imm> for Assembler<'a> {
461 fn sse_cmpsd(&mut self, op0: Xmm, op1: Xmm, op2: Imm) {
462 self.emit(SSE_CMPSDRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
463 }
464}
465
466impl<'a> SseCmpsdEmitter<Xmm, Mem, Imm> for Assembler<'a> {
467 fn sse_cmpsd(&mut self, op0: Xmm, op1: Mem, op2: Imm) {
468 self.emit(SSE_CMPSDRMI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
469 }
470}
471
472/// `SSE_COMISD` (COMISD).
473/// Compares the double precision floating-point values in the low quadwords of operand 1 (first operand) and operand 2 (second operand), and sets the ZF, PF, and CF flags in the EFLAGS register according to the result (unordered, greater than, less than, or equal). The OF, SF, and AF flags in the EFLAGS register are set to 0. The unordered result is returned if either source operand is a NaN (QNaN or SNaN).
474///
475///
476/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/COMISD.html).
477///
478/// Supported operand variants:
479///
480/// ```text
481/// +---+----------+
482/// | # | Operands |
483/// +---+----------+
484/// | 1 | Xmm, Mem |
485/// | 2 | Xmm, Xmm |
486/// +---+----------+
487/// ```
488pub trait SseComisdEmitter<A, B> {
489 fn sse_comisd(&mut self, op0: A, op1: B);
490}
491
492impl<'a> SseComisdEmitter<Xmm, Xmm> for Assembler<'a> {
493 fn sse_comisd(&mut self, op0: Xmm, op1: Xmm) {
494 self.emit(SSE_COMISDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
495 }
496}
497
498impl<'a> SseComisdEmitter<Xmm, Mem> for Assembler<'a> {
499 fn sse_comisd(&mut self, op0: Xmm, op1: Mem) {
500 self.emit(SSE_COMISDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
501 }
502}
503
504/// `SSE_CVTDQ2PD` (CVTDQ2PD).
505/// Converts two, four or eight packed signed doubleword integers in the source operand (the second operand) to two, four or eight packed double precision floating-point values in the destination operand (the first operand).
506///
507///
508/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTDQ2PD.html).
509///
510/// Supported operand variants:
511///
512/// ```text
513/// +---+----------+
514/// | # | Operands |
515/// +---+----------+
516/// | 1 | Xmm, Mem |
517/// | 2 | Xmm, Xmm |
518/// +---+----------+
519/// ```
520pub trait SseCvtdq2pdEmitter<A, B> {
521 fn sse_cvtdq2pd(&mut self, op0: A, op1: B);
522}
523
524impl<'a> SseCvtdq2pdEmitter<Xmm, Xmm> for Assembler<'a> {
525 fn sse_cvtdq2pd(&mut self, op0: Xmm, op1: Xmm) {
526 self.emit(SSE_CVTDQ2PDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
527 }
528}
529
530impl<'a> SseCvtdq2pdEmitter<Xmm, Mem> for Assembler<'a> {
531 fn sse_cvtdq2pd(&mut self, op0: Xmm, op1: Mem) {
532 self.emit(SSE_CVTDQ2PDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
533 }
534}
535
536/// `SSE_CVTDQ2PS` (CVTDQ2PS).
537/// Converts four, eight or sixteen packed signed doubleword integers in the source operand to four, eight or sixteen packed single precision floating-point values in the destination operand.
538///
539///
540/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTDQ2PS.html).
541///
542/// Supported operand variants:
543///
544/// ```text
545/// +---+----------+
546/// | # | Operands |
547/// +---+----------+
548/// | 1 | Xmm, Mem |
549/// | 2 | Xmm, Xmm |
550/// +---+----------+
551/// ```
552pub trait SseCvtdq2psEmitter<A, B> {
553 fn sse_cvtdq2ps(&mut self, op0: A, op1: B);
554}
555
556impl<'a> SseCvtdq2psEmitter<Xmm, Xmm> for Assembler<'a> {
557 fn sse_cvtdq2ps(&mut self, op0: Xmm, op1: Xmm) {
558 self.emit(SSE_CVTDQ2PSRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
559 }
560}
561
562impl<'a> SseCvtdq2psEmitter<Xmm, Mem> for Assembler<'a> {
563 fn sse_cvtdq2ps(&mut self, op0: Xmm, op1: Mem) {
564 self.emit(SSE_CVTDQ2PSRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
565 }
566}
567
568/// `SSE_CVTPD2DQ` (CVTPD2DQ).
569/// Converts packed double precision floating-point values in the source operand (second operand) to packed signed doubleword integers in the destination operand (first operand).
570///
571///
572/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPD2DQ.html).
573///
574/// Supported operand variants:
575///
576/// ```text
577/// +---+----------+
578/// | # | Operands |
579/// +---+----------+
580/// | 1 | Xmm, Mem |
581/// | 2 | Xmm, Xmm |
582/// +---+----------+
583/// ```
584pub trait SseCvtpd2dqEmitter<A, B> {
585 fn sse_cvtpd2dq(&mut self, op0: A, op1: B);
586}
587
588impl<'a> SseCvtpd2dqEmitter<Xmm, Xmm> for Assembler<'a> {
589 fn sse_cvtpd2dq(&mut self, op0: Xmm, op1: Xmm) {
590 self.emit(SSE_CVTPD2DQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
591 }
592}
593
594impl<'a> SseCvtpd2dqEmitter<Xmm, Mem> for Assembler<'a> {
595 fn sse_cvtpd2dq(&mut self, op0: Xmm, op1: Mem) {
596 self.emit(SSE_CVTPD2DQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
597 }
598}
599
600/// `SSE_CVTPD2PS` (CVTPD2PS).
601/// Converts two, four or eight packed double precision floating-point values in the source operand (second operand) to two, four or eight packed single precision floating-point values in the destination operand (first operand).
602///
603///
604/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPD2PS.html).
605///
606/// Supported operand variants:
607///
608/// ```text
609/// +---+----------+
610/// | # | Operands |
611/// +---+----------+
612/// | 1 | Xmm, Mem |
613/// | 2 | Xmm, Xmm |
614/// +---+----------+
615/// ```
616pub trait SseCvtpd2psEmitter<A, B> {
617 fn sse_cvtpd2ps(&mut self, op0: A, op1: B);
618}
619
620impl<'a> SseCvtpd2psEmitter<Xmm, Xmm> for Assembler<'a> {
621 fn sse_cvtpd2ps(&mut self, op0: Xmm, op1: Xmm) {
622 self.emit(SSE_CVTPD2PSRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
623 }
624}
625
626impl<'a> SseCvtpd2psEmitter<Xmm, Mem> for Assembler<'a> {
627 fn sse_cvtpd2ps(&mut self, op0: Xmm, op1: Mem) {
628 self.emit(SSE_CVTPD2PSRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
629 }
630}
631
632/// `SSE_CVTPS2DQ` (CVTPS2DQ).
633/// Converts four, eight or sixteen packed single precision floating-point values in the source operand to four, eight or sixteen signed doubleword integers in the destination operand.
634///
635///
636/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPS2DQ.html).
637///
638/// Supported operand variants:
639///
640/// ```text
641/// +---+----------+
642/// | # | Operands |
643/// +---+----------+
644/// | 1 | Xmm, Mem |
645/// | 2 | Xmm, Xmm |
646/// +---+----------+
647/// ```
648pub trait SseCvtps2dqEmitter<A, B> {
649 fn sse_cvtps2dq(&mut self, op0: A, op1: B);
650}
651
652impl<'a> SseCvtps2dqEmitter<Xmm, Xmm> for Assembler<'a> {
653 fn sse_cvtps2dq(&mut self, op0: Xmm, op1: Xmm) {
654 self.emit(SSE_CVTPS2DQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
655 }
656}
657
658impl<'a> SseCvtps2dqEmitter<Xmm, Mem> for Assembler<'a> {
659 fn sse_cvtps2dq(&mut self, op0: Xmm, op1: Mem) {
660 self.emit(SSE_CVTPS2DQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
661 }
662}
663
664/// `SSE_CVTPS2PD` (CVTPS2PD).
665/// Converts two, four or eight packed single precision floating-point values in the source operand (second operand) to two, four or eight packed double precision floating-point values in the destination operand (first operand).
666///
667///
668/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPS2PD.html).
669///
670/// Supported operand variants:
671///
672/// ```text
673/// +---+----------+
674/// | # | Operands |
675/// +---+----------+
676/// | 1 | Xmm, Mem |
677/// | 2 | Xmm, Xmm |
678/// +---+----------+
679/// ```
680pub trait SseCvtps2pdEmitter<A, B> {
681 fn sse_cvtps2pd(&mut self, op0: A, op1: B);
682}
683
684impl<'a> SseCvtps2pdEmitter<Xmm, Xmm> for Assembler<'a> {
685 fn sse_cvtps2pd(&mut self, op0: Xmm, op1: Xmm) {
686 self.emit(SSE_CVTPS2PDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
687 }
688}
689
690impl<'a> SseCvtps2pdEmitter<Xmm, Mem> for Assembler<'a> {
691 fn sse_cvtps2pd(&mut self, op0: Xmm, op1: Mem) {
692 self.emit(SSE_CVTPS2PDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
693 }
694}
695
696/// `SSE_CVTSD2SI` (CVTSD2SI).
697/// Converts a double precision floating-point value in the source operand (the second operand) to a signed double-word integer in the destination operand (first operand). The source operand can be an XMM register or a 64-bit memory location. The destination operand is a general-purpose register. When the source operand is an XMM register, the double precision floating-point value is contained in the low quadword of the register.
698///
699///
700/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSD2SI.html).
701///
702/// Supported operand variants:
703///
704/// ```text
705/// +---+----------+
706/// | # | Operands |
707/// +---+----------+
708/// | 1 | Gpd, Mem |
709/// | 2 | Gpd, Xmm |
710/// | 3 | Gpq, Mem |
711/// | 4 | Gpq, Xmm |
712/// +---+----------+
713/// ```
714pub trait SseCvtsd2siEmitter<A, B> {
715 fn sse_cvtsd2si(&mut self, op0: A, op1: B);
716}
717
718impl<'a> SseCvtsd2siEmitter<Gpd, Xmm> for Assembler<'a> {
719 fn sse_cvtsd2si(&mut self, op0: Gpd, op1: Xmm) {
720 self.emit(SSE_CVTSD2SI32RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
721 }
722}
723
724impl<'a> SseCvtsd2siEmitter<Gpd, Mem> for Assembler<'a> {
725 fn sse_cvtsd2si(&mut self, op0: Gpd, op1: Mem) {
726 self.emit(SSE_CVTSD2SI32RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
727 }
728}
729
730impl<'a> SseCvtsd2siEmitter<Gpq, Xmm> for Assembler<'a> {
731 fn sse_cvtsd2si(&mut self, op0: Gpq, op1: Xmm) {
732 self.emit(SSE_CVTSD2SI64RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
733 }
734}
735
736impl<'a> SseCvtsd2siEmitter<Gpq, Mem> for Assembler<'a> {
737 fn sse_cvtsd2si(&mut self, op0: Gpq, op1: Mem) {
738 self.emit(SSE_CVTSD2SI64RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
739 }
740}
741
742/// `SSE_CVTSD2SS` (CVTSD2SS).
743/// Converts a double precision floating-point value in the “convert-from” source operand (the second operand in SSE2 version, otherwise the third operand) to a single precision floating-point value in the destination operand.
744///
745///
746/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSD2SS.html).
747///
748/// Supported operand variants:
749///
750/// ```text
751/// +---+----------+
752/// | # | Operands |
753/// +---+----------+
754/// | 1 | Xmm, Mem |
755/// | 2 | Xmm, Xmm |
756/// +---+----------+
757/// ```
758pub trait SseCvtsd2ssEmitter<A, B> {
759 fn sse_cvtsd2ss(&mut self, op0: A, op1: B);
760}
761
762impl<'a> SseCvtsd2ssEmitter<Xmm, Xmm> for Assembler<'a> {
763 fn sse_cvtsd2ss(&mut self, op0: Xmm, op1: Xmm) {
764 self.emit(SSE_CVTSD2SSRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
765 }
766}
767
768impl<'a> SseCvtsd2ssEmitter<Xmm, Mem> for Assembler<'a> {
769 fn sse_cvtsd2ss(&mut self, op0: Xmm, op1: Mem) {
770 self.emit(SSE_CVTSD2SSRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
771 }
772}
773
774/// `SSE_CVTSI2SD` (CVTSI2SD).
775/// Converts a signed doubleword integer (or signed quadword integer if operand size is 64 bits) in the “convert-from” source operand to a double precision floating-point value in the destination operand. The result is stored in the low quadword of the destination operand, and the high quadword left unchanged. When conversion is inexact, the value returned is rounded according to the rounding control bits in the MXCSR register.
776///
777///
778/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSI2SD.html).
779///
780/// Supported operand variants:
781///
782/// ```text
783/// +---+----------+
784/// | # | Operands |
785/// +---+----------+
786/// | 1 | Xmm, Gpd |
787/// | 2 | Xmm, Gpq |
788/// | 3 | Xmm, Mem |
789/// +---+----------+
790/// ```
791pub trait SseCvtsi2sdEmitter<A, B> {
792 fn sse_cvtsi2sd(&mut self, op0: A, op1: B);
793}
794
795impl<'a> SseCvtsi2sdEmitter<Xmm, Gpd> for Assembler<'a> {
796 fn sse_cvtsi2sd(&mut self, op0: Xmm, op1: Gpd) {
797 self.emit(SSE_CVTSI2SD32RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
798 }
799}
800
801impl<'a> SseCvtsi2sdEmitter<Xmm, Mem> for Assembler<'a> {
802 fn sse_cvtsi2sd(&mut self, op0: Xmm, op1: Mem) {
803 self.emit(SSE_CVTSI2SD32RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
804 }
805}
806
807impl<'a> SseCvtsi2sdEmitter<Xmm, Gpq> for Assembler<'a> {
808 fn sse_cvtsi2sd(&mut self, op0: Xmm, op1: Gpq) {
809 self.emit(SSE_CVTSI2SD64RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
810 }
811}
812
813/// `SSE_CVTSS2SD` (CVTSS2SD).
814/// Converts a single precision floating-point value in the “convert-from” source operand to a double precision floating-point value in the destination operand. When the “convert-from” source operand is an XMM register, the single precision floating-point value is contained in the low doubleword of the register. The result is stored in the low quadword of the destination operand.
815///
816///
817/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSS2SD.html).
818///
819/// Supported operand variants:
820///
821/// ```text
822/// +---+----------+
823/// | # | Operands |
824/// +---+----------+
825/// | 1 | Xmm, Mem |
826/// | 2 | Xmm, Xmm |
827/// +---+----------+
828/// ```
829pub trait SseCvtss2sdEmitter<A, B> {
830 fn sse_cvtss2sd(&mut self, op0: A, op1: B);
831}
832
833impl<'a> SseCvtss2sdEmitter<Xmm, Xmm> for Assembler<'a> {
834 fn sse_cvtss2sd(&mut self, op0: Xmm, op1: Xmm) {
835 self.emit(SSE_CVTSS2SDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
836 }
837}
838
839impl<'a> SseCvtss2sdEmitter<Xmm, Mem> for Assembler<'a> {
840 fn sse_cvtss2sd(&mut self, op0: Xmm, op1: Mem) {
841 self.emit(SSE_CVTSS2SDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
842 }
843}
844
845/// `SSE_CVTTPD2DQ` (CVTTPD2DQ).
846/// Converts two, four or eight packed double precision floating-point values in the source operand (second operand) to two, four or eight packed signed doubleword integers in the destination operand (first operand).
847///
848///
849/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPD2DQ.html).
850///
851/// Supported operand variants:
852///
853/// ```text
854/// +---+----------+
855/// | # | Operands |
856/// +---+----------+
857/// | 1 | Xmm, Mem |
858/// | 2 | Xmm, Xmm |
859/// +---+----------+
860/// ```
861pub trait SseCvttpd2dqEmitter<A, B> {
862 fn sse_cvttpd2dq(&mut self, op0: A, op1: B);
863}
864
865impl<'a> SseCvttpd2dqEmitter<Xmm, Xmm> for Assembler<'a> {
866 fn sse_cvttpd2dq(&mut self, op0: Xmm, op1: Xmm) {
867 self.emit(SSE_CVTTPD2DQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
868 }
869}
870
871impl<'a> SseCvttpd2dqEmitter<Xmm, Mem> for Assembler<'a> {
872 fn sse_cvttpd2dq(&mut self, op0: Xmm, op1: Mem) {
873 self.emit(SSE_CVTTPD2DQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
874 }
875}
876
877/// `SSE_CVTTPS2DQ` (CVTTPS2DQ).
878/// Converts four, eight or sixteen packed single precision floating-point values in the source operand to four, eight or sixteen signed doubleword integers in the destination operand.
879///
880///
881/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPS2DQ.html).
882///
883/// Supported operand variants:
884///
885/// ```text
886/// +---+----------+
887/// | # | Operands |
888/// +---+----------+
889/// | 1 | Xmm, Mem |
890/// | 2 | Xmm, Xmm |
891/// +---+----------+
892/// ```
893pub trait SseCvttps2dqEmitter<A, B> {
894 fn sse_cvttps2dq(&mut self, op0: A, op1: B);
895}
896
897impl<'a> SseCvttps2dqEmitter<Xmm, Xmm> for Assembler<'a> {
898 fn sse_cvttps2dq(&mut self, op0: Xmm, op1: Xmm) {
899 self.emit(SSE_CVTTPS2DQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
900 }
901}
902
903impl<'a> SseCvttps2dqEmitter<Xmm, Mem> for Assembler<'a> {
904 fn sse_cvttps2dq(&mut self, op0: Xmm, op1: Mem) {
905 self.emit(SSE_CVTTPS2DQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
906 }
907}
908
909/// `SSE_CVTTSD2SI` (CVTTSD2SI).
910/// Converts a double precision floating-point value in the source operand (the second operand) to a signed double-word integer (or signed quadword integer if operand size is 64 bits) in the destination operand (the first operand). The source operand can be an XMM register or a 64-bit memory location. The destination operand is a general purpose register. When the source operand is an XMM register, the double precision floating-point value is contained in the low quadword of the register.
911///
912///
913/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTSD2SI.html).
914///
915/// Supported operand variants:
916///
917/// ```text
918/// +---+----------+
919/// | # | Operands |
920/// +---+----------+
921/// | 1 | Gpd, Mem |
922/// | 2 | Gpd, Xmm |
923/// | 3 | Gpq, Mem |
924/// | 4 | Gpq, Xmm |
925/// +---+----------+
926/// ```
927pub trait SseCvttsd2siEmitter<A, B> {
928 fn sse_cvttsd2si(&mut self, op0: A, op1: B);
929}
930
931impl<'a> SseCvttsd2siEmitter<Gpd, Xmm> for Assembler<'a> {
932 fn sse_cvttsd2si(&mut self, op0: Gpd, op1: Xmm) {
933 self.emit(SSE_CVTTSD2SI32RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
934 }
935}
936
937impl<'a> SseCvttsd2siEmitter<Gpd, Mem> for Assembler<'a> {
938 fn sse_cvttsd2si(&mut self, op0: Gpd, op1: Mem) {
939 self.emit(SSE_CVTTSD2SI32RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
940 }
941}
942
943impl<'a> SseCvttsd2siEmitter<Gpq, Xmm> for Assembler<'a> {
944 fn sse_cvttsd2si(&mut self, op0: Gpq, op1: Xmm) {
945 self.emit(SSE_CVTTSD2SI64RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
946 }
947}
948
949impl<'a> SseCvttsd2siEmitter<Gpq, Mem> for Assembler<'a> {
950 fn sse_cvttsd2si(&mut self, op0: Gpq, op1: Mem) {
951 self.emit(SSE_CVTTSD2SI64RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
952 }
953}
954
955/// `SSE_DIVPD` (DIVPD).
956/// Performs a SIMD divide of the double precision floating-point values in the first source operand by the floating-point values in the second source operand (the third operand). Results are written to the destination operand (the first operand).
957///
958///
959/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/DIVPD.html).
960///
961/// Supported operand variants:
962///
963/// ```text
964/// +---+----------+
965/// | # | Operands |
966/// +---+----------+
967/// | 1 | Xmm, Mem |
968/// | 2 | Xmm, Xmm |
969/// +---+----------+
970/// ```
971pub trait SseDivpdEmitter<A, B> {
972 fn sse_divpd(&mut self, op0: A, op1: B);
973}
974
975impl<'a> SseDivpdEmitter<Xmm, Xmm> for Assembler<'a> {
976 fn sse_divpd(&mut self, op0: Xmm, op1: Xmm) {
977 self.emit(SSE_DIVPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
978 }
979}
980
981impl<'a> SseDivpdEmitter<Xmm, Mem> for Assembler<'a> {
982 fn sse_divpd(&mut self, op0: Xmm, op1: Mem) {
983 self.emit(SSE_DIVPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
984 }
985}
986
987/// `SSE_DIVSD` (DIVSD).
988/// Divides the low double precision floating-point value in the first source operand by the low double precision floating-point value in the second source operand, and stores the double precision floating-point result in the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source and destination are XMM registers.
989///
990///
991/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/DIVSD.html).
992///
993/// Supported operand variants:
994///
995/// ```text
996/// +---+----------+
997/// | # | Operands |
998/// +---+----------+
999/// | 1 | Xmm, Mem |
1000/// | 2 | Xmm, Xmm |
1001/// +---+----------+
1002/// ```
1003pub trait SseDivsdEmitter<A, B> {
1004 fn sse_divsd(&mut self, op0: A, op1: B);
1005}
1006
1007impl<'a> SseDivsdEmitter<Xmm, Xmm> for Assembler<'a> {
1008 fn sse_divsd(&mut self, op0: Xmm, op1: Xmm) {
1009 self.emit(SSE_DIVSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1010 }
1011}
1012
1013impl<'a> SseDivsdEmitter<Xmm, Mem> for Assembler<'a> {
1014 fn sse_divsd(&mut self, op0: Xmm, op1: Mem) {
1015 self.emit(SSE_DIVSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1016 }
1017}
1018
1019/// `SSE_MASKMOVDQU` (MASKMOVDQU).
1020/// Stores selected bytes from the source operand (first operand) into an 128-bit memory location. The mask operand (second operand) selects which bytes from the source operand are written to memory. The source and mask operands are XMM registers. The memory location specified by the effective address in the DI/EDI/RDI register (the default segment register is DS, but this may be overridden with a segment-override prefix). The memory location does not need to be aligned on a natural boundary. (The size of the store address depends on the address-size attribute.)
1021///
1022///
1023/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MASKMOVDQU.html).
1024///
1025/// Supported operand variants:
1026///
1027/// ```text
1028/// +---+----------+
1029/// | # | Operands |
1030/// +---+----------+
1031/// | 1 | Xmm, Xmm |
1032/// +---+----------+
1033/// ```
1034pub trait SseMaskmovdquEmitter<A, B> {
1035 fn sse_maskmovdqu(&mut self, op0: A, op1: B);
1036}
1037
1038impl<'a> SseMaskmovdquEmitter<Xmm, Xmm> for Assembler<'a> {
1039 fn sse_maskmovdqu(&mut self, op0: Xmm, op1: Xmm) {
1040 self.emit(SSE_MASKMOVDQURR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1041 }
1042}
1043
1044/// `SSE_MAXPD` (MAXPD).
1045/// Performs a SIMD compare of the packed double precision floating-point values in the first source operand and the second source operand and returns the maximum value for each pair of values to the destination operand.
1046///
1047///
1048/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MAXPD.html).
1049///
1050/// Supported operand variants:
1051///
1052/// ```text
1053/// +---+----------+
1054/// | # | Operands |
1055/// +---+----------+
1056/// | 1 | Xmm, Mem |
1057/// | 2 | Xmm, Xmm |
1058/// +---+----------+
1059/// ```
1060pub trait SseMaxpdEmitter<A, B> {
1061 fn sse_maxpd(&mut self, op0: A, op1: B);
1062}
1063
1064impl<'a> SseMaxpdEmitter<Xmm, Xmm> for Assembler<'a> {
1065 fn sse_maxpd(&mut self, op0: Xmm, op1: Xmm) {
1066 self.emit(SSE_MAXPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1067 }
1068}
1069
1070impl<'a> SseMaxpdEmitter<Xmm, Mem> for Assembler<'a> {
1071 fn sse_maxpd(&mut self, op0: Xmm, op1: Mem) {
1072 self.emit(SSE_MAXPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1073 }
1074}
1075
1076/// `SSE_MAXSD` (MAXSD).
1077/// Compares the low double precision floating-point values in the first source operand and the second source operand, and returns the maximum value to the low quadword of the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source and destination operands are XMM registers. When the second source operand is a memory operand, only 64 bits are accessed.
1078///
1079///
1080/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MAXSD.html).
1081///
1082/// Supported operand variants:
1083///
1084/// ```text
1085/// +---+----------+
1086/// | # | Operands |
1087/// +---+----------+
1088/// | 1 | Xmm, Mem |
1089/// | 2 | Xmm, Xmm |
1090/// +---+----------+
1091/// ```
1092pub trait SseMaxsdEmitter<A, B> {
1093 fn sse_maxsd(&mut self, op0: A, op1: B);
1094}
1095
1096impl<'a> SseMaxsdEmitter<Xmm, Xmm> for Assembler<'a> {
1097 fn sse_maxsd(&mut self, op0: Xmm, op1: Xmm) {
1098 self.emit(SSE_MAXSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1099 }
1100}
1101
1102impl<'a> SseMaxsdEmitter<Xmm, Mem> for Assembler<'a> {
1103 fn sse_maxsd(&mut self, op0: Xmm, op1: Mem) {
1104 self.emit(SSE_MAXSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1105 }
1106}
1107
1108/// `SSE_MINPD` (MINPD).
1109/// Performs a SIMD compare of the packed double precision floating-point values in the first source operand and the second source operand and returns the minimum value for each pair of values to the destination operand.
1110///
1111///
1112/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MINPD.html).
1113///
1114/// Supported operand variants:
1115///
1116/// ```text
1117/// +---+----------+
1118/// | # | Operands |
1119/// +---+----------+
1120/// | 1 | Xmm, Mem |
1121/// | 2 | Xmm, Xmm |
1122/// +---+----------+
1123/// ```
1124pub trait SseMinpdEmitter<A, B> {
1125 fn sse_minpd(&mut self, op0: A, op1: B);
1126}
1127
1128impl<'a> SseMinpdEmitter<Xmm, Xmm> for Assembler<'a> {
1129 fn sse_minpd(&mut self, op0: Xmm, op1: Xmm) {
1130 self.emit(SSE_MINPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1131 }
1132}
1133
1134impl<'a> SseMinpdEmitter<Xmm, Mem> for Assembler<'a> {
1135 fn sse_minpd(&mut self, op0: Xmm, op1: Mem) {
1136 self.emit(SSE_MINPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1137 }
1138}
1139
1140/// `SSE_MINSD` (MINSD).
1141/// Compares the low double precision floating-point values in the first source operand and the second source operand, and returns the minimum value to the low quadword of the destination operand. When the source operand is a memory operand, only the 64 bits are accessed.
1142///
1143///
1144/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MINSD.html).
1145///
1146/// Supported operand variants:
1147///
1148/// ```text
1149/// +---+----------+
1150/// | # | Operands |
1151/// +---+----------+
1152/// | 1 | Xmm, Mem |
1153/// | 2 | Xmm, Xmm |
1154/// +---+----------+
1155/// ```
1156pub trait SseMinsdEmitter<A, B> {
1157 fn sse_minsd(&mut self, op0: A, op1: B);
1158}
1159
1160impl<'a> SseMinsdEmitter<Xmm, Xmm> for Assembler<'a> {
1161 fn sse_minsd(&mut self, op0: Xmm, op1: Xmm) {
1162 self.emit(SSE_MINSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1163 }
1164}
1165
1166impl<'a> SseMinsdEmitter<Xmm, Mem> for Assembler<'a> {
1167 fn sse_minsd(&mut self, op0: Xmm, op1: Mem) {
1168 self.emit(SSE_MINSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1169 }
1170}
1171
1172/// `SSE_MOVAPD` (MOVAPD).
1173/// Moves 2, 4 or 8 double precision floating-point values from the source operand (second operand) to the destination operand (first operand). This instruction can be used to load an XMM, YMM or ZMM register from an 128-bit, 256-bit or 512-bit memory location, to store the contents of an XMM, YMM or ZMM register into a 128-bit, 256-bit or 512-bit memory location, or to move data between two XMM, two YMM or two ZMM registers.
1174///
1175///
1176/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVAPD.html).
1177///
1178/// Supported operand variants:
1179///
1180/// ```text
1181/// +---+----------+
1182/// | # | Operands |
1183/// +---+----------+
1184/// | 1 | Mem, Xmm |
1185/// | 2 | Xmm, Mem |
1186/// | 3 | Xmm, Xmm |
1187/// +---+----------+
1188/// ```
1189pub trait SseMovapdEmitter<A, B> {
1190 fn sse_movapd(&mut self, op0: A, op1: B);
1191}
1192
1193impl<'a> SseMovapdEmitter<Xmm, Xmm> for Assembler<'a> {
1194 fn sse_movapd(&mut self, op0: Xmm, op1: Xmm) {
1195 self.emit(SSE_MOVAPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1196 }
1197}
1198
1199impl<'a> SseMovapdEmitter<Xmm, Mem> for Assembler<'a> {
1200 fn sse_movapd(&mut self, op0: Xmm, op1: Mem) {
1201 self.emit(SSE_MOVAPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1202 }
1203}
1204
1205impl<'a> SseMovapdEmitter<Mem, Xmm> for Assembler<'a> {
1206 fn sse_movapd(&mut self, op0: Mem, op1: Xmm) {
1207 self.emit(SSE_MOVAPDMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1208 }
1209}
1210
1211/// `SSE_MOVDQA` (MOVDQA).
1212/// Note: VEX.vvvv and EVEX.vvvv are reserved and must be 1111b otherwise instructions will #UD.
1213///
1214///
1215/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVDQA%3AVMOVDQA32%3AVMOVDQA64.html).
1216///
1217/// Supported operand variants:
1218///
1219/// ```text
1220/// +---+----------+
1221/// | # | Operands |
1222/// +---+----------+
1223/// | 1 | Mem, Xmm |
1224/// | 2 | Xmm, Mem |
1225/// | 3 | Xmm, Xmm |
1226/// +---+----------+
1227/// ```
1228pub trait SseMovdqaEmitter<A, B> {
1229 fn sse_movdqa(&mut self, op0: A, op1: B);
1230}
1231
1232impl<'a> SseMovdqaEmitter<Xmm, Xmm> for Assembler<'a> {
1233 fn sse_movdqa(&mut self, op0: Xmm, op1: Xmm) {
1234 self.emit(SSE_MOVDQARR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1235 }
1236}
1237
1238impl<'a> SseMovdqaEmitter<Xmm, Mem> for Assembler<'a> {
1239 fn sse_movdqa(&mut self, op0: Xmm, op1: Mem) {
1240 self.emit(SSE_MOVDQARM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1241 }
1242}
1243
1244impl<'a> SseMovdqaEmitter<Mem, Xmm> for Assembler<'a> {
1245 fn sse_movdqa(&mut self, op0: Mem, op1: Xmm) {
1246 self.emit(SSE_MOVDQAMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1247 }
1248}
1249
1250/// `SSE_MOVDQU` (MOVDQU).
1251/// Note: VEX.vvvv and EVEX.vvvv are reserved and must be 1111b otherwise instructions will #UD.
1252///
1253///
1254/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVDQU%3AVMOVDQU8%3AVMOVDQU16%3AVMOVDQU32%3AVMOVDQU64.html).
1255///
1256/// Supported operand variants:
1257///
1258/// ```text
1259/// +---+----------+
1260/// | # | Operands |
1261/// +---+----------+
1262/// | 1 | Mem, Xmm |
1263/// | 2 | Xmm, Mem |
1264/// | 3 | Xmm, Xmm |
1265/// +---+----------+
1266/// ```
1267pub trait SseMovdquEmitter<A, B> {
1268 fn sse_movdqu(&mut self, op0: A, op1: B);
1269}
1270
1271impl<'a> SseMovdquEmitter<Xmm, Xmm> for Assembler<'a> {
1272 fn sse_movdqu(&mut self, op0: Xmm, op1: Xmm) {
1273 self.emit(SSE_MOVDQURR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1274 }
1275}
1276
1277impl<'a> SseMovdquEmitter<Xmm, Mem> for Assembler<'a> {
1278 fn sse_movdqu(&mut self, op0: Xmm, op1: Mem) {
1279 self.emit(SSE_MOVDQURM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1280 }
1281}
1282
1283impl<'a> SseMovdquEmitter<Mem, Xmm> for Assembler<'a> {
1284 fn sse_movdqu(&mut self, op0: Mem, op1: Xmm) {
1285 self.emit(SSE_MOVDQUMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1286 }
1287}
1288
1289/// `SSE_MOVD_G2X` (MOVD).
1290/// 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.
1291///
1292///
1293/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
1294///
1295/// Supported operand variants:
1296///
1297/// ```text
1298/// +---+----------+
1299/// | # | Operands |
1300/// +---+----------+
1301/// | 1 | Xmm, Gpd |
1302/// | 2 | Xmm, Mem |
1303/// +---+----------+
1304/// ```
1305pub trait SseMovdG2xEmitter<A, B> {
1306 fn sse_movd_g2x(&mut self, op0: A, op1: B);
1307}
1308
1309impl<'a> SseMovdG2xEmitter<Xmm, Gpd> for Assembler<'a> {
1310 fn sse_movd_g2x(&mut self, op0: Xmm, op1: Gpd) {
1311 self.emit(SSE_MOVD_G2XRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1312 }
1313}
1314
1315impl<'a> SseMovdG2xEmitter<Xmm, Mem> for Assembler<'a> {
1316 fn sse_movd_g2x(&mut self, op0: Xmm, op1: Mem) {
1317 self.emit(SSE_MOVD_G2XRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1318 }
1319}
1320
1321/// `SSE_MOVD_X2G` (MOVD).
1322/// 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.
1323///
1324///
1325/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
1326///
1327/// Supported operand variants:
1328///
1329/// ```text
1330/// +---+----------+
1331/// | # | Operands |
1332/// +---+----------+
1333/// | 1 | Gpd, Xmm |
1334/// | 2 | Mem, Xmm |
1335/// +---+----------+
1336/// ```
1337pub trait SseMovdX2gEmitter<A, B> {
1338 fn sse_movd_x2g(&mut self, op0: A, op1: B);
1339}
1340
1341impl<'a> SseMovdX2gEmitter<Gpd, Xmm> for Assembler<'a> {
1342 fn sse_movd_x2g(&mut self, op0: Gpd, op1: Xmm) {
1343 self.emit(SSE_MOVD_X2GRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1344 }
1345}
1346
1347impl<'a> SseMovdX2gEmitter<Mem, Xmm> for Assembler<'a> {
1348 fn sse_movd_x2g(&mut self, op0: Mem, op1: Xmm) {
1349 self.emit(SSE_MOVD_X2GMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1350 }
1351}
1352
1353/// `SSE_MOVHPD` (MOVHPD).
1354/// This instruction cannot be used for register to register or memory to memory moves.
1355///
1356///
1357/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVHPD.html).
1358///
1359/// Supported operand variants:
1360///
1361/// ```text
1362/// +---+----------+
1363/// | # | Operands |
1364/// +---+----------+
1365/// | 1 | Mem, Xmm |
1366/// | 2 | Xmm, Mem |
1367/// +---+----------+
1368/// ```
1369pub trait SseMovhpdEmitter<A, B> {
1370 fn sse_movhpd(&mut self, op0: A, op1: B);
1371}
1372
1373impl<'a> SseMovhpdEmitter<Xmm, Mem> for Assembler<'a> {
1374 fn sse_movhpd(&mut self, op0: Xmm, op1: Mem) {
1375 self.emit(SSE_MOVHPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1376 }
1377}
1378
1379impl<'a> SseMovhpdEmitter<Mem, Xmm> for Assembler<'a> {
1380 fn sse_movhpd(&mut self, op0: Mem, op1: Xmm) {
1381 self.emit(SSE_MOVHPDMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1382 }
1383}
1384
1385/// `SSE_MOVLPD` (MOVLPD).
1386/// This instruction cannot be used for register to register or memory to memory moves.
1387///
1388///
1389/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVLPD.html).
1390///
1391/// Supported operand variants:
1392///
1393/// ```text
1394/// +---+----------+
1395/// | # | Operands |
1396/// +---+----------+
1397/// | 1 | Mem, Xmm |
1398/// | 2 | Xmm, Mem |
1399/// +---+----------+
1400/// ```
1401pub trait SseMovlpdEmitter<A, B> {
1402 fn sse_movlpd(&mut self, op0: A, op1: B);
1403}
1404
1405impl<'a> SseMovlpdEmitter<Xmm, Mem> for Assembler<'a> {
1406 fn sse_movlpd(&mut self, op0: Xmm, op1: Mem) {
1407 self.emit(SSE_MOVLPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1408 }
1409}
1410
1411impl<'a> SseMovlpdEmitter<Mem, Xmm> for Assembler<'a> {
1412 fn sse_movlpd(&mut self, op0: Mem, op1: Xmm) {
1413 self.emit(SSE_MOVLPDMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1414 }
1415}
1416
1417/// `SSE_MOVMSKPD` (MOVMSKPD).
1418/// Extracts the sign bits from the packed double precision floating-point values in the source operand (second operand), formats them into a 2-bit mask, and stores the mask in the destination operand (first operand). The source operand is an XMM register, and the destination operand is a general-purpose register. The mask is stored in the 2 low-order bits of the destination operand. Zero-extend the upper bits of the destination.
1419///
1420///
1421/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVMSKPD.html).
1422///
1423/// Supported operand variants:
1424///
1425/// ```text
1426/// +---+----------+
1427/// | # | Operands |
1428/// +---+----------+
1429/// | 1 | Gpq, Xmm |
1430/// +---+----------+
1431/// ```
1432pub trait SseMovmskpdEmitter<A, B> {
1433 fn sse_movmskpd(&mut self, op0: A, op1: B);
1434}
1435
1436impl<'a> SseMovmskpdEmitter<Gpq, Xmm> for Assembler<'a> {
1437 fn sse_movmskpd(&mut self, op0: Gpq, op1: Xmm) {
1438 self.emit(SSE_MOVMSKPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1439 }
1440}
1441
1442/// `SSE_MOVNTDQ` (MOVNTDQ).
1443/// Moves the packed integers in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to prevent caching of the data during the write to memory. The source operand is an XMM register, YMM register or ZMM register, which is assumed to contain integer data (packed bytes, words, double-words, or quadwords). The destination operand is a 128-bit, 256-bit or 512-bit memory location. The memory operand must be aligned on a 16-byte (128-bit version), 32-byte (VEX.256 encoded version) or 64-byte (512-bit version) boundary otherwise a general-protection exception (#GP) will be generated.
1444///
1445///
1446/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVNTDQ.html).
1447///
1448/// Supported operand variants:
1449///
1450/// ```text
1451/// +---+----------+
1452/// | # | Operands |
1453/// +---+----------+
1454/// | 1 | Mem, Xmm |
1455/// +---+----------+
1456/// ```
1457pub trait SseMovntdqEmitter<A, B> {
1458 fn sse_movntdq(&mut self, op0: A, op1: B);
1459}
1460
1461impl<'a> SseMovntdqEmitter<Mem, Xmm> for Assembler<'a> {
1462 fn sse_movntdq(&mut self, op0: Mem, op1: Xmm) {
1463 self.emit(SSE_MOVNTDQMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1464 }
1465}
1466
1467/// `SSE_MOVNTPD` (MOVNTPD).
1468/// Moves the packed double precision floating-point values in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to prevent caching of the data during the write to memory. The source operand is an XMM register, YMM register or ZMM register, which is assumed to contain packed double precision, floating-pointing data. The destination operand is a 128-bit, 256-bit or 512-bit memory location. The memory operand must be aligned on a 16-byte (128-bit version), 32-byte (VEX.256 encoded version) or 64-byte (EVEX.512 encoded version) boundary otherwise a general-protection exception (#GP) will be generated.
1469///
1470///
1471/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVNTPD.html).
1472///
1473/// Supported operand variants:
1474///
1475/// ```text
1476/// +---+----------+
1477/// | # | Operands |
1478/// +---+----------+
1479/// | 1 | Mem, Xmm |
1480/// +---+----------+
1481/// ```
1482pub trait SseMovntpdEmitter<A, B> {
1483 fn sse_movntpd(&mut self, op0: A, op1: B);
1484}
1485
1486impl<'a> SseMovntpdEmitter<Mem, Xmm> for Assembler<'a> {
1487 fn sse_movntpd(&mut self, op0: Mem, op1: Xmm) {
1488 self.emit(SSE_MOVNTPDMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1489 }
1490}
1491
1492/// `SSE_MOVNTSD`.
1493///
1494/// Supported operand variants:
1495///
1496/// ```text
1497/// +---+----------+
1498/// | # | Operands |
1499/// +---+----------+
1500/// | 1 | Mem, Xmm |
1501/// +---+----------+
1502/// ```
1503pub trait SseMovntsdEmitter<A, B> {
1504 fn sse_movntsd(&mut self, op0: A, op1: B);
1505}
1506
1507impl<'a> SseMovntsdEmitter<Mem, Xmm> for Assembler<'a> {
1508 fn sse_movntsd(&mut self, op0: Mem, op1: Xmm) {
1509 self.emit(SSE_MOVNTSDMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1510 }
1511}
1512
1513/// `SSE_MOVQ` (MOVQ).
1514/// 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.
1515///
1516///
1517/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
1518///
1519/// Supported operand variants:
1520///
1521/// ```text
1522/// +---+----------+
1523/// | # | Operands |
1524/// +---+----------+
1525/// | 1 | Mem, Xmm |
1526/// | 2 | Xmm, Mem |
1527/// | 3 | Xmm, Xmm |
1528/// +---+----------+
1529/// ```
1530pub trait SseMovqEmitter<A, B> {
1531 fn sse_movq(&mut self, op0: A, op1: B);
1532}
1533
1534impl<'a> SseMovqEmitter<Xmm, Xmm> for Assembler<'a> {
1535 fn sse_movq(&mut self, op0: Xmm, op1: Xmm) {
1536 self.emit(SSE_MOVQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1537 }
1538}
1539
1540impl<'a> SseMovqEmitter<Xmm, Mem> for Assembler<'a> {
1541 fn sse_movq(&mut self, op0: Xmm, op1: Mem) {
1542 self.emit(SSE_MOVQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1543 }
1544}
1545
1546impl<'a> SseMovqEmitter<Mem, Xmm> for Assembler<'a> {
1547 fn sse_movq(&mut self, op0: Mem, op1: Xmm) {
1548 self.emit(SSE_MOVQMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1549 }
1550}
1551
1552/// `SSE_MOVQ_G2X` (MOVQ).
1553/// 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.
1554///
1555///
1556/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
1557///
1558/// Supported operand variants:
1559///
1560/// ```text
1561/// +---+----------+
1562/// | # | Operands |
1563/// +---+----------+
1564/// | 1 | Xmm, Gpd |
1565/// | 2 | Xmm, Mem |
1566/// +---+----------+
1567/// ```
1568pub trait SseMovqG2xEmitter<A, B> {
1569 fn sse_movq_g2x(&mut self, op0: A, op1: B);
1570}
1571
1572impl<'a> SseMovqG2xEmitter<Xmm, Gpd> for Assembler<'a> {
1573 fn sse_movq_g2x(&mut self, op0: Xmm, op1: Gpd) {
1574 self.emit(SSE_MOVQ_G2XRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1575 }
1576}
1577
1578impl<'a> SseMovqG2xEmitter<Xmm, Mem> for Assembler<'a> {
1579 fn sse_movq_g2x(&mut self, op0: Xmm, op1: Mem) {
1580 self.emit(SSE_MOVQ_G2XRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1581 }
1582}
1583
1584/// `SSE_MOVQ_X2G` (MOVQ).
1585/// 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.
1586///
1587///
1588/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
1589///
1590/// Supported operand variants:
1591///
1592/// ```text
1593/// +---+----------+
1594/// | # | Operands |
1595/// +---+----------+
1596/// | 1 | Gpd, Xmm |
1597/// | 2 | Mem, Xmm |
1598/// +---+----------+
1599/// ```
1600pub trait SseMovqX2gEmitter<A, B> {
1601 fn sse_movq_x2g(&mut self, op0: A, op1: B);
1602}
1603
1604impl<'a> SseMovqX2gEmitter<Gpd, Xmm> for Assembler<'a> {
1605 fn sse_movq_x2g(&mut self, op0: Gpd, op1: Xmm) {
1606 self.emit(SSE_MOVQ_X2GRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1607 }
1608}
1609
1610impl<'a> SseMovqX2gEmitter<Mem, Xmm> for Assembler<'a> {
1611 fn sse_movq_x2g(&mut self, op0: Mem, op1: Xmm) {
1612 self.emit(SSE_MOVQ_X2GMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1613 }
1614}
1615
1616/// `SSE_MOVSD` (MOVSD).
1617/// Moves the byte, word, or doubleword specified with the second operand (source operand) to the location specified with the first operand (destination operand). Both the source and destination operands are located in memory. The address of the source operand is read from the DS:ESI or the DS:SI registers (depending on the address-size attribute of the instruction, 32 or 16, respectively). The address of the destination operand is read from the ES:EDI or the ES:DI registers (again depending on the address-size attribute of the instruction). The DS segment may be overridden with a segment override prefix, but the ES segment cannot be overridden.
1618///
1619///
1620/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVS%3AMOVSB%3AMOVSW%3AMOVSD%3AMOVSQ.html).
1621///
1622/// Supported operand variants:
1623///
1624/// ```text
1625/// +---+----------+
1626/// | # | Operands |
1627/// +---+----------+
1628/// | 1 | Mem, Xmm |
1629/// | 2 | Xmm, Mem |
1630/// | 3 | Xmm, Xmm |
1631/// +---+----------+
1632/// ```
1633pub trait SseMovsdEmitter<A, B> {
1634 fn sse_movsd(&mut self, op0: A, op1: B);
1635}
1636
1637impl<'a> SseMovsdEmitter<Xmm, Xmm> for Assembler<'a> {
1638 fn sse_movsd(&mut self, op0: Xmm, op1: Xmm) {
1639 self.emit(SSE_MOVSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1640 }
1641}
1642
1643impl<'a> SseMovsdEmitter<Xmm, Mem> for Assembler<'a> {
1644 fn sse_movsd(&mut self, op0: Xmm, op1: Mem) {
1645 self.emit(SSE_MOVSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1646 }
1647}
1648
1649impl<'a> SseMovsdEmitter<Mem, Xmm> for Assembler<'a> {
1650 fn sse_movsd(&mut self, op0: Mem, op1: Xmm) {
1651 self.emit(SSE_MOVSDMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1652 }
1653}
1654
1655/// `SSE_MOVUPD` (MOVUPD).
1656/// Note: VEX.vvvv and EVEX.vvvv is reserved and must be 1111b otherwise instructions will #UD.
1657///
1658///
1659/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVUPD.html).
1660///
1661/// Supported operand variants:
1662///
1663/// ```text
1664/// +---+----------+
1665/// | # | Operands |
1666/// +---+----------+
1667/// | 1 | Mem, Xmm |
1668/// | 2 | Xmm, Mem |
1669/// | 3 | Xmm, Xmm |
1670/// +---+----------+
1671/// ```
1672pub trait SseMovupdEmitter<A, B> {
1673 fn sse_movupd(&mut self, op0: A, op1: B);
1674}
1675
1676impl<'a> SseMovupdEmitter<Xmm, Xmm> for Assembler<'a> {
1677 fn sse_movupd(&mut self, op0: Xmm, op1: Xmm) {
1678 self.emit(SSE_MOVUPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1679 }
1680}
1681
1682impl<'a> SseMovupdEmitter<Xmm, Mem> for Assembler<'a> {
1683 fn sse_movupd(&mut self, op0: Xmm, op1: Mem) {
1684 self.emit(SSE_MOVUPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1685 }
1686}
1687
1688impl<'a> SseMovupdEmitter<Mem, Xmm> for Assembler<'a> {
1689 fn sse_movupd(&mut self, op0: Mem, op1: Xmm) {
1690 self.emit(SSE_MOVUPDMR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1691 }
1692}
1693
1694/// `SSE_MULPD` (MULPD).
1695/// Multiply packed double precision floating-point values from the first source operand with corresponding values in the second source operand, and stores the packed double precision floating-point results in the destination operand.
1696///
1697///
1698/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MULPD.html).
1699///
1700/// Supported operand variants:
1701///
1702/// ```text
1703/// +---+----------+
1704/// | # | Operands |
1705/// +---+----------+
1706/// | 1 | Xmm, Mem |
1707/// | 2 | Xmm, Xmm |
1708/// +---+----------+
1709/// ```
1710pub trait SseMulpdEmitter<A, B> {
1711 fn sse_mulpd(&mut self, op0: A, op1: B);
1712}
1713
1714impl<'a> SseMulpdEmitter<Xmm, Xmm> for Assembler<'a> {
1715 fn sse_mulpd(&mut self, op0: Xmm, op1: Xmm) {
1716 self.emit(SSE_MULPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1717 }
1718}
1719
1720impl<'a> SseMulpdEmitter<Xmm, Mem> for Assembler<'a> {
1721 fn sse_mulpd(&mut self, op0: Xmm, op1: Mem) {
1722 self.emit(SSE_MULPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1723 }
1724}
1725
1726/// `SSE_MULSD` (MULSD).
1727/// Multiplies the low double precision floating-point value in the second source operand by the low double precision floating-point value in the first source operand, and stores the double precision floating-point result in the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source operand and the destination operands are XMM registers.
1728///
1729///
1730/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MULSD.html).
1731///
1732/// Supported operand variants:
1733///
1734/// ```text
1735/// +---+----------+
1736/// | # | Operands |
1737/// +---+----------+
1738/// | 1 | Xmm, Mem |
1739/// | 2 | Xmm, Xmm |
1740/// +---+----------+
1741/// ```
1742pub trait SseMulsdEmitter<A, B> {
1743 fn sse_mulsd(&mut self, op0: A, op1: B);
1744}
1745
1746impl<'a> SseMulsdEmitter<Xmm, Xmm> for Assembler<'a> {
1747 fn sse_mulsd(&mut self, op0: Xmm, op1: Xmm) {
1748 self.emit(SSE_MULSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1749 }
1750}
1751
1752impl<'a> SseMulsdEmitter<Xmm, Mem> for Assembler<'a> {
1753 fn sse_mulsd(&mut self, op0: Xmm, op1: Mem) {
1754 self.emit(SSE_MULSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1755 }
1756}
1757
1758/// `SSE_ORPD` (ORPD).
1759/// Performs a bitwise logical OR of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
1760///
1761///
1762/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ORPD.html).
1763///
1764/// Supported operand variants:
1765///
1766/// ```text
1767/// +---+----------+
1768/// | # | Operands |
1769/// +---+----------+
1770/// | 1 | Xmm, Mem |
1771/// | 2 | Xmm, Xmm |
1772/// +---+----------+
1773/// ```
1774pub trait SseOrpdEmitter<A, B> {
1775 fn sse_orpd(&mut self, op0: A, op1: B);
1776}
1777
1778impl<'a> SseOrpdEmitter<Xmm, Xmm> for Assembler<'a> {
1779 fn sse_orpd(&mut self, op0: Xmm, op1: Xmm) {
1780 self.emit(SSE_ORPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1781 }
1782}
1783
1784impl<'a> SseOrpdEmitter<Xmm, Mem> for Assembler<'a> {
1785 fn sse_orpd(&mut self, op0: Xmm, op1: Mem) {
1786 self.emit(SSE_ORPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1787 }
1788}
1789
1790/// `SSE_PACKSSDW` (PACKSSDW).
1791/// 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.
1792///
1793///
1794/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
1795///
1796/// Supported operand variants:
1797///
1798/// ```text
1799/// +---+----------+
1800/// | # | Operands |
1801/// +---+----------+
1802/// | 1 | Xmm, Mem |
1803/// | 2 | Xmm, Xmm |
1804/// +---+----------+
1805/// ```
1806pub trait SsePackssdwEmitter<A, B> {
1807 fn sse_packssdw(&mut self, op0: A, op1: B);
1808}
1809
1810impl<'a> SsePackssdwEmitter<Xmm, Xmm> for Assembler<'a> {
1811 fn sse_packssdw(&mut self, op0: Xmm, op1: Xmm) {
1812 self.emit(SSE_PACKSSDWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1813 }
1814}
1815
1816impl<'a> SsePackssdwEmitter<Xmm, Mem> for Assembler<'a> {
1817 fn sse_packssdw(&mut self, op0: Xmm, op1: Mem) {
1818 self.emit(SSE_PACKSSDWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1819 }
1820}
1821
1822/// `SSE_PACKSSWB` (PACKSSWB).
1823/// 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.
1824///
1825///
1826/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
1827///
1828/// Supported operand variants:
1829///
1830/// ```text
1831/// +---+----------+
1832/// | # | Operands |
1833/// +---+----------+
1834/// | 1 | Xmm, Mem |
1835/// | 2 | Xmm, Xmm |
1836/// +---+----------+
1837/// ```
1838pub trait SsePacksswbEmitter<A, B> {
1839 fn sse_packsswb(&mut self, op0: A, op1: B);
1840}
1841
1842impl<'a> SsePacksswbEmitter<Xmm, Xmm> for Assembler<'a> {
1843 fn sse_packsswb(&mut self, op0: Xmm, op1: Xmm) {
1844 self.emit(SSE_PACKSSWBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1845 }
1846}
1847
1848impl<'a> SsePacksswbEmitter<Xmm, Mem> for Assembler<'a> {
1849 fn sse_packsswb(&mut self, op0: Xmm, op1: Mem) {
1850 self.emit(SSE_PACKSSWBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1851 }
1852}
1853
1854/// `SSE_PACKUSWB` (PACKUSWB).
1855/// 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.
1856///
1857///
1858/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKUSWB.html).
1859///
1860/// Supported operand variants:
1861///
1862/// ```text
1863/// +---+----------+
1864/// | # | Operands |
1865/// +---+----------+
1866/// | 1 | Xmm, Mem |
1867/// | 2 | Xmm, Xmm |
1868/// +---+----------+
1869/// ```
1870pub trait SsePackuswbEmitter<A, B> {
1871 fn sse_packuswb(&mut self, op0: A, op1: B);
1872}
1873
1874impl<'a> SsePackuswbEmitter<Xmm, Xmm> for Assembler<'a> {
1875 fn sse_packuswb(&mut self, op0: Xmm, op1: Xmm) {
1876 self.emit(SSE_PACKUSWBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1877 }
1878}
1879
1880impl<'a> SsePackuswbEmitter<Xmm, Mem> for Assembler<'a> {
1881 fn sse_packuswb(&mut self, op0: Xmm, op1: Mem) {
1882 self.emit(SSE_PACKUSWBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1883 }
1884}
1885
1886/// `SSE_PADDB` (PADDB).
1887/// 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.
1888///
1889///
1890/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
1891///
1892/// Supported operand variants:
1893///
1894/// ```text
1895/// +---+----------+
1896/// | # | Operands |
1897/// +---+----------+
1898/// | 1 | Xmm, Mem |
1899/// | 2 | Xmm, Xmm |
1900/// +---+----------+
1901/// ```
1902pub trait SsePaddbEmitter<A, B> {
1903 fn sse_paddb(&mut self, op0: A, op1: B);
1904}
1905
1906impl<'a> SsePaddbEmitter<Xmm, Xmm> for Assembler<'a> {
1907 fn sse_paddb(&mut self, op0: Xmm, op1: Xmm) {
1908 self.emit(SSE_PADDBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1909 }
1910}
1911
1912impl<'a> SsePaddbEmitter<Xmm, Mem> for Assembler<'a> {
1913 fn sse_paddb(&mut self, op0: Xmm, op1: Mem) {
1914 self.emit(SSE_PADDBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1915 }
1916}
1917
1918/// `SSE_PADDD` (PADDD).
1919/// 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.
1920///
1921///
1922/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
1923///
1924/// Supported operand variants:
1925///
1926/// ```text
1927/// +---+----------+
1928/// | # | Operands |
1929/// +---+----------+
1930/// | 1 | Xmm, Mem |
1931/// | 2 | Xmm, Xmm |
1932/// +---+----------+
1933/// ```
1934pub trait SsePadddEmitter<A, B> {
1935 fn sse_paddd(&mut self, op0: A, op1: B);
1936}
1937
1938impl<'a> SsePadddEmitter<Xmm, Xmm> for Assembler<'a> {
1939 fn sse_paddd(&mut self, op0: Xmm, op1: Xmm) {
1940 self.emit(SSE_PADDDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1941 }
1942}
1943
1944impl<'a> SsePadddEmitter<Xmm, Mem> for Assembler<'a> {
1945 fn sse_paddd(&mut self, op0: Xmm, op1: Mem) {
1946 self.emit(SSE_PADDDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1947 }
1948}
1949
1950/// `SSE_PADDQ` (PADDQ).
1951/// 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.
1952///
1953///
1954/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
1955///
1956/// Supported operand variants:
1957///
1958/// ```text
1959/// +---+----------+
1960/// | # | Operands |
1961/// +---+----------+
1962/// | 1 | Xmm, Mem |
1963/// | 2 | Xmm, Xmm |
1964/// +---+----------+
1965/// ```
1966pub trait SsePaddqEmitter<A, B> {
1967 fn sse_paddq(&mut self, op0: A, op1: B);
1968}
1969
1970impl<'a> SsePaddqEmitter<Xmm, Xmm> for Assembler<'a> {
1971 fn sse_paddq(&mut self, op0: Xmm, op1: Xmm) {
1972 self.emit(SSE_PADDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1973 }
1974}
1975
1976impl<'a> SsePaddqEmitter<Xmm, Mem> for Assembler<'a> {
1977 fn sse_paddq(&mut self, op0: Xmm, op1: Mem) {
1978 self.emit(SSE_PADDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
1979 }
1980}
1981
1982/// `SSE_PADDSB` (PADDSB).
1983/// 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.
1984///
1985///
1986/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
1987///
1988/// Supported operand variants:
1989///
1990/// ```text
1991/// +---+----------+
1992/// | # | Operands |
1993/// +---+----------+
1994/// | 1 | Xmm, Mem |
1995/// | 2 | Xmm, Xmm |
1996/// +---+----------+
1997/// ```
1998pub trait SsePaddsbEmitter<A, B> {
1999 fn sse_paddsb(&mut self, op0: A, op1: B);
2000}
2001
2002impl<'a> SsePaddsbEmitter<Xmm, Xmm> for Assembler<'a> {
2003 fn sse_paddsb(&mut self, op0: Xmm, op1: Xmm) {
2004 self.emit(SSE_PADDSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2005 }
2006}
2007
2008impl<'a> SsePaddsbEmitter<Xmm, Mem> for Assembler<'a> {
2009 fn sse_paddsb(&mut self, op0: Xmm, op1: Mem) {
2010 self.emit(SSE_PADDSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2011 }
2012}
2013
2014/// `SSE_PADDSW` (PADDSW).
2015/// 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.
2016///
2017///
2018/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
2019///
2020/// Supported operand variants:
2021///
2022/// ```text
2023/// +---+----------+
2024/// | # | Operands |
2025/// +---+----------+
2026/// | 1 | Xmm, Mem |
2027/// | 2 | Xmm, Xmm |
2028/// +---+----------+
2029/// ```
2030pub trait SsePaddswEmitter<A, B> {
2031 fn sse_paddsw(&mut self, op0: A, op1: B);
2032}
2033
2034impl<'a> SsePaddswEmitter<Xmm, Xmm> for Assembler<'a> {
2035 fn sse_paddsw(&mut self, op0: Xmm, op1: Xmm) {
2036 self.emit(SSE_PADDSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2037 }
2038}
2039
2040impl<'a> SsePaddswEmitter<Xmm, Mem> for Assembler<'a> {
2041 fn sse_paddsw(&mut self, op0: Xmm, op1: Mem) {
2042 self.emit(SSE_PADDSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2043 }
2044}
2045
2046/// `SSE_PADDUSB` (PADDUSB).
2047/// 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.
2048///
2049///
2050/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
2051///
2052/// Supported operand variants:
2053///
2054/// ```text
2055/// +---+----------+
2056/// | # | Operands |
2057/// +---+----------+
2058/// | 1 | Xmm, Mem |
2059/// | 2 | Xmm, Xmm |
2060/// +---+----------+
2061/// ```
2062pub trait SsePaddusbEmitter<A, B> {
2063 fn sse_paddusb(&mut self, op0: A, op1: B);
2064}
2065
2066impl<'a> SsePaddusbEmitter<Xmm, Xmm> for Assembler<'a> {
2067 fn sse_paddusb(&mut self, op0: Xmm, op1: Xmm) {
2068 self.emit(SSE_PADDUSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2069 }
2070}
2071
2072impl<'a> SsePaddusbEmitter<Xmm, Mem> for Assembler<'a> {
2073 fn sse_paddusb(&mut self, op0: Xmm, op1: Mem) {
2074 self.emit(SSE_PADDUSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2075 }
2076}
2077
2078/// `SSE_PADDUSW` (PADDUSW).
2079/// 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.
2080///
2081///
2082/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
2083///
2084/// Supported operand variants:
2085///
2086/// ```text
2087/// +---+----------+
2088/// | # | Operands |
2089/// +---+----------+
2090/// | 1 | Xmm, Mem |
2091/// | 2 | Xmm, Xmm |
2092/// +---+----------+
2093/// ```
2094pub trait SsePadduswEmitter<A, B> {
2095 fn sse_paddusw(&mut self, op0: A, op1: B);
2096}
2097
2098impl<'a> SsePadduswEmitter<Xmm, Xmm> for Assembler<'a> {
2099 fn sse_paddusw(&mut self, op0: Xmm, op1: Xmm) {
2100 self.emit(SSE_PADDUSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2101 }
2102}
2103
2104impl<'a> SsePadduswEmitter<Xmm, Mem> for Assembler<'a> {
2105 fn sse_paddusw(&mut self, op0: Xmm, op1: Mem) {
2106 self.emit(SSE_PADDUSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2107 }
2108}
2109
2110/// `SSE_PADDW` (PADDW).
2111/// 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.
2112///
2113///
2114/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
2115///
2116/// Supported operand variants:
2117///
2118/// ```text
2119/// +---+----------+
2120/// | # | Operands |
2121/// +---+----------+
2122/// | 1 | Xmm, Mem |
2123/// | 2 | Xmm, Xmm |
2124/// +---+----------+
2125/// ```
2126pub trait SsePaddwEmitter<A, B> {
2127 fn sse_paddw(&mut self, op0: A, op1: B);
2128}
2129
2130impl<'a> SsePaddwEmitter<Xmm, Xmm> for Assembler<'a> {
2131 fn sse_paddw(&mut self, op0: Xmm, op1: Xmm) {
2132 self.emit(SSE_PADDWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2133 }
2134}
2135
2136impl<'a> SsePaddwEmitter<Xmm, Mem> for Assembler<'a> {
2137 fn sse_paddw(&mut self, op0: Xmm, op1: Mem) {
2138 self.emit(SSE_PADDWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2139 }
2140}
2141
2142/// `SSE_PAND` (PAND).
2143/// 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.
2144///
2145///
2146/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAND.html).
2147///
2148/// Supported operand variants:
2149///
2150/// ```text
2151/// +---+----------+
2152/// | # | Operands |
2153/// +---+----------+
2154/// | 1 | Xmm, Mem |
2155/// | 2 | Xmm, Xmm |
2156/// +---+----------+
2157/// ```
2158pub trait SsePandEmitter<A, B> {
2159 fn sse_pand(&mut self, op0: A, op1: B);
2160}
2161
2162impl<'a> SsePandEmitter<Xmm, Xmm> for Assembler<'a> {
2163 fn sse_pand(&mut self, op0: Xmm, op1: Xmm) {
2164 self.emit(SSE_PANDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2165 }
2166}
2167
2168impl<'a> SsePandEmitter<Xmm, Mem> for Assembler<'a> {
2169 fn sse_pand(&mut self, op0: Xmm, op1: Mem) {
2170 self.emit(SSE_PANDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2171 }
2172}
2173
2174/// `SSE_PANDN` (PANDN).
2175/// 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.
2176///
2177///
2178/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PANDN.html).
2179///
2180/// Supported operand variants:
2181///
2182/// ```text
2183/// +---+----------+
2184/// | # | Operands |
2185/// +---+----------+
2186/// | 1 | Xmm, Mem |
2187/// | 2 | Xmm, Xmm |
2188/// +---+----------+
2189/// ```
2190pub trait SsePandnEmitter<A, B> {
2191 fn sse_pandn(&mut self, op0: A, op1: B);
2192}
2193
2194impl<'a> SsePandnEmitter<Xmm, Xmm> for Assembler<'a> {
2195 fn sse_pandn(&mut self, op0: Xmm, op1: Xmm) {
2196 self.emit(SSE_PANDNRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2197 }
2198}
2199
2200impl<'a> SsePandnEmitter<Xmm, Mem> for Assembler<'a> {
2201 fn sse_pandn(&mut self, op0: Xmm, op1: Mem) {
2202 self.emit(SSE_PANDNRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2203 }
2204}
2205
2206/// `SSE_PAVGB` (PAVGB).
2207/// Performs a SIMD average of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the results in the destination operand. For each corresponding pair of data elements in the first and second operands, the elements are added together, a 1 is added to the temporary sum, and that result is shifted right one bit position.
2208///
2209///
2210/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAVGB%3APAVGW.html).
2211///
2212/// Supported operand variants:
2213///
2214/// ```text
2215/// +---+----------+
2216/// | # | Operands |
2217/// +---+----------+
2218/// | 1 | Xmm, Mem |
2219/// | 2 | Xmm, Xmm |
2220/// +---+----------+
2221/// ```
2222pub trait SsePavgbEmitter<A, B> {
2223 fn sse_pavgb(&mut self, op0: A, op1: B);
2224}
2225
2226impl<'a> SsePavgbEmitter<Xmm, Xmm> for Assembler<'a> {
2227 fn sse_pavgb(&mut self, op0: Xmm, op1: Xmm) {
2228 self.emit(SSE_PAVGBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2229 }
2230}
2231
2232impl<'a> SsePavgbEmitter<Xmm, Mem> for Assembler<'a> {
2233 fn sse_pavgb(&mut self, op0: Xmm, op1: Mem) {
2234 self.emit(SSE_PAVGBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2235 }
2236}
2237
2238/// `SSE_PAVGW` (PAVGW).
2239/// Performs a SIMD average of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the results in the destination operand. For each corresponding pair of data elements in the first and second operands, the elements are added together, a 1 is added to the temporary sum, and that result is shifted right one bit position.
2240///
2241///
2242/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAVGB%3APAVGW.html).
2243///
2244/// Supported operand variants:
2245///
2246/// ```text
2247/// +---+----------+
2248/// | # | Operands |
2249/// +---+----------+
2250/// | 1 | Xmm, Mem |
2251/// | 2 | Xmm, Xmm |
2252/// +---+----------+
2253/// ```
2254pub trait SsePavgwEmitter<A, B> {
2255 fn sse_pavgw(&mut self, op0: A, op1: B);
2256}
2257
2258impl<'a> SsePavgwEmitter<Xmm, Xmm> for Assembler<'a> {
2259 fn sse_pavgw(&mut self, op0: Xmm, op1: Xmm) {
2260 self.emit(SSE_PAVGWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2261 }
2262}
2263
2264impl<'a> SsePavgwEmitter<Xmm, Mem> for Assembler<'a> {
2265 fn sse_pavgw(&mut self, op0: Xmm, op1: Mem) {
2266 self.emit(SSE_PAVGWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2267 }
2268}
2269
2270/// `SSE_PCMPEQB` (PCMPEQB).
2271/// 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.
2272///
2273///
2274/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
2275///
2276/// Supported operand variants:
2277///
2278/// ```text
2279/// +---+----------+
2280/// | # | Operands |
2281/// +---+----------+
2282/// | 1 | Xmm, Mem |
2283/// | 2 | Xmm, Xmm |
2284/// +---+----------+
2285/// ```
2286pub trait SsePcmpeqbEmitter<A, B> {
2287 fn sse_pcmpeqb(&mut self, op0: A, op1: B);
2288}
2289
2290impl<'a> SsePcmpeqbEmitter<Xmm, Xmm> for Assembler<'a> {
2291 fn sse_pcmpeqb(&mut self, op0: Xmm, op1: Xmm) {
2292 self.emit(SSE_PCMPEQBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2293 }
2294}
2295
2296impl<'a> SsePcmpeqbEmitter<Xmm, Mem> for Assembler<'a> {
2297 fn sse_pcmpeqb(&mut self, op0: Xmm, op1: Mem) {
2298 self.emit(SSE_PCMPEQBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2299 }
2300}
2301
2302/// `SSE_PCMPEQD` (PCMPEQD).
2303/// 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.
2304///
2305///
2306/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
2307///
2308/// Supported operand variants:
2309///
2310/// ```text
2311/// +---+----------+
2312/// | # | Operands |
2313/// +---+----------+
2314/// | 1 | Xmm, Mem |
2315/// | 2 | Xmm, Xmm |
2316/// +---+----------+
2317/// ```
2318pub trait SsePcmpeqdEmitter<A, B> {
2319 fn sse_pcmpeqd(&mut self, op0: A, op1: B);
2320}
2321
2322impl<'a> SsePcmpeqdEmitter<Xmm, Xmm> for Assembler<'a> {
2323 fn sse_pcmpeqd(&mut self, op0: Xmm, op1: Xmm) {
2324 self.emit(SSE_PCMPEQDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2325 }
2326}
2327
2328impl<'a> SsePcmpeqdEmitter<Xmm, Mem> for Assembler<'a> {
2329 fn sse_pcmpeqd(&mut self, op0: Xmm, op1: Mem) {
2330 self.emit(SSE_PCMPEQDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2331 }
2332}
2333
2334/// `SSE_PCMPEQW` (PCMPEQW).
2335/// 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.
2336///
2337///
2338/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
2339///
2340/// Supported operand variants:
2341///
2342/// ```text
2343/// +---+----------+
2344/// | # | Operands |
2345/// +---+----------+
2346/// | 1 | Xmm, Mem |
2347/// | 2 | Xmm, Xmm |
2348/// +---+----------+
2349/// ```
2350pub trait SsePcmpeqwEmitter<A, B> {
2351 fn sse_pcmpeqw(&mut self, op0: A, op1: B);
2352}
2353
2354impl<'a> SsePcmpeqwEmitter<Xmm, Xmm> for Assembler<'a> {
2355 fn sse_pcmpeqw(&mut self, op0: Xmm, op1: Xmm) {
2356 self.emit(SSE_PCMPEQWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2357 }
2358}
2359
2360impl<'a> SsePcmpeqwEmitter<Xmm, Mem> for Assembler<'a> {
2361 fn sse_pcmpeqw(&mut self, op0: Xmm, op1: Mem) {
2362 self.emit(SSE_PCMPEQWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2363 }
2364}
2365
2366/// `SSE_PCMPGTB` (PCMPGTB).
2367/// 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.
2368///
2369///
2370/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
2371///
2372/// Supported operand variants:
2373///
2374/// ```text
2375/// +---+----------+
2376/// | # | Operands |
2377/// +---+----------+
2378/// | 1 | Xmm, Mem |
2379/// | 2 | Xmm, Xmm |
2380/// +---+----------+
2381/// ```
2382pub trait SsePcmpgtbEmitter<A, B> {
2383 fn sse_pcmpgtb(&mut self, op0: A, op1: B);
2384}
2385
2386impl<'a> SsePcmpgtbEmitter<Xmm, Xmm> for Assembler<'a> {
2387 fn sse_pcmpgtb(&mut self, op0: Xmm, op1: Xmm) {
2388 self.emit(SSE_PCMPGTBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2389 }
2390}
2391
2392impl<'a> SsePcmpgtbEmitter<Xmm, Mem> for Assembler<'a> {
2393 fn sse_pcmpgtb(&mut self, op0: Xmm, op1: Mem) {
2394 self.emit(SSE_PCMPGTBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2395 }
2396}
2397
2398/// `SSE_PCMPGTD` (PCMPGTD).
2399/// 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.
2400///
2401///
2402/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
2403///
2404/// Supported operand variants:
2405///
2406/// ```text
2407/// +---+----------+
2408/// | # | Operands |
2409/// +---+----------+
2410/// | 1 | Xmm, Mem |
2411/// | 2 | Xmm, Xmm |
2412/// +---+----------+
2413/// ```
2414pub trait SsePcmpgtdEmitter<A, B> {
2415 fn sse_pcmpgtd(&mut self, op0: A, op1: B);
2416}
2417
2418impl<'a> SsePcmpgtdEmitter<Xmm, Xmm> for Assembler<'a> {
2419 fn sse_pcmpgtd(&mut self, op0: Xmm, op1: Xmm) {
2420 self.emit(SSE_PCMPGTDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2421 }
2422}
2423
2424impl<'a> SsePcmpgtdEmitter<Xmm, Mem> for Assembler<'a> {
2425 fn sse_pcmpgtd(&mut self, op0: Xmm, op1: Mem) {
2426 self.emit(SSE_PCMPGTDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2427 }
2428}
2429
2430/// `SSE_PCMPGTW` (PCMPGTW).
2431/// 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.
2432///
2433///
2434/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
2435///
2436/// Supported operand variants:
2437///
2438/// ```text
2439/// +---+----------+
2440/// | # | Operands |
2441/// +---+----------+
2442/// | 1 | Xmm, Mem |
2443/// | 2 | Xmm, Xmm |
2444/// +---+----------+
2445/// ```
2446pub trait SsePcmpgtwEmitter<A, B> {
2447 fn sse_pcmpgtw(&mut self, op0: A, op1: B);
2448}
2449
2450impl<'a> SsePcmpgtwEmitter<Xmm, Xmm> for Assembler<'a> {
2451 fn sse_pcmpgtw(&mut self, op0: Xmm, op1: Xmm) {
2452 self.emit(SSE_PCMPGTWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2453 }
2454}
2455
2456impl<'a> SsePcmpgtwEmitter<Xmm, Mem> for Assembler<'a> {
2457 fn sse_pcmpgtw(&mut self, op0: Xmm, op1: Mem) {
2458 self.emit(SSE_PCMPGTWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2459 }
2460}
2461
2462/// `SSE_PEXTRW` (PEXTRW).
2463/// Copies the word in the source operand (second operand) specified by the count operand (third operand) to the destination operand (first operand). The source operand can be an MMX technology register or an XMM register. The destination operand can be the low word of a general-purpose register or a 16-bit memory address. The count operand is an 8-bit immediate. When specifying a word location in an MMX technology register, the 2 least-significant bits of the count operand specify the location; for an XMM register, the 3 least-significant bits specify the location. The content of the destination register above bit 16 is cleared (set to all 0s).
2464///
2465///
2466/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PEXTRW.html).
2467///
2468/// Supported operand variants:
2469///
2470/// ```text
2471/// +---+---------------+
2472/// | # | Operands |
2473/// +---+---------------+
2474/// | 1 | Gpd, Xmm, Imm |
2475/// | 2 | Mem, Xmm, Imm |
2476/// +---+---------------+
2477/// ```
2478pub trait SsePextrwEmitter<A, B, C> {
2479 fn sse_pextrw(&mut self, op0: A, op1: B, op2: C);
2480}
2481
2482impl<'a> SsePextrwEmitter<Gpd, Xmm, Imm> for Assembler<'a> {
2483 fn sse_pextrw(&mut self, op0: Gpd, op1: Xmm, op2: Imm) {
2484 self.emit(SSE_PEXTRWRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2485 }
2486}
2487
2488impl<'a> SsePextrwEmitter<Mem, Xmm, Imm> for Assembler<'a> {
2489 fn sse_pextrw(&mut self, op0: Mem, op1: Xmm, op2: Imm) {
2490 self.emit(SSE_PEXTRWMRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2491 }
2492}
2493
2494/// `SSE_PINSRW` (PINSRW).
2495/// Three operand MMX and SSE instructions
2496///
2497///
2498/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PINSRW.html).
2499///
2500/// Supported operand variants:
2501///
2502/// ```text
2503/// +---+---------------+
2504/// | # | Operands |
2505/// +---+---------------+
2506/// | 1 | Xmm, Gpd, Imm |
2507/// | 2 | Xmm, Mem, Imm |
2508/// +---+---------------+
2509/// ```
2510pub trait SsePinsrwEmitter<A, B, C> {
2511 fn sse_pinsrw(&mut self, op0: A, op1: B, op2: C);
2512}
2513
2514impl<'a> SsePinsrwEmitter<Xmm, Gpd, Imm> for Assembler<'a> {
2515 fn sse_pinsrw(&mut self, op0: Xmm, op1: Gpd, op2: Imm) {
2516 self.emit(SSE_PINSRWRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2517 }
2518}
2519
2520impl<'a> SsePinsrwEmitter<Xmm, Mem, Imm> for Assembler<'a> {
2521 fn sse_pinsrw(&mut self, op0: Xmm, op1: Mem, op2: Imm) {
2522 self.emit(SSE_PINSRWRMI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2523 }
2524}
2525
2526/// `SSE_PMADDWD` (PMADDWD).
2527/// 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).
2528///
2529///
2530/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMADDWD.html).
2531///
2532/// Supported operand variants:
2533///
2534/// ```text
2535/// +---+----------+
2536/// | # | Operands |
2537/// +---+----------+
2538/// | 1 | Xmm, Mem |
2539/// | 2 | Xmm, Xmm |
2540/// +---+----------+
2541/// ```
2542pub trait SsePmaddwdEmitter<A, B> {
2543 fn sse_pmaddwd(&mut self, op0: A, op1: B);
2544}
2545
2546impl<'a> SsePmaddwdEmitter<Xmm, Xmm> for Assembler<'a> {
2547 fn sse_pmaddwd(&mut self, op0: Xmm, op1: Xmm) {
2548 self.emit(SSE_PMADDWDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2549 }
2550}
2551
2552impl<'a> SsePmaddwdEmitter<Xmm, Mem> for Assembler<'a> {
2553 fn sse_pmaddwd(&mut self, op0: Xmm, op1: Mem) {
2554 self.emit(SSE_PMADDWDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2555 }
2556}
2557
2558/// `SSE_PMAXSW` (PMAXSW).
2559/// Performs a SIMD compare of the packed signed byte, word, dword or qword integers in the second source operand and the first source operand and returns the maximum value for each pair of integers to the destination operand.
2560///
2561///
2562/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMAXSB%3APMAXSW%3APMAXSD%3APMAXSQ.html).
2563///
2564/// Supported operand variants:
2565///
2566/// ```text
2567/// +---+----------+
2568/// | # | Operands |
2569/// +---+----------+
2570/// | 1 | Xmm, Mem |
2571/// | 2 | Xmm, Xmm |
2572/// +---+----------+
2573/// ```
2574pub trait SsePmaxswEmitter<A, B> {
2575 fn sse_pmaxsw(&mut self, op0: A, op1: B);
2576}
2577
2578impl<'a> SsePmaxswEmitter<Xmm, Xmm> for Assembler<'a> {
2579 fn sse_pmaxsw(&mut self, op0: Xmm, op1: Xmm) {
2580 self.emit(SSE_PMAXSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2581 }
2582}
2583
2584impl<'a> SsePmaxswEmitter<Xmm, Mem> for Assembler<'a> {
2585 fn sse_pmaxsw(&mut self, op0: Xmm, op1: Mem) {
2586 self.emit(SSE_PMAXSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2587 }
2588}
2589
2590/// `SSE_PMAXUB` (PMAXUB).
2591/// Performs a SIMD compare of the packed unsigned byte, word integers in the second source operand and the first source operand and returns the maximum value for each pair of integers to the destination operand.
2592///
2593///
2594/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMAXUB%3APMAXUW.html).
2595///
2596/// Supported operand variants:
2597///
2598/// ```text
2599/// +---+----------+
2600/// | # | Operands |
2601/// +---+----------+
2602/// | 1 | Xmm, Mem |
2603/// | 2 | Xmm, Xmm |
2604/// +---+----------+
2605/// ```
2606pub trait SsePmaxubEmitter<A, B> {
2607 fn sse_pmaxub(&mut self, op0: A, op1: B);
2608}
2609
2610impl<'a> SsePmaxubEmitter<Xmm, Xmm> for Assembler<'a> {
2611 fn sse_pmaxub(&mut self, op0: Xmm, op1: Xmm) {
2612 self.emit(SSE_PMAXUBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2613 }
2614}
2615
2616impl<'a> SsePmaxubEmitter<Xmm, Mem> for Assembler<'a> {
2617 fn sse_pmaxub(&mut self, op0: Xmm, op1: Mem) {
2618 self.emit(SSE_PMAXUBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2619 }
2620}
2621
2622/// `SSE_PMINSW` (PMINSW).
2623/// Performs a SIMD compare of the packed signed byte, word, or dword integers in the second source operand and the first source operand and returns the minimum value for each pair of integers to the destination operand.
2624///
2625///
2626/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMINSB%3APMINSW.html).
2627///
2628/// Supported operand variants:
2629///
2630/// ```text
2631/// +---+----------+
2632/// | # | Operands |
2633/// +---+----------+
2634/// | 1 | Xmm, Mem |
2635/// | 2 | Xmm, Xmm |
2636/// +---+----------+
2637/// ```
2638pub trait SsePminswEmitter<A, B> {
2639 fn sse_pminsw(&mut self, op0: A, op1: B);
2640}
2641
2642impl<'a> SsePminswEmitter<Xmm, Xmm> for Assembler<'a> {
2643 fn sse_pminsw(&mut self, op0: Xmm, op1: Xmm) {
2644 self.emit(SSE_PMINSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2645 }
2646}
2647
2648impl<'a> SsePminswEmitter<Xmm, Mem> for Assembler<'a> {
2649 fn sse_pminsw(&mut self, op0: Xmm, op1: Mem) {
2650 self.emit(SSE_PMINSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2651 }
2652}
2653
2654/// `SSE_PMINUB` (PMINUB).
2655/// Performs a SIMD compare of the packed unsigned byte or word integers in the second source operand and the first source operand and returns the minimum value for each pair of integers to the destination operand.
2656///
2657///
2658/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMINUB%3APMINUW.html).
2659///
2660/// Supported operand variants:
2661///
2662/// ```text
2663/// +---+----------+
2664/// | # | Operands |
2665/// +---+----------+
2666/// | 1 | Xmm, Mem |
2667/// | 2 | Xmm, Xmm |
2668/// +---+----------+
2669/// ```
2670pub trait SsePminubEmitter<A, B> {
2671 fn sse_pminub(&mut self, op0: A, op1: B);
2672}
2673
2674impl<'a> SsePminubEmitter<Xmm, Xmm> for Assembler<'a> {
2675 fn sse_pminub(&mut self, op0: Xmm, op1: Xmm) {
2676 self.emit(SSE_PMINUBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2677 }
2678}
2679
2680impl<'a> SsePminubEmitter<Xmm, Mem> for Assembler<'a> {
2681 fn sse_pminub(&mut self, op0: Xmm, op1: Mem) {
2682 self.emit(SSE_PMINUBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2683 }
2684}
2685
2686/// `SSE_PMOVMSKB` (PMOVMSKB).
2687/// Creates a mask made up of the most significant bit of each byte of the source operand (second operand) and stores the result in the low byte or word of the destination operand (first operand).
2688///
2689///
2690/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMOVMSKB.html).
2691///
2692/// Supported operand variants:
2693///
2694/// ```text
2695/// +---+----------+
2696/// | # | Operands |
2697/// +---+----------+
2698/// | 1 | Gpq, Xmm |
2699/// +---+----------+
2700/// ```
2701pub trait SsePmovmskbEmitter<A, B> {
2702 fn sse_pmovmskb(&mut self, op0: A, op1: B);
2703}
2704
2705impl<'a> SsePmovmskbEmitter<Gpq, Xmm> for Assembler<'a> {
2706 fn sse_pmovmskb(&mut self, op0: Gpq, op1: Xmm) {
2707 self.emit(SSE_PMOVMSKBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2708 }
2709}
2710
2711/// `SSE_PMULHUW` (PMULHUW).
2712/// Performs a SIMD unsigned multiply of the packed unsigned word integers in the destination operand (first operand) and the source operand (second operand), and stores the high 16 bits of each 32-bit intermediate results in the destination operand. (Figure 4-12 shows this operation when using 64-bit operands.)
2713///
2714///
2715/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULHUW.html).
2716///
2717/// Supported operand variants:
2718///
2719/// ```text
2720/// +---+----------+
2721/// | # | Operands |
2722/// +---+----------+
2723/// | 1 | Xmm, Mem |
2724/// | 2 | Xmm, Xmm |
2725/// +---+----------+
2726/// ```
2727pub trait SsePmulhuwEmitter<A, B> {
2728 fn sse_pmulhuw(&mut self, op0: A, op1: B);
2729}
2730
2731impl<'a> SsePmulhuwEmitter<Xmm, Xmm> for Assembler<'a> {
2732 fn sse_pmulhuw(&mut self, op0: Xmm, op1: Xmm) {
2733 self.emit(SSE_PMULHUWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2734 }
2735}
2736
2737impl<'a> SsePmulhuwEmitter<Xmm, Mem> for Assembler<'a> {
2738 fn sse_pmulhuw(&mut self, op0: Xmm, op1: Mem) {
2739 self.emit(SSE_PMULHUWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2740 }
2741}
2742
2743/// `SSE_PMULHW` (PMULHW).
2744/// 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.)
2745///
2746///
2747/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULHW.html).
2748///
2749/// Supported operand variants:
2750///
2751/// ```text
2752/// +---+----------+
2753/// | # | Operands |
2754/// +---+----------+
2755/// | 1 | Xmm, Mem |
2756/// | 2 | Xmm, Xmm |
2757/// +---+----------+
2758/// ```
2759pub trait SsePmulhwEmitter<A, B> {
2760 fn sse_pmulhw(&mut self, op0: A, op1: B);
2761}
2762
2763impl<'a> SsePmulhwEmitter<Xmm, Xmm> for Assembler<'a> {
2764 fn sse_pmulhw(&mut self, op0: Xmm, op1: Xmm) {
2765 self.emit(SSE_PMULHWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2766 }
2767}
2768
2769impl<'a> SsePmulhwEmitter<Xmm, Mem> for Assembler<'a> {
2770 fn sse_pmulhw(&mut self, op0: Xmm, op1: Mem) {
2771 self.emit(SSE_PMULHWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2772 }
2773}
2774
2775/// `SSE_PMULLW` (PMULLW).
2776/// 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.)
2777///
2778///
2779/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULLW.html).
2780///
2781/// Supported operand variants:
2782///
2783/// ```text
2784/// +---+----------+
2785/// | # | Operands |
2786/// +---+----------+
2787/// | 1 | Xmm, Mem |
2788/// | 2 | Xmm, Xmm |
2789/// +---+----------+
2790/// ```
2791pub trait SsePmullwEmitter<A, B> {
2792 fn sse_pmullw(&mut self, op0: A, op1: B);
2793}
2794
2795impl<'a> SsePmullwEmitter<Xmm, Xmm> for Assembler<'a> {
2796 fn sse_pmullw(&mut self, op0: Xmm, op1: Xmm) {
2797 self.emit(SSE_PMULLWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2798 }
2799}
2800
2801impl<'a> SsePmullwEmitter<Xmm, Mem> for Assembler<'a> {
2802 fn sse_pmullw(&mut self, op0: Xmm, op1: Mem) {
2803 self.emit(SSE_PMULLWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2804 }
2805}
2806
2807/// `SSE_PMULUDQ` (PMULUDQ).
2808/// Multiplies the first operand (destination operand) by the second operand (source operand) and stores the result in the destination operand.
2809///
2810///
2811/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULUDQ.html).
2812///
2813/// Supported operand variants:
2814///
2815/// ```text
2816/// +---+----------+
2817/// | # | Operands |
2818/// +---+----------+
2819/// | 1 | Xmm, Mem |
2820/// | 2 | Xmm, Xmm |
2821/// +---+----------+
2822/// ```
2823pub trait SsePmuludqEmitter<A, B> {
2824 fn sse_pmuludq(&mut self, op0: A, op1: B);
2825}
2826
2827impl<'a> SsePmuludqEmitter<Xmm, Xmm> for Assembler<'a> {
2828 fn sse_pmuludq(&mut self, op0: Xmm, op1: Xmm) {
2829 self.emit(SSE_PMULUDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2830 }
2831}
2832
2833impl<'a> SsePmuludqEmitter<Xmm, Mem> for Assembler<'a> {
2834 fn sse_pmuludq(&mut self, op0: Xmm, op1: Mem) {
2835 self.emit(SSE_PMULUDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2836 }
2837}
2838
2839/// `SSE_POR` (POR).
2840/// 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.
2841///
2842///
2843/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/POR.html).
2844///
2845/// Supported operand variants:
2846///
2847/// ```text
2848/// +---+----------+
2849/// | # | Operands |
2850/// +---+----------+
2851/// | 1 | Xmm, Mem |
2852/// | 2 | Xmm, Xmm |
2853/// +---+----------+
2854/// ```
2855pub trait SsePorEmitter<A, B> {
2856 fn sse_por(&mut self, op0: A, op1: B);
2857}
2858
2859impl<'a> SsePorEmitter<Xmm, Xmm> for Assembler<'a> {
2860 fn sse_por(&mut self, op0: Xmm, op1: Xmm) {
2861 self.emit(SSE_PORRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2862 }
2863}
2864
2865impl<'a> SsePorEmitter<Xmm, Mem> for Assembler<'a> {
2866 fn sse_por(&mut self, op0: Xmm, op1: Mem) {
2867 self.emit(SSE_PORRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2868 }
2869}
2870
2871/// `SSE_PSADBW` (PSADBW).
2872/// Computes the absolute value of the difference of 8 unsigned byte integers from the source operand (second operand) and from the destination operand (first operand). These 8 differences are then summed to produce an unsigned word integer result that is stored in the destination operand. Figure 4-14 shows the operation of the PSADBW instruction when using 64-bit operands.
2873///
2874///
2875/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSADBW.html).
2876///
2877/// Supported operand variants:
2878///
2879/// ```text
2880/// +---+----------+
2881/// | # | Operands |
2882/// +---+----------+
2883/// | 1 | Xmm, Mem |
2884/// | 2 | Xmm, Xmm |
2885/// +---+----------+
2886/// ```
2887pub trait SsePsadbwEmitter<A, B> {
2888 fn sse_psadbw(&mut self, op0: A, op1: B);
2889}
2890
2891impl<'a> SsePsadbwEmitter<Xmm, Xmm> for Assembler<'a> {
2892 fn sse_psadbw(&mut self, op0: Xmm, op1: Xmm) {
2893 self.emit(SSE_PSADBWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2894 }
2895}
2896
2897impl<'a> SsePsadbwEmitter<Xmm, Mem> for Assembler<'a> {
2898 fn sse_psadbw(&mut self, op0: Xmm, op1: Mem) {
2899 self.emit(SSE_PSADBWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
2900 }
2901}
2902
2903/// `SSE_PSHUFD` (PSHUFD).
2904/// Copies doublewords from source operand (second operand) and inserts them in the destination operand (first operand) at the locations selected with the order operand (third operand). Figure 4-16 shows the operation of the 256-bit VPSHUFD instruction and the encoding of the order operand. Each 2-bit field in the order operand selects the contents of one doubleword location within a 128-bit lane and copy to the target element in the destination operand. For example, bits 0 and 1 of the order operand targets the first doubleword element in the low and high 128-bit lane of the destination operand for 256-bit VPSHUFD. The encoded value of bits 1:0 of the order operand (see the field encoding in Figure 4-16) determines which doubleword element (from the respective 128-bit lane) of the source operand will be copied to doubleword 0 of the destination operand.
2905///
2906///
2907/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSHUFD.html).
2908///
2909/// Supported operand variants:
2910///
2911/// ```text
2912/// +---+---------------+
2913/// | # | Operands |
2914/// +---+---------------+
2915/// | 1 | Xmm, Mem, Imm |
2916/// | 2 | Xmm, Xmm, Imm |
2917/// +---+---------------+
2918/// ```
2919pub trait SsePshufdEmitter<A, B, C> {
2920 fn sse_pshufd(&mut self, op0: A, op1: B, op2: C);
2921}
2922
2923impl<'a> SsePshufdEmitter<Xmm, Xmm, Imm> for Assembler<'a> {
2924 fn sse_pshufd(&mut self, op0: Xmm, op1: Xmm, op2: Imm) {
2925 self.emit(SSE_PSHUFDRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2926 }
2927}
2928
2929impl<'a> SsePshufdEmitter<Xmm, Mem, Imm> for Assembler<'a> {
2930 fn sse_pshufd(&mut self, op0: Xmm, op1: Mem, op2: Imm) {
2931 self.emit(SSE_PSHUFDRMI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2932 }
2933}
2934
2935/// `SSE_PSHUFHW` (PSHUFHW).
2936/// Copies words from the high quadword of a 128-bit lane of the source operand and inserts them in the high quadword of the destination operand at word locations (of the respective lane) selected with the immediate operand. This 256-bit operation is similar to the in-lane operation used by the 256-bit VPSHUFD instruction, which is illustrated in Figure 4-16. For 128-bit operation, only the low 128-bit lane is operative. Each 2-bit field in the immediate operand selects the contents of one word location in the high quadword of the destination operand. The binary encodings of the immediate operand fields select words (0, 1, 2 or 3, 4) from the high quadword of the source operand to be copied to the destination operand. The low quadword of the source operand is copied to the low quadword of the destination operand, for each 128-bit lane.
2937///
2938///
2939/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSHUFHW.html).
2940///
2941/// Supported operand variants:
2942///
2943/// ```text
2944/// +---+---------------+
2945/// | # | Operands |
2946/// +---+---------------+
2947/// | 1 | Xmm, Mem, Imm |
2948/// | 2 | Xmm, Xmm, Imm |
2949/// +---+---------------+
2950/// ```
2951pub trait SsePshufhwEmitter<A, B, C> {
2952 fn sse_pshufhw(&mut self, op0: A, op1: B, op2: C);
2953}
2954
2955impl<'a> SsePshufhwEmitter<Xmm, Xmm, Imm> for Assembler<'a> {
2956 fn sse_pshufhw(&mut self, op0: Xmm, op1: Xmm, op2: Imm) {
2957 self.emit(SSE_PSHUFHWRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2958 }
2959}
2960
2961impl<'a> SsePshufhwEmitter<Xmm, Mem, Imm> for Assembler<'a> {
2962 fn sse_pshufhw(&mut self, op0: Xmm, op1: Mem, op2: Imm) {
2963 self.emit(SSE_PSHUFHWRMI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2964 }
2965}
2966
2967/// `SSE_PSHUFLW` (PSHUFLW).
2968/// Copies words from the low quadword of a 128-bit lane of the source operand and inserts them in the low quadword of the destination operand at word locations (of the respective lane) selected with the immediate operand. The 256-bit operation is similar to the in-lane operation used by the 256-bit VPSHUFD instruction, which is illustrated in Figure 4-16. For 128-bit operation, only the low 128-bit lane is operative. Each 2-bit field in the immediate operand selects the contents of one word location in the low quadword of the destination operand. The binary encodings of the immediate operand fields select words (0, 1, 2 or 3) from the low quadword of the source operand to be copied to the destination operand. The high quadword of the source operand is copied to the high quadword of the destination operand, for each 128-bit lane.
2969///
2970///
2971/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSHUFLW.html).
2972///
2973/// Supported operand variants:
2974///
2975/// ```text
2976/// +---+---------------+
2977/// | # | Operands |
2978/// +---+---------------+
2979/// | 1 | Xmm, Mem, Imm |
2980/// | 2 | Xmm, Xmm, Imm |
2981/// +---+---------------+
2982/// ```
2983pub trait SsePshuflwEmitter<A, B, C> {
2984 fn sse_pshuflw(&mut self, op0: A, op1: B, op2: C);
2985}
2986
2987impl<'a> SsePshuflwEmitter<Xmm, Xmm, Imm> for Assembler<'a> {
2988 fn sse_pshuflw(&mut self, op0: Xmm, op1: Xmm, op2: Imm) {
2989 self.emit(SSE_PSHUFLWRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2990 }
2991}
2992
2993impl<'a> SsePshuflwEmitter<Xmm, Mem, Imm> for Assembler<'a> {
2994 fn sse_pshuflw(&mut self, op0: Xmm, op1: Mem, op2: Imm) {
2995 self.emit(SSE_PSHUFLWRMI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
2996 }
2997}
2998
2999/// `SSE_PSLLD` (PSLLD).
3000/// 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.
3001///
3002///
3003/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
3004///
3005/// Supported operand variants:
3006///
3007/// ```text
3008/// +---+----------+
3009/// | # | Operands |
3010/// +---+----------+
3011/// | 1 | Xmm, Imm |
3012/// | 2 | Xmm, Mem |
3013/// | 3 | Xmm, Xmm |
3014/// +---+----------+
3015/// ```
3016pub trait SsePslldEmitter<A, B> {
3017 fn sse_pslld(&mut self, op0: A, op1: B);
3018}
3019
3020impl<'a> SsePslldEmitter<Xmm, Imm> for Assembler<'a> {
3021 fn sse_pslld(&mut self, op0: Xmm, op1: Imm) {
3022 self.emit(SSE_PSLLDRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3023 }
3024}
3025
3026impl<'a> SsePslldEmitter<Xmm, Xmm> for Assembler<'a> {
3027 fn sse_pslld(&mut self, op0: Xmm, op1: Xmm) {
3028 self.emit(SSE_PSLLDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3029 }
3030}
3031
3032impl<'a> SsePslldEmitter<Xmm, Mem> for Assembler<'a> {
3033 fn sse_pslld(&mut self, op0: Xmm, op1: Mem) {
3034 self.emit(SSE_PSLLDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3035 }
3036}
3037
3038/// `SSE_PSLLDQ` (PSLLDQ).
3039/// Shifts the destination operand (first operand) to the left by the number of bytes specified in the count operand (second operand). The empty low-order bytes are cleared (set to all 0s). If the value specified by the count operand is greater than 15, the destination operand is set to all 0s. The count operand is an 8-bit immediate.
3040///
3041///
3042/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLDQ.html).
3043///
3044/// Supported operand variants:
3045///
3046/// ```text
3047/// +---+----------+
3048/// | # | Operands |
3049/// +---+----------+
3050/// | 1 | Xmm, Imm |
3051/// +---+----------+
3052/// ```
3053pub trait SsePslldqEmitter<A, B> {
3054 fn sse_pslldq(&mut self, op0: A, op1: B);
3055}
3056
3057impl<'a> SsePslldqEmitter<Xmm, Imm> for Assembler<'a> {
3058 fn sse_pslldq(&mut self, op0: Xmm, op1: Imm) {
3059 self.emit(SSE_PSLLDQRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3060 }
3061}
3062
3063/// `SSE_PSLLQ` (PSLLQ).
3064/// 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.
3065///
3066///
3067/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
3068///
3069/// Supported operand variants:
3070///
3071/// ```text
3072/// +---+----------+
3073/// | # | Operands |
3074/// +---+----------+
3075/// | 1 | Xmm, Imm |
3076/// | 2 | Xmm, Mem |
3077/// | 3 | Xmm, Xmm |
3078/// +---+----------+
3079/// ```
3080pub trait SsePsllqEmitter<A, B> {
3081 fn sse_psllq(&mut self, op0: A, op1: B);
3082}
3083
3084impl<'a> SsePsllqEmitter<Xmm, Imm> for Assembler<'a> {
3085 fn sse_psllq(&mut self, op0: Xmm, op1: Imm) {
3086 self.emit(SSE_PSLLQRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3087 }
3088}
3089
3090impl<'a> SsePsllqEmitter<Xmm, Xmm> for Assembler<'a> {
3091 fn sse_psllq(&mut self, op0: Xmm, op1: Xmm) {
3092 self.emit(SSE_PSLLQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3093 }
3094}
3095
3096impl<'a> SsePsllqEmitter<Xmm, Mem> for Assembler<'a> {
3097 fn sse_psllq(&mut self, op0: Xmm, op1: Mem) {
3098 self.emit(SSE_PSLLQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3099 }
3100}
3101
3102/// `SSE_PSLLW` (PSLLW).
3103/// 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.
3104///
3105///
3106/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
3107///
3108/// Supported operand variants:
3109///
3110/// ```text
3111/// +---+----------+
3112/// | # | Operands |
3113/// +---+----------+
3114/// | 1 | Xmm, Imm |
3115/// | 2 | Xmm, Mem |
3116/// | 3 | Xmm, Xmm |
3117/// +---+----------+
3118/// ```
3119pub trait SsePsllwEmitter<A, B> {
3120 fn sse_psllw(&mut self, op0: A, op1: B);
3121}
3122
3123impl<'a> SsePsllwEmitter<Xmm, Imm> for Assembler<'a> {
3124 fn sse_psllw(&mut self, op0: Xmm, op1: Imm) {
3125 self.emit(SSE_PSLLWRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3126 }
3127}
3128
3129impl<'a> SsePsllwEmitter<Xmm, Xmm> for Assembler<'a> {
3130 fn sse_psllw(&mut self, op0: Xmm, op1: Xmm) {
3131 self.emit(SSE_PSLLWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3132 }
3133}
3134
3135impl<'a> SsePsllwEmitter<Xmm, Mem> for Assembler<'a> {
3136 fn sse_psllw(&mut self, op0: Xmm, op1: Mem) {
3137 self.emit(SSE_PSLLWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3138 }
3139}
3140
3141/// `SSE_PSRAD` (PSRAD).
3142/// 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.)
3143///
3144///
3145/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
3146///
3147/// Supported operand variants:
3148///
3149/// ```text
3150/// +---+----------+
3151/// | # | Operands |
3152/// +---+----------+
3153/// | 1 | Xmm, Imm |
3154/// | 2 | Xmm, Mem |
3155/// | 3 | Xmm, Xmm |
3156/// +---+----------+
3157/// ```
3158pub trait SsePsradEmitter<A, B> {
3159 fn sse_psrad(&mut self, op0: A, op1: B);
3160}
3161
3162impl<'a> SsePsradEmitter<Xmm, Imm> for Assembler<'a> {
3163 fn sse_psrad(&mut self, op0: Xmm, op1: Imm) {
3164 self.emit(SSE_PSRADRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3165 }
3166}
3167
3168impl<'a> SsePsradEmitter<Xmm, Xmm> for Assembler<'a> {
3169 fn sse_psrad(&mut self, op0: Xmm, op1: Xmm) {
3170 self.emit(SSE_PSRADRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3171 }
3172}
3173
3174impl<'a> SsePsradEmitter<Xmm, Mem> for Assembler<'a> {
3175 fn sse_psrad(&mut self, op0: Xmm, op1: Mem) {
3176 self.emit(SSE_PSRADRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3177 }
3178}
3179
3180/// `SSE_PSRAW` (PSRAW).
3181/// 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.)
3182///
3183///
3184/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
3185///
3186/// Supported operand variants:
3187///
3188/// ```text
3189/// +---+----------+
3190/// | # | Operands |
3191/// +---+----------+
3192/// | 1 | Xmm, Imm |
3193/// | 2 | Xmm, Mem |
3194/// | 3 | Xmm, Xmm |
3195/// +---+----------+
3196/// ```
3197pub trait SsePsrawEmitter<A, B> {
3198 fn sse_psraw(&mut self, op0: A, op1: B);
3199}
3200
3201impl<'a> SsePsrawEmitter<Xmm, Imm> for Assembler<'a> {
3202 fn sse_psraw(&mut self, op0: Xmm, op1: Imm) {
3203 self.emit(SSE_PSRAWRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3204 }
3205}
3206
3207impl<'a> SsePsrawEmitter<Xmm, Xmm> for Assembler<'a> {
3208 fn sse_psraw(&mut self, op0: Xmm, op1: Xmm) {
3209 self.emit(SSE_PSRAWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3210 }
3211}
3212
3213impl<'a> SsePsrawEmitter<Xmm, Mem> for Assembler<'a> {
3214 fn sse_psraw(&mut self, op0: Xmm, op1: Mem) {
3215 self.emit(SSE_PSRAWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3216 }
3217}
3218
3219/// `SSE_PSRLD` (PSRLD).
3220/// 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.
3221///
3222///
3223/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
3224///
3225/// Supported operand variants:
3226///
3227/// ```text
3228/// +---+----------+
3229/// | # | Operands |
3230/// +---+----------+
3231/// | 1 | Xmm, Imm |
3232/// | 2 | Xmm, Mem |
3233/// | 3 | Xmm, Xmm |
3234/// +---+----------+
3235/// ```
3236pub trait SsePsrldEmitter<A, B> {
3237 fn sse_psrld(&mut self, op0: A, op1: B);
3238}
3239
3240impl<'a> SsePsrldEmitter<Xmm, Imm> for Assembler<'a> {
3241 fn sse_psrld(&mut self, op0: Xmm, op1: Imm) {
3242 self.emit(SSE_PSRLDRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3243 }
3244}
3245
3246impl<'a> SsePsrldEmitter<Xmm, Xmm> for Assembler<'a> {
3247 fn sse_psrld(&mut self, op0: Xmm, op1: Xmm) {
3248 self.emit(SSE_PSRLDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3249 }
3250}
3251
3252impl<'a> SsePsrldEmitter<Xmm, Mem> for Assembler<'a> {
3253 fn sse_psrld(&mut self, op0: Xmm, op1: Mem) {
3254 self.emit(SSE_PSRLDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3255 }
3256}
3257
3258/// `SSE_PSRLDQ` (PSRLDQ).
3259/// Shifts the destination operand (first operand) to the right by the number of bytes specified in the count operand (second operand). The empty high-order bytes are cleared (set to all 0s). If the value specified by the count operand is greater than 15, the destination operand is set to all 0s. The count operand is an 8-bit immediate.
3260///
3261///
3262/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLDQ.html).
3263///
3264/// Supported operand variants:
3265///
3266/// ```text
3267/// +---+----------+
3268/// | # | Operands |
3269/// +---+----------+
3270/// | 1 | Xmm, Imm |
3271/// +---+----------+
3272/// ```
3273pub trait SsePsrldqEmitter<A, B> {
3274 fn sse_psrldq(&mut self, op0: A, op1: B);
3275}
3276
3277impl<'a> SsePsrldqEmitter<Xmm, Imm> for Assembler<'a> {
3278 fn sse_psrldq(&mut self, op0: Xmm, op1: Imm) {
3279 self.emit(SSE_PSRLDQRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3280 }
3281}
3282
3283/// `SSE_PSRLQ` (PSRLQ).
3284/// 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.
3285///
3286///
3287/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
3288///
3289/// Supported operand variants:
3290///
3291/// ```text
3292/// +---+----------+
3293/// | # | Operands |
3294/// +---+----------+
3295/// | 1 | Xmm, Imm |
3296/// | 2 | Xmm, Mem |
3297/// | 3 | Xmm, Xmm |
3298/// +---+----------+
3299/// ```
3300pub trait SsePsrlqEmitter<A, B> {
3301 fn sse_psrlq(&mut self, op0: A, op1: B);
3302}
3303
3304impl<'a> SsePsrlqEmitter<Xmm, Imm> for Assembler<'a> {
3305 fn sse_psrlq(&mut self, op0: Xmm, op1: Imm) {
3306 self.emit(SSE_PSRLQRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3307 }
3308}
3309
3310impl<'a> SsePsrlqEmitter<Xmm, Xmm> for Assembler<'a> {
3311 fn sse_psrlq(&mut self, op0: Xmm, op1: Xmm) {
3312 self.emit(SSE_PSRLQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3313 }
3314}
3315
3316impl<'a> SsePsrlqEmitter<Xmm, Mem> for Assembler<'a> {
3317 fn sse_psrlq(&mut self, op0: Xmm, op1: Mem) {
3318 self.emit(SSE_PSRLQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3319 }
3320}
3321
3322/// `SSE_PSRLW` (PSRLW).
3323/// 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.
3324///
3325///
3326/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
3327///
3328/// Supported operand variants:
3329///
3330/// ```text
3331/// +---+----------+
3332/// | # | Operands |
3333/// +---+----------+
3334/// | 1 | Xmm, Imm |
3335/// | 2 | Xmm, Mem |
3336/// | 3 | Xmm, Xmm |
3337/// +---+----------+
3338/// ```
3339pub trait SsePsrlwEmitter<A, B> {
3340 fn sse_psrlw(&mut self, op0: A, op1: B);
3341}
3342
3343impl<'a> SsePsrlwEmitter<Xmm, Imm> for Assembler<'a> {
3344 fn sse_psrlw(&mut self, op0: Xmm, op1: Imm) {
3345 self.emit(SSE_PSRLWRI, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3346 }
3347}
3348
3349impl<'a> SsePsrlwEmitter<Xmm, Xmm> for Assembler<'a> {
3350 fn sse_psrlw(&mut self, op0: Xmm, op1: Xmm) {
3351 self.emit(SSE_PSRLWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3352 }
3353}
3354
3355impl<'a> SsePsrlwEmitter<Xmm, Mem> for Assembler<'a> {
3356 fn sse_psrlw(&mut self, op0: Xmm, op1: Mem) {
3357 self.emit(SSE_PSRLWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3358 }
3359}
3360
3361/// `SSE_PSUBB` (PSUBB).
3362/// 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.
3363///
3364///
3365/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
3366///
3367/// Supported operand variants:
3368///
3369/// ```text
3370/// +---+----------+
3371/// | # | Operands |
3372/// +---+----------+
3373/// | 1 | Xmm, Mem |
3374/// | 2 | Xmm, Xmm |
3375/// +---+----------+
3376/// ```
3377pub trait SsePsubbEmitter<A, B> {
3378 fn sse_psubb(&mut self, op0: A, op1: B);
3379}
3380
3381impl<'a> SsePsubbEmitter<Xmm, Xmm> for Assembler<'a> {
3382 fn sse_psubb(&mut self, op0: Xmm, op1: Xmm) {
3383 self.emit(SSE_PSUBBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3384 }
3385}
3386
3387impl<'a> SsePsubbEmitter<Xmm, Mem> for Assembler<'a> {
3388 fn sse_psubb(&mut self, op0: Xmm, op1: Mem) {
3389 self.emit(SSE_PSUBBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3390 }
3391}
3392
3393/// `SSE_PSUBD` (PSUBD).
3394/// 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.
3395///
3396///
3397/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
3398///
3399/// Supported operand variants:
3400///
3401/// ```text
3402/// +---+----------+
3403/// | # | Operands |
3404/// +---+----------+
3405/// | 1 | Xmm, Mem |
3406/// | 2 | Xmm, Xmm |
3407/// +---+----------+
3408/// ```
3409pub trait SsePsubdEmitter<A, B> {
3410 fn sse_psubd(&mut self, op0: A, op1: B);
3411}
3412
3413impl<'a> SsePsubdEmitter<Xmm, Xmm> for Assembler<'a> {
3414 fn sse_psubd(&mut self, op0: Xmm, op1: Xmm) {
3415 self.emit(SSE_PSUBDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3416 }
3417}
3418
3419impl<'a> SsePsubdEmitter<Xmm, Mem> for Assembler<'a> {
3420 fn sse_psubd(&mut self, op0: Xmm, op1: Mem) {
3421 self.emit(SSE_PSUBDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3422 }
3423}
3424
3425/// `SSE_PSUBQ` (PSUBQ).
3426/// 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).
3427///
3428///
3429/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBQ.html).
3430///
3431/// Supported operand variants:
3432///
3433/// ```text
3434/// +---+----------+
3435/// | # | Operands |
3436/// +---+----------+
3437/// | 1 | Xmm, Mem |
3438/// | 2 | Xmm, Xmm |
3439/// +---+----------+
3440/// ```
3441pub trait SsePsubqEmitter<A, B> {
3442 fn sse_psubq(&mut self, op0: A, op1: B);
3443}
3444
3445impl<'a> SsePsubqEmitter<Xmm, Xmm> for Assembler<'a> {
3446 fn sse_psubq(&mut self, op0: Xmm, op1: Xmm) {
3447 self.emit(SSE_PSUBQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3448 }
3449}
3450
3451impl<'a> SsePsubqEmitter<Xmm, Mem> for Assembler<'a> {
3452 fn sse_psubq(&mut self, op0: Xmm, op1: Mem) {
3453 self.emit(SSE_PSUBQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3454 }
3455}
3456
3457/// `SSE_PSUBSB` (PSUBSB).
3458/// 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.
3459///
3460///
3461/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
3462///
3463/// Supported operand variants:
3464///
3465/// ```text
3466/// +---+----------+
3467/// | # | Operands |
3468/// +---+----------+
3469/// | 1 | Xmm, Mem |
3470/// | 2 | Xmm, Xmm |
3471/// +---+----------+
3472/// ```
3473pub trait SsePsubsbEmitter<A, B> {
3474 fn sse_psubsb(&mut self, op0: A, op1: B);
3475}
3476
3477impl<'a> SsePsubsbEmitter<Xmm, Xmm> for Assembler<'a> {
3478 fn sse_psubsb(&mut self, op0: Xmm, op1: Xmm) {
3479 self.emit(SSE_PSUBSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3480 }
3481}
3482
3483impl<'a> SsePsubsbEmitter<Xmm, Mem> for Assembler<'a> {
3484 fn sse_psubsb(&mut self, op0: Xmm, op1: Mem) {
3485 self.emit(SSE_PSUBSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3486 }
3487}
3488
3489/// `SSE_PSUBSW` (PSUBSW).
3490/// 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.
3491///
3492///
3493/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
3494///
3495/// Supported operand variants:
3496///
3497/// ```text
3498/// +---+----------+
3499/// | # | Operands |
3500/// +---+----------+
3501/// | 1 | Xmm, Mem |
3502/// | 2 | Xmm, Xmm |
3503/// +---+----------+
3504/// ```
3505pub trait SsePsubswEmitter<A, B> {
3506 fn sse_psubsw(&mut self, op0: A, op1: B);
3507}
3508
3509impl<'a> SsePsubswEmitter<Xmm, Xmm> for Assembler<'a> {
3510 fn sse_psubsw(&mut self, op0: Xmm, op1: Xmm) {
3511 self.emit(SSE_PSUBSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3512 }
3513}
3514
3515impl<'a> SsePsubswEmitter<Xmm, Mem> for Assembler<'a> {
3516 fn sse_psubsw(&mut self, op0: Xmm, op1: Mem) {
3517 self.emit(SSE_PSUBSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3518 }
3519}
3520
3521/// `SSE_PSUBUSB` (PSUBUSB).
3522/// 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.
3523///
3524///
3525/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
3526///
3527/// Supported operand variants:
3528///
3529/// ```text
3530/// +---+----------+
3531/// | # | Operands |
3532/// +---+----------+
3533/// | 1 | Xmm, Mem |
3534/// | 2 | Xmm, Xmm |
3535/// +---+----------+
3536/// ```
3537pub trait SsePsubusbEmitter<A, B> {
3538 fn sse_psubusb(&mut self, op0: A, op1: B);
3539}
3540
3541impl<'a> SsePsubusbEmitter<Xmm, Xmm> for Assembler<'a> {
3542 fn sse_psubusb(&mut self, op0: Xmm, op1: Xmm) {
3543 self.emit(SSE_PSUBUSBRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3544 }
3545}
3546
3547impl<'a> SsePsubusbEmitter<Xmm, Mem> for Assembler<'a> {
3548 fn sse_psubusb(&mut self, op0: Xmm, op1: Mem) {
3549 self.emit(SSE_PSUBUSBRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3550 }
3551}
3552
3553/// `SSE_PSUBUSW` (PSUBUSW).
3554/// 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.
3555///
3556///
3557/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
3558///
3559/// Supported operand variants:
3560///
3561/// ```text
3562/// +---+----------+
3563/// | # | Operands |
3564/// +---+----------+
3565/// | 1 | Xmm, Mem |
3566/// | 2 | Xmm, Xmm |
3567/// +---+----------+
3568/// ```
3569pub trait SsePsubuswEmitter<A, B> {
3570 fn sse_psubusw(&mut self, op0: A, op1: B);
3571}
3572
3573impl<'a> SsePsubuswEmitter<Xmm, Xmm> for Assembler<'a> {
3574 fn sse_psubusw(&mut self, op0: Xmm, op1: Xmm) {
3575 self.emit(SSE_PSUBUSWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3576 }
3577}
3578
3579impl<'a> SsePsubuswEmitter<Xmm, Mem> for Assembler<'a> {
3580 fn sse_psubusw(&mut self, op0: Xmm, op1: Mem) {
3581 self.emit(SSE_PSUBUSWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3582 }
3583}
3584
3585/// `SSE_PSUBW` (PSUBW).
3586/// 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.
3587///
3588///
3589/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
3590///
3591/// Supported operand variants:
3592///
3593/// ```text
3594/// +---+----------+
3595/// | # | Operands |
3596/// +---+----------+
3597/// | 1 | Xmm, Mem |
3598/// | 2 | Xmm, Xmm |
3599/// +---+----------+
3600/// ```
3601pub trait SsePsubwEmitter<A, B> {
3602 fn sse_psubw(&mut self, op0: A, op1: B);
3603}
3604
3605impl<'a> SsePsubwEmitter<Xmm, Xmm> for Assembler<'a> {
3606 fn sse_psubw(&mut self, op0: Xmm, op1: Xmm) {
3607 self.emit(SSE_PSUBWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3608 }
3609}
3610
3611impl<'a> SsePsubwEmitter<Xmm, Mem> for Assembler<'a> {
3612 fn sse_psubw(&mut self, op0: Xmm, op1: Mem) {
3613 self.emit(SSE_PSUBWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3614 }
3615}
3616
3617/// `SSE_PUNPCKHBW` (PUNPCKHBW).
3618/// 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.
3619///
3620///
3621/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
3622///
3623/// Supported operand variants:
3624///
3625/// ```text
3626/// +---+----------+
3627/// | # | Operands |
3628/// +---+----------+
3629/// | 1 | Xmm, Mem |
3630/// | 2 | Xmm, Xmm |
3631/// +---+----------+
3632/// ```
3633pub trait SsePunpckhbwEmitter<A, B> {
3634 fn sse_punpckhbw(&mut self, op0: A, op1: B);
3635}
3636
3637impl<'a> SsePunpckhbwEmitter<Xmm, Xmm> for Assembler<'a> {
3638 fn sse_punpckhbw(&mut self, op0: Xmm, op1: Xmm) {
3639 self.emit(SSE_PUNPCKHBWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3640 }
3641}
3642
3643impl<'a> SsePunpckhbwEmitter<Xmm, Mem> for Assembler<'a> {
3644 fn sse_punpckhbw(&mut self, op0: Xmm, op1: Mem) {
3645 self.emit(SSE_PUNPCKHBWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3646 }
3647}
3648
3649/// `SSE_PUNPCKHDQ` (PUNPCKHDQ).
3650/// 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.
3651///
3652///
3653/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
3654///
3655/// Supported operand variants:
3656///
3657/// ```text
3658/// +---+----------+
3659/// | # | Operands |
3660/// +---+----------+
3661/// | 1 | Xmm, Mem |
3662/// | 2 | Xmm, Xmm |
3663/// +---+----------+
3664/// ```
3665pub trait SsePunpckhdqEmitter<A, B> {
3666 fn sse_punpckhdq(&mut self, op0: A, op1: B);
3667}
3668
3669impl<'a> SsePunpckhdqEmitter<Xmm, Xmm> for Assembler<'a> {
3670 fn sse_punpckhdq(&mut self, op0: Xmm, op1: Xmm) {
3671 self.emit(SSE_PUNPCKHDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3672 }
3673}
3674
3675impl<'a> SsePunpckhdqEmitter<Xmm, Mem> for Assembler<'a> {
3676 fn sse_punpckhdq(&mut self, op0: Xmm, op1: Mem) {
3677 self.emit(SSE_PUNPCKHDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3678 }
3679}
3680
3681/// `SSE_PUNPCKHQDQ` (PUNPCKHQDQ).
3682/// 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.
3683///
3684///
3685/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
3686///
3687/// Supported operand variants:
3688///
3689/// ```text
3690/// +---+----------+
3691/// | # | Operands |
3692/// +---+----------+
3693/// | 1 | Xmm, Mem |
3694/// | 2 | Xmm, Xmm |
3695/// +---+----------+
3696/// ```
3697pub trait SsePunpckhqdqEmitter<A, B> {
3698 fn sse_punpckhqdq(&mut self, op0: A, op1: B);
3699}
3700
3701impl<'a> SsePunpckhqdqEmitter<Xmm, Xmm> for Assembler<'a> {
3702 fn sse_punpckhqdq(&mut self, op0: Xmm, op1: Xmm) {
3703 self.emit(SSE_PUNPCKHQDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3704 }
3705}
3706
3707impl<'a> SsePunpckhqdqEmitter<Xmm, Mem> for Assembler<'a> {
3708 fn sse_punpckhqdq(&mut self, op0: Xmm, op1: Mem) {
3709 self.emit(SSE_PUNPCKHQDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3710 }
3711}
3712
3713/// `SSE_PUNPCKHWD` (PUNPCKHWD).
3714/// 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.
3715///
3716///
3717/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
3718///
3719/// Supported operand variants:
3720///
3721/// ```text
3722/// +---+----------+
3723/// | # | Operands |
3724/// +---+----------+
3725/// | 1 | Xmm, Mem |
3726/// | 2 | Xmm, Xmm |
3727/// +---+----------+
3728/// ```
3729pub trait SsePunpckhwdEmitter<A, B> {
3730 fn sse_punpckhwd(&mut self, op0: A, op1: B);
3731}
3732
3733impl<'a> SsePunpckhwdEmitter<Xmm, Xmm> for Assembler<'a> {
3734 fn sse_punpckhwd(&mut self, op0: Xmm, op1: Xmm) {
3735 self.emit(SSE_PUNPCKHWDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3736 }
3737}
3738
3739impl<'a> SsePunpckhwdEmitter<Xmm, Mem> for Assembler<'a> {
3740 fn sse_punpckhwd(&mut self, op0: Xmm, op1: Mem) {
3741 self.emit(SSE_PUNPCKHWDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3742 }
3743}
3744
3745/// `SSE_PUNPCKLBW` (PUNPCKLBW).
3746/// 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.
3747///
3748///
3749/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
3750///
3751/// Supported operand variants:
3752///
3753/// ```text
3754/// +---+----------+
3755/// | # | Operands |
3756/// +---+----------+
3757/// | 1 | Xmm, Mem |
3758/// | 2 | Xmm, Xmm |
3759/// +---+----------+
3760/// ```
3761pub trait SsePunpcklbwEmitter<A, B> {
3762 fn sse_punpcklbw(&mut self, op0: A, op1: B);
3763}
3764
3765impl<'a> SsePunpcklbwEmitter<Xmm, Xmm> for Assembler<'a> {
3766 fn sse_punpcklbw(&mut self, op0: Xmm, op1: Xmm) {
3767 self.emit(SSE_PUNPCKLBWRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3768 }
3769}
3770
3771impl<'a> SsePunpcklbwEmitter<Xmm, Mem> for Assembler<'a> {
3772 fn sse_punpcklbw(&mut self, op0: Xmm, op1: Mem) {
3773 self.emit(SSE_PUNPCKLBWRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3774 }
3775}
3776
3777/// `SSE_PUNPCKLDQ` (PUNPCKLDQ).
3778/// 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.
3779///
3780///
3781/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
3782///
3783/// Supported operand variants:
3784///
3785/// ```text
3786/// +---+----------+
3787/// | # | Operands |
3788/// +---+----------+
3789/// | 1 | Xmm, Mem |
3790/// | 2 | Xmm, Xmm |
3791/// +---+----------+
3792/// ```
3793pub trait SsePunpckldqEmitter<A, B> {
3794 fn sse_punpckldq(&mut self, op0: A, op1: B);
3795}
3796
3797impl<'a> SsePunpckldqEmitter<Xmm, Xmm> for Assembler<'a> {
3798 fn sse_punpckldq(&mut self, op0: Xmm, op1: Xmm) {
3799 self.emit(SSE_PUNPCKLDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3800 }
3801}
3802
3803impl<'a> SsePunpckldqEmitter<Xmm, Mem> for Assembler<'a> {
3804 fn sse_punpckldq(&mut self, op0: Xmm, op1: Mem) {
3805 self.emit(SSE_PUNPCKLDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3806 }
3807}
3808
3809/// `SSE_PUNPCKLQDQ` (PUNPCKLQDQ).
3810/// 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.
3811///
3812///
3813/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
3814///
3815/// Supported operand variants:
3816///
3817/// ```text
3818/// +---+----------+
3819/// | # | Operands |
3820/// +---+----------+
3821/// | 1 | Xmm, Mem |
3822/// | 2 | Xmm, Xmm |
3823/// +---+----------+
3824/// ```
3825pub trait SsePunpcklqdqEmitter<A, B> {
3826 fn sse_punpcklqdq(&mut self, op0: A, op1: B);
3827}
3828
3829impl<'a> SsePunpcklqdqEmitter<Xmm, Xmm> for Assembler<'a> {
3830 fn sse_punpcklqdq(&mut self, op0: Xmm, op1: Xmm) {
3831 self.emit(SSE_PUNPCKLQDQRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3832 }
3833}
3834
3835impl<'a> SsePunpcklqdqEmitter<Xmm, Mem> for Assembler<'a> {
3836 fn sse_punpcklqdq(&mut self, op0: Xmm, op1: Mem) {
3837 self.emit(SSE_PUNPCKLQDQRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3838 }
3839}
3840
3841/// `SSE_PUNPCKLWD` (PUNPCKLWD).
3842/// 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.
3843///
3844///
3845/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
3846///
3847/// Supported operand variants:
3848///
3849/// ```text
3850/// +---+----------+
3851/// | # | Operands |
3852/// +---+----------+
3853/// | 1 | Xmm, Mem |
3854/// | 2 | Xmm, Xmm |
3855/// +---+----------+
3856/// ```
3857pub trait SsePunpcklwdEmitter<A, B> {
3858 fn sse_punpcklwd(&mut self, op0: A, op1: B);
3859}
3860
3861impl<'a> SsePunpcklwdEmitter<Xmm, Xmm> for Assembler<'a> {
3862 fn sse_punpcklwd(&mut self, op0: Xmm, op1: Xmm) {
3863 self.emit(SSE_PUNPCKLWDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3864 }
3865}
3866
3867impl<'a> SsePunpcklwdEmitter<Xmm, Mem> for Assembler<'a> {
3868 fn sse_punpcklwd(&mut self, op0: Xmm, op1: Mem) {
3869 self.emit(SSE_PUNPCKLWDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3870 }
3871}
3872
3873/// `SSE_PXOR` (PXOR).
3874/// 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.
3875///
3876///
3877/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PXOR.html).
3878///
3879/// Supported operand variants:
3880///
3881/// ```text
3882/// +---+----------+
3883/// | # | Operands |
3884/// +---+----------+
3885/// | 1 | Xmm, Mem |
3886/// | 2 | Xmm, Xmm |
3887/// +---+----------+
3888/// ```
3889pub trait SsePxorEmitter<A, B> {
3890 fn sse_pxor(&mut self, op0: A, op1: B);
3891}
3892
3893impl<'a> SsePxorEmitter<Xmm, Xmm> for Assembler<'a> {
3894 fn sse_pxor(&mut self, op0: Xmm, op1: Xmm) {
3895 self.emit(SSE_PXORRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3896 }
3897}
3898
3899impl<'a> SsePxorEmitter<Xmm, Mem> for Assembler<'a> {
3900 fn sse_pxor(&mut self, op0: Xmm, op1: Mem) {
3901 self.emit(SSE_PXORRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3902 }
3903}
3904
3905/// `SSE_SHUFPD` (SHUFPD).
3906/// Selects a double precision floating-point value of an input pair using a bit control and move to a designated element of the destination operand. The low-to-high order of double precision element of the destination operand is interleaved between the first source operand and the second source operand at the granularity of input pair of 128 bits. Each bit in the imm8 byte, starting from bit 0, is the select control of the corresponding element of the destination to received the shuffled result of an input pair.
3907///
3908///
3909/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SHUFPD.html).
3910///
3911/// Supported operand variants:
3912///
3913/// ```text
3914/// +---+---------------+
3915/// | # | Operands |
3916/// +---+---------------+
3917/// | 1 | Xmm, Mem, Imm |
3918/// | 2 | Xmm, Xmm, Imm |
3919/// +---+---------------+
3920/// ```
3921pub trait SseShufpdEmitter<A, B, C> {
3922 fn sse_shufpd(&mut self, op0: A, op1: B, op2: C);
3923}
3924
3925impl<'a> SseShufpdEmitter<Xmm, Xmm, Imm> for Assembler<'a> {
3926 fn sse_shufpd(&mut self, op0: Xmm, op1: Xmm, op2: Imm) {
3927 self.emit(SSE_SHUFPDRRI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
3928 }
3929}
3930
3931impl<'a> SseShufpdEmitter<Xmm, Mem, Imm> for Assembler<'a> {
3932 fn sse_shufpd(&mut self, op0: Xmm, op1: Mem, op2: Imm) {
3933 self.emit(SSE_SHUFPDRMI, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
3934 }
3935}
3936
3937/// `SSE_SQRTPD` (SQRTPD).
3938/// Performs a SIMD computation of the square roots of the two, four or eight packed double precision floating-point values in the source operand (the second operand) stores the packed double precision floating-point results in the destination operand (the first operand).
3939///
3940///
3941/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SQRTPD.html).
3942///
3943/// Supported operand variants:
3944///
3945/// ```text
3946/// +---+----------+
3947/// | # | Operands |
3948/// +---+----------+
3949/// | 1 | Xmm, Mem |
3950/// | 2 | Xmm, Xmm |
3951/// +---+----------+
3952/// ```
3953pub trait SseSqrtpdEmitter<A, B> {
3954 fn sse_sqrtpd(&mut self, op0: A, op1: B);
3955}
3956
3957impl<'a> SseSqrtpdEmitter<Xmm, Xmm> for Assembler<'a> {
3958 fn sse_sqrtpd(&mut self, op0: Xmm, op1: Xmm) {
3959 self.emit(SSE_SQRTPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3960 }
3961}
3962
3963impl<'a> SseSqrtpdEmitter<Xmm, Mem> for Assembler<'a> {
3964 fn sse_sqrtpd(&mut self, op0: Xmm, op1: Mem) {
3965 self.emit(SSE_SQRTPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3966 }
3967}
3968
3969/// `SSE_SQRTSD` (SQRTSD).
3970/// Computes the square root of the low double precision floating-point value in the second source operand and stores the double precision floating-point result in the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source and destination operands are XMM registers.
3971///
3972///
3973/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SQRTSD.html).
3974///
3975/// Supported operand variants:
3976///
3977/// ```text
3978/// +---+----------+
3979/// | # | Operands |
3980/// +---+----------+
3981/// | 1 | Xmm, Mem |
3982/// | 2 | Xmm, Xmm |
3983/// +---+----------+
3984/// ```
3985pub trait SseSqrtsdEmitter<A, B> {
3986 fn sse_sqrtsd(&mut self, op0: A, op1: B);
3987}
3988
3989impl<'a> SseSqrtsdEmitter<Xmm, Xmm> for Assembler<'a> {
3990 fn sse_sqrtsd(&mut self, op0: Xmm, op1: Xmm) {
3991 self.emit(SSE_SQRTSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3992 }
3993}
3994
3995impl<'a> SseSqrtsdEmitter<Xmm, Mem> for Assembler<'a> {
3996 fn sse_sqrtsd(&mut self, op0: Xmm, op1: Mem) {
3997 self.emit(SSE_SQRTSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
3998 }
3999}
4000
4001/// `SSE_SUBPD` (SUBPD).
4002/// Performs a SIMD subtract of the two, four or eight packed double precision floating-point values of the second Source operand from the first Source operand, and stores the packed double precision floating-point results in the destination operand.
4003///
4004///
4005/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SUBPD.html).
4006///
4007/// Supported operand variants:
4008///
4009/// ```text
4010/// +---+----------+
4011/// | # | Operands |
4012/// +---+----------+
4013/// | 1 | Xmm, Mem |
4014/// | 2 | Xmm, Xmm |
4015/// +---+----------+
4016/// ```
4017pub trait SseSubpdEmitter<A, B> {
4018 fn sse_subpd(&mut self, op0: A, op1: B);
4019}
4020
4021impl<'a> SseSubpdEmitter<Xmm, Xmm> for Assembler<'a> {
4022 fn sse_subpd(&mut self, op0: Xmm, op1: Xmm) {
4023 self.emit(SSE_SUBPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4024 }
4025}
4026
4027impl<'a> SseSubpdEmitter<Xmm, Mem> for Assembler<'a> {
4028 fn sse_subpd(&mut self, op0: Xmm, op1: Mem) {
4029 self.emit(SSE_SUBPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4030 }
4031}
4032
4033/// `SSE_SUBSD` (SUBSD).
4034/// Subtract the low double precision floating-point value in the second source operand from the first source operand and stores the double precision floating-point result in the low quadword of the destination operand.
4035///
4036///
4037/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SUBSD.html).
4038///
4039/// Supported operand variants:
4040///
4041/// ```text
4042/// +---+----------+
4043/// | # | Operands |
4044/// +---+----------+
4045/// | 1 | Xmm, Mem |
4046/// | 2 | Xmm, Xmm |
4047/// +---+----------+
4048/// ```
4049pub trait SseSubsdEmitter<A, B> {
4050 fn sse_subsd(&mut self, op0: A, op1: B);
4051}
4052
4053impl<'a> SseSubsdEmitter<Xmm, Xmm> for Assembler<'a> {
4054 fn sse_subsd(&mut self, op0: Xmm, op1: Xmm) {
4055 self.emit(SSE_SUBSDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4056 }
4057}
4058
4059impl<'a> SseSubsdEmitter<Xmm, Mem> for Assembler<'a> {
4060 fn sse_subsd(&mut self, op0: Xmm, op1: Mem) {
4061 self.emit(SSE_SUBSDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4062 }
4063}
4064
4065/// `SSE_UCOMISD` (UCOMISD).
4066/// Performs an unordered compare of the double precision floating-point values in the low quadwords of operand 1 (first operand) and operand 2 (second operand), and sets the ZF, PF, and CF flags in the EFLAGS register according to the result (unordered, greater than, less than, or equal). The OF, SF, and AF flags in the EFLAGS register are set to 0. The unordered result is returned if either source operand is a NaN (QNaN or SNaN).
4067///
4068///
4069/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/UCOMISD.html).
4070///
4071/// Supported operand variants:
4072///
4073/// ```text
4074/// +---+----------+
4075/// | # | Operands |
4076/// +---+----------+
4077/// | 1 | Xmm, Mem |
4078/// | 2 | Xmm, Xmm |
4079/// +---+----------+
4080/// ```
4081pub trait SseUcomisdEmitter<A, B> {
4082 fn sse_ucomisd(&mut self, op0: A, op1: B);
4083}
4084
4085impl<'a> SseUcomisdEmitter<Xmm, Xmm> for Assembler<'a> {
4086 fn sse_ucomisd(&mut self, op0: Xmm, op1: Xmm) {
4087 self.emit(SSE_UCOMISDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4088 }
4089}
4090
4091impl<'a> SseUcomisdEmitter<Xmm, Mem> for Assembler<'a> {
4092 fn sse_ucomisd(&mut self, op0: Xmm, op1: Mem) {
4093 self.emit(SSE_UCOMISDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4094 }
4095}
4096
4097/// `SSE_UNPCKHPD` (UNPCKHPD).
4098/// Performs an interleaved unpack of the high double precision floating-point values from the first source operand and the second source operand. See Figure 4-15 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2B.
4099///
4100///
4101/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/UNPCKHPD.html).
4102///
4103/// Supported operand variants:
4104///
4105/// ```text
4106/// +---+----------+
4107/// | # | Operands |
4108/// +---+----------+
4109/// | 1 | Xmm, Mem |
4110/// | 2 | Xmm, Xmm |
4111/// +---+----------+
4112/// ```
4113pub trait SseUnpckhpdEmitter<A, B> {
4114 fn sse_unpckhpd(&mut self, op0: A, op1: B);
4115}
4116
4117impl<'a> SseUnpckhpdEmitter<Xmm, Xmm> for Assembler<'a> {
4118 fn sse_unpckhpd(&mut self, op0: Xmm, op1: Xmm) {
4119 self.emit(SSE_UNPCKHPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4120 }
4121}
4122
4123impl<'a> SseUnpckhpdEmitter<Xmm, Mem> for Assembler<'a> {
4124 fn sse_unpckhpd(&mut self, op0: Xmm, op1: Mem) {
4125 self.emit(SSE_UNPCKHPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4126 }
4127}
4128
4129/// `SSE_UNPCKLPD` (UNPCKLPD).
4130/// Performs an interleaved unpack of the low double precision floating-point values from the first source operand and the second source operand.
4131///
4132///
4133/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/UNPCKLPD.html).
4134///
4135/// Supported operand variants:
4136///
4137/// ```text
4138/// +---+----------+
4139/// | # | Operands |
4140/// +---+----------+
4141/// | 1 | Xmm, Mem |
4142/// | 2 | Xmm, Xmm |
4143/// +---+----------+
4144/// ```
4145pub trait SseUnpcklpdEmitter<A, B> {
4146 fn sse_unpcklpd(&mut self, op0: A, op1: B);
4147}
4148
4149impl<'a> SseUnpcklpdEmitter<Xmm, Xmm> for Assembler<'a> {
4150 fn sse_unpcklpd(&mut self, op0: Xmm, op1: Xmm) {
4151 self.emit(SSE_UNPCKLPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4152 }
4153}
4154
4155impl<'a> SseUnpcklpdEmitter<Xmm, Mem> for Assembler<'a> {
4156 fn sse_unpcklpd(&mut self, op0: Xmm, op1: Mem) {
4157 self.emit(SSE_UNPCKLPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4158 }
4159}
4160
4161/// `SSE_XORPD` (XORPD).
4162/// Performs a bitwise logical XOR of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
4163///
4164///
4165/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/XORPD.html).
4166///
4167/// Supported operand variants:
4168///
4169/// ```text
4170/// +---+----------+
4171/// | # | Operands |
4172/// +---+----------+
4173/// | 1 | Xmm, Mem |
4174/// | 2 | Xmm, Xmm |
4175/// +---+----------+
4176/// ```
4177pub trait SseXorpdEmitter<A, B> {
4178 fn sse_xorpd(&mut self, op0: A, op1: B);
4179}
4180
4181impl<'a> SseXorpdEmitter<Xmm, Xmm> for Assembler<'a> {
4182 fn sse_xorpd(&mut self, op0: Xmm, op1: Xmm) {
4183 self.emit(SSE_XORPDRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4184 }
4185}
4186
4187impl<'a> SseXorpdEmitter<Xmm, Mem> for Assembler<'a> {
4188 fn sse_xorpd(&mut self, op0: Xmm, op1: Mem) {
4189 self.emit(SSE_XORPDRM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
4190 }
4191}
4192
4193
4194impl<'a> Assembler<'a> {
4195 /// `LFENCE` (LFENCE).
4196 /// Performs a serializing operation on all load-from-memory instructions that were issued prior the LFENCE instruction. Specifically, LFENCE does not execute until all prior instructions have completed locally, and no later instruction begins execution until LFENCE completes. In particular, an instruction that loads from memory and that precedes an LFENCE receives data from memory prior to completion of the LFENCE. (An LFENCE that follows an instruction that stores to memory might complete before the data being stored have become globally visible.) Instructions following an LFENCE may be fetched from memory before the LFENCE, but they will not execute (even speculatively) until the LFENCE completes.
4197 ///
4198 ///
4199 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/LFENCE.html).
4200 ///
4201 /// Supported operand variants:
4202 ///
4203 /// ```text
4204 /// +---+----------+
4205 /// | # | Operands |
4206 /// +---+----------+
4207 /// | 1 | (none) |
4208 /// +---+----------+
4209 /// ```
4210 #[inline]
4211 pub fn lfence(&mut self)
4212 where Assembler<'a>: LfenceEmitter {
4213 <Self as LfenceEmitter>::lfence(self);
4214 }
4215 /// `MFENCE`.
4216 ///
4217 /// Supported operand variants:
4218 ///
4219 /// ```text
4220 /// +---+----------+
4221 /// | # | Operands |
4222 /// +---+----------+
4223 /// | 1 | (none) |
4224 /// +---+----------+
4225 /// ```
4226 #[inline]
4227 pub fn mfence(&mut self)
4228 where Assembler<'a>: MfenceEmitter {
4229 <Self as MfenceEmitter>::mfence(self);
4230 }
4231 /// `MMX_CVTPD2PI` (CVTPD2PI).
4232 /// Converts two packed double precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand).
4233 ///
4234 ///
4235 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPD2PI.html).
4236 ///
4237 /// Supported operand variants:
4238 ///
4239 /// ```text
4240 /// +---+----------+
4241 /// | # | Operands |
4242 /// +---+----------+
4243 /// | 1 | Mm, Mem |
4244 /// | 2 | Mm, Xmm |
4245 /// +---+----------+
4246 /// ```
4247 #[inline]
4248 pub fn mmx_cvtpd2pi<A, B>(&mut self, op0: A, op1: B)
4249 where Assembler<'a>: MmxCvtpd2piEmitter<A, B> {
4250 <Self as MmxCvtpd2piEmitter<A, B>>::mmx_cvtpd2pi(self, op0, op1);
4251 }
4252 /// `MMX_CVTPI2PD` (CVTPI2PD).
4253 /// Converts two packed signed doubleword integers in the source operand (second operand) to two packed double precision floating-point values in the destination operand (first operand).
4254 ///
4255 ///
4256 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPI2PD.html).
4257 ///
4258 /// Supported operand variants:
4259 ///
4260 /// ```text
4261 /// +---+----------+
4262 /// | # | Operands |
4263 /// +---+----------+
4264 /// | 1 | Xmm, Mem |
4265 /// | 2 | Xmm, Mm |
4266 /// +---+----------+
4267 /// ```
4268 #[inline]
4269 pub fn mmx_cvtpi2pd<A, B>(&mut self, op0: A, op1: B)
4270 where Assembler<'a>: MmxCvtpi2pdEmitter<A, B> {
4271 <Self as MmxCvtpi2pdEmitter<A, B>>::mmx_cvtpi2pd(self, op0, op1);
4272 }
4273 /// `MMX_CVTPI2PS` (CVTPI2PS).
4274 /// Converts two packed signed doubleword integers in the source operand (second operand) to two packed single precision floating-point values in the destination operand (first operand).
4275 ///
4276 ///
4277 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPI2PS.html).
4278 ///
4279 /// Supported operand variants:
4280 ///
4281 /// ```text
4282 /// +---+----------+
4283 /// | # | Operands |
4284 /// +---+----------+
4285 /// | 1 | Xmm, Mem |
4286 /// | 2 | Xmm, Mm |
4287 /// +---+----------+
4288 /// ```
4289 #[inline]
4290 pub fn mmx_cvtpi2ps<A, B>(&mut self, op0: A, op1: B)
4291 where Assembler<'a>: MmxCvtpi2psEmitter<A, B> {
4292 <Self as MmxCvtpi2psEmitter<A, B>>::mmx_cvtpi2ps(self, op0, op1);
4293 }
4294 /// `MMX_CVTPS2PI` (CVTPS2PI).
4295 /// Converts two packed single precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand).
4296 ///
4297 ///
4298 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPS2PI.html).
4299 ///
4300 /// Supported operand variants:
4301 ///
4302 /// ```text
4303 /// +---+----------+
4304 /// | # | Operands |
4305 /// +---+----------+
4306 /// | 1 | Mm, Mem |
4307 /// | 2 | Mm, Xmm |
4308 /// +---+----------+
4309 /// ```
4310 #[inline]
4311 pub fn mmx_cvtps2pi<A, B>(&mut self, op0: A, op1: B)
4312 where Assembler<'a>: MmxCvtps2piEmitter<A, B> {
4313 <Self as MmxCvtps2piEmitter<A, B>>::mmx_cvtps2pi(self, op0, op1);
4314 }
4315 /// `MMX_CVTTPD2PI` (CVTTPD2PI).
4316 /// Converts two packed double precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand). The source operand can be an XMM register or a 128-bit memory location. The destination operand is an MMX technology register.
4317 ///
4318 ///
4319 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPD2PI.html).
4320 ///
4321 /// Supported operand variants:
4322 ///
4323 /// ```text
4324 /// +---+----------+
4325 /// | # | Operands |
4326 /// +---+----------+
4327 /// | 1 | Mm, Mem |
4328 /// | 2 | Mm, Xmm |
4329 /// +---+----------+
4330 /// ```
4331 #[inline]
4332 pub fn mmx_cvttpd2pi<A, B>(&mut self, op0: A, op1: B)
4333 where Assembler<'a>: MmxCvttpd2piEmitter<A, B> {
4334 <Self as MmxCvttpd2piEmitter<A, B>>::mmx_cvttpd2pi(self, op0, op1);
4335 }
4336 /// `MMX_CVTTPS2PI` (CVTTPS2PI).
4337 /// Converts two packed single precision floating-point values in the source operand (second operand) to two packed signed doubleword integers in the destination operand (first operand). The source operand can be an XMM register or a 64-bit memory location. The destination operand is an MMX technology register. When the source operand is an XMM register, the two single precision floating-point values are contained in the low quadword of the register.
4338 ///
4339 ///
4340 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPS2PI.html).
4341 ///
4342 /// Supported operand variants:
4343 ///
4344 /// ```text
4345 /// +---+----------+
4346 /// | # | Operands |
4347 /// +---+----------+
4348 /// | 1 | Mm, Mem |
4349 /// | 2 | Mm, Xmm |
4350 /// +---+----------+
4351 /// ```
4352 #[inline]
4353 pub fn mmx_cvttps2pi<A, B>(&mut self, op0: A, op1: B)
4354 where Assembler<'a>: MmxCvttps2piEmitter<A, B> {
4355 <Self as MmxCvttps2piEmitter<A, B>>::mmx_cvttps2pi(self, op0, op1);
4356 }
4357 /// `MOVNTI` (MOVNTI).
4358 /// Moves the doubleword integer in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to minimize cache pollution during the write to memory. The source operand is a general-purpose register. The destination operand is a 32-bit memory location.
4359 ///
4360 ///
4361 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVNTI.html).
4362 ///
4363 /// Supported operand variants:
4364 ///
4365 /// ```text
4366 /// +---+----------+
4367 /// | # | Operands |
4368 /// +---+----------+
4369 /// | 1 | Mem, Gpd |
4370 /// | 2 | Mem, Gpq |
4371 /// +---+----------+
4372 /// ```
4373 #[inline]
4374 pub fn movnti<A, B>(&mut self, op0: A, op1: B)
4375 where Assembler<'a>: MovntiEmitter<A, B> {
4376 <Self as MovntiEmitter<A, B>>::movnti(self, op0, op1);
4377 }
4378 /// `SSE_ADDPD` (ADDPD).
4379 /// Adds two, four or eight packed double precision floating-point values from the first source operand to the second source operand, and stores the packed double precision floating-point result in the destination operand.
4380 ///
4381 ///
4382 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ADDPD.html).
4383 ///
4384 /// Supported operand variants:
4385 ///
4386 /// ```text
4387 /// +---+----------+
4388 /// | # | Operands |
4389 /// +---+----------+
4390 /// | 1 | Xmm, Mem |
4391 /// | 2 | Xmm, Xmm |
4392 /// +---+----------+
4393 /// ```
4394 #[inline]
4395 pub fn sse_addpd<A, B>(&mut self, op0: A, op1: B)
4396 where Assembler<'a>: SseAddpdEmitter<A, B> {
4397 <Self as SseAddpdEmitter<A, B>>::sse_addpd(self, op0, op1);
4398 }
4399 /// `SSE_ADDSD` (ADDSD).
4400 /// Adds the low double precision floating-point values from the second source operand and the first source operand and stores the double precision floating-point result in the destination operand.
4401 ///
4402 ///
4403 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ADDSD.html).
4404 ///
4405 /// Supported operand variants:
4406 ///
4407 /// ```text
4408 /// +---+----------+
4409 /// | # | Operands |
4410 /// +---+----------+
4411 /// | 1 | Xmm, Mem |
4412 /// | 2 | Xmm, Xmm |
4413 /// +---+----------+
4414 /// ```
4415 #[inline]
4416 pub fn sse_addsd<A, B>(&mut self, op0: A, op1: B)
4417 where Assembler<'a>: SseAddsdEmitter<A, B> {
4418 <Self as SseAddsdEmitter<A, B>>::sse_addsd(self, op0, op1);
4419 }
4420 /// `SSE_ANDNPD` (ANDNPD).
4421 /// Performs a bitwise logical AND NOT of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
4422 ///
4423 ///
4424 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ANDNPD.html).
4425 ///
4426 /// Supported operand variants:
4427 ///
4428 /// ```text
4429 /// +---+----------+
4430 /// | # | Operands |
4431 /// +---+----------+
4432 /// | 1 | Xmm, Mem |
4433 /// | 2 | Xmm, Xmm |
4434 /// +---+----------+
4435 /// ```
4436 #[inline]
4437 pub fn sse_andnpd<A, B>(&mut self, op0: A, op1: B)
4438 where Assembler<'a>: SseAndnpdEmitter<A, B> {
4439 <Self as SseAndnpdEmitter<A, B>>::sse_andnpd(self, op0, op1);
4440 }
4441 /// `SSE_ANDPD` (ANDPD).
4442 /// Performs a bitwise logical AND of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
4443 ///
4444 ///
4445 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ANDPD.html).
4446 ///
4447 /// Supported operand variants:
4448 ///
4449 /// ```text
4450 /// +---+----------+
4451 /// | # | Operands |
4452 /// +---+----------+
4453 /// | 1 | Xmm, Mem |
4454 /// | 2 | Xmm, Xmm |
4455 /// +---+----------+
4456 /// ```
4457 #[inline]
4458 pub fn sse_andpd<A, B>(&mut self, op0: A, op1: B)
4459 where Assembler<'a>: SseAndpdEmitter<A, B> {
4460 <Self as SseAndpdEmitter<A, B>>::sse_andpd(self, op0, op1);
4461 }
4462 /// `SSE_CMPPD` (CMPPD).
4463 /// Performs a SIMD compare of the packed double precision floating-point values in the second source operand and the first source operand and returns the result of the comparison to the destination operand. The comparison predicate operand (immediate byte) specifies the type of comparison performed on each pair of packed values in the two source operands.
4464 ///
4465 ///
4466 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CMPPD.html).
4467 ///
4468 /// Supported operand variants:
4469 ///
4470 /// ```text
4471 /// +---+---------------+
4472 /// | # | Operands |
4473 /// +---+---------------+
4474 /// | 1 | Xmm, Mem, Imm |
4475 /// | 2 | Xmm, Xmm, Imm |
4476 /// +---+---------------+
4477 /// ```
4478 #[inline]
4479 pub fn sse_cmppd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
4480 where Assembler<'a>: SseCmppdEmitter<A, B, C> {
4481 <Self as SseCmppdEmitter<A, B, C>>::sse_cmppd(self, op0, op1, op2);
4482 }
4483 /// `SSE_CMPSD` (CMPSD).
4484 /// Compares the byte, word, doubleword, or quadword specified with the first source operand with the byte, word, doubleword, or quadword specified with the second source operand and sets the status flags in the EFLAGS register according to the results.
4485 ///
4486 ///
4487 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CMPS%3ACMPSB%3ACMPSW%3ACMPSD%3ACMPSQ.html).
4488 ///
4489 /// Supported operand variants:
4490 ///
4491 /// ```text
4492 /// +---+---------------+
4493 /// | # | Operands |
4494 /// +---+---------------+
4495 /// | 1 | Xmm, Mem, Imm |
4496 /// | 2 | Xmm, Xmm, Imm |
4497 /// +---+---------------+
4498 /// ```
4499 #[inline]
4500 pub fn sse_cmpsd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
4501 where Assembler<'a>: SseCmpsdEmitter<A, B, C> {
4502 <Self as SseCmpsdEmitter<A, B, C>>::sse_cmpsd(self, op0, op1, op2);
4503 }
4504 /// `SSE_COMISD` (COMISD).
4505 /// Compares the double precision floating-point values in the low quadwords of operand 1 (first operand) and operand 2 (second operand), and sets the ZF, PF, and CF flags in the EFLAGS register according to the result (unordered, greater than, less than, or equal). The OF, SF, and AF flags in the EFLAGS register are set to 0. The unordered result is returned if either source operand is a NaN (QNaN or SNaN).
4506 ///
4507 ///
4508 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/COMISD.html).
4509 ///
4510 /// Supported operand variants:
4511 ///
4512 /// ```text
4513 /// +---+----------+
4514 /// | # | Operands |
4515 /// +---+----------+
4516 /// | 1 | Xmm, Mem |
4517 /// | 2 | Xmm, Xmm |
4518 /// +---+----------+
4519 /// ```
4520 #[inline]
4521 pub fn sse_comisd<A, B>(&mut self, op0: A, op1: B)
4522 where Assembler<'a>: SseComisdEmitter<A, B> {
4523 <Self as SseComisdEmitter<A, B>>::sse_comisd(self, op0, op1);
4524 }
4525 /// `SSE_CVTDQ2PD` (CVTDQ2PD).
4526 /// Converts two, four or eight packed signed doubleword integers in the source operand (the second operand) to two, four or eight packed double precision floating-point values in the destination operand (the first operand).
4527 ///
4528 ///
4529 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTDQ2PD.html).
4530 ///
4531 /// Supported operand variants:
4532 ///
4533 /// ```text
4534 /// +---+----------+
4535 /// | # | Operands |
4536 /// +---+----------+
4537 /// | 1 | Xmm, Mem |
4538 /// | 2 | Xmm, Xmm |
4539 /// +---+----------+
4540 /// ```
4541 #[inline]
4542 pub fn sse_cvtdq2pd<A, B>(&mut self, op0: A, op1: B)
4543 where Assembler<'a>: SseCvtdq2pdEmitter<A, B> {
4544 <Self as SseCvtdq2pdEmitter<A, B>>::sse_cvtdq2pd(self, op0, op1);
4545 }
4546 /// `SSE_CVTDQ2PS` (CVTDQ2PS).
4547 /// Converts four, eight or sixteen packed signed doubleword integers in the source operand to four, eight or sixteen packed single precision floating-point values in the destination operand.
4548 ///
4549 ///
4550 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTDQ2PS.html).
4551 ///
4552 /// Supported operand variants:
4553 ///
4554 /// ```text
4555 /// +---+----------+
4556 /// | # | Operands |
4557 /// +---+----------+
4558 /// | 1 | Xmm, Mem |
4559 /// | 2 | Xmm, Xmm |
4560 /// +---+----------+
4561 /// ```
4562 #[inline]
4563 pub fn sse_cvtdq2ps<A, B>(&mut self, op0: A, op1: B)
4564 where Assembler<'a>: SseCvtdq2psEmitter<A, B> {
4565 <Self as SseCvtdq2psEmitter<A, B>>::sse_cvtdq2ps(self, op0, op1);
4566 }
4567 /// `SSE_CVTPD2DQ` (CVTPD2DQ).
4568 /// Converts packed double precision floating-point values in the source operand (second operand) to packed signed doubleword integers in the destination operand (first operand).
4569 ///
4570 ///
4571 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPD2DQ.html).
4572 ///
4573 /// Supported operand variants:
4574 ///
4575 /// ```text
4576 /// +---+----------+
4577 /// | # | Operands |
4578 /// +---+----------+
4579 /// | 1 | Xmm, Mem |
4580 /// | 2 | Xmm, Xmm |
4581 /// +---+----------+
4582 /// ```
4583 #[inline]
4584 pub fn sse_cvtpd2dq<A, B>(&mut self, op0: A, op1: B)
4585 where Assembler<'a>: SseCvtpd2dqEmitter<A, B> {
4586 <Self as SseCvtpd2dqEmitter<A, B>>::sse_cvtpd2dq(self, op0, op1);
4587 }
4588 /// `SSE_CVTPD2PS` (CVTPD2PS).
4589 /// Converts two, four or eight packed double precision floating-point values in the source operand (second operand) to two, four or eight packed single precision floating-point values in the destination operand (first operand).
4590 ///
4591 ///
4592 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPD2PS.html).
4593 ///
4594 /// Supported operand variants:
4595 ///
4596 /// ```text
4597 /// +---+----------+
4598 /// | # | Operands |
4599 /// +---+----------+
4600 /// | 1 | Xmm, Mem |
4601 /// | 2 | Xmm, Xmm |
4602 /// +---+----------+
4603 /// ```
4604 #[inline]
4605 pub fn sse_cvtpd2ps<A, B>(&mut self, op0: A, op1: B)
4606 where Assembler<'a>: SseCvtpd2psEmitter<A, B> {
4607 <Self as SseCvtpd2psEmitter<A, B>>::sse_cvtpd2ps(self, op0, op1);
4608 }
4609 /// `SSE_CVTPS2DQ` (CVTPS2DQ).
4610 /// Converts four, eight or sixteen packed single precision floating-point values in the source operand to four, eight or sixteen signed doubleword integers in the destination operand.
4611 ///
4612 ///
4613 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPS2DQ.html).
4614 ///
4615 /// Supported operand variants:
4616 ///
4617 /// ```text
4618 /// +---+----------+
4619 /// | # | Operands |
4620 /// +---+----------+
4621 /// | 1 | Xmm, Mem |
4622 /// | 2 | Xmm, Xmm |
4623 /// +---+----------+
4624 /// ```
4625 #[inline]
4626 pub fn sse_cvtps2dq<A, B>(&mut self, op0: A, op1: B)
4627 where Assembler<'a>: SseCvtps2dqEmitter<A, B> {
4628 <Self as SseCvtps2dqEmitter<A, B>>::sse_cvtps2dq(self, op0, op1);
4629 }
4630 /// `SSE_CVTPS2PD` (CVTPS2PD).
4631 /// Converts two, four or eight packed single precision floating-point values in the source operand (second operand) to two, four or eight packed double precision floating-point values in the destination operand (first operand).
4632 ///
4633 ///
4634 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTPS2PD.html).
4635 ///
4636 /// Supported operand variants:
4637 ///
4638 /// ```text
4639 /// +---+----------+
4640 /// | # | Operands |
4641 /// +---+----------+
4642 /// | 1 | Xmm, Mem |
4643 /// | 2 | Xmm, Xmm |
4644 /// +---+----------+
4645 /// ```
4646 #[inline]
4647 pub fn sse_cvtps2pd<A, B>(&mut self, op0: A, op1: B)
4648 where Assembler<'a>: SseCvtps2pdEmitter<A, B> {
4649 <Self as SseCvtps2pdEmitter<A, B>>::sse_cvtps2pd(self, op0, op1);
4650 }
4651 /// `SSE_CVTSD2SI` (CVTSD2SI).
4652 /// Converts a double precision floating-point value in the source operand (the second operand) to a signed double-word integer in the destination operand (first operand). The source operand can be an XMM register or a 64-bit memory location. The destination operand is a general-purpose register. When the source operand is an XMM register, the double precision floating-point value is contained in the low quadword of the register.
4653 ///
4654 ///
4655 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSD2SI.html).
4656 ///
4657 /// Supported operand variants:
4658 ///
4659 /// ```text
4660 /// +---+----------+
4661 /// | # | Operands |
4662 /// +---+----------+
4663 /// | 1 | Gpd, Mem |
4664 /// | 2 | Gpd, Xmm |
4665 /// | 3 | Gpq, Mem |
4666 /// | 4 | Gpq, Xmm |
4667 /// +---+----------+
4668 /// ```
4669 #[inline]
4670 pub fn sse_cvtsd2si<A, B>(&mut self, op0: A, op1: B)
4671 where Assembler<'a>: SseCvtsd2siEmitter<A, B> {
4672 <Self as SseCvtsd2siEmitter<A, B>>::sse_cvtsd2si(self, op0, op1);
4673 }
4674 /// `SSE_CVTSD2SS` (CVTSD2SS).
4675 /// Converts a double precision floating-point value in the “convert-from” source operand (the second operand in SSE2 version, otherwise the third operand) to a single precision floating-point value in the destination operand.
4676 ///
4677 ///
4678 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSD2SS.html).
4679 ///
4680 /// Supported operand variants:
4681 ///
4682 /// ```text
4683 /// +---+----------+
4684 /// | # | Operands |
4685 /// +---+----------+
4686 /// | 1 | Xmm, Mem |
4687 /// | 2 | Xmm, Xmm |
4688 /// +---+----------+
4689 /// ```
4690 #[inline]
4691 pub fn sse_cvtsd2ss<A, B>(&mut self, op0: A, op1: B)
4692 where Assembler<'a>: SseCvtsd2ssEmitter<A, B> {
4693 <Self as SseCvtsd2ssEmitter<A, B>>::sse_cvtsd2ss(self, op0, op1);
4694 }
4695 /// `SSE_CVTSI2SD` (CVTSI2SD).
4696 /// Converts a signed doubleword integer (or signed quadword integer if operand size is 64 bits) in the “convert-from” source operand to a double precision floating-point value in the destination operand. The result is stored in the low quadword of the destination operand, and the high quadword left unchanged. When conversion is inexact, the value returned is rounded according to the rounding control bits in the MXCSR register.
4697 ///
4698 ///
4699 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSI2SD.html).
4700 ///
4701 /// Supported operand variants:
4702 ///
4703 /// ```text
4704 /// +---+----------+
4705 /// | # | Operands |
4706 /// +---+----------+
4707 /// | 1 | Xmm, Gpd |
4708 /// | 2 | Xmm, Gpq |
4709 /// | 3 | Xmm, Mem |
4710 /// +---+----------+
4711 /// ```
4712 #[inline]
4713 pub fn sse_cvtsi2sd<A, B>(&mut self, op0: A, op1: B)
4714 where Assembler<'a>: SseCvtsi2sdEmitter<A, B> {
4715 <Self as SseCvtsi2sdEmitter<A, B>>::sse_cvtsi2sd(self, op0, op1);
4716 }
4717 /// `SSE_CVTSS2SD` (CVTSS2SD).
4718 /// Converts a single precision floating-point value in the “convert-from” source operand to a double precision floating-point value in the destination operand. When the “convert-from” source operand is an XMM register, the single precision floating-point value is contained in the low doubleword of the register. The result is stored in the low quadword of the destination operand.
4719 ///
4720 ///
4721 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTSS2SD.html).
4722 ///
4723 /// Supported operand variants:
4724 ///
4725 /// ```text
4726 /// +---+----------+
4727 /// | # | Operands |
4728 /// +---+----------+
4729 /// | 1 | Xmm, Mem |
4730 /// | 2 | Xmm, Xmm |
4731 /// +---+----------+
4732 /// ```
4733 #[inline]
4734 pub fn sse_cvtss2sd<A, B>(&mut self, op0: A, op1: B)
4735 where Assembler<'a>: SseCvtss2sdEmitter<A, B> {
4736 <Self as SseCvtss2sdEmitter<A, B>>::sse_cvtss2sd(self, op0, op1);
4737 }
4738 /// `SSE_CVTTPD2DQ` (CVTTPD2DQ).
4739 /// Converts two, four or eight packed double precision floating-point values in the source operand (second operand) to two, four or eight packed signed doubleword integers in the destination operand (first operand).
4740 ///
4741 ///
4742 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPD2DQ.html).
4743 ///
4744 /// Supported operand variants:
4745 ///
4746 /// ```text
4747 /// +---+----------+
4748 /// | # | Operands |
4749 /// +---+----------+
4750 /// | 1 | Xmm, Mem |
4751 /// | 2 | Xmm, Xmm |
4752 /// +---+----------+
4753 /// ```
4754 #[inline]
4755 pub fn sse_cvttpd2dq<A, B>(&mut self, op0: A, op1: B)
4756 where Assembler<'a>: SseCvttpd2dqEmitter<A, B> {
4757 <Self as SseCvttpd2dqEmitter<A, B>>::sse_cvttpd2dq(self, op0, op1);
4758 }
4759 /// `SSE_CVTTPS2DQ` (CVTTPS2DQ).
4760 /// Converts four, eight or sixteen packed single precision floating-point values in the source operand to four, eight or sixteen signed doubleword integers in the destination operand.
4761 ///
4762 ///
4763 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTPS2DQ.html).
4764 ///
4765 /// Supported operand variants:
4766 ///
4767 /// ```text
4768 /// +---+----------+
4769 /// | # | Operands |
4770 /// +---+----------+
4771 /// | 1 | Xmm, Mem |
4772 /// | 2 | Xmm, Xmm |
4773 /// +---+----------+
4774 /// ```
4775 #[inline]
4776 pub fn sse_cvttps2dq<A, B>(&mut self, op0: A, op1: B)
4777 where Assembler<'a>: SseCvttps2dqEmitter<A, B> {
4778 <Self as SseCvttps2dqEmitter<A, B>>::sse_cvttps2dq(self, op0, op1);
4779 }
4780 /// `SSE_CVTTSD2SI` (CVTTSD2SI).
4781 /// Converts a double precision floating-point value in the source operand (the second operand) to a signed double-word integer (or signed quadword integer if operand size is 64 bits) in the destination operand (the first operand). The source operand can be an XMM register or a 64-bit memory location. The destination operand is a general purpose register. When the source operand is an XMM register, the double precision floating-point value is contained in the low quadword of the register.
4782 ///
4783 ///
4784 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/CVTTSD2SI.html).
4785 ///
4786 /// Supported operand variants:
4787 ///
4788 /// ```text
4789 /// +---+----------+
4790 /// | # | Operands |
4791 /// +---+----------+
4792 /// | 1 | Gpd, Mem |
4793 /// | 2 | Gpd, Xmm |
4794 /// | 3 | Gpq, Mem |
4795 /// | 4 | Gpq, Xmm |
4796 /// +---+----------+
4797 /// ```
4798 #[inline]
4799 pub fn sse_cvttsd2si<A, B>(&mut self, op0: A, op1: B)
4800 where Assembler<'a>: SseCvttsd2siEmitter<A, B> {
4801 <Self as SseCvttsd2siEmitter<A, B>>::sse_cvttsd2si(self, op0, op1);
4802 }
4803 /// `SSE_DIVPD` (DIVPD).
4804 /// Performs a SIMD divide of the double precision floating-point values in the first source operand by the floating-point values in the second source operand (the third operand). Results are written to the destination operand (the first operand).
4805 ///
4806 ///
4807 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/DIVPD.html).
4808 ///
4809 /// Supported operand variants:
4810 ///
4811 /// ```text
4812 /// +---+----------+
4813 /// | # | Operands |
4814 /// +---+----------+
4815 /// | 1 | Xmm, Mem |
4816 /// | 2 | Xmm, Xmm |
4817 /// +---+----------+
4818 /// ```
4819 #[inline]
4820 pub fn sse_divpd<A, B>(&mut self, op0: A, op1: B)
4821 where Assembler<'a>: SseDivpdEmitter<A, B> {
4822 <Self as SseDivpdEmitter<A, B>>::sse_divpd(self, op0, op1);
4823 }
4824 /// `SSE_DIVSD` (DIVSD).
4825 /// Divides the low double precision floating-point value in the first source operand by the low double precision floating-point value in the second source operand, and stores the double precision floating-point result in the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source and destination are XMM registers.
4826 ///
4827 ///
4828 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/DIVSD.html).
4829 ///
4830 /// Supported operand variants:
4831 ///
4832 /// ```text
4833 /// +---+----------+
4834 /// | # | Operands |
4835 /// +---+----------+
4836 /// | 1 | Xmm, Mem |
4837 /// | 2 | Xmm, Xmm |
4838 /// +---+----------+
4839 /// ```
4840 #[inline]
4841 pub fn sse_divsd<A, B>(&mut self, op0: A, op1: B)
4842 where Assembler<'a>: SseDivsdEmitter<A, B> {
4843 <Self as SseDivsdEmitter<A, B>>::sse_divsd(self, op0, op1);
4844 }
4845 /// `SSE_MASKMOVDQU` (MASKMOVDQU).
4846 /// Stores selected bytes from the source operand (first operand) into an 128-bit memory location. The mask operand (second operand) selects which bytes from the source operand are written to memory. The source and mask operands are XMM registers. The memory location specified by the effective address in the DI/EDI/RDI register (the default segment register is DS, but this may be overridden with a segment-override prefix). The memory location does not need to be aligned on a natural boundary. (The size of the store address depends on the address-size attribute.)
4847 ///
4848 ///
4849 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MASKMOVDQU.html).
4850 ///
4851 /// Supported operand variants:
4852 ///
4853 /// ```text
4854 /// +---+----------+
4855 /// | # | Operands |
4856 /// +---+----------+
4857 /// | 1 | Xmm, Xmm |
4858 /// +---+----------+
4859 /// ```
4860 #[inline]
4861 pub fn sse_maskmovdqu<A, B>(&mut self, op0: A, op1: B)
4862 where Assembler<'a>: SseMaskmovdquEmitter<A, B> {
4863 <Self as SseMaskmovdquEmitter<A, B>>::sse_maskmovdqu(self, op0, op1);
4864 }
4865 /// `SSE_MAXPD` (MAXPD).
4866 /// Performs a SIMD compare of the packed double precision floating-point values in the first source operand and the second source operand and returns the maximum value for each pair of values to the destination operand.
4867 ///
4868 ///
4869 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MAXPD.html).
4870 ///
4871 /// Supported operand variants:
4872 ///
4873 /// ```text
4874 /// +---+----------+
4875 /// | # | Operands |
4876 /// +---+----------+
4877 /// | 1 | Xmm, Mem |
4878 /// | 2 | Xmm, Xmm |
4879 /// +---+----------+
4880 /// ```
4881 #[inline]
4882 pub fn sse_maxpd<A, B>(&mut self, op0: A, op1: B)
4883 where Assembler<'a>: SseMaxpdEmitter<A, B> {
4884 <Self as SseMaxpdEmitter<A, B>>::sse_maxpd(self, op0, op1);
4885 }
4886 /// `SSE_MAXSD` (MAXSD).
4887 /// Compares the low double precision floating-point values in the first source operand and the second source operand, and returns the maximum value to the low quadword of the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source and destination operands are XMM registers. When the second source operand is a memory operand, only 64 bits are accessed.
4888 ///
4889 ///
4890 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MAXSD.html).
4891 ///
4892 /// Supported operand variants:
4893 ///
4894 /// ```text
4895 /// +---+----------+
4896 /// | # | Operands |
4897 /// +---+----------+
4898 /// | 1 | Xmm, Mem |
4899 /// | 2 | Xmm, Xmm |
4900 /// +---+----------+
4901 /// ```
4902 #[inline]
4903 pub fn sse_maxsd<A, B>(&mut self, op0: A, op1: B)
4904 where Assembler<'a>: SseMaxsdEmitter<A, B> {
4905 <Self as SseMaxsdEmitter<A, B>>::sse_maxsd(self, op0, op1);
4906 }
4907 /// `SSE_MINPD` (MINPD).
4908 /// Performs a SIMD compare of the packed double precision floating-point values in the first source operand and the second source operand and returns the minimum value for each pair of values to the destination operand.
4909 ///
4910 ///
4911 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MINPD.html).
4912 ///
4913 /// Supported operand variants:
4914 ///
4915 /// ```text
4916 /// +---+----------+
4917 /// | # | Operands |
4918 /// +---+----------+
4919 /// | 1 | Xmm, Mem |
4920 /// | 2 | Xmm, Xmm |
4921 /// +---+----------+
4922 /// ```
4923 #[inline]
4924 pub fn sse_minpd<A, B>(&mut self, op0: A, op1: B)
4925 where Assembler<'a>: SseMinpdEmitter<A, B> {
4926 <Self as SseMinpdEmitter<A, B>>::sse_minpd(self, op0, op1);
4927 }
4928 /// `SSE_MINSD` (MINSD).
4929 /// Compares the low double precision floating-point values in the first source operand and the second source operand, and returns the minimum value to the low quadword of the destination operand. When the source operand is a memory operand, only the 64 bits are accessed.
4930 ///
4931 ///
4932 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MINSD.html).
4933 ///
4934 /// Supported operand variants:
4935 ///
4936 /// ```text
4937 /// +---+----------+
4938 /// | # | Operands |
4939 /// +---+----------+
4940 /// | 1 | Xmm, Mem |
4941 /// | 2 | Xmm, Xmm |
4942 /// +---+----------+
4943 /// ```
4944 #[inline]
4945 pub fn sse_minsd<A, B>(&mut self, op0: A, op1: B)
4946 where Assembler<'a>: SseMinsdEmitter<A, B> {
4947 <Self as SseMinsdEmitter<A, B>>::sse_minsd(self, op0, op1);
4948 }
4949 /// `SSE_MOVAPD` (MOVAPD).
4950 /// Moves 2, 4 or 8 double precision floating-point values from the source operand (second operand) to the destination operand (first operand). This instruction can be used to load an XMM, YMM or ZMM register from an 128-bit, 256-bit or 512-bit memory location, to store the contents of an XMM, YMM or ZMM register into a 128-bit, 256-bit or 512-bit memory location, or to move data between two XMM, two YMM or two ZMM registers.
4951 ///
4952 ///
4953 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVAPD.html).
4954 ///
4955 /// Supported operand variants:
4956 ///
4957 /// ```text
4958 /// +---+----------+
4959 /// | # | Operands |
4960 /// +---+----------+
4961 /// | 1 | Mem, Xmm |
4962 /// | 2 | Xmm, Mem |
4963 /// | 3 | Xmm, Xmm |
4964 /// +---+----------+
4965 /// ```
4966 #[inline]
4967 pub fn sse_movapd<A, B>(&mut self, op0: A, op1: B)
4968 where Assembler<'a>: SseMovapdEmitter<A, B> {
4969 <Self as SseMovapdEmitter<A, B>>::sse_movapd(self, op0, op1);
4970 }
4971 /// `SSE_MOVDQA` (MOVDQA).
4972 /// Note: VEX.vvvv and EVEX.vvvv are reserved and must be 1111b otherwise instructions will #UD.
4973 ///
4974 ///
4975 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVDQA%3AVMOVDQA32%3AVMOVDQA64.html).
4976 ///
4977 /// Supported operand variants:
4978 ///
4979 /// ```text
4980 /// +---+----------+
4981 /// | # | Operands |
4982 /// +---+----------+
4983 /// | 1 | Mem, Xmm |
4984 /// | 2 | Xmm, Mem |
4985 /// | 3 | Xmm, Xmm |
4986 /// +---+----------+
4987 /// ```
4988 #[inline]
4989 pub fn sse_movdqa<A, B>(&mut self, op0: A, op1: B)
4990 where Assembler<'a>: SseMovdqaEmitter<A, B> {
4991 <Self as SseMovdqaEmitter<A, B>>::sse_movdqa(self, op0, op1);
4992 }
4993 /// `SSE_MOVDQU` (MOVDQU).
4994 /// Note: VEX.vvvv and EVEX.vvvv are reserved and must be 1111b otherwise instructions will #UD.
4995 ///
4996 ///
4997 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVDQU%3AVMOVDQU8%3AVMOVDQU16%3AVMOVDQU32%3AVMOVDQU64.html).
4998 ///
4999 /// Supported operand variants:
5000 ///
5001 /// ```text
5002 /// +---+----------+
5003 /// | # | Operands |
5004 /// +---+----------+
5005 /// | 1 | Mem, Xmm |
5006 /// | 2 | Xmm, Mem |
5007 /// | 3 | Xmm, Xmm |
5008 /// +---+----------+
5009 /// ```
5010 #[inline]
5011 pub fn sse_movdqu<A, B>(&mut self, op0: A, op1: B)
5012 where Assembler<'a>: SseMovdquEmitter<A, B> {
5013 <Self as SseMovdquEmitter<A, B>>::sse_movdqu(self, op0, op1);
5014 }
5015 /// `SSE_MOVD_G2X` (MOVD).
5016 /// 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.
5017 ///
5018 ///
5019 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
5020 ///
5021 /// Supported operand variants:
5022 ///
5023 /// ```text
5024 /// +---+----------+
5025 /// | # | Operands |
5026 /// +---+----------+
5027 /// | 1 | Xmm, Gpd |
5028 /// | 2 | Xmm, Mem |
5029 /// +---+----------+
5030 /// ```
5031 #[inline]
5032 pub fn sse_movd_g2x<A, B>(&mut self, op0: A, op1: B)
5033 where Assembler<'a>: SseMovdG2xEmitter<A, B> {
5034 <Self as SseMovdG2xEmitter<A, B>>::sse_movd_g2x(self, op0, op1);
5035 }
5036 /// `SSE_MOVD_X2G` (MOVD).
5037 /// 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.
5038 ///
5039 ///
5040 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
5041 ///
5042 /// Supported operand variants:
5043 ///
5044 /// ```text
5045 /// +---+----------+
5046 /// | # | Operands |
5047 /// +---+----------+
5048 /// | 1 | Gpd, Xmm |
5049 /// | 2 | Mem, Xmm |
5050 /// +---+----------+
5051 /// ```
5052 #[inline]
5053 pub fn sse_movd_x2g<A, B>(&mut self, op0: A, op1: B)
5054 where Assembler<'a>: SseMovdX2gEmitter<A, B> {
5055 <Self as SseMovdX2gEmitter<A, B>>::sse_movd_x2g(self, op0, op1);
5056 }
5057 /// `SSE_MOVHPD` (MOVHPD).
5058 /// This instruction cannot be used for register to register or memory to memory moves.
5059 ///
5060 ///
5061 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVHPD.html).
5062 ///
5063 /// Supported operand variants:
5064 ///
5065 /// ```text
5066 /// +---+----------+
5067 /// | # | Operands |
5068 /// +---+----------+
5069 /// | 1 | Mem, Xmm |
5070 /// | 2 | Xmm, Mem |
5071 /// +---+----------+
5072 /// ```
5073 #[inline]
5074 pub fn sse_movhpd<A, B>(&mut self, op0: A, op1: B)
5075 where Assembler<'a>: SseMovhpdEmitter<A, B> {
5076 <Self as SseMovhpdEmitter<A, B>>::sse_movhpd(self, op0, op1);
5077 }
5078 /// `SSE_MOVLPD` (MOVLPD).
5079 /// This instruction cannot be used for register to register or memory to memory moves.
5080 ///
5081 ///
5082 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVLPD.html).
5083 ///
5084 /// Supported operand variants:
5085 ///
5086 /// ```text
5087 /// +---+----------+
5088 /// | # | Operands |
5089 /// +---+----------+
5090 /// | 1 | Mem, Xmm |
5091 /// | 2 | Xmm, Mem |
5092 /// +---+----------+
5093 /// ```
5094 #[inline]
5095 pub fn sse_movlpd<A, B>(&mut self, op0: A, op1: B)
5096 where Assembler<'a>: SseMovlpdEmitter<A, B> {
5097 <Self as SseMovlpdEmitter<A, B>>::sse_movlpd(self, op0, op1);
5098 }
5099 /// `SSE_MOVMSKPD` (MOVMSKPD).
5100 /// Extracts the sign bits from the packed double precision floating-point values in the source operand (second operand), formats them into a 2-bit mask, and stores the mask in the destination operand (first operand). The source operand is an XMM register, and the destination operand is a general-purpose register. The mask is stored in the 2 low-order bits of the destination operand. Zero-extend the upper bits of the destination.
5101 ///
5102 ///
5103 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVMSKPD.html).
5104 ///
5105 /// Supported operand variants:
5106 ///
5107 /// ```text
5108 /// +---+----------+
5109 /// | # | Operands |
5110 /// +---+----------+
5111 /// | 1 | Gpq, Xmm |
5112 /// +---+----------+
5113 /// ```
5114 #[inline]
5115 pub fn sse_movmskpd<A, B>(&mut self, op0: A, op1: B)
5116 where Assembler<'a>: SseMovmskpdEmitter<A, B> {
5117 <Self as SseMovmskpdEmitter<A, B>>::sse_movmskpd(self, op0, op1);
5118 }
5119 /// `SSE_MOVNTDQ` (MOVNTDQ).
5120 /// Moves the packed integers in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to prevent caching of the data during the write to memory. The source operand is an XMM register, YMM register or ZMM register, which is assumed to contain integer data (packed bytes, words, double-words, or quadwords). The destination operand is a 128-bit, 256-bit or 512-bit memory location. The memory operand must be aligned on a 16-byte (128-bit version), 32-byte (VEX.256 encoded version) or 64-byte (512-bit version) boundary otherwise a general-protection exception (#GP) will be generated.
5121 ///
5122 ///
5123 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVNTDQ.html).
5124 ///
5125 /// Supported operand variants:
5126 ///
5127 /// ```text
5128 /// +---+----------+
5129 /// | # | Operands |
5130 /// +---+----------+
5131 /// | 1 | Mem, Xmm |
5132 /// +---+----------+
5133 /// ```
5134 #[inline]
5135 pub fn sse_movntdq<A, B>(&mut self, op0: A, op1: B)
5136 where Assembler<'a>: SseMovntdqEmitter<A, B> {
5137 <Self as SseMovntdqEmitter<A, B>>::sse_movntdq(self, op0, op1);
5138 }
5139 /// `SSE_MOVNTPD` (MOVNTPD).
5140 /// Moves the packed double precision floating-point values in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to prevent caching of the data during the write to memory. The source operand is an XMM register, YMM register or ZMM register, which is assumed to contain packed double precision, floating-pointing data. The destination operand is a 128-bit, 256-bit or 512-bit memory location. The memory operand must be aligned on a 16-byte (128-bit version), 32-byte (VEX.256 encoded version) or 64-byte (EVEX.512 encoded version) boundary otherwise a general-protection exception (#GP) will be generated.
5141 ///
5142 ///
5143 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVNTPD.html).
5144 ///
5145 /// Supported operand variants:
5146 ///
5147 /// ```text
5148 /// +---+----------+
5149 /// | # | Operands |
5150 /// +---+----------+
5151 /// | 1 | Mem, Xmm |
5152 /// +---+----------+
5153 /// ```
5154 #[inline]
5155 pub fn sse_movntpd<A, B>(&mut self, op0: A, op1: B)
5156 where Assembler<'a>: SseMovntpdEmitter<A, B> {
5157 <Self as SseMovntpdEmitter<A, B>>::sse_movntpd(self, op0, op1);
5158 }
5159 /// `SSE_MOVNTSD`.
5160 ///
5161 /// Supported operand variants:
5162 ///
5163 /// ```text
5164 /// +---+----------+
5165 /// | # | Operands |
5166 /// +---+----------+
5167 /// | 1 | Mem, Xmm |
5168 /// +---+----------+
5169 /// ```
5170 #[inline]
5171 pub fn sse_movntsd<A, B>(&mut self, op0: A, op1: B)
5172 where Assembler<'a>: SseMovntsdEmitter<A, B> {
5173 <Self as SseMovntsdEmitter<A, B>>::sse_movntsd(self, op0, op1);
5174 }
5175 /// `SSE_MOVQ` (MOVQ).
5176 /// 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.
5177 ///
5178 ///
5179 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
5180 ///
5181 /// Supported operand variants:
5182 ///
5183 /// ```text
5184 /// +---+----------+
5185 /// | # | Operands |
5186 /// +---+----------+
5187 /// | 1 | Mem, Xmm |
5188 /// | 2 | Xmm, Mem |
5189 /// | 3 | Xmm, Xmm |
5190 /// +---+----------+
5191 /// ```
5192 #[inline]
5193 pub fn sse_movq<A, B>(&mut self, op0: A, op1: B)
5194 where Assembler<'a>: SseMovqEmitter<A, B> {
5195 <Self as SseMovqEmitter<A, B>>::sse_movq(self, op0, op1);
5196 }
5197 /// `SSE_MOVQ_G2X` (MOVQ).
5198 /// 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.
5199 ///
5200 ///
5201 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
5202 ///
5203 /// Supported operand variants:
5204 ///
5205 /// ```text
5206 /// +---+----------+
5207 /// | # | Operands |
5208 /// +---+----------+
5209 /// | 1 | Xmm, Gpd |
5210 /// | 2 | Xmm, Mem |
5211 /// +---+----------+
5212 /// ```
5213 #[inline]
5214 pub fn sse_movq_g2x<A, B>(&mut self, op0: A, op1: B)
5215 where Assembler<'a>: SseMovqG2xEmitter<A, B> {
5216 <Self as SseMovqG2xEmitter<A, B>>::sse_movq_g2x(self, op0, op1);
5217 }
5218 /// `SSE_MOVQ_X2G` (MOVQ).
5219 /// 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.
5220 ///
5221 ///
5222 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVD%3AMOVQ.html).
5223 ///
5224 /// Supported operand variants:
5225 ///
5226 /// ```text
5227 /// +---+----------+
5228 /// | # | Operands |
5229 /// +---+----------+
5230 /// | 1 | Gpd, Xmm |
5231 /// | 2 | Mem, Xmm |
5232 /// +---+----------+
5233 /// ```
5234 #[inline]
5235 pub fn sse_movq_x2g<A, B>(&mut self, op0: A, op1: B)
5236 where Assembler<'a>: SseMovqX2gEmitter<A, B> {
5237 <Self as SseMovqX2gEmitter<A, B>>::sse_movq_x2g(self, op0, op1);
5238 }
5239 /// `SSE_MOVSD` (MOVSD).
5240 /// Moves the byte, word, or doubleword specified with the second operand (source operand) to the location specified with the first operand (destination operand). Both the source and destination operands are located in memory. The address of the source operand is read from the DS:ESI or the DS:SI registers (depending on the address-size attribute of the instruction, 32 or 16, respectively). The address of the destination operand is read from the ES:EDI or the ES:DI registers (again depending on the address-size attribute of the instruction). The DS segment may be overridden with a segment override prefix, but the ES segment cannot be overridden.
5241 ///
5242 ///
5243 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVS%3AMOVSB%3AMOVSW%3AMOVSD%3AMOVSQ.html).
5244 ///
5245 /// Supported operand variants:
5246 ///
5247 /// ```text
5248 /// +---+----------+
5249 /// | # | Operands |
5250 /// +---+----------+
5251 /// | 1 | Mem, Xmm |
5252 /// | 2 | Xmm, Mem |
5253 /// | 3 | Xmm, Xmm |
5254 /// +---+----------+
5255 /// ```
5256 #[inline]
5257 pub fn sse_movsd<A, B>(&mut self, op0: A, op1: B)
5258 where Assembler<'a>: SseMovsdEmitter<A, B> {
5259 <Self as SseMovsdEmitter<A, B>>::sse_movsd(self, op0, op1);
5260 }
5261 /// `SSE_MOVUPD` (MOVUPD).
5262 /// Note: VEX.vvvv and EVEX.vvvv is reserved and must be 1111b otherwise instructions will #UD.
5263 ///
5264 ///
5265 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MOVUPD.html).
5266 ///
5267 /// Supported operand variants:
5268 ///
5269 /// ```text
5270 /// +---+----------+
5271 /// | # | Operands |
5272 /// +---+----------+
5273 /// | 1 | Mem, Xmm |
5274 /// | 2 | Xmm, Mem |
5275 /// | 3 | Xmm, Xmm |
5276 /// +---+----------+
5277 /// ```
5278 #[inline]
5279 pub fn sse_movupd<A, B>(&mut self, op0: A, op1: B)
5280 where Assembler<'a>: SseMovupdEmitter<A, B> {
5281 <Self as SseMovupdEmitter<A, B>>::sse_movupd(self, op0, op1);
5282 }
5283 /// `SSE_MULPD` (MULPD).
5284 /// Multiply packed double precision floating-point values from the first source operand with corresponding values in the second source operand, and stores the packed double precision floating-point results in the destination operand.
5285 ///
5286 ///
5287 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MULPD.html).
5288 ///
5289 /// Supported operand variants:
5290 ///
5291 /// ```text
5292 /// +---+----------+
5293 /// | # | Operands |
5294 /// +---+----------+
5295 /// | 1 | Xmm, Mem |
5296 /// | 2 | Xmm, Xmm |
5297 /// +---+----------+
5298 /// ```
5299 #[inline]
5300 pub fn sse_mulpd<A, B>(&mut self, op0: A, op1: B)
5301 where Assembler<'a>: SseMulpdEmitter<A, B> {
5302 <Self as SseMulpdEmitter<A, B>>::sse_mulpd(self, op0, op1);
5303 }
5304 /// `SSE_MULSD` (MULSD).
5305 /// Multiplies the low double precision floating-point value in the second source operand by the low double precision floating-point value in the first source operand, and stores the double precision floating-point result in the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source operand and the destination operands are XMM registers.
5306 ///
5307 ///
5308 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/MULSD.html).
5309 ///
5310 /// Supported operand variants:
5311 ///
5312 /// ```text
5313 /// +---+----------+
5314 /// | # | Operands |
5315 /// +---+----------+
5316 /// | 1 | Xmm, Mem |
5317 /// | 2 | Xmm, Xmm |
5318 /// +---+----------+
5319 /// ```
5320 #[inline]
5321 pub fn sse_mulsd<A, B>(&mut self, op0: A, op1: B)
5322 where Assembler<'a>: SseMulsdEmitter<A, B> {
5323 <Self as SseMulsdEmitter<A, B>>::sse_mulsd(self, op0, op1);
5324 }
5325 /// `SSE_ORPD` (ORPD).
5326 /// Performs a bitwise logical OR of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
5327 ///
5328 ///
5329 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/ORPD.html).
5330 ///
5331 /// Supported operand variants:
5332 ///
5333 /// ```text
5334 /// +---+----------+
5335 /// | # | Operands |
5336 /// +---+----------+
5337 /// | 1 | Xmm, Mem |
5338 /// | 2 | Xmm, Xmm |
5339 /// +---+----------+
5340 /// ```
5341 #[inline]
5342 pub fn sse_orpd<A, B>(&mut self, op0: A, op1: B)
5343 where Assembler<'a>: SseOrpdEmitter<A, B> {
5344 <Self as SseOrpdEmitter<A, B>>::sse_orpd(self, op0, op1);
5345 }
5346 /// `SSE_PACKSSDW` (PACKSSDW).
5347 /// 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.
5348 ///
5349 ///
5350 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
5351 ///
5352 /// Supported operand variants:
5353 ///
5354 /// ```text
5355 /// +---+----------+
5356 /// | # | Operands |
5357 /// +---+----------+
5358 /// | 1 | Xmm, Mem |
5359 /// | 2 | Xmm, Xmm |
5360 /// +---+----------+
5361 /// ```
5362 #[inline]
5363 pub fn sse_packssdw<A, B>(&mut self, op0: A, op1: B)
5364 where Assembler<'a>: SsePackssdwEmitter<A, B> {
5365 <Self as SsePackssdwEmitter<A, B>>::sse_packssdw(self, op0, op1);
5366 }
5367 /// `SSE_PACKSSWB` (PACKSSWB).
5368 /// 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.
5369 ///
5370 ///
5371 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKSSWB%3APACKSSDW.html).
5372 ///
5373 /// Supported operand variants:
5374 ///
5375 /// ```text
5376 /// +---+----------+
5377 /// | # | Operands |
5378 /// +---+----------+
5379 /// | 1 | Xmm, Mem |
5380 /// | 2 | Xmm, Xmm |
5381 /// +---+----------+
5382 /// ```
5383 #[inline]
5384 pub fn sse_packsswb<A, B>(&mut self, op0: A, op1: B)
5385 where Assembler<'a>: SsePacksswbEmitter<A, B> {
5386 <Self as SsePacksswbEmitter<A, B>>::sse_packsswb(self, op0, op1);
5387 }
5388 /// `SSE_PACKUSWB` (PACKUSWB).
5389 /// 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.
5390 ///
5391 ///
5392 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PACKUSWB.html).
5393 ///
5394 /// Supported operand variants:
5395 ///
5396 /// ```text
5397 /// +---+----------+
5398 /// | # | Operands |
5399 /// +---+----------+
5400 /// | 1 | Xmm, Mem |
5401 /// | 2 | Xmm, Xmm |
5402 /// +---+----------+
5403 /// ```
5404 #[inline]
5405 pub fn sse_packuswb<A, B>(&mut self, op0: A, op1: B)
5406 where Assembler<'a>: SsePackuswbEmitter<A, B> {
5407 <Self as SsePackuswbEmitter<A, B>>::sse_packuswb(self, op0, op1);
5408 }
5409 /// `SSE_PADDB` (PADDB).
5410 /// 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.
5411 ///
5412 ///
5413 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
5414 ///
5415 /// Supported operand variants:
5416 ///
5417 /// ```text
5418 /// +---+----------+
5419 /// | # | Operands |
5420 /// +---+----------+
5421 /// | 1 | Xmm, Mem |
5422 /// | 2 | Xmm, Xmm |
5423 /// +---+----------+
5424 /// ```
5425 #[inline]
5426 pub fn sse_paddb<A, B>(&mut self, op0: A, op1: B)
5427 where Assembler<'a>: SsePaddbEmitter<A, B> {
5428 <Self as SsePaddbEmitter<A, B>>::sse_paddb(self, op0, op1);
5429 }
5430 /// `SSE_PADDD` (PADDD).
5431 /// 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.
5432 ///
5433 ///
5434 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
5435 ///
5436 /// Supported operand variants:
5437 ///
5438 /// ```text
5439 /// +---+----------+
5440 /// | # | Operands |
5441 /// +---+----------+
5442 /// | 1 | Xmm, Mem |
5443 /// | 2 | Xmm, Xmm |
5444 /// +---+----------+
5445 /// ```
5446 #[inline]
5447 pub fn sse_paddd<A, B>(&mut self, op0: A, op1: B)
5448 where Assembler<'a>: SsePadddEmitter<A, B> {
5449 <Self as SsePadddEmitter<A, B>>::sse_paddd(self, op0, op1);
5450 }
5451 /// `SSE_PADDQ` (PADDQ).
5452 /// 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.
5453 ///
5454 ///
5455 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
5456 ///
5457 /// Supported operand variants:
5458 ///
5459 /// ```text
5460 /// +---+----------+
5461 /// | # | Operands |
5462 /// +---+----------+
5463 /// | 1 | Xmm, Mem |
5464 /// | 2 | Xmm, Xmm |
5465 /// +---+----------+
5466 /// ```
5467 #[inline]
5468 pub fn sse_paddq<A, B>(&mut self, op0: A, op1: B)
5469 where Assembler<'a>: SsePaddqEmitter<A, B> {
5470 <Self as SsePaddqEmitter<A, B>>::sse_paddq(self, op0, op1);
5471 }
5472 /// `SSE_PADDSB` (PADDSB).
5473 /// 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.
5474 ///
5475 ///
5476 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
5477 ///
5478 /// Supported operand variants:
5479 ///
5480 /// ```text
5481 /// +---+----------+
5482 /// | # | Operands |
5483 /// +---+----------+
5484 /// | 1 | Xmm, Mem |
5485 /// | 2 | Xmm, Xmm |
5486 /// +---+----------+
5487 /// ```
5488 #[inline]
5489 pub fn sse_paddsb<A, B>(&mut self, op0: A, op1: B)
5490 where Assembler<'a>: SsePaddsbEmitter<A, B> {
5491 <Self as SsePaddsbEmitter<A, B>>::sse_paddsb(self, op0, op1);
5492 }
5493 /// `SSE_PADDSW` (PADDSW).
5494 /// 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.
5495 ///
5496 ///
5497 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDSB%3APADDSW.html).
5498 ///
5499 /// Supported operand variants:
5500 ///
5501 /// ```text
5502 /// +---+----------+
5503 /// | # | Operands |
5504 /// +---+----------+
5505 /// | 1 | Xmm, Mem |
5506 /// | 2 | Xmm, Xmm |
5507 /// +---+----------+
5508 /// ```
5509 #[inline]
5510 pub fn sse_paddsw<A, B>(&mut self, op0: A, op1: B)
5511 where Assembler<'a>: SsePaddswEmitter<A, B> {
5512 <Self as SsePaddswEmitter<A, B>>::sse_paddsw(self, op0, op1);
5513 }
5514 /// `SSE_PADDUSB` (PADDUSB).
5515 /// 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.
5516 ///
5517 ///
5518 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
5519 ///
5520 /// Supported operand variants:
5521 ///
5522 /// ```text
5523 /// +---+----------+
5524 /// | # | Operands |
5525 /// +---+----------+
5526 /// | 1 | Xmm, Mem |
5527 /// | 2 | Xmm, Xmm |
5528 /// +---+----------+
5529 /// ```
5530 #[inline]
5531 pub fn sse_paddusb<A, B>(&mut self, op0: A, op1: B)
5532 where Assembler<'a>: SsePaddusbEmitter<A, B> {
5533 <Self as SsePaddusbEmitter<A, B>>::sse_paddusb(self, op0, op1);
5534 }
5535 /// `SSE_PADDUSW` (PADDUSW).
5536 /// 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.
5537 ///
5538 ///
5539 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDUSB%3APADDUSW.html).
5540 ///
5541 /// Supported operand variants:
5542 ///
5543 /// ```text
5544 /// +---+----------+
5545 /// | # | Operands |
5546 /// +---+----------+
5547 /// | 1 | Xmm, Mem |
5548 /// | 2 | Xmm, Xmm |
5549 /// +---+----------+
5550 /// ```
5551 #[inline]
5552 pub fn sse_paddusw<A, B>(&mut self, op0: A, op1: B)
5553 where Assembler<'a>: SsePadduswEmitter<A, B> {
5554 <Self as SsePadduswEmitter<A, B>>::sse_paddusw(self, op0, op1);
5555 }
5556 /// `SSE_PADDW` (PADDW).
5557 /// 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.
5558 ///
5559 ///
5560 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PADDB%3APADDW%3APADDD%3APADDQ.html).
5561 ///
5562 /// Supported operand variants:
5563 ///
5564 /// ```text
5565 /// +---+----------+
5566 /// | # | Operands |
5567 /// +---+----------+
5568 /// | 1 | Xmm, Mem |
5569 /// | 2 | Xmm, Xmm |
5570 /// +---+----------+
5571 /// ```
5572 #[inline]
5573 pub fn sse_paddw<A, B>(&mut self, op0: A, op1: B)
5574 where Assembler<'a>: SsePaddwEmitter<A, B> {
5575 <Self as SsePaddwEmitter<A, B>>::sse_paddw(self, op0, op1);
5576 }
5577 /// `SSE_PAND` (PAND).
5578 /// 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.
5579 ///
5580 ///
5581 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAND.html).
5582 ///
5583 /// Supported operand variants:
5584 ///
5585 /// ```text
5586 /// +---+----------+
5587 /// | # | Operands |
5588 /// +---+----------+
5589 /// | 1 | Xmm, Mem |
5590 /// | 2 | Xmm, Xmm |
5591 /// +---+----------+
5592 /// ```
5593 #[inline]
5594 pub fn sse_pand<A, B>(&mut self, op0: A, op1: B)
5595 where Assembler<'a>: SsePandEmitter<A, B> {
5596 <Self as SsePandEmitter<A, B>>::sse_pand(self, op0, op1);
5597 }
5598 /// `SSE_PANDN` (PANDN).
5599 /// 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.
5600 ///
5601 ///
5602 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PANDN.html).
5603 ///
5604 /// Supported operand variants:
5605 ///
5606 /// ```text
5607 /// +---+----------+
5608 /// | # | Operands |
5609 /// +---+----------+
5610 /// | 1 | Xmm, Mem |
5611 /// | 2 | Xmm, Xmm |
5612 /// +---+----------+
5613 /// ```
5614 #[inline]
5615 pub fn sse_pandn<A, B>(&mut self, op0: A, op1: B)
5616 where Assembler<'a>: SsePandnEmitter<A, B> {
5617 <Self as SsePandnEmitter<A, B>>::sse_pandn(self, op0, op1);
5618 }
5619 /// `SSE_PAVGB` (PAVGB).
5620 /// Performs a SIMD average of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the results in the destination operand. For each corresponding pair of data elements in the first and second operands, the elements are added together, a 1 is added to the temporary sum, and that result is shifted right one bit position.
5621 ///
5622 ///
5623 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAVGB%3APAVGW.html).
5624 ///
5625 /// Supported operand variants:
5626 ///
5627 /// ```text
5628 /// +---+----------+
5629 /// | # | Operands |
5630 /// +---+----------+
5631 /// | 1 | Xmm, Mem |
5632 /// | 2 | Xmm, Xmm |
5633 /// +---+----------+
5634 /// ```
5635 #[inline]
5636 pub fn sse_pavgb<A, B>(&mut self, op0: A, op1: B)
5637 where Assembler<'a>: SsePavgbEmitter<A, B> {
5638 <Self as SsePavgbEmitter<A, B>>::sse_pavgb(self, op0, op1);
5639 }
5640 /// `SSE_PAVGW` (PAVGW).
5641 /// Performs a SIMD average of the packed unsigned integers from the source operand (second operand) and the destination operand (first operand), and stores the results in the destination operand. For each corresponding pair of data elements in the first and second operands, the elements are added together, a 1 is added to the temporary sum, and that result is shifted right one bit position.
5642 ///
5643 ///
5644 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PAVGB%3APAVGW.html).
5645 ///
5646 /// Supported operand variants:
5647 ///
5648 /// ```text
5649 /// +---+----------+
5650 /// | # | Operands |
5651 /// +---+----------+
5652 /// | 1 | Xmm, Mem |
5653 /// | 2 | Xmm, Xmm |
5654 /// +---+----------+
5655 /// ```
5656 #[inline]
5657 pub fn sse_pavgw<A, B>(&mut self, op0: A, op1: B)
5658 where Assembler<'a>: SsePavgwEmitter<A, B> {
5659 <Self as SsePavgwEmitter<A, B>>::sse_pavgw(self, op0, op1);
5660 }
5661 /// `SSE_PCMPEQB` (PCMPEQB).
5662 /// 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.
5663 ///
5664 ///
5665 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
5666 ///
5667 /// Supported operand variants:
5668 ///
5669 /// ```text
5670 /// +---+----------+
5671 /// | # | Operands |
5672 /// +---+----------+
5673 /// | 1 | Xmm, Mem |
5674 /// | 2 | Xmm, Xmm |
5675 /// +---+----------+
5676 /// ```
5677 #[inline]
5678 pub fn sse_pcmpeqb<A, B>(&mut self, op0: A, op1: B)
5679 where Assembler<'a>: SsePcmpeqbEmitter<A, B> {
5680 <Self as SsePcmpeqbEmitter<A, B>>::sse_pcmpeqb(self, op0, op1);
5681 }
5682 /// `SSE_PCMPEQD` (PCMPEQD).
5683 /// 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.
5684 ///
5685 ///
5686 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
5687 ///
5688 /// Supported operand variants:
5689 ///
5690 /// ```text
5691 /// +---+----------+
5692 /// | # | Operands |
5693 /// +---+----------+
5694 /// | 1 | Xmm, Mem |
5695 /// | 2 | Xmm, Xmm |
5696 /// +---+----------+
5697 /// ```
5698 #[inline]
5699 pub fn sse_pcmpeqd<A, B>(&mut self, op0: A, op1: B)
5700 where Assembler<'a>: SsePcmpeqdEmitter<A, B> {
5701 <Self as SsePcmpeqdEmitter<A, B>>::sse_pcmpeqd(self, op0, op1);
5702 }
5703 /// `SSE_PCMPEQW` (PCMPEQW).
5704 /// 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.
5705 ///
5706 ///
5707 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPEQB%3APCMPEQW%3APCMPEQD.html).
5708 ///
5709 /// Supported operand variants:
5710 ///
5711 /// ```text
5712 /// +---+----------+
5713 /// | # | Operands |
5714 /// +---+----------+
5715 /// | 1 | Xmm, Mem |
5716 /// | 2 | Xmm, Xmm |
5717 /// +---+----------+
5718 /// ```
5719 #[inline]
5720 pub fn sse_pcmpeqw<A, B>(&mut self, op0: A, op1: B)
5721 where Assembler<'a>: SsePcmpeqwEmitter<A, B> {
5722 <Self as SsePcmpeqwEmitter<A, B>>::sse_pcmpeqw(self, op0, op1);
5723 }
5724 /// `SSE_PCMPGTB` (PCMPGTB).
5725 /// 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.
5726 ///
5727 ///
5728 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
5729 ///
5730 /// Supported operand variants:
5731 ///
5732 /// ```text
5733 /// +---+----------+
5734 /// | # | Operands |
5735 /// +---+----------+
5736 /// | 1 | Xmm, Mem |
5737 /// | 2 | Xmm, Xmm |
5738 /// +---+----------+
5739 /// ```
5740 #[inline]
5741 pub fn sse_pcmpgtb<A, B>(&mut self, op0: A, op1: B)
5742 where Assembler<'a>: SsePcmpgtbEmitter<A, B> {
5743 <Self as SsePcmpgtbEmitter<A, B>>::sse_pcmpgtb(self, op0, op1);
5744 }
5745 /// `SSE_PCMPGTD` (PCMPGTD).
5746 /// 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.
5747 ///
5748 ///
5749 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
5750 ///
5751 /// Supported operand variants:
5752 ///
5753 /// ```text
5754 /// +---+----------+
5755 /// | # | Operands |
5756 /// +---+----------+
5757 /// | 1 | Xmm, Mem |
5758 /// | 2 | Xmm, Xmm |
5759 /// +---+----------+
5760 /// ```
5761 #[inline]
5762 pub fn sse_pcmpgtd<A, B>(&mut self, op0: A, op1: B)
5763 where Assembler<'a>: SsePcmpgtdEmitter<A, B> {
5764 <Self as SsePcmpgtdEmitter<A, B>>::sse_pcmpgtd(self, op0, op1);
5765 }
5766 /// `SSE_PCMPGTW` (PCMPGTW).
5767 /// 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.
5768 ///
5769 ///
5770 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PCMPGTB%3APCMPGTW%3APCMPGTD.html).
5771 ///
5772 /// Supported operand variants:
5773 ///
5774 /// ```text
5775 /// +---+----------+
5776 /// | # | Operands |
5777 /// +---+----------+
5778 /// | 1 | Xmm, Mem |
5779 /// | 2 | Xmm, Xmm |
5780 /// +---+----------+
5781 /// ```
5782 #[inline]
5783 pub fn sse_pcmpgtw<A, B>(&mut self, op0: A, op1: B)
5784 where Assembler<'a>: SsePcmpgtwEmitter<A, B> {
5785 <Self as SsePcmpgtwEmitter<A, B>>::sse_pcmpgtw(self, op0, op1);
5786 }
5787 /// `SSE_PEXTRW` (PEXTRW).
5788 /// Copies the word in the source operand (second operand) specified by the count operand (third operand) to the destination operand (first operand). The source operand can be an MMX technology register or an XMM register. The destination operand can be the low word of a general-purpose register or a 16-bit memory address. The count operand is an 8-bit immediate. When specifying a word location in an MMX technology register, the 2 least-significant bits of the count operand specify the location; for an XMM register, the 3 least-significant bits specify the location. The content of the destination register above bit 16 is cleared (set to all 0s).
5789 ///
5790 ///
5791 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PEXTRW.html).
5792 ///
5793 /// Supported operand variants:
5794 ///
5795 /// ```text
5796 /// +---+---------------+
5797 /// | # | Operands |
5798 /// +---+---------------+
5799 /// | 1 | Gpd, Xmm, Imm |
5800 /// | 2 | Mem, Xmm, Imm |
5801 /// +---+---------------+
5802 /// ```
5803 #[inline]
5804 pub fn sse_pextrw<A, B, C>(&mut self, op0: A, op1: B, op2: C)
5805 where Assembler<'a>: SsePextrwEmitter<A, B, C> {
5806 <Self as SsePextrwEmitter<A, B, C>>::sse_pextrw(self, op0, op1, op2);
5807 }
5808 /// `SSE_PINSRW` (PINSRW).
5809 /// Three operand MMX and SSE instructions
5810 ///
5811 ///
5812 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PINSRW.html).
5813 ///
5814 /// Supported operand variants:
5815 ///
5816 /// ```text
5817 /// +---+---------------+
5818 /// | # | Operands |
5819 /// +---+---------------+
5820 /// | 1 | Xmm, Gpd, Imm |
5821 /// | 2 | Xmm, Mem, Imm |
5822 /// +---+---------------+
5823 /// ```
5824 #[inline]
5825 pub fn sse_pinsrw<A, B, C>(&mut self, op0: A, op1: B, op2: C)
5826 where Assembler<'a>: SsePinsrwEmitter<A, B, C> {
5827 <Self as SsePinsrwEmitter<A, B, C>>::sse_pinsrw(self, op0, op1, op2);
5828 }
5829 /// `SSE_PMADDWD` (PMADDWD).
5830 /// 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).
5831 ///
5832 ///
5833 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMADDWD.html).
5834 ///
5835 /// Supported operand variants:
5836 ///
5837 /// ```text
5838 /// +---+----------+
5839 /// | # | Operands |
5840 /// +---+----------+
5841 /// | 1 | Xmm, Mem |
5842 /// | 2 | Xmm, Xmm |
5843 /// +---+----------+
5844 /// ```
5845 #[inline]
5846 pub fn sse_pmaddwd<A, B>(&mut self, op0: A, op1: B)
5847 where Assembler<'a>: SsePmaddwdEmitter<A, B> {
5848 <Self as SsePmaddwdEmitter<A, B>>::sse_pmaddwd(self, op0, op1);
5849 }
5850 /// `SSE_PMAXSW` (PMAXSW).
5851 /// Performs a SIMD compare of the packed signed byte, word, dword or qword integers in the second source operand and the first source operand and returns the maximum value for each pair of integers to the destination operand.
5852 ///
5853 ///
5854 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMAXSB%3APMAXSW%3APMAXSD%3APMAXSQ.html).
5855 ///
5856 /// Supported operand variants:
5857 ///
5858 /// ```text
5859 /// +---+----------+
5860 /// | # | Operands |
5861 /// +---+----------+
5862 /// | 1 | Xmm, Mem |
5863 /// | 2 | Xmm, Xmm |
5864 /// +---+----------+
5865 /// ```
5866 #[inline]
5867 pub fn sse_pmaxsw<A, B>(&mut self, op0: A, op1: B)
5868 where Assembler<'a>: SsePmaxswEmitter<A, B> {
5869 <Self as SsePmaxswEmitter<A, B>>::sse_pmaxsw(self, op0, op1);
5870 }
5871 /// `SSE_PMAXUB` (PMAXUB).
5872 /// Performs a SIMD compare of the packed unsigned byte, word integers in the second source operand and the first source operand and returns the maximum value for each pair of integers to the destination operand.
5873 ///
5874 ///
5875 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMAXUB%3APMAXUW.html).
5876 ///
5877 /// Supported operand variants:
5878 ///
5879 /// ```text
5880 /// +---+----------+
5881 /// | # | Operands |
5882 /// +---+----------+
5883 /// | 1 | Xmm, Mem |
5884 /// | 2 | Xmm, Xmm |
5885 /// +---+----------+
5886 /// ```
5887 #[inline]
5888 pub fn sse_pmaxub<A, B>(&mut self, op0: A, op1: B)
5889 where Assembler<'a>: SsePmaxubEmitter<A, B> {
5890 <Self as SsePmaxubEmitter<A, B>>::sse_pmaxub(self, op0, op1);
5891 }
5892 /// `SSE_PMINSW` (PMINSW).
5893 /// Performs a SIMD compare of the packed signed byte, word, or dword integers in the second source operand and the first source operand and returns the minimum value for each pair of integers to the destination operand.
5894 ///
5895 ///
5896 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMINSB%3APMINSW.html).
5897 ///
5898 /// Supported operand variants:
5899 ///
5900 /// ```text
5901 /// +---+----------+
5902 /// | # | Operands |
5903 /// +---+----------+
5904 /// | 1 | Xmm, Mem |
5905 /// | 2 | Xmm, Xmm |
5906 /// +---+----------+
5907 /// ```
5908 #[inline]
5909 pub fn sse_pminsw<A, B>(&mut self, op0: A, op1: B)
5910 where Assembler<'a>: SsePminswEmitter<A, B> {
5911 <Self as SsePminswEmitter<A, B>>::sse_pminsw(self, op0, op1);
5912 }
5913 /// `SSE_PMINUB` (PMINUB).
5914 /// Performs a SIMD compare of the packed unsigned byte or word integers in the second source operand and the first source operand and returns the minimum value for each pair of integers to the destination operand.
5915 ///
5916 ///
5917 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMINUB%3APMINUW.html).
5918 ///
5919 /// Supported operand variants:
5920 ///
5921 /// ```text
5922 /// +---+----------+
5923 /// | # | Operands |
5924 /// +---+----------+
5925 /// | 1 | Xmm, Mem |
5926 /// | 2 | Xmm, Xmm |
5927 /// +---+----------+
5928 /// ```
5929 #[inline]
5930 pub fn sse_pminub<A, B>(&mut self, op0: A, op1: B)
5931 where Assembler<'a>: SsePminubEmitter<A, B> {
5932 <Self as SsePminubEmitter<A, B>>::sse_pminub(self, op0, op1);
5933 }
5934 /// `SSE_PMOVMSKB` (PMOVMSKB).
5935 /// Creates a mask made up of the most significant bit of each byte of the source operand (second operand) and stores the result in the low byte or word of the destination operand (first operand).
5936 ///
5937 ///
5938 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMOVMSKB.html).
5939 ///
5940 /// Supported operand variants:
5941 ///
5942 /// ```text
5943 /// +---+----------+
5944 /// | # | Operands |
5945 /// +---+----------+
5946 /// | 1 | Gpq, Xmm |
5947 /// +---+----------+
5948 /// ```
5949 #[inline]
5950 pub fn sse_pmovmskb<A, B>(&mut self, op0: A, op1: B)
5951 where Assembler<'a>: SsePmovmskbEmitter<A, B> {
5952 <Self as SsePmovmskbEmitter<A, B>>::sse_pmovmskb(self, op0, op1);
5953 }
5954 /// `SSE_PMULHUW` (PMULHUW).
5955 /// Performs a SIMD unsigned multiply of the packed unsigned word integers in the destination operand (first operand) and the source operand (second operand), and stores the high 16 bits of each 32-bit intermediate results in the destination operand. (Figure 4-12 shows this operation when using 64-bit operands.)
5956 ///
5957 ///
5958 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULHUW.html).
5959 ///
5960 /// Supported operand variants:
5961 ///
5962 /// ```text
5963 /// +---+----------+
5964 /// | # | Operands |
5965 /// +---+----------+
5966 /// | 1 | Xmm, Mem |
5967 /// | 2 | Xmm, Xmm |
5968 /// +---+----------+
5969 /// ```
5970 #[inline]
5971 pub fn sse_pmulhuw<A, B>(&mut self, op0: A, op1: B)
5972 where Assembler<'a>: SsePmulhuwEmitter<A, B> {
5973 <Self as SsePmulhuwEmitter<A, B>>::sse_pmulhuw(self, op0, op1);
5974 }
5975 /// `SSE_PMULHW` (PMULHW).
5976 /// 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.)
5977 ///
5978 ///
5979 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULHW.html).
5980 ///
5981 /// Supported operand variants:
5982 ///
5983 /// ```text
5984 /// +---+----------+
5985 /// | # | Operands |
5986 /// +---+----------+
5987 /// | 1 | Xmm, Mem |
5988 /// | 2 | Xmm, Xmm |
5989 /// +---+----------+
5990 /// ```
5991 #[inline]
5992 pub fn sse_pmulhw<A, B>(&mut self, op0: A, op1: B)
5993 where Assembler<'a>: SsePmulhwEmitter<A, B> {
5994 <Self as SsePmulhwEmitter<A, B>>::sse_pmulhw(self, op0, op1);
5995 }
5996 /// `SSE_PMULLW` (PMULLW).
5997 /// 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.)
5998 ///
5999 ///
6000 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULLW.html).
6001 ///
6002 /// Supported operand variants:
6003 ///
6004 /// ```text
6005 /// +---+----------+
6006 /// | # | Operands |
6007 /// +---+----------+
6008 /// | 1 | Xmm, Mem |
6009 /// | 2 | Xmm, Xmm |
6010 /// +---+----------+
6011 /// ```
6012 #[inline]
6013 pub fn sse_pmullw<A, B>(&mut self, op0: A, op1: B)
6014 where Assembler<'a>: SsePmullwEmitter<A, B> {
6015 <Self as SsePmullwEmitter<A, B>>::sse_pmullw(self, op0, op1);
6016 }
6017 /// `SSE_PMULUDQ` (PMULUDQ).
6018 /// Multiplies the first operand (destination operand) by the second operand (source operand) and stores the result in the destination operand.
6019 ///
6020 ///
6021 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PMULUDQ.html).
6022 ///
6023 /// Supported operand variants:
6024 ///
6025 /// ```text
6026 /// +---+----------+
6027 /// | # | Operands |
6028 /// +---+----------+
6029 /// | 1 | Xmm, Mem |
6030 /// | 2 | Xmm, Xmm |
6031 /// +---+----------+
6032 /// ```
6033 #[inline]
6034 pub fn sse_pmuludq<A, B>(&mut self, op0: A, op1: B)
6035 where Assembler<'a>: SsePmuludqEmitter<A, B> {
6036 <Self as SsePmuludqEmitter<A, B>>::sse_pmuludq(self, op0, op1);
6037 }
6038 /// `SSE_POR` (POR).
6039 /// 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.
6040 ///
6041 ///
6042 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/POR.html).
6043 ///
6044 /// Supported operand variants:
6045 ///
6046 /// ```text
6047 /// +---+----------+
6048 /// | # | Operands |
6049 /// +---+----------+
6050 /// | 1 | Xmm, Mem |
6051 /// | 2 | Xmm, Xmm |
6052 /// +---+----------+
6053 /// ```
6054 #[inline]
6055 pub fn sse_por<A, B>(&mut self, op0: A, op1: B)
6056 where Assembler<'a>: SsePorEmitter<A, B> {
6057 <Self as SsePorEmitter<A, B>>::sse_por(self, op0, op1);
6058 }
6059 /// `SSE_PSADBW` (PSADBW).
6060 /// Computes the absolute value of the difference of 8 unsigned byte integers from the source operand (second operand) and from the destination operand (first operand). These 8 differences are then summed to produce an unsigned word integer result that is stored in the destination operand. Figure 4-14 shows the operation of the PSADBW instruction when using 64-bit operands.
6061 ///
6062 ///
6063 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSADBW.html).
6064 ///
6065 /// Supported operand variants:
6066 ///
6067 /// ```text
6068 /// +---+----------+
6069 /// | # | Operands |
6070 /// +---+----------+
6071 /// | 1 | Xmm, Mem |
6072 /// | 2 | Xmm, Xmm |
6073 /// +---+----------+
6074 /// ```
6075 #[inline]
6076 pub fn sse_psadbw<A, B>(&mut self, op0: A, op1: B)
6077 where Assembler<'a>: SsePsadbwEmitter<A, B> {
6078 <Self as SsePsadbwEmitter<A, B>>::sse_psadbw(self, op0, op1);
6079 }
6080 /// `SSE_PSHUFD` (PSHUFD).
6081 /// Copies doublewords from source operand (second operand) and inserts them in the destination operand (first operand) at the locations selected with the order operand (third operand). Figure 4-16 shows the operation of the 256-bit VPSHUFD instruction and the encoding of the order operand. Each 2-bit field in the order operand selects the contents of one doubleword location within a 128-bit lane and copy to the target element in the destination operand. For example, bits 0 and 1 of the order operand targets the first doubleword element in the low and high 128-bit lane of the destination operand for 256-bit VPSHUFD. The encoded value of bits 1:0 of the order operand (see the field encoding in Figure 4-16) determines which doubleword element (from the respective 128-bit lane) of the source operand will be copied to doubleword 0 of the destination operand.
6082 ///
6083 ///
6084 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSHUFD.html).
6085 ///
6086 /// Supported operand variants:
6087 ///
6088 /// ```text
6089 /// +---+---------------+
6090 /// | # | Operands |
6091 /// +---+---------------+
6092 /// | 1 | Xmm, Mem, Imm |
6093 /// | 2 | Xmm, Xmm, Imm |
6094 /// +---+---------------+
6095 /// ```
6096 #[inline]
6097 pub fn sse_pshufd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
6098 where Assembler<'a>: SsePshufdEmitter<A, B, C> {
6099 <Self as SsePshufdEmitter<A, B, C>>::sse_pshufd(self, op0, op1, op2);
6100 }
6101 /// `SSE_PSHUFHW` (PSHUFHW).
6102 /// Copies words from the high quadword of a 128-bit lane of the source operand and inserts them in the high quadword of the destination operand at word locations (of the respective lane) selected with the immediate operand. This 256-bit operation is similar to the in-lane operation used by the 256-bit VPSHUFD instruction, which is illustrated in Figure 4-16. For 128-bit operation, only the low 128-bit lane is operative. Each 2-bit field in the immediate operand selects the contents of one word location in the high quadword of the destination operand. The binary encodings of the immediate operand fields select words (0, 1, 2 or 3, 4) from the high quadword of the source operand to be copied to the destination operand. The low quadword of the source operand is copied to the low quadword of the destination operand, for each 128-bit lane.
6103 ///
6104 ///
6105 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSHUFHW.html).
6106 ///
6107 /// Supported operand variants:
6108 ///
6109 /// ```text
6110 /// +---+---------------+
6111 /// | # | Operands |
6112 /// +---+---------------+
6113 /// | 1 | Xmm, Mem, Imm |
6114 /// | 2 | Xmm, Xmm, Imm |
6115 /// +---+---------------+
6116 /// ```
6117 #[inline]
6118 pub fn sse_pshufhw<A, B, C>(&mut self, op0: A, op1: B, op2: C)
6119 where Assembler<'a>: SsePshufhwEmitter<A, B, C> {
6120 <Self as SsePshufhwEmitter<A, B, C>>::sse_pshufhw(self, op0, op1, op2);
6121 }
6122 /// `SSE_PSHUFLW` (PSHUFLW).
6123 /// Copies words from the low quadword of a 128-bit lane of the source operand and inserts them in the low quadword of the destination operand at word locations (of the respective lane) selected with the immediate operand. The 256-bit operation is similar to the in-lane operation used by the 256-bit VPSHUFD instruction, which is illustrated in Figure 4-16. For 128-bit operation, only the low 128-bit lane is operative. Each 2-bit field in the immediate operand selects the contents of one word location in the low quadword of the destination operand. The binary encodings of the immediate operand fields select words (0, 1, 2 or 3) from the low quadword of the source operand to be copied to the destination operand. The high quadword of the source operand is copied to the high quadword of the destination operand, for each 128-bit lane.
6124 ///
6125 ///
6126 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSHUFLW.html).
6127 ///
6128 /// Supported operand variants:
6129 ///
6130 /// ```text
6131 /// +---+---------------+
6132 /// | # | Operands |
6133 /// +---+---------------+
6134 /// | 1 | Xmm, Mem, Imm |
6135 /// | 2 | Xmm, Xmm, Imm |
6136 /// +---+---------------+
6137 /// ```
6138 #[inline]
6139 pub fn sse_pshuflw<A, B, C>(&mut self, op0: A, op1: B, op2: C)
6140 where Assembler<'a>: SsePshuflwEmitter<A, B, C> {
6141 <Self as SsePshuflwEmitter<A, B, C>>::sse_pshuflw(self, op0, op1, op2);
6142 }
6143 /// `SSE_PSLLD` (PSLLD).
6144 /// 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.
6145 ///
6146 ///
6147 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
6148 ///
6149 /// Supported operand variants:
6150 ///
6151 /// ```text
6152 /// +---+----------+
6153 /// | # | Operands |
6154 /// +---+----------+
6155 /// | 1 | Xmm, Imm |
6156 /// | 2 | Xmm, Mem |
6157 /// | 3 | Xmm, Xmm |
6158 /// +---+----------+
6159 /// ```
6160 #[inline]
6161 pub fn sse_pslld<A, B>(&mut self, op0: A, op1: B)
6162 where Assembler<'a>: SsePslldEmitter<A, B> {
6163 <Self as SsePslldEmitter<A, B>>::sse_pslld(self, op0, op1);
6164 }
6165 /// `SSE_PSLLDQ` (PSLLDQ).
6166 /// Shifts the destination operand (first operand) to the left by the number of bytes specified in the count operand (second operand). The empty low-order bytes are cleared (set to all 0s). If the value specified by the count operand is greater than 15, the destination operand is set to all 0s. The count operand is an 8-bit immediate.
6167 ///
6168 ///
6169 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLDQ.html).
6170 ///
6171 /// Supported operand variants:
6172 ///
6173 /// ```text
6174 /// +---+----------+
6175 /// | # | Operands |
6176 /// +---+----------+
6177 /// | 1 | Xmm, Imm |
6178 /// +---+----------+
6179 /// ```
6180 #[inline]
6181 pub fn sse_pslldq<A, B>(&mut self, op0: A, op1: B)
6182 where Assembler<'a>: SsePslldqEmitter<A, B> {
6183 <Self as SsePslldqEmitter<A, B>>::sse_pslldq(self, op0, op1);
6184 }
6185 /// `SSE_PSLLQ` (PSLLQ).
6186 /// 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.
6187 ///
6188 ///
6189 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
6190 ///
6191 /// Supported operand variants:
6192 ///
6193 /// ```text
6194 /// +---+----------+
6195 /// | # | Operands |
6196 /// +---+----------+
6197 /// | 1 | Xmm, Imm |
6198 /// | 2 | Xmm, Mem |
6199 /// | 3 | Xmm, Xmm |
6200 /// +---+----------+
6201 /// ```
6202 #[inline]
6203 pub fn sse_psllq<A, B>(&mut self, op0: A, op1: B)
6204 where Assembler<'a>: SsePsllqEmitter<A, B> {
6205 <Self as SsePsllqEmitter<A, B>>::sse_psllq(self, op0, op1);
6206 }
6207 /// `SSE_PSLLW` (PSLLW).
6208 /// 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.
6209 ///
6210 ///
6211 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSLLW%3APSLLD%3APSLLQ.html).
6212 ///
6213 /// Supported operand variants:
6214 ///
6215 /// ```text
6216 /// +---+----------+
6217 /// | # | Operands |
6218 /// +---+----------+
6219 /// | 1 | Xmm, Imm |
6220 /// | 2 | Xmm, Mem |
6221 /// | 3 | Xmm, Xmm |
6222 /// +---+----------+
6223 /// ```
6224 #[inline]
6225 pub fn sse_psllw<A, B>(&mut self, op0: A, op1: B)
6226 where Assembler<'a>: SsePsllwEmitter<A, B> {
6227 <Self as SsePsllwEmitter<A, B>>::sse_psllw(self, op0, op1);
6228 }
6229 /// `SSE_PSRAD` (PSRAD).
6230 /// 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.)
6231 ///
6232 ///
6233 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
6234 ///
6235 /// Supported operand variants:
6236 ///
6237 /// ```text
6238 /// +---+----------+
6239 /// | # | Operands |
6240 /// +---+----------+
6241 /// | 1 | Xmm, Imm |
6242 /// | 2 | Xmm, Mem |
6243 /// | 3 | Xmm, Xmm |
6244 /// +---+----------+
6245 /// ```
6246 #[inline]
6247 pub fn sse_psrad<A, B>(&mut self, op0: A, op1: B)
6248 where Assembler<'a>: SsePsradEmitter<A, B> {
6249 <Self as SsePsradEmitter<A, B>>::sse_psrad(self, op0, op1);
6250 }
6251 /// `SSE_PSRAW` (PSRAW).
6252 /// 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.)
6253 ///
6254 ///
6255 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRAW%3APSRAD%3APSRAQ.html).
6256 ///
6257 /// Supported operand variants:
6258 ///
6259 /// ```text
6260 /// +---+----------+
6261 /// | # | Operands |
6262 /// +---+----------+
6263 /// | 1 | Xmm, Imm |
6264 /// | 2 | Xmm, Mem |
6265 /// | 3 | Xmm, Xmm |
6266 /// +---+----------+
6267 /// ```
6268 #[inline]
6269 pub fn sse_psraw<A, B>(&mut self, op0: A, op1: B)
6270 where Assembler<'a>: SsePsrawEmitter<A, B> {
6271 <Self as SsePsrawEmitter<A, B>>::sse_psraw(self, op0, op1);
6272 }
6273 /// `SSE_PSRLD` (PSRLD).
6274 /// 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.
6275 ///
6276 ///
6277 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
6278 ///
6279 /// Supported operand variants:
6280 ///
6281 /// ```text
6282 /// +---+----------+
6283 /// | # | Operands |
6284 /// +---+----------+
6285 /// | 1 | Xmm, Imm |
6286 /// | 2 | Xmm, Mem |
6287 /// | 3 | Xmm, Xmm |
6288 /// +---+----------+
6289 /// ```
6290 #[inline]
6291 pub fn sse_psrld<A, B>(&mut self, op0: A, op1: B)
6292 where Assembler<'a>: SsePsrldEmitter<A, B> {
6293 <Self as SsePsrldEmitter<A, B>>::sse_psrld(self, op0, op1);
6294 }
6295 /// `SSE_PSRLDQ` (PSRLDQ).
6296 /// Shifts the destination operand (first operand) to the right by the number of bytes specified in the count operand (second operand). The empty high-order bytes are cleared (set to all 0s). If the value specified by the count operand is greater than 15, the destination operand is set to all 0s. The count operand is an 8-bit immediate.
6297 ///
6298 ///
6299 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLDQ.html).
6300 ///
6301 /// Supported operand variants:
6302 ///
6303 /// ```text
6304 /// +---+----------+
6305 /// | # | Operands |
6306 /// +---+----------+
6307 /// | 1 | Xmm, Imm |
6308 /// +---+----------+
6309 /// ```
6310 #[inline]
6311 pub fn sse_psrldq<A, B>(&mut self, op0: A, op1: B)
6312 where Assembler<'a>: SsePsrldqEmitter<A, B> {
6313 <Self as SsePsrldqEmitter<A, B>>::sse_psrldq(self, op0, op1);
6314 }
6315 /// `SSE_PSRLQ` (PSRLQ).
6316 /// 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.
6317 ///
6318 ///
6319 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
6320 ///
6321 /// Supported operand variants:
6322 ///
6323 /// ```text
6324 /// +---+----------+
6325 /// | # | Operands |
6326 /// +---+----------+
6327 /// | 1 | Xmm, Imm |
6328 /// | 2 | Xmm, Mem |
6329 /// | 3 | Xmm, Xmm |
6330 /// +---+----------+
6331 /// ```
6332 #[inline]
6333 pub fn sse_psrlq<A, B>(&mut self, op0: A, op1: B)
6334 where Assembler<'a>: SsePsrlqEmitter<A, B> {
6335 <Self as SsePsrlqEmitter<A, B>>::sse_psrlq(self, op0, op1);
6336 }
6337 /// `SSE_PSRLW` (PSRLW).
6338 /// 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.
6339 ///
6340 ///
6341 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSRLW%3APSRLD%3APSRLQ.html).
6342 ///
6343 /// Supported operand variants:
6344 ///
6345 /// ```text
6346 /// +---+----------+
6347 /// | # | Operands |
6348 /// +---+----------+
6349 /// | 1 | Xmm, Imm |
6350 /// | 2 | Xmm, Mem |
6351 /// | 3 | Xmm, Xmm |
6352 /// +---+----------+
6353 /// ```
6354 #[inline]
6355 pub fn sse_psrlw<A, B>(&mut self, op0: A, op1: B)
6356 where Assembler<'a>: SsePsrlwEmitter<A, B> {
6357 <Self as SsePsrlwEmitter<A, B>>::sse_psrlw(self, op0, op1);
6358 }
6359 /// `SSE_PSUBB` (PSUBB).
6360 /// 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.
6361 ///
6362 ///
6363 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
6364 ///
6365 /// Supported operand variants:
6366 ///
6367 /// ```text
6368 /// +---+----------+
6369 /// | # | Operands |
6370 /// +---+----------+
6371 /// | 1 | Xmm, Mem |
6372 /// | 2 | Xmm, Xmm |
6373 /// +---+----------+
6374 /// ```
6375 #[inline]
6376 pub fn sse_psubb<A, B>(&mut self, op0: A, op1: B)
6377 where Assembler<'a>: SsePsubbEmitter<A, B> {
6378 <Self as SsePsubbEmitter<A, B>>::sse_psubb(self, op0, op1);
6379 }
6380 /// `SSE_PSUBD` (PSUBD).
6381 /// 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.
6382 ///
6383 ///
6384 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
6385 ///
6386 /// Supported operand variants:
6387 ///
6388 /// ```text
6389 /// +---+----------+
6390 /// | # | Operands |
6391 /// +---+----------+
6392 /// | 1 | Xmm, Mem |
6393 /// | 2 | Xmm, Xmm |
6394 /// +---+----------+
6395 /// ```
6396 #[inline]
6397 pub fn sse_psubd<A, B>(&mut self, op0: A, op1: B)
6398 where Assembler<'a>: SsePsubdEmitter<A, B> {
6399 <Self as SsePsubdEmitter<A, B>>::sse_psubd(self, op0, op1);
6400 }
6401 /// `SSE_PSUBQ` (PSUBQ).
6402 /// 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).
6403 ///
6404 ///
6405 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBQ.html).
6406 ///
6407 /// Supported operand variants:
6408 ///
6409 /// ```text
6410 /// +---+----------+
6411 /// | # | Operands |
6412 /// +---+----------+
6413 /// | 1 | Xmm, Mem |
6414 /// | 2 | Xmm, Xmm |
6415 /// +---+----------+
6416 /// ```
6417 #[inline]
6418 pub fn sse_psubq<A, B>(&mut self, op0: A, op1: B)
6419 where Assembler<'a>: SsePsubqEmitter<A, B> {
6420 <Self as SsePsubqEmitter<A, B>>::sse_psubq(self, op0, op1);
6421 }
6422 /// `SSE_PSUBSB` (PSUBSB).
6423 /// 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.
6424 ///
6425 ///
6426 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
6427 ///
6428 /// Supported operand variants:
6429 ///
6430 /// ```text
6431 /// +---+----------+
6432 /// | # | Operands |
6433 /// +---+----------+
6434 /// | 1 | Xmm, Mem |
6435 /// | 2 | Xmm, Xmm |
6436 /// +---+----------+
6437 /// ```
6438 #[inline]
6439 pub fn sse_psubsb<A, B>(&mut self, op0: A, op1: B)
6440 where Assembler<'a>: SsePsubsbEmitter<A, B> {
6441 <Self as SsePsubsbEmitter<A, B>>::sse_psubsb(self, op0, op1);
6442 }
6443 /// `SSE_PSUBSW` (PSUBSW).
6444 /// 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.
6445 ///
6446 ///
6447 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBSB%3APSUBSW.html).
6448 ///
6449 /// Supported operand variants:
6450 ///
6451 /// ```text
6452 /// +---+----------+
6453 /// | # | Operands |
6454 /// +---+----------+
6455 /// | 1 | Xmm, Mem |
6456 /// | 2 | Xmm, Xmm |
6457 /// +---+----------+
6458 /// ```
6459 #[inline]
6460 pub fn sse_psubsw<A, B>(&mut self, op0: A, op1: B)
6461 where Assembler<'a>: SsePsubswEmitter<A, B> {
6462 <Self as SsePsubswEmitter<A, B>>::sse_psubsw(self, op0, op1);
6463 }
6464 /// `SSE_PSUBUSB` (PSUBUSB).
6465 /// 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.
6466 ///
6467 ///
6468 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
6469 ///
6470 /// Supported operand variants:
6471 ///
6472 /// ```text
6473 /// +---+----------+
6474 /// | # | Operands |
6475 /// +---+----------+
6476 /// | 1 | Xmm, Mem |
6477 /// | 2 | Xmm, Xmm |
6478 /// +---+----------+
6479 /// ```
6480 #[inline]
6481 pub fn sse_psubusb<A, B>(&mut self, op0: A, op1: B)
6482 where Assembler<'a>: SsePsubusbEmitter<A, B> {
6483 <Self as SsePsubusbEmitter<A, B>>::sse_psubusb(self, op0, op1);
6484 }
6485 /// `SSE_PSUBUSW` (PSUBUSW).
6486 /// 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.
6487 ///
6488 ///
6489 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBUSB%3APSUBUSW.html).
6490 ///
6491 /// Supported operand variants:
6492 ///
6493 /// ```text
6494 /// +---+----------+
6495 /// | # | Operands |
6496 /// +---+----------+
6497 /// | 1 | Xmm, Mem |
6498 /// | 2 | Xmm, Xmm |
6499 /// +---+----------+
6500 /// ```
6501 #[inline]
6502 pub fn sse_psubusw<A, B>(&mut self, op0: A, op1: B)
6503 where Assembler<'a>: SsePsubuswEmitter<A, B> {
6504 <Self as SsePsubuswEmitter<A, B>>::sse_psubusw(self, op0, op1);
6505 }
6506 /// `SSE_PSUBW` (PSUBW).
6507 /// 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.
6508 ///
6509 ///
6510 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PSUBB%3APSUBW%3APSUBD.html).
6511 ///
6512 /// Supported operand variants:
6513 ///
6514 /// ```text
6515 /// +---+----------+
6516 /// | # | Operands |
6517 /// +---+----------+
6518 /// | 1 | Xmm, Mem |
6519 /// | 2 | Xmm, Xmm |
6520 /// +---+----------+
6521 /// ```
6522 #[inline]
6523 pub fn sse_psubw<A, B>(&mut self, op0: A, op1: B)
6524 where Assembler<'a>: SsePsubwEmitter<A, B> {
6525 <Self as SsePsubwEmitter<A, B>>::sse_psubw(self, op0, op1);
6526 }
6527 /// `SSE_PUNPCKHBW` (PUNPCKHBW).
6528 /// 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.
6529 ///
6530 ///
6531 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
6532 ///
6533 /// Supported operand variants:
6534 ///
6535 /// ```text
6536 /// +---+----------+
6537 /// | # | Operands |
6538 /// +---+----------+
6539 /// | 1 | Xmm, Mem |
6540 /// | 2 | Xmm, Xmm |
6541 /// +---+----------+
6542 /// ```
6543 #[inline]
6544 pub fn sse_punpckhbw<A, B>(&mut self, op0: A, op1: B)
6545 where Assembler<'a>: SsePunpckhbwEmitter<A, B> {
6546 <Self as SsePunpckhbwEmitter<A, B>>::sse_punpckhbw(self, op0, op1);
6547 }
6548 /// `SSE_PUNPCKHDQ` (PUNPCKHDQ).
6549 /// 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.
6550 ///
6551 ///
6552 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
6553 ///
6554 /// Supported operand variants:
6555 ///
6556 /// ```text
6557 /// +---+----------+
6558 /// | # | Operands |
6559 /// +---+----------+
6560 /// | 1 | Xmm, Mem |
6561 /// | 2 | Xmm, Xmm |
6562 /// +---+----------+
6563 /// ```
6564 #[inline]
6565 pub fn sse_punpckhdq<A, B>(&mut self, op0: A, op1: B)
6566 where Assembler<'a>: SsePunpckhdqEmitter<A, B> {
6567 <Self as SsePunpckhdqEmitter<A, B>>::sse_punpckhdq(self, op0, op1);
6568 }
6569 /// `SSE_PUNPCKHQDQ` (PUNPCKHQDQ).
6570 /// 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.
6571 ///
6572 ///
6573 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
6574 ///
6575 /// Supported operand variants:
6576 ///
6577 /// ```text
6578 /// +---+----------+
6579 /// | # | Operands |
6580 /// +---+----------+
6581 /// | 1 | Xmm, Mem |
6582 /// | 2 | Xmm, Xmm |
6583 /// +---+----------+
6584 /// ```
6585 #[inline]
6586 pub fn sse_punpckhqdq<A, B>(&mut self, op0: A, op1: B)
6587 where Assembler<'a>: SsePunpckhqdqEmitter<A, B> {
6588 <Self as SsePunpckhqdqEmitter<A, B>>::sse_punpckhqdq(self, op0, op1);
6589 }
6590 /// `SSE_PUNPCKHWD` (PUNPCKHWD).
6591 /// 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.
6592 ///
6593 ///
6594 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKHBW%3APUNPCKHWD%3APUNPCKHDQ%3APUNPCKHQDQ.html).
6595 ///
6596 /// Supported operand variants:
6597 ///
6598 /// ```text
6599 /// +---+----------+
6600 /// | # | Operands |
6601 /// +---+----------+
6602 /// | 1 | Xmm, Mem |
6603 /// | 2 | Xmm, Xmm |
6604 /// +---+----------+
6605 /// ```
6606 #[inline]
6607 pub fn sse_punpckhwd<A, B>(&mut self, op0: A, op1: B)
6608 where Assembler<'a>: SsePunpckhwdEmitter<A, B> {
6609 <Self as SsePunpckhwdEmitter<A, B>>::sse_punpckhwd(self, op0, op1);
6610 }
6611 /// `SSE_PUNPCKLBW` (PUNPCKLBW).
6612 /// 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.
6613 ///
6614 ///
6615 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
6616 ///
6617 /// Supported operand variants:
6618 ///
6619 /// ```text
6620 /// +---+----------+
6621 /// | # | Operands |
6622 /// +---+----------+
6623 /// | 1 | Xmm, Mem |
6624 /// | 2 | Xmm, Xmm |
6625 /// +---+----------+
6626 /// ```
6627 #[inline]
6628 pub fn sse_punpcklbw<A, B>(&mut self, op0: A, op1: B)
6629 where Assembler<'a>: SsePunpcklbwEmitter<A, B> {
6630 <Self as SsePunpcklbwEmitter<A, B>>::sse_punpcklbw(self, op0, op1);
6631 }
6632 /// `SSE_PUNPCKLDQ` (PUNPCKLDQ).
6633 /// 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.
6634 ///
6635 ///
6636 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
6637 ///
6638 /// Supported operand variants:
6639 ///
6640 /// ```text
6641 /// +---+----------+
6642 /// | # | Operands |
6643 /// +---+----------+
6644 /// | 1 | Xmm, Mem |
6645 /// | 2 | Xmm, Xmm |
6646 /// +---+----------+
6647 /// ```
6648 #[inline]
6649 pub fn sse_punpckldq<A, B>(&mut self, op0: A, op1: B)
6650 where Assembler<'a>: SsePunpckldqEmitter<A, B> {
6651 <Self as SsePunpckldqEmitter<A, B>>::sse_punpckldq(self, op0, op1);
6652 }
6653 /// `SSE_PUNPCKLQDQ` (PUNPCKLQDQ).
6654 /// 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.
6655 ///
6656 ///
6657 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
6658 ///
6659 /// Supported operand variants:
6660 ///
6661 /// ```text
6662 /// +---+----------+
6663 /// | # | Operands |
6664 /// +---+----------+
6665 /// | 1 | Xmm, Mem |
6666 /// | 2 | Xmm, Xmm |
6667 /// +---+----------+
6668 /// ```
6669 #[inline]
6670 pub fn sse_punpcklqdq<A, B>(&mut self, op0: A, op1: B)
6671 where Assembler<'a>: SsePunpcklqdqEmitter<A, B> {
6672 <Self as SsePunpcklqdqEmitter<A, B>>::sse_punpcklqdq(self, op0, op1);
6673 }
6674 /// `SSE_PUNPCKLWD` (PUNPCKLWD).
6675 /// 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.
6676 ///
6677 ///
6678 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PUNPCKLBW%3APUNPCKLWD%3APUNPCKLDQ%3APUNPCKLQDQ.html).
6679 ///
6680 /// Supported operand variants:
6681 ///
6682 /// ```text
6683 /// +---+----------+
6684 /// | # | Operands |
6685 /// +---+----------+
6686 /// | 1 | Xmm, Mem |
6687 /// | 2 | Xmm, Xmm |
6688 /// +---+----------+
6689 /// ```
6690 #[inline]
6691 pub fn sse_punpcklwd<A, B>(&mut self, op0: A, op1: B)
6692 where Assembler<'a>: SsePunpcklwdEmitter<A, B> {
6693 <Self as SsePunpcklwdEmitter<A, B>>::sse_punpcklwd(self, op0, op1);
6694 }
6695 /// `SSE_PXOR` (PXOR).
6696 /// 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.
6697 ///
6698 ///
6699 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/PXOR.html).
6700 ///
6701 /// Supported operand variants:
6702 ///
6703 /// ```text
6704 /// +---+----------+
6705 /// | # | Operands |
6706 /// +---+----------+
6707 /// | 1 | Xmm, Mem |
6708 /// | 2 | Xmm, Xmm |
6709 /// +---+----------+
6710 /// ```
6711 #[inline]
6712 pub fn sse_pxor<A, B>(&mut self, op0: A, op1: B)
6713 where Assembler<'a>: SsePxorEmitter<A, B> {
6714 <Self as SsePxorEmitter<A, B>>::sse_pxor(self, op0, op1);
6715 }
6716 /// `SSE_SHUFPD` (SHUFPD).
6717 /// Selects a double precision floating-point value of an input pair using a bit control and move to a designated element of the destination operand. The low-to-high order of double precision element of the destination operand is interleaved between the first source operand and the second source operand at the granularity of input pair of 128 bits. Each bit in the imm8 byte, starting from bit 0, is the select control of the corresponding element of the destination to received the shuffled result of an input pair.
6718 ///
6719 ///
6720 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SHUFPD.html).
6721 ///
6722 /// Supported operand variants:
6723 ///
6724 /// ```text
6725 /// +---+---------------+
6726 /// | # | Operands |
6727 /// +---+---------------+
6728 /// | 1 | Xmm, Mem, Imm |
6729 /// | 2 | Xmm, Xmm, Imm |
6730 /// +---+---------------+
6731 /// ```
6732 #[inline]
6733 pub fn sse_shufpd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
6734 where Assembler<'a>: SseShufpdEmitter<A, B, C> {
6735 <Self as SseShufpdEmitter<A, B, C>>::sse_shufpd(self, op0, op1, op2);
6736 }
6737 /// `SSE_SQRTPD` (SQRTPD).
6738 /// Performs a SIMD computation of the square roots of the two, four or eight packed double precision floating-point values in the source operand (the second operand) stores the packed double precision floating-point results in the destination operand (the first operand).
6739 ///
6740 ///
6741 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SQRTPD.html).
6742 ///
6743 /// Supported operand variants:
6744 ///
6745 /// ```text
6746 /// +---+----------+
6747 /// | # | Operands |
6748 /// +---+----------+
6749 /// | 1 | Xmm, Mem |
6750 /// | 2 | Xmm, Xmm |
6751 /// +---+----------+
6752 /// ```
6753 #[inline]
6754 pub fn sse_sqrtpd<A, B>(&mut self, op0: A, op1: B)
6755 where Assembler<'a>: SseSqrtpdEmitter<A, B> {
6756 <Self as SseSqrtpdEmitter<A, B>>::sse_sqrtpd(self, op0, op1);
6757 }
6758 /// `SSE_SQRTSD` (SQRTSD).
6759 /// Computes the square root of the low double precision floating-point value in the second source operand and stores the double precision floating-point result in the destination operand. The second source operand can be an XMM register or a 64-bit memory location. The first source and destination operands are XMM registers.
6760 ///
6761 ///
6762 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SQRTSD.html).
6763 ///
6764 /// Supported operand variants:
6765 ///
6766 /// ```text
6767 /// +---+----------+
6768 /// | # | Operands |
6769 /// +---+----------+
6770 /// | 1 | Xmm, Mem |
6771 /// | 2 | Xmm, Xmm |
6772 /// +---+----------+
6773 /// ```
6774 #[inline]
6775 pub fn sse_sqrtsd<A, B>(&mut self, op0: A, op1: B)
6776 where Assembler<'a>: SseSqrtsdEmitter<A, B> {
6777 <Self as SseSqrtsdEmitter<A, B>>::sse_sqrtsd(self, op0, op1);
6778 }
6779 /// `SSE_SUBPD` (SUBPD).
6780 /// Performs a SIMD subtract of the two, four or eight packed double precision floating-point values of the second Source operand from the first Source operand, and stores the packed double precision floating-point results in the destination operand.
6781 ///
6782 ///
6783 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SUBPD.html).
6784 ///
6785 /// Supported operand variants:
6786 ///
6787 /// ```text
6788 /// +---+----------+
6789 /// | # | Operands |
6790 /// +---+----------+
6791 /// | 1 | Xmm, Mem |
6792 /// | 2 | Xmm, Xmm |
6793 /// +---+----------+
6794 /// ```
6795 #[inline]
6796 pub fn sse_subpd<A, B>(&mut self, op0: A, op1: B)
6797 where Assembler<'a>: SseSubpdEmitter<A, B> {
6798 <Self as SseSubpdEmitter<A, B>>::sse_subpd(self, op0, op1);
6799 }
6800 /// `SSE_SUBSD` (SUBSD).
6801 /// Subtract the low double precision floating-point value in the second source operand from the first source operand and stores the double precision floating-point result in the low quadword of the destination operand.
6802 ///
6803 ///
6804 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SUBSD.html).
6805 ///
6806 /// Supported operand variants:
6807 ///
6808 /// ```text
6809 /// +---+----------+
6810 /// | # | Operands |
6811 /// +---+----------+
6812 /// | 1 | Xmm, Mem |
6813 /// | 2 | Xmm, Xmm |
6814 /// +---+----------+
6815 /// ```
6816 #[inline]
6817 pub fn sse_subsd<A, B>(&mut self, op0: A, op1: B)
6818 where Assembler<'a>: SseSubsdEmitter<A, B> {
6819 <Self as SseSubsdEmitter<A, B>>::sse_subsd(self, op0, op1);
6820 }
6821 /// `SSE_UCOMISD` (UCOMISD).
6822 /// Performs an unordered compare of the double precision floating-point values in the low quadwords of operand 1 (first operand) and operand 2 (second operand), and sets the ZF, PF, and CF flags in the EFLAGS register according to the result (unordered, greater than, less than, or equal). The OF, SF, and AF flags in the EFLAGS register are set to 0. The unordered result is returned if either source operand is a NaN (QNaN or SNaN).
6823 ///
6824 ///
6825 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/UCOMISD.html).
6826 ///
6827 /// Supported operand variants:
6828 ///
6829 /// ```text
6830 /// +---+----------+
6831 /// | # | Operands |
6832 /// +---+----------+
6833 /// | 1 | Xmm, Mem |
6834 /// | 2 | Xmm, Xmm |
6835 /// +---+----------+
6836 /// ```
6837 #[inline]
6838 pub fn sse_ucomisd<A, B>(&mut self, op0: A, op1: B)
6839 where Assembler<'a>: SseUcomisdEmitter<A, B> {
6840 <Self as SseUcomisdEmitter<A, B>>::sse_ucomisd(self, op0, op1);
6841 }
6842 /// `SSE_UNPCKHPD` (UNPCKHPD).
6843 /// Performs an interleaved unpack of the high double precision floating-point values from the first source operand and the second source operand. See Figure 4-15 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2B.
6844 ///
6845 ///
6846 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/UNPCKHPD.html).
6847 ///
6848 /// Supported operand variants:
6849 ///
6850 /// ```text
6851 /// +---+----------+
6852 /// | # | Operands |
6853 /// +---+----------+
6854 /// | 1 | Xmm, Mem |
6855 /// | 2 | Xmm, Xmm |
6856 /// +---+----------+
6857 /// ```
6858 #[inline]
6859 pub fn sse_unpckhpd<A, B>(&mut self, op0: A, op1: B)
6860 where Assembler<'a>: SseUnpckhpdEmitter<A, B> {
6861 <Self as SseUnpckhpdEmitter<A, B>>::sse_unpckhpd(self, op0, op1);
6862 }
6863 /// `SSE_UNPCKLPD` (UNPCKLPD).
6864 /// Performs an interleaved unpack of the low double precision floating-point values from the first source operand and the second source operand.
6865 ///
6866 ///
6867 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/UNPCKLPD.html).
6868 ///
6869 /// Supported operand variants:
6870 ///
6871 /// ```text
6872 /// +---+----------+
6873 /// | # | Operands |
6874 /// +---+----------+
6875 /// | 1 | Xmm, Mem |
6876 /// | 2 | Xmm, Xmm |
6877 /// +---+----------+
6878 /// ```
6879 #[inline]
6880 pub fn sse_unpcklpd<A, B>(&mut self, op0: A, op1: B)
6881 where Assembler<'a>: SseUnpcklpdEmitter<A, B> {
6882 <Self as SseUnpcklpdEmitter<A, B>>::sse_unpcklpd(self, op0, op1);
6883 }
6884 /// `SSE_XORPD` (XORPD).
6885 /// Performs a bitwise logical XOR of the two, four or eight packed double precision floating-point values from the first source operand and the second source operand, and stores the result in the destination operand.
6886 ///
6887 ///
6888 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/XORPD.html).
6889 ///
6890 /// Supported operand variants:
6891 ///
6892 /// ```text
6893 /// +---+----------+
6894 /// | # | Operands |
6895 /// +---+----------+
6896 /// | 1 | Xmm, Mem |
6897 /// | 2 | Xmm, Xmm |
6898 /// +---+----------+
6899 /// ```
6900 #[inline]
6901 pub fn sse_xorpd<A, B>(&mut self, op0: A, op1: B)
6902 where Assembler<'a>: SseXorpdEmitter<A, B> {
6903 <Self as SseXorpdEmitter<A, B>>::sse_xorpd(self, op0, op1);
6904 }
6905}