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