1use crate::x86::assembler::*;
2use crate::x86::operands::*;
3use super::super::opcodes::*;
4use crate::core::emitter::*;
5use crate::core::operand::*;
6
7const NOREG: Operand = Operand::new();
9
10pub trait Vp2intersectdEmitter<A, B, C> {
31 fn vp2intersectd(&mut self, op0: A, op1: B, op2: C);
32}
33
34impl<'a> Vp2intersectdEmitter<KReg, Xmm, Xmm> for Assembler<'a> {
35 fn vp2intersectd(&mut self, op0: KReg, op1: Xmm, op2: Xmm) {
36 self.emit(VP2INTERSECTD128KRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
37 }
38}
39
40impl<'a> Vp2intersectdEmitter<KReg, Xmm, Mem> for Assembler<'a> {
41 fn vp2intersectd(&mut self, op0: KReg, op1: Xmm, op2: Mem) {
42 self.emit(VP2INTERSECTD128KRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
43 }
44}
45
46impl<'a> Vp2intersectdEmitter<KReg, Ymm, Ymm> for Assembler<'a> {
47 fn vp2intersectd(&mut self, op0: KReg, op1: Ymm, op2: Ymm) {
48 self.emit(VP2INTERSECTD256KRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
49 }
50}
51
52impl<'a> Vp2intersectdEmitter<KReg, Ymm, Mem> for Assembler<'a> {
53 fn vp2intersectd(&mut self, op0: KReg, op1: Ymm, op2: Mem) {
54 self.emit(VP2INTERSECTD256KRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
55 }
56}
57
58impl<'a> Vp2intersectdEmitter<KReg, Zmm, Zmm> for Assembler<'a> {
59 fn vp2intersectd(&mut self, op0: KReg, op1: Zmm, op2: Zmm) {
60 self.emit(VP2INTERSECTD512KRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
61 }
62}
63
64impl<'a> Vp2intersectdEmitter<KReg, Zmm, Mem> for Assembler<'a> {
65 fn vp2intersectd(&mut self, op0: KReg, op1: Zmm, op2: Mem) {
66 self.emit(VP2INTERSECTD512KRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
67 }
68}
69
70pub trait Vp2intersectqEmitter<A, B, C> {
91 fn vp2intersectq(&mut self, op0: A, op1: B, op2: C);
92}
93
94impl<'a> Vp2intersectqEmitter<KReg, Xmm, Xmm> for Assembler<'a> {
95 fn vp2intersectq(&mut self, op0: KReg, op1: Xmm, op2: Xmm) {
96 self.emit(VP2INTERSECTQ128KRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
97 }
98}
99
100impl<'a> Vp2intersectqEmitter<KReg, Xmm, Mem> for Assembler<'a> {
101 fn vp2intersectq(&mut self, op0: KReg, op1: Xmm, op2: Mem) {
102 self.emit(VP2INTERSECTQ128KRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
103 }
104}
105
106impl<'a> Vp2intersectqEmitter<KReg, Ymm, Ymm> for Assembler<'a> {
107 fn vp2intersectq(&mut self, op0: KReg, op1: Ymm, op2: Ymm) {
108 self.emit(VP2INTERSECTQ256KRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
109 }
110}
111
112impl<'a> Vp2intersectqEmitter<KReg, Ymm, Mem> for Assembler<'a> {
113 fn vp2intersectq(&mut self, op0: KReg, op1: Ymm, op2: Mem) {
114 self.emit(VP2INTERSECTQ256KRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
115 }
116}
117
118impl<'a> Vp2intersectqEmitter<KReg, Zmm, Zmm> for Assembler<'a> {
119 fn vp2intersectq(&mut self, op0: KReg, op1: Zmm, op2: Zmm) {
120 self.emit(VP2INTERSECTQ512KRR, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
121 }
122}
123
124impl<'a> Vp2intersectqEmitter<KReg, Zmm, Mem> for Assembler<'a> {
125 fn vp2intersectq(&mut self, op0: KReg, op1: Zmm, op2: Mem) {
126 self.emit(VP2INTERSECTQ512KRM, op0.as_operand(), op1.as_operand(), op2.as_operand(), &NOREG);
127 }
128}
129
130
131impl<'a> Assembler<'a> {
132 #[inline]
153 pub fn vp2intersectd<A, B, C>(&mut self, op0: A, op1: B, op2: C)
154 where Assembler<'a>: Vp2intersectdEmitter<A, B, C> {
155 <Self as Vp2intersectdEmitter<A, B, C>>::vp2intersectd(self, op0, op1, op2);
156 }
157 #[inline]
178 pub fn vp2intersectq<A, B, C>(&mut self, op0: A, op1: B, op2: C)
179 where Assembler<'a>: Vp2intersectqEmitter<A, B, C> {
180 <Self as Vp2intersectqEmitter<A, B, C>>::vp2intersectq(self, op0, op1, op2);
181 }
182}