asmkit/x86/features/AVX512CD.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/// `VPBROADCASTMB2Q` (VPBROADCASTMB2Q).
11/// Broadcasts the zero-extended 64/32 bit value of the low byte/word of the source operand (the second operand) to each 64/32 bit element of the destination operand (the first operand). The source operand is an opmask register. The destination operand is a ZMM register (EVEX.512), YMM register (EVEX.256), or XMM register (EVEX.128).
12///
13///
14/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPBROADCASTM.html).
15///
16/// Supported operand variants:
17///
18/// ```text
19/// +---+-----------+
20/// | # | Operands |
21/// +---+-----------+
22/// | 1 | Xmm, KReg |
23/// | 2 | Ymm, KReg |
24/// | 3 | Zmm, KReg |
25/// +---+-----------+
26/// ```
27pub trait Vpbroadcastmb2qEmitter<A, B> {
28 fn vpbroadcastmb2q(&mut self, op0: A, op1: B);
29}
30
31impl<'a> Vpbroadcastmb2qEmitter<Xmm, KReg> for Assembler<'a> {
32 fn vpbroadcastmb2q(&mut self, op0: Xmm, op1: KReg) {
33 self.emit(VPBROADCASTMB2Q128RK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
34 }
35}
36
37impl<'a> Vpbroadcastmb2qEmitter<Ymm, KReg> for Assembler<'a> {
38 fn vpbroadcastmb2q(&mut self, op0: Ymm, op1: KReg) {
39 self.emit(VPBROADCASTMB2Q256RK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
40 }
41}
42
43impl<'a> Vpbroadcastmb2qEmitter<Zmm, KReg> for Assembler<'a> {
44 fn vpbroadcastmb2q(&mut self, op0: Zmm, op1: KReg) {
45 self.emit(VPBROADCASTMB2Q512RK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
46 }
47}
48
49/// `VPBROADCASTMW2D` (VPBROADCASTMW2D).
50/// Broadcasts the zero-extended 64/32 bit value of the low byte/word of the source operand (the second operand) to each 64/32 bit element of the destination operand (the first operand). The source operand is an opmask register. The destination operand is a ZMM register (EVEX.512), YMM register (EVEX.256), or XMM register (EVEX.128).
51///
52///
53/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPBROADCASTM.html).
54///
55/// Supported operand variants:
56///
57/// ```text
58/// +---+-----------+
59/// | # | Operands |
60/// +---+-----------+
61/// | 1 | Xmm, KReg |
62/// | 2 | Ymm, KReg |
63/// | 3 | Zmm, KReg |
64/// +---+-----------+
65/// ```
66pub trait Vpbroadcastmw2dEmitter<A, B> {
67 fn vpbroadcastmw2d(&mut self, op0: A, op1: B);
68}
69
70impl<'a> Vpbroadcastmw2dEmitter<Xmm, KReg> for Assembler<'a> {
71 fn vpbroadcastmw2d(&mut self, op0: Xmm, op1: KReg) {
72 self.emit(VPBROADCASTMW2D128RK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
73 }
74}
75
76impl<'a> Vpbroadcastmw2dEmitter<Ymm, KReg> for Assembler<'a> {
77 fn vpbroadcastmw2d(&mut self, op0: Ymm, op1: KReg) {
78 self.emit(VPBROADCASTMW2D256RK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
79 }
80}
81
82impl<'a> Vpbroadcastmw2dEmitter<Zmm, KReg> for Assembler<'a> {
83 fn vpbroadcastmw2d(&mut self, op0: Zmm, op1: KReg) {
84 self.emit(VPBROADCASTMW2D512RK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
85 }
86}
87
88/// `VPCONFLICTD` (VPCONFLICTD).
89/// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
90///
91///
92/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
93///
94/// Supported operand variants:
95///
96/// ```text
97/// +---+----------+
98/// | # | Operands |
99/// +---+----------+
100/// | 1 | Xmm, Mem |
101/// | 2 | Xmm, Xmm |
102/// | 3 | Ymm, Mem |
103/// | 4 | Ymm, Ymm |
104/// | 5 | Zmm, Mem |
105/// | 6 | Zmm, Zmm |
106/// +---+----------+
107/// ```
108pub trait VpconflictdEmitter<A, B> {
109 fn vpconflictd(&mut self, op0: A, op1: B);
110}
111
112impl<'a> VpconflictdEmitter<Xmm, Xmm> for Assembler<'a> {
113 fn vpconflictd(&mut self, op0: Xmm, op1: Xmm) {
114 self.emit(VPCONFLICTD128RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
115 }
116}
117
118impl<'a> VpconflictdEmitter<Xmm, Mem> for Assembler<'a> {
119 fn vpconflictd(&mut self, op0: Xmm, op1: Mem) {
120 self.emit(VPCONFLICTD128RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
121 }
122}
123
124impl<'a> VpconflictdEmitter<Ymm, Ymm> for Assembler<'a> {
125 fn vpconflictd(&mut self, op0: Ymm, op1: Ymm) {
126 self.emit(VPCONFLICTD256RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
127 }
128}
129
130impl<'a> VpconflictdEmitter<Ymm, Mem> for Assembler<'a> {
131 fn vpconflictd(&mut self, op0: Ymm, op1: Mem) {
132 self.emit(VPCONFLICTD256RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
133 }
134}
135
136impl<'a> VpconflictdEmitter<Zmm, Zmm> for Assembler<'a> {
137 fn vpconflictd(&mut self, op0: Zmm, op1: Zmm) {
138 self.emit(VPCONFLICTD512RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
139 }
140}
141
142impl<'a> VpconflictdEmitter<Zmm, Mem> for Assembler<'a> {
143 fn vpconflictd(&mut self, op0: Zmm, op1: Mem) {
144 self.emit(VPCONFLICTD512RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
145 }
146}
147
148/// `VPCONFLICTD_MASK` (VPCONFLICTD).
149/// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
150///
151///
152/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
153///
154/// Supported operand variants:
155///
156/// ```text
157/// +---+----------+
158/// | # | Operands |
159/// +---+----------+
160/// | 1 | Xmm, Mem |
161/// | 2 | Xmm, Xmm |
162/// | 3 | Ymm, Mem |
163/// | 4 | Ymm, Ymm |
164/// | 5 | Zmm, Mem |
165/// | 6 | Zmm, Zmm |
166/// +---+----------+
167/// ```
168pub trait VpconflictdMaskEmitter<A, B> {
169 fn vpconflictd_mask(&mut self, op0: A, op1: B);
170}
171
172impl<'a> VpconflictdMaskEmitter<Xmm, Xmm> for Assembler<'a> {
173 fn vpconflictd_mask(&mut self, op0: Xmm, op1: Xmm) {
174 self.emit(VPCONFLICTD128RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
175 }
176}
177
178impl<'a> VpconflictdMaskEmitter<Xmm, Mem> for Assembler<'a> {
179 fn vpconflictd_mask(&mut self, op0: Xmm, op1: Mem) {
180 self.emit(VPCONFLICTD128RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
181 }
182}
183
184impl<'a> VpconflictdMaskEmitter<Ymm, Ymm> for Assembler<'a> {
185 fn vpconflictd_mask(&mut self, op0: Ymm, op1: Ymm) {
186 self.emit(VPCONFLICTD256RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
187 }
188}
189
190impl<'a> VpconflictdMaskEmitter<Ymm, Mem> for Assembler<'a> {
191 fn vpconflictd_mask(&mut self, op0: Ymm, op1: Mem) {
192 self.emit(VPCONFLICTD256RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
193 }
194}
195
196impl<'a> VpconflictdMaskEmitter<Zmm, Zmm> for Assembler<'a> {
197 fn vpconflictd_mask(&mut self, op0: Zmm, op1: Zmm) {
198 self.emit(VPCONFLICTD512RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
199 }
200}
201
202impl<'a> VpconflictdMaskEmitter<Zmm, Mem> for Assembler<'a> {
203 fn vpconflictd_mask(&mut self, op0: Zmm, op1: Mem) {
204 self.emit(VPCONFLICTD512RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
205 }
206}
207
208/// `VPCONFLICTD_MASKZ` (VPCONFLICTD).
209/// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
210///
211///
212/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
213///
214/// Supported operand variants:
215///
216/// ```text
217/// +---+----------+
218/// | # | Operands |
219/// +---+----------+
220/// | 1 | Xmm, Mem |
221/// | 2 | Xmm, Xmm |
222/// | 3 | Ymm, Mem |
223/// | 4 | Ymm, Ymm |
224/// | 5 | Zmm, Mem |
225/// | 6 | Zmm, Zmm |
226/// +---+----------+
227/// ```
228pub trait VpconflictdMaskzEmitter<A, B> {
229 fn vpconflictd_maskz(&mut self, op0: A, op1: B);
230}
231
232impl<'a> VpconflictdMaskzEmitter<Xmm, Xmm> for Assembler<'a> {
233 fn vpconflictd_maskz(&mut self, op0: Xmm, op1: Xmm) {
234 self.emit(VPCONFLICTD128RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
235 }
236}
237
238impl<'a> VpconflictdMaskzEmitter<Xmm, Mem> for Assembler<'a> {
239 fn vpconflictd_maskz(&mut self, op0: Xmm, op1: Mem) {
240 self.emit(VPCONFLICTD128RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
241 }
242}
243
244impl<'a> VpconflictdMaskzEmitter<Ymm, Ymm> for Assembler<'a> {
245 fn vpconflictd_maskz(&mut self, op0: Ymm, op1: Ymm) {
246 self.emit(VPCONFLICTD256RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
247 }
248}
249
250impl<'a> VpconflictdMaskzEmitter<Ymm, Mem> for Assembler<'a> {
251 fn vpconflictd_maskz(&mut self, op0: Ymm, op1: Mem) {
252 self.emit(VPCONFLICTD256RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
253 }
254}
255
256impl<'a> VpconflictdMaskzEmitter<Zmm, Zmm> for Assembler<'a> {
257 fn vpconflictd_maskz(&mut self, op0: Zmm, op1: Zmm) {
258 self.emit(VPCONFLICTD512RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
259 }
260}
261
262impl<'a> VpconflictdMaskzEmitter<Zmm, Mem> for Assembler<'a> {
263 fn vpconflictd_maskz(&mut self, op0: Zmm, op1: Mem) {
264 self.emit(VPCONFLICTD512RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
265 }
266}
267
268/// `VPCONFLICTQ` (VPCONFLICTQ).
269/// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
270///
271///
272/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
273///
274/// Supported operand variants:
275///
276/// ```text
277/// +---+----------+
278/// | # | Operands |
279/// +---+----------+
280/// | 1 | Xmm, Mem |
281/// | 2 | Xmm, Xmm |
282/// | 3 | Ymm, Mem |
283/// | 4 | Ymm, Ymm |
284/// | 5 | Zmm, Mem |
285/// | 6 | Zmm, Zmm |
286/// +---+----------+
287/// ```
288pub trait VpconflictqEmitter<A, B> {
289 fn vpconflictq(&mut self, op0: A, op1: B);
290}
291
292impl<'a> VpconflictqEmitter<Xmm, Xmm> for Assembler<'a> {
293 fn vpconflictq(&mut self, op0: Xmm, op1: Xmm) {
294 self.emit(VPCONFLICTQ128RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
295 }
296}
297
298impl<'a> VpconflictqEmitter<Xmm, Mem> for Assembler<'a> {
299 fn vpconflictq(&mut self, op0: Xmm, op1: Mem) {
300 self.emit(VPCONFLICTQ128RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
301 }
302}
303
304impl<'a> VpconflictqEmitter<Ymm, Ymm> for Assembler<'a> {
305 fn vpconflictq(&mut self, op0: Ymm, op1: Ymm) {
306 self.emit(VPCONFLICTQ256RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
307 }
308}
309
310impl<'a> VpconflictqEmitter<Ymm, Mem> for Assembler<'a> {
311 fn vpconflictq(&mut self, op0: Ymm, op1: Mem) {
312 self.emit(VPCONFLICTQ256RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
313 }
314}
315
316impl<'a> VpconflictqEmitter<Zmm, Zmm> for Assembler<'a> {
317 fn vpconflictq(&mut self, op0: Zmm, op1: Zmm) {
318 self.emit(VPCONFLICTQ512RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
319 }
320}
321
322impl<'a> VpconflictqEmitter<Zmm, Mem> for Assembler<'a> {
323 fn vpconflictq(&mut self, op0: Zmm, op1: Mem) {
324 self.emit(VPCONFLICTQ512RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
325 }
326}
327
328/// `VPCONFLICTQ_MASK` (VPCONFLICTQ).
329/// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
330///
331///
332/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
333///
334/// Supported operand variants:
335///
336/// ```text
337/// +---+----------+
338/// | # | Operands |
339/// +---+----------+
340/// | 1 | Xmm, Mem |
341/// | 2 | Xmm, Xmm |
342/// | 3 | Ymm, Mem |
343/// | 4 | Ymm, Ymm |
344/// | 5 | Zmm, Mem |
345/// | 6 | Zmm, Zmm |
346/// +---+----------+
347/// ```
348pub trait VpconflictqMaskEmitter<A, B> {
349 fn vpconflictq_mask(&mut self, op0: A, op1: B);
350}
351
352impl<'a> VpconflictqMaskEmitter<Xmm, Xmm> for Assembler<'a> {
353 fn vpconflictq_mask(&mut self, op0: Xmm, op1: Xmm) {
354 self.emit(VPCONFLICTQ128RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
355 }
356}
357
358impl<'a> VpconflictqMaskEmitter<Xmm, Mem> for Assembler<'a> {
359 fn vpconflictq_mask(&mut self, op0: Xmm, op1: Mem) {
360 self.emit(VPCONFLICTQ128RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
361 }
362}
363
364impl<'a> VpconflictqMaskEmitter<Ymm, Ymm> for Assembler<'a> {
365 fn vpconflictq_mask(&mut self, op0: Ymm, op1: Ymm) {
366 self.emit(VPCONFLICTQ256RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
367 }
368}
369
370impl<'a> VpconflictqMaskEmitter<Ymm, Mem> for Assembler<'a> {
371 fn vpconflictq_mask(&mut self, op0: Ymm, op1: Mem) {
372 self.emit(VPCONFLICTQ256RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
373 }
374}
375
376impl<'a> VpconflictqMaskEmitter<Zmm, Zmm> for Assembler<'a> {
377 fn vpconflictq_mask(&mut self, op0: Zmm, op1: Zmm) {
378 self.emit(VPCONFLICTQ512RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
379 }
380}
381
382impl<'a> VpconflictqMaskEmitter<Zmm, Mem> for Assembler<'a> {
383 fn vpconflictq_mask(&mut self, op0: Zmm, op1: Mem) {
384 self.emit(VPCONFLICTQ512RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
385 }
386}
387
388/// `VPCONFLICTQ_MASKZ` (VPCONFLICTQ).
389/// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
390///
391///
392/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
393///
394/// Supported operand variants:
395///
396/// ```text
397/// +---+----------+
398/// | # | Operands |
399/// +---+----------+
400/// | 1 | Xmm, Mem |
401/// | 2 | Xmm, Xmm |
402/// | 3 | Ymm, Mem |
403/// | 4 | Ymm, Ymm |
404/// | 5 | Zmm, Mem |
405/// | 6 | Zmm, Zmm |
406/// +---+----------+
407/// ```
408pub trait VpconflictqMaskzEmitter<A, B> {
409 fn vpconflictq_maskz(&mut self, op0: A, op1: B);
410}
411
412impl<'a> VpconflictqMaskzEmitter<Xmm, Xmm> for Assembler<'a> {
413 fn vpconflictq_maskz(&mut self, op0: Xmm, op1: Xmm) {
414 self.emit(VPCONFLICTQ128RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
415 }
416}
417
418impl<'a> VpconflictqMaskzEmitter<Xmm, Mem> for Assembler<'a> {
419 fn vpconflictq_maskz(&mut self, op0: Xmm, op1: Mem) {
420 self.emit(VPCONFLICTQ128RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
421 }
422}
423
424impl<'a> VpconflictqMaskzEmitter<Ymm, Ymm> for Assembler<'a> {
425 fn vpconflictq_maskz(&mut self, op0: Ymm, op1: Ymm) {
426 self.emit(VPCONFLICTQ256RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
427 }
428}
429
430impl<'a> VpconflictqMaskzEmitter<Ymm, Mem> for Assembler<'a> {
431 fn vpconflictq_maskz(&mut self, op0: Ymm, op1: Mem) {
432 self.emit(VPCONFLICTQ256RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
433 }
434}
435
436impl<'a> VpconflictqMaskzEmitter<Zmm, Zmm> for Assembler<'a> {
437 fn vpconflictq_maskz(&mut self, op0: Zmm, op1: Zmm) {
438 self.emit(VPCONFLICTQ512RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
439 }
440}
441
442impl<'a> VpconflictqMaskzEmitter<Zmm, Mem> for Assembler<'a> {
443 fn vpconflictq_maskz(&mut self, op0: Zmm, op1: Mem) {
444 self.emit(VPCONFLICTQ512RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
445 }
446}
447
448/// `VPLZCNTD` (VPLZCNTD).
449/// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
450///
451///
452/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
453///
454/// Supported operand variants:
455///
456/// ```text
457/// +---+----------+
458/// | # | Operands |
459/// +---+----------+
460/// | 1 | Xmm, Mem |
461/// | 2 | Xmm, Xmm |
462/// | 3 | Ymm, Mem |
463/// | 4 | Ymm, Ymm |
464/// | 5 | Zmm, Mem |
465/// | 6 | Zmm, Zmm |
466/// +---+----------+
467/// ```
468pub trait VplzcntdEmitter<A, B> {
469 fn vplzcntd(&mut self, op0: A, op1: B);
470}
471
472impl<'a> VplzcntdEmitter<Xmm, Xmm> for Assembler<'a> {
473 fn vplzcntd(&mut self, op0: Xmm, op1: Xmm) {
474 self.emit(VPLZCNTD128RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
475 }
476}
477
478impl<'a> VplzcntdEmitter<Xmm, Mem> for Assembler<'a> {
479 fn vplzcntd(&mut self, op0: Xmm, op1: Mem) {
480 self.emit(VPLZCNTD128RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
481 }
482}
483
484impl<'a> VplzcntdEmitter<Ymm, Ymm> for Assembler<'a> {
485 fn vplzcntd(&mut self, op0: Ymm, op1: Ymm) {
486 self.emit(VPLZCNTD256RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
487 }
488}
489
490impl<'a> VplzcntdEmitter<Ymm, Mem> for Assembler<'a> {
491 fn vplzcntd(&mut self, op0: Ymm, op1: Mem) {
492 self.emit(VPLZCNTD256RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
493 }
494}
495
496impl<'a> VplzcntdEmitter<Zmm, Zmm> for Assembler<'a> {
497 fn vplzcntd(&mut self, op0: Zmm, op1: Zmm) {
498 self.emit(VPLZCNTD512RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
499 }
500}
501
502impl<'a> VplzcntdEmitter<Zmm, Mem> for Assembler<'a> {
503 fn vplzcntd(&mut self, op0: Zmm, op1: Mem) {
504 self.emit(VPLZCNTD512RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
505 }
506}
507
508/// `VPLZCNTD_MASK` (VPLZCNTD).
509/// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
510///
511///
512/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
513///
514/// Supported operand variants:
515///
516/// ```text
517/// +---+----------+
518/// | # | Operands |
519/// +---+----------+
520/// | 1 | Xmm, Mem |
521/// | 2 | Xmm, Xmm |
522/// | 3 | Ymm, Mem |
523/// | 4 | Ymm, Ymm |
524/// | 5 | Zmm, Mem |
525/// | 6 | Zmm, Zmm |
526/// +---+----------+
527/// ```
528pub trait VplzcntdMaskEmitter<A, B> {
529 fn vplzcntd_mask(&mut self, op0: A, op1: B);
530}
531
532impl<'a> VplzcntdMaskEmitter<Xmm, Xmm> for Assembler<'a> {
533 fn vplzcntd_mask(&mut self, op0: Xmm, op1: Xmm) {
534 self.emit(VPLZCNTD128RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
535 }
536}
537
538impl<'a> VplzcntdMaskEmitter<Xmm, Mem> for Assembler<'a> {
539 fn vplzcntd_mask(&mut self, op0: Xmm, op1: Mem) {
540 self.emit(VPLZCNTD128RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
541 }
542}
543
544impl<'a> VplzcntdMaskEmitter<Ymm, Ymm> for Assembler<'a> {
545 fn vplzcntd_mask(&mut self, op0: Ymm, op1: Ymm) {
546 self.emit(VPLZCNTD256RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
547 }
548}
549
550impl<'a> VplzcntdMaskEmitter<Ymm, Mem> for Assembler<'a> {
551 fn vplzcntd_mask(&mut self, op0: Ymm, op1: Mem) {
552 self.emit(VPLZCNTD256RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
553 }
554}
555
556impl<'a> VplzcntdMaskEmitter<Zmm, Zmm> for Assembler<'a> {
557 fn vplzcntd_mask(&mut self, op0: Zmm, op1: Zmm) {
558 self.emit(VPLZCNTD512RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
559 }
560}
561
562impl<'a> VplzcntdMaskEmitter<Zmm, Mem> for Assembler<'a> {
563 fn vplzcntd_mask(&mut self, op0: Zmm, op1: Mem) {
564 self.emit(VPLZCNTD512RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
565 }
566}
567
568/// `VPLZCNTD_MASKZ` (VPLZCNTD).
569/// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
570///
571///
572/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
573///
574/// Supported operand variants:
575///
576/// ```text
577/// +---+----------+
578/// | # | Operands |
579/// +---+----------+
580/// | 1 | Xmm, Mem |
581/// | 2 | Xmm, Xmm |
582/// | 3 | Ymm, Mem |
583/// | 4 | Ymm, Ymm |
584/// | 5 | Zmm, Mem |
585/// | 6 | Zmm, Zmm |
586/// +---+----------+
587/// ```
588pub trait VplzcntdMaskzEmitter<A, B> {
589 fn vplzcntd_maskz(&mut self, op0: A, op1: B);
590}
591
592impl<'a> VplzcntdMaskzEmitter<Xmm, Xmm> for Assembler<'a> {
593 fn vplzcntd_maskz(&mut self, op0: Xmm, op1: Xmm) {
594 self.emit(VPLZCNTD128RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
595 }
596}
597
598impl<'a> VplzcntdMaskzEmitter<Xmm, Mem> for Assembler<'a> {
599 fn vplzcntd_maskz(&mut self, op0: Xmm, op1: Mem) {
600 self.emit(VPLZCNTD128RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
601 }
602}
603
604impl<'a> VplzcntdMaskzEmitter<Ymm, Ymm> for Assembler<'a> {
605 fn vplzcntd_maskz(&mut self, op0: Ymm, op1: Ymm) {
606 self.emit(VPLZCNTD256RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
607 }
608}
609
610impl<'a> VplzcntdMaskzEmitter<Ymm, Mem> for Assembler<'a> {
611 fn vplzcntd_maskz(&mut self, op0: Ymm, op1: Mem) {
612 self.emit(VPLZCNTD256RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
613 }
614}
615
616impl<'a> VplzcntdMaskzEmitter<Zmm, Zmm> for Assembler<'a> {
617 fn vplzcntd_maskz(&mut self, op0: Zmm, op1: Zmm) {
618 self.emit(VPLZCNTD512RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
619 }
620}
621
622impl<'a> VplzcntdMaskzEmitter<Zmm, Mem> for Assembler<'a> {
623 fn vplzcntd_maskz(&mut self, op0: Zmm, op1: Mem) {
624 self.emit(VPLZCNTD512RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
625 }
626}
627
628/// `VPLZCNTQ` (VPLZCNTQ).
629/// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
630///
631///
632/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
633///
634/// Supported operand variants:
635///
636/// ```text
637/// +---+----------+
638/// | # | Operands |
639/// +---+----------+
640/// | 1 | Xmm, Mem |
641/// | 2 | Xmm, Xmm |
642/// | 3 | Ymm, Mem |
643/// | 4 | Ymm, Ymm |
644/// | 5 | Zmm, Mem |
645/// | 6 | Zmm, Zmm |
646/// +---+----------+
647/// ```
648pub trait VplzcntqEmitter<A, B> {
649 fn vplzcntq(&mut self, op0: A, op1: B);
650}
651
652impl<'a> VplzcntqEmitter<Xmm, Xmm> for Assembler<'a> {
653 fn vplzcntq(&mut self, op0: Xmm, op1: Xmm) {
654 self.emit(VPLZCNTQ128RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
655 }
656}
657
658impl<'a> VplzcntqEmitter<Xmm, Mem> for Assembler<'a> {
659 fn vplzcntq(&mut self, op0: Xmm, op1: Mem) {
660 self.emit(VPLZCNTQ128RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
661 }
662}
663
664impl<'a> VplzcntqEmitter<Ymm, Ymm> for Assembler<'a> {
665 fn vplzcntq(&mut self, op0: Ymm, op1: Ymm) {
666 self.emit(VPLZCNTQ256RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
667 }
668}
669
670impl<'a> VplzcntqEmitter<Ymm, Mem> for Assembler<'a> {
671 fn vplzcntq(&mut self, op0: Ymm, op1: Mem) {
672 self.emit(VPLZCNTQ256RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
673 }
674}
675
676impl<'a> VplzcntqEmitter<Zmm, Zmm> for Assembler<'a> {
677 fn vplzcntq(&mut self, op0: Zmm, op1: Zmm) {
678 self.emit(VPLZCNTQ512RR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
679 }
680}
681
682impl<'a> VplzcntqEmitter<Zmm, Mem> for Assembler<'a> {
683 fn vplzcntq(&mut self, op0: Zmm, op1: Mem) {
684 self.emit(VPLZCNTQ512RM, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
685 }
686}
687
688/// `VPLZCNTQ_MASK` (VPLZCNTQ).
689/// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
690///
691///
692/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
693///
694/// Supported operand variants:
695///
696/// ```text
697/// +---+----------+
698/// | # | Operands |
699/// +---+----------+
700/// | 1 | Xmm, Mem |
701/// | 2 | Xmm, Xmm |
702/// | 3 | Ymm, Mem |
703/// | 4 | Ymm, Ymm |
704/// | 5 | Zmm, Mem |
705/// | 6 | Zmm, Zmm |
706/// +---+----------+
707/// ```
708pub trait VplzcntqMaskEmitter<A, B> {
709 fn vplzcntq_mask(&mut self, op0: A, op1: B);
710}
711
712impl<'a> VplzcntqMaskEmitter<Xmm, Xmm> for Assembler<'a> {
713 fn vplzcntq_mask(&mut self, op0: Xmm, op1: Xmm) {
714 self.emit(VPLZCNTQ128RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
715 }
716}
717
718impl<'a> VplzcntqMaskEmitter<Xmm, Mem> for Assembler<'a> {
719 fn vplzcntq_mask(&mut self, op0: Xmm, op1: Mem) {
720 self.emit(VPLZCNTQ128RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
721 }
722}
723
724impl<'a> VplzcntqMaskEmitter<Ymm, Ymm> for Assembler<'a> {
725 fn vplzcntq_mask(&mut self, op0: Ymm, op1: Ymm) {
726 self.emit(VPLZCNTQ256RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
727 }
728}
729
730impl<'a> VplzcntqMaskEmitter<Ymm, Mem> for Assembler<'a> {
731 fn vplzcntq_mask(&mut self, op0: Ymm, op1: Mem) {
732 self.emit(VPLZCNTQ256RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
733 }
734}
735
736impl<'a> VplzcntqMaskEmitter<Zmm, Zmm> for Assembler<'a> {
737 fn vplzcntq_mask(&mut self, op0: Zmm, op1: Zmm) {
738 self.emit(VPLZCNTQ512RR_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
739 }
740}
741
742impl<'a> VplzcntqMaskEmitter<Zmm, Mem> for Assembler<'a> {
743 fn vplzcntq_mask(&mut self, op0: Zmm, op1: Mem) {
744 self.emit(VPLZCNTQ512RM_MASK, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
745 }
746}
747
748/// `VPLZCNTQ_MASKZ` (VPLZCNTQ).
749/// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
750///
751///
752/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
753///
754/// Supported operand variants:
755///
756/// ```text
757/// +---+----------+
758/// | # | Operands |
759/// +---+----------+
760/// | 1 | Xmm, Mem |
761/// | 2 | Xmm, Xmm |
762/// | 3 | Ymm, Mem |
763/// | 4 | Ymm, Ymm |
764/// | 5 | Zmm, Mem |
765/// | 6 | Zmm, Zmm |
766/// +---+----------+
767/// ```
768pub trait VplzcntqMaskzEmitter<A, B> {
769 fn vplzcntq_maskz(&mut self, op0: A, op1: B);
770}
771
772impl<'a> VplzcntqMaskzEmitter<Xmm, Xmm> for Assembler<'a> {
773 fn vplzcntq_maskz(&mut self, op0: Xmm, op1: Xmm) {
774 self.emit(VPLZCNTQ128RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
775 }
776}
777
778impl<'a> VplzcntqMaskzEmitter<Xmm, Mem> for Assembler<'a> {
779 fn vplzcntq_maskz(&mut self, op0: Xmm, op1: Mem) {
780 self.emit(VPLZCNTQ128RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
781 }
782}
783
784impl<'a> VplzcntqMaskzEmitter<Ymm, Ymm> for Assembler<'a> {
785 fn vplzcntq_maskz(&mut self, op0: Ymm, op1: Ymm) {
786 self.emit(VPLZCNTQ256RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
787 }
788}
789
790impl<'a> VplzcntqMaskzEmitter<Ymm, Mem> for Assembler<'a> {
791 fn vplzcntq_maskz(&mut self, op0: Ymm, op1: Mem) {
792 self.emit(VPLZCNTQ256RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
793 }
794}
795
796impl<'a> VplzcntqMaskzEmitter<Zmm, Zmm> for Assembler<'a> {
797 fn vplzcntq_maskz(&mut self, op0: Zmm, op1: Zmm) {
798 self.emit(VPLZCNTQ512RR_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
799 }
800}
801
802impl<'a> VplzcntqMaskzEmitter<Zmm, Mem> for Assembler<'a> {
803 fn vplzcntq_maskz(&mut self, op0: Zmm, op1: Mem) {
804 self.emit(VPLZCNTQ512RM_MASKZ, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
805 }
806}
807
808
809impl<'a> Assembler<'a> {
810 /// `VPBROADCASTMB2Q` (VPBROADCASTMB2Q).
811 /// Broadcasts the zero-extended 64/32 bit value of the low byte/word of the source operand (the second operand) to each 64/32 bit element of the destination operand (the first operand). The source operand is an opmask register. The destination operand is a ZMM register (EVEX.512), YMM register (EVEX.256), or XMM register (EVEX.128).
812 ///
813 ///
814 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPBROADCASTM.html).
815 ///
816 /// Supported operand variants:
817 ///
818 /// ```text
819 /// +---+-----------+
820 /// | # | Operands |
821 /// +---+-----------+
822 /// | 1 | Xmm, KReg |
823 /// | 2 | Ymm, KReg |
824 /// | 3 | Zmm, KReg |
825 /// +---+-----------+
826 /// ```
827 #[inline]
828 pub fn vpbroadcastmb2q<A, B>(&mut self, op0: A, op1: B)
829 where Assembler<'a>: Vpbroadcastmb2qEmitter<A, B> {
830 <Self as Vpbroadcastmb2qEmitter<A, B>>::vpbroadcastmb2q(self, op0, op1);
831 }
832 /// `VPBROADCASTMW2D` (VPBROADCASTMW2D).
833 /// Broadcasts the zero-extended 64/32 bit value of the low byte/word of the source operand (the second operand) to each 64/32 bit element of the destination operand (the first operand). The source operand is an opmask register. The destination operand is a ZMM register (EVEX.512), YMM register (EVEX.256), or XMM register (EVEX.128).
834 ///
835 ///
836 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPBROADCASTM.html).
837 ///
838 /// Supported operand variants:
839 ///
840 /// ```text
841 /// +---+-----------+
842 /// | # | Operands |
843 /// +---+-----------+
844 /// | 1 | Xmm, KReg |
845 /// | 2 | Ymm, KReg |
846 /// | 3 | Zmm, KReg |
847 /// +---+-----------+
848 /// ```
849 #[inline]
850 pub fn vpbroadcastmw2d<A, B>(&mut self, op0: A, op1: B)
851 where Assembler<'a>: Vpbroadcastmw2dEmitter<A, B> {
852 <Self as Vpbroadcastmw2dEmitter<A, B>>::vpbroadcastmw2d(self, op0, op1);
853 }
854 /// `VPCONFLICTD` (VPCONFLICTD).
855 /// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
856 ///
857 ///
858 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
859 ///
860 /// Supported operand variants:
861 ///
862 /// ```text
863 /// +---+----------+
864 /// | # | Operands |
865 /// +---+----------+
866 /// | 1 | Xmm, Mem |
867 /// | 2 | Xmm, Xmm |
868 /// | 3 | Ymm, Mem |
869 /// | 4 | Ymm, Ymm |
870 /// | 5 | Zmm, Mem |
871 /// | 6 | Zmm, Zmm |
872 /// +---+----------+
873 /// ```
874 #[inline]
875 pub fn vpconflictd<A, B>(&mut self, op0: A, op1: B)
876 where Assembler<'a>: VpconflictdEmitter<A, B> {
877 <Self as VpconflictdEmitter<A, B>>::vpconflictd(self, op0, op1);
878 }
879 /// `VPCONFLICTD_MASK` (VPCONFLICTD).
880 /// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
881 ///
882 ///
883 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
884 ///
885 /// Supported operand variants:
886 ///
887 /// ```text
888 /// +---+----------+
889 /// | # | Operands |
890 /// +---+----------+
891 /// | 1 | Xmm, Mem |
892 /// | 2 | Xmm, Xmm |
893 /// | 3 | Ymm, Mem |
894 /// | 4 | Ymm, Ymm |
895 /// | 5 | Zmm, Mem |
896 /// | 6 | Zmm, Zmm |
897 /// +---+----------+
898 /// ```
899 #[inline]
900 pub fn vpconflictd_mask<A, B>(&mut self, op0: A, op1: B)
901 where Assembler<'a>: VpconflictdMaskEmitter<A, B> {
902 <Self as VpconflictdMaskEmitter<A, B>>::vpconflictd_mask(self, op0, op1);
903 }
904 /// `VPCONFLICTD_MASKZ` (VPCONFLICTD).
905 /// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
906 ///
907 ///
908 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
909 ///
910 /// Supported operand variants:
911 ///
912 /// ```text
913 /// +---+----------+
914 /// | # | Operands |
915 /// +---+----------+
916 /// | 1 | Xmm, Mem |
917 /// | 2 | Xmm, Xmm |
918 /// | 3 | Ymm, Mem |
919 /// | 4 | Ymm, Ymm |
920 /// | 5 | Zmm, Mem |
921 /// | 6 | Zmm, Zmm |
922 /// +---+----------+
923 /// ```
924 #[inline]
925 pub fn vpconflictd_maskz<A, B>(&mut self, op0: A, op1: B)
926 where Assembler<'a>: VpconflictdMaskzEmitter<A, B> {
927 <Self as VpconflictdMaskzEmitter<A, B>>::vpconflictd_maskz(self, op0, op1);
928 }
929 /// `VPCONFLICTQ` (VPCONFLICTQ).
930 /// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
931 ///
932 ///
933 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
934 ///
935 /// Supported operand variants:
936 ///
937 /// ```text
938 /// +---+----------+
939 /// | # | Operands |
940 /// +---+----------+
941 /// | 1 | Xmm, Mem |
942 /// | 2 | Xmm, Xmm |
943 /// | 3 | Ymm, Mem |
944 /// | 4 | Ymm, Ymm |
945 /// | 5 | Zmm, Mem |
946 /// | 6 | Zmm, Zmm |
947 /// +---+----------+
948 /// ```
949 #[inline]
950 pub fn vpconflictq<A, B>(&mut self, op0: A, op1: B)
951 where Assembler<'a>: VpconflictqEmitter<A, B> {
952 <Self as VpconflictqEmitter<A, B>>::vpconflictq(self, op0, op1);
953 }
954 /// `VPCONFLICTQ_MASK` (VPCONFLICTQ).
955 /// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
956 ///
957 ///
958 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
959 ///
960 /// Supported operand variants:
961 ///
962 /// ```text
963 /// +---+----------+
964 /// | # | Operands |
965 /// +---+----------+
966 /// | 1 | Xmm, Mem |
967 /// | 2 | Xmm, Xmm |
968 /// | 3 | Ymm, Mem |
969 /// | 4 | Ymm, Ymm |
970 /// | 5 | Zmm, Mem |
971 /// | 6 | Zmm, Zmm |
972 /// +---+----------+
973 /// ```
974 #[inline]
975 pub fn vpconflictq_mask<A, B>(&mut self, op0: A, op1: B)
976 where Assembler<'a>: VpconflictqMaskEmitter<A, B> {
977 <Self as VpconflictqMaskEmitter<A, B>>::vpconflictq_mask(self, op0, op1);
978 }
979 /// `VPCONFLICTQ_MASKZ` (VPCONFLICTQ).
980 /// Test each dword/qword element of the source operand (the second operand) for equality with all other elements in the source operand closer to the least significant element. Each element’s comparison results form a bit vector, which is then zero extended and written to the destination according to the writemask.
981 ///
982 ///
983 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPCONFLICTD%3AVPCONFLICTQ.html).
984 ///
985 /// Supported operand variants:
986 ///
987 /// ```text
988 /// +---+----------+
989 /// | # | Operands |
990 /// +---+----------+
991 /// | 1 | Xmm, Mem |
992 /// | 2 | Xmm, Xmm |
993 /// | 3 | Ymm, Mem |
994 /// | 4 | Ymm, Ymm |
995 /// | 5 | Zmm, Mem |
996 /// | 6 | Zmm, Zmm |
997 /// +---+----------+
998 /// ```
999 #[inline]
1000 pub fn vpconflictq_maskz<A, B>(&mut self, op0: A, op1: B)
1001 where Assembler<'a>: VpconflictqMaskzEmitter<A, B> {
1002 <Self as VpconflictqMaskzEmitter<A, B>>::vpconflictq_maskz(self, op0, op1);
1003 }
1004 /// `VPLZCNTD` (VPLZCNTD).
1005 /// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
1006 ///
1007 ///
1008 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
1009 ///
1010 /// Supported operand variants:
1011 ///
1012 /// ```text
1013 /// +---+----------+
1014 /// | # | Operands |
1015 /// +---+----------+
1016 /// | 1 | Xmm, Mem |
1017 /// | 2 | Xmm, Xmm |
1018 /// | 3 | Ymm, Mem |
1019 /// | 4 | Ymm, Ymm |
1020 /// | 5 | Zmm, Mem |
1021 /// | 6 | Zmm, Zmm |
1022 /// +---+----------+
1023 /// ```
1024 #[inline]
1025 pub fn vplzcntd<A, B>(&mut self, op0: A, op1: B)
1026 where Assembler<'a>: VplzcntdEmitter<A, B> {
1027 <Self as VplzcntdEmitter<A, B>>::vplzcntd(self, op0, op1);
1028 }
1029 /// `VPLZCNTD_MASK` (VPLZCNTD).
1030 /// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
1031 ///
1032 ///
1033 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
1034 ///
1035 /// Supported operand variants:
1036 ///
1037 /// ```text
1038 /// +---+----------+
1039 /// | # | Operands |
1040 /// +---+----------+
1041 /// | 1 | Xmm, Mem |
1042 /// | 2 | Xmm, Xmm |
1043 /// | 3 | Ymm, Mem |
1044 /// | 4 | Ymm, Ymm |
1045 /// | 5 | Zmm, Mem |
1046 /// | 6 | Zmm, Zmm |
1047 /// +---+----------+
1048 /// ```
1049 #[inline]
1050 pub fn vplzcntd_mask<A, B>(&mut self, op0: A, op1: B)
1051 where Assembler<'a>: VplzcntdMaskEmitter<A, B> {
1052 <Self as VplzcntdMaskEmitter<A, B>>::vplzcntd_mask(self, op0, op1);
1053 }
1054 /// `VPLZCNTD_MASKZ` (VPLZCNTD).
1055 /// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
1056 ///
1057 ///
1058 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
1059 ///
1060 /// Supported operand variants:
1061 ///
1062 /// ```text
1063 /// +---+----------+
1064 /// | # | Operands |
1065 /// +---+----------+
1066 /// | 1 | Xmm, Mem |
1067 /// | 2 | Xmm, Xmm |
1068 /// | 3 | Ymm, Mem |
1069 /// | 4 | Ymm, Ymm |
1070 /// | 5 | Zmm, Mem |
1071 /// | 6 | Zmm, Zmm |
1072 /// +---+----------+
1073 /// ```
1074 #[inline]
1075 pub fn vplzcntd_maskz<A, B>(&mut self, op0: A, op1: B)
1076 where Assembler<'a>: VplzcntdMaskzEmitter<A, B> {
1077 <Self as VplzcntdMaskzEmitter<A, B>>::vplzcntd_maskz(self, op0, op1);
1078 }
1079 /// `VPLZCNTQ` (VPLZCNTQ).
1080 /// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
1081 ///
1082 ///
1083 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
1084 ///
1085 /// Supported operand variants:
1086 ///
1087 /// ```text
1088 /// +---+----------+
1089 /// | # | Operands |
1090 /// +---+----------+
1091 /// | 1 | Xmm, Mem |
1092 /// | 2 | Xmm, Xmm |
1093 /// | 3 | Ymm, Mem |
1094 /// | 4 | Ymm, Ymm |
1095 /// | 5 | Zmm, Mem |
1096 /// | 6 | Zmm, Zmm |
1097 /// +---+----------+
1098 /// ```
1099 #[inline]
1100 pub fn vplzcntq<A, B>(&mut self, op0: A, op1: B)
1101 where Assembler<'a>: VplzcntqEmitter<A, B> {
1102 <Self as VplzcntqEmitter<A, B>>::vplzcntq(self, op0, op1);
1103 }
1104 /// `VPLZCNTQ_MASK` (VPLZCNTQ).
1105 /// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
1106 ///
1107 ///
1108 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
1109 ///
1110 /// Supported operand variants:
1111 ///
1112 /// ```text
1113 /// +---+----------+
1114 /// | # | Operands |
1115 /// +---+----------+
1116 /// | 1 | Xmm, Mem |
1117 /// | 2 | Xmm, Xmm |
1118 /// | 3 | Ymm, Mem |
1119 /// | 4 | Ymm, Ymm |
1120 /// | 5 | Zmm, Mem |
1121 /// | 6 | Zmm, Zmm |
1122 /// +---+----------+
1123 /// ```
1124 #[inline]
1125 pub fn vplzcntq_mask<A, B>(&mut self, op0: A, op1: B)
1126 where Assembler<'a>: VplzcntqMaskEmitter<A, B> {
1127 <Self as VplzcntqMaskEmitter<A, B>>::vplzcntq_mask(self, op0, op1);
1128 }
1129 /// `VPLZCNTQ_MASKZ` (VPLZCNTQ).
1130 /// Counts the number of leading most significant zero bits in each dword or qword element of the source operand (the second operand) and stores the results in the destination register (the first operand) according to the writemask. If an element is zero, the result for that element is the operand size of the element.
1131 ///
1132 ///
1133 /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/VPLZCNTD%3AVPLZCNTQ.html).
1134 ///
1135 /// Supported operand variants:
1136 ///
1137 /// ```text
1138 /// +---+----------+
1139 /// | # | Operands |
1140 /// +---+----------+
1141 /// | 1 | Xmm, Mem |
1142 /// | 2 | Xmm, Xmm |
1143 /// | 3 | Ymm, Mem |
1144 /// | 4 | Ymm, Ymm |
1145 /// | 5 | Zmm, Mem |
1146 /// | 6 | Zmm, Zmm |
1147 /// +---+----------+
1148 /// ```
1149 #[inline]
1150 pub fn vplzcntq_maskz<A, B>(&mut self, op0: A, op1: B)
1151 where Assembler<'a>: VplzcntqMaskzEmitter<A, B> {
1152 <Self as VplzcntqMaskzEmitter<A, B>>::vplzcntq_maskz(self, op0, op1);
1153 }
1154}