xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceInstX8632.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceInstX86.h - Generic x86 instructions -*- C++ -*--===//
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker //                        The Subzero Code Generator
4*03ce13f7SAndroid Build Coastguard Worker //
5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker ///
10*03ce13f7SAndroid Build Coastguard Worker /// \file
11*03ce13f7SAndroid Build Coastguard Worker /// \brief This file defines the InstX86Base template class, as well as the
12*03ce13f7SAndroid Build Coastguard Worker /// generic X86 Instruction class hierarchy.
13*03ce13f7SAndroid Build Coastguard Worker ///
14*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
15*03ce13f7SAndroid Build Coastguard Worker 
16*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEINSTX8632_H
17*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEINSTX8632_H
18*03ce13f7SAndroid Build Coastguard Worker 
19*03ce13f7SAndroid Build Coastguard Worker #include "IceAssemblerX8632.h"
20*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
21*03ce13f7SAndroid Build Coastguard Worker #include "IceInst.h"
22*03ce13f7SAndroid Build Coastguard Worker #include "IceOperand.h"
23*03ce13f7SAndroid Build Coastguard Worker #include "IceTargetLoweringX86.h"
24*03ce13f7SAndroid Build Coastguard Worker 
25*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
26*03ce13f7SAndroid Build Coastguard Worker namespace X8632 {
27*03ce13f7SAndroid Build Coastguard Worker 
28*03ce13f7SAndroid Build Coastguard Worker using Assembler = AssemblerX8632;
29*03ce13f7SAndroid Build Coastguard Worker using AssemblerImmediate = Assembler::Immediate;
30*03ce13f7SAndroid Build Coastguard Worker using TargetLowering = TargetX8632;
31*03ce13f7SAndroid Build Coastguard Worker 
32*03ce13f7SAndroid Build Coastguard Worker using RegisterSet = ::Ice::RegX8632;
33*03ce13f7SAndroid Build Coastguard Worker using GPRRegister = RegisterSet::GPRRegister;
34*03ce13f7SAndroid Build Coastguard Worker using ByteRegister = RegisterSet::ByteRegister;
35*03ce13f7SAndroid Build Coastguard Worker using XmmRegister = RegisterSet::XmmRegister;
36*03ce13f7SAndroid Build Coastguard Worker 
37*03ce13f7SAndroid Build Coastguard Worker using Cond = CondX86;
38*03ce13f7SAndroid Build Coastguard Worker using BrCond = Cond::BrCond;
39*03ce13f7SAndroid Build Coastguard Worker using CmppsCond = Cond::CmppsCond;
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker template <typename SReg_t, typename DReg_t>
42*03ce13f7SAndroid Build Coastguard Worker using CastEmitterRegOp = Assembler::template CastEmitterRegOp<SReg_t, DReg_t>;
43*03ce13f7SAndroid Build Coastguard Worker template <typename SReg_t, typename DReg_t>
44*03ce13f7SAndroid Build Coastguard Worker using ThreeOpImmEmitter = Assembler::template ThreeOpImmEmitter<SReg_t, DReg_t>;
45*03ce13f7SAndroid Build Coastguard Worker using GPREmitterAddrOp = Assembler::GPREmitterAddrOp;
46*03ce13f7SAndroid Build Coastguard Worker using GPREmitterRegOp = Assembler::GPREmitterRegOp;
47*03ce13f7SAndroid Build Coastguard Worker using GPREmitterShiftD = Assembler::GPREmitterShiftD;
48*03ce13f7SAndroid Build Coastguard Worker using GPREmitterShiftOp = Assembler::GPREmitterShiftOp;
49*03ce13f7SAndroid Build Coastguard Worker using GPREmitterOneOp = Assembler::GPREmitterOneOp;
50*03ce13f7SAndroid Build Coastguard Worker using XmmEmitterRegOp = Assembler::XmmEmitterRegOp;
51*03ce13f7SAndroid Build Coastguard Worker using XmmEmitterShiftOp = Assembler::XmmEmitterShiftOp;
52*03ce13f7SAndroid Build Coastguard Worker using XmmEmitterMovOps = Assembler::XmmEmitterMovOps;
53*03ce13f7SAndroid Build Coastguard Worker 
54*03ce13f7SAndroid Build Coastguard Worker /// X86Operand extends the Operand hierarchy. Its subclasses are X86OperandMem
55*03ce13f7SAndroid Build Coastguard Worker /// and VariableSplit.
56*03ce13f7SAndroid Build Coastguard Worker class X86Operand : public ::Ice::Operand {
57*03ce13f7SAndroid Build Coastguard Worker   X86Operand() = delete;
58*03ce13f7SAndroid Build Coastguard Worker   X86Operand(const X86Operand &) = delete;
59*03ce13f7SAndroid Build Coastguard Worker   X86Operand &operator=(const X86Operand &) = delete;
60*03ce13f7SAndroid Build Coastguard Worker 
61*03ce13f7SAndroid Build Coastguard Worker public:
62*03ce13f7SAndroid Build Coastguard Worker   enum OperandKindX8632 { k__Start = ::Ice::Operand::kTarget, kMem, kSplit };
63*03ce13f7SAndroid Build Coastguard Worker   using ::Ice::Operand::dump;
64*03ce13f7SAndroid Build Coastguard Worker 
65*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *, Ostream &Str) const override;
66*03ce13f7SAndroid Build Coastguard Worker 
67*03ce13f7SAndroid Build Coastguard Worker protected:
X86Operand(OperandKindX8632 Kind,Type Ty)68*03ce13f7SAndroid Build Coastguard Worker   X86Operand(OperandKindX8632 Kind, Type Ty)
69*03ce13f7SAndroid Build Coastguard Worker       : Operand(static_cast<::Ice::Operand::OperandKind>(Kind), Ty) {}
70*03ce13f7SAndroid Build Coastguard Worker };
71*03ce13f7SAndroid Build Coastguard Worker 
72*03ce13f7SAndroid Build Coastguard Worker /// X86OperandMem represents the m32 addressing mode, with optional base and
73*03ce13f7SAndroid Build Coastguard Worker /// index registers, a constant offset, and a fixed shift value for the index
74*03ce13f7SAndroid Build Coastguard Worker /// register.
75*03ce13f7SAndroid Build Coastguard Worker class X86OperandMem : public X86Operand {
76*03ce13f7SAndroid Build Coastguard Worker   X86OperandMem() = delete;
77*03ce13f7SAndroid Build Coastguard Worker   X86OperandMem(const X86OperandMem &) = delete;
78*03ce13f7SAndroid Build Coastguard Worker   X86OperandMem &operator=(const X86OperandMem &) = delete;
79*03ce13f7SAndroid Build Coastguard Worker 
80*03ce13f7SAndroid Build Coastguard Worker public:
81*03ce13f7SAndroid Build Coastguard Worker   enum SegmentRegisters {
82*03ce13f7SAndroid Build Coastguard Worker     DefaultSegment = -1,
83*03ce13f7SAndroid Build Coastguard Worker #define X(val, name, prefix) val,
84*03ce13f7SAndroid Build Coastguard Worker     SEG_REGX8632_TABLE
85*03ce13f7SAndroid Build Coastguard Worker #undef X
86*03ce13f7SAndroid Build Coastguard Worker         SegReg_NUM
87*03ce13f7SAndroid Build Coastguard Worker   };
88*03ce13f7SAndroid Build Coastguard Worker   static X86OperandMem *create(Cfg *Func, Type Ty, Variable *Base,
89*03ce13f7SAndroid Build Coastguard Worker                                Constant *Offset, Variable *Index = nullptr,
90*03ce13f7SAndroid Build Coastguard Worker                                uint16_t Shift = 0,
91*03ce13f7SAndroid Build Coastguard Worker                                SegmentRegisters SegmentReg = DefaultSegment,
92*03ce13f7SAndroid Build Coastguard Worker                                bool IsRebased = false) {
93*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<X86OperandMem>()) X86OperandMem(
94*03ce13f7SAndroid Build Coastguard Worker         Func, Ty, Base, Offset, Index, Shift, SegmentReg, IsRebased);
95*03ce13f7SAndroid Build Coastguard Worker   }
create(Cfg * Func,Type Ty,Variable * Base,Constant * Offset,bool IsRebased)96*03ce13f7SAndroid Build Coastguard Worker   static X86OperandMem *create(Cfg *Func, Type Ty, Variable *Base,
97*03ce13f7SAndroid Build Coastguard Worker                                Constant *Offset, bool IsRebased) {
98*03ce13f7SAndroid Build Coastguard Worker     constexpr Variable *NoIndex = nullptr;
99*03ce13f7SAndroid Build Coastguard Worker     constexpr uint16_t NoShift = 0;
100*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<X86OperandMem>()) X86OperandMem(
101*03ce13f7SAndroid Build Coastguard Worker         Func, Ty, Base, Offset, NoIndex, NoShift, DefaultSegment, IsRebased);
102*03ce13f7SAndroid Build Coastguard Worker   }
getBase()103*03ce13f7SAndroid Build Coastguard Worker   Variable *getBase() const { return Base; }
getOffset()104*03ce13f7SAndroid Build Coastguard Worker   Constant *getOffset() const { return Offset; }
getIndex()105*03ce13f7SAndroid Build Coastguard Worker   Variable *getIndex() const { return Index; }
getShift()106*03ce13f7SAndroid Build Coastguard Worker   uint16_t getShift() const { return Shift; }
getSegmentRegister()107*03ce13f7SAndroid Build Coastguard Worker   SegmentRegisters getSegmentRegister() const { return SegmentReg; }
108*03ce13f7SAndroid Build Coastguard Worker   void emitSegmentOverride(Assembler *Asm) const;
getIsRebased()109*03ce13f7SAndroid Build Coastguard Worker   bool getIsRebased() const { return IsRebased; }
110*03ce13f7SAndroid Build Coastguard Worker 
validateMemOperandPIC()111*03ce13f7SAndroid Build Coastguard Worker   void validateMemOperandPIC() const {
112*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::asserts())
113*03ce13f7SAndroid Build Coastguard Worker       return;
114*03ce13f7SAndroid Build Coastguard Worker     const bool HasCR =
115*03ce13f7SAndroid Build Coastguard Worker         getOffset() && llvm::isa<ConstantRelocatable>(getOffset());
116*03ce13f7SAndroid Build Coastguard Worker     (void)HasCR;
117*03ce13f7SAndroid Build Coastguard Worker     const bool IsRebased = getIsRebased();
118*03ce13f7SAndroid Build Coastguard Worker     (void)IsRebased;
119*03ce13f7SAndroid Build Coastguard Worker     assert(!IsRebased);
120*03ce13f7SAndroid Build Coastguard Worker   }
121*03ce13f7SAndroid Build Coastguard Worker 
122*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
123*03ce13f7SAndroid Build Coastguard Worker   using X86Operand::dump;
124*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func, Ostream &Str) const override;
125*03ce13f7SAndroid Build Coastguard Worker 
classof(const Operand * Operand)126*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Operand *Operand) {
127*03ce13f7SAndroid Build Coastguard Worker     return Operand->getKind() == static_cast<OperandKind>(kMem);
128*03ce13f7SAndroid Build Coastguard Worker   }
129*03ce13f7SAndroid Build Coastguard Worker 
130*03ce13f7SAndroid Build Coastguard Worker private:
131*03ce13f7SAndroid Build Coastguard Worker   X86OperandMem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset,
132*03ce13f7SAndroid Build Coastguard Worker                 Variable *Index, uint16_t Shift, SegmentRegisters SegmentReg,
133*03ce13f7SAndroid Build Coastguard Worker                 bool IsRebased);
134*03ce13f7SAndroid Build Coastguard Worker 
135*03ce13f7SAndroid Build Coastguard Worker   Variable *const Base;
136*03ce13f7SAndroid Build Coastguard Worker   Constant *const Offset;
137*03ce13f7SAndroid Build Coastguard Worker   Variable *const Index;
138*03ce13f7SAndroid Build Coastguard Worker   const uint16_t Shift;
139*03ce13f7SAndroid Build Coastguard Worker   const SegmentRegisters SegmentReg : 16;
140*03ce13f7SAndroid Build Coastguard Worker   const bool IsRebased;
141*03ce13f7SAndroid Build Coastguard Worker };
142*03ce13f7SAndroid Build Coastguard Worker 
143*03ce13f7SAndroid Build Coastguard Worker /// VariableSplit is a way to treat an f64 memory location as a pair of i32
144*03ce13f7SAndroid Build Coastguard Worker /// locations (Low and High). This is needed for some cases of the Bitcast
145*03ce13f7SAndroid Build Coastguard Worker /// instruction. Since it's not possible for integer registers to access the
146*03ce13f7SAndroid Build Coastguard Worker /// XMM registers and vice versa, the lowering forces the f64 to be spilled to
147*03ce13f7SAndroid Build Coastguard Worker /// the stack and then accesses through the VariableSplit.
148*03ce13f7SAndroid Build Coastguard Worker // TODO(jpp): remove references to VariableSplit from IceInstX86Base as 64bit
149*03ce13f7SAndroid Build Coastguard Worker // targets can natively handle these.
150*03ce13f7SAndroid Build Coastguard Worker class VariableSplit : public X86Operand {
151*03ce13f7SAndroid Build Coastguard Worker   VariableSplit() = delete;
152*03ce13f7SAndroid Build Coastguard Worker   VariableSplit(const VariableSplit &) = delete;
153*03ce13f7SAndroid Build Coastguard Worker   VariableSplit &operator=(const VariableSplit &) = delete;
154*03ce13f7SAndroid Build Coastguard Worker 
155*03ce13f7SAndroid Build Coastguard Worker public:
156*03ce13f7SAndroid Build Coastguard Worker   enum Portion { Low, High };
create(Cfg * Func,Variable * Var,Portion Part)157*03ce13f7SAndroid Build Coastguard Worker   static VariableSplit *create(Cfg *Func, Variable *Var, Portion Part) {
158*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<VariableSplit>()) VariableSplit(Func, Var, Part);
159*03ce13f7SAndroid Build Coastguard Worker   }
getVar()160*03ce13f7SAndroid Build Coastguard Worker   const Variable *getVar() const { return Var; }
getOffset()161*03ce13f7SAndroid Build Coastguard Worker   int32_t getOffset() const { return Part == High ? 4 : 0; }
162*03ce13f7SAndroid Build Coastguard Worker 
163*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
164*03ce13f7SAndroid Build Coastguard Worker   using X86Operand::dump;
165*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func, Ostream &Str) const override;
166*03ce13f7SAndroid Build Coastguard Worker 
classof(const Operand * Operand)167*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Operand *Operand) {
168*03ce13f7SAndroid Build Coastguard Worker     return Operand->getKind() == static_cast<OperandKind>(kSplit);
169*03ce13f7SAndroid Build Coastguard Worker   }
170*03ce13f7SAndroid Build Coastguard Worker 
171*03ce13f7SAndroid Build Coastguard Worker private:
VariableSplit(Cfg * Func,Variable * Var,Portion Part)172*03ce13f7SAndroid Build Coastguard Worker   VariableSplit(Cfg *Func, Variable *Var, Portion Part)
173*03ce13f7SAndroid Build Coastguard Worker       : X86Operand(kSplit, IceType_i32), Var(Var), Part(Part) {
174*03ce13f7SAndroid Build Coastguard Worker     assert(Var->getType() == IceType_f64);
175*03ce13f7SAndroid Build Coastguard Worker     Vars = Func->allocateArrayOf<Variable *>(1);
176*03ce13f7SAndroid Build Coastguard Worker     Vars[0] = Var;
177*03ce13f7SAndroid Build Coastguard Worker     NumVars = 1;
178*03ce13f7SAndroid Build Coastguard Worker   }
179*03ce13f7SAndroid Build Coastguard Worker 
180*03ce13f7SAndroid Build Coastguard Worker   Variable *Var;
181*03ce13f7SAndroid Build Coastguard Worker   Portion Part;
182*03ce13f7SAndroid Build Coastguard Worker };
183*03ce13f7SAndroid Build Coastguard Worker 
184*03ce13f7SAndroid Build Coastguard Worker class InstX86Base : public InstTarget {
185*03ce13f7SAndroid Build Coastguard Worker   InstX86Base() = delete;
186*03ce13f7SAndroid Build Coastguard Worker   InstX86Base(const InstX86Base &) = delete;
187*03ce13f7SAndroid Build Coastguard Worker   InstX86Base &operator=(const InstX86Base &) = delete;
188*03ce13f7SAndroid Build Coastguard Worker 
189*03ce13f7SAndroid Build Coastguard Worker public:
190*03ce13f7SAndroid Build Coastguard Worker   enum InstKindX86 {
191*03ce13f7SAndroid Build Coastguard Worker     k__Start = Inst::Target,
192*03ce13f7SAndroid Build Coastguard Worker     Adc,
193*03ce13f7SAndroid Build Coastguard Worker     AdcRMW,
194*03ce13f7SAndroid Build Coastguard Worker     Add,
195*03ce13f7SAndroid Build Coastguard Worker     AddRMW,
196*03ce13f7SAndroid Build Coastguard Worker     Addps,
197*03ce13f7SAndroid Build Coastguard Worker     Addss,
198*03ce13f7SAndroid Build Coastguard Worker     And,
199*03ce13f7SAndroid Build Coastguard Worker     Andnps,
200*03ce13f7SAndroid Build Coastguard Worker     Andps,
201*03ce13f7SAndroid Build Coastguard Worker     AndRMW,
202*03ce13f7SAndroid Build Coastguard Worker     Blendvps,
203*03ce13f7SAndroid Build Coastguard Worker     Br,
204*03ce13f7SAndroid Build Coastguard Worker     Bsf,
205*03ce13f7SAndroid Build Coastguard Worker     Bsr,
206*03ce13f7SAndroid Build Coastguard Worker     Bswap,
207*03ce13f7SAndroid Build Coastguard Worker     Call,
208*03ce13f7SAndroid Build Coastguard Worker     Cbwdq,
209*03ce13f7SAndroid Build Coastguard Worker     Cmov,
210*03ce13f7SAndroid Build Coastguard Worker     Cmpps,
211*03ce13f7SAndroid Build Coastguard Worker     Cmpxchg,
212*03ce13f7SAndroid Build Coastguard Worker     Cmpxchg8b,
213*03ce13f7SAndroid Build Coastguard Worker     Cvt,
214*03ce13f7SAndroid Build Coastguard Worker     Div,
215*03ce13f7SAndroid Build Coastguard Worker     Divps,
216*03ce13f7SAndroid Build Coastguard Worker     Divss,
217*03ce13f7SAndroid Build Coastguard Worker     FakeRMW,
218*03ce13f7SAndroid Build Coastguard Worker     Fld,
219*03ce13f7SAndroid Build Coastguard Worker     Fstp,
220*03ce13f7SAndroid Build Coastguard Worker     Icmp,
221*03ce13f7SAndroid Build Coastguard Worker     Idiv,
222*03ce13f7SAndroid Build Coastguard Worker     Imul,
223*03ce13f7SAndroid Build Coastguard Worker     ImulImm,
224*03ce13f7SAndroid Build Coastguard Worker     Insertps,
225*03ce13f7SAndroid Build Coastguard Worker     Int3,
226*03ce13f7SAndroid Build Coastguard Worker     Jmp,
227*03ce13f7SAndroid Build Coastguard Worker     Label,
228*03ce13f7SAndroid Build Coastguard Worker     Lea,
229*03ce13f7SAndroid Build Coastguard Worker     Load,
230*03ce13f7SAndroid Build Coastguard Worker     Mfence,
231*03ce13f7SAndroid Build Coastguard Worker     Minps,
232*03ce13f7SAndroid Build Coastguard Worker     Maxps,
233*03ce13f7SAndroid Build Coastguard Worker     Minss,
234*03ce13f7SAndroid Build Coastguard Worker     Maxss,
235*03ce13f7SAndroid Build Coastguard Worker     Mov,
236*03ce13f7SAndroid Build Coastguard Worker     Movd,
237*03ce13f7SAndroid Build Coastguard Worker     Movmsk,
238*03ce13f7SAndroid Build Coastguard Worker     Movp,
239*03ce13f7SAndroid Build Coastguard Worker     Movq,
240*03ce13f7SAndroid Build Coastguard Worker     MovssRegs,
241*03ce13f7SAndroid Build Coastguard Worker     Movsx,
242*03ce13f7SAndroid Build Coastguard Worker     Movzx,
243*03ce13f7SAndroid Build Coastguard Worker     Mul,
244*03ce13f7SAndroid Build Coastguard Worker     Mulps,
245*03ce13f7SAndroid Build Coastguard Worker     Mulss,
246*03ce13f7SAndroid Build Coastguard Worker     Neg,
247*03ce13f7SAndroid Build Coastguard Worker     Nop,
248*03ce13f7SAndroid Build Coastguard Worker     Or,
249*03ce13f7SAndroid Build Coastguard Worker     Orps,
250*03ce13f7SAndroid Build Coastguard Worker     OrRMW,
251*03ce13f7SAndroid Build Coastguard Worker     Padd,
252*03ce13f7SAndroid Build Coastguard Worker     Padds,
253*03ce13f7SAndroid Build Coastguard Worker     Paddus,
254*03ce13f7SAndroid Build Coastguard Worker     Pand,
255*03ce13f7SAndroid Build Coastguard Worker     Pandn,
256*03ce13f7SAndroid Build Coastguard Worker     Pblendvb,
257*03ce13f7SAndroid Build Coastguard Worker     Pcmpeq,
258*03ce13f7SAndroid Build Coastguard Worker     Pcmpgt,
259*03ce13f7SAndroid Build Coastguard Worker     Pextr,
260*03ce13f7SAndroid Build Coastguard Worker     Pinsr,
261*03ce13f7SAndroid Build Coastguard Worker     Pmull,
262*03ce13f7SAndroid Build Coastguard Worker     Pmulhw,
263*03ce13f7SAndroid Build Coastguard Worker     Pmulhuw,
264*03ce13f7SAndroid Build Coastguard Worker     Pmaddwd,
265*03ce13f7SAndroid Build Coastguard Worker     Pmuludq,
266*03ce13f7SAndroid Build Coastguard Worker     Pop,
267*03ce13f7SAndroid Build Coastguard Worker     Por,
268*03ce13f7SAndroid Build Coastguard Worker     Pshufb,
269*03ce13f7SAndroid Build Coastguard Worker     Pshufd,
270*03ce13f7SAndroid Build Coastguard Worker     Punpckl,
271*03ce13f7SAndroid Build Coastguard Worker     Punpckh,
272*03ce13f7SAndroid Build Coastguard Worker     Packss,
273*03ce13f7SAndroid Build Coastguard Worker     Packus,
274*03ce13f7SAndroid Build Coastguard Worker     Psll,
275*03ce13f7SAndroid Build Coastguard Worker     Psra,
276*03ce13f7SAndroid Build Coastguard Worker     Psrl,
277*03ce13f7SAndroid Build Coastguard Worker     Psub,
278*03ce13f7SAndroid Build Coastguard Worker     Psubs,
279*03ce13f7SAndroid Build Coastguard Worker     Psubus,
280*03ce13f7SAndroid Build Coastguard Worker     Push,
281*03ce13f7SAndroid Build Coastguard Worker     Pxor,
282*03ce13f7SAndroid Build Coastguard Worker     Ret,
283*03ce13f7SAndroid Build Coastguard Worker     Rol,
284*03ce13f7SAndroid Build Coastguard Worker     Round,
285*03ce13f7SAndroid Build Coastguard Worker     Sar,
286*03ce13f7SAndroid Build Coastguard Worker     Sbb,
287*03ce13f7SAndroid Build Coastguard Worker     SbbRMW,
288*03ce13f7SAndroid Build Coastguard Worker     Setcc,
289*03ce13f7SAndroid Build Coastguard Worker     Shl,
290*03ce13f7SAndroid Build Coastguard Worker     Shld,
291*03ce13f7SAndroid Build Coastguard Worker     Shr,
292*03ce13f7SAndroid Build Coastguard Worker     Shrd,
293*03ce13f7SAndroid Build Coastguard Worker     Shufps,
294*03ce13f7SAndroid Build Coastguard Worker     Sqrt,
295*03ce13f7SAndroid Build Coastguard Worker     Store,
296*03ce13f7SAndroid Build Coastguard Worker     StoreP,
297*03ce13f7SAndroid Build Coastguard Worker     StoreQ,
298*03ce13f7SAndroid Build Coastguard Worker     StoreD,
299*03ce13f7SAndroid Build Coastguard Worker     Sub,
300*03ce13f7SAndroid Build Coastguard Worker     SubRMW,
301*03ce13f7SAndroid Build Coastguard Worker     Subps,
302*03ce13f7SAndroid Build Coastguard Worker     Subss,
303*03ce13f7SAndroid Build Coastguard Worker     Test,
304*03ce13f7SAndroid Build Coastguard Worker     Ucomiss,
305*03ce13f7SAndroid Build Coastguard Worker     UD2,
306*03ce13f7SAndroid Build Coastguard Worker     Xadd,
307*03ce13f7SAndroid Build Coastguard Worker     Xchg,
308*03ce13f7SAndroid Build Coastguard Worker     Xor,
309*03ce13f7SAndroid Build Coastguard Worker     Xorps,
310*03ce13f7SAndroid Build Coastguard Worker     XorRMW,
311*03ce13f7SAndroid Build Coastguard Worker 
312*03ce13f7SAndroid Build Coastguard Worker     /// Intel Architecture Code Analyzer markers. These are not executable so
313*03ce13f7SAndroid Build Coastguard Worker     /// must only be used for analysis.
314*03ce13f7SAndroid Build Coastguard Worker     IacaStart,
315*03ce13f7SAndroid Build Coastguard Worker     IacaEnd
316*03ce13f7SAndroid Build Coastguard Worker   };
317*03ce13f7SAndroid Build Coastguard Worker 
318*03ce13f7SAndroid Build Coastguard Worker   enum SseSuffix { None, Packed, Unpack, Scalar, Integral, Pack };
319*03ce13f7SAndroid Build Coastguard Worker 
320*03ce13f7SAndroid Build Coastguard Worker   static const char *getWidthString(Type Ty);
321*03ce13f7SAndroid Build Coastguard Worker   static const char *getFldString(Type Ty);
322*03ce13f7SAndroid Build Coastguard Worker   static const char *getSseSuffixString(Type DestTy, SseSuffix Suffix);
323*03ce13f7SAndroid Build Coastguard Worker   static Type getInVectorElementType(Type Ty);
324*03ce13f7SAndroid Build Coastguard Worker   static BrCond getOppositeCondition(BrCond Cond);
325*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
326*03ce13f7SAndroid Build Coastguard Worker 
327*03ce13f7SAndroid Build Coastguard Worker   // Shared emit routines for common forms of instructions.
328*03ce13f7SAndroid Build Coastguard Worker   void emitTwoAddress(const Cfg *Func, const char *Opcode,
329*03ce13f7SAndroid Build Coastguard Worker                       const char *Suffix = "") const;
330*03ce13f7SAndroid Build Coastguard Worker 
getTarget(const Cfg * Func)331*03ce13f7SAndroid Build Coastguard Worker   static TargetLowering *getTarget(const Cfg *Func) {
332*03ce13f7SAndroid Build Coastguard Worker     return reinterpret_cast<TargetLowering *>(Func->getTarget());
333*03ce13f7SAndroid Build Coastguard Worker   }
334*03ce13f7SAndroid Build Coastguard Worker 
335*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86Base(Cfg * Func,InstKindX86 Kind,SizeT Maxsrcs,Variable * Dest)336*03ce13f7SAndroid Build Coastguard Worker   InstX86Base(Cfg *Func, InstKindX86 Kind, SizeT Maxsrcs, Variable *Dest)
337*03ce13f7SAndroid Build Coastguard Worker       : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {}
338*03ce13f7SAndroid Build Coastguard Worker 
isClassof(const Inst * Instr,InstKindX86 MyKind)339*03ce13f7SAndroid Build Coastguard Worker   static bool isClassof(const Inst *Instr, InstKindX86 MyKind) {
340*03ce13f7SAndroid Build Coastguard Worker     return Instr->getKind() == static_cast<InstKind>(MyKind);
341*03ce13f7SAndroid Build Coastguard Worker   }
342*03ce13f7SAndroid Build Coastguard Worker   // Most instructions that operate on vector arguments require vector memory
343*03ce13f7SAndroid Build Coastguard Worker   // operands to be fully aligned (16-byte alignment for PNaCl vector types).
344*03ce13f7SAndroid Build Coastguard Worker   // The stack frame layout and call ABI ensure proper alignment for stack
345*03ce13f7SAndroid Build Coastguard Worker   // operands, but memory operands (originating from load/store bitcode
346*03ce13f7SAndroid Build Coastguard Worker   // instructions) only have element-size alignment guarantees. This function
347*03ce13f7SAndroid Build Coastguard Worker   // validates that none of the operands is a memory operand of vector type,
348*03ce13f7SAndroid Build Coastguard Worker   // calling report_fatal_error() if one is found. This function should be
349*03ce13f7SAndroid Build Coastguard Worker   // called during emission, and maybe also in the ctor (as long as that fits
350*03ce13f7SAndroid Build Coastguard Worker   // the lowering style).
validateVectorAddrMode()351*03ce13f7SAndroid Build Coastguard Worker   void validateVectorAddrMode() const {
352*03ce13f7SAndroid Build Coastguard Worker     if (this->getDest())
353*03ce13f7SAndroid Build Coastguard Worker       this->validateVectorAddrModeOpnd(this->getDest());
354*03ce13f7SAndroid Build Coastguard Worker     for (SizeT i = 0; i < this->getSrcSize(); ++i) {
355*03ce13f7SAndroid Build Coastguard Worker       this->validateVectorAddrModeOpnd(this->getSrc(i));
356*03ce13f7SAndroid Build Coastguard Worker     }
357*03ce13f7SAndroid Build Coastguard Worker   }
358*03ce13f7SAndroid Build Coastguard Worker 
359*03ce13f7SAndroid Build Coastguard Worker private:
validateVectorAddrModeOpnd(const Operand * Opnd)360*03ce13f7SAndroid Build Coastguard Worker   static void validateVectorAddrModeOpnd(const Operand *Opnd) {
361*03ce13f7SAndroid Build Coastguard Worker     if (llvm::isa<X86OperandMem>(Opnd) && isVectorType(Opnd->getType())) {
362*03ce13f7SAndroid Build Coastguard Worker       llvm::report_fatal_error("Possible misaligned vector memory operation");
363*03ce13f7SAndroid Build Coastguard Worker     }
364*03ce13f7SAndroid Build Coastguard Worker   }
365*03ce13f7SAndroid Build Coastguard Worker };
366*03ce13f7SAndroid Build Coastguard Worker 
367*03ce13f7SAndroid Build Coastguard Worker /// InstX86FakeRMW represents a non-atomic read-modify-write operation on a
368*03ce13f7SAndroid Build Coastguard Worker /// memory location. An InstX86FakeRMW is a "fake" instruction in that it
369*03ce13f7SAndroid Build Coastguard Worker /// still needs to be lowered to some actual RMW instruction.
370*03ce13f7SAndroid Build Coastguard Worker ///
371*03ce13f7SAndroid Build Coastguard Worker /// If A is some memory address, D is some data value to apply, and OP is an
372*03ce13f7SAndroid Build Coastguard Worker /// arithmetic operator, the instruction operates as: (*A) = (*A) OP D
373*03ce13f7SAndroid Build Coastguard Worker class InstX86FakeRMW final : public InstX86Base {
374*03ce13f7SAndroid Build Coastguard Worker   InstX86FakeRMW() = delete;
375*03ce13f7SAndroid Build Coastguard Worker   InstX86FakeRMW(const InstX86FakeRMW &) = delete;
376*03ce13f7SAndroid Build Coastguard Worker   InstX86FakeRMW &operator=(const InstX86FakeRMW &) = delete;
377*03ce13f7SAndroid Build Coastguard Worker 
378*03ce13f7SAndroid Build Coastguard Worker public:
379*03ce13f7SAndroid Build Coastguard Worker   static InstX86FakeRMW *create(Cfg *Func, Operand *Data, Operand *Addr,
380*03ce13f7SAndroid Build Coastguard Worker                                 Variable *Beacon, InstArithmetic::OpKind Op,
381*03ce13f7SAndroid Build Coastguard Worker                                 uint32_t Align = 1) {
382*03ce13f7SAndroid Build Coastguard Worker     // TODO(stichnot): Stop ignoring alignment specification.
383*03ce13f7SAndroid Build Coastguard Worker     (void)Align;
384*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86FakeRMW>())
385*03ce13f7SAndroid Build Coastguard Worker         InstX86FakeRMW(Func, Data, Addr, Op, Beacon);
386*03ce13f7SAndroid Build Coastguard Worker   }
getAddr()387*03ce13f7SAndroid Build Coastguard Worker   Operand *getAddr() const { return this->getSrc(1); }
getData()388*03ce13f7SAndroid Build Coastguard Worker   Operand *getData() const { return this->getSrc(0); }
getOp()389*03ce13f7SAndroid Build Coastguard Worker   InstArithmetic::OpKind getOp() const { return Op; }
getBeacon()390*03ce13f7SAndroid Build Coastguard Worker   Variable *getBeacon() const { return llvm::cast<Variable>(this->getSrc(2)); }
391*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)392*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
393*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::FakeRMW);
394*03ce13f7SAndroid Build Coastguard Worker   }
395*03ce13f7SAndroid Build Coastguard Worker 
396*03ce13f7SAndroid Build Coastguard Worker private:
397*03ce13f7SAndroid Build Coastguard Worker   InstArithmetic::OpKind Op;
398*03ce13f7SAndroid Build Coastguard Worker   InstX86FakeRMW(Cfg *Func, Operand *Data, Operand *Addr,
399*03ce13f7SAndroid Build Coastguard Worker                  InstArithmetic::OpKind Op, Variable *Beacon);
400*03ce13f7SAndroid Build Coastguard Worker };
401*03ce13f7SAndroid Build Coastguard Worker 
402*03ce13f7SAndroid Build Coastguard Worker /// InstX86Label represents an intra-block label that is the target of an
403*03ce13f7SAndroid Build Coastguard Worker /// intra-block branch. The offset between the label and the branch must be
404*03ce13f7SAndroid Build Coastguard Worker /// fit into one byte (considered "near"). These are used for lowering i1
405*03ce13f7SAndroid Build Coastguard Worker /// calculations, Select instructions, and 64-bit compares on a 32-bit
406*03ce13f7SAndroid Build Coastguard Worker /// architecture, without basic block splitting. Basic block splitting is not
407*03ce13f7SAndroid Build Coastguard Worker /// so desirable for several reasons, one of which is the impact on decisions
408*03ce13f7SAndroid Build Coastguard Worker /// based on whether a variable's live range spans multiple basic blocks.
409*03ce13f7SAndroid Build Coastguard Worker ///
410*03ce13f7SAndroid Build Coastguard Worker /// Intra-block control flow must be used with caution. Consider the sequence
411*03ce13f7SAndroid Build Coastguard Worker /// for "c = (a >= b ? x : y)".
412*03ce13f7SAndroid Build Coastguard Worker ///     cmp a, b
413*03ce13f7SAndroid Build Coastguard Worker ///     br lt, L1
414*03ce13f7SAndroid Build Coastguard Worker ///     mov c, x
415*03ce13f7SAndroid Build Coastguard Worker ///     jmp L2
416*03ce13f7SAndroid Build Coastguard Worker ///   L1:
417*03ce13f7SAndroid Build Coastguard Worker ///     mov c, y
418*03ce13f7SAndroid Build Coastguard Worker ///   L2:
419*03ce13f7SAndroid Build Coastguard Worker ///
420*03ce13f7SAndroid Build Coastguard Worker /// Labels L1 and L2 are intra-block labels. Without knowledge of the
421*03ce13f7SAndroid Build Coastguard Worker /// intra-block control flow, liveness analysis will determine the "mov c, x"
422*03ce13f7SAndroid Build Coastguard Worker /// instruction to be dead. One way to prevent this is to insert a
423*03ce13f7SAndroid Build Coastguard Worker /// "FakeUse(c)" instruction anywhere between the two "mov c, ..."
424*03ce13f7SAndroid Build Coastguard Worker /// instructions, e.g.:
425*03ce13f7SAndroid Build Coastguard Worker ///
426*03ce13f7SAndroid Build Coastguard Worker ///     cmp a, b
427*03ce13f7SAndroid Build Coastguard Worker ///     br lt, L1
428*03ce13f7SAndroid Build Coastguard Worker ///     mov c, x
429*03ce13f7SAndroid Build Coastguard Worker ///     jmp L2
430*03ce13f7SAndroid Build Coastguard Worker ///     FakeUse(c)
431*03ce13f7SAndroid Build Coastguard Worker ///   L1:
432*03ce13f7SAndroid Build Coastguard Worker ///     mov c, y
433*03ce13f7SAndroid Build Coastguard Worker ///   L2:
434*03ce13f7SAndroid Build Coastguard Worker ///
435*03ce13f7SAndroid Build Coastguard Worker /// The down-side is that "mov c, x" can never be dead-code eliminated even if
436*03ce13f7SAndroid Build Coastguard Worker /// there are no uses of c. As unlikely as this situation is, it may be
437*03ce13f7SAndroid Build Coastguard Worker /// prevented by running dead code elimination before lowering.
438*03ce13f7SAndroid Build Coastguard Worker class InstX86Label final : public InstX86Base {
439*03ce13f7SAndroid Build Coastguard Worker   InstX86Label() = delete;
440*03ce13f7SAndroid Build Coastguard Worker   InstX86Label(const InstX86Label &) = delete;
441*03ce13f7SAndroid Build Coastguard Worker   InstX86Label &operator=(const InstX86Label &) = delete;
442*03ce13f7SAndroid Build Coastguard Worker 
443*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,TargetLowering * Target)444*03ce13f7SAndroid Build Coastguard Worker   static InstX86Label *create(Cfg *Func, TargetLowering *Target) {
445*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Label>()) InstX86Label(Func, Target);
446*03ce13f7SAndroid Build Coastguard Worker   }
getEmitInstCount()447*03ce13f7SAndroid Build Coastguard Worker   uint32_t getEmitInstCount() const override { return 0; }
getLabelName()448*03ce13f7SAndroid Build Coastguard Worker   GlobalString getLabelName() const { return Name; }
getLabelNumber()449*03ce13f7SAndroid Build Coastguard Worker   SizeT getLabelNumber() const { return LabelNumber; }
isLabel()450*03ce13f7SAndroid Build Coastguard Worker   bool isLabel() const override { return true; }
451*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
452*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
453*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
setRelocOffset(RelocOffset * Value)454*03ce13f7SAndroid Build Coastguard Worker   void setRelocOffset(RelocOffset *Value) { OffsetReloc = Value; }
455*03ce13f7SAndroid Build Coastguard Worker 
456*03ce13f7SAndroid Build Coastguard Worker private:
457*03ce13f7SAndroid Build Coastguard Worker   InstX86Label(Cfg *Func, TargetLowering *Target);
458*03ce13f7SAndroid Build Coastguard Worker 
459*03ce13f7SAndroid Build Coastguard Worker   SizeT LabelNumber; // used for unique label generation.
460*03ce13f7SAndroid Build Coastguard Worker   RelocOffset *OffsetReloc = nullptr;
461*03ce13f7SAndroid Build Coastguard Worker   GlobalString Name;
462*03ce13f7SAndroid Build Coastguard Worker };
463*03ce13f7SAndroid Build Coastguard Worker 
464*03ce13f7SAndroid Build Coastguard Worker /// Conditional and unconditional branch instruction.
465*03ce13f7SAndroid Build Coastguard Worker class InstX86Br final : public InstX86Base {
466*03ce13f7SAndroid Build Coastguard Worker   InstX86Br() = delete;
467*03ce13f7SAndroid Build Coastguard Worker   InstX86Br(const InstX86Br &) = delete;
468*03ce13f7SAndroid Build Coastguard Worker   InstX86Br &operator=(const InstX86Br &) = delete;
469*03ce13f7SAndroid Build Coastguard Worker 
470*03ce13f7SAndroid Build Coastguard Worker public:
471*03ce13f7SAndroid Build Coastguard Worker   enum Mode { Near, Far };
472*03ce13f7SAndroid Build Coastguard Worker 
473*03ce13f7SAndroid Build Coastguard Worker   /// Create a conditional branch to a node.
create(Cfg * Func,CfgNode * TargetTrue,CfgNode * TargetFalse,BrCond Condition,Mode Kind)474*03ce13f7SAndroid Build Coastguard Worker   static InstX86Br *create(Cfg *Func, CfgNode *TargetTrue, CfgNode *TargetFalse,
475*03ce13f7SAndroid Build Coastguard Worker                            BrCond Condition, Mode Kind) {
476*03ce13f7SAndroid Build Coastguard Worker     assert(Condition != Cond::Br_None);
477*03ce13f7SAndroid Build Coastguard Worker     constexpr InstX86Label *NoLabel = nullptr;
478*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Br>())
479*03ce13f7SAndroid Build Coastguard Worker         InstX86Br(Func, TargetTrue, TargetFalse, NoLabel, Condition, Kind);
480*03ce13f7SAndroid Build Coastguard Worker   }
481*03ce13f7SAndroid Build Coastguard Worker   /// Create an unconditional branch to a node.
create(Cfg * Func,CfgNode * Target,Mode Kind)482*03ce13f7SAndroid Build Coastguard Worker   static InstX86Br *create(Cfg *Func, CfgNode *Target, Mode Kind) {
483*03ce13f7SAndroid Build Coastguard Worker     constexpr CfgNode *NoCondTarget = nullptr;
484*03ce13f7SAndroid Build Coastguard Worker     constexpr InstX86Label *NoLabel = nullptr;
485*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Br>())
486*03ce13f7SAndroid Build Coastguard Worker         InstX86Br(Func, NoCondTarget, Target, NoLabel, Cond::Br_None, Kind);
487*03ce13f7SAndroid Build Coastguard Worker   }
488*03ce13f7SAndroid Build Coastguard Worker   /// Create a non-terminator conditional branch to a node, with a fallthrough
489*03ce13f7SAndroid Build Coastguard Worker   /// to the next instruction in the current node. This is used for switch
490*03ce13f7SAndroid Build Coastguard Worker   /// lowering.
create(Cfg * Func,CfgNode * Target,BrCond Condition,Mode Kind)491*03ce13f7SAndroid Build Coastguard Worker   static InstX86Br *create(Cfg *Func, CfgNode *Target, BrCond Condition,
492*03ce13f7SAndroid Build Coastguard Worker                            Mode Kind) {
493*03ce13f7SAndroid Build Coastguard Worker     assert(Condition != Cond::Br_None);
494*03ce13f7SAndroid Build Coastguard Worker     constexpr CfgNode *NoUncondTarget = nullptr;
495*03ce13f7SAndroid Build Coastguard Worker     constexpr InstX86Label *NoLabel = nullptr;
496*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Br>())
497*03ce13f7SAndroid Build Coastguard Worker         InstX86Br(Func, Target, NoUncondTarget, NoLabel, Condition, Kind);
498*03ce13f7SAndroid Build Coastguard Worker   }
499*03ce13f7SAndroid Build Coastguard Worker   /// Create a conditional intra-block branch (or unconditional, if
500*03ce13f7SAndroid Build Coastguard Worker   /// Condition==Br_None) to a label in the current block.
create(Cfg * Func,InstX86Label * Label,BrCond Condition,Mode Kind)501*03ce13f7SAndroid Build Coastguard Worker   static InstX86Br *create(Cfg *Func, InstX86Label *Label, BrCond Condition,
502*03ce13f7SAndroid Build Coastguard Worker                            Mode Kind) {
503*03ce13f7SAndroid Build Coastguard Worker     constexpr CfgNode *NoCondTarget = nullptr;
504*03ce13f7SAndroid Build Coastguard Worker     constexpr CfgNode *NoUncondTarget = nullptr;
505*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Br>())
506*03ce13f7SAndroid Build Coastguard Worker         InstX86Br(Func, NoCondTarget, NoUncondTarget, Label, Condition, Kind);
507*03ce13f7SAndroid Build Coastguard Worker   }
getTargetTrue()508*03ce13f7SAndroid Build Coastguard Worker   const CfgNode *getTargetTrue() const { return TargetTrue; }
getTargetFalse()509*03ce13f7SAndroid Build Coastguard Worker   const CfgNode *getTargetFalse() const { return TargetFalse; }
isNear()510*03ce13f7SAndroid Build Coastguard Worker   bool isNear() const { return Kind == Near; }
511*03ce13f7SAndroid Build Coastguard Worker   bool optimizeBranch(const CfgNode *NextNode);
getEmitInstCount()512*03ce13f7SAndroid Build Coastguard Worker   uint32_t getEmitInstCount() const override {
513*03ce13f7SAndroid Build Coastguard Worker     uint32_t Sum = 0;
514*03ce13f7SAndroid Build Coastguard Worker     if (Label)
515*03ce13f7SAndroid Build Coastguard Worker       ++Sum;
516*03ce13f7SAndroid Build Coastguard Worker     if (getTargetTrue())
517*03ce13f7SAndroid Build Coastguard Worker       ++Sum;
518*03ce13f7SAndroid Build Coastguard Worker     if (getTargetFalse())
519*03ce13f7SAndroid Build Coastguard Worker       ++Sum;
520*03ce13f7SAndroid Build Coastguard Worker     return Sum;
521*03ce13f7SAndroid Build Coastguard Worker   }
isUnconditionalBranch()522*03ce13f7SAndroid Build Coastguard Worker   bool isUnconditionalBranch() const override {
523*03ce13f7SAndroid Build Coastguard Worker     return !Label && Condition == Cond::Br_None;
524*03ce13f7SAndroid Build Coastguard Worker   }
getIntraBlockBranchTarget()525*03ce13f7SAndroid Build Coastguard Worker   const Inst *getIntraBlockBranchTarget() const override { return Label; }
526*03ce13f7SAndroid Build Coastguard Worker   bool repointEdges(CfgNode *OldNode, CfgNode *NewNode) override;
527*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
528*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
529*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)530*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
531*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Br);
532*03ce13f7SAndroid Build Coastguard Worker   }
533*03ce13f7SAndroid Build Coastguard Worker 
534*03ce13f7SAndroid Build Coastguard Worker private:
535*03ce13f7SAndroid Build Coastguard Worker   InstX86Br(Cfg *Func, const CfgNode *TargetTrue, const CfgNode *TargetFalse,
536*03ce13f7SAndroid Build Coastguard Worker             const InstX86Label *Label, BrCond Condition, Mode Kind);
537*03ce13f7SAndroid Build Coastguard Worker 
538*03ce13f7SAndroid Build Coastguard Worker   BrCond Condition;
539*03ce13f7SAndroid Build Coastguard Worker   const CfgNode *TargetTrue;
540*03ce13f7SAndroid Build Coastguard Worker   const CfgNode *TargetFalse;
541*03ce13f7SAndroid Build Coastguard Worker   const InstX86Label *Label; // Intra-block branch target
542*03ce13f7SAndroid Build Coastguard Worker   const Mode Kind;
543*03ce13f7SAndroid Build Coastguard Worker };
544*03ce13f7SAndroid Build Coastguard Worker 
545*03ce13f7SAndroid Build Coastguard Worker /// Jump to a target outside this function, such as tailcall, nacljump,
546*03ce13f7SAndroid Build Coastguard Worker /// naclret, unreachable. This is different from a Branch instruction in that
547*03ce13f7SAndroid Build Coastguard Worker /// there is no intra-function control flow to represent.
548*03ce13f7SAndroid Build Coastguard Worker class InstX86Jmp final : public InstX86Base {
549*03ce13f7SAndroid Build Coastguard Worker   InstX86Jmp() = delete;
550*03ce13f7SAndroid Build Coastguard Worker   InstX86Jmp(const InstX86Jmp &) = delete;
551*03ce13f7SAndroid Build Coastguard Worker   InstX86Jmp &operator=(const InstX86Jmp &) = delete;
552*03ce13f7SAndroid Build Coastguard Worker 
553*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Target)554*03ce13f7SAndroid Build Coastguard Worker   static InstX86Jmp *create(Cfg *Func, Operand *Target) {
555*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Jmp>()) InstX86Jmp(Func, Target);
556*03ce13f7SAndroid Build Coastguard Worker   }
getJmpTarget()557*03ce13f7SAndroid Build Coastguard Worker   Operand *getJmpTarget() const { return this->getSrc(0); }
558*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
559*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
560*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)561*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
562*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Jmp);
563*03ce13f7SAndroid Build Coastguard Worker   }
564*03ce13f7SAndroid Build Coastguard Worker 
565*03ce13f7SAndroid Build Coastguard Worker private:
566*03ce13f7SAndroid Build Coastguard Worker   InstX86Jmp(Cfg *Func, Operand *Target);
567*03ce13f7SAndroid Build Coastguard Worker };
568*03ce13f7SAndroid Build Coastguard Worker 
569*03ce13f7SAndroid Build Coastguard Worker /// Call instruction. Arguments should have already been pushed.
570*03ce13f7SAndroid Build Coastguard Worker class InstX86Call final : public InstX86Base {
571*03ce13f7SAndroid Build Coastguard Worker   InstX86Call() = delete;
572*03ce13f7SAndroid Build Coastguard Worker   InstX86Call(const InstX86Call &) = delete;
573*03ce13f7SAndroid Build Coastguard Worker   InstX86Call &operator=(const InstX86Call &) = delete;
574*03ce13f7SAndroid Build Coastguard Worker 
575*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * CallTarget)576*03ce13f7SAndroid Build Coastguard Worker   static InstX86Call *create(Cfg *Func, Variable *Dest, Operand *CallTarget) {
577*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Call>())
578*03ce13f7SAndroid Build Coastguard Worker         InstX86Call(Func, Dest, CallTarget);
579*03ce13f7SAndroid Build Coastguard Worker   }
getCallTarget()580*03ce13f7SAndroid Build Coastguard Worker   Operand *getCallTarget() const { return this->getSrc(0); }
581*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
582*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
583*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)584*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
585*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Call);
586*03ce13f7SAndroid Build Coastguard Worker   }
587*03ce13f7SAndroid Build Coastguard Worker 
588*03ce13f7SAndroid Build Coastguard Worker private:
589*03ce13f7SAndroid Build Coastguard Worker   InstX86Call(Cfg *Func, Variable *Dest, Operand *CallTarget);
590*03ce13f7SAndroid Build Coastguard Worker };
591*03ce13f7SAndroid Build Coastguard Worker 
592*03ce13f7SAndroid Build Coastguard Worker /// Emit a one-operand (GPR) instruction.
593*03ce13f7SAndroid Build Coastguard Worker void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Var,
594*03ce13f7SAndroid Build Coastguard Worker                     const GPREmitterOneOp &Emitter);
595*03ce13f7SAndroid Build Coastguard Worker 
596*03ce13f7SAndroid Build Coastguard Worker void emitIASAsAddrOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op0,
597*03ce13f7SAndroid Build Coastguard Worker                           const Operand *Op1, const GPREmitterAddrOp &Emitter);
598*03ce13f7SAndroid Build Coastguard Worker 
599*03ce13f7SAndroid Build Coastguard Worker void emitIASGPRShift(const Cfg *Func, Type Ty, const Variable *Var,
600*03ce13f7SAndroid Build Coastguard Worker                      const Operand *Src, const GPREmitterShiftOp &Emitter);
601*03ce13f7SAndroid Build Coastguard Worker 
602*03ce13f7SAndroid Build Coastguard Worker void emitIASAddrOpTyGPR(const Cfg *Func, Type Ty, const AsmAddress &Addr,
603*03ce13f7SAndroid Build Coastguard Worker                         const Operand *Src, const GPREmitterAddrOp &Emitter);
604*03ce13f7SAndroid Build Coastguard Worker 
605*03ce13f7SAndroid Build Coastguard Worker void emitIASRegOpTyXMM(const Cfg *Func, Type Ty, const Variable *Var,
606*03ce13f7SAndroid Build Coastguard Worker                        const Operand *Src, const XmmEmitterRegOp &Emitter);
607*03ce13f7SAndroid Build Coastguard Worker 
608*03ce13f7SAndroid Build Coastguard Worker void emitIASGPRShiftDouble(const Cfg *Func, const Variable *Dest,
609*03ce13f7SAndroid Build Coastguard Worker                            const Operand *Src1Op, const Operand *Src2Op,
610*03ce13f7SAndroid Build Coastguard Worker                            const GPREmitterShiftD &Emitter);
611*03ce13f7SAndroid Build Coastguard Worker 
612*03ce13f7SAndroid Build Coastguard Worker template <typename DReg_t, typename SReg_t, DReg_t (*destEnc)(RegNumT),
613*03ce13f7SAndroid Build Coastguard Worker           SReg_t (*srcEnc)(RegNumT)>
614*03ce13f7SAndroid Build Coastguard Worker void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest,
615*03ce13f7SAndroid Build Coastguard Worker                       Type SrcTy, const Operand *Src,
616*03ce13f7SAndroid Build Coastguard Worker                       const CastEmitterRegOp<DReg_t, SReg_t> &Emitter);
617*03ce13f7SAndroid Build Coastguard Worker 
618*03ce13f7SAndroid Build Coastguard Worker template <typename DReg_t, typename SReg_t, DReg_t (*destEnc)(RegNumT),
619*03ce13f7SAndroid Build Coastguard Worker           SReg_t (*srcEnc)(RegNumT)>
620*03ce13f7SAndroid Build Coastguard Worker void emitIASThreeOpImmOps(const Cfg *Func, Type DispatchTy,
621*03ce13f7SAndroid Build Coastguard Worker                           const Variable *Dest, const Operand *Src0,
622*03ce13f7SAndroid Build Coastguard Worker                           const Operand *Src1,
623*03ce13f7SAndroid Build Coastguard Worker                           const ThreeOpImmEmitter<DReg_t, SReg_t> Emitter);
624*03ce13f7SAndroid Build Coastguard Worker 
625*03ce13f7SAndroid Build Coastguard Worker void emitIASMovlikeXMM(const Cfg *Func, const Variable *Dest,
626*03ce13f7SAndroid Build Coastguard Worker                        const Operand *Src, const XmmEmitterMovOps Emitter);
627*03ce13f7SAndroid Build Coastguard Worker 
628*03ce13f7SAndroid Build Coastguard Worker void emitVariableBlendInst(const char *Opcode, const Inst *Instr,
629*03ce13f7SAndroid Build Coastguard Worker                            const Cfg *Func);
630*03ce13f7SAndroid Build Coastguard Worker 
631*03ce13f7SAndroid Build Coastguard Worker void emitIASVariableBlendInst(const Inst *Instr, const Cfg *Func,
632*03ce13f7SAndroid Build Coastguard Worker                               const XmmEmitterRegOp &Emitter);
633*03ce13f7SAndroid Build Coastguard Worker 
634*03ce13f7SAndroid Build Coastguard Worker void emitIASXmmShift(const Cfg *Func, Type Ty, const Variable *Var,
635*03ce13f7SAndroid Build Coastguard Worker                      const Operand *Src, const XmmEmitterShiftOp &Emitter);
636*03ce13f7SAndroid Build Coastguard Worker 
637*03ce13f7SAndroid Build Coastguard Worker /// Emit a two-operand (GPR) instruction, where the dest operand is a Variable
638*03ce13f7SAndroid Build Coastguard Worker /// that's guaranteed to be a register.
639*03ce13f7SAndroid Build Coastguard Worker template <bool VarCanBeByte = true, bool SrcCanBeByte = true>
640*03ce13f7SAndroid Build Coastguard Worker void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Dst,
641*03ce13f7SAndroid Build Coastguard Worker                        const Operand *Src, const GPREmitterRegOp &Emitter);
642*03ce13f7SAndroid Build Coastguard Worker 
643*03ce13f7SAndroid Build Coastguard Worker /// Instructions of the form x := op(x).
644*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
645*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseInplaceopGPR : public InstX86Base {
646*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseInplaceopGPR() = delete;
647*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseInplaceopGPR(const InstX86BaseInplaceopGPR &) = delete;
648*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseInplaceopGPR &operator=(const InstX86BaseInplaceopGPR &) = delete;
649*03ce13f7SAndroid Build Coastguard Worker 
650*03ce13f7SAndroid Build Coastguard Worker public:
651*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseInplaceopGPR<K>;
652*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)653*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
654*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
655*03ce13f7SAndroid Build Coastguard Worker       return;
656*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrEmit();
657*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 1);
658*03ce13f7SAndroid Build Coastguard Worker     Str << "\t" << Opcode << "\t";
659*03ce13f7SAndroid Build Coastguard Worker     this->getSrc(0)->emit(Func);
660*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)661*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
662*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 1);
663*03ce13f7SAndroid Build Coastguard Worker     const Variable *Var = this->getDest();
664*03ce13f7SAndroid Build Coastguard Worker     Type Ty = Var->getType();
665*03ce13f7SAndroid Build Coastguard Worker     emitIASOpTyGPR(Func, Ty, Var, Emitter);
666*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)667*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
668*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
669*03ce13f7SAndroid Build Coastguard Worker       return;
670*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
671*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
672*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
673*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
674*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)675*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
676*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
677*03ce13f7SAndroid Build Coastguard Worker   }
678*03ce13f7SAndroid Build Coastguard Worker 
679*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseInplaceopGPR(Cfg * Func,Operand * SrcDest)680*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseInplaceopGPR(Cfg *Func, Operand *SrcDest)
681*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 1, llvm::dyn_cast<Variable>(SrcDest)) {
682*03ce13f7SAndroid Build Coastguard Worker     this->addSource(SrcDest);
683*03ce13f7SAndroid Build Coastguard Worker   }
684*03ce13f7SAndroid Build Coastguard Worker 
685*03ce13f7SAndroid Build Coastguard Worker private:
686*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
687*03ce13f7SAndroid Build Coastguard Worker   static const GPREmitterOneOp Emitter;
688*03ce13f7SAndroid Build Coastguard Worker };
689*03ce13f7SAndroid Build Coastguard Worker 
690*03ce13f7SAndroid Build Coastguard Worker /// Instructions of the form x := op(y).
691*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
692*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseUnaryopGPR : public InstX86Base {
693*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopGPR() = delete;
694*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopGPR(const InstX86BaseUnaryopGPR &) = delete;
695*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopGPR &operator=(const InstX86BaseUnaryopGPR &) = delete;
696*03ce13f7SAndroid Build Coastguard Worker 
697*03ce13f7SAndroid Build Coastguard Worker public:
698*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseUnaryopGPR<K>;
699*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)700*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
701*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
702*03ce13f7SAndroid Build Coastguard Worker       return;
703*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrEmit();
704*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 1);
705*03ce13f7SAndroid Build Coastguard Worker     Type SrcTy = this->getSrc(0)->getType();
706*03ce13f7SAndroid Build Coastguard Worker     Type DestTy = this->getDest()->getType();
707*03ce13f7SAndroid Build Coastguard Worker     Str << "\t" << Opcode << this->getWidthString(SrcTy);
708*03ce13f7SAndroid Build Coastguard Worker     // Movsx and movzx need both the source and dest type width letter to
709*03ce13f7SAndroid Build Coastguard Worker     // define the operation. The other unary operations have the same source
710*03ce13f7SAndroid Build Coastguard Worker     // and dest type and as a result need only one letter.
711*03ce13f7SAndroid Build Coastguard Worker     if (SrcTy != DestTy)
712*03ce13f7SAndroid Build Coastguard Worker       Str << this->getWidthString(DestTy);
713*03ce13f7SAndroid Build Coastguard Worker     Str << "\t";
714*03ce13f7SAndroid Build Coastguard Worker     this->getSrc(0)->emit(Func);
715*03ce13f7SAndroid Build Coastguard Worker     Str << ", ";
716*03ce13f7SAndroid Build Coastguard Worker     this->getDest()->emit(Func);
717*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)718*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
719*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 1 && K != InstX86Base::Lea);
720*03ce13f7SAndroid Build Coastguard Worker     const Variable *Var = this->getDest();
721*03ce13f7SAndroid Build Coastguard Worker     Type Ty = Var->getType();
722*03ce13f7SAndroid Build Coastguard Worker     const Operand *Src = this->getSrc(0);
723*03ce13f7SAndroid Build Coastguard Worker     emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter);
724*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)725*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
726*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
727*03ce13f7SAndroid Build Coastguard Worker       return;
728*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
729*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
730*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getSrc(0)->getType() << " ";
731*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
732*03ce13f7SAndroid Build Coastguard Worker   }
733*03ce13f7SAndroid Build Coastguard Worker 
classof(const Inst * Instr)734*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
735*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
736*03ce13f7SAndroid Build Coastguard Worker   }
737*03ce13f7SAndroid Build Coastguard Worker 
738*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseUnaryopGPR(Cfg * Func,Variable * Dest,Operand * Src)739*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopGPR(Cfg *Func, Variable *Dest, Operand *Src)
740*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 1, Dest) {
741*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Src);
742*03ce13f7SAndroid Build Coastguard Worker   }
743*03ce13f7SAndroid Build Coastguard Worker 
744*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
745*03ce13f7SAndroid Build Coastguard Worker   static const GPREmitterRegOp Emitter;
746*03ce13f7SAndroid Build Coastguard Worker };
747*03ce13f7SAndroid Build Coastguard Worker 
748*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
749*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseUnaryopXmm : public InstX86Base {
750*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopXmm() = delete;
751*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopXmm(const InstX86BaseUnaryopXmm &) = delete;
752*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopXmm &operator=(const InstX86BaseUnaryopXmm &) = delete;
753*03ce13f7SAndroid Build Coastguard Worker 
754*03ce13f7SAndroid Build Coastguard Worker public:
755*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseUnaryopXmm<K>;
756*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)757*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
758*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
759*03ce13f7SAndroid Build Coastguard Worker       return;
760*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrEmit();
761*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 1);
762*03ce13f7SAndroid Build Coastguard Worker     Str << "\t" << Opcode << "\t";
763*03ce13f7SAndroid Build Coastguard Worker     this->getSrc(0)->emit(Func);
764*03ce13f7SAndroid Build Coastguard Worker     Str << ", ";
765*03ce13f7SAndroid Build Coastguard Worker     this->getDest()->emit(Func);
766*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)767*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
768*03ce13f7SAndroid Build Coastguard Worker     Type Ty = this->getDest()->getType();
769*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 1);
770*03ce13f7SAndroid Build Coastguard Worker     emitIASRegOpTyXMM(Func, Ty, this->getDest(), this->getSrc(0), Emitter);
771*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)772*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
773*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
774*03ce13f7SAndroid Build Coastguard Worker       return;
775*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
776*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
777*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
778*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
779*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)780*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
781*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
782*03ce13f7SAndroid Build Coastguard Worker   }
783*03ce13f7SAndroid Build Coastguard Worker 
784*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseUnaryopXmm(Cfg * Func,Variable * Dest,Operand * Src)785*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseUnaryopXmm(Cfg *Func, Variable *Dest, Operand *Src)
786*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 1, Dest) {
787*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Src);
788*03ce13f7SAndroid Build Coastguard Worker   }
789*03ce13f7SAndroid Build Coastguard Worker 
790*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
791*03ce13f7SAndroid Build Coastguard Worker   static const XmmEmitterRegOp Emitter;
792*03ce13f7SAndroid Build Coastguard Worker };
793*03ce13f7SAndroid Build Coastguard Worker 
794*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
795*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseBinopGPRShift : public InstX86Base {
796*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPRShift() = delete;
797*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPRShift(const InstX86BaseBinopGPRShift &) = delete;
798*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPRShift &
799*03ce13f7SAndroid Build Coastguard Worker   operator=(const InstX86BaseBinopGPRShift &) = delete;
800*03ce13f7SAndroid Build Coastguard Worker 
801*03ce13f7SAndroid Build Coastguard Worker public:
802*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseBinopGPRShift<K>;
803*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)804*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
805*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
806*03ce13f7SAndroid Build Coastguard Worker       return;
807*03ce13f7SAndroid Build Coastguard Worker     this->emitTwoAddress(Func, Opcode);
808*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)809*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
810*03ce13f7SAndroid Build Coastguard Worker     Type Ty = this->getDest()->getType();
811*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 2);
812*03ce13f7SAndroid Build Coastguard Worker     emitIASGPRShift(Func, Ty, this->getDest(), this->getSrc(1), Emitter);
813*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)814*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
815*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
816*03ce13f7SAndroid Build Coastguard Worker       return;
817*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
818*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
819*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
820*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
821*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)822*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
823*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
824*03ce13f7SAndroid Build Coastguard Worker   }
825*03ce13f7SAndroid Build Coastguard Worker 
826*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseBinopGPRShift(Cfg * Func,Variable * Dest,Operand * Source)827*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPRShift(Cfg *Func, Variable *Dest, Operand *Source)
828*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 2, Dest) {
829*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Dest);
830*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source);
831*03ce13f7SAndroid Build Coastguard Worker   }
832*03ce13f7SAndroid Build Coastguard Worker 
833*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
834*03ce13f7SAndroid Build Coastguard Worker   static const GPREmitterShiftOp Emitter;
835*03ce13f7SAndroid Build Coastguard Worker };
836*03ce13f7SAndroid Build Coastguard Worker 
837*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
838*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseBinopGPR : public InstX86Base {
839*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPR() = delete;
840*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPR(const InstX86BaseBinopGPR &) = delete;
841*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPR &operator=(const InstX86BaseBinopGPR &) = delete;
842*03ce13f7SAndroid Build Coastguard Worker 
843*03ce13f7SAndroid Build Coastguard Worker public:
844*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseBinopGPR<K>;
845*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)846*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
847*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
848*03ce13f7SAndroid Build Coastguard Worker       return;
849*03ce13f7SAndroid Build Coastguard Worker     this->emitTwoAddress(Func, Opcode);
850*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)851*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
852*03ce13f7SAndroid Build Coastguard Worker     Type Ty = this->getDest()->getType();
853*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 2);
854*03ce13f7SAndroid Build Coastguard Worker     static_assert(K != InstX86Base::Lea, "Lea should be a unaryop.");
855*03ce13f7SAndroid Build Coastguard Worker     emitIASRegOpTyGPR(Func, Ty, this->getDest(), this->getSrc(1), Emitter);
856*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)857*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
858*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
859*03ce13f7SAndroid Build Coastguard Worker       return;
860*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
861*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
862*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
863*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
864*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)865*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
866*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
867*03ce13f7SAndroid Build Coastguard Worker   }
868*03ce13f7SAndroid Build Coastguard Worker 
869*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseBinopGPR(Cfg * Func,Variable * Dest,Operand * Source)870*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopGPR(Cfg *Func, Variable *Dest, Operand *Source)
871*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 2, Dest) {
872*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Dest);
873*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source);
874*03ce13f7SAndroid Build Coastguard Worker   }
875*03ce13f7SAndroid Build Coastguard Worker 
876*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
877*03ce13f7SAndroid Build Coastguard Worker   static const GPREmitterRegOp Emitter;
878*03ce13f7SAndroid Build Coastguard Worker };
879*03ce13f7SAndroid Build Coastguard Worker 
880*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
881*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseBinopRMW : public InstX86Base {
882*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopRMW() = delete;
883*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopRMW(const InstX86BaseBinopRMW &) = delete;
884*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopRMW &operator=(const InstX86BaseBinopRMW &) = delete;
885*03ce13f7SAndroid Build Coastguard Worker 
886*03ce13f7SAndroid Build Coastguard Worker public:
887*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseBinopRMW<K>;
888*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)889*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
890*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
891*03ce13f7SAndroid Build Coastguard Worker       return;
892*03ce13f7SAndroid Build Coastguard Worker     this->emitTwoAddress(Func, Opcode);
893*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)894*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
895*03ce13f7SAndroid Build Coastguard Worker     Type Ty = this->getSrc(0)->getType();
896*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 2);
897*03ce13f7SAndroid Build Coastguard Worker     emitIASAsAddrOpTyGPR(Func, Ty, this->getSrc(0), this->getSrc(1), Emitter);
898*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)899*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
900*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
901*03ce13f7SAndroid Build Coastguard Worker       return;
902*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
903*03ce13f7SAndroid Build Coastguard Worker     Str << Opcode << "." << this->getSrc(0)->getType() << " ";
904*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
905*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)906*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
907*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
908*03ce13f7SAndroid Build Coastguard Worker   }
909*03ce13f7SAndroid Build Coastguard Worker 
910*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseBinopRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)911*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
912*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 2, nullptr) {
913*03ce13f7SAndroid Build Coastguard Worker     this->addSource(DestSrc0);
914*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Src1);
915*03ce13f7SAndroid Build Coastguard Worker   }
916*03ce13f7SAndroid Build Coastguard Worker 
917*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
918*03ce13f7SAndroid Build Coastguard Worker   static const GPREmitterAddrOp Emitter;
919*03ce13f7SAndroid Build Coastguard Worker };
920*03ce13f7SAndroid Build Coastguard Worker 
921*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K, bool NeedsElementType,
922*03ce13f7SAndroid Build Coastguard Worker           typename InstX86Base::SseSuffix Suffix>
923*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseBinopXmm : public InstX86Base {
924*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmm() = delete;
925*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete;
926*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete;
927*03ce13f7SAndroid Build Coastguard Worker 
928*03ce13f7SAndroid Build Coastguard Worker public:
929*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseBinopXmm<K, NeedsElementType, Suffix>;
930*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)931*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
932*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
933*03ce13f7SAndroid Build Coastguard Worker       return;
934*03ce13f7SAndroid Build Coastguard Worker     this->validateVectorAddrMode();
935*03ce13f7SAndroid Build Coastguard Worker     const Type DestTy = ArithmeticTypeOverride == IceType_void
936*03ce13f7SAndroid Build Coastguard Worker                             ? this->getDest()->getType()
937*03ce13f7SAndroid Build Coastguard Worker                             : ArithmeticTypeOverride;
938*03ce13f7SAndroid Build Coastguard Worker     const char *SuffixString = getSseSuffixString(DestTy, Suffix);
939*03ce13f7SAndroid Build Coastguard Worker     this->emitTwoAddress(Func, Opcode, SuffixString);
940*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)941*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
942*03ce13f7SAndroid Build Coastguard Worker     this->validateVectorAddrMode();
943*03ce13f7SAndroid Build Coastguard Worker     Type Ty = this->getDest()->getType();
944*03ce13f7SAndroid Build Coastguard Worker     if (NeedsElementType)
945*03ce13f7SAndroid Build Coastguard Worker       Ty = typeElementType(Ty);
946*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 2);
947*03ce13f7SAndroid Build Coastguard Worker     emitIASRegOpTyXMM(Func, Ty, this->getDest(), this->getSrc(1), Emitter);
948*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)949*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
950*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
951*03ce13f7SAndroid Build Coastguard Worker       return;
952*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
953*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
954*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
955*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
956*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)957*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
958*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
959*03ce13f7SAndroid Build Coastguard Worker   }
960*03ce13f7SAndroid Build Coastguard Worker 
961*03ce13f7SAndroid Build Coastguard Worker protected:
962*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmm(Cfg *Func, Variable *Dest, Operand *Source,
963*03ce13f7SAndroid Build Coastguard Worker                       Type ArithmeticTypeOverride = IceType_void)
964*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 2, Dest),
965*03ce13f7SAndroid Build Coastguard Worker         ArithmeticTypeOverride(ArithmeticTypeOverride) {
966*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Dest);
967*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source);
968*03ce13f7SAndroid Build Coastguard Worker   }
969*03ce13f7SAndroid Build Coastguard Worker 
970*03ce13f7SAndroid Build Coastguard Worker   const Type ArithmeticTypeOverride;
971*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
972*03ce13f7SAndroid Build Coastguard Worker   static const XmmEmitterRegOp Emitter;
973*03ce13f7SAndroid Build Coastguard Worker };
974*03ce13f7SAndroid Build Coastguard Worker 
975*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K, bool AllowAllTypes = false>
976*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseBinopXmmShift : public InstX86Base {
977*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmmShift() = delete;
978*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmmShift(const InstX86BaseBinopXmmShift &) = delete;
979*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmmShift &
980*03ce13f7SAndroid Build Coastguard Worker   operator=(const InstX86BaseBinopXmmShift &) = delete;
981*03ce13f7SAndroid Build Coastguard Worker 
982*03ce13f7SAndroid Build Coastguard Worker public:
983*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseBinopXmmShift<K, AllowAllTypes>;
984*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)985*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
986*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
987*03ce13f7SAndroid Build Coastguard Worker       return;
988*03ce13f7SAndroid Build Coastguard Worker     this->validateVectorAddrMode();
989*03ce13f7SAndroid Build Coastguard Worker     // Shift operations are always integral, and hence always need a suffix.
990*03ce13f7SAndroid Build Coastguard Worker     const Type DestTy = this->getDest()->getType();
991*03ce13f7SAndroid Build Coastguard Worker     const char *SuffixString = getSseSuffixString(DestTy, SseSuffix::Integral);
992*03ce13f7SAndroid Build Coastguard Worker     this->emitTwoAddress(Func, this->Opcode, SuffixString);
993*03ce13f7SAndroid Build Coastguard Worker   }
emitIAS(const Cfg * Func)994*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override {
995*03ce13f7SAndroid Build Coastguard Worker     this->validateVectorAddrMode();
996*03ce13f7SAndroid Build Coastguard Worker     Type Ty = this->getDest()->getType();
997*03ce13f7SAndroid Build Coastguard Worker     assert(AllowAllTypes || isVectorType(Ty));
998*03ce13f7SAndroid Build Coastguard Worker     Type ElementTy = typeElementType(Ty);
999*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 2);
1000*03ce13f7SAndroid Build Coastguard Worker     emitIASXmmShift(Func, ElementTy, this->getDest(), this->getSrc(1), Emitter);
1001*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)1002*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
1003*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
1004*03ce13f7SAndroid Build Coastguard Worker       return;
1005*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
1006*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
1007*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
1008*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
1009*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)1010*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
1011*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
1012*03ce13f7SAndroid Build Coastguard Worker   }
1013*03ce13f7SAndroid Build Coastguard Worker 
1014*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseBinopXmmShift(Cfg * Func,Variable * Dest,Operand * Source)1015*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseBinopXmmShift(Cfg *Func, Variable *Dest, Operand *Source)
1016*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 2, Dest) {
1017*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Dest);
1018*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source);
1019*03ce13f7SAndroid Build Coastguard Worker   }
1020*03ce13f7SAndroid Build Coastguard Worker 
1021*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
1022*03ce13f7SAndroid Build Coastguard Worker   static const XmmEmitterShiftOp Emitter;
1023*03ce13f7SAndroid Build Coastguard Worker };
1024*03ce13f7SAndroid Build Coastguard Worker 
1025*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
1026*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseTernop : public InstX86Base {
1027*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseTernop() = delete;
1028*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseTernop(const InstX86BaseTernop &) = delete;
1029*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseTernop &operator=(const InstX86BaseTernop &) = delete;
1030*03ce13f7SAndroid Build Coastguard Worker 
1031*03ce13f7SAndroid Build Coastguard Worker public:
1032*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseTernop<K>;
1033*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)1034*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
1035*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
1036*03ce13f7SAndroid Build Coastguard Worker       return;
1037*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrEmit();
1038*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 3);
1039*03ce13f7SAndroid Build Coastguard Worker     Str << "\t" << Opcode << "\t";
1040*03ce13f7SAndroid Build Coastguard Worker     this->getSrc(2)->emit(Func);
1041*03ce13f7SAndroid Build Coastguard Worker     Str << ", ";
1042*03ce13f7SAndroid Build Coastguard Worker     this->getSrc(1)->emit(Func);
1043*03ce13f7SAndroid Build Coastguard Worker     Str << ", ";
1044*03ce13f7SAndroid Build Coastguard Worker     this->getDest()->emit(Func);
1045*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)1046*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
1047*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
1048*03ce13f7SAndroid Build Coastguard Worker       return;
1049*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
1050*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
1051*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
1052*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
1053*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)1054*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
1055*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
1056*03ce13f7SAndroid Build Coastguard Worker   }
1057*03ce13f7SAndroid Build Coastguard Worker 
1058*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseTernop(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)1059*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseTernop(Cfg *Func, Variable *Dest, Operand *Source1,
1060*03ce13f7SAndroid Build Coastguard Worker                     Operand *Source2)
1061*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 3, Dest) {
1062*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Dest);
1063*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source1);
1064*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source2);
1065*03ce13f7SAndroid Build Coastguard Worker   }
1066*03ce13f7SAndroid Build Coastguard Worker 
1067*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
1068*03ce13f7SAndroid Build Coastguard Worker };
1069*03ce13f7SAndroid Build Coastguard Worker 
1070*03ce13f7SAndroid Build Coastguard Worker // Instructions of the form x := y op z
1071*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
1072*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseThreeAddressop : public InstX86Base {
1073*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseThreeAddressop() = delete;
1074*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseThreeAddressop(const InstX86BaseThreeAddressop &) = delete;
1075*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseThreeAddressop &
1076*03ce13f7SAndroid Build Coastguard Worker   operator=(const InstX86BaseThreeAddressop &) = delete;
1077*03ce13f7SAndroid Build Coastguard Worker 
1078*03ce13f7SAndroid Build Coastguard Worker public:
1079*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseThreeAddressop<K>;
1080*03ce13f7SAndroid Build Coastguard Worker 
emit(const Cfg * Func)1081*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override {
1082*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
1083*03ce13f7SAndroid Build Coastguard Worker       return;
1084*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrEmit();
1085*03ce13f7SAndroid Build Coastguard Worker     assert(this->getSrcSize() == 2);
1086*03ce13f7SAndroid Build Coastguard Worker     Str << "\t" << Opcode << "\t";
1087*03ce13f7SAndroid Build Coastguard Worker     this->getSrc(1)->emit(Func);
1088*03ce13f7SAndroid Build Coastguard Worker     Str << ", ";
1089*03ce13f7SAndroid Build Coastguard Worker     this->getSrc(0)->emit(Func);
1090*03ce13f7SAndroid Build Coastguard Worker     Str << ", ";
1091*03ce13f7SAndroid Build Coastguard Worker     this->getDest()->emit(Func);
1092*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)1093*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
1094*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
1095*03ce13f7SAndroid Build Coastguard Worker       return;
1096*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
1097*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
1098*03ce13f7SAndroid Build Coastguard Worker     Str << " = " << Opcode << "." << this->getDest()->getType() << " ";
1099*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
1100*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)1101*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
1102*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
1103*03ce13f7SAndroid Build Coastguard Worker   }
1104*03ce13f7SAndroid Build Coastguard Worker 
1105*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseThreeAddressop(Cfg * Func,Variable * Dest,Operand * Source0,Operand * Source1)1106*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseThreeAddressop(Cfg *Func, Variable *Dest, Operand *Source0,
1107*03ce13f7SAndroid Build Coastguard Worker                             Operand *Source1)
1108*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 2, Dest) {
1109*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source0);
1110*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source1);
1111*03ce13f7SAndroid Build Coastguard Worker   }
1112*03ce13f7SAndroid Build Coastguard Worker 
1113*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
1114*03ce13f7SAndroid Build Coastguard Worker };
1115*03ce13f7SAndroid Build Coastguard Worker 
1116*03ce13f7SAndroid Build Coastguard Worker /// Base class for assignment instructions
1117*03ce13f7SAndroid Build Coastguard Worker template <typename InstX86Base::InstKindX86 K>
1118*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseMovlike : public InstX86Base {
1119*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseMovlike() = delete;
1120*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseMovlike(const InstX86BaseMovlike &) = delete;
1121*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseMovlike &operator=(const InstX86BaseMovlike &) = delete;
1122*03ce13f7SAndroid Build Coastguard Worker 
1123*03ce13f7SAndroid Build Coastguard Worker public:
1124*03ce13f7SAndroid Build Coastguard Worker   using Base = InstX86BaseMovlike<K>;
1125*03ce13f7SAndroid Build Coastguard Worker 
isRedundantAssign()1126*03ce13f7SAndroid Build Coastguard Worker   bool isRedundantAssign() const override {
1127*03ce13f7SAndroid Build Coastguard Worker     if (const auto *SrcVar = llvm::dyn_cast<const Variable>(this->getSrc(0))) {
1128*03ce13f7SAndroid Build Coastguard Worker       if (SrcVar->hasReg() && this->Dest->hasReg()) {
1129*03ce13f7SAndroid Build Coastguard Worker         // An assignment between physical registers is considered redundant if
1130*03ce13f7SAndroid Build Coastguard Worker         // they have the same base register and the same encoding. E.g.:
1131*03ce13f7SAndroid Build Coastguard Worker         //   mov cl, ecx ==> redundant
1132*03ce13f7SAndroid Build Coastguard Worker         //   mov ch, ecx ==> not redundant due to different encodings
1133*03ce13f7SAndroid Build Coastguard Worker         //   mov ch, ebp ==> not redundant due to different base registers
1134*03ce13f7SAndroid Build Coastguard Worker         //   mov ecx, ecx ==> redundant, and dangerous in x86-64. i64 zexting
1135*03ce13f7SAndroid Build Coastguard Worker         //                    is handled by Inst86Zext.
1136*03ce13f7SAndroid Build Coastguard Worker         const auto SrcReg = SrcVar->getRegNum();
1137*03ce13f7SAndroid Build Coastguard Worker         const auto DestReg = this->Dest->getRegNum();
1138*03ce13f7SAndroid Build Coastguard Worker         return (RegX8632::getEncoding(SrcReg) ==
1139*03ce13f7SAndroid Build Coastguard Worker                 RegX8632::getEncoding(DestReg)) &&
1140*03ce13f7SAndroid Build Coastguard Worker                (RegX8632::getBaseReg(SrcReg) == RegX8632::getBaseReg(DestReg));
1141*03ce13f7SAndroid Build Coastguard Worker       }
1142*03ce13f7SAndroid Build Coastguard Worker     }
1143*03ce13f7SAndroid Build Coastguard Worker     return checkForRedundantAssign(this->getDest(), this->getSrc(0));
1144*03ce13f7SAndroid Build Coastguard Worker   }
isVarAssign()1145*03ce13f7SAndroid Build Coastguard Worker   bool isVarAssign() const override {
1146*03ce13f7SAndroid Build Coastguard Worker     return llvm::isa<Variable>(this->getSrc(0));
1147*03ce13f7SAndroid Build Coastguard Worker   }
dump(const Cfg * Func)1148*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override {
1149*03ce13f7SAndroid Build Coastguard Worker     if (!BuildDefs::dump())
1150*03ce13f7SAndroid Build Coastguard Worker       return;
1151*03ce13f7SAndroid Build Coastguard Worker     Ostream &Str = Func->getContext()->getStrDump();
1152*03ce13f7SAndroid Build Coastguard Worker     Str << Opcode << "." << this->getDest()->getType() << " ";
1153*03ce13f7SAndroid Build Coastguard Worker     this->dumpDest(Func);
1154*03ce13f7SAndroid Build Coastguard Worker     Str << ", ";
1155*03ce13f7SAndroid Build Coastguard Worker     this->dumpSources(Func);
1156*03ce13f7SAndroid Build Coastguard Worker   }
classof(const Inst * Instr)1157*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
1158*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, K);
1159*03ce13f7SAndroid Build Coastguard Worker   }
1160*03ce13f7SAndroid Build Coastguard Worker 
1161*03ce13f7SAndroid Build Coastguard Worker protected:
InstX86BaseMovlike(Cfg * Func,Variable * Dest,Operand * Source)1162*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseMovlike(Cfg *Func, Variable *Dest, Operand *Source)
1163*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, K, 1, Dest) {
1164*03ce13f7SAndroid Build Coastguard Worker     this->addSource(Source);
1165*03ce13f7SAndroid Build Coastguard Worker     // For an integer assignment, make sure it's either a same-type assignment
1166*03ce13f7SAndroid Build Coastguard Worker     // or a truncation.
1167*03ce13f7SAndroid Build Coastguard Worker     assert(!isScalarIntegerType(Dest->getType()) ||
1168*03ce13f7SAndroid Build Coastguard Worker            (typeWidthInBytes(Dest->getType()) <=
1169*03ce13f7SAndroid Build Coastguard Worker             typeWidthInBytes(Source->getType())));
1170*03ce13f7SAndroid Build Coastguard Worker   }
1171*03ce13f7SAndroid Build Coastguard Worker 
1172*03ce13f7SAndroid Build Coastguard Worker   static const char *const Opcode;
1173*03ce13f7SAndroid Build Coastguard Worker };
1174*03ce13f7SAndroid Build Coastguard Worker 
1175*03ce13f7SAndroid Build Coastguard Worker class InstX86Bswap : public InstX86BaseInplaceopGPR<InstX86Base::Bswap> {
1176*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * SrcDest)1177*03ce13f7SAndroid Build Coastguard Worker   static InstX86Bswap *create(Cfg *Func, Operand *SrcDest) {
1178*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Bswap>()) InstX86Bswap(Func, SrcDest);
1179*03ce13f7SAndroid Build Coastguard Worker   }
1180*03ce13f7SAndroid Build Coastguard Worker 
1181*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Bswap(Cfg * Func,Operand * SrcDest)1182*03ce13f7SAndroid Build Coastguard Worker   InstX86Bswap(Cfg *Func, Operand *SrcDest)
1183*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseInplaceopGPR<InstX86Base::Bswap>(Func, SrcDest) {}
1184*03ce13f7SAndroid Build Coastguard Worker };
1185*03ce13f7SAndroid Build Coastguard Worker 
1186*03ce13f7SAndroid Build Coastguard Worker class InstX86Neg : public InstX86BaseInplaceopGPR<InstX86Base::Neg> {
1187*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * SrcDest)1188*03ce13f7SAndroid Build Coastguard Worker   static InstX86Neg *create(Cfg *Func, Operand *SrcDest) {
1189*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Neg>()) InstX86Neg(Func, SrcDest);
1190*03ce13f7SAndroid Build Coastguard Worker   }
1191*03ce13f7SAndroid Build Coastguard Worker 
1192*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Neg(Cfg * Func,Operand * SrcDest)1193*03ce13f7SAndroid Build Coastguard Worker   InstX86Neg(Cfg *Func, Operand *SrcDest)
1194*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseInplaceopGPR<InstX86Base::Neg>(Func, SrcDest) {}
1195*03ce13f7SAndroid Build Coastguard Worker };
1196*03ce13f7SAndroid Build Coastguard Worker 
1197*03ce13f7SAndroid Build Coastguard Worker class InstX86Bsf : public InstX86BaseUnaryopGPR<InstX86Base::Bsf> {
1198*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1199*03ce13f7SAndroid Build Coastguard Worker   static InstX86Bsf *create(Cfg *Func, Variable *Dest, Operand *Src) {
1200*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Bsf>()) InstX86Bsf(Func, Dest, Src);
1201*03ce13f7SAndroid Build Coastguard Worker   }
1202*03ce13f7SAndroid Build Coastguard Worker 
1203*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Bsf(Cfg * Func,Variable * Dest,Operand * Src)1204*03ce13f7SAndroid Build Coastguard Worker   InstX86Bsf(Cfg *Func, Variable *Dest, Operand *Src)
1205*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopGPR<InstX86Base::Bsf>(Func, Dest, Src) {}
1206*03ce13f7SAndroid Build Coastguard Worker };
1207*03ce13f7SAndroid Build Coastguard Worker 
1208*03ce13f7SAndroid Build Coastguard Worker class InstX86Bsr : public InstX86BaseUnaryopGPR<InstX86Base::Bsr> {
1209*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1210*03ce13f7SAndroid Build Coastguard Worker   static InstX86Bsr *create(Cfg *Func, Variable *Dest, Operand *Src) {
1211*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Bsr>()) InstX86Bsr(Func, Dest, Src);
1212*03ce13f7SAndroid Build Coastguard Worker   }
1213*03ce13f7SAndroid Build Coastguard Worker 
1214*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Bsr(Cfg * Func,Variable * Dest,Operand * Src)1215*03ce13f7SAndroid Build Coastguard Worker   InstX86Bsr(Cfg *Func, Variable *Dest, Operand *Src)
1216*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopGPR<InstX86Base::Bsr>(Func, Dest, Src) {}
1217*03ce13f7SAndroid Build Coastguard Worker };
1218*03ce13f7SAndroid Build Coastguard Worker 
1219*03ce13f7SAndroid Build Coastguard Worker class InstX86Lea : public InstX86BaseUnaryopGPR<InstX86Base::Lea> {
1220*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1221*03ce13f7SAndroid Build Coastguard Worker   static InstX86Lea *create(Cfg *Func, Variable *Dest, Operand *Src) {
1222*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Lea>()) InstX86Lea(Func, Dest, Src);
1223*03ce13f7SAndroid Build Coastguard Worker   }
1224*03ce13f7SAndroid Build Coastguard Worker 
1225*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1226*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1227*03ce13f7SAndroid Build Coastguard Worker 
1228*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Lea(Cfg * Func,Variable * Dest,Operand * Src)1229*03ce13f7SAndroid Build Coastguard Worker   InstX86Lea(Cfg *Func, Variable *Dest, Operand *Src)
1230*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopGPR<InstX86Base::Lea>(Func, Dest, Src) {}
1231*03ce13f7SAndroid Build Coastguard Worker 
1232*03ce13f7SAndroid Build Coastguard Worker   Inst *deoptToAddOrNull(const Cfg *Func) const;
1233*03ce13f7SAndroid Build Coastguard Worker };
1234*03ce13f7SAndroid Build Coastguard Worker 
1235*03ce13f7SAndroid Build Coastguard Worker // Cbwdq instruction - wrapper for cbw, cwd, and cdq
1236*03ce13f7SAndroid Build Coastguard Worker class InstX86Cbwdq : public InstX86BaseUnaryopGPR<InstX86Base::Cbwdq> {
1237*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1238*03ce13f7SAndroid Build Coastguard Worker   static InstX86Cbwdq *create(Cfg *Func, Variable *Dest, Operand *Src) {
1239*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Cbwdq>()) InstX86Cbwdq(Func, Dest, Src);
1240*03ce13f7SAndroid Build Coastguard Worker   }
1241*03ce13f7SAndroid Build Coastguard Worker 
1242*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1243*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1244*03ce13f7SAndroid Build Coastguard Worker 
1245*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Cbwdq(Cfg * Func,Variable * Dest,Operand * Src)1246*03ce13f7SAndroid Build Coastguard Worker   InstX86Cbwdq(Cfg *Func, Variable *Dest, Operand *Src)
1247*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopGPR<InstX86Base::Cbwdq>(Func, Dest, Src) {}
1248*03ce13f7SAndroid Build Coastguard Worker };
1249*03ce13f7SAndroid Build Coastguard Worker 
1250*03ce13f7SAndroid Build Coastguard Worker class InstX86Movsx : public InstX86BaseUnaryopGPR<InstX86Base::Movsx> {
1251*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1252*03ce13f7SAndroid Build Coastguard Worker   static InstX86Movsx *create(Cfg *Func, Variable *Dest, Operand *Src) {
1253*03ce13f7SAndroid Build Coastguard Worker     assert(typeWidthInBytes(Dest->getType()) >
1254*03ce13f7SAndroid Build Coastguard Worker            typeWidthInBytes(Src->getType()));
1255*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Movsx>()) InstX86Movsx(Func, Dest, Src);
1256*03ce13f7SAndroid Build Coastguard Worker   }
1257*03ce13f7SAndroid Build Coastguard Worker 
1258*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1259*03ce13f7SAndroid Build Coastguard Worker 
1260*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Movsx(Cfg * Func,Variable * Dest,Operand * Src)1261*03ce13f7SAndroid Build Coastguard Worker   InstX86Movsx(Cfg *Func, Variable *Dest, Operand *Src)
1262*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopGPR<InstX86Base::Movsx>(Func, Dest, Src) {}
1263*03ce13f7SAndroid Build Coastguard Worker };
1264*03ce13f7SAndroid Build Coastguard Worker 
1265*03ce13f7SAndroid Build Coastguard Worker class InstX86Movzx : public InstX86BaseUnaryopGPR<InstX86Base::Movzx> {
1266*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1267*03ce13f7SAndroid Build Coastguard Worker   static InstX86Movzx *create(Cfg *Func, Variable *Dest, Operand *Src) {
1268*03ce13f7SAndroid Build Coastguard Worker     assert(typeWidthInBytes(Dest->getType()) >
1269*03ce13f7SAndroid Build Coastguard Worker            typeWidthInBytes(Src->getType()));
1270*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Movzx>()) InstX86Movzx(Func, Dest, Src);
1271*03ce13f7SAndroid Build Coastguard Worker   }
1272*03ce13f7SAndroid Build Coastguard Worker 
1273*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1274*03ce13f7SAndroid Build Coastguard Worker 
1275*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1276*03ce13f7SAndroid Build Coastguard Worker 
setMustKeep()1277*03ce13f7SAndroid Build Coastguard Worker   void setMustKeep() { MustKeep = true; }
1278*03ce13f7SAndroid Build Coastguard Worker 
1279*03ce13f7SAndroid Build Coastguard Worker private:
1280*03ce13f7SAndroid Build Coastguard Worker   bool MustKeep = false;
1281*03ce13f7SAndroid Build Coastguard Worker 
InstX86Movzx(Cfg * Func,Variable * Dest,Operand * Src)1282*03ce13f7SAndroid Build Coastguard Worker   InstX86Movzx(Cfg *Func, Variable *Dest, Operand *Src)
1283*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopGPR<InstX86Base::Movzx>(Func, Dest, Src) {}
1284*03ce13f7SAndroid Build Coastguard Worker };
1285*03ce13f7SAndroid Build Coastguard Worker 
1286*03ce13f7SAndroid Build Coastguard Worker class InstX86Movd : public InstX86BaseUnaryopXmm<InstX86Base::Movd> {
1287*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1288*03ce13f7SAndroid Build Coastguard Worker   static InstX86Movd *create(Cfg *Func, Variable *Dest, Operand *Src) {
1289*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Movd>()) InstX86Movd(Func, Dest, Src);
1290*03ce13f7SAndroid Build Coastguard Worker   }
1291*03ce13f7SAndroid Build Coastguard Worker 
1292*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1293*03ce13f7SAndroid Build Coastguard Worker 
1294*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1295*03ce13f7SAndroid Build Coastguard Worker 
1296*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Movd(Cfg * Func,Variable * Dest,Operand * Src)1297*03ce13f7SAndroid Build Coastguard Worker   InstX86Movd(Cfg *Func, Variable *Dest, Operand *Src)
1298*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopXmm<InstX86Base::Movd>(Func, Dest, Src) {}
1299*03ce13f7SAndroid Build Coastguard Worker };
1300*03ce13f7SAndroid Build Coastguard Worker 
1301*03ce13f7SAndroid Build Coastguard Worker class InstX86Movmsk final : public InstX86Base {
1302*03ce13f7SAndroid Build Coastguard Worker   InstX86Movmsk() = delete;
1303*03ce13f7SAndroid Build Coastguard Worker   InstX86Movmsk(const InstX86Movmsk &) = delete;
1304*03ce13f7SAndroid Build Coastguard Worker   InstX86Movmsk &operator=(const InstX86Movmsk &) = delete;
1305*03ce13f7SAndroid Build Coastguard Worker 
1306*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1307*03ce13f7SAndroid Build Coastguard Worker   static InstX86Movmsk *create(Cfg *Func, Variable *Dest, Operand *Source) {
1308*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Movmsk>())
1309*03ce13f7SAndroid Build Coastguard Worker         InstX86Movmsk(Func, Dest, Source);
1310*03ce13f7SAndroid Build Coastguard Worker   }
1311*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1312*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1313*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)1314*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
1315*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Movmsk);
1316*03ce13f7SAndroid Build Coastguard Worker   }
1317*03ce13f7SAndroid Build Coastguard Worker 
1318*03ce13f7SAndroid Build Coastguard Worker private:
1319*03ce13f7SAndroid Build Coastguard Worker   InstX86Movmsk(Cfg *Func, Variable *Dest, Operand *Source);
1320*03ce13f7SAndroid Build Coastguard Worker };
1321*03ce13f7SAndroid Build Coastguard Worker 
1322*03ce13f7SAndroid Build Coastguard Worker class InstX86Sqrt : public InstX86BaseUnaryopXmm<InstX86Base::Sqrt> {
1323*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Src)1324*03ce13f7SAndroid Build Coastguard Worker   static InstX86Sqrt *create(Cfg *Func, Variable *Dest, Operand *Src) {
1325*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Sqrt>()) InstX86Sqrt(Func, Dest, Src);
1326*03ce13f7SAndroid Build Coastguard Worker   }
1327*03ce13f7SAndroid Build Coastguard Worker 
1328*03ce13f7SAndroid Build Coastguard Worker   virtual void emit(const Cfg *Func) const override;
1329*03ce13f7SAndroid Build Coastguard Worker 
1330*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Sqrt(Cfg * Func,Variable * Dest,Operand * Src)1331*03ce13f7SAndroid Build Coastguard Worker   InstX86Sqrt(Cfg *Func, Variable *Dest, Operand *Src)
1332*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseUnaryopXmm<InstX86Base::Sqrt>(Func, Dest, Src) {}
1333*03ce13f7SAndroid Build Coastguard Worker };
1334*03ce13f7SAndroid Build Coastguard Worker 
1335*03ce13f7SAndroid Build Coastguard Worker /// Move/assignment instruction - wrapper for mov/movss/movsd.
1336*03ce13f7SAndroid Build Coastguard Worker class InstX86Mov : public InstX86BaseMovlike<InstX86Base::Mov> {
1337*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1338*03ce13f7SAndroid Build Coastguard Worker   static InstX86Mov *create(Cfg *Func, Variable *Dest, Operand *Source) {
1339*03ce13f7SAndroid Build Coastguard Worker     assert(!isScalarIntegerType(Dest->getType()) ||
1340*03ce13f7SAndroid Build Coastguard Worker            (typeWidthInBytes(Dest->getType()) <=
1341*03ce13f7SAndroid Build Coastguard Worker             typeWidthInBytes(Source->getType())));
1342*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Mov>()) InstX86Mov(Func, Dest, Source);
1343*03ce13f7SAndroid Build Coastguard Worker   }
1344*03ce13f7SAndroid Build Coastguard Worker 
1345*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1346*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1347*03ce13f7SAndroid Build Coastguard Worker 
1348*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Mov(Cfg * Func,Variable * Dest,Operand * Source)1349*03ce13f7SAndroid Build Coastguard Worker   InstX86Mov(Cfg *Func, Variable *Dest, Operand *Source)
1350*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseMovlike<InstX86Base::Mov>(Func, Dest, Source) {}
1351*03ce13f7SAndroid Build Coastguard Worker };
1352*03ce13f7SAndroid Build Coastguard Worker 
1353*03ce13f7SAndroid Build Coastguard Worker /// Move packed - copy 128 bit values between XMM registers, or mem128 and XMM
1354*03ce13f7SAndroid Build Coastguard Worker /// registers.
1355*03ce13f7SAndroid Build Coastguard Worker class InstX86Movp : public InstX86BaseMovlike<InstX86Base::Movp> {
1356*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1357*03ce13f7SAndroid Build Coastguard Worker   static InstX86Movp *create(Cfg *Func, Variable *Dest, Operand *Source) {
1358*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Movp>()) InstX86Movp(Func, Dest, Source);
1359*03ce13f7SAndroid Build Coastguard Worker   }
1360*03ce13f7SAndroid Build Coastguard Worker 
1361*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1362*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1363*03ce13f7SAndroid Build Coastguard Worker 
1364*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Movp(Cfg * Func,Variable * Dest,Operand * Source)1365*03ce13f7SAndroid Build Coastguard Worker   InstX86Movp(Cfg *Func, Variable *Dest, Operand *Source)
1366*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseMovlike<InstX86Base::Movp>(Func, Dest, Source) {}
1367*03ce13f7SAndroid Build Coastguard Worker };
1368*03ce13f7SAndroid Build Coastguard Worker 
1369*03ce13f7SAndroid Build Coastguard Worker /// Movq - copy between XMM registers, or mem64 and XMM registers.
1370*03ce13f7SAndroid Build Coastguard Worker class InstX86Movq : public InstX86BaseMovlike<InstX86Base::Movq> {
1371*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1372*03ce13f7SAndroid Build Coastguard Worker   static InstX86Movq *create(Cfg *Func, Variable *Dest, Operand *Source) {
1373*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Movq>()) InstX86Movq(Func, Dest, Source);
1374*03ce13f7SAndroid Build Coastguard Worker   }
1375*03ce13f7SAndroid Build Coastguard Worker 
1376*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1377*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1378*03ce13f7SAndroid Build Coastguard Worker 
1379*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Movq(Cfg * Func,Variable * Dest,Operand * Source)1380*03ce13f7SAndroid Build Coastguard Worker   InstX86Movq(Cfg *Func, Variable *Dest, Operand *Source)
1381*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseMovlike<InstX86Base::Movq>(Func, Dest, Source) {}
1382*03ce13f7SAndroid Build Coastguard Worker };
1383*03ce13f7SAndroid Build Coastguard Worker 
1384*03ce13f7SAndroid Build Coastguard Worker class InstX86Add : public InstX86BaseBinopGPR<InstX86Base::Add> {
1385*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1386*03ce13f7SAndroid Build Coastguard Worker   static InstX86Add *create(Cfg *Func, Variable *Dest, Operand *Source) {
1387*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Add>()) InstX86Add(Func, Dest, Source);
1388*03ce13f7SAndroid Build Coastguard Worker   }
1389*03ce13f7SAndroid Build Coastguard Worker 
1390*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Add(Cfg * Func,Variable * Dest,Operand * Source)1391*03ce13f7SAndroid Build Coastguard Worker   InstX86Add(Cfg *Func, Variable *Dest, Operand *Source)
1392*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::Add>(Func, Dest, Source) {}
1393*03ce13f7SAndroid Build Coastguard Worker };
1394*03ce13f7SAndroid Build Coastguard Worker 
1395*03ce13f7SAndroid Build Coastguard Worker class InstX86AddRMW : public InstX86BaseBinopRMW<InstX86Base::AddRMW> {
1396*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1397*03ce13f7SAndroid Build Coastguard Worker   static InstX86AddRMW *create(Cfg *Func, X86OperandMem *DestSrc0,
1398*03ce13f7SAndroid Build Coastguard Worker                                Operand *Src1) {
1399*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86AddRMW>())
1400*03ce13f7SAndroid Build Coastguard Worker         InstX86AddRMW(Func, DestSrc0, Src1);
1401*03ce13f7SAndroid Build Coastguard Worker   }
1402*03ce13f7SAndroid Build Coastguard Worker 
1403*03ce13f7SAndroid Build Coastguard Worker private:
InstX86AddRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1404*03ce13f7SAndroid Build Coastguard Worker   InstX86AddRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
1405*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopRMW<InstX86Base::AddRMW>(Func, DestSrc0, Src1) {}
1406*03ce13f7SAndroid Build Coastguard Worker };
1407*03ce13f7SAndroid Build Coastguard Worker 
1408*03ce13f7SAndroid Build Coastguard Worker class InstX86Addps
1409*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Addps, true,
1410*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Packed> {
1411*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1412*03ce13f7SAndroid Build Coastguard Worker   static InstX86Addps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1413*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Addps>())
1414*03ce13f7SAndroid Build Coastguard Worker         InstX86Addps(Func, Dest, Source);
1415*03ce13f7SAndroid Build Coastguard Worker   }
1416*03ce13f7SAndroid Build Coastguard Worker 
1417*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Addps(Cfg * Func,Variable * Dest,Operand * Source)1418*03ce13f7SAndroid Build Coastguard Worker   InstX86Addps(Cfg *Func, Variable *Dest, Operand *Source)
1419*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Addps, true,
1420*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
1421*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1422*03ce13f7SAndroid Build Coastguard Worker };
1423*03ce13f7SAndroid Build Coastguard Worker 
1424*03ce13f7SAndroid Build Coastguard Worker class InstX86Adc : public InstX86BaseBinopGPR<InstX86Base::Adc> {
1425*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1426*03ce13f7SAndroid Build Coastguard Worker   static InstX86Adc *create(Cfg *Func, Variable *Dest, Operand *Source) {
1427*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Adc>()) InstX86Adc(Func, Dest, Source);
1428*03ce13f7SAndroid Build Coastguard Worker   }
1429*03ce13f7SAndroid Build Coastguard Worker 
1430*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Adc(Cfg * Func,Variable * Dest,Operand * Source)1431*03ce13f7SAndroid Build Coastguard Worker   InstX86Adc(Cfg *Func, Variable *Dest, Operand *Source)
1432*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::Adc>(Func, Dest, Source) {}
1433*03ce13f7SAndroid Build Coastguard Worker };
1434*03ce13f7SAndroid Build Coastguard Worker 
1435*03ce13f7SAndroid Build Coastguard Worker class InstX86AdcRMW : public InstX86BaseBinopRMW<InstX86Base::AdcRMW> {
1436*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1437*03ce13f7SAndroid Build Coastguard Worker   static InstX86AdcRMW *create(Cfg *Func, X86OperandMem *DestSrc0,
1438*03ce13f7SAndroid Build Coastguard Worker                                Operand *Src1) {
1439*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86AdcRMW>())
1440*03ce13f7SAndroid Build Coastguard Worker         InstX86AdcRMW(Func, DestSrc0, Src1);
1441*03ce13f7SAndroid Build Coastguard Worker   }
1442*03ce13f7SAndroid Build Coastguard Worker 
1443*03ce13f7SAndroid Build Coastguard Worker private:
InstX86AdcRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1444*03ce13f7SAndroid Build Coastguard Worker   InstX86AdcRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
1445*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopRMW<InstX86Base::AdcRMW>(Func, DestSrc0, Src1) {}
1446*03ce13f7SAndroid Build Coastguard Worker };
1447*03ce13f7SAndroid Build Coastguard Worker 
1448*03ce13f7SAndroid Build Coastguard Worker class InstX86Addss
1449*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Addss, false,
1450*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Scalar> {
1451*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1452*03ce13f7SAndroid Build Coastguard Worker   static InstX86Addss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1453*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Addss>())
1454*03ce13f7SAndroid Build Coastguard Worker         InstX86Addss(Func, Dest, Source);
1455*03ce13f7SAndroid Build Coastguard Worker   }
1456*03ce13f7SAndroid Build Coastguard Worker 
1457*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Addss(Cfg * Func,Variable * Dest,Operand * Source)1458*03ce13f7SAndroid Build Coastguard Worker   InstX86Addss(Cfg *Func, Variable *Dest, Operand *Source)
1459*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Addss, false,
1460*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Scalar>(Func, Dest,
1461*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1462*03ce13f7SAndroid Build Coastguard Worker };
1463*03ce13f7SAndroid Build Coastguard Worker 
1464*03ce13f7SAndroid Build Coastguard Worker class InstX86Padd
1465*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Padd, true,
1466*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
1467*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1468*03ce13f7SAndroid Build Coastguard Worker   static InstX86Padd *create(Cfg *Func, Variable *Dest, Operand *Source) {
1469*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Padd>()) InstX86Padd(Func, Dest, Source);
1470*03ce13f7SAndroid Build Coastguard Worker   }
1471*03ce13f7SAndroid Build Coastguard Worker 
1472*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Padd(Cfg * Func,Variable * Dest,Operand * Source)1473*03ce13f7SAndroid Build Coastguard Worker   InstX86Padd(Cfg *Func, Variable *Dest, Operand *Source)
1474*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Padd, true,
1475*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
1476*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
1477*03ce13f7SAndroid Build Coastguard Worker };
1478*03ce13f7SAndroid Build Coastguard Worker 
1479*03ce13f7SAndroid Build Coastguard Worker class InstX86Padds
1480*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Padds, true,
1481*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
1482*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1483*03ce13f7SAndroid Build Coastguard Worker   static InstX86Padds *create(Cfg *Func, Variable *Dest, Operand *Source) {
1484*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Padds>())
1485*03ce13f7SAndroid Build Coastguard Worker         InstX86Padds(Func, Dest, Source);
1486*03ce13f7SAndroid Build Coastguard Worker   }
1487*03ce13f7SAndroid Build Coastguard Worker 
1488*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Padds(Cfg * Func,Variable * Dest,Operand * Source)1489*03ce13f7SAndroid Build Coastguard Worker   InstX86Padds(Cfg *Func, Variable *Dest, Operand *Source)
1490*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Padds, true,
1491*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
1492*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
1493*03ce13f7SAndroid Build Coastguard Worker };
1494*03ce13f7SAndroid Build Coastguard Worker 
1495*03ce13f7SAndroid Build Coastguard Worker class InstX86Paddus
1496*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Paddus, true,
1497*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
1498*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1499*03ce13f7SAndroid Build Coastguard Worker   static InstX86Paddus *create(Cfg *Func, Variable *Dest, Operand *Source) {
1500*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Paddus>())
1501*03ce13f7SAndroid Build Coastguard Worker         InstX86Paddus(Func, Dest, Source);
1502*03ce13f7SAndroid Build Coastguard Worker   }
1503*03ce13f7SAndroid Build Coastguard Worker 
1504*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Paddus(Cfg * Func,Variable * Dest,Operand * Source)1505*03ce13f7SAndroid Build Coastguard Worker   InstX86Paddus(Cfg *Func, Variable *Dest, Operand *Source)
1506*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Paddus, true,
1507*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
1508*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
1509*03ce13f7SAndroid Build Coastguard Worker };
1510*03ce13f7SAndroid Build Coastguard Worker 
1511*03ce13f7SAndroid Build Coastguard Worker class InstX86Sub : public InstX86BaseBinopGPR<InstX86Base::Sub> {
1512*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1513*03ce13f7SAndroid Build Coastguard Worker   static InstX86Sub *create(Cfg *Func, Variable *Dest, Operand *Source) {
1514*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Sub>()) InstX86Sub(Func, Dest, Source);
1515*03ce13f7SAndroid Build Coastguard Worker   }
1516*03ce13f7SAndroid Build Coastguard Worker 
1517*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Sub(Cfg * Func,Variable * Dest,Operand * Source)1518*03ce13f7SAndroid Build Coastguard Worker   InstX86Sub(Cfg *Func, Variable *Dest, Operand *Source)
1519*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::Sub>(Func, Dest, Source) {}
1520*03ce13f7SAndroid Build Coastguard Worker };
1521*03ce13f7SAndroid Build Coastguard Worker 
1522*03ce13f7SAndroid Build Coastguard Worker class InstX86SubRMW : public InstX86BaseBinopRMW<InstX86Base::SubRMW> {
1523*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1524*03ce13f7SAndroid Build Coastguard Worker   static InstX86SubRMW *create(Cfg *Func, X86OperandMem *DestSrc0,
1525*03ce13f7SAndroid Build Coastguard Worker                                Operand *Src1) {
1526*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86SubRMW>())
1527*03ce13f7SAndroid Build Coastguard Worker         InstX86SubRMW(Func, DestSrc0, Src1);
1528*03ce13f7SAndroid Build Coastguard Worker   }
1529*03ce13f7SAndroid Build Coastguard Worker 
1530*03ce13f7SAndroid Build Coastguard Worker private:
InstX86SubRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1531*03ce13f7SAndroid Build Coastguard Worker   InstX86SubRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
1532*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopRMW<InstX86Base::SubRMW>(Func, DestSrc0, Src1) {}
1533*03ce13f7SAndroid Build Coastguard Worker };
1534*03ce13f7SAndroid Build Coastguard Worker 
1535*03ce13f7SAndroid Build Coastguard Worker class InstX86Subps
1536*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Subps, true,
1537*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Packed> {
1538*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1539*03ce13f7SAndroid Build Coastguard Worker   static InstX86Subps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1540*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Subps>())
1541*03ce13f7SAndroid Build Coastguard Worker         InstX86Subps(Func, Dest, Source);
1542*03ce13f7SAndroid Build Coastguard Worker   }
1543*03ce13f7SAndroid Build Coastguard Worker 
1544*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Subps(Cfg * Func,Variable * Dest,Operand * Source)1545*03ce13f7SAndroid Build Coastguard Worker   InstX86Subps(Cfg *Func, Variable *Dest, Operand *Source)
1546*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Subps, true,
1547*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
1548*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1549*03ce13f7SAndroid Build Coastguard Worker };
1550*03ce13f7SAndroid Build Coastguard Worker 
1551*03ce13f7SAndroid Build Coastguard Worker class InstX86Subss
1552*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Subss, false,
1553*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Scalar> {
1554*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1555*03ce13f7SAndroid Build Coastguard Worker   static InstX86Subss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1556*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Subss>())
1557*03ce13f7SAndroid Build Coastguard Worker         InstX86Subss(Func, Dest, Source);
1558*03ce13f7SAndroid Build Coastguard Worker   }
1559*03ce13f7SAndroid Build Coastguard Worker 
1560*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Subss(Cfg * Func,Variable * Dest,Operand * Source)1561*03ce13f7SAndroid Build Coastguard Worker   InstX86Subss(Cfg *Func, Variable *Dest, Operand *Source)
1562*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Subss, false,
1563*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Scalar>(Func, Dest,
1564*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1565*03ce13f7SAndroid Build Coastguard Worker };
1566*03ce13f7SAndroid Build Coastguard Worker 
1567*03ce13f7SAndroid Build Coastguard Worker class InstX86Sbb : public InstX86BaseBinopGPR<InstX86Base::Sbb> {
1568*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1569*03ce13f7SAndroid Build Coastguard Worker   static InstX86Sbb *create(Cfg *Func, Variable *Dest, Operand *Source) {
1570*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Sbb>()) InstX86Sbb(Func, Dest, Source);
1571*03ce13f7SAndroid Build Coastguard Worker   }
1572*03ce13f7SAndroid Build Coastguard Worker 
1573*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Sbb(Cfg * Func,Variable * Dest,Operand * Source)1574*03ce13f7SAndroid Build Coastguard Worker   InstX86Sbb(Cfg *Func, Variable *Dest, Operand *Source)
1575*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::Sbb>(Func, Dest, Source) {}
1576*03ce13f7SAndroid Build Coastguard Worker };
1577*03ce13f7SAndroid Build Coastguard Worker 
1578*03ce13f7SAndroid Build Coastguard Worker class InstX86SbbRMW : public InstX86BaseBinopRMW<InstX86Base::SbbRMW> {
1579*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1580*03ce13f7SAndroid Build Coastguard Worker   static InstX86SbbRMW *create(Cfg *Func, X86OperandMem *DestSrc0,
1581*03ce13f7SAndroid Build Coastguard Worker                                Operand *Src1) {
1582*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86SbbRMW>())
1583*03ce13f7SAndroid Build Coastguard Worker         InstX86SbbRMW(Func, DestSrc0, Src1);
1584*03ce13f7SAndroid Build Coastguard Worker   }
1585*03ce13f7SAndroid Build Coastguard Worker 
1586*03ce13f7SAndroid Build Coastguard Worker private:
InstX86SbbRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1587*03ce13f7SAndroid Build Coastguard Worker   InstX86SbbRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
1588*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopRMW<InstX86Base::SbbRMW>(Func, DestSrc0, Src1) {}
1589*03ce13f7SAndroid Build Coastguard Worker };
1590*03ce13f7SAndroid Build Coastguard Worker 
1591*03ce13f7SAndroid Build Coastguard Worker class InstX86Psub
1592*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Psub, true,
1593*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
1594*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1595*03ce13f7SAndroid Build Coastguard Worker   static InstX86Psub *create(Cfg *Func, Variable *Dest, Operand *Source) {
1596*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Psub>()) InstX86Psub(Func, Dest, Source);
1597*03ce13f7SAndroid Build Coastguard Worker   }
1598*03ce13f7SAndroid Build Coastguard Worker 
1599*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Psub(Cfg * Func,Variable * Dest,Operand * Source)1600*03ce13f7SAndroid Build Coastguard Worker   InstX86Psub(Cfg *Func, Variable *Dest, Operand *Source)
1601*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Psub, true,
1602*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
1603*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
1604*03ce13f7SAndroid Build Coastguard Worker };
1605*03ce13f7SAndroid Build Coastguard Worker 
1606*03ce13f7SAndroid Build Coastguard Worker class InstX86Psubs
1607*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Psubs, true,
1608*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
1609*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1610*03ce13f7SAndroid Build Coastguard Worker   static InstX86Psubs *create(Cfg *Func, Variable *Dest, Operand *Source) {
1611*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Psubs>())
1612*03ce13f7SAndroid Build Coastguard Worker         InstX86Psubs(Func, Dest, Source);
1613*03ce13f7SAndroid Build Coastguard Worker   }
1614*03ce13f7SAndroid Build Coastguard Worker 
1615*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Psubs(Cfg * Func,Variable * Dest,Operand * Source)1616*03ce13f7SAndroid Build Coastguard Worker   InstX86Psubs(Cfg *Func, Variable *Dest, Operand *Source)
1617*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Psubs, true,
1618*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
1619*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
1620*03ce13f7SAndroid Build Coastguard Worker };
1621*03ce13f7SAndroid Build Coastguard Worker 
1622*03ce13f7SAndroid Build Coastguard Worker class InstX86Psubus
1623*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Psubus, true,
1624*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
1625*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1626*03ce13f7SAndroid Build Coastguard Worker   static InstX86Psubus *create(Cfg *Func, Variable *Dest, Operand *Source) {
1627*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Psubus>())
1628*03ce13f7SAndroid Build Coastguard Worker         InstX86Psubus(Func, Dest, Source);
1629*03ce13f7SAndroid Build Coastguard Worker   }
1630*03ce13f7SAndroid Build Coastguard Worker 
1631*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Psubus(Cfg * Func,Variable * Dest,Operand * Source)1632*03ce13f7SAndroid Build Coastguard Worker   InstX86Psubus(Cfg *Func, Variable *Dest, Operand *Source)
1633*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Psubus, true,
1634*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
1635*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
1636*03ce13f7SAndroid Build Coastguard Worker };
1637*03ce13f7SAndroid Build Coastguard Worker 
1638*03ce13f7SAndroid Build Coastguard Worker class InstX86And : public InstX86BaseBinopGPR<InstX86Base::And> {
1639*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1640*03ce13f7SAndroid Build Coastguard Worker   static InstX86And *create(Cfg *Func, Variable *Dest, Operand *Source) {
1641*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86And>()) InstX86And(Func, Dest, Source);
1642*03ce13f7SAndroid Build Coastguard Worker   }
1643*03ce13f7SAndroid Build Coastguard Worker 
1644*03ce13f7SAndroid Build Coastguard Worker private:
InstX86And(Cfg * Func,Variable * Dest,Operand * Source)1645*03ce13f7SAndroid Build Coastguard Worker   InstX86And(Cfg *Func, Variable *Dest, Operand *Source)
1646*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::And>(Func, Dest, Source) {}
1647*03ce13f7SAndroid Build Coastguard Worker };
1648*03ce13f7SAndroid Build Coastguard Worker 
1649*03ce13f7SAndroid Build Coastguard Worker class InstX86Andnps
1650*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Andnps, true,
1651*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Packed> {
1652*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1653*03ce13f7SAndroid Build Coastguard Worker   static InstX86Andnps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1654*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Andnps>())
1655*03ce13f7SAndroid Build Coastguard Worker         InstX86Andnps(Func, Dest, Source);
1656*03ce13f7SAndroid Build Coastguard Worker   }
1657*03ce13f7SAndroid Build Coastguard Worker 
1658*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Andnps(Cfg * Func,Variable * Dest,Operand * Source)1659*03ce13f7SAndroid Build Coastguard Worker   InstX86Andnps(Cfg *Func, Variable *Dest, Operand *Source)
1660*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Andnps, true,
1661*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
1662*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1663*03ce13f7SAndroid Build Coastguard Worker };
1664*03ce13f7SAndroid Build Coastguard Worker 
1665*03ce13f7SAndroid Build Coastguard Worker class InstX86Andps
1666*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Andps, true,
1667*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Packed> {
1668*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1669*03ce13f7SAndroid Build Coastguard Worker   static InstX86Andps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1670*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Andps>())
1671*03ce13f7SAndroid Build Coastguard Worker         InstX86Andps(Func, Dest, Source);
1672*03ce13f7SAndroid Build Coastguard Worker   }
1673*03ce13f7SAndroid Build Coastguard Worker 
1674*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Andps(Cfg * Func,Variable * Dest,Operand * Source)1675*03ce13f7SAndroid Build Coastguard Worker   InstX86Andps(Cfg *Func, Variable *Dest, Operand *Source)
1676*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Andps, true,
1677*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
1678*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1679*03ce13f7SAndroid Build Coastguard Worker };
1680*03ce13f7SAndroid Build Coastguard Worker 
1681*03ce13f7SAndroid Build Coastguard Worker class InstX86AndRMW : public InstX86BaseBinopRMW<InstX86Base::AndRMW> {
1682*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1683*03ce13f7SAndroid Build Coastguard Worker   static InstX86AndRMW *create(Cfg *Func, X86OperandMem *DestSrc0,
1684*03ce13f7SAndroid Build Coastguard Worker                                Operand *Src1) {
1685*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86AndRMW>())
1686*03ce13f7SAndroid Build Coastguard Worker         InstX86AndRMW(Func, DestSrc0, Src1);
1687*03ce13f7SAndroid Build Coastguard Worker   }
1688*03ce13f7SAndroid Build Coastguard Worker 
1689*03ce13f7SAndroid Build Coastguard Worker private:
InstX86AndRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1690*03ce13f7SAndroid Build Coastguard Worker   InstX86AndRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
1691*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopRMW<InstX86Base::AndRMW>(Func, DestSrc0, Src1) {}
1692*03ce13f7SAndroid Build Coastguard Worker };
1693*03ce13f7SAndroid Build Coastguard Worker 
1694*03ce13f7SAndroid Build Coastguard Worker class InstX86Pand : public InstX86BaseBinopXmm<InstX86Base::Pand, false,
1695*03ce13f7SAndroid Build Coastguard Worker                                                InstX86Base::SseSuffix::None> {
1696*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1697*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pand *create(Cfg *Func, Variable *Dest, Operand *Source) {
1698*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pand>()) InstX86Pand(Func, Dest, Source);
1699*03ce13f7SAndroid Build Coastguard Worker   }
1700*03ce13f7SAndroid Build Coastguard Worker 
1701*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pand(Cfg * Func,Variable * Dest,Operand * Source)1702*03ce13f7SAndroid Build Coastguard Worker   InstX86Pand(Cfg *Func, Variable *Dest, Operand *Source)
1703*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pand, false,
1704*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
1705*03ce13f7SAndroid Build Coastguard Worker };
1706*03ce13f7SAndroid Build Coastguard Worker 
1707*03ce13f7SAndroid Build Coastguard Worker class InstX86Pandn : public InstX86BaseBinopXmm<InstX86Base::Pandn, false,
1708*03ce13f7SAndroid Build Coastguard Worker                                                 InstX86Base::SseSuffix::None> {
1709*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1710*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pandn *create(Cfg *Func, Variable *Dest, Operand *Source) {
1711*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pandn>())
1712*03ce13f7SAndroid Build Coastguard Worker         InstX86Pandn(Func, Dest, Source);
1713*03ce13f7SAndroid Build Coastguard Worker   }
1714*03ce13f7SAndroid Build Coastguard Worker 
1715*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pandn(Cfg * Func,Variable * Dest,Operand * Source)1716*03ce13f7SAndroid Build Coastguard Worker   InstX86Pandn(Cfg *Func, Variable *Dest, Operand *Source)
1717*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pandn, false,
1718*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
1719*03ce13f7SAndroid Build Coastguard Worker };
1720*03ce13f7SAndroid Build Coastguard Worker 
1721*03ce13f7SAndroid Build Coastguard Worker class InstX86Maxss
1722*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Maxss, true,
1723*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Scalar> {
1724*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1725*03ce13f7SAndroid Build Coastguard Worker   static InstX86Maxss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1726*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Maxss>())
1727*03ce13f7SAndroid Build Coastguard Worker         InstX86Maxss(Func, Dest, Source);
1728*03ce13f7SAndroid Build Coastguard Worker   }
1729*03ce13f7SAndroid Build Coastguard Worker 
1730*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Maxss(Cfg * Func,Variable * Dest,Operand * Source)1731*03ce13f7SAndroid Build Coastguard Worker   InstX86Maxss(Cfg *Func, Variable *Dest, Operand *Source)
1732*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Maxss, true,
1733*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Scalar>(Func, Dest,
1734*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1735*03ce13f7SAndroid Build Coastguard Worker };
1736*03ce13f7SAndroid Build Coastguard Worker 
1737*03ce13f7SAndroid Build Coastguard Worker class InstX86Minss
1738*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Minss, true,
1739*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Scalar> {
1740*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1741*03ce13f7SAndroid Build Coastguard Worker   static InstX86Minss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1742*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Minss>())
1743*03ce13f7SAndroid Build Coastguard Worker         InstX86Minss(Func, Dest, Source);
1744*03ce13f7SAndroid Build Coastguard Worker   }
1745*03ce13f7SAndroid Build Coastguard Worker 
1746*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Minss(Cfg * Func,Variable * Dest,Operand * Source)1747*03ce13f7SAndroid Build Coastguard Worker   InstX86Minss(Cfg *Func, Variable *Dest, Operand *Source)
1748*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Minss, true,
1749*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Scalar>(Func, Dest,
1750*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1751*03ce13f7SAndroid Build Coastguard Worker };
1752*03ce13f7SAndroid Build Coastguard Worker 
1753*03ce13f7SAndroid Build Coastguard Worker class InstX86Maxps : public InstX86BaseBinopXmm<InstX86Base::Maxps, true,
1754*03ce13f7SAndroid Build Coastguard Worker                                                 InstX86Base::SseSuffix::None> {
1755*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1756*03ce13f7SAndroid Build Coastguard Worker   static InstX86Maxps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1757*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Maxps>())
1758*03ce13f7SAndroid Build Coastguard Worker         InstX86Maxps(Func, Dest, Source);
1759*03ce13f7SAndroid Build Coastguard Worker   }
1760*03ce13f7SAndroid Build Coastguard Worker 
1761*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Maxps(Cfg * Func,Variable * Dest,Operand * Source)1762*03ce13f7SAndroid Build Coastguard Worker   InstX86Maxps(Cfg *Func, Variable *Dest, Operand *Source)
1763*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Maxps, true,
1764*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
1765*03ce13f7SAndroid Build Coastguard Worker };
1766*03ce13f7SAndroid Build Coastguard Worker 
1767*03ce13f7SAndroid Build Coastguard Worker class InstX86Minps : public InstX86BaseBinopXmm<InstX86Base::Minps, true,
1768*03ce13f7SAndroid Build Coastguard Worker                                                 InstX86Base::SseSuffix::None> {
1769*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1770*03ce13f7SAndroid Build Coastguard Worker   static InstX86Minps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1771*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Minps>())
1772*03ce13f7SAndroid Build Coastguard Worker         InstX86Minps(Func, Dest, Source);
1773*03ce13f7SAndroid Build Coastguard Worker   }
1774*03ce13f7SAndroid Build Coastguard Worker 
1775*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Minps(Cfg * Func,Variable * Dest,Operand * Source)1776*03ce13f7SAndroid Build Coastguard Worker   InstX86Minps(Cfg *Func, Variable *Dest, Operand *Source)
1777*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Minps, true,
1778*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
1779*03ce13f7SAndroid Build Coastguard Worker };
1780*03ce13f7SAndroid Build Coastguard Worker 
1781*03ce13f7SAndroid Build Coastguard Worker class InstX86Or : public InstX86BaseBinopGPR<InstX86Base::Or> {
1782*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1783*03ce13f7SAndroid Build Coastguard Worker   static InstX86Or *create(Cfg *Func, Variable *Dest, Operand *Source) {
1784*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Or>()) InstX86Or(Func, Dest, Source);
1785*03ce13f7SAndroid Build Coastguard Worker   }
1786*03ce13f7SAndroid Build Coastguard Worker 
1787*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Or(Cfg * Func,Variable * Dest,Operand * Source)1788*03ce13f7SAndroid Build Coastguard Worker   InstX86Or(Cfg *Func, Variable *Dest, Operand *Source)
1789*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::Or>(Func, Dest, Source) {}
1790*03ce13f7SAndroid Build Coastguard Worker };
1791*03ce13f7SAndroid Build Coastguard Worker 
1792*03ce13f7SAndroid Build Coastguard Worker class InstX86Orps : public InstX86BaseBinopXmm<InstX86Base::Orps, true,
1793*03ce13f7SAndroid Build Coastguard Worker                                                InstX86Base::SseSuffix::Packed> {
1794*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1795*03ce13f7SAndroid Build Coastguard Worker   static InstX86Orps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1796*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Orps>()) InstX86Orps(Func, Dest, Source);
1797*03ce13f7SAndroid Build Coastguard Worker   }
1798*03ce13f7SAndroid Build Coastguard Worker 
1799*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Orps(Cfg * Func,Variable * Dest,Operand * Source)1800*03ce13f7SAndroid Build Coastguard Worker   InstX86Orps(Cfg *Func, Variable *Dest, Operand *Source)
1801*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Orps, true,
1802*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
1803*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1804*03ce13f7SAndroid Build Coastguard Worker };
1805*03ce13f7SAndroid Build Coastguard Worker 
1806*03ce13f7SAndroid Build Coastguard Worker class InstX86OrRMW : public InstX86BaseBinopRMW<InstX86Base::OrRMW> {
1807*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1808*03ce13f7SAndroid Build Coastguard Worker   static InstX86OrRMW *create(Cfg *Func, X86OperandMem *DestSrc0,
1809*03ce13f7SAndroid Build Coastguard Worker                               Operand *Src1) {
1810*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86OrRMW>())
1811*03ce13f7SAndroid Build Coastguard Worker         InstX86OrRMW(Func, DestSrc0, Src1);
1812*03ce13f7SAndroid Build Coastguard Worker   }
1813*03ce13f7SAndroid Build Coastguard Worker 
1814*03ce13f7SAndroid Build Coastguard Worker private:
InstX86OrRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1815*03ce13f7SAndroid Build Coastguard Worker   InstX86OrRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
1816*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopRMW<InstX86Base::OrRMW>(Func, DestSrc0, Src1) {}
1817*03ce13f7SAndroid Build Coastguard Worker };
1818*03ce13f7SAndroid Build Coastguard Worker 
1819*03ce13f7SAndroid Build Coastguard Worker class InstX86Por : public InstX86BaseBinopXmm<InstX86Base::Por, false,
1820*03ce13f7SAndroid Build Coastguard Worker                                               InstX86Base::SseSuffix::None> {
1821*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1822*03ce13f7SAndroid Build Coastguard Worker   static InstX86Por *create(Cfg *Func, Variable *Dest, Operand *Source) {
1823*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Por>()) InstX86Por(Func, Dest, Source);
1824*03ce13f7SAndroid Build Coastguard Worker   }
1825*03ce13f7SAndroid Build Coastguard Worker 
1826*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Por(Cfg * Func,Variable * Dest,Operand * Source)1827*03ce13f7SAndroid Build Coastguard Worker   InstX86Por(Cfg *Func, Variable *Dest, Operand *Source)
1828*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Por, false,
1829*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
1830*03ce13f7SAndroid Build Coastguard Worker };
1831*03ce13f7SAndroid Build Coastguard Worker 
1832*03ce13f7SAndroid Build Coastguard Worker class InstX86Xor : public InstX86BaseBinopGPR<InstX86Base::Xor> {
1833*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1834*03ce13f7SAndroid Build Coastguard Worker   static InstX86Xor *create(Cfg *Func, Variable *Dest, Operand *Source) {
1835*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Xor>()) InstX86Xor(Func, Dest, Source);
1836*03ce13f7SAndroid Build Coastguard Worker   }
1837*03ce13f7SAndroid Build Coastguard Worker 
1838*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Xor(Cfg * Func,Variable * Dest,Operand * Source)1839*03ce13f7SAndroid Build Coastguard Worker   InstX86Xor(Cfg *Func, Variable *Dest, Operand *Source)
1840*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::Xor>(Func, Dest, Source) {}
1841*03ce13f7SAndroid Build Coastguard Worker };
1842*03ce13f7SAndroid Build Coastguard Worker 
1843*03ce13f7SAndroid Build Coastguard Worker class InstX86Xorps
1844*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Xorps, true,
1845*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Packed> {
1846*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1847*03ce13f7SAndroid Build Coastguard Worker   static InstX86Xorps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1848*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Xorps>())
1849*03ce13f7SAndroid Build Coastguard Worker         InstX86Xorps(Func, Dest, Source);
1850*03ce13f7SAndroid Build Coastguard Worker   }
1851*03ce13f7SAndroid Build Coastguard Worker 
1852*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Xorps(Cfg * Func,Variable * Dest,Operand * Source)1853*03ce13f7SAndroid Build Coastguard Worker   InstX86Xorps(Cfg *Func, Variable *Dest, Operand *Source)
1854*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Xorps, true,
1855*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
1856*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1857*03ce13f7SAndroid Build Coastguard Worker };
1858*03ce13f7SAndroid Build Coastguard Worker 
1859*03ce13f7SAndroid Build Coastguard Worker class InstX86XorRMW : public InstX86BaseBinopRMW<InstX86Base::XorRMW> {
1860*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1861*03ce13f7SAndroid Build Coastguard Worker   static InstX86XorRMW *create(Cfg *Func, X86OperandMem *DestSrc0,
1862*03ce13f7SAndroid Build Coastguard Worker                                Operand *Src1) {
1863*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86XorRMW>())
1864*03ce13f7SAndroid Build Coastguard Worker         InstX86XorRMW(Func, DestSrc0, Src1);
1865*03ce13f7SAndroid Build Coastguard Worker   }
1866*03ce13f7SAndroid Build Coastguard Worker 
1867*03ce13f7SAndroid Build Coastguard Worker private:
InstX86XorRMW(Cfg * Func,X86OperandMem * DestSrc0,Operand * Src1)1868*03ce13f7SAndroid Build Coastguard Worker   InstX86XorRMW(Cfg *Func, X86OperandMem *DestSrc0, Operand *Src1)
1869*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopRMW<InstX86Base::XorRMW>(Func, DestSrc0, Src1) {}
1870*03ce13f7SAndroid Build Coastguard Worker };
1871*03ce13f7SAndroid Build Coastguard Worker 
1872*03ce13f7SAndroid Build Coastguard Worker class InstX86Pxor : public InstX86BaseBinopXmm<InstX86Base::Pxor, false,
1873*03ce13f7SAndroid Build Coastguard Worker                                                InstX86Base::SseSuffix::None> {
1874*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1875*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pxor *create(Cfg *Func, Variable *Dest, Operand *Source) {
1876*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pxor>()) InstX86Pxor(Func, Dest, Source);
1877*03ce13f7SAndroid Build Coastguard Worker   }
1878*03ce13f7SAndroid Build Coastguard Worker 
1879*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pxor(Cfg * Func,Variable * Dest,Operand * Source)1880*03ce13f7SAndroid Build Coastguard Worker   InstX86Pxor(Cfg *Func, Variable *Dest, Operand *Source)
1881*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pxor, false,
1882*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
1883*03ce13f7SAndroid Build Coastguard Worker };
1884*03ce13f7SAndroid Build Coastguard Worker 
1885*03ce13f7SAndroid Build Coastguard Worker class InstX86Imul : public InstX86BaseBinopGPR<InstX86Base::Imul> {
1886*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1887*03ce13f7SAndroid Build Coastguard Worker   static InstX86Imul *create(Cfg *Func, Variable *Dest, Operand *Source) {
1888*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Imul>()) InstX86Imul(Func, Dest, Source);
1889*03ce13f7SAndroid Build Coastguard Worker   }
1890*03ce13f7SAndroid Build Coastguard Worker 
1891*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1892*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1893*03ce13f7SAndroid Build Coastguard Worker 
1894*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Imul(Cfg * Func,Variable * Dest,Operand * Source)1895*03ce13f7SAndroid Build Coastguard Worker   InstX86Imul(Cfg *Func, Variable *Dest, Operand *Source)
1896*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPR<InstX86Base::Imul>(Func, Dest, Source) {}
1897*03ce13f7SAndroid Build Coastguard Worker };
1898*03ce13f7SAndroid Build Coastguard Worker 
1899*03ce13f7SAndroid Build Coastguard Worker class InstX86ImulImm : public InstX86BaseThreeAddressop<InstX86Base::ImulImm> {
1900*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source0,Operand * Source1)1901*03ce13f7SAndroid Build Coastguard Worker   static InstX86ImulImm *create(Cfg *Func, Variable *Dest, Operand *Source0,
1902*03ce13f7SAndroid Build Coastguard Worker                                 Operand *Source1) {
1903*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86ImulImm>())
1904*03ce13f7SAndroid Build Coastguard Worker         InstX86ImulImm(Func, Dest, Source0, Source1);
1905*03ce13f7SAndroid Build Coastguard Worker   }
1906*03ce13f7SAndroid Build Coastguard Worker 
1907*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
1908*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
1909*03ce13f7SAndroid Build Coastguard Worker 
1910*03ce13f7SAndroid Build Coastguard Worker private:
InstX86ImulImm(Cfg * Func,Variable * Dest,Operand * Source0,Operand * Source1)1911*03ce13f7SAndroid Build Coastguard Worker   InstX86ImulImm(Cfg *Func, Variable *Dest, Operand *Source0, Operand *Source1)
1912*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseThreeAddressop<InstX86Base::ImulImm>(Func, Dest, Source0,
1913*03ce13f7SAndroid Build Coastguard Worker                                                         Source1) {}
1914*03ce13f7SAndroid Build Coastguard Worker };
1915*03ce13f7SAndroid Build Coastguard Worker 
1916*03ce13f7SAndroid Build Coastguard Worker class InstX86Mulps
1917*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Mulps, true,
1918*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Packed> {
1919*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1920*03ce13f7SAndroid Build Coastguard Worker   static InstX86Mulps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1921*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Mulps>())
1922*03ce13f7SAndroid Build Coastguard Worker         InstX86Mulps(Func, Dest, Source);
1923*03ce13f7SAndroid Build Coastguard Worker   }
1924*03ce13f7SAndroid Build Coastguard Worker 
1925*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Mulps(Cfg * Func,Variable * Dest,Operand * Source)1926*03ce13f7SAndroid Build Coastguard Worker   InstX86Mulps(Cfg *Func, Variable *Dest, Operand *Source)
1927*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Mulps, true,
1928*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
1929*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1930*03ce13f7SAndroid Build Coastguard Worker };
1931*03ce13f7SAndroid Build Coastguard Worker 
1932*03ce13f7SAndroid Build Coastguard Worker class InstX86Mulss
1933*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Mulss, false,
1934*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Scalar> {
1935*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1936*03ce13f7SAndroid Build Coastguard Worker   static InstX86Mulss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1937*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Mulss>())
1938*03ce13f7SAndroid Build Coastguard Worker         InstX86Mulss(Func, Dest, Source);
1939*03ce13f7SAndroid Build Coastguard Worker   }
1940*03ce13f7SAndroid Build Coastguard Worker 
1941*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Mulss(Cfg * Func,Variable * Dest,Operand * Source)1942*03ce13f7SAndroid Build Coastguard Worker   InstX86Mulss(Cfg *Func, Variable *Dest, Operand *Source)
1943*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Mulss, false,
1944*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Scalar>(Func, Dest,
1945*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
1946*03ce13f7SAndroid Build Coastguard Worker };
1947*03ce13f7SAndroid Build Coastguard Worker 
1948*03ce13f7SAndroid Build Coastguard Worker class InstX86Pmull
1949*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Pmull, true,
1950*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
1951*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1952*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pmull *create(Cfg *Func, Variable *Dest, Operand *Source) {
1953*03ce13f7SAndroid Build Coastguard Worker     bool TypesAreValid =
1954*03ce13f7SAndroid Build Coastguard Worker         Dest->getType() == IceType_v4i32 || Dest->getType() == IceType_v8i16;
1955*03ce13f7SAndroid Build Coastguard Worker     bool InstructionSetIsValid =
1956*03ce13f7SAndroid Build Coastguard Worker         Dest->getType() == IceType_v8i16 || getInstructionSet(Func) >= SSE4_1;
1957*03ce13f7SAndroid Build Coastguard Worker     (void)TypesAreValid;
1958*03ce13f7SAndroid Build Coastguard Worker     (void)InstructionSetIsValid;
1959*03ce13f7SAndroid Build Coastguard Worker     assert(TypesAreValid);
1960*03ce13f7SAndroid Build Coastguard Worker     assert(InstructionSetIsValid);
1961*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pmull>())
1962*03ce13f7SAndroid Build Coastguard Worker         InstX86Pmull(Func, Dest, Source);
1963*03ce13f7SAndroid Build Coastguard Worker   }
1964*03ce13f7SAndroid Build Coastguard Worker 
1965*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pmull(Cfg * Func,Variable * Dest,Operand * Source)1966*03ce13f7SAndroid Build Coastguard Worker   InstX86Pmull(Cfg *Func, Variable *Dest, Operand *Source)
1967*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pmull, true,
1968*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
1969*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
1970*03ce13f7SAndroid Build Coastguard Worker };
1971*03ce13f7SAndroid Build Coastguard Worker 
1972*03ce13f7SAndroid Build Coastguard Worker class InstX86Pmulhw : public InstX86BaseBinopXmm<InstX86Base::Pmulhw, false,
1973*03ce13f7SAndroid Build Coastguard Worker                                                  InstX86Base::SseSuffix::None> {
1974*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1975*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pmulhw *create(Cfg *Func, Variable *Dest, Operand *Source) {
1976*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() == IceType_v8i16 &&
1977*03ce13f7SAndroid Build Coastguard Worker            Source->getType() == IceType_v8i16);
1978*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pmulhw>())
1979*03ce13f7SAndroid Build Coastguard Worker         InstX86Pmulhw(Func, Dest, Source);
1980*03ce13f7SAndroid Build Coastguard Worker   }
1981*03ce13f7SAndroid Build Coastguard Worker 
1982*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pmulhw(Cfg * Func,Variable * Dest,Operand * Source)1983*03ce13f7SAndroid Build Coastguard Worker   InstX86Pmulhw(Cfg *Func, Variable *Dest, Operand *Source)
1984*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pmulhw, false,
1985*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
1986*03ce13f7SAndroid Build Coastguard Worker };
1987*03ce13f7SAndroid Build Coastguard Worker 
1988*03ce13f7SAndroid Build Coastguard Worker class InstX86Pmulhuw
1989*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Pmulhuw, false,
1990*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::None> {
1991*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)1992*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pmulhuw *create(Cfg *Func, Variable *Dest, Operand *Source) {
1993*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() == IceType_v8i16 &&
1994*03ce13f7SAndroid Build Coastguard Worker            Source->getType() == IceType_v8i16);
1995*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pmulhuw>())
1996*03ce13f7SAndroid Build Coastguard Worker         InstX86Pmulhuw(Func, Dest, Source);
1997*03ce13f7SAndroid Build Coastguard Worker   }
1998*03ce13f7SAndroid Build Coastguard Worker 
1999*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pmulhuw(Cfg * Func,Variable * Dest,Operand * Source)2000*03ce13f7SAndroid Build Coastguard Worker   InstX86Pmulhuw(Cfg *Func, Variable *Dest, Operand *Source)
2001*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pmulhuw, false,
2002*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
2003*03ce13f7SAndroid Build Coastguard Worker };
2004*03ce13f7SAndroid Build Coastguard Worker 
2005*03ce13f7SAndroid Build Coastguard Worker class InstX86Pmaddwd
2006*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Pmaddwd, false,
2007*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::None> {
2008*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2009*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pmaddwd *create(Cfg *Func, Variable *Dest, Operand *Source) {
2010*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() == IceType_v8i16 &&
2011*03ce13f7SAndroid Build Coastguard Worker            Source->getType() == IceType_v8i16);
2012*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pmaddwd>())
2013*03ce13f7SAndroid Build Coastguard Worker         InstX86Pmaddwd(Func, Dest, Source);
2014*03ce13f7SAndroid Build Coastguard Worker   }
2015*03ce13f7SAndroid Build Coastguard Worker 
2016*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pmaddwd(Cfg * Func,Variable * Dest,Operand * Source)2017*03ce13f7SAndroid Build Coastguard Worker   InstX86Pmaddwd(Cfg *Func, Variable *Dest, Operand *Source)
2018*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pmaddwd, false,
2019*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
2020*03ce13f7SAndroid Build Coastguard Worker };
2021*03ce13f7SAndroid Build Coastguard Worker 
2022*03ce13f7SAndroid Build Coastguard Worker class InstX86Pmuludq
2023*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Pmuludq, false,
2024*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::None> {
2025*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2026*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pmuludq *create(Cfg *Func, Variable *Dest, Operand *Source) {
2027*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() == IceType_v4i32 &&
2028*03ce13f7SAndroid Build Coastguard Worker            Source->getType() == IceType_v4i32);
2029*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pmuludq>())
2030*03ce13f7SAndroid Build Coastguard Worker         InstX86Pmuludq(Func, Dest, Source);
2031*03ce13f7SAndroid Build Coastguard Worker   }
2032*03ce13f7SAndroid Build Coastguard Worker 
2033*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pmuludq(Cfg * Func,Variable * Dest,Operand * Source)2034*03ce13f7SAndroid Build Coastguard Worker   InstX86Pmuludq(Cfg *Func, Variable *Dest, Operand *Source)
2035*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pmuludq, false,
2036*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
2037*03ce13f7SAndroid Build Coastguard Worker };
2038*03ce13f7SAndroid Build Coastguard Worker 
2039*03ce13f7SAndroid Build Coastguard Worker class InstX86Divps
2040*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Divps, true,
2041*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Packed> {
2042*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2043*03ce13f7SAndroid Build Coastguard Worker   static InstX86Divps *create(Cfg *Func, Variable *Dest, Operand *Source) {
2044*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Divps>())
2045*03ce13f7SAndroid Build Coastguard Worker         InstX86Divps(Func, Dest, Source);
2046*03ce13f7SAndroid Build Coastguard Worker   }
2047*03ce13f7SAndroid Build Coastguard Worker 
2048*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Divps(Cfg * Func,Variable * Dest,Operand * Source)2049*03ce13f7SAndroid Build Coastguard Worker   InstX86Divps(Cfg *Func, Variable *Dest, Operand *Source)
2050*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Divps, true,
2051*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Packed>(Func, Dest,
2052*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
2053*03ce13f7SAndroid Build Coastguard Worker };
2054*03ce13f7SAndroid Build Coastguard Worker 
2055*03ce13f7SAndroid Build Coastguard Worker class InstX86Divss
2056*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Divss, false,
2057*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Scalar> {
2058*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2059*03ce13f7SAndroid Build Coastguard Worker   static InstX86Divss *create(Cfg *Func, Variable *Dest, Operand *Source) {
2060*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Divss>())
2061*03ce13f7SAndroid Build Coastguard Worker         InstX86Divss(Func, Dest, Source);
2062*03ce13f7SAndroid Build Coastguard Worker   }
2063*03ce13f7SAndroid Build Coastguard Worker 
2064*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Divss(Cfg * Func,Variable * Dest,Operand * Source)2065*03ce13f7SAndroid Build Coastguard Worker   InstX86Divss(Cfg *Func, Variable *Dest, Operand *Source)
2066*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Divss, false,
2067*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Scalar>(Func, Dest,
2068*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
2069*03ce13f7SAndroid Build Coastguard Worker };
2070*03ce13f7SAndroid Build Coastguard Worker 
2071*03ce13f7SAndroid Build Coastguard Worker class InstX86Rol : public InstX86BaseBinopGPRShift<InstX86Base::Rol> {
2072*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2073*03ce13f7SAndroid Build Coastguard Worker   static InstX86Rol *create(Cfg *Func, Variable *Dest, Operand *Source) {
2074*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Rol>()) InstX86Rol(Func, Dest, Source);
2075*03ce13f7SAndroid Build Coastguard Worker   }
2076*03ce13f7SAndroid Build Coastguard Worker 
2077*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Rol(Cfg * Func,Variable * Dest,Operand * Source)2078*03ce13f7SAndroid Build Coastguard Worker   InstX86Rol(Cfg *Func, Variable *Dest, Operand *Source)
2079*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPRShift<InstX86Base::Rol>(Func, Dest, Source) {}
2080*03ce13f7SAndroid Build Coastguard Worker };
2081*03ce13f7SAndroid Build Coastguard Worker 
2082*03ce13f7SAndroid Build Coastguard Worker class InstX86Shl : public InstX86BaseBinopGPRShift<InstX86Base::Shl> {
2083*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2084*03ce13f7SAndroid Build Coastguard Worker   static InstX86Shl *create(Cfg *Func, Variable *Dest, Operand *Source) {
2085*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Shl>()) InstX86Shl(Func, Dest, Source);
2086*03ce13f7SAndroid Build Coastguard Worker   }
2087*03ce13f7SAndroid Build Coastguard Worker 
2088*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Shl(Cfg * Func,Variable * Dest,Operand * Source)2089*03ce13f7SAndroid Build Coastguard Worker   InstX86Shl(Cfg *Func, Variable *Dest, Operand *Source)
2090*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPRShift<InstX86Base::Shl>(Func, Dest, Source) {}
2091*03ce13f7SAndroid Build Coastguard Worker };
2092*03ce13f7SAndroid Build Coastguard Worker 
2093*03ce13f7SAndroid Build Coastguard Worker class InstX86Psll : public InstX86BaseBinopXmmShift<InstX86Base::Psll> {
2094*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2095*03ce13f7SAndroid Build Coastguard Worker   static InstX86Psll *create(Cfg *Func, Variable *Dest, Operand *Source) {
2096*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() == IceType_v8i16 ||
2097*03ce13f7SAndroid Build Coastguard Worker            Dest->getType() == IceType_v8i1 ||
2098*03ce13f7SAndroid Build Coastguard Worker            Dest->getType() == IceType_v4i32 || Dest->getType() == IceType_v4i1);
2099*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Psll>()) InstX86Psll(Func, Dest, Source);
2100*03ce13f7SAndroid Build Coastguard Worker   }
2101*03ce13f7SAndroid Build Coastguard Worker 
2102*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Psll(Cfg * Func,Variable * Dest,Operand * Source)2103*03ce13f7SAndroid Build Coastguard Worker   InstX86Psll(Cfg *Func, Variable *Dest, Operand *Source)
2104*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmmShift<InstX86Base::Psll>(Func, Dest, Source) {}
2105*03ce13f7SAndroid Build Coastguard Worker };
2106*03ce13f7SAndroid Build Coastguard Worker 
2107*03ce13f7SAndroid Build Coastguard Worker class InstX86Psrl : public InstX86BaseBinopXmmShift<InstX86Base::Psrl, true> {
2108*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2109*03ce13f7SAndroid Build Coastguard Worker   static InstX86Psrl *create(Cfg *Func, Variable *Dest, Operand *Source) {
2110*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Psrl>()) InstX86Psrl(Func, Dest, Source);
2111*03ce13f7SAndroid Build Coastguard Worker   }
2112*03ce13f7SAndroid Build Coastguard Worker 
2113*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Psrl(Cfg * Func,Variable * Dest,Operand * Source)2114*03ce13f7SAndroid Build Coastguard Worker   InstX86Psrl(Cfg *Func, Variable *Dest, Operand *Source)
2115*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmmShift<InstX86Base::Psrl, true>(Func, Dest, Source) {}
2116*03ce13f7SAndroid Build Coastguard Worker };
2117*03ce13f7SAndroid Build Coastguard Worker 
2118*03ce13f7SAndroid Build Coastguard Worker class InstX86Shr : public InstX86BaseBinopGPRShift<InstX86Base::Shr> {
2119*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2120*03ce13f7SAndroid Build Coastguard Worker   static InstX86Shr *create(Cfg *Func, Variable *Dest, Operand *Source) {
2121*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Shr>()) InstX86Shr(Func, Dest, Source);
2122*03ce13f7SAndroid Build Coastguard Worker   }
2123*03ce13f7SAndroid Build Coastguard Worker 
2124*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Shr(Cfg * Func,Variable * Dest,Operand * Source)2125*03ce13f7SAndroid Build Coastguard Worker   InstX86Shr(Cfg *Func, Variable *Dest, Operand *Source)
2126*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPRShift<InstX86Base::Shr>(Func, Dest, Source) {}
2127*03ce13f7SAndroid Build Coastguard Worker };
2128*03ce13f7SAndroid Build Coastguard Worker 
2129*03ce13f7SAndroid Build Coastguard Worker class InstX86Sar : public InstX86BaseBinopGPRShift<InstX86Base::Sar> {
2130*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2131*03ce13f7SAndroid Build Coastguard Worker   static InstX86Sar *create(Cfg *Func, Variable *Dest, Operand *Source) {
2132*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Sar>()) InstX86Sar(Func, Dest, Source);
2133*03ce13f7SAndroid Build Coastguard Worker   }
2134*03ce13f7SAndroid Build Coastguard Worker 
2135*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Sar(Cfg * Func,Variable * Dest,Operand * Source)2136*03ce13f7SAndroid Build Coastguard Worker   InstX86Sar(Cfg *Func, Variable *Dest, Operand *Source)
2137*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopGPRShift<InstX86Base::Sar>(Func, Dest, Source) {}
2138*03ce13f7SAndroid Build Coastguard Worker };
2139*03ce13f7SAndroid Build Coastguard Worker 
2140*03ce13f7SAndroid Build Coastguard Worker class InstX86Psra : public InstX86BaseBinopXmmShift<InstX86Base::Psra> {
2141*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2142*03ce13f7SAndroid Build Coastguard Worker   static InstX86Psra *create(Cfg *Func, Variable *Dest, Operand *Source) {
2143*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() == IceType_v8i16 ||
2144*03ce13f7SAndroid Build Coastguard Worker            Dest->getType() == IceType_v8i1 ||
2145*03ce13f7SAndroid Build Coastguard Worker            Dest->getType() == IceType_v4i32 || Dest->getType() == IceType_v4i1);
2146*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Psra>()) InstX86Psra(Func, Dest, Source);
2147*03ce13f7SAndroid Build Coastguard Worker   }
2148*03ce13f7SAndroid Build Coastguard Worker 
2149*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Psra(Cfg * Func,Variable * Dest,Operand * Source)2150*03ce13f7SAndroid Build Coastguard Worker   InstX86Psra(Cfg *Func, Variable *Dest, Operand *Source)
2151*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmmShift<InstX86Base::Psra>(Func, Dest, Source) {}
2152*03ce13f7SAndroid Build Coastguard Worker };
2153*03ce13f7SAndroid Build Coastguard Worker 
2154*03ce13f7SAndroid Build Coastguard Worker class InstX86Pcmpeq
2155*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Pcmpeq, true,
2156*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
2157*03ce13f7SAndroid Build Coastguard Worker public:
2158*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source,
2159*03ce13f7SAndroid Build Coastguard Worker                                Type ArithmeticTypeOverride = IceType_void) {
2160*03ce13f7SAndroid Build Coastguard Worker     const Type Ty = ArithmeticTypeOverride == IceType_void
2161*03ce13f7SAndroid Build Coastguard Worker                         ? Dest->getType()
2162*03ce13f7SAndroid Build Coastguard Worker                         : ArithmeticTypeOverride;
2163*03ce13f7SAndroid Build Coastguard Worker     (void)Ty;
2164*03ce13f7SAndroid Build Coastguard Worker     assert((Ty != IceType_f64 && Ty != IceType_i64) ||
2165*03ce13f7SAndroid Build Coastguard Worker            getInstructionSet(Func) >= SSE4_1);
2166*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pcmpeq>())
2167*03ce13f7SAndroid Build Coastguard Worker         InstX86Pcmpeq(Func, Dest, Source, ArithmeticTypeOverride);
2168*03ce13f7SAndroid Build Coastguard Worker   }
2169*03ce13f7SAndroid Build Coastguard Worker 
2170*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pcmpeq(Cfg * Func,Variable * Dest,Operand * Source,Type ArithmeticTypeOverride)2171*03ce13f7SAndroid Build Coastguard Worker   InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source,
2172*03ce13f7SAndroid Build Coastguard Worker                 Type ArithmeticTypeOverride)
2173*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pcmpeq, true,
2174*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(
2175*03ce13f7SAndroid Build Coastguard Worker             Func, Dest, Source, ArithmeticTypeOverride) {}
2176*03ce13f7SAndroid Build Coastguard Worker };
2177*03ce13f7SAndroid Build Coastguard Worker 
2178*03ce13f7SAndroid Build Coastguard Worker class InstX86Pcmpgt
2179*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Pcmpgt, true,
2180*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Integral> {
2181*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2182*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) {
2183*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() != IceType_f64 || getInstructionSet(Func) >= SSE4_1);
2184*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pcmpgt>())
2185*03ce13f7SAndroid Build Coastguard Worker         InstX86Pcmpgt(Func, Dest, Source);
2186*03ce13f7SAndroid Build Coastguard Worker   }
2187*03ce13f7SAndroid Build Coastguard Worker 
2188*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pcmpgt(Cfg * Func,Variable * Dest,Operand * Source)2189*03ce13f7SAndroid Build Coastguard Worker   InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source)
2190*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pcmpgt, true,
2191*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Integral>(Func, Dest,
2192*03ce13f7SAndroid Build Coastguard Worker                                                               Source) {}
2193*03ce13f7SAndroid Build Coastguard Worker };
2194*03ce13f7SAndroid Build Coastguard Worker 
2195*03ce13f7SAndroid Build Coastguard Worker /// movss is only a binary operation when the source and dest operands are
2196*03ce13f7SAndroid Build Coastguard Worker /// both registers (the high bits of dest are left untouched). In other cases,
2197*03ce13f7SAndroid Build Coastguard Worker /// it behaves like a copy (mov-like) operation (and the high bits of dest are
2198*03ce13f7SAndroid Build Coastguard Worker /// cleared). InstX86Movss will assert that both its source and dest operands
2199*03ce13f7SAndroid Build Coastguard Worker /// are registers, so the lowering code should use _mov instead of _movss in
2200*03ce13f7SAndroid Build Coastguard Worker /// cases where a copy operation is intended.
2201*03ce13f7SAndroid Build Coastguard Worker class InstX86MovssRegs
2202*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::MovssRegs, false,
2203*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::None> {
2204*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)2205*03ce13f7SAndroid Build Coastguard Worker   static InstX86MovssRegs *create(Cfg *Func, Variable *Dest, Operand *Source) {
2206*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86MovssRegs>())
2207*03ce13f7SAndroid Build Coastguard Worker         InstX86MovssRegs(Func, Dest, Source);
2208*03ce13f7SAndroid Build Coastguard Worker   }
2209*03ce13f7SAndroid Build Coastguard Worker 
2210*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2211*03ce13f7SAndroid Build Coastguard Worker 
2212*03ce13f7SAndroid Build Coastguard Worker private:
InstX86MovssRegs(Cfg * Func,Variable * Dest,Operand * Source)2213*03ce13f7SAndroid Build Coastguard Worker   InstX86MovssRegs(Cfg *Func, Variable *Dest, Operand *Source)
2214*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::MovssRegs, false,
2215*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
2216*03ce13f7SAndroid Build Coastguard Worker };
2217*03ce13f7SAndroid Build Coastguard Worker 
2218*03ce13f7SAndroid Build Coastguard Worker class InstX86Idiv : public InstX86BaseTernop<InstX86Base::Idiv> {
2219*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2220*03ce13f7SAndroid Build Coastguard Worker   static InstX86Idiv *create(Cfg *Func, Variable *Dest, Operand *Source1,
2221*03ce13f7SAndroid Build Coastguard Worker                              Operand *Source2) {
2222*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Idiv>())
2223*03ce13f7SAndroid Build Coastguard Worker         InstX86Idiv(Func, Dest, Source1, Source2);
2224*03ce13f7SAndroid Build Coastguard Worker   }
2225*03ce13f7SAndroid Build Coastguard Worker 
2226*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2227*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2228*03ce13f7SAndroid Build Coastguard Worker 
2229*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Idiv(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2230*03ce13f7SAndroid Build Coastguard Worker   InstX86Idiv(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
2231*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseTernop<InstX86Base::Idiv>(Func, Dest, Source1, Source2) {}
2232*03ce13f7SAndroid Build Coastguard Worker };
2233*03ce13f7SAndroid Build Coastguard Worker 
2234*03ce13f7SAndroid Build Coastguard Worker class InstX86Div : public InstX86BaseTernop<InstX86Base::Div> {
2235*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2236*03ce13f7SAndroid Build Coastguard Worker   static InstX86Div *create(Cfg *Func, Variable *Dest, Operand *Source1,
2237*03ce13f7SAndroid Build Coastguard Worker                             Operand *Source2) {
2238*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Div>())
2239*03ce13f7SAndroid Build Coastguard Worker         InstX86Div(Func, Dest, Source1, Source2);
2240*03ce13f7SAndroid Build Coastguard Worker   }
2241*03ce13f7SAndroid Build Coastguard Worker 
2242*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2243*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2244*03ce13f7SAndroid Build Coastguard Worker 
2245*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Div(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2246*03ce13f7SAndroid Build Coastguard Worker   InstX86Div(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
2247*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseTernop<InstX86Base::Div>(Func, Dest, Source1, Source2) {}
2248*03ce13f7SAndroid Build Coastguard Worker };
2249*03ce13f7SAndroid Build Coastguard Worker 
2250*03ce13f7SAndroid Build Coastguard Worker class InstX86Insertps : public InstX86BaseTernop<InstX86Base::Insertps> {
2251*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2252*03ce13f7SAndroid Build Coastguard Worker   static InstX86Insertps *create(Cfg *Func, Variable *Dest, Operand *Source1,
2253*03ce13f7SAndroid Build Coastguard Worker                                  Operand *Source2) {
2254*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Insertps>())
2255*03ce13f7SAndroid Build Coastguard Worker         InstX86Insertps(Func, Dest, Source1, Source2);
2256*03ce13f7SAndroid Build Coastguard Worker   }
2257*03ce13f7SAndroid Build Coastguard Worker 
2258*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2259*03ce13f7SAndroid Build Coastguard Worker 
2260*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Insertps(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2261*03ce13f7SAndroid Build Coastguard Worker   InstX86Insertps(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
2262*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseTernop<InstX86Base::Insertps>(Func, Dest, Source1, Source2) {
2263*03ce13f7SAndroid Build Coastguard Worker   }
2264*03ce13f7SAndroid Build Coastguard Worker };
2265*03ce13f7SAndroid Build Coastguard Worker 
2266*03ce13f7SAndroid Build Coastguard Worker class InstX86Pinsr : public InstX86BaseTernop<InstX86Base::Pinsr> {
2267*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2268*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pinsr *create(Cfg *Func, Variable *Dest, Operand *Source1,
2269*03ce13f7SAndroid Build Coastguard Worker                               Operand *Source2) {
2270*03ce13f7SAndroid Build Coastguard Worker     // pinsrb and pinsrd are SSE4.1 instructions.
2271*03ce13f7SAndroid Build Coastguard Worker     assert(Dest->getType() == IceType_v8i16 ||
2272*03ce13f7SAndroid Build Coastguard Worker            Dest->getType() == IceType_v8i1 ||
2273*03ce13f7SAndroid Build Coastguard Worker            getInstructionSet(Func) >= SSE4_1);
2274*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pinsr>())
2275*03ce13f7SAndroid Build Coastguard Worker         InstX86Pinsr(Func, Dest, Source1, Source2);
2276*03ce13f7SAndroid Build Coastguard Worker   }
2277*03ce13f7SAndroid Build Coastguard Worker 
2278*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2279*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2280*03ce13f7SAndroid Build Coastguard Worker 
2281*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pinsr(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2282*03ce13f7SAndroid Build Coastguard Worker   InstX86Pinsr(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
2283*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseTernop<InstX86Base::Pinsr>(Func, Dest, Source1, Source2) {}
2284*03ce13f7SAndroid Build Coastguard Worker };
2285*03ce13f7SAndroid Build Coastguard Worker 
2286*03ce13f7SAndroid Build Coastguard Worker class InstX86Shufps : public InstX86BaseTernop<InstX86Base::Shufps> {
2287*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2288*03ce13f7SAndroid Build Coastguard Worker   static InstX86Shufps *create(Cfg *Func, Variable *Dest, Operand *Source1,
2289*03ce13f7SAndroid Build Coastguard Worker                                Operand *Source2) {
2290*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Shufps>())
2291*03ce13f7SAndroid Build Coastguard Worker         InstX86Shufps(Func, Dest, Source1, Source2);
2292*03ce13f7SAndroid Build Coastguard Worker   }
2293*03ce13f7SAndroid Build Coastguard Worker 
2294*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2295*03ce13f7SAndroid Build Coastguard Worker 
2296*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Shufps(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2297*03ce13f7SAndroid Build Coastguard Worker   InstX86Shufps(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
2298*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseTernop<InstX86Base::Shufps>(Func, Dest, Source1, Source2) {}
2299*03ce13f7SAndroid Build Coastguard Worker };
2300*03ce13f7SAndroid Build Coastguard Worker 
2301*03ce13f7SAndroid Build Coastguard Worker class InstX86Blendvps : public InstX86BaseTernop<InstX86Base::Blendvps> {
2302*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2303*03ce13f7SAndroid Build Coastguard Worker   static InstX86Blendvps *create(Cfg *Func, Variable *Dest, Operand *Source1,
2304*03ce13f7SAndroid Build Coastguard Worker                                  Operand *Source2) {
2305*03ce13f7SAndroid Build Coastguard Worker     assert(getInstructionSet(Func) >= SSE4_1);
2306*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Blendvps>())
2307*03ce13f7SAndroid Build Coastguard Worker         InstX86Blendvps(Func, Dest, Source1, Source2);
2308*03ce13f7SAndroid Build Coastguard Worker   }
2309*03ce13f7SAndroid Build Coastguard Worker 
2310*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2311*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Fund) const override;
2312*03ce13f7SAndroid Build Coastguard Worker 
2313*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Blendvps(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2314*03ce13f7SAndroid Build Coastguard Worker   InstX86Blendvps(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
2315*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseTernop<InstX86Base::Blendvps>(Func, Dest, Source1, Source2) {
2316*03ce13f7SAndroid Build Coastguard Worker   }
2317*03ce13f7SAndroid Build Coastguard Worker };
2318*03ce13f7SAndroid Build Coastguard Worker 
2319*03ce13f7SAndroid Build Coastguard Worker class InstX86Pblendvb : public InstX86BaseTernop<InstX86Base::Pblendvb> {
2320*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2321*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pblendvb *create(Cfg *Func, Variable *Dest, Operand *Source1,
2322*03ce13f7SAndroid Build Coastguard Worker                                  Operand *Source2) {
2323*03ce13f7SAndroid Build Coastguard Worker     assert(getInstructionSet(Func) >= SSE4_1);
2324*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pblendvb>())
2325*03ce13f7SAndroid Build Coastguard Worker         InstX86Pblendvb(Func, Dest, Source1, Source2);
2326*03ce13f7SAndroid Build Coastguard Worker   }
2327*03ce13f7SAndroid Build Coastguard Worker 
2328*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2329*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2330*03ce13f7SAndroid Build Coastguard Worker 
2331*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pblendvb(Cfg * Func,Variable * Dest,Operand * Source1,Operand * Source2)2332*03ce13f7SAndroid Build Coastguard Worker   InstX86Pblendvb(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2)
2333*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseTernop<InstX86Base::Pblendvb>(Func, Dest, Source1, Source2) {
2334*03ce13f7SAndroid Build Coastguard Worker   }
2335*03ce13f7SAndroid Build Coastguard Worker };
2336*03ce13f7SAndroid Build Coastguard Worker 
2337*03ce13f7SAndroid Build Coastguard Worker class InstX86Pextr : public InstX86BaseThreeAddressop<InstX86Base::Pextr> {
2338*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source0,Operand * Source1)2339*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pextr *create(Cfg *Func, Variable *Dest, Operand *Source0,
2340*03ce13f7SAndroid Build Coastguard Worker                               Operand *Source1) {
2341*03ce13f7SAndroid Build Coastguard Worker     assert(Source0->getType() == IceType_v8i16 ||
2342*03ce13f7SAndroid Build Coastguard Worker            Source0->getType() == IceType_v8i1 ||
2343*03ce13f7SAndroid Build Coastguard Worker            getInstructionSet(Func) >= SSE4_1);
2344*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pextr>())
2345*03ce13f7SAndroid Build Coastguard Worker         InstX86Pextr(Func, Dest, Source0, Source1);
2346*03ce13f7SAndroid Build Coastguard Worker   }
2347*03ce13f7SAndroid Build Coastguard Worker 
2348*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2349*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2350*03ce13f7SAndroid Build Coastguard Worker 
2351*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pextr(Cfg * Func,Variable * Dest,Operand * Source0,Operand * Source1)2352*03ce13f7SAndroid Build Coastguard Worker   InstX86Pextr(Cfg *Func, Variable *Dest, Operand *Source0, Operand *Source1)
2353*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseThreeAddressop<InstX86Base::Pextr>(Func, Dest, Source0,
2354*03ce13f7SAndroid Build Coastguard Worker                                                       Source1) {}
2355*03ce13f7SAndroid Build Coastguard Worker };
2356*03ce13f7SAndroid Build Coastguard Worker 
2357*03ce13f7SAndroid Build Coastguard Worker class InstX86Pshufd : public InstX86BaseThreeAddressop<InstX86Base::Pshufd> {
2358*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source0,Operand * Source1)2359*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pshufd *create(Cfg *Func, Variable *Dest, Operand *Source0,
2360*03ce13f7SAndroid Build Coastguard Worker                                Operand *Source1) {
2361*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pshufd>())
2362*03ce13f7SAndroid Build Coastguard Worker         InstX86Pshufd(Func, Dest, Source0, Source1);
2363*03ce13f7SAndroid Build Coastguard Worker   }
2364*03ce13f7SAndroid Build Coastguard Worker 
2365*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2366*03ce13f7SAndroid Build Coastguard Worker 
2367*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pshufd(Cfg * Func,Variable * Dest,Operand * Source0,Operand * Source1)2368*03ce13f7SAndroid Build Coastguard Worker   InstX86Pshufd(Cfg *Func, Variable *Dest, Operand *Source0, Operand *Source1)
2369*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseThreeAddressop<InstX86Base::Pshufd>(Func, Dest, Source0,
2370*03ce13f7SAndroid Build Coastguard Worker                                                        Source1) {}
2371*03ce13f7SAndroid Build Coastguard Worker };
2372*03ce13f7SAndroid Build Coastguard Worker 
2373*03ce13f7SAndroid Build Coastguard Worker /// Base class for a lockable x86-32 instruction (emits a locked prefix).
2374*03ce13f7SAndroid Build Coastguard Worker class InstX86BaseLockable : public InstX86Base {
2375*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseLockable() = delete;
2376*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseLockable(const InstX86BaseLockable &) = delete;
2377*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseLockable &operator=(const InstX86BaseLockable &) = delete;
2378*03ce13f7SAndroid Build Coastguard Worker 
2379*03ce13f7SAndroid Build Coastguard Worker protected:
2380*03ce13f7SAndroid Build Coastguard Worker   bool Locked;
2381*03ce13f7SAndroid Build Coastguard Worker 
InstX86BaseLockable(Cfg * Func,typename InstX86Base::InstKindX86 Kind,SizeT Maxsrcs,Variable * Dest,bool Locked)2382*03ce13f7SAndroid Build Coastguard Worker   InstX86BaseLockable(Cfg *Func, typename InstX86Base::InstKindX86 Kind,
2383*03ce13f7SAndroid Build Coastguard Worker                       SizeT Maxsrcs, Variable *Dest, bool Locked)
2384*03ce13f7SAndroid Build Coastguard Worker       : InstX86Base(Func, Kind, Maxsrcs, Dest), Locked(Locked) {
2385*03ce13f7SAndroid Build Coastguard Worker     // Assume that such instructions are used for Atomics and be careful with
2386*03ce13f7SAndroid Build Coastguard Worker     // optimizations.
2387*03ce13f7SAndroid Build Coastguard Worker     this->HasSideEffects = Locked;
2388*03ce13f7SAndroid Build Coastguard Worker   }
2389*03ce13f7SAndroid Build Coastguard Worker };
2390*03ce13f7SAndroid Build Coastguard Worker 
2391*03ce13f7SAndroid Build Coastguard Worker /// Mul instruction - unsigned multiply.
2392*03ce13f7SAndroid Build Coastguard Worker class InstX86Mul final : public InstX86Base {
2393*03ce13f7SAndroid Build Coastguard Worker   InstX86Mul() = delete;
2394*03ce13f7SAndroid Build Coastguard Worker   InstX86Mul(const InstX86Mul &) = delete;
2395*03ce13f7SAndroid Build Coastguard Worker   InstX86Mul &operator=(const InstX86Mul &) = delete;
2396*03ce13f7SAndroid Build Coastguard Worker 
2397*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Variable * Source1,Operand * Source2)2398*03ce13f7SAndroid Build Coastguard Worker   static InstX86Mul *create(Cfg *Func, Variable *Dest, Variable *Source1,
2399*03ce13f7SAndroid Build Coastguard Worker                             Operand *Source2) {
2400*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Mul>())
2401*03ce13f7SAndroid Build Coastguard Worker         InstX86Mul(Func, Dest, Source1, Source2);
2402*03ce13f7SAndroid Build Coastguard Worker   }
2403*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2404*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2405*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2406*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2407*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Mul);
2408*03ce13f7SAndroid Build Coastguard Worker   }
2409*03ce13f7SAndroid Build Coastguard Worker 
2410*03ce13f7SAndroid Build Coastguard Worker private:
2411*03ce13f7SAndroid Build Coastguard Worker   InstX86Mul(Cfg *Func, Variable *Dest, Variable *Source1, Operand *Source2);
2412*03ce13f7SAndroid Build Coastguard Worker };
2413*03ce13f7SAndroid Build Coastguard Worker 
2414*03ce13f7SAndroid Build Coastguard Worker /// Shld instruction - shift across a pair of operands.
2415*03ce13f7SAndroid Build Coastguard Worker class InstX86Shld final : public InstX86Base {
2416*03ce13f7SAndroid Build Coastguard Worker   InstX86Shld() = delete;
2417*03ce13f7SAndroid Build Coastguard Worker   InstX86Shld(const InstX86Shld &) = delete;
2418*03ce13f7SAndroid Build Coastguard Worker   InstX86Shld &operator=(const InstX86Shld &) = delete;
2419*03ce13f7SAndroid Build Coastguard Worker 
2420*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Variable * Source1,Operand * Source2)2421*03ce13f7SAndroid Build Coastguard Worker   static InstX86Shld *create(Cfg *Func, Variable *Dest, Variable *Source1,
2422*03ce13f7SAndroid Build Coastguard Worker                              Operand *Source2) {
2423*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Shld>())
2424*03ce13f7SAndroid Build Coastguard Worker         InstX86Shld(Func, Dest, Source1, Source2);
2425*03ce13f7SAndroid Build Coastguard Worker   }
2426*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2427*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2428*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2429*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2430*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Shld);
2431*03ce13f7SAndroid Build Coastguard Worker   }
2432*03ce13f7SAndroid Build Coastguard Worker 
2433*03ce13f7SAndroid Build Coastguard Worker private:
2434*03ce13f7SAndroid Build Coastguard Worker   InstX86Shld(Cfg *Func, Variable *Dest, Variable *Source1, Operand *Source2);
2435*03ce13f7SAndroid Build Coastguard Worker };
2436*03ce13f7SAndroid Build Coastguard Worker 
2437*03ce13f7SAndroid Build Coastguard Worker /// Shrd instruction - shift across a pair of operands.
2438*03ce13f7SAndroid Build Coastguard Worker class InstX86Shrd final : public InstX86Base {
2439*03ce13f7SAndroid Build Coastguard Worker   InstX86Shrd() = delete;
2440*03ce13f7SAndroid Build Coastguard Worker   InstX86Shrd(const InstX86Shrd &) = delete;
2441*03ce13f7SAndroid Build Coastguard Worker   InstX86Shrd &operator=(const InstX86Shrd &) = delete;
2442*03ce13f7SAndroid Build Coastguard Worker 
2443*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Variable * Source1,Operand * Source2)2444*03ce13f7SAndroid Build Coastguard Worker   static InstX86Shrd *create(Cfg *Func, Variable *Dest, Variable *Source1,
2445*03ce13f7SAndroid Build Coastguard Worker                              Operand *Source2) {
2446*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Shrd>())
2447*03ce13f7SAndroid Build Coastguard Worker         InstX86Shrd(Func, Dest, Source1, Source2);
2448*03ce13f7SAndroid Build Coastguard Worker   }
2449*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2450*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2451*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2452*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2453*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Shrd);
2454*03ce13f7SAndroid Build Coastguard Worker   }
2455*03ce13f7SAndroid Build Coastguard Worker 
2456*03ce13f7SAndroid Build Coastguard Worker private:
2457*03ce13f7SAndroid Build Coastguard Worker   InstX86Shrd(Cfg *Func, Variable *Dest, Variable *Source1, Operand *Source2);
2458*03ce13f7SAndroid Build Coastguard Worker };
2459*03ce13f7SAndroid Build Coastguard Worker 
2460*03ce13f7SAndroid Build Coastguard Worker /// Conditional move instruction.
2461*03ce13f7SAndroid Build Coastguard Worker class InstX86Cmov final : public InstX86Base {
2462*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmov() = delete;
2463*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmov(const InstX86Cmov &) = delete;
2464*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmov &operator=(const InstX86Cmov &) = delete;
2465*03ce13f7SAndroid Build Coastguard Worker 
2466*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source,BrCond Cond)2467*03ce13f7SAndroid Build Coastguard Worker   static InstX86Cmov *create(Cfg *Func, Variable *Dest, Operand *Source,
2468*03ce13f7SAndroid Build Coastguard Worker                              BrCond Cond) {
2469*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Cmov>())
2470*03ce13f7SAndroid Build Coastguard Worker         InstX86Cmov(Func, Dest, Source, Cond);
2471*03ce13f7SAndroid Build Coastguard Worker   }
2472*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2473*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2474*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2475*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2476*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Cmov);
2477*03ce13f7SAndroid Build Coastguard Worker   }
2478*03ce13f7SAndroid Build Coastguard Worker 
2479*03ce13f7SAndroid Build Coastguard Worker private:
2480*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmov(Cfg *Func, Variable *Dest, Operand *Source, BrCond Cond);
2481*03ce13f7SAndroid Build Coastguard Worker 
2482*03ce13f7SAndroid Build Coastguard Worker   BrCond Condition;
2483*03ce13f7SAndroid Build Coastguard Worker };
2484*03ce13f7SAndroid Build Coastguard Worker 
2485*03ce13f7SAndroid Build Coastguard Worker /// Cmpps instruction - compare packed singled-precision floating point values
2486*03ce13f7SAndroid Build Coastguard Worker class InstX86Cmpps final : public InstX86Base {
2487*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpps() = delete;
2488*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpps(const InstX86Cmpps &) = delete;
2489*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpps &operator=(const InstX86Cmpps &) = delete;
2490*03ce13f7SAndroid Build Coastguard Worker 
2491*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source,CmppsCond Condition)2492*03ce13f7SAndroid Build Coastguard Worker   static InstX86Cmpps *create(Cfg *Func, Variable *Dest, Operand *Source,
2493*03ce13f7SAndroid Build Coastguard Worker                               CmppsCond Condition) {
2494*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Cmpps>())
2495*03ce13f7SAndroid Build Coastguard Worker         InstX86Cmpps(Func, Dest, Source, Condition);
2496*03ce13f7SAndroid Build Coastguard Worker   }
2497*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2498*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2499*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2500*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2501*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Cmpps);
2502*03ce13f7SAndroid Build Coastguard Worker   }
2503*03ce13f7SAndroid Build Coastguard Worker 
2504*03ce13f7SAndroid Build Coastguard Worker private:
2505*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpps(Cfg *Func, Variable *Dest, Operand *Source, CmppsCond Cond);
2506*03ce13f7SAndroid Build Coastguard Worker 
2507*03ce13f7SAndroid Build Coastguard Worker   CmppsCond Condition;
2508*03ce13f7SAndroid Build Coastguard Worker };
2509*03ce13f7SAndroid Build Coastguard Worker 
2510*03ce13f7SAndroid Build Coastguard Worker /// Cmpxchg instruction - cmpxchg <dest>, <desired> will compare if <dest>
2511*03ce13f7SAndroid Build Coastguard Worker /// equals eax. If so, the ZF is set and <desired> is stored in <dest>. If
2512*03ce13f7SAndroid Build Coastguard Worker /// not, ZF is cleared and <dest> is copied to eax (or subregister). <dest>
2513*03ce13f7SAndroid Build Coastguard Worker /// can be a register or memory, while <desired> must be a register. It is
2514*03ce13f7SAndroid Build Coastguard Worker /// the user's responsibility to mark eax with a FakeDef.
2515*03ce13f7SAndroid Build Coastguard Worker class InstX86Cmpxchg final : public InstX86BaseLockable {
2516*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg() = delete;
2517*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg(const InstX86Cmpxchg &) = delete;
2518*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg &operator=(const InstX86Cmpxchg &) = delete;
2519*03ce13f7SAndroid Build Coastguard Worker 
2520*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * DestOrAddr,Variable * Eax,Variable * Desired,bool Locked)2521*03ce13f7SAndroid Build Coastguard Worker   static InstX86Cmpxchg *create(Cfg *Func, Operand *DestOrAddr, Variable *Eax,
2522*03ce13f7SAndroid Build Coastguard Worker                                 Variable *Desired, bool Locked) {
2523*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Cmpxchg>())
2524*03ce13f7SAndroid Build Coastguard Worker         InstX86Cmpxchg(Func, DestOrAddr, Eax, Desired, Locked);
2525*03ce13f7SAndroid Build Coastguard Worker   }
2526*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2527*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2528*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2529*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2530*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Cmpxchg);
2531*03ce13f7SAndroid Build Coastguard Worker   }
2532*03ce13f7SAndroid Build Coastguard Worker 
2533*03ce13f7SAndroid Build Coastguard Worker private:
2534*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg(Cfg *Func, Operand *DestOrAddr, Variable *Eax,
2535*03ce13f7SAndroid Build Coastguard Worker                  Variable *Desired, bool Locked);
2536*03ce13f7SAndroid Build Coastguard Worker };
2537*03ce13f7SAndroid Build Coastguard Worker 
2538*03ce13f7SAndroid Build Coastguard Worker /// Cmpxchg8b instruction - cmpxchg8b <m64> will compare if <m64> equals
2539*03ce13f7SAndroid Build Coastguard Worker /// edx:eax. If so, the ZF is set and ecx:ebx is stored in <m64>. If not, ZF
2540*03ce13f7SAndroid Build Coastguard Worker /// is cleared and <m64> is copied to edx:eax. The caller is responsible for
2541*03ce13f7SAndroid Build Coastguard Worker /// inserting FakeDefs to mark edx and eax as modified. <m64> must be a memory
2542*03ce13f7SAndroid Build Coastguard Worker /// operand.
2543*03ce13f7SAndroid Build Coastguard Worker class InstX86Cmpxchg8b final : public InstX86BaseLockable {
2544*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg8b() = delete;
2545*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg8b(const InstX86Cmpxchg8b &) = delete;
2546*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg8b &operator=(const InstX86Cmpxchg8b &) = delete;
2547*03ce13f7SAndroid Build Coastguard Worker 
2548*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,X86OperandMem * Dest,Variable * Edx,Variable * Eax,Variable * Ecx,Variable * Ebx,bool Locked)2549*03ce13f7SAndroid Build Coastguard Worker   static InstX86Cmpxchg8b *create(Cfg *Func, X86OperandMem *Dest, Variable *Edx,
2550*03ce13f7SAndroid Build Coastguard Worker                                   Variable *Eax, Variable *Ecx, Variable *Ebx,
2551*03ce13f7SAndroid Build Coastguard Worker                                   bool Locked) {
2552*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Cmpxchg8b>())
2553*03ce13f7SAndroid Build Coastguard Worker         InstX86Cmpxchg8b(Func, Dest, Edx, Eax, Ecx, Ebx, Locked);
2554*03ce13f7SAndroid Build Coastguard Worker   }
2555*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2556*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2557*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2558*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2559*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Cmpxchg8b);
2560*03ce13f7SAndroid Build Coastguard Worker   }
2561*03ce13f7SAndroid Build Coastguard Worker 
2562*03ce13f7SAndroid Build Coastguard Worker private:
2563*03ce13f7SAndroid Build Coastguard Worker   InstX86Cmpxchg8b(Cfg *Func, X86OperandMem *Dest, Variable *Edx, Variable *Eax,
2564*03ce13f7SAndroid Build Coastguard Worker                    Variable *Ecx, Variable *Ebx, bool Locked);
2565*03ce13f7SAndroid Build Coastguard Worker };
2566*03ce13f7SAndroid Build Coastguard Worker 
2567*03ce13f7SAndroid Build Coastguard Worker /// Cvt instruction - wrapper for cvtsX2sY where X and Y are in {s,d,i} as
2568*03ce13f7SAndroid Build Coastguard Worker /// appropriate.  s=float, d=double, i=int. X and Y are determined from
2569*03ce13f7SAndroid Build Coastguard Worker /// dest/src types. Sign and zero extension on the integer operand needs to be
2570*03ce13f7SAndroid Build Coastguard Worker /// done separately.
2571*03ce13f7SAndroid Build Coastguard Worker class InstX86Cvt final : public InstX86Base {
2572*03ce13f7SAndroid Build Coastguard Worker   InstX86Cvt() = delete;
2573*03ce13f7SAndroid Build Coastguard Worker   InstX86Cvt(const InstX86Cvt &) = delete;
2574*03ce13f7SAndroid Build Coastguard Worker   InstX86Cvt &operator=(const InstX86Cvt &) = delete;
2575*03ce13f7SAndroid Build Coastguard Worker 
2576*03ce13f7SAndroid Build Coastguard Worker public:
2577*03ce13f7SAndroid Build Coastguard Worker   enum CvtVariant { Si2ss, Tss2si, Ss2si, Float2float, Dq2ps, Tps2dq, Ps2dq };
create(Cfg * Func,Variable * Dest,Operand * Source,CvtVariant Variant)2578*03ce13f7SAndroid Build Coastguard Worker   static InstX86Cvt *create(Cfg *Func, Variable *Dest, Operand *Source,
2579*03ce13f7SAndroid Build Coastguard Worker                             CvtVariant Variant) {
2580*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Cvt>())
2581*03ce13f7SAndroid Build Coastguard Worker         InstX86Cvt(Func, Dest, Source, Variant);
2582*03ce13f7SAndroid Build Coastguard Worker   }
2583*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2584*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2585*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2586*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2587*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Cvt);
2588*03ce13f7SAndroid Build Coastguard Worker   }
isTruncating()2589*03ce13f7SAndroid Build Coastguard Worker   bool isTruncating() const { return Variant == Tss2si || Variant == Tps2dq; }
2590*03ce13f7SAndroid Build Coastguard Worker 
2591*03ce13f7SAndroid Build Coastguard Worker private:
2592*03ce13f7SAndroid Build Coastguard Worker   CvtVariant Variant;
2593*03ce13f7SAndroid Build Coastguard Worker   InstX86Cvt(Cfg *Func, Variable *Dest, Operand *Source, CvtVariant Variant);
2594*03ce13f7SAndroid Build Coastguard Worker };
2595*03ce13f7SAndroid Build Coastguard Worker 
2596*03ce13f7SAndroid Build Coastguard Worker /// Round instruction
2597*03ce13f7SAndroid Build Coastguard Worker class InstX86Round final
2598*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseThreeAddressop<InstX86Base::Round> {
2599*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source,Operand * Imm)2600*03ce13f7SAndroid Build Coastguard Worker   static InstX86Round *create(Cfg *Func, Variable *Dest, Operand *Source,
2601*03ce13f7SAndroid Build Coastguard Worker                               Operand *Imm) {
2602*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Round>())
2603*03ce13f7SAndroid Build Coastguard Worker         InstX86Round(Func, Dest, Source, Imm);
2604*03ce13f7SAndroid Build Coastguard Worker   }
2605*03ce13f7SAndroid Build Coastguard Worker 
2606*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2607*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2608*03ce13f7SAndroid Build Coastguard Worker 
2609*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Round(Cfg * Func,Variable * Dest,Operand * Source,Operand * Imm)2610*03ce13f7SAndroid Build Coastguard Worker   InstX86Round(Cfg *Func, Variable *Dest, Operand *Source, Operand *Imm)
2611*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseThreeAddressop<InstX86Base::Round>(Func, Dest, Source, Imm) {
2612*03ce13f7SAndroid Build Coastguard Worker   }
2613*03ce13f7SAndroid Build Coastguard Worker };
2614*03ce13f7SAndroid Build Coastguard Worker 
2615*03ce13f7SAndroid Build Coastguard Worker /// cmp - Integer compare instruction.
2616*03ce13f7SAndroid Build Coastguard Worker class InstX86Icmp final : public InstX86Base {
2617*03ce13f7SAndroid Build Coastguard Worker   InstX86Icmp() = delete;
2618*03ce13f7SAndroid Build Coastguard Worker   InstX86Icmp(const InstX86Icmp &) = delete;
2619*03ce13f7SAndroid Build Coastguard Worker   InstX86Icmp &operator=(const InstX86Icmp &) = delete;
2620*03ce13f7SAndroid Build Coastguard Worker 
2621*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Src1,Operand * Src2)2622*03ce13f7SAndroid Build Coastguard Worker   static InstX86Icmp *create(Cfg *Func, Operand *Src1, Operand *Src2) {
2623*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Icmp>()) InstX86Icmp(Func, Src1, Src2);
2624*03ce13f7SAndroid Build Coastguard Worker   }
2625*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2626*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2627*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2628*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2629*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Icmp);
2630*03ce13f7SAndroid Build Coastguard Worker   }
2631*03ce13f7SAndroid Build Coastguard Worker 
2632*03ce13f7SAndroid Build Coastguard Worker private:
2633*03ce13f7SAndroid Build Coastguard Worker   InstX86Icmp(Cfg *Func, Operand *Src1, Operand *Src2);
2634*03ce13f7SAndroid Build Coastguard Worker };
2635*03ce13f7SAndroid Build Coastguard Worker 
2636*03ce13f7SAndroid Build Coastguard Worker /// ucomiss/ucomisd - floating-point compare instruction.
2637*03ce13f7SAndroid Build Coastguard Worker class InstX86Ucomiss final : public InstX86Base {
2638*03ce13f7SAndroid Build Coastguard Worker   InstX86Ucomiss() = delete;
2639*03ce13f7SAndroid Build Coastguard Worker   InstX86Ucomiss(const InstX86Ucomiss &) = delete;
2640*03ce13f7SAndroid Build Coastguard Worker   InstX86Ucomiss &operator=(const InstX86Ucomiss &) = delete;
2641*03ce13f7SAndroid Build Coastguard Worker 
2642*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Src1,Operand * Src2)2643*03ce13f7SAndroid Build Coastguard Worker   static InstX86Ucomiss *create(Cfg *Func, Operand *Src1, Operand *Src2) {
2644*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Ucomiss>())
2645*03ce13f7SAndroid Build Coastguard Worker         InstX86Ucomiss(Func, Src1, Src2);
2646*03ce13f7SAndroid Build Coastguard Worker   }
2647*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2648*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2649*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2650*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2651*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Ucomiss);
2652*03ce13f7SAndroid Build Coastguard Worker   }
2653*03ce13f7SAndroid Build Coastguard Worker 
2654*03ce13f7SAndroid Build Coastguard Worker private:
2655*03ce13f7SAndroid Build Coastguard Worker   InstX86Ucomiss(Cfg *Func, Operand *Src1, Operand *Src2);
2656*03ce13f7SAndroid Build Coastguard Worker };
2657*03ce13f7SAndroid Build Coastguard Worker 
2658*03ce13f7SAndroid Build Coastguard Worker /// UD2 instruction.
2659*03ce13f7SAndroid Build Coastguard Worker class InstX86UD2 final : public InstX86Base {
2660*03ce13f7SAndroid Build Coastguard Worker   InstX86UD2() = delete;
2661*03ce13f7SAndroid Build Coastguard Worker   InstX86UD2(const InstX86UD2 &) = delete;
2662*03ce13f7SAndroid Build Coastguard Worker   InstX86UD2 &operator=(const InstX86UD2 &) = delete;
2663*03ce13f7SAndroid Build Coastguard Worker 
2664*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func)2665*03ce13f7SAndroid Build Coastguard Worker   static InstX86UD2 *create(Cfg *Func) {
2666*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86UD2>()) InstX86UD2(Func);
2667*03ce13f7SAndroid Build Coastguard Worker   }
2668*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2669*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2670*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2671*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2672*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::UD2);
2673*03ce13f7SAndroid Build Coastguard Worker   }
2674*03ce13f7SAndroid Build Coastguard Worker 
2675*03ce13f7SAndroid Build Coastguard Worker private:
2676*03ce13f7SAndroid Build Coastguard Worker   explicit InstX86UD2(Cfg *Func);
2677*03ce13f7SAndroid Build Coastguard Worker };
2678*03ce13f7SAndroid Build Coastguard Worker 
2679*03ce13f7SAndroid Build Coastguard Worker /// Int3 instruction.
2680*03ce13f7SAndroid Build Coastguard Worker class InstX86Int3 final : public InstX86Base {
2681*03ce13f7SAndroid Build Coastguard Worker   InstX86Int3() = delete;
2682*03ce13f7SAndroid Build Coastguard Worker   InstX86Int3(const InstX86Int3 &) = delete;
2683*03ce13f7SAndroid Build Coastguard Worker   InstX86Int3 &operator=(const InstX86Int3 &) = delete;
2684*03ce13f7SAndroid Build Coastguard Worker 
2685*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func)2686*03ce13f7SAndroid Build Coastguard Worker   static InstX86Int3 *create(Cfg *Func) {
2687*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Int3>()) InstX86Int3(Func);
2688*03ce13f7SAndroid Build Coastguard Worker   }
2689*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2690*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2691*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2692*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2693*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Int3);
2694*03ce13f7SAndroid Build Coastguard Worker   }
2695*03ce13f7SAndroid Build Coastguard Worker 
2696*03ce13f7SAndroid Build Coastguard Worker private:
2697*03ce13f7SAndroid Build Coastguard Worker   explicit InstX86Int3(Cfg *Func);
2698*03ce13f7SAndroid Build Coastguard Worker };
2699*03ce13f7SAndroid Build Coastguard Worker 
2700*03ce13f7SAndroid Build Coastguard Worker /// Test instruction.
2701*03ce13f7SAndroid Build Coastguard Worker class InstX86Test final : public InstX86Base {
2702*03ce13f7SAndroid Build Coastguard Worker   InstX86Test() = delete;
2703*03ce13f7SAndroid Build Coastguard Worker   InstX86Test(const InstX86Test &) = delete;
2704*03ce13f7SAndroid Build Coastguard Worker   InstX86Test &operator=(const InstX86Test &) = delete;
2705*03ce13f7SAndroid Build Coastguard Worker 
2706*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Source1,Operand * Source2)2707*03ce13f7SAndroid Build Coastguard Worker   static InstX86Test *create(Cfg *Func, Operand *Source1, Operand *Source2) {
2708*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Test>())
2709*03ce13f7SAndroid Build Coastguard Worker         InstX86Test(Func, Source1, Source2);
2710*03ce13f7SAndroid Build Coastguard Worker   }
2711*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2712*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2713*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2714*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2715*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Test);
2716*03ce13f7SAndroid Build Coastguard Worker   }
2717*03ce13f7SAndroid Build Coastguard Worker 
2718*03ce13f7SAndroid Build Coastguard Worker private:
2719*03ce13f7SAndroid Build Coastguard Worker   InstX86Test(Cfg *Func, Operand *Source1, Operand *Source2);
2720*03ce13f7SAndroid Build Coastguard Worker };
2721*03ce13f7SAndroid Build Coastguard Worker 
2722*03ce13f7SAndroid Build Coastguard Worker /// Mfence instruction.
2723*03ce13f7SAndroid Build Coastguard Worker class InstX86Mfence final : public InstX86Base {
2724*03ce13f7SAndroid Build Coastguard Worker   InstX86Mfence() = delete;
2725*03ce13f7SAndroid Build Coastguard Worker   InstX86Mfence(const InstX86Mfence &) = delete;
2726*03ce13f7SAndroid Build Coastguard Worker   InstX86Mfence &operator=(const InstX86Mfence &) = delete;
2727*03ce13f7SAndroid Build Coastguard Worker 
2728*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func)2729*03ce13f7SAndroid Build Coastguard Worker   static InstX86Mfence *create(Cfg *Func) {
2730*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Mfence>()) InstX86Mfence(Func);
2731*03ce13f7SAndroid Build Coastguard Worker   }
2732*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2733*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2734*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2735*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2736*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Mfence);
2737*03ce13f7SAndroid Build Coastguard Worker   }
2738*03ce13f7SAndroid Build Coastguard Worker 
2739*03ce13f7SAndroid Build Coastguard Worker private:
2740*03ce13f7SAndroid Build Coastguard Worker   explicit InstX86Mfence(Cfg *Func);
2741*03ce13f7SAndroid Build Coastguard Worker };
2742*03ce13f7SAndroid Build Coastguard Worker 
2743*03ce13f7SAndroid Build Coastguard Worker /// This is essentially a "mov" instruction with anX86OperandMem operand
2744*03ce13f7SAndroid Build Coastguard Worker /// instead of Variable as the destination. It's important for liveness that
2745*03ce13f7SAndroid Build Coastguard Worker /// there is no Dest operand.
2746*03ce13f7SAndroid Build Coastguard Worker class InstX86Store final : public InstX86Base {
2747*03ce13f7SAndroid Build Coastguard Worker   InstX86Store() = delete;
2748*03ce13f7SAndroid Build Coastguard Worker   InstX86Store(const InstX86Store &) = delete;
2749*03ce13f7SAndroid Build Coastguard Worker   InstX86Store &operator=(const InstX86Store &) = delete;
2750*03ce13f7SAndroid Build Coastguard Worker 
2751*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Value,X86Operand * Mem)2752*03ce13f7SAndroid Build Coastguard Worker   static InstX86Store *create(Cfg *Func, Operand *Value, X86Operand *Mem) {
2753*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Store>()) InstX86Store(Func, Value, Mem);
2754*03ce13f7SAndroid Build Coastguard Worker   }
2755*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2756*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2757*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2758*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2759*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Store);
2760*03ce13f7SAndroid Build Coastguard Worker   }
2761*03ce13f7SAndroid Build Coastguard Worker 
2762*03ce13f7SAndroid Build Coastguard Worker private:
2763*03ce13f7SAndroid Build Coastguard Worker   InstX86Store(Cfg *Func, Operand *Value, X86Operand *Mem);
2764*03ce13f7SAndroid Build Coastguard Worker };
2765*03ce13f7SAndroid Build Coastguard Worker 
2766*03ce13f7SAndroid Build Coastguard Worker /// This is essentially a vector "mov" instruction with an X86OperandMem operand
2767*03ce13f7SAndroid Build Coastguard Worker /// instead of Variable as the destination. It's important for liveness that
2768*03ce13f7SAndroid Build Coastguard Worker /// there is no Dest operand. The source must be an Xmm register, since Dest is
2769*03ce13f7SAndroid Build Coastguard Worker /// mem.
2770*03ce13f7SAndroid Build Coastguard Worker class InstX86StoreP final : public InstX86Base {
2771*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreP() = delete;
2772*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreP(const InstX86StoreP &) = delete;
2773*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreP &operator=(const InstX86StoreP &) = delete;
2774*03ce13f7SAndroid Build Coastguard Worker 
2775*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Value,X86OperandMem * Mem)2776*03ce13f7SAndroid Build Coastguard Worker   static InstX86StoreP *create(Cfg *Func, Variable *Value, X86OperandMem *Mem) {
2777*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86StoreP>())
2778*03ce13f7SAndroid Build Coastguard Worker         InstX86StoreP(Func, Value, Mem);
2779*03ce13f7SAndroid Build Coastguard Worker   }
2780*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2781*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2782*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2783*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2784*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::StoreP);
2785*03ce13f7SAndroid Build Coastguard Worker   }
2786*03ce13f7SAndroid Build Coastguard Worker 
2787*03ce13f7SAndroid Build Coastguard Worker private:
2788*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreP(Cfg *Func, Variable *Value, X86OperandMem *Mem);
2789*03ce13f7SAndroid Build Coastguard Worker };
2790*03ce13f7SAndroid Build Coastguard Worker 
2791*03ce13f7SAndroid Build Coastguard Worker class InstX86StoreQ final : public InstX86Base {
2792*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreQ() = delete;
2793*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreQ(const InstX86StoreQ &) = delete;
2794*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreQ &operator=(const InstX86StoreQ &) = delete;
2795*03ce13f7SAndroid Build Coastguard Worker 
2796*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Value,X86OperandMem * Mem)2797*03ce13f7SAndroid Build Coastguard Worker   static InstX86StoreQ *create(Cfg *Func, Operand *Value, X86OperandMem *Mem) {
2798*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86StoreQ>())
2799*03ce13f7SAndroid Build Coastguard Worker         InstX86StoreQ(Func, Value, Mem);
2800*03ce13f7SAndroid Build Coastguard Worker   }
2801*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2802*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2803*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2804*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2805*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::StoreQ);
2806*03ce13f7SAndroid Build Coastguard Worker   }
2807*03ce13f7SAndroid Build Coastguard Worker 
2808*03ce13f7SAndroid Build Coastguard Worker private:
2809*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreQ(Cfg *Func, Operand *Value, X86OperandMem *Mem);
2810*03ce13f7SAndroid Build Coastguard Worker };
2811*03ce13f7SAndroid Build Coastguard Worker 
2812*03ce13f7SAndroid Build Coastguard Worker class InstX86StoreD final : public InstX86Base {
2813*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreD() = delete;
2814*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreD(const InstX86StoreD &) = delete;
2815*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreD &operator=(const InstX86StoreD &) = delete;
2816*03ce13f7SAndroid Build Coastguard Worker 
2817*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Value,X86OperandMem * Mem)2818*03ce13f7SAndroid Build Coastguard Worker   static InstX86StoreD *create(Cfg *Func, Operand *Value, X86OperandMem *Mem) {
2819*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86StoreD>())
2820*03ce13f7SAndroid Build Coastguard Worker         InstX86StoreD(Func, Value, Mem);
2821*03ce13f7SAndroid Build Coastguard Worker   }
2822*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2823*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2824*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2825*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2826*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::StoreQ);
2827*03ce13f7SAndroid Build Coastguard Worker   }
2828*03ce13f7SAndroid Build Coastguard Worker 
2829*03ce13f7SAndroid Build Coastguard Worker private:
2830*03ce13f7SAndroid Build Coastguard Worker   InstX86StoreD(Cfg *Func, Operand *Value, X86OperandMem *Mem);
2831*03ce13f7SAndroid Build Coastguard Worker };
2832*03ce13f7SAndroid Build Coastguard Worker 
2833*03ce13f7SAndroid Build Coastguard Worker /// Nop instructions of varying length
2834*03ce13f7SAndroid Build Coastguard Worker class InstX86Nop final : public InstX86Base {
2835*03ce13f7SAndroid Build Coastguard Worker   InstX86Nop() = delete;
2836*03ce13f7SAndroid Build Coastguard Worker   InstX86Nop(const InstX86Nop &) = delete;
2837*03ce13f7SAndroid Build Coastguard Worker   InstX86Nop &operator=(const InstX86Nop &) = delete;
2838*03ce13f7SAndroid Build Coastguard Worker 
2839*03ce13f7SAndroid Build Coastguard Worker public:
2840*03ce13f7SAndroid Build Coastguard Worker   // TODO: Replace with enum.
2841*03ce13f7SAndroid Build Coastguard Worker   using NopVariant = unsigned;
2842*03ce13f7SAndroid Build Coastguard Worker 
create(Cfg * Func,NopVariant Variant)2843*03ce13f7SAndroid Build Coastguard Worker   static InstX86Nop *create(Cfg *Func, NopVariant Variant) {
2844*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Nop>()) InstX86Nop(Func, Variant);
2845*03ce13f7SAndroid Build Coastguard Worker   }
2846*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2847*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2848*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2849*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2850*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Nop);
2851*03ce13f7SAndroid Build Coastguard Worker   }
2852*03ce13f7SAndroid Build Coastguard Worker 
2853*03ce13f7SAndroid Build Coastguard Worker private:
2854*03ce13f7SAndroid Build Coastguard Worker   InstX86Nop(Cfg *Func, NopVariant Length);
2855*03ce13f7SAndroid Build Coastguard Worker 
2856*03ce13f7SAndroid Build Coastguard Worker   NopVariant Variant;
2857*03ce13f7SAndroid Build Coastguard Worker };
2858*03ce13f7SAndroid Build Coastguard Worker 
2859*03ce13f7SAndroid Build Coastguard Worker /// Fld - load a value onto the x87 FP stack.
2860*03ce13f7SAndroid Build Coastguard Worker class InstX86Fld final : public InstX86Base {
2861*03ce13f7SAndroid Build Coastguard Worker   InstX86Fld() = delete;
2862*03ce13f7SAndroid Build Coastguard Worker   InstX86Fld(const InstX86Fld &) = delete;
2863*03ce13f7SAndroid Build Coastguard Worker   InstX86Fld &operator=(const InstX86Fld &) = delete;
2864*03ce13f7SAndroid Build Coastguard Worker 
2865*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Src)2866*03ce13f7SAndroid Build Coastguard Worker   static InstX86Fld *create(Cfg *Func, Operand *Src) {
2867*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Fld>()) InstX86Fld(Func, Src);
2868*03ce13f7SAndroid Build Coastguard Worker   }
2869*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2870*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2871*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2872*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2873*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Fld);
2874*03ce13f7SAndroid Build Coastguard Worker   }
2875*03ce13f7SAndroid Build Coastguard Worker 
2876*03ce13f7SAndroid Build Coastguard Worker private:
2877*03ce13f7SAndroid Build Coastguard Worker   InstX86Fld(Cfg *Func, Operand *Src);
2878*03ce13f7SAndroid Build Coastguard Worker };
2879*03ce13f7SAndroid Build Coastguard Worker 
2880*03ce13f7SAndroid Build Coastguard Worker /// Fstp - store x87 st(0) into memory and pop st(0).
2881*03ce13f7SAndroid Build Coastguard Worker class InstX86Fstp final : public InstX86Base {
2882*03ce13f7SAndroid Build Coastguard Worker   InstX86Fstp() = delete;
2883*03ce13f7SAndroid Build Coastguard Worker   InstX86Fstp(const InstX86Fstp &) = delete;
2884*03ce13f7SAndroid Build Coastguard Worker   InstX86Fstp &operator=(const InstX86Fstp &) = delete;
2885*03ce13f7SAndroid Build Coastguard Worker 
2886*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest)2887*03ce13f7SAndroid Build Coastguard Worker   static InstX86Fstp *create(Cfg *Func, Variable *Dest) {
2888*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Fstp>()) InstX86Fstp(Func, Dest);
2889*03ce13f7SAndroid Build Coastguard Worker   }
2890*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2891*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2892*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2893*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2894*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Fstp);
2895*03ce13f7SAndroid Build Coastguard Worker   }
2896*03ce13f7SAndroid Build Coastguard Worker 
2897*03ce13f7SAndroid Build Coastguard Worker private:
2898*03ce13f7SAndroid Build Coastguard Worker   InstX86Fstp(Cfg *Func, Variable *Dest);
2899*03ce13f7SAndroid Build Coastguard Worker };
2900*03ce13f7SAndroid Build Coastguard Worker 
2901*03ce13f7SAndroid Build Coastguard Worker class InstX86Pop final : public InstX86Base {
2902*03ce13f7SAndroid Build Coastguard Worker   InstX86Pop() = delete;
2903*03ce13f7SAndroid Build Coastguard Worker   InstX86Pop(const InstX86Pop &) = delete;
2904*03ce13f7SAndroid Build Coastguard Worker   InstX86Pop &operator=(const InstX86Pop &) = delete;
2905*03ce13f7SAndroid Build Coastguard Worker 
2906*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest)2907*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pop *create(Cfg *Func, Variable *Dest) {
2908*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pop>()) InstX86Pop(Func, Dest);
2909*03ce13f7SAndroid Build Coastguard Worker   }
2910*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2911*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2912*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2913*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2914*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Pop);
2915*03ce13f7SAndroid Build Coastguard Worker   }
2916*03ce13f7SAndroid Build Coastguard Worker 
2917*03ce13f7SAndroid Build Coastguard Worker private:
2918*03ce13f7SAndroid Build Coastguard Worker   InstX86Pop(Cfg *Func, Variable *Dest);
2919*03ce13f7SAndroid Build Coastguard Worker };
2920*03ce13f7SAndroid Build Coastguard Worker 
2921*03ce13f7SAndroid Build Coastguard Worker class InstX86Push final : public InstX86Base {
2922*03ce13f7SAndroid Build Coastguard Worker   InstX86Push() = delete;
2923*03ce13f7SAndroid Build Coastguard Worker   InstX86Push(const InstX86Push &) = delete;
2924*03ce13f7SAndroid Build Coastguard Worker   InstX86Push &operator=(const InstX86Push &) = delete;
2925*03ce13f7SAndroid Build Coastguard Worker 
2926*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Source)2927*03ce13f7SAndroid Build Coastguard Worker   static InstX86Push *create(Cfg *Func, Operand *Source) {
2928*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Push>()) InstX86Push(Func, Source);
2929*03ce13f7SAndroid Build Coastguard Worker   }
2930*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2931*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2932*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2933*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2934*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Push);
2935*03ce13f7SAndroid Build Coastguard Worker   }
2936*03ce13f7SAndroid Build Coastguard Worker 
2937*03ce13f7SAndroid Build Coastguard Worker private:
2938*03ce13f7SAndroid Build Coastguard Worker   InstX86Push(Cfg *Func, Operand *Source);
2939*03ce13f7SAndroid Build Coastguard Worker };
2940*03ce13f7SAndroid Build Coastguard Worker 
2941*03ce13f7SAndroid Build Coastguard Worker /// Ret instruction. Currently only supports the "ret" version that does not
2942*03ce13f7SAndroid Build Coastguard Worker /// pop arguments. This instruction takes a Source operand (for non-void
2943*03ce13f7SAndroid Build Coastguard Worker /// returning functions) for liveness analysis, though a FakeUse before the
2944*03ce13f7SAndroid Build Coastguard Worker /// ret would do just as well.
2945*03ce13f7SAndroid Build Coastguard Worker class InstX86Ret final : public InstX86Base {
2946*03ce13f7SAndroid Build Coastguard Worker   InstX86Ret() = delete;
2947*03ce13f7SAndroid Build Coastguard Worker   InstX86Ret(const InstX86Ret &) = delete;
2948*03ce13f7SAndroid Build Coastguard Worker   InstX86Ret &operator=(const InstX86Ret &) = delete;
2949*03ce13f7SAndroid Build Coastguard Worker 
2950*03ce13f7SAndroid Build Coastguard Worker public:
2951*03ce13f7SAndroid Build Coastguard Worker   static InstX86Ret *create(Cfg *Func, Variable *Source = nullptr) {
2952*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Ret>()) InstX86Ret(Func, Source);
2953*03ce13f7SAndroid Build Coastguard Worker   }
2954*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2955*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2956*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2957*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2958*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Ret);
2959*03ce13f7SAndroid Build Coastguard Worker   }
2960*03ce13f7SAndroid Build Coastguard Worker 
2961*03ce13f7SAndroid Build Coastguard Worker private:
2962*03ce13f7SAndroid Build Coastguard Worker   InstX86Ret(Cfg *Func, Variable *Source);
2963*03ce13f7SAndroid Build Coastguard Worker };
2964*03ce13f7SAndroid Build Coastguard Worker 
2965*03ce13f7SAndroid Build Coastguard Worker /// Conditional set-byte instruction.
2966*03ce13f7SAndroid Build Coastguard Worker class InstX86Setcc final : public InstX86Base {
2967*03ce13f7SAndroid Build Coastguard Worker   InstX86Setcc() = delete;
2968*03ce13f7SAndroid Build Coastguard Worker   InstX86Setcc(const InstX86Cmov &) = delete;
2969*03ce13f7SAndroid Build Coastguard Worker   InstX86Setcc &operator=(const InstX86Setcc &) = delete;
2970*03ce13f7SAndroid Build Coastguard Worker 
2971*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,BrCond Cond)2972*03ce13f7SAndroid Build Coastguard Worker   static InstX86Setcc *create(Cfg *Func, Variable *Dest, BrCond Cond) {
2973*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Setcc>()) InstX86Setcc(Func, Dest, Cond);
2974*03ce13f7SAndroid Build Coastguard Worker   }
2975*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
2976*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
2977*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)2978*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
2979*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Setcc);
2980*03ce13f7SAndroid Build Coastguard Worker   }
2981*03ce13f7SAndroid Build Coastguard Worker 
2982*03ce13f7SAndroid Build Coastguard Worker private:
2983*03ce13f7SAndroid Build Coastguard Worker   InstX86Setcc(Cfg *Func, Variable *Dest, BrCond Cond);
2984*03ce13f7SAndroid Build Coastguard Worker 
2985*03ce13f7SAndroid Build Coastguard Worker   const BrCond Condition;
2986*03ce13f7SAndroid Build Coastguard Worker };
2987*03ce13f7SAndroid Build Coastguard Worker 
2988*03ce13f7SAndroid Build Coastguard Worker /// Exchanging Add instruction. Exchanges the first operand (destination
2989*03ce13f7SAndroid Build Coastguard Worker /// operand) with the second operand (source operand), then loads the sum of
2990*03ce13f7SAndroid Build Coastguard Worker /// the two values into the destination operand. The destination may be a
2991*03ce13f7SAndroid Build Coastguard Worker /// register or memory, while the source must be a register.
2992*03ce13f7SAndroid Build Coastguard Worker ///
2993*03ce13f7SAndroid Build Coastguard Worker /// Both the dest and source are updated. The caller should then insert a
2994*03ce13f7SAndroid Build Coastguard Worker /// FakeDef to reflect the second udpate.
2995*03ce13f7SAndroid Build Coastguard Worker class InstX86Xadd final : public InstX86BaseLockable {
2996*03ce13f7SAndroid Build Coastguard Worker   InstX86Xadd() = delete;
2997*03ce13f7SAndroid Build Coastguard Worker   InstX86Xadd(const InstX86Xadd &) = delete;
2998*03ce13f7SAndroid Build Coastguard Worker   InstX86Xadd &operator=(const InstX86Xadd &) = delete;
2999*03ce13f7SAndroid Build Coastguard Worker 
3000*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Dest,Variable * Source,bool Locked)3001*03ce13f7SAndroid Build Coastguard Worker   static InstX86Xadd *create(Cfg *Func, Operand *Dest, Variable *Source,
3002*03ce13f7SAndroid Build Coastguard Worker                              bool Locked) {
3003*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Xadd>())
3004*03ce13f7SAndroid Build Coastguard Worker         InstX86Xadd(Func, Dest, Source, Locked);
3005*03ce13f7SAndroid Build Coastguard Worker   }
3006*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
3007*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
3008*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)3009*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
3010*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Xadd);
3011*03ce13f7SAndroid Build Coastguard Worker   }
3012*03ce13f7SAndroid Build Coastguard Worker 
3013*03ce13f7SAndroid Build Coastguard Worker private:
3014*03ce13f7SAndroid Build Coastguard Worker   InstX86Xadd(Cfg *Func, Operand *Dest, Variable *Source, bool Locked);
3015*03ce13f7SAndroid Build Coastguard Worker };
3016*03ce13f7SAndroid Build Coastguard Worker 
3017*03ce13f7SAndroid Build Coastguard Worker /// Exchange instruction. Exchanges the first operand (destination operand)
3018*03ce13f7SAndroid Build Coastguard Worker /// with the second operand (source operand). At least one of the operands
3019*03ce13f7SAndroid Build Coastguard Worker /// must be a register (and the other can be reg or mem). Both the Dest and
3020*03ce13f7SAndroid Build Coastguard Worker /// Source are updated. If there is a memory operand, then the instruction is
3021*03ce13f7SAndroid Build Coastguard Worker /// automatically "locked" without the need for a lock prefix.
3022*03ce13f7SAndroid Build Coastguard Worker class InstX86Xchg final : public InstX86Base {
3023*03ce13f7SAndroid Build Coastguard Worker   InstX86Xchg() = delete;
3024*03ce13f7SAndroid Build Coastguard Worker   InstX86Xchg(const InstX86Xchg &) = delete;
3025*03ce13f7SAndroid Build Coastguard Worker   InstX86Xchg &operator=(const InstX86Xchg &) = delete;
3026*03ce13f7SAndroid Build Coastguard Worker 
3027*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Operand * Dest,Variable * Source)3028*03ce13f7SAndroid Build Coastguard Worker   static InstX86Xchg *create(Cfg *Func, Operand *Dest, Variable *Source) {
3029*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Xchg>()) InstX86Xchg(Func, Dest, Source);
3030*03ce13f7SAndroid Build Coastguard Worker   }
3031*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
3032*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
3033*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)3034*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
3035*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::Xchg);
3036*03ce13f7SAndroid Build Coastguard Worker   }
3037*03ce13f7SAndroid Build Coastguard Worker 
3038*03ce13f7SAndroid Build Coastguard Worker private:
3039*03ce13f7SAndroid Build Coastguard Worker   InstX86Xchg(Cfg *Func, Operand *Dest, Variable *Source);
3040*03ce13f7SAndroid Build Coastguard Worker };
3041*03ce13f7SAndroid Build Coastguard Worker 
3042*03ce13f7SAndroid Build Coastguard Worker /// Start marker for the Intel Architecture Code Analyzer. This is not an
3043*03ce13f7SAndroid Build Coastguard Worker /// executable instruction and must only be used for analysis.
3044*03ce13f7SAndroid Build Coastguard Worker class InstX86IacaStart final : public InstX86Base {
3045*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaStart() = delete;
3046*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaStart(const InstX86IacaStart &) = delete;
3047*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaStart &operator=(const InstX86IacaStart &) = delete;
3048*03ce13f7SAndroid Build Coastguard Worker 
3049*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func)3050*03ce13f7SAndroid Build Coastguard Worker   static InstX86IacaStart *create(Cfg *Func) {
3051*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86IacaStart>()) InstX86IacaStart(Func);
3052*03ce13f7SAndroid Build Coastguard Worker   }
3053*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
3054*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
3055*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)3056*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
3057*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::IacaStart);
3058*03ce13f7SAndroid Build Coastguard Worker   }
3059*03ce13f7SAndroid Build Coastguard Worker 
3060*03ce13f7SAndroid Build Coastguard Worker private:
3061*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaStart(Cfg *Func);
3062*03ce13f7SAndroid Build Coastguard Worker };
3063*03ce13f7SAndroid Build Coastguard Worker 
3064*03ce13f7SAndroid Build Coastguard Worker /// End marker for the Intel Architecture Code Analyzer. This is not an
3065*03ce13f7SAndroid Build Coastguard Worker /// executable instruction and must only be used for analysis.
3066*03ce13f7SAndroid Build Coastguard Worker class InstX86IacaEnd final : public InstX86Base {
3067*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaEnd() = delete;
3068*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaEnd(const InstX86IacaEnd &) = delete;
3069*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaEnd &operator=(const InstX86IacaEnd &) = delete;
3070*03ce13f7SAndroid Build Coastguard Worker 
3071*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func)3072*03ce13f7SAndroid Build Coastguard Worker   static InstX86IacaEnd *create(Cfg *Func) {
3073*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86IacaEnd>()) InstX86IacaEnd(Func);
3074*03ce13f7SAndroid Build Coastguard Worker   }
3075*03ce13f7SAndroid Build Coastguard Worker   void emit(const Cfg *Func) const override;
3076*03ce13f7SAndroid Build Coastguard Worker   void emitIAS(const Cfg *Func) const override;
3077*03ce13f7SAndroid Build Coastguard Worker   void dump(const Cfg *Func) const override;
classof(const Inst * Instr)3078*03ce13f7SAndroid Build Coastguard Worker   static bool classof(const Inst *Instr) {
3079*03ce13f7SAndroid Build Coastguard Worker     return InstX86Base::isClassof(Instr, InstX86Base::IacaEnd);
3080*03ce13f7SAndroid Build Coastguard Worker   }
3081*03ce13f7SAndroid Build Coastguard Worker 
3082*03ce13f7SAndroid Build Coastguard Worker private:
3083*03ce13f7SAndroid Build Coastguard Worker   InstX86IacaEnd(Cfg *Func);
3084*03ce13f7SAndroid Build Coastguard Worker };
3085*03ce13f7SAndroid Build Coastguard Worker 
3086*03ce13f7SAndroid Build Coastguard Worker class InstX86Pshufb : public InstX86BaseBinopXmm<InstX86Base::Pshufb, false,
3087*03ce13f7SAndroid Build Coastguard Worker                                                  InstX86Base::SseSuffix::None> {
3088*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)3089*03ce13f7SAndroid Build Coastguard Worker   static InstX86Pshufb *create(Cfg *Func, Variable *Dest, Operand *Source) {
3090*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Pshufb>())
3091*03ce13f7SAndroid Build Coastguard Worker         InstX86Pshufb(Func, Dest, Source);
3092*03ce13f7SAndroid Build Coastguard Worker   }
3093*03ce13f7SAndroid Build Coastguard Worker 
3094*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Pshufb(Cfg * Func,Variable * Dest,Operand * Source)3095*03ce13f7SAndroid Build Coastguard Worker   InstX86Pshufb(Cfg *Func, Variable *Dest, Operand *Source)
3096*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Pshufb, false,
3097*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::None>(Func, Dest, Source) {}
3098*03ce13f7SAndroid Build Coastguard Worker };
3099*03ce13f7SAndroid Build Coastguard Worker 
3100*03ce13f7SAndroid Build Coastguard Worker class InstX86Punpckl
3101*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Punpckl, false,
3102*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Unpack> {
3103*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)3104*03ce13f7SAndroid Build Coastguard Worker   static InstX86Punpckl *create(Cfg *Func, Variable *Dest, Operand *Source) {
3105*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Punpckl>())
3106*03ce13f7SAndroid Build Coastguard Worker         InstX86Punpckl(Func, Dest, Source);
3107*03ce13f7SAndroid Build Coastguard Worker   }
3108*03ce13f7SAndroid Build Coastguard Worker 
3109*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Punpckl(Cfg * Func,Variable * Dest,Operand * Source)3110*03ce13f7SAndroid Build Coastguard Worker   InstX86Punpckl(Cfg *Func, Variable *Dest, Operand *Source)
3111*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Punpckl, false,
3112*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Unpack>(Func, Dest,
3113*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
3114*03ce13f7SAndroid Build Coastguard Worker };
3115*03ce13f7SAndroid Build Coastguard Worker 
3116*03ce13f7SAndroid Build Coastguard Worker class InstX86Punpckh
3117*03ce13f7SAndroid Build Coastguard Worker     : public InstX86BaseBinopXmm<InstX86Base::Punpckh, false,
3118*03ce13f7SAndroid Build Coastguard Worker                                  InstX86Base::SseSuffix::Unpack> {
3119*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)3120*03ce13f7SAndroid Build Coastguard Worker   static InstX86Punpckh *create(Cfg *Func, Variable *Dest, Operand *Source) {
3121*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Punpckh>())
3122*03ce13f7SAndroid Build Coastguard Worker         InstX86Punpckh(Func, Dest, Source);
3123*03ce13f7SAndroid Build Coastguard Worker   }
3124*03ce13f7SAndroid Build Coastguard Worker 
3125*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Punpckh(Cfg * Func,Variable * Dest,Operand * Source)3126*03ce13f7SAndroid Build Coastguard Worker   InstX86Punpckh(Cfg *Func, Variable *Dest, Operand *Source)
3127*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Punpckh, false,
3128*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Unpack>(Func, Dest,
3129*03ce13f7SAndroid Build Coastguard Worker                                                             Source) {}
3130*03ce13f7SAndroid Build Coastguard Worker };
3131*03ce13f7SAndroid Build Coastguard Worker 
3132*03ce13f7SAndroid Build Coastguard Worker class InstX86Packss : public InstX86BaseBinopXmm<InstX86Base::Packss, false,
3133*03ce13f7SAndroid Build Coastguard Worker                                                  InstX86Base::SseSuffix::Pack> {
3134*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)3135*03ce13f7SAndroid Build Coastguard Worker   static InstX86Packss *create(Cfg *Func, Variable *Dest, Operand *Source) {
3136*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Packss>())
3137*03ce13f7SAndroid Build Coastguard Worker         InstX86Packss(Func, Dest, Source);
3138*03ce13f7SAndroid Build Coastguard Worker   }
3139*03ce13f7SAndroid Build Coastguard Worker 
3140*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Packss(Cfg * Func,Variable * Dest,Operand * Source)3141*03ce13f7SAndroid Build Coastguard Worker   InstX86Packss(Cfg *Func, Variable *Dest, Operand *Source)
3142*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Packss, false,
3143*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Pack>(Func, Dest, Source) {}
3144*03ce13f7SAndroid Build Coastguard Worker };
3145*03ce13f7SAndroid Build Coastguard Worker 
3146*03ce13f7SAndroid Build Coastguard Worker class InstX86Packus : public InstX86BaseBinopXmm<InstX86Base::Packus, false,
3147*03ce13f7SAndroid Build Coastguard Worker                                                  InstX86Base::SseSuffix::Pack> {
3148*03ce13f7SAndroid Build Coastguard Worker public:
create(Cfg * Func,Variable * Dest,Operand * Source)3149*03ce13f7SAndroid Build Coastguard Worker   static InstX86Packus *create(Cfg *Func, Variable *Dest, Operand *Source) {
3150*03ce13f7SAndroid Build Coastguard Worker     return new (Func->allocate<InstX86Packus>())
3151*03ce13f7SAndroid Build Coastguard Worker         InstX86Packus(Func, Dest, Source);
3152*03ce13f7SAndroid Build Coastguard Worker   }
3153*03ce13f7SAndroid Build Coastguard Worker 
3154*03ce13f7SAndroid Build Coastguard Worker private:
InstX86Packus(Cfg * Func,Variable * Dest,Operand * Source)3155*03ce13f7SAndroid Build Coastguard Worker   InstX86Packus(Cfg *Func, Variable *Dest, Operand *Source)
3156*03ce13f7SAndroid Build Coastguard Worker       : InstX86BaseBinopXmm<InstX86Base::Packus, false,
3157*03ce13f7SAndroid Build Coastguard Worker                             InstX86Base::SseSuffix::Pack>(Func, Dest, Source) {}
3158*03ce13f7SAndroid Build Coastguard Worker };
3159*03ce13f7SAndroid Build Coastguard Worker 
3160*03ce13f7SAndroid Build Coastguard Worker struct Insts {
3161*03ce13f7SAndroid Build Coastguard Worker   using FakeRMW = InstX86FakeRMW;
3162*03ce13f7SAndroid Build Coastguard Worker   using Label = InstX86Label;
3163*03ce13f7SAndroid Build Coastguard Worker 
3164*03ce13f7SAndroid Build Coastguard Worker   using Call = InstX86Call;
3165*03ce13f7SAndroid Build Coastguard Worker 
3166*03ce13f7SAndroid Build Coastguard Worker   using Br = InstX86Br;
3167*03ce13f7SAndroid Build Coastguard Worker   using Jmp = InstX86Jmp;
3168*03ce13f7SAndroid Build Coastguard Worker   using Bswap = InstX86Bswap;
3169*03ce13f7SAndroid Build Coastguard Worker   using Neg = InstX86Neg;
3170*03ce13f7SAndroid Build Coastguard Worker   using Bsf = InstX86Bsf;
3171*03ce13f7SAndroid Build Coastguard Worker   using Bsr = InstX86Bsr;
3172*03ce13f7SAndroid Build Coastguard Worker   using Lea = InstX86Lea;
3173*03ce13f7SAndroid Build Coastguard Worker   using Cbwdq = InstX86Cbwdq;
3174*03ce13f7SAndroid Build Coastguard Worker   using Movsx = InstX86Movsx;
3175*03ce13f7SAndroid Build Coastguard Worker   using Movzx = InstX86Movzx;
3176*03ce13f7SAndroid Build Coastguard Worker   using Movd = InstX86Movd;
3177*03ce13f7SAndroid Build Coastguard Worker   using Movmsk = InstX86Movmsk;
3178*03ce13f7SAndroid Build Coastguard Worker   using Sqrt = InstX86Sqrt;
3179*03ce13f7SAndroid Build Coastguard Worker   using Mov = InstX86Mov;
3180*03ce13f7SAndroid Build Coastguard Worker   using Movp = InstX86Movp;
3181*03ce13f7SAndroid Build Coastguard Worker   using Movq = InstX86Movq;
3182*03ce13f7SAndroid Build Coastguard Worker   using Add = InstX86Add;
3183*03ce13f7SAndroid Build Coastguard Worker   using AddRMW = InstX86AddRMW;
3184*03ce13f7SAndroid Build Coastguard Worker   using Addps = InstX86Addps;
3185*03ce13f7SAndroid Build Coastguard Worker   using Adc = InstX86Adc;
3186*03ce13f7SAndroid Build Coastguard Worker   using AdcRMW = InstX86AdcRMW;
3187*03ce13f7SAndroid Build Coastguard Worker   using Addss = InstX86Addss;
3188*03ce13f7SAndroid Build Coastguard Worker   using Andnps = InstX86Andnps;
3189*03ce13f7SAndroid Build Coastguard Worker   using Andps = InstX86Andps;
3190*03ce13f7SAndroid Build Coastguard Worker   using Padd = InstX86Padd;
3191*03ce13f7SAndroid Build Coastguard Worker   using Padds = InstX86Padds;
3192*03ce13f7SAndroid Build Coastguard Worker   using Paddus = InstX86Paddus;
3193*03ce13f7SAndroid Build Coastguard Worker   using Sub = InstX86Sub;
3194*03ce13f7SAndroid Build Coastguard Worker   using SubRMW = InstX86SubRMW;
3195*03ce13f7SAndroid Build Coastguard Worker   using Subps = InstX86Subps;
3196*03ce13f7SAndroid Build Coastguard Worker   using Subss = InstX86Subss;
3197*03ce13f7SAndroid Build Coastguard Worker   using Sbb = InstX86Sbb;
3198*03ce13f7SAndroid Build Coastguard Worker   using SbbRMW = InstX86SbbRMW;
3199*03ce13f7SAndroid Build Coastguard Worker   using Psub = InstX86Psub;
3200*03ce13f7SAndroid Build Coastguard Worker   using Psubs = InstX86Psubs;
3201*03ce13f7SAndroid Build Coastguard Worker   using Psubus = InstX86Psubus;
3202*03ce13f7SAndroid Build Coastguard Worker   using And = InstX86And;
3203*03ce13f7SAndroid Build Coastguard Worker   using AndRMW = InstX86AndRMW;
3204*03ce13f7SAndroid Build Coastguard Worker   using Pand = InstX86Pand;
3205*03ce13f7SAndroid Build Coastguard Worker   using Pandn = InstX86Pandn;
3206*03ce13f7SAndroid Build Coastguard Worker   using Or = InstX86Or;
3207*03ce13f7SAndroid Build Coastguard Worker   using Orps = InstX86Orps;
3208*03ce13f7SAndroid Build Coastguard Worker   using OrRMW = InstX86OrRMW;
3209*03ce13f7SAndroid Build Coastguard Worker   using Por = InstX86Por;
3210*03ce13f7SAndroid Build Coastguard Worker   using Xor = InstX86Xor;
3211*03ce13f7SAndroid Build Coastguard Worker   using Xorps = InstX86Xorps;
3212*03ce13f7SAndroid Build Coastguard Worker   using XorRMW = InstX86XorRMW;
3213*03ce13f7SAndroid Build Coastguard Worker   using Pxor = InstX86Pxor;
3214*03ce13f7SAndroid Build Coastguard Worker   using Maxss = InstX86Maxss;
3215*03ce13f7SAndroid Build Coastguard Worker   using Minss = InstX86Minss;
3216*03ce13f7SAndroid Build Coastguard Worker   using Maxps = InstX86Maxps;
3217*03ce13f7SAndroid Build Coastguard Worker   using Minps = InstX86Minps;
3218*03ce13f7SAndroid Build Coastguard Worker   using Imul = InstX86Imul;
3219*03ce13f7SAndroid Build Coastguard Worker   using ImulImm = InstX86ImulImm;
3220*03ce13f7SAndroid Build Coastguard Worker   using Mulps = InstX86Mulps;
3221*03ce13f7SAndroid Build Coastguard Worker   using Mulss = InstX86Mulss;
3222*03ce13f7SAndroid Build Coastguard Worker   using Pmull = InstX86Pmull;
3223*03ce13f7SAndroid Build Coastguard Worker   using Pmulhw = InstX86Pmulhw;
3224*03ce13f7SAndroid Build Coastguard Worker   using Pmulhuw = InstX86Pmulhuw;
3225*03ce13f7SAndroid Build Coastguard Worker   using Pmaddwd = InstX86Pmaddwd;
3226*03ce13f7SAndroid Build Coastguard Worker   using Pmuludq = InstX86Pmuludq;
3227*03ce13f7SAndroid Build Coastguard Worker   using Divps = InstX86Divps;
3228*03ce13f7SAndroid Build Coastguard Worker   using Divss = InstX86Divss;
3229*03ce13f7SAndroid Build Coastguard Worker   using Rol = InstX86Rol;
3230*03ce13f7SAndroid Build Coastguard Worker   using Shl = InstX86Shl;
3231*03ce13f7SAndroid Build Coastguard Worker   using Psll = InstX86Psll;
3232*03ce13f7SAndroid Build Coastguard Worker   using Psrl = InstX86Psrl;
3233*03ce13f7SAndroid Build Coastguard Worker   using Shr = InstX86Shr;
3234*03ce13f7SAndroid Build Coastguard Worker   using Sar = InstX86Sar;
3235*03ce13f7SAndroid Build Coastguard Worker   using Psra = InstX86Psra;
3236*03ce13f7SAndroid Build Coastguard Worker   using Pcmpeq = InstX86Pcmpeq;
3237*03ce13f7SAndroid Build Coastguard Worker   using Pcmpgt = InstX86Pcmpgt;
3238*03ce13f7SAndroid Build Coastguard Worker   using MovssRegs = InstX86MovssRegs;
3239*03ce13f7SAndroid Build Coastguard Worker   using Idiv = InstX86Idiv;
3240*03ce13f7SAndroid Build Coastguard Worker   using Div = InstX86Div;
3241*03ce13f7SAndroid Build Coastguard Worker   using Insertps = InstX86Insertps;
3242*03ce13f7SAndroid Build Coastguard Worker   using Pinsr = InstX86Pinsr;
3243*03ce13f7SAndroid Build Coastguard Worker   using Shufps = InstX86Shufps;
3244*03ce13f7SAndroid Build Coastguard Worker   using Blendvps = InstX86Blendvps;
3245*03ce13f7SAndroid Build Coastguard Worker   using Pblendvb = InstX86Pblendvb;
3246*03ce13f7SAndroid Build Coastguard Worker   using Pextr = InstX86Pextr;
3247*03ce13f7SAndroid Build Coastguard Worker   using Pshufd = InstX86Pshufd;
3248*03ce13f7SAndroid Build Coastguard Worker   using Lockable = InstX86BaseLockable;
3249*03ce13f7SAndroid Build Coastguard Worker   using Mul = InstX86Mul;
3250*03ce13f7SAndroid Build Coastguard Worker   using Shld = InstX86Shld;
3251*03ce13f7SAndroid Build Coastguard Worker   using Shrd = InstX86Shrd;
3252*03ce13f7SAndroid Build Coastguard Worker   using Cmov = InstX86Cmov;
3253*03ce13f7SAndroid Build Coastguard Worker   using Cmpps = InstX86Cmpps;
3254*03ce13f7SAndroid Build Coastguard Worker   using Cmpxchg = InstX86Cmpxchg;
3255*03ce13f7SAndroid Build Coastguard Worker   using Cmpxchg8b = InstX86Cmpxchg8b;
3256*03ce13f7SAndroid Build Coastguard Worker   using Cvt = InstX86Cvt;
3257*03ce13f7SAndroid Build Coastguard Worker   using Round = InstX86Round;
3258*03ce13f7SAndroid Build Coastguard Worker   using Icmp = InstX86Icmp;
3259*03ce13f7SAndroid Build Coastguard Worker   using Ucomiss = InstX86Ucomiss;
3260*03ce13f7SAndroid Build Coastguard Worker   using UD2 = InstX86UD2;
3261*03ce13f7SAndroid Build Coastguard Worker   using Int3 = InstX86Int3;
3262*03ce13f7SAndroid Build Coastguard Worker   using Test = InstX86Test;
3263*03ce13f7SAndroid Build Coastguard Worker   using Mfence = InstX86Mfence;
3264*03ce13f7SAndroid Build Coastguard Worker   using Store = InstX86Store;
3265*03ce13f7SAndroid Build Coastguard Worker   using StoreP = InstX86StoreP;
3266*03ce13f7SAndroid Build Coastguard Worker   using StoreQ = InstX86StoreQ;
3267*03ce13f7SAndroid Build Coastguard Worker   using StoreD = InstX86StoreD;
3268*03ce13f7SAndroid Build Coastguard Worker   using Nop = InstX86Nop;
3269*03ce13f7SAndroid Build Coastguard Worker   using Fld = InstX86Fld;
3270*03ce13f7SAndroid Build Coastguard Worker   using Fstp = InstX86Fstp;
3271*03ce13f7SAndroid Build Coastguard Worker   using Pop = InstX86Pop;
3272*03ce13f7SAndroid Build Coastguard Worker   using Push = InstX86Push;
3273*03ce13f7SAndroid Build Coastguard Worker   using Ret = InstX86Ret;
3274*03ce13f7SAndroid Build Coastguard Worker   using Setcc = InstX86Setcc;
3275*03ce13f7SAndroid Build Coastguard Worker   using Xadd = InstX86Xadd;
3276*03ce13f7SAndroid Build Coastguard Worker   using Xchg = InstX86Xchg;
3277*03ce13f7SAndroid Build Coastguard Worker 
3278*03ce13f7SAndroid Build Coastguard Worker   using IacaStart = InstX86IacaStart;
3279*03ce13f7SAndroid Build Coastguard Worker   using IacaEnd = InstX86IacaEnd;
3280*03ce13f7SAndroid Build Coastguard Worker 
3281*03ce13f7SAndroid Build Coastguard Worker   using Pshufb = InstX86Pshufb;
3282*03ce13f7SAndroid Build Coastguard Worker   using Punpckl = InstX86Punpckl;
3283*03ce13f7SAndroid Build Coastguard Worker   using Punpckh = InstX86Punpckh;
3284*03ce13f7SAndroid Build Coastguard Worker   using Packss = InstX86Packss;
3285*03ce13f7SAndroid Build Coastguard Worker   using Packus = InstX86Packus;
3286*03ce13f7SAndroid Build Coastguard Worker };
3287*03ce13f7SAndroid Build Coastguard Worker 
3288*03ce13f7SAndroid Build Coastguard Worker /// X86 Instructions have static data (particularly, opcodes and instruction
3289*03ce13f7SAndroid Build Coastguard Worker /// emitters). Each X86 target needs to define all of these, so this macro is
3290*03ce13f7SAndroid Build Coastguard Worker /// provided so that, if something changes, then all X86 targets will be updated
3291*03ce13f7SAndroid Build Coastguard Worker /// automatically.
3292*03ce13f7SAndroid Build Coastguard Worker /* In-place ops */
3293*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Bswap::Base::Opcode = "bswap";
3294*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Neg::Base::Opcode = "neg";
3295*03ce13f7SAndroid Build Coastguard Worker /* Unary ops */
3296*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Bsf::Base::Opcode = "bsf";
3297*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Bsr::Base::Opcode = "bsr";
3298*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Lea::Base::Opcode = "lea";
3299*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Movd::Base::Opcode = "movd";
3300*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Movsx::Base::Opcode = "movs";
3301*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Movzx::Base::Opcode = "movz";
3302*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Sqrt::Base::Opcode = "sqrt";
3303*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Cbwdq::Base::Opcode = "cbw/cwd/cdq";
3304*03ce13f7SAndroid Build Coastguard Worker /* Mov-like ops */
3305*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Mov::Base::Opcode = "mov";
3306*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Movp::Base::Opcode = "movups";
3307*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Movq::Base::Opcode = "movq";
3308*03ce13f7SAndroid Build Coastguard Worker /* Binary ops */
3309*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Add::Base::Opcode = "add";
3310*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86AddRMW::Base::Opcode = "add";
3311*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Addps::Base::Opcode = "add";
3312*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Adc::Base::Opcode = "adc";
3313*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86AdcRMW::Base::Opcode = "adc";
3314*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Addss::Base::Opcode = "add";
3315*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Andnps::Base::Opcode = "andn";
3316*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Andps::Base::Opcode = "and";
3317*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Maxss::Base::Opcode = "max";
3318*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Minss::Base::Opcode = "min";
3319*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Maxps::Base::Opcode = "max";
3320*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Minps::Base::Opcode = "min";
3321*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Padd::Base::Opcode = "padd";
3322*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Padds::Base::Opcode = "padds";
3323*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Paddus::Base::Opcode = "paddus";
3324*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Sub::Base::Opcode = "sub";
3325*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86SubRMW::Base::Opcode = "sub";
3326*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Subps::Base::Opcode = "sub";
3327*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Subss::Base::Opcode = "sub";
3328*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Sbb::Base::Opcode = "sbb";
3329*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86SbbRMW::Base::Opcode = "sbb";
3330*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Psub::Base::Opcode = "psub";
3331*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Psubs::Base::Opcode = "psubs";
3332*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Psubus::Base::Opcode = "psubus";
3333*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86And::Base::Opcode = "and";
3334*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86AndRMW::Base::Opcode = "and";
3335*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pand::Base::Opcode = "pand";
3336*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pandn::Base::Opcode = "pandn";
3337*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Or::Base::Opcode = "or";
3338*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Orps::Base::Opcode = "or";
3339*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86OrRMW::Base::Opcode = "or";
3340*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Por::Base::Opcode = "por";
3341*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Xor::Base::Opcode = "xor";
3342*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Xorps::Base::Opcode = "xor";
3343*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86XorRMW::Base::Opcode = "xor";
3344*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pxor::Base::Opcode = "pxor";
3345*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Imul::Base::Opcode = "imul";
3346*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86ImulImm::Base::Opcode = "imul";
3347*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Mulps::Base::Opcode = "mul";
3348*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Mulss::Base::Opcode = "mul";
3349*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pmull::Base::Opcode = "pmull";
3350*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pmulhw::Base::Opcode = "pmulhw";
3351*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pmulhuw::Base::Opcode = "pmulhuw";
3352*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pmaddwd::Base::Opcode = "pmaddwd";
3353*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pmuludq::Base::Opcode = "pmuludq";
3354*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Div::Base::Opcode = "div";
3355*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Divps::Base::Opcode = "div";
3356*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Divss::Base::Opcode = "div";
3357*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Idiv::Base::Opcode = "idiv";
3358*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Rol::Base::Opcode = "rol";
3359*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Shl::Base::Opcode = "shl";
3360*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Psll::Base::Opcode = "psll";
3361*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Shr::Base::Opcode = "shr";
3362*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Sar::Base::Opcode = "sar";
3363*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Psra::Base::Opcode = "psra";
3364*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Psrl::Base::Opcode = "psrl";
3365*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pcmpeq::Base::Opcode = "pcmpeq";
3366*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pcmpgt::Base::Opcode = "pcmpgt";
3367*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86MovssRegs::Base::Opcode = "movss";
3368*03ce13f7SAndroid Build Coastguard Worker /* Ternary ops */
3369*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Insertps::Base::Opcode = "insertps";
3370*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Round::Base::Opcode = "round";
3371*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Shufps::Base::Opcode = "shufps";
3372*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pinsr::Base::Opcode = "pinsr";
3373*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Blendvps::Base::Opcode = "blendvps";
3374*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pblendvb::Base::Opcode = "pblendvb";
3375*03ce13f7SAndroid Build Coastguard Worker /* Three address ops */
3376*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pextr::Base::Opcode = "pextr";
3377*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pshufd::Base::Opcode = "pshufd";
3378*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Pshufb::Base::Opcode = "pshufb";
3379*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Punpckl::Base::Opcode = "punpckl";
3380*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Punpckh::Base::Opcode = "punpckh";
3381*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Packss::Base::Opcode = "packss";
3382*03ce13f7SAndroid Build Coastguard Worker template <> constexpr const char *InstX86Packus::Base::Opcode = "packus";
3383*03ce13f7SAndroid Build Coastguard Worker /* Inplace GPR ops */
3384*03ce13f7SAndroid Build Coastguard Worker template <>
3385*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterOneOp InstX86Bswap::Base::Emitter = {
3386*03ce13f7SAndroid Build Coastguard Worker     &Assembler::bswap, nullptr /* only a reg form exists */
3387*03ce13f7SAndroid Build Coastguard Worker };
3388*03ce13f7SAndroid Build Coastguard Worker template <>
3389*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterOneOp InstX86Neg::Base::Emitter = {
3390*03ce13f7SAndroid Build Coastguard Worker     &Assembler::neg, &Assembler::neg};
3391*03ce13f7SAndroid Build Coastguard Worker /* Unary GPR ops */
3392*03ce13f7SAndroid Build Coastguard Worker /* uses specialized emitter. */
3393*03ce13f7SAndroid Build Coastguard Worker template <>
3394*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Cbwdq::Base::Emitter = {
3395*03ce13f7SAndroid Build Coastguard Worker     nullptr, nullptr, nullptr};
3396*03ce13f7SAndroid Build Coastguard Worker template <>
3397*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Bsf::Base::Emitter = {
3398*03ce13f7SAndroid Build Coastguard Worker     &Assembler::bsf, &Assembler::bsf, nullptr};
3399*03ce13f7SAndroid Build Coastguard Worker template <>
3400*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Bsr::Base::Emitter = {
3401*03ce13f7SAndroid Build Coastguard Worker     &Assembler::bsr, &Assembler::bsr, nullptr};
3402*03ce13f7SAndroid Build Coastguard Worker template <>
3403*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Lea::Base::Emitter = {
3404*03ce13f7SAndroid Build Coastguard Worker     /* reg/reg and reg/imm are illegal */ nullptr, &Assembler::lea, nullptr};
3405*03ce13f7SAndroid Build Coastguard Worker template <>
3406*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Movsx::Base::Emitter = {
3407*03ce13f7SAndroid Build Coastguard Worker     &Assembler::movsx, &Assembler::movsx, nullptr};
3408*03ce13f7SAndroid Build Coastguard Worker template <>
3409*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Movzx::Base::Emitter = {
3410*03ce13f7SAndroid Build Coastguard Worker     &Assembler::movzx, &Assembler::movzx, nullptr};
3411*03ce13f7SAndroid Build Coastguard Worker /* Unary XMM ops */
3412*03ce13f7SAndroid Build Coastguard Worker /* uses specialized emitter. */
3413*03ce13f7SAndroid Build Coastguard Worker template <>
3414*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Movd::Base::Emitter = {
3415*03ce13f7SAndroid Build Coastguard Worker     nullptr, nullptr};
3416*03ce13f7SAndroid Build Coastguard Worker template <>
3417*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Sqrt::Base::Emitter = {
3418*03ce13f7SAndroid Build Coastguard Worker     &Assembler::sqrt, &Assembler::sqrt};
3419*03ce13f7SAndroid Build Coastguard Worker /* Binary GPR ops */
3420*03ce13f7SAndroid Build Coastguard Worker /* uses specialized emitter. */
3421*03ce13f7SAndroid Build Coastguard Worker template <>
3422*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Imul::Base::Emitter = {
3423*03ce13f7SAndroid Build Coastguard Worker     nullptr, nullptr, nullptr};
3424*03ce13f7SAndroid Build Coastguard Worker template <>
3425*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Add::Base::Emitter = {
3426*03ce13f7SAndroid Build Coastguard Worker     &Assembler::add, &Assembler::add, &Assembler::add};
3427*03ce13f7SAndroid Build Coastguard Worker template <>
3428*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterAddrOp InstX86AddRMW::Base::Emitter = {
3429*03ce13f7SAndroid Build Coastguard Worker     &Assembler::add, &Assembler::add};
3430*03ce13f7SAndroid Build Coastguard Worker template <>
3431*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Adc::Base::Emitter = {
3432*03ce13f7SAndroid Build Coastguard Worker     &Assembler::adc, &Assembler::adc, &Assembler::adc};
3433*03ce13f7SAndroid Build Coastguard Worker template <>
3434*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterAddrOp InstX86AdcRMW::Base::Emitter = {
3435*03ce13f7SAndroid Build Coastguard Worker     &Assembler::adc, &Assembler::adc};
3436*03ce13f7SAndroid Build Coastguard Worker template <>
3437*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86And::Base::Emitter = {
3438*03ce13f7SAndroid Build Coastguard Worker     &Assembler::And, &Assembler::And, &Assembler::And};
3439*03ce13f7SAndroid Build Coastguard Worker template <>
3440*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterAddrOp InstX86AndRMW::Base::Emitter = {
3441*03ce13f7SAndroid Build Coastguard Worker     &Assembler::And, &Assembler::And};
3442*03ce13f7SAndroid Build Coastguard Worker template <>
3443*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Or::Base::Emitter = {
3444*03ce13f7SAndroid Build Coastguard Worker     &Assembler::Or, &Assembler::Or, &Assembler::Or};
3445*03ce13f7SAndroid Build Coastguard Worker template <>
3446*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterAddrOp InstX86OrRMW::Base::Emitter = {
3447*03ce13f7SAndroid Build Coastguard Worker     &Assembler::Or, &Assembler::Or};
3448*03ce13f7SAndroid Build Coastguard Worker template <>
3449*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Sbb::Base::Emitter = {
3450*03ce13f7SAndroid Build Coastguard Worker     &Assembler::sbb, &Assembler::sbb, &Assembler::sbb};
3451*03ce13f7SAndroid Build Coastguard Worker template <>
3452*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterAddrOp InstX86SbbRMW::Base::Emitter = {
3453*03ce13f7SAndroid Build Coastguard Worker     &Assembler::sbb, &Assembler::sbb};
3454*03ce13f7SAndroid Build Coastguard Worker template <>
3455*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Sub::Base::Emitter = {
3456*03ce13f7SAndroid Build Coastguard Worker     &Assembler::sub, &Assembler::sub, &Assembler::sub};
3457*03ce13f7SAndroid Build Coastguard Worker template <>
3458*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterAddrOp InstX86SubRMW::Base::Emitter = {
3459*03ce13f7SAndroid Build Coastguard Worker     &Assembler::sub, &Assembler::sub};
3460*03ce13f7SAndroid Build Coastguard Worker template <>
3461*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterRegOp InstX86Xor::Base::Emitter = {
3462*03ce13f7SAndroid Build Coastguard Worker     &Assembler::Xor, &Assembler::Xor, &Assembler::Xor};
3463*03ce13f7SAndroid Build Coastguard Worker template <>
3464*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterAddrOp InstX86XorRMW::Base::Emitter = {
3465*03ce13f7SAndroid Build Coastguard Worker     &Assembler::Xor, &Assembler::Xor};
3466*03ce13f7SAndroid Build Coastguard Worker /* Binary Shift GPR ops */
3467*03ce13f7SAndroid Build Coastguard Worker template <>
3468*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterShiftOp InstX86Rol::Base::Emitter = {
3469*03ce13f7SAndroid Build Coastguard Worker     &Assembler::rol, &Assembler::rol};
3470*03ce13f7SAndroid Build Coastguard Worker template <>
3471*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterShiftOp InstX86Sar::Base::Emitter = {
3472*03ce13f7SAndroid Build Coastguard Worker     &Assembler::sar, &Assembler::sar};
3473*03ce13f7SAndroid Build Coastguard Worker template <>
3474*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterShiftOp InstX86Shl::Base::Emitter = {
3475*03ce13f7SAndroid Build Coastguard Worker     &Assembler::shl, &Assembler::shl};
3476*03ce13f7SAndroid Build Coastguard Worker template <>
3477*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::GPREmitterShiftOp InstX86Shr::Base::Emitter = {
3478*03ce13f7SAndroid Build Coastguard Worker     &Assembler::shr, &Assembler::shr};
3479*03ce13f7SAndroid Build Coastguard Worker /* Binary XMM ops */
3480*03ce13f7SAndroid Build Coastguard Worker /* uses specialized emitter. */
3481*03ce13f7SAndroid Build Coastguard Worker template <>
3482*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86MovssRegs::Base::Emitter = {
3483*03ce13f7SAndroid Build Coastguard Worker     nullptr, nullptr};
3484*03ce13f7SAndroid Build Coastguard Worker template <>
3485*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Addss::Base::Emitter = {
3486*03ce13f7SAndroid Build Coastguard Worker     &Assembler::addss, &Assembler::addss};
3487*03ce13f7SAndroid Build Coastguard Worker template <>
3488*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Addps::Base::Emitter = {
3489*03ce13f7SAndroid Build Coastguard Worker     &Assembler::addps, &Assembler::addps};
3490*03ce13f7SAndroid Build Coastguard Worker template <>
3491*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Divss::Base::Emitter = {
3492*03ce13f7SAndroid Build Coastguard Worker     &Assembler::divss, &Assembler::divss};
3493*03ce13f7SAndroid Build Coastguard Worker template <>
3494*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Divps::Base::Emitter = {
3495*03ce13f7SAndroid Build Coastguard Worker     &Assembler::divps, &Assembler::divps};
3496*03ce13f7SAndroid Build Coastguard Worker template <>
3497*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Mulss::Base::Emitter = {
3498*03ce13f7SAndroid Build Coastguard Worker     &Assembler::mulss, &Assembler::mulss};
3499*03ce13f7SAndroid Build Coastguard Worker template <>
3500*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Mulps::Base::Emitter = {
3501*03ce13f7SAndroid Build Coastguard Worker     &Assembler::mulps, &Assembler::mulps};
3502*03ce13f7SAndroid Build Coastguard Worker template <>
3503*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Padd::Base::Emitter = {
3504*03ce13f7SAndroid Build Coastguard Worker     &Assembler::padd, &Assembler::padd};
3505*03ce13f7SAndroid Build Coastguard Worker template <>
3506*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Padds::Base::Emitter = {
3507*03ce13f7SAndroid Build Coastguard Worker     &Assembler::padds, &Assembler::padds};
3508*03ce13f7SAndroid Build Coastguard Worker template <>
3509*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Paddus::Base::Emitter = {
3510*03ce13f7SAndroid Build Coastguard Worker     &Assembler::paddus, &Assembler::paddus};
3511*03ce13f7SAndroid Build Coastguard Worker template <>
3512*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pand::Base::Emitter = {
3513*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pand, &Assembler::pand};
3514*03ce13f7SAndroid Build Coastguard Worker template <>
3515*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pandn::Base::Emitter = {
3516*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pandn, &Assembler::pandn};
3517*03ce13f7SAndroid Build Coastguard Worker template <>
3518*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pcmpeq::Base::Emitter = {
3519*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pcmpeq, &Assembler::pcmpeq};
3520*03ce13f7SAndroid Build Coastguard Worker template <>
3521*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pcmpgt::Base::Emitter = {
3522*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pcmpgt, &Assembler::pcmpgt};
3523*03ce13f7SAndroid Build Coastguard Worker template <>
3524*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pmull::Base::Emitter = {
3525*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pmull, &Assembler::pmull};
3526*03ce13f7SAndroid Build Coastguard Worker template <>
3527*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pmulhw::Base::Emitter = {
3528*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pmulhw, &Assembler::pmulhw};
3529*03ce13f7SAndroid Build Coastguard Worker template <>
3530*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pmulhuw::Base::Emitter = {
3531*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pmulhuw, &Assembler::pmulhuw};
3532*03ce13f7SAndroid Build Coastguard Worker template <>
3533*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pmaddwd::Base::Emitter = {
3534*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pmaddwd, &Assembler::pmaddwd};
3535*03ce13f7SAndroid Build Coastguard Worker template <>
3536*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pmuludq::Base::Emitter = {
3537*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pmuludq, &Assembler::pmuludq};
3538*03ce13f7SAndroid Build Coastguard Worker template <>
3539*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Por::Base::Emitter = {
3540*03ce13f7SAndroid Build Coastguard Worker     &Assembler::por, &Assembler::por};
3541*03ce13f7SAndroid Build Coastguard Worker template <>
3542*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Psub::Base::Emitter = {
3543*03ce13f7SAndroid Build Coastguard Worker     &Assembler::psub, &Assembler::psub};
3544*03ce13f7SAndroid Build Coastguard Worker template <>
3545*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Psubs::Base::Emitter = {
3546*03ce13f7SAndroid Build Coastguard Worker     &Assembler::psubs, &Assembler::psubs};
3547*03ce13f7SAndroid Build Coastguard Worker template <>
3548*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Psubus::Base::Emitter = {
3549*03ce13f7SAndroid Build Coastguard Worker     &Assembler::psubus, &Assembler::psubus};
3550*03ce13f7SAndroid Build Coastguard Worker template <>
3551*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pxor::Base::Emitter = {
3552*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pxor, &Assembler::pxor};
3553*03ce13f7SAndroid Build Coastguard Worker template <>
3554*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Subss::Base::Emitter = {
3555*03ce13f7SAndroid Build Coastguard Worker     &Assembler::subss, &Assembler::subss};
3556*03ce13f7SAndroid Build Coastguard Worker template <>
3557*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Subps::Base::Emitter = {
3558*03ce13f7SAndroid Build Coastguard Worker     &Assembler::subps, &Assembler::subps};
3559*03ce13f7SAndroid Build Coastguard Worker template <>
3560*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Andnps::Base::Emitter = {
3561*03ce13f7SAndroid Build Coastguard Worker     &Assembler::andnps, &Assembler::andnps};
3562*03ce13f7SAndroid Build Coastguard Worker template <>
3563*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Andps::Base::Emitter = {
3564*03ce13f7SAndroid Build Coastguard Worker     &Assembler::andps, &Assembler::andps};
3565*03ce13f7SAndroid Build Coastguard Worker template <>
3566*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Maxss::Base::Emitter = {
3567*03ce13f7SAndroid Build Coastguard Worker     &Assembler::maxss, &Assembler::maxss};
3568*03ce13f7SAndroid Build Coastguard Worker template <>
3569*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Minss::Base::Emitter = {
3570*03ce13f7SAndroid Build Coastguard Worker     &Assembler::minss, &Assembler::minss};
3571*03ce13f7SAndroid Build Coastguard Worker template <>
3572*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Maxps::Base::Emitter = {
3573*03ce13f7SAndroid Build Coastguard Worker     &Assembler::maxps, &Assembler::maxps};
3574*03ce13f7SAndroid Build Coastguard Worker template <>
3575*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Minps::Base::Emitter = {
3576*03ce13f7SAndroid Build Coastguard Worker     &Assembler::minps, &Assembler::minps};
3577*03ce13f7SAndroid Build Coastguard Worker template <>
3578*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Orps::Base::Emitter = {
3579*03ce13f7SAndroid Build Coastguard Worker     &Assembler::orps, &Assembler::orps};
3580*03ce13f7SAndroid Build Coastguard Worker template <>
3581*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Xorps::Base::Emitter = {
3582*03ce13f7SAndroid Build Coastguard Worker     &Assembler::xorps, &Assembler::xorps}; /* Binary XMM Shift ops */
3583*03ce13f7SAndroid Build Coastguard Worker template <>
3584*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterShiftOp InstX86Psll::Base::Emitter = {
3585*03ce13f7SAndroid Build Coastguard Worker     &Assembler::psll, &Assembler::psll, &Assembler::psll};
3586*03ce13f7SAndroid Build Coastguard Worker template <>
3587*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterShiftOp InstX86Psra::Base::Emitter = {
3588*03ce13f7SAndroid Build Coastguard Worker     &Assembler::psra, &Assembler::psra, &Assembler::psra};
3589*03ce13f7SAndroid Build Coastguard Worker template <>
3590*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterShiftOp InstX86Psrl::Base::Emitter = {
3591*03ce13f7SAndroid Build Coastguard Worker     &Assembler::psrl, &Assembler::psrl, &Assembler::psrl};
3592*03ce13f7SAndroid Build Coastguard Worker template <>
3593*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Pshufb::Base::Emitter = {
3594*03ce13f7SAndroid Build Coastguard Worker     &Assembler::pshufb, &Assembler::pshufb};
3595*03ce13f7SAndroid Build Coastguard Worker template <>
3596*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Punpckl::Base::Emitter = {
3597*03ce13f7SAndroid Build Coastguard Worker     &Assembler::punpckl, &Assembler::punpckl};
3598*03ce13f7SAndroid Build Coastguard Worker template <>
3599*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Punpckh::Base::Emitter = {
3600*03ce13f7SAndroid Build Coastguard Worker     &Assembler::punpckh, &Assembler::punpckh};
3601*03ce13f7SAndroid Build Coastguard Worker template <>
3602*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Packss::Base::Emitter = {
3603*03ce13f7SAndroid Build Coastguard Worker     &Assembler::packss, &Assembler::packss};
3604*03ce13f7SAndroid Build Coastguard Worker template <>
3605*03ce13f7SAndroid Build Coastguard Worker constexpr const Assembler::XmmEmitterRegOp InstX86Packus::Base::Emitter = {
3606*03ce13f7SAndroid Build Coastguard Worker     &Assembler::packus, &Assembler::packus};
3607*03ce13f7SAndroid Build Coastguard Worker 
3608*03ce13f7SAndroid Build Coastguard Worker } // end of namespace X8632
3609*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
3610*03ce13f7SAndroid Build Coastguard Worker 
3611*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEINSTX8632_H
3612