1use super::super::opcodes::*;
2use crate::core::emitter::*;
3use crate::core::operand::*;
4use crate::x86::assembler::*;
5use crate::x86::operands::*;
6
7const NOREG: Operand = Operand::new();
9
10pub 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
102pub 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 #[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 #[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}