Skip to main content

asmkit/x86/features/
AVX512_VP2INTERSECT.rs

1use super::super::opcodes::*;
2use crate::core::emitter::*;
3use crate::core::operand::*;
4use crate::x86::assembler::*;
5use crate::x86::operands::*;
6
7/// A dummy operand that represents no register. Here just for simplicity.
8const NOREG: Operand = Operand::new();
9
10/// `VP2INTERSECTD`.
11///
12/// Supported operand variants:
13///
14/// ```text
15/// +---+----------------+
16/// | # | Operands       |
17/// +---+----------------+
18/// | 1 | KReg, Xmm, Mem |
19/// | 2 | KReg, Xmm, Xmm |
20/// | 3 | KReg, Ymm, Mem |
21/// | 4 | KReg, Ymm, Ymm |
22/// | 5 | KReg, Zmm, Mem |
23/// | 6 | KReg, Zmm, Zmm |
24/// +---+----------------+
25/// ```
26pub trait Vp2intersectdEmitter<A, B, C> {
27    fn vp2intersectd(&mut self, op0: A, op1: B, op2: C);
28}
29
30impl<'a> Vp2intersectdEmitter<KReg, Xmm, Xmm> for Assembler<'a> {
31    fn vp2intersectd(&mut self, op0: KReg, op1: Xmm, op2: Xmm) {
32        self.emit(
33            VP2INTERSECTD128KRR,
34            op0.as_operand(),
35            op1.as_operand(),
36            op2.as_operand(),
37            &NOREG,
38        );
39    }
40}
41
42impl<'a> Vp2intersectdEmitter<KReg, Xmm, Mem> for Assembler<'a> {
43    fn vp2intersectd(&mut self, op0: KReg, op1: Xmm, op2: Mem) {
44        self.emit(
45            VP2INTERSECTD128KRM,
46            op0.as_operand(),
47            op1.as_operand(),
48            op2.as_operand(),
49            &NOREG,
50        );
51    }
52}
53
54impl<'a> Vp2intersectdEmitter<KReg, Ymm, Ymm> for Assembler<'a> {
55    fn vp2intersectd(&mut self, op0: KReg, op1: Ymm, op2: Ymm) {
56        self.emit(
57            VP2INTERSECTD256KRR,
58            op0.as_operand(),
59            op1.as_operand(),
60            op2.as_operand(),
61            &NOREG,
62        );
63    }
64}
65
66impl<'a> Vp2intersectdEmitter<KReg, Ymm, Mem> for Assembler<'a> {
67    fn vp2intersectd(&mut self, op0: KReg, op1: Ymm, op2: Mem) {
68        self.emit(
69            VP2INTERSECTD256KRM,
70            op0.as_operand(),
71            op1.as_operand(),
72            op2.as_operand(),
73            &NOREG,
74        );
75    }
76}
77
78impl<'a> Vp2intersectdEmitter<KReg, Zmm, Zmm> for Assembler<'a> {
79    fn vp2intersectd(&mut self, op0: KReg, op1: Zmm, op2: Zmm) {
80        self.emit(
81            VP2INTERSECTD512KRR,
82            op0.as_operand(),
83            op1.as_operand(),
84            op2.as_operand(),
85            &NOREG,
86        );
87    }
88}
89
90impl<'a> Vp2intersectdEmitter<KReg, Zmm, Mem> for Assembler<'a> {
91    fn vp2intersectd(&mut self, op0: KReg, op1: Zmm, op2: Mem) {
92        self.emit(
93            VP2INTERSECTD512KRM,
94            op0.as_operand(),
95            op1.as_operand(),
96            op2.as_operand(),
97            &NOREG,
98        );
99    }
100}
101
102/// `VP2INTERSECTQ`.
103///
104/// Supported operand variants:
105///
106/// ```text
107/// +---+----------------+
108/// | # | Operands       |
109/// +---+----------------+
110/// | 1 | KReg, Xmm, Mem |
111/// | 2 | KReg, Xmm, Xmm |
112/// | 3 | KReg, Ymm, Mem |
113/// | 4 | KReg, Ymm, Ymm |
114/// | 5 | KReg, Zmm, Mem |
115/// | 6 | KReg, Zmm, Zmm |
116/// +---+----------------+
117/// ```
118pub trait Vp2intersectqEmitter<A, B, C> {
119    fn vp2intersectq(&mut self, op0: A, op1: B, op2: C);
120}
121
122impl<'a> Vp2intersectqEmitter<KReg, Xmm, Xmm> for Assembler<'a> {
123    fn vp2intersectq(&mut self, op0: KReg, op1: Xmm, op2: Xmm) {
124        self.emit(
125            VP2INTERSECTQ128KRR,
126            op0.as_operand(),
127            op1.as_operand(),
128            op2.as_operand(),
129            &NOREG,
130        );
131    }
132}
133
134impl<'a> Vp2intersectqEmitter<KReg, Xmm, Mem> for Assembler<'a> {
135    fn vp2intersectq(&mut self, op0: KReg, op1: Xmm, op2: Mem) {
136        self.emit(
137            VP2INTERSECTQ128KRM,
138            op0.as_operand(),
139            op1.as_operand(),
140            op2.as_operand(),
141            &NOREG,
142        );
143    }
144}
145
146impl<'a> Vp2intersectqEmitter<KReg, Ymm, Ymm> for Assembler<'a> {
147    fn vp2intersectq(&mut self, op0: KReg, op1: Ymm, op2: Ymm) {
148        self.emit(
149            VP2INTERSECTQ256KRR,
150            op0.as_operand(),
151            op1.as_operand(),
152            op2.as_operand(),
153            &NOREG,
154        );
155    }
156}
157
158impl<'a> Vp2intersectqEmitter<KReg, Ymm, Mem> for Assembler<'a> {
159    fn vp2intersectq(&mut self, op0: KReg, op1: Ymm, op2: Mem) {
160        self.emit(
161            VP2INTERSECTQ256KRM,
162            op0.as_operand(),
163            op1.as_operand(),
164            op2.as_operand(),
165            &NOREG,
166        );
167    }
168}
169
170impl<'a> Vp2intersectqEmitter<KReg, Zmm, Zmm> for Assembler<'a> {
171    fn vp2intersectq(&mut self, op0: KReg, op1: Zmm, op2: Zmm) {
172        self.emit(
173            VP2INTERSECTQ512KRR,
174            op0.as_operand(),
175            op1.as_operand(),
176            op2.as_operand(),
177            &NOREG,
178        );
179    }
180}
181
182impl<'a> Vp2intersectqEmitter<KReg, Zmm, Mem> for Assembler<'a> {
183    fn vp2intersectq(&mut self, op0: KReg, op1: Zmm, op2: Mem) {
184        self.emit(
185            VP2INTERSECTQ512KRM,
186            op0.as_operand(),
187            op1.as_operand(),
188            op2.as_operand(),
189            &NOREG,
190        );
191    }
192}
193
194impl<'a> Assembler<'a> {
195    /// `VP2INTERSECTD`.
196    ///
197    /// Supported operand variants:
198    ///
199    /// ```text
200    /// +---+----------------+
201    /// | # | Operands       |
202    /// +---+----------------+
203    /// | 1 | KReg, Xmm, Mem |
204    /// | 2 | KReg, Xmm, Xmm |
205    /// | 3 | KReg, Ymm, Mem |
206    /// | 4 | KReg, Ymm, Ymm |
207    /// | 5 | KReg, Zmm, Mem |
208    /// | 6 | KReg, Zmm, Zmm |
209    /// +---+----------------+
210    /// ```
211    #[inline]
212    pub fn vp2intersectd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
213    where
214        Assembler<'a>: Vp2intersectdEmitter<A, B, C>,
215    {
216        <Self as Vp2intersectdEmitter<A, B, C>>::vp2intersectd(self, op0, op1, op2);
217    }
218    /// `VP2INTERSECTQ`.
219    ///
220    /// Supported operand variants:
221    ///
222    /// ```text
223    /// +---+----------------+
224    /// | # | Operands       |
225    /// +---+----------------+
226    /// | 1 | KReg, Xmm, Mem |
227    /// | 2 | KReg, Xmm, Xmm |
228    /// | 3 | KReg, Ymm, Mem |
229    /// | 4 | KReg, Ymm, Ymm |
230    /// | 5 | KReg, Zmm, Mem |
231    /// | 6 | KReg, Zmm, Zmm |
232    /// +---+----------------+
233    /// ```
234    #[inline]
235    pub fn vp2intersectq<A, B, C>(&mut self, op0: A, op1: B, op2: C)
236    where
237        Assembler<'a>: Vp2intersectqEmitter<A, B, C>,
238    {
239        <Self as Vp2intersectqEmitter<A, B, C>>::vp2intersectq(self, op0, op1, op2);
240    }
241}