blob: 01eb160fa7d084c6ad90a53acb586fc8e42d54dd [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_);
jaishank20d1c942019-03-08 15:08:17 +0530191 uint8_t byte_zero = EmitVexPrefixByteZero(false /*is_two_byte*/);
192 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_);
jaishank20d1c942019-03-08 15:08:17 +0530205 uint8_t byte_zero = EmitVexPrefixByteZero(false /*is_two_byte*/);
206 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_);
jaishank20d1c942019-03-08 15:08:17 +0530219 uint8_t byte_zero = EmitVexPrefixByteZero(false /*is_two_byte*/);
220 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*/
437 uint8_t byte_zero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
438 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.*/
441 uint8_t byte_one = EmitVexPrefixByteOne(/**R = */false,
442 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*/
469 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
470 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.*/
473 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
474 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*/
501 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
502 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.*/
505 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
506 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*/
533 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
534 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.*/
537 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
538 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*/
565 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
566 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.*/
569 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
570 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
706
707void X86Assembler::subps(XmmRegister dst, XmmRegister src) {
708 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
709 EmitUint8(0x0F);
710 EmitUint8(0x5C);
711 EmitXmmRegisterOperand(dst, src);
712}
713
714
715void X86Assembler::mulps(XmmRegister dst, XmmRegister src) {
716 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
717 EmitUint8(0x0F);
718 EmitUint8(0x59);
719 EmitXmmRegisterOperand(dst, src);
720}
721
722
723void X86Assembler::divps(XmmRegister dst, XmmRegister src) {
724 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
725 EmitUint8(0x0F);
726 EmitUint8(0x5E);
727 EmitXmmRegisterOperand(dst, src);
728}
729
730
731void X86Assembler::movapd(XmmRegister dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530732 if (CpuHasAVXorAVX2FeatureFlag()) {
733 vmovapd(dst, src);
734 return;
735 }
Aart Bikc7782262017-01-13 16:20:08 -0800736 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
737 EmitUint8(0x66);
738 EmitUint8(0x0F);
739 EmitUint8(0x28);
740 EmitXmmRegisterOperand(dst, src);
741}
742
jaishank20d1c942019-03-08 15:08:17 +0530743/**VEX.128.66.0F.WIG 28 /r VMOVAPD xmm1, xmm2*/
744void X86Assembler::vmovapd(XmmRegister dst, XmmRegister src) {
745 DCHECK(CpuHasAVXorAVX2FeatureFlag());
746 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
747 /**Instruction VEX Prefix*/
748 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
749 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
750 /**a REX prefix is necessary only if an instruction references one of the
751 extended registers or uses a 64-bit operand.*/
752 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
753 vvvv_reg ,
754 SET_VEX_L_128,
755 SET_VEX_PP_66);
756 EmitUint8(ByteZero);
757 EmitUint8(ByteOne);
758 // Instruction Opcode
759 EmitUint8(0x28);
760 // Instruction Operands
761 EmitXmmRegisterOperand(dst, src);
762}
Aart Bikc7782262017-01-13 16:20:08 -0800763
764void X86Assembler::movapd(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +0530765 if (CpuHasAVXorAVX2FeatureFlag()) {
766 vmovapd(dst, src);
767 return;
768 }
Aart Bikc7782262017-01-13 16:20:08 -0800769 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
770 EmitUint8(0x66);
771 EmitUint8(0x0F);
772 EmitUint8(0x28);
773 EmitOperand(dst, src);
774}
775
jaishank20d1c942019-03-08 15:08:17 +0530776/**VEX.128.66.0F.WIG 28 /r VMOVAPD xmm1, m128*/
777void X86Assembler::vmovapd(XmmRegister dst, const Address& src) {
778 DCHECK(CpuHasAVXorAVX2FeatureFlag());
779 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
780 /**Instruction VEX Prefix*/
781 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
782 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
783 /**a REX prefix is necessary only if an instruction references one of the
784 extended registers or uses a 64-bit operand.*/
785 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
786 vvvv_reg,
787 SET_VEX_L_128,
788 SET_VEX_PP_66);
789 EmitUint8(ByteZero);
790 EmitUint8(ByteOne);
791 // Instruction Opcode
792 EmitUint8(0x28);
793 // Instruction Operands
794 EmitOperand(dst, src);
795}
Aart Bikc7782262017-01-13 16:20:08 -0800796
797void X86Assembler::movupd(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +0530798 if (CpuHasAVXorAVX2FeatureFlag()) {
799 vmovupd(dst, src);
800 return;
801 }
Aart Bikc7782262017-01-13 16:20:08 -0800802 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
803 EmitUint8(0x66);
804 EmitUint8(0x0F);
805 EmitUint8(0x10);
806 EmitOperand(dst, src);
807}
808
jaishank20d1c942019-03-08 15:08:17 +0530809/**VEX.128.66.0F.WIG 10 /r VMOVUPD xmm1, m128*/
810void X86Assembler::vmovupd(XmmRegister dst, const Address& src) {
811 DCHECK(CpuHasAVXorAVX2FeatureFlag());
812 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
813 /**Instruction VEX Prefix*/
814 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
815 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
816 /**a REX prefix is necessary only if an instruction references one of the
817 extended registers or uses a 64-bit operand.*/
818 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
819 vvvv_reg,
820 SET_VEX_L_128,
821 SET_VEX_PP_66);
822 EmitUint8(ByteZero);
823 EmitUint8(ByteOne);
824 // Instruction Opcode
825 EmitUint8(0x10);
826 // Instruction Operands
827 EmitOperand(dst, src);
828}
829
Aart Bikc7782262017-01-13 16:20:08 -0800830
831void X86Assembler::movapd(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530832 if (CpuHasAVXorAVX2FeatureFlag()) {
833 vmovapd(dst, src);
834 return;
835 }
Aart Bikc7782262017-01-13 16:20:08 -0800836 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
837 EmitUint8(0x66);
838 EmitUint8(0x0F);
839 EmitUint8(0x29);
840 EmitOperand(src, dst);
841}
842
jaishank20d1c942019-03-08 15:08:17 +0530843/**VEX.128.66.0F.WIG 29 /r VMOVAPD m128, xmm1 */
844void X86Assembler::vmovapd(const Address& dst, XmmRegister src) {
845 DCHECK(CpuHasAVXorAVX2FeatureFlag());
846 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
847 /**Instruction VEX Prefix */
848 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
849 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
850 /**a REX prefix is necessary only if an instruction references one of the
851 extended registers or uses a 64-bit operand.*/
852 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
853 vvvv_reg,
854 SET_VEX_L_128,
855 SET_VEX_PP_66);
856 EmitUint8(ByteZero);
857 EmitUint8(ByteOne);
858 // Instruction Opcode
859 EmitUint8(0x29);
860 // Instruction Operands
861 EmitOperand(src, dst);
862}
Aart Bikc7782262017-01-13 16:20:08 -0800863
864void X86Assembler::movupd(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +0530865 if (CpuHasAVXorAVX2FeatureFlag()) {
866 vmovupd(dst, src);
867 return;
868 }
Aart Bikc7782262017-01-13 16:20:08 -0800869 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
870 EmitUint8(0x66);
871 EmitUint8(0x0F);
872 EmitUint8(0x11);
873 EmitOperand(src, dst);
874}
875
jaishank20d1c942019-03-08 15:08:17 +0530876/**VEX.128.66.0F.WIG 11 /r VMOVUPD m128, xmm1 */
877void X86Assembler::vmovupd(const Address& dst, XmmRegister src) {
878 DCHECK(CpuHasAVXorAVX2FeatureFlag());
879 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
880 /**Instruction VEX Prefix */
881 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
882 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
883 /**a REX prefix is necessary only if an instruction references one of the
884 extended registers or uses a 64-bit operand.**/
885 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
886 vvvv_reg,
887 SET_VEX_L_128,
888 SET_VEX_PP_66);
889 EmitUint8(ByteZero);
890 EmitUint8(ByteOne);
891 // Instruction Opcode
892 EmitUint8(0x11);
893 // Instruction Operands
894 EmitOperand(src, dst);
895}
Aart Bikc7782262017-01-13 16:20:08 -0800896
Ian Rogers2c8f6532011-09-02 17:16:34 -0700897void X86Assembler::flds(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700898 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
899 EmitUint8(0xD9);
900 EmitOperand(0, src);
901}
902
903
Mark Mendell24f2dfa2015-01-14 19:51:45 -0500904void X86Assembler::fsts(const Address& dst) {
905 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
906 EmitUint8(0xD9);
907 EmitOperand(2, dst);
908}
909
910
Ian Rogers2c8f6532011-09-02 17:16:34 -0700911void X86Assembler::fstps(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700912 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
913 EmitUint8(0xD9);
914 EmitOperand(3, dst);
915}
916
917
Ian Rogers2c8f6532011-09-02 17:16:34 -0700918void X86Assembler::movsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700919 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
920 EmitUint8(0xF2);
921 EmitUint8(0x0F);
922 EmitUint8(0x10);
923 EmitOperand(dst, src);
924}
925
926
Ian Rogers2c8f6532011-09-02 17:16:34 -0700927void X86Assembler::movsd(const Address& dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700928 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
929 EmitUint8(0xF2);
930 EmitUint8(0x0F);
931 EmitUint8(0x11);
932 EmitOperand(src, dst);
933}
934
935
Ian Rogers2c8f6532011-09-02 17:16:34 -0700936void X86Assembler::movsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700937 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
938 EmitUint8(0xF2);
939 EmitUint8(0x0F);
940 EmitUint8(0x11);
941 EmitXmmRegisterOperand(src, dst);
942}
943
944
Nicolas Geoffray234d69d2015-03-09 10:28:50 +0000945void X86Assembler::movhpd(XmmRegister dst, const Address& src) {
946 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
947 EmitUint8(0x66);
948 EmitUint8(0x0F);
949 EmitUint8(0x16);
950 EmitOperand(dst, src);
951}
952
953
954void X86Assembler::movhpd(const Address& dst, XmmRegister src) {
955 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
956 EmitUint8(0x66);
957 EmitUint8(0x0F);
958 EmitUint8(0x17);
959 EmitOperand(src, dst);
960}
961
962
Ian Rogers2c8f6532011-09-02 17:16:34 -0700963void X86Assembler::addsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700964 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
965 EmitUint8(0xF2);
966 EmitUint8(0x0F);
967 EmitUint8(0x58);
968 EmitXmmRegisterOperand(dst, src);
969}
970
971
Ian Rogers2c8f6532011-09-02 17:16:34 -0700972void X86Assembler::addsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700973 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
974 EmitUint8(0xF2);
975 EmitUint8(0x0F);
976 EmitUint8(0x58);
977 EmitOperand(dst, src);
978}
979
980
Ian Rogers2c8f6532011-09-02 17:16:34 -0700981void X86Assembler::subsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700982 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
983 EmitUint8(0xF2);
984 EmitUint8(0x0F);
985 EmitUint8(0x5C);
986 EmitXmmRegisterOperand(dst, src);
987}
988
989
Ian Rogers2c8f6532011-09-02 17:16:34 -0700990void X86Assembler::subsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -0700991 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
992 EmitUint8(0xF2);
993 EmitUint8(0x0F);
994 EmitUint8(0x5C);
995 EmitOperand(dst, src);
996}
997
998
Ian Rogers2c8f6532011-09-02 17:16:34 -0700999void X86Assembler::mulsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001000 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1001 EmitUint8(0xF2);
1002 EmitUint8(0x0F);
1003 EmitUint8(0x59);
1004 EmitXmmRegisterOperand(dst, src);
1005}
1006
1007
Ian Rogers2c8f6532011-09-02 17:16:34 -07001008void X86Assembler::mulsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001009 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1010 EmitUint8(0xF2);
1011 EmitUint8(0x0F);
1012 EmitUint8(0x59);
1013 EmitOperand(dst, src);
1014}
1015
1016
Ian Rogers2c8f6532011-09-02 17:16:34 -07001017void X86Assembler::divsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001018 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1019 EmitUint8(0xF2);
1020 EmitUint8(0x0F);
1021 EmitUint8(0x5E);
1022 EmitXmmRegisterOperand(dst, src);
1023}
1024
1025
Ian Rogers2c8f6532011-09-02 17:16:34 -07001026void X86Assembler::divsd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001027 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1028 EmitUint8(0xF2);
1029 EmitUint8(0x0F);
1030 EmitUint8(0x5E);
1031 EmitOperand(dst, src);
1032}
1033
1034
Aart Bikc7782262017-01-13 16:20:08 -08001035void X86Assembler::addpd(XmmRegister dst, XmmRegister src) {
1036 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1037 EmitUint8(0x66);
1038 EmitUint8(0x0F);
1039 EmitUint8(0x58);
1040 EmitXmmRegisterOperand(dst, src);
1041}
1042
1043
1044void X86Assembler::subpd(XmmRegister dst, XmmRegister src) {
1045 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1046 EmitUint8(0x66);
1047 EmitUint8(0x0F);
1048 EmitUint8(0x5C);
1049 EmitXmmRegisterOperand(dst, src);
1050}
1051
1052
1053void X86Assembler::mulpd(XmmRegister dst, XmmRegister src) {
1054 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1055 EmitUint8(0x66);
1056 EmitUint8(0x0F);
1057 EmitUint8(0x59);
1058 EmitXmmRegisterOperand(dst, src);
1059}
1060
1061
1062void X86Assembler::divpd(XmmRegister dst, XmmRegister src) {
1063 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1064 EmitUint8(0x66);
1065 EmitUint8(0x0F);
1066 EmitUint8(0x5E);
1067 EmitXmmRegisterOperand(dst, src);
1068}
1069
1070
Aart Bik68555e92017-02-13 14:28:45 -08001071void X86Assembler::movdqa(XmmRegister dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +05301072 if (CpuHasAVXorAVX2FeatureFlag()) {
1073 vmovdqa(dst, src);
1074 return;
1075 }
Aart Bik68555e92017-02-13 14:28:45 -08001076 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1077 EmitUint8(0x66);
1078 EmitUint8(0x0F);
1079 EmitUint8(0x6F);
1080 EmitXmmRegisterOperand(dst, src);
1081}
1082
jaishank20d1c942019-03-08 15:08:17 +05301083/**VEX.128.66.0F.WIG 6F /r VMOVDQA xmm1, xmm2 */
1084void X86Assembler::vmovdqa(XmmRegister dst, XmmRegister src) {
1085 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1086 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1087 /**Instruction VEX Prefix */
1088 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
1089 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1090 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
1091 vvvv_reg,
1092 SET_VEX_L_128,
1093 SET_VEX_PP_66);
1094 EmitUint8(ByteZero);
1095 EmitUint8(ByteOne);
1096 // Instruction Opcode
1097 EmitUint8(0x6F);
1098 // Instruction Operands
1099 EmitXmmRegisterOperand(dst, src);
1100}
Aart Bik68555e92017-02-13 14:28:45 -08001101
1102void X86Assembler::movdqa(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +05301103 if (CpuHasAVXorAVX2FeatureFlag()) {
1104 vmovdqa(dst, src);
1105 return;
1106 }
Aart Bik68555e92017-02-13 14:28:45 -08001107 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1108 EmitUint8(0x66);
1109 EmitUint8(0x0F);
1110 EmitUint8(0x6F);
1111 EmitOperand(dst, src);
1112}
1113
jaishank20d1c942019-03-08 15:08:17 +05301114/**VEX.128.66.0F.WIG 6F /r VMOVDQA xmm1, m128 */
1115void X86Assembler::vmovdqa(XmmRegister dst, const Address& src) {
1116 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1117 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1118 /**Instruction VEX Prefix */
1119 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
1120 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1121 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
1122 vvvv_reg,
1123 SET_VEX_L_128,
1124 SET_VEX_PP_66);
1125 EmitUint8(ByteZero);
1126 EmitUint8(ByteOne);
1127 // Instruction Opcode
1128 EmitUint8(0x6F);
1129 // Instruction Operands
1130 EmitOperand(dst, src);
1131}
Aart Bik68555e92017-02-13 14:28:45 -08001132
1133void X86Assembler::movdqu(XmmRegister dst, const Address& src) {
jaishank20d1c942019-03-08 15:08:17 +05301134 if (CpuHasAVXorAVX2FeatureFlag()) {
1135 vmovdqu(dst, src);
1136 return;
1137 }
Aart Bik68555e92017-02-13 14:28:45 -08001138 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1139 EmitUint8(0xF3);
1140 EmitUint8(0x0F);
1141 EmitUint8(0x6F);
1142 EmitOperand(dst, src);
1143}
1144
jaishank20d1c942019-03-08 15:08:17 +05301145/**VEX.128.F3.0F.WIG 6F /r VMOVDQU xmm1, m128 */
1146void X86Assembler::vmovdqu(XmmRegister dst, const Address& src) {
1147 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1148 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1149 /**Instruction VEX Prefix */
1150 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
1151 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1152 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
1153 vvvv_reg,
1154 SET_VEX_L_128,
1155 SET_VEX_PP_F3);
1156 EmitUint8(ByteZero);
1157 EmitUint8(ByteOne);
1158 // Instruction Opcode
1159 EmitUint8(0x6F);
1160 // Instruction Operands
1161 EmitOperand(dst, src);
1162}
Aart Bik68555e92017-02-13 14:28:45 -08001163
1164void X86Assembler::movdqa(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +05301165 if (CpuHasAVXorAVX2FeatureFlag()) {
1166 vmovdqa(dst, src);
1167 return;
1168 }
Aart Bik68555e92017-02-13 14:28:45 -08001169 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1170 EmitUint8(0x66);
1171 EmitUint8(0x0F);
1172 EmitUint8(0x7F);
1173 EmitOperand(src, dst);
1174}
1175
jaishank20d1c942019-03-08 15:08:17 +05301176/**VEX.128.66.0F.WIG 7F /r VMOVDQA m128, xmm1 */
1177void X86Assembler::vmovdqa(const Address& dst, XmmRegister src) {
1178 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1179 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1180 /**Instruction VEX Prefix */
1181 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
1182 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1183 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
1184 vvvv_reg,
1185 SET_VEX_L_128,
1186 SET_VEX_PP_66);
1187 EmitUint8(ByteZero);
1188 EmitUint8(ByteOne);
1189 // Instruction Opcode
1190 EmitUint8(0x7F);
1191 // Instruction Operands
1192 EmitOperand(src, dst);
1193}
1194
Aart Bik68555e92017-02-13 14:28:45 -08001195
1196void X86Assembler::movdqu(const Address& dst, XmmRegister src) {
jaishank20d1c942019-03-08 15:08:17 +05301197 if (CpuHasAVXorAVX2FeatureFlag()) {
1198 vmovdqu(dst, src);
1199 return;
1200 }
Aart Bik68555e92017-02-13 14:28:45 -08001201 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1202 EmitUint8(0xF3);
1203 EmitUint8(0x0F);
1204 EmitUint8(0x7F);
1205 EmitOperand(src, dst);
1206}
1207
jaishank20d1c942019-03-08 15:08:17 +05301208/**VEX.128.F3.0F.WIG 7F /r VMOVDQU m128, xmm1 */
1209void X86Assembler::vmovdqu(const Address& dst, XmmRegister src) {
1210 DCHECK(CpuHasAVXorAVX2FeatureFlag());
1211 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1212 // Instruction VEX Prefix
1213 uint8_t ByteZero = EmitVexPrefixByteZero(/**is_twobyte_form= */true);
1214 X86ManagedRegister vvvv_reg = ManagedRegister::NoRegister().AsX86();
1215 uint8_t ByteOne = EmitVexPrefixByteOne(/**R = */false,
1216 vvvv_reg,
1217 SET_VEX_L_128,
1218 SET_VEX_PP_F3);
1219 EmitUint8(ByteZero);
1220 EmitUint8(ByteOne);
1221 // Instruction Opcode
1222 EmitUint8(0x7F);
1223 // Instruction Operands
1224 EmitOperand(src, dst);
1225}
Aart Bik68555e92017-02-13 14:28:45 -08001226
Aart Bike69d7a92017-02-17 11:48:23 -08001227void X86Assembler::paddb(XmmRegister dst, XmmRegister src) {
1228 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1229 EmitUint8(0x66);
1230 EmitUint8(0x0F);
1231 EmitUint8(0xFC);
1232 EmitXmmRegisterOperand(dst, src);
1233}
1234
1235
1236void X86Assembler::psubb(XmmRegister dst, XmmRegister src) {
1237 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1238 EmitUint8(0x66);
1239 EmitUint8(0x0F);
1240 EmitUint8(0xF8);
1241 EmitXmmRegisterOperand(dst, src);
1242}
1243
1244
1245void X86Assembler::paddw(XmmRegister dst, XmmRegister src) {
1246 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1247 EmitUint8(0x66);
1248 EmitUint8(0x0F);
1249 EmitUint8(0xFD);
1250 EmitXmmRegisterOperand(dst, src);
1251}
1252
1253
1254void X86Assembler::psubw(XmmRegister dst, XmmRegister src) {
1255 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1256 EmitUint8(0x66);
1257 EmitUint8(0x0F);
1258 EmitUint8(0xF9);
1259 EmitXmmRegisterOperand(dst, src);
1260}
1261
1262
1263void X86Assembler::pmullw(XmmRegister dst, XmmRegister src) {
1264 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1265 EmitUint8(0x66);
1266 EmitUint8(0x0F);
1267 EmitUint8(0xD5);
1268 EmitXmmRegisterOperand(dst, src);
1269}
1270
1271
Aart Bik68555e92017-02-13 14:28:45 -08001272void X86Assembler::paddd(XmmRegister dst, XmmRegister src) {
1273 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1274 EmitUint8(0x66);
1275 EmitUint8(0x0F);
1276 EmitUint8(0xFE);
1277 EmitXmmRegisterOperand(dst, src);
1278}
1279
1280
1281void X86Assembler::psubd(XmmRegister dst, XmmRegister src) {
1282 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1283 EmitUint8(0x66);
1284 EmitUint8(0x0F);
1285 EmitUint8(0xFA);
1286 EmitXmmRegisterOperand(dst, src);
1287}
1288
1289
1290void X86Assembler::pmulld(XmmRegister dst, XmmRegister src) {
1291 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1292 EmitUint8(0x66);
1293 EmitUint8(0x0F);
1294 EmitUint8(0x38);
1295 EmitUint8(0x40);
1296 EmitXmmRegisterOperand(dst, src);
1297}
1298
1299
Aart Bike69d7a92017-02-17 11:48:23 -08001300void X86Assembler::paddq(XmmRegister dst, XmmRegister src) {
1301 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1302 EmitUint8(0x66);
1303 EmitUint8(0x0F);
1304 EmitUint8(0xD4);
1305 EmitXmmRegisterOperand(dst, src);
1306}
1307
1308
1309void X86Assembler::psubq(XmmRegister dst, XmmRegister src) {
1310 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1311 EmitUint8(0x66);
1312 EmitUint8(0x0F);
1313 EmitUint8(0xFB);
1314 EmitXmmRegisterOperand(dst, src);
1315}
1316
1317
Aart Bik4ca17352018-03-07 15:47:39 -08001318void X86Assembler::paddusb(XmmRegister dst, XmmRegister src) {
1319 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1320 EmitUint8(0x66);
1321 EmitUint8(0x0F);
1322 EmitUint8(0xDC);
1323 EmitXmmRegisterOperand(dst, src);
1324}
1325
1326
1327void X86Assembler::paddsb(XmmRegister dst, XmmRegister src) {
1328 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1329 EmitUint8(0x66);
1330 EmitUint8(0x0F);
1331 EmitUint8(0xEC);
1332 EmitXmmRegisterOperand(dst, src);
1333}
1334
1335
1336void X86Assembler::paddusw(XmmRegister dst, XmmRegister src) {
1337 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1338 EmitUint8(0x66);
1339 EmitUint8(0x0F);
1340 EmitUint8(0xDD);
1341 EmitXmmRegisterOperand(dst, src);
1342}
1343
1344
1345void X86Assembler::paddsw(XmmRegister dst, XmmRegister src) {
1346 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1347 EmitUint8(0x66);
1348 EmitUint8(0x0F);
1349 EmitUint8(0xED);
1350 EmitXmmRegisterOperand(dst, src);
1351}
1352
1353
1354void X86Assembler::psubusb(XmmRegister dst, XmmRegister src) {
1355 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1356 EmitUint8(0x66);
1357 EmitUint8(0x0F);
1358 EmitUint8(0xD8);
1359 EmitXmmRegisterOperand(dst, src);
1360}
1361
1362
1363void X86Assembler::psubsb(XmmRegister dst, XmmRegister src) {
1364 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1365 EmitUint8(0x66);
1366 EmitUint8(0x0F);
1367 EmitUint8(0xE8);
1368 EmitXmmRegisterOperand(dst, src);
1369}
1370
1371
1372void X86Assembler::psubusw(XmmRegister dst, XmmRegister src) {
1373 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1374 EmitUint8(0x66);
1375 EmitUint8(0x0F);
1376 EmitUint8(0xD9);
1377 EmitXmmRegisterOperand(dst, src);
1378}
1379
1380
1381void X86Assembler::psubsw(XmmRegister dst, XmmRegister src) {
1382 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1383 EmitUint8(0x66);
1384 EmitUint8(0x0F);
1385 EmitUint8(0xE9);
1386 EmitXmmRegisterOperand(dst, src);
1387}
1388
1389
Ian Rogers2c8f6532011-09-02 17:16:34 -07001390void X86Assembler::cvtsi2ss(XmmRegister dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001391 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1392 EmitUint8(0xF3);
1393 EmitUint8(0x0F);
1394 EmitUint8(0x2A);
1395 EmitOperand(dst, Operand(src));
1396}
1397
1398
Ian Rogers2c8f6532011-09-02 17:16:34 -07001399void X86Assembler::cvtsi2sd(XmmRegister dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001400 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1401 EmitUint8(0xF2);
1402 EmitUint8(0x0F);
1403 EmitUint8(0x2A);
1404 EmitOperand(dst, Operand(src));
1405}
1406
1407
Ian Rogers2c8f6532011-09-02 17:16:34 -07001408void X86Assembler::cvtss2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001409 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1410 EmitUint8(0xF3);
1411 EmitUint8(0x0F);
1412 EmitUint8(0x2D);
1413 EmitXmmRegisterOperand(dst, src);
1414}
1415
1416
Ian Rogers2c8f6532011-09-02 17:16:34 -07001417void X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001418 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1419 EmitUint8(0xF3);
1420 EmitUint8(0x0F);
1421 EmitUint8(0x5A);
1422 EmitXmmRegisterOperand(dst, src);
1423}
1424
1425
Ian Rogers2c8f6532011-09-02 17:16:34 -07001426void X86Assembler::cvtsd2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001427 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1428 EmitUint8(0xF2);
1429 EmitUint8(0x0F);
1430 EmitUint8(0x2D);
1431 EmitXmmRegisterOperand(dst, src);
1432}
1433
1434
Ian Rogers2c8f6532011-09-02 17:16:34 -07001435void X86Assembler::cvttss2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001436 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1437 EmitUint8(0xF3);
1438 EmitUint8(0x0F);
1439 EmitUint8(0x2C);
1440 EmitXmmRegisterOperand(dst, src);
1441}
1442
1443
Ian Rogers2c8f6532011-09-02 17:16:34 -07001444void X86Assembler::cvttsd2si(Register dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001445 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1446 EmitUint8(0xF2);
1447 EmitUint8(0x0F);
1448 EmitUint8(0x2C);
1449 EmitXmmRegisterOperand(dst, src);
1450}
1451
1452
Ian Rogers2c8f6532011-09-02 17:16:34 -07001453void X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001454 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1455 EmitUint8(0xF2);
1456 EmitUint8(0x0F);
1457 EmitUint8(0x5A);
1458 EmitXmmRegisterOperand(dst, src);
1459}
1460
1461
Aart Bik3ae3b592017-02-24 14:09:15 -08001462void X86Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) {
1463 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1464 EmitUint8(0x0F);
1465 EmitUint8(0x5B);
1466 EmitXmmRegisterOperand(dst, src);
1467}
1468
1469
Ian Rogers2c8f6532011-09-02 17:16:34 -07001470void X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001471 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1472 EmitUint8(0xF3);
1473 EmitUint8(0x0F);
1474 EmitUint8(0xE6);
1475 EmitXmmRegisterOperand(dst, src);
1476}
1477
1478
Ian Rogers2c8f6532011-09-02 17:16:34 -07001479void X86Assembler::comiss(XmmRegister a, XmmRegister b) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001480 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1481 EmitUint8(0x0F);
1482 EmitUint8(0x2F);
1483 EmitXmmRegisterOperand(a, b);
1484}
1485
1486
Aart Bik18ba1212016-08-01 14:11:20 -07001487void X86Assembler::comiss(XmmRegister a, const Address& b) {
1488 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1489 EmitUint8(0x0F);
1490 EmitUint8(0x2F);
1491 EmitOperand(a, b);
1492}
1493
1494
Ian Rogers2c8f6532011-09-02 17:16:34 -07001495void X86Assembler::comisd(XmmRegister a, XmmRegister b) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001496 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1497 EmitUint8(0x66);
1498 EmitUint8(0x0F);
1499 EmitUint8(0x2F);
1500 EmitXmmRegisterOperand(a, b);
1501}
1502
1503
Aart Bik18ba1212016-08-01 14:11:20 -07001504void X86Assembler::comisd(XmmRegister a, const Address& b) {
1505 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1506 EmitUint8(0x66);
1507 EmitUint8(0x0F);
1508 EmitUint8(0x2F);
1509 EmitOperand(a, b);
1510}
1511
1512
Calin Juravleddb7df22014-11-25 20:56:51 +00001513void X86Assembler::ucomiss(XmmRegister a, XmmRegister b) {
1514 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1515 EmitUint8(0x0F);
1516 EmitUint8(0x2E);
1517 EmitXmmRegisterOperand(a, b);
1518}
1519
1520
Mark Mendell9f51f262015-10-30 09:21:37 -04001521void X86Assembler::ucomiss(XmmRegister a, const Address& b) {
1522 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1523 EmitUint8(0x0F);
1524 EmitUint8(0x2E);
1525 EmitOperand(a, b);
1526}
1527
1528
Calin Juravleddb7df22014-11-25 20:56:51 +00001529void X86Assembler::ucomisd(XmmRegister a, XmmRegister b) {
1530 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1531 EmitUint8(0x66);
1532 EmitUint8(0x0F);
1533 EmitUint8(0x2E);
1534 EmitXmmRegisterOperand(a, b);
1535}
1536
1537
Mark Mendell9f51f262015-10-30 09:21:37 -04001538void X86Assembler::ucomisd(XmmRegister a, const Address& b) {
1539 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1540 EmitUint8(0x66);
1541 EmitUint8(0x0F);
1542 EmitUint8(0x2E);
1543 EmitOperand(a, b);
1544}
1545
1546
Mark Mendellfb8d2792015-03-31 22:16:59 -04001547void X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1548 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1549 EmitUint8(0x66);
1550 EmitUint8(0x0F);
1551 EmitUint8(0x3A);
1552 EmitUint8(0x0B);
1553 EmitXmmRegisterOperand(dst, src);
1554 EmitUint8(imm.value());
1555}
1556
1557
1558void X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1559 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1560 EmitUint8(0x66);
1561 EmitUint8(0x0F);
1562 EmitUint8(0x3A);
1563 EmitUint8(0x0A);
1564 EmitXmmRegisterOperand(dst, src);
1565 EmitUint8(imm.value());
1566}
1567
1568
Ian Rogers2c8f6532011-09-02 17:16:34 -07001569void X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001570 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1571 EmitUint8(0xF2);
1572 EmitUint8(0x0F);
1573 EmitUint8(0x51);
1574 EmitXmmRegisterOperand(dst, src);
1575}
1576
1577
Ian Rogers2c8f6532011-09-02 17:16:34 -07001578void X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001579 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1580 EmitUint8(0xF3);
1581 EmitUint8(0x0F);
1582 EmitUint8(0x51);
1583 EmitXmmRegisterOperand(dst, src);
1584}
1585
1586
Ian Rogers2c8f6532011-09-02 17:16:34 -07001587void X86Assembler::xorpd(XmmRegister dst, const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001588 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1589 EmitUint8(0x66);
1590 EmitUint8(0x0F);
1591 EmitUint8(0x57);
1592 EmitOperand(dst, src);
1593}
1594
1595
Ian Rogers2c8f6532011-09-02 17:16:34 -07001596void X86Assembler::xorpd(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001597 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1598 EmitUint8(0x66);
1599 EmitUint8(0x0F);
1600 EmitUint8(0x57);
1601 EmitXmmRegisterOperand(dst, src);
1602}
1603
1604
Aart Bik68555e92017-02-13 14:28:45 -08001605void X86Assembler::xorps(XmmRegister dst, const Address& src) {
Mark Mendell09ed1a32015-03-25 08:30:06 -04001606 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1607 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001608 EmitUint8(0x57);
1609 EmitOperand(dst, src);
1610}
1611
1612
1613void X86Assembler::xorps(XmmRegister dst, XmmRegister src) {
1614 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1615 EmitUint8(0x0F);
1616 EmitUint8(0x57);
1617 EmitXmmRegisterOperand(dst, src);
1618}
1619
1620
1621void X86Assembler::pxor(XmmRegister dst, XmmRegister src) {
1622 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1623 EmitUint8(0x66);
1624 EmitUint8(0x0F);
1625 EmitUint8(0xEF);
Mark Mendell09ed1a32015-03-25 08:30:06 -04001626 EmitXmmRegisterOperand(dst, src);
1627}
1628
1629
1630void X86Assembler::andpd(XmmRegister dst, XmmRegister src) {
1631 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1632 EmitUint8(0x66);
1633 EmitUint8(0x0F);
1634 EmitUint8(0x54);
1635 EmitXmmRegisterOperand(dst, src);
1636}
1637
1638
Aart Bik68555e92017-02-13 14:28:45 -08001639void X86Assembler::andpd(XmmRegister dst, const Address& src) {
Mark Mendell09ed1a32015-03-25 08:30:06 -04001640 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1641 EmitUint8(0x66);
1642 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001643 EmitUint8(0x54);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001644 EmitOperand(dst, src);
1645}
1646
1647
Aart Bik68555e92017-02-13 14:28:45 -08001648void X86Assembler::andps(XmmRegister dst, XmmRegister src) {
Mark Mendell09ed1a32015-03-25 08:30:06 -04001649 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1650 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001651 EmitUint8(0x54);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001652 EmitXmmRegisterOperand(dst, src);
1653}
1654
1655
Mark Mendell09ed1a32015-03-25 08:30:06 -04001656void X86Assembler::andps(XmmRegister dst, const Address& src) {
1657 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1658 EmitUint8(0x0F);
1659 EmitUint8(0x54);
1660 EmitOperand(dst, src);
1661}
1662
1663
Aart Bik68555e92017-02-13 14:28:45 -08001664void X86Assembler::pand(XmmRegister dst, XmmRegister src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001665 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1666 EmitUint8(0x66);
1667 EmitUint8(0x0F);
Aart Bik68555e92017-02-13 14:28:45 -08001668 EmitUint8(0xDB);
1669 EmitXmmRegisterOperand(dst, src);
1670}
1671
jaishank20d1c942019-03-08 15:08:17 +05301672
Shalini Salomi Bodapati8e5bc2d2018-10-24 11:50:56 +05301673
Aart Bik68555e92017-02-13 14:28:45 -08001674
Aart Bik21c580b2017-03-13 11:52:07 -07001675void X86Assembler::andnpd(XmmRegister dst, XmmRegister src) {
1676 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1677 EmitUint8(0x66);
1678 EmitUint8(0x0F);
1679 EmitUint8(0x55);
1680 EmitXmmRegisterOperand(dst, src);
1681}
1682
1683
1684void X86Assembler::andnps(XmmRegister dst, XmmRegister src) {
1685 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1686 EmitUint8(0x0F);
1687 EmitUint8(0x55);
1688 EmitXmmRegisterOperand(dst, src);
1689}
1690
1691
1692void X86Assembler::pandn(XmmRegister dst, XmmRegister src) {
1693 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1694 EmitUint8(0x66);
1695 EmitUint8(0x0F);
1696 EmitUint8(0xDF);
1697 EmitXmmRegisterOperand(dst, src);
1698}
1699
1700
Aart Bik68555e92017-02-13 14:28:45 -08001701void X86Assembler::orpd(XmmRegister dst, XmmRegister src) {
1702 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1703 EmitUint8(0x66);
1704 EmitUint8(0x0F);
1705 EmitUint8(0x56);
1706 EmitXmmRegisterOperand(dst, src);
1707}
1708
1709
1710void X86Assembler::orps(XmmRegister dst, XmmRegister src) {
1711 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1712 EmitUint8(0x0F);
1713 EmitUint8(0x56);
1714 EmitXmmRegisterOperand(dst, src);
1715}
1716
jaishank20d1c942019-03-08 15:08:17 +05301717void X86Assembler::andn(Register dst, Register src1, Register src2) {
1718 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1719 uint8_t byte_zero = EmitVexPrefixByteZero(/**is_twobyte_form= */false);
1720 uint8_t byte_one = EmitVexPrefixByteOne(/**R = */false,
1721 /**X = */false,
1722 /**B = */false,
1723 SET_VEX_M_0F_38);
1724 uint8_t byte_two = EmitVexPrefixByteTwo(/**W= */false,
1725 X86ManagedRegister::FromCpuRegister(src1),
1726 SET_VEX_L_128,
1727 SET_VEX_PP_NONE);
1728 EmitUint8(byte_zero);
1729 EmitUint8(byte_one);
1730 EmitUint8(byte_two);
1731 // Opcode field
1732 EmitUint8(0xF2);
1733 EmitRegisterOperand(dst, src2);
1734}
Aart Bik68555e92017-02-13 14:28:45 -08001735
1736void X86Assembler::por(XmmRegister dst, XmmRegister src) {
1737 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1738 EmitUint8(0x66);
1739 EmitUint8(0x0F);
1740 EmitUint8(0xEB);
1741 EmitXmmRegisterOperand(dst, src);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001742}
1743
1744
Aart Bik67d3fd72017-03-31 15:11:53 -07001745void X86Assembler::pavgb(XmmRegister dst, XmmRegister src) {
1746 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1747 EmitUint8(0x66);
1748 EmitUint8(0x0F);
1749 EmitUint8(0xE0);
1750 EmitXmmRegisterOperand(dst, src);
1751}
1752
1753
1754void X86Assembler::pavgw(XmmRegister dst, XmmRegister src) {
1755 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1756 EmitUint8(0x66);
1757 EmitUint8(0x0F);
1758 EmitUint8(0xE3);
1759 EmitXmmRegisterOperand(dst, src);
1760}
1761
Aart Bik6005a872017-07-24 13:33:39 -07001762
1763void X86Assembler::psadbw(XmmRegister dst, XmmRegister src) {
1764 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1765 EmitUint8(0x66);
1766 EmitUint8(0x0F);
1767 EmitUint8(0xF6);
1768 EmitXmmRegisterOperand(dst, src);
1769}
1770
1771
1772void X86Assembler::pmaddwd(XmmRegister dst, XmmRegister src) {
1773 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1774 EmitUint8(0x66);
1775 EmitUint8(0x0F);
1776 EmitUint8(0xF5);
1777 EmitXmmRegisterOperand(dst, src);
1778}
1779
1780
1781void X86Assembler::phaddw(XmmRegister dst, XmmRegister src) {
1782 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1783 EmitUint8(0x66);
1784 EmitUint8(0x0F);
1785 EmitUint8(0x38);
1786 EmitUint8(0x01);
1787 EmitXmmRegisterOperand(dst, src);
1788}
1789
1790
1791void X86Assembler::phaddd(XmmRegister dst, XmmRegister src) {
1792 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1793 EmitUint8(0x66);
1794 EmitUint8(0x0F);
1795 EmitUint8(0x38);
1796 EmitUint8(0x02);
1797 EmitXmmRegisterOperand(dst, src);
1798}
1799
1800
1801void X86Assembler::haddps(XmmRegister dst, XmmRegister src) {
1802 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1803 EmitUint8(0xF2);
1804 EmitUint8(0x0F);
1805 EmitUint8(0x7C);
1806 EmitXmmRegisterOperand(dst, src);
1807}
1808
1809
1810void X86Assembler::haddpd(XmmRegister dst, XmmRegister src) {
1811 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1812 EmitUint8(0x66);
1813 EmitUint8(0x0F);
1814 EmitUint8(0x7C);
1815 EmitXmmRegisterOperand(dst, src);
1816}
1817
1818
1819void X86Assembler::phsubw(XmmRegister dst, XmmRegister src) {
1820 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1821 EmitUint8(0x66);
1822 EmitUint8(0x0F);
1823 EmitUint8(0x38);
1824 EmitUint8(0x05);
1825 EmitXmmRegisterOperand(dst, src);
1826}
1827
1828
1829void X86Assembler::phsubd(XmmRegister dst, XmmRegister src) {
1830 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1831 EmitUint8(0x66);
1832 EmitUint8(0x0F);
1833 EmitUint8(0x38);
1834 EmitUint8(0x06);
1835 EmitXmmRegisterOperand(dst, src);
1836}
1837
1838
1839void X86Assembler::hsubps(XmmRegister dst, XmmRegister src) {
1840 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1841 EmitUint8(0xF2);
1842 EmitUint8(0x0F);
1843 EmitUint8(0x7D);
1844 EmitXmmRegisterOperand(dst, src);
1845}
1846
1847
1848void X86Assembler::hsubpd(XmmRegister dst, XmmRegister src) {
1849 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1850 EmitUint8(0x66);
1851 EmitUint8(0x0F);
1852 EmitUint8(0x7D);
1853 EmitXmmRegisterOperand(dst, src);
1854}
1855
1856
Aart Bikc8e93c72017-05-10 10:49:22 -07001857void X86Assembler::pminsb(XmmRegister dst, XmmRegister src) {
1858 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1859 EmitUint8(0x66);
1860 EmitUint8(0x0F);
1861 EmitUint8(0x38);
1862 EmitUint8(0x38);
1863 EmitXmmRegisterOperand(dst, src);
1864}
1865
1866void X86Assembler::pmaxsb(XmmRegister dst, XmmRegister src) {
1867 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1868 EmitUint8(0x66);
1869 EmitUint8(0x0F);
1870 EmitUint8(0x38);
1871 EmitUint8(0x3C);
1872 EmitXmmRegisterOperand(dst, src);
1873}
1874
1875void X86Assembler::pminsw(XmmRegister dst, XmmRegister src) {
1876 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1877 EmitUint8(0x66);
1878 EmitUint8(0x0F);
1879 EmitUint8(0xEA);
1880 EmitXmmRegisterOperand(dst, src);
1881}
1882
1883void X86Assembler::pmaxsw(XmmRegister dst, XmmRegister src) {
1884 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1885 EmitUint8(0x66);
1886 EmitUint8(0x0F);
1887 EmitUint8(0xEE);
1888 EmitXmmRegisterOperand(dst, src);
1889}
1890
1891void X86Assembler::pminsd(XmmRegister dst, XmmRegister src) {
1892 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1893 EmitUint8(0x66);
1894 EmitUint8(0x0F);
1895 EmitUint8(0x38);
1896 EmitUint8(0x39);
1897 EmitXmmRegisterOperand(dst, src);
1898}
1899
1900void X86Assembler::pmaxsd(XmmRegister dst, XmmRegister src) {
1901 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1902 EmitUint8(0x66);
1903 EmitUint8(0x0F);
1904 EmitUint8(0x38);
1905 EmitUint8(0x3D);
1906 EmitXmmRegisterOperand(dst, src);
1907}
1908
1909void X86Assembler::pminub(XmmRegister dst, XmmRegister src) {
1910 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1911 EmitUint8(0x66);
1912 EmitUint8(0x0F);
1913 EmitUint8(0xDA);
1914 EmitXmmRegisterOperand(dst, src);
1915}
1916
1917void X86Assembler::pmaxub(XmmRegister dst, XmmRegister src) {
1918 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1919 EmitUint8(0x66);
1920 EmitUint8(0x0F);
1921 EmitUint8(0xDE);
1922 EmitXmmRegisterOperand(dst, src);
1923}
1924
1925void X86Assembler::pminuw(XmmRegister dst, XmmRegister src) {
1926 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1927 EmitUint8(0x66);
1928 EmitUint8(0x0F);
1929 EmitUint8(0x38);
1930 EmitUint8(0x3A);
1931 EmitXmmRegisterOperand(dst, src);
1932}
1933
1934void X86Assembler::pmaxuw(XmmRegister dst, XmmRegister src) {
1935 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1936 EmitUint8(0x66);
1937 EmitUint8(0x0F);
1938 EmitUint8(0x38);
1939 EmitUint8(0x3E);
1940 EmitXmmRegisterOperand(dst, src);
1941}
1942
1943void X86Assembler::pminud(XmmRegister dst, XmmRegister src) {
1944 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1945 EmitUint8(0x66);
1946 EmitUint8(0x0F);
1947 EmitUint8(0x38);
1948 EmitUint8(0x3B);
1949 EmitXmmRegisterOperand(dst, src);
1950}
1951
1952void X86Assembler::pmaxud(XmmRegister dst, XmmRegister src) {
1953 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1954 EmitUint8(0x66);
1955 EmitUint8(0x0F);
1956 EmitUint8(0x38);
1957 EmitUint8(0x3F);
1958 EmitXmmRegisterOperand(dst, src);
1959}
1960
1961void X86Assembler::minps(XmmRegister dst, XmmRegister src) {
1962 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1963 EmitUint8(0x0F);
1964 EmitUint8(0x5D);
1965 EmitXmmRegisterOperand(dst, src);
1966}
1967
1968void X86Assembler::maxps(XmmRegister dst, XmmRegister src) {
1969 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1970 EmitUint8(0x0F);
1971 EmitUint8(0x5F);
1972 EmitXmmRegisterOperand(dst, src);
1973}
1974
1975void X86Assembler::minpd(XmmRegister dst, XmmRegister src) {
1976 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1977 EmitUint8(0x66);
1978 EmitUint8(0x0F);
1979 EmitUint8(0x5D);
1980 EmitXmmRegisterOperand(dst, src);
1981}
1982
1983void X86Assembler::maxpd(XmmRegister dst, XmmRegister src) {
1984 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1985 EmitUint8(0x66);
1986 EmitUint8(0x0F);
1987 EmitUint8(0x5F);
1988 EmitXmmRegisterOperand(dst, src);
1989}
Aart Bik67d3fd72017-03-31 15:11:53 -07001990
Aart Bik4b455332017-03-15 11:19:35 -07001991void X86Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) {
1992 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1993 EmitUint8(0x66);
1994 EmitUint8(0x0F);
1995 EmitUint8(0x74);
1996 EmitXmmRegisterOperand(dst, src);
1997}
1998
1999
2000void X86Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) {
2001 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2002 EmitUint8(0x66);
2003 EmitUint8(0x0F);
2004 EmitUint8(0x75);
2005 EmitXmmRegisterOperand(dst, src);
2006}
2007
2008
2009void X86Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) {
2010 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2011 EmitUint8(0x66);
2012 EmitUint8(0x0F);
2013 EmitUint8(0x76);
2014 EmitXmmRegisterOperand(dst, src);
2015}
2016
2017
2018void X86Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) {
2019 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2020 EmitUint8(0x66);
2021 EmitUint8(0x0F);
2022 EmitUint8(0x38);
2023 EmitUint8(0x29);
2024 EmitXmmRegisterOperand(dst, src);
2025}
2026
2027
Aart Bik8939c642017-04-03 14:09:01 -07002028void X86Assembler::pcmpgtb(XmmRegister dst, XmmRegister src) {
2029 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2030 EmitUint8(0x66);
2031 EmitUint8(0x0F);
2032 EmitUint8(0x64);
2033 EmitXmmRegisterOperand(dst, src);
2034}
2035
2036
2037void X86Assembler::pcmpgtw(XmmRegister dst, XmmRegister src) {
2038 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2039 EmitUint8(0x66);
2040 EmitUint8(0x0F);
2041 EmitUint8(0x65);
2042 EmitXmmRegisterOperand(dst, src);
2043}
2044
2045
2046void X86Assembler::pcmpgtd(XmmRegister dst, XmmRegister src) {
2047 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2048 EmitUint8(0x66);
2049 EmitUint8(0x0F);
2050 EmitUint8(0x66);
2051 EmitXmmRegisterOperand(dst, src);
2052}
2053
2054
2055void X86Assembler::pcmpgtq(XmmRegister dst, XmmRegister src) {
2056 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2057 EmitUint8(0x66);
2058 EmitUint8(0x0F);
2059 EmitUint8(0x38);
2060 EmitUint8(0x37);
2061 EmitXmmRegisterOperand(dst, src);
2062}
2063
2064
Aart Bik12e06ed2017-01-31 16:11:24 -08002065void X86Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2066 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2067 EmitUint8(0x66);
2068 EmitUint8(0x0F);
2069 EmitUint8(0xC6);
2070 EmitXmmRegisterOperand(dst, src);
2071 EmitUint8(imm.value());
2072}
2073
2074
2075void X86Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2076 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2077 EmitUint8(0x0F);
2078 EmitUint8(0xC6);
2079 EmitXmmRegisterOperand(dst, src);
2080 EmitUint8(imm.value());
2081}
2082
2083
Aart Bik68555e92017-02-13 14:28:45 -08002084void X86Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
2085 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2086 EmitUint8(0x66);
2087 EmitUint8(0x0F);
2088 EmitUint8(0x70);
2089 EmitXmmRegisterOperand(dst, src);
2090 EmitUint8(imm.value());
2091}
2092
2093
Aart Bike69d7a92017-02-17 11:48:23 -08002094void X86Assembler::punpcklbw(XmmRegister dst, XmmRegister src) {
2095 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2096 EmitUint8(0x66);
2097 EmitUint8(0x0F);
2098 EmitUint8(0x60);
2099 EmitXmmRegisterOperand(dst, src);
2100}
2101
2102
2103void X86Assembler::punpcklwd(XmmRegister dst, XmmRegister src) {
2104 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2105 EmitUint8(0x66);
2106 EmitUint8(0x0F);
2107 EmitUint8(0x61);
2108 EmitXmmRegisterOperand(dst, src);
2109}
2110
2111
2112void X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) {
2113 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2114 EmitUint8(0x66);
2115 EmitUint8(0x0F);
2116 EmitUint8(0x62);
2117 EmitXmmRegisterOperand(dst, src);
2118}
2119
2120
2121void X86Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) {
2122 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2123 EmitUint8(0x66);
2124 EmitUint8(0x0F);
2125 EmitUint8(0x6C);
2126 EmitXmmRegisterOperand(dst, src);
2127}
2128
2129
Aart Bik3332db82017-08-11 15:10:30 -07002130void X86Assembler::punpckhbw(XmmRegister dst, XmmRegister src) {
2131 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2132 EmitUint8(0x66);
2133 EmitUint8(0x0F);
2134 EmitUint8(0x68);
2135 EmitXmmRegisterOperand(dst, src);
2136}
2137
2138
2139void X86Assembler::punpckhwd(XmmRegister dst, XmmRegister src) {
2140 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2141 EmitUint8(0x66);
2142 EmitUint8(0x0F);
2143 EmitUint8(0x69);
2144 EmitXmmRegisterOperand(dst, src);
2145}
2146
2147
2148void X86Assembler::punpckhdq(XmmRegister dst, XmmRegister src) {
2149 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2150 EmitUint8(0x66);
2151 EmitUint8(0x0F);
2152 EmitUint8(0x6A);
2153 EmitXmmRegisterOperand(dst, src);
2154}
2155
2156
2157void X86Assembler::punpckhqdq(XmmRegister dst, XmmRegister src) {
2158 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2159 EmitUint8(0x66);
2160 EmitUint8(0x0F);
2161 EmitUint8(0x6D);
2162 EmitXmmRegisterOperand(dst, src);
2163}
2164
2165
Aart Bike69d7a92017-02-17 11:48:23 -08002166void X86Assembler::psllw(XmmRegister reg, const Immediate& shift_count) {
2167 DCHECK(shift_count.is_uint8());
2168 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2169 EmitUint8(0x66);
2170 EmitUint8(0x0F);
2171 EmitUint8(0x71);
2172 EmitXmmRegisterOperand(6, reg);
2173 EmitUint8(shift_count.value());
2174}
2175
2176
2177void X86Assembler::pslld(XmmRegister reg, const Immediate& shift_count) {
2178 DCHECK(shift_count.is_uint8());
2179 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2180 EmitUint8(0x66);
2181 EmitUint8(0x0F);
2182 EmitUint8(0x72);
2183 EmitXmmRegisterOperand(6, reg);
2184 EmitUint8(shift_count.value());
2185}
2186
2187
2188void X86Assembler::psllq(XmmRegister reg, const Immediate& shift_count) {
2189 DCHECK(shift_count.is_uint8());
2190 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2191 EmitUint8(0x66);
2192 EmitUint8(0x0F);
2193 EmitUint8(0x73);
2194 EmitXmmRegisterOperand(6, reg);
2195 EmitUint8(shift_count.value());
2196}
2197
2198
2199void X86Assembler::psraw(XmmRegister reg, const Immediate& shift_count) {
2200 DCHECK(shift_count.is_uint8());
2201 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2202 EmitUint8(0x66);
2203 EmitUint8(0x0F);
2204 EmitUint8(0x71);
2205 EmitXmmRegisterOperand(4, reg);
2206 EmitUint8(shift_count.value());
2207}
2208
2209
2210void X86Assembler::psrad(XmmRegister reg, const Immediate& shift_count) {
2211 DCHECK(shift_count.is_uint8());
2212 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2213 EmitUint8(0x66);
2214 EmitUint8(0x0F);
2215 EmitUint8(0x72);
2216 EmitXmmRegisterOperand(4, reg);
2217 EmitUint8(shift_count.value());
2218}
2219
2220
2221void X86Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) {
2222 DCHECK(shift_count.is_uint8());
2223 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2224 EmitUint8(0x66);
2225 EmitUint8(0x0F);
2226 EmitUint8(0x71);
2227 EmitXmmRegisterOperand(2, reg);
2228 EmitUint8(shift_count.value());
2229}
2230
2231
2232void X86Assembler::psrld(XmmRegister reg, const Immediate& shift_count) {
2233 DCHECK(shift_count.is_uint8());
2234 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2235 EmitUint8(0x66);
2236 EmitUint8(0x0F);
2237 EmitUint8(0x72);
2238 EmitXmmRegisterOperand(2, reg);
2239 EmitUint8(shift_count.value());
2240}
2241
2242
2243void X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) {
2244 DCHECK(shift_count.is_uint8());
2245 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2246 EmitUint8(0x66);
2247 EmitUint8(0x0F);
2248 EmitUint8(0x73);
2249 EmitXmmRegisterOperand(2, reg);
2250 EmitUint8(shift_count.value());
2251}
2252
2253
2254void X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) {
2255 DCHECK(shift_count.is_uint8());
2256 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2257 EmitUint8(0x66);
2258 EmitUint8(0x0F);
2259 EmitUint8(0x73);
2260 EmitXmmRegisterOperand(3, reg);
2261 EmitUint8(shift_count.value());
2262}
2263
2264
Ian Rogers2c8f6532011-09-02 17:16:34 -07002265void X86Assembler::fldl(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002266 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2267 EmitUint8(0xDD);
2268 EmitOperand(0, src);
2269}
2270
2271
Mark Mendell24f2dfa2015-01-14 19:51:45 -05002272void X86Assembler::fstl(const Address& dst) {
2273 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2274 EmitUint8(0xDD);
2275 EmitOperand(2, dst);
2276}
2277
2278
Ian Rogers2c8f6532011-09-02 17:16:34 -07002279void X86Assembler::fstpl(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002280 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2281 EmitUint8(0xDD);
2282 EmitOperand(3, dst);
2283}
2284
2285
Mark Mendell24f2dfa2015-01-14 19:51:45 -05002286void X86Assembler::fstsw() {
2287 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2288 EmitUint8(0x9B);
2289 EmitUint8(0xDF);
2290 EmitUint8(0xE0);
2291}
2292
2293
Ian Rogers2c8f6532011-09-02 17:16:34 -07002294void X86Assembler::fnstcw(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002295 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2296 EmitUint8(0xD9);
2297 EmitOperand(7, dst);
2298}
2299
2300
Ian Rogers2c8f6532011-09-02 17:16:34 -07002301void X86Assembler::fldcw(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002302 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2303 EmitUint8(0xD9);
2304 EmitOperand(5, src);
2305}
2306
2307
Ian Rogers2c8f6532011-09-02 17:16:34 -07002308void X86Assembler::fistpl(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002309 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2310 EmitUint8(0xDF);
2311 EmitOperand(7, dst);
2312}
2313
2314
Ian Rogers2c8f6532011-09-02 17:16:34 -07002315void X86Assembler::fistps(const Address& dst) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002316 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2317 EmitUint8(0xDB);
2318 EmitOperand(3, dst);
2319}
2320
2321
Ian Rogers2c8f6532011-09-02 17:16:34 -07002322void X86Assembler::fildl(const Address& src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002323 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2324 EmitUint8(0xDF);
2325 EmitOperand(5, src);
2326}
2327
2328
Roland Levillain0a186012015-04-13 17:00:20 +01002329void X86Assembler::filds(const Address& src) {
2330 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2331 EmitUint8(0xDB);
2332 EmitOperand(0, src);
2333}
2334
2335
Ian Rogers2c8f6532011-09-02 17:16:34 -07002336void X86Assembler::fincstp() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002337 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2338 EmitUint8(0xD9);
2339 EmitUint8(0xF7);
2340}
2341
2342
Ian Rogers2c8f6532011-09-02 17:16:34 -07002343void X86Assembler::ffree(const Immediate& index) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002344 CHECK_LT(index.value(), 7);
2345 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2346 EmitUint8(0xDD);
2347 EmitUint8(0xC0 + index.value());
2348}
2349
2350
Ian Rogers2c8f6532011-09-02 17:16:34 -07002351void X86Assembler::fsin() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002352 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2353 EmitUint8(0xD9);
2354 EmitUint8(0xFE);
2355}
2356
2357
Ian Rogers2c8f6532011-09-02 17:16:34 -07002358void X86Assembler::fcos() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002359 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2360 EmitUint8(0xD9);
2361 EmitUint8(0xFF);
2362}
2363
2364
Ian Rogers2c8f6532011-09-02 17:16:34 -07002365void X86Assembler::fptan() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002366 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2367 EmitUint8(0xD9);
2368 EmitUint8(0xF2);
2369}
2370
2371
Mark Mendell24f2dfa2015-01-14 19:51:45 -05002372void X86Assembler::fucompp() {
2373 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2374 EmitUint8(0xDA);
2375 EmitUint8(0xE9);
2376}
2377
2378
2379void X86Assembler::fprem() {
2380 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2381 EmitUint8(0xD9);
2382 EmitUint8(0xF8);
2383}
2384
2385
Ian Rogers2c8f6532011-09-02 17:16:34 -07002386void X86Assembler::xchgl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002387 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2388 EmitUint8(0x87);
2389 EmitRegisterOperand(dst, src);
2390}
2391
Nicolas Geoffray3c049742014-09-24 18:10:46 +01002392
Ian Rogers7caad772012-03-30 01:07:54 -07002393void X86Assembler::xchgl(Register reg, const Address& address) {
2394 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2395 EmitUint8(0x87);
2396 EmitOperand(reg, address);
2397}
2398
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002399
Serguei Katkov3b625932016-05-06 10:24:17 +06002400void X86Assembler::cmpb(const Address& address, const Immediate& imm) {
2401 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2402 EmitUint8(0x80);
2403 EmitOperand(7, address);
2404 EmitUint8(imm.value() & 0xFF);
2405}
2406
2407
Nicolas Geoffray3c049742014-09-24 18:10:46 +01002408void X86Assembler::cmpw(const Address& address, const Immediate& imm) {
2409 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2410 EmitUint8(0x66);
Andreas Gampe3db70682018-12-26 15:12:03 -08002411 EmitComplex(7, address, imm, /* is_16_op= */ true);
Nicolas Geoffray3c049742014-09-24 18:10:46 +01002412}
2413
2414
Ian Rogers2c8f6532011-09-02 17:16:34 -07002415void X86Assembler::cmpl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002416 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2417 EmitComplex(7, Operand(reg), imm);
2418}
2419
2420
Ian Rogers2c8f6532011-09-02 17:16:34 -07002421void X86Assembler::cmpl(Register reg0, Register reg1) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002422 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2423 EmitUint8(0x3B);
2424 EmitOperand(reg0, Operand(reg1));
2425}
2426
2427
Ian Rogers2c8f6532011-09-02 17:16:34 -07002428void X86Assembler::cmpl(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002429 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2430 EmitUint8(0x3B);
2431 EmitOperand(reg, address);
2432}
2433
2434
Ian Rogers2c8f6532011-09-02 17:16:34 -07002435void X86Assembler::addl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002436 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2437 EmitUint8(0x03);
2438 EmitRegisterOperand(dst, src);
2439}
2440
2441
Ian Rogers2c8f6532011-09-02 17:16:34 -07002442void X86Assembler::addl(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002443 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2444 EmitUint8(0x03);
2445 EmitOperand(reg, address);
2446}
2447
2448
Ian Rogers2c8f6532011-09-02 17:16:34 -07002449void X86Assembler::cmpl(const Address& address, Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002450 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2451 EmitUint8(0x39);
2452 EmitOperand(reg, address);
2453}
2454
2455
Ian Rogers2c8f6532011-09-02 17:16:34 -07002456void X86Assembler::cmpl(const Address& address, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002457 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2458 EmitComplex(7, address, imm);
2459}
2460
2461
Ian Rogers2c8f6532011-09-02 17:16:34 -07002462void X86Assembler::testl(Register reg1, Register reg2) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002463 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2464 EmitUint8(0x85);
2465 EmitRegisterOperand(reg1, reg2);
2466}
2467
2468
Nicolas Geoffrayf12feb82014-07-17 18:32:41 +01002469void X86Assembler::testl(Register reg, const Address& address) {
2470 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2471 EmitUint8(0x85);
2472 EmitOperand(reg, address);
2473}
2474
2475
Ian Rogers2c8f6532011-09-02 17:16:34 -07002476void X86Assembler::testl(Register reg, const Immediate& immediate) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002477 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2478 // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
2479 // we only test the byte register to keep the encoding short.
2480 if (immediate.is_uint8() && reg < 4) {
2481 // Use zero-extended 8-bit immediate.
2482 if (reg == EAX) {
2483 EmitUint8(0xA8);
2484 } else {
2485 EmitUint8(0xF6);
2486 EmitUint8(0xC0 + reg);
2487 }
2488 EmitUint8(immediate.value() & 0xFF);
2489 } else if (reg == EAX) {
2490 // Use short form if the destination is EAX.
2491 EmitUint8(0xA9);
2492 EmitImmediate(immediate);
2493 } else {
2494 EmitUint8(0xF7);
2495 EmitOperand(0, Operand(reg));
2496 EmitImmediate(immediate);
2497 }
2498}
2499
2500
Vladimir Marko953437b2016-08-24 08:30:46 +00002501void X86Assembler::testb(const Address& dst, const Immediate& imm) {
2502 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2503 EmitUint8(0xF6);
2504 EmitOperand(EAX, dst);
2505 CHECK(imm.is_int8());
2506 EmitUint8(imm.value() & 0xFF);
2507}
2508
2509
2510void X86Assembler::testl(const Address& dst, const Immediate& imm) {
2511 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2512 EmitUint8(0xF7);
2513 EmitOperand(0, dst);
2514 EmitImmediate(imm);
2515}
2516
2517
Ian Rogers2c8f6532011-09-02 17:16:34 -07002518void X86Assembler::andl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002519 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2520 EmitUint8(0x23);
2521 EmitOperand(dst, Operand(src));
2522}
2523
2524
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00002525void X86Assembler::andl(Register reg, const Address& address) {
2526 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2527 EmitUint8(0x23);
2528 EmitOperand(reg, address);
2529}
2530
2531
Ian Rogers2c8f6532011-09-02 17:16:34 -07002532void X86Assembler::andl(Register dst, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002533 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2534 EmitComplex(4, Operand(dst), imm);
2535}
2536
2537
Ian Rogers2c8f6532011-09-02 17:16:34 -07002538void X86Assembler::orl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002539 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2540 EmitUint8(0x0B);
2541 EmitOperand(dst, Operand(src));
2542}
2543
2544
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00002545void X86Assembler::orl(Register reg, const Address& address) {
2546 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2547 EmitUint8(0x0B);
2548 EmitOperand(reg, address);
2549}
2550
2551
Ian Rogers2c8f6532011-09-02 17:16:34 -07002552void X86Assembler::orl(Register dst, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002553 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2554 EmitComplex(1, Operand(dst), imm);
2555}
2556
2557
Ian Rogers2c8f6532011-09-02 17:16:34 -07002558void X86Assembler::xorl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002559 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2560 EmitUint8(0x33);
2561 EmitOperand(dst, Operand(src));
2562}
2563
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00002564
2565void X86Assembler::xorl(Register reg, const Address& address) {
2566 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2567 EmitUint8(0x33);
2568 EmitOperand(reg, address);
2569}
2570
2571
Nicolas Geoffrayb55f8352014-04-07 15:26:35 +01002572void X86Assembler::xorl(Register dst, const Immediate& imm) {
2573 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2574 EmitComplex(6, Operand(dst), imm);
2575}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002576
Nicolas Geoffray9574c4b2014-11-12 13:19:37 +00002577
Ian Rogers2c8f6532011-09-02 17:16:34 -07002578void X86Assembler::addl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002579 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2580 EmitComplex(0, Operand(reg), imm);
2581}
2582
2583
Ian Rogers2c8f6532011-09-02 17:16:34 -07002584void X86Assembler::addl(const Address& address, Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002585 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2586 EmitUint8(0x01);
2587 EmitOperand(reg, address);
2588}
2589
2590
Ian Rogers2c8f6532011-09-02 17:16:34 -07002591void X86Assembler::addl(const Address& address, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002592 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2593 EmitComplex(0, address, imm);
2594}
2595
2596
Nicolas Geoffrayded55942018-01-26 16:33:41 +00002597void X86Assembler::addw(const Address& address, const Immediate& imm) {
2598 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2599 CHECK(imm.is_uint16() || imm.is_int16()) << imm.value();
2600 EmitUint8(0x66);
Andreas Gampe3db70682018-12-26 15:12:03 -08002601 EmitComplex(0, address, imm, /* is_16_op= */ true);
Nicolas Geoffrayded55942018-01-26 16:33:41 +00002602}
2603
2604
Ian Rogers2c8f6532011-09-02 17:16:34 -07002605void X86Assembler::adcl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002606 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2607 EmitComplex(2, Operand(reg), imm);
2608}
2609
2610
Ian Rogers2c8f6532011-09-02 17:16:34 -07002611void X86Assembler::adcl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002612 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2613 EmitUint8(0x13);
2614 EmitOperand(dst, Operand(src));
2615}
2616
2617
Ian Rogers2c8f6532011-09-02 17:16:34 -07002618void X86Assembler::adcl(Register dst, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002619 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2620 EmitUint8(0x13);
2621 EmitOperand(dst, address);
2622}
2623
2624
Ian Rogers2c8f6532011-09-02 17:16:34 -07002625void X86Assembler::subl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002626 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2627 EmitUint8(0x2B);
2628 EmitOperand(dst, Operand(src));
2629}
2630
2631
Ian Rogers2c8f6532011-09-02 17:16:34 -07002632void X86Assembler::subl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002633 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2634 EmitComplex(5, Operand(reg), imm);
2635}
2636
2637
Ian Rogers2c8f6532011-09-02 17:16:34 -07002638void X86Assembler::subl(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002639 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2640 EmitUint8(0x2B);
2641 EmitOperand(reg, address);
2642}
2643
2644
Mark Mendell09ed1a32015-03-25 08:30:06 -04002645void X86Assembler::subl(const Address& address, Register reg) {
2646 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2647 EmitUint8(0x29);
2648 EmitOperand(reg, address);
2649}
2650
2651
Ian Rogers2c8f6532011-09-02 17:16:34 -07002652void X86Assembler::cdq() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002653 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2654 EmitUint8(0x99);
2655}
2656
2657
Ian Rogers2c8f6532011-09-02 17:16:34 -07002658void X86Assembler::idivl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002659 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2660 EmitUint8(0xF7);
2661 EmitUint8(0xF8 | reg);
2662}
2663
2664
Ian Rogers2c8f6532011-09-02 17:16:34 -07002665void X86Assembler::imull(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002666 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2667 EmitUint8(0x0F);
2668 EmitUint8(0xAF);
2669 EmitOperand(dst, Operand(src));
2670}
2671
2672
Mark Mendell4a2aa4a2015-07-27 16:13:10 -04002673void X86Assembler::imull(Register dst, Register src, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002674 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
Mark Mendell4a2aa4a2015-07-27 16:13:10 -04002675 // See whether imm can be represented as a sign-extended 8bit value.
2676 int32_t v32 = static_cast<int32_t>(imm.value());
2677 if (IsInt<8>(v32)) {
2678 // Sign-extension works.
2679 EmitUint8(0x6B);
2680 EmitOperand(dst, Operand(src));
2681 EmitUint8(static_cast<uint8_t>(v32 & 0xFF));
2682 } else {
2683 // Not representable, use full immediate.
2684 EmitUint8(0x69);
2685 EmitOperand(dst, Operand(src));
2686 EmitImmediate(imm);
2687 }
2688}
2689
2690
2691void X86Assembler::imull(Register reg, const Immediate& imm) {
2692 imull(reg, reg, imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002693}
2694
2695
Ian Rogers2c8f6532011-09-02 17:16:34 -07002696void X86Assembler::imull(Register reg, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002697 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2698 EmitUint8(0x0F);
2699 EmitUint8(0xAF);
2700 EmitOperand(reg, address);
2701}
2702
2703
Ian Rogers2c8f6532011-09-02 17:16:34 -07002704void X86Assembler::imull(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002705 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2706 EmitUint8(0xF7);
2707 EmitOperand(5, Operand(reg));
2708}
2709
2710
Ian Rogers2c8f6532011-09-02 17:16:34 -07002711void X86Assembler::imull(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002712 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2713 EmitUint8(0xF7);
2714 EmitOperand(5, address);
2715}
2716
2717
Ian Rogers2c8f6532011-09-02 17:16:34 -07002718void X86Assembler::mull(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002719 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2720 EmitUint8(0xF7);
2721 EmitOperand(4, Operand(reg));
2722}
2723
2724
Ian Rogers2c8f6532011-09-02 17:16:34 -07002725void X86Assembler::mull(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002726 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2727 EmitUint8(0xF7);
2728 EmitOperand(4, address);
2729}
2730
2731
Ian Rogers2c8f6532011-09-02 17:16:34 -07002732void X86Assembler::sbbl(Register dst, Register src) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002733 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2734 EmitUint8(0x1B);
2735 EmitOperand(dst, Operand(src));
2736}
2737
2738
Ian Rogers2c8f6532011-09-02 17:16:34 -07002739void X86Assembler::sbbl(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002740 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2741 EmitComplex(3, Operand(reg), imm);
2742}
2743
2744
Ian Rogers2c8f6532011-09-02 17:16:34 -07002745void X86Assembler::sbbl(Register dst, const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002746 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2747 EmitUint8(0x1B);
2748 EmitOperand(dst, address);
2749}
2750
2751
Mark Mendell09ed1a32015-03-25 08:30:06 -04002752void X86Assembler::sbbl(const Address& address, Register src) {
2753 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2754 EmitUint8(0x19);
2755 EmitOperand(src, address);
2756}
2757
2758
Ian Rogers2c8f6532011-09-02 17:16:34 -07002759void X86Assembler::incl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002760 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2761 EmitUint8(0x40 + reg);
2762}
2763
2764
Ian Rogers2c8f6532011-09-02 17:16:34 -07002765void X86Assembler::incl(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002766 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2767 EmitUint8(0xFF);
2768 EmitOperand(0, address);
2769}
2770
2771
Ian Rogers2c8f6532011-09-02 17:16:34 -07002772void X86Assembler::decl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002773 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2774 EmitUint8(0x48 + reg);
2775}
2776
2777
Ian Rogers2c8f6532011-09-02 17:16:34 -07002778void X86Assembler::decl(const Address& address) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002779 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2780 EmitUint8(0xFF);
2781 EmitOperand(1, address);
2782}
2783
2784
Ian Rogers2c8f6532011-09-02 17:16:34 -07002785void X86Assembler::shll(Register reg, const Immediate& imm) {
Mark P Mendell73945692015-04-29 14:56:17 +00002786 EmitGenericShift(4, Operand(reg), imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002787}
2788
2789
Ian Rogers2c8f6532011-09-02 17:16:34 -07002790void X86Assembler::shll(Register operand, Register shifter) {
Mark P Mendell73945692015-04-29 14:56:17 +00002791 EmitGenericShift(4, Operand(operand), shifter);
2792}
2793
2794
2795void X86Assembler::shll(const Address& address, const Immediate& imm) {
2796 EmitGenericShift(4, address, imm);
2797}
2798
2799
2800void X86Assembler::shll(const Address& address, Register shifter) {
2801 EmitGenericShift(4, address, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002802}
2803
2804
Ian Rogers2c8f6532011-09-02 17:16:34 -07002805void X86Assembler::shrl(Register reg, const Immediate& imm) {
Mark P Mendell73945692015-04-29 14:56:17 +00002806 EmitGenericShift(5, Operand(reg), imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002807}
2808
2809
Ian Rogers2c8f6532011-09-02 17:16:34 -07002810void X86Assembler::shrl(Register operand, Register shifter) {
Mark P Mendell73945692015-04-29 14:56:17 +00002811 EmitGenericShift(5, Operand(operand), shifter);
2812}
2813
2814
2815void X86Assembler::shrl(const Address& address, const Immediate& imm) {
2816 EmitGenericShift(5, address, imm);
2817}
2818
2819
2820void X86Assembler::shrl(const Address& address, Register shifter) {
2821 EmitGenericShift(5, address, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002822}
2823
2824
Ian Rogers2c8f6532011-09-02 17:16:34 -07002825void X86Assembler::sarl(Register reg, const Immediate& imm) {
Mark P Mendell73945692015-04-29 14:56:17 +00002826 EmitGenericShift(7, Operand(reg), imm);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002827}
2828
2829
Ian Rogers2c8f6532011-09-02 17:16:34 -07002830void X86Assembler::sarl(Register operand, Register shifter) {
Mark P Mendell73945692015-04-29 14:56:17 +00002831 EmitGenericShift(7, Operand(operand), shifter);
2832}
2833
2834
2835void X86Assembler::sarl(const Address& address, const Immediate& imm) {
2836 EmitGenericShift(7, address, imm);
2837}
2838
2839
2840void X86Assembler::sarl(const Address& address, Register shifter) {
2841 EmitGenericShift(7, address, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002842}
2843
2844
Calin Juravle9aec02f2014-11-18 23:06:35 +00002845void X86Assembler::shld(Register dst, Register src, Register shifter) {
2846 DCHECK_EQ(ECX, shifter);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002847 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2848 EmitUint8(0x0F);
2849 EmitUint8(0xA5);
2850 EmitRegisterOperand(src, dst);
2851}
2852
2853
Mark P Mendell73945692015-04-29 14:56:17 +00002854void X86Assembler::shld(Register dst, Register src, const Immediate& imm) {
2855 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2856 EmitUint8(0x0F);
2857 EmitUint8(0xA4);
2858 EmitRegisterOperand(src, dst);
2859 EmitUint8(imm.value() & 0xFF);
2860}
2861
2862
Calin Juravle9aec02f2014-11-18 23:06:35 +00002863void X86Assembler::shrd(Register dst, Register src, Register shifter) {
2864 DCHECK_EQ(ECX, shifter);
2865 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2866 EmitUint8(0x0F);
2867 EmitUint8(0xAD);
2868 EmitRegisterOperand(src, dst);
2869}
2870
2871
Mark P Mendell73945692015-04-29 14:56:17 +00002872void X86Assembler::shrd(Register dst, Register src, const Immediate& imm) {
2873 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2874 EmitUint8(0x0F);
2875 EmitUint8(0xAC);
2876 EmitRegisterOperand(src, dst);
2877 EmitUint8(imm.value() & 0xFF);
2878}
2879
2880
Mark Mendellbcee0922015-09-15 21:45:01 -04002881void X86Assembler::roll(Register reg, const Immediate& imm) {
2882 EmitGenericShift(0, Operand(reg), imm);
2883}
2884
2885
2886void X86Assembler::roll(Register operand, Register shifter) {
2887 EmitGenericShift(0, Operand(operand), shifter);
2888}
2889
2890
2891void X86Assembler::rorl(Register reg, const Immediate& imm) {
2892 EmitGenericShift(1, Operand(reg), imm);
2893}
2894
2895
2896void X86Assembler::rorl(Register operand, Register shifter) {
2897 EmitGenericShift(1, Operand(operand), shifter);
2898}
2899
2900
Ian Rogers2c8f6532011-09-02 17:16:34 -07002901void X86Assembler::negl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002902 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2903 EmitUint8(0xF7);
2904 EmitOperand(3, Operand(reg));
2905}
2906
2907
Ian Rogers2c8f6532011-09-02 17:16:34 -07002908void X86Assembler::notl(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002909 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2910 EmitUint8(0xF7);
2911 EmitUint8(0xD0 | reg);
2912}
2913
2914
Ian Rogers2c8f6532011-09-02 17:16:34 -07002915void X86Assembler::enter(const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002916 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2917 EmitUint8(0xC8);
2918 CHECK(imm.is_uint16());
2919 EmitUint8(imm.value() & 0xFF);
2920 EmitUint8((imm.value() >> 8) & 0xFF);
2921 EmitUint8(0x00);
2922}
2923
2924
Ian Rogers2c8f6532011-09-02 17:16:34 -07002925void X86Assembler::leave() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002926 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2927 EmitUint8(0xC9);
2928}
2929
2930
Ian Rogers2c8f6532011-09-02 17:16:34 -07002931void X86Assembler::ret() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002932 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2933 EmitUint8(0xC3);
2934}
2935
2936
Ian Rogers2c8f6532011-09-02 17:16:34 -07002937void X86Assembler::ret(const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002938 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2939 EmitUint8(0xC2);
2940 CHECK(imm.is_uint16());
2941 EmitUint8(imm.value() & 0xFF);
2942 EmitUint8((imm.value() >> 8) & 0xFF);
2943}
2944
2945
2946
Ian Rogers2c8f6532011-09-02 17:16:34 -07002947void X86Assembler::nop() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002948 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2949 EmitUint8(0x90);
2950}
2951
2952
Ian Rogers2c8f6532011-09-02 17:16:34 -07002953void X86Assembler::int3() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002954 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2955 EmitUint8(0xCC);
2956}
2957
2958
Ian Rogers2c8f6532011-09-02 17:16:34 -07002959void X86Assembler::hlt() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002960 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2961 EmitUint8(0xF4);
2962}
2963
2964
Ian Rogers2c8f6532011-09-02 17:16:34 -07002965void X86Assembler::j(Condition condition, Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002966 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2967 if (label->IsBound()) {
2968 static const int kShortSize = 2;
2969 static const int kLongSize = 6;
2970 int offset = label->Position() - buffer_.Size();
2971 CHECK_LE(offset, 0);
Andreas Gampeab1eb0d2015-02-13 19:23:55 -08002972 if (IsInt<8>(offset - kShortSize)) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07002973 EmitUint8(0x70 + condition);
2974 EmitUint8((offset - kShortSize) & 0xFF);
2975 } else {
2976 EmitUint8(0x0F);
2977 EmitUint8(0x80 + condition);
2978 EmitInt32(offset - kLongSize);
2979 }
2980 } else {
2981 EmitUint8(0x0F);
2982 EmitUint8(0x80 + condition);
2983 EmitLabelLink(label);
2984 }
2985}
2986
2987
Mark Mendell73f455e2015-08-21 09:30:05 -04002988void X86Assembler::j(Condition condition, NearLabel* label) {
2989 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2990 if (label->IsBound()) {
2991 static const int kShortSize = 2;
2992 int offset = label->Position() - buffer_.Size();
2993 CHECK_LE(offset, 0);
2994 CHECK(IsInt<8>(offset - kShortSize));
2995 EmitUint8(0x70 + condition);
2996 EmitUint8((offset - kShortSize) & 0xFF);
2997 } else {
2998 EmitUint8(0x70 + condition);
2999 EmitLabelLink(label);
3000 }
3001}
3002
3003
3004void X86Assembler::jecxz(NearLabel* label) {
3005 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3006 if (label->IsBound()) {
3007 static const int kShortSize = 2;
3008 int offset = label->Position() - buffer_.Size();
3009 CHECK_LE(offset, 0);
3010 CHECK(IsInt<8>(offset - kShortSize));
3011 EmitUint8(0xE3);
3012 EmitUint8((offset - kShortSize) & 0xFF);
3013 } else {
3014 EmitUint8(0xE3);
3015 EmitLabelLink(label);
3016 }
3017}
3018
3019
Ian Rogers2c8f6532011-09-02 17:16:34 -07003020void X86Assembler::jmp(Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003021 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3022 EmitUint8(0xFF);
3023 EmitRegisterOperand(4, reg);
3024}
3025
Ian Rogers7caad772012-03-30 01:07:54 -07003026void X86Assembler::jmp(const Address& address) {
3027 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3028 EmitUint8(0xFF);
3029 EmitOperand(4, address);
3030}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003031
Ian Rogers2c8f6532011-09-02 17:16:34 -07003032void X86Assembler::jmp(Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003033 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3034 if (label->IsBound()) {
3035 static const int kShortSize = 2;
3036 static const int kLongSize = 5;
3037 int offset = label->Position() - buffer_.Size();
3038 CHECK_LE(offset, 0);
Andreas Gampeab1eb0d2015-02-13 19:23:55 -08003039 if (IsInt<8>(offset - kShortSize)) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003040 EmitUint8(0xEB);
3041 EmitUint8((offset - kShortSize) & 0xFF);
3042 } else {
3043 EmitUint8(0xE9);
3044 EmitInt32(offset - kLongSize);
3045 }
3046 } else {
3047 EmitUint8(0xE9);
3048 EmitLabelLink(label);
3049 }
3050}
3051
3052
Mark Mendell73f455e2015-08-21 09:30:05 -04003053void X86Assembler::jmp(NearLabel* label) {
3054 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3055 if (label->IsBound()) {
3056 static const int kShortSize = 2;
3057 int offset = label->Position() - buffer_.Size();
3058 CHECK_LE(offset, 0);
3059 CHECK(IsInt<8>(offset - kShortSize));
3060 EmitUint8(0xEB);
3061 EmitUint8((offset - kShortSize) & 0xFF);
3062 } else {
3063 EmitUint8(0xEB);
3064 EmitLabelLink(label);
3065 }
3066}
3067
3068
jessicahandojob03d6402016-09-07 12:16:53 -07003069void X86Assembler::repne_scasb() {
3070 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3071 EmitUint8(0xF2);
3072 EmitUint8(0xAE);
3073}
3074
3075
Andreas Gampe21030dd2015-05-07 14:46:15 -07003076void X86Assembler::repne_scasw() {
3077 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3078 EmitUint8(0x66);
3079 EmitUint8(0xF2);
3080 EmitUint8(0xAF);
3081}
3082
3083
jessicahandojob03d6402016-09-07 12:16:53 -07003084void X86Assembler::repe_cmpsb() {
3085 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3086 EmitUint8(0xF2);
3087 EmitUint8(0xA6);
3088}
3089
3090
agicsaki71311f82015-07-27 11:34:13 -07003091void X86Assembler::repe_cmpsw() {
3092 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3093 EmitUint8(0x66);
3094 EmitUint8(0xF3);
3095 EmitUint8(0xA7);
3096}
3097
3098
agicsaki970abfb2015-07-31 10:31:14 -07003099void X86Assembler::repe_cmpsl() {
3100 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3101 EmitUint8(0xF3);
3102 EmitUint8(0xA7);
3103}
3104
3105
jessicahandojob03d6402016-09-07 12:16:53 -07003106void X86Assembler::rep_movsb() {
3107 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3108 EmitUint8(0xF3);
3109 EmitUint8(0xA4);
3110}
3111
3112
Mark Mendellb9c4bbe2015-07-01 14:26:52 -04003113void X86Assembler::rep_movsw() {
3114 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3115 EmitUint8(0x66);
3116 EmitUint8(0xF3);
3117 EmitUint8(0xA5);
3118}
3119
3120
Ian Rogers2c8f6532011-09-02 17:16:34 -07003121X86Assembler* X86Assembler::lock() {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003122 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3123 EmitUint8(0xF0);
Ian Rogers0d666d82011-08-14 16:03:46 -07003124 return this;
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003125}
3126
3127
Ian Rogers2c8f6532011-09-02 17:16:34 -07003128void X86Assembler::cmpxchgl(const Address& address, Register reg) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003129 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3130 EmitUint8(0x0F);
3131 EmitUint8(0xB1);
3132 EmitOperand(reg, address);
3133}
3134
Mark Mendell58d25fd2015-04-03 14:52:31 -04003135
3136void X86Assembler::cmpxchg8b(const Address& address) {
3137 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3138 EmitUint8(0x0F);
3139 EmitUint8(0xC7);
3140 EmitOperand(1, address);
3141}
3142
3143
Elliott Hughes79ab9e32012-03-12 15:41:35 -07003144void X86Assembler::mfence() {
3145 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3146 EmitUint8(0x0F);
3147 EmitUint8(0xAE);
3148 EmitUint8(0xF0);
3149}
3150
Ian Rogers2c8f6532011-09-02 17:16:34 -07003151X86Assembler* X86Assembler::fs() {
Ian Rogersb033c752011-07-20 12:22:35 -07003152 // TODO: fs is a prefix and not an instruction
3153 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3154 EmitUint8(0x64);
Ian Rogers0d666d82011-08-14 16:03:46 -07003155 return this;
Ian Rogersb033c752011-07-20 12:22:35 -07003156}
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003157
Ian Rogersbefbd572014-03-06 01:13:39 -08003158X86Assembler* X86Assembler::gs() {
3159 // TODO: fs is a prefix and not an instruction
3160 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3161 EmitUint8(0x65);
3162 return this;
3163}
3164
Ian Rogers2c8f6532011-09-02 17:16:34 -07003165void X86Assembler::AddImmediate(Register reg, const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003166 int value = imm.value();
3167 if (value > 0) {
3168 if (value == 1) {
3169 incl(reg);
3170 } else if (value != 0) {
3171 addl(reg, imm);
3172 }
3173 } else if (value < 0) {
3174 value = -value;
3175 if (value == 1) {
3176 decl(reg);
3177 } else if (value != 0) {
3178 subl(reg, Immediate(value));
3179 }
3180 }
3181}
3182
3183
Roland Levillain647b9ed2014-11-27 12:06:00 +00003184void X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) {
3185 // TODO: Need to have a code constants table.
3186 pushl(Immediate(High32Bits(value)));
3187 pushl(Immediate(Low32Bits(value)));
3188 movsd(dst, Address(ESP, 0));
3189 addl(ESP, Immediate(2 * sizeof(int32_t)));
3190}
3191
3192
Ian Rogers2c8f6532011-09-02 17:16:34 -07003193void X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003194 // TODO: Need to have a code constants table.
3195 int64_t constant = bit_cast<int64_t, double>(value);
Roland Levillain647b9ed2014-11-27 12:06:00 +00003196 LoadLongConstant(dst, constant);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003197}
3198
3199
Ian Rogers2c8f6532011-09-02 17:16:34 -07003200void X86Assembler::Align(int alignment, int offset) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003201 CHECK(IsPowerOfTwo(alignment));
3202 // Emit nop instruction until the real position is aligned.
3203 while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) {
3204 nop();
3205 }
3206}
3207
3208
Ian Rogers2c8f6532011-09-02 17:16:34 -07003209void X86Assembler::Bind(Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003210 int bound = buffer_.Size();
3211 CHECK(!label->IsBound()); // Labels can only be bound once.
3212 while (label->IsLinked()) {
3213 int position = label->LinkPosition();
3214 int next = buffer_.Load<int32_t>(position);
3215 buffer_.Store<int32_t>(position, bound - (position + 4));
3216 label->position_ = next;
3217 }
3218 label->BindTo(bound);
3219}
3220
3221
Mark Mendell73f455e2015-08-21 09:30:05 -04003222void X86Assembler::Bind(NearLabel* label) {
3223 int bound = buffer_.Size();
3224 CHECK(!label->IsBound()); // Labels can only be bound once.
3225 while (label->IsLinked()) {
3226 int position = label->LinkPosition();
3227 uint8_t delta = buffer_.Load<uint8_t>(position);
3228 int offset = bound - (position + 1);
3229 CHECK(IsInt<8>(offset));
3230 buffer_.Store<int8_t>(position, offset);
3231 label->position_ = delta != 0u ? label->position_ - delta : 0;
3232 }
3233 label->BindTo(bound);
3234}
3235
3236
Ian Rogers44fb0d02012-03-23 16:46:24 -07003237void X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) {
3238 CHECK_GE(reg_or_opcode, 0);
3239 CHECK_LT(reg_or_opcode, 8);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003240 const int length = operand.length_;
3241 CHECK_GT(length, 0);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003242 // Emit the ModRM byte updated with the given reg value.
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003243 CHECK_EQ(operand.encoding_[0] & 0x38, 0);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003244 EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3));
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003245 // Emit the rest of the encoded operand.
3246 for (int i = 1; i < length; i++) {
3247 EmitUint8(operand.encoding_[i]);
3248 }
Mark Mendell0616ae02015-04-17 12:49:27 -04003249 AssemblerFixup* fixup = operand.GetFixup();
3250 if (fixup != nullptr) {
3251 EmitFixup(fixup);
3252 }
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003253}
3254
3255
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003256void X86Assembler::EmitImmediate(const Immediate& imm, bool is_16_op) {
3257 if (is_16_op) {
3258 EmitUint8(imm.value() & 0xFF);
3259 EmitUint8(imm.value() >> 8);
3260 } else {
3261 EmitInt32(imm.value());
3262 }
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003263}
3264
3265
Ian Rogers44fb0d02012-03-23 16:46:24 -07003266void X86Assembler::EmitComplex(int reg_or_opcode,
Ian Rogers2c8f6532011-09-02 17:16:34 -07003267 const Operand& operand,
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003268 const Immediate& immediate,
3269 bool is_16_op) {
Ian Rogers44fb0d02012-03-23 16:46:24 -07003270 CHECK_GE(reg_or_opcode, 0);
3271 CHECK_LT(reg_or_opcode, 8);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003272 if (immediate.is_int8()) {
3273 // Use sign-extended 8-bit immediate.
3274 EmitUint8(0x83);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003275 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003276 EmitUint8(immediate.value() & 0xFF);
3277 } else if (operand.IsRegister(EAX)) {
3278 // Use short form if the destination is eax.
Ian Rogers44fb0d02012-03-23 16:46:24 -07003279 EmitUint8(0x05 + (reg_or_opcode << 3));
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003280 EmitImmediate(immediate, is_16_op);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003281 } else {
3282 EmitUint8(0x81);
Ian Rogers44fb0d02012-03-23 16:46:24 -07003283 EmitOperand(reg_or_opcode, operand);
Nicolas Geoffrayded55942018-01-26 16:33:41 +00003284 EmitImmediate(immediate, is_16_op);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003285 }
3286}
3287
3288
Ian Rogers2c8f6532011-09-02 17:16:34 -07003289void X86Assembler::EmitLabel(Label* label, int instruction_size) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003290 if (label->IsBound()) {
3291 int offset = label->Position() - buffer_.Size();
3292 CHECK_LE(offset, 0);
3293 EmitInt32(offset - instruction_size);
3294 } else {
3295 EmitLabelLink(label);
3296 }
3297}
3298
3299
Ian Rogers2c8f6532011-09-02 17:16:34 -07003300void X86Assembler::EmitLabelLink(Label* label) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003301 CHECK(!label->IsBound());
3302 int position = buffer_.Size();
3303 EmitInt32(label->position_);
3304 label->LinkTo(position);
3305}
3306
3307
Mark Mendell73f455e2015-08-21 09:30:05 -04003308void X86Assembler::EmitLabelLink(NearLabel* label) {
3309 CHECK(!label->IsBound());
3310 int position = buffer_.Size();
3311 if (label->IsLinked()) {
3312 // Save the delta in the byte that we have to play with.
3313 uint32_t delta = position - label->LinkPosition();
3314 CHECK(IsUint<8>(delta));
3315 EmitUint8(delta & 0xFF);
3316 } else {
3317 EmitUint8(0);
3318 }
3319 label->LinkTo(position);
3320}
3321
3322
Ian Rogers44fb0d02012-03-23 16:46:24 -07003323void X86Assembler::EmitGenericShift(int reg_or_opcode,
Mark P Mendell73945692015-04-29 14:56:17 +00003324 const Operand& operand,
Ian Rogers2c8f6532011-09-02 17:16:34 -07003325 const Immediate& imm) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003326 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3327 CHECK(imm.is_int8());
3328 if (imm.value() == 1) {
3329 EmitUint8(0xD1);
Mark P Mendell73945692015-04-29 14:56:17 +00003330 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003331 } else {
3332 EmitUint8(0xC1);
Mark P Mendell73945692015-04-29 14:56:17 +00003333 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003334 EmitUint8(imm.value() & 0xFF);
3335 }
3336}
3337
3338
Ian Rogers44fb0d02012-03-23 16:46:24 -07003339void X86Assembler::EmitGenericShift(int reg_or_opcode,
Mark P Mendell73945692015-04-29 14:56:17 +00003340 const Operand& operand,
Ian Rogers2c8f6532011-09-02 17:16:34 -07003341 Register shifter) {
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003342 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3343 CHECK_EQ(shifter, ECX);
3344 EmitUint8(0xD3);
Mark P Mendell73945692015-04-29 14:56:17 +00003345 EmitOperand(reg_or_opcode, operand);
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07003346}
3347
Mark Mendell0616ae02015-04-17 12:49:27 -04003348void X86Assembler::AddConstantArea() {
Vladimir Marko93205e32016-04-13 11:59:46 +01003349 ArrayRef<const int32_t> area = constant_area_.GetBuffer();
Mark Mendell0616ae02015-04-17 12:49:27 -04003350 // Generate the data for the literal area.
3351 for (size_t i = 0, e = area.size(); i < e; i++) {
3352 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3353 EmitInt32(area[i]);
3354 }
3355}
3356
Mark Mendell805b3b52015-09-18 14:10:29 -04003357size_t ConstantArea::AppendInt32(int32_t v) {
3358 size_t result = buffer_.size() * elem_size_;
Mark Mendell0616ae02015-04-17 12:49:27 -04003359 buffer_.push_back(v);
3360 return result;
3361}
3362
Mark Mendell805b3b52015-09-18 14:10:29 -04003363size_t ConstantArea::AddInt32(int32_t v) {
3364 for (size_t i = 0, e = buffer_.size(); i < e; i++) {
3365 if (v == buffer_[i]) {
3366 return i * elem_size_;
3367 }
3368 }
3369
3370 // Didn't match anything.
3371 return AppendInt32(v);
3372}
3373
3374size_t ConstantArea::AddInt64(int64_t v) {
Mark Mendell0616ae02015-04-17 12:49:27 -04003375 int32_t v_low = Low32Bits(v);
3376 int32_t v_high = High32Bits(v);
3377 if (buffer_.size() > 1) {
3378 // Ensure we don't pass the end of the buffer.
3379 for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) {
3380 if (v_low == buffer_[i] && v_high == buffer_[i + 1]) {
Mark Mendell805b3b52015-09-18 14:10:29 -04003381 return i * elem_size_;
Mark Mendell0616ae02015-04-17 12:49:27 -04003382 }
3383 }
3384 }
3385
3386 // Didn't match anything.
Mark Mendell805b3b52015-09-18 14:10:29 -04003387 size_t result = buffer_.size() * elem_size_;
Mark Mendell0616ae02015-04-17 12:49:27 -04003388 buffer_.push_back(v_low);
3389 buffer_.push_back(v_high);
3390 return result;
3391}
3392
Mark Mendell805b3b52015-09-18 14:10:29 -04003393size_t ConstantArea::AddDouble(double v) {
Mark Mendell0616ae02015-04-17 12:49:27 -04003394 // Treat the value as a 64-bit integer value.
3395 return AddInt64(bit_cast<int64_t, double>(v));
3396}
3397
Mark Mendell805b3b52015-09-18 14:10:29 -04003398size_t ConstantArea::AddFloat(float v) {
Mark Mendell0616ae02015-04-17 12:49:27 -04003399 // Treat the value as a 32-bit integer value.
3400 return AddInt32(bit_cast<int32_t, float>(v));
3401}
3402
jaishank20d1c942019-03-08 15:08:17 +05303403uint8_t X86Assembler::EmitVexPrefixByteZero(bool is_twobyte_form) {
3404 /**Vex Byte 0,
3405 Bits [7:0] must contain the value 11000101b (0xC5) for 2-byte Vex
3406 Bits [7:0] must contain the value 11000100b (0xC4) for 3-byte Vex */
3407 uint8_t vex_prefix = 0xC0;
3408 if (is_twobyte_form) {
3409 // 2-Byte Vex
3410 vex_prefix |= TWO_BYTE_VEX;
3411 } else {
3412 // 3-Byte Vex
3413 vex_prefix |= THREE_BYTE_VEX;
3414 }
3415 return vex_prefix;
3416}
3417
3418uint8_t X86Assembler::EmitVexPrefixByteOne(bool R,
3419 bool X,
3420 bool B,
3421 int SET_VEX_M) {
3422 /**Vex Byte 1, */
3423 uint8_t vex_prefix = VEX_INIT;
3424 /** Bit[7] This bit needs to be set to '1'
3425 otherwise the instruction is LES or LDS */
3426 if (!R) {
3427 // R .
3428 vex_prefix |= SET_VEX_R;
3429 }
3430 /** Bit[6] This bit needs to be set to '1'
3431 otherwise the instruction is LES or LDS */
3432 if (!X) {
3433 // X .
3434 vex_prefix |= SET_VEX_X;
3435 }
3436 /** Bit[5] This bit needs to be set to '1' */
3437 if (!B) {
3438 // B .
3439 vex_prefix |= SET_VEX_B;
3440 }
3441 /** Bits[4:0], */
3442 vex_prefix |= SET_VEX_M;
3443 return vex_prefix;
3444}
3445
3446uint8_t X86Assembler::EmitVexPrefixByteOne(bool R,
3447 X86ManagedRegister operand,
3448 int SET_VEX_L,
3449 int SET_VEX_PP) {
3450 /**Vex Byte 1, */
3451 uint8_t vex_prefix = VEX_INIT;
3452 /** Bit[7] This bit needs to be set to '1'
3453 otherwise the instruction is LES or LDS */
3454 if (!R) {
3455 // R .
3456 vex_prefix |= SET_VEX_R;
3457 }
3458 /**Bits[6:3] - 'vvvv' the source or dest register specifier */
3459 if (operand.IsNoRegister()) {
3460 vex_prefix |= 0x78;
3461 } else if (operand.IsXmmRegister()) {
3462 XmmRegister vvvv = operand.AsXmmRegister();
3463 int inverted_reg = 15 - static_cast<int>(vvvv);
3464 uint8_t reg = static_cast<uint8_t>(inverted_reg);
3465 vex_prefix |= ((reg & 0x0F) << 3);
3466 } else if (operand.IsCpuRegister()) {
3467 Register vvvv = operand.AsCpuRegister();
3468 int inverted_reg = 15 - static_cast<int>(vvvv);
3469 uint8_t reg = static_cast<uint8_t>(inverted_reg);
3470 vex_prefix |= ((reg & 0x0F) << 3);
3471 }
3472 /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
3473 VEX.L = 0 indicates 128 bit vector operation */
3474 vex_prefix |= SET_VEX_L;
3475 /** Bits[1:0] - "pp" */
3476 vex_prefix |= SET_VEX_PP;
3477 return vex_prefix;
3478}
3479
3480uint8_t X86Assembler::EmitVexPrefixByteTwo(bool W,
3481 X86ManagedRegister operand,
3482 int SET_VEX_L,
3483 int SET_VEX_PP) {
3484 /** Vex Byte 2, */
3485 uint8_t vex_prefix = VEX_INIT;
3486 /** Bit[7] This bits needs to be set to '1' with default value.
3487 When using C4H form of VEX prefix, W value is ignored */
3488 if (W) {
3489 vex_prefix |= SET_VEX_W;
3490 }
3491 /** Bits[6:3] - 'vvvv' the source or dest register specifier */
3492 if (operand.IsXmmRegister()) {
3493 XmmRegister vvvv = operand.AsXmmRegister();
3494 int inverted_reg = 15 - static_cast<int>(vvvv);
3495 uint8_t reg = static_cast<uint8_t>(inverted_reg);
3496 vex_prefix |= ((reg & 0x0F) << 3);
3497 } else if (operand.IsCpuRegister()) {
3498 Register vvvv = operand.AsCpuRegister();
3499 int inverted_reg = 15 - static_cast<int>(vvvv);
3500 uint8_t reg = static_cast<uint8_t>(inverted_reg);
3501 vex_prefix |= ((reg & 0x0F) << 3);
3502 }
3503 /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
3504 VEX.L = 0 indicates 128 bit vector operation */
3505 vex_prefix |= SET_VEX_L;
3506 // Bits[1:0] - "pp"
3507 vex_prefix |= SET_VEX_PP;
3508 return vex_prefix;
3509}
3510
3511uint8_t X86Assembler::EmitVexPrefixByteTwo(bool W,
3512 int SET_VEX_L,
3513 int SET_VEX_PP) {
3514 /**Vex Byte 2, */
3515 uint8_t vex_prefix = VEX_INIT;
3516
3517 /** Bit[7] This bits needs to be set to '1' with default value.
3518 When using C4H form of VEX prefix, W value is ignored */
3519 if (W) {
3520 vex_prefix |= SET_VEX_W;
3521 }
3522 /** Bits[6:3] - 'vvvv' the source or dest register specifier,
3523 if unused set 1111 */
3524 vex_prefix |= (0x0F << 3);
3525
3526 /** Bit[2] - "L" If VEX.L = 1 indicates 256-bit vector operation ,
3527 VEX.L = 0 indicates 128 bit vector operation */
3528 vex_prefix |= SET_VEX_L;
3529
3530 /** Bits[1:0] - "pp" */
3531 if (SET_VEX_PP != SET_VEX_PP_NONE) {
3532 vex_prefix |= SET_VEX_PP;
3533 }
3534 return vex_prefix;
3535}
3536
Ian Rogers2c8f6532011-09-02 17:16:34 -07003537} // namespace x86
Ian Rogersb033c752011-07-20 12:22:35 -07003538} // namespace art