Skip to main content

asmkit/x86/features/
AVX512_VNNI.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/// `VPDPBUSD` (VPDPBUSD). 
11/// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand.
12///
13///
14/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSD.html).
15///
16/// Supported operand variants:
17///
18/// ```text
19/// +---+---------------+
20/// | # | Operands      |
21/// +---+---------------+
22/// | 1 | Xmm, Xmm, Mem |
23/// | 2 | Xmm, Xmm, Xmm |
24/// | 3 | Ymm, Ymm, Mem |
25/// | 4 | Ymm, Ymm, Ymm |
26/// | 5 | Zmm, Zmm, Mem |
27/// | 6 | Zmm, Zmm, Zmm |
28/// +---+---------------+
29/// ```
30pub trait VpdpbusdEmitter<A, B, C> {
31    fn vpdpbusd(&mut self, op0: A, op1: B, op2: C);
32}
33
34impl<'a> VpdpbusdEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
35    fn vpdpbusd(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
36        self.emit(VPDPBUSD128RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
37    }
38}
39
40impl<'a> VpdpbusdEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
41    fn vpdpbusd(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
42        self.emit(VPDPBUSD128RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
43    }
44}
45
46impl<'a> VpdpbusdEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
47    fn vpdpbusd(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
48        self.emit(VPDPBUSD256RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
49    }
50}
51
52impl<'a> VpdpbusdEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
53    fn vpdpbusd(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
54        self.emit(VPDPBUSD256RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
55    }
56}
57
58impl<'a> VpdpbusdEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
59    fn vpdpbusd(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
60        self.emit(VPDPBUSD512RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
61    }
62}
63
64impl<'a> VpdpbusdEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
65    fn vpdpbusd(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
66        self.emit(VPDPBUSD512RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
67    }
68}
69
70/// `VPDPBUSDS` (VPDPBUSDS). 
71/// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand. If the intermediate sum overflows a 32b signed number the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
72///
73///
74/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSDS.html).
75///
76/// Supported operand variants:
77///
78/// ```text
79/// +---+---------------+
80/// | # | Operands      |
81/// +---+---------------+
82/// | 1 | Xmm, Xmm, Mem |
83/// | 2 | Xmm, Xmm, Xmm |
84/// | 3 | Ymm, Ymm, Mem |
85/// | 4 | Ymm, Ymm, Ymm |
86/// | 5 | Zmm, Zmm, Mem |
87/// | 6 | Zmm, Zmm, Zmm |
88/// +---+---------------+
89/// ```
90pub trait VpdpbusdsEmitter<A, B, C> {
91    fn vpdpbusds(&mut self, op0: A, op1: B, op2: C);
92}
93
94impl<'a> VpdpbusdsEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
95    fn vpdpbusds(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
96        self.emit(VPDPBUSDS128RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
97    }
98}
99
100impl<'a> VpdpbusdsEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
101    fn vpdpbusds(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
102        self.emit(VPDPBUSDS128RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
103    }
104}
105
106impl<'a> VpdpbusdsEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
107    fn vpdpbusds(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
108        self.emit(VPDPBUSDS256RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
109    }
110}
111
112impl<'a> VpdpbusdsEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
113    fn vpdpbusds(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
114        self.emit(VPDPBUSDS256RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
115    }
116}
117
118impl<'a> VpdpbusdsEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
119    fn vpdpbusds(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
120        self.emit(VPDPBUSDS512RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
121    }
122}
123
124impl<'a> VpdpbusdsEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
125    fn vpdpbusds(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
126        self.emit(VPDPBUSDS512RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
127    }
128}
129
130/// `VPDPBUSDS_MASK` (VPDPBUSDS). 
131/// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand. If the intermediate sum overflows a 32b signed number the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
132///
133///
134/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSDS.html).
135///
136/// Supported operand variants:
137///
138/// ```text
139/// +---+---------------+
140/// | # | Operands      |
141/// +---+---------------+
142/// | 1 | Xmm, Xmm, Mem |
143/// | 2 | Xmm, Xmm, Xmm |
144/// | 3 | Ymm, Ymm, Mem |
145/// | 4 | Ymm, Ymm, Ymm |
146/// | 5 | Zmm, Zmm, Mem |
147/// | 6 | Zmm, Zmm, Zmm |
148/// +---+---------------+
149/// ```
150pub trait VpdpbusdsMaskEmitter<A, B, C> {
151    fn vpdpbusds_mask(&mut self, op0: A, op1: B, op2: C);
152}
153
154impl<'a> VpdpbusdsMaskEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
155    fn vpdpbusds_mask(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
156        self.emit(VPDPBUSDS128RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
157    }
158}
159
160impl<'a> VpdpbusdsMaskEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
161    fn vpdpbusds_mask(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
162        self.emit(VPDPBUSDS128RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
163    }
164}
165
166impl<'a> VpdpbusdsMaskEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
167    fn vpdpbusds_mask(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
168        self.emit(VPDPBUSDS256RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
169    }
170}
171
172impl<'a> VpdpbusdsMaskEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
173    fn vpdpbusds_mask(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
174        self.emit(VPDPBUSDS256RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
175    }
176}
177
178impl<'a> VpdpbusdsMaskEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
179    fn vpdpbusds_mask(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
180        self.emit(VPDPBUSDS512RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
181    }
182}
183
184impl<'a> VpdpbusdsMaskEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
185    fn vpdpbusds_mask(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
186        self.emit(VPDPBUSDS512RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
187    }
188}
189
190/// `VPDPBUSDS_MASKZ` (VPDPBUSDS). 
191/// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand. If the intermediate sum overflows a 32b signed number the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
192///
193///
194/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSDS.html).
195///
196/// Supported operand variants:
197///
198/// ```text
199/// +---+---------------+
200/// | # | Operands      |
201/// +---+---------------+
202/// | 1 | Xmm, Xmm, Mem |
203/// | 2 | Xmm, Xmm, Xmm |
204/// | 3 | Ymm, Ymm, Mem |
205/// | 4 | Ymm, Ymm, Ymm |
206/// | 5 | Zmm, Zmm, Mem |
207/// | 6 | Zmm, Zmm, Zmm |
208/// +---+---------------+
209/// ```
210pub trait VpdpbusdsMaskzEmitter<A, B, C> {
211    fn vpdpbusds_maskz(&mut self, op0: A, op1: B, op2: C);
212}
213
214impl<'a> VpdpbusdsMaskzEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
215    fn vpdpbusds_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
216        self.emit(VPDPBUSDS128RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
217    }
218}
219
220impl<'a> VpdpbusdsMaskzEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
221    fn vpdpbusds_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
222        self.emit(VPDPBUSDS128RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
223    }
224}
225
226impl<'a> VpdpbusdsMaskzEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
227    fn vpdpbusds_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
228        self.emit(VPDPBUSDS256RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
229    }
230}
231
232impl<'a> VpdpbusdsMaskzEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
233    fn vpdpbusds_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
234        self.emit(VPDPBUSDS256RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
235    }
236}
237
238impl<'a> VpdpbusdsMaskzEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
239    fn vpdpbusds_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
240        self.emit(VPDPBUSDS512RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
241    }
242}
243
244impl<'a> VpdpbusdsMaskzEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
245    fn vpdpbusds_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
246        self.emit(VPDPBUSDS512RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
247    }
248}
249
250/// `VPDPBUSD_MASK` (VPDPBUSD). 
251/// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand.
252///
253///
254/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSD.html).
255///
256/// Supported operand variants:
257///
258/// ```text
259/// +---+---------------+
260/// | # | Operands      |
261/// +---+---------------+
262/// | 1 | Xmm, Xmm, Mem |
263/// | 2 | Xmm, Xmm, Xmm |
264/// | 3 | Ymm, Ymm, Mem |
265/// | 4 | Ymm, Ymm, Ymm |
266/// | 5 | Zmm, Zmm, Mem |
267/// | 6 | Zmm, Zmm, Zmm |
268/// +---+---------------+
269/// ```
270pub trait VpdpbusdMaskEmitter<A, B, C> {
271    fn vpdpbusd_mask(&mut self, op0: A, op1: B, op2: C);
272}
273
274impl<'a> VpdpbusdMaskEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
275    fn vpdpbusd_mask(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
276        self.emit(VPDPBUSD128RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
277    }
278}
279
280impl<'a> VpdpbusdMaskEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
281    fn vpdpbusd_mask(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
282        self.emit(VPDPBUSD128RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
283    }
284}
285
286impl<'a> VpdpbusdMaskEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
287    fn vpdpbusd_mask(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
288        self.emit(VPDPBUSD256RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
289    }
290}
291
292impl<'a> VpdpbusdMaskEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
293    fn vpdpbusd_mask(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
294        self.emit(VPDPBUSD256RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
295    }
296}
297
298impl<'a> VpdpbusdMaskEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
299    fn vpdpbusd_mask(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
300        self.emit(VPDPBUSD512RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
301    }
302}
303
304impl<'a> VpdpbusdMaskEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
305    fn vpdpbusd_mask(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
306        self.emit(VPDPBUSD512RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
307    }
308}
309
310/// `VPDPBUSD_MASKZ` (VPDPBUSD). 
311/// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand.
312///
313///
314/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSD.html).
315///
316/// Supported operand variants:
317///
318/// ```text
319/// +---+---------------+
320/// | # | Operands      |
321/// +---+---------------+
322/// | 1 | Xmm, Xmm, Mem |
323/// | 2 | Xmm, Xmm, Xmm |
324/// | 3 | Ymm, Ymm, Mem |
325/// | 4 | Ymm, Ymm, Ymm |
326/// | 5 | Zmm, Zmm, Mem |
327/// | 6 | Zmm, Zmm, Zmm |
328/// +---+---------------+
329/// ```
330pub trait VpdpbusdMaskzEmitter<A, B, C> {
331    fn vpdpbusd_maskz(&mut self, op0: A, op1: B, op2: C);
332}
333
334impl<'a> VpdpbusdMaskzEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
335    fn vpdpbusd_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
336        self.emit(VPDPBUSD128RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
337    }
338}
339
340impl<'a> VpdpbusdMaskzEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
341    fn vpdpbusd_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
342        self.emit(VPDPBUSD128RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
343    }
344}
345
346impl<'a> VpdpbusdMaskzEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
347    fn vpdpbusd_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
348        self.emit(VPDPBUSD256RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
349    }
350}
351
352impl<'a> VpdpbusdMaskzEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
353    fn vpdpbusd_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
354        self.emit(VPDPBUSD256RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
355    }
356}
357
358impl<'a> VpdpbusdMaskzEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
359    fn vpdpbusd_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
360        self.emit(VPDPBUSD512RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
361    }
362}
363
364impl<'a> VpdpbusdMaskzEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
365    fn vpdpbusd_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
366        self.emit(VPDPBUSD512RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
367    }
368}
369
370/// `VPDPWSSD` (VPDPWSSD). 
371/// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand.
372///
373///
374/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSD.html).
375///
376/// Supported operand variants:
377///
378/// ```text
379/// +---+---------------+
380/// | # | Operands      |
381/// +---+---------------+
382/// | 1 | Xmm, Xmm, Mem |
383/// | 2 | Xmm, Xmm, Xmm |
384/// | 3 | Ymm, Ymm, Mem |
385/// | 4 | Ymm, Ymm, Ymm |
386/// | 5 | Zmm, Zmm, Mem |
387/// | 6 | Zmm, Zmm, Zmm |
388/// +---+---------------+
389/// ```
390pub trait VpdpwssdEmitter<A, B, C> {
391    fn vpdpwssd(&mut self, op0: A, op1: B, op2: C);
392}
393
394impl<'a> VpdpwssdEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
395    fn vpdpwssd(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
396        self.emit(VPDPWSSD128RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
397    }
398}
399
400impl<'a> VpdpwssdEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
401    fn vpdpwssd(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
402        self.emit(VPDPWSSD128RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
403    }
404}
405
406impl<'a> VpdpwssdEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
407    fn vpdpwssd(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
408        self.emit(VPDPWSSD256RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
409    }
410}
411
412impl<'a> VpdpwssdEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
413    fn vpdpwssd(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
414        self.emit(VPDPWSSD256RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
415    }
416}
417
418impl<'a> VpdpwssdEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
419    fn vpdpwssd(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
420        self.emit(VPDPWSSD512RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
421    }
422}
423
424impl<'a> VpdpwssdEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
425    fn vpdpwssd(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
426        self.emit(VPDPWSSD512RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
427    }
428}
429
430/// `VPDPWSSDS` (VPDPWSSDS). 
431/// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand. If the intermediate sum overflows a 32b signed number, the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
432///
433///
434/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSDS.html).
435///
436/// Supported operand variants:
437///
438/// ```text
439/// +---+---------------+
440/// | # | Operands      |
441/// +---+---------------+
442/// | 1 | Xmm, Xmm, Mem |
443/// | 2 | Xmm, Xmm, Xmm |
444/// | 3 | Ymm, Ymm, Mem |
445/// | 4 | Ymm, Ymm, Ymm |
446/// | 5 | Zmm, Zmm, Mem |
447/// | 6 | Zmm, Zmm, Zmm |
448/// +---+---------------+
449/// ```
450pub trait VpdpwssdsEmitter<A, B, C> {
451    fn vpdpwssds(&mut self, op0: A, op1: B, op2: C);
452}
453
454impl<'a> VpdpwssdsEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
455    fn vpdpwssds(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
456        self.emit(VPDPWSSDS128RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
457    }
458}
459
460impl<'a> VpdpwssdsEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
461    fn vpdpwssds(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
462        self.emit(VPDPWSSDS128RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
463    }
464}
465
466impl<'a> VpdpwssdsEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
467    fn vpdpwssds(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
468        self.emit(VPDPWSSDS256RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
469    }
470}
471
472impl<'a> VpdpwssdsEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
473    fn vpdpwssds(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
474        self.emit(VPDPWSSDS256RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
475    }
476}
477
478impl<'a> VpdpwssdsEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
479    fn vpdpwssds(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
480        self.emit(VPDPWSSDS512RRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
481    }
482}
483
484impl<'a> VpdpwssdsEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
485    fn vpdpwssds(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
486        self.emit(VPDPWSSDS512RRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
487    }
488}
489
490/// `VPDPWSSDS_MASK` (VPDPWSSDS). 
491/// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand. If the intermediate sum overflows a 32b signed number, the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
492///
493///
494/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSDS.html).
495///
496/// Supported operand variants:
497///
498/// ```text
499/// +---+---------------+
500/// | # | Operands      |
501/// +---+---------------+
502/// | 1 | Xmm, Xmm, Mem |
503/// | 2 | Xmm, Xmm, Xmm |
504/// | 3 | Ymm, Ymm, Mem |
505/// | 4 | Ymm, Ymm, Ymm |
506/// | 5 | Zmm, Zmm, Mem |
507/// | 6 | Zmm, Zmm, Zmm |
508/// +---+---------------+
509/// ```
510pub trait VpdpwssdsMaskEmitter<A, B, C> {
511    fn vpdpwssds_mask(&mut self, op0: A, op1: B, op2: C);
512}
513
514impl<'a> VpdpwssdsMaskEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
515    fn vpdpwssds_mask(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
516        self.emit(VPDPWSSDS128RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
517    }
518}
519
520impl<'a> VpdpwssdsMaskEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
521    fn vpdpwssds_mask(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
522        self.emit(VPDPWSSDS128RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
523    }
524}
525
526impl<'a> VpdpwssdsMaskEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
527    fn vpdpwssds_mask(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
528        self.emit(VPDPWSSDS256RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
529    }
530}
531
532impl<'a> VpdpwssdsMaskEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
533    fn vpdpwssds_mask(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
534        self.emit(VPDPWSSDS256RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
535    }
536}
537
538impl<'a> VpdpwssdsMaskEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
539    fn vpdpwssds_mask(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
540        self.emit(VPDPWSSDS512RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
541    }
542}
543
544impl<'a> VpdpwssdsMaskEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
545    fn vpdpwssds_mask(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
546        self.emit(VPDPWSSDS512RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
547    }
548}
549
550/// `VPDPWSSDS_MASKZ` (VPDPWSSDS). 
551/// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand. If the intermediate sum overflows a 32b signed number, the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
552///
553///
554/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSDS.html).
555///
556/// Supported operand variants:
557///
558/// ```text
559/// +---+---------------+
560/// | # | Operands      |
561/// +---+---------------+
562/// | 1 | Xmm, Xmm, Mem |
563/// | 2 | Xmm, Xmm, Xmm |
564/// | 3 | Ymm, Ymm, Mem |
565/// | 4 | Ymm, Ymm, Ymm |
566/// | 5 | Zmm, Zmm, Mem |
567/// | 6 | Zmm, Zmm, Zmm |
568/// +---+---------------+
569/// ```
570pub trait VpdpwssdsMaskzEmitter<A, B, C> {
571    fn vpdpwssds_maskz(&mut self, op0: A, op1: B, op2: C);
572}
573
574impl<'a> VpdpwssdsMaskzEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
575    fn vpdpwssds_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
576        self.emit(VPDPWSSDS128RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
577    }
578}
579
580impl<'a> VpdpwssdsMaskzEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
581    fn vpdpwssds_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
582        self.emit(VPDPWSSDS128RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
583    }
584}
585
586impl<'a> VpdpwssdsMaskzEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
587    fn vpdpwssds_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
588        self.emit(VPDPWSSDS256RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
589    }
590}
591
592impl<'a> VpdpwssdsMaskzEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
593    fn vpdpwssds_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
594        self.emit(VPDPWSSDS256RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
595    }
596}
597
598impl<'a> VpdpwssdsMaskzEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
599    fn vpdpwssds_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
600        self.emit(VPDPWSSDS512RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
601    }
602}
603
604impl<'a> VpdpwssdsMaskzEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
605    fn vpdpwssds_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
606        self.emit(VPDPWSSDS512RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
607    }
608}
609
610/// `VPDPWSSD_MASK` (VPDPWSSD). 
611/// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand.
612///
613///
614/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSD.html).
615///
616/// Supported operand variants:
617///
618/// ```text
619/// +---+---------------+
620/// | # | Operands      |
621/// +---+---------------+
622/// | 1 | Xmm, Xmm, Mem |
623/// | 2 | Xmm, Xmm, Xmm |
624/// | 3 | Ymm, Ymm, Mem |
625/// | 4 | Ymm, Ymm, Ymm |
626/// | 5 | Zmm, Zmm, Mem |
627/// | 6 | Zmm, Zmm, Zmm |
628/// +---+---------------+
629/// ```
630pub trait VpdpwssdMaskEmitter<A, B, C> {
631    fn vpdpwssd_mask(&mut self, op0: A, op1: B, op2: C);
632}
633
634impl<'a> VpdpwssdMaskEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
635    fn vpdpwssd_mask(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
636        self.emit(VPDPWSSD128RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
637    }
638}
639
640impl<'a> VpdpwssdMaskEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
641    fn vpdpwssd_mask(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
642        self.emit(VPDPWSSD128RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
643    }
644}
645
646impl<'a> VpdpwssdMaskEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
647    fn vpdpwssd_mask(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
648        self.emit(VPDPWSSD256RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
649    }
650}
651
652impl<'a> VpdpwssdMaskEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
653    fn vpdpwssd_mask(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
654        self.emit(VPDPWSSD256RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
655    }
656}
657
658impl<'a> VpdpwssdMaskEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
659    fn vpdpwssd_mask(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
660        self.emit(VPDPWSSD512RRR_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
661    }
662}
663
664impl<'a> VpdpwssdMaskEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
665    fn vpdpwssd_mask(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
666        self.emit(VPDPWSSD512RRM_MASK, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
667    }
668}
669
670/// `VPDPWSSD_MASKZ` (VPDPWSSD). 
671/// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand.
672///
673///
674/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSD.html).
675///
676/// Supported operand variants:
677///
678/// ```text
679/// +---+---------------+
680/// | # | Operands      |
681/// +---+---------------+
682/// | 1 | Xmm, Xmm, Mem |
683/// | 2 | Xmm, Xmm, Xmm |
684/// | 3 | Ymm, Ymm, Mem |
685/// | 4 | Ymm, Ymm, Ymm |
686/// | 5 | Zmm, Zmm, Mem |
687/// | 6 | Zmm, Zmm, Zmm |
688/// +---+---------------+
689/// ```
690pub trait VpdpwssdMaskzEmitter<A, B, C> {
691    fn vpdpwssd_maskz(&mut self, op0: A, op1: B, op2: C);
692}
693
694impl<'a> VpdpwssdMaskzEmitter<Xmm, Xmm, Xmm> for Assembler<'a> {
695    fn vpdpwssd_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Xmm) {
696        self.emit(VPDPWSSD128RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
697    }
698}
699
700impl<'a> VpdpwssdMaskzEmitter<Xmm, Xmm, Mem> for Assembler<'a> {
701    fn vpdpwssd_maskz(&mut self, op0: Xmm, op1: Xmm, op2: Mem) {
702        self.emit(VPDPWSSD128RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
703    }
704}
705
706impl<'a> VpdpwssdMaskzEmitter<Ymm, Ymm, Ymm> for Assembler<'a> {
707    fn vpdpwssd_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Ymm) {
708        self.emit(VPDPWSSD256RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
709    }
710}
711
712impl<'a> VpdpwssdMaskzEmitter<Ymm, Ymm, Mem> for Assembler<'a> {
713    fn vpdpwssd_maskz(&mut self, op0: Ymm, op1: Ymm, op2: Mem) {
714        self.emit(VPDPWSSD256RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
715    }
716}
717
718impl<'a> VpdpwssdMaskzEmitter<Zmm, Zmm, Zmm> for Assembler<'a> {
719    fn vpdpwssd_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Zmm) {
720        self.emit(VPDPWSSD512RRR_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
721    }
722}
723
724impl<'a> VpdpwssdMaskzEmitter<Zmm, Zmm, Mem> for Assembler<'a> {
725    fn vpdpwssd_maskz(&mut self, op0: Zmm, op1: Zmm, op2: Mem) {
726        self.emit(VPDPWSSD512RRM_MASKZ, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
727    }
728}
729
730
731impl<'a> Assembler<'a> {
732    /// `VPDPBUSD` (VPDPBUSD). 
733    /// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand.
734    ///
735    ///
736    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSD.html).
737    ///
738    /// Supported operand variants:
739    ///
740    /// ```text
741    /// +---+---------------+
742    /// | # | Operands      |
743    /// +---+---------------+
744    /// | 1 | Xmm, Xmm, Mem |
745    /// | 2 | Xmm, Xmm, Xmm |
746    /// | 3 | Ymm, Ymm, Mem |
747    /// | 4 | Ymm, Ymm, Ymm |
748    /// | 5 | Zmm, Zmm, Mem |
749    /// | 6 | Zmm, Zmm, Zmm |
750    /// +---+---------------+
751    /// ```
752    #[inline]
753    pub fn vpdpbusd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
754    where Assembler<'a>: VpdpbusdEmitter<A, B, C> {
755        <Self as VpdpbusdEmitter<A, B, C>>::vpdpbusd(self, op0, op1, op2);
756    }
757    /// `VPDPBUSDS` (VPDPBUSDS). 
758    /// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand. If the intermediate sum overflows a 32b signed number the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
759    ///
760    ///
761    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSDS.html).
762    ///
763    /// Supported operand variants:
764    ///
765    /// ```text
766    /// +---+---------------+
767    /// | # | Operands      |
768    /// +---+---------------+
769    /// | 1 | Xmm, Xmm, Mem |
770    /// | 2 | Xmm, Xmm, Xmm |
771    /// | 3 | Ymm, Ymm, Mem |
772    /// | 4 | Ymm, Ymm, Ymm |
773    /// | 5 | Zmm, Zmm, Mem |
774    /// | 6 | Zmm, Zmm, Zmm |
775    /// +---+---------------+
776    /// ```
777    #[inline]
778    pub fn vpdpbusds<A, B, C>(&mut self, op0: A, op1: B, op2: C)
779    where Assembler<'a>: VpdpbusdsEmitter<A, B, C> {
780        <Self as VpdpbusdsEmitter<A, B, C>>::vpdpbusds(self, op0, op1, op2);
781    }
782    /// `VPDPBUSDS_MASK` (VPDPBUSDS). 
783    /// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand. If the intermediate sum overflows a 32b signed number the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
784    ///
785    ///
786    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSDS.html).
787    ///
788    /// Supported operand variants:
789    ///
790    /// ```text
791    /// +---+---------------+
792    /// | # | Operands      |
793    /// +---+---------------+
794    /// | 1 | Xmm, Xmm, Mem |
795    /// | 2 | Xmm, Xmm, Xmm |
796    /// | 3 | Ymm, Ymm, Mem |
797    /// | 4 | Ymm, Ymm, Ymm |
798    /// | 5 | Zmm, Zmm, Mem |
799    /// | 6 | Zmm, Zmm, Zmm |
800    /// +---+---------------+
801    /// ```
802    #[inline]
803    pub fn vpdpbusds_mask<A, B, C>(&mut self, op0: A, op1: B, op2: C)
804    where Assembler<'a>: VpdpbusdsMaskEmitter<A, B, C> {
805        <Self as VpdpbusdsMaskEmitter<A, B, C>>::vpdpbusds_mask(self, op0, op1, op2);
806    }
807    /// `VPDPBUSDS_MASKZ` (VPDPBUSDS). 
808    /// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand. If the intermediate sum overflows a 32b signed number the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
809    ///
810    ///
811    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSDS.html).
812    ///
813    /// Supported operand variants:
814    ///
815    /// ```text
816    /// +---+---------------+
817    /// | # | Operands      |
818    /// +---+---------------+
819    /// | 1 | Xmm, Xmm, Mem |
820    /// | 2 | Xmm, Xmm, Xmm |
821    /// | 3 | Ymm, Ymm, Mem |
822    /// | 4 | Ymm, Ymm, Ymm |
823    /// | 5 | Zmm, Zmm, Mem |
824    /// | 6 | Zmm, Zmm, Zmm |
825    /// +---+---------------+
826    /// ```
827    #[inline]
828    pub fn vpdpbusds_maskz<A, B, C>(&mut self, op0: A, op1: B, op2: C)
829    where Assembler<'a>: VpdpbusdsMaskzEmitter<A, B, C> {
830        <Self as VpdpbusdsMaskzEmitter<A, B, C>>::vpdpbusds_maskz(self, op0, op1, op2);
831    }
832    /// `VPDPBUSD_MASK` (VPDPBUSD). 
833    /// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand.
834    ///
835    ///
836    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSD.html).
837    ///
838    /// Supported operand variants:
839    ///
840    /// ```text
841    /// +---+---------------+
842    /// | # | Operands      |
843    /// +---+---------------+
844    /// | 1 | Xmm, Xmm, Mem |
845    /// | 2 | Xmm, Xmm, Xmm |
846    /// | 3 | Ymm, Ymm, Mem |
847    /// | 4 | Ymm, Ymm, Ymm |
848    /// | 5 | Zmm, Zmm, Mem |
849    /// | 6 | Zmm, Zmm, Zmm |
850    /// +---+---------------+
851    /// ```
852    #[inline]
853    pub fn vpdpbusd_mask<A, B, C>(&mut self, op0: A, op1: B, op2: C)
854    where Assembler<'a>: VpdpbusdMaskEmitter<A, B, C> {
855        <Self as VpdpbusdMaskEmitter<A, B, C>>::vpdpbusd_mask(self, op0, op1, op2);
856    }
857    /// `VPDPBUSD_MASKZ` (VPDPBUSD). 
858    /// Multiplies the individual unsigned bytes of the first source operand by the corresponding signed bytes of the second source operand, producing intermediate signed word results. The word results are then summed and accumulated in the destination dword element size operand.
859    ///
860    ///
861    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPBUSD.html).
862    ///
863    /// Supported operand variants:
864    ///
865    /// ```text
866    /// +---+---------------+
867    /// | # | Operands      |
868    /// +---+---------------+
869    /// | 1 | Xmm, Xmm, Mem |
870    /// | 2 | Xmm, Xmm, Xmm |
871    /// | 3 | Ymm, Ymm, Mem |
872    /// | 4 | Ymm, Ymm, Ymm |
873    /// | 5 | Zmm, Zmm, Mem |
874    /// | 6 | Zmm, Zmm, Zmm |
875    /// +---+---------------+
876    /// ```
877    #[inline]
878    pub fn vpdpbusd_maskz<A, B, C>(&mut self, op0: A, op1: B, op2: C)
879    where Assembler<'a>: VpdpbusdMaskzEmitter<A, B, C> {
880        <Self as VpdpbusdMaskzEmitter<A, B, C>>::vpdpbusd_maskz(self, op0, op1, op2);
881    }
882    /// `VPDPWSSD` (VPDPWSSD). 
883    /// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand.
884    ///
885    ///
886    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSD.html).
887    ///
888    /// Supported operand variants:
889    ///
890    /// ```text
891    /// +---+---------------+
892    /// | # | Operands      |
893    /// +---+---------------+
894    /// | 1 | Xmm, Xmm, Mem |
895    /// | 2 | Xmm, Xmm, Xmm |
896    /// | 3 | Ymm, Ymm, Mem |
897    /// | 4 | Ymm, Ymm, Ymm |
898    /// | 5 | Zmm, Zmm, Mem |
899    /// | 6 | Zmm, Zmm, Zmm |
900    /// +---+---------------+
901    /// ```
902    #[inline]
903    pub fn vpdpwssd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
904    where Assembler<'a>: VpdpwssdEmitter<A, B, C> {
905        <Self as VpdpwssdEmitter<A, B, C>>::vpdpwssd(self, op0, op1, op2);
906    }
907    /// `VPDPWSSDS` (VPDPWSSDS). 
908    /// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand. If the intermediate sum overflows a 32b signed number, the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
909    ///
910    ///
911    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSDS.html).
912    ///
913    /// Supported operand variants:
914    ///
915    /// ```text
916    /// +---+---------------+
917    /// | # | Operands      |
918    /// +---+---------------+
919    /// | 1 | Xmm, Xmm, Mem |
920    /// | 2 | Xmm, Xmm, Xmm |
921    /// | 3 | Ymm, Ymm, Mem |
922    /// | 4 | Ymm, Ymm, Ymm |
923    /// | 5 | Zmm, Zmm, Mem |
924    /// | 6 | Zmm, Zmm, Zmm |
925    /// +---+---------------+
926    /// ```
927    #[inline]
928    pub fn vpdpwssds<A, B, C>(&mut self, op0: A, op1: B, op2: C)
929    where Assembler<'a>: VpdpwssdsEmitter<A, B, C> {
930        <Self as VpdpwssdsEmitter<A, B, C>>::vpdpwssds(self, op0, op1, op2);
931    }
932    /// `VPDPWSSDS_MASK` (VPDPWSSDS). 
933    /// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand. If the intermediate sum overflows a 32b signed number, the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
934    ///
935    ///
936    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSDS.html).
937    ///
938    /// Supported operand variants:
939    ///
940    /// ```text
941    /// +---+---------------+
942    /// | # | Operands      |
943    /// +---+---------------+
944    /// | 1 | Xmm, Xmm, Mem |
945    /// | 2 | Xmm, Xmm, Xmm |
946    /// | 3 | Ymm, Ymm, Mem |
947    /// | 4 | Ymm, Ymm, Ymm |
948    /// | 5 | Zmm, Zmm, Mem |
949    /// | 6 | Zmm, Zmm, Zmm |
950    /// +---+---------------+
951    /// ```
952    #[inline]
953    pub fn vpdpwssds_mask<A, B, C>(&mut self, op0: A, op1: B, op2: C)
954    where Assembler<'a>: VpdpwssdsMaskEmitter<A, B, C> {
955        <Self as VpdpwssdsMaskEmitter<A, B, C>>::vpdpwssds_mask(self, op0, op1, op2);
956    }
957    /// `VPDPWSSDS_MASKZ` (VPDPWSSDS). 
958    /// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand. If the intermediate sum overflows a 32b signed number, the result is saturated to either 0x7FFF_FFFF for positive numbers of 0x8000_0000 for negative numbers.
959    ///
960    ///
961    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSDS.html).
962    ///
963    /// Supported operand variants:
964    ///
965    /// ```text
966    /// +---+---------------+
967    /// | # | Operands      |
968    /// +---+---------------+
969    /// | 1 | Xmm, Xmm, Mem |
970    /// | 2 | Xmm, Xmm, Xmm |
971    /// | 3 | Ymm, Ymm, Mem |
972    /// | 4 | Ymm, Ymm, Ymm |
973    /// | 5 | Zmm, Zmm, Mem |
974    /// | 6 | Zmm, Zmm, Zmm |
975    /// +---+---------------+
976    /// ```
977    #[inline]
978    pub fn vpdpwssds_maskz<A, B, C>(&mut self, op0: A, op1: B, op2: C)
979    where Assembler<'a>: VpdpwssdsMaskzEmitter<A, B, C> {
980        <Self as VpdpwssdsMaskzEmitter<A, B, C>>::vpdpwssds_maskz(self, op0, op1, op2);
981    }
982    /// `VPDPWSSD_MASK` (VPDPWSSD). 
983    /// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand.
984    ///
985    ///
986    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSD.html).
987    ///
988    /// Supported operand variants:
989    ///
990    /// ```text
991    /// +---+---------------+
992    /// | # | Operands      |
993    /// +---+---------------+
994    /// | 1 | Xmm, Xmm, Mem |
995    /// | 2 | Xmm, Xmm, Xmm |
996    /// | 3 | Ymm, Ymm, Mem |
997    /// | 4 | Ymm, Ymm, Ymm |
998    /// | 5 | Zmm, Zmm, Mem |
999    /// | 6 | Zmm, Zmm, Zmm |
1000    /// +---+---------------+
1001    /// ```
1002    #[inline]
1003    pub fn vpdpwssd_mask<A, B, C>(&mut self, op0: A, op1: B, op2: C)
1004    where Assembler<'a>: VpdpwssdMaskEmitter<A, B, C> {
1005        <Self as VpdpwssdMaskEmitter<A, B, C>>::vpdpwssd_mask(self, op0, op1, op2);
1006    }
1007    /// `VPDPWSSD_MASKZ` (VPDPWSSD). 
1008    /// Multiplies the individual signed words of the first source operand by the corresponding signed words of the second source operand, producing intermediate signed, doubleword results. The adjacent doubleword results are then summed and accumulated in the destination operand.
1009    ///
1010    ///
1011    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPDPWSSD.html).
1012    ///
1013    /// Supported operand variants:
1014    ///
1015    /// ```text
1016    /// +---+---------------+
1017    /// | # | Operands      |
1018    /// +---+---------------+
1019    /// | 1 | Xmm, Xmm, Mem |
1020    /// | 2 | Xmm, Xmm, Xmm |
1021    /// | 3 | Ymm, Ymm, Mem |
1022    /// | 4 | Ymm, Ymm, Ymm |
1023    /// | 5 | Zmm, Zmm, Mem |
1024    /// | 6 | Zmm, Zmm, Zmm |
1025    /// +---+---------------+
1026    /// ```
1027    #[inline]
1028    pub fn vpdpwssd_maskz<A, B, C>(&mut self, op0: A, op1: B, op2: C)
1029    where Assembler<'a>: VpdpwssdMaskzEmitter<A, B, C> {
1030        <Self as VpdpwssdMaskzEmitter<A, B, C>>::vpdpwssd_maskz(self, op0, op1, op2);
1031    }
1032}