blob: 55f769151458cf7f2a6474c8e71a1512d31c49b0 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070016
Ian Rogers2c8f6532011-09-02 17:16:34 -070017#include "assembler_x86.h"
18
Elliott Hughes1aa246d2012-12-13 09:29:36 -080019#include "base/casts.h"
David Sehr1ce2b3b2018-04-05 11:02:03 -070020#include "base/memory_region.h"
Ian Rogers166db042013-07-26 12:05:57 -070021#include "entrypoints/quick/quick_entrypoints.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070022#include "thread.h"
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070023
Carl Shapiro6b6b5f02011-06-21 15:05:09 -070024namespace art {
Ian Rogers2c8f6532011-09-02 17:16:34 -070025namespace x86 {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070026
Ian Rogersb033c752011-07-20 12:22:35 -070027std::ostream& operator<<(std::ostream& os, const XmmRegister& reg) {
28 return os << "XMM" << static_cast<int>(reg);
29}
30
31std::ostream& operator<<(std::ostream& os, const X87Register& reg) {
32 return os << "ST" << static_cast<int>(reg);
33}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070034
Aart Bikcaa31e72017-09-14 17:08:50 -070035std::ostream& operator<<(std::ostream& os, const Address& addr) {
36 switch (addr.mod()) {
37 case 0:
Aart Bikf7754e82017-09-20 10:33:06 -070038 if (addr.rm() != ESP || addr.index() == ESP) {
39 return os << "(%" << addr.rm() << ")";
40 } else if (addr.base() == EBP) {
41 return os << static_cast<int>(addr.disp32()) << "(,%" << addr.index()
42 << "," << (1 << addr.scale()) << ")";
Aart Bikcaa31e72017-09-14 17:08:50 -070043 }
Aart Bikf7754e82017-09-20 10:33:06 -070044 return os << "(%" << addr.base() << ",%" << addr.index() << "," << (1 << addr.scale()) << ")";
Aart Bikcaa31e72017-09-14 17:08:50 -070045 case 1:
Aart Bikf7754e82017-09-20 10:33:06 -070046 if (addr.rm() != ESP || addr.index() == ESP) {
47 return os << static_cast<int>(addr.disp8()) << "(%" << addr.rm() << ")";
Aart Bikcaa31e72017-09-14 17:08:50 -070048 }
Aart Bikf7754e82017-09-20 10:33:06 -070049 return os << static_cast<int>(addr.disp8()) << "(%" << addr.base() << ",%"
50 << addr.index() << "," << (1 << addr.scale()) << ")";
Aart Bikcaa31e72017-09-14 17:08:50 -070051 case 2:
Aart Bikf7754e82017-09-20 10:33:06 -070052 if (addr.rm() != ESP || addr.index() == ESP) {
53 return os << static_cast<int>(addr.disp32()) << "(%" << addr.rm() << ")";
Aart Bikcaa31e72017-09-14 17:08:50 -070054 }
Aart Bikf7754e82017-09-20 10:33:06 -070055 return os << static_cast<int>(addr.disp32()) << "(%" << addr.base() << ",%"
56 << addr.index() << "," << (1 << addr.scale()) << ")";
Aart Bikcaa31e72017-09-14 17:08:50 -070057 default:
58 return os << "<address?>";
59 }
60}
61
jaishank20d1c942019-03-08 15:08:17 +053062bool X86Assembler::CpuHasAVXorAVX2FeatureFlag() {
63 if (has_AVX_ || has_AVX2_) {
64 return true;
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +053065 }
jaishank20d1c942019-03-08 15:08:17 +053066 return false;
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +053067}
68
Ian Rogers2c8f6532011-09-02 17:16:34 -070069void X86Assembler::call(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070070 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
71 EmitUint8(0xFF);
72 EmitRegisterOperand(2, reg);
73}
74
75
Ian Rogers2c8f6532011-09-02 17:16:34 -070076void X86Assembler::call(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070077 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
78 EmitUint8(0xFF);
79 EmitOperand(2, address);
80}
81
82
Ian Rogers2c8f6532011-09-02 17:16:34 -070083void X86Assembler::call(Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070084 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
85 EmitUint8(0xE8);
86 static const int kSize = 5;
Nicolas Geoffray1cf95282014-12-12 19:22:03 +000087 // Offset by one because we already have emitted the opcode.
88 EmitLabel(label, kSize - 1);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -070089}
90
91
Nicolas Geoffray8ccc3f52014-03-19 10:34:11 +000092void X86Assembler::call(const ExternalLabel& label) {
93 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
94 intptr_t call_start = buffer_.GetPosition();
95 EmitUint8(0xE8);
96 EmitInt32(label.address());
97 static const intptr_t kCallExternalLabelSize = 5;
98 DCHECK_EQ((buffer_.GetPosition() - call_start), kCallExternalLabelSize);
99}
100
101
Ian Rogers2c8f6532011-09-02 17:16:34 -0700102void X86Assembler::pushl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700103 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
104 EmitUint8(0x50 + reg);
105}
106
107
Ian Rogers2c8f6532011-09-02 17:16:34 -0700108void X86Assembler::pushl(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700109 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
110 EmitUint8(0xFF);
111 EmitOperand(6, address);
112}
113
114
Ian Rogers2c8f6532011-09-02 17:16:34 -0700115void X86Assembler::pushl(const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700116 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
Ian Rogers44fb0d02012-03-23 16:46:24 -0700117 if (imm.is_int8()) {
118 EmitUint8(0x6A);
119 EmitUint8(imm.value() & 0xFF);
120 } else {
121 EmitUint8(0x68);
122 EmitImmediate(imm);
123 }
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700124}
125
126
Ian Rogers2c8f6532011-09-02 17:16:34 -0700127void X86Assembler::popl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700128 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
129 EmitUint8(0x58 + reg);
130}
131
132
Ian Rogers2c8f6532011-09-02 17:16:34 -0700133void X86Assembler::popl(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700134 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
135 EmitUint8(0x8F);
136 EmitOperand(0, address);
137}
138
139
Ian Rogers2c8f6532011-09-02 17:16:34 -0700140void X86Assembler::movl(Register dst, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700141 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
142 EmitUint8(0xB8 + dst);
143 EmitImmediate(imm);
144}
145
146
Ian Rogers2c8f6532011-09-02 17:16:34 -0700147void X86Assembler::movl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700148 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
149 EmitUint8(0x89);
150 EmitRegisterOperand(src, dst);
151}
152
153
Ian Rogers2c8f6532011-09-02 17:16:34 -0700154void X86Assembler::movl(Register dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700155 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
156 EmitUint8(0x8B);
157 EmitOperand(dst, src);
158}
159
160
Ian Rogers2c8f6532011-09-02 17:16:34 -0700161void X86Assembler::movl(const Address& dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700162 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
163 EmitUint8(0x89);
164 EmitOperand(src, dst);
165}
166
167
Ian Rogers2c8f6532011-09-02 17:16:34 -0700168void X86Assembler::movl(const Address& dst, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700169 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
170 EmitUint8(0xC7);
171 EmitOperand(0, dst);
172 EmitImmediate(imm);
173}
174
Ian Rogersbdb03912011-09-14 00:55:44 -0700175void X86Assembler::movl(const Address& dst, Label* lbl) {
176 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
177 EmitUint8(0xC7);
178 EmitOperand(0, dst);
179 EmitLabel(lbl, dst.length_ + 5);
180}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700181
Mark Mendell7a08fb52015-07-15 14:09:35 -0400182void X86Assembler::movntl(const Address& dst, Register src) {
183 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
184 EmitUint8(0x0F);
185 EmitUint8(0xC3);
186 EmitOperand(src, dst);
187}
188
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +0530189void X86Assembler::blsi(Register dst, Register src) {
190 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100191 uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
jaishank20d1c942019-03-08 15:08:17 +0530192 uint8_t byte_one = EmitVexPrefixByteOne(false, false, false, SET_VEX_M_0F_38);
193 uint8_t byte_two = EmitVexPrefixByteTwo(false,
194 X86ManagedRegister::FromCpuRegister(dst),
195 SET_VEX_L_128, SET_VEX_PP_NONE);
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +0530196 EmitUint8(byte_zero);
197 EmitUint8(byte_one);
198 EmitUint8(byte_two);
199 EmitUint8(0xF3);
200 EmitRegisterOperand(3, src);
201}
202
203void X86Assembler::blsmsk(Register dst, Register src) {
204 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100205 uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
jaishank20d1c942019-03-08 15:08:17 +0530206 uint8_t byte_one = EmitVexPrefixByteOne(false, false, false, SET_VEX_M_0F_38);
207 uint8_t byte_two = EmitVexPrefixByteTwo(false,
208 X86ManagedRegister::FromCpuRegister(dst),
209 SET_VEX_L_128, SET_VEX_PP_NONE);
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +0530210 EmitUint8(byte_zero);
211 EmitUint8(byte_one);
212 EmitUint8(byte_two);
213 EmitUint8(0xF3);
214 EmitRegisterOperand(2, src);
215}
216
217void X86Assembler::blsr(Register dst, Register src) {
218 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100219 uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
jaishank20d1c942019-03-08 15:08:17 +0530220 uint8_t byte_one = EmitVexPrefixByteOne(false, false, false, SET_VEX_M_0F_38);
221 uint8_t byte_two = EmitVexPrefixByteTwo(false,
222 X86ManagedRegister::FromCpuRegister(dst),
223 SET_VEX_L_128, SET_VEX_PP_NONE);
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +0530224 EmitUint8(byte_zero);
225 EmitUint8(byte_one);
226 EmitUint8(byte_two);
227 EmitUint8(0xF3);
228 EmitRegisterOperand(1, src);
229}
230
Mark Mendell09ed1a32015-03-25 08:30:06 -0400231void X86Assembler::bswapl(Register dst) {
232 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
233 EmitUint8(0x0F);
234 EmitUint8(0xC8 + dst);
235}
236
Mark Mendellbcee0922015-09-15 21:45:01 -0400237void X86Assembler::bsfl(Register dst, Register src) {
238 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
239 EmitUint8(0x0F);
240 EmitUint8(0xBC);
241 EmitRegisterOperand(dst, src);
242}
243
244void X86Assembler::bsfl(Register dst, const Address& src) {
245 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
246 EmitUint8(0x0F);
247 EmitUint8(0xBC);
248 EmitOperand(dst, src);
249}
250
Mark Mendell8ae3ffb2015-08-12 21:16:41 -0400251void X86Assembler::bsrl(Register dst, Register src) {
252 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
253 EmitUint8(0x0F);
254 EmitUint8(0xBD);
255 EmitRegisterOperand(dst, src);
256}
257
258void X86Assembler::bsrl(Register dst, const Address& src) {
259 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
260 EmitUint8(0x0F);
261 EmitUint8(0xBD);
262 EmitOperand(dst, src);
263}
264
Aart Bikc39dac12016-01-21 08:59:48 -0800265void X86Assembler::popcntl(Register dst, Register src) {
266 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
267 EmitUint8(0xF3);
268 EmitUint8(0x0F);
269 EmitUint8(0xB8);
270 EmitRegisterOperand(dst, src);
271}
272
273void X86Assembler::popcntl(Register dst, const Address& src) {
274 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
275 EmitUint8(0xF3);
276 EmitUint8(0x0F);
277 EmitUint8(0xB8);
278 EmitOperand(dst, src);
279}
280
Ian Rogers2c8f6532011-09-02 17:16:34 -0700281void X86Assembler::movzxb(Register dst, ByteRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700282 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
283 EmitUint8(0x0F);
284 EmitUint8(0xB6);
285 EmitRegisterOperand(dst, src);
286}
287
288
Ian Rogers2c8f6532011-09-02 17:16:34 -0700289void X86Assembler::movzxb(Register dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700290 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
291 EmitUint8(0x0F);
292 EmitUint8(0xB6);
293 EmitOperand(dst, src);
294}
295
296
Ian Rogers2c8f6532011-09-02 17:16:34 -0700297void X86Assembler::movsxb(Register dst, ByteRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700298 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
299 EmitUint8(0x0F);
300 EmitUint8(0xBE);
301 EmitRegisterOperand(dst, src);
302}
303
304
Ian Rogers2c8f6532011-09-02 17:16:34 -0700305void X86Assembler::movsxb(Register dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700306 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
307 EmitUint8(0x0F);
308 EmitUint8(0xBE);
309 EmitOperand(dst, src);
310}
311
312
Elliott Hughes1bac54f2012-03-16 12:48:31 -0700313void X86Assembler::movb(Register /*dst*/, const Address& /*src*/) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700314 LOG(FATAL) << "Use movzxb or movsxb instead.";
315}
316
317
Ian Rogers2c8f6532011-09-02 17:16:34 -0700318void X86Assembler::movb(const Address& dst, ByteRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700319 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
320 EmitUint8(0x88);
321 EmitOperand(src, dst);
322}
323
324
Ian Rogers2c8f6532011-09-02 17:16:34 -0700325void X86Assembler::movb(const Address& dst, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700326 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
327 EmitUint8(0xC6);
328 EmitOperand(EAX, dst);
329 CHECK(imm.is_int8());
330 EmitUint8(imm.value() & 0xFF);
331}
332
333
Ian Rogers2c8f6532011-09-02 17:16:34 -0700334void X86Assembler::movzxw(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700335 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
336 EmitUint8(0x0F);
337 EmitUint8(0xB7);
338 EmitRegisterOperand(dst, src);
339}
340
341
Ian Rogers2c8f6532011-09-02 17:16:34 -0700342void X86Assembler::movzxw(Register dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700343 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
344 EmitUint8(0x0F);
345 EmitUint8(0xB7);
346 EmitOperand(dst, src);
347}
348
349
Ian Rogers2c8f6532011-09-02 17:16:34 -0700350void X86Assembler::movsxw(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700351 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
352 EmitUint8(0x0F);
353 EmitUint8(0xBF);
354 EmitRegisterOperand(dst, src);
355}
356
357
Ian Rogers2c8f6532011-09-02 17:16:34 -0700358void X86Assembler::movsxw(Register dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700359 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
360 EmitUint8(0x0F);
361 EmitUint8(0xBF);
362 EmitOperand(dst, src);
363}
364
365
Elliott Hughes1bac54f2012-03-16 12:48:31 -0700366void X86Assembler::movw(Register /*dst*/, const Address& /*src*/) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700367 LOG(FATAL) << "Use movzxw or movsxw instead.";
368}
369
370
Ian Rogers2c8f6532011-09-02 17:16:34 -0700371void X86Assembler::movw(const Address& dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700372 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
373 EmitOperandSizeOverride();
374 EmitUint8(0x89);
375 EmitOperand(src, dst);
376}
377
378
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +0100379void X86Assembler::movw(const Address& dst, const Immediate& imm) {
380 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
381 EmitOperandSizeOverride();
382 EmitUint8(0xC7);
383 EmitOperand(0, dst);
Nicolas Geoffrayb6e72062014-10-07 14:54:48 +0100384 CHECK(imm.is_uint16() || imm.is_int16());
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +0100385 EmitUint8(imm.value() & 0xFF);
386 EmitUint8(imm.value() >> 8);
387}
388
389
Ian Rogers2c8f6532011-09-02 17:16:34 -0700390void X86Assembler::leal(Register dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700391 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
392 EmitUint8(0x8D);
393 EmitOperand(dst, src);
394}
395
396
Ian Rogers2c8f6532011-09-02 17:16:34 -0700397void X86Assembler::cmovl(Condition condition, Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700398 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
399 EmitUint8(0x0F);
Ian Rogersb033c752011-07-20 12:22:35 -0700400 EmitUint8(0x40 + condition);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700401 EmitRegisterOperand(dst, src);
402}
403
404
Mark Mendellabdac472016-02-12 13:49:03 -0500405void X86Assembler::cmovl(Condition condition, Register dst, const Address& src) {
406 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
407 EmitUint8(0x0F);
408 EmitUint8(0x40 + condition);
409 EmitOperand(dst, src);
410}
411
412
Nicolas Geoffray5b4b8982014-12-18 17:45:56 +0000413void X86Assembler::setb(Condition condition, Register dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700414 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
415 EmitUint8(0x0F);
Ian Rogersb033c752011-07-20 12:22:35 -0700416 EmitUint8(0x90 + condition);
Nicolas Geoffray5b4b8982014-12-18 17:45:56 +0000417 EmitOperand(0, Operand(dst));
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700418}
419
420
Nicolas Geoffray7fb49da2014-10-06 09:12:41 +0100421void X86Assembler::movaps(XmmRegister dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530422 if (CpuHasAVXorAVX2FeatureFlag()) {
423 vmovaps(dst, src);
424 return;
425 }
Nicolas Geoffray7fb49da2014-10-06 09:12:41 +0100426 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
427 EmitUint8(0x0F);
428 EmitUint8(0x28);
429 EmitXmmRegisterOperand(dst, src);
430}
431
jaishank20d1c942019-03-08 15:08:17 +0530432/**VEX.128.0F.WIG 28 /r VMOVAPS xmm1, xmm2*/
433void X86Assembler::vmovaps(XmmRegister dst, XmmRegister src) {
434 DCHECK(CpuHasAVXorAVX2FeatureFlag());
435 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
436 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100437 uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530438 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
439 /**a REX prefix is necessary only if an instruction references one of the
440 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100441 uint8_t byte_one = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530442 vvvv_reg,
443 SET_VEX_L_128,
444 SET_VEX_PP_NONE);
445 EmitUint8(byte_zero);
446 EmitUint8(byte_one);
447 /**Instruction Opcode*/
448 EmitUint8(0x28);
449 /**Instruction Operands*/
450 EmitXmmRegisterOperand(dst, src);
451}
Nicolas Geoffray7fb49da2014-10-06 09:12:41 +0100452
Aart Bikc7782262017-01-13 16:20:08 -0800453void X86Assembler::movaps(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +0530454 if (CpuHasAVXorAVX2FeatureFlag()) {
455 vmovaps(dst, src);
456 return;
457 }
Aart Bikc7782262017-01-13 16:20:08 -0800458 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
459 EmitUint8(0x0F);
460 EmitUint8(0x28);
461 EmitOperand(dst, src);
462}
463
jaishank20d1c942019-03-08 15:08:17 +0530464/**VEX.128.0F.WIG 28 /r VMOVAPS xmm1, m128*/
465void X86Assembler::vmovaps(XmmRegister dst, const Address& src) {
466 DCHECK(CpuHasAVXorAVX2FeatureFlag());
467 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
468 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100469 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530470 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
471 /**a REX prefix is necessary only if an instruction references one of the
472 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100473 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530474 vvvv_reg,
475 SET_VEX_L_128,
476 SET_VEX_PP_NONE);
477 EmitUint8(ByteZero);
478 EmitUint8(ByteOne);
479 /**Instruction Opcode*/
480 EmitUint8(0x28);
481 /**Instruction Operands*/
482 EmitOperand(dst, src);
483}
Aart Bikc7782262017-01-13 16:20:08 -0800484
485void X86Assembler::movups(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +0530486 if (CpuHasAVXorAVX2FeatureFlag()) {
487 vmovups(dst, src);
488 return;
489 }
Aart Bikc7782262017-01-13 16:20:08 -0800490 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
491 EmitUint8(0x0F);
492 EmitUint8(0x10);
493 EmitOperand(dst, src);
494}
495
jaishank20d1c942019-03-08 15:08:17 +0530496/**VEX.128.0F.WIG 10 /r VMOVUPS xmm1, m128*/
497void X86Assembler::vmovups(XmmRegister dst, const Address& src) {
498 DCHECK(CpuHasAVXorAVX2FeatureFlag());
499 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
500 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100501 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530502 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
503 /**a REX prefix is necessary only if an instruction references one of the
504 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100505 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530506 vvvv_reg,
507 SET_VEX_L_128,
508 SET_VEX_PP_NONE);
509 EmitUint8(ByteZero);
510 EmitUint8(ByteOne);
511 /*Instruction Opcode*/
512 EmitUint8(0x10);
513 /*Instruction Operands*/
514 EmitOperand(dst, src);
515}
Aart Bikc7782262017-01-13 16:20:08 -0800516
517void X86Assembler::movaps(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530518 if (CpuHasAVXorAVX2FeatureFlag()) {
519 vmovaps(dst, src);
520 return;
521 }
Aart Bikc7782262017-01-13 16:20:08 -0800522 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
523 EmitUint8(0x0F);
524 EmitUint8(0x29);
525 EmitOperand(src, dst);
526}
527
jaishank20d1c942019-03-08 15:08:17 +0530528/**VEX.128.0F.WIG 29 /r VMOVAPS m128, xmm1*/
529void X86Assembler::vmovaps(const Address& dst, XmmRegister src) {
530 DCHECK(CpuHasAVXorAVX2FeatureFlag());
531 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
532 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100533 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530534 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
535 /**a REX prefix is necessary only if an instruction references one of the
536 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100537 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530538 vvvv_reg,
539 SET_VEX_L_128,
540 SET_VEX_PP_NONE);
541 EmitUint8(ByteZero);
542 EmitUint8(ByteOne);
543 /**Instruction Opcode*/
544 EmitUint8(0x29);
545 /**Instruction Operands*/
546 EmitOperand(src, dst);
547}
Aart Bikc7782262017-01-13 16:20:08 -0800548
549void X86Assembler::movups(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530550 if (CpuHasAVXorAVX2FeatureFlag()) {
551 vmovups(dst, src);
552 return;
553 }
Aart Bikc7782262017-01-13 16:20:08 -0800554 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
555 EmitUint8(0x0F);
556 EmitUint8(0x11);
557 EmitOperand(src, dst);
558}
559
jaishank20d1c942019-03-08 15:08:17 +0530560/**VEX.128.0F.WIG 11 /r VMOVUPS m128, xmm1*/
561void X86Assembler::vmovups(const Address& dst, XmmRegister src) {
562 DCHECK(CpuHasAVXorAVX2FeatureFlag());
563 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
564 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100565 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530566 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
567 /**a REX prefix is necessary only if an instruction references one of the
568 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100569 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530570 vvvv_reg,
571 SET_VEX_L_128,
572 SET_VEX_PP_NONE);
573 EmitUint8(ByteZero);
574 EmitUint8(ByteOne);
575 // Instruction Opcode
576 EmitUint8(0x11);
577 // Instruction Operands
578 EmitOperand(src, dst);
579}
580
Aart Bikc7782262017-01-13 16:20:08 -0800581
Ian Rogers2c8f6532011-09-02 17:16:34 -0700582void X86Assembler::movss(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700583 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
584 EmitUint8(0xF3);
585 EmitUint8(0x0F);
586 EmitUint8(0x10);
587 EmitOperand(dst, src);
588}
589
590
Ian Rogers2c8f6532011-09-02 17:16:34 -0700591void X86Assembler::movss(const Address& dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700592 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
593 EmitUint8(0xF3);
594 EmitUint8(0x0F);
595 EmitUint8(0x11);
596 EmitOperand(src, dst);
597}
598
599
Ian Rogers2c8f6532011-09-02 17:16:34 -0700600void X86Assembler::movss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700601 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
602 EmitUint8(0xF3);
603 EmitUint8(0x0F);
604 EmitUint8(0x11);
605 EmitXmmRegisterOperand(src, dst);
606}
607
608
Ian Rogers2c8f6532011-09-02 17:16:34 -0700609void X86Assembler::movd(XmmRegister dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700610 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
611 EmitUint8(0x66);
612 EmitUint8(0x0F);
613 EmitUint8(0x6E);
614 EmitOperand(dst, Operand(src));
615}
616
617
Ian Rogers2c8f6532011-09-02 17:16:34 -0700618void X86Assembler::movd(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700619 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
620 EmitUint8(0x66);
621 EmitUint8(0x0F);
622 EmitUint8(0x7E);
623 EmitOperand(src, Operand(dst));
624}
625
626
Ian Rogers2c8f6532011-09-02 17:16:34 -0700627void X86Assembler::addss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700628 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
629 EmitUint8(0xF3);
630 EmitUint8(0x0F);
631 EmitUint8(0x58);
632 EmitXmmRegisterOperand(dst, src);
633}
634
635
Ian Rogers2c8f6532011-09-02 17:16:34 -0700636void X86Assembler::addss(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700637 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
638 EmitUint8(0xF3);
639 EmitUint8(0x0F);
640 EmitUint8(0x58);
641 EmitOperand(dst, src);
642}
643
644
Ian Rogers2c8f6532011-09-02 17:16:34 -0700645void X86Assembler::subss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700646 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
647 EmitUint8(0xF3);
648 EmitUint8(0x0F);
649 EmitUint8(0x5C);
650 EmitXmmRegisterOperand(dst, src);
651}
652
653
Ian Rogers2c8f6532011-09-02 17:16:34 -0700654void X86Assembler::subss(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700655 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
656 EmitUint8(0xF3);
657 EmitUint8(0x0F);
658 EmitUint8(0x5C);
659 EmitOperand(dst, src);
660}
661
662
Ian Rogers2c8f6532011-09-02 17:16:34 -0700663void X86Assembler::mulss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700664 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
665 EmitUint8(0xF3);
666 EmitUint8(0x0F);
667 EmitUint8(0x59);
668 EmitXmmRegisterOperand(dst, src);
669}
670
671
Ian Rogers2c8f6532011-09-02 17:16:34 -0700672void X86Assembler::mulss(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700673 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
674 EmitUint8(0xF3);
675 EmitUint8(0x0F);
676 EmitUint8(0x59);
677 EmitOperand(dst, src);
678}
679
680
Ian Rogers2c8f6532011-09-02 17:16:34 -0700681void X86Assembler::divss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700682 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
683 EmitUint8(0xF3);
684 EmitUint8(0x0F);
685 EmitUint8(0x5E);
686 EmitXmmRegisterOperand(dst, src);
687}
688
689
Ian Rogers2c8f6532011-09-02 17:16:34 -0700690void X86Assembler::divss(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700691 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
692 EmitUint8(0xF3);
693 EmitUint8(0x0F);
694 EmitUint8(0x5E);
695 EmitOperand(dst, src);
696}
697
698
Aart Bikc7782262017-01-13 16:20:08 -0800699void X86Assembler::addps(XmmRegister dst, XmmRegister src) {
700 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
701 EmitUint8(0x0F);
702 EmitUint8(0x58);
703 EmitXmmRegisterOperand(dst, src);
704}
705
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +0530706void X86Assembler::vaddps(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
707 DCHECK(CpuHasAVXorAVX2FeatureFlag());
708 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
709 uint8_t ByteZero = 0x00, ByteOne = 0x00;
710 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
711 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
712 X86ManagedRegister::FromXmmRegister(add_left),
713 SET_VEX_L_128,
714 SET_VEX_PP_NONE);
715 EmitUint8(ByteZero);
716 EmitUint8(ByteOne);
717 EmitUint8(0x58);
718 EmitXmmRegisterOperand(dst, add_right);
719}
Aart Bikc7782262017-01-13 16:20:08 -0800720
721void X86Assembler::subps(XmmRegister dst, XmmRegister src) {
722 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
723 EmitUint8(0x0F);
724 EmitUint8(0x5C);
725 EmitXmmRegisterOperand(dst, src);
726}
727
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +0530728void X86Assembler::vsubps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
729 DCHECK(CpuHasAVXorAVX2FeatureFlag());
730 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
731 uint8_t byte_zero = 0x00, byte_one = 0x00;
732 byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
733 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(src1);
734 byte_one = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_NONE);
735 EmitUint8(byte_zero);
736 EmitUint8(byte_one);
737 EmitUint8(0x5C);
738 EmitXmmRegisterOperand(dst, src2);
739}
Aart Bikc7782262017-01-13 16:20:08 -0800740
741void X86Assembler::mulps(XmmRegister dst, XmmRegister src) {
742 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
743 EmitUint8(0x0F);
744 EmitUint8(0x59);
745 EmitXmmRegisterOperand(dst, src);
746}
747
Shalini Salomi Bodapatib45a4352019-07-10 16:09:41 +0530748void X86Assembler::vmulps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
749 DCHECK(CpuHasAVXorAVX2FeatureFlag());
750 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
751 uint8_t ByteZero = 0x00, ByteOne = 0x00;
752 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
753 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
754 X86ManagedRegister::FromXmmRegister(src1),
755 SET_VEX_L_128,
756 SET_VEX_PP_NONE);
757 EmitUint8(ByteZero);
758 EmitUint8(ByteOne);
759 EmitUint8(0x59);
760 EmitXmmRegisterOperand(dst, src2);
761}
Aart Bikc7782262017-01-13 16:20:08 -0800762
763void X86Assembler::divps(XmmRegister dst, XmmRegister src) {
764 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
765 EmitUint8(0x0F);
766 EmitUint8(0x5E);
767 EmitXmmRegisterOperand(dst, src);
768}
769
770
Shalini Salomi Bodapatib45a4352019-07-10 16:09:41 +0530771void X86Assembler::vdivps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
772 DCHECK(CpuHasAVXorAVX2FeatureFlag());
773 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
774 uint8_t ByteZero = 0x00, ByteOne = 0x00;
775 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
776 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
777 X86ManagedRegister::FromXmmRegister(src1),
778 SET_VEX_L_128,
779 SET_VEX_PP_NONE);
780 EmitUint8(ByteZero);
781 EmitUint8(ByteOne);
782 EmitUint8(0x5E);
783 EmitXmmRegisterOperand(dst, src2);
784}
785
786
Aart Bikc7782262017-01-13 16:20:08 -0800787void X86Assembler::movapd(XmmRegister dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530788 if (CpuHasAVXorAVX2FeatureFlag()) {
789 vmovapd(dst, src);
790 return;
791 }
Aart Bikc7782262017-01-13 16:20:08 -0800792 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
793 EmitUint8(0x66);
794 EmitUint8(0x0F);
795 EmitUint8(0x28);
796 EmitXmmRegisterOperand(dst, src);
797}
798
jaishank20d1c942019-03-08 15:08:17 +0530799/**VEX.128.66.0F.WIG 28 /r VMOVAPD xmm1, xmm2*/
800void X86Assembler::vmovapd(XmmRegister dst, XmmRegister src) {
801 DCHECK(CpuHasAVXorAVX2FeatureFlag());
802 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
803 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100804 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530805 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
806 /**a REX prefix is necessary only if an instruction references one of the
807 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100808 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530809 vvvv_reg ,
810 SET_VEX_L_128,
811 SET_VEX_PP_66);
812 EmitUint8(ByteZero);
813 EmitUint8(ByteOne);
814 // Instruction Opcode
815 EmitUint8(0x28);
816 // Instruction Operands
817 EmitXmmRegisterOperand(dst, src);
818}
Aart Bikc7782262017-01-13 16:20:08 -0800819
820void X86Assembler::movapd(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +0530821 if (CpuHasAVXorAVX2FeatureFlag()) {
822 vmovapd(dst, src);
823 return;
824 }
Aart Bikc7782262017-01-13 16:20:08 -0800825 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
826 EmitUint8(0x66);
827 EmitUint8(0x0F);
828 EmitUint8(0x28);
829 EmitOperand(dst, src);
830}
831
jaishank20d1c942019-03-08 15:08:17 +0530832/**VEX.128.66.0F.WIG 28 /r VMOVAPD xmm1, m128*/
833void X86Assembler::vmovapd(XmmRegister dst, const Address& src) {
834 DCHECK(CpuHasAVXorAVX2FeatureFlag());
835 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
836 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100837 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530838 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
839 /**a REX prefix is necessary only if an instruction references one of the
840 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100841 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530842 vvvv_reg,
843 SET_VEX_L_128,
844 SET_VEX_PP_66);
845 EmitUint8(ByteZero);
846 EmitUint8(ByteOne);
847 // Instruction Opcode
848 EmitUint8(0x28);
849 // Instruction Operands
850 EmitOperand(dst, src);
851}
Aart Bikc7782262017-01-13 16:20:08 -0800852
853void X86Assembler::movupd(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +0530854 if (CpuHasAVXorAVX2FeatureFlag()) {
855 vmovupd(dst, src);
856 return;
857 }
Aart Bikc7782262017-01-13 16:20:08 -0800858 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
859 EmitUint8(0x66);
860 EmitUint8(0x0F);
861 EmitUint8(0x10);
862 EmitOperand(dst, src);
863}
864
jaishank20d1c942019-03-08 15:08:17 +0530865/**VEX.128.66.0F.WIG 10 /r VMOVUPD xmm1, m128*/
866void X86Assembler::vmovupd(XmmRegister dst, const Address& src) {
867 DCHECK(CpuHasAVXorAVX2FeatureFlag());
868 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
869 /**Instruction VEX Prefix*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100870 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530871 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
872 /**a REX prefix is necessary only if an instruction references one of the
873 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100874 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530875 vvvv_reg,
876 SET_VEX_L_128,
877 SET_VEX_PP_66);
878 EmitUint8(ByteZero);
879 EmitUint8(ByteOne);
880 // Instruction Opcode
881 EmitUint8(0x10);
882 // Instruction Operands
883 EmitOperand(dst, src);
884}
885
Aart Bikc7782262017-01-13 16:20:08 -0800886
887void X86Assembler::movapd(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530888 if (CpuHasAVXorAVX2FeatureFlag()) {
889 vmovapd(dst, src);
890 return;
891 }
Aart Bikc7782262017-01-13 16:20:08 -0800892 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
893 EmitUint8(0x66);
894 EmitUint8(0x0F);
895 EmitUint8(0x29);
896 EmitOperand(src, dst);
897}
898
jaishank20d1c942019-03-08 15:08:17 +0530899/**VEX.128.66.0F.WIG 29 /r VMOVAPD m128, xmm1 */
900void X86Assembler::vmovapd(const Address& dst, XmmRegister src) {
901 DCHECK(CpuHasAVXorAVX2FeatureFlag());
902 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
903 /**Instruction VEX Prefix */
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100904 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530905 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
906 /**a REX prefix is necessary only if an instruction references one of the
907 extended registers or uses a 64-bit operand.*/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100908 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530909 vvvv_reg,
910 SET_VEX_L_128,
911 SET_VEX_PP_66);
912 EmitUint8(ByteZero);
913 EmitUint8(ByteOne);
914 // Instruction Opcode
915 EmitUint8(0x29);
916 // Instruction Operands
917 EmitOperand(src, dst);
918}
Aart Bikc7782262017-01-13 16:20:08 -0800919
920void X86Assembler::movupd(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530921 if (CpuHasAVXorAVX2FeatureFlag()) {
922 vmovupd(dst, src);
923 return;
924 }
Aart Bikc7782262017-01-13 16:20:08 -0800925 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
926 EmitUint8(0x66);
927 EmitUint8(0x0F);
928 EmitUint8(0x11);
929 EmitOperand(src, dst);
930}
931
jaishank20d1c942019-03-08 15:08:17 +0530932/**VEX.128.66.0F.WIG 11 /r VMOVUPD m128, xmm1 */
933void X86Assembler::vmovupd(const Address& dst, XmmRegister src) {
934 DCHECK(CpuHasAVXorAVX2FeatureFlag());
935 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
936 /**Instruction VEX Prefix */
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100937 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +0530938 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
939 /**a REX prefix is necessary only if an instruction references one of the
940 extended registers or uses a 64-bit operand.**/
Vladimir Marko1b3561a2019-05-08 11:50:58 +0100941 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +0530942 vvvv_reg,
943 SET_VEX_L_128,
944 SET_VEX_PP_66);
945 EmitUint8(ByteZero);
946 EmitUint8(ByteOne);
947 // Instruction Opcode
948 EmitUint8(0x11);
949 // Instruction Operands
950 EmitOperand(src, dst);
951}
Aart Bikc7782262017-01-13 16:20:08 -0800952
Ian Rogers2c8f6532011-09-02 17:16:34 -0700953void X86Assembler::flds(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700954 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
955 EmitUint8(0xD9);
956 EmitOperand(0, src);
957}
958
959
Mark Mendell24f2dfa2015-01-14 19:51:45 -0500960void X86Assembler::fsts(const Address& dst) {
961 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
962 EmitUint8(0xD9);
963 EmitOperand(2, dst);
964}
965
966
Ian Rogers2c8f6532011-09-02 17:16:34 -0700967void X86Assembler::fstps(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700968 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
969 EmitUint8(0xD9);
970 EmitOperand(3, dst);
971}
972
973
Ian Rogers2c8f6532011-09-02 17:16:34 -0700974void X86Assembler::movsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700975 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
976 EmitUint8(0xF2);
977 EmitUint8(0x0F);
978 EmitUint8(0x10);
979 EmitOperand(dst, src);
980}
981
982
Ian Rogers2c8f6532011-09-02 17:16:34 -0700983void X86Assembler::movsd(const Address& dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700984 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
985 EmitUint8(0xF2);
986 EmitUint8(0x0F);
987 EmitUint8(0x11);
988 EmitOperand(src, dst);
989}
990
991
Ian Rogers2c8f6532011-09-02 17:16:34 -0700992void X86Assembler::movsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700993 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
994 EmitUint8(0xF2);
995 EmitUint8(0x0F);
996 EmitUint8(0x11);
997 EmitXmmRegisterOperand(src, dst);
998}
999
1000
Nicolas Geoffray234d69d2015-03-09 10:28:50 +00001001void X86Assembler::movhpd(XmmRegister dst, const Address& src) {
1002 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1003 EmitUint8(0x66);
1004 EmitUint8(0x0F);
1005 EmitUint8(0x16);
1006 EmitOperand(dst, src);
1007}
1008
1009
1010void X86Assembler::movhpd(const Address& dst, XmmRegister src) {
1011 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1012 EmitUint8(0x66);
1013 EmitUint8(0x0F);
1014 EmitUint8(0x17);
1015 EmitOperand(src, dst);
1016}
1017
1018
Ian Rogers2c8f6532011-09-02 17:16:34 -07001019void X86Assembler::addsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001020 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1021 EmitUint8(0xF2);
1022 EmitUint8(0x0F);
1023 EmitUint8(0x58);
1024 EmitXmmRegisterOperand(dst, src);
1025}
1026
1027
Ian Rogers2c8f6532011-09-02 17:16:34 -07001028void X86Assembler::addsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001029 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1030 EmitUint8(0xF2);
1031 EmitUint8(0x0F);
1032 EmitUint8(0x58);
1033 EmitOperand(dst, src);
1034}
1035
1036
Ian Rogers2c8f6532011-09-02 17:16:34 -07001037void X86Assembler::subsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001038 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1039 EmitUint8(0xF2);
1040 EmitUint8(0x0F);
1041 EmitUint8(0x5C);
1042 EmitXmmRegisterOperand(dst, src);
1043}
1044
1045
Ian Rogers2c8f6532011-09-02 17:16:34 -07001046void X86Assembler::subsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001047 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1048 EmitUint8(0xF2);
1049 EmitUint8(0x0F);
1050 EmitUint8(0x5C);
1051 EmitOperand(dst, src);
1052}
1053
1054
Ian Rogers2c8f6532011-09-02 17:16:34 -07001055void X86Assembler::mulsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001056 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1057 EmitUint8(0xF2);
1058 EmitUint8(0x0F);
1059 EmitUint8(0x59);
1060 EmitXmmRegisterOperand(dst, src);
1061}
1062
1063
Ian Rogers2c8f6532011-09-02 17:16:34 -07001064void X86Assembler::mulsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001065 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1066 EmitUint8(0xF2);
1067 EmitUint8(0x0F);
1068 EmitUint8(0x59);
1069 EmitOperand(dst, src);
1070}
1071
1072
Ian Rogers2c8f6532011-09-02 17:16:34 -07001073void X86Assembler::divsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001074 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1075 EmitUint8(0xF2);
1076 EmitUint8(0x0F);
1077 EmitUint8(0x5E);
1078 EmitXmmRegisterOperand(dst, src);
1079}
1080
1081
Ian Rogers2c8f6532011-09-02 17:16:34 -07001082void X86Assembler::divsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001083 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1084 EmitUint8(0xF2);
1085 EmitUint8(0x0F);
1086 EmitUint8(0x5E);
1087 EmitOperand(dst, src);
1088}
1089
1090
Aart Bikc7782262017-01-13 16:20:08 -08001091void X86Assembler::addpd(XmmRegister dst, XmmRegister src) {
1092 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1093 EmitUint8(0x66);
1094 EmitUint8(0x0F);
1095 EmitUint8(0x58);
1096 EmitXmmRegisterOperand(dst, src);
1097}
1098
1099
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301100void X86Assembler::vaddpd(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1101 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1102 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1103 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1104 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1105 X86ManagedRegister::FromXmmRegister(add_left),
1106 SET_VEX_L_128,
1107 SET_VEX_PP_66);
1108 EmitUint8(ByteZero);
1109 EmitUint8(ByteOne);
1110 EmitUint8(0x58);
1111 EmitXmmRegisterOperand(dst, add_right);
1112}
1113
1114
Aart Bikc7782262017-01-13 16:20:08 -08001115void X86Assembler::subpd(XmmRegister dst, XmmRegister src) {
1116 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1117 EmitUint8(0x66);
1118 EmitUint8(0x0F);
1119 EmitUint8(0x5C);
1120 EmitXmmRegisterOperand(dst, src);
1121}
1122
1123
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301124void X86Assembler::vsubpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1125 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1126 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1127 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form*/ true);
1128 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1129 X86ManagedRegister::FromXmmRegister(src1),
1130 SET_VEX_L_128,
1131 SET_VEX_PP_66);
1132 EmitUint8(ByteZero);
1133 EmitUint8(ByteOne);
1134 EmitUint8(0x5C);
1135 EmitXmmRegisterOperand(dst, src2);
1136}
1137
Aart Bikc7782262017-01-13 16:20:08 -08001138void X86Assembler::mulpd(XmmRegister dst, XmmRegister src) {
1139 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1140 EmitUint8(0x66);
1141 EmitUint8(0x0F);
1142 EmitUint8(0x59);
1143 EmitXmmRegisterOperand(dst, src);
1144}
1145
Shalini Salomi Bodapatib45a4352019-07-10 16:09:41 +05301146void X86Assembler::vmulpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1147 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1148 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1149 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1150 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1151 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1152 X86ManagedRegister::FromXmmRegister(src1),
1153 SET_VEX_L_128,
1154 SET_VEX_PP_66);
1155 EmitUint8(ByteZero);
1156 EmitUint8(ByteOne);
1157 EmitUint8(0x59);
1158 EmitXmmRegisterOperand(dst, src2);
1159}
Aart Bikc7782262017-01-13 16:20:08 -08001160
1161void X86Assembler::divpd(XmmRegister dst, XmmRegister src) {
1162 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1163 EmitUint8(0x66);
1164 EmitUint8(0x0F);
1165 EmitUint8(0x5E);
1166 EmitXmmRegisterOperand(dst, src);
1167}
1168
Shalini Salomi Bodapatib45a4352019-07-10 16:09:41 +05301169void X86Assembler::vdivpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1170 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1171 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1172 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1173 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1174 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1175 X86ManagedRegister::FromXmmRegister(src1),
1176 SET_VEX_L_128,
1177 SET_VEX_PP_66);
1178 EmitUint8(ByteZero);
1179 EmitUint8(ByteOne);
1180 EmitUint8(0x5E);
1181 EmitXmmRegisterOperand(dst, src2);
1182}
Aart Bikc7782262017-01-13 16:20:08 -08001183
Aart Bik68555e92017-02-13 14:28:45 -08001184void X86Assembler::movdqa(XmmRegister dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +05301185 if (CpuHasAVXorAVX2FeatureFlag()) {
1186 vmovdqa(dst, src);
1187 return;
1188 }
Aart Bik68555e92017-02-13 14:28:45 -08001189 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1190 EmitUint8(0x66);
1191 EmitUint8(0x0F);
1192 EmitUint8(0x6F);
1193 EmitXmmRegisterOperand(dst, src);
1194}
1195
jaishank20d1c942019-03-08 15:08:17 +05301196/**VEX.128.66.0F.WIG 6F /r VMOVDQA xmm1, xmm2 */
1197void X86Assembler::vmovdqa(XmmRegister dst, XmmRegister src) {
1198 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1199 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1200 /**Instruction VEX Prefix */
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001201 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +05301202 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001203 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +05301204 vvvv_reg,
1205 SET_VEX_L_128,
1206 SET_VEX_PP_66);
1207 EmitUint8(ByteZero);
1208 EmitUint8(ByteOne);
1209 // Instruction Opcode
1210 EmitUint8(0x6F);
1211 // Instruction Operands
1212 EmitXmmRegisterOperand(dst, src);
1213}
Aart Bik68555e92017-02-13 14:28:45 -08001214
1215void X86Assembler::movdqa(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +05301216 if (CpuHasAVXorAVX2FeatureFlag()) {
1217 vmovdqa(dst, src);
1218 return;
1219 }
Aart Bik68555e92017-02-13 14:28:45 -08001220 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1221 EmitUint8(0x66);
1222 EmitUint8(0x0F);
1223 EmitUint8(0x6F);
1224 EmitOperand(dst, src);
1225}
1226
jaishank20d1c942019-03-08 15:08:17 +05301227/**VEX.128.66.0F.WIG 6F /r VMOVDQA xmm1, m128 */
1228void X86Assembler::vmovdqa(XmmRegister dst, const Address& src) {
1229 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1230 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1231 /**Instruction VEX Prefix */
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001232 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +05301233 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001234 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +05301235 vvvv_reg,
1236 SET_VEX_L_128,
1237 SET_VEX_PP_66);
1238 EmitUint8(ByteZero);
1239 EmitUint8(ByteOne);
1240 // Instruction Opcode
1241 EmitUint8(0x6F);
1242 // Instruction Operands
1243 EmitOperand(dst, src);
1244}
Aart Bik68555e92017-02-13 14:28:45 -08001245
1246void X86Assembler::movdqu(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +05301247 if (CpuHasAVXorAVX2FeatureFlag()) {
1248 vmovdqu(dst, src);
1249 return;
1250 }
Aart Bik68555e92017-02-13 14:28:45 -08001251 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1252 EmitUint8(0xF3);
1253 EmitUint8(0x0F);
1254 EmitUint8(0x6F);
1255 EmitOperand(dst, src);
1256}
1257
jaishank20d1c942019-03-08 15:08:17 +05301258/**VEX.128.F3.0F.WIG 6F /r VMOVDQU xmm1, m128 */
1259void X86Assembler::vmovdqu(XmmRegister dst, const Address& src) {
1260 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1261 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1262 /**Instruction VEX Prefix */
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001263 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +05301264 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001265 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +05301266 vvvv_reg,
1267 SET_VEX_L_128,
1268 SET_VEX_PP_F3);
1269 EmitUint8(ByteZero);
1270 EmitUint8(ByteOne);
1271 // Instruction Opcode
1272 EmitUint8(0x6F);
1273 // Instruction Operands
1274 EmitOperand(dst, src);
1275}
Aart Bik68555e92017-02-13 14:28:45 -08001276
1277void X86Assembler::movdqa(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +05301278 if (CpuHasAVXorAVX2FeatureFlag()) {
1279 vmovdqa(dst, src);
1280 return;
1281 }
Aart Bik68555e92017-02-13 14:28:45 -08001282 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1283 EmitUint8(0x66);
1284 EmitUint8(0x0F);
1285 EmitUint8(0x7F);
1286 EmitOperand(src, dst);
1287}
1288
jaishank20d1c942019-03-08 15:08:17 +05301289/**VEX.128.66.0F.WIG 7F /r VMOVDQA m128, xmm1 */
1290void X86Assembler::vmovdqa(const Address& dst, XmmRegister src) {
1291 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1292 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1293 /**Instruction VEX Prefix */
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001294 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +05301295 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001296 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +05301297 vvvv_reg,
1298 SET_VEX_L_128,
1299 SET_VEX_PP_66);
1300 EmitUint8(ByteZero);
1301 EmitUint8(ByteOne);
1302 // Instruction Opcode
1303 EmitUint8(0x7F);
1304 // Instruction Operands
1305 EmitOperand(src, dst);
1306}
1307
Aart Bik68555e92017-02-13 14:28:45 -08001308
1309void X86Assembler::movdqu(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +05301310 if (CpuHasAVXorAVX2FeatureFlag()) {
1311 vmovdqu(dst, src);
1312 return;
1313 }
Aart Bik68555e92017-02-13 14:28:45 -08001314 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1315 EmitUint8(0xF3);
1316 EmitUint8(0x0F);
1317 EmitUint8(0x7F);
1318 EmitOperand(src, dst);
1319}
1320
jaishank20d1c942019-03-08 15:08:17 +05301321/**VEX.128.F3.0F.WIG 7F /r VMOVDQU m128, xmm1 */
1322void X86Assembler::vmovdqu(const Address& dst, XmmRegister src) {
1323 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1324 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1325 // Instruction VEX Prefix
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001326 uint8_t ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
jaishank20d1c942019-03-08 15:08:17 +05301327 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
Vladimir Marko1b3561a2019-05-08 11:50:58 +01001328 uint8_t ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
jaishank20d1c942019-03-08 15:08:17 +05301329 vvvv_reg,
1330 SET_VEX_L_128,
1331 SET_VEX_PP_F3);
1332 EmitUint8(ByteZero);
1333 EmitUint8(ByteOne);
1334 // Instruction Opcode
1335 EmitUint8(0x7F);
1336 // Instruction Operands
1337 EmitOperand(src, dst);
1338}
Aart Bik68555e92017-02-13 14:28:45 -08001339
Aart Bike69d7a92017-02-17 11:48:23 -08001340void X86Assembler::paddb(XmmRegister dst, XmmRegister src) {
1341 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1342 EmitUint8(0x66);
1343 EmitUint8(0x0F);
1344 EmitUint8(0xFC);
1345 EmitXmmRegisterOperand(dst, src);
1346}
1347
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301348void X86Assembler::vpaddb(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1349 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1350 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1351 uint8_t ByteOne = 0x00, ByteZero = 0x00;
1352 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1353 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1354 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1355 EmitUint8(ByteZero);
1356 EmitUint8(ByteOne);
1357 EmitUint8(0xFC);
1358 EmitXmmRegisterOperand(dst, add_right);
1359}
Aart Bike69d7a92017-02-17 11:48:23 -08001360
1361void X86Assembler::psubb(XmmRegister dst, XmmRegister src) {
1362 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1363 EmitUint8(0x66);
1364 EmitUint8(0x0F);
1365 EmitUint8(0xF8);
1366 EmitXmmRegisterOperand(dst, src);
1367}
1368
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301369void X86Assembler::vpsubb(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1370 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1371 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1372 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1373 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1374 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1375 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1376 EmitUint8(ByteZero);
1377 EmitUint8(ByteOne);
1378 EmitUint8(0xF8);
1379 EmitXmmRegisterOperand(dst, add_right);
1380}
Aart Bike69d7a92017-02-17 11:48:23 -08001381
1382void X86Assembler::paddw(XmmRegister dst, XmmRegister src) {
1383 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1384 EmitUint8(0x66);
1385 EmitUint8(0x0F);
1386 EmitUint8(0xFD);
1387 EmitXmmRegisterOperand(dst, src);
1388}
1389
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301390void X86Assembler::vpaddw(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1391 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1392 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1393 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1394 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1395 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1396 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1397 EmitUint8(ByteZero);
1398 EmitUint8(ByteOne);
1399 EmitUint8(0xFD);
1400 EmitXmmRegisterOperand(dst, add_right);
1401}
Aart Bike69d7a92017-02-17 11:48:23 -08001402
1403void X86Assembler::psubw(XmmRegister dst, XmmRegister src) {
1404 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1405 EmitUint8(0x66);
1406 EmitUint8(0x0F);
1407 EmitUint8(0xF9);
1408 EmitXmmRegisterOperand(dst, src);
1409}
1410
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301411void X86Assembler::vpsubw(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1412 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1413 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1414 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1415 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1416 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1417 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1418 EmitUint8(ByteZero);
1419 EmitUint8(ByteOne);
1420 EmitUint8(0xF9);
1421 EmitXmmRegisterOperand(dst, add_right);
1422}
Aart Bike69d7a92017-02-17 11:48:23 -08001423
1424void X86Assembler::pmullw(XmmRegister dst, XmmRegister src) {
1425 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1426 EmitUint8(0x66);
1427 EmitUint8(0x0F);
1428 EmitUint8(0xD5);
1429 EmitXmmRegisterOperand(dst, src);
1430}
1431
1432
Aart Bik68555e92017-02-13 14:28:45 -08001433void X86Assembler::paddd(XmmRegister dst, XmmRegister src) {
1434 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1435 EmitUint8(0x66);
1436 EmitUint8(0x0F);
1437 EmitUint8(0xFE);
1438 EmitXmmRegisterOperand(dst, src);
1439}
1440
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301441void X86Assembler::vpaddd(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1442 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1443 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1444 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1445 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1446 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1447 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1448 EmitUint8(ByteZero);
1449 EmitUint8(ByteOne);
1450 EmitUint8(0xFE);
1451 EmitXmmRegisterOperand(dst, add_right);
1452}
Aart Bik68555e92017-02-13 14:28:45 -08001453
1454void X86Assembler::psubd(XmmRegister dst, XmmRegister src) {
1455 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1456 EmitUint8(0x66);
1457 EmitUint8(0x0F);
1458 EmitUint8(0xFA);
1459 EmitXmmRegisterOperand(dst, src);
1460}
1461
1462
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301463void X86Assembler::vpsubd(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1464 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1465 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1466 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1467 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1468 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1469 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1470 EmitUint8(ByteZero);
1471 EmitUint8(ByteOne);
1472 EmitUint8(0xFA);
1473 EmitXmmRegisterOperand(dst, add_right);
1474}
1475
1476
Aart Bik68555e92017-02-13 14:28:45 -08001477void X86Assembler::pmulld(XmmRegister dst, XmmRegister src) {
1478 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1479 EmitUint8(0x66);
1480 EmitUint8(0x0F);
1481 EmitUint8(0x38);
1482 EmitUint8(0x40);
1483 EmitXmmRegisterOperand(dst, src);
1484}
1485
Shalini Salomi Bodapatib45a4352019-07-10 16:09:41 +05301486void X86Assembler::vpmulld(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1487 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1488 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1489 uint8_t ByteZero = 0x00, ByteOne = 0x00, ByteTwo = 0x00;
1490 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
1491 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1492 /*X=*/ false,
1493 /*B=*/ false,
1494 SET_VEX_M_0F_38);
1495 ByteTwo = EmitVexPrefixByteTwo(/*W=*/ false,
1496 X86ManagedRegister::FromXmmRegister(src1),
1497 SET_VEX_L_128,
1498 SET_VEX_PP_66);
1499 EmitUint8(ByteZero);
1500 EmitUint8(ByteOne);
1501 EmitUint8(ByteTwo);
1502 EmitUint8(0x40);
1503 EmitRegisterOperand(dst, src2);
1504}
1505
1506void X86Assembler::vpmullw(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1507 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1508 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1509 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1510 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1511 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1512 X86ManagedRegister::FromXmmRegister(src1),
1513 SET_VEX_L_128,
1514 SET_VEX_PP_66);
1515 EmitUint8(ByteZero);
1516 EmitUint8(ByteOne);
1517 EmitUint8(0xD5);
1518 EmitRegisterOperand(dst, src2);
1519}
Aart Bik68555e92017-02-13 14:28:45 -08001520
Aart Bike69d7a92017-02-17 11:48:23 -08001521void X86Assembler::paddq(XmmRegister dst, XmmRegister src) {
1522 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1523 EmitUint8(0x66);
1524 EmitUint8(0x0F);
1525 EmitUint8(0xD4);
1526 EmitXmmRegisterOperand(dst, src);
1527}
1528
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301529void X86Assembler::vpaddq(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1530 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1531 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1532 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1533 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1534 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1535 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1536 EmitUint8(ByteZero);
1537 EmitUint8(ByteOne);
1538 EmitUint8(0xD4);
1539 EmitXmmRegisterOperand(dst, add_right);
1540}
1541
Aart Bike69d7a92017-02-17 11:48:23 -08001542
1543void X86Assembler::psubq(XmmRegister dst, XmmRegister src) {
1544 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1545 EmitUint8(0x66);
1546 EmitUint8(0x0F);
1547 EmitUint8(0xFB);
1548 EmitXmmRegisterOperand(dst, src);
1549}
1550
Shalini Salomi Bodapati81d15be2019-05-30 11:00:42 +05301551void X86Assembler::vpsubq(XmmRegister dst, XmmRegister add_left, XmmRegister add_right) {
1552 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1553 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1554 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1555 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1556 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(add_left);
1557 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
1558 EmitUint8(ByteZero);
1559 EmitUint8(ByteOne);
1560 EmitUint8(0xFB);
1561 EmitXmmRegisterOperand(dst, add_right);
1562}
Aart Bike69d7a92017-02-17 11:48:23 -08001563
Aart Bik4ca17352018-03-07 15:47:39 -08001564void X86Assembler::paddusb(XmmRegister dst, XmmRegister src) {
1565 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1566 EmitUint8(0x66);
1567 EmitUint8(0x0F);
1568 EmitUint8(0xDC);
1569 EmitXmmRegisterOperand(dst, src);
1570}
1571
1572
1573void X86Assembler::paddsb(XmmRegister dst, XmmRegister src) {
1574 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1575 EmitUint8(0x66);
1576 EmitUint8(0x0F);
1577 EmitUint8(0xEC);
1578 EmitXmmRegisterOperand(dst, src);
1579}
1580
1581
1582void X86Assembler::paddusw(XmmRegister dst, XmmRegister src) {
1583 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1584 EmitUint8(0x66);
1585 EmitUint8(0x0F);
1586 EmitUint8(0xDD);
1587 EmitXmmRegisterOperand(dst, src);
1588}
1589
1590
1591void X86Assembler::paddsw(XmmRegister dst, XmmRegister src) {
1592 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1593 EmitUint8(0x66);
1594 EmitUint8(0x0F);
1595 EmitUint8(0xED);
1596 EmitXmmRegisterOperand(dst, src);
1597}
1598
1599
1600void X86Assembler::psubusb(XmmRegister dst, XmmRegister src) {
1601 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1602 EmitUint8(0x66);
1603 EmitUint8(0x0F);
1604 EmitUint8(0xD8);
1605 EmitXmmRegisterOperand(dst, src);
1606}
1607
1608
1609void X86Assembler::psubsb(XmmRegister dst, XmmRegister src) {
1610 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1611 EmitUint8(0x66);
1612 EmitUint8(0x0F);
1613 EmitUint8(0xE8);
1614 EmitXmmRegisterOperand(dst, src);
1615}
1616
1617
1618void X86Assembler::psubusw(XmmRegister dst, XmmRegister src) {
1619 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1620 EmitUint8(0x66);
1621 EmitUint8(0x0F);
1622 EmitUint8(0xD9);
1623 EmitXmmRegisterOperand(dst, src);
1624}
1625
1626
1627void X86Assembler::psubsw(XmmRegister dst, XmmRegister src) {
1628 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1629 EmitUint8(0x66);
1630 EmitUint8(0x0F);
1631 EmitUint8(0xE9);
1632 EmitXmmRegisterOperand(dst, src);
1633}
1634
1635
Ian Rogers2c8f6532011-09-02 17:16:34 -07001636void X86Assembler::cvtsi2ss(XmmRegister dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001637 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1638 EmitUint8(0xF3);
1639 EmitUint8(0x0F);
1640 EmitUint8(0x2A);
1641 EmitOperand(dst, Operand(src));
1642}
1643
1644
Ian Rogers2c8f6532011-09-02 17:16:34 -07001645void X86Assembler::cvtsi2sd(XmmRegister dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001646 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1647 EmitUint8(0xF2);
1648 EmitUint8(0x0F);
1649 EmitUint8(0x2A);
1650 EmitOperand(dst, Operand(src));
1651}
1652
1653
Ian Rogers2c8f6532011-09-02 17:16:34 -07001654void X86Assembler::cvtss2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001655 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1656 EmitUint8(0xF3);
1657 EmitUint8(0x0F);
1658 EmitUint8(0x2D);
1659 EmitXmmRegisterOperand(dst, src);
1660}
1661
1662
Ian Rogers2c8f6532011-09-02 17:16:34 -07001663void X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001664 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1665 EmitUint8(0xF3);
1666 EmitUint8(0x0F);
1667 EmitUint8(0x5A);
1668 EmitXmmRegisterOperand(dst, src);
1669}
1670
1671
Ian Rogers2c8f6532011-09-02 17:16:34 -07001672void X86Assembler::cvtsd2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001673 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1674 EmitUint8(0xF2);
1675 EmitUint8(0x0F);
1676 EmitUint8(0x2D);
1677 EmitXmmRegisterOperand(dst, src);
1678}
1679
1680
Ian Rogers2c8f6532011-09-02 17:16:34 -07001681void X86Assembler::cvttss2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001682 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1683 EmitUint8(0xF3);
1684 EmitUint8(0x0F);
1685 EmitUint8(0x2C);
1686 EmitXmmRegisterOperand(dst, src);
1687}
1688
1689
Ian Rogers2c8f6532011-09-02 17:16:34 -07001690void X86Assembler::cvttsd2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001691 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1692 EmitUint8(0xF2);
1693 EmitUint8(0x0F);
1694 EmitUint8(0x2C);
1695 EmitXmmRegisterOperand(dst, src);
1696}
1697
1698
Ian Rogers2c8f6532011-09-02 17:16:34 -07001699void X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001700 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1701 EmitUint8(0xF2);
1702 EmitUint8(0x0F);
1703 EmitUint8(0x5A);
1704 EmitXmmRegisterOperand(dst, src);
1705}
1706
1707
Aart Bik3ae3b592017-02-24 14:09:15 -08001708void X86Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) {
1709 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1710 EmitUint8(0x0F);
1711 EmitUint8(0x5B);
1712 EmitXmmRegisterOperand(dst, src);
1713}
1714
1715
Ian Rogers2c8f6532011-09-02 17:16:34 -07001716void X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001717 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1718 EmitUint8(0xF3);
1719 EmitUint8(0x0F);
1720 EmitUint8(0xE6);
1721 EmitXmmRegisterOperand(dst, src);
1722}
1723
1724
Ian Rogers2c8f6532011-09-02 17:16:34 -07001725void X86Assembler::comiss(XmmRegister a, XmmRegister b) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001726 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1727 EmitUint8(0x0F);
1728 EmitUint8(0x2F);
1729 EmitXmmRegisterOperand(a, b);
1730}
1731
1732
Aart Bik18ba1212016-08-01 14:11:20 -07001733void X86Assembler::comiss(XmmRegister a, const Address& b) {
1734 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1735 EmitUint8(0x0F);
1736 EmitUint8(0x2F);
1737 EmitOperand(a, b);
1738}
1739
1740
Ian Rogers2c8f6532011-09-02 17:16:34 -07001741void X86Assembler::comisd(XmmRegister a, XmmRegister b) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001742 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1743 EmitUint8(0x66);
1744 EmitUint8(0x0F);
1745 EmitUint8(0x2F);
1746 EmitXmmRegisterOperand(a, b);
1747}
1748
1749
Aart Bik18ba1212016-08-01 14:11:20 -07001750void X86Assembler::comisd(XmmRegister a, const Address& b) {
1751 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1752 EmitUint8(0x66);
1753 EmitUint8(0x0F);
1754 EmitUint8(0x2F);
1755 EmitOperand(a, b);
1756}
1757
1758
Calin Juravleddb7df22014-11-25 20:56:51 +00001759void X86Assembler::ucomiss(XmmRegister a, XmmRegister b) {
1760 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1761 EmitUint8(0x0F);
1762 EmitUint8(0x2E);
1763 EmitXmmRegisterOperand(a, b);
1764}
1765
1766
Mark Mendell9f51f262015-10-30 09:21:37 -04001767void X86Assembler::ucomiss(XmmRegister a, const Address& b) {
1768 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1769 EmitUint8(0x0F);
1770 EmitUint8(0x2E);
1771 EmitOperand(a, b);
1772}
1773
1774
Calin Juravleddb7df22014-11-25 20:56:51 +00001775void X86Assembler::ucomisd(XmmRegister a, XmmRegister b) {
1776 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1777 EmitUint8(0x66);
1778 EmitUint8(0x0F);
1779 EmitUint8(0x2E);
1780 EmitXmmRegisterOperand(a, b);
1781}
1782
1783
Mark Mendell9f51f262015-10-30 09:21:37 -04001784void X86Assembler::ucomisd(XmmRegister a, const Address& b) {
1785 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1786 EmitUint8(0x66);
1787 EmitUint8(0x0F);
1788 EmitUint8(0x2E);
1789 EmitOperand(a, b);
1790}
1791
1792
Mark Mendellfb8d2792015-03-31 22:16:59 -04001793void X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1794 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1795 EmitUint8(0x66);
1796 EmitUint8(0x0F);
1797 EmitUint8(0x3A);
1798 EmitUint8(0x0B);
1799 EmitXmmRegisterOperand(dst, src);
1800 EmitUint8(imm.value());
1801}
1802
1803
1804void X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1805 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1806 EmitUint8(0x66);
1807 EmitUint8(0x0F);
1808 EmitUint8(0x3A);
1809 EmitUint8(0x0A);
1810 EmitXmmRegisterOperand(dst, src);
1811 EmitUint8(imm.value());
1812}
1813
1814
Ian Rogers2c8f6532011-09-02 17:16:34 -07001815void X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001816 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1817 EmitUint8(0xF2);
1818 EmitUint8(0x0F);
1819 EmitUint8(0x51);
1820 EmitXmmRegisterOperand(dst, src);
1821}
1822
1823
Ian Rogers2c8f6532011-09-02 17:16:34 -07001824void X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001825 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1826 EmitUint8(0xF3);
1827 EmitUint8(0x0F);
1828 EmitUint8(0x51);
1829 EmitXmmRegisterOperand(dst, src);
1830}
1831
1832
Ian Rogers2c8f6532011-09-02 17:16:34 -07001833void X86Assembler::xorpd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001834 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1835 EmitUint8(0x66);
1836 EmitUint8(0x0F);
1837 EmitUint8(0x57);
1838 EmitOperand(dst, src);
1839}
1840
1841
Ian Rogers2c8f6532011-09-02 17:16:34 -07001842void X86Assembler::xorpd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001843 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1844 EmitUint8(0x66);
1845 EmitUint8(0x0F);
1846 EmitUint8(0x57);
1847 EmitXmmRegisterOperand(dst, src);
1848}
1849
1850
Aart Bik68555e92017-02-13 14:28:45 -08001851void X86Assembler::xorps(XmmRegister dst, const Address& src) {
Mark Mendell09ed1a32015-03-25 08:30:06 -04001852 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1853 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001854 EmitUint8(0x57);
1855 EmitOperand(dst, src);
1856}
1857
1858
1859void X86Assembler::xorps(XmmRegister dst, XmmRegister src) {
1860 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1861 EmitUint8(0x0F);
1862 EmitUint8(0x57);
1863 EmitXmmRegisterOperand(dst, src);
1864}
1865
1866
1867void X86Assembler::pxor(XmmRegister dst, XmmRegister src) {
1868 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1869 EmitUint8(0x66);
1870 EmitUint8(0x0F);
1871 EmitUint8(0xEF);
Mark Mendell09ed1a32015-03-25 08:30:06 -04001872 EmitXmmRegisterOperand(dst, src);
1873}
1874
Neeraj Solanki48349ad2019-08-05 23:16:56 +05301875/* VEX.128.66.0F.WIG EF /r VPXOR xmm1, xmm2, xmm3/m128 */
1876void X86Assembler::vpxor(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1877 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1878 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1879 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1880 /* Instruction VEX Prefix */
1881 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1882 /* REX prefix is necessary only if an instruction references one of extended
1883 registers or uses a 64-bit operand. */
1884 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1885 X86ManagedRegister::FromXmmRegister(src1),
1886 SET_VEX_L_128,
1887 SET_VEX_PP_66);
1888 EmitUint8(ByteZero);
1889 EmitUint8(ByteOne);
1890 // Instruction Opcode
1891 EmitUint8(0xEF);
1892 // Instruction Operands
1893 EmitXmmRegisterOperand(dst, src2);
1894}
1895
1896/* VEX.128.0F.WIG 57 /r VXORPS xmm1,xmm2, xmm3/m128 */
1897void X86Assembler::vxorps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1898 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1899 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1900 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1901 /* Instruction VEX Prefix */
1902 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1903 /* REX prefix is necessary only if an instruction references one of extended
1904 registers or uses a 64-bit operand. */
1905 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1906 X86ManagedRegister::FromXmmRegister(src1),
1907 SET_VEX_L_128,
1908 SET_VEX_PP_NONE);
1909 EmitUint8(ByteZero);
1910 EmitUint8(ByteOne);
1911 // Instruction Opcode
1912 EmitUint8(0x57);
1913 // Instruction Operands
1914 EmitXmmRegisterOperand(dst, src2);
1915}
1916
1917/* VEX.128.66.0F.WIG 57 /r VXORPD xmm1,xmm2, xmm3/m128 */
1918void X86Assembler::vxorpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1919 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1920 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1921 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1922 /* Instruction VEX Prefix */
1923 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1924 /* REX prefix is necessary only if an instruction references one of extended
1925 registers or uses a 64-bit operand. */
1926 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1927 X86ManagedRegister::FromXmmRegister(src1),
1928 SET_VEX_L_128,
1929 SET_VEX_PP_66);
1930 EmitUint8(ByteZero);
1931 EmitUint8(ByteOne);
1932 // Instruction Opcode
1933 EmitUint8(0x57);
1934 // Instruction Operands
1935 EmitXmmRegisterOperand(dst, src2);
1936}
Mark Mendell09ed1a32015-03-25 08:30:06 -04001937
1938void X86Assembler::andpd(XmmRegister dst, XmmRegister src) {
1939 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1940 EmitUint8(0x66);
1941 EmitUint8(0x0F);
1942 EmitUint8(0x54);
1943 EmitXmmRegisterOperand(dst, src);
1944}
1945
1946
Aart Bik68555e92017-02-13 14:28:45 -08001947void X86Assembler::andpd(XmmRegister dst, const Address& src) {
Mark Mendell09ed1a32015-03-25 08:30:06 -04001948 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1949 EmitUint8(0x66);
1950 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001951 EmitUint8(0x54);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001952 EmitOperand(dst, src);
1953}
1954
1955
Aart Bik68555e92017-02-13 14:28:45 -08001956void X86Assembler::andps(XmmRegister dst, XmmRegister src) {
Mark Mendell09ed1a32015-03-25 08:30:06 -04001957 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1958 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001959 EmitUint8(0x54);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001960 EmitXmmRegisterOperand(dst, src);
1961}
1962
1963
Mark Mendell09ed1a32015-03-25 08:30:06 -04001964void X86Assembler::andps(XmmRegister dst, const Address& src) {
1965 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1966 EmitUint8(0x0F);
1967 EmitUint8(0x54);
1968 EmitOperand(dst, src);
1969}
1970
1971
Aart Bik68555e92017-02-13 14:28:45 -08001972void X86Assembler::pand(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001973 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1974 EmitUint8(0x66);
1975 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001976 EmitUint8(0xDB);
1977 EmitXmmRegisterOperand(dst, src);
1978}
1979
Neeraj Solanki48349ad2019-08-05 23:16:56 +05301980/* VEX.128.66.0F.WIG DB /r VPAND xmm1, xmm2, xmm3/m128 */
1981void X86Assembler::vpand(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
1982 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1983 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1984 uint8_t ByteZero = 0x00, ByteOne = 0x00;
1985 /* Instruction VEX Prefix */
1986 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
1987 /* REX prefix is necessary only if an instruction references one of extended
1988 registers or uses a 64-bit operand. */
1989 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
1990 X86ManagedRegister::FromXmmRegister(src1),
1991 SET_VEX_L_128,
1992 SET_VEX_PP_66);
1993 EmitUint8(ByteZero);
1994 EmitUint8(ByteOne);
1995 // Instruction Opcode
1996 EmitUint8(0xDB);
1997 // Instruction Operands
1998 EmitXmmRegisterOperand(dst, src2);
1999}
jaishank20d1c942019-03-08 15:08:17 +05302000
Neeraj Solanki48349ad2019-08-05 23:16:56 +05302001/* VEX.128.0F 54 /r VANDPS xmm1,xmm2, xmm3/m128 */
2002void X86Assembler::vandps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2003 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2004 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2005 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2006 /* Instruction VEX Prefix */
2007 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2008 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2009 X86ManagedRegister::FromXmmRegister(src1),
2010 SET_VEX_L_128,
2011 SET_VEX_PP_NONE);
2012 EmitUint8(ByteZero);
2013 EmitUint8(ByteOne);
2014 // Instruction Opcode
2015 EmitUint8(0x54);
2016 // Instruction Operands
2017 EmitXmmRegisterOperand(dst, src2);
2018}
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +05302019
Neeraj Solanki48349ad2019-08-05 23:16:56 +05302020/* VEX.128.66.0F 54 /r VANDPD xmm1, xmm2, xmm3/m128 */
2021void X86Assembler::vandpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2022 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2023 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2024 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2025 /* Instruction VEX Prefix */
2026 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2027 /* REX prefix is necessary only if an instruction references one of extended
2028 registers or uses a 64-bit operand. */
2029 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2030 X86ManagedRegister::FromXmmRegister(src1),
2031 SET_VEX_L_128,
2032 SET_VEX_PP_66);
2033 EmitUint8(ByteZero);
2034 EmitUint8(ByteOne);
2035 // Instruction Opcode
2036 EmitUint8(0x54);
2037 // Instruction Operands
2038 EmitXmmRegisterOperand(dst, src2);
2039}
Aart Bik68555e92017-02-13 14:28:45 -08002040
Aart Bik21c580b2017-03-13 11:52:07 -07002041void X86Assembler::andnpd(XmmRegister dst, XmmRegister src) {
2042 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2043 EmitUint8(0x66);
2044 EmitUint8(0x0F);
2045 EmitUint8(0x55);
2046 EmitXmmRegisterOperand(dst, src);
2047}
2048
2049
2050void X86Assembler::andnps(XmmRegister dst, XmmRegister src) {
2051 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2052 EmitUint8(0x0F);
2053 EmitUint8(0x55);
2054 EmitXmmRegisterOperand(dst, src);
2055}
2056
2057
2058void X86Assembler::pandn(XmmRegister dst, XmmRegister src) {
2059 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2060 EmitUint8(0x66);
2061 EmitUint8(0x0F);
2062 EmitUint8(0xDF);
2063 EmitXmmRegisterOperand(dst, src);
2064}
2065
Neeraj Solanki48349ad2019-08-05 23:16:56 +05302066/* VEX.128.66.0F.WIG DF /r VPANDN xmm1, xmm2, xmm3/m128 */
2067void X86Assembler::vpandn(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2068 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2069 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2070 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2071 /* Instruction VEX Prefix */
2072 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2073 /* REX prefix is necessary only if an instruction references one of extended
2074 registers or uses a 64-bit operand. */
2075 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2076 X86ManagedRegister::FromXmmRegister(src1),
2077 SET_VEX_L_128,
2078 SET_VEX_PP_66);
2079 EmitUint8(ByteZero);
2080 EmitUint8(ByteOne);
2081 // Instruction Opcode
2082 EmitUint8(0xDF);
2083 // Instruction Operands
2084 EmitXmmRegisterOperand(dst, src2);
2085}
2086
2087/* VEX.128.0F 55 /r VANDNPS xmm1, xmm2, xmm3/m128 */
2088void X86Assembler::vandnps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2089 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2090 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2091 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2092 /* Instruction VEX Prefix */
2093 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2094 /* REX prefix is necessary only if an instruction references one of extended
2095 registers or uses a 64-bit operand. */
2096 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2097 X86ManagedRegister::FromXmmRegister(src1),
2098 SET_VEX_L_128,
2099 SET_VEX_PP_NONE);
2100 EmitUint8(ByteZero);
2101 EmitUint8(ByteOne);
2102 // Instruction Opcode
2103 EmitUint8(0x55);
2104 // Instruction Operands
2105 EmitXmmRegisterOperand(dst, src2);
2106}
2107
2108/* VEX.128.66.0F 55 /r VANDNPD xmm1, xmm2, xmm3/m128 */
2109void X86Assembler::vandnpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2110 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2111 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2112 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2113 /* Instruction VEX Prefix */
2114 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2115 /* REX prefix is necessary only if an instruction references one of extended
2116 registers or uses a 64-bit operand. */
2117 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2118 X86ManagedRegister::FromXmmRegister(src1),
2119 SET_VEX_L_128,
2120 SET_VEX_PP_66);
2121 EmitUint8(ByteZero);
2122 EmitUint8(ByteOne);
2123 // Instruction Opcode
2124 EmitUint8(0x55);
2125 // Instruction Operands
2126 EmitXmmRegisterOperand(dst, src2);
2127}
Aart Bik21c580b2017-03-13 11:52:07 -07002128
Aart Bik68555e92017-02-13 14:28:45 -08002129void X86Assembler::orpd(XmmRegister dst, XmmRegister src) {
2130 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2131 EmitUint8(0x66);
2132 EmitUint8(0x0F);
2133 EmitUint8(0x56);
2134 EmitXmmRegisterOperand(dst, src);
2135}
2136
2137
2138void X86Assembler::orps(XmmRegister dst, XmmRegister src) {
2139 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2140 EmitUint8(0x0F);
2141 EmitUint8(0x56);
2142 EmitXmmRegisterOperand(dst, src);
2143}
2144
jaishank20d1c942019-03-08 15:08:17 +05302145void X86Assembler::andn(Register dst, Register src1, Register src2) {
2146 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
Vladimir Marko1b3561a2019-05-08 11:50:58 +01002147 uint8_t byte_zero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false);
2148 uint8_t byte_one = EmitVexPrefixByteOne(/*R=*/ false,
2149 /*X=*/ false,
2150 /*B=*/ false,
jaishank20d1c942019-03-08 15:08:17 +05302151 SET_VEX_M_0F_38);
Vladimir Marko1b3561a2019-05-08 11:50:58 +01002152 uint8_t byte_two = EmitVexPrefixByteTwo(/*W=*/ false,
jaishank20d1c942019-03-08 15:08:17 +05302153 X86ManagedRegister::FromCpuRegister(src1),
2154 SET_VEX_L_128,
2155 SET_VEX_PP_NONE);
2156 EmitUint8(byte_zero);
2157 EmitUint8(byte_one);
2158 EmitUint8(byte_two);
2159 // Opcode field
2160 EmitUint8(0xF2);
2161 EmitRegisterOperand(dst, src2);
2162}
Aart Bik68555e92017-02-13 14:28:45 -08002163
2164void X86Assembler::por(XmmRegister dst, XmmRegister src) {
2165 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2166 EmitUint8(0x66);
2167 EmitUint8(0x0F);
2168 EmitUint8(0xEB);
2169 EmitXmmRegisterOperand(dst, src);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002170}
2171
Neeraj Solanki48349ad2019-08-05 23:16:56 +05302172/* VEX.128.66.0F.WIG EB /r VPOR xmm1, xmm2, xmm3/m128 */
2173void X86Assembler::vpor(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2174 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2175 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2176 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2177 /* Instruction VEX Prefix */
2178 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2179 /* REX prefix is necessary only if an instruction references one of extended
2180 registers or uses a 64-bit operand. */
2181 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2182 X86ManagedRegister::FromXmmRegister(src1),
2183 SET_VEX_L_128,
2184 SET_VEX_PP_66);
2185 EmitUint8(ByteZero);
2186 EmitUint8(ByteOne);
2187 // Instruction Opcode
2188 EmitUint8(0xEB);
2189 // Instruction Operands
2190 EmitXmmRegisterOperand(dst, src2);
2191}
2192
2193/* VEX.128.0F 56 /r VORPS xmm1,xmm2, xmm3/m128 */
2194void X86Assembler::vorps(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2195 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2196 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2197 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2198 /* Instruction VEX Prefix */
2199 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2200 /* REX prefix is necessary only if an instruction references one of extended
2201 registers or uses a 64-bit operand. */
2202 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2203 X86ManagedRegister::FromXmmRegister(src1),
2204 SET_VEX_L_128,
2205 SET_VEX_PP_NONE);
2206 EmitUint8(ByteZero);
2207 EmitUint8(ByteOne);
2208 // Instruction Opcode
2209 EmitUint8(0x56);
2210 // Instruction Operands
2211 EmitXmmRegisterOperand(dst, src2);
2212}
2213
2214/* VEX.128.66.0F 56 /r VORPD xmm1,xmm2, xmm3/m128 */
2215void X86Assembler::vorpd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2216 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2217 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2218 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2219 /* Instruction VEX Prefix */
2220 ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ true);
2221 /* REX prefix is necessary only if an instruction references one of extended
2222 registers or uses a 64-bit operand. */
2223 ByteOne = EmitVexPrefixByteOne(/*R=*/ false,
2224 X86ManagedRegister::FromXmmRegister(src1),
2225 SET_VEX_L_128,
2226 SET_VEX_PP_66);
2227 EmitUint8(ByteZero);
2228 EmitUint8(ByteOne);
2229 // Instruction Opcode
2230 EmitUint8(0x56);
2231 // Instruction Operands
2232 EmitXmmRegisterOperand(dst, src2);
2233}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002234
Aart Bik67d3fd72017-03-31 15:11:53 -07002235void X86Assembler::pavgb(XmmRegister dst, XmmRegister src) {
2236 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2237 EmitUint8(0x66);
2238 EmitUint8(0x0F);
2239 EmitUint8(0xE0);
2240 EmitXmmRegisterOperand(dst, src);
2241}
2242
2243
2244void X86Assembler::pavgw(XmmRegister dst, XmmRegister src) {
2245 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2246 EmitUint8(0x66);
2247 EmitUint8(0x0F);
2248 EmitUint8(0xE3);
2249 EmitXmmRegisterOperand(dst, src);
2250}
2251
Aart Bik6005a872017-07-24 13:33:39 -07002252
2253void X86Assembler::psadbw(XmmRegister dst, XmmRegister src) {
2254 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2255 EmitUint8(0x66);
2256 EmitUint8(0x0F);
2257 EmitUint8(0xF6);
2258 EmitXmmRegisterOperand(dst, src);
2259}
2260
2261
2262void X86Assembler::pmaddwd(XmmRegister dst, XmmRegister src) {
2263 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2264 EmitUint8(0x66);
2265 EmitUint8(0x0F);
2266 EmitUint8(0xF5);
2267 EmitXmmRegisterOperand(dst, src);
2268}
2269
2270
Alex Light43f2f752019-12-04 17:48:45 +00002271void X86Assembler::vpmaddwd(XmmRegister dst, XmmRegister src1, XmmRegister src2) {
2272 DCHECK(CpuHasAVXorAVX2FeatureFlag());
2273 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2274 uint8_t ByteZero = 0x00, ByteOne = 0x00;
2275 ByteZero = EmitVexPrefixByteZero(/* is_twobyte_form=*/ true);
2276 X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(src1);
2277 ByteOne = EmitVexPrefixByteOne(/*R=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66);
2278 EmitUint8(ByteZero);
2279 EmitUint8(ByteOne);
2280 EmitUint8(0xF5);
2281 EmitXmmRegisterOperand(dst, src2);
2282}
2283
2284
Aart Bik6005a872017-07-24 13:33:39 -07002285void X86Assembler::phaddw(XmmRegister dst, XmmRegister src) {
2286 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2287 EmitUint8(0x66);
2288 EmitUint8(0x0F);
2289 EmitUint8(0x38);
2290 EmitUint8(0x01);
2291 EmitXmmRegisterOperand(dst, src);
2292}
2293
2294
2295void X86Assembler::phaddd(XmmRegister dst, XmmRegister src) {
2296 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2297 EmitUint8(0x66);
2298 EmitUint8(0x0F);
2299 EmitUint8(0x38);
2300 EmitUint8(0x02);
2301 EmitXmmRegisterOperand(dst, src);
2302}
2303
2304
2305void X86Assembler::haddps(XmmRegister dst, XmmRegister src) {
2306 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2307 EmitUint8(0xF2);
2308 EmitUint8(0x0F);
2309 EmitUint8(0x7C);
2310 EmitXmmRegisterOperand(dst, src);
2311}
2312
2313
2314void X86Assembler::haddpd(XmmRegister dst, XmmRegister src) {
2315 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2316 EmitUint8(0x66);
2317 EmitUint8(0x0F);
2318 EmitUint8(0x7C);
2319 EmitXmmRegisterOperand(dst, src);
2320}
2321
2322
2323void X86Assembler::phsubw(XmmRegister dst, XmmRegister src) {
2324 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2325 EmitUint8(0x66);
2326 EmitUint8(0x0F);
2327 EmitUint8(0x38);
2328 EmitUint8(0x05);
2329 EmitXmmRegisterOperand(dst, src);
2330}
2331
2332
2333void X86Assembler::phsubd(XmmRegister dst, XmmRegister src) {
2334 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2335 EmitUint8(0x66);
2336 EmitUint8(0x0F);
2337 EmitUint8(0x38);
2338 EmitUint8(0x06);
2339 EmitXmmRegisterOperand(dst, src);
2340}
2341
2342
2343void X86Assembler::hsubps(XmmRegister dst, XmmRegister src) {
2344 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2345 EmitUint8(0xF2);
2346 EmitUint8(0x0F);
2347 EmitUint8(0x7D);
2348 EmitXmmRegisterOperand(dst, src);
2349}
2350
2351
2352void X86Assembler::hsubpd(XmmRegister dst, XmmRegister src) {
2353 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2354 EmitUint8(0x66);
2355 EmitUint8(0x0F);
2356 EmitUint8(0x7D);
2357 EmitXmmRegisterOperand(dst, src);
2358}
2359
2360
Aart Bikc8e93c72017-05-10 10:49:22 -07002361void X86Assembler::pminsb(XmmRegister dst, XmmRegister src) {
2362 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2363 EmitUint8(0x66);
2364 EmitUint8(0x0F);
2365 EmitUint8(0x38);
2366 EmitUint8(0x38);
2367 EmitXmmRegisterOperand(dst, src);
2368}
2369
2370void X86Assembler::pmaxsb(XmmRegister dst, XmmRegister src) {
2371 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2372 EmitUint8(0x66);
2373 EmitUint8(0x0F);
2374 EmitUint8(0x38);
2375 EmitUint8(0x3C);
2376 EmitXmmRegisterOperand(dst, src);
2377}
2378
2379void X86Assembler::pminsw(XmmRegister dst, XmmRegister src) {
2380 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2381 EmitUint8(0x66);
2382 EmitUint8(0x0F);
2383 EmitUint8(0xEA);
2384 EmitXmmRegisterOperand(dst, src);
2385}
2386
2387void X86Assembler::pmaxsw(XmmRegister dst, XmmRegister src) {
2388 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2389 EmitUint8(0x66);
2390 EmitUint8(0x0F);
2391 EmitUint8(0xEE);
2392 EmitXmmRegisterOperand(dst, src);
2393}
2394
2395void X86Assembler::pminsd(XmmRegister dst, XmmRegister src) {
2396 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2397 EmitUint8(0x66);
2398 EmitUint8(0x0F);
2399 EmitUint8(0x38);
2400 EmitUint8(0x39);
2401 EmitXmmRegisterOperand(dst, src);
2402}
2403
2404void X86Assembler::pmaxsd(XmmRegister dst, XmmRegister src) {
2405 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2406 EmitUint8(0x66);
2407 EmitUint8(0x0F);
2408 EmitUint8(0x38);
2409 EmitUint8(0x3D);
2410 EmitXmmRegisterOperand(dst, src);
2411}
2412
2413void X86Assembler::pminub(XmmRegister dst, XmmRegister src) {
2414 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2415 EmitUint8(0x66);
2416 EmitUint8(0x0F);
2417 EmitUint8(0xDA);
2418 EmitXmmRegisterOperand(dst, src);
2419}
2420
2421void X86Assembler::pmaxub(XmmRegister dst, XmmRegister src) {
2422 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2423 EmitUint8(0x66);
2424 EmitUint8(0x0F);
2425 EmitUint8(0xDE);
2426 EmitXmmRegisterOperand(dst, src);
2427}
2428
2429void X86Assembler::pminuw(XmmRegister dst, XmmRegister src) {
2430 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2431 EmitUint8(0x66);
2432 EmitUint8(0x0F);
2433 EmitUint8(0x38);
2434 EmitUint8(0x3A);
2435 EmitXmmRegisterOperand(dst, src);
2436}
2437
2438void X86Assembler::pmaxuw(XmmRegister dst, XmmRegister src) {
2439 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2440 EmitUint8(0x66);
2441 EmitUint8(0x0F);
2442 EmitUint8(0x38);
2443 EmitUint8(0x3E);
2444 EmitXmmRegisterOperand(dst, src);
2445}
2446
2447void X86Assembler::pminud(XmmRegister dst, XmmRegister src) {
2448 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2449 EmitUint8(0x66);
2450 EmitUint8(0x0F);
2451 EmitUint8(0x38);
2452 EmitUint8(0x3B);
2453 EmitXmmRegisterOperand(dst, src);
2454}
2455
2456void X86Assembler::pmaxud(XmmRegister dst, XmmRegister src) {
2457 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2458 EmitUint8(0x66);
2459 EmitUint8(0x0F);
2460 EmitUint8(0x38);
2461 EmitUint8(0x3F);
2462 EmitXmmRegisterOperand(dst, src);
2463}
2464
2465void X86Assembler::minps(XmmRegister dst, XmmRegister src) {
2466 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2467 EmitUint8(0x0F);
2468 EmitUint8(0x5D);
2469 EmitXmmRegisterOperand(dst, src);
2470}
2471
2472void X86Assembler::maxps(XmmRegister dst, XmmRegister src) {
2473 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2474 EmitUint8(0x0F);
2475 EmitUint8(0x5F);
2476 EmitXmmRegisterOperand(dst, src);
2477}
2478
2479void X86Assembler::minpd(XmmRegister dst, XmmRegister src) {
2480 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2481 EmitUint8(0x66);
2482 EmitUint8(0x0F);
2483 EmitUint8(0x5D);
2484 EmitXmmRegisterOperand(dst, src);
2485}
2486
2487void X86Assembler::maxpd(XmmRegister dst, XmmRegister src) {
2488 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2489 EmitUint8(0x66);
2490 EmitUint8(0x0F);
2491 EmitUint8(0x5F);
2492 EmitXmmRegisterOperand(dst, src);
2493}
Aart Bik67d3fd72017-03-31 15:11:53 -07002494
Aart Bik4b455332017-03-15 11:19:35 -07002495void X86Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) {
2496 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2497 EmitUint8(0x66);
2498 EmitUint8(0x0F);
2499 EmitUint8(0x74);
2500 EmitXmmRegisterOperand(dst, src);
2501}
2502
2503
2504void X86Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) {
2505 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2506 EmitUint8(0x66);
2507 EmitUint8(0x0F);
2508 EmitUint8(0x75);
2509 EmitXmmRegisterOperand(dst, src);
2510}
2511
2512
2513void X86Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) {
2514 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2515 EmitUint8(0x66);
2516 EmitUint8(0x0F);
2517 EmitUint8(0x76);
2518 EmitXmmRegisterOperand(dst, src);
2519}
2520
2521
2522void X86Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) {
2523 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2524 EmitUint8(0x66);
2525 EmitUint8(0x0F);
2526 EmitUint8(0x38);
2527 EmitUint8(0x29);
2528 EmitXmmRegisterOperand(dst, src);
2529}
2530
2531
Aart Bik8939c642017-04-03 14:09:01 -07002532void X86Assembler::pcmpgtb(XmmRegister dst, XmmRegister src) {
2533 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2534 EmitUint8(0x66);
2535 EmitUint8(0x0F);
2536 EmitUint8(0x64);
2537 EmitXmmRegisterOperand(dst, src);
2538}
2539
2540
2541void X86Assembler::pcmpgtw(XmmRegister dst, XmmRegister src) {
2542 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2543 EmitUint8(0x66);
2544 EmitUint8(0x0F);
2545 EmitUint8(0x65);
2546 EmitXmmRegisterOperand(dst, src);
2547}
2548
2549
2550void X86Assembler::pcmpgtd(XmmRegister dst, XmmRegister src) {
2551 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2552 EmitUint8(0x66);
2553 EmitUint8(0x0F);
2554 EmitUint8(0x66);
2555 EmitXmmRegisterOperand(dst, src);
2556}
2557
2558
2559void X86Assembler::pcmpgtq(XmmRegister dst, XmmRegister src) {
2560 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2561 EmitUint8(0x66);
2562 EmitUint8(0x0F);
2563 EmitUint8(0x38);
2564 EmitUint8(0x37);
2565 EmitXmmRegisterOperand(dst, src);
2566}
2567
2568
Aart Bik12e06ed2017-01-31 16:11:24 -08002569void X86Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2570 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2571 EmitUint8(0x66);
2572 EmitUint8(0x0F);
2573 EmitUint8(0xC6);
2574 EmitXmmRegisterOperand(dst, src);
2575 EmitUint8(imm.value());
2576}
2577
2578
2579void X86Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2580 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2581 EmitUint8(0x0F);
2582 EmitUint8(0xC6);
2583 EmitXmmRegisterOperand(dst, src);
2584 EmitUint8(imm.value());
2585}
2586
2587
Aart Bik68555e92017-02-13 14:28:45 -08002588void X86Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2589 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2590 EmitUint8(0x66);
2591 EmitUint8(0x0F);
2592 EmitUint8(0x70);
2593 EmitXmmRegisterOperand(dst, src);
2594 EmitUint8(imm.value());
2595}
2596
2597
Aart Bike69d7a92017-02-17 11:48:23 -08002598void X86Assembler::punpcklbw(XmmRegister dst, XmmRegister src) {
2599 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2600 EmitUint8(0x66);
2601 EmitUint8(0x0F);
2602 EmitUint8(0x60);
2603 EmitXmmRegisterOperand(dst, src);
2604}
2605
2606
2607void X86Assembler::punpcklwd(XmmRegister dst, XmmRegister src) {
2608 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2609 EmitUint8(0x66);
2610 EmitUint8(0x0F);
2611 EmitUint8(0x61);
2612 EmitXmmRegisterOperand(dst, src);
2613}
2614
2615
2616void X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) {
2617 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2618 EmitUint8(0x66);
2619 EmitUint8(0x0F);
2620 EmitUint8(0x62);
2621 EmitXmmRegisterOperand(dst, src);
2622}
2623
2624
2625void X86Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) {
2626 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2627 EmitUint8(0x66);
2628 EmitUint8(0x0F);
2629 EmitUint8(0x6C);
2630 EmitXmmRegisterOperand(dst, src);
2631}
2632
2633
Aart Bik3332db82017-08-11 15:10:30 -07002634void X86Assembler::punpckhbw(XmmRegister dst, XmmRegister src) {
2635 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2636 EmitUint8(0x66);
2637 EmitUint8(0x0F);
2638 EmitUint8(0x68);
2639 EmitXmmRegisterOperand(dst, src);
2640}
2641
2642
2643void X86Assembler::punpckhwd(XmmRegister dst, XmmRegister src) {
2644 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2645 EmitUint8(0x66);
2646 EmitUint8(0x0F);
2647 EmitUint8(0x69);
2648 EmitXmmRegisterOperand(dst, src);
2649}
2650
2651
2652void X86Assembler::punpckhdq(XmmRegister dst, XmmRegister src) {
2653 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2654 EmitUint8(0x66);
2655 EmitUint8(0x0F);
2656 EmitUint8(0x6A);
2657 EmitXmmRegisterOperand(dst, src);
2658}
2659
2660
2661void X86Assembler::punpckhqdq(XmmRegister dst, XmmRegister src) {
2662 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2663 EmitUint8(0x66);
2664 EmitUint8(0x0F);
2665 EmitUint8(0x6D);
2666 EmitXmmRegisterOperand(dst, src);
2667}
2668
2669
Aart Bike69d7a92017-02-17 11:48:23 -08002670void X86Assembler::psllw(XmmRegister reg, const Immediate& shift_count) {
2671 DCHECK(shift_count.is_uint8());
2672 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2673 EmitUint8(0x66);
2674 EmitUint8(0x0F);
2675 EmitUint8(0x71);
2676 EmitXmmRegisterOperand(6, reg);
2677 EmitUint8(shift_count.value());
2678}
2679
2680
2681void X86Assembler::pslld(XmmRegister reg, const Immediate& shift_count) {
2682 DCHECK(shift_count.is_uint8());
2683 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2684 EmitUint8(0x66);
2685 EmitUint8(0x0F);
2686 EmitUint8(0x72);
2687 EmitXmmRegisterOperand(6, reg);
2688 EmitUint8(shift_count.value());
2689}
2690
2691
2692void X86Assembler::psllq(XmmRegister reg, const Immediate& shift_count) {
2693 DCHECK(shift_count.is_uint8());
2694 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2695 EmitUint8(0x66);
2696 EmitUint8(0x0F);
2697 EmitUint8(0x73);
2698 EmitXmmRegisterOperand(6, reg);
2699 EmitUint8(shift_count.value());
2700}
2701
2702
2703void X86Assembler::psraw(XmmRegister reg, const Immediate& shift_count) {
2704 DCHECK(shift_count.is_uint8());
2705 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2706 EmitUint8(0x66);
2707 EmitUint8(0x0F);
2708 EmitUint8(0x71);
2709 EmitXmmRegisterOperand(4, reg);
2710 EmitUint8(shift_count.value());
2711}
2712
2713
2714void X86Assembler::psrad(XmmRegister reg, const Immediate& shift_count) {
2715 DCHECK(shift_count.is_uint8());
2716 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2717 EmitUint8(0x66);
2718 EmitUint8(0x0F);
2719 EmitUint8(0x72);
2720 EmitXmmRegisterOperand(4, reg);
2721 EmitUint8(shift_count.value());
2722}
2723
2724
2725void X86Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) {
2726 DCHECK(shift_count.is_uint8());
2727 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2728 EmitUint8(0x66);
2729 EmitUint8(0x0F);
2730 EmitUint8(0x71);
2731 EmitXmmRegisterOperand(2, reg);
2732 EmitUint8(shift_count.value());
2733}
2734
2735
2736void X86Assembler::psrld(XmmRegister reg, const Immediate& shift_count) {
2737 DCHECK(shift_count.is_uint8());
2738 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2739 EmitUint8(0x66);
2740 EmitUint8(0x0F);
2741 EmitUint8(0x72);
2742 EmitXmmRegisterOperand(2, reg);
2743 EmitUint8(shift_count.value());
2744}
2745
2746
2747void X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) {
2748 DCHECK(shift_count.is_uint8());
2749 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2750 EmitUint8(0x66);
2751 EmitUint8(0x0F);
2752 EmitUint8(0x73);
2753 EmitXmmRegisterOperand(2, reg);
2754 EmitUint8(shift_count.value());
2755}
2756
2757
2758void X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) {
2759 DCHECK(shift_count.is_uint8());
2760 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2761 EmitUint8(0x66);
2762 EmitUint8(0x0F);
2763 EmitUint8(0x73);
2764 EmitXmmRegisterOperand(3, reg);
2765 EmitUint8(shift_count.value());
2766}
2767
2768
Ian Rogers2c8f6532011-09-02 17:16:34 -07002769void X86Assembler::fldl(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002770 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2771 EmitUint8(0xDD);
2772 EmitOperand(0, src);
2773}
2774
2775
Mark Mendell24f2dfa2015-01-14 19:51:45 -05002776void X86Assembler::fstl(const Address& dst) {
2777 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2778 EmitUint8(0xDD);
2779 EmitOperand(2, dst);
2780}
2781
2782
Ian Rogers2c8f6532011-09-02 17:16:34 -07002783void X86Assembler::fstpl(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002784 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2785 EmitUint8(0xDD);
2786 EmitOperand(3, dst);
2787}
2788
2789
Mark Mendell24f2dfa2015-01-14 19:51:45 -05002790void X86Assembler::fstsw() {
2791 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2792 EmitUint8(0x9B);
2793 EmitUint8(0xDF);
2794 EmitUint8(0xE0);
2795}
2796
2797
Ian Rogers2c8f6532011-09-02 17:16:34 -07002798void X86Assembler::fnstcw(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002799 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2800 EmitUint8(0xD9);
2801 EmitOperand(7, dst);
2802}
2803
2804
Ian Rogers2c8f6532011-09-02 17:16:34 -07002805void X86Assembler::fldcw(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002806 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2807 EmitUint8(0xD9);
2808 EmitOperand(5, src);
2809}
2810
2811
Ian Rogers2c8f6532011-09-02 17:16:34 -07002812void X86Assembler::fistpl(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002813 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2814 EmitUint8(0xDF);
2815 EmitOperand(7, dst);
2816}
2817
2818
Ian Rogers2c8f6532011-09-02 17:16:34 -07002819void X86Assembler::fistps(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002820 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2821 EmitUint8(0xDB);
2822 EmitOperand(3, dst);
2823}
2824
2825
Ian Rogers2c8f6532011-09-02 17:16:34 -07002826void X86Assembler::fildl(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002827 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2828 EmitUint8(0xDF);
2829 EmitOperand(5, src);
2830}
2831
2832
Roland Levillain0a186012015-04-13 17:00:20 +01002833void X86Assembler::filds(const Address& src) {
2834 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2835 EmitUint8(0xDB);
2836 EmitOperand(0, src);
2837}
2838
2839
Ian Rogers2c8f6532011-09-02 17:16:34 -07002840void X86Assembler::fincstp() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002841 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2842 EmitUint8(0xD9);
2843 EmitUint8(0xF7);
2844}
2845
2846
Ian Rogers2c8f6532011-09-02 17:16:34 -07002847void X86Assembler::ffree(const Immediate& index) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002848 CHECK_LT(index.value(), 7);
2849 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2850 EmitUint8(0xDD);
2851 EmitUint8(0xC0 + index.value());
2852}
2853
2854
Ian Rogers2c8f6532011-09-02 17:16:34 -07002855void X86Assembler::fsin() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002856 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2857 EmitUint8(0xD9);
2858 EmitUint8(0xFE);
2859}
2860
2861
Ian Rogers2c8f6532011-09-02 17:16:34 -07002862void X86Assembler::fcos() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002863 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2864 EmitUint8(0xD9);
2865 EmitUint8(0xFF);
2866}
2867
2868
Ian Rogers2c8f6532011-09-02 17:16:34 -07002869void X86Assembler::fptan() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002870 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2871 EmitUint8(0xD9);
2872 EmitUint8(0xF2);
2873}
2874
2875
Mark Mendell24f2dfa2015-01-14 19:51:45 -05002876void X86Assembler::fucompp() {
2877 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2878 EmitUint8(0xDA);
2879 EmitUint8(0xE9);
2880}
2881
2882
2883void X86Assembler::fprem() {
2884 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2885 EmitUint8(0xD9);
2886 EmitUint8(0xF8);
2887}
2888
2889
Ian Rogers2c8f6532011-09-02 17:16:34 -07002890void X86Assembler::xchgl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002891 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2892 EmitUint8(0x87);
2893 EmitRegisterOperand(dst, src);
2894}
2895
Nicolas Geoffray3c049742014-09-24 18:10:46 +01002896
Ian Rogers7caad772012-03-30 01:07:54 -07002897void X86Assembler::xchgl(Register reg, const Address& address) {
2898 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2899 EmitUint8(0x87);
2900 EmitOperand(reg, address);
2901}
2902
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002903
Serguei Katkov3b625932016-05-06 10:24:17 +06002904void X86Assembler::cmpb(const Address& address, const Immediate& imm) {
2905 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2906 EmitUint8(0x80);
2907 EmitOperand(7, address);
2908 EmitUint8(imm.value() & 0xFF);
2909}
2910
2911
Nicolas Geoffray3c049742014-09-24 18:10:46 +01002912void X86Assembler::cmpw(const Address& address, const Immediate& imm) {
2913 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2914 EmitUint8(0x66);
Andreas Gampe3db70682018-12-26 15:12:03 -08002915 EmitComplex(7, address, imm, /* is_16_op= */ true);
Nicolas Geoffray3c049742014-09-24 18:10:46 +01002916}
2917
2918
Ian Rogers2c8f6532011-09-02 17:16:34 -07002919void X86Assembler::cmpl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002920 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2921 EmitComplex(7, Operand(reg), imm);
2922}
2923
2924
Ian Rogers2c8f6532011-09-02 17:16:34 -07002925void X86Assembler::cmpl(Register reg0, Register reg1) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002926 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2927 EmitUint8(0x3B);
2928 EmitOperand(reg0, Operand(reg1));
2929}
2930
2931
Ian Rogers2c8f6532011-09-02 17:16:34 -07002932void X86Assembler::cmpl(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002933 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2934 EmitUint8(0x3B);
2935 EmitOperand(reg, address);
2936}
2937
2938
Ian Rogers2c8f6532011-09-02 17:16:34 -07002939void X86Assembler::addl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002940 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2941 EmitUint8(0x03);
2942 EmitRegisterOperand(dst, src);
2943}
2944
2945
Ian Rogers2c8f6532011-09-02 17:16:34 -07002946void X86Assembler::addl(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002947 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2948 EmitUint8(0x03);
2949 EmitOperand(reg, address);
2950}
2951
2952
Ian Rogers2c8f6532011-09-02 17:16:34 -07002953void X86Assembler::cmpl(const Address& address, Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002954 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2955 EmitUint8(0x39);
2956 EmitOperand(reg, address);
2957}
2958
2959
Ian Rogers2c8f6532011-09-02 17:16:34 -07002960void X86Assembler::cmpl(const Address& address, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002961 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2962 EmitComplex(7, address, imm);
2963}
2964
2965
Ian Rogers2c8f6532011-09-02 17:16:34 -07002966void X86Assembler::testl(Register reg1, Register reg2) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002967 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2968 EmitUint8(0x85);
2969 EmitRegisterOperand(reg1, reg2);
2970}
2971
2972
Nicolas Geoffrayf12feb82014-07-17 18:32:41 +01002973void X86Assembler::testl(Register reg, const Address& address) {
2974 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2975 EmitUint8(0x85);
2976 EmitOperand(reg, address);
2977}
2978
2979
Ian Rogers2c8f6532011-09-02 17:16:34 -07002980void X86Assembler::testl(Register reg, const Immediate& immediate) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002981 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2982 // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
2983 // we only test the byte register to keep the encoding short.
2984 if (immediate.is_uint8() && reg < 4) {
2985 // Use zero-extended 8-bit immediate.
2986 if (reg == EAX) {
2987 EmitUint8(0xA8);
2988 } else {
2989 EmitUint8(0xF6);
2990 EmitUint8(0xC0 + reg);
2991 }
2992 EmitUint8(immediate.value() & 0xFF);
2993 } else if (reg == EAX) {
2994 // Use short form if the destination is EAX.
2995 EmitUint8(0xA9);
2996 EmitImmediate(immediate);
2997 } else {
2998 EmitUint8(0xF7);
2999 EmitOperand(0, Operand(reg));
3000 EmitImmediate(immediate);
3001 }
3002}
3003
3004
Vladimir Marko953437b2016-08-24 08:30:46 +00003005void X86Assembler::testb(const Address& dst, const Immediate& imm) {
3006 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3007 EmitUint8(0xF6);
3008 EmitOperand(EAX, dst);
3009 CHECK(imm.is_int8());
3010 EmitUint8(imm.value() & 0xFF);
3011}
3012
3013
3014void X86Assembler::testl(const Address& dst, const Immediate& imm) {
3015 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3016 EmitUint8(0xF7);
3017 EmitOperand(0, dst);
3018 EmitImmediate(imm);
3019}
3020
3021
Ian Rogers2c8f6532011-09-02 17:16:34 -07003022void X86Assembler::andl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003023 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3024 EmitUint8(0x23);
3025 EmitOperand(dst, Operand(src));
3026}
3027
3028
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00003029void X86Assembler::andl(Register reg, const Address& address) {
3030 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3031 EmitUint8(0x23);
3032 EmitOperand(reg, address);
3033}
3034
3035
Ian Rogers2c8f6532011-09-02 17:16:34 -07003036void X86Assembler::andl(Register dst, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003037 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3038 EmitComplex(4, Operand(dst), imm);
3039}
3040
3041
Ian Rogers2c8f6532011-09-02 17:16:34 -07003042void X86Assembler::orl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003043 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3044 EmitUint8(0x0B);
3045 EmitOperand(dst, Operand(src));
3046}
3047
3048
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00003049void X86Assembler::orl(Register reg, const Address& address) {
3050 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3051 EmitUint8(0x0B);
3052 EmitOperand(reg, address);
3053}
3054
3055
Ian Rogers2c8f6532011-09-02 17:16:34 -07003056void X86Assembler::orl(Register dst, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003057 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3058 EmitComplex(1, Operand(dst), imm);
3059}
3060
3061
Ian Rogers2c8f6532011-09-02 17:16:34 -07003062void X86Assembler::xorl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003063 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3064 EmitUint8(0x33);
3065 EmitOperand(dst, Operand(src));
3066}
3067
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00003068
3069void X86Assembler::xorl(Register reg, const Address& address) {
3070 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3071 EmitUint8(0x33);
3072 EmitOperand(reg, address);
3073}
3074
3075
Nicolas Geoffrayb55f8352014-04-07 15:26:35 +01003076void X86Assembler::xorl(Register dst, const Immediate& imm) {
3077 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3078 EmitComplex(6, Operand(dst), imm);
3079}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003080
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00003081
Ian Rogers2c8f6532011-09-02 17:16:34 -07003082void X86Assembler::addl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003083 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3084 EmitComplex(0, Operand(reg), imm);
3085}
3086
3087
Ian Rogers2c8f6532011-09-02 17:16:34 -07003088void X86Assembler::addl(const Address& address, Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003089 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3090 EmitUint8(0x01);
3091 EmitOperand(reg, address);
3092}
3093
3094
Ian Rogers2c8f6532011-09-02 17:16:34 -07003095void X86Assembler::addl(const Address& address, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003096 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3097 EmitComplex(0, address, imm);
3098}
3099
3100
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003101void X86Assembler::addw(const Address& address, const Immediate& imm) {
3102 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3103 CHECK(imm.is_uint16() || imm.is_int16()) << imm.value();
3104 EmitUint8(0x66);
Andreas Gampe3db70682018-12-26 15:12:03 -08003105 EmitComplex(0, address, imm, /* is_16_op= */ true);
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003106}
3107
3108
Ian Rogers2c8f6532011-09-02 17:16:34 -07003109void X86Assembler::adcl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003110 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3111 EmitComplex(2, Operand(reg), imm);
3112}
3113
3114
Ian Rogers2c8f6532011-09-02 17:16:34 -07003115void X86Assembler::adcl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003116 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3117 EmitUint8(0x13);
3118 EmitOperand(dst, Operand(src));
3119}
3120
3121
Ian Rogers2c8f6532011-09-02 17:16:34 -07003122void X86Assembler::adcl(Register dst, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003123 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3124 EmitUint8(0x13);
3125 EmitOperand(dst, address);
3126}
3127
3128
Ian Rogers2c8f6532011-09-02 17:16:34 -07003129void X86Assembler::subl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003130 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3131 EmitUint8(0x2B);
3132 EmitOperand(dst, Operand(src));
3133}
3134
3135
Ian Rogers2c8f6532011-09-02 17:16:34 -07003136void X86Assembler::subl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003137 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3138 EmitComplex(5, Operand(reg), imm);
3139}
3140
3141
Ian Rogers2c8f6532011-09-02 17:16:34 -07003142void X86Assembler::subl(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003143 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3144 EmitUint8(0x2B);
3145 EmitOperand(reg, address);
3146}
3147
3148
Mark Mendell09ed1a32015-03-25 08:30:06 -04003149void X86Assembler::subl(const Address& address, Register reg) {
3150 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3151 EmitUint8(0x29);
3152 EmitOperand(reg, address);
3153}
3154
3155
Ian Rogers2c8f6532011-09-02 17:16:34 -07003156void X86Assembler::cdq() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003157 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3158 EmitUint8(0x99);
3159}
3160
3161
Ian Rogers2c8f6532011-09-02 17:16:34 -07003162void X86Assembler::idivl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003163 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3164 EmitUint8(0xF7);
3165 EmitUint8(0xF8 | reg);
3166}
3167
3168
Ian Rogers2c8f6532011-09-02 17:16:34 -07003169void X86Assembler::imull(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003170 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3171 EmitUint8(0x0F);
3172 EmitUint8(0xAF);
3173 EmitOperand(dst, Operand(src));
3174}
3175
3176
Mark Mendell4a2aa4a2015-07-27 16:13:10 -04003177void X86Assembler::imull(Register dst, Register src, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003178 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
Mark Mendell4a2aa4a2015-07-27 16:13:10 -04003179 // See whether imm can be represented as a sign-extended 8bit value.
3180 int32_t v32 = static_cast<int32_t>(imm.value());
3181 if (IsInt<8>(v32)) {
3182 // Sign-extension works.
3183 EmitUint8(0x6B);
3184 EmitOperand(dst, Operand(src));
3185 EmitUint8(static_cast<uint8_t>(v32 & 0xFF));
3186 } else {
3187 // Not representable, use full immediate.
3188 EmitUint8(0x69);
3189 EmitOperand(dst, Operand(src));
3190 EmitImmediate(imm);
3191 }
3192}
3193
3194
3195void X86Assembler::imull(Register reg, const Immediate& imm) {
3196 imull(reg, reg, imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003197}
3198
3199
Ian Rogers2c8f6532011-09-02 17:16:34 -07003200void X86Assembler::imull(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003201 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3202 EmitUint8(0x0F);
3203 EmitUint8(0xAF);
3204 EmitOperand(reg, address);
3205}
3206
3207
Ian Rogers2c8f6532011-09-02 17:16:34 -07003208void X86Assembler::imull(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003209 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3210 EmitUint8(0xF7);
3211 EmitOperand(5, Operand(reg));
3212}
3213
3214
Ian Rogers2c8f6532011-09-02 17:16:34 -07003215void X86Assembler::imull(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003216 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3217 EmitUint8(0xF7);
3218 EmitOperand(5, address);
3219}
3220
3221
Ian Rogers2c8f6532011-09-02 17:16:34 -07003222void X86Assembler::mull(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003223 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3224 EmitUint8(0xF7);
3225 EmitOperand(4, Operand(reg));
3226}
3227
3228
Ian Rogers2c8f6532011-09-02 17:16:34 -07003229void X86Assembler::mull(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003230 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3231 EmitUint8(0xF7);
3232 EmitOperand(4, address);
3233}
3234
3235
Ian Rogers2c8f6532011-09-02 17:16:34 -07003236void X86Assembler::sbbl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003237 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3238 EmitUint8(0x1B);
3239 EmitOperand(dst, Operand(src));
3240}
3241
3242
Ian Rogers2c8f6532011-09-02 17:16:34 -07003243void X86Assembler::sbbl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003244 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3245 EmitComplex(3, Operand(reg), imm);
3246}
3247
3248
Ian Rogers2c8f6532011-09-02 17:16:34 -07003249void X86Assembler::sbbl(Register dst, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003250 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3251 EmitUint8(0x1B);
3252 EmitOperand(dst, address);
3253}
3254
3255
Mark Mendell09ed1a32015-03-25 08:30:06 -04003256void X86Assembler::sbbl(const Address& address, Register src) {
3257 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3258 EmitUint8(0x19);
3259 EmitOperand(src, address);
3260}
3261
3262
Ian Rogers2c8f6532011-09-02 17:16:34 -07003263void X86Assembler::incl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003264 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3265 EmitUint8(0x40 + reg);
3266}
3267
3268
Ian Rogers2c8f6532011-09-02 17:16:34 -07003269void X86Assembler::incl(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003270 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3271 EmitUint8(0xFF);
3272 EmitOperand(0, address);
3273}
3274
3275
Ian Rogers2c8f6532011-09-02 17:16:34 -07003276void X86Assembler::decl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003277 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3278 EmitUint8(0x48 + reg);
3279}
3280
3281
Ian Rogers2c8f6532011-09-02 17:16:34 -07003282void X86Assembler::decl(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003283 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3284 EmitUint8(0xFF);
3285 EmitOperand(1, address);
3286}
3287
3288
Ian Rogers2c8f6532011-09-02 17:16:34 -07003289void X86Assembler::shll(Register reg, const Immediate& imm) {
Mark P Mendell73945692015-04-29 14:56:17 +00003290 EmitGenericShift(4, Operand(reg), imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003291}
3292
3293
Ian Rogers2c8f6532011-09-02 17:16:34 -07003294void X86Assembler::shll(Register operand, Register shifter) {
Mark P Mendell73945692015-04-29 14:56:17 +00003295 EmitGenericShift(4, Operand(operand), shifter);
3296}
3297
3298
3299void X86Assembler::shll(const Address& address, const Immediate& imm) {
3300 EmitGenericShift(4, address, imm);
3301}
3302
3303
3304void X86Assembler::shll(const Address& address, Register shifter) {
3305 EmitGenericShift(4, address, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003306}
3307
3308
Ian Rogers2c8f6532011-09-02 17:16:34 -07003309void X86Assembler::shrl(Register reg, const Immediate& imm) {
Mark P Mendell73945692015-04-29 14:56:17 +00003310 EmitGenericShift(5, Operand(reg), imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003311}
3312
3313
Ian Rogers2c8f6532011-09-02 17:16:34 -07003314void X86Assembler::shrl(Register operand, Register shifter) {
Mark P Mendell73945692015-04-29 14:56:17 +00003315 EmitGenericShift(5, Operand(operand), shifter);
3316}
3317
3318
3319void X86Assembler::shrl(const Address& address, const Immediate& imm) {
3320 EmitGenericShift(5, address, imm);
3321}
3322
3323
3324void X86Assembler::shrl(const Address& address, Register shifter) {
3325 EmitGenericShift(5, address, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003326}
3327
3328
Ian Rogers2c8f6532011-09-02 17:16:34 -07003329void X86Assembler::sarl(Register reg, const Immediate& imm) {
Mark P Mendell73945692015-04-29 14:56:17 +00003330 EmitGenericShift(7, Operand(reg), imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003331}
3332
3333
Ian Rogers2c8f6532011-09-02 17:16:34 -07003334void X86Assembler::sarl(Register operand, Register shifter) {
Mark P Mendell73945692015-04-29 14:56:17 +00003335 EmitGenericShift(7, Operand(operand), shifter);
3336}
3337
3338
3339void X86Assembler::sarl(const Address& address, const Immediate& imm) {
3340 EmitGenericShift(7, address, imm);
3341}
3342
3343
3344void X86Assembler::sarl(const Address& address, Register shifter) {
3345 EmitGenericShift(7, address, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003346}
3347
3348
Calin Juravle9aec02f2014-11-18 23:06:35 +00003349void X86Assembler::shld(Register dst, Register src, Register shifter) {
3350 DCHECK_EQ(ECX, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003351 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3352 EmitUint8(0x0F);
3353 EmitUint8(0xA5);
3354 EmitRegisterOperand(src, dst);
3355}
3356
3357
Mark P Mendell73945692015-04-29 14:56:17 +00003358void X86Assembler::shld(Register dst, Register src, const Immediate& imm) {
3359 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3360 EmitUint8(0x0F);
3361 EmitUint8(0xA4);
3362 EmitRegisterOperand(src, dst);
3363 EmitUint8(imm.value() & 0xFF);
3364}
3365
3366
Calin Juravle9aec02f2014-11-18 23:06:35 +00003367void X86Assembler::shrd(Register dst, Register src, Register shifter) {
3368 DCHECK_EQ(ECX, shifter);
3369 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3370 EmitUint8(0x0F);
3371 EmitUint8(0xAD);
3372 EmitRegisterOperand(src, dst);
3373}
3374
3375
Mark P Mendell73945692015-04-29 14:56:17 +00003376void X86Assembler::shrd(Register dst, Register src, const Immediate& imm) {
3377 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3378 EmitUint8(0x0F);
3379 EmitUint8(0xAC);
3380 EmitRegisterOperand(src, dst);
3381 EmitUint8(imm.value() & 0xFF);
3382}
3383
3384
Mark Mendellbcee0922015-09-15 21:45:01 -04003385void X86Assembler::roll(Register reg, const Immediate& imm) {
3386 EmitGenericShift(0, Operand(reg), imm);
3387}
3388
3389
3390void X86Assembler::roll(Register operand, Register shifter) {
3391 EmitGenericShift(0, Operand(operand), shifter);
3392}
3393
3394
3395void X86Assembler::rorl(Register reg, const Immediate& imm) {
3396 EmitGenericShift(1, Operand(reg), imm);
3397}
3398
3399
3400void X86Assembler::rorl(Register operand, Register shifter) {
3401 EmitGenericShift(1, Operand(operand), shifter);
3402}
3403
3404
Ian Rogers2c8f6532011-09-02 17:16:34 -07003405void X86Assembler::negl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003406 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3407 EmitUint8(0xF7);
3408 EmitOperand(3, Operand(reg));
3409}
3410
3411
Ian Rogers2c8f6532011-09-02 17:16:34 -07003412void X86Assembler::notl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003413 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3414 EmitUint8(0xF7);
3415 EmitUint8(0xD0 | reg);
3416}
3417
3418
Ian Rogers2c8f6532011-09-02 17:16:34 -07003419void X86Assembler::enter(const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003420 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3421 EmitUint8(0xC8);
3422 CHECK(imm.is_uint16());
3423 EmitUint8(imm.value() & 0xFF);
3424 EmitUint8((imm.value() >> 8) & 0xFF);
3425 EmitUint8(0x00);
3426}
3427
3428
Ian Rogers2c8f6532011-09-02 17:16:34 -07003429void X86Assembler::leave() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003430 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3431 EmitUint8(0xC9);
3432}
3433
3434
Ian Rogers2c8f6532011-09-02 17:16:34 -07003435void X86Assembler::ret() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003436 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3437 EmitUint8(0xC3);
3438}
3439
3440
Ian Rogers2c8f6532011-09-02 17:16:34 -07003441void X86Assembler::ret(const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003442 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3443 EmitUint8(0xC2);
3444 CHECK(imm.is_uint16());
3445 EmitUint8(imm.value() & 0xFF);
3446 EmitUint8((imm.value() >> 8) & 0xFF);
3447}
3448
3449
3450
Ian Rogers2c8f6532011-09-02 17:16:34 -07003451void X86Assembler::nop() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003452 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3453 EmitUint8(0x90);
3454}
3455
3456
Ian Rogers2c8f6532011-09-02 17:16:34 -07003457void X86Assembler::int3() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003458 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3459 EmitUint8(0xCC);
3460}
3461
3462
Ian Rogers2c8f6532011-09-02 17:16:34 -07003463void X86Assembler::hlt() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003464 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3465 EmitUint8(0xF4);
3466}
3467
3468
Ian Rogers2c8f6532011-09-02 17:16:34 -07003469void X86Assembler::j(Condition condition, Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003470 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3471 if (label->IsBound()) {
3472 static const int kShortSize = 2;
3473 static const int kLongSize = 6;
3474 int offset = label->Position() - buffer_.Size();
3475 CHECK_LE(offset, 0);
Andreas Gampeab1eb0d2015-02-13 19:23:55 -08003476 if (IsInt<8>(offset - kShortSize)) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003477 EmitUint8(0x70 + condition);
3478 EmitUint8((offset - kShortSize) & 0xFF);
3479 } else {
3480 EmitUint8(0x0F);
3481 EmitUint8(0x80 + condition);
3482 EmitInt32(offset - kLongSize);
3483 }
3484 } else {
3485 EmitUint8(0x0F);
3486 EmitUint8(0x80 + condition);
3487 EmitLabelLink(label);
3488 }
3489}
3490
3491
Mark Mendell73f455e2015-08-21 09:30:05 -04003492void X86Assembler::j(Condition condition, NearLabel* label) {
3493 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3494 if (label->IsBound()) {
3495 static const int kShortSize = 2;
3496 int offset = label->Position() - buffer_.Size();
3497 CHECK_LE(offset, 0);
3498 CHECK(IsInt<8>(offset - kShortSize));
3499 EmitUint8(0x70 + condition);
3500 EmitUint8((offset - kShortSize) & 0xFF);
3501 } else {
3502 EmitUint8(0x70 + condition);
3503 EmitLabelLink(label);
3504 }
3505}
3506
3507
3508void X86Assembler::jecxz(NearLabel* label) {
3509 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3510 if (label->IsBound()) {
3511 static const int kShortSize = 2;
3512 int offset = label->Position() - buffer_.Size();
3513 CHECK_LE(offset, 0);
3514 CHECK(IsInt<8>(offset - kShortSize));
3515 EmitUint8(0xE3);
3516 EmitUint8((offset - kShortSize) & 0xFF);
3517 } else {
3518 EmitUint8(0xE3);
3519 EmitLabelLink(label);
3520 }
3521}
3522
3523
Ian Rogers2c8f6532011-09-02 17:16:34 -07003524void X86Assembler::jmp(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003525 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3526 EmitUint8(0xFF);
3527 EmitRegisterOperand(4, reg);
3528}
3529
Ian Rogers7caad772012-03-30 01:07:54 -07003530void X86Assembler::jmp(const Address& address) {
3531 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3532 EmitUint8(0xFF);
3533 EmitOperand(4, address);
3534}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003535
Ian Rogers2c8f6532011-09-02 17:16:34 -07003536void X86Assembler::jmp(Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003537 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3538 if (label->IsBound()) {
3539 static const int kShortSize = 2;
3540 static const int kLongSize = 5;
3541 int offset = label->Position() - buffer_.Size();
3542 CHECK_LE(offset, 0);
Andreas Gampeab1eb0d2015-02-13 19:23:55 -08003543 if (IsInt<8>(offset - kShortSize)) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003544 EmitUint8(0xEB);
3545 EmitUint8((offset - kShortSize) & 0xFF);
3546 } else {
3547 EmitUint8(0xE9);
3548 EmitInt32(offset - kLongSize);
3549 }
3550 } else {
3551 EmitUint8(0xE9);
3552 EmitLabelLink(label);
3553 }
3554}
3555
3556
Mark Mendell73f455e2015-08-21 09:30:05 -04003557void X86Assembler::jmp(NearLabel* label) {
3558 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3559 if (label->IsBound()) {
3560 static const int kShortSize = 2;
3561 int offset = label->Position() - buffer_.Size();
3562 CHECK_LE(offset, 0);
3563 CHECK(IsInt<8>(offset - kShortSize));
3564 EmitUint8(0xEB);
3565 EmitUint8((offset - kShortSize) & 0xFF);
3566 } else {
3567 EmitUint8(0xEB);
3568 EmitLabelLink(label);
3569 }
3570}
3571
3572
jessicahandojob03d6402016-09-07 12:16:53 -07003573void X86Assembler::repne_scasb() {
3574 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3575 EmitUint8(0xF2);
3576 EmitUint8(0xAE);
3577}
3578
3579
Andreas Gampe21030dd2015-05-07 14:46:15 -07003580void X86Assembler::repne_scasw() {
3581 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3582 EmitUint8(0x66);
3583 EmitUint8(0xF2);
3584 EmitUint8(0xAF);
3585}
3586
3587
jessicahandojob03d6402016-09-07 12:16:53 -07003588void X86Assembler::repe_cmpsb() {
3589 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3590 EmitUint8(0xF2);
3591 EmitUint8(0xA6);
3592}
3593
3594
agicsaki71311f82015-07-27 11:34:13 -07003595void X86Assembler::repe_cmpsw() {
3596 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3597 EmitUint8(0x66);
3598 EmitUint8(0xF3);
3599 EmitUint8(0xA7);
3600}
3601
3602
agicsaki970abfb2015-07-31 10:31:14 -07003603void X86Assembler::repe_cmpsl() {
3604 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3605 EmitUint8(0xF3);
3606 EmitUint8(0xA7);
3607}
3608
3609
jessicahandojob03d6402016-09-07 12:16:53 -07003610void X86Assembler::rep_movsb() {
3611 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3612 EmitUint8(0xF3);
3613 EmitUint8(0xA4);
3614}
3615
3616
Mark Mendellb9c4bbe2015-07-01 14:26:52 -04003617void X86Assembler::rep_movsw() {
3618 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3619 EmitUint8(0x66);
3620 EmitUint8(0xF3);
3621 EmitUint8(0xA5);
3622}
3623
3624
Ian Rogers2c8f6532011-09-02 17:16:34 -07003625X86Assembler* X86Assembler::lock() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003626 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3627 EmitUint8(0xF0);
Ian Rogers0d666d82011-08-14 16:03:46 -07003628 return this;
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003629}
3630
3631
Ian Rogers2c8f6532011-09-02 17:16:34 -07003632void X86Assembler::cmpxchgl(const Address& address, Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003633 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3634 EmitUint8(0x0F);
3635 EmitUint8(0xB1);
3636 EmitOperand(reg, address);
3637}
3638
Mark Mendell58d25fd2015-04-03 14:52:31 -04003639
3640void X86Assembler::cmpxchg8b(const Address& address) {
3641 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3642 EmitUint8(0x0F);
3643 EmitUint8(0xC7);
3644 EmitOperand(1, address);
3645}
3646
3647
Elliott Hughes79ab9e32012-03-12 15:41:35 -07003648void X86Assembler::mfence() {
3649 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3650 EmitUint8(0x0F);
3651 EmitUint8(0xAE);
3652 EmitUint8(0xF0);
3653}
3654
Ian Rogers2c8f6532011-09-02 17:16:34 -07003655X86Assembler* X86Assembler::fs() {
Ian Rogersb033c752011-07-20 12:22:35 -07003656 // TODO: fs is a prefix and not an instruction
3657 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3658 EmitUint8(0x64);
Ian Rogers0d666d82011-08-14 16:03:46 -07003659 return this;
Ian Rogersb033c752011-07-20 12:22:35 -07003660}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003661
Ian Rogersbefbd572014-03-06 01:13:39 -08003662X86Assembler* X86Assembler::gs() {
3663 // TODO: fs is a prefix and not an instruction
3664 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3665 EmitUint8(0x65);
3666 return this;
3667}
3668
Ian Rogers2c8f6532011-09-02 17:16:34 -07003669void X86Assembler::AddImmediate(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003670 int value = imm.value();
3671 if (value > 0) {
3672 if (value == 1) {
3673 incl(reg);
3674 } else if (value != 0) {
3675 addl(reg, imm);
3676 }
3677 } else if (value < 0) {
3678 value = -value;
3679 if (value == 1) {
3680 decl(reg);
3681 } else if (value != 0) {
3682 subl(reg, Immediate(value));
3683 }
3684 }
3685}
3686
3687
Roland Levillain647b9ed2014-11-27 12:06:00 +00003688void X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) {
3689 // TODO: Need to have a code constants table.
3690 pushl(Immediate(High32Bits(value)));
3691 pushl(Immediate(Low32Bits(value)));
3692 movsd(dst, Address(ESP, 0));
3693 addl(ESP, Immediate(2 * sizeof(int32_t)));
3694}
3695
3696
Ian Rogers2c8f6532011-09-02 17:16:34 -07003697void X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003698 // TODO: Need to have a code constants table.
3699 int64_t constant = bit_cast<int64_t, double>(value);
Roland Levillain647b9ed2014-11-27 12:06:00 +00003700 LoadLongConstant(dst, constant);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003701}
3702
3703
Ian Rogers2c8f6532011-09-02 17:16:34 -07003704void X86Assembler::Align(int alignment, int offset) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003705 CHECK(IsPowerOfTwo(alignment));
3706 // Emit nop instruction until the real position is aligned.
3707 while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) {
3708 nop();
3709 }
3710}
3711
3712
Ian Rogers2c8f6532011-09-02 17:16:34 -07003713void X86Assembler::Bind(Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003714 int bound = buffer_.Size();
3715 CHECK(!label->IsBound()); // Labels can only be bound once.
3716 while (label->IsLinked()) {
3717 int position = label->LinkPosition();
3718 int next = buffer_.Load<int32_t>(position);
3719 buffer_.Store<int32_t>(position, bound - (position + 4));
3720 label->position_ = next;
3721 }
3722 label->BindTo(bound);
3723}
3724
3725
Mark Mendell73f455e2015-08-21 09:30:05 -04003726void X86Assembler::Bind(NearLabel* label) {
3727 int bound = buffer_.Size();
3728 CHECK(!label->IsBound()); // Labels can only be bound once.
3729 while (label->IsLinked()) {
3730 int position = label->LinkPosition();
3731 uint8_t delta = buffer_.Load<uint8_t>(position);
3732 int offset = bound - (position + 1);
3733 CHECK(IsInt<8>(offset));
3734 buffer_.Store<int8_t>(position, offset);
3735 label->position_ = delta != 0u ? label->position_ - delta : 0;
3736 }
3737 label->BindTo(bound);
3738}
3739
3740
Ian Rogers44fb0d02012-03-23 16:46:24 -07003741void X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) {
3742 CHECK_GE(reg_or_opcode, 0);
3743 CHECK_LT(reg_or_opcode, 8);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003744 const int length = operand.length_;
3745 CHECK_GT(length, 0);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003746 // Emit the ModRM byte updated with the given reg value.
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003747 CHECK_EQ(operand.encoding_[0] & 0x38, 0);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003748 EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3));
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003749 // Emit the rest of the encoded operand.
3750 for (int i = 1; i < length; i++) {
3751 EmitUint8(operand.encoding_[i]);
3752 }
Mark Mendell0616ae02015-04-17 12:49:27 -04003753 AssemblerFixup* fixup = operand.GetFixup();
3754 if (fixup != nullptr) {
3755 EmitFixup(fixup);
3756 }
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003757}
3758
3759
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003760void X86Assembler::EmitImmediate(const Immediate& imm, bool is_16_op) {
3761 if (is_16_op) {
3762 EmitUint8(imm.value() & 0xFF);
3763 EmitUint8(imm.value() >> 8);
3764 } else {
3765 EmitInt32(imm.value());
3766 }
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003767}
3768
3769
Ian Rogers44fb0d02012-03-23 16:46:24 -07003770void X86Assembler::EmitComplex(int reg_or_opcode,
Ian Rogers2c8f6532011-09-02 17:16:34 -07003771 const Operand& operand,
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003772 const Immediate& immediate,
3773 bool is_16_op) {
Ian Rogers44fb0d02012-03-23 16:46:24 -07003774 CHECK_GE(reg_or_opcode, 0);
3775 CHECK_LT(reg_or_opcode, 8);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003776 if (immediate.is_int8()) {
3777 // Use sign-extended 8-bit immediate.
3778 EmitUint8(0x83);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003779 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003780 EmitUint8(immediate.value() & 0xFF);
3781 } else if (operand.IsRegister(EAX)) {
3782 // Use short form if the destination is eax.
Ian Rogers44fb0d02012-03-23 16:46:24 -07003783 EmitUint8(0x05 + (reg_or_opcode << 3));
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003784 EmitImmediate(immediate, is_16_op);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003785 } else {
3786 EmitUint8(0x81);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003787 EmitOperand(reg_or_opcode, operand);
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003788 EmitImmediate(immediate, is_16_op);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003789 }
3790}
3791
3792
Ian Rogers2c8f6532011-09-02 17:16:34 -07003793void X86Assembler::EmitLabel(Label* label, int instruction_size) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003794 if (label->IsBound()) {
3795 int offset = label->Position() - buffer_.Size();
3796 CHECK_LE(offset, 0);
3797 EmitInt32(offset - instruction_size);
3798 } else {
3799 EmitLabelLink(label);
3800 }
3801}
3802
3803
Ian Rogers2c8f6532011-09-02 17:16:34 -07003804void X86Assembler::EmitLabelLink(Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003805 CHECK(!label->IsBound());
3806 int position = buffer_.Size();
3807 EmitInt32(label->position_);
3808 label->LinkTo(position);
3809}
3810
3811
Mark Mendell73f455e2015-08-21 09:30:05 -04003812void X86Assembler::EmitLabelLink(NearLabel* label) {
3813 CHECK(!label->IsBound());
3814 int position = buffer_.Size();
3815 if (label->IsLinked()) {
3816 // Save the delta in the byte that we have to play with.
3817 uint32_t delta = position - label->LinkPosition();
3818 CHECK(IsUint<8>(delta));
3819 EmitUint8(delta & 0xFF);
3820 } else {
3821 EmitUint8(0);
3822 }
3823 label->LinkTo(position);
3824}
3825
3826
Ian Rogers44fb0d02012-03-23 16:46:24 -07003827void X86Assembler::EmitGenericShift(int reg_or_opcode,
Mark P Mendell73945692015-04-29 14:56:17 +00003828 const Operand& operand,
Ian Rogers2c8f6532011-09-02 17:16:34 -07003829 const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003830 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3831 CHECK(imm.is_int8());
3832 if (imm.value() == 1) {
3833 EmitUint8(0xD1);
Mark P Mendell73945692015-04-29 14:56:17 +00003834 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003835 } else {
3836 EmitUint8(0xC1);
Mark P Mendell73945692015-04-29 14:56:17 +00003837 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003838 EmitUint8(imm.value() & 0xFF);
3839 }
3840}
3841
3842
Ian Rogers44fb0d02012-03-23 16:46:24 -07003843void X86Assembler::EmitGenericShift(int reg_or_opcode,
Mark P Mendell73945692015-04-29 14:56:17 +00003844 const Operand& operand,
Ian Rogers2c8f6532011-09-02 17:16:34 -07003845 Register shifter) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003846 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3847 CHECK_EQ(shifter, ECX);
3848 EmitUint8(0xD3);
Mark P Mendell73945692015-04-29 14:56:17 +00003849 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003850}
3851
Mark Mendell0616ae02015-04-17 12:49:27 -04003852void X86Assembler::AddConstantArea() {
Vladimir Marko93205e32016-04-13 11:59:46 +01003853 ArrayRef<const int32_t> area = constant_area_.GetBuffer();
Mark Mendell0616ae02015-04-17 12:49:27 -04003854 // Generate the data for the literal area.
3855 for (size_t i = 0, e = area.size(); i < e; i++) {
3856 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3857 EmitInt32(area[i]);
3858 }
3859}
3860
Mark Mendell805b3b52015-09-18 14:10:29 -04003861size_t ConstantArea::AppendInt32(int32_t v) {
3862 size_t result = buffer_.size() * elem_size_;
Mark Mendell0616ae02015-04-17 12:49:27 -04003863 buffer_.push_back(v);
3864 return result;
3865}
3866
Mark Mendell805b3b52015-09-18 14:10:29 -04003867size_t ConstantArea::AddInt32(int32_t v) {
3868 for (size_t i = 0, e = buffer_.size(); i < e; i++) {
3869 if (v == buffer_[i]) {
3870 return i * elem_size_;
3871 }
3872 }
3873
3874 // Didn't match anything.
3875 return AppendInt32(v);
3876}
3877
3878size_t ConstantArea::AddInt64(int64_t v) {
Mark Mendell0616ae02015-04-17 12:49:27 -04003879 int32_t v_low = Low32Bits(v);
3880 int32_t v_high = High32Bits(v);
3881 if (buffer_.size() > 1) {
3882 // Ensure we don't pass the end of the buffer.
3883 for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) {
3884 if (v_low == buffer_[i] && v_high == buffer_[i + 1]) {
Mark Mendell805b3b52015-09-18 14:10:29 -04003885 return i * elem_size_;
Mark Mendell0616ae02015-04-17 12:49:27 -04003886 }
3887 }
3888 }
3889
3890 // Didn't match anything.
Mark Mendell805b3b52015-09-18 14:10:29 -04003891 size_t result = buffer_.size() * elem_size_;
Mark Mendell0616ae02015-04-17 12:49:27 -04003892 buffer_.push_back(v_low);
3893 buffer_.push_back(v_high);
3894 return result;
3895}
3896
Mark Mendell805b3b52015-09-18 14:10:29 -04003897size_t ConstantArea::AddDouble(double v) {
Mark Mendell0616ae02015-04-17 12:49:27 -04003898 // Treat the value as a 64-bit integer value.
3899 return AddInt64(bit_cast<int64_t, double>(v));
3900}
3901
Mark Mendell805b3b52015-09-18 14:10:29 -04003902size_t ConstantArea::AddFloat(float v) {
Mark Mendell0616ae02015-04-17 12:49:27 -04003903 // Treat the value as a 32-bit integer value.
3904 return AddInt32(bit_cast<int32_t, float>(v));
3905}
3906
jaishank20d1c942019-03-08 15:08:17 +05303907uint8_t X86Assembler::EmitVexPrefixByteZero(bool is_twobyte_form) {
3908 /**Vex Byte 0,
3909 Bits [7:0] must contain the value 11000101b (0xC5) for 2-byte Vex
3910 Bits [7:0] must contain the value 11000100b (0xC4) for 3-byte Vex */
3911 uint8_t vex_prefix = 0xC0;
3912 if (is_twobyte_form) {
3913 // 2-Byte Vex
3914 vex_prefix |= TWO_BYTE_VEX;
3915 } else {
3916 // 3-Byte Vex
3917 vex_prefix |= THREE_BYTE_VEX;
3918 }
3919 return vex_prefix;
3920}
3921
3922uint8_t X86Assembler::EmitVexPrefixByteOne(bool R,
3923 bool X,
3924 bool B,
3925 int SET_VEX_M) {
3926 /**Vex Byte 1, */
3927 uint8_t vex_prefix = VEX_INIT;
3928 /** Bit[7] This bit needs to be set to '1'
3929 otherwise the instruction is LES or LDS */
3930 if (!R) {
3931 // R .
3932 vex_prefix |= SET_VEX_R;
3933 }
3934 /** Bit[6] This bit needs to be set to '1'
3935 otherwise the instruction is LES or LDS */
3936 if (!X) {
3937 // X .
3938 vex_prefix |= SET_VEX_X;
3939 }
3940 /** Bit[5] This bit needs to be set to '1' */
3941 if (!B) {
3942 // B .
3943 vex_prefix |= SET_VEX_B;
3944 }
3945 /** Bits[4:0], */
3946 vex_prefix |= SET_VEX_M;
3947 return vex_prefix;
3948}
3949
3950uint8_t X86Assembler::EmitVexPrefixByteOne(bool R,
3951 X86ManagedRegister operand,
3952 int SET_VEX_L,
3953 int SET_VEX_PP) {
3954 /**Vex Byte 1, */
3955 uint8_t vex_prefix = VEX_INIT;
3956 /** Bit[7] This bit needs to be set to '1'
3957 otherwise the instruction is LES or LDS */
3958 if (!R) {
3959 // R .
3960 vex_prefix |= SET_VEX_R;
3961 }
3962 /**Bits[6:3] - 'vvvv' the source or dest register specifier */
3963 if (operand.IsNoRegister()) {
3964 vex_prefix |= 0x78;
3965 } else if (operand.IsXmmRegister()) {
3966 XmmRegister vvvv = operand.AsXmmRegister();
3967 int inverted_reg = 15 - static_cast<int>(vvvv);
3968 uint8_t reg = static_cast<uint8_t>(inverted_reg);
3969 vex_prefix |= ((reg & 0x0F) << 3);
3970 } else if (operand.IsCpuRegister()) {
3971 Register vvvv = operand.AsCpuRegister();
3972 int inverted_reg = 15 - static_cast<int>(vvvv);
3973 uint8_t reg = static_cast<uint8_t>(inverted_reg);
3974 vex_prefix |= ((reg & 0x0F) << 3);
3975 }
3976 /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
3977 VEX.L = 0 indicates 128 bit vector operation */
3978 vex_prefix |= SET_VEX_L;
3979 /** Bits[1:0] - "pp" */
3980 vex_prefix |= SET_VEX_PP;
3981 return vex_prefix;
3982}
3983
3984uint8_t X86Assembler::EmitVexPrefixByteTwo(bool W,
3985 X86ManagedRegister operand,
3986 int SET_VEX_L,
3987 int SET_VEX_PP) {
3988 /** Vex Byte 2, */
3989 uint8_t vex_prefix = VEX_INIT;
3990 /** Bit[7] This bits needs to be set to '1' with default value.
3991 When using C4H form of VEX prefix, W value is ignored */
3992 if (W) {
3993 vex_prefix |= SET_VEX_W;
3994 }
3995 /** Bits[6:3] - 'vvvv' the source or dest register specifier */
3996 if (operand.IsXmmRegister()) {
3997 XmmRegister vvvv = operand.AsXmmRegister();
3998 int inverted_reg = 15 - static_cast<int>(vvvv);
3999 uint8_t reg = static_cast<uint8_t>(inverted_reg);
4000 vex_prefix |= ((reg & 0x0F) << 3);
4001 } else if (operand.IsCpuRegister()) {
4002 Register vvvv = operand.AsCpuRegister();
4003 int inverted_reg = 15 - static_cast<int>(vvvv);
4004 uint8_t reg = static_cast<uint8_t>(inverted_reg);
4005 vex_prefix |= ((reg & 0x0F) << 3);
4006 }
4007 /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
4008 VEX.L = 0 indicates 128 bit vector operation */
4009 vex_prefix |= SET_VEX_L;
4010 // Bits[1:0] - "pp"
4011 vex_prefix |= SET_VEX_PP;
4012 return vex_prefix;
4013}
4014
4015uint8_t X86Assembler::EmitVexPrefixByteTwo(bool W,
4016 int SET_VEX_L,
4017 int SET_VEX_PP) {
4018 /**Vex Byte 2, */
4019 uint8_t vex_prefix = VEX_INIT;
4020
4021 /** Bit[7] This bits needs to be set to '1' with default value.
4022 When using C4H form of VEX prefix, W value is ignored */
4023 if (W) {
4024 vex_prefix |= SET_VEX_W;
4025 }
4026 /** Bits[6:3] - 'vvvv' the source or dest register specifier,
4027 if unused set 1111 */
4028 vex_prefix |= (0x0F << 3);
4029
4030 /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
4031 VEX.L = 0 indicates 128 bit vector operation */
4032 vex_prefix |= SET_VEX_L;
4033
4034 /** Bits[1:0] - "pp" */
4035 if (SET_VEX_PP != SET_VEX_PP_NONE) {
4036 vex_prefix |= SET_VEX_PP;
4037 }
4038 return vex_prefix;
4039}
4040
Ian Rogers2c8f6532011-09-02 17:16:34 -07004041} // namespace x86
Ian Rogersb033c752011-07-20 12:22:35 -07004042} // namespace art