xref: /aosp_15_r20/art/compiler/utils/x86/assembler_x86.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "assembler_x86.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include "base/casts.h"
20*795d594fSAndroid Build Coastguard Worker #include "base/memory_region.h"
21*795d594fSAndroid Build Coastguard Worker #include "entrypoints/quick/quick_entrypoints.h"
22*795d594fSAndroid Build Coastguard Worker #include "thread.h"
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
25*795d594fSAndroid Build Coastguard Worker namespace x86 {
26*795d594fSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const XmmRegister & reg)27*795d594fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const XmmRegister& reg) {
28*795d594fSAndroid Build Coastguard Worker   return os << "XMM" << static_cast<int>(reg);
29*795d594fSAndroid Build Coastguard Worker }
30*795d594fSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const X87Register & reg)31*795d594fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const X87Register& reg) {
32*795d594fSAndroid Build Coastguard Worker   return os << "ST" << static_cast<int>(reg);
33*795d594fSAndroid Build Coastguard Worker }
34*795d594fSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const Address & addr)35*795d594fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const Address& addr) {
36*795d594fSAndroid Build Coastguard Worker   switch (addr.mod()) {
37*795d594fSAndroid Build Coastguard Worker     case 0:
38*795d594fSAndroid Build Coastguard Worker       if (addr.rm() != ESP || addr.index() == ESP) {
39*795d594fSAndroid Build Coastguard Worker         return os << "(%" << addr.rm() << ")";
40*795d594fSAndroid Build Coastguard Worker       } else if (addr.base() == EBP) {
41*795d594fSAndroid Build Coastguard Worker         return os << static_cast<int>(addr.disp32()) << "(,%" << addr.index()
42*795d594fSAndroid Build Coastguard Worker                   << "," << (1 << addr.scale()) << ")";
43*795d594fSAndroid Build Coastguard Worker       }
44*795d594fSAndroid Build Coastguard Worker       return os << "(%" << addr.base() << ",%" << addr.index() << "," << (1 << addr.scale()) << ")";
45*795d594fSAndroid Build Coastguard Worker     case 1:
46*795d594fSAndroid Build Coastguard Worker       if (addr.rm() != ESP || addr.index() == ESP) {
47*795d594fSAndroid Build Coastguard Worker         return os << static_cast<int>(addr.disp8()) << "(%" << addr.rm() << ")";
48*795d594fSAndroid Build Coastguard Worker       }
49*795d594fSAndroid Build Coastguard Worker       return os << static_cast<int>(addr.disp8()) << "(%" << addr.base() << ",%"
50*795d594fSAndroid Build Coastguard Worker                 << addr.index() << "," << (1 << addr.scale()) << ")";
51*795d594fSAndroid Build Coastguard Worker     case 2:
52*795d594fSAndroid Build Coastguard Worker       if (addr.rm() != ESP || addr.index() == ESP) {
53*795d594fSAndroid Build Coastguard Worker         return os << static_cast<int>(addr.disp32()) << "(%" << addr.rm() << ")";
54*795d594fSAndroid Build Coastguard Worker       }
55*795d594fSAndroid Build Coastguard Worker       return os << static_cast<int>(addr.disp32()) << "(%" << addr.base() << ",%"
56*795d594fSAndroid Build Coastguard Worker                 << addr.index() << "," << (1 << addr.scale()) << ")";
57*795d594fSAndroid Build Coastguard Worker     default:
58*795d594fSAndroid Build Coastguard Worker       return os << "<address?>";
59*795d594fSAndroid Build Coastguard Worker   }
60*795d594fSAndroid Build Coastguard Worker }
61*795d594fSAndroid Build Coastguard Worker 
CpuHasAVXorAVX2FeatureFlag()62*795d594fSAndroid Build Coastguard Worker bool X86Assembler::CpuHasAVXorAVX2FeatureFlag() {
63*795d594fSAndroid Build Coastguard Worker   if (has_AVX_ || has_AVX2_) {
64*795d594fSAndroid Build Coastguard Worker     return true;
65*795d594fSAndroid Build Coastguard Worker   }
66*795d594fSAndroid Build Coastguard Worker   return false;
67*795d594fSAndroid Build Coastguard Worker }
68*795d594fSAndroid Build Coastguard Worker 
call(Register reg)69*795d594fSAndroid Build Coastguard Worker void X86Assembler::call(Register reg) {
70*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
71*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
72*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(2, reg);
73*795d594fSAndroid Build Coastguard Worker }
74*795d594fSAndroid Build Coastguard Worker 
75*795d594fSAndroid Build Coastguard Worker 
call(const Address & address)76*795d594fSAndroid Build Coastguard Worker void X86Assembler::call(const Address& address) {
77*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
78*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
79*795d594fSAndroid Build Coastguard Worker   EmitOperand(2, address);
80*795d594fSAndroid Build Coastguard Worker }
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker 
call(Label * label)83*795d594fSAndroid Build Coastguard Worker void X86Assembler::call(Label* label) {
84*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
85*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE8);
86*795d594fSAndroid Build Coastguard Worker   static const int kSize = 5;
87*795d594fSAndroid Build Coastguard Worker   // Offset by one because we already have emitted the opcode.
88*795d594fSAndroid Build Coastguard Worker   EmitLabel(label, kSize - 1);
89*795d594fSAndroid Build Coastguard Worker }
90*795d594fSAndroid Build Coastguard Worker 
91*795d594fSAndroid Build Coastguard Worker 
call(const ExternalLabel & label)92*795d594fSAndroid Build Coastguard Worker void X86Assembler::call(const ExternalLabel& label) {
93*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
94*795d594fSAndroid Build Coastguard Worker   intptr_t call_start = buffer_.GetPosition();
95*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE8);
96*795d594fSAndroid Build Coastguard Worker   EmitInt32(label.address());
97*795d594fSAndroid Build Coastguard Worker   static const intptr_t kCallExternalLabelSize = 5;
98*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ((buffer_.GetPosition() - call_start), kCallExternalLabelSize);
99*795d594fSAndroid Build Coastguard Worker }
100*795d594fSAndroid Build Coastguard Worker 
101*795d594fSAndroid Build Coastguard Worker 
pushl(Register reg)102*795d594fSAndroid Build Coastguard Worker void X86Assembler::pushl(Register reg) {
103*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
104*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x50 + reg);
105*795d594fSAndroid Build Coastguard Worker }
106*795d594fSAndroid Build Coastguard Worker 
107*795d594fSAndroid Build Coastguard Worker 
pushl(const Address & address)108*795d594fSAndroid Build Coastguard Worker void X86Assembler::pushl(const Address& address) {
109*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
110*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
111*795d594fSAndroid Build Coastguard Worker   EmitOperand(6, address);
112*795d594fSAndroid Build Coastguard Worker }
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker 
pushl(const Immediate & imm)115*795d594fSAndroid Build Coastguard Worker void X86Assembler::pushl(const Immediate& imm) {
116*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
117*795d594fSAndroid Build Coastguard Worker   if (imm.is_int8()) {
118*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x6A);
119*795d594fSAndroid Build Coastguard Worker     EmitUint8(imm.value() & 0xFF);
120*795d594fSAndroid Build Coastguard Worker   } else {
121*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x68);
122*795d594fSAndroid Build Coastguard Worker     EmitImmediate(imm);
123*795d594fSAndroid Build Coastguard Worker   }
124*795d594fSAndroid Build Coastguard Worker }
125*795d594fSAndroid Build Coastguard Worker 
126*795d594fSAndroid Build Coastguard Worker 
popl(Register reg)127*795d594fSAndroid Build Coastguard Worker void X86Assembler::popl(Register reg) {
128*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
129*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58 + reg);
130*795d594fSAndroid Build Coastguard Worker }
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker 
popl(const Address & address)133*795d594fSAndroid Build Coastguard Worker void X86Assembler::popl(const Address& address) {
134*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
135*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x8F);
136*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, address);
137*795d594fSAndroid Build Coastguard Worker }
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker 
movl(Register dst,const Immediate & imm)140*795d594fSAndroid Build Coastguard Worker void X86Assembler::movl(Register dst, const Immediate& imm) {
141*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
142*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB8 + dst);
143*795d594fSAndroid Build Coastguard Worker   EmitImmediate(imm);
144*795d594fSAndroid Build Coastguard Worker }
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker 
movl(Register dst,Register src)147*795d594fSAndroid Build Coastguard Worker void X86Assembler::movl(Register dst, Register src) {
148*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
149*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x89);
150*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(src, dst);
151*795d594fSAndroid Build Coastguard Worker }
152*795d594fSAndroid Build Coastguard Worker 
153*795d594fSAndroid Build Coastguard Worker 
movl(Register dst,const Address & src)154*795d594fSAndroid Build Coastguard Worker void X86Assembler::movl(Register dst, const Address& src) {
155*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
156*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x8B);
157*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
158*795d594fSAndroid Build Coastguard Worker }
159*795d594fSAndroid Build Coastguard Worker 
160*795d594fSAndroid Build Coastguard Worker 
movl(const Address & dst,Register src)161*795d594fSAndroid Build Coastguard Worker void X86Assembler::movl(const Address& dst, Register src) {
162*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
163*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x89);
164*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
165*795d594fSAndroid Build Coastguard Worker }
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker 
movl(const Address & dst,const Immediate & imm)168*795d594fSAndroid Build Coastguard Worker void X86Assembler::movl(const Address& dst, const Immediate& imm) {
169*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
170*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC7);
171*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, dst);
172*795d594fSAndroid Build Coastguard Worker   EmitImmediate(imm);
173*795d594fSAndroid Build Coastguard Worker }
174*795d594fSAndroid Build Coastguard Worker 
movl(const Address & dst,Label * lbl)175*795d594fSAndroid Build Coastguard Worker void X86Assembler::movl(const Address& dst, Label* lbl) {
176*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
177*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC7);
178*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, dst);
179*795d594fSAndroid Build Coastguard Worker   EmitLabel(lbl, dst.length_ + 5);
180*795d594fSAndroid Build Coastguard Worker }
181*795d594fSAndroid Build Coastguard Worker 
movntl(const Address & dst,Register src)182*795d594fSAndroid Build Coastguard Worker void X86Assembler::movntl(const Address& dst, Register src) {
183*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
184*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
185*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC3);
186*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
187*795d594fSAndroid Build Coastguard Worker }
188*795d594fSAndroid Build Coastguard Worker 
blsi(Register dst,Register src)189*795d594fSAndroid Build Coastguard Worker void X86Assembler::blsi(Register dst, Register src) {
190*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
191*795d594fSAndroid Build Coastguard Worker   uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
192*795d594fSAndroid Build Coastguard Worker   uint8_t byte_one  = EmitVexPrefixByteOne(false, false, false, SET_VEX_M_0F_38);
193*795d594fSAndroid Build Coastguard Worker   uint8_t byte_two  = EmitVexPrefixByteTwo(false,
194*795d594fSAndroid Build Coastguard Worker                                            X86ManagedRegister::FromCpuRegister(dst),
195*795d594fSAndroid Build Coastguard Worker                                             SET_VEX_L_128, SET_VEX_PP_NONE);
196*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_zero);
197*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_one);
198*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_two);
199*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
200*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(3, src);
201*795d594fSAndroid Build Coastguard Worker }
202*795d594fSAndroid Build Coastguard Worker 
blsmsk(Register dst,Register src)203*795d594fSAndroid Build Coastguard Worker void X86Assembler::blsmsk(Register dst, Register src) {
204*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
205*795d594fSAndroid Build Coastguard Worker   uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
206*795d594fSAndroid Build Coastguard Worker   uint8_t byte_one = EmitVexPrefixByteOne(false, false, false, SET_VEX_M_0F_38);
207*795d594fSAndroid Build Coastguard Worker   uint8_t byte_two = EmitVexPrefixByteTwo(false,
208*795d594fSAndroid Build Coastguard Worker                                          X86ManagedRegister::FromCpuRegister(dst),
209*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128, SET_VEX_PP_NONE);
210*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_zero);
211*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_one);
212*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_two);
213*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
214*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(2, src);
215*795d594fSAndroid Build Coastguard Worker }
216*795d594fSAndroid Build Coastguard Worker 
blsr(Register dst,Register src)217*795d594fSAndroid Build Coastguard Worker void X86Assembler::blsr(Register dst, Register src) {
218*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
219*795d594fSAndroid Build Coastguard Worker   uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
220*795d594fSAndroid Build Coastguard Worker   uint8_t byte_one = EmitVexPrefixByteOne(false, false, false,  SET_VEX_M_0F_38);
221*795d594fSAndroid Build Coastguard Worker   uint8_t byte_two = EmitVexPrefixByteTwo(false,
222*795d594fSAndroid Build Coastguard Worker                                           X86ManagedRegister::FromCpuRegister(dst),
223*795d594fSAndroid Build Coastguard Worker                                           SET_VEX_L_128, SET_VEX_PP_NONE);
224*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_zero);
225*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_one);
226*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_two);
227*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
228*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(1, src);
229*795d594fSAndroid Build Coastguard Worker }
230*795d594fSAndroid Build Coastguard Worker 
bswapl(Register dst)231*795d594fSAndroid Build Coastguard Worker void X86Assembler::bswapl(Register dst) {
232*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
233*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
234*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC8 + dst);
235*795d594fSAndroid Build Coastguard Worker }
236*795d594fSAndroid Build Coastguard Worker 
bsfl(Register dst,Register src)237*795d594fSAndroid Build Coastguard Worker void X86Assembler::bsfl(Register dst, Register src) {
238*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
239*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
240*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBC);
241*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
242*795d594fSAndroid Build Coastguard Worker }
243*795d594fSAndroid Build Coastguard Worker 
bsfl(Register dst,const Address & src)244*795d594fSAndroid Build Coastguard Worker void X86Assembler::bsfl(Register dst, const Address& src) {
245*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
246*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
247*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBC);
248*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
249*795d594fSAndroid Build Coastguard Worker }
250*795d594fSAndroid Build Coastguard Worker 
bsrl(Register dst,Register src)251*795d594fSAndroid Build Coastguard Worker void X86Assembler::bsrl(Register dst, Register src) {
252*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
253*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
254*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBD);
255*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
256*795d594fSAndroid Build Coastguard Worker }
257*795d594fSAndroid Build Coastguard Worker 
bsrl(Register dst,const Address & src)258*795d594fSAndroid Build Coastguard Worker void X86Assembler::bsrl(Register dst, const Address& src) {
259*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
260*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
261*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBD);
262*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
263*795d594fSAndroid Build Coastguard Worker }
264*795d594fSAndroid Build Coastguard Worker 
popcntl(Register dst,Register src)265*795d594fSAndroid Build Coastguard Worker void X86Assembler::popcntl(Register dst, Register src) {
266*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
267*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
268*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
269*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB8);
270*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
271*795d594fSAndroid Build Coastguard Worker }
272*795d594fSAndroid Build Coastguard Worker 
popcntl(Register dst,const Address & src)273*795d594fSAndroid Build Coastguard Worker void X86Assembler::popcntl(Register dst, const Address& src) {
274*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
275*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
276*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
277*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB8);
278*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
279*795d594fSAndroid Build Coastguard Worker }
280*795d594fSAndroid Build Coastguard Worker 
movzxb(Register dst,ByteRegister src)281*795d594fSAndroid Build Coastguard Worker void X86Assembler::movzxb(Register dst, ByteRegister src) {
282*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
283*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
284*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB6);
285*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
286*795d594fSAndroid Build Coastguard Worker }
287*795d594fSAndroid Build Coastguard Worker 
288*795d594fSAndroid Build Coastguard Worker 
movzxb(Register dst,const Address & src)289*795d594fSAndroid Build Coastguard Worker void X86Assembler::movzxb(Register dst, const Address& src) {
290*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
291*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
292*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB6);
293*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
294*795d594fSAndroid Build Coastguard Worker }
295*795d594fSAndroid Build Coastguard Worker 
296*795d594fSAndroid Build Coastguard Worker 
movsxb(Register dst,ByteRegister src)297*795d594fSAndroid Build Coastguard Worker void X86Assembler::movsxb(Register dst, ByteRegister src) {
298*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
299*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
300*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBE);
301*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
302*795d594fSAndroid Build Coastguard Worker }
303*795d594fSAndroid Build Coastguard Worker 
304*795d594fSAndroid Build Coastguard Worker 
movsxb(Register dst,const Address & src)305*795d594fSAndroid Build Coastguard Worker void X86Assembler::movsxb(Register dst, const Address& src) {
306*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
307*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
308*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBE);
309*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
310*795d594fSAndroid Build Coastguard Worker }
311*795d594fSAndroid Build Coastguard Worker 
312*795d594fSAndroid Build Coastguard Worker 
movb(Register,const Address &)313*795d594fSAndroid Build Coastguard Worker void X86Assembler::movb(Register /*dst*/, const Address& /*src*/) {
314*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "Use movzxb or movsxb instead.";
315*795d594fSAndroid Build Coastguard Worker }
316*795d594fSAndroid Build Coastguard Worker 
317*795d594fSAndroid Build Coastguard Worker 
movb(const Address & dst,ByteRegister src)318*795d594fSAndroid Build Coastguard Worker void X86Assembler::movb(const Address& dst, ByteRegister src) {
319*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
320*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x88);
321*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
322*795d594fSAndroid Build Coastguard Worker }
323*795d594fSAndroid Build Coastguard Worker 
324*795d594fSAndroid Build Coastguard Worker 
movb(const Address & dst,const Immediate & imm)325*795d594fSAndroid Build Coastguard Worker void X86Assembler::movb(const Address& dst, const Immediate& imm) {
326*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
327*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC6);
328*795d594fSAndroid Build Coastguard Worker   EmitOperand(EAX, dst);
329*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_int8());
330*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
331*795d594fSAndroid Build Coastguard Worker }
332*795d594fSAndroid Build Coastguard Worker 
333*795d594fSAndroid Build Coastguard Worker 
movzxw(Register dst,Register src)334*795d594fSAndroid Build Coastguard Worker void X86Assembler::movzxw(Register dst, Register src) {
335*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
336*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
337*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB7);
338*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
339*795d594fSAndroid Build Coastguard Worker }
340*795d594fSAndroid Build Coastguard Worker 
341*795d594fSAndroid Build Coastguard Worker 
movzxw(Register dst,const Address & src)342*795d594fSAndroid Build Coastguard Worker void X86Assembler::movzxw(Register dst, const Address& src) {
343*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
344*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
345*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB7);
346*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
347*795d594fSAndroid Build Coastguard Worker }
348*795d594fSAndroid Build Coastguard Worker 
349*795d594fSAndroid Build Coastguard Worker 
movsxw(Register dst,Register src)350*795d594fSAndroid Build Coastguard Worker void X86Assembler::movsxw(Register dst, Register src) {
351*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
352*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
353*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBF);
354*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
355*795d594fSAndroid Build Coastguard Worker }
356*795d594fSAndroid Build Coastguard Worker 
357*795d594fSAndroid Build Coastguard Worker 
movsxw(Register dst,const Address & src)358*795d594fSAndroid Build Coastguard Worker void X86Assembler::movsxw(Register dst, const Address& src) {
359*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
360*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
361*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xBF);
362*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
363*795d594fSAndroid Build Coastguard Worker }
364*795d594fSAndroid Build Coastguard Worker 
365*795d594fSAndroid Build Coastguard Worker 
movw(Register,const Address &)366*795d594fSAndroid Build Coastguard Worker void X86Assembler::movw(Register /*dst*/, const Address& /*src*/) {
367*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "Use movzxw or movsxw instead.";
368*795d594fSAndroid Build Coastguard Worker }
369*795d594fSAndroid Build Coastguard Worker 
370*795d594fSAndroid Build Coastguard Worker 
movw(const Address & dst,Register src)371*795d594fSAndroid Build Coastguard Worker void X86Assembler::movw(const Address& dst, Register src) {
372*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
373*795d594fSAndroid Build Coastguard Worker   EmitOperandSizeOverride();
374*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x89);
375*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
376*795d594fSAndroid Build Coastguard Worker }
377*795d594fSAndroid Build Coastguard Worker 
378*795d594fSAndroid Build Coastguard Worker 
movw(const Address & dst,const Immediate & imm)379*795d594fSAndroid Build Coastguard Worker void X86Assembler::movw(const Address& dst, const Immediate& imm) {
380*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
381*795d594fSAndroid Build Coastguard Worker   EmitOperandSizeOverride();
382*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC7);
383*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, dst);
384*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_uint16() || imm.is_int16());
385*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
386*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() >> 8);
387*795d594fSAndroid Build Coastguard Worker }
388*795d594fSAndroid Build Coastguard Worker 
389*795d594fSAndroid Build Coastguard Worker 
leal(Register dst,const Address & src)390*795d594fSAndroid Build Coastguard Worker void X86Assembler::leal(Register dst, const Address& src) {
391*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
392*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x8D);
393*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
394*795d594fSAndroid Build Coastguard Worker }
395*795d594fSAndroid Build Coastguard Worker 
396*795d594fSAndroid Build Coastguard Worker 
cmovl(Condition condition,Register dst,Register src)397*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmovl(Condition condition, Register dst, Register src) {
398*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
399*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
400*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x40 + condition);
401*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
402*795d594fSAndroid Build Coastguard Worker }
403*795d594fSAndroid Build Coastguard Worker 
404*795d594fSAndroid Build Coastguard Worker 
cmovl(Condition condition,Register dst,const Address & src)405*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmovl(Condition condition, Register dst, const Address& src) {
406*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
407*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
408*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x40 + condition);
409*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
410*795d594fSAndroid Build Coastguard Worker }
411*795d594fSAndroid Build Coastguard Worker 
412*795d594fSAndroid Build Coastguard Worker 
setb(Condition condition,Register dst)413*795d594fSAndroid Build Coastguard Worker void X86Assembler::setb(Condition condition, Register dst) {
414*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
415*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
416*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x90 + condition);
417*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, Operand(dst));
418*795d594fSAndroid Build Coastguard Worker }
419*795d594fSAndroid Build Coastguard Worker 
420*795d594fSAndroid Build Coastguard Worker 
movaps(XmmRegister dst,XmmRegister src)421*795d594fSAndroid Build Coastguard Worker void X86Assembler::movaps(XmmRegister dst, XmmRegister src) {
422*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
423*795d594fSAndroid Build Coastguard Worker     vmovaps(dst, src);
424*795d594fSAndroid Build Coastguard Worker     return;
425*795d594fSAndroid Build Coastguard Worker   }
426*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
427*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
428*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
429*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
430*795d594fSAndroid Build Coastguard Worker }
431*795d594fSAndroid Build Coastguard Worker 
432*795d594fSAndroid Build Coastguard Worker /**VEX.128.0F.WIG 28 /r VMOVAPS xmm1, xmm2*/
vmovaps(XmmRegister dst,XmmRegister src)433*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovaps(XmmRegister dst, XmmRegister src) {
434*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
435*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
436*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
437*795d594fSAndroid Build Coastguard Worker   uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
438*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
439*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
440*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
441*795d594fSAndroid Build Coastguard Worker   uint8_t byte_one = EmitVexPrefixByteOne(/*R=*/ false,
442*795d594fSAndroid Build Coastguard Worker                                           vvvv_reg,
443*795d594fSAndroid Build Coastguard Worker                                           SET_VEX_L_128,
444*795d594fSAndroid Build Coastguard Worker                                           SET_VEX_PP_NONE);
445*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_zero);
446*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_one);
447*795d594fSAndroid Build Coastguard Worker   /**Instruction Opcode*/
448*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
449*795d594fSAndroid Build Coastguard Worker   /**Instruction Operands*/
450*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
451*795d594fSAndroid Build Coastguard Worker }
452*795d594fSAndroid Build Coastguard Worker 
movaps(XmmRegister dst,const Address & src)453*795d594fSAndroid Build Coastguard Worker void X86Assembler::movaps(XmmRegister dst, const Address& src) {
454*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
455*795d594fSAndroid Build Coastguard Worker     vmovaps(dst, src);
456*795d594fSAndroid Build Coastguard Worker     return;
457*795d594fSAndroid Build Coastguard Worker   }
458*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
459*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
460*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
461*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
462*795d594fSAndroid Build Coastguard Worker }
463*795d594fSAndroid Build Coastguard Worker 
464*795d594fSAndroid Build Coastguard Worker /**VEX.128.0F.WIG 28 /r VMOVAPS xmm1, m128*/
vmovaps(XmmRegister dst,const Address & src)465*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovaps(XmmRegister dst, const Address& src) {
466*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
467*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
468*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
469*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
470*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
471*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
472*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
473*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
474*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
475*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
476*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_NONE);
477*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
478*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
479*795d594fSAndroid Build Coastguard Worker   /**Instruction Opcode*/
480*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
481*795d594fSAndroid Build Coastguard Worker   /**Instruction Operands*/
482*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
483*795d594fSAndroid Build Coastguard Worker }
484*795d594fSAndroid Build Coastguard Worker 
movups(XmmRegister dst,const Address & src)485*795d594fSAndroid Build Coastguard Worker void X86Assembler::movups(XmmRegister dst, const Address& src) {
486*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
487*795d594fSAndroid Build Coastguard Worker     vmovups(dst, src);
488*795d594fSAndroid Build Coastguard Worker     return;
489*795d594fSAndroid Build Coastguard Worker   }
490*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
491*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
492*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x10);
493*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
494*795d594fSAndroid Build Coastguard Worker }
495*795d594fSAndroid Build Coastguard Worker 
496*795d594fSAndroid Build Coastguard Worker /**VEX.128.0F.WIG 10 /r VMOVUPS xmm1, m128*/
vmovups(XmmRegister dst,const Address & src)497*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovups(XmmRegister dst, const Address& src) {
498*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
499*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
500*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
501*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
502*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
503*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
504*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
505*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
506*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
507*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
508*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_NONE);
509*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
510*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
511*795d594fSAndroid Build Coastguard Worker   /*Instruction Opcode*/
512*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x10);
513*795d594fSAndroid Build Coastguard Worker   /*Instruction Operands*/
514*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
515*795d594fSAndroid Build Coastguard Worker }
516*795d594fSAndroid Build Coastguard Worker 
movaps(const Address & dst,XmmRegister src)517*795d594fSAndroid Build Coastguard Worker void X86Assembler::movaps(const Address& dst, XmmRegister src) {
518*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
519*795d594fSAndroid Build Coastguard Worker     vmovaps(dst, src);
520*795d594fSAndroid Build Coastguard Worker     return;
521*795d594fSAndroid Build Coastguard Worker   }
522*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
523*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
524*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x29);
525*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
526*795d594fSAndroid Build Coastguard Worker }
527*795d594fSAndroid Build Coastguard Worker 
528*795d594fSAndroid Build Coastguard Worker /**VEX.128.0F.WIG 29 /r VMOVAPS m128, xmm1*/
vmovaps(const Address & dst,XmmRegister src)529*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovaps(const Address& dst, XmmRegister src) {
530*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
531*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
532*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
533*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
534*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
535*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
536*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
537*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
538*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
539*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
540*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_NONE);
541*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
542*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
543*795d594fSAndroid Build Coastguard Worker   /**Instruction Opcode*/
544*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x29);
545*795d594fSAndroid Build Coastguard Worker   /**Instruction Operands*/
546*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
547*795d594fSAndroid Build Coastguard Worker }
548*795d594fSAndroid Build Coastguard Worker 
movups(const Address & dst,XmmRegister src)549*795d594fSAndroid Build Coastguard Worker void X86Assembler::movups(const Address& dst, XmmRegister src) {
550*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
551*795d594fSAndroid Build Coastguard Worker     vmovups(dst, src);
552*795d594fSAndroid Build Coastguard Worker     return;
553*795d594fSAndroid Build Coastguard Worker   }
554*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
555*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
556*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
557*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
558*795d594fSAndroid Build Coastguard Worker }
559*795d594fSAndroid Build Coastguard Worker 
560*795d594fSAndroid Build Coastguard Worker /**VEX.128.0F.WIG 11 /r VMOVUPS m128, xmm1*/
vmovups(const Address & dst,XmmRegister src)561*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovups(const Address& dst, XmmRegister src) {
562*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
563*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
564*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
565*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
566*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
567*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
568*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
569*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
570*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
571*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
572*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_NONE);
573*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
574*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
575*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
576*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
577*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
578*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
579*795d594fSAndroid Build Coastguard Worker }
580*795d594fSAndroid Build Coastguard Worker 
581*795d594fSAndroid Build Coastguard Worker 
movss(XmmRegister dst,const Address & src)582*795d594fSAndroid Build Coastguard Worker void X86Assembler::movss(XmmRegister dst, const Address& src) {
583*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
584*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
585*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
586*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x10);
587*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
588*795d594fSAndroid Build Coastguard Worker }
589*795d594fSAndroid Build Coastguard Worker 
590*795d594fSAndroid Build Coastguard Worker 
movss(const Address & dst,XmmRegister src)591*795d594fSAndroid Build Coastguard Worker void X86Assembler::movss(const Address& dst, XmmRegister src) {
592*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
593*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
594*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
595*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
596*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
597*795d594fSAndroid Build Coastguard Worker }
598*795d594fSAndroid Build Coastguard Worker 
599*795d594fSAndroid Build Coastguard Worker 
movss(XmmRegister dst,XmmRegister src)600*795d594fSAndroid Build Coastguard Worker void X86Assembler::movss(XmmRegister dst, XmmRegister src) {
601*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
602*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
603*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
604*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
605*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(src, dst);
606*795d594fSAndroid Build Coastguard Worker }
607*795d594fSAndroid Build Coastguard Worker 
608*795d594fSAndroid Build Coastguard Worker 
movd(XmmRegister dst,Register src)609*795d594fSAndroid Build Coastguard Worker void X86Assembler::movd(XmmRegister dst, Register src) {
610*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
611*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
612*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
613*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6E);
614*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
615*795d594fSAndroid Build Coastguard Worker }
616*795d594fSAndroid Build Coastguard Worker 
617*795d594fSAndroid Build Coastguard Worker 
movd(Register dst,XmmRegister src)618*795d594fSAndroid Build Coastguard Worker void X86Assembler::movd(Register dst, XmmRegister src) {
619*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
620*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
621*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
622*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7E);
623*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, Operand(dst));
624*795d594fSAndroid Build Coastguard Worker }
625*795d594fSAndroid Build Coastguard Worker 
626*795d594fSAndroid Build Coastguard Worker 
addss(XmmRegister dst,XmmRegister src)627*795d594fSAndroid Build Coastguard Worker void X86Assembler::addss(XmmRegister dst, XmmRegister src) {
628*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
629*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
630*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
631*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
632*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
633*795d594fSAndroid Build Coastguard Worker }
634*795d594fSAndroid Build Coastguard Worker 
635*795d594fSAndroid Build Coastguard Worker 
addss(XmmRegister dst,const Address & src)636*795d594fSAndroid Build Coastguard Worker void X86Assembler::addss(XmmRegister dst, const Address& src) {
637*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
638*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
639*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
640*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
641*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
642*795d594fSAndroid Build Coastguard Worker }
643*795d594fSAndroid Build Coastguard Worker 
644*795d594fSAndroid Build Coastguard Worker 
subss(XmmRegister dst,XmmRegister src)645*795d594fSAndroid Build Coastguard Worker void X86Assembler::subss(XmmRegister dst, XmmRegister src) {
646*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
647*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
648*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
649*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
650*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
651*795d594fSAndroid Build Coastguard Worker }
652*795d594fSAndroid Build Coastguard Worker 
653*795d594fSAndroid Build Coastguard Worker 
subss(XmmRegister dst,const Address & src)654*795d594fSAndroid Build Coastguard Worker void X86Assembler::subss(XmmRegister dst, const Address& src) {
655*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
656*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
657*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
658*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
659*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
660*795d594fSAndroid Build Coastguard Worker }
661*795d594fSAndroid Build Coastguard Worker 
662*795d594fSAndroid Build Coastguard Worker 
mulss(XmmRegister dst,XmmRegister src)663*795d594fSAndroid Build Coastguard Worker void X86Assembler::mulss(XmmRegister dst, XmmRegister src) {
664*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
665*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
666*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
667*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
668*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
669*795d594fSAndroid Build Coastguard Worker }
670*795d594fSAndroid Build Coastguard Worker 
671*795d594fSAndroid Build Coastguard Worker 
mulss(XmmRegister dst,const Address & src)672*795d594fSAndroid Build Coastguard Worker void X86Assembler::mulss(XmmRegister dst, const Address& src) {
673*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
674*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
675*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
676*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
677*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
678*795d594fSAndroid Build Coastguard Worker }
679*795d594fSAndroid Build Coastguard Worker 
680*795d594fSAndroid Build Coastguard Worker 
divss(XmmRegister dst,XmmRegister src)681*795d594fSAndroid Build Coastguard Worker void X86Assembler::divss(XmmRegister dst, XmmRegister src) {
682*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
683*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
684*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
685*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
686*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
687*795d594fSAndroid Build Coastguard Worker }
688*795d594fSAndroid Build Coastguard Worker 
689*795d594fSAndroid Build Coastguard Worker 
divss(XmmRegister dst,const Address & src)690*795d594fSAndroid Build Coastguard Worker void X86Assembler::divss(XmmRegister dst, const Address& src) {
691*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
692*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
693*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
694*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
695*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
696*795d594fSAndroid Build Coastguard Worker }
697*795d594fSAndroid Build Coastguard Worker 
698*795d594fSAndroid Build Coastguard Worker 
addps(XmmRegister dst,XmmRegister src)699*795d594fSAndroid Build Coastguard Worker void X86Assembler::addps(XmmRegister dst, XmmRegister src) {
700*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
701*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
702*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
703*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
704*795d594fSAndroid Build Coastguard Worker }
705*795d594fSAndroid Build Coastguard Worker 
vaddps(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)706*795d594fSAndroid Build Coastguard Worker void X86Assembler::vaddps(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
707*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
708*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
709*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
710*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
711*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
712*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(add_left),
713*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
714*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_NONE);
715*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
716*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
717*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
718*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
719*795d594fSAndroid Build Coastguard Worker }
720*795d594fSAndroid Build Coastguard Worker 
subps(XmmRegister dst,XmmRegister src)721*795d594fSAndroid Build Coastguard Worker void X86Assembler::subps(XmmRegister dst, XmmRegister src) {
722*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
723*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
724*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
725*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
726*795d594fSAndroid Build Coastguard Worker }
727*795d594fSAndroid Build Coastguard Worker 
vsubps(XmmRegister dst,XmmRegister src1,XmmRegister src2)728*795d594fSAndroid Build Coastguard Worker void X86Assembler::vsubps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
729*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
730*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
731*795d594fSAndroid Build Coastguard Worker   uint8_t byte_zero = 0x00, byte_one = 0x00;
732*795d594fSAndroid Build Coastguard Worker   byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
733*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(src1);
734*795d594fSAndroid Build Coastguard Worker   byte_one = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_NONE);
735*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_zero);
736*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_one);
737*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
738*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
739*795d594fSAndroid Build Coastguard Worker }
740*795d594fSAndroid Build Coastguard Worker 
mulps(XmmRegister dst,XmmRegister src)741*795d594fSAndroid Build Coastguard Worker void X86Assembler::mulps(XmmRegister dst, XmmRegister src) {
742*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
743*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
744*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
745*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
746*795d594fSAndroid Build Coastguard Worker }
747*795d594fSAndroid Build Coastguard Worker 
vmulps(XmmRegister dst,XmmRegister src1,XmmRegister src2)748*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmulps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
749*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
750*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
751*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
752*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
753*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
754*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
755*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
756*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_NONE);
757*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
758*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
759*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
760*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
761*795d594fSAndroid Build Coastguard Worker }
762*795d594fSAndroid Build Coastguard Worker 
divps(XmmRegister dst,XmmRegister src)763*795d594fSAndroid Build Coastguard Worker void X86Assembler::divps(XmmRegister dst, XmmRegister src) {
764*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
765*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
766*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
767*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
768*795d594fSAndroid Build Coastguard Worker }
769*795d594fSAndroid Build Coastguard Worker 
770*795d594fSAndroid Build Coastguard Worker 
vdivps(XmmRegister dst,XmmRegister src1,XmmRegister src2)771*795d594fSAndroid Build Coastguard Worker void X86Assembler::vdivps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
772*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
773*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
774*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
775*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
776*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
777*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
778*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
779*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_NONE);
780*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
781*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
782*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
783*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
784*795d594fSAndroid Build Coastguard Worker }
785*795d594fSAndroid Build Coastguard Worker 
vfmadd213ss(XmmRegister acc,XmmRegister left,XmmRegister right)786*795d594fSAndroid Build Coastguard Worker void X86Assembler::vfmadd213ss(XmmRegister acc, XmmRegister left, XmmRegister right) {
787*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
788*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
789*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00, ByteTwo = 0x00;
790*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
791*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(left);
792*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
793*795d594fSAndroid Build Coastguard Worker                                  /*X=*/ false,
794*795d594fSAndroid Build Coastguard Worker                                  /*B=*/ false,
795*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_M_0F_38);
796*795d594fSAndroid Build Coastguard Worker   ByteTwo = EmitVexPrefixByteTwo(/*W=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
797*795d594fSAndroid Build Coastguard Worker 
798*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
799*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
800*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteTwo);
801*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA9);
802*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(acc, right);
803*795d594fSAndroid Build Coastguard Worker }
804*795d594fSAndroid Build Coastguard Worker 
vfmadd213sd(XmmRegister acc,XmmRegister left,XmmRegister right)805*795d594fSAndroid Build Coastguard Worker void X86Assembler::vfmadd213sd(XmmRegister acc, XmmRegister left, XmmRegister right) {
806*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
807*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
808*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00, ByteTwo = 0x00;
809*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
810*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(left);
811*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
812*795d594fSAndroid Build Coastguard Worker                                  /*X=*/ false,
813*795d594fSAndroid Build Coastguard Worker                                  /*B=*/ false,
814*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_M_0F_38);
815*795d594fSAndroid Build Coastguard Worker   ByteTwo = EmitVexPrefixByteTwo(/*W=*/ true, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
816*795d594fSAndroid Build Coastguard Worker 
817*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
818*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
819*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteTwo);
820*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA9);
821*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(acc, right);
822*795d594fSAndroid Build Coastguard Worker }
823*795d594fSAndroid Build Coastguard Worker 
movapd(XmmRegister dst,XmmRegister src)824*795d594fSAndroid Build Coastguard Worker void X86Assembler::movapd(XmmRegister dst, XmmRegister src) {
825*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
826*795d594fSAndroid Build Coastguard Worker     vmovapd(dst, src);
827*795d594fSAndroid Build Coastguard Worker     return;
828*795d594fSAndroid Build Coastguard Worker   }
829*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
830*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
831*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
832*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
833*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
834*795d594fSAndroid Build Coastguard Worker }
835*795d594fSAndroid Build Coastguard Worker 
836*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 28 /r VMOVAPD xmm1, xmm2*/
vmovapd(XmmRegister dst,XmmRegister src)837*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovapd(XmmRegister dst, XmmRegister src) {
838*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
839*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
840*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
841*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
842*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
843*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
844*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
845*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
846*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg ,
847*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
848*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
849*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
850*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
851*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
852*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
853*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
854*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
855*795d594fSAndroid Build Coastguard Worker }
856*795d594fSAndroid Build Coastguard Worker 
movapd(XmmRegister dst,const Address & src)857*795d594fSAndroid Build Coastguard Worker void X86Assembler::movapd(XmmRegister dst, const Address& src) {
858*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
859*795d594fSAndroid Build Coastguard Worker     vmovapd(dst, src);
860*795d594fSAndroid Build Coastguard Worker     return;
861*795d594fSAndroid Build Coastguard Worker   }
862*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
863*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
864*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
865*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
866*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
867*795d594fSAndroid Build Coastguard Worker }
868*795d594fSAndroid Build Coastguard Worker 
869*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 28 /r VMOVAPD xmm1, m128*/
vmovapd(XmmRegister dst,const Address & src)870*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovapd(XmmRegister dst, const Address& src) {
871*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
872*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
873*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
874*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
875*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
876*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
877*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
878*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
879*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
880*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
881*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
882*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
883*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
884*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
885*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x28);
886*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
887*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
888*795d594fSAndroid Build Coastguard Worker }
889*795d594fSAndroid Build Coastguard Worker 
movupd(XmmRegister dst,const Address & src)890*795d594fSAndroid Build Coastguard Worker void X86Assembler::movupd(XmmRegister dst, const Address& src) {
891*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
892*795d594fSAndroid Build Coastguard Worker     vmovupd(dst, src);
893*795d594fSAndroid Build Coastguard Worker     return;
894*795d594fSAndroid Build Coastguard Worker   }
895*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
896*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
897*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
898*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x10);
899*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
900*795d594fSAndroid Build Coastguard Worker }
901*795d594fSAndroid Build Coastguard Worker 
902*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 10 /r VMOVUPD xmm1, m128*/
vmovupd(XmmRegister dst,const Address & src)903*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovupd(XmmRegister dst, const Address& src) {
904*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
905*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
906*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix*/
907*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
908*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
909*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
910*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
911*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
912*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
913*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
914*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
915*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
916*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
917*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
918*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x10);
919*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
920*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
921*795d594fSAndroid Build Coastguard Worker }
922*795d594fSAndroid Build Coastguard Worker 
923*795d594fSAndroid Build Coastguard Worker 
movapd(const Address & dst,XmmRegister src)924*795d594fSAndroid Build Coastguard Worker void X86Assembler::movapd(const Address& dst, XmmRegister src) {
925*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
926*795d594fSAndroid Build Coastguard Worker     vmovapd(dst, src);
927*795d594fSAndroid Build Coastguard Worker     return;
928*795d594fSAndroid Build Coastguard Worker   }
929*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
930*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
931*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
932*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x29);
933*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
934*795d594fSAndroid Build Coastguard Worker }
935*795d594fSAndroid Build Coastguard Worker 
936*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 29 /r VMOVAPD m128, xmm1 */
vmovapd(const Address & dst,XmmRegister src)937*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovapd(const Address& dst, XmmRegister src) {
938*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
939*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
940*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix */
941*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
942*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
943*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
944*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.*/
945*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
946*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
947*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
948*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
949*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
950*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
951*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
952*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x29);
953*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
954*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
955*795d594fSAndroid Build Coastguard Worker }
956*795d594fSAndroid Build Coastguard Worker 
movupd(const Address & dst,XmmRegister src)957*795d594fSAndroid Build Coastguard Worker void X86Assembler::movupd(const Address& dst, XmmRegister src) {
958*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
959*795d594fSAndroid Build Coastguard Worker     vmovupd(dst, src);
960*795d594fSAndroid Build Coastguard Worker     return;
961*795d594fSAndroid Build Coastguard Worker   }
962*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
963*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
964*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
965*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
966*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
967*795d594fSAndroid Build Coastguard Worker }
968*795d594fSAndroid Build Coastguard Worker 
969*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 11 /r VMOVUPD m128, xmm1 */
vmovupd(const Address & dst,XmmRegister src)970*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovupd(const Address& dst, XmmRegister src) {
971*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
972*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
973*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix */
974*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
975*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
976*795d594fSAndroid Build Coastguard Worker   /**a REX prefix is necessary only if an instruction references one of the
977*795d594fSAndroid Build Coastguard Worker   extended registers or uses a 64-bit operand.**/
978*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
979*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
980*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
981*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
982*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
983*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
984*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
985*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
986*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
987*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
988*795d594fSAndroid Build Coastguard Worker }
989*795d594fSAndroid Build Coastguard Worker 
flds(const Address & src)990*795d594fSAndroid Build Coastguard Worker void X86Assembler::flds(const Address& src) {
991*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
992*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
993*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, src);
994*795d594fSAndroid Build Coastguard Worker }
995*795d594fSAndroid Build Coastguard Worker 
996*795d594fSAndroid Build Coastguard Worker 
fsts(const Address & dst)997*795d594fSAndroid Build Coastguard Worker void X86Assembler::fsts(const Address& dst) {
998*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
999*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
1000*795d594fSAndroid Build Coastguard Worker   EmitOperand(2, dst);
1001*795d594fSAndroid Build Coastguard Worker }
1002*795d594fSAndroid Build Coastguard Worker 
1003*795d594fSAndroid Build Coastguard Worker 
fstps(const Address & dst)1004*795d594fSAndroid Build Coastguard Worker void X86Assembler::fstps(const Address& dst) {
1005*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1006*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
1007*795d594fSAndroid Build Coastguard Worker   EmitOperand(3, dst);
1008*795d594fSAndroid Build Coastguard Worker }
1009*795d594fSAndroid Build Coastguard Worker 
1010*795d594fSAndroid Build Coastguard Worker 
movsd(XmmRegister dst,const Address & src)1011*795d594fSAndroid Build Coastguard Worker void X86Assembler::movsd(XmmRegister dst, const Address& src) {
1012*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1013*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1014*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1015*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x10);
1016*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1017*795d594fSAndroid Build Coastguard Worker }
1018*795d594fSAndroid Build Coastguard Worker 
1019*795d594fSAndroid Build Coastguard Worker 
movsd(const Address & dst,XmmRegister src)1020*795d594fSAndroid Build Coastguard Worker void X86Assembler::movsd(const Address& dst, XmmRegister src) {
1021*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1022*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1023*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1024*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
1025*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
1026*795d594fSAndroid Build Coastguard Worker }
1027*795d594fSAndroid Build Coastguard Worker 
1028*795d594fSAndroid Build Coastguard Worker 
movsd(XmmRegister dst,XmmRegister src)1029*795d594fSAndroid Build Coastguard Worker void X86Assembler::movsd(XmmRegister dst, XmmRegister src) {
1030*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1031*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1032*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1033*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x11);
1034*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(src, dst);
1035*795d594fSAndroid Build Coastguard Worker }
1036*795d594fSAndroid Build Coastguard Worker 
1037*795d594fSAndroid Build Coastguard Worker 
movhpd(XmmRegister dst,const Address & src)1038*795d594fSAndroid Build Coastguard Worker void X86Assembler::movhpd(XmmRegister dst, const Address& src) {
1039*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1040*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1041*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1042*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x16);
1043*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1044*795d594fSAndroid Build Coastguard Worker }
1045*795d594fSAndroid Build Coastguard Worker 
1046*795d594fSAndroid Build Coastguard Worker 
movhpd(const Address & dst,XmmRegister src)1047*795d594fSAndroid Build Coastguard Worker void X86Assembler::movhpd(const Address& dst, XmmRegister src) {
1048*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1049*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1050*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1051*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x17);
1052*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
1053*795d594fSAndroid Build Coastguard Worker }
1054*795d594fSAndroid Build Coastguard Worker 
1055*795d594fSAndroid Build Coastguard Worker 
addsd(XmmRegister dst,XmmRegister src)1056*795d594fSAndroid Build Coastguard Worker void X86Assembler::addsd(XmmRegister dst, XmmRegister src) {
1057*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1058*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1059*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1060*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
1061*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1062*795d594fSAndroid Build Coastguard Worker }
1063*795d594fSAndroid Build Coastguard Worker 
1064*795d594fSAndroid Build Coastguard Worker 
addsd(XmmRegister dst,const Address & src)1065*795d594fSAndroid Build Coastguard Worker void X86Assembler::addsd(XmmRegister dst, const Address& src) {
1066*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1067*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1068*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1069*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
1070*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1071*795d594fSAndroid Build Coastguard Worker }
1072*795d594fSAndroid Build Coastguard Worker 
1073*795d594fSAndroid Build Coastguard Worker 
subsd(XmmRegister dst,XmmRegister src)1074*795d594fSAndroid Build Coastguard Worker void X86Assembler::subsd(XmmRegister dst, XmmRegister src) {
1075*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1076*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1077*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1078*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
1079*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1080*795d594fSAndroid Build Coastguard Worker }
1081*795d594fSAndroid Build Coastguard Worker 
1082*795d594fSAndroid Build Coastguard Worker 
subsd(XmmRegister dst,const Address & src)1083*795d594fSAndroid Build Coastguard Worker void X86Assembler::subsd(XmmRegister dst, const Address& src) {
1084*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1085*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1086*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1087*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
1088*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1089*795d594fSAndroid Build Coastguard Worker }
1090*795d594fSAndroid Build Coastguard Worker 
1091*795d594fSAndroid Build Coastguard Worker 
mulsd(XmmRegister dst,XmmRegister src)1092*795d594fSAndroid Build Coastguard Worker void X86Assembler::mulsd(XmmRegister dst, XmmRegister src) {
1093*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1094*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1095*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1096*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
1097*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1098*795d594fSAndroid Build Coastguard Worker }
1099*795d594fSAndroid Build Coastguard Worker 
1100*795d594fSAndroid Build Coastguard Worker 
mulsd(XmmRegister dst,const Address & src)1101*795d594fSAndroid Build Coastguard Worker void X86Assembler::mulsd(XmmRegister dst, const Address& src) {
1102*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1103*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1104*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1105*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
1106*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1107*795d594fSAndroid Build Coastguard Worker }
1108*795d594fSAndroid Build Coastguard Worker 
1109*795d594fSAndroid Build Coastguard Worker 
divsd(XmmRegister dst,XmmRegister src)1110*795d594fSAndroid Build Coastguard Worker void X86Assembler::divsd(XmmRegister dst, XmmRegister src) {
1111*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1112*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1113*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1114*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
1115*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1116*795d594fSAndroid Build Coastguard Worker }
1117*795d594fSAndroid Build Coastguard Worker 
1118*795d594fSAndroid Build Coastguard Worker 
divsd(XmmRegister dst,const Address & src)1119*795d594fSAndroid Build Coastguard Worker void X86Assembler::divsd(XmmRegister dst, const Address& src) {
1120*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1121*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1122*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1123*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
1124*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1125*795d594fSAndroid Build Coastguard Worker }
1126*795d594fSAndroid Build Coastguard Worker 
1127*795d594fSAndroid Build Coastguard Worker 
addpd(XmmRegister dst,XmmRegister src)1128*795d594fSAndroid Build Coastguard Worker void X86Assembler::addpd(XmmRegister dst, XmmRegister src) {
1129*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1130*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1131*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1132*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
1133*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1134*795d594fSAndroid Build Coastguard Worker }
1135*795d594fSAndroid Build Coastguard Worker 
1136*795d594fSAndroid Build Coastguard Worker 
vaddpd(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1137*795d594fSAndroid Build Coastguard Worker void X86Assembler::vaddpd(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1138*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1139*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1140*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1141*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1142*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(add_left),
1143*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1144*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1145*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1146*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1147*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x58);
1148*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1149*795d594fSAndroid Build Coastguard Worker }
1150*795d594fSAndroid Build Coastguard Worker 
1151*795d594fSAndroid Build Coastguard Worker 
subpd(XmmRegister dst,XmmRegister src)1152*795d594fSAndroid Build Coastguard Worker void X86Assembler::subpd(XmmRegister dst, XmmRegister src) {
1153*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1154*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1155*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1156*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
1157*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1158*795d594fSAndroid Build Coastguard Worker }
1159*795d594fSAndroid Build Coastguard Worker 
1160*795d594fSAndroid Build Coastguard Worker 
vsubpd(XmmRegister dst,XmmRegister src1,XmmRegister src2)1161*795d594fSAndroid Build Coastguard Worker void X86Assembler::vsubpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1162*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1163*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1164*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form*/ true);
1165*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1166*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1167*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1168*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1169*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1170*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1171*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5C);
1172*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
1173*795d594fSAndroid Build Coastguard Worker }
1174*795d594fSAndroid Build Coastguard Worker 
mulpd(XmmRegister dst,XmmRegister src)1175*795d594fSAndroid Build Coastguard Worker void X86Assembler::mulpd(XmmRegister dst, XmmRegister src) {
1176*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1177*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1178*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1179*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
1180*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1181*795d594fSAndroid Build Coastguard Worker }
1182*795d594fSAndroid Build Coastguard Worker 
vmulpd(XmmRegister dst,XmmRegister src1,XmmRegister src2)1183*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmulpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1184*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1185*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1186*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1187*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1188*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1189*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1190*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1191*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1192*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1193*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1194*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x59);
1195*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
1196*795d594fSAndroid Build Coastguard Worker }
1197*795d594fSAndroid Build Coastguard Worker 
divpd(XmmRegister dst,XmmRegister src)1198*795d594fSAndroid Build Coastguard Worker void X86Assembler::divpd(XmmRegister dst, XmmRegister src) {
1199*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1200*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1201*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1202*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
1203*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1204*795d594fSAndroid Build Coastguard Worker }
1205*795d594fSAndroid Build Coastguard Worker 
vdivpd(XmmRegister dst,XmmRegister src1,XmmRegister src2)1206*795d594fSAndroid Build Coastguard Worker void X86Assembler::vdivpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1207*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1208*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1209*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1210*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1211*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1212*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1213*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1214*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1215*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1216*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1217*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5E);
1218*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
1219*795d594fSAndroid Build Coastguard Worker }
1220*795d594fSAndroid Build Coastguard Worker 
movdqa(XmmRegister dst,XmmRegister src)1221*795d594fSAndroid Build Coastguard Worker void X86Assembler::movdqa(XmmRegister dst, XmmRegister src) {
1222*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
1223*795d594fSAndroid Build Coastguard Worker     vmovdqa(dst, src);
1224*795d594fSAndroid Build Coastguard Worker     return;
1225*795d594fSAndroid Build Coastguard Worker   }
1226*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1227*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1228*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1229*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6F);
1230*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1231*795d594fSAndroid Build Coastguard Worker }
1232*795d594fSAndroid Build Coastguard Worker 
1233*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 6F /r VMOVDQA xmm1, xmm2 */
vmovdqa(XmmRegister dst,XmmRegister src)1234*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovdqa(XmmRegister dst, XmmRegister src) {
1235*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1236*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1237*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix */
1238*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1239*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1240*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1241*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
1242*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
1243*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
1244*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1245*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1246*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1247*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6F);
1248*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1249*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1250*795d594fSAndroid Build Coastguard Worker }
1251*795d594fSAndroid Build Coastguard Worker 
movdqa(XmmRegister dst,const Address & src)1252*795d594fSAndroid Build Coastguard Worker void X86Assembler::movdqa(XmmRegister dst, const Address& src) {
1253*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
1254*795d594fSAndroid Build Coastguard Worker     vmovdqa(dst, src);
1255*795d594fSAndroid Build Coastguard Worker     return;
1256*795d594fSAndroid Build Coastguard Worker   }
1257*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1258*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1259*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1260*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6F);
1261*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1262*795d594fSAndroid Build Coastguard Worker }
1263*795d594fSAndroid Build Coastguard Worker 
1264*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 6F /r VMOVDQA xmm1, m128 */
vmovdqa(XmmRegister dst,const Address & src)1265*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovdqa(XmmRegister dst, const Address& src) {
1266*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1267*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1268*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix */
1269*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1270*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1271*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1272*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
1273*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
1274*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
1275*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1276*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1277*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1278*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6F);
1279*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1280*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1281*795d594fSAndroid Build Coastguard Worker }
1282*795d594fSAndroid Build Coastguard Worker 
movdqu(XmmRegister dst,const Address & src)1283*795d594fSAndroid Build Coastguard Worker void X86Assembler::movdqu(XmmRegister dst, const Address& src) {
1284*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
1285*795d594fSAndroid Build Coastguard Worker     vmovdqu(dst, src);
1286*795d594fSAndroid Build Coastguard Worker     return;
1287*795d594fSAndroid Build Coastguard Worker   }
1288*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1289*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1290*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1291*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6F);
1292*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1293*795d594fSAndroid Build Coastguard Worker }
1294*795d594fSAndroid Build Coastguard Worker 
1295*795d594fSAndroid Build Coastguard Worker /**VEX.128.F3.0F.WIG 6F /r VMOVDQU xmm1, m128 */
vmovdqu(XmmRegister dst,const Address & src)1296*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovdqu(XmmRegister dst, const Address& src) {
1297*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1298*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1299*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix */
1300*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1301*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1302*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1303*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
1304*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
1305*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_F3);
1306*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1307*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1308*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1309*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6F);
1310*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1311*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1312*795d594fSAndroid Build Coastguard Worker }
1313*795d594fSAndroid Build Coastguard Worker 
movdqa(const Address & dst,XmmRegister src)1314*795d594fSAndroid Build Coastguard Worker void X86Assembler::movdqa(const Address& dst, XmmRegister src) {
1315*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
1316*795d594fSAndroid Build Coastguard Worker     vmovdqa(dst, src);
1317*795d594fSAndroid Build Coastguard Worker     return;
1318*795d594fSAndroid Build Coastguard Worker   }
1319*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1320*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1321*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1322*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7F);
1323*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
1324*795d594fSAndroid Build Coastguard Worker }
1325*795d594fSAndroid Build Coastguard Worker 
1326*795d594fSAndroid Build Coastguard Worker /**VEX.128.66.0F.WIG 7F /r VMOVDQA m128, xmm1 */
vmovdqa(const Address & dst,XmmRegister src)1327*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovdqa(const Address& dst, XmmRegister src) {
1328*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1329*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1330*795d594fSAndroid Build Coastguard Worker   /**Instruction VEX Prefix */
1331*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1332*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1333*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1334*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
1335*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
1336*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_66);
1337*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1338*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1339*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1340*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7F);
1341*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1342*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
1343*795d594fSAndroid Build Coastguard Worker }
1344*795d594fSAndroid Build Coastguard Worker 
1345*795d594fSAndroid Build Coastguard Worker 
movdqu(const Address & dst,XmmRegister src)1346*795d594fSAndroid Build Coastguard Worker void X86Assembler::movdqu(const Address& dst, XmmRegister src) {
1347*795d594fSAndroid Build Coastguard Worker   if (CpuHasAVXorAVX2FeatureFlag()) {
1348*795d594fSAndroid Build Coastguard Worker     vmovdqu(dst, src);
1349*795d594fSAndroid Build Coastguard Worker     return;
1350*795d594fSAndroid Build Coastguard Worker   }
1351*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1352*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1353*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1354*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7F);
1355*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
1356*795d594fSAndroid Build Coastguard Worker }
1357*795d594fSAndroid Build Coastguard Worker 
1358*795d594fSAndroid Build Coastguard Worker /**VEX.128.F3.0F.WIG 7F /r VMOVDQU m128, xmm1 */
vmovdqu(const Address & dst,XmmRegister src)1359*795d594fSAndroid Build Coastguard Worker void X86Assembler::vmovdqu(const Address& dst, XmmRegister src) {
1360*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1361*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1362*795d594fSAndroid Build Coastguard Worker   // Instruction VEX Prefix
1363*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1364*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1365*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1366*795d594fSAndroid Build Coastguard Worker                                          vvvv_reg,
1367*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_L_128,
1368*795d594fSAndroid Build Coastguard Worker                                          SET_VEX_PP_F3);
1369*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1370*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1371*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1372*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7F);
1373*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1374*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, dst);
1375*795d594fSAndroid Build Coastguard Worker }
1376*795d594fSAndroid Build Coastguard Worker 
paddb(XmmRegister dst,XmmRegister src)1377*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddb(XmmRegister dst, XmmRegister src) {
1378*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1379*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1380*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1381*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFC);
1382*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1383*795d594fSAndroid Build Coastguard Worker }
1384*795d594fSAndroid Build Coastguard Worker 
vpaddb(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1385*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpaddb(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1386*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1387*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1388*795d594fSAndroid Build Coastguard Worker   uint8_t ByteOne = 0x00, ByteZero = 0x00;
1389*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1390*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1391*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1392*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1393*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1394*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFC);
1395*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1396*795d594fSAndroid Build Coastguard Worker }
1397*795d594fSAndroid Build Coastguard Worker 
psubb(XmmRegister dst,XmmRegister src)1398*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubb(XmmRegister dst, XmmRegister src) {
1399*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1400*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1401*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1402*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF8);
1403*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1404*795d594fSAndroid Build Coastguard Worker }
1405*795d594fSAndroid Build Coastguard Worker 
vpsubb(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1406*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpsubb(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1407*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1408*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1409*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1410*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1411*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1412*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1413*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1414*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1415*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF8);
1416*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1417*795d594fSAndroid Build Coastguard Worker }
1418*795d594fSAndroid Build Coastguard Worker 
paddw(XmmRegister dst,XmmRegister src)1419*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddw(XmmRegister dst, XmmRegister src) {
1420*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1421*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1422*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1423*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFD);
1424*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1425*795d594fSAndroid Build Coastguard Worker }
1426*795d594fSAndroid Build Coastguard Worker 
vpaddw(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1427*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpaddw(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1428*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1429*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1430*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1431*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1432*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1433*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1434*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1435*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1436*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFD);
1437*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1438*795d594fSAndroid Build Coastguard Worker }
1439*795d594fSAndroid Build Coastguard Worker 
psubw(XmmRegister dst,XmmRegister src)1440*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubw(XmmRegister dst, XmmRegister src) {
1441*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1442*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1443*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1444*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF9);
1445*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1446*795d594fSAndroid Build Coastguard Worker }
1447*795d594fSAndroid Build Coastguard Worker 
vpsubw(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1448*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpsubw(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1449*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1450*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1451*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1452*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1453*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1454*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1455*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1456*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1457*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF9);
1458*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1459*795d594fSAndroid Build Coastguard Worker }
1460*795d594fSAndroid Build Coastguard Worker 
pmullw(XmmRegister dst,XmmRegister src)1461*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmullw(XmmRegister dst, XmmRegister src) {
1462*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1463*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1464*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1465*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD5);
1466*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1467*795d594fSAndroid Build Coastguard Worker }
1468*795d594fSAndroid Build Coastguard Worker 
1469*795d594fSAndroid Build Coastguard Worker 
paddd(XmmRegister dst,XmmRegister src)1470*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddd(XmmRegister dst, XmmRegister src) {
1471*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1472*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1473*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1474*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFE);
1475*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1476*795d594fSAndroid Build Coastguard Worker }
1477*795d594fSAndroid Build Coastguard Worker 
vpaddd(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1478*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpaddd(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1479*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1480*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1481*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1482*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1483*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1484*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1485*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1486*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1487*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFE);
1488*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1489*795d594fSAndroid Build Coastguard Worker }
1490*795d594fSAndroid Build Coastguard Worker 
psubd(XmmRegister dst,XmmRegister src)1491*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubd(XmmRegister dst, XmmRegister src) {
1492*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1493*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1494*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1495*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFA);
1496*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1497*795d594fSAndroid Build Coastguard Worker }
1498*795d594fSAndroid Build Coastguard Worker 
1499*795d594fSAndroid Build Coastguard Worker 
vpsubd(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1500*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpsubd(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1501*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1502*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1503*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1504*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1505*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1506*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1507*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1508*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1509*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFA);
1510*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1511*795d594fSAndroid Build Coastguard Worker }
1512*795d594fSAndroid Build Coastguard Worker 
1513*795d594fSAndroid Build Coastguard Worker 
pmulld(XmmRegister dst,XmmRegister src)1514*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmulld(XmmRegister dst, XmmRegister src) {
1515*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1516*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1517*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1518*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
1519*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x40);
1520*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1521*795d594fSAndroid Build Coastguard Worker }
1522*795d594fSAndroid Build Coastguard Worker 
vpmulld(XmmRegister dst,XmmRegister src1,XmmRegister src2)1523*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpmulld(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1524*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1525*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1526*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00, ByteTwo = 0x00;
1527*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
1528*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1529*795d594fSAndroid Build Coastguard Worker                                  /*X=*/ false,
1530*795d594fSAndroid Build Coastguard Worker                                  /*B=*/ false,
1531*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_M_0F_38);
1532*795d594fSAndroid Build Coastguard Worker   ByteTwo = EmitVexPrefixByteTwo(/*W=*/ false,
1533*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1534*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1535*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1536*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1537*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1538*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteTwo);
1539*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x40);
1540*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src2);
1541*795d594fSAndroid Build Coastguard Worker }
1542*795d594fSAndroid Build Coastguard Worker 
vpmullw(XmmRegister dst,XmmRegister src1,XmmRegister src2)1543*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpmullw(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1544*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1545*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1546*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1547*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1548*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1549*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1550*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1551*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1552*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1553*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1554*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD5);
1555*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src2);
1556*795d594fSAndroid Build Coastguard Worker }
1557*795d594fSAndroid Build Coastguard Worker 
paddq(XmmRegister dst,XmmRegister src)1558*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddq(XmmRegister dst, XmmRegister src) {
1559*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1560*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1561*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1562*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD4);
1563*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1564*795d594fSAndroid Build Coastguard Worker }
1565*795d594fSAndroid Build Coastguard Worker 
vpaddq(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1566*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpaddq(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1567*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1568*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1569*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1570*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1571*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1572*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1573*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1574*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1575*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD4);
1576*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1577*795d594fSAndroid Build Coastguard Worker }
1578*795d594fSAndroid Build Coastguard Worker 
1579*795d594fSAndroid Build Coastguard Worker 
psubq(XmmRegister dst,XmmRegister src)1580*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubq(XmmRegister dst, XmmRegister src) {
1581*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1582*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1583*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1584*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFB);
1585*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1586*795d594fSAndroid Build Coastguard Worker }
1587*795d594fSAndroid Build Coastguard Worker 
vpsubq(XmmRegister dst,XmmRegister add_left,XmmRegister add_right)1588*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpsubq(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1589*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1590*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1591*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1592*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1593*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1594*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1595*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1596*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1597*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFB);
1598*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, add_right);
1599*795d594fSAndroid Build Coastguard Worker }
1600*795d594fSAndroid Build Coastguard Worker 
paddusb(XmmRegister dst,XmmRegister src)1601*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddusb(XmmRegister dst, XmmRegister src) {
1602*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1603*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1604*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1605*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDC);
1606*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1607*795d594fSAndroid Build Coastguard Worker }
1608*795d594fSAndroid Build Coastguard Worker 
1609*795d594fSAndroid Build Coastguard Worker 
paddsb(XmmRegister dst,XmmRegister src)1610*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddsb(XmmRegister dst, XmmRegister src) {
1611*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1612*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1613*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1614*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xEC);
1615*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1616*795d594fSAndroid Build Coastguard Worker }
1617*795d594fSAndroid Build Coastguard Worker 
1618*795d594fSAndroid Build Coastguard Worker 
paddusw(XmmRegister dst,XmmRegister src)1619*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddusw(XmmRegister dst, XmmRegister src) {
1620*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1621*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1622*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1623*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDD);
1624*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1625*795d594fSAndroid Build Coastguard Worker }
1626*795d594fSAndroid Build Coastguard Worker 
1627*795d594fSAndroid Build Coastguard Worker 
paddsw(XmmRegister dst,XmmRegister src)1628*795d594fSAndroid Build Coastguard Worker void X86Assembler::paddsw(XmmRegister dst, XmmRegister src) {
1629*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1630*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1631*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1632*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xED);
1633*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1634*795d594fSAndroid Build Coastguard Worker }
1635*795d594fSAndroid Build Coastguard Worker 
1636*795d594fSAndroid Build Coastguard Worker 
psubusb(XmmRegister dst,XmmRegister src)1637*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubusb(XmmRegister dst, XmmRegister src) {
1638*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1639*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1640*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1641*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD8);
1642*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1643*795d594fSAndroid Build Coastguard Worker }
1644*795d594fSAndroid Build Coastguard Worker 
1645*795d594fSAndroid Build Coastguard Worker 
psubsb(XmmRegister dst,XmmRegister src)1646*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubsb(XmmRegister dst, XmmRegister src) {
1647*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1648*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1649*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1650*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE8);
1651*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1652*795d594fSAndroid Build Coastguard Worker }
1653*795d594fSAndroid Build Coastguard Worker 
1654*795d594fSAndroid Build Coastguard Worker 
psubusw(XmmRegister dst,XmmRegister src)1655*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubusw(XmmRegister dst, XmmRegister src) {
1656*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1657*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1658*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1659*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
1660*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1661*795d594fSAndroid Build Coastguard Worker }
1662*795d594fSAndroid Build Coastguard Worker 
1663*795d594fSAndroid Build Coastguard Worker 
psubsw(XmmRegister dst,XmmRegister src)1664*795d594fSAndroid Build Coastguard Worker void X86Assembler::psubsw(XmmRegister dst, XmmRegister src) {
1665*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1666*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1667*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1668*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE9);
1669*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1670*795d594fSAndroid Build Coastguard Worker }
1671*795d594fSAndroid Build Coastguard Worker 
1672*795d594fSAndroid Build Coastguard Worker 
cvtsi2ss(XmmRegister dst,Register src)1673*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtsi2ss(XmmRegister dst, Register src) {
1674*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1675*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1676*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1677*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2A);
1678*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
1679*795d594fSAndroid Build Coastguard Worker }
1680*795d594fSAndroid Build Coastguard Worker 
1681*795d594fSAndroid Build Coastguard Worker 
cvtsi2sd(XmmRegister dst,Register src)1682*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtsi2sd(XmmRegister dst, Register src) {
1683*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1684*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1685*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1686*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2A);
1687*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
1688*795d594fSAndroid Build Coastguard Worker }
1689*795d594fSAndroid Build Coastguard Worker 
1690*795d594fSAndroid Build Coastguard Worker 
cvtss2si(Register dst,XmmRegister src)1691*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtss2si(Register dst, XmmRegister src) {
1692*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1693*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1694*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1695*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2D);
1696*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1697*795d594fSAndroid Build Coastguard Worker }
1698*795d594fSAndroid Build Coastguard Worker 
1699*795d594fSAndroid Build Coastguard Worker 
cvtss2sd(XmmRegister dst,XmmRegister src)1700*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) {
1701*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1702*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1703*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1704*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5A);
1705*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1706*795d594fSAndroid Build Coastguard Worker }
1707*795d594fSAndroid Build Coastguard Worker 
1708*795d594fSAndroid Build Coastguard Worker 
cvtsd2si(Register dst,XmmRegister src)1709*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtsd2si(Register dst, XmmRegister src) {
1710*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1711*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1712*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1713*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2D);
1714*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1715*795d594fSAndroid Build Coastguard Worker }
1716*795d594fSAndroid Build Coastguard Worker 
1717*795d594fSAndroid Build Coastguard Worker 
cvttss2si(Register dst,XmmRegister src)1718*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvttss2si(Register dst, XmmRegister src) {
1719*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1720*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1721*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1722*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2C);
1723*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1724*795d594fSAndroid Build Coastguard Worker }
1725*795d594fSAndroid Build Coastguard Worker 
1726*795d594fSAndroid Build Coastguard Worker 
cvttsd2si(Register dst,XmmRegister src)1727*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvttsd2si(Register dst, XmmRegister src) {
1728*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1729*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1730*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1731*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2C);
1732*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1733*795d594fSAndroid Build Coastguard Worker }
1734*795d594fSAndroid Build Coastguard Worker 
1735*795d594fSAndroid Build Coastguard Worker 
cvtsd2ss(XmmRegister dst,XmmRegister src)1736*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) {
1737*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1738*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1739*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1740*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5A);
1741*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1742*795d594fSAndroid Build Coastguard Worker }
1743*795d594fSAndroid Build Coastguard Worker 
1744*795d594fSAndroid Build Coastguard Worker 
cvtdq2ps(XmmRegister dst,XmmRegister src)1745*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) {
1746*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1747*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1748*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5B);
1749*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1750*795d594fSAndroid Build Coastguard Worker }
1751*795d594fSAndroid Build Coastguard Worker 
1752*795d594fSAndroid Build Coastguard Worker 
cvtdq2pd(XmmRegister dst,XmmRegister src)1753*795d594fSAndroid Build Coastguard Worker void X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) {
1754*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1755*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1756*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1757*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE6);
1758*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1759*795d594fSAndroid Build Coastguard Worker }
1760*795d594fSAndroid Build Coastguard Worker 
1761*795d594fSAndroid Build Coastguard Worker 
comiss(XmmRegister a,XmmRegister b)1762*795d594fSAndroid Build Coastguard Worker void X86Assembler::comiss(XmmRegister a, XmmRegister b) {
1763*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1764*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1765*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2F);
1766*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(a, b);
1767*795d594fSAndroid Build Coastguard Worker }
1768*795d594fSAndroid Build Coastguard Worker 
1769*795d594fSAndroid Build Coastguard Worker 
comiss(XmmRegister a,const Address & b)1770*795d594fSAndroid Build Coastguard Worker void X86Assembler::comiss(XmmRegister a, const Address& b) {
1771*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1772*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1773*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2F);
1774*795d594fSAndroid Build Coastguard Worker   EmitOperand(a, b);
1775*795d594fSAndroid Build Coastguard Worker }
1776*795d594fSAndroid Build Coastguard Worker 
1777*795d594fSAndroid Build Coastguard Worker 
comisd(XmmRegister a,XmmRegister b)1778*795d594fSAndroid Build Coastguard Worker void X86Assembler::comisd(XmmRegister a, XmmRegister b) {
1779*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1780*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1781*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1782*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2F);
1783*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(a, b);
1784*795d594fSAndroid Build Coastguard Worker }
1785*795d594fSAndroid Build Coastguard Worker 
1786*795d594fSAndroid Build Coastguard Worker 
comisd(XmmRegister a,const Address & b)1787*795d594fSAndroid Build Coastguard Worker void X86Assembler::comisd(XmmRegister a, const Address& b) {
1788*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1789*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1790*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1791*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2F);
1792*795d594fSAndroid Build Coastguard Worker   EmitOperand(a, b);
1793*795d594fSAndroid Build Coastguard Worker }
1794*795d594fSAndroid Build Coastguard Worker 
1795*795d594fSAndroid Build Coastguard Worker 
ucomiss(XmmRegister a,XmmRegister b)1796*795d594fSAndroid Build Coastguard Worker void X86Assembler::ucomiss(XmmRegister a, XmmRegister b) {
1797*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1798*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1799*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2E);
1800*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(a, b);
1801*795d594fSAndroid Build Coastguard Worker }
1802*795d594fSAndroid Build Coastguard Worker 
1803*795d594fSAndroid Build Coastguard Worker 
ucomiss(XmmRegister a,const Address & b)1804*795d594fSAndroid Build Coastguard Worker void X86Assembler::ucomiss(XmmRegister a, const Address& b) {
1805*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1806*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1807*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2E);
1808*795d594fSAndroid Build Coastguard Worker   EmitOperand(a, b);
1809*795d594fSAndroid Build Coastguard Worker }
1810*795d594fSAndroid Build Coastguard Worker 
1811*795d594fSAndroid Build Coastguard Worker 
ucomisd(XmmRegister a,XmmRegister b)1812*795d594fSAndroid Build Coastguard Worker void X86Assembler::ucomisd(XmmRegister a, XmmRegister b) {
1813*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1814*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1815*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1816*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2E);
1817*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(a, b);
1818*795d594fSAndroid Build Coastguard Worker }
1819*795d594fSAndroid Build Coastguard Worker 
1820*795d594fSAndroid Build Coastguard Worker 
ucomisd(XmmRegister a,const Address & b)1821*795d594fSAndroid Build Coastguard Worker void X86Assembler::ucomisd(XmmRegister a, const Address& b) {
1822*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1823*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1824*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1825*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2E);
1826*795d594fSAndroid Build Coastguard Worker   EmitOperand(a, b);
1827*795d594fSAndroid Build Coastguard Worker }
1828*795d594fSAndroid Build Coastguard Worker 
1829*795d594fSAndroid Build Coastguard Worker 
roundsd(XmmRegister dst,XmmRegister src,const Immediate & imm)1830*795d594fSAndroid Build Coastguard Worker void X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1831*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1832*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1833*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1834*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3A);
1835*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0B);
1836*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1837*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value());
1838*795d594fSAndroid Build Coastguard Worker }
1839*795d594fSAndroid Build Coastguard Worker 
1840*795d594fSAndroid Build Coastguard Worker 
roundss(XmmRegister dst,XmmRegister src,const Immediate & imm)1841*795d594fSAndroid Build Coastguard Worker void X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1842*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1843*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1844*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1845*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3A);
1846*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0A);
1847*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1848*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value());
1849*795d594fSAndroid Build Coastguard Worker }
1850*795d594fSAndroid Build Coastguard Worker 
1851*795d594fSAndroid Build Coastguard Worker 
sqrtsd(XmmRegister dst,XmmRegister src)1852*795d594fSAndroid Build Coastguard Worker void X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
1853*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1854*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
1855*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1856*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x51);
1857*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1858*795d594fSAndroid Build Coastguard Worker }
1859*795d594fSAndroid Build Coastguard Worker 
1860*795d594fSAndroid Build Coastguard Worker 
sqrtss(XmmRegister dst,XmmRegister src)1861*795d594fSAndroid Build Coastguard Worker void X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) {
1862*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1863*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
1864*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1865*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x51);
1866*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1867*795d594fSAndroid Build Coastguard Worker }
1868*795d594fSAndroid Build Coastguard Worker 
1869*795d594fSAndroid Build Coastguard Worker 
xorpd(XmmRegister dst,const Address & src)1870*795d594fSAndroid Build Coastguard Worker void X86Assembler::xorpd(XmmRegister dst, const Address& src) {
1871*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1872*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1873*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1874*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x57);
1875*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1876*795d594fSAndroid Build Coastguard Worker }
1877*795d594fSAndroid Build Coastguard Worker 
1878*795d594fSAndroid Build Coastguard Worker 
xorpd(XmmRegister dst,XmmRegister src)1879*795d594fSAndroid Build Coastguard Worker void X86Assembler::xorpd(XmmRegister dst, XmmRegister src) {
1880*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1881*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1882*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1883*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x57);
1884*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1885*795d594fSAndroid Build Coastguard Worker }
1886*795d594fSAndroid Build Coastguard Worker 
1887*795d594fSAndroid Build Coastguard Worker 
xorps(XmmRegister dst,const Address & src)1888*795d594fSAndroid Build Coastguard Worker void X86Assembler::xorps(XmmRegister dst, const Address& src) {
1889*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1890*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1891*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x57);
1892*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1893*795d594fSAndroid Build Coastguard Worker }
1894*795d594fSAndroid Build Coastguard Worker 
1895*795d594fSAndroid Build Coastguard Worker 
xorps(XmmRegister dst,XmmRegister src)1896*795d594fSAndroid Build Coastguard Worker void X86Assembler::xorps(XmmRegister dst, XmmRegister src) {
1897*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1898*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1899*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x57);
1900*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1901*795d594fSAndroid Build Coastguard Worker }
1902*795d594fSAndroid Build Coastguard Worker 
1903*795d594fSAndroid Build Coastguard Worker 
pxor(XmmRegister dst,XmmRegister src)1904*795d594fSAndroid Build Coastguard Worker void X86Assembler::pxor(XmmRegister dst, XmmRegister src) {
1905*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1906*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1907*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1908*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xEF);
1909*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1910*795d594fSAndroid Build Coastguard Worker }
1911*795d594fSAndroid Build Coastguard Worker 
1912*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F.WIG EF /r VPXOR xmm1, xmm2, xmm3/m128 */
vpxor(XmmRegister dst,XmmRegister src1,XmmRegister src2)1913*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpxor(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1914*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1915*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1916*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1917*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
1918*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1919*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
1920*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
1921*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1922*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1923*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1924*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1925*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1926*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1927*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1928*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xEF);
1929*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1930*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
1931*795d594fSAndroid Build Coastguard Worker }
1932*795d594fSAndroid Build Coastguard Worker 
1933*795d594fSAndroid Build Coastguard Worker /* VEX.128.0F.WIG 57 /r VXORPS xmm1,xmm2, xmm3/m128 */
vxorps(XmmRegister dst,XmmRegister src1,XmmRegister src2)1934*795d594fSAndroid Build Coastguard Worker void X86Assembler::vxorps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1935*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1936*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1937*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1938*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
1939*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1940*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
1941*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
1942*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1943*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1944*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1945*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_NONE);
1946*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1947*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1948*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1949*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x57);
1950*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1951*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
1952*795d594fSAndroid Build Coastguard Worker }
1953*795d594fSAndroid Build Coastguard Worker 
1954*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F.WIG 57 /r VXORPD xmm1,xmm2, xmm3/m128 */
vxorpd(XmmRegister dst,XmmRegister src1,XmmRegister src2)1955*795d594fSAndroid Build Coastguard Worker void X86Assembler::vxorpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1956*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
1957*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1958*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
1959*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
1960*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1961*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
1962*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
1963*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1964*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
1965*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
1966*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
1967*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
1968*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
1969*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
1970*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x57);
1971*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
1972*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
1973*795d594fSAndroid Build Coastguard Worker }
1974*795d594fSAndroid Build Coastguard Worker 
andpd(XmmRegister dst,XmmRegister src)1975*795d594fSAndroid Build Coastguard Worker void X86Assembler::andpd(XmmRegister dst, XmmRegister src) {
1976*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1977*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1978*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1979*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x54);
1980*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1981*795d594fSAndroid Build Coastguard Worker }
1982*795d594fSAndroid Build Coastguard Worker 
1983*795d594fSAndroid Build Coastguard Worker 
andpd(XmmRegister dst,const Address & src)1984*795d594fSAndroid Build Coastguard Worker void X86Assembler::andpd(XmmRegister dst, const Address& src) {
1985*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1986*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
1987*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1988*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x54);
1989*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
1990*795d594fSAndroid Build Coastguard Worker }
1991*795d594fSAndroid Build Coastguard Worker 
1992*795d594fSAndroid Build Coastguard Worker 
andps(XmmRegister dst,XmmRegister src)1993*795d594fSAndroid Build Coastguard Worker void X86Assembler::andps(XmmRegister dst, XmmRegister src) {
1994*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1995*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
1996*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x54);
1997*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
1998*795d594fSAndroid Build Coastguard Worker }
1999*795d594fSAndroid Build Coastguard Worker 
2000*795d594fSAndroid Build Coastguard Worker 
andps(XmmRegister dst,const Address & src)2001*795d594fSAndroid Build Coastguard Worker void X86Assembler::andps(XmmRegister dst, const Address& src) {
2002*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2003*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2004*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x54);
2005*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, src);
2006*795d594fSAndroid Build Coastguard Worker }
2007*795d594fSAndroid Build Coastguard Worker 
2008*795d594fSAndroid Build Coastguard Worker 
pand(XmmRegister dst,XmmRegister src)2009*795d594fSAndroid Build Coastguard Worker void X86Assembler::pand(XmmRegister dst, XmmRegister src) {
2010*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2011*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2012*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2013*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDB);
2014*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2015*795d594fSAndroid Build Coastguard Worker }
2016*795d594fSAndroid Build Coastguard Worker 
2017*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F.WIG DB /r VPAND xmm1, xmm2, xmm3/m128 */
vpand(XmmRegister dst,XmmRegister src1,XmmRegister src2)2018*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpand(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2019*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2020*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2021*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2022*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2023*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2024*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2025*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2026*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2027*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2028*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2029*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
2030*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2031*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2032*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2033*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDB);
2034*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2035*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2036*795d594fSAndroid Build Coastguard Worker }
2037*795d594fSAndroid Build Coastguard Worker 
2038*795d594fSAndroid Build Coastguard Worker /* VEX.128.0F 54 /r VANDPS xmm1,xmm2, xmm3/m128 */
vandps(XmmRegister dst,XmmRegister src1,XmmRegister src2)2039*795d594fSAndroid Build Coastguard Worker void X86Assembler::vandps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2040*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2041*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2042*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2043*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2044*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2045*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2046*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2047*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2048*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_NONE);
2049*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2050*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2051*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2052*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x54);
2053*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2054*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2055*795d594fSAndroid Build Coastguard Worker }
2056*795d594fSAndroid Build Coastguard Worker 
2057*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F 54 /r VANDPD xmm1, xmm2, xmm3/m128 */
vandpd(XmmRegister dst,XmmRegister src1,XmmRegister src2)2058*795d594fSAndroid Build Coastguard Worker void X86Assembler::vandpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2059*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2060*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2061*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2062*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2063*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2064*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2065*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2066*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2067*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2068*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2069*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
2070*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2071*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2072*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2073*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x54);
2074*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2075*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2076*795d594fSAndroid Build Coastguard Worker }
2077*795d594fSAndroid Build Coastguard Worker 
andnpd(XmmRegister dst,XmmRegister src)2078*795d594fSAndroid Build Coastguard Worker void X86Assembler::andnpd(XmmRegister dst, XmmRegister src) {
2079*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2080*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2081*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2082*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x55);
2083*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2084*795d594fSAndroid Build Coastguard Worker }
2085*795d594fSAndroid Build Coastguard Worker 
2086*795d594fSAndroid Build Coastguard Worker 
andnps(XmmRegister dst,XmmRegister src)2087*795d594fSAndroid Build Coastguard Worker void X86Assembler::andnps(XmmRegister dst, XmmRegister src) {
2088*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2089*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2090*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x55);
2091*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2092*795d594fSAndroid Build Coastguard Worker }
2093*795d594fSAndroid Build Coastguard Worker 
2094*795d594fSAndroid Build Coastguard Worker 
pandn(XmmRegister dst,XmmRegister src)2095*795d594fSAndroid Build Coastguard Worker void X86Assembler::pandn(XmmRegister dst, XmmRegister src) {
2096*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2097*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2098*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2099*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDF);
2100*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2101*795d594fSAndroid Build Coastguard Worker }
2102*795d594fSAndroid Build Coastguard Worker 
2103*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F.WIG DF /r VPANDN xmm1, xmm2, xmm3/m128 */
vpandn(XmmRegister dst,XmmRegister src1,XmmRegister src2)2104*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpandn(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2105*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2106*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2107*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2108*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2109*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2110*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2111*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2112*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2113*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2114*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2115*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
2116*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2117*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2118*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2119*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDF);
2120*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2121*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2122*795d594fSAndroid Build Coastguard Worker }
2123*795d594fSAndroid Build Coastguard Worker 
2124*795d594fSAndroid Build Coastguard Worker /* VEX.128.0F 55 /r VANDNPS xmm1, xmm2, xmm3/m128 */
vandnps(XmmRegister dst,XmmRegister src1,XmmRegister src2)2125*795d594fSAndroid Build Coastguard Worker void X86Assembler::vandnps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2126*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2127*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2128*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2129*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2130*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2131*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2132*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2133*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2134*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2135*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2136*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_NONE);
2137*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2138*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2139*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2140*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x55);
2141*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2142*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2143*795d594fSAndroid Build Coastguard Worker }
2144*795d594fSAndroid Build Coastguard Worker 
2145*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F 55 /r VANDNPD xmm1, xmm2, xmm3/m128 */
vandnpd(XmmRegister dst,XmmRegister src1,XmmRegister src2)2146*795d594fSAndroid Build Coastguard Worker void X86Assembler::vandnpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2147*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2148*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2149*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2150*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2151*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2152*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2153*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2154*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2155*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2156*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2157*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
2158*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2159*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2160*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2161*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x55);
2162*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2163*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2164*795d594fSAndroid Build Coastguard Worker }
2165*795d594fSAndroid Build Coastguard Worker 
orpd(XmmRegister dst,XmmRegister src)2166*795d594fSAndroid Build Coastguard Worker void X86Assembler::orpd(XmmRegister dst, XmmRegister src) {
2167*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2168*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2169*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2170*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x56);
2171*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2172*795d594fSAndroid Build Coastguard Worker }
2173*795d594fSAndroid Build Coastguard Worker 
2174*795d594fSAndroid Build Coastguard Worker 
orps(XmmRegister dst,XmmRegister src)2175*795d594fSAndroid Build Coastguard Worker void X86Assembler::orps(XmmRegister dst, XmmRegister src) {
2176*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2177*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2178*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x56);
2179*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2180*795d594fSAndroid Build Coastguard Worker }
2181*795d594fSAndroid Build Coastguard Worker 
andn(Register dst,Register src1,Register src2)2182*795d594fSAndroid Build Coastguard Worker void X86Assembler::andn(Register dst, Register src1, Register src2) {
2183*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2184*795d594fSAndroid Build Coastguard Worker   uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
2185*795d594fSAndroid Build Coastguard Worker   uint8_t byte_one = EmitVexPrefixByteOne(/*R=*/ false,
2186*795d594fSAndroid Build Coastguard Worker                                           /*X=*/ false,
2187*795d594fSAndroid Build Coastguard Worker                                           /*B=*/ false,
2188*795d594fSAndroid Build Coastguard Worker                                           SET_VEX_M_0F_38);
2189*795d594fSAndroid Build Coastguard Worker   uint8_t byte_two = EmitVexPrefixByteTwo(/*W=*/ false,
2190*795d594fSAndroid Build Coastguard Worker                                           X86ManagedRegister::FromCpuRegister(src1),
2191*795d594fSAndroid Build Coastguard Worker                                           SET_VEX_L_128,
2192*795d594fSAndroid Build Coastguard Worker                                           SET_VEX_PP_NONE);
2193*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_zero);
2194*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_one);
2195*795d594fSAndroid Build Coastguard Worker   EmitUint8(byte_two);
2196*795d594fSAndroid Build Coastguard Worker   // Opcode field
2197*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
2198*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src2);
2199*795d594fSAndroid Build Coastguard Worker }
2200*795d594fSAndroid Build Coastguard Worker 
por(XmmRegister dst,XmmRegister src)2201*795d594fSAndroid Build Coastguard Worker void X86Assembler::por(XmmRegister dst, XmmRegister src) {
2202*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2203*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2204*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2205*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xEB);
2206*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2207*795d594fSAndroid Build Coastguard Worker }
2208*795d594fSAndroid Build Coastguard Worker 
2209*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F.WIG EB /r VPOR xmm1, xmm2, xmm3/m128 */
vpor(XmmRegister dst,XmmRegister src1,XmmRegister src2)2210*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpor(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2211*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2212*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2213*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2214*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2215*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2216*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2217*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2218*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2219*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2220*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2221*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
2222*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2223*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2224*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2225*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xEB);
2226*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2227*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2228*795d594fSAndroid Build Coastguard Worker }
2229*795d594fSAndroid Build Coastguard Worker 
2230*795d594fSAndroid Build Coastguard Worker /* VEX.128.0F 56 /r VORPS xmm1,xmm2, xmm3/m128 */
vorps(XmmRegister dst,XmmRegister src1,XmmRegister src2)2231*795d594fSAndroid Build Coastguard Worker void X86Assembler::vorps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2232*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2233*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2234*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2235*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2236*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2237*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2238*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2239*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2240*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2241*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2242*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_NONE);
2243*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2244*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2245*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2246*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x56);
2247*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2248*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2249*795d594fSAndroid Build Coastguard Worker }
2250*795d594fSAndroid Build Coastguard Worker 
2251*795d594fSAndroid Build Coastguard Worker /* VEX.128.66.0F 56 /r VORPD xmm1,xmm2, xmm3/m128 */
vorpd(XmmRegister dst,XmmRegister src1,XmmRegister src2)2252*795d594fSAndroid Build Coastguard Worker void X86Assembler::vorpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2253*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2254*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2255*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2256*795d594fSAndroid Build Coastguard Worker   /* Instruction VEX Prefix */
2257*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2258*795d594fSAndroid Build Coastguard Worker   /* REX prefix is necessary only if an instruction references one of extended
2259*795d594fSAndroid Build Coastguard Worker   registers or uses a 64-bit operand. */
2260*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2261*795d594fSAndroid Build Coastguard Worker                                  X86ManagedRegister::FromXmmRegister(src1),
2262*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_L_128,
2263*795d594fSAndroid Build Coastguard Worker                                  SET_VEX_PP_66);
2264*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2265*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2266*795d594fSAndroid Build Coastguard Worker   // Instruction Opcode
2267*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x56);
2268*795d594fSAndroid Build Coastguard Worker   // Instruction Operands
2269*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2270*795d594fSAndroid Build Coastguard Worker }
2271*795d594fSAndroid Build Coastguard Worker 
pavgb(XmmRegister dst,XmmRegister src)2272*795d594fSAndroid Build Coastguard Worker void X86Assembler::pavgb(XmmRegister dst, XmmRegister src) {
2273*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2274*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2275*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2276*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE0);
2277*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2278*795d594fSAndroid Build Coastguard Worker }
2279*795d594fSAndroid Build Coastguard Worker 
2280*795d594fSAndroid Build Coastguard Worker 
pavgw(XmmRegister dst,XmmRegister src)2281*795d594fSAndroid Build Coastguard Worker void X86Assembler::pavgw(XmmRegister dst, XmmRegister src) {
2282*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2283*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2284*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2285*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE3);
2286*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2287*795d594fSAndroid Build Coastguard Worker }
2288*795d594fSAndroid Build Coastguard Worker 
2289*795d594fSAndroid Build Coastguard Worker 
psadbw(XmmRegister dst,XmmRegister src)2290*795d594fSAndroid Build Coastguard Worker void X86Assembler::psadbw(XmmRegister dst, XmmRegister src) {
2291*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2292*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2293*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2294*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF6);
2295*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2296*795d594fSAndroid Build Coastguard Worker }
2297*795d594fSAndroid Build Coastguard Worker 
2298*795d594fSAndroid Build Coastguard Worker 
pmaddwd(XmmRegister dst,XmmRegister src)2299*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmaddwd(XmmRegister dst, XmmRegister src) {
2300*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2301*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2302*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2303*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF5);
2304*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2305*795d594fSAndroid Build Coastguard Worker }
2306*795d594fSAndroid Build Coastguard Worker 
2307*795d594fSAndroid Build Coastguard Worker 
vpmaddwd(XmmRegister dst,XmmRegister src1,XmmRegister src2)2308*795d594fSAndroid Build Coastguard Worker void X86Assembler::vpmaddwd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2309*795d594fSAndroid Build Coastguard Worker   DCHECK(CpuHasAVXorAVX2FeatureFlag());
2310*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2311*795d594fSAndroid Build Coastguard Worker   uint8_t ByteZero = 0x00, ByteOne = 0x00;
2312*795d594fSAndroid Build Coastguard Worker   ByteZero = EmitVexPrefixByteZero(/* is_twobyte_form=*/ true);
2313*795d594fSAndroid Build Coastguard Worker   X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(src1);
2314*795d594fSAndroid Build Coastguard Worker   ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
2315*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteZero);
2316*795d594fSAndroid Build Coastguard Worker   EmitUint8(ByteOne);
2317*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF5);
2318*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src2);
2319*795d594fSAndroid Build Coastguard Worker }
2320*795d594fSAndroid Build Coastguard Worker 
2321*795d594fSAndroid Build Coastguard Worker 
phaddw(XmmRegister dst,XmmRegister src)2322*795d594fSAndroid Build Coastguard Worker void X86Assembler::phaddw(XmmRegister dst, XmmRegister src) {
2323*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2324*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2325*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2326*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2327*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x01);
2328*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2329*795d594fSAndroid Build Coastguard Worker }
2330*795d594fSAndroid Build Coastguard Worker 
2331*795d594fSAndroid Build Coastguard Worker 
phaddd(XmmRegister dst,XmmRegister src)2332*795d594fSAndroid Build Coastguard Worker void X86Assembler::phaddd(XmmRegister dst, XmmRegister src) {
2333*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2334*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2335*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2336*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2337*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x02);
2338*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2339*795d594fSAndroid Build Coastguard Worker }
2340*795d594fSAndroid Build Coastguard Worker 
2341*795d594fSAndroid Build Coastguard Worker 
haddps(XmmRegister dst,XmmRegister src)2342*795d594fSAndroid Build Coastguard Worker void X86Assembler::haddps(XmmRegister dst, XmmRegister src) {
2343*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2344*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
2345*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2346*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7C);
2347*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2348*795d594fSAndroid Build Coastguard Worker }
2349*795d594fSAndroid Build Coastguard Worker 
2350*795d594fSAndroid Build Coastguard Worker 
haddpd(XmmRegister dst,XmmRegister src)2351*795d594fSAndroid Build Coastguard Worker void X86Assembler::haddpd(XmmRegister dst, XmmRegister src) {
2352*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2353*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2354*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2355*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7C);
2356*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2357*795d594fSAndroid Build Coastguard Worker }
2358*795d594fSAndroid Build Coastguard Worker 
2359*795d594fSAndroid Build Coastguard Worker 
phsubw(XmmRegister dst,XmmRegister src)2360*795d594fSAndroid Build Coastguard Worker void X86Assembler::phsubw(XmmRegister dst, XmmRegister src) {
2361*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2362*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2363*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2364*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2365*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x05);
2366*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2367*795d594fSAndroid Build Coastguard Worker }
2368*795d594fSAndroid Build Coastguard Worker 
2369*795d594fSAndroid Build Coastguard Worker 
phsubd(XmmRegister dst,XmmRegister src)2370*795d594fSAndroid Build Coastguard Worker void X86Assembler::phsubd(XmmRegister dst, XmmRegister src) {
2371*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2372*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2373*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2374*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2375*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x06);
2376*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2377*795d594fSAndroid Build Coastguard Worker }
2378*795d594fSAndroid Build Coastguard Worker 
2379*795d594fSAndroid Build Coastguard Worker 
hsubps(XmmRegister dst,XmmRegister src)2380*795d594fSAndroid Build Coastguard Worker void X86Assembler::hsubps(XmmRegister dst, XmmRegister src) {
2381*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2382*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
2383*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2384*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7D);
2385*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2386*795d594fSAndroid Build Coastguard Worker }
2387*795d594fSAndroid Build Coastguard Worker 
2388*795d594fSAndroid Build Coastguard Worker 
hsubpd(XmmRegister dst,XmmRegister src)2389*795d594fSAndroid Build Coastguard Worker void X86Assembler::hsubpd(XmmRegister dst, XmmRegister src) {
2390*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2391*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2392*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2393*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x7D);
2394*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2395*795d594fSAndroid Build Coastguard Worker }
2396*795d594fSAndroid Build Coastguard Worker 
2397*795d594fSAndroid Build Coastguard Worker 
pminsb(XmmRegister dst,XmmRegister src)2398*795d594fSAndroid Build Coastguard Worker void X86Assembler::pminsb(XmmRegister dst, XmmRegister src) {
2399*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2400*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2401*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2402*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2403*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2404*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2405*795d594fSAndroid Build Coastguard Worker }
2406*795d594fSAndroid Build Coastguard Worker 
pmaxsb(XmmRegister dst,XmmRegister src)2407*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmaxsb(XmmRegister dst, XmmRegister src) {
2408*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2409*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2410*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2411*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2412*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3C);
2413*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2414*795d594fSAndroid Build Coastguard Worker }
2415*795d594fSAndroid Build Coastguard Worker 
pminsw(XmmRegister dst,XmmRegister src)2416*795d594fSAndroid Build Coastguard Worker void X86Assembler::pminsw(XmmRegister dst, XmmRegister src) {
2417*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2418*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2419*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2420*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xEA);
2421*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2422*795d594fSAndroid Build Coastguard Worker }
2423*795d594fSAndroid Build Coastguard Worker 
pmaxsw(XmmRegister dst,XmmRegister src)2424*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmaxsw(XmmRegister dst, XmmRegister src) {
2425*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2426*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2427*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2428*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xEE);
2429*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2430*795d594fSAndroid Build Coastguard Worker }
2431*795d594fSAndroid Build Coastguard Worker 
pminsd(XmmRegister dst,XmmRegister src)2432*795d594fSAndroid Build Coastguard Worker void X86Assembler::pminsd(XmmRegister dst, XmmRegister src) {
2433*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2434*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2435*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2436*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2437*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x39);
2438*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2439*795d594fSAndroid Build Coastguard Worker }
2440*795d594fSAndroid Build Coastguard Worker 
pmaxsd(XmmRegister dst,XmmRegister src)2441*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmaxsd(XmmRegister dst, XmmRegister src) {
2442*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2443*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2444*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2445*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2446*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3D);
2447*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2448*795d594fSAndroid Build Coastguard Worker }
2449*795d594fSAndroid Build Coastguard Worker 
pminub(XmmRegister dst,XmmRegister src)2450*795d594fSAndroid Build Coastguard Worker void X86Assembler::pminub(XmmRegister dst, XmmRegister src) {
2451*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2452*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2453*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2454*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDA);
2455*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2456*795d594fSAndroid Build Coastguard Worker }
2457*795d594fSAndroid Build Coastguard Worker 
pmaxub(XmmRegister dst,XmmRegister src)2458*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmaxub(XmmRegister dst, XmmRegister src) {
2459*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2460*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2461*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2462*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDE);
2463*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2464*795d594fSAndroid Build Coastguard Worker }
2465*795d594fSAndroid Build Coastguard Worker 
pminuw(XmmRegister dst,XmmRegister src)2466*795d594fSAndroid Build Coastguard Worker void X86Assembler::pminuw(XmmRegister dst, XmmRegister src) {
2467*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2468*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2469*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2470*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2471*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3A);
2472*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2473*795d594fSAndroid Build Coastguard Worker }
2474*795d594fSAndroid Build Coastguard Worker 
pmaxuw(XmmRegister dst,XmmRegister src)2475*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmaxuw(XmmRegister dst, XmmRegister src) {
2476*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2477*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2478*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2479*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2480*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3E);
2481*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2482*795d594fSAndroid Build Coastguard Worker }
2483*795d594fSAndroid Build Coastguard Worker 
pminud(XmmRegister dst,XmmRegister src)2484*795d594fSAndroid Build Coastguard Worker void X86Assembler::pminud(XmmRegister dst, XmmRegister src) {
2485*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2486*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2487*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2488*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2489*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3B);
2490*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2491*795d594fSAndroid Build Coastguard Worker }
2492*795d594fSAndroid Build Coastguard Worker 
pmaxud(XmmRegister dst,XmmRegister src)2493*795d594fSAndroid Build Coastguard Worker void X86Assembler::pmaxud(XmmRegister dst, XmmRegister src) {
2494*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2495*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2496*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2497*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2498*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3F);
2499*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2500*795d594fSAndroid Build Coastguard Worker }
2501*795d594fSAndroid Build Coastguard Worker 
minps(XmmRegister dst,XmmRegister src)2502*795d594fSAndroid Build Coastguard Worker void X86Assembler::minps(XmmRegister dst, XmmRegister src) {
2503*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2504*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2505*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5D);
2506*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2507*795d594fSAndroid Build Coastguard Worker }
2508*795d594fSAndroid Build Coastguard Worker 
maxps(XmmRegister dst,XmmRegister src)2509*795d594fSAndroid Build Coastguard Worker void X86Assembler::maxps(XmmRegister dst, XmmRegister src) {
2510*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2511*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2512*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5F);
2513*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2514*795d594fSAndroid Build Coastguard Worker }
2515*795d594fSAndroid Build Coastguard Worker 
minpd(XmmRegister dst,XmmRegister src)2516*795d594fSAndroid Build Coastguard Worker void X86Assembler::minpd(XmmRegister dst, XmmRegister src) {
2517*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2518*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2519*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2520*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5D);
2521*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2522*795d594fSAndroid Build Coastguard Worker }
2523*795d594fSAndroid Build Coastguard Worker 
maxpd(XmmRegister dst,XmmRegister src)2524*795d594fSAndroid Build Coastguard Worker void X86Assembler::maxpd(XmmRegister dst, XmmRegister src) {
2525*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2526*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2527*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2528*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x5F);
2529*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2530*795d594fSAndroid Build Coastguard Worker }
2531*795d594fSAndroid Build Coastguard Worker 
pcmpeqb(XmmRegister dst,XmmRegister src)2532*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) {
2533*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2534*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2535*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2536*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x74);
2537*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2538*795d594fSAndroid Build Coastguard Worker }
2539*795d594fSAndroid Build Coastguard Worker 
2540*795d594fSAndroid Build Coastguard Worker 
pcmpeqw(XmmRegister dst,XmmRegister src)2541*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) {
2542*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2543*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2544*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2545*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x75);
2546*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2547*795d594fSAndroid Build Coastguard Worker }
2548*795d594fSAndroid Build Coastguard Worker 
2549*795d594fSAndroid Build Coastguard Worker 
pcmpeqd(XmmRegister dst,XmmRegister src)2550*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) {
2551*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2552*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2553*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2554*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x76);
2555*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2556*795d594fSAndroid Build Coastguard Worker }
2557*795d594fSAndroid Build Coastguard Worker 
2558*795d594fSAndroid Build Coastguard Worker 
pcmpeqq(XmmRegister dst,XmmRegister src)2559*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) {
2560*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2561*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2562*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2563*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2564*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x29);
2565*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2566*795d594fSAndroid Build Coastguard Worker }
2567*795d594fSAndroid Build Coastguard Worker 
2568*795d594fSAndroid Build Coastguard Worker 
pcmpgtb(XmmRegister dst,XmmRegister src)2569*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpgtb(XmmRegister dst, XmmRegister src) {
2570*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2571*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2572*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2573*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x64);
2574*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2575*795d594fSAndroid Build Coastguard Worker }
2576*795d594fSAndroid Build Coastguard Worker 
2577*795d594fSAndroid Build Coastguard Worker 
pcmpgtw(XmmRegister dst,XmmRegister src)2578*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpgtw(XmmRegister dst, XmmRegister src) {
2579*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2580*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2581*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2582*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x65);
2583*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2584*795d594fSAndroid Build Coastguard Worker }
2585*795d594fSAndroid Build Coastguard Worker 
2586*795d594fSAndroid Build Coastguard Worker 
pcmpgtd(XmmRegister dst,XmmRegister src)2587*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpgtd(XmmRegister dst, XmmRegister src) {
2588*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2589*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2590*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2591*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2592*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2593*795d594fSAndroid Build Coastguard Worker }
2594*795d594fSAndroid Build Coastguard Worker 
2595*795d594fSAndroid Build Coastguard Worker 
pcmpgtq(XmmRegister dst,XmmRegister src)2596*795d594fSAndroid Build Coastguard Worker void X86Assembler::pcmpgtq(XmmRegister dst, XmmRegister src) {
2597*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2598*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2599*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2600*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x38);
2601*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x37);
2602*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2603*795d594fSAndroid Build Coastguard Worker }
2604*795d594fSAndroid Build Coastguard Worker 
2605*795d594fSAndroid Build Coastguard Worker 
shufpd(XmmRegister dst,XmmRegister src,const Immediate & imm)2606*795d594fSAndroid Build Coastguard Worker void X86Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2607*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2608*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2609*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2610*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC6);
2611*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2612*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value());
2613*795d594fSAndroid Build Coastguard Worker }
2614*795d594fSAndroid Build Coastguard Worker 
2615*795d594fSAndroid Build Coastguard Worker 
shufps(XmmRegister dst,XmmRegister src,const Immediate & imm)2616*795d594fSAndroid Build Coastguard Worker void X86Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2617*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2618*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2619*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC6);
2620*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2621*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value());
2622*795d594fSAndroid Build Coastguard Worker }
2623*795d594fSAndroid Build Coastguard Worker 
2624*795d594fSAndroid Build Coastguard Worker 
pshufd(XmmRegister dst,XmmRegister src,const Immediate & imm)2625*795d594fSAndroid Build Coastguard Worker void X86Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2626*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2627*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2628*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2629*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x70);
2630*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2631*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value());
2632*795d594fSAndroid Build Coastguard Worker }
2633*795d594fSAndroid Build Coastguard Worker 
2634*795d594fSAndroid Build Coastguard Worker 
punpcklbw(XmmRegister dst,XmmRegister src)2635*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpcklbw(XmmRegister dst, XmmRegister src) {
2636*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2637*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2638*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2639*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x60);
2640*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2641*795d594fSAndroid Build Coastguard Worker }
2642*795d594fSAndroid Build Coastguard Worker 
2643*795d594fSAndroid Build Coastguard Worker 
punpcklwd(XmmRegister dst,XmmRegister src)2644*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpcklwd(XmmRegister dst, XmmRegister src) {
2645*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2646*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2647*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2648*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x61);
2649*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2650*795d594fSAndroid Build Coastguard Worker }
2651*795d594fSAndroid Build Coastguard Worker 
2652*795d594fSAndroid Build Coastguard Worker 
punpckldq(XmmRegister dst,XmmRegister src)2653*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) {
2654*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2655*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2656*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2657*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x62);
2658*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2659*795d594fSAndroid Build Coastguard Worker }
2660*795d594fSAndroid Build Coastguard Worker 
2661*795d594fSAndroid Build Coastguard Worker 
punpcklqdq(XmmRegister dst,XmmRegister src)2662*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) {
2663*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2664*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2665*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2666*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6C);
2667*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2668*795d594fSAndroid Build Coastguard Worker }
2669*795d594fSAndroid Build Coastguard Worker 
2670*795d594fSAndroid Build Coastguard Worker 
punpckhbw(XmmRegister dst,XmmRegister src)2671*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpckhbw(XmmRegister dst, XmmRegister src) {
2672*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2673*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2674*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2675*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x68);
2676*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2677*795d594fSAndroid Build Coastguard Worker }
2678*795d594fSAndroid Build Coastguard Worker 
2679*795d594fSAndroid Build Coastguard Worker 
punpckhwd(XmmRegister dst,XmmRegister src)2680*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpckhwd(XmmRegister dst, XmmRegister src) {
2681*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2682*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2683*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2684*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x69);
2685*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2686*795d594fSAndroid Build Coastguard Worker }
2687*795d594fSAndroid Build Coastguard Worker 
2688*795d594fSAndroid Build Coastguard Worker 
punpckhdq(XmmRegister dst,XmmRegister src)2689*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpckhdq(XmmRegister dst, XmmRegister src) {
2690*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2691*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2692*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2693*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6A);
2694*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2695*795d594fSAndroid Build Coastguard Worker }
2696*795d594fSAndroid Build Coastguard Worker 
2697*795d594fSAndroid Build Coastguard Worker 
punpckhqdq(XmmRegister dst,XmmRegister src)2698*795d594fSAndroid Build Coastguard Worker void X86Assembler::punpckhqdq(XmmRegister dst, XmmRegister src) {
2699*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2700*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2701*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2702*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x6D);
2703*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(dst, src);
2704*795d594fSAndroid Build Coastguard Worker }
2705*795d594fSAndroid Build Coastguard Worker 
2706*795d594fSAndroid Build Coastguard Worker 
psllw(XmmRegister reg,const Immediate & shift_count)2707*795d594fSAndroid Build Coastguard Worker void X86Assembler::psllw(XmmRegister reg, const Immediate& shift_count) {
2708*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2709*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2710*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2711*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2712*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x71);
2713*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(6, reg);
2714*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2715*795d594fSAndroid Build Coastguard Worker }
2716*795d594fSAndroid Build Coastguard Worker 
2717*795d594fSAndroid Build Coastguard Worker 
pslld(XmmRegister reg,const Immediate & shift_count)2718*795d594fSAndroid Build Coastguard Worker void X86Assembler::pslld(XmmRegister reg, const Immediate& shift_count) {
2719*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2720*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2721*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2722*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2723*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x72);
2724*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(6, reg);
2725*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2726*795d594fSAndroid Build Coastguard Worker }
2727*795d594fSAndroid Build Coastguard Worker 
2728*795d594fSAndroid Build Coastguard Worker 
psllq(XmmRegister reg,const Immediate & shift_count)2729*795d594fSAndroid Build Coastguard Worker void X86Assembler::psllq(XmmRegister reg, const Immediate& shift_count) {
2730*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2731*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2732*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2733*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2734*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x73);
2735*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(6, reg);
2736*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2737*795d594fSAndroid Build Coastguard Worker }
2738*795d594fSAndroid Build Coastguard Worker 
2739*795d594fSAndroid Build Coastguard Worker 
psraw(XmmRegister reg,const Immediate & shift_count)2740*795d594fSAndroid Build Coastguard Worker void X86Assembler::psraw(XmmRegister reg, const Immediate& shift_count) {
2741*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2742*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2743*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2744*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2745*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x71);
2746*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(4, reg);
2747*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2748*795d594fSAndroid Build Coastguard Worker }
2749*795d594fSAndroid Build Coastguard Worker 
2750*795d594fSAndroid Build Coastguard Worker 
psrad(XmmRegister reg,const Immediate & shift_count)2751*795d594fSAndroid Build Coastguard Worker void X86Assembler::psrad(XmmRegister reg, const Immediate& shift_count) {
2752*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2753*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2754*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2755*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2756*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x72);
2757*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(4, reg);
2758*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2759*795d594fSAndroid Build Coastguard Worker }
2760*795d594fSAndroid Build Coastguard Worker 
2761*795d594fSAndroid Build Coastguard Worker 
psrlw(XmmRegister reg,const Immediate & shift_count)2762*795d594fSAndroid Build Coastguard Worker void X86Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) {
2763*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2764*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2765*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2766*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2767*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x71);
2768*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(2, reg);
2769*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2770*795d594fSAndroid Build Coastguard Worker }
2771*795d594fSAndroid Build Coastguard Worker 
2772*795d594fSAndroid Build Coastguard Worker 
psrld(XmmRegister reg,const Immediate & shift_count)2773*795d594fSAndroid Build Coastguard Worker void X86Assembler::psrld(XmmRegister reg, const Immediate& shift_count) {
2774*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2775*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2776*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2777*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2778*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x72);
2779*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(2, reg);
2780*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2781*795d594fSAndroid Build Coastguard Worker }
2782*795d594fSAndroid Build Coastguard Worker 
2783*795d594fSAndroid Build Coastguard Worker 
psrlq(XmmRegister reg,const Immediate & shift_count)2784*795d594fSAndroid Build Coastguard Worker void X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) {
2785*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2786*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2787*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2788*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2789*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x73);
2790*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(2, reg);
2791*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2792*795d594fSAndroid Build Coastguard Worker }
2793*795d594fSAndroid Build Coastguard Worker 
2794*795d594fSAndroid Build Coastguard Worker 
psrldq(XmmRegister reg,const Immediate & shift_count)2795*795d594fSAndroid Build Coastguard Worker void X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) {
2796*795d594fSAndroid Build Coastguard Worker   DCHECK(shift_count.is_uint8());
2797*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2798*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
2799*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
2800*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x73);
2801*795d594fSAndroid Build Coastguard Worker   EmitXmmRegisterOperand(3, reg);
2802*795d594fSAndroid Build Coastguard Worker   EmitUint8(shift_count.value());
2803*795d594fSAndroid Build Coastguard Worker }
2804*795d594fSAndroid Build Coastguard Worker 
2805*795d594fSAndroid Build Coastguard Worker 
fldl(const Address & src)2806*795d594fSAndroid Build Coastguard Worker void X86Assembler::fldl(const Address& src) {
2807*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2808*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDD);
2809*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, src);
2810*795d594fSAndroid Build Coastguard Worker }
2811*795d594fSAndroid Build Coastguard Worker 
2812*795d594fSAndroid Build Coastguard Worker 
fstl(const Address & dst)2813*795d594fSAndroid Build Coastguard Worker void X86Assembler::fstl(const Address& dst) {
2814*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2815*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDD);
2816*795d594fSAndroid Build Coastguard Worker   EmitOperand(2, dst);
2817*795d594fSAndroid Build Coastguard Worker }
2818*795d594fSAndroid Build Coastguard Worker 
2819*795d594fSAndroid Build Coastguard Worker 
fstpl(const Address & dst)2820*795d594fSAndroid Build Coastguard Worker void X86Assembler::fstpl(const Address& dst) {
2821*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2822*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDD);
2823*795d594fSAndroid Build Coastguard Worker   EmitOperand(3, dst);
2824*795d594fSAndroid Build Coastguard Worker }
2825*795d594fSAndroid Build Coastguard Worker 
2826*795d594fSAndroid Build Coastguard Worker 
fstsw()2827*795d594fSAndroid Build Coastguard Worker void X86Assembler::fstsw() {
2828*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2829*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x9B);
2830*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDF);
2831*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE0);
2832*795d594fSAndroid Build Coastguard Worker }
2833*795d594fSAndroid Build Coastguard Worker 
2834*795d594fSAndroid Build Coastguard Worker 
fnstcw(const Address & dst)2835*795d594fSAndroid Build Coastguard Worker void X86Assembler::fnstcw(const Address& dst) {
2836*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2837*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
2838*795d594fSAndroid Build Coastguard Worker   EmitOperand(7, dst);
2839*795d594fSAndroid Build Coastguard Worker }
2840*795d594fSAndroid Build Coastguard Worker 
2841*795d594fSAndroid Build Coastguard Worker 
fldcw(const Address & src)2842*795d594fSAndroid Build Coastguard Worker void X86Assembler::fldcw(const Address& src) {
2843*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2844*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
2845*795d594fSAndroid Build Coastguard Worker   EmitOperand(5, src);
2846*795d594fSAndroid Build Coastguard Worker }
2847*795d594fSAndroid Build Coastguard Worker 
2848*795d594fSAndroid Build Coastguard Worker 
fistpl(const Address & dst)2849*795d594fSAndroid Build Coastguard Worker void X86Assembler::fistpl(const Address& dst) {
2850*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2851*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDF);
2852*795d594fSAndroid Build Coastguard Worker   EmitOperand(7, dst);
2853*795d594fSAndroid Build Coastguard Worker }
2854*795d594fSAndroid Build Coastguard Worker 
2855*795d594fSAndroid Build Coastguard Worker 
fistps(const Address & dst)2856*795d594fSAndroid Build Coastguard Worker void X86Assembler::fistps(const Address& dst) {
2857*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2858*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDB);
2859*795d594fSAndroid Build Coastguard Worker   EmitOperand(3, dst);
2860*795d594fSAndroid Build Coastguard Worker }
2861*795d594fSAndroid Build Coastguard Worker 
2862*795d594fSAndroid Build Coastguard Worker 
fildl(const Address & src)2863*795d594fSAndroid Build Coastguard Worker void X86Assembler::fildl(const Address& src) {
2864*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2865*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDF);
2866*795d594fSAndroid Build Coastguard Worker   EmitOperand(5, src);
2867*795d594fSAndroid Build Coastguard Worker }
2868*795d594fSAndroid Build Coastguard Worker 
2869*795d594fSAndroid Build Coastguard Worker 
filds(const Address & src)2870*795d594fSAndroid Build Coastguard Worker void X86Assembler::filds(const Address& src) {
2871*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2872*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDB);
2873*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, src);
2874*795d594fSAndroid Build Coastguard Worker }
2875*795d594fSAndroid Build Coastguard Worker 
2876*795d594fSAndroid Build Coastguard Worker 
fincstp()2877*795d594fSAndroid Build Coastguard Worker void X86Assembler::fincstp() {
2878*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2879*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
2880*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
2881*795d594fSAndroid Build Coastguard Worker }
2882*795d594fSAndroid Build Coastguard Worker 
2883*795d594fSAndroid Build Coastguard Worker 
ffree(const Immediate & index)2884*795d594fSAndroid Build Coastguard Worker void X86Assembler::ffree(const Immediate& index) {
2885*795d594fSAndroid Build Coastguard Worker   CHECK_LT(index.value(), 7);
2886*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2887*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDD);
2888*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC0 + index.value());
2889*795d594fSAndroid Build Coastguard Worker }
2890*795d594fSAndroid Build Coastguard Worker 
2891*795d594fSAndroid Build Coastguard Worker 
fsin()2892*795d594fSAndroid Build Coastguard Worker void X86Assembler::fsin() {
2893*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2894*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
2895*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFE);
2896*795d594fSAndroid Build Coastguard Worker }
2897*795d594fSAndroid Build Coastguard Worker 
2898*795d594fSAndroid Build Coastguard Worker 
fcos()2899*795d594fSAndroid Build Coastguard Worker void X86Assembler::fcos() {
2900*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2901*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
2902*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
2903*795d594fSAndroid Build Coastguard Worker }
2904*795d594fSAndroid Build Coastguard Worker 
2905*795d594fSAndroid Build Coastguard Worker 
fptan()2906*795d594fSAndroid Build Coastguard Worker void X86Assembler::fptan() {
2907*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2908*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
2909*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
2910*795d594fSAndroid Build Coastguard Worker }
2911*795d594fSAndroid Build Coastguard Worker 
2912*795d594fSAndroid Build Coastguard Worker 
fucompp()2913*795d594fSAndroid Build Coastguard Worker void X86Assembler::fucompp() {
2914*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2915*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xDA);
2916*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xE9);
2917*795d594fSAndroid Build Coastguard Worker }
2918*795d594fSAndroid Build Coastguard Worker 
2919*795d594fSAndroid Build Coastguard Worker 
fprem()2920*795d594fSAndroid Build Coastguard Worker void X86Assembler::fprem() {
2921*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2922*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD9);
2923*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF8);
2924*795d594fSAndroid Build Coastguard Worker }
2925*795d594fSAndroid Build Coastguard Worker 
2926*795d594fSAndroid Build Coastguard Worker 
try_xchg_eax(Register dst,Register src)2927*795d594fSAndroid Build Coastguard Worker bool X86Assembler::try_xchg_eax(Register dst, Register src) {
2928*795d594fSAndroid Build Coastguard Worker   if (src != EAX && dst != EAX) {
2929*795d594fSAndroid Build Coastguard Worker     return false;
2930*795d594fSAndroid Build Coastguard Worker   }
2931*795d594fSAndroid Build Coastguard Worker   if (dst == EAX) {
2932*795d594fSAndroid Build Coastguard Worker     std::swap(src, dst);
2933*795d594fSAndroid Build Coastguard Worker   }
2934*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x90 + dst);
2935*795d594fSAndroid Build Coastguard Worker   return true;
2936*795d594fSAndroid Build Coastguard Worker }
2937*795d594fSAndroid Build Coastguard Worker 
2938*795d594fSAndroid Build Coastguard Worker 
xchgb(ByteRegister dst,ByteRegister src)2939*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgb(ByteRegister dst, ByteRegister src) {
2940*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2941*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x86);
2942*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
2943*795d594fSAndroid Build Coastguard Worker }
2944*795d594fSAndroid Build Coastguard Worker 
2945*795d594fSAndroid Build Coastguard Worker 
xchgb(ByteRegister reg,const Address & address)2946*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgb(ByteRegister reg, const Address& address) {
2947*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2948*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x86);
2949*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
2950*795d594fSAndroid Build Coastguard Worker }
2951*795d594fSAndroid Build Coastguard Worker 
2952*795d594fSAndroid Build Coastguard Worker 
xchgb(Register dst,Register src)2953*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgb(Register dst, Register src) {
2954*795d594fSAndroid Build Coastguard Worker   xchgb(static_cast<ByteRegister>(dst), static_cast<ByteRegister>(src));
2955*795d594fSAndroid Build Coastguard Worker }
2956*795d594fSAndroid Build Coastguard Worker 
2957*795d594fSAndroid Build Coastguard Worker 
xchgb(Register reg,const Address & address)2958*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgb(Register reg, const Address& address) {
2959*795d594fSAndroid Build Coastguard Worker   xchgb(static_cast<ByteRegister>(reg), address);
2960*795d594fSAndroid Build Coastguard Worker }
2961*795d594fSAndroid Build Coastguard Worker 
2962*795d594fSAndroid Build Coastguard Worker 
xchgw(Register dst,Register src)2963*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgw(Register dst, Register src) {
2964*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2965*795d594fSAndroid Build Coastguard Worker   EmitOperandSizeOverride();
2966*795d594fSAndroid Build Coastguard Worker   if (try_xchg_eax(dst, src)) {
2967*795d594fSAndroid Build Coastguard Worker     // A short version for AX.
2968*795d594fSAndroid Build Coastguard Worker     return;
2969*795d594fSAndroid Build Coastguard Worker   }
2970*795d594fSAndroid Build Coastguard Worker   // General case.
2971*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x87);
2972*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
2973*795d594fSAndroid Build Coastguard Worker }
2974*795d594fSAndroid Build Coastguard Worker 
2975*795d594fSAndroid Build Coastguard Worker 
xchgw(Register reg,const Address & address)2976*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgw(Register reg, const Address& address) {
2977*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2978*795d594fSAndroid Build Coastguard Worker   EmitOperandSizeOverride();
2979*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x87);
2980*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
2981*795d594fSAndroid Build Coastguard Worker }
2982*795d594fSAndroid Build Coastguard Worker 
2983*795d594fSAndroid Build Coastguard Worker 
xchgl(Register dst,Register src)2984*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgl(Register dst, Register src) {
2985*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2986*795d594fSAndroid Build Coastguard Worker   if (try_xchg_eax(dst, src)) {
2987*795d594fSAndroid Build Coastguard Worker     // A short version for EAX.
2988*795d594fSAndroid Build Coastguard Worker     return;
2989*795d594fSAndroid Build Coastguard Worker   }
2990*795d594fSAndroid Build Coastguard Worker   // General case.
2991*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x87);
2992*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
2993*795d594fSAndroid Build Coastguard Worker }
2994*795d594fSAndroid Build Coastguard Worker 
2995*795d594fSAndroid Build Coastguard Worker 
xchgl(Register reg,const Address & address)2996*795d594fSAndroid Build Coastguard Worker void X86Assembler::xchgl(Register reg, const Address& address) {
2997*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2998*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x87);
2999*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3000*795d594fSAndroid Build Coastguard Worker }
3001*795d594fSAndroid Build Coastguard Worker 
3002*795d594fSAndroid Build Coastguard Worker 
cmpb(const Address & address,const Immediate & imm)3003*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpb(const Address& address, const Immediate& imm) {
3004*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3005*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x80);
3006*795d594fSAndroid Build Coastguard Worker   EmitOperand(7, address);
3007*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
3008*795d594fSAndroid Build Coastguard Worker }
3009*795d594fSAndroid Build Coastguard Worker 
3010*795d594fSAndroid Build Coastguard Worker 
cmpw(const Address & address,const Immediate & imm)3011*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpw(const Address& address, const Immediate& imm) {
3012*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3013*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
3014*795d594fSAndroid Build Coastguard Worker   EmitComplex(7, address, imm, /* is_16_op= */ true);
3015*795d594fSAndroid Build Coastguard Worker }
3016*795d594fSAndroid Build Coastguard Worker 
3017*795d594fSAndroid Build Coastguard Worker 
cmpl(Register reg,const Immediate & imm)3018*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpl(Register reg, const Immediate& imm) {
3019*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3020*795d594fSAndroid Build Coastguard Worker   EmitComplex(7, Operand(reg), imm);
3021*795d594fSAndroid Build Coastguard Worker }
3022*795d594fSAndroid Build Coastguard Worker 
3023*795d594fSAndroid Build Coastguard Worker 
cmpl(Register reg0,Register reg1)3024*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpl(Register reg0, Register reg1) {
3025*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3026*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3B);
3027*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg0, Operand(reg1));
3028*795d594fSAndroid Build Coastguard Worker }
3029*795d594fSAndroid Build Coastguard Worker 
3030*795d594fSAndroid Build Coastguard Worker 
cmpl(Register reg,const Address & address)3031*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpl(Register reg, const Address& address) {
3032*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3033*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x3B);
3034*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3035*795d594fSAndroid Build Coastguard Worker }
3036*795d594fSAndroid Build Coastguard Worker 
3037*795d594fSAndroid Build Coastguard Worker 
addl(Register dst,Register src)3038*795d594fSAndroid Build Coastguard Worker void X86Assembler::addl(Register dst, Register src) {
3039*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3040*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x03);
3041*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(dst, src);
3042*795d594fSAndroid Build Coastguard Worker }
3043*795d594fSAndroid Build Coastguard Worker 
3044*795d594fSAndroid Build Coastguard Worker 
addl(Register reg,const Address & address)3045*795d594fSAndroid Build Coastguard Worker void X86Assembler::addl(Register reg, const Address& address) {
3046*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3047*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x03);
3048*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3049*795d594fSAndroid Build Coastguard Worker }
3050*795d594fSAndroid Build Coastguard Worker 
3051*795d594fSAndroid Build Coastguard Worker 
cmpl(const Address & address,Register reg)3052*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpl(const Address& address, Register reg) {
3053*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3054*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x39);
3055*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3056*795d594fSAndroid Build Coastguard Worker }
3057*795d594fSAndroid Build Coastguard Worker 
3058*795d594fSAndroid Build Coastguard Worker 
cmpl(const Address & address,const Immediate & imm)3059*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpl(const Address& address, const Immediate& imm) {
3060*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3061*795d594fSAndroid Build Coastguard Worker   EmitComplex(7, address, imm);
3062*795d594fSAndroid Build Coastguard Worker }
3063*795d594fSAndroid Build Coastguard Worker 
3064*795d594fSAndroid Build Coastguard Worker 
testl(Register reg1,Register reg2)3065*795d594fSAndroid Build Coastguard Worker void X86Assembler::testl(Register reg1, Register reg2) {
3066*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3067*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x85);
3068*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(reg1, reg2);
3069*795d594fSAndroid Build Coastguard Worker }
3070*795d594fSAndroid Build Coastguard Worker 
3071*795d594fSAndroid Build Coastguard Worker 
testl(Register reg,const Address & address)3072*795d594fSAndroid Build Coastguard Worker void X86Assembler::testl(Register reg, const Address& address) {
3073*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3074*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x85);
3075*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3076*795d594fSAndroid Build Coastguard Worker }
3077*795d594fSAndroid Build Coastguard Worker 
3078*795d594fSAndroid Build Coastguard Worker 
testl(Register reg,const Immediate & immediate)3079*795d594fSAndroid Build Coastguard Worker void X86Assembler::testl(Register reg, const Immediate& immediate) {
3080*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3081*795d594fSAndroid Build Coastguard Worker   // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
3082*795d594fSAndroid Build Coastguard Worker   // we only test the byte register to keep the encoding short.
3083*795d594fSAndroid Build Coastguard Worker   if (immediate.is_uint8() && reg < 4) {
3084*795d594fSAndroid Build Coastguard Worker     // Use zero-extended 8-bit immediate.
3085*795d594fSAndroid Build Coastguard Worker     if (reg == EAX) {
3086*795d594fSAndroid Build Coastguard Worker       EmitUint8(0xA8);
3087*795d594fSAndroid Build Coastguard Worker     } else {
3088*795d594fSAndroid Build Coastguard Worker       EmitUint8(0xF6);
3089*795d594fSAndroid Build Coastguard Worker       EmitUint8(0xC0 + reg);
3090*795d594fSAndroid Build Coastguard Worker     }
3091*795d594fSAndroid Build Coastguard Worker     EmitUint8(immediate.value() & 0xFF);
3092*795d594fSAndroid Build Coastguard Worker   } else if (reg == EAX) {
3093*795d594fSAndroid Build Coastguard Worker     // Use short form if the destination is EAX.
3094*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xA9);
3095*795d594fSAndroid Build Coastguard Worker     EmitImmediate(immediate);
3096*795d594fSAndroid Build Coastguard Worker   } else {
3097*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xF7);
3098*795d594fSAndroid Build Coastguard Worker     EmitOperand(0, Operand(reg));
3099*795d594fSAndroid Build Coastguard Worker     EmitImmediate(immediate);
3100*795d594fSAndroid Build Coastguard Worker   }
3101*795d594fSAndroid Build Coastguard Worker }
3102*795d594fSAndroid Build Coastguard Worker 
3103*795d594fSAndroid Build Coastguard Worker 
testb(const Address & dst,const Immediate & imm)3104*795d594fSAndroid Build Coastguard Worker void X86Assembler::testb(const Address& dst, const Immediate& imm) {
3105*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3106*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF6);
3107*795d594fSAndroid Build Coastguard Worker   EmitOperand(EAX, dst);
3108*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_int8());
3109*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
3110*795d594fSAndroid Build Coastguard Worker }
3111*795d594fSAndroid Build Coastguard Worker 
3112*795d594fSAndroid Build Coastguard Worker 
testl(const Address & dst,const Immediate & imm)3113*795d594fSAndroid Build Coastguard Worker void X86Assembler::testl(const Address& dst, const Immediate& imm) {
3114*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3115*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3116*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, dst);
3117*795d594fSAndroid Build Coastguard Worker   EmitImmediate(imm);
3118*795d594fSAndroid Build Coastguard Worker }
3119*795d594fSAndroid Build Coastguard Worker 
3120*795d594fSAndroid Build Coastguard Worker 
andl(Register dst,Register src)3121*795d594fSAndroid Build Coastguard Worker void X86Assembler::andl(Register dst, Register src) {
3122*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3123*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x23);
3124*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
3125*795d594fSAndroid Build Coastguard Worker }
3126*795d594fSAndroid Build Coastguard Worker 
3127*795d594fSAndroid Build Coastguard Worker 
andl(Register reg,const Address & address)3128*795d594fSAndroid Build Coastguard Worker void X86Assembler::andl(Register reg, const Address& address) {
3129*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3130*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x23);
3131*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3132*795d594fSAndroid Build Coastguard Worker }
3133*795d594fSAndroid Build Coastguard Worker 
3134*795d594fSAndroid Build Coastguard Worker 
andl(Register dst,const Immediate & imm)3135*795d594fSAndroid Build Coastguard Worker void X86Assembler::andl(Register dst, const Immediate& imm) {
3136*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3137*795d594fSAndroid Build Coastguard Worker   EmitComplex(4, Operand(dst), imm);
3138*795d594fSAndroid Build Coastguard Worker }
3139*795d594fSAndroid Build Coastguard Worker 
3140*795d594fSAndroid Build Coastguard Worker 
andw(const Address & address,const Immediate & imm)3141*795d594fSAndroid Build Coastguard Worker void X86Assembler::andw(const Address& address, const Immediate& imm) {
3142*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3143*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_uint16() || imm.is_int16()) << imm.value();
3144*795d594fSAndroid Build Coastguard Worker   EmitOperandSizeOverride();
3145*795d594fSAndroid Build Coastguard Worker   EmitComplex(4, address, imm, /* is_16_op= */ true);
3146*795d594fSAndroid Build Coastguard Worker }
3147*795d594fSAndroid Build Coastguard Worker 
3148*795d594fSAndroid Build Coastguard Worker 
orl(Register dst,Register src)3149*795d594fSAndroid Build Coastguard Worker void X86Assembler::orl(Register dst, Register src) {
3150*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3151*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0B);
3152*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
3153*795d594fSAndroid Build Coastguard Worker }
3154*795d594fSAndroid Build Coastguard Worker 
3155*795d594fSAndroid Build Coastguard Worker 
orl(Register reg,const Address & address)3156*795d594fSAndroid Build Coastguard Worker void X86Assembler::orl(Register reg, const Address& address) {
3157*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3158*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0B);
3159*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3160*795d594fSAndroid Build Coastguard Worker }
3161*795d594fSAndroid Build Coastguard Worker 
3162*795d594fSAndroid Build Coastguard Worker 
orl(Register dst,const Immediate & imm)3163*795d594fSAndroid Build Coastguard Worker void X86Assembler::orl(Register dst, const Immediate& imm) {
3164*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3165*795d594fSAndroid Build Coastguard Worker   EmitComplex(1, Operand(dst), imm);
3166*795d594fSAndroid Build Coastguard Worker }
3167*795d594fSAndroid Build Coastguard Worker 
3168*795d594fSAndroid Build Coastguard Worker 
xorl(Register dst,Register src)3169*795d594fSAndroid Build Coastguard Worker void X86Assembler::xorl(Register dst, Register src) {
3170*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3171*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x33);
3172*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
3173*795d594fSAndroid Build Coastguard Worker }
3174*795d594fSAndroid Build Coastguard Worker 
3175*795d594fSAndroid Build Coastguard Worker 
xorl(Register reg,const Address & address)3176*795d594fSAndroid Build Coastguard Worker void X86Assembler::xorl(Register reg, const Address& address) {
3177*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3178*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x33);
3179*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3180*795d594fSAndroid Build Coastguard Worker }
3181*795d594fSAndroid Build Coastguard Worker 
3182*795d594fSAndroid Build Coastguard Worker 
xorl(Register dst,const Immediate & imm)3183*795d594fSAndroid Build Coastguard Worker void X86Assembler::xorl(Register dst, const Immediate& imm) {
3184*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3185*795d594fSAndroid Build Coastguard Worker   EmitComplex(6, Operand(dst), imm);
3186*795d594fSAndroid Build Coastguard Worker }
3187*795d594fSAndroid Build Coastguard Worker 
3188*795d594fSAndroid Build Coastguard Worker 
addl(Register reg,const Immediate & imm)3189*795d594fSAndroid Build Coastguard Worker void X86Assembler::addl(Register reg, const Immediate& imm) {
3190*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3191*795d594fSAndroid Build Coastguard Worker   EmitComplex(0, Operand(reg), imm);
3192*795d594fSAndroid Build Coastguard Worker }
3193*795d594fSAndroid Build Coastguard Worker 
3194*795d594fSAndroid Build Coastguard Worker 
addl(const Address & address,Register reg)3195*795d594fSAndroid Build Coastguard Worker void X86Assembler::addl(const Address& address, Register reg) {
3196*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3197*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x01);
3198*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3199*795d594fSAndroid Build Coastguard Worker }
3200*795d594fSAndroid Build Coastguard Worker 
3201*795d594fSAndroid Build Coastguard Worker 
addl(const Address & address,const Immediate & imm)3202*795d594fSAndroid Build Coastguard Worker void X86Assembler::addl(const Address& address, const Immediate& imm) {
3203*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3204*795d594fSAndroid Build Coastguard Worker   EmitComplex(0, address, imm);
3205*795d594fSAndroid Build Coastguard Worker }
3206*795d594fSAndroid Build Coastguard Worker 
3207*795d594fSAndroid Build Coastguard Worker 
addw(const Address & address,const Immediate & imm)3208*795d594fSAndroid Build Coastguard Worker void X86Assembler::addw(const Address& address, const Immediate& imm) {
3209*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3210*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_uint16() || imm.is_int16()) << imm.value();
3211*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
3212*795d594fSAndroid Build Coastguard Worker   EmitComplex(0, address, imm, /* is_16_op= */ true);
3213*795d594fSAndroid Build Coastguard Worker }
3214*795d594fSAndroid Build Coastguard Worker 
3215*795d594fSAndroid Build Coastguard Worker 
addw(Register reg,const Immediate & imm)3216*795d594fSAndroid Build Coastguard Worker void X86Assembler::addw(Register reg, const Immediate& imm) {
3217*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3218*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_uint16() || imm.is_int16()) << imm.value();
3219*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
3220*795d594fSAndroid Build Coastguard Worker   EmitComplex(0, Operand(reg), imm, /* is_16_op= */ true);
3221*795d594fSAndroid Build Coastguard Worker }
3222*795d594fSAndroid Build Coastguard Worker 
3223*795d594fSAndroid Build Coastguard Worker 
adcl(Register reg,const Immediate & imm)3224*795d594fSAndroid Build Coastguard Worker void X86Assembler::adcl(Register reg, const Immediate& imm) {
3225*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3226*795d594fSAndroid Build Coastguard Worker   EmitComplex(2, Operand(reg), imm);
3227*795d594fSAndroid Build Coastguard Worker }
3228*795d594fSAndroid Build Coastguard Worker 
3229*795d594fSAndroid Build Coastguard Worker 
adcl(Register dst,Register src)3230*795d594fSAndroid Build Coastguard Worker void X86Assembler::adcl(Register dst, Register src) {
3231*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3232*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x13);
3233*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
3234*795d594fSAndroid Build Coastguard Worker }
3235*795d594fSAndroid Build Coastguard Worker 
3236*795d594fSAndroid Build Coastguard Worker 
adcl(Register dst,const Address & address)3237*795d594fSAndroid Build Coastguard Worker void X86Assembler::adcl(Register dst, const Address& address) {
3238*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3239*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x13);
3240*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, address);
3241*795d594fSAndroid Build Coastguard Worker }
3242*795d594fSAndroid Build Coastguard Worker 
3243*795d594fSAndroid Build Coastguard Worker 
subl(Register dst,Register src)3244*795d594fSAndroid Build Coastguard Worker void X86Assembler::subl(Register dst, Register src) {
3245*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3246*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2B);
3247*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
3248*795d594fSAndroid Build Coastguard Worker }
3249*795d594fSAndroid Build Coastguard Worker 
3250*795d594fSAndroid Build Coastguard Worker 
subl(Register reg,const Immediate & imm)3251*795d594fSAndroid Build Coastguard Worker void X86Assembler::subl(Register reg, const Immediate& imm) {
3252*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3253*795d594fSAndroid Build Coastguard Worker   EmitComplex(5, Operand(reg), imm);
3254*795d594fSAndroid Build Coastguard Worker }
3255*795d594fSAndroid Build Coastguard Worker 
3256*795d594fSAndroid Build Coastguard Worker 
subl(Register reg,const Address & address)3257*795d594fSAndroid Build Coastguard Worker void X86Assembler::subl(Register reg, const Address& address) {
3258*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3259*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x2B);
3260*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3261*795d594fSAndroid Build Coastguard Worker }
3262*795d594fSAndroid Build Coastguard Worker 
3263*795d594fSAndroid Build Coastguard Worker 
subl(const Address & address,Register reg)3264*795d594fSAndroid Build Coastguard Worker void X86Assembler::subl(const Address& address, Register reg) {
3265*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3266*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x29);
3267*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3268*795d594fSAndroid Build Coastguard Worker }
3269*795d594fSAndroid Build Coastguard Worker 
3270*795d594fSAndroid Build Coastguard Worker 
cdq()3271*795d594fSAndroid Build Coastguard Worker void X86Assembler::cdq() {
3272*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3273*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x99);
3274*795d594fSAndroid Build Coastguard Worker }
3275*795d594fSAndroid Build Coastguard Worker 
3276*795d594fSAndroid Build Coastguard Worker 
idivl(Register reg)3277*795d594fSAndroid Build Coastguard Worker void X86Assembler::idivl(Register reg) {
3278*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3279*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3280*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF8 | reg);
3281*795d594fSAndroid Build Coastguard Worker }
3282*795d594fSAndroid Build Coastguard Worker 
3283*795d594fSAndroid Build Coastguard Worker 
divl(Register reg)3284*795d594fSAndroid Build Coastguard Worker void X86Assembler::divl(Register reg) {
3285*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3286*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3287*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF0 | reg);
3288*795d594fSAndroid Build Coastguard Worker }
3289*795d594fSAndroid Build Coastguard Worker 
3290*795d594fSAndroid Build Coastguard Worker 
imull(Register dst,Register src)3291*795d594fSAndroid Build Coastguard Worker void X86Assembler::imull(Register dst, Register src) {
3292*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3293*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3294*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xAF);
3295*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
3296*795d594fSAndroid Build Coastguard Worker }
3297*795d594fSAndroid Build Coastguard Worker 
3298*795d594fSAndroid Build Coastguard Worker 
imull(Register dst,Register src,const Immediate & imm)3299*795d594fSAndroid Build Coastguard Worker void X86Assembler::imull(Register dst, Register src, const Immediate& imm) {
3300*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3301*795d594fSAndroid Build Coastguard Worker   // See whether imm can be represented as a sign-extended 8bit value.
3302*795d594fSAndroid Build Coastguard Worker   int32_t v32 = static_cast<int32_t>(imm.value());
3303*795d594fSAndroid Build Coastguard Worker   if (IsInt<8>(v32)) {
3304*795d594fSAndroid Build Coastguard Worker     // Sign-extension works.
3305*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x6B);
3306*795d594fSAndroid Build Coastguard Worker     EmitOperand(dst, Operand(src));
3307*795d594fSAndroid Build Coastguard Worker     EmitUint8(static_cast<uint8_t>(v32 & 0xFF));
3308*795d594fSAndroid Build Coastguard Worker   } else {
3309*795d594fSAndroid Build Coastguard Worker     // Not representable, use full immediate.
3310*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x69);
3311*795d594fSAndroid Build Coastguard Worker     EmitOperand(dst, Operand(src));
3312*795d594fSAndroid Build Coastguard Worker     EmitImmediate(imm);
3313*795d594fSAndroid Build Coastguard Worker   }
3314*795d594fSAndroid Build Coastguard Worker }
3315*795d594fSAndroid Build Coastguard Worker 
3316*795d594fSAndroid Build Coastguard Worker 
imull(Register reg,const Immediate & imm)3317*795d594fSAndroid Build Coastguard Worker void X86Assembler::imull(Register reg, const Immediate& imm) {
3318*795d594fSAndroid Build Coastguard Worker   imull(reg, reg, imm);
3319*795d594fSAndroid Build Coastguard Worker }
3320*795d594fSAndroid Build Coastguard Worker 
3321*795d594fSAndroid Build Coastguard Worker 
imull(Register reg,const Address & address)3322*795d594fSAndroid Build Coastguard Worker void X86Assembler::imull(Register reg, const Address& address) {
3323*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3324*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3325*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xAF);
3326*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3327*795d594fSAndroid Build Coastguard Worker }
3328*795d594fSAndroid Build Coastguard Worker 
3329*795d594fSAndroid Build Coastguard Worker 
imull(Register reg)3330*795d594fSAndroid Build Coastguard Worker void X86Assembler::imull(Register reg) {
3331*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3332*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3333*795d594fSAndroid Build Coastguard Worker   EmitOperand(5, Operand(reg));
3334*795d594fSAndroid Build Coastguard Worker }
3335*795d594fSAndroid Build Coastguard Worker 
3336*795d594fSAndroid Build Coastguard Worker 
imull(const Address & address)3337*795d594fSAndroid Build Coastguard Worker void X86Assembler::imull(const Address& address) {
3338*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3339*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3340*795d594fSAndroid Build Coastguard Worker   EmitOperand(5, address);
3341*795d594fSAndroid Build Coastguard Worker }
3342*795d594fSAndroid Build Coastguard Worker 
3343*795d594fSAndroid Build Coastguard Worker 
mull(Register reg)3344*795d594fSAndroid Build Coastguard Worker void X86Assembler::mull(Register reg) {
3345*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3346*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3347*795d594fSAndroid Build Coastguard Worker   EmitOperand(4, Operand(reg));
3348*795d594fSAndroid Build Coastguard Worker }
3349*795d594fSAndroid Build Coastguard Worker 
3350*795d594fSAndroid Build Coastguard Worker 
mull(const Address & address)3351*795d594fSAndroid Build Coastguard Worker void X86Assembler::mull(const Address& address) {
3352*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3353*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3354*795d594fSAndroid Build Coastguard Worker   EmitOperand(4, address);
3355*795d594fSAndroid Build Coastguard Worker }
3356*795d594fSAndroid Build Coastguard Worker 
3357*795d594fSAndroid Build Coastguard Worker 
sbbl(Register dst,Register src)3358*795d594fSAndroid Build Coastguard Worker void X86Assembler::sbbl(Register dst, Register src) {
3359*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3360*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x1B);
3361*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, Operand(src));
3362*795d594fSAndroid Build Coastguard Worker }
3363*795d594fSAndroid Build Coastguard Worker 
3364*795d594fSAndroid Build Coastguard Worker 
sbbl(Register reg,const Immediate & imm)3365*795d594fSAndroid Build Coastguard Worker void X86Assembler::sbbl(Register reg, const Immediate& imm) {
3366*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3367*795d594fSAndroid Build Coastguard Worker   EmitComplex(3, Operand(reg), imm);
3368*795d594fSAndroid Build Coastguard Worker }
3369*795d594fSAndroid Build Coastguard Worker 
3370*795d594fSAndroid Build Coastguard Worker 
sbbl(Register dst,const Address & address)3371*795d594fSAndroid Build Coastguard Worker void X86Assembler::sbbl(Register dst, const Address& address) {
3372*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3373*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x1B);
3374*795d594fSAndroid Build Coastguard Worker   EmitOperand(dst, address);
3375*795d594fSAndroid Build Coastguard Worker }
3376*795d594fSAndroid Build Coastguard Worker 
3377*795d594fSAndroid Build Coastguard Worker 
sbbl(const Address & address,Register src)3378*795d594fSAndroid Build Coastguard Worker void X86Assembler::sbbl(const Address& address, Register src) {
3379*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3380*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x19);
3381*795d594fSAndroid Build Coastguard Worker   EmitOperand(src, address);
3382*795d594fSAndroid Build Coastguard Worker }
3383*795d594fSAndroid Build Coastguard Worker 
3384*795d594fSAndroid Build Coastguard Worker 
incl(Register reg)3385*795d594fSAndroid Build Coastguard Worker void X86Assembler::incl(Register reg) {
3386*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3387*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x40 + reg);
3388*795d594fSAndroid Build Coastguard Worker }
3389*795d594fSAndroid Build Coastguard Worker 
3390*795d594fSAndroid Build Coastguard Worker 
incl(const Address & address)3391*795d594fSAndroid Build Coastguard Worker void X86Assembler::incl(const Address& address) {
3392*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3393*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
3394*795d594fSAndroid Build Coastguard Worker   EmitOperand(0, address);
3395*795d594fSAndroid Build Coastguard Worker }
3396*795d594fSAndroid Build Coastguard Worker 
3397*795d594fSAndroid Build Coastguard Worker 
decl(Register reg)3398*795d594fSAndroid Build Coastguard Worker void X86Assembler::decl(Register reg) {
3399*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3400*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x48 + reg);
3401*795d594fSAndroid Build Coastguard Worker }
3402*795d594fSAndroid Build Coastguard Worker 
3403*795d594fSAndroid Build Coastguard Worker 
decl(const Address & address)3404*795d594fSAndroid Build Coastguard Worker void X86Assembler::decl(const Address& address) {
3405*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3406*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
3407*795d594fSAndroid Build Coastguard Worker   EmitOperand(1, address);
3408*795d594fSAndroid Build Coastguard Worker }
3409*795d594fSAndroid Build Coastguard Worker 
3410*795d594fSAndroid Build Coastguard Worker 
shll(Register reg,const Immediate & imm)3411*795d594fSAndroid Build Coastguard Worker void X86Assembler::shll(Register reg, const Immediate& imm) {
3412*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(4, Operand(reg), imm);
3413*795d594fSAndroid Build Coastguard Worker }
3414*795d594fSAndroid Build Coastguard Worker 
3415*795d594fSAndroid Build Coastguard Worker 
shll(Register operand,Register shifter)3416*795d594fSAndroid Build Coastguard Worker void X86Assembler::shll(Register operand, Register shifter) {
3417*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(4, Operand(operand), shifter);
3418*795d594fSAndroid Build Coastguard Worker }
3419*795d594fSAndroid Build Coastguard Worker 
3420*795d594fSAndroid Build Coastguard Worker 
shll(const Address & address,const Immediate & imm)3421*795d594fSAndroid Build Coastguard Worker void X86Assembler::shll(const Address& address, const Immediate& imm) {
3422*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(4, address, imm);
3423*795d594fSAndroid Build Coastguard Worker }
3424*795d594fSAndroid Build Coastguard Worker 
3425*795d594fSAndroid Build Coastguard Worker 
shll(const Address & address,Register shifter)3426*795d594fSAndroid Build Coastguard Worker void X86Assembler::shll(const Address& address, Register shifter) {
3427*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(4, address, shifter);
3428*795d594fSAndroid Build Coastguard Worker }
3429*795d594fSAndroid Build Coastguard Worker 
3430*795d594fSAndroid Build Coastguard Worker 
shrl(Register reg,const Immediate & imm)3431*795d594fSAndroid Build Coastguard Worker void X86Assembler::shrl(Register reg, const Immediate& imm) {
3432*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(5, Operand(reg), imm);
3433*795d594fSAndroid Build Coastguard Worker }
3434*795d594fSAndroid Build Coastguard Worker 
3435*795d594fSAndroid Build Coastguard Worker 
shrl(Register operand,Register shifter)3436*795d594fSAndroid Build Coastguard Worker void X86Assembler::shrl(Register operand, Register shifter) {
3437*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(5, Operand(operand), shifter);
3438*795d594fSAndroid Build Coastguard Worker }
3439*795d594fSAndroid Build Coastguard Worker 
3440*795d594fSAndroid Build Coastguard Worker 
shrl(const Address & address,const Immediate & imm)3441*795d594fSAndroid Build Coastguard Worker void X86Assembler::shrl(const Address& address, const Immediate& imm) {
3442*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(5, address, imm);
3443*795d594fSAndroid Build Coastguard Worker }
3444*795d594fSAndroid Build Coastguard Worker 
3445*795d594fSAndroid Build Coastguard Worker 
shrl(const Address & address,Register shifter)3446*795d594fSAndroid Build Coastguard Worker void X86Assembler::shrl(const Address& address, Register shifter) {
3447*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(5, address, shifter);
3448*795d594fSAndroid Build Coastguard Worker }
3449*795d594fSAndroid Build Coastguard Worker 
3450*795d594fSAndroid Build Coastguard Worker 
sarl(Register reg,const Immediate & imm)3451*795d594fSAndroid Build Coastguard Worker void X86Assembler::sarl(Register reg, const Immediate& imm) {
3452*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(7, Operand(reg), imm);
3453*795d594fSAndroid Build Coastguard Worker }
3454*795d594fSAndroid Build Coastguard Worker 
3455*795d594fSAndroid Build Coastguard Worker 
sarl(Register operand,Register shifter)3456*795d594fSAndroid Build Coastguard Worker void X86Assembler::sarl(Register operand, Register shifter) {
3457*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(7, Operand(operand), shifter);
3458*795d594fSAndroid Build Coastguard Worker }
3459*795d594fSAndroid Build Coastguard Worker 
3460*795d594fSAndroid Build Coastguard Worker 
sarl(const Address & address,const Immediate & imm)3461*795d594fSAndroid Build Coastguard Worker void X86Assembler::sarl(const Address& address, const Immediate& imm) {
3462*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(7, address, imm);
3463*795d594fSAndroid Build Coastguard Worker }
3464*795d594fSAndroid Build Coastguard Worker 
3465*795d594fSAndroid Build Coastguard Worker 
sarl(const Address & address,Register shifter)3466*795d594fSAndroid Build Coastguard Worker void X86Assembler::sarl(const Address& address, Register shifter) {
3467*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(7, address, shifter);
3468*795d594fSAndroid Build Coastguard Worker }
3469*795d594fSAndroid Build Coastguard Worker 
3470*795d594fSAndroid Build Coastguard Worker 
shld(Register dst,Register src,Register shifter)3471*795d594fSAndroid Build Coastguard Worker void X86Assembler::shld(Register dst, Register src, Register shifter) {
3472*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(ECX, shifter);
3473*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3474*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3475*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA5);
3476*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(src, dst);
3477*795d594fSAndroid Build Coastguard Worker }
3478*795d594fSAndroid Build Coastguard Worker 
3479*795d594fSAndroid Build Coastguard Worker 
shld(Register dst,Register src,const Immediate & imm)3480*795d594fSAndroid Build Coastguard Worker void X86Assembler::shld(Register dst, Register src, const Immediate& imm) {
3481*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3482*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3483*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA4);
3484*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(src, dst);
3485*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
3486*795d594fSAndroid Build Coastguard Worker }
3487*795d594fSAndroid Build Coastguard Worker 
3488*795d594fSAndroid Build Coastguard Worker 
shrd(Register dst,Register src,Register shifter)3489*795d594fSAndroid Build Coastguard Worker void X86Assembler::shrd(Register dst, Register src, Register shifter) {
3490*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(ECX, shifter);
3491*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3492*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3493*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xAD);
3494*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(src, dst);
3495*795d594fSAndroid Build Coastguard Worker }
3496*795d594fSAndroid Build Coastguard Worker 
3497*795d594fSAndroid Build Coastguard Worker 
shrd(Register dst,Register src,const Immediate & imm)3498*795d594fSAndroid Build Coastguard Worker void X86Assembler::shrd(Register dst, Register src, const Immediate& imm) {
3499*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3500*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3501*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xAC);
3502*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(src, dst);
3503*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
3504*795d594fSAndroid Build Coastguard Worker }
3505*795d594fSAndroid Build Coastguard Worker 
3506*795d594fSAndroid Build Coastguard Worker 
roll(Register reg,const Immediate & imm)3507*795d594fSAndroid Build Coastguard Worker void X86Assembler::roll(Register reg, const Immediate& imm) {
3508*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(0, Operand(reg), imm);
3509*795d594fSAndroid Build Coastguard Worker }
3510*795d594fSAndroid Build Coastguard Worker 
3511*795d594fSAndroid Build Coastguard Worker 
roll(Register operand,Register shifter)3512*795d594fSAndroid Build Coastguard Worker void X86Assembler::roll(Register operand, Register shifter) {
3513*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(0, Operand(operand), shifter);
3514*795d594fSAndroid Build Coastguard Worker }
3515*795d594fSAndroid Build Coastguard Worker 
3516*795d594fSAndroid Build Coastguard Worker 
rorl(Register reg,const Immediate & imm)3517*795d594fSAndroid Build Coastguard Worker void X86Assembler::rorl(Register reg, const Immediate& imm) {
3518*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(1, Operand(reg), imm);
3519*795d594fSAndroid Build Coastguard Worker }
3520*795d594fSAndroid Build Coastguard Worker 
3521*795d594fSAndroid Build Coastguard Worker 
rorl(Register operand,Register shifter)3522*795d594fSAndroid Build Coastguard Worker void X86Assembler::rorl(Register operand, Register shifter) {
3523*795d594fSAndroid Build Coastguard Worker   EmitGenericShift(1, Operand(operand), shifter);
3524*795d594fSAndroid Build Coastguard Worker }
3525*795d594fSAndroid Build Coastguard Worker 
3526*795d594fSAndroid Build Coastguard Worker 
negl(Register reg)3527*795d594fSAndroid Build Coastguard Worker void X86Assembler::negl(Register reg) {
3528*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3529*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3530*795d594fSAndroid Build Coastguard Worker   EmitOperand(3, Operand(reg));
3531*795d594fSAndroid Build Coastguard Worker }
3532*795d594fSAndroid Build Coastguard Worker 
3533*795d594fSAndroid Build Coastguard Worker 
notl(Register reg)3534*795d594fSAndroid Build Coastguard Worker void X86Assembler::notl(Register reg) {
3535*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3536*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF7);
3537*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD0 | reg);
3538*795d594fSAndroid Build Coastguard Worker }
3539*795d594fSAndroid Build Coastguard Worker 
3540*795d594fSAndroid Build Coastguard Worker 
enter(const Immediate & imm)3541*795d594fSAndroid Build Coastguard Worker void X86Assembler::enter(const Immediate& imm) {
3542*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3543*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC8);
3544*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_uint16());
3545*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
3546*795d594fSAndroid Build Coastguard Worker   EmitUint8((imm.value() >> 8) & 0xFF);
3547*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x00);
3548*795d594fSAndroid Build Coastguard Worker }
3549*795d594fSAndroid Build Coastguard Worker 
3550*795d594fSAndroid Build Coastguard Worker 
leave()3551*795d594fSAndroid Build Coastguard Worker void X86Assembler::leave() {
3552*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3553*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC9);
3554*795d594fSAndroid Build Coastguard Worker }
3555*795d594fSAndroid Build Coastguard Worker 
3556*795d594fSAndroid Build Coastguard Worker 
ret()3557*795d594fSAndroid Build Coastguard Worker void X86Assembler::ret() {
3558*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3559*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC3);
3560*795d594fSAndroid Build Coastguard Worker }
3561*795d594fSAndroid Build Coastguard Worker 
3562*795d594fSAndroid Build Coastguard Worker 
ret(const Immediate & imm)3563*795d594fSAndroid Build Coastguard Worker void X86Assembler::ret(const Immediate& imm) {
3564*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3565*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC2);
3566*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_uint16());
3567*795d594fSAndroid Build Coastguard Worker   EmitUint8(imm.value() & 0xFF);
3568*795d594fSAndroid Build Coastguard Worker   EmitUint8((imm.value() >> 8) & 0xFF);
3569*795d594fSAndroid Build Coastguard Worker }
3570*795d594fSAndroid Build Coastguard Worker 
3571*795d594fSAndroid Build Coastguard Worker 
3572*795d594fSAndroid Build Coastguard Worker 
nop()3573*795d594fSAndroid Build Coastguard Worker void X86Assembler::nop() {
3574*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3575*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x90);
3576*795d594fSAndroid Build Coastguard Worker }
3577*795d594fSAndroid Build Coastguard Worker 
3578*795d594fSAndroid Build Coastguard Worker 
int3()3579*795d594fSAndroid Build Coastguard Worker void X86Assembler::int3() {
3580*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3581*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xCC);
3582*795d594fSAndroid Build Coastguard Worker }
3583*795d594fSAndroid Build Coastguard Worker 
3584*795d594fSAndroid Build Coastguard Worker 
hlt()3585*795d594fSAndroid Build Coastguard Worker void X86Assembler::hlt() {
3586*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3587*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF4);
3588*795d594fSAndroid Build Coastguard Worker }
3589*795d594fSAndroid Build Coastguard Worker 
3590*795d594fSAndroid Build Coastguard Worker 
j(Condition condition,Label * label)3591*795d594fSAndroid Build Coastguard Worker void X86Assembler::j(Condition condition, Label* label) {
3592*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3593*795d594fSAndroid Build Coastguard Worker   if (label->IsBound()) {
3594*795d594fSAndroid Build Coastguard Worker     static const int kShortSize = 2;
3595*795d594fSAndroid Build Coastguard Worker     static const int kLongSize = 6;
3596*795d594fSAndroid Build Coastguard Worker     int offset = label->Position() - buffer_.Size();
3597*795d594fSAndroid Build Coastguard Worker     CHECK_LE(offset, 0);
3598*795d594fSAndroid Build Coastguard Worker     if (IsInt<8>(offset - kShortSize)) {
3599*795d594fSAndroid Build Coastguard Worker       EmitUint8(0x70 + condition);
3600*795d594fSAndroid Build Coastguard Worker       EmitUint8((offset - kShortSize) & 0xFF);
3601*795d594fSAndroid Build Coastguard Worker     } else {
3602*795d594fSAndroid Build Coastguard Worker       EmitUint8(0x0F);
3603*795d594fSAndroid Build Coastguard Worker       EmitUint8(0x80 + condition);
3604*795d594fSAndroid Build Coastguard Worker       EmitInt32(offset - kLongSize);
3605*795d594fSAndroid Build Coastguard Worker     }
3606*795d594fSAndroid Build Coastguard Worker   } else {
3607*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x0F);
3608*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x80 + condition);
3609*795d594fSAndroid Build Coastguard Worker     EmitLabelLink(label);
3610*795d594fSAndroid Build Coastguard Worker   }
3611*795d594fSAndroid Build Coastguard Worker }
3612*795d594fSAndroid Build Coastguard Worker 
3613*795d594fSAndroid Build Coastguard Worker 
j(Condition condition,NearLabel * label)3614*795d594fSAndroid Build Coastguard Worker void X86Assembler::j(Condition condition, NearLabel* label) {
3615*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3616*795d594fSAndroid Build Coastguard Worker   if (label->IsBound()) {
3617*795d594fSAndroid Build Coastguard Worker     static const int kShortSize = 2;
3618*795d594fSAndroid Build Coastguard Worker     int offset = label->Position() - buffer_.Size();
3619*795d594fSAndroid Build Coastguard Worker     CHECK_LE(offset, 0);
3620*795d594fSAndroid Build Coastguard Worker     CHECK(IsInt<8>(offset - kShortSize));
3621*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x70 + condition);
3622*795d594fSAndroid Build Coastguard Worker     EmitUint8((offset - kShortSize) & 0xFF);
3623*795d594fSAndroid Build Coastguard Worker   } else {
3624*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x70 + condition);
3625*795d594fSAndroid Build Coastguard Worker     EmitLabelLink(label);
3626*795d594fSAndroid Build Coastguard Worker   }
3627*795d594fSAndroid Build Coastguard Worker }
3628*795d594fSAndroid Build Coastguard Worker 
3629*795d594fSAndroid Build Coastguard Worker 
jecxz(NearLabel * label)3630*795d594fSAndroid Build Coastguard Worker void X86Assembler::jecxz(NearLabel* label) {
3631*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3632*795d594fSAndroid Build Coastguard Worker   if (label->IsBound()) {
3633*795d594fSAndroid Build Coastguard Worker     static const int kShortSize = 2;
3634*795d594fSAndroid Build Coastguard Worker     int offset = label->Position() - buffer_.Size();
3635*795d594fSAndroid Build Coastguard Worker     CHECK_LE(offset, 0);
3636*795d594fSAndroid Build Coastguard Worker     CHECK(IsInt<8>(offset - kShortSize));
3637*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xE3);
3638*795d594fSAndroid Build Coastguard Worker     EmitUint8((offset - kShortSize) & 0xFF);
3639*795d594fSAndroid Build Coastguard Worker   } else {
3640*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xE3);
3641*795d594fSAndroid Build Coastguard Worker     EmitLabelLink(label);
3642*795d594fSAndroid Build Coastguard Worker   }
3643*795d594fSAndroid Build Coastguard Worker }
3644*795d594fSAndroid Build Coastguard Worker 
3645*795d594fSAndroid Build Coastguard Worker 
jmp(Register reg)3646*795d594fSAndroid Build Coastguard Worker void X86Assembler::jmp(Register reg) {
3647*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3648*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
3649*795d594fSAndroid Build Coastguard Worker   EmitRegisterOperand(4, reg);
3650*795d594fSAndroid Build Coastguard Worker }
3651*795d594fSAndroid Build Coastguard Worker 
jmp(const Address & address)3652*795d594fSAndroid Build Coastguard Worker void X86Assembler::jmp(const Address& address) {
3653*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3654*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xFF);
3655*795d594fSAndroid Build Coastguard Worker   EmitOperand(4, address);
3656*795d594fSAndroid Build Coastguard Worker }
3657*795d594fSAndroid Build Coastguard Worker 
jmp(Label * label)3658*795d594fSAndroid Build Coastguard Worker void X86Assembler::jmp(Label* label) {
3659*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3660*795d594fSAndroid Build Coastguard Worker   if (label->IsBound()) {
3661*795d594fSAndroid Build Coastguard Worker     static const int kShortSize = 2;
3662*795d594fSAndroid Build Coastguard Worker     static const int kLongSize = 5;
3663*795d594fSAndroid Build Coastguard Worker     int offset = label->Position() - buffer_.Size();
3664*795d594fSAndroid Build Coastguard Worker     CHECK_LE(offset, 0);
3665*795d594fSAndroid Build Coastguard Worker     if (IsInt<8>(offset - kShortSize)) {
3666*795d594fSAndroid Build Coastguard Worker       EmitUint8(0xEB);
3667*795d594fSAndroid Build Coastguard Worker       EmitUint8((offset - kShortSize) & 0xFF);
3668*795d594fSAndroid Build Coastguard Worker     } else {
3669*795d594fSAndroid Build Coastguard Worker       EmitUint8(0xE9);
3670*795d594fSAndroid Build Coastguard Worker       EmitInt32(offset - kLongSize);
3671*795d594fSAndroid Build Coastguard Worker     }
3672*795d594fSAndroid Build Coastguard Worker   } else {
3673*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xE9);
3674*795d594fSAndroid Build Coastguard Worker     EmitLabelLink(label);
3675*795d594fSAndroid Build Coastguard Worker   }
3676*795d594fSAndroid Build Coastguard Worker }
3677*795d594fSAndroid Build Coastguard Worker 
3678*795d594fSAndroid Build Coastguard Worker 
jmp(NearLabel * label)3679*795d594fSAndroid Build Coastguard Worker void X86Assembler::jmp(NearLabel* label) {
3680*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3681*795d594fSAndroid Build Coastguard Worker   if (label->IsBound()) {
3682*795d594fSAndroid Build Coastguard Worker     static const int kShortSize = 2;
3683*795d594fSAndroid Build Coastguard Worker     int offset = label->Position() - buffer_.Size();
3684*795d594fSAndroid Build Coastguard Worker     CHECK_LE(offset, 0);
3685*795d594fSAndroid Build Coastguard Worker     CHECK(IsInt<8>(offset - kShortSize));
3686*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xEB);
3687*795d594fSAndroid Build Coastguard Worker     EmitUint8((offset - kShortSize) & 0xFF);
3688*795d594fSAndroid Build Coastguard Worker   } else {
3689*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xEB);
3690*795d594fSAndroid Build Coastguard Worker     EmitLabelLink(label);
3691*795d594fSAndroid Build Coastguard Worker   }
3692*795d594fSAndroid Build Coastguard Worker }
3693*795d594fSAndroid Build Coastguard Worker 
3694*795d594fSAndroid Build Coastguard Worker 
repne_scasb()3695*795d594fSAndroid Build Coastguard Worker void X86Assembler::repne_scasb() {
3696*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3697*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
3698*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xAE);
3699*795d594fSAndroid Build Coastguard Worker }
3700*795d594fSAndroid Build Coastguard Worker 
3701*795d594fSAndroid Build Coastguard Worker 
repne_scasw()3702*795d594fSAndroid Build Coastguard Worker void X86Assembler::repne_scasw() {
3703*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3704*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
3705*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF2);
3706*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xAF);
3707*795d594fSAndroid Build Coastguard Worker }
3708*795d594fSAndroid Build Coastguard Worker 
3709*795d594fSAndroid Build Coastguard Worker 
repe_cmpsb()3710*795d594fSAndroid Build Coastguard Worker void X86Assembler::repe_cmpsb() {
3711*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3712*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
3713*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA6);
3714*795d594fSAndroid Build Coastguard Worker }
3715*795d594fSAndroid Build Coastguard Worker 
3716*795d594fSAndroid Build Coastguard Worker 
repe_cmpsw()3717*795d594fSAndroid Build Coastguard Worker void X86Assembler::repe_cmpsw() {
3718*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3719*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
3720*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
3721*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA7);
3722*795d594fSAndroid Build Coastguard Worker }
3723*795d594fSAndroid Build Coastguard Worker 
3724*795d594fSAndroid Build Coastguard Worker 
repe_cmpsl()3725*795d594fSAndroid Build Coastguard Worker void X86Assembler::repe_cmpsl() {
3726*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3727*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
3728*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA7);
3729*795d594fSAndroid Build Coastguard Worker }
3730*795d594fSAndroid Build Coastguard Worker 
3731*795d594fSAndroid Build Coastguard Worker 
rep_movsb()3732*795d594fSAndroid Build Coastguard Worker void X86Assembler::rep_movsb() {
3733*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3734*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
3735*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA4);
3736*795d594fSAndroid Build Coastguard Worker }
3737*795d594fSAndroid Build Coastguard Worker 
3738*795d594fSAndroid Build Coastguard Worker 
rep_movsw()3739*795d594fSAndroid Build Coastguard Worker void X86Assembler::rep_movsw() {
3740*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3741*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x66);
3742*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
3743*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA5);
3744*795d594fSAndroid Build Coastguard Worker }
3745*795d594fSAndroid Build Coastguard Worker 
rep_movsl()3746*795d594fSAndroid Build Coastguard Worker void X86Assembler::rep_movsl() {
3747*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3748*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF3);
3749*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xA5);
3750*795d594fSAndroid Build Coastguard Worker }
3751*795d594fSAndroid Build Coastguard Worker 
lock()3752*795d594fSAndroid Build Coastguard Worker X86Assembler* X86Assembler::lock() {
3753*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3754*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF0);
3755*795d594fSAndroid Build Coastguard Worker   return this;
3756*795d594fSAndroid Build Coastguard Worker }
3757*795d594fSAndroid Build Coastguard Worker 
3758*795d594fSAndroid Build Coastguard Worker 
cmpxchgb(const Address & address,ByteRegister reg)3759*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpxchgb(const Address& address, ByteRegister reg) {
3760*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3761*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3762*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB0);
3763*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3764*795d594fSAndroid Build Coastguard Worker }
3765*795d594fSAndroid Build Coastguard Worker 
3766*795d594fSAndroid Build Coastguard Worker 
cmpxchgw(const Address & address,Register reg)3767*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpxchgw(const Address& address, Register reg) {
3768*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3769*795d594fSAndroid Build Coastguard Worker   EmitOperandSizeOverride();
3770*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3771*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB1);
3772*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3773*795d594fSAndroid Build Coastguard Worker }
3774*795d594fSAndroid Build Coastguard Worker 
3775*795d594fSAndroid Build Coastguard Worker 
cmpxchgl(const Address & address,Register reg)3776*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpxchgl(const Address& address, Register reg) {
3777*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3778*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3779*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xB1);
3780*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3781*795d594fSAndroid Build Coastguard Worker }
3782*795d594fSAndroid Build Coastguard Worker 
3783*795d594fSAndroid Build Coastguard Worker 
cmpxchg8b(const Address & address)3784*795d594fSAndroid Build Coastguard Worker void X86Assembler::cmpxchg8b(const Address& address) {
3785*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3786*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3787*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC7);
3788*795d594fSAndroid Build Coastguard Worker   EmitOperand(1, address);
3789*795d594fSAndroid Build Coastguard Worker }
3790*795d594fSAndroid Build Coastguard Worker 
3791*795d594fSAndroid Build Coastguard Worker 
xaddb(const Address & address,ByteRegister reg)3792*795d594fSAndroid Build Coastguard Worker void X86Assembler::xaddb(const Address& address, ByteRegister reg) {
3793*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3794*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3795*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC0);
3796*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3797*795d594fSAndroid Build Coastguard Worker }
3798*795d594fSAndroid Build Coastguard Worker 
xaddw(const Address & address,Register reg)3799*795d594fSAndroid Build Coastguard Worker void X86Assembler::xaddw(const Address& address, Register reg) {
3800*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3801*795d594fSAndroid Build Coastguard Worker   EmitOperandSizeOverride();
3802*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3803*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC1);
3804*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3805*795d594fSAndroid Build Coastguard Worker }
3806*795d594fSAndroid Build Coastguard Worker 
xaddl(const Address & address,Register reg)3807*795d594fSAndroid Build Coastguard Worker void X86Assembler::xaddl(const Address& address, Register reg) {
3808*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3809*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3810*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xC1);
3811*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg, address);
3812*795d594fSAndroid Build Coastguard Worker }
3813*795d594fSAndroid Build Coastguard Worker 
3814*795d594fSAndroid Build Coastguard Worker 
mfence()3815*795d594fSAndroid Build Coastguard Worker void X86Assembler::mfence() {
3816*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3817*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x0F);
3818*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xAE);
3819*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xF0);
3820*795d594fSAndroid Build Coastguard Worker }
3821*795d594fSAndroid Build Coastguard Worker 
fs()3822*795d594fSAndroid Build Coastguard Worker X86Assembler* X86Assembler::fs() {
3823*795d594fSAndroid Build Coastguard Worker   // TODO: fs is a prefix and not an instruction
3824*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3825*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x64);
3826*795d594fSAndroid Build Coastguard Worker   return this;
3827*795d594fSAndroid Build Coastguard Worker }
3828*795d594fSAndroid Build Coastguard Worker 
gs()3829*795d594fSAndroid Build Coastguard Worker X86Assembler* X86Assembler::gs() {
3830*795d594fSAndroid Build Coastguard Worker   // TODO: fs is a prefix and not an instruction
3831*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3832*795d594fSAndroid Build Coastguard Worker   EmitUint8(0x65);
3833*795d594fSAndroid Build Coastguard Worker   return this;
3834*795d594fSAndroid Build Coastguard Worker }
3835*795d594fSAndroid Build Coastguard Worker 
AddImmediate(Register reg,const Immediate & imm)3836*795d594fSAndroid Build Coastguard Worker void X86Assembler::AddImmediate(Register reg, const Immediate& imm) {
3837*795d594fSAndroid Build Coastguard Worker   int value = imm.value();
3838*795d594fSAndroid Build Coastguard Worker   if (value > 0) {
3839*795d594fSAndroid Build Coastguard Worker     if (value == 1) {
3840*795d594fSAndroid Build Coastguard Worker       incl(reg);
3841*795d594fSAndroid Build Coastguard Worker     } else if (value != 0) {
3842*795d594fSAndroid Build Coastguard Worker       addl(reg, imm);
3843*795d594fSAndroid Build Coastguard Worker     }
3844*795d594fSAndroid Build Coastguard Worker   } else if (value < 0) {
3845*795d594fSAndroid Build Coastguard Worker     value = -value;
3846*795d594fSAndroid Build Coastguard Worker     if (value == 1) {
3847*795d594fSAndroid Build Coastguard Worker       decl(reg);
3848*795d594fSAndroid Build Coastguard Worker     } else if (value != 0) {
3849*795d594fSAndroid Build Coastguard Worker       subl(reg, Immediate(value));
3850*795d594fSAndroid Build Coastguard Worker     }
3851*795d594fSAndroid Build Coastguard Worker   }
3852*795d594fSAndroid Build Coastguard Worker }
3853*795d594fSAndroid Build Coastguard Worker 
3854*795d594fSAndroid Build Coastguard Worker 
LoadLongConstant(XmmRegister dst,int64_t value)3855*795d594fSAndroid Build Coastguard Worker void X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) {
3856*795d594fSAndroid Build Coastguard Worker   // TODO: Need to have a code constants table.
3857*795d594fSAndroid Build Coastguard Worker   pushl(Immediate(High32Bits(value)));
3858*795d594fSAndroid Build Coastguard Worker   pushl(Immediate(Low32Bits(value)));
3859*795d594fSAndroid Build Coastguard Worker   movsd(dst, Address(ESP, 0));
3860*795d594fSAndroid Build Coastguard Worker   addl(ESP, Immediate(2 * sizeof(int32_t)));
3861*795d594fSAndroid Build Coastguard Worker }
3862*795d594fSAndroid Build Coastguard Worker 
3863*795d594fSAndroid Build Coastguard Worker 
LoadDoubleConstant(XmmRegister dst,double value)3864*795d594fSAndroid Build Coastguard Worker void X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) {
3865*795d594fSAndroid Build Coastguard Worker   // TODO: Need to have a code constants table.
3866*795d594fSAndroid Build Coastguard Worker   int64_t constant = bit_cast<int64_t, double>(value);
3867*795d594fSAndroid Build Coastguard Worker   LoadLongConstant(dst, constant);
3868*795d594fSAndroid Build Coastguard Worker }
3869*795d594fSAndroid Build Coastguard Worker 
3870*795d594fSAndroid Build Coastguard Worker 
Align(int alignment,int offset)3871*795d594fSAndroid Build Coastguard Worker void X86Assembler::Align(int alignment, int offset) {
3872*795d594fSAndroid Build Coastguard Worker   CHECK(IsPowerOfTwo(alignment));
3873*795d594fSAndroid Build Coastguard Worker   // Emit nop instruction until the real position is aligned.
3874*795d594fSAndroid Build Coastguard Worker   while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) {
3875*795d594fSAndroid Build Coastguard Worker     nop();
3876*795d594fSAndroid Build Coastguard Worker   }
3877*795d594fSAndroid Build Coastguard Worker }
3878*795d594fSAndroid Build Coastguard Worker 
3879*795d594fSAndroid Build Coastguard Worker 
Bind(Label * label)3880*795d594fSAndroid Build Coastguard Worker void X86Assembler::Bind(Label* label) {
3881*795d594fSAndroid Build Coastguard Worker   int bound = buffer_.Size();
3882*795d594fSAndroid Build Coastguard Worker   CHECK(!label->IsBound());  // Labels can only be bound once.
3883*795d594fSAndroid Build Coastguard Worker   while (label->IsLinked()) {
3884*795d594fSAndroid Build Coastguard Worker     int position = label->LinkPosition();
3885*795d594fSAndroid Build Coastguard Worker     int next = buffer_.Load<int32_t>(position);
3886*795d594fSAndroid Build Coastguard Worker     buffer_.Store<int32_t>(position, bound - (position + 4));
3887*795d594fSAndroid Build Coastguard Worker     label->position_ = next;
3888*795d594fSAndroid Build Coastguard Worker   }
3889*795d594fSAndroid Build Coastguard Worker   label->BindTo(bound);
3890*795d594fSAndroid Build Coastguard Worker }
3891*795d594fSAndroid Build Coastguard Worker 
3892*795d594fSAndroid Build Coastguard Worker 
Bind(NearLabel * label)3893*795d594fSAndroid Build Coastguard Worker void X86Assembler::Bind(NearLabel* label) {
3894*795d594fSAndroid Build Coastguard Worker   int bound = buffer_.Size();
3895*795d594fSAndroid Build Coastguard Worker   CHECK(!label->IsBound());  // Labels can only be bound once.
3896*795d594fSAndroid Build Coastguard Worker   while (label->IsLinked()) {
3897*795d594fSAndroid Build Coastguard Worker     int position = label->LinkPosition();
3898*795d594fSAndroid Build Coastguard Worker     uint8_t delta = buffer_.Load<uint8_t>(position);
3899*795d594fSAndroid Build Coastguard Worker     int offset = bound - (position + 1);
3900*795d594fSAndroid Build Coastguard Worker     CHECK(IsInt<8>(offset));
3901*795d594fSAndroid Build Coastguard Worker     buffer_.Store<int8_t>(position, offset);
3902*795d594fSAndroid Build Coastguard Worker     label->position_ = delta != 0u ? label->position_ - delta : 0;
3903*795d594fSAndroid Build Coastguard Worker   }
3904*795d594fSAndroid Build Coastguard Worker   label->BindTo(bound);
3905*795d594fSAndroid Build Coastguard Worker }
3906*795d594fSAndroid Build Coastguard Worker 
3907*795d594fSAndroid Build Coastguard Worker 
EmitOperand(int reg_or_opcode,const Operand & operand)3908*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) {
3909*795d594fSAndroid Build Coastguard Worker   CHECK_GE(reg_or_opcode, 0);
3910*795d594fSAndroid Build Coastguard Worker   CHECK_LT(reg_or_opcode, 8);
3911*795d594fSAndroid Build Coastguard Worker   const int length = operand.length_;
3912*795d594fSAndroid Build Coastguard Worker   CHECK_GT(length, 0);
3913*795d594fSAndroid Build Coastguard Worker   // Emit the ModRM byte updated with the given reg value.
3914*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(operand.encoding_[0] & 0x38, 0);
3915*795d594fSAndroid Build Coastguard Worker   EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3));
3916*795d594fSAndroid Build Coastguard Worker   // Emit the rest of the encoded operand.
3917*795d594fSAndroid Build Coastguard Worker   for (int i = 1; i < length; i++) {
3918*795d594fSAndroid Build Coastguard Worker     EmitUint8(operand.encoding_[i]);
3919*795d594fSAndroid Build Coastguard Worker   }
3920*795d594fSAndroid Build Coastguard Worker   AssemblerFixup* fixup = operand.GetFixup();
3921*795d594fSAndroid Build Coastguard Worker   if (fixup != nullptr) {
3922*795d594fSAndroid Build Coastguard Worker     EmitFixup(fixup);
3923*795d594fSAndroid Build Coastguard Worker   }
3924*795d594fSAndroid Build Coastguard Worker }
3925*795d594fSAndroid Build Coastguard Worker 
3926*795d594fSAndroid Build Coastguard Worker 
EmitImmediate(const Immediate & imm,bool is_16_op)3927*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitImmediate(const Immediate& imm, bool is_16_op) {
3928*795d594fSAndroid Build Coastguard Worker   if (is_16_op) {
3929*795d594fSAndroid Build Coastguard Worker     EmitUint8(imm.value() & 0xFF);
3930*795d594fSAndroid Build Coastguard Worker     EmitUint8(imm.value() >> 8);
3931*795d594fSAndroid Build Coastguard Worker   } else {
3932*795d594fSAndroid Build Coastguard Worker     EmitInt32(imm.value());
3933*795d594fSAndroid Build Coastguard Worker   }
3934*795d594fSAndroid Build Coastguard Worker }
3935*795d594fSAndroid Build Coastguard Worker 
3936*795d594fSAndroid Build Coastguard Worker 
EmitComplex(int reg_or_opcode,const Operand & operand,const Immediate & immediate,bool is_16_op)3937*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitComplex(int reg_or_opcode,
3938*795d594fSAndroid Build Coastguard Worker                                const Operand& operand,
3939*795d594fSAndroid Build Coastguard Worker                                const Immediate& immediate,
3940*795d594fSAndroid Build Coastguard Worker                                bool is_16_op) {
3941*795d594fSAndroid Build Coastguard Worker   CHECK_GE(reg_or_opcode, 0);
3942*795d594fSAndroid Build Coastguard Worker   CHECK_LT(reg_or_opcode, 8);
3943*795d594fSAndroid Build Coastguard Worker   if (immediate.is_int8()) {
3944*795d594fSAndroid Build Coastguard Worker     // Use sign-extended 8-bit immediate.
3945*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x83);
3946*795d594fSAndroid Build Coastguard Worker     EmitOperand(reg_or_opcode, operand);
3947*795d594fSAndroid Build Coastguard Worker     EmitUint8(immediate.value() & 0xFF);
3948*795d594fSAndroid Build Coastguard Worker   } else if (operand.IsRegister(EAX)) {
3949*795d594fSAndroid Build Coastguard Worker     // Use short form if the destination is eax.
3950*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x05 + (reg_or_opcode << 3));
3951*795d594fSAndroid Build Coastguard Worker     EmitImmediate(immediate, is_16_op);
3952*795d594fSAndroid Build Coastguard Worker   } else {
3953*795d594fSAndroid Build Coastguard Worker     EmitUint8(0x81);
3954*795d594fSAndroid Build Coastguard Worker     EmitOperand(reg_or_opcode, operand);
3955*795d594fSAndroid Build Coastguard Worker     EmitImmediate(immediate, is_16_op);
3956*795d594fSAndroid Build Coastguard Worker   }
3957*795d594fSAndroid Build Coastguard Worker }
3958*795d594fSAndroid Build Coastguard Worker 
3959*795d594fSAndroid Build Coastguard Worker 
EmitLabel(Label * label,int instruction_size)3960*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitLabel(Label* label, int instruction_size) {
3961*795d594fSAndroid Build Coastguard Worker   if (label->IsBound()) {
3962*795d594fSAndroid Build Coastguard Worker     int offset = label->Position() - buffer_.Size();
3963*795d594fSAndroid Build Coastguard Worker     CHECK_LE(offset, 0);
3964*795d594fSAndroid Build Coastguard Worker     EmitInt32(offset - instruction_size);
3965*795d594fSAndroid Build Coastguard Worker   } else {
3966*795d594fSAndroid Build Coastguard Worker     EmitLabelLink(label);
3967*795d594fSAndroid Build Coastguard Worker   }
3968*795d594fSAndroid Build Coastguard Worker }
3969*795d594fSAndroid Build Coastguard Worker 
3970*795d594fSAndroid Build Coastguard Worker 
EmitLabelLink(Label * label)3971*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitLabelLink(Label* label) {
3972*795d594fSAndroid Build Coastguard Worker   CHECK(!label->IsBound());
3973*795d594fSAndroid Build Coastguard Worker   int position = buffer_.Size();
3974*795d594fSAndroid Build Coastguard Worker   EmitInt32(label->position_);
3975*795d594fSAndroid Build Coastguard Worker   label->LinkTo(position);
3976*795d594fSAndroid Build Coastguard Worker }
3977*795d594fSAndroid Build Coastguard Worker 
3978*795d594fSAndroid Build Coastguard Worker 
EmitLabelLink(NearLabel * label)3979*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitLabelLink(NearLabel* label) {
3980*795d594fSAndroid Build Coastguard Worker   CHECK(!label->IsBound());
3981*795d594fSAndroid Build Coastguard Worker   int position = buffer_.Size();
3982*795d594fSAndroid Build Coastguard Worker   if (label->IsLinked()) {
3983*795d594fSAndroid Build Coastguard Worker     // Save the delta in the byte that we have to play with.
3984*795d594fSAndroid Build Coastguard Worker     uint32_t delta = position - label->LinkPosition();
3985*795d594fSAndroid Build Coastguard Worker     CHECK(IsUint<8>(delta));
3986*795d594fSAndroid Build Coastguard Worker     EmitUint8(delta & 0xFF);
3987*795d594fSAndroid Build Coastguard Worker   } else {
3988*795d594fSAndroid Build Coastguard Worker     EmitUint8(0);
3989*795d594fSAndroid Build Coastguard Worker   }
3990*795d594fSAndroid Build Coastguard Worker   label->LinkTo(position);
3991*795d594fSAndroid Build Coastguard Worker }
3992*795d594fSAndroid Build Coastguard Worker 
3993*795d594fSAndroid Build Coastguard Worker 
EmitGenericShift(int reg_or_opcode,const Operand & operand,const Immediate & imm)3994*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitGenericShift(int reg_or_opcode,
3995*795d594fSAndroid Build Coastguard Worker                                     const Operand& operand,
3996*795d594fSAndroid Build Coastguard Worker                                     const Immediate& imm) {
3997*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3998*795d594fSAndroid Build Coastguard Worker   CHECK(imm.is_int8());
3999*795d594fSAndroid Build Coastguard Worker   if (imm.value() == 1) {
4000*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xD1);
4001*795d594fSAndroid Build Coastguard Worker     EmitOperand(reg_or_opcode, operand);
4002*795d594fSAndroid Build Coastguard Worker   } else {
4003*795d594fSAndroid Build Coastguard Worker     EmitUint8(0xC1);
4004*795d594fSAndroid Build Coastguard Worker     EmitOperand(reg_or_opcode, operand);
4005*795d594fSAndroid Build Coastguard Worker     EmitUint8(imm.value() & 0xFF);
4006*795d594fSAndroid Build Coastguard Worker   }
4007*795d594fSAndroid Build Coastguard Worker }
4008*795d594fSAndroid Build Coastguard Worker 
4009*795d594fSAndroid Build Coastguard Worker 
EmitGenericShift(int reg_or_opcode,const Operand & operand,Register shifter)4010*795d594fSAndroid Build Coastguard Worker void X86Assembler::EmitGenericShift(int reg_or_opcode,
4011*795d594fSAndroid Build Coastguard Worker                                     const Operand& operand,
4012*795d594fSAndroid Build Coastguard Worker                                     Register shifter) {
4013*795d594fSAndroid Build Coastguard Worker   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
4014*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(shifter, ECX);
4015*795d594fSAndroid Build Coastguard Worker   EmitUint8(0xD3);
4016*795d594fSAndroid Build Coastguard Worker   EmitOperand(reg_or_opcode, operand);
4017*795d594fSAndroid Build Coastguard Worker }
4018*795d594fSAndroid Build Coastguard Worker 
AddConstantArea()4019*795d594fSAndroid Build Coastguard Worker void X86Assembler::AddConstantArea() {
4020*795d594fSAndroid Build Coastguard Worker   ArrayRef<const int32_t> area = constant_area_.GetBuffer();
4021*795d594fSAndroid Build Coastguard Worker   // Generate the data for the literal area.
4022*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0, e = area.size(); i < e; i++) {
4023*795d594fSAndroid Build Coastguard Worker     AssemblerBuffer::EnsureCapacity ensured(&buffer_);
4024*795d594fSAndroid Build Coastguard Worker     EmitInt32(area[i]);
4025*795d594fSAndroid Build Coastguard Worker   }
4026*795d594fSAndroid Build Coastguard Worker }
4027*795d594fSAndroid Build Coastguard Worker 
AppendInt32(int32_t v)4028*795d594fSAndroid Build Coastguard Worker size_t ConstantArea::AppendInt32(int32_t v) {
4029*795d594fSAndroid Build Coastguard Worker   size_t result = buffer_.size() * elem_size_;
4030*795d594fSAndroid Build Coastguard Worker   buffer_.push_back(v);
4031*795d594fSAndroid Build Coastguard Worker   return result;
4032*795d594fSAndroid Build Coastguard Worker }
4033*795d594fSAndroid Build Coastguard Worker 
AddInt32(int32_t v)4034*795d594fSAndroid Build Coastguard Worker size_t ConstantArea::AddInt32(int32_t v) {
4035*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0, e = buffer_.size(); i < e; i++) {
4036*795d594fSAndroid Build Coastguard Worker     if (v == buffer_[i]) {
4037*795d594fSAndroid Build Coastguard Worker       return i * elem_size_;
4038*795d594fSAndroid Build Coastguard Worker     }
4039*795d594fSAndroid Build Coastguard Worker   }
4040*795d594fSAndroid Build Coastguard Worker 
4041*795d594fSAndroid Build Coastguard Worker   // Didn't match anything.
4042*795d594fSAndroid Build Coastguard Worker   return AppendInt32(v);
4043*795d594fSAndroid Build Coastguard Worker }
4044*795d594fSAndroid Build Coastguard Worker 
AddInt64(int64_t v)4045*795d594fSAndroid Build Coastguard Worker size_t ConstantArea::AddInt64(int64_t v) {
4046*795d594fSAndroid Build Coastguard Worker   int32_t v_low = Low32Bits(v);
4047*795d594fSAndroid Build Coastguard Worker   int32_t v_high = High32Bits(v);
4048*795d594fSAndroid Build Coastguard Worker   if (buffer_.size() > 1) {
4049*795d594fSAndroid Build Coastguard Worker     // Ensure we don't pass the end of the buffer.
4050*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) {
4051*795d594fSAndroid Build Coastguard Worker       if (v_low == buffer_[i] && v_high == buffer_[i + 1]) {
4052*795d594fSAndroid Build Coastguard Worker         return i * elem_size_;
4053*795d594fSAndroid Build Coastguard Worker       }
4054*795d594fSAndroid Build Coastguard Worker     }
4055*795d594fSAndroid Build Coastguard Worker   }
4056*795d594fSAndroid Build Coastguard Worker 
4057*795d594fSAndroid Build Coastguard Worker   // Didn't match anything.
4058*795d594fSAndroid Build Coastguard Worker   size_t result = buffer_.size() * elem_size_;
4059*795d594fSAndroid Build Coastguard Worker   buffer_.push_back(v_low);
4060*795d594fSAndroid Build Coastguard Worker   buffer_.push_back(v_high);
4061*795d594fSAndroid Build Coastguard Worker   return result;
4062*795d594fSAndroid Build Coastguard Worker }
4063*795d594fSAndroid Build Coastguard Worker 
AddDouble(double v)4064*795d594fSAndroid Build Coastguard Worker size_t ConstantArea::AddDouble(double v) {
4065*795d594fSAndroid Build Coastguard Worker   // Treat the value as a 64-bit integer value.
4066*795d594fSAndroid Build Coastguard Worker   return AddInt64(bit_cast<int64_t, double>(v));
4067*795d594fSAndroid Build Coastguard Worker }
4068*795d594fSAndroid Build Coastguard Worker 
AddFloat(float v)4069*795d594fSAndroid Build Coastguard Worker size_t ConstantArea::AddFloat(float v) {
4070*795d594fSAndroid Build Coastguard Worker   // Treat the value as a 32-bit integer value.
4071*795d594fSAndroid Build Coastguard Worker   return AddInt32(bit_cast<int32_t, float>(v));
4072*795d594fSAndroid Build Coastguard Worker }
4073*795d594fSAndroid Build Coastguard Worker 
EmitVexPrefixByteZero(bool is_twobyte_form)4074*795d594fSAndroid Build Coastguard Worker uint8_t X86Assembler::EmitVexPrefixByteZero(bool is_twobyte_form) {
4075*795d594fSAndroid Build Coastguard Worker   /**Vex Byte 0,
4076*795d594fSAndroid Build Coastguard Worker   Bits [7:0] must contain the value 11000101b (0xC5) for 2-byte Vex
4077*795d594fSAndroid Build Coastguard Worker   Bits [7:0] must contain the value 11000100b (0xC4) for 3-byte Vex */
4078*795d594fSAndroid Build Coastguard Worker   uint8_t vex_prefix = 0xC0;
4079*795d594fSAndroid Build Coastguard Worker   if (is_twobyte_form) {
4080*795d594fSAndroid Build Coastguard Worker     // 2-Byte Vex
4081*795d594fSAndroid Build Coastguard Worker     vex_prefix |= TWO_BYTE_VEX;
4082*795d594fSAndroid Build Coastguard Worker   } else {
4083*795d594fSAndroid Build Coastguard Worker     // 3-Byte Vex
4084*795d594fSAndroid Build Coastguard Worker     vex_prefix |= THREE_BYTE_VEX;
4085*795d594fSAndroid Build Coastguard Worker   }
4086*795d594fSAndroid Build Coastguard Worker   return vex_prefix;
4087*795d594fSAndroid Build Coastguard Worker }
4088*795d594fSAndroid Build Coastguard Worker 
EmitVexPrefixByteOne(bool R,bool X,bool B,int SET_VEX_M)4089*795d594fSAndroid Build Coastguard Worker uint8_t X86Assembler::EmitVexPrefixByteOne(bool R,
4090*795d594fSAndroid Build Coastguard Worker                                            bool X,
4091*795d594fSAndroid Build Coastguard Worker                                            bool B,
4092*795d594fSAndroid Build Coastguard Worker                                            int SET_VEX_M) {
4093*795d594fSAndroid Build Coastguard Worker   /**Vex Byte 1, */
4094*795d594fSAndroid Build Coastguard Worker   uint8_t vex_prefix = VEX_INIT;
4095*795d594fSAndroid Build Coastguard Worker   /** Bit[7] This bit needs to be set to '1'
4096*795d594fSAndroid Build Coastguard Worker   otherwise the instruction is LES or LDS */
4097*795d594fSAndroid Build Coastguard Worker   if (!R) {
4098*795d594fSAndroid Build Coastguard Worker     // R .
4099*795d594fSAndroid Build Coastguard Worker     vex_prefix |= SET_VEX_R;
4100*795d594fSAndroid Build Coastguard Worker   }
4101*795d594fSAndroid Build Coastguard Worker   /** Bit[6] This bit needs to be set to '1'
4102*795d594fSAndroid Build Coastguard Worker   otherwise the instruction is LES or LDS */
4103*795d594fSAndroid Build Coastguard Worker   if (!X) {
4104*795d594fSAndroid Build Coastguard Worker     // X .
4105*795d594fSAndroid Build Coastguard Worker     vex_prefix |= SET_VEX_X;
4106*795d594fSAndroid Build Coastguard Worker   }
4107*795d594fSAndroid Build Coastguard Worker   /** Bit[5] This bit needs to be set to '1' */
4108*795d594fSAndroid Build Coastguard Worker   if (!B) {
4109*795d594fSAndroid Build Coastguard Worker     // B .
4110*795d594fSAndroid Build Coastguard Worker     vex_prefix |= SET_VEX_B;
4111*795d594fSAndroid Build Coastguard Worker   }
4112*795d594fSAndroid Build Coastguard Worker   /** Bits[4:0], */
4113*795d594fSAndroid Build Coastguard Worker   vex_prefix |= SET_VEX_M;
4114*795d594fSAndroid Build Coastguard Worker   return vex_prefix;
4115*795d594fSAndroid Build Coastguard Worker }
4116*795d594fSAndroid Build Coastguard Worker 
EmitVexPrefixByteOne(bool R,X86ManagedRegister operand,int SET_VEX_L,int SET_VEX_PP)4117*795d594fSAndroid Build Coastguard Worker uint8_t X86Assembler::EmitVexPrefixByteOne(bool R,
4118*795d594fSAndroid Build Coastguard Worker                                            X86ManagedRegister operand,
4119*795d594fSAndroid Build Coastguard Worker                                            int SET_VEX_L,
4120*795d594fSAndroid Build Coastguard Worker                                            int SET_VEX_PP) {
4121*795d594fSAndroid Build Coastguard Worker   /**Vex Byte 1, */
4122*795d594fSAndroid Build Coastguard Worker   uint8_t vex_prefix = VEX_INIT;
4123*795d594fSAndroid Build Coastguard Worker   /** Bit[7] This bit needs to be set to '1'
4124*795d594fSAndroid Build Coastguard Worker   otherwise the instruction is LES or LDS */
4125*795d594fSAndroid Build Coastguard Worker   if (!R) {
4126*795d594fSAndroid Build Coastguard Worker     // R .
4127*795d594fSAndroid Build Coastguard Worker     vex_prefix |= SET_VEX_R;
4128*795d594fSAndroid Build Coastguard Worker   }
4129*795d594fSAndroid Build Coastguard Worker   /**Bits[6:3] - 'vvvv' the source or dest register specifier */
4130*795d594fSAndroid Build Coastguard Worker   if (operand.IsNoRegister()) {
4131*795d594fSAndroid Build Coastguard Worker     vex_prefix |= 0x78;
4132*795d594fSAndroid Build Coastguard Worker   } else if (operand.IsXmmRegister()) {
4133*795d594fSAndroid Build Coastguard Worker     XmmRegister vvvv = operand.AsXmmRegister();
4134*795d594fSAndroid Build Coastguard Worker     int inverted_reg = 15 - static_cast<int>(vvvv);
4135*795d594fSAndroid Build Coastguard Worker     uint8_t reg = static_cast<uint8_t>(inverted_reg);
4136*795d594fSAndroid Build Coastguard Worker     vex_prefix |= ((reg & 0x0F) << 3);
4137*795d594fSAndroid Build Coastguard Worker   } else if (operand.IsCpuRegister()) {
4138*795d594fSAndroid Build Coastguard Worker     Register vvvv = operand.AsCpuRegister();
4139*795d594fSAndroid Build Coastguard Worker     int inverted_reg = 15 - static_cast<int>(vvvv);
4140*795d594fSAndroid Build Coastguard Worker     uint8_t reg = static_cast<uint8_t>(inverted_reg);
4141*795d594fSAndroid Build Coastguard Worker     vex_prefix |= ((reg & 0x0F) << 3);
4142*795d594fSAndroid Build Coastguard Worker   }
4143*795d594fSAndroid Build Coastguard Worker   /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
4144*795d594fSAndroid Build Coastguard Worker   VEX.L = 0 indicates 128 bit vector operation */
4145*795d594fSAndroid Build Coastguard Worker   vex_prefix |= SET_VEX_L;
4146*795d594fSAndroid Build Coastguard Worker   /** Bits[1:0] -  "pp" */
4147*795d594fSAndroid Build Coastguard Worker   vex_prefix |= SET_VEX_PP;
4148*795d594fSAndroid Build Coastguard Worker   return vex_prefix;
4149*795d594fSAndroid Build Coastguard Worker }
4150*795d594fSAndroid Build Coastguard Worker 
EmitVexPrefixByteTwo(bool W,X86ManagedRegister operand,int SET_VEX_L,int SET_VEX_PP)4151*795d594fSAndroid Build Coastguard Worker uint8_t X86Assembler::EmitVexPrefixByteTwo(bool W,
4152*795d594fSAndroid Build Coastguard Worker                                            X86ManagedRegister operand,
4153*795d594fSAndroid Build Coastguard Worker                                            int SET_VEX_L,
4154*795d594fSAndroid Build Coastguard Worker                                            int SET_VEX_PP) {
4155*795d594fSAndroid Build Coastguard Worker   /** Vex Byte 2, */
4156*795d594fSAndroid Build Coastguard Worker   uint8_t vex_prefix = VEX_INIT;
4157*795d594fSAndroid Build Coastguard Worker   /** Bit[7] This bits needs to be set to '1' with default value.
4158*795d594fSAndroid Build Coastguard Worker   When using C4H form of VEX prefix, W value is ignored */
4159*795d594fSAndroid Build Coastguard Worker   if (W) {
4160*795d594fSAndroid Build Coastguard Worker     vex_prefix |= SET_VEX_W;
4161*795d594fSAndroid Build Coastguard Worker   }
4162*795d594fSAndroid Build Coastguard Worker   /** Bits[6:3] - 'vvvv' the source or dest register specifier */
4163*795d594fSAndroid Build Coastguard Worker   if (operand.IsXmmRegister()) {
4164*795d594fSAndroid Build Coastguard Worker     XmmRegister vvvv = operand.AsXmmRegister();
4165*795d594fSAndroid Build Coastguard Worker     int inverted_reg = 15 - static_cast<int>(vvvv);
4166*795d594fSAndroid Build Coastguard Worker     uint8_t reg = static_cast<uint8_t>(inverted_reg);
4167*795d594fSAndroid Build Coastguard Worker     vex_prefix |= ((reg & 0x0F) << 3);
4168*795d594fSAndroid Build Coastguard Worker   } else if (operand.IsCpuRegister()) {
4169*795d594fSAndroid Build Coastguard Worker     Register vvvv = operand.AsCpuRegister();
4170*795d594fSAndroid Build Coastguard Worker     int inverted_reg = 15 - static_cast<int>(vvvv);
4171*795d594fSAndroid Build Coastguard Worker     uint8_t reg = static_cast<uint8_t>(inverted_reg);
4172*795d594fSAndroid Build Coastguard Worker     vex_prefix |= ((reg & 0x0F) << 3);
4173*795d594fSAndroid Build Coastguard Worker   }
4174*795d594fSAndroid Build Coastguard Worker   /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
4175*795d594fSAndroid Build Coastguard Worker   VEX.L = 0 indicates 128 bit vector operation */
4176*795d594fSAndroid Build Coastguard Worker   vex_prefix |= SET_VEX_L;
4177*795d594fSAndroid Build Coastguard Worker   // Bits[1:0] -  "pp"
4178*795d594fSAndroid Build Coastguard Worker   vex_prefix |= SET_VEX_PP;
4179*795d594fSAndroid Build Coastguard Worker   return vex_prefix;
4180*795d594fSAndroid Build Coastguard Worker }
4181*795d594fSAndroid Build Coastguard Worker 
EmitVexPrefixByteTwo(bool W,int SET_VEX_L,int SET_VEX_PP)4182*795d594fSAndroid Build Coastguard Worker uint8_t X86Assembler::EmitVexPrefixByteTwo(bool W,
4183*795d594fSAndroid Build Coastguard Worker                                            int SET_VEX_L,
4184*795d594fSAndroid Build Coastguard Worker                                            int SET_VEX_PP) {
4185*795d594fSAndroid Build Coastguard Worker   /**Vex Byte 2, */
4186*795d594fSAndroid Build Coastguard Worker   uint8_t vex_prefix = VEX_INIT;
4187*795d594fSAndroid Build Coastguard Worker 
4188*795d594fSAndroid Build Coastguard Worker   /** Bit[7] This bits needs to be set to '1' with default value.
4189*795d594fSAndroid Build Coastguard Worker   When using C4H form of VEX prefix, W value is ignored */
4190*795d594fSAndroid Build Coastguard Worker   if (W) {
4191*795d594fSAndroid Build Coastguard Worker     vex_prefix |= SET_VEX_W;
4192*795d594fSAndroid Build Coastguard Worker   }
4193*795d594fSAndroid Build Coastguard Worker   /** Bits[6:3] - 'vvvv' the source or dest register specifier,
4194*795d594fSAndroid Build Coastguard Worker   if unused set 1111 */
4195*795d594fSAndroid Build Coastguard Worker   vex_prefix |= (0x0F << 3);
4196*795d594fSAndroid Build Coastguard Worker 
4197*795d594fSAndroid Build Coastguard Worker   /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
4198*795d594fSAndroid Build Coastguard Worker   VEX.L = 0 indicates 128 bit vector operation */
4199*795d594fSAndroid Build Coastguard Worker   vex_prefix |= SET_VEX_L;
4200*795d594fSAndroid Build Coastguard Worker 
4201*795d594fSAndroid Build Coastguard Worker   /** Bits[1:0] -  "pp" */
4202*795d594fSAndroid Build Coastguard Worker   if (SET_VEX_PP != SET_VEX_PP_NONE) {
4203*795d594fSAndroid Build Coastguard Worker     vex_prefix |= SET_VEX_PP;
4204*795d594fSAndroid Build Coastguard Worker   }
4205*795d594fSAndroid Build Coastguard Worker   return vex_prefix;
4206*795d594fSAndroid Build Coastguard Worker }
4207*795d594fSAndroid Build Coastguard Worker 
4208*795d594fSAndroid Build Coastguard Worker }  // namespace x86
4209*795d594fSAndroid Build Coastguard Worker }  // namespace art
4210