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