xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceAssemblerX8664.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceAssemblerX8664Impl.h - base x86 assembler -*- C++ -*-=//
2*03ce13f7SAndroid Build Coastguard Worker // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
3*03ce13f7SAndroid Build Coastguard Worker // for details. All rights reserved. Use of this source code is governed by a
4*03ce13f7SAndroid Build Coastguard Worker // BSD-style license that can be found in the LICENSE file.
5*03ce13f7SAndroid Build Coastguard Worker //
6*03ce13f7SAndroid Build Coastguard Worker // Modified by the Subzero authors.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker //
10*03ce13f7SAndroid Build Coastguard Worker //                        The Subzero Code Generator
11*03ce13f7SAndroid Build Coastguard Worker //
12*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
13*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
14*03ce13f7SAndroid Build Coastguard Worker //
15*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
16*03ce13f7SAndroid Build Coastguard Worker //
17*03ce13f7SAndroid Build Coastguard Worker /// \file
18*03ce13f7SAndroid Build Coastguard Worker /// \brief Implements the AssemblerX8664 class.
19*03ce13f7SAndroid Build Coastguard Worker //
20*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
21*03ce13f7SAndroid Build Coastguard Worker 
22*03ce13f7SAndroid Build Coastguard Worker #include "IceAssemblerX8664.h"
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker #include "IceCfg.h"
25*03ce13f7SAndroid Build Coastguard Worker #include "IceCfgNode.h"
26*03ce13f7SAndroid Build Coastguard Worker #include "IceOperand.h"
27*03ce13f7SAndroid Build Coastguard Worker #include "IceTargetLoweringX8664.h"
28*03ce13f7SAndroid Build Coastguard Worker 
29*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
30*03ce13f7SAndroid Build Coastguard Worker namespace X8664 {
31*03ce13f7SAndroid Build Coastguard Worker 
AsmAddress(const Variable * Var,const TargetX8664 * Target)32*03ce13f7SAndroid Build Coastguard Worker AsmAddress::AsmAddress(const Variable *Var, const TargetX8664 *Target) {
33*03ce13f7SAndroid Build Coastguard Worker   if (Var->hasReg())
34*03ce13f7SAndroid Build Coastguard Worker     llvm::report_fatal_error("Stack Variable has a register assigned");
35*03ce13f7SAndroid Build Coastguard Worker   if (Var->mustHaveReg()) {
36*03ce13f7SAndroid Build Coastguard Worker     llvm::report_fatal_error("Infinite-weight Variable (" + Var->getName() +
37*03ce13f7SAndroid Build Coastguard Worker                              ") has no register assigned - function " +
38*03ce13f7SAndroid Build Coastguard Worker                              Target->getFunc()->getFunctionName());
39*03ce13f7SAndroid Build Coastguard Worker   }
40*03ce13f7SAndroid Build Coastguard Worker   int32_t Offset = Var->getStackOffset();
41*03ce13f7SAndroid Build Coastguard Worker   auto BaseRegNum = Var->getBaseRegNum();
42*03ce13f7SAndroid Build Coastguard Worker   if (Var->getBaseRegNum().hasNoValue()) {
43*03ce13f7SAndroid Build Coastguard Worker     // If the stack pointer needs alignment, we must use the frame pointer for
44*03ce13f7SAndroid Build Coastguard Worker     // arguments. For locals, getFrameOrStackReg will return the stack pointer
45*03ce13f7SAndroid Build Coastguard Worker     // in this case.
46*03ce13f7SAndroid Build Coastguard Worker     if (Target->needsStackPointerAlignment() && Var->getIsArg()) {
47*03ce13f7SAndroid Build Coastguard Worker       assert(Target->hasFramePointer());
48*03ce13f7SAndroid Build Coastguard Worker       BaseRegNum = Target->getFrameReg();
49*03ce13f7SAndroid Build Coastguard Worker     } else {
50*03ce13f7SAndroid Build Coastguard Worker       BaseRegNum = Target->getFrameOrStackReg();
51*03ce13f7SAndroid Build Coastguard Worker     }
52*03ce13f7SAndroid Build Coastguard Worker   }
53*03ce13f7SAndroid Build Coastguard Worker   SetBase(RegX8664::getEncodedGPR(BaseRegNum), Offset, AssemblerFixup::NoFixup);
54*03ce13f7SAndroid Build Coastguard Worker }
55*03ce13f7SAndroid Build Coastguard Worker 
AsmAddress(const X86OperandMem * Mem,Ice::Assembler * Asm,const Ice::TargetLowering * Target)56*03ce13f7SAndroid Build Coastguard Worker AsmAddress::AsmAddress(const X86OperandMem *Mem, Ice::Assembler *Asm,
57*03ce13f7SAndroid Build Coastguard Worker                        const Ice::TargetLowering *Target) {
58*03ce13f7SAndroid Build Coastguard Worker   int32_t Disp = 0;
59*03ce13f7SAndroid Build Coastguard Worker   if (Mem->getBase() && Mem->getBase()->isRematerializable()) {
60*03ce13f7SAndroid Build Coastguard Worker     Disp += Mem->getBase()->getRematerializableOffset(Target);
61*03ce13f7SAndroid Build Coastguard Worker   }
62*03ce13f7SAndroid Build Coastguard Worker   // The index should never be rematerializable.  But if we ever allow it, then
63*03ce13f7SAndroid Build Coastguard Worker   // we should make sure the rematerialization offset is shifted by the Shift
64*03ce13f7SAndroid Build Coastguard Worker   // value.
65*03ce13f7SAndroid Build Coastguard Worker   assert(!Mem->getIndex() || !Mem->getIndex()->isRematerializable());
66*03ce13f7SAndroid Build Coastguard Worker 
67*03ce13f7SAndroid Build Coastguard Worker   AssemblerFixup *Fixup = nullptr;
68*03ce13f7SAndroid Build Coastguard Worker   // Determine the offset (is it relocatable?)
69*03ce13f7SAndroid Build Coastguard Worker   if (Mem->getOffset() != nullptr) {
70*03ce13f7SAndroid Build Coastguard Worker     if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(Mem->getOffset())) {
71*03ce13f7SAndroid Build Coastguard Worker       Disp += static_cast<int32_t>(CI->getValue());
72*03ce13f7SAndroid Build Coastguard Worker     } else if (const auto *CR =
73*03ce13f7SAndroid Build Coastguard Worker                    llvm::dyn_cast<ConstantRelocatable>(Mem->getOffset())) {
74*03ce13f7SAndroid Build Coastguard Worker       const auto FixupKind =
75*03ce13f7SAndroid Build Coastguard Worker           (Mem->getBase() != nullptr || Mem->getIndex() != nullptr) ? FK_Abs
76*03ce13f7SAndroid Build Coastguard Worker                                                                     : FK_PcRel;
77*03ce13f7SAndroid Build Coastguard Worker       const RelocOffsetT DispAdjustment = FixupKind == FK_PcRel ? 4 : 0;
78*03ce13f7SAndroid Build Coastguard Worker       Fixup = Asm->createFixup(FixupKind, CR);
79*03ce13f7SAndroid Build Coastguard Worker       Fixup->set_addend(-DispAdjustment);
80*03ce13f7SAndroid Build Coastguard Worker       Disp = CR->getOffset();
81*03ce13f7SAndroid Build Coastguard Worker     } else {
82*03ce13f7SAndroid Build Coastguard Worker       llvm_unreachable("Unexpected offset type");
83*03ce13f7SAndroid Build Coastguard Worker     }
84*03ce13f7SAndroid Build Coastguard Worker   }
85*03ce13f7SAndroid Build Coastguard Worker 
86*03ce13f7SAndroid Build Coastguard Worker   // Now convert to the various possible forms.
87*03ce13f7SAndroid Build Coastguard Worker   if (Mem->getBase() && Mem->getIndex()) {
88*03ce13f7SAndroid Build Coastguard Worker     SetBaseIndex(RegX8664::getEncodedGPR(Mem->getBase()->getRegNum()),
89*03ce13f7SAndroid Build Coastguard Worker                  RegX8664::getEncodedGPR(Mem->getIndex()->getRegNum()),
90*03ce13f7SAndroid Build Coastguard Worker                  ScaleFactor(Mem->getShift()), Disp, Fixup);
91*03ce13f7SAndroid Build Coastguard Worker   } else if (Mem->getBase()) {
92*03ce13f7SAndroid Build Coastguard Worker     SetBase(RegX8664::getEncodedGPR(Mem->getBase()->getRegNum()), Disp, Fixup);
93*03ce13f7SAndroid Build Coastguard Worker   } else if (Mem->getIndex()) {
94*03ce13f7SAndroid Build Coastguard Worker     SetIndex(RegX8664::getEncodedGPR(Mem->getIndex()->getRegNum()),
95*03ce13f7SAndroid Build Coastguard Worker              ScaleFactor(Mem->getShift()), Disp, Fixup);
96*03ce13f7SAndroid Build Coastguard Worker   } else if (Fixup == nullptr) {
97*03ce13f7SAndroid Build Coastguard Worker     SetAbsolute(Disp);
98*03ce13f7SAndroid Build Coastguard Worker   } else {
99*03ce13f7SAndroid Build Coastguard Worker     SetRipRelative(Disp, Fixup);
100*03ce13f7SAndroid Build Coastguard Worker   }
101*03ce13f7SAndroid Build Coastguard Worker }
102*03ce13f7SAndroid Build Coastguard Worker 
~AssemblerX8664()103*03ce13f7SAndroid Build Coastguard Worker AssemblerX8664::~AssemblerX8664() {
104*03ce13f7SAndroid Build Coastguard Worker   if (BuildDefs::asserts()) {
105*03ce13f7SAndroid Build Coastguard Worker     for (const Label *Label : CfgNodeLabels) {
106*03ce13f7SAndroid Build Coastguard Worker       Label->finalCheck();
107*03ce13f7SAndroid Build Coastguard Worker     }
108*03ce13f7SAndroid Build Coastguard Worker     for (const Label *Label : LocalLabels) {
109*03ce13f7SAndroid Build Coastguard Worker       Label->finalCheck();
110*03ce13f7SAndroid Build Coastguard Worker     }
111*03ce13f7SAndroid Build Coastguard Worker   }
112*03ce13f7SAndroid Build Coastguard Worker }
113*03ce13f7SAndroid Build Coastguard Worker 
alignFunction()114*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::alignFunction() {
115*03ce13f7SAndroid Build Coastguard Worker   const SizeT Align = 1 << getBundleAlignLog2Bytes();
116*03ce13f7SAndroid Build Coastguard Worker   SizeT BytesNeeded = Utils::OffsetToAlignment(Buffer.getPosition(), Align);
117*03ce13f7SAndroid Build Coastguard Worker   constexpr SizeT HltSize = 1;
118*03ce13f7SAndroid Build Coastguard Worker   while (BytesNeeded > 0) {
119*03ce13f7SAndroid Build Coastguard Worker     hlt();
120*03ce13f7SAndroid Build Coastguard Worker     BytesNeeded -= HltSize;
121*03ce13f7SAndroid Build Coastguard Worker   }
122*03ce13f7SAndroid Build Coastguard Worker }
123*03ce13f7SAndroid Build Coastguard Worker 
getOrCreateLabel(SizeT Number,LabelVector & Labels)124*03ce13f7SAndroid Build Coastguard Worker AssemblerX8664::Label *AssemblerX8664::getOrCreateLabel(SizeT Number,
125*03ce13f7SAndroid Build Coastguard Worker                                                         LabelVector &Labels) {
126*03ce13f7SAndroid Build Coastguard Worker   Label *L = nullptr;
127*03ce13f7SAndroid Build Coastguard Worker   if (Number == Labels.size()) {
128*03ce13f7SAndroid Build Coastguard Worker     L = new (this->allocate<Label>()) Label();
129*03ce13f7SAndroid Build Coastguard Worker     Labels.push_back(L);
130*03ce13f7SAndroid Build Coastguard Worker     return L;
131*03ce13f7SAndroid Build Coastguard Worker   }
132*03ce13f7SAndroid Build Coastguard Worker   if (Number > Labels.size()) {
133*03ce13f7SAndroid Build Coastguard Worker     Utils::reserveAndResize(Labels, Number + 1);
134*03ce13f7SAndroid Build Coastguard Worker   }
135*03ce13f7SAndroid Build Coastguard Worker   L = Labels[Number];
136*03ce13f7SAndroid Build Coastguard Worker   if (!L) {
137*03ce13f7SAndroid Build Coastguard Worker     L = new (this->allocate<Label>()) Label();
138*03ce13f7SAndroid Build Coastguard Worker     Labels[Number] = L;
139*03ce13f7SAndroid Build Coastguard Worker   }
140*03ce13f7SAndroid Build Coastguard Worker   return L;
141*03ce13f7SAndroid Build Coastguard Worker }
142*03ce13f7SAndroid Build Coastguard Worker 
getCfgNodeLabel(SizeT NodeNumber)143*03ce13f7SAndroid Build Coastguard Worker Ice::Label *AssemblerX8664::getCfgNodeLabel(SizeT NodeNumber) {
144*03ce13f7SAndroid Build Coastguard Worker   assert(NodeNumber < CfgNodeLabels.size());
145*03ce13f7SAndroid Build Coastguard Worker   return CfgNodeLabels[NodeNumber];
146*03ce13f7SAndroid Build Coastguard Worker }
147*03ce13f7SAndroid Build Coastguard Worker 
148*03ce13f7SAndroid Build Coastguard Worker AssemblerX8664::Label *
getOrCreateCfgNodeLabel(SizeT NodeNumber)149*03ce13f7SAndroid Build Coastguard Worker AssemblerX8664::getOrCreateCfgNodeLabel(SizeT NodeNumber) {
150*03ce13f7SAndroid Build Coastguard Worker   return getOrCreateLabel(NodeNumber, CfgNodeLabels);
151*03ce13f7SAndroid Build Coastguard Worker }
152*03ce13f7SAndroid Build Coastguard Worker 
getOrCreateLocalLabel(SizeT Number)153*03ce13f7SAndroid Build Coastguard Worker AssemblerX8664::Label *AssemblerX8664::getOrCreateLocalLabel(SizeT Number) {
154*03ce13f7SAndroid Build Coastguard Worker   return getOrCreateLabel(Number, LocalLabels);
155*03ce13f7SAndroid Build Coastguard Worker }
156*03ce13f7SAndroid Build Coastguard Worker 
bindCfgNodeLabel(const CfgNode * Node)157*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bindCfgNodeLabel(const CfgNode *Node) {
158*03ce13f7SAndroid Build Coastguard Worker   assert(!getPreliminary());
159*03ce13f7SAndroid Build Coastguard Worker   Label *L = getOrCreateCfgNodeLabel(Node->getIndex());
160*03ce13f7SAndroid Build Coastguard Worker   this->bind(L);
161*03ce13f7SAndroid Build Coastguard Worker }
162*03ce13f7SAndroid Build Coastguard Worker 
bindLocalLabel(SizeT Number)163*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bindLocalLabel(SizeT Number) {
164*03ce13f7SAndroid Build Coastguard Worker   Label *L = getOrCreateLocalLabel(Number);
165*03ce13f7SAndroid Build Coastguard Worker   if (!getPreliminary())
166*03ce13f7SAndroid Build Coastguard Worker     this->bind(L);
167*03ce13f7SAndroid Build Coastguard Worker }
168*03ce13f7SAndroid Build Coastguard Worker 
call(GPRRegister reg)169*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::call(GPRRegister reg) {
170*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
171*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeIrrelevant, reg);
172*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xFF);
173*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(2, gprEncoding(reg));
174*03ce13f7SAndroid Build Coastguard Worker }
175*03ce13f7SAndroid Build Coastguard Worker 
call(const AsmAddress & address)176*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::call(const AsmAddress &address) {
177*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
178*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
179*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xFF);
180*03ce13f7SAndroid Build Coastguard Worker   emitOperand(2, address);
181*03ce13f7SAndroid Build Coastguard Worker }
182*03ce13f7SAndroid Build Coastguard Worker 
call(const ConstantRelocatable * label)183*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::call(const ConstantRelocatable *label) {
184*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
185*03ce13f7SAndroid Build Coastguard Worker   intptr_t call_start = Buffer.getPosition();
186*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE8);
187*03ce13f7SAndroid Build Coastguard Worker   auto *Fixup = this->createFixup(FK_PcRel, label);
188*03ce13f7SAndroid Build Coastguard Worker   Fixup->set_addend(-4);
189*03ce13f7SAndroid Build Coastguard Worker   emitFixup(Fixup);
190*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
191*03ce13f7SAndroid Build Coastguard Worker   assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
192*03ce13f7SAndroid Build Coastguard Worker   (void)call_start;
193*03ce13f7SAndroid Build Coastguard Worker }
194*03ce13f7SAndroid Build Coastguard Worker 
call(const Immediate & abs_address)195*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::call(const Immediate &abs_address) {
196*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
197*03ce13f7SAndroid Build Coastguard Worker   intptr_t call_start = Buffer.getPosition();
198*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE8);
199*03ce13f7SAndroid Build Coastguard Worker   auto *Fixup = this->createFixup(FK_PcRel, AssemblerFixup::NullSymbol);
200*03ce13f7SAndroid Build Coastguard Worker   Fixup->set_addend(abs_address.value() - 4);
201*03ce13f7SAndroid Build Coastguard Worker   emitFixup(Fixup);
202*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
203*03ce13f7SAndroid Build Coastguard Worker   assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
204*03ce13f7SAndroid Build Coastguard Worker   (void)call_start;
205*03ce13f7SAndroid Build Coastguard Worker }
206*03ce13f7SAndroid Build Coastguard Worker 
pushl(GPRRegister reg)207*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pushl(GPRRegister reg) {
208*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
209*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeIrrelevant, reg);
210*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x50 + gprEncoding(reg));
211*03ce13f7SAndroid Build Coastguard Worker }
212*03ce13f7SAndroid Build Coastguard Worker 
pushl(const Immediate & Imm)213*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pushl(const Immediate &Imm) {
214*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
215*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x68);
216*03ce13f7SAndroid Build Coastguard Worker   emitInt32(Imm.value());
217*03ce13f7SAndroid Build Coastguard Worker }
218*03ce13f7SAndroid Build Coastguard Worker 
pushl(const ConstantRelocatable * Label)219*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pushl(const ConstantRelocatable *Label) {
220*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
221*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x68);
222*03ce13f7SAndroid Build Coastguard Worker   emitFixup(this->createFixup(FK_Abs, Label));
223*03ce13f7SAndroid Build Coastguard Worker   // In x86-32, the emitted value is an addend to the relocation. Therefore, we
224*03ce13f7SAndroid Build Coastguard Worker   // must emit a 0 (because we're pushing an absolute relocation.)
225*03ce13f7SAndroid Build Coastguard Worker   // In x86-64, the emitted value does not matter (the addend lives in the
226*03ce13f7SAndroid Build Coastguard Worker   // relocation record as an extra field.)
227*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
228*03ce13f7SAndroid Build Coastguard Worker }
229*03ce13f7SAndroid Build Coastguard Worker 
popl(GPRRegister reg)230*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::popl(GPRRegister reg) {
231*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
232*03ce13f7SAndroid Build Coastguard Worker   // Any type that would not force a REX prefix to be emitted can be provided
233*03ce13f7SAndroid Build Coastguard Worker   // here.
234*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeIrrelevant, reg);
235*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x58 + gprEncoding(reg));
236*03ce13f7SAndroid Build Coastguard Worker }
237*03ce13f7SAndroid Build Coastguard Worker 
popl(const AsmAddress & address)238*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::popl(const AsmAddress &address) {
239*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
240*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
241*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x8F);
242*03ce13f7SAndroid Build Coastguard Worker   emitOperand(0, address);
243*03ce13f7SAndroid Build Coastguard Worker }
244*03ce13f7SAndroid Build Coastguard Worker 
setcc(BrCond condition,ByteRegister dst)245*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::setcc(BrCond condition, ByteRegister dst) {
246*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
247*03ce13f7SAndroid Build Coastguard Worker   emitRexB(IceType_i8, dst);
248*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
249*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x90 + condition);
250*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC0 + gprEncoding(dst));
251*03ce13f7SAndroid Build Coastguard Worker }
252*03ce13f7SAndroid Build Coastguard Worker 
setcc(BrCond condition,const AsmAddress & address)253*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::setcc(BrCond condition, const AsmAddress &address) {
254*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
255*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
256*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
257*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x90 + condition);
258*03ce13f7SAndroid Build Coastguard Worker   emitOperand(0, address);
259*03ce13f7SAndroid Build Coastguard Worker }
260*03ce13f7SAndroid Build Coastguard Worker 
mov(Type Ty,GPRRegister dst,const Immediate & imm)261*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mov(Type Ty, GPRRegister dst, const Immediate &imm) {
262*03ce13f7SAndroid Build Coastguard Worker   assert(Ty != IceType_i64 && "i64 not supported yet.");
263*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
264*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
265*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
266*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, dst);
267*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty)) {
268*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xB0 + gprEncoding(dst));
269*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value() & 0xFF);
270*03ce13f7SAndroid Build Coastguard Worker   } else {
271*03ce13f7SAndroid Build Coastguard Worker     // TODO(jpp): When removing the assertion above ensure that in x86-64 we
272*03ce13f7SAndroid Build Coastguard Worker     // emit a 64-bit immediate.
273*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xB8 + gprEncoding(dst));
274*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, imm);
275*03ce13f7SAndroid Build Coastguard Worker   }
276*03ce13f7SAndroid Build Coastguard Worker }
277*03ce13f7SAndroid Build Coastguard Worker 
mov(Type Ty,GPRRegister dst,GPRRegister src)278*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mov(Type Ty, GPRRegister dst, GPRRegister src) {
279*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
280*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
281*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
282*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, src, dst);
283*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty)) {
284*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x88);
285*03ce13f7SAndroid Build Coastguard Worker   } else {
286*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x89);
287*03ce13f7SAndroid Build Coastguard Worker   }
288*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
289*03ce13f7SAndroid Build Coastguard Worker }
290*03ce13f7SAndroid Build Coastguard Worker 
mov(Type Ty,GPRRegister dst,const AsmAddress & src)291*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mov(Type Ty, GPRRegister dst, const AsmAddress &src) {
292*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
293*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
294*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
295*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, src, dst);
296*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty)) {
297*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x8A);
298*03ce13f7SAndroid Build Coastguard Worker   } else {
299*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x8B);
300*03ce13f7SAndroid Build Coastguard Worker   }
301*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
302*03ce13f7SAndroid Build Coastguard Worker }
303*03ce13f7SAndroid Build Coastguard Worker 
mov(Type Ty,const AsmAddress & dst,GPRRegister src)304*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mov(Type Ty, const AsmAddress &dst, GPRRegister src) {
305*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
306*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
307*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
308*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, dst, src);
309*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty)) {
310*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x88);
311*03ce13f7SAndroid Build Coastguard Worker   } else {
312*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x89);
313*03ce13f7SAndroid Build Coastguard Worker   }
314*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(src), dst);
315*03ce13f7SAndroid Build Coastguard Worker }
316*03ce13f7SAndroid Build Coastguard Worker 
mov(Type Ty,const AsmAddress & dst,const Immediate & imm)317*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mov(Type Ty, const AsmAddress &dst, const Immediate &imm) {
318*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
319*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
320*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
321*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, dst, RexRegIrrelevant);
322*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty)) {
323*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xC6);
324*03ce13f7SAndroid Build Coastguard Worker     static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
325*03ce13f7SAndroid Build Coastguard Worker     emitOperand(0, dst, OffsetFromNextInstruction);
326*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value() & 0xFF);
327*03ce13f7SAndroid Build Coastguard Worker   } else {
328*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xC7);
329*03ce13f7SAndroid Build Coastguard Worker     const uint8_t OffsetFromNextInstruction = Ty == IceType_i16 ? 2 : 4;
330*03ce13f7SAndroid Build Coastguard Worker     emitOperand(0, dst, OffsetFromNextInstruction);
331*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, imm);
332*03ce13f7SAndroid Build Coastguard Worker   }
333*03ce13f7SAndroid Build Coastguard Worker }
334*03ce13f7SAndroid Build Coastguard Worker 
movabs(const GPRRegister Dst,uint64_t Imm64)335*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movabs(const GPRRegister Dst, uint64_t Imm64) {
336*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
337*03ce13f7SAndroid Build Coastguard Worker   const bool NeedsRexW = (Imm64 & ~0xFFFFFFFFull) != 0;
338*03ce13f7SAndroid Build Coastguard Worker   const Type RexType = NeedsRexW ? RexTypeForceRexW : RexTypeIrrelevant;
339*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexType, Dst);
340*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xB8 | gprEncoding(Dst));
341*03ce13f7SAndroid Build Coastguard Worker   // When emitting Imm64, we don't have to mask out the upper 32 bits for
342*03ce13f7SAndroid Build Coastguard Worker   // emitInt32 will/should only emit a 32-bit constant. In reality, we are
343*03ce13f7SAndroid Build Coastguard Worker   // paranoid, so we go ahead an mask the upper bits out anyway.
344*03ce13f7SAndroid Build Coastguard Worker   emitInt32(Imm64 & 0xFFFFFFFF);
345*03ce13f7SAndroid Build Coastguard Worker   if (NeedsRexW)
346*03ce13f7SAndroid Build Coastguard Worker     emitInt32((Imm64 >> 32) & 0xFFFFFFFF);
347*03ce13f7SAndroid Build Coastguard Worker }
348*03ce13f7SAndroid Build Coastguard Worker 
movzx(Type SrcTy,GPRRegister dst,GPRRegister src)349*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movzx(Type SrcTy, GPRRegister dst, GPRRegister src) {
350*03ce13f7SAndroid Build Coastguard Worker   if (SrcTy == IceType_i32) {
351*03ce13f7SAndroid Build Coastguard Worker     // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit
352*03ce13f7SAndroid Build Coastguard Worker     // operand to 64-bit.
353*03ce13f7SAndroid Build Coastguard Worker     mov(IceType_i32, dst, src);
354*03ce13f7SAndroid Build Coastguard Worker     return;
355*03ce13f7SAndroid Build Coastguard Worker   }
356*03ce13f7SAndroid Build Coastguard Worker 
357*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
358*03ce13f7SAndroid Build Coastguard Worker   bool ByteSized = isByteSizedType(SrcTy);
359*03ce13f7SAndroid Build Coastguard Worker   assert(ByteSized || SrcTy == IceType_i16);
360*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, SrcTy, src);
361*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
362*03ce13f7SAndroid Build Coastguard Worker   emitUint8(ByteSized ? 0xB6 : 0xB7);
363*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
364*03ce13f7SAndroid Build Coastguard Worker }
365*03ce13f7SAndroid Build Coastguard Worker 
movzx(Type SrcTy,GPRRegister dst,const AsmAddress & src)366*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movzx(Type SrcTy, GPRRegister dst, const AsmAddress &src) {
367*03ce13f7SAndroid Build Coastguard Worker   if (SrcTy == IceType_i32) {
368*03ce13f7SAndroid Build Coastguard Worker     // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit
369*03ce13f7SAndroid Build Coastguard Worker     // operand to 64-bit.
370*03ce13f7SAndroid Build Coastguard Worker     mov(IceType_i32, dst, src);
371*03ce13f7SAndroid Build Coastguard Worker     return;
372*03ce13f7SAndroid Build Coastguard Worker   }
373*03ce13f7SAndroid Build Coastguard Worker 
374*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
375*03ce13f7SAndroid Build Coastguard Worker   bool ByteSized = isByteSizedType(SrcTy);
376*03ce13f7SAndroid Build Coastguard Worker   assert(ByteSized || SrcTy == IceType_i16);
377*03ce13f7SAndroid Build Coastguard Worker   emitRex(SrcTy, src, RexTypeIrrelevant, dst);
378*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
379*03ce13f7SAndroid Build Coastguard Worker   emitUint8(ByteSized ? 0xB6 : 0xB7);
380*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
381*03ce13f7SAndroid Build Coastguard Worker }
382*03ce13f7SAndroid Build Coastguard Worker 
movsx(Type SrcTy,GPRRegister dst,GPRRegister src)383*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movsx(Type SrcTy, GPRRegister dst, GPRRegister src) {
384*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
385*03ce13f7SAndroid Build Coastguard Worker   bool ByteSized = isByteSizedType(SrcTy);
386*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeForceRexW, dst, SrcTy, src);
387*03ce13f7SAndroid Build Coastguard Worker   if (ByteSized || SrcTy == IceType_i16) {
388*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
389*03ce13f7SAndroid Build Coastguard Worker     emitUint8(ByteSized ? 0xBE : 0xBF);
390*03ce13f7SAndroid Build Coastguard Worker   } else {
391*03ce13f7SAndroid Build Coastguard Worker     assert(SrcTy == IceType_i32);
392*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x63);
393*03ce13f7SAndroid Build Coastguard Worker   }
394*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
395*03ce13f7SAndroid Build Coastguard Worker }
396*03ce13f7SAndroid Build Coastguard Worker 
movsx(Type SrcTy,GPRRegister dst,const AsmAddress & src)397*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movsx(Type SrcTy, GPRRegister dst, const AsmAddress &src) {
398*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
399*03ce13f7SAndroid Build Coastguard Worker   bool ByteSized = isByteSizedType(SrcTy);
400*03ce13f7SAndroid Build Coastguard Worker   emitRex(SrcTy, src, RexTypeForceRexW, dst);
401*03ce13f7SAndroid Build Coastguard Worker   if (ByteSized || SrcTy == IceType_i16) {
402*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
403*03ce13f7SAndroid Build Coastguard Worker     emitUint8(ByteSized ? 0xBE : 0xBF);
404*03ce13f7SAndroid Build Coastguard Worker   } else {
405*03ce13f7SAndroid Build Coastguard Worker     assert(SrcTy == IceType_i32);
406*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x63);
407*03ce13f7SAndroid Build Coastguard Worker   }
408*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
409*03ce13f7SAndroid Build Coastguard Worker }
410*03ce13f7SAndroid Build Coastguard Worker 
lea(Type Ty,GPRRegister dst,const AsmAddress & src)411*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::lea(Type Ty, GPRRegister dst, const AsmAddress &src) {
412*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
413*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
414*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
415*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
416*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, src, dst);
417*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x8D);
418*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
419*03ce13f7SAndroid Build Coastguard Worker }
420*03ce13f7SAndroid Build Coastguard Worker 
cmov(Type Ty,BrCond cond,GPRRegister dst,GPRRegister src)421*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmov(Type Ty, BrCond cond, GPRRegister dst,
422*03ce13f7SAndroid Build Coastguard Worker                           GPRRegister src) {
423*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
424*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
425*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
426*03ce13f7SAndroid Build Coastguard Worker   else
427*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32 || Ty == IceType_i64);
428*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, dst, src);
429*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
430*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x40 + cond);
431*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
432*03ce13f7SAndroid Build Coastguard Worker }
433*03ce13f7SAndroid Build Coastguard Worker 
cmov(Type Ty,BrCond cond,GPRRegister dst,const AsmAddress & src)434*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmov(Type Ty, BrCond cond, GPRRegister dst,
435*03ce13f7SAndroid Build Coastguard Worker                           const AsmAddress &src) {
436*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
437*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
438*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
439*03ce13f7SAndroid Build Coastguard Worker   else
440*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32 || Ty == IceType_i64);
441*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, src, dst);
442*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
443*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x40 + cond);
444*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
445*03ce13f7SAndroid Build Coastguard Worker }
446*03ce13f7SAndroid Build Coastguard Worker 
rep_movsb()447*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::rep_movsb() {
448*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
449*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF3);
450*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xA4);
451*03ce13f7SAndroid Build Coastguard Worker }
452*03ce13f7SAndroid Build Coastguard Worker 
movss(Type Ty,XmmRegister dst,const AsmAddress & src)453*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movss(Type Ty, XmmRegister dst, const AsmAddress &src) {
454*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
455*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
456*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
457*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
458*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x10);
459*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
460*03ce13f7SAndroid Build Coastguard Worker }
461*03ce13f7SAndroid Build Coastguard Worker 
movss(Type Ty,const AsmAddress & dst,XmmRegister src)462*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movss(Type Ty, const AsmAddress &dst, XmmRegister src) {
463*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
464*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
465*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, dst, src);
466*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
467*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x11);
468*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(src), dst);
469*03ce13f7SAndroid Build Coastguard Worker }
470*03ce13f7SAndroid Build Coastguard Worker 
movss(Type Ty,XmmRegister dst,XmmRegister src)471*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movss(Type Ty, XmmRegister dst, XmmRegister src) {
472*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
473*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
474*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, src, dst);
475*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
476*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x11);
477*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(src, dst);
478*03ce13f7SAndroid Build Coastguard Worker }
479*03ce13f7SAndroid Build Coastguard Worker 
movd(Type SrcTy,XmmRegister dst,GPRRegister src)480*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movd(Type SrcTy, XmmRegister dst, GPRRegister src) {
481*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
482*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
483*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(SrcTy, dst, src);
484*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
485*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x6E);
486*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
487*03ce13f7SAndroid Build Coastguard Worker }
488*03ce13f7SAndroid Build Coastguard Worker 
movd(Type SrcTy,XmmRegister dst,const AsmAddress & src)489*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movd(Type SrcTy, XmmRegister dst, const AsmAddress &src) {
490*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
491*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
492*03ce13f7SAndroid Build Coastguard Worker   emitRex(SrcTy, src, dst);
493*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
494*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x6E);
495*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
496*03ce13f7SAndroid Build Coastguard Worker }
497*03ce13f7SAndroid Build Coastguard Worker 
movd(Type DestTy,GPRRegister dst,XmmRegister src)498*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movd(Type DestTy, GPRRegister dst, XmmRegister src) {
499*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
500*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
501*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(DestTy, src, dst);
502*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
503*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x7E);
504*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
505*03ce13f7SAndroid Build Coastguard Worker }
506*03ce13f7SAndroid Build Coastguard Worker 
movd(Type DestTy,const AsmAddress & dst,XmmRegister src)507*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movd(Type DestTy, const AsmAddress &dst, XmmRegister src) {
508*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
509*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
510*03ce13f7SAndroid Build Coastguard Worker   emitRex(DestTy, dst, src);
511*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
512*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x7E);
513*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(src), dst);
514*03ce13f7SAndroid Build Coastguard Worker }
515*03ce13f7SAndroid Build Coastguard Worker 
movq(XmmRegister dst,XmmRegister src)516*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movq(XmmRegister dst, XmmRegister src) {
517*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
518*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF3);
519*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
520*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
521*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x7E);
522*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
523*03ce13f7SAndroid Build Coastguard Worker }
524*03ce13f7SAndroid Build Coastguard Worker 
movq(const AsmAddress & dst,XmmRegister src)525*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movq(const AsmAddress &dst, XmmRegister src) {
526*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
527*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
528*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, dst, src);
529*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
530*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xD6);
531*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(src), dst);
532*03ce13f7SAndroid Build Coastguard Worker }
533*03ce13f7SAndroid Build Coastguard Worker 
movq(XmmRegister dst,const AsmAddress & src)534*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movq(XmmRegister dst, const AsmAddress &src) {
535*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
536*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF3);
537*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
538*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
539*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x7E);
540*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
541*03ce13f7SAndroid Build Coastguard Worker }
542*03ce13f7SAndroid Build Coastguard Worker 
addss(Type Ty,XmmRegister dst,XmmRegister src)543*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::addss(Type Ty, XmmRegister dst, XmmRegister src) {
544*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
545*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
546*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
547*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
548*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x58);
549*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
550*03ce13f7SAndroid Build Coastguard Worker }
551*03ce13f7SAndroid Build Coastguard Worker 
addss(Type Ty,XmmRegister dst,const AsmAddress & src)552*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::addss(Type Ty, XmmRegister dst, const AsmAddress &src) {
553*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
554*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
555*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
556*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
557*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x58);
558*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
559*03ce13f7SAndroid Build Coastguard Worker }
560*03ce13f7SAndroid Build Coastguard Worker 
subss(Type Ty,XmmRegister dst,XmmRegister src)561*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::subss(Type Ty, XmmRegister dst, XmmRegister src) {
562*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
563*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
564*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
565*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
566*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5C);
567*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
568*03ce13f7SAndroid Build Coastguard Worker }
569*03ce13f7SAndroid Build Coastguard Worker 
subss(Type Ty,XmmRegister dst,const AsmAddress & src)570*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::subss(Type Ty, XmmRegister dst, const AsmAddress &src) {
571*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
572*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
573*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
574*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
575*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5C);
576*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
577*03ce13f7SAndroid Build Coastguard Worker }
578*03ce13f7SAndroid Build Coastguard Worker 
mulss(Type Ty,XmmRegister dst,XmmRegister src)579*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mulss(Type Ty, XmmRegister dst, XmmRegister src) {
580*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
581*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
582*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
583*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
584*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x59);
585*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
586*03ce13f7SAndroid Build Coastguard Worker }
587*03ce13f7SAndroid Build Coastguard Worker 
mulss(Type Ty,XmmRegister dst,const AsmAddress & src)588*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mulss(Type Ty, XmmRegister dst, const AsmAddress &src) {
589*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
590*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
591*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
592*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
593*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x59);
594*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
595*03ce13f7SAndroid Build Coastguard Worker }
596*03ce13f7SAndroid Build Coastguard Worker 
divss(Type Ty,XmmRegister dst,XmmRegister src)597*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::divss(Type Ty, XmmRegister dst, XmmRegister src) {
598*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
599*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
600*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
601*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
602*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5E);
603*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
604*03ce13f7SAndroid Build Coastguard Worker }
605*03ce13f7SAndroid Build Coastguard Worker 
divss(Type Ty,XmmRegister dst,const AsmAddress & src)606*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::divss(Type Ty, XmmRegister dst, const AsmAddress &src) {
607*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
608*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
609*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
610*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
611*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5E);
612*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
613*03ce13f7SAndroid Build Coastguard Worker }
614*03ce13f7SAndroid Build Coastguard Worker 
movaps(XmmRegister dst,XmmRegister src)615*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movaps(XmmRegister dst, XmmRegister src) {
616*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
617*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
618*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
619*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x28);
620*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
621*03ce13f7SAndroid Build Coastguard Worker }
622*03ce13f7SAndroid Build Coastguard Worker 
movups(XmmRegister dst,XmmRegister src)623*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movups(XmmRegister dst, XmmRegister src) {
624*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
625*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
626*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
627*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x10);
628*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
629*03ce13f7SAndroid Build Coastguard Worker }
630*03ce13f7SAndroid Build Coastguard Worker 
movups(XmmRegister dst,const AsmAddress & src)631*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movups(XmmRegister dst, const AsmAddress &src) {
632*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
633*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
634*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
635*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x10);
636*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
637*03ce13f7SAndroid Build Coastguard Worker }
638*03ce13f7SAndroid Build Coastguard Worker 
movups(const AsmAddress & dst,XmmRegister src)639*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movups(const AsmAddress &dst, XmmRegister src) {
640*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
641*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, dst, src);
642*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
643*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x11);
644*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(src), dst);
645*03ce13f7SAndroid Build Coastguard Worker }
646*03ce13f7SAndroid Build Coastguard Worker 
padd(Type Ty,XmmRegister dst,XmmRegister src)647*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::padd(Type Ty, XmmRegister dst, XmmRegister src) {
648*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
649*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
650*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
651*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
652*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
653*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFC);
654*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
655*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFD);
656*03ce13f7SAndroid Build Coastguard Worker   } else {
657*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFE);
658*03ce13f7SAndroid Build Coastguard Worker   }
659*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
660*03ce13f7SAndroid Build Coastguard Worker }
661*03ce13f7SAndroid Build Coastguard Worker 
padd(Type Ty,XmmRegister dst,const AsmAddress & src)662*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::padd(Type Ty, XmmRegister dst, const AsmAddress &src) {
663*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
664*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
665*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
666*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
667*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
668*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFC);
669*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
670*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFD);
671*03ce13f7SAndroid Build Coastguard Worker   } else {
672*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFE);
673*03ce13f7SAndroid Build Coastguard Worker   }
674*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
675*03ce13f7SAndroid Build Coastguard Worker }
676*03ce13f7SAndroid Build Coastguard Worker 
padds(Type Ty,XmmRegister dst,XmmRegister src)677*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::padds(Type Ty, XmmRegister dst, XmmRegister src) {
678*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
679*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
680*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
681*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
682*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
683*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xEC);
684*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
685*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xED);
686*03ce13f7SAndroid Build Coastguard Worker   } else {
687*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected padds operand type");
688*03ce13f7SAndroid Build Coastguard Worker   }
689*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
690*03ce13f7SAndroid Build Coastguard Worker }
691*03ce13f7SAndroid Build Coastguard Worker 
padds(Type Ty,XmmRegister dst,const AsmAddress & src)692*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::padds(Type Ty, XmmRegister dst, const AsmAddress &src) {
693*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
694*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
695*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
696*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
697*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
698*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xEC);
699*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
700*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xED);
701*03ce13f7SAndroid Build Coastguard Worker   } else {
702*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected padds operand type");
703*03ce13f7SAndroid Build Coastguard Worker   }
704*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
705*03ce13f7SAndroid Build Coastguard Worker }
706*03ce13f7SAndroid Build Coastguard Worker 
paddus(Type Ty,XmmRegister dst,XmmRegister src)707*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::paddus(Type Ty, XmmRegister dst, XmmRegister src) {
708*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
709*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
710*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
711*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
712*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
713*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xDC);
714*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
715*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xDD);
716*03ce13f7SAndroid Build Coastguard Worker   } else {
717*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected paddus operand type");
718*03ce13f7SAndroid Build Coastguard Worker   }
719*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
720*03ce13f7SAndroid Build Coastguard Worker }
721*03ce13f7SAndroid Build Coastguard Worker 
paddus(Type Ty,XmmRegister dst,const AsmAddress & src)722*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::paddus(Type Ty, XmmRegister dst, const AsmAddress &src) {
723*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
724*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
725*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
726*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
727*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
728*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xDC);
729*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
730*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xDD);
731*03ce13f7SAndroid Build Coastguard Worker   } else {
732*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected paddus operand type");
733*03ce13f7SAndroid Build Coastguard Worker   }
734*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
735*03ce13f7SAndroid Build Coastguard Worker }
736*03ce13f7SAndroid Build Coastguard Worker 
pand(Type,XmmRegister dst,XmmRegister src)737*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pand(Type /* Ty */, XmmRegister dst, XmmRegister src) {
738*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
739*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
740*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
741*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
742*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xDB);
743*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
744*03ce13f7SAndroid Build Coastguard Worker }
745*03ce13f7SAndroid Build Coastguard Worker 
pand(Type,XmmRegister dst,const AsmAddress & src)746*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pand(Type /* Ty */, XmmRegister dst,
747*03ce13f7SAndroid Build Coastguard Worker                           const AsmAddress &src) {
748*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
749*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
750*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
751*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
752*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xDB);
753*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
754*03ce13f7SAndroid Build Coastguard Worker }
755*03ce13f7SAndroid Build Coastguard Worker 
pandn(Type,XmmRegister dst,XmmRegister src)756*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pandn(Type /* Ty */, XmmRegister dst, XmmRegister src) {
757*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
758*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
759*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
760*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
761*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xDF);
762*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
763*03ce13f7SAndroid Build Coastguard Worker }
764*03ce13f7SAndroid Build Coastguard Worker 
pandn(Type,XmmRegister dst,const AsmAddress & src)765*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pandn(Type /* Ty */, XmmRegister dst,
766*03ce13f7SAndroid Build Coastguard Worker                            const AsmAddress &src) {
767*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
768*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
769*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
770*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
771*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xDF);
772*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
773*03ce13f7SAndroid Build Coastguard Worker }
774*03ce13f7SAndroid Build Coastguard Worker 
pmull(Type Ty,XmmRegister dst,XmmRegister src)775*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmull(Type Ty, XmmRegister dst, XmmRegister src) {
776*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
777*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
778*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
779*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
780*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
781*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD5);
782*03ce13f7SAndroid Build Coastguard Worker   } else {
783*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
784*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x38);
785*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x40);
786*03ce13f7SAndroid Build Coastguard Worker   }
787*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
788*03ce13f7SAndroid Build Coastguard Worker }
789*03ce13f7SAndroid Build Coastguard Worker 
pmull(Type Ty,XmmRegister dst,const AsmAddress & src)790*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmull(Type Ty, XmmRegister dst, const AsmAddress &src) {
791*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
792*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
793*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
794*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
795*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
796*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD5);
797*03ce13f7SAndroid Build Coastguard Worker   } else {
798*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
799*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x38);
800*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x40);
801*03ce13f7SAndroid Build Coastguard Worker   }
802*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
803*03ce13f7SAndroid Build Coastguard Worker }
804*03ce13f7SAndroid Build Coastguard Worker 
pmulhw(Type Ty,XmmRegister dst,XmmRegister src)805*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmulhw(Type Ty, XmmRegister dst, XmmRegister src) {
806*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
807*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
808*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
809*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
810*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_v8i16);
811*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
812*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE5);
813*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
814*03ce13f7SAndroid Build Coastguard Worker }
815*03ce13f7SAndroid Build Coastguard Worker 
pmulhw(Type Ty,XmmRegister dst,const AsmAddress & src)816*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmulhw(Type Ty, XmmRegister dst, const AsmAddress &src) {
817*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
818*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
819*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
820*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
821*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_v8i16);
822*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
823*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE5);
824*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
825*03ce13f7SAndroid Build Coastguard Worker }
826*03ce13f7SAndroid Build Coastguard Worker 
pmulhuw(Type Ty,XmmRegister dst,XmmRegister src)827*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmulhuw(Type Ty, XmmRegister dst, XmmRegister src) {
828*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
829*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
830*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
831*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
832*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_v8i16);
833*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
834*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE4);
835*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
836*03ce13f7SAndroid Build Coastguard Worker }
837*03ce13f7SAndroid Build Coastguard Worker 
pmulhuw(Type Ty,XmmRegister dst,const AsmAddress & src)838*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmulhuw(Type Ty, XmmRegister dst, const AsmAddress &src) {
839*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
840*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
841*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
842*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
843*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_v8i16);
844*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
845*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE4);
846*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
847*03ce13f7SAndroid Build Coastguard Worker }
848*03ce13f7SAndroid Build Coastguard Worker 
pmaddwd(Type Ty,XmmRegister dst,XmmRegister src)849*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmaddwd(Type Ty, XmmRegister dst, XmmRegister src) {
850*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
851*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
852*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
853*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
854*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_v8i16);
855*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
856*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF5);
857*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
858*03ce13f7SAndroid Build Coastguard Worker }
859*03ce13f7SAndroid Build Coastguard Worker 
pmaddwd(Type Ty,XmmRegister dst,const AsmAddress & src)860*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmaddwd(Type Ty, XmmRegister dst, const AsmAddress &src) {
861*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
862*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
863*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
864*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
865*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_v8i16);
866*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
867*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF5);
868*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
869*03ce13f7SAndroid Build Coastguard Worker }
870*03ce13f7SAndroid Build Coastguard Worker 
pmuludq(Type,XmmRegister dst,XmmRegister src)871*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmuludq(Type /* Ty */, XmmRegister dst, XmmRegister src) {
872*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
873*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
874*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
875*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
876*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF4);
877*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
878*03ce13f7SAndroid Build Coastguard Worker }
879*03ce13f7SAndroid Build Coastguard Worker 
pmuludq(Type,XmmRegister dst,const AsmAddress & src)880*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmuludq(Type /* Ty */, XmmRegister dst,
881*03ce13f7SAndroid Build Coastguard Worker                              const AsmAddress &src) {
882*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
883*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
884*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
885*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
886*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF4);
887*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
888*03ce13f7SAndroid Build Coastguard Worker }
889*03ce13f7SAndroid Build Coastguard Worker 
por(Type,XmmRegister dst,XmmRegister src)890*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::por(Type /* Ty */, XmmRegister dst, XmmRegister src) {
891*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
892*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
893*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
894*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
895*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xEB);
896*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
897*03ce13f7SAndroid Build Coastguard Worker }
898*03ce13f7SAndroid Build Coastguard Worker 
por(Type,XmmRegister dst,const AsmAddress & src)899*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::por(Type /* Ty */, XmmRegister dst,
900*03ce13f7SAndroid Build Coastguard Worker                          const AsmAddress &src) {
901*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
902*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
903*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
904*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
905*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xEB);
906*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
907*03ce13f7SAndroid Build Coastguard Worker }
908*03ce13f7SAndroid Build Coastguard Worker 
psub(Type Ty,XmmRegister dst,XmmRegister src)909*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psub(Type Ty, XmmRegister dst, XmmRegister src) {
910*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
911*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
912*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
913*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
914*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
915*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF8);
916*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
917*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF9);
918*03ce13f7SAndroid Build Coastguard Worker   } else {
919*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFA);
920*03ce13f7SAndroid Build Coastguard Worker   }
921*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
922*03ce13f7SAndroid Build Coastguard Worker }
923*03ce13f7SAndroid Build Coastguard Worker 
psub(Type Ty,XmmRegister dst,const AsmAddress & src)924*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psub(Type Ty, XmmRegister dst, const AsmAddress &src) {
925*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
926*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
927*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
928*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
929*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
930*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF8);
931*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
932*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF9);
933*03ce13f7SAndroid Build Coastguard Worker   } else {
934*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xFA);
935*03ce13f7SAndroid Build Coastguard Worker   }
936*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
937*03ce13f7SAndroid Build Coastguard Worker }
938*03ce13f7SAndroid Build Coastguard Worker 
psubs(Type Ty,XmmRegister dst,XmmRegister src)939*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psubs(Type Ty, XmmRegister dst, XmmRegister src) {
940*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
941*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
942*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
943*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
944*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
945*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE8);
946*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
947*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE9);
948*03ce13f7SAndroid Build Coastguard Worker   } else {
949*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected psubs operand type");
950*03ce13f7SAndroid Build Coastguard Worker   }
951*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
952*03ce13f7SAndroid Build Coastguard Worker }
953*03ce13f7SAndroid Build Coastguard Worker 
psubs(Type Ty,XmmRegister dst,const AsmAddress & src)954*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psubs(Type Ty, XmmRegister dst, const AsmAddress &src) {
955*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
956*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
957*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
958*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
959*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
960*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE8);
961*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
962*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE9);
963*03ce13f7SAndroid Build Coastguard Worker   } else {
964*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected psubs operand type");
965*03ce13f7SAndroid Build Coastguard Worker   }
966*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
967*03ce13f7SAndroid Build Coastguard Worker }
968*03ce13f7SAndroid Build Coastguard Worker 
psubus(Type Ty,XmmRegister dst,XmmRegister src)969*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psubus(Type Ty, XmmRegister dst, XmmRegister src) {
970*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
971*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
972*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
973*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
974*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
975*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD8);
976*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
977*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD9);
978*03ce13f7SAndroid Build Coastguard Worker   } else {
979*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected psubus operand type");
980*03ce13f7SAndroid Build Coastguard Worker   }
981*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
982*03ce13f7SAndroid Build Coastguard Worker }
983*03ce13f7SAndroid Build Coastguard Worker 
psubus(Type Ty,XmmRegister dst,const AsmAddress & src)984*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psubus(Type Ty, XmmRegister dst, const AsmAddress &src) {
985*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
986*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
987*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
988*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
989*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
990*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD8);
991*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
992*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD9);
993*03ce13f7SAndroid Build Coastguard Worker   } else {
994*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected psubus operand type");
995*03ce13f7SAndroid Build Coastguard Worker   }
996*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
997*03ce13f7SAndroid Build Coastguard Worker }
998*03ce13f7SAndroid Build Coastguard Worker 
pxor(Type,XmmRegister dst,XmmRegister src)999*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pxor(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1000*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1001*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1002*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1003*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1004*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xEF);
1005*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1006*03ce13f7SAndroid Build Coastguard Worker }
1007*03ce13f7SAndroid Build Coastguard Worker 
pxor(Type,XmmRegister dst,const AsmAddress & src)1008*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pxor(Type /* Ty */, XmmRegister dst,
1009*03ce13f7SAndroid Build Coastguard Worker                           const AsmAddress &src) {
1010*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1011*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1012*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1013*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1014*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xEF);
1015*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1016*03ce13f7SAndroid Build Coastguard Worker }
1017*03ce13f7SAndroid Build Coastguard Worker 
psll(Type Ty,XmmRegister dst,XmmRegister src)1018*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psll(Type Ty, XmmRegister dst, XmmRegister src) {
1019*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1020*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1021*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1022*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1023*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1024*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF1);
1025*03ce13f7SAndroid Build Coastguard Worker   } else {
1026*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
1027*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF2);
1028*03ce13f7SAndroid Build Coastguard Worker   }
1029*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1030*03ce13f7SAndroid Build Coastguard Worker }
1031*03ce13f7SAndroid Build Coastguard Worker 
psll(Type Ty,XmmRegister dst,const AsmAddress & src)1032*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psll(Type Ty, XmmRegister dst, const AsmAddress &src) {
1033*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1034*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1035*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1036*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1037*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1038*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF1);
1039*03ce13f7SAndroid Build Coastguard Worker   } else {
1040*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
1041*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF2);
1042*03ce13f7SAndroid Build Coastguard Worker   }
1043*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1044*03ce13f7SAndroid Build Coastguard Worker }
1045*03ce13f7SAndroid Build Coastguard Worker 
psll(Type Ty,XmmRegister dst,const Immediate & imm)1046*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psll(Type Ty, XmmRegister dst, const Immediate &imm) {
1047*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1048*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_int8());
1049*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1050*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeIrrelevant, dst);
1051*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1052*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1053*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x71);
1054*03ce13f7SAndroid Build Coastguard Worker   } else {
1055*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
1056*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x72);
1057*03ce13f7SAndroid Build Coastguard Worker   }
1058*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(6, gprEncoding(dst));
1059*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value() & 0xFF);
1060*03ce13f7SAndroid Build Coastguard Worker }
1061*03ce13f7SAndroid Build Coastguard Worker 
psra(Type Ty,XmmRegister dst,XmmRegister src)1062*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psra(Type Ty, XmmRegister dst, XmmRegister src) {
1063*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1064*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1065*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1066*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1067*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1068*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE1);
1069*03ce13f7SAndroid Build Coastguard Worker   } else {
1070*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
1071*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE2);
1072*03ce13f7SAndroid Build Coastguard Worker   }
1073*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1074*03ce13f7SAndroid Build Coastguard Worker }
1075*03ce13f7SAndroid Build Coastguard Worker 
psra(Type Ty,XmmRegister dst,const AsmAddress & src)1076*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psra(Type Ty, XmmRegister dst, const AsmAddress &src) {
1077*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1078*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1079*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1080*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1081*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1082*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE1);
1083*03ce13f7SAndroid Build Coastguard Worker   } else {
1084*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
1085*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE2);
1086*03ce13f7SAndroid Build Coastguard Worker   }
1087*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1088*03ce13f7SAndroid Build Coastguard Worker }
1089*03ce13f7SAndroid Build Coastguard Worker 
psra(Type Ty,XmmRegister dst,const Immediate & imm)1090*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psra(Type Ty, XmmRegister dst, const Immediate &imm) {
1091*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1092*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_int8());
1093*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1094*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeIrrelevant, dst);
1095*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1096*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1097*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x71);
1098*03ce13f7SAndroid Build Coastguard Worker   } else {
1099*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32);
1100*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x72);
1101*03ce13f7SAndroid Build Coastguard Worker   }
1102*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(4, gprEncoding(dst));
1103*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value() & 0xFF);
1104*03ce13f7SAndroid Build Coastguard Worker }
1105*03ce13f7SAndroid Build Coastguard Worker 
psrl(Type Ty,XmmRegister dst,XmmRegister src)1106*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psrl(Type Ty, XmmRegister dst, XmmRegister src) {
1107*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1108*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1109*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1110*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1111*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1112*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD1);
1113*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_f64) {
1114*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD3);
1115*03ce13f7SAndroid Build Coastguard Worker   } else {
1116*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
1117*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD2);
1118*03ce13f7SAndroid Build Coastguard Worker   }
1119*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1120*03ce13f7SAndroid Build Coastguard Worker }
1121*03ce13f7SAndroid Build Coastguard Worker 
psrl(Type Ty,XmmRegister dst,const AsmAddress & src)1122*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psrl(Type Ty, XmmRegister dst, const AsmAddress &src) {
1123*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1124*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1125*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1126*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1127*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1128*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD1);
1129*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_f64) {
1130*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD3);
1131*03ce13f7SAndroid Build Coastguard Worker   } else {
1132*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
1133*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD2);
1134*03ce13f7SAndroid Build Coastguard Worker   }
1135*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1136*03ce13f7SAndroid Build Coastguard Worker }
1137*03ce13f7SAndroid Build Coastguard Worker 
psrl(Type Ty,XmmRegister dst,const Immediate & imm)1138*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::psrl(Type Ty, XmmRegister dst, const Immediate &imm) {
1139*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1140*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_int8());
1141*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1142*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeIrrelevant, dst);
1143*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1144*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1145*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x71);
1146*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_f64) {
1147*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x73);
1148*03ce13f7SAndroid Build Coastguard Worker   } else {
1149*03ce13f7SAndroid Build Coastguard Worker     assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
1150*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x72);
1151*03ce13f7SAndroid Build Coastguard Worker   }
1152*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(2, gprEncoding(dst));
1153*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value() & 0xFF);
1154*03ce13f7SAndroid Build Coastguard Worker }
1155*03ce13f7SAndroid Build Coastguard Worker 
1156*03ce13f7SAndroid Build Coastguard Worker // {add,sub,mul,div}ps are given a Ty parameter for consistency with
1157*03ce13f7SAndroid Build Coastguard Worker // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows addpd, etc.,
1158*03ce13f7SAndroid Build Coastguard Worker // we can use the Ty parameter to decide on adding a 0x66 prefix.
1159*03ce13f7SAndroid Build Coastguard Worker 
addps(Type,XmmRegister dst,XmmRegister src)1160*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::addps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1161*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1162*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1163*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1164*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x58);
1165*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1166*03ce13f7SAndroid Build Coastguard Worker }
1167*03ce13f7SAndroid Build Coastguard Worker 
addps(Type,XmmRegister dst,const AsmAddress & src)1168*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::addps(Type /* Ty */, XmmRegister dst,
1169*03ce13f7SAndroid Build Coastguard Worker                            const AsmAddress &src) {
1170*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1171*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1172*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1173*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x58);
1174*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1175*03ce13f7SAndroid Build Coastguard Worker }
1176*03ce13f7SAndroid Build Coastguard Worker 
subps(Type,XmmRegister dst,XmmRegister src)1177*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::subps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1178*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1179*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1180*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1181*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5C);
1182*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1183*03ce13f7SAndroid Build Coastguard Worker }
1184*03ce13f7SAndroid Build Coastguard Worker 
subps(Type,XmmRegister dst,const AsmAddress & src)1185*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::subps(Type /* Ty */, XmmRegister dst,
1186*03ce13f7SAndroid Build Coastguard Worker                            const AsmAddress &src) {
1187*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1188*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1189*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1190*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5C);
1191*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1192*03ce13f7SAndroid Build Coastguard Worker }
1193*03ce13f7SAndroid Build Coastguard Worker 
divps(Type,XmmRegister dst,XmmRegister src)1194*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::divps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1195*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1196*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1197*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1198*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5E);
1199*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1200*03ce13f7SAndroid Build Coastguard Worker }
1201*03ce13f7SAndroid Build Coastguard Worker 
divps(Type,XmmRegister dst,const AsmAddress & src)1202*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::divps(Type /* Ty */, XmmRegister dst,
1203*03ce13f7SAndroid Build Coastguard Worker                            const AsmAddress &src) {
1204*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1205*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1206*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1207*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5E);
1208*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1209*03ce13f7SAndroid Build Coastguard Worker }
1210*03ce13f7SAndroid Build Coastguard Worker 
mulps(Type,XmmRegister dst,XmmRegister src)1211*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mulps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1212*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1213*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1214*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1215*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x59);
1216*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1217*03ce13f7SAndroid Build Coastguard Worker }
1218*03ce13f7SAndroid Build Coastguard Worker 
mulps(Type,XmmRegister dst,const AsmAddress & src)1219*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mulps(Type /* Ty */, XmmRegister dst,
1220*03ce13f7SAndroid Build Coastguard Worker                            const AsmAddress &src) {
1221*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1222*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1223*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1224*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x59);
1225*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1226*03ce13f7SAndroid Build Coastguard Worker }
1227*03ce13f7SAndroid Build Coastguard Worker 
minps(Type Ty,XmmRegister dst,XmmRegister src)1228*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::minps(Type Ty, XmmRegister dst, XmmRegister src) {
1229*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1230*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1231*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1232*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1233*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1234*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5D);
1235*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1236*03ce13f7SAndroid Build Coastguard Worker }
1237*03ce13f7SAndroid Build Coastguard Worker 
minps(Type Ty,XmmRegister dst,const AsmAddress & src)1238*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::minps(Type Ty, XmmRegister dst, const AsmAddress &src) {
1239*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1240*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1241*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1242*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1243*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1244*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5D);
1245*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1246*03ce13f7SAndroid Build Coastguard Worker }
1247*03ce13f7SAndroid Build Coastguard Worker 
minss(Type Ty,XmmRegister dst,XmmRegister src)1248*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::minss(Type Ty, XmmRegister dst, XmmRegister src) {
1249*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1250*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1251*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1252*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1253*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5D);
1254*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1255*03ce13f7SAndroid Build Coastguard Worker }
1256*03ce13f7SAndroid Build Coastguard Worker 
minss(Type Ty,XmmRegister dst,const AsmAddress & src)1257*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::minss(Type Ty, XmmRegister dst, const AsmAddress &src) {
1258*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1259*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1260*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1261*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1262*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5D);
1263*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1264*03ce13f7SAndroid Build Coastguard Worker }
1265*03ce13f7SAndroid Build Coastguard Worker 
maxps(Type Ty,XmmRegister dst,XmmRegister src)1266*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::maxps(Type Ty, XmmRegister dst, XmmRegister src) {
1267*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1268*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1269*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1270*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1271*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1272*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5F);
1273*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1274*03ce13f7SAndroid Build Coastguard Worker }
1275*03ce13f7SAndroid Build Coastguard Worker 
maxps(Type Ty,XmmRegister dst,const AsmAddress & src)1276*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::maxps(Type Ty, XmmRegister dst, const AsmAddress &src) {
1277*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1278*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1279*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1280*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1281*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1282*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5F);
1283*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1284*03ce13f7SAndroid Build Coastguard Worker }
1285*03ce13f7SAndroid Build Coastguard Worker 
maxss(Type Ty,XmmRegister dst,XmmRegister src)1286*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::maxss(Type Ty, XmmRegister dst, XmmRegister src) {
1287*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1288*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1289*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1290*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1291*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5F);
1292*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1293*03ce13f7SAndroid Build Coastguard Worker }
1294*03ce13f7SAndroid Build Coastguard Worker 
maxss(Type Ty,XmmRegister dst,const AsmAddress & src)1295*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::maxss(Type Ty, XmmRegister dst, const AsmAddress &src) {
1296*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1297*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1298*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1299*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1300*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5F);
1301*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1302*03ce13f7SAndroid Build Coastguard Worker }
1303*03ce13f7SAndroid Build Coastguard Worker 
andnps(Type Ty,XmmRegister dst,XmmRegister src)1304*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::andnps(Type Ty, XmmRegister dst, XmmRegister src) {
1305*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1306*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1307*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1308*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1309*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1310*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x55);
1311*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1312*03ce13f7SAndroid Build Coastguard Worker }
1313*03ce13f7SAndroid Build Coastguard Worker 
andnps(Type Ty,XmmRegister dst,const AsmAddress & src)1314*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::andnps(Type Ty, XmmRegister dst, const AsmAddress &src) {
1315*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1316*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1317*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1318*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1319*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1320*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x55);
1321*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1322*03ce13f7SAndroid Build Coastguard Worker }
1323*03ce13f7SAndroid Build Coastguard Worker 
andps(Type Ty,XmmRegister dst,XmmRegister src)1324*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::andps(Type Ty, XmmRegister dst, XmmRegister src) {
1325*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1326*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1327*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1328*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1329*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1330*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x54);
1331*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1332*03ce13f7SAndroid Build Coastguard Worker }
1333*03ce13f7SAndroid Build Coastguard Worker 
andps(Type Ty,XmmRegister dst,const AsmAddress & src)1334*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::andps(Type Ty, XmmRegister dst, const AsmAddress &src) {
1335*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1336*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1337*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1338*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1339*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1340*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x54);
1341*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1342*03ce13f7SAndroid Build Coastguard Worker }
1343*03ce13f7SAndroid Build Coastguard Worker 
orps(Type Ty,XmmRegister dst,XmmRegister src)1344*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::orps(Type Ty, XmmRegister dst, XmmRegister src) {
1345*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1346*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1347*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1348*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1349*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1350*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x56);
1351*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1352*03ce13f7SAndroid Build Coastguard Worker }
1353*03ce13f7SAndroid Build Coastguard Worker 
orps(Type Ty,XmmRegister dst,const AsmAddress & src)1354*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::orps(Type Ty, XmmRegister dst, const AsmAddress &src) {
1355*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1356*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1357*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1358*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1359*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1360*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x56);
1361*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1362*03ce13f7SAndroid Build Coastguard Worker }
1363*03ce13f7SAndroid Build Coastguard Worker 
blendvps(Type,XmmRegister dst,XmmRegister src)1364*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::blendvps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1365*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1366*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1367*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1368*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1369*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x38);
1370*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x14);
1371*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1372*03ce13f7SAndroid Build Coastguard Worker }
1373*03ce13f7SAndroid Build Coastguard Worker 
blendvps(Type,XmmRegister dst,const AsmAddress & src)1374*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::blendvps(Type /* Ty */, XmmRegister dst,
1375*03ce13f7SAndroid Build Coastguard Worker                               const AsmAddress &src) {
1376*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1377*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1378*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1379*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1380*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x38);
1381*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x14);
1382*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1383*03ce13f7SAndroid Build Coastguard Worker }
1384*03ce13f7SAndroid Build Coastguard Worker 
pblendvb(Type,XmmRegister dst,XmmRegister src)1385*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pblendvb(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1386*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1387*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1388*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1389*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1390*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x38);
1391*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x10);
1392*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1393*03ce13f7SAndroid Build Coastguard Worker }
1394*03ce13f7SAndroid Build Coastguard Worker 
pblendvb(Type,XmmRegister dst,const AsmAddress & src)1395*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pblendvb(Type /* Ty */, XmmRegister dst,
1396*03ce13f7SAndroid Build Coastguard Worker                               const AsmAddress &src) {
1397*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1398*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1399*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1400*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1401*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x38);
1402*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x10);
1403*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1404*03ce13f7SAndroid Build Coastguard Worker }
1405*03ce13f7SAndroid Build Coastguard Worker 
cmpps(Type Ty,XmmRegister dst,XmmRegister src,CmppsCond CmpCondition)1406*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmpps(Type Ty, XmmRegister dst, XmmRegister src,
1407*03ce13f7SAndroid Build Coastguard Worker                            CmppsCond CmpCondition) {
1408*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1409*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_f64)
1410*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1411*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1412*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1413*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC2);
1414*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1415*03ce13f7SAndroid Build Coastguard Worker   emitUint8(CmpCondition);
1416*03ce13f7SAndroid Build Coastguard Worker }
1417*03ce13f7SAndroid Build Coastguard Worker 
cmpps(Type Ty,XmmRegister dst,const AsmAddress & src,CmppsCond CmpCondition)1418*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmpps(Type Ty, XmmRegister dst, const AsmAddress &src,
1419*03ce13f7SAndroid Build Coastguard Worker                            CmppsCond CmpCondition) {
1420*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1421*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_f64)
1422*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1423*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1424*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1425*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC2);
1426*03ce13f7SAndroid Build Coastguard Worker   static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
1427*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src, OffsetFromNextInstruction);
1428*03ce13f7SAndroid Build Coastguard Worker   emitUint8(CmpCondition);
1429*03ce13f7SAndroid Build Coastguard Worker }
1430*03ce13f7SAndroid Build Coastguard Worker 
sqrtps(XmmRegister dst)1431*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sqrtps(XmmRegister dst) {
1432*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1433*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, dst);
1434*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1435*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x51);
1436*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, dst);
1437*03ce13f7SAndroid Build Coastguard Worker }
1438*03ce13f7SAndroid Build Coastguard Worker 
rsqrtps(XmmRegister dst)1439*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::rsqrtps(XmmRegister dst) {
1440*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1441*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, dst);
1442*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1443*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x52);
1444*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, dst);
1445*03ce13f7SAndroid Build Coastguard Worker }
1446*03ce13f7SAndroid Build Coastguard Worker 
reciprocalps(XmmRegister dst)1447*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::reciprocalps(XmmRegister dst) {
1448*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1449*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, dst);
1450*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1451*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x53);
1452*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, dst);
1453*03ce13f7SAndroid Build Coastguard Worker }
1454*03ce13f7SAndroid Build Coastguard Worker 
movhlps(XmmRegister dst,XmmRegister src)1455*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movhlps(XmmRegister dst, XmmRegister src) {
1456*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1457*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1458*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1459*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x12);
1460*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1461*03ce13f7SAndroid Build Coastguard Worker }
1462*03ce13f7SAndroid Build Coastguard Worker 
movlhps(XmmRegister dst,XmmRegister src)1463*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movlhps(XmmRegister dst, XmmRegister src) {
1464*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1465*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1466*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1467*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x16);
1468*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1469*03ce13f7SAndroid Build Coastguard Worker }
1470*03ce13f7SAndroid Build Coastguard Worker 
unpcklps(XmmRegister dst,XmmRegister src)1471*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::unpcklps(XmmRegister dst, XmmRegister src) {
1472*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1473*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1474*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1475*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x14);
1476*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1477*03ce13f7SAndroid Build Coastguard Worker }
1478*03ce13f7SAndroid Build Coastguard Worker 
unpckhps(XmmRegister dst,XmmRegister src)1479*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::unpckhps(XmmRegister dst, XmmRegister src) {
1480*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1481*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1482*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1483*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x15);
1484*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1485*03ce13f7SAndroid Build Coastguard Worker }
1486*03ce13f7SAndroid Build Coastguard Worker 
unpcklpd(XmmRegister dst,XmmRegister src)1487*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::unpcklpd(XmmRegister dst, XmmRegister src) {
1488*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1489*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1490*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1491*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1492*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x14);
1493*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1494*03ce13f7SAndroid Build Coastguard Worker }
1495*03ce13f7SAndroid Build Coastguard Worker 
unpckhpd(XmmRegister dst,XmmRegister src)1496*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::unpckhpd(XmmRegister dst, XmmRegister src) {
1497*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1498*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1499*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1500*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1501*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x15);
1502*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1503*03ce13f7SAndroid Build Coastguard Worker }
1504*03ce13f7SAndroid Build Coastguard Worker 
set1ps(XmmRegister dst,GPRRegister tmp1,const Immediate & imm)1505*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::set1ps(XmmRegister dst, GPRRegister tmp1,
1506*03ce13f7SAndroid Build Coastguard Worker                             const Immediate &imm) {
1507*03ce13f7SAndroid Build Coastguard Worker   // Load 32-bit immediate value into tmp1.
1508*03ce13f7SAndroid Build Coastguard Worker   mov(IceType_i32, tmp1, imm);
1509*03ce13f7SAndroid Build Coastguard Worker   // Move value from tmp1 into dst.
1510*03ce13f7SAndroid Build Coastguard Worker   movd(IceType_i32, dst, tmp1);
1511*03ce13f7SAndroid Build Coastguard Worker   // Broadcast low lane into other three lanes.
1512*03ce13f7SAndroid Build Coastguard Worker   shufps(RexTypeIrrelevant, dst, dst, Immediate(0x0));
1513*03ce13f7SAndroid Build Coastguard Worker }
1514*03ce13f7SAndroid Build Coastguard Worker 
pshufb(Type,XmmRegister dst,XmmRegister src)1515*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pshufb(Type /* Ty */, XmmRegister dst, XmmRegister src) {
1516*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1517*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1518*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1519*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1520*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x38);
1521*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x00);
1522*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1523*03ce13f7SAndroid Build Coastguard Worker }
1524*03ce13f7SAndroid Build Coastguard Worker 
pshufb(Type,XmmRegister dst,const AsmAddress & src)1525*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pshufb(Type /* Ty */, XmmRegister dst,
1526*03ce13f7SAndroid Build Coastguard Worker                             const AsmAddress &src) {
1527*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1528*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1529*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1530*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1531*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x38);
1532*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x00);
1533*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1534*03ce13f7SAndroid Build Coastguard Worker }
1535*03ce13f7SAndroid Build Coastguard Worker 
pshufd(Type,XmmRegister dst,XmmRegister src,const Immediate & imm)1536*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pshufd(Type /* Ty */, XmmRegister dst, XmmRegister src,
1537*03ce13f7SAndroid Build Coastguard Worker                             const Immediate &imm) {
1538*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1539*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1540*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1541*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1542*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x70);
1543*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1544*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1545*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
1546*03ce13f7SAndroid Build Coastguard Worker }
1547*03ce13f7SAndroid Build Coastguard Worker 
pshufd(Type,XmmRegister dst,const AsmAddress & src,const Immediate & imm)1548*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pshufd(Type /* Ty */, XmmRegister dst,
1549*03ce13f7SAndroid Build Coastguard Worker                             const AsmAddress &src, const Immediate &imm) {
1550*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1551*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1552*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1553*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1554*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x70);
1555*03ce13f7SAndroid Build Coastguard Worker   static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
1556*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src, OffsetFromNextInstruction);
1557*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1558*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
1559*03ce13f7SAndroid Build Coastguard Worker }
1560*03ce13f7SAndroid Build Coastguard Worker 
punpckl(Type Ty,XmmRegister Dst,XmmRegister Src)1561*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::punpckl(Type Ty, XmmRegister Dst, XmmRegister Src) {
1562*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1563*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1564*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, Dst, Src);
1565*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1566*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1567*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x62);
1568*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1569*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x61);
1570*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v16i8) {
1571*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x60);
1572*03ce13f7SAndroid Build Coastguard Worker   } else {
1573*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector unpack operand type");
1574*03ce13f7SAndroid Build Coastguard Worker   }
1575*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(Dst, Src);
1576*03ce13f7SAndroid Build Coastguard Worker }
1577*03ce13f7SAndroid Build Coastguard Worker 
punpckl(Type Ty,XmmRegister Dst,const AsmAddress & Src)1578*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::punpckl(Type Ty, XmmRegister Dst, const AsmAddress &Src) {
1579*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1580*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1581*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, Src, Dst);
1582*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1583*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1584*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x62);
1585*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1586*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x61);
1587*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v16i8) {
1588*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x60);
1589*03ce13f7SAndroid Build Coastguard Worker   } else {
1590*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector unpack operand type");
1591*03ce13f7SAndroid Build Coastguard Worker   }
1592*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(Dst), Src);
1593*03ce13f7SAndroid Build Coastguard Worker }
1594*03ce13f7SAndroid Build Coastguard Worker 
punpckh(Type Ty,XmmRegister Dst,XmmRegister Src)1595*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::punpckh(Type Ty, XmmRegister Dst, XmmRegister Src) {
1596*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1597*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1598*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, Dst, Src);
1599*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1600*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1601*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x6A);
1602*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1603*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x69);
1604*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v16i8) {
1605*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x68);
1606*03ce13f7SAndroid Build Coastguard Worker   } else {
1607*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector unpack operand type");
1608*03ce13f7SAndroid Build Coastguard Worker   }
1609*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(Dst, Src);
1610*03ce13f7SAndroid Build Coastguard Worker }
1611*03ce13f7SAndroid Build Coastguard Worker 
punpckh(Type Ty,XmmRegister Dst,const AsmAddress & Src)1612*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::punpckh(Type Ty, XmmRegister Dst, const AsmAddress &Src) {
1613*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1614*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1615*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, Src, Dst);
1616*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1617*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1618*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x6A);
1619*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1620*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x69);
1621*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v16i8) {
1622*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x68);
1623*03ce13f7SAndroid Build Coastguard Worker   } else {
1624*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector unpack operand type");
1625*03ce13f7SAndroid Build Coastguard Worker   }
1626*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(Dst), Src);
1627*03ce13f7SAndroid Build Coastguard Worker }
1628*03ce13f7SAndroid Build Coastguard Worker 
packss(Type Ty,XmmRegister Dst,XmmRegister Src)1629*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::packss(Type Ty, XmmRegister Dst, XmmRegister Src) {
1630*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1631*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1632*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, Dst, Src);
1633*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1634*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1635*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x6B);
1636*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1637*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x63);
1638*03ce13f7SAndroid Build Coastguard Worker   } else {
1639*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector pack operand type");
1640*03ce13f7SAndroid Build Coastguard Worker   }
1641*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(Dst, Src);
1642*03ce13f7SAndroid Build Coastguard Worker }
1643*03ce13f7SAndroid Build Coastguard Worker 
packss(Type Ty,XmmRegister Dst,const AsmAddress & Src)1644*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::packss(Type Ty, XmmRegister Dst, const AsmAddress &Src) {
1645*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1646*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1647*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, Src, Dst);
1648*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1649*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1650*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x6B);
1651*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1652*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x63);
1653*03ce13f7SAndroid Build Coastguard Worker   } else {
1654*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector pack operand type");
1655*03ce13f7SAndroid Build Coastguard Worker   }
1656*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(Dst), Src);
1657*03ce13f7SAndroid Build Coastguard Worker }
1658*03ce13f7SAndroid Build Coastguard Worker 
packus(Type Ty,XmmRegister Dst,XmmRegister Src)1659*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::packus(Type Ty, XmmRegister Dst, XmmRegister Src) {
1660*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1661*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1662*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, Dst, Src);
1663*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1664*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1665*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x38);
1666*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x2B);
1667*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1668*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x67);
1669*03ce13f7SAndroid Build Coastguard Worker   } else {
1670*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector pack operand type");
1671*03ce13f7SAndroid Build Coastguard Worker   }
1672*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(Dst, Src);
1673*03ce13f7SAndroid Build Coastguard Worker }
1674*03ce13f7SAndroid Build Coastguard Worker 
packus(Type Ty,XmmRegister Dst,const AsmAddress & Src)1675*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::packus(Type Ty, XmmRegister Dst, const AsmAddress &Src) {
1676*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1677*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1678*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, Src, Dst);
1679*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1680*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v4i32 || Ty == IceType_v4f32) {
1681*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x38);
1682*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x2B);
1683*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v8i16) {
1684*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x67);
1685*03ce13f7SAndroid Build Coastguard Worker   } else {
1686*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected vector pack operand type");
1687*03ce13f7SAndroid Build Coastguard Worker   }
1688*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(Dst), Src);
1689*03ce13f7SAndroid Build Coastguard Worker }
1690*03ce13f7SAndroid Build Coastguard Worker 
shufps(Type,XmmRegister dst,XmmRegister src,const Immediate & imm)1691*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shufps(Type /* Ty */, XmmRegister dst, XmmRegister src,
1692*03ce13f7SAndroid Build Coastguard Worker                             const Immediate &imm) {
1693*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1694*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1695*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1696*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC6);
1697*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1698*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1699*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
1700*03ce13f7SAndroid Build Coastguard Worker }
1701*03ce13f7SAndroid Build Coastguard Worker 
shufps(Type,XmmRegister dst,const AsmAddress & src,const Immediate & imm)1702*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shufps(Type /* Ty */, XmmRegister dst,
1703*03ce13f7SAndroid Build Coastguard Worker                             const AsmAddress &src, const Immediate &imm) {
1704*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1705*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1706*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1707*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC6);
1708*03ce13f7SAndroid Build Coastguard Worker   static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
1709*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src, OffsetFromNextInstruction);
1710*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1711*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
1712*03ce13f7SAndroid Build Coastguard Worker }
1713*03ce13f7SAndroid Build Coastguard Worker 
sqrtpd(XmmRegister dst)1714*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sqrtpd(XmmRegister dst) {
1715*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1716*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1717*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, dst);
1718*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1719*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x51);
1720*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, dst);
1721*03ce13f7SAndroid Build Coastguard Worker }
1722*03ce13f7SAndroid Build Coastguard Worker 
cvtdq2ps(Type,XmmRegister dst,XmmRegister src)1723*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtdq2ps(Type /* Ignore */, XmmRegister dst,
1724*03ce13f7SAndroid Build Coastguard Worker                               XmmRegister src) {
1725*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1726*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1727*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1728*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5B);
1729*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1730*03ce13f7SAndroid Build Coastguard Worker }
1731*03ce13f7SAndroid Build Coastguard Worker 
cvtdq2ps(Type,XmmRegister dst,const AsmAddress & src)1732*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtdq2ps(Type /* Ignore */, XmmRegister dst,
1733*03ce13f7SAndroid Build Coastguard Worker                               const AsmAddress &src) {
1734*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1735*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1736*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1737*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5B);
1738*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1739*03ce13f7SAndroid Build Coastguard Worker }
1740*03ce13f7SAndroid Build Coastguard Worker 
cvttps2dq(Type,XmmRegister dst,XmmRegister src)1741*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvttps2dq(Type /* Ignore */, XmmRegister dst,
1742*03ce13f7SAndroid Build Coastguard Worker                                XmmRegister src) {
1743*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1744*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF3);
1745*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1746*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1747*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5B);
1748*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1749*03ce13f7SAndroid Build Coastguard Worker }
1750*03ce13f7SAndroid Build Coastguard Worker 
cvttps2dq(Type,XmmRegister dst,const AsmAddress & src)1751*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvttps2dq(Type /* Ignore */, XmmRegister dst,
1752*03ce13f7SAndroid Build Coastguard Worker                                const AsmAddress &src) {
1753*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1754*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF3);
1755*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1756*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1757*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5B);
1758*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1759*03ce13f7SAndroid Build Coastguard Worker }
1760*03ce13f7SAndroid Build Coastguard Worker 
cvtps2dq(Type,XmmRegister dst,XmmRegister src)1761*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtps2dq(Type /* Ignore */, XmmRegister dst,
1762*03ce13f7SAndroid Build Coastguard Worker                               XmmRegister src) {
1763*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1764*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1765*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1766*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1767*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5B);
1768*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1769*03ce13f7SAndroid Build Coastguard Worker }
1770*03ce13f7SAndroid Build Coastguard Worker 
cvtps2dq(Type,XmmRegister dst,const AsmAddress & src)1771*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtps2dq(Type /* Ignore */, XmmRegister dst,
1772*03ce13f7SAndroid Build Coastguard Worker                               const AsmAddress &src) {
1773*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1774*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1775*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1776*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1777*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5B);
1778*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1779*03ce13f7SAndroid Build Coastguard Worker }
1780*03ce13f7SAndroid Build Coastguard Worker 
cvtsi2ss(Type DestTy,XmmRegister dst,Type SrcTy,GPRRegister src)1781*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy,
1782*03ce13f7SAndroid Build Coastguard Worker                               GPRRegister src) {
1783*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1784*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1785*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(SrcTy, dst, src);
1786*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1787*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2A);
1788*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1789*03ce13f7SAndroid Build Coastguard Worker }
1790*03ce13f7SAndroid Build Coastguard Worker 
cvtsi2ss(Type DestTy,XmmRegister dst,Type SrcTy,const AsmAddress & src)1791*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy,
1792*03ce13f7SAndroid Build Coastguard Worker                               const AsmAddress &src) {
1793*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1794*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1795*03ce13f7SAndroid Build Coastguard Worker   emitRex(SrcTy, src, dst);
1796*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1797*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2A);
1798*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1799*03ce13f7SAndroid Build Coastguard Worker }
1800*03ce13f7SAndroid Build Coastguard Worker 
cvtfloat2float(Type SrcTy,XmmRegister dst,XmmRegister src)1801*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtfloat2float(Type SrcTy, XmmRegister dst,
1802*03ce13f7SAndroid Build Coastguard Worker                                     XmmRegister src) {
1803*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1804*03ce13f7SAndroid Build Coastguard Worker   // ss2sd or sd2ss
1805*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1806*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1807*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1808*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5A);
1809*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1810*03ce13f7SAndroid Build Coastguard Worker }
1811*03ce13f7SAndroid Build Coastguard Worker 
cvtfloat2float(Type SrcTy,XmmRegister dst,const AsmAddress & src)1812*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtfloat2float(Type SrcTy, XmmRegister dst,
1813*03ce13f7SAndroid Build Coastguard Worker                                     const AsmAddress &src) {
1814*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1815*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1816*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1817*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1818*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x5A);
1819*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1820*03ce13f7SAndroid Build Coastguard Worker }
1821*03ce13f7SAndroid Build Coastguard Worker 
cvttss2si(Type DestTy,GPRRegister dst,Type SrcTy,XmmRegister src)1822*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy,
1823*03ce13f7SAndroid Build Coastguard Worker                                XmmRegister src) {
1824*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1825*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1826*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(DestTy, dst, src);
1827*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1828*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2C);
1829*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1830*03ce13f7SAndroid Build Coastguard Worker }
1831*03ce13f7SAndroid Build Coastguard Worker 
cvttss2si(Type DestTy,GPRRegister dst,Type SrcTy,const AsmAddress & src)1832*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy,
1833*03ce13f7SAndroid Build Coastguard Worker                                const AsmAddress &src) {
1834*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1835*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1836*03ce13f7SAndroid Build Coastguard Worker   emitRex(DestTy, src, dst);
1837*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1838*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2C);
1839*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1840*03ce13f7SAndroid Build Coastguard Worker }
1841*03ce13f7SAndroid Build Coastguard Worker 
cvtss2si(Type DestTy,GPRRegister dst,Type SrcTy,XmmRegister src)1842*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy,
1843*03ce13f7SAndroid Build Coastguard Worker                               XmmRegister src) {
1844*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1845*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1846*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(DestTy, dst, src);
1847*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1848*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2D);
1849*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1850*03ce13f7SAndroid Build Coastguard Worker }
1851*03ce13f7SAndroid Build Coastguard Worker 
cvtss2si(Type DestTy,GPRRegister dst,Type SrcTy,const AsmAddress & src)1852*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy,
1853*03ce13f7SAndroid Build Coastguard Worker                               const AsmAddress &src) {
1854*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1855*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1856*03ce13f7SAndroid Build Coastguard Worker   emitRex(DestTy, src, dst);
1857*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1858*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2D);
1859*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1860*03ce13f7SAndroid Build Coastguard Worker }
1861*03ce13f7SAndroid Build Coastguard Worker 
ucomiss(Type Ty,XmmRegister a,XmmRegister b)1862*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::ucomiss(Type Ty, XmmRegister a, XmmRegister b) {
1863*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1864*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_f64)
1865*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1866*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, a, b);
1867*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1868*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2E);
1869*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(a, b);
1870*03ce13f7SAndroid Build Coastguard Worker }
1871*03ce13f7SAndroid Build Coastguard Worker 
ucomiss(Type Ty,XmmRegister a,const AsmAddress & b)1872*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::ucomiss(Type Ty, XmmRegister a, const AsmAddress &b) {
1873*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1874*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_f64)
1875*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1876*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, b, a);
1877*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1878*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x2E);
1879*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(a), b);
1880*03ce13f7SAndroid Build Coastguard Worker }
1881*03ce13f7SAndroid Build Coastguard Worker 
movmsk(Type Ty,GPRRegister dst,XmmRegister src)1882*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::movmsk(Type Ty, GPRRegister dst, XmmRegister src) {
1883*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1884*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v16i8) {
1885*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1886*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v4f32 || Ty == IceType_v4i32) {
1887*03ce13f7SAndroid Build Coastguard Worker     // No operand size prefix
1888*03ce13f7SAndroid Build Coastguard Worker   } else {
1889*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected movmsk operand type");
1890*03ce13f7SAndroid Build Coastguard Worker   }
1891*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1892*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1893*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_v16i8) {
1894*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xD7);
1895*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_v4f32 || Ty == IceType_v4i32) {
1896*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x50);
1897*03ce13f7SAndroid Build Coastguard Worker   } else {
1898*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unexpected movmsk operand type");
1899*03ce13f7SAndroid Build Coastguard Worker   }
1900*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1901*03ce13f7SAndroid Build Coastguard Worker }
1902*03ce13f7SAndroid Build Coastguard Worker 
sqrt(Type Ty,XmmRegister dst,const AsmAddress & src)1903*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sqrt(Type Ty, XmmRegister dst, const AsmAddress &src) {
1904*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1905*03ce13f7SAndroid Build Coastguard Worker   if (isScalarFloatingType(Ty))
1906*03ce13f7SAndroid Build Coastguard Worker     emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1907*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1908*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1909*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x51);
1910*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1911*03ce13f7SAndroid Build Coastguard Worker }
1912*03ce13f7SAndroid Build Coastguard Worker 
sqrt(Type Ty,XmmRegister dst,XmmRegister src)1913*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sqrt(Type Ty, XmmRegister dst, XmmRegister src) {
1914*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1915*03ce13f7SAndroid Build Coastguard Worker   if (isScalarFloatingType(Ty))
1916*03ce13f7SAndroid Build Coastguard Worker     emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1917*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1918*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1919*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x51);
1920*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1921*03ce13f7SAndroid Build Coastguard Worker }
1922*03ce13f7SAndroid Build Coastguard Worker 
xorps(Type Ty,XmmRegister dst,const AsmAddress & src)1923*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::xorps(Type Ty, XmmRegister dst, const AsmAddress &src) {
1924*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1925*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1926*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1927*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1928*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1929*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x57);
1930*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
1931*03ce13f7SAndroid Build Coastguard Worker }
1932*03ce13f7SAndroid Build Coastguard Worker 
xorps(Type Ty,XmmRegister dst,XmmRegister src)1933*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::xorps(Type Ty, XmmRegister dst, XmmRegister src) {
1934*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1935*03ce13f7SAndroid Build Coastguard Worker   if (!isFloat32Asserting32Or64(Ty))
1936*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
1937*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1938*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1939*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x57);
1940*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1941*03ce13f7SAndroid Build Coastguard Worker }
1942*03ce13f7SAndroid Build Coastguard Worker 
insertps(Type Ty,XmmRegister dst,XmmRegister src,const Immediate & imm)1943*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::insertps(Type Ty, XmmRegister dst, XmmRegister src,
1944*03ce13f7SAndroid Build Coastguard Worker                               const Immediate &imm) {
1945*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1946*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1947*03ce13f7SAndroid Build Coastguard Worker   assert(isVectorFloatingType(Ty));
1948*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
1949*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1950*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
1951*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1952*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x3A);
1953*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x21);
1954*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1955*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
1956*03ce13f7SAndroid Build Coastguard Worker }
1957*03ce13f7SAndroid Build Coastguard Worker 
insertps(Type Ty,XmmRegister dst,const AsmAddress & src,const Immediate & imm)1958*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::insertps(Type Ty, XmmRegister dst, const AsmAddress &src,
1959*03ce13f7SAndroid Build Coastguard Worker                               const Immediate &imm) {
1960*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1961*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1962*03ce13f7SAndroid Build Coastguard Worker   assert(isVectorFloatingType(Ty));
1963*03ce13f7SAndroid Build Coastguard Worker   (void)Ty;
1964*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1965*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1966*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1967*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x3A);
1968*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x21);
1969*03ce13f7SAndroid Build Coastguard Worker   static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
1970*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src, OffsetFromNextInstruction);
1971*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
1972*03ce13f7SAndroid Build Coastguard Worker }
1973*03ce13f7SAndroid Build Coastguard Worker 
pinsr(Type Ty,XmmRegister dst,GPRRegister src,const Immediate & imm)1974*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pinsr(Type Ty, XmmRegister dst, GPRRegister src,
1975*03ce13f7SAndroid Build Coastguard Worker                            const Immediate &imm) {
1976*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1977*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1978*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1979*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, dst, src);
1980*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1981*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1982*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xC4);
1983*03ce13f7SAndroid Build Coastguard Worker   } else {
1984*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x3A);
1985*03ce13f7SAndroid Build Coastguard Worker     emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1986*03ce13f7SAndroid Build Coastguard Worker   }
1987*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
1988*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
1989*03ce13f7SAndroid Build Coastguard Worker }
1990*03ce13f7SAndroid Build Coastguard Worker 
pinsr(Type Ty,XmmRegister dst,const AsmAddress & src,const Immediate & imm)1991*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pinsr(Type Ty, XmmRegister dst, const AsmAddress &src,
1992*03ce13f7SAndroid Build Coastguard Worker                            const Immediate &imm) {
1993*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1994*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
1995*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
1996*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
1997*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
1998*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
1999*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xC4);
2000*03ce13f7SAndroid Build Coastguard Worker   } else {
2001*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x3A);
2002*03ce13f7SAndroid Build Coastguard Worker     emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
2003*03ce13f7SAndroid Build Coastguard Worker   }
2004*03ce13f7SAndroid Build Coastguard Worker   static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
2005*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src, OffsetFromNextInstruction);
2006*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value());
2007*03ce13f7SAndroid Build Coastguard Worker }
2008*03ce13f7SAndroid Build Coastguard Worker 
pextr(Type Ty,GPRRegister dst,XmmRegister src,const Immediate & imm)2009*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pextr(Type Ty, GPRRegister dst, XmmRegister src,
2010*03ce13f7SAndroid Build Coastguard Worker                            const Immediate &imm) {
2011*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2012*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint8());
2013*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
2014*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
2015*03ce13f7SAndroid Build Coastguard Worker     emitRexRB(Ty, dst, src);
2016*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2017*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xC5);
2018*03ce13f7SAndroid Build Coastguard Worker     emitXmmRegisterOperand(dst, src);
2019*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value());
2020*03ce13f7SAndroid Build Coastguard Worker   } else {
2021*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
2022*03ce13f7SAndroid Build Coastguard Worker     emitRexRB(Ty, src, dst);
2023*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2024*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x3A);
2025*03ce13f7SAndroid Build Coastguard Worker     emitUint8(isByteSizedType(Ty) ? 0x14 : 0x16);
2026*03ce13f7SAndroid Build Coastguard Worker     // SSE 4.1 versions are "MRI" because dst can be mem, while pextrw (SSE2)
2027*03ce13f7SAndroid Build Coastguard Worker     // is RMI because dst must be reg.
2028*03ce13f7SAndroid Build Coastguard Worker     emitXmmRegisterOperand(src, dst);
2029*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value());
2030*03ce13f7SAndroid Build Coastguard Worker   }
2031*03ce13f7SAndroid Build Coastguard Worker }
2032*03ce13f7SAndroid Build Coastguard Worker 
pmovsxdq(XmmRegister dst,XmmRegister src)2033*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pmovsxdq(XmmRegister dst, XmmRegister src) {
2034*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2035*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
2036*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
2037*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2038*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x38);
2039*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x25);
2040*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
2041*03ce13f7SAndroid Build Coastguard Worker }
2042*03ce13f7SAndroid Build Coastguard Worker 
pcmpeq(Type Ty,XmmRegister dst,XmmRegister src)2043*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pcmpeq(Type Ty, XmmRegister dst, XmmRegister src) {
2044*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2045*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
2046*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
2047*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2048*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
2049*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x74);
2050*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
2051*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x75);
2052*03ce13f7SAndroid Build Coastguard Worker   } else {
2053*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x76);
2054*03ce13f7SAndroid Build Coastguard Worker   }
2055*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
2056*03ce13f7SAndroid Build Coastguard Worker }
2057*03ce13f7SAndroid Build Coastguard Worker 
pcmpeq(Type Ty,XmmRegister dst,const AsmAddress & src)2058*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pcmpeq(Type Ty, XmmRegister dst, const AsmAddress &src) {
2059*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2060*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
2061*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
2062*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2063*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
2064*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x74);
2065*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
2066*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x75);
2067*03ce13f7SAndroid Build Coastguard Worker   } else {
2068*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x76);
2069*03ce13f7SAndroid Build Coastguard Worker   }
2070*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
2071*03ce13f7SAndroid Build Coastguard Worker }
2072*03ce13f7SAndroid Build Coastguard Worker 
pcmpgt(Type Ty,XmmRegister dst,XmmRegister src)2073*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pcmpgt(Type Ty, XmmRegister dst, XmmRegister src) {
2074*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2075*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
2076*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
2077*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2078*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
2079*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x64);
2080*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
2081*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x65);
2082*03ce13f7SAndroid Build Coastguard Worker   } else {
2083*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
2084*03ce13f7SAndroid Build Coastguard Worker   }
2085*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
2086*03ce13f7SAndroid Build Coastguard Worker }
2087*03ce13f7SAndroid Build Coastguard Worker 
pcmpgt(Type Ty,XmmRegister dst,const AsmAddress & src)2088*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::pcmpgt(Type Ty, XmmRegister dst, const AsmAddress &src) {
2089*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2090*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
2091*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
2092*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2093*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty)) {
2094*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x64);
2095*03ce13f7SAndroid Build Coastguard Worker   } else if (Ty == IceType_i16) {
2096*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x65);
2097*03ce13f7SAndroid Build Coastguard Worker   } else {
2098*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
2099*03ce13f7SAndroid Build Coastguard Worker   }
2100*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
2101*03ce13f7SAndroid Build Coastguard Worker }
2102*03ce13f7SAndroid Build Coastguard Worker 
round(Type Ty,XmmRegister dst,XmmRegister src,const Immediate & mode)2103*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::round(Type Ty, XmmRegister dst, XmmRegister src,
2104*03ce13f7SAndroid Build Coastguard Worker                            const Immediate &mode) {
2105*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2106*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
2107*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(RexTypeIrrelevant, dst, src);
2108*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2109*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x3A);
2110*03ce13f7SAndroid Build Coastguard Worker   switch (Ty) {
2111*03ce13f7SAndroid Build Coastguard Worker   case IceType_v4f32:
2112*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x08);
2113*03ce13f7SAndroid Build Coastguard Worker     break;
2114*03ce13f7SAndroid Build Coastguard Worker   case IceType_f32:
2115*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0A);
2116*03ce13f7SAndroid Build Coastguard Worker     break;
2117*03ce13f7SAndroid Build Coastguard Worker   case IceType_f64:
2118*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0B);
2119*03ce13f7SAndroid Build Coastguard Worker     break;
2120*03ce13f7SAndroid Build Coastguard Worker   default:
2121*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unsupported round operand type");
2122*03ce13f7SAndroid Build Coastguard Worker   }
2123*03ce13f7SAndroid Build Coastguard Worker   emitXmmRegisterOperand(dst, src);
2124*03ce13f7SAndroid Build Coastguard Worker   // Mask precision exeption.
2125*03ce13f7SAndroid Build Coastguard Worker   emitUint8(static_cast<uint8_t>(mode.value()) | 0x8);
2126*03ce13f7SAndroid Build Coastguard Worker }
2127*03ce13f7SAndroid Build Coastguard Worker 
round(Type Ty,XmmRegister dst,const AsmAddress & src,const Immediate & mode)2128*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::round(Type Ty, XmmRegister dst, const AsmAddress &src,
2129*03ce13f7SAndroid Build Coastguard Worker                            const Immediate &mode) {
2130*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2131*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x66);
2132*03ce13f7SAndroid Build Coastguard Worker   emitRex(RexTypeIrrelevant, src, dst);
2133*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2134*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x3A);
2135*03ce13f7SAndroid Build Coastguard Worker   switch (Ty) {
2136*03ce13f7SAndroid Build Coastguard Worker   case IceType_v4f32:
2137*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x08);
2138*03ce13f7SAndroid Build Coastguard Worker     break;
2139*03ce13f7SAndroid Build Coastguard Worker   case IceType_f32:
2140*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0A);
2141*03ce13f7SAndroid Build Coastguard Worker     break;
2142*03ce13f7SAndroid Build Coastguard Worker   case IceType_f64:
2143*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0B);
2144*03ce13f7SAndroid Build Coastguard Worker     break;
2145*03ce13f7SAndroid Build Coastguard Worker   default:
2146*03ce13f7SAndroid Build Coastguard Worker     assert(false && "Unsupported round operand type");
2147*03ce13f7SAndroid Build Coastguard Worker   }
2148*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
2149*03ce13f7SAndroid Build Coastguard Worker   // Mask precision exeption.
2150*03ce13f7SAndroid Build Coastguard Worker   emitUint8(static_cast<uint8_t>(mode.value()) | 0x8);
2151*03ce13f7SAndroid Build Coastguard Worker }
2152*03ce13f7SAndroid Build Coastguard Worker 
2153*03ce13f7SAndroid Build Coastguard Worker template <uint32_t Tag>
arith_int(Type Ty,GPRRegister reg,const Immediate & imm)2154*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::arith_int(Type Ty, GPRRegister reg, const Immediate &imm) {
2155*03ce13f7SAndroid Build Coastguard Worker   static_assert(Tag < 8, "Tag must be between 0..7");
2156*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2157*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2158*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2159*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
2160*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty)) {
2161*03ce13f7SAndroid Build Coastguard Worker     emitComplexI8(Tag, AsmOperand(reg), imm);
2162*03ce13f7SAndroid Build Coastguard Worker   } else {
2163*03ce13f7SAndroid Build Coastguard Worker     emitComplex(Ty, Tag, AsmOperand(reg), imm);
2164*03ce13f7SAndroid Build Coastguard Worker   }
2165*03ce13f7SAndroid Build Coastguard Worker }
2166*03ce13f7SAndroid Build Coastguard Worker 
2167*03ce13f7SAndroid Build Coastguard Worker template <uint32_t Tag>
arith_int(Type Ty,GPRRegister reg0,GPRRegister reg1)2168*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::arith_int(Type Ty, GPRRegister reg0, GPRRegister reg1) {
2169*03ce13f7SAndroid Build Coastguard Worker   static_assert(Tag < 8, "Tag must be between 0..7");
2170*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2171*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2172*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2173*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, reg0, reg1);
2174*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty))
2175*03ce13f7SAndroid Build Coastguard Worker     emitUint8(Tag * 8 + 2);
2176*03ce13f7SAndroid Build Coastguard Worker   else
2177*03ce13f7SAndroid Build Coastguard Worker     emitUint8(Tag * 8 + 3);
2178*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(reg0), gprEncoding(reg1));
2179*03ce13f7SAndroid Build Coastguard Worker }
2180*03ce13f7SAndroid Build Coastguard Worker 
2181*03ce13f7SAndroid Build Coastguard Worker template <uint32_t Tag>
arith_int(Type Ty,GPRRegister reg,const AsmAddress & address)2182*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::arith_int(Type Ty, GPRRegister reg,
2183*03ce13f7SAndroid Build Coastguard Worker                                const AsmAddress &address) {
2184*03ce13f7SAndroid Build Coastguard Worker   static_assert(Tag < 8, "Tag must be between 0..7");
2185*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2186*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2187*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2188*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, reg);
2189*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty))
2190*03ce13f7SAndroid Build Coastguard Worker     emitUint8(Tag * 8 + 2);
2191*03ce13f7SAndroid Build Coastguard Worker   else
2192*03ce13f7SAndroid Build Coastguard Worker     emitUint8(Tag * 8 + 3);
2193*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(reg), address);
2194*03ce13f7SAndroid Build Coastguard Worker }
2195*03ce13f7SAndroid Build Coastguard Worker 
2196*03ce13f7SAndroid Build Coastguard Worker template <uint32_t Tag>
arith_int(Type Ty,const AsmAddress & address,GPRRegister reg)2197*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::arith_int(Type Ty, const AsmAddress &address,
2198*03ce13f7SAndroid Build Coastguard Worker                                GPRRegister reg) {
2199*03ce13f7SAndroid Build Coastguard Worker   static_assert(Tag < 8, "Tag must be between 0..7");
2200*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2201*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2202*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2203*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, reg);
2204*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty))
2205*03ce13f7SAndroid Build Coastguard Worker     emitUint8(Tag * 8 + 0);
2206*03ce13f7SAndroid Build Coastguard Worker   else
2207*03ce13f7SAndroid Build Coastguard Worker     emitUint8(Tag * 8 + 1);
2208*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(reg), address);
2209*03ce13f7SAndroid Build Coastguard Worker }
2210*03ce13f7SAndroid Build Coastguard Worker 
2211*03ce13f7SAndroid Build Coastguard Worker template <uint32_t Tag>
arith_int(Type Ty,const AsmAddress & address,const Immediate & imm)2212*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::arith_int(Type Ty, const AsmAddress &address,
2213*03ce13f7SAndroid Build Coastguard Worker                                const Immediate &imm) {
2214*03ce13f7SAndroid Build Coastguard Worker   static_assert(Tag < 8, "Tag must be between 0..7");
2215*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2216*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2217*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2218*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, RexRegIrrelevant);
2219*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty)) {
2220*03ce13f7SAndroid Build Coastguard Worker     emitComplexI8(Tag, address, imm);
2221*03ce13f7SAndroid Build Coastguard Worker   } else {
2222*03ce13f7SAndroid Build Coastguard Worker     emitComplex(Ty, Tag, address, imm);
2223*03ce13f7SAndroid Build Coastguard Worker   }
2224*03ce13f7SAndroid Build Coastguard Worker }
2225*03ce13f7SAndroid Build Coastguard Worker 
cmp(Type Ty,GPRRegister reg,const Immediate & imm)2226*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmp(Type Ty, GPRRegister reg, const Immediate &imm) {
2227*03ce13f7SAndroid Build Coastguard Worker   arith_int<7>(Ty, reg, imm);
2228*03ce13f7SAndroid Build Coastguard Worker }
2229*03ce13f7SAndroid Build Coastguard Worker 
cmp(Type Ty,GPRRegister reg0,GPRRegister reg1)2230*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmp(Type Ty, GPRRegister reg0, GPRRegister reg1) {
2231*03ce13f7SAndroid Build Coastguard Worker   arith_int<7>(Ty, reg0, reg1);
2232*03ce13f7SAndroid Build Coastguard Worker }
2233*03ce13f7SAndroid Build Coastguard Worker 
cmp(Type Ty,GPRRegister reg,const AsmAddress & address)2234*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmp(Type Ty, GPRRegister reg, const AsmAddress &address) {
2235*03ce13f7SAndroid Build Coastguard Worker   arith_int<7>(Ty, reg, address);
2236*03ce13f7SAndroid Build Coastguard Worker }
2237*03ce13f7SAndroid Build Coastguard Worker 
cmp(Type Ty,const AsmAddress & address,GPRRegister reg)2238*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmp(Type Ty, const AsmAddress &address, GPRRegister reg) {
2239*03ce13f7SAndroid Build Coastguard Worker   arith_int<7>(Ty, address, reg);
2240*03ce13f7SAndroid Build Coastguard Worker }
2241*03ce13f7SAndroid Build Coastguard Worker 
cmp(Type Ty,const AsmAddress & address,const Immediate & imm)2242*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmp(Type Ty, const AsmAddress &address,
2243*03ce13f7SAndroid Build Coastguard Worker                          const Immediate &imm) {
2244*03ce13f7SAndroid Build Coastguard Worker   arith_int<7>(Ty, address, imm);
2245*03ce13f7SAndroid Build Coastguard Worker }
2246*03ce13f7SAndroid Build Coastguard Worker 
test(Type Ty,GPRRegister reg1,GPRRegister reg2)2247*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::test(Type Ty, GPRRegister reg1, GPRRegister reg2) {
2248*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2249*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2250*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2251*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, reg1, reg2);
2252*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty))
2253*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x84);
2254*03ce13f7SAndroid Build Coastguard Worker   else
2255*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x85);
2256*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(reg1), gprEncoding(reg2));
2257*03ce13f7SAndroid Build Coastguard Worker }
2258*03ce13f7SAndroid Build Coastguard Worker 
test(Type Ty,const AsmAddress & addr,GPRRegister reg)2259*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::test(Type Ty, const AsmAddress &addr, GPRRegister reg) {
2260*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2261*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2262*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2263*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, addr, reg);
2264*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedType(Ty))
2265*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x84);
2266*03ce13f7SAndroid Build Coastguard Worker   else
2267*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x85);
2268*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(reg), addr);
2269*03ce13f7SAndroid Build Coastguard Worker }
2270*03ce13f7SAndroid Build Coastguard Worker 
test(Type Ty,GPRRegister reg,const Immediate & immediate)2271*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::test(Type Ty, GPRRegister reg,
2272*03ce13f7SAndroid Build Coastguard Worker                           const Immediate &immediate) {
2273*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2274*03ce13f7SAndroid Build Coastguard Worker   // For registers that have a byte variant (EAX, EBX, ECX, and EDX) we only
2275*03ce13f7SAndroid Build Coastguard Worker   // test the byte register to keep the encoding short. This is legal even if
2276*03ce13f7SAndroid Build Coastguard Worker   // the register had high bits set since this only sets flags registers based
2277*03ce13f7SAndroid Build Coastguard Worker   // on the "AND" of the two operands, and the immediate had zeros at those
2278*03ce13f7SAndroid Build Coastguard Worker   // high bits.
2279*03ce13f7SAndroid Build Coastguard Worker   constexpr GPRRegister Last8BitGPR = GPRRegister::Encoded_Reg_r15d;
2280*03ce13f7SAndroid Build Coastguard Worker   if (immediate.is_uint8() && reg <= Last8BitGPR) {
2281*03ce13f7SAndroid Build Coastguard Worker     // Use zero-extended 8-bit immediate.
2282*03ce13f7SAndroid Build Coastguard Worker     emitRexB(Ty, reg);
2283*03ce13f7SAndroid Build Coastguard Worker     if (reg == RegX8664::Encoded_Reg_rax) {
2284*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0xA8);
2285*03ce13f7SAndroid Build Coastguard Worker     } else {
2286*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0xF6);
2287*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0xC0 + gprEncoding(reg));
2288*03ce13f7SAndroid Build Coastguard Worker     }
2289*03ce13f7SAndroid Build Coastguard Worker     emitUint8(immediate.value() & 0xFF);
2290*03ce13f7SAndroid Build Coastguard Worker   } else if (reg == RegX8664::Encoded_Reg_rax) {
2291*03ce13f7SAndroid Build Coastguard Worker     // Use short form if the destination is EAX.
2292*03ce13f7SAndroid Build Coastguard Worker     if (Ty == IceType_i16)
2293*03ce13f7SAndroid Build Coastguard Worker       emitOperandSizeOverride();
2294*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xA9);
2295*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, immediate);
2296*03ce13f7SAndroid Build Coastguard Worker   } else {
2297*03ce13f7SAndroid Build Coastguard Worker     if (Ty == IceType_i16)
2298*03ce13f7SAndroid Build Coastguard Worker       emitOperandSizeOverride();
2299*03ce13f7SAndroid Build Coastguard Worker     emitRexB(Ty, reg);
2300*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2301*03ce13f7SAndroid Build Coastguard Worker     emitRegisterOperand(0, gprEncoding(reg));
2302*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, immediate);
2303*03ce13f7SAndroid Build Coastguard Worker   }
2304*03ce13f7SAndroid Build Coastguard Worker }
2305*03ce13f7SAndroid Build Coastguard Worker 
test(Type Ty,const AsmAddress & addr,const Immediate & immediate)2306*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::test(Type Ty, const AsmAddress &addr,
2307*03ce13f7SAndroid Build Coastguard Worker                           const Immediate &immediate) {
2308*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2309*03ce13f7SAndroid Build Coastguard Worker   // If the immediate is short, we only test the byte addr to keep the encoding
2310*03ce13f7SAndroid Build Coastguard Worker   // short.
2311*03ce13f7SAndroid Build Coastguard Worker   if (immediate.is_uint8()) {
2312*03ce13f7SAndroid Build Coastguard Worker     // Use zero-extended 8-bit immediate.
2313*03ce13f7SAndroid Build Coastguard Worker     emitRex(Ty, addr, RexRegIrrelevant);
2314*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2315*03ce13f7SAndroid Build Coastguard Worker     static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
2316*03ce13f7SAndroid Build Coastguard Worker     emitOperand(0, addr, OffsetFromNextInstruction);
2317*03ce13f7SAndroid Build Coastguard Worker     emitUint8(immediate.value() & 0xFF);
2318*03ce13f7SAndroid Build Coastguard Worker   } else {
2319*03ce13f7SAndroid Build Coastguard Worker     if (Ty == IceType_i16)
2320*03ce13f7SAndroid Build Coastguard Worker       emitOperandSizeOverride();
2321*03ce13f7SAndroid Build Coastguard Worker     emitRex(Ty, addr, RexRegIrrelevant);
2322*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2323*03ce13f7SAndroid Build Coastguard Worker     const uint8_t OffsetFromNextInstruction = Ty == IceType_i16 ? 2 : 4;
2324*03ce13f7SAndroid Build Coastguard Worker     emitOperand(0, addr, OffsetFromNextInstruction);
2325*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, immediate);
2326*03ce13f7SAndroid Build Coastguard Worker   }
2327*03ce13f7SAndroid Build Coastguard Worker }
2328*03ce13f7SAndroid Build Coastguard Worker 
And(Type Ty,GPRRegister dst,GPRRegister src)2329*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::And(Type Ty, GPRRegister dst, GPRRegister src) {
2330*03ce13f7SAndroid Build Coastguard Worker   arith_int<4>(Ty, dst, src);
2331*03ce13f7SAndroid Build Coastguard Worker }
2332*03ce13f7SAndroid Build Coastguard Worker 
And(Type Ty,GPRRegister dst,const AsmAddress & address)2333*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::And(Type Ty, GPRRegister dst, const AsmAddress &address) {
2334*03ce13f7SAndroid Build Coastguard Worker   arith_int<4>(Ty, dst, address);
2335*03ce13f7SAndroid Build Coastguard Worker }
2336*03ce13f7SAndroid Build Coastguard Worker 
And(Type Ty,GPRRegister dst,const Immediate & imm)2337*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::And(Type Ty, GPRRegister dst, const Immediate &imm) {
2338*03ce13f7SAndroid Build Coastguard Worker   arith_int<4>(Ty, dst, imm);
2339*03ce13f7SAndroid Build Coastguard Worker }
2340*03ce13f7SAndroid Build Coastguard Worker 
And(Type Ty,const AsmAddress & address,GPRRegister reg)2341*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::And(Type Ty, const AsmAddress &address, GPRRegister reg) {
2342*03ce13f7SAndroid Build Coastguard Worker   arith_int<4>(Ty, address, reg);
2343*03ce13f7SAndroid Build Coastguard Worker }
2344*03ce13f7SAndroid Build Coastguard Worker 
And(Type Ty,const AsmAddress & address,const Immediate & imm)2345*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::And(Type Ty, const AsmAddress &address,
2346*03ce13f7SAndroid Build Coastguard Worker                          const Immediate &imm) {
2347*03ce13f7SAndroid Build Coastguard Worker   arith_int<4>(Ty, address, imm);
2348*03ce13f7SAndroid Build Coastguard Worker }
2349*03ce13f7SAndroid Build Coastguard Worker 
Or(Type Ty,GPRRegister dst,GPRRegister src)2350*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Or(Type Ty, GPRRegister dst, GPRRegister src) {
2351*03ce13f7SAndroid Build Coastguard Worker   arith_int<1>(Ty, dst, src);
2352*03ce13f7SAndroid Build Coastguard Worker }
2353*03ce13f7SAndroid Build Coastguard Worker 
Or(Type Ty,GPRRegister dst,const AsmAddress & address)2354*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Or(Type Ty, GPRRegister dst, const AsmAddress &address) {
2355*03ce13f7SAndroid Build Coastguard Worker   arith_int<1>(Ty, dst, address);
2356*03ce13f7SAndroid Build Coastguard Worker }
2357*03ce13f7SAndroid Build Coastguard Worker 
Or(Type Ty,GPRRegister dst,const Immediate & imm)2358*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Or(Type Ty, GPRRegister dst, const Immediate &imm) {
2359*03ce13f7SAndroid Build Coastguard Worker   arith_int<1>(Ty, dst, imm);
2360*03ce13f7SAndroid Build Coastguard Worker }
2361*03ce13f7SAndroid Build Coastguard Worker 
Or(Type Ty,const AsmAddress & address,GPRRegister reg)2362*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Or(Type Ty, const AsmAddress &address, GPRRegister reg) {
2363*03ce13f7SAndroid Build Coastguard Worker   arith_int<1>(Ty, address, reg);
2364*03ce13f7SAndroid Build Coastguard Worker }
2365*03ce13f7SAndroid Build Coastguard Worker 
Or(Type Ty,const AsmAddress & address,const Immediate & imm)2366*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Or(Type Ty, const AsmAddress &address,
2367*03ce13f7SAndroid Build Coastguard Worker                         const Immediate &imm) {
2368*03ce13f7SAndroid Build Coastguard Worker   arith_int<1>(Ty, address, imm);
2369*03ce13f7SAndroid Build Coastguard Worker }
2370*03ce13f7SAndroid Build Coastguard Worker 
Xor(Type Ty,GPRRegister dst,GPRRegister src)2371*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Xor(Type Ty, GPRRegister dst, GPRRegister src) {
2372*03ce13f7SAndroid Build Coastguard Worker   arith_int<6>(Ty, dst, src);
2373*03ce13f7SAndroid Build Coastguard Worker }
2374*03ce13f7SAndroid Build Coastguard Worker 
Xor(Type Ty,GPRRegister dst,const AsmAddress & address)2375*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Xor(Type Ty, GPRRegister dst, const AsmAddress &address) {
2376*03ce13f7SAndroid Build Coastguard Worker   arith_int<6>(Ty, dst, address);
2377*03ce13f7SAndroid Build Coastguard Worker }
2378*03ce13f7SAndroid Build Coastguard Worker 
Xor(Type Ty,GPRRegister dst,const Immediate & imm)2379*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Xor(Type Ty, GPRRegister dst, const Immediate &imm) {
2380*03ce13f7SAndroid Build Coastguard Worker   arith_int<6>(Ty, dst, imm);
2381*03ce13f7SAndroid Build Coastguard Worker }
2382*03ce13f7SAndroid Build Coastguard Worker 
Xor(Type Ty,const AsmAddress & address,GPRRegister reg)2383*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Xor(Type Ty, const AsmAddress &address, GPRRegister reg) {
2384*03ce13f7SAndroid Build Coastguard Worker   arith_int<6>(Ty, address, reg);
2385*03ce13f7SAndroid Build Coastguard Worker }
2386*03ce13f7SAndroid Build Coastguard Worker 
Xor(Type Ty,const AsmAddress & address,const Immediate & imm)2387*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::Xor(Type Ty, const AsmAddress &address,
2388*03ce13f7SAndroid Build Coastguard Worker                          const Immediate &imm) {
2389*03ce13f7SAndroid Build Coastguard Worker   arith_int<6>(Ty, address, imm);
2390*03ce13f7SAndroid Build Coastguard Worker }
2391*03ce13f7SAndroid Build Coastguard Worker 
add(Type Ty,GPRRegister dst,GPRRegister src)2392*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::add(Type Ty, GPRRegister dst, GPRRegister src) {
2393*03ce13f7SAndroid Build Coastguard Worker   arith_int<0>(Ty, dst, src);
2394*03ce13f7SAndroid Build Coastguard Worker }
2395*03ce13f7SAndroid Build Coastguard Worker 
add(Type Ty,GPRRegister reg,const AsmAddress & address)2396*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::add(Type Ty, GPRRegister reg, const AsmAddress &address) {
2397*03ce13f7SAndroid Build Coastguard Worker   arith_int<0>(Ty, reg, address);
2398*03ce13f7SAndroid Build Coastguard Worker }
2399*03ce13f7SAndroid Build Coastguard Worker 
add(Type Ty,GPRRegister reg,const Immediate & imm)2400*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::add(Type Ty, GPRRegister reg, const Immediate &imm) {
2401*03ce13f7SAndroid Build Coastguard Worker   arith_int<0>(Ty, reg, imm);
2402*03ce13f7SAndroid Build Coastguard Worker }
2403*03ce13f7SAndroid Build Coastguard Worker 
add(Type Ty,const AsmAddress & address,GPRRegister reg)2404*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::add(Type Ty, const AsmAddress &address, GPRRegister reg) {
2405*03ce13f7SAndroid Build Coastguard Worker   arith_int<0>(Ty, address, reg);
2406*03ce13f7SAndroid Build Coastguard Worker }
2407*03ce13f7SAndroid Build Coastguard Worker 
add(Type Ty,const AsmAddress & address,const Immediate & imm)2408*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::add(Type Ty, const AsmAddress &address,
2409*03ce13f7SAndroid Build Coastguard Worker                          const Immediate &imm) {
2410*03ce13f7SAndroid Build Coastguard Worker   arith_int<0>(Ty, address, imm);
2411*03ce13f7SAndroid Build Coastguard Worker }
2412*03ce13f7SAndroid Build Coastguard Worker 
adc(Type Ty,GPRRegister dst,GPRRegister src)2413*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::adc(Type Ty, GPRRegister dst, GPRRegister src) {
2414*03ce13f7SAndroid Build Coastguard Worker   arith_int<2>(Ty, dst, src);
2415*03ce13f7SAndroid Build Coastguard Worker }
2416*03ce13f7SAndroid Build Coastguard Worker 
adc(Type Ty,GPRRegister dst,const AsmAddress & address)2417*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::adc(Type Ty, GPRRegister dst, const AsmAddress &address) {
2418*03ce13f7SAndroid Build Coastguard Worker   arith_int<2>(Ty, dst, address);
2419*03ce13f7SAndroid Build Coastguard Worker }
2420*03ce13f7SAndroid Build Coastguard Worker 
adc(Type Ty,GPRRegister reg,const Immediate & imm)2421*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::adc(Type Ty, GPRRegister reg, const Immediate &imm) {
2422*03ce13f7SAndroid Build Coastguard Worker   arith_int<2>(Ty, reg, imm);
2423*03ce13f7SAndroid Build Coastguard Worker }
2424*03ce13f7SAndroid Build Coastguard Worker 
adc(Type Ty,const AsmAddress & address,GPRRegister reg)2425*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::adc(Type Ty, const AsmAddress &address, GPRRegister reg) {
2426*03ce13f7SAndroid Build Coastguard Worker   arith_int<2>(Ty, address, reg);
2427*03ce13f7SAndroid Build Coastguard Worker }
2428*03ce13f7SAndroid Build Coastguard Worker 
adc(Type Ty,const AsmAddress & address,const Immediate & imm)2429*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::adc(Type Ty, const AsmAddress &address,
2430*03ce13f7SAndroid Build Coastguard Worker                          const Immediate &imm) {
2431*03ce13f7SAndroid Build Coastguard Worker   arith_int<2>(Ty, address, imm);
2432*03ce13f7SAndroid Build Coastguard Worker }
2433*03ce13f7SAndroid Build Coastguard Worker 
sub(Type Ty,GPRRegister dst,GPRRegister src)2434*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sub(Type Ty, GPRRegister dst, GPRRegister src) {
2435*03ce13f7SAndroid Build Coastguard Worker   arith_int<5>(Ty, dst, src);
2436*03ce13f7SAndroid Build Coastguard Worker }
2437*03ce13f7SAndroid Build Coastguard Worker 
sub(Type Ty,GPRRegister reg,const AsmAddress & address)2438*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sub(Type Ty, GPRRegister reg, const AsmAddress &address) {
2439*03ce13f7SAndroid Build Coastguard Worker   arith_int<5>(Ty, reg, address);
2440*03ce13f7SAndroid Build Coastguard Worker }
2441*03ce13f7SAndroid Build Coastguard Worker 
sub(Type Ty,GPRRegister reg,const Immediate & imm)2442*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sub(Type Ty, GPRRegister reg, const Immediate &imm) {
2443*03ce13f7SAndroid Build Coastguard Worker   arith_int<5>(Ty, reg, imm);
2444*03ce13f7SAndroid Build Coastguard Worker }
2445*03ce13f7SAndroid Build Coastguard Worker 
sub(Type Ty,const AsmAddress & address,GPRRegister reg)2446*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sub(Type Ty, const AsmAddress &address, GPRRegister reg) {
2447*03ce13f7SAndroid Build Coastguard Worker   arith_int<5>(Ty, address, reg);
2448*03ce13f7SAndroid Build Coastguard Worker }
2449*03ce13f7SAndroid Build Coastguard Worker 
sub(Type Ty,const AsmAddress & address,const Immediate & imm)2450*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sub(Type Ty, const AsmAddress &address,
2451*03ce13f7SAndroid Build Coastguard Worker                          const Immediate &imm) {
2452*03ce13f7SAndroid Build Coastguard Worker   arith_int<5>(Ty, address, imm);
2453*03ce13f7SAndroid Build Coastguard Worker }
2454*03ce13f7SAndroid Build Coastguard Worker 
sbb(Type Ty,GPRRegister dst,GPRRegister src)2455*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sbb(Type Ty, GPRRegister dst, GPRRegister src) {
2456*03ce13f7SAndroid Build Coastguard Worker   arith_int<3>(Ty, dst, src);
2457*03ce13f7SAndroid Build Coastguard Worker }
2458*03ce13f7SAndroid Build Coastguard Worker 
sbb(Type Ty,GPRRegister dst,const AsmAddress & address)2459*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sbb(Type Ty, GPRRegister dst, const AsmAddress &address) {
2460*03ce13f7SAndroid Build Coastguard Worker   arith_int<3>(Ty, dst, address);
2461*03ce13f7SAndroid Build Coastguard Worker }
2462*03ce13f7SAndroid Build Coastguard Worker 
sbb(Type Ty,GPRRegister reg,const Immediate & imm)2463*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sbb(Type Ty, GPRRegister reg, const Immediate &imm) {
2464*03ce13f7SAndroid Build Coastguard Worker   arith_int<3>(Ty, reg, imm);
2465*03ce13f7SAndroid Build Coastguard Worker }
2466*03ce13f7SAndroid Build Coastguard Worker 
sbb(Type Ty,const AsmAddress & address,GPRRegister reg)2467*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sbb(Type Ty, const AsmAddress &address, GPRRegister reg) {
2468*03ce13f7SAndroid Build Coastguard Worker   arith_int<3>(Ty, address, reg);
2469*03ce13f7SAndroid Build Coastguard Worker }
2470*03ce13f7SAndroid Build Coastguard Worker 
sbb(Type Ty,const AsmAddress & address,const Immediate & imm)2471*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sbb(Type Ty, const AsmAddress &address,
2472*03ce13f7SAndroid Build Coastguard Worker                          const Immediate &imm) {
2473*03ce13f7SAndroid Build Coastguard Worker   arith_int<3>(Ty, address, imm);
2474*03ce13f7SAndroid Build Coastguard Worker }
2475*03ce13f7SAndroid Build Coastguard Worker 
cbw()2476*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cbw() {
2477*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2478*03ce13f7SAndroid Build Coastguard Worker   emitOperandSizeOverride();
2479*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x98);
2480*03ce13f7SAndroid Build Coastguard Worker }
2481*03ce13f7SAndroid Build Coastguard Worker 
cwd()2482*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cwd() {
2483*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2484*03ce13f7SAndroid Build Coastguard Worker   emitOperandSizeOverride();
2485*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x99);
2486*03ce13f7SAndroid Build Coastguard Worker }
2487*03ce13f7SAndroid Build Coastguard Worker 
cdq()2488*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cdq() {
2489*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2490*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x99);
2491*03ce13f7SAndroid Build Coastguard Worker }
2492*03ce13f7SAndroid Build Coastguard Worker 
cqo()2493*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cqo() {
2494*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2495*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeForceRexW, RexRegIrrelevant);
2496*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x99);
2497*03ce13f7SAndroid Build Coastguard Worker }
2498*03ce13f7SAndroid Build Coastguard Worker 
div(Type Ty,GPRRegister reg)2499*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::div(Type Ty, GPRRegister reg) {
2500*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2501*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2502*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2503*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
2504*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2505*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2506*03ce13f7SAndroid Build Coastguard Worker   else
2507*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2508*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(6, gprEncoding(reg));
2509*03ce13f7SAndroid Build Coastguard Worker }
2510*03ce13f7SAndroid Build Coastguard Worker 
div(Type Ty,const AsmAddress & addr)2511*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::div(Type Ty, const AsmAddress &addr) {
2512*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2513*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2514*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2515*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, addr, RexRegIrrelevant);
2516*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2517*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2518*03ce13f7SAndroid Build Coastguard Worker   else
2519*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2520*03ce13f7SAndroid Build Coastguard Worker   emitOperand(6, addr);
2521*03ce13f7SAndroid Build Coastguard Worker }
2522*03ce13f7SAndroid Build Coastguard Worker 
idiv(Type Ty,GPRRegister reg)2523*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::idiv(Type Ty, GPRRegister reg) {
2524*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2525*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2526*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2527*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
2528*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2529*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2530*03ce13f7SAndroid Build Coastguard Worker   else
2531*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2532*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(7, gprEncoding(reg));
2533*03ce13f7SAndroid Build Coastguard Worker }
2534*03ce13f7SAndroid Build Coastguard Worker 
idiv(Type Ty,const AsmAddress & addr)2535*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::idiv(Type Ty, const AsmAddress &addr) {
2536*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2537*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2538*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2539*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, addr, RexRegIrrelevant);
2540*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2541*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2542*03ce13f7SAndroid Build Coastguard Worker   else
2543*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2544*03ce13f7SAndroid Build Coastguard Worker   emitOperand(7, addr);
2545*03ce13f7SAndroid Build Coastguard Worker }
2546*03ce13f7SAndroid Build Coastguard Worker 
imul(Type Ty,GPRRegister dst,GPRRegister src)2547*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::imul(Type Ty, GPRRegister dst, GPRRegister src) {
2548*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2549*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
2550*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2551*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2552*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, dst, src);
2553*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2554*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xAF);
2555*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2556*03ce13f7SAndroid Build Coastguard Worker }
2557*03ce13f7SAndroid Build Coastguard Worker 
imul(Type Ty,GPRRegister reg,const AsmAddress & address)2558*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::imul(Type Ty, GPRRegister reg, const AsmAddress &address) {
2559*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2560*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
2561*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2562*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2563*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, reg);
2564*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2565*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xAF);
2566*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(reg), address);
2567*03ce13f7SAndroid Build Coastguard Worker }
2568*03ce13f7SAndroid Build Coastguard Worker 
imul(Type Ty,GPRRegister reg,const Immediate & imm)2569*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::imul(Type Ty, GPRRegister reg, const Immediate &imm) {
2570*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2571*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
2572*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2573*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2574*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, reg, reg);
2575*03ce13f7SAndroid Build Coastguard Worker   if (imm.is_int8()) {
2576*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x6B);
2577*03ce13f7SAndroid Build Coastguard Worker     emitRegisterOperand(gprEncoding(reg), gprEncoding(reg));
2578*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value() & 0xFF);
2579*03ce13f7SAndroid Build Coastguard Worker   } else {
2580*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x69);
2581*03ce13f7SAndroid Build Coastguard Worker     emitRegisterOperand(gprEncoding(reg), gprEncoding(reg));
2582*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, imm);
2583*03ce13f7SAndroid Build Coastguard Worker   }
2584*03ce13f7SAndroid Build Coastguard Worker }
2585*03ce13f7SAndroid Build Coastguard Worker 
imul(Type Ty,GPRRegister reg)2586*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::imul(Type Ty, GPRRegister reg) {
2587*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2588*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2589*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2590*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
2591*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2592*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2593*03ce13f7SAndroid Build Coastguard Worker   else
2594*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2595*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(5, gprEncoding(reg));
2596*03ce13f7SAndroid Build Coastguard Worker }
2597*03ce13f7SAndroid Build Coastguard Worker 
imul(Type Ty,const AsmAddress & address)2598*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::imul(Type Ty, const AsmAddress &address) {
2599*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2600*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2601*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2602*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, RexRegIrrelevant);
2603*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2604*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2605*03ce13f7SAndroid Build Coastguard Worker   else
2606*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2607*03ce13f7SAndroid Build Coastguard Worker   emitOperand(5, address);
2608*03ce13f7SAndroid Build Coastguard Worker }
2609*03ce13f7SAndroid Build Coastguard Worker 
imul(Type Ty,GPRRegister dst,GPRRegister src,const Immediate & imm)2610*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::imul(Type Ty, GPRRegister dst, GPRRegister src,
2611*03ce13f7SAndroid Build Coastguard Worker                           const Immediate &imm) {
2612*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2613*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2614*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2615*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2616*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, dst, src);
2617*03ce13f7SAndroid Build Coastguard Worker   if (imm.is_int8()) {
2618*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x6B);
2619*03ce13f7SAndroid Build Coastguard Worker     emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2620*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value() & 0xFF);
2621*03ce13f7SAndroid Build Coastguard Worker   } else {
2622*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x69);
2623*03ce13f7SAndroid Build Coastguard Worker     emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2624*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, imm);
2625*03ce13f7SAndroid Build Coastguard Worker   }
2626*03ce13f7SAndroid Build Coastguard Worker }
2627*03ce13f7SAndroid Build Coastguard Worker 
imul(Type Ty,GPRRegister dst,const AsmAddress & address,const Immediate & imm)2628*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::imul(Type Ty, GPRRegister dst, const AsmAddress &address,
2629*03ce13f7SAndroid Build Coastguard Worker                           const Immediate &imm) {
2630*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2631*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2632*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2633*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2634*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, dst);
2635*03ce13f7SAndroid Build Coastguard Worker   if (imm.is_int8()) {
2636*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x6B);
2637*03ce13f7SAndroid Build Coastguard Worker     static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
2638*03ce13f7SAndroid Build Coastguard Worker     emitOperand(gprEncoding(dst), address, OffsetFromNextInstruction);
2639*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value() & 0xFF);
2640*03ce13f7SAndroid Build Coastguard Worker   } else {
2641*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x69);
2642*03ce13f7SAndroid Build Coastguard Worker     const uint8_t OffsetFromNextInstruction = Ty == IceType_i16 ? 2 : 4;
2643*03ce13f7SAndroid Build Coastguard Worker     emitOperand(gprEncoding(dst), address, OffsetFromNextInstruction);
2644*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, imm);
2645*03ce13f7SAndroid Build Coastguard Worker   }
2646*03ce13f7SAndroid Build Coastguard Worker }
2647*03ce13f7SAndroid Build Coastguard Worker 
mul(Type Ty,GPRRegister reg)2648*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mul(Type Ty, GPRRegister reg) {
2649*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2650*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2651*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2652*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
2653*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2654*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2655*03ce13f7SAndroid Build Coastguard Worker   else
2656*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2657*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(4, gprEncoding(reg));
2658*03ce13f7SAndroid Build Coastguard Worker }
2659*03ce13f7SAndroid Build Coastguard Worker 
mul(Type Ty,const AsmAddress & address)2660*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mul(Type Ty, const AsmAddress &address) {
2661*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2662*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2663*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2664*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, RexRegIrrelevant);
2665*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2666*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2667*03ce13f7SAndroid Build Coastguard Worker   else
2668*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2669*03ce13f7SAndroid Build Coastguard Worker   emitOperand(4, address);
2670*03ce13f7SAndroid Build Coastguard Worker }
2671*03ce13f7SAndroid Build Coastguard Worker 
incl(const AsmAddress & address)2672*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::incl(const AsmAddress &address) {
2673*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2674*03ce13f7SAndroid Build Coastguard Worker   emitRex(IceType_i32, address, RexRegIrrelevant);
2675*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xFF);
2676*03ce13f7SAndroid Build Coastguard Worker   emitOperand(0, address);
2677*03ce13f7SAndroid Build Coastguard Worker }
2678*03ce13f7SAndroid Build Coastguard Worker 
decl(const AsmAddress & address)2679*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::decl(const AsmAddress &address) {
2680*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2681*03ce13f7SAndroid Build Coastguard Worker   emitRex(IceType_i32, address, RexRegIrrelevant);
2682*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xFF);
2683*03ce13f7SAndroid Build Coastguard Worker   emitOperand(1, address);
2684*03ce13f7SAndroid Build Coastguard Worker }
2685*03ce13f7SAndroid Build Coastguard Worker 
rol(Type Ty,GPRRegister reg,const Immediate & imm)2686*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::rol(Type Ty, GPRRegister reg, const Immediate &imm) {
2687*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(0, Ty, reg, imm);
2688*03ce13f7SAndroid Build Coastguard Worker }
2689*03ce13f7SAndroid Build Coastguard Worker 
rol(Type Ty,GPRRegister operand,GPRRegister shifter)2690*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::rol(Type Ty, GPRRegister operand, GPRRegister shifter) {
2691*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(0, Ty, AsmOperand(operand), shifter);
2692*03ce13f7SAndroid Build Coastguard Worker }
2693*03ce13f7SAndroid Build Coastguard Worker 
rol(Type Ty,const AsmAddress & operand,GPRRegister shifter)2694*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::rol(Type Ty, const AsmAddress &operand,
2695*03ce13f7SAndroid Build Coastguard Worker                          GPRRegister shifter) {
2696*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(0, Ty, operand, shifter);
2697*03ce13f7SAndroid Build Coastguard Worker }
2698*03ce13f7SAndroid Build Coastguard Worker 
shl(Type Ty,GPRRegister reg,const Immediate & imm)2699*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shl(Type Ty, GPRRegister reg, const Immediate &imm) {
2700*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(4, Ty, reg, imm);
2701*03ce13f7SAndroid Build Coastguard Worker }
2702*03ce13f7SAndroid Build Coastguard Worker 
shl(Type Ty,GPRRegister operand,GPRRegister shifter)2703*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shl(Type Ty, GPRRegister operand, GPRRegister shifter) {
2704*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(4, Ty, AsmOperand(operand), shifter);
2705*03ce13f7SAndroid Build Coastguard Worker }
2706*03ce13f7SAndroid Build Coastguard Worker 
shl(Type Ty,const AsmAddress & operand,GPRRegister shifter)2707*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shl(Type Ty, const AsmAddress &operand,
2708*03ce13f7SAndroid Build Coastguard Worker                          GPRRegister shifter) {
2709*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(4, Ty, operand, shifter);
2710*03ce13f7SAndroid Build Coastguard Worker }
2711*03ce13f7SAndroid Build Coastguard Worker 
shr(Type Ty,GPRRegister reg,const Immediate & imm)2712*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shr(Type Ty, GPRRegister reg, const Immediate &imm) {
2713*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(5, Ty, reg, imm);
2714*03ce13f7SAndroid Build Coastguard Worker }
2715*03ce13f7SAndroid Build Coastguard Worker 
shr(Type Ty,GPRRegister operand,GPRRegister shifter)2716*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shr(Type Ty, GPRRegister operand, GPRRegister shifter) {
2717*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(5, Ty, AsmOperand(operand), shifter);
2718*03ce13f7SAndroid Build Coastguard Worker }
2719*03ce13f7SAndroid Build Coastguard Worker 
shr(Type Ty,const AsmAddress & operand,GPRRegister shifter)2720*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shr(Type Ty, const AsmAddress &operand,
2721*03ce13f7SAndroid Build Coastguard Worker                          GPRRegister shifter) {
2722*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(5, Ty, operand, shifter);
2723*03ce13f7SAndroid Build Coastguard Worker }
2724*03ce13f7SAndroid Build Coastguard Worker 
sar(Type Ty,GPRRegister reg,const Immediate & imm)2725*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sar(Type Ty, GPRRegister reg, const Immediate &imm) {
2726*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(7, Ty, reg, imm);
2727*03ce13f7SAndroid Build Coastguard Worker }
2728*03ce13f7SAndroid Build Coastguard Worker 
sar(Type Ty,GPRRegister operand,GPRRegister shifter)2729*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sar(Type Ty, GPRRegister operand, GPRRegister shifter) {
2730*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(7, Ty, AsmOperand(operand), shifter);
2731*03ce13f7SAndroid Build Coastguard Worker }
2732*03ce13f7SAndroid Build Coastguard Worker 
sar(Type Ty,const AsmAddress & address,GPRRegister shifter)2733*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::sar(Type Ty, const AsmAddress &address,
2734*03ce13f7SAndroid Build Coastguard Worker                          GPRRegister shifter) {
2735*03ce13f7SAndroid Build Coastguard Worker   emitGenericShift(7, Ty, address, shifter);
2736*03ce13f7SAndroid Build Coastguard Worker }
2737*03ce13f7SAndroid Build Coastguard Worker 
shld(Type Ty,GPRRegister dst,GPRRegister src)2738*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shld(Type Ty, GPRRegister dst, GPRRegister src) {
2739*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2740*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2741*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2742*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2743*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, src, dst);
2744*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2745*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xA5);
2746*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2747*03ce13f7SAndroid Build Coastguard Worker }
2748*03ce13f7SAndroid Build Coastguard Worker 
shld(Type Ty,GPRRegister dst,GPRRegister src,const Immediate & imm)2749*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shld(Type Ty, GPRRegister dst, GPRRegister src,
2750*03ce13f7SAndroid Build Coastguard Worker                           const Immediate &imm) {
2751*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2752*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2753*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_int8());
2754*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2755*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2756*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, src, dst);
2757*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2758*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xA4);
2759*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2760*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value() & 0xFF);
2761*03ce13f7SAndroid Build Coastguard Worker }
2762*03ce13f7SAndroid Build Coastguard Worker 
shld(Type Ty,const AsmAddress & operand,GPRRegister src)2763*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shld(Type Ty, const AsmAddress &operand, GPRRegister src) {
2764*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2765*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2766*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2767*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2768*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, operand, src);
2769*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2770*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xA5);
2771*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(src), operand);
2772*03ce13f7SAndroid Build Coastguard Worker }
2773*03ce13f7SAndroid Build Coastguard Worker 
shrd(Type Ty,GPRRegister dst,GPRRegister src)2774*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shrd(Type Ty, GPRRegister dst, GPRRegister src) {
2775*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2776*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2777*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2778*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2779*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, src, dst);
2780*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2781*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xAD);
2782*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2783*03ce13f7SAndroid Build Coastguard Worker }
2784*03ce13f7SAndroid Build Coastguard Worker 
shrd(Type Ty,GPRRegister dst,GPRRegister src,const Immediate & imm)2785*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shrd(Type Ty, GPRRegister dst, GPRRegister src,
2786*03ce13f7SAndroid Build Coastguard Worker                           const Immediate &imm) {
2787*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2788*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2789*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_int8());
2790*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2791*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2792*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, src, dst);
2793*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2794*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xAC);
2795*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2796*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value() & 0xFF);
2797*03ce13f7SAndroid Build Coastguard Worker }
2798*03ce13f7SAndroid Build Coastguard Worker 
shrd(Type Ty,const AsmAddress & dst,GPRRegister src)2799*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::shrd(Type Ty, const AsmAddress &dst, GPRRegister src) {
2800*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2801*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32);
2802*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2803*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2804*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, dst, src);
2805*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2806*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xAD);
2807*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(src), dst);
2808*03ce13f7SAndroid Build Coastguard Worker }
2809*03ce13f7SAndroid Build Coastguard Worker 
neg(Type Ty,GPRRegister reg)2810*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::neg(Type Ty, GPRRegister reg) {
2811*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2812*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2813*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2814*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
2815*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2816*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2817*03ce13f7SAndroid Build Coastguard Worker   else
2818*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2819*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(3, gprEncoding(reg));
2820*03ce13f7SAndroid Build Coastguard Worker }
2821*03ce13f7SAndroid Build Coastguard Worker 
neg(Type Ty,const AsmAddress & addr)2822*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::neg(Type Ty, const AsmAddress &addr) {
2823*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2824*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2825*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2826*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, addr, RexRegIrrelevant);
2827*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
2828*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF6);
2829*03ce13f7SAndroid Build Coastguard Worker   else
2830*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF7);
2831*03ce13f7SAndroid Build Coastguard Worker   emitOperand(3, addr);
2832*03ce13f7SAndroid Build Coastguard Worker }
2833*03ce13f7SAndroid Build Coastguard Worker 
notl(GPRRegister reg)2834*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::notl(GPRRegister reg) {
2835*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2836*03ce13f7SAndroid Build Coastguard Worker   emitRexB(IceType_i32, reg);
2837*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF7);
2838*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xD0 | gprEncoding(reg));
2839*03ce13f7SAndroid Build Coastguard Worker }
2840*03ce13f7SAndroid Build Coastguard Worker 
bswap(Type Ty,GPRRegister reg)2841*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bswap(Type Ty, GPRRegister reg) {
2842*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2843*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i32 || Ty == IceType_i64);
2844*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
2845*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2846*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC8 | gprEncoding(reg));
2847*03ce13f7SAndroid Build Coastguard Worker }
2848*03ce13f7SAndroid Build Coastguard Worker 
bsf(Type Ty,GPRRegister dst,GPRRegister src)2849*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bsf(Type Ty, GPRRegister dst, GPRRegister src) {
2850*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2851*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
2852*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2853*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2854*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, dst, src);
2855*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2856*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xBC);
2857*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2858*03ce13f7SAndroid Build Coastguard Worker }
2859*03ce13f7SAndroid Build Coastguard Worker 
bsf(Type Ty,GPRRegister dst,const AsmAddress & src)2860*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bsf(Type Ty, GPRRegister dst, const AsmAddress &src) {
2861*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2862*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
2863*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2864*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2865*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, src, dst);
2866*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2867*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xBC);
2868*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
2869*03ce13f7SAndroid Build Coastguard Worker }
2870*03ce13f7SAndroid Build Coastguard Worker 
bsr(Type Ty,GPRRegister dst,GPRRegister src)2871*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bsr(Type Ty, GPRRegister dst, GPRRegister src) {
2872*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2873*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
2874*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2875*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2876*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(Ty, dst, src);
2877*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2878*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xBD);
2879*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2880*03ce13f7SAndroid Build Coastguard Worker }
2881*03ce13f7SAndroid Build Coastguard Worker 
bsr(Type Ty,GPRRegister dst,const AsmAddress & src)2882*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bsr(Type Ty, GPRRegister dst, const AsmAddress &src) {
2883*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2884*03ce13f7SAndroid Build Coastguard Worker   assert(Ty == IceType_i16 || Ty == IceType_i32 || Ty == IceType_i64);
2885*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
2886*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
2887*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, src, dst);
2888*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2889*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xBD);
2890*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(dst), src);
2891*03ce13f7SAndroid Build Coastguard Worker }
2892*03ce13f7SAndroid Build Coastguard Worker 
bt(GPRRegister base,GPRRegister offset)2893*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bt(GPRRegister base, GPRRegister offset) {
2894*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2895*03ce13f7SAndroid Build Coastguard Worker   emitRexRB(IceType_i32, offset, base);
2896*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2897*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xA3);
2898*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(gprEncoding(offset), gprEncoding(base));
2899*03ce13f7SAndroid Build Coastguard Worker }
2900*03ce13f7SAndroid Build Coastguard Worker 
ret()2901*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::ret() {
2902*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2903*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC3);
2904*03ce13f7SAndroid Build Coastguard Worker }
2905*03ce13f7SAndroid Build Coastguard Worker 
ret(const Immediate & imm)2906*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::ret(const Immediate &imm) {
2907*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2908*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC2);
2909*03ce13f7SAndroid Build Coastguard Worker   assert(imm.is_uint16());
2910*03ce13f7SAndroid Build Coastguard Worker   emitUint8(imm.value() & 0xFF);
2911*03ce13f7SAndroid Build Coastguard Worker   emitUint8((imm.value() >> 8) & 0xFF);
2912*03ce13f7SAndroid Build Coastguard Worker }
2913*03ce13f7SAndroid Build Coastguard Worker 
nop(int size)2914*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::nop(int size) {
2915*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2916*03ce13f7SAndroid Build Coastguard Worker   // There are nops up to size 15, but for now just provide up to size 8.
2917*03ce13f7SAndroid Build Coastguard Worker   assert(0 < size && size <= MAX_NOP_SIZE);
2918*03ce13f7SAndroid Build Coastguard Worker   switch (size) {
2919*03ce13f7SAndroid Build Coastguard Worker   case 1:
2920*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x90);
2921*03ce13f7SAndroid Build Coastguard Worker     break;
2922*03ce13f7SAndroid Build Coastguard Worker   case 2:
2923*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
2924*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x90);
2925*03ce13f7SAndroid Build Coastguard Worker     break;
2926*03ce13f7SAndroid Build Coastguard Worker   case 3:
2927*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2928*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x1F);
2929*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2930*03ce13f7SAndroid Build Coastguard Worker     break;
2931*03ce13f7SAndroid Build Coastguard Worker   case 4:
2932*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2933*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x1F);
2934*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x40);
2935*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2936*03ce13f7SAndroid Build Coastguard Worker     break;
2937*03ce13f7SAndroid Build Coastguard Worker   case 5:
2938*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2939*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x1F);
2940*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x44);
2941*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2942*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2943*03ce13f7SAndroid Build Coastguard Worker     break;
2944*03ce13f7SAndroid Build Coastguard Worker   case 6:
2945*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x66);
2946*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2947*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x1F);
2948*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x44);
2949*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2950*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2951*03ce13f7SAndroid Build Coastguard Worker     break;
2952*03ce13f7SAndroid Build Coastguard Worker   case 7:
2953*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2954*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x1F);
2955*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x80);
2956*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2957*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2958*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2959*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2960*03ce13f7SAndroid Build Coastguard Worker     break;
2961*03ce13f7SAndroid Build Coastguard Worker   case 8:
2962*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
2963*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x1F);
2964*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x84);
2965*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2966*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2967*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2968*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2969*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x00);
2970*03ce13f7SAndroid Build Coastguard Worker     break;
2971*03ce13f7SAndroid Build Coastguard Worker   default:
2972*03ce13f7SAndroid Build Coastguard Worker     llvm_unreachable("Unimplemented");
2973*03ce13f7SAndroid Build Coastguard Worker   }
2974*03ce13f7SAndroid Build Coastguard Worker }
2975*03ce13f7SAndroid Build Coastguard Worker 
int3()2976*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::int3() {
2977*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2978*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xCC);
2979*03ce13f7SAndroid Build Coastguard Worker }
2980*03ce13f7SAndroid Build Coastguard Worker 
hlt()2981*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::hlt() {
2982*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2983*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF4);
2984*03ce13f7SAndroid Build Coastguard Worker }
2985*03ce13f7SAndroid Build Coastguard Worker 
ud2()2986*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::ud2() {
2987*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2988*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
2989*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0B);
2990*03ce13f7SAndroid Build Coastguard Worker }
2991*03ce13f7SAndroid Build Coastguard Worker 
j(BrCond condition,Label * label,bool near)2992*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::j(BrCond condition, Label *label, bool near) {
2993*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2994*03ce13f7SAndroid Build Coastguard Worker   if (label->isBound()) {
2995*03ce13f7SAndroid Build Coastguard Worker     static const int kShortSize = 2;
2996*03ce13f7SAndroid Build Coastguard Worker     static const int kLongSize = 6;
2997*03ce13f7SAndroid Build Coastguard Worker     intptr_t offset = label->getPosition() - Buffer.size();
2998*03ce13f7SAndroid Build Coastguard Worker     assert(offset <= 0);
2999*03ce13f7SAndroid Build Coastguard Worker     if (Utils::IsInt(8, offset - kShortSize)) {
3000*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0x70 + condition);
3001*03ce13f7SAndroid Build Coastguard Worker       emitUint8((offset - kShortSize) & 0xFF);
3002*03ce13f7SAndroid Build Coastguard Worker     } else {
3003*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0x0F);
3004*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0x80 + condition);
3005*03ce13f7SAndroid Build Coastguard Worker       emitInt32(offset - kLongSize);
3006*03ce13f7SAndroid Build Coastguard Worker     }
3007*03ce13f7SAndroid Build Coastguard Worker   } else if (near) {
3008*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x70 + condition);
3009*03ce13f7SAndroid Build Coastguard Worker     emitNearLabelLink(label);
3010*03ce13f7SAndroid Build Coastguard Worker   } else {
3011*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x0F);
3012*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x80 + condition);
3013*03ce13f7SAndroid Build Coastguard Worker     emitLabelLink(label);
3014*03ce13f7SAndroid Build Coastguard Worker   }
3015*03ce13f7SAndroid Build Coastguard Worker }
3016*03ce13f7SAndroid Build Coastguard Worker 
j(BrCond condition,const ConstantRelocatable * label)3017*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::j(BrCond condition, const ConstantRelocatable *label) {
3018*03ce13f7SAndroid Build Coastguard Worker   llvm::report_fatal_error("Untested - please verify and then reenable.");
3019*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3020*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
3021*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x80 + condition);
3022*03ce13f7SAndroid Build Coastguard Worker   auto *Fixup = this->createFixup(FK_PcRel, label);
3023*03ce13f7SAndroid Build Coastguard Worker   Fixup->set_addend(-4);
3024*03ce13f7SAndroid Build Coastguard Worker   emitFixup(Fixup);
3025*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
3026*03ce13f7SAndroid Build Coastguard Worker }
3027*03ce13f7SAndroid Build Coastguard Worker 
jmp(GPRRegister reg)3028*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::jmp(GPRRegister reg) {
3029*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3030*03ce13f7SAndroid Build Coastguard Worker   emitRexB(RexTypeIrrelevant, reg);
3031*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xFF);
3032*03ce13f7SAndroid Build Coastguard Worker   emitRegisterOperand(4, gprEncoding(reg));
3033*03ce13f7SAndroid Build Coastguard Worker }
3034*03ce13f7SAndroid Build Coastguard Worker 
jmp(Label * label,bool near)3035*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::jmp(Label *label, bool near) {
3036*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3037*03ce13f7SAndroid Build Coastguard Worker   if (label->isBound()) {
3038*03ce13f7SAndroid Build Coastguard Worker     static const int kShortSize = 2;
3039*03ce13f7SAndroid Build Coastguard Worker     static const int kLongSize = 5;
3040*03ce13f7SAndroid Build Coastguard Worker     intptr_t offset = label->getPosition() - Buffer.size();
3041*03ce13f7SAndroid Build Coastguard Worker     assert(offset <= 0);
3042*03ce13f7SAndroid Build Coastguard Worker     if (Utils::IsInt(8, offset - kShortSize)) {
3043*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0xEB);
3044*03ce13f7SAndroid Build Coastguard Worker       emitUint8((offset - kShortSize) & 0xFF);
3045*03ce13f7SAndroid Build Coastguard Worker     } else {
3046*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0xE9);
3047*03ce13f7SAndroid Build Coastguard Worker       emitInt32(offset - kLongSize);
3048*03ce13f7SAndroid Build Coastguard Worker     }
3049*03ce13f7SAndroid Build Coastguard Worker   } else if (near) {
3050*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xEB);
3051*03ce13f7SAndroid Build Coastguard Worker     emitNearLabelLink(label);
3052*03ce13f7SAndroid Build Coastguard Worker   } else {
3053*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xE9);
3054*03ce13f7SAndroid Build Coastguard Worker     emitLabelLink(label);
3055*03ce13f7SAndroid Build Coastguard Worker   }
3056*03ce13f7SAndroid Build Coastguard Worker }
3057*03ce13f7SAndroid Build Coastguard Worker 
jmp(const ConstantRelocatable * label)3058*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::jmp(const ConstantRelocatable *label) {
3059*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3060*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE9);
3061*03ce13f7SAndroid Build Coastguard Worker   auto *Fixup = this->createFixup(FK_PcRel, label);
3062*03ce13f7SAndroid Build Coastguard Worker   Fixup->set_addend(-4);
3063*03ce13f7SAndroid Build Coastguard Worker   emitFixup(Fixup);
3064*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
3065*03ce13f7SAndroid Build Coastguard Worker }
3066*03ce13f7SAndroid Build Coastguard Worker 
jmp(const Immediate & abs_address)3067*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::jmp(const Immediate &abs_address) {
3068*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3069*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xE9);
3070*03ce13f7SAndroid Build Coastguard Worker   AssemblerFixup *Fixup = createFixup(FK_PcRel, AssemblerFixup::NullSymbol);
3071*03ce13f7SAndroid Build Coastguard Worker   Fixup->set_addend(abs_address.value() - 4);
3072*03ce13f7SAndroid Build Coastguard Worker   emitFixup(Fixup);
3073*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
3074*03ce13f7SAndroid Build Coastguard Worker }
3075*03ce13f7SAndroid Build Coastguard Worker 
mfence()3076*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::mfence() {
3077*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3078*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
3079*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xAE);
3080*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF0);
3081*03ce13f7SAndroid Build Coastguard Worker }
3082*03ce13f7SAndroid Build Coastguard Worker 
lock()3083*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::lock() {
3084*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3085*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xF0);
3086*03ce13f7SAndroid Build Coastguard Worker }
3087*03ce13f7SAndroid Build Coastguard Worker 
cmpxchg(Type Ty,const AsmAddress & address,GPRRegister reg,bool Locked)3088*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmpxchg(Type Ty, const AsmAddress &address,
3089*03ce13f7SAndroid Build Coastguard Worker                              GPRRegister reg, bool Locked) {
3090*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3091*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
3092*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
3093*03ce13f7SAndroid Build Coastguard Worker   if (Locked)
3094*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF0);
3095*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, address, reg);
3096*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
3097*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
3098*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xB0);
3099*03ce13f7SAndroid Build Coastguard Worker   else
3100*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xB1);
3101*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(reg), address);
3102*03ce13f7SAndroid Build Coastguard Worker }
3103*03ce13f7SAndroid Build Coastguard Worker 
cmpxchg8b(const AsmAddress & address,bool Locked)3104*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::cmpxchg8b(const AsmAddress &address, bool Locked) {
3105*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3106*03ce13f7SAndroid Build Coastguard Worker   if (Locked)
3107*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF0);
3108*03ce13f7SAndroid Build Coastguard Worker   emitRex(IceType_i32, address, RexRegIrrelevant);
3109*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
3110*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xC7);
3111*03ce13f7SAndroid Build Coastguard Worker   emitOperand(1, address);
3112*03ce13f7SAndroid Build Coastguard Worker }
3113*03ce13f7SAndroid Build Coastguard Worker 
xadd(Type Ty,const AsmAddress & addr,GPRRegister reg,bool Locked)3114*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::xadd(Type Ty, const AsmAddress &addr, GPRRegister reg,
3115*03ce13f7SAndroid Build Coastguard Worker                           bool Locked) {
3116*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3117*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
3118*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
3119*03ce13f7SAndroid Build Coastguard Worker   if (Locked)
3120*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xF0);
3121*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, addr, reg);
3122*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
3123*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
3124*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xC0);
3125*03ce13f7SAndroid Build Coastguard Worker   else
3126*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0xC1);
3127*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(reg), addr);
3128*03ce13f7SAndroid Build Coastguard Worker }
3129*03ce13f7SAndroid Build Coastguard Worker 
xchg(Type Ty,GPRRegister reg0,GPRRegister reg1)3130*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::xchg(Type Ty, GPRRegister reg0, GPRRegister reg1) {
3131*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3132*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
3133*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
3134*03ce13f7SAndroid Build Coastguard Worker   // Use short form if either register is RAX.
3135*03ce13f7SAndroid Build Coastguard Worker   if (reg0 == RegX8664::Encoded_Reg_rax) {
3136*03ce13f7SAndroid Build Coastguard Worker     emitRexB(Ty, reg1);
3137*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x90 + gprEncoding(reg1));
3138*03ce13f7SAndroid Build Coastguard Worker   } else if (reg1 == RegX8664::Encoded_Reg_rax) {
3139*03ce13f7SAndroid Build Coastguard Worker     emitRexB(Ty, reg0);
3140*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x90 + gprEncoding(reg0));
3141*03ce13f7SAndroid Build Coastguard Worker   } else {
3142*03ce13f7SAndroid Build Coastguard Worker     emitRexRB(Ty, reg0, reg1);
3143*03ce13f7SAndroid Build Coastguard Worker     if (isByteSizedArithType(Ty))
3144*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0x86);
3145*03ce13f7SAndroid Build Coastguard Worker     else
3146*03ce13f7SAndroid Build Coastguard Worker       emitUint8(0x87);
3147*03ce13f7SAndroid Build Coastguard Worker     emitRegisterOperand(gprEncoding(reg0), gprEncoding(reg1));
3148*03ce13f7SAndroid Build Coastguard Worker   }
3149*03ce13f7SAndroid Build Coastguard Worker }
3150*03ce13f7SAndroid Build Coastguard Worker 
xchg(Type Ty,const AsmAddress & addr,GPRRegister reg)3151*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::xchg(Type Ty, const AsmAddress &addr, GPRRegister reg) {
3152*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3153*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
3154*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
3155*03ce13f7SAndroid Build Coastguard Worker   emitRex(Ty, addr, reg);
3156*03ce13f7SAndroid Build Coastguard Worker   if (isByteSizedArithType(Ty))
3157*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x86);
3158*03ce13f7SAndroid Build Coastguard Worker   else
3159*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x87);
3160*03ce13f7SAndroid Build Coastguard Worker   emitOperand(gprEncoding(reg), addr);
3161*03ce13f7SAndroid Build Coastguard Worker }
3162*03ce13f7SAndroid Build Coastguard Worker 
iaca_start()3163*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::iaca_start() {
3164*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3165*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
3166*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0B);
3167*03ce13f7SAndroid Build Coastguard Worker 
3168*03ce13f7SAndroid Build Coastguard Worker   // mov $111, ebx
3169*03ce13f7SAndroid Build Coastguard Worker   constexpr GPRRegister dst = GPRRegister::Encoded_Reg_ebx;
3170*03ce13f7SAndroid Build Coastguard Worker   constexpr Type Ty = IceType_i32;
3171*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, dst);
3172*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xB8 + gprEncoding(dst));
3173*03ce13f7SAndroid Build Coastguard Worker   emitImmediate(Ty, Immediate(111));
3174*03ce13f7SAndroid Build Coastguard Worker 
3175*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x64);
3176*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x67);
3177*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x90);
3178*03ce13f7SAndroid Build Coastguard Worker }
3179*03ce13f7SAndroid Build Coastguard Worker 
iaca_end()3180*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::iaca_end() {
3181*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3182*03ce13f7SAndroid Build Coastguard Worker 
3183*03ce13f7SAndroid Build Coastguard Worker   // mov $222, ebx
3184*03ce13f7SAndroid Build Coastguard Worker   constexpr GPRRegister dst = GPRRegister::Encoded_Reg_ebx;
3185*03ce13f7SAndroid Build Coastguard Worker   constexpr Type Ty = IceType_i32;
3186*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, dst);
3187*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0xB8 + gprEncoding(dst));
3188*03ce13f7SAndroid Build Coastguard Worker   emitImmediate(Ty, Immediate(222));
3189*03ce13f7SAndroid Build Coastguard Worker 
3190*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x64);
3191*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x67);
3192*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x90);
3193*03ce13f7SAndroid Build Coastguard Worker 
3194*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0F);
3195*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0x0B);
3196*03ce13f7SAndroid Build Coastguard Worker }
3197*03ce13f7SAndroid Build Coastguard Worker 
emitSegmentOverride(uint8_t prefix)3198*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitSegmentOverride(uint8_t prefix) {
3199*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3200*03ce13f7SAndroid Build Coastguard Worker   emitUint8(prefix);
3201*03ce13f7SAndroid Build Coastguard Worker }
3202*03ce13f7SAndroid Build Coastguard Worker 
align(intptr_t alignment,intptr_t offset)3203*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::align(intptr_t alignment, intptr_t offset) {
3204*03ce13f7SAndroid Build Coastguard Worker   assert(llvm::isPowerOf2_32(alignment));
3205*03ce13f7SAndroid Build Coastguard Worker   intptr_t pos = offset + Buffer.getPosition();
3206*03ce13f7SAndroid Build Coastguard Worker   intptr_t mod = pos & (alignment - 1);
3207*03ce13f7SAndroid Build Coastguard Worker   if (mod == 0) {
3208*03ce13f7SAndroid Build Coastguard Worker     return;
3209*03ce13f7SAndroid Build Coastguard Worker   }
3210*03ce13f7SAndroid Build Coastguard Worker   intptr_t bytes_needed = alignment - mod;
3211*03ce13f7SAndroid Build Coastguard Worker   while (bytes_needed > MAX_NOP_SIZE) {
3212*03ce13f7SAndroid Build Coastguard Worker     nop(MAX_NOP_SIZE);
3213*03ce13f7SAndroid Build Coastguard Worker     bytes_needed -= MAX_NOP_SIZE;
3214*03ce13f7SAndroid Build Coastguard Worker   }
3215*03ce13f7SAndroid Build Coastguard Worker   if (bytes_needed) {
3216*03ce13f7SAndroid Build Coastguard Worker     nop(bytes_needed);
3217*03ce13f7SAndroid Build Coastguard Worker   }
3218*03ce13f7SAndroid Build Coastguard Worker   assert(((offset + Buffer.getPosition()) & (alignment - 1)) == 0);
3219*03ce13f7SAndroid Build Coastguard Worker }
3220*03ce13f7SAndroid Build Coastguard Worker 
bind(Label * L)3221*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::bind(Label *L) {
3222*03ce13f7SAndroid Build Coastguard Worker   const intptr_t Bound = Buffer.size();
3223*03ce13f7SAndroid Build Coastguard Worker   assert(!L->isBound()); // Labels can only be bound once.
3224*03ce13f7SAndroid Build Coastguard Worker   while (L->isLinked()) {
3225*03ce13f7SAndroid Build Coastguard Worker     const intptr_t Position = L->getLinkPosition();
3226*03ce13f7SAndroid Build Coastguard Worker     const intptr_t Next = Buffer.load<int32_t>(Position);
3227*03ce13f7SAndroid Build Coastguard Worker     const intptr_t Offset = Bound - (Position + 4);
3228*03ce13f7SAndroid Build Coastguard Worker     Buffer.store<int32_t>(Position, Offset);
3229*03ce13f7SAndroid Build Coastguard Worker     L->Position = Next;
3230*03ce13f7SAndroid Build Coastguard Worker   }
3231*03ce13f7SAndroid Build Coastguard Worker   while (L->hasNear()) {
3232*03ce13f7SAndroid Build Coastguard Worker     intptr_t Position = L->getNearPosition();
3233*03ce13f7SAndroid Build Coastguard Worker     const intptr_t Offset = Bound - (Position + 1);
3234*03ce13f7SAndroid Build Coastguard Worker     assert(Utils::IsInt(8, Offset));
3235*03ce13f7SAndroid Build Coastguard Worker     Buffer.store<int8_t>(Position, Offset);
3236*03ce13f7SAndroid Build Coastguard Worker   }
3237*03ce13f7SAndroid Build Coastguard Worker   L->bindTo(Bound);
3238*03ce13f7SAndroid Build Coastguard Worker }
3239*03ce13f7SAndroid Build Coastguard Worker 
emitOperand(int rm,const AsmOperand & operand,RelocOffsetT Addend)3240*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitOperand(int rm, const AsmOperand &operand,
3241*03ce13f7SAndroid Build Coastguard Worker                                  RelocOffsetT Addend) {
3242*03ce13f7SAndroid Build Coastguard Worker   assert(rm >= 0 && rm < 8);
3243*03ce13f7SAndroid Build Coastguard Worker   const intptr_t length = operand.length_;
3244*03ce13f7SAndroid Build Coastguard Worker   assert(length > 0);
3245*03ce13f7SAndroid Build Coastguard Worker   intptr_t displacement_start = 1;
3246*03ce13f7SAndroid Build Coastguard Worker   // Emit the ModRM byte updated with the given RM value.
3247*03ce13f7SAndroid Build Coastguard Worker   assert((operand.encoding_[0] & 0x38) == 0);
3248*03ce13f7SAndroid Build Coastguard Worker   emitUint8(operand.encoding_[0] + (rm << 3));
3249*03ce13f7SAndroid Build Coastguard Worker   // Whenever the addressing mode is not register indirect, using esp == 0x4
3250*03ce13f7SAndroid Build Coastguard Worker   // as the register operation indicates an SIB byte follows.
3251*03ce13f7SAndroid Build Coastguard Worker   if (((operand.encoding_[0] & 0xc0) != 0xc0) &&
3252*03ce13f7SAndroid Build Coastguard Worker       ((operand.encoding_[0] & 0x07) == 0x04)) {
3253*03ce13f7SAndroid Build Coastguard Worker     emitUint8(operand.encoding_[1]);
3254*03ce13f7SAndroid Build Coastguard Worker     displacement_start = 2;
3255*03ce13f7SAndroid Build Coastguard Worker   }
3256*03ce13f7SAndroid Build Coastguard Worker 
3257*03ce13f7SAndroid Build Coastguard Worker   AssemblerFixup *Fixup = operand.fixup();
3258*03ce13f7SAndroid Build Coastguard Worker   if (Fixup == nullptr) {
3259*03ce13f7SAndroid Build Coastguard Worker     for (intptr_t i = displacement_start; i < length; i++) {
3260*03ce13f7SAndroid Build Coastguard Worker       emitUint8(operand.encoding_[i]);
3261*03ce13f7SAndroid Build Coastguard Worker     }
3262*03ce13f7SAndroid Build Coastguard Worker     return;
3263*03ce13f7SAndroid Build Coastguard Worker   }
3264*03ce13f7SAndroid Build Coastguard Worker 
3265*03ce13f7SAndroid Build Coastguard Worker   // Emit the fixup, and a dummy 4-byte immediate. Note that the Disp32 in
3266*03ce13f7SAndroid Build Coastguard Worker   // operand.encoding_[i, i+1, i+2, i+3] is part of the constant relocatable
3267*03ce13f7SAndroid Build Coastguard Worker   // used to create the fixup, so there's no need to add it to the addend.
3268*03ce13f7SAndroid Build Coastguard Worker   assert(length - displacement_start == 4);
3269*03ce13f7SAndroid Build Coastguard Worker   if (fixupIsPCRel(Fixup->kind())) {
3270*03ce13f7SAndroid Build Coastguard Worker     Fixup->set_addend(Fixup->get_addend() - Addend);
3271*03ce13f7SAndroid Build Coastguard Worker   } else {
3272*03ce13f7SAndroid Build Coastguard Worker     Fixup->set_addend(Fixup->get_addend());
3273*03ce13f7SAndroid Build Coastguard Worker   }
3274*03ce13f7SAndroid Build Coastguard Worker   emitFixup(Fixup);
3275*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
3276*03ce13f7SAndroid Build Coastguard Worker }
3277*03ce13f7SAndroid Build Coastguard Worker 
emitImmediate(Type Ty,const Immediate & imm)3278*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitImmediate(Type Ty, const Immediate &imm) {
3279*03ce13f7SAndroid Build Coastguard Worker   auto *const Fixup = imm.fixup();
3280*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16) {
3281*03ce13f7SAndroid Build Coastguard Worker     assert(Fixup == nullptr);
3282*03ce13f7SAndroid Build Coastguard Worker     emitInt16(imm.value());
3283*03ce13f7SAndroid Build Coastguard Worker     return;
3284*03ce13f7SAndroid Build Coastguard Worker   }
3285*03ce13f7SAndroid Build Coastguard Worker 
3286*03ce13f7SAndroid Build Coastguard Worker   if (Fixup == nullptr) {
3287*03ce13f7SAndroid Build Coastguard Worker     emitInt32(imm.value());
3288*03ce13f7SAndroid Build Coastguard Worker     return;
3289*03ce13f7SAndroid Build Coastguard Worker   }
3290*03ce13f7SAndroid Build Coastguard Worker 
3291*03ce13f7SAndroid Build Coastguard Worker   Fixup->set_addend(Fixup->get_addend() + imm.value());
3292*03ce13f7SAndroid Build Coastguard Worker   emitFixup(Fixup);
3293*03ce13f7SAndroid Build Coastguard Worker   emitInt32(0);
3294*03ce13f7SAndroid Build Coastguard Worker }
3295*03ce13f7SAndroid Build Coastguard Worker 
emitComplexI8(int rm,const AsmOperand & operand,const Immediate & immediate)3296*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitComplexI8(int rm, const AsmOperand &operand,
3297*03ce13f7SAndroid Build Coastguard Worker                                    const Immediate &immediate) {
3298*03ce13f7SAndroid Build Coastguard Worker   assert(rm >= 0 && rm < 8);
3299*03ce13f7SAndroid Build Coastguard Worker   assert(immediate.is_int8());
3300*03ce13f7SAndroid Build Coastguard Worker   if (operand.IsRegister(RegX8664::Encoded_Reg_rax)) {
3301*03ce13f7SAndroid Build Coastguard Worker     // Use short form if the destination is al.
3302*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x04 + (rm << 3));
3303*03ce13f7SAndroid Build Coastguard Worker     emitUint8(immediate.value() & 0xFF);
3304*03ce13f7SAndroid Build Coastguard Worker   } else {
3305*03ce13f7SAndroid Build Coastguard Worker     // Use sign-extended 8-bit immediate.
3306*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x80);
3307*03ce13f7SAndroid Build Coastguard Worker     static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
3308*03ce13f7SAndroid Build Coastguard Worker     emitOperand(rm, operand, OffsetFromNextInstruction);
3309*03ce13f7SAndroid Build Coastguard Worker     emitUint8(immediate.value() & 0xFF);
3310*03ce13f7SAndroid Build Coastguard Worker   }
3311*03ce13f7SAndroid Build Coastguard Worker }
3312*03ce13f7SAndroid Build Coastguard Worker 
emitComplex(Type Ty,int rm,const AsmOperand & operand,const Immediate & immediate)3313*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitComplex(Type Ty, int rm, const AsmOperand &operand,
3314*03ce13f7SAndroid Build Coastguard Worker                                  const Immediate &immediate) {
3315*03ce13f7SAndroid Build Coastguard Worker   assert(rm >= 0 && rm < 8);
3316*03ce13f7SAndroid Build Coastguard Worker   if (immediate.is_int8()) {
3317*03ce13f7SAndroid Build Coastguard Worker     // Use sign-extended 8-bit immediate.
3318*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x83);
3319*03ce13f7SAndroid Build Coastguard Worker     static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
3320*03ce13f7SAndroid Build Coastguard Worker     emitOperand(rm, operand, OffsetFromNextInstruction);
3321*03ce13f7SAndroid Build Coastguard Worker     emitUint8(immediate.value() & 0xFF);
3322*03ce13f7SAndroid Build Coastguard Worker   } else if (operand.IsRegister(RegX8664::Encoded_Reg_rax)) {
3323*03ce13f7SAndroid Build Coastguard Worker     // Use short form if the destination is eax.
3324*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x05 + (rm << 3));
3325*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, immediate);
3326*03ce13f7SAndroid Build Coastguard Worker   } else {
3327*03ce13f7SAndroid Build Coastguard Worker     emitUint8(0x81);
3328*03ce13f7SAndroid Build Coastguard Worker     const uint8_t OffsetFromNextInstruction = Ty == IceType_i16 ? 2 : 4;
3329*03ce13f7SAndroid Build Coastguard Worker     emitOperand(rm, operand, OffsetFromNextInstruction);
3330*03ce13f7SAndroid Build Coastguard Worker     emitImmediate(Ty, immediate);
3331*03ce13f7SAndroid Build Coastguard Worker   }
3332*03ce13f7SAndroid Build Coastguard Worker }
3333*03ce13f7SAndroid Build Coastguard Worker 
emitLabel(Label * label,intptr_t instruction_size)3334*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitLabel(Label *label, intptr_t instruction_size) {
3335*03ce13f7SAndroid Build Coastguard Worker   if (label->isBound()) {
3336*03ce13f7SAndroid Build Coastguard Worker     intptr_t offset = label->getPosition() - Buffer.size();
3337*03ce13f7SAndroid Build Coastguard Worker     assert(offset <= 0);
3338*03ce13f7SAndroid Build Coastguard Worker     emitInt32(offset - instruction_size);
3339*03ce13f7SAndroid Build Coastguard Worker   } else {
3340*03ce13f7SAndroid Build Coastguard Worker     emitLabelLink(label);
3341*03ce13f7SAndroid Build Coastguard Worker   }
3342*03ce13f7SAndroid Build Coastguard Worker }
3343*03ce13f7SAndroid Build Coastguard Worker 
emitLabelLink(Label * Label)3344*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitLabelLink(Label *Label) {
3345*03ce13f7SAndroid Build Coastguard Worker   assert(!Label->isBound());
3346*03ce13f7SAndroid Build Coastguard Worker   intptr_t Position = Buffer.size();
3347*03ce13f7SAndroid Build Coastguard Worker   emitInt32(Label->Position);
3348*03ce13f7SAndroid Build Coastguard Worker   Label->linkTo(*this, Position);
3349*03ce13f7SAndroid Build Coastguard Worker }
3350*03ce13f7SAndroid Build Coastguard Worker 
emitNearLabelLink(Label * Label)3351*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitNearLabelLink(Label *Label) {
3352*03ce13f7SAndroid Build Coastguard Worker   assert(!Label->isBound());
3353*03ce13f7SAndroid Build Coastguard Worker   intptr_t Position = Buffer.size();
3354*03ce13f7SAndroid Build Coastguard Worker   emitUint8(0);
3355*03ce13f7SAndroid Build Coastguard Worker   Label->nearLinkTo(*this, Position);
3356*03ce13f7SAndroid Build Coastguard Worker }
3357*03ce13f7SAndroid Build Coastguard Worker 
emitGenericShift(int rm,Type Ty,GPRRegister reg,const Immediate & imm)3358*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitGenericShift(int rm, Type Ty, GPRRegister reg,
3359*03ce13f7SAndroid Build Coastguard Worker                                       const Immediate &imm) {
3360*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3361*03ce13f7SAndroid Build Coastguard Worker   // We don't assert that imm fits into 8 bits; instead, it gets masked below.
3362*03ce13f7SAndroid Build Coastguard Worker   // Note that we don't mask it further (e.g. to 5 bits) because we want the
3363*03ce13f7SAndroid Build Coastguard Worker   // same processor behavior regardless of whether it's an immediate (masked to
3364*03ce13f7SAndroid Build Coastguard Worker   // 8 bits) or in register cl (essentially ecx masked to 8 bits).
3365*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
3366*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
3367*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, reg);
3368*03ce13f7SAndroid Build Coastguard Worker   if (imm.value() == 1) {
3369*03ce13f7SAndroid Build Coastguard Worker     emitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1);
3370*03ce13f7SAndroid Build Coastguard Worker     emitOperand(rm, AsmOperand(reg));
3371*03ce13f7SAndroid Build Coastguard Worker   } else {
3372*03ce13f7SAndroid Build Coastguard Worker     emitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1);
3373*03ce13f7SAndroid Build Coastguard Worker     static constexpr RelocOffsetT OffsetFromNextInstruction = 1;
3374*03ce13f7SAndroid Build Coastguard Worker     emitOperand(rm, AsmOperand(reg), OffsetFromNextInstruction);
3375*03ce13f7SAndroid Build Coastguard Worker     emitUint8(imm.value() & 0xFF);
3376*03ce13f7SAndroid Build Coastguard Worker   }
3377*03ce13f7SAndroid Build Coastguard Worker }
3378*03ce13f7SAndroid Build Coastguard Worker 
emitGenericShift(int rm,Type Ty,const AsmOperand & operand,GPRRegister shifter)3379*03ce13f7SAndroid Build Coastguard Worker void AssemblerX8664::emitGenericShift(int rm, Type Ty,
3380*03ce13f7SAndroid Build Coastguard Worker                                       const AsmOperand &operand,
3381*03ce13f7SAndroid Build Coastguard Worker                                       GPRRegister shifter) {
3382*03ce13f7SAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3383*03ce13f7SAndroid Build Coastguard Worker   assert(shifter == RegX8664::Encoded_Reg_rcx);
3384*03ce13f7SAndroid Build Coastguard Worker   (void)shifter;
3385*03ce13f7SAndroid Build Coastguard Worker   if (Ty == IceType_i16)
3386*03ce13f7SAndroid Build Coastguard Worker     emitOperandSizeOverride();
3387*03ce13f7SAndroid Build Coastguard Worker   emitRexB(Ty, operand.rm());
3388*03ce13f7SAndroid Build Coastguard Worker   emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3);
3389*03ce13f7SAndroid Build Coastguard Worker   emitOperand(rm, operand);
3390*03ce13f7SAndroid Build Coastguard Worker }
3391*03ce13f7SAndroid Build Coastguard Worker 
3392*03ce13f7SAndroid Build Coastguard Worker } // end of namespace X8664
3393*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
3394