Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: src/IceAssemblerX8632.cpp

Issue 1179563004: Renames the assembler* files. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Changes the top comment for IceAssemblerX8632.cpp Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceAssemblerX8632.h ('k') | src/IceCfg.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 //===- subzero/src/IceAssemblerX8632.cpp - Assembler for x86-32 ----------===//
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file.
5 //
6 // Modified by the Subzero authors.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // The Subzero Code Generator
11 //
12 // This file is distributed under the University of Illinois Open Source
13 // License. See LICENSE.TXT for details.
14 //
15 //===----------------------------------------------------------------------===//
16 //
17 // This file implements the Assembler class for x86-32.
18 //
19 //===----------------------------------------------------------------------===//
20
21 #include "IceAssemblerX8632.h"
22 #include "IceCfg.h"
23 #include "IceOperand.h"
24
25 namespace Ice {
26 namespace X8632 {
27
28 Address Address::ofConstPool(Assembler *Asm, const Constant *Imm) {
29 AssemblerFixup *Fixup = Asm->createFixup(llvm::ELF::R_386_32, Imm);
30 const RelocOffsetT Offset = 0;
31 return Address::Absolute(Offset, Fixup);
32 }
33
34 AssemblerX8632::~AssemblerX8632() {
35 #ifndef NDEBUG
36 for (const Label *Label : CfgNodeLabels) {
37 Label->FinalCheck();
38 }
39 for (const Label *Label : LocalLabels) {
40 Label->FinalCheck();
41 }
42 #endif
43 }
44
45 void AssemblerX8632::alignFunction() {
46 SizeT Align = 1 << getBundleAlignLog2Bytes();
47 SizeT BytesNeeded = Utils::OffsetToAlignment(Buffer.getPosition(), Align);
48 const SizeT HltSize = 1;
49 while (BytesNeeded > 0) {
50 hlt();
51 BytesNeeded -= HltSize;
52 }
53 }
54
55 Label *AssemblerX8632::GetOrCreateLabel(SizeT Number, LabelVector &Labels) {
56 Label *L = nullptr;
57 if (Number == Labels.size()) {
58 L = new (this->allocate<Label>()) Label();
59 Labels.push_back(L);
60 return L;
61 }
62 if (Number > Labels.size()) {
63 Labels.resize(Number + 1);
64 }
65 L = Labels[Number];
66 if (!L) {
67 L = new (this->allocate<Label>()) Label();
68 Labels[Number] = L;
69 }
70 return L;
71 }
72
73 Label *AssemblerX8632::GetOrCreateCfgNodeLabel(SizeT NodeNumber) {
74 return GetOrCreateLabel(NodeNumber, CfgNodeLabels);
75 }
76
77 Label *AssemblerX8632::GetOrCreateLocalLabel(SizeT Number) {
78 return GetOrCreateLabel(Number, LocalLabels);
79 }
80
81 void AssemblerX8632::bindCfgNodeLabel(SizeT NodeNumber) {
82 assert(!getPreliminary());
83 Label *L = GetOrCreateCfgNodeLabel(NodeNumber);
84 this->bind(L);
85 }
86
87 void AssemblerX8632::BindLocalLabel(SizeT Number) {
88 Label *L = GetOrCreateLocalLabel(Number);
89 if (!getPreliminary())
90 this->bind(L);
91 }
92
93 void AssemblerX8632::call(GPRRegister reg) {
94 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
95 emitUint8(0xFF);
96 emitRegisterOperand(2, reg);
97 }
98
99 void AssemblerX8632::call(const Address &address) {
100 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
101 emitUint8(0xFF);
102 emitOperand(2, address);
103 }
104
105 void AssemblerX8632::call(const ConstantRelocatable *label) {
106 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
107 intptr_t call_start = Buffer.getPosition();
108 emitUint8(0xE8);
109 emitFixup(this->createFixup(llvm::ELF::R_386_PC32, label));
110 emitInt32(-4);
111 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
112 (void)call_start;
113 }
114
115 void AssemblerX8632::call(const Immediate &abs_address) {
116 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
117 intptr_t call_start = Buffer.getPosition();
118 emitUint8(0xE8);
119 emitFixup(
120 this->createFixup(llvm::ELF::R_386_PC32, AssemblerFixup::NullSymbol));
121 emitInt32(abs_address.value() - 4);
122 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
123 (void)call_start;
124 }
125
126 void AssemblerX8632::pushl(GPRRegister reg) {
127 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
128 emitUint8(0x50 + reg);
129 }
130
131 void AssemblerX8632::popl(GPRRegister reg) {
132 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
133 emitUint8(0x58 + reg);
134 }
135
136 void AssemblerX8632::popl(const Address &address) {
137 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
138 emitUint8(0x8F);
139 emitOperand(0, address);
140 }
141
142 void AssemblerX8632::pushal() {
143 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
144 emitUint8(0x60);
145 }
146
147 void AssemblerX8632::popal() {
148 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
149 emitUint8(0x61);
150 }
151
152 void AssemblerX8632::setcc(CondX86::BrCond condition, ByteRegister dst) {
153 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
154 emitUint8(0x0F);
155 emitUint8(0x90 + condition);
156 emitUint8(0xC0 + dst);
157 }
158
159 void AssemblerX8632::setcc(CondX86::BrCond condition, const Address &address) {
160 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
161 emitUint8(0x0F);
162 emitUint8(0x90 + condition);
163 emitOperand(0, address);
164 }
165
166 void AssemblerX8632::mov(Type Ty, GPRRegister dst, const Immediate &imm) {
167 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
168 if (isByteSizedType(Ty)) {
169 emitUint8(0xB0 + dst);
170 emitUint8(imm.value() & 0xFF);
171 return;
172 }
173 if (Ty == IceType_i16)
174 emitOperandSizeOverride();
175 emitUint8(0xB8 + dst);
176 emitImmediate(Ty, imm);
177 }
178
179 void AssemblerX8632::mov(Type Ty, GPRRegister dst, GPRRegister src) {
180 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
181 if (Ty == IceType_i16)
182 emitOperandSizeOverride();
183 if (isByteSizedType(Ty)) {
184 emitUint8(0x88);
185 } else {
186 emitUint8(0x89);
187 }
188 emitRegisterOperand(src, dst);
189 }
190
191 void AssemblerX8632::mov(Type Ty, GPRRegister dst, const Address &src) {
192 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
193 if (Ty == IceType_i16)
194 emitOperandSizeOverride();
195 if (isByteSizedType(Ty)) {
196 emitUint8(0x8A);
197 } else {
198 emitUint8(0x8B);
199 }
200 emitOperand(dst, src);
201 }
202
203 void AssemblerX8632::mov(Type Ty, const Address &dst, GPRRegister src) {
204 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
205 if (Ty == IceType_i16)
206 emitOperandSizeOverride();
207 if (isByteSizedType(Ty)) {
208 emitUint8(0x88);
209 } else {
210 emitUint8(0x89);
211 }
212 emitOperand(src, dst);
213 }
214
215 void AssemblerX8632::mov(Type Ty, const Address &dst, const Immediate &imm) {
216 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
217 if (Ty == IceType_i16)
218 emitOperandSizeOverride();
219 if (isByteSizedType(Ty)) {
220 emitUint8(0xC6);
221 emitOperand(0, dst);
222 emitUint8(imm.value() & 0xFF);
223 } else {
224 emitUint8(0xC7);
225 emitOperand(0, dst);
226 emitImmediate(Ty, imm);
227 }
228 }
229
230 void AssemblerX8632::movzx(Type SrcTy, GPRRegister dst, GPRRegister src) {
231 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
232 bool ByteSized = isByteSizedType(SrcTy);
233 assert(ByteSized || SrcTy == IceType_i16);
234 emitUint8(0x0F);
235 emitUint8(ByteSized ? 0xB6 : 0xB7);
236 emitRegisterOperand(dst, src);
237 }
238
239 void AssemblerX8632::movzx(Type SrcTy, GPRRegister dst, const Address &src) {
240 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
241 bool ByteSized = isByteSizedType(SrcTy);
242 assert(ByteSized || SrcTy == IceType_i16);
243 emitUint8(0x0F);
244 emitUint8(ByteSized ? 0xB6 : 0xB7);
245 emitOperand(dst, src);
246 }
247
248 void AssemblerX8632::movsx(Type SrcTy, GPRRegister dst, GPRRegister src) {
249 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
250 bool ByteSized = isByteSizedType(SrcTy);
251 assert(ByteSized || SrcTy == IceType_i16);
252 emitUint8(0x0F);
253 emitUint8(ByteSized ? 0xBE : 0xBF);
254 emitRegisterOperand(dst, src);
255 }
256
257 void AssemblerX8632::movsx(Type SrcTy, GPRRegister dst, const Address &src) {
258 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
259 bool ByteSized = isByteSizedType(SrcTy);
260 assert(ByteSized || SrcTy == IceType_i16);
261 emitUint8(0x0F);
262 emitUint8(ByteSized ? 0xBE : 0xBF);
263 emitOperand(dst, src);
264 }
265
266 void AssemblerX8632::lea(Type Ty, GPRRegister dst, const Address &src) {
267 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
268 assert(Ty == IceType_i16 || Ty == IceType_i32);
269 if (Ty == IceType_i16)
270 emitOperandSizeOverride();
271 emitUint8(0x8D);
272 emitOperand(dst, src);
273 }
274
275 void AssemblerX8632::cmov(Type Ty, CondX86::BrCond cond, GPRRegister dst,
276 GPRRegister src) {
277 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
278 if (Ty == IceType_i16)
279 emitOperandSizeOverride();
280 else
281 assert(Ty == IceType_i32);
282 emitUint8(0x0F);
283 emitUint8(0x40 + cond);
284 emitRegisterOperand(dst, src);
285 }
286
287 void AssemblerX8632::cmov(Type Ty, CondX86::BrCond cond, GPRRegister dst,
288 const Address &src) {
289 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
290 if (Ty == IceType_i16)
291 emitOperandSizeOverride();
292 else
293 assert(Ty == IceType_i32);
294 emitUint8(0x0F);
295 emitUint8(0x40 + cond);
296 emitOperand(dst, src);
297 }
298
299 void AssemblerX8632::rep_movsb() {
300 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
301 emitUint8(0xF3);
302 emitUint8(0xA4);
303 }
304
305 void AssemblerX8632::movss(Type Ty, XmmRegister dst, const Address &src) {
306 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
307 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
308 emitUint8(0x0F);
309 emitUint8(0x10);
310 emitOperand(dst, src);
311 }
312
313 void AssemblerX8632::movss(Type Ty, const Address &dst, XmmRegister src) {
314 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
315 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
316 emitUint8(0x0F);
317 emitUint8(0x11);
318 emitOperand(src, dst);
319 }
320
321 void AssemblerX8632::movss(Type Ty, XmmRegister dst, XmmRegister src) {
322 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
323 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
324 emitUint8(0x0F);
325 emitUint8(0x11);
326 emitXmmRegisterOperand(src, dst);
327 }
328
329 void AssemblerX8632::movd(XmmRegister dst, GPRRegister src) {
330 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
331 emitUint8(0x66);
332 emitUint8(0x0F);
333 emitUint8(0x6E);
334 emitRegisterOperand(dst, src);
335 }
336
337 void AssemblerX8632::movd(XmmRegister dst, const Address &src) {
338 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
339 emitUint8(0x66);
340 emitUint8(0x0F);
341 emitUint8(0x6E);
342 emitOperand(dst, src);
343 }
344
345 void AssemblerX8632::movd(GPRRegister dst, XmmRegister src) {
346 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
347 emitUint8(0x66);
348 emitUint8(0x0F);
349 emitUint8(0x7E);
350 emitRegisterOperand(src, dst);
351 }
352
353 void AssemblerX8632::movd(const Address &dst, XmmRegister src) {
354 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
355 emitUint8(0x66);
356 emitUint8(0x0F);
357 emitUint8(0x7E);
358 emitOperand(src, dst);
359 }
360
361 void AssemblerX8632::movq(XmmRegister dst, XmmRegister src) {
362 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
363 emitUint8(0xF3);
364 emitUint8(0x0F);
365 emitUint8(0x7E);
366 emitRegisterOperand(dst, src);
367 }
368
369 void AssemblerX8632::movq(const Address &dst, XmmRegister src) {
370 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
371 emitUint8(0x66);
372 emitUint8(0x0F);
373 emitUint8(0xD6);
374 emitOperand(src, dst);
375 }
376
377 void AssemblerX8632::movq(XmmRegister dst, const Address &src) {
378 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
379 emitUint8(0xF3);
380 emitUint8(0x0F);
381 emitUint8(0x7E);
382 emitOperand(dst, src);
383 }
384
385 void AssemblerX8632::addss(Type Ty, XmmRegister dst, XmmRegister src) {
386 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
387 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
388 emitUint8(0x0F);
389 emitUint8(0x58);
390 emitXmmRegisterOperand(dst, src);
391 }
392
393 void AssemblerX8632::addss(Type Ty, XmmRegister dst, const Address &src) {
394 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
395 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
396 emitUint8(0x0F);
397 emitUint8(0x58);
398 emitOperand(dst, src);
399 }
400
401 void AssemblerX8632::subss(Type Ty, XmmRegister dst, XmmRegister src) {
402 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
403 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
404 emitUint8(0x0F);
405 emitUint8(0x5C);
406 emitXmmRegisterOperand(dst, src);
407 }
408
409 void AssemblerX8632::subss(Type Ty, XmmRegister dst, const Address &src) {
410 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
411 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
412 emitUint8(0x0F);
413 emitUint8(0x5C);
414 emitOperand(dst, src);
415 }
416
417 void AssemblerX8632::mulss(Type Ty, XmmRegister dst, XmmRegister src) {
418 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
419 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
420 emitUint8(0x0F);
421 emitUint8(0x59);
422 emitXmmRegisterOperand(dst, src);
423 }
424
425 void AssemblerX8632::mulss(Type Ty, XmmRegister dst, const Address &src) {
426 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
427 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
428 emitUint8(0x0F);
429 emitUint8(0x59);
430 emitOperand(dst, src);
431 }
432
433 void AssemblerX8632::divss(Type Ty, XmmRegister dst, XmmRegister src) {
434 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
435 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
436 emitUint8(0x0F);
437 emitUint8(0x5E);
438 emitXmmRegisterOperand(dst, src);
439 }
440
441 void AssemblerX8632::divss(Type Ty, XmmRegister dst, const Address &src) {
442 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
443 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
444 emitUint8(0x0F);
445 emitUint8(0x5E);
446 emitOperand(dst, src);
447 }
448
449 void AssemblerX8632::fld(Type Ty, const Address &src) {
450 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
451 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
452 emitOperand(0, src);
453 }
454
455 void AssemblerX8632::fstp(Type Ty, const Address &dst) {
456 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
457 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
458 emitOperand(3, dst);
459 }
460
461 void AssemblerX8632::fstp(X87STRegister st) {
462 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
463 emitUint8(0xDD);
464 emitUint8(0xD8 + st);
465 }
466
467 void AssemblerX8632::movaps(XmmRegister dst, XmmRegister src) {
468 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
469 emitUint8(0x0F);
470 emitUint8(0x28);
471 emitXmmRegisterOperand(dst, src);
472 }
473
474 void AssemblerX8632::movups(XmmRegister dst, XmmRegister src) {
475 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
476 emitUint8(0x0F);
477 emitUint8(0x10);
478 emitRegisterOperand(dst, src);
479 }
480
481 void AssemblerX8632::movups(XmmRegister dst, const Address &src) {
482 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
483 emitUint8(0x0F);
484 emitUint8(0x10);
485 emitOperand(dst, src);
486 }
487
488 void AssemblerX8632::movups(const Address &dst, XmmRegister src) {
489 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
490 emitUint8(0x0F);
491 emitUint8(0x11);
492 emitOperand(src, dst);
493 }
494
495 void AssemblerX8632::padd(Type Ty, XmmRegister dst, XmmRegister src) {
496 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
497 emitUint8(0x66);
498 emitUint8(0x0F);
499 if (isByteSizedArithType(Ty)) {
500 emitUint8(0xFC);
501 } else if (Ty == IceType_i16) {
502 emitUint8(0xFD);
503 } else {
504 emitUint8(0xFE);
505 }
506 emitXmmRegisterOperand(dst, src);
507 }
508
509 void AssemblerX8632::padd(Type Ty, XmmRegister dst, const Address &src) {
510 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
511 emitUint8(0x66);
512 emitUint8(0x0F);
513 if (isByteSizedArithType(Ty)) {
514 emitUint8(0xFC);
515 } else if (Ty == IceType_i16) {
516 emitUint8(0xFD);
517 } else {
518 emitUint8(0xFE);
519 }
520 emitOperand(dst, src);
521 }
522
523 void AssemblerX8632::pand(Type /* Ty */, XmmRegister dst, XmmRegister src) {
524 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
525 emitUint8(0x66);
526 emitUint8(0x0F);
527 emitUint8(0xDB);
528 emitXmmRegisterOperand(dst, src);
529 }
530
531 void AssemblerX8632::pand(Type /* Ty */, XmmRegister dst, const Address &src) {
532 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
533 emitUint8(0x66);
534 emitUint8(0x0F);
535 emitUint8(0xDB);
536 emitOperand(dst, src);
537 }
538
539 void AssemblerX8632::pandn(Type /* Ty */, XmmRegister dst, XmmRegister src) {
540 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
541 emitUint8(0x66);
542 emitUint8(0x0F);
543 emitUint8(0xDF);
544 emitXmmRegisterOperand(dst, src);
545 }
546
547 void AssemblerX8632::pandn(Type /* Ty */, XmmRegister dst, const Address &src) {
548 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
549 emitUint8(0x66);
550 emitUint8(0x0F);
551 emitUint8(0xDF);
552 emitOperand(dst, src);
553 }
554
555 void AssemblerX8632::pmull(Type Ty, XmmRegister dst, XmmRegister src) {
556 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
557 emitUint8(0x66);
558 emitUint8(0x0F);
559 if (Ty == IceType_i16) {
560 emitUint8(0xD5);
561 } else {
562 assert(Ty == IceType_i32);
563 emitUint8(0x38);
564 emitUint8(0x40);
565 }
566 emitXmmRegisterOperand(dst, src);
567 }
568
569 void AssemblerX8632::pmull(Type Ty, XmmRegister dst, const Address &src) {
570 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
571 emitUint8(0x66);
572 emitUint8(0x0F);
573 if (Ty == IceType_i16) {
574 emitUint8(0xD5);
575 } else {
576 assert(Ty == IceType_i32);
577 emitUint8(0x38);
578 emitUint8(0x40);
579 }
580 emitOperand(dst, src);
581 }
582
583 void AssemblerX8632::pmuludq(Type /* Ty */, XmmRegister dst, XmmRegister src) {
584 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
585 emitUint8(0x66);
586 emitUint8(0x0F);
587 emitUint8(0xF4);
588 emitXmmRegisterOperand(dst, src);
589 }
590
591 void AssemblerX8632::pmuludq(Type /* Ty */, XmmRegister dst,
592 const Address &src) {
593 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
594 emitUint8(0x66);
595 emitUint8(0x0F);
596 emitUint8(0xF4);
597 emitOperand(dst, src);
598 }
599
600 void AssemblerX8632::por(Type /* Ty */, XmmRegister dst, XmmRegister src) {
601 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
602 emitUint8(0x66);
603 emitUint8(0x0F);
604 emitUint8(0xEB);
605 emitXmmRegisterOperand(dst, src);
606 }
607
608 void AssemblerX8632::por(Type /* Ty */, XmmRegister dst, const Address &src) {
609 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
610 emitUint8(0x66);
611 emitUint8(0x0F);
612 emitUint8(0xEB);
613 emitOperand(dst, src);
614 }
615
616 void AssemblerX8632::psub(Type Ty, XmmRegister dst, XmmRegister src) {
617 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
618 emitUint8(0x66);
619 emitUint8(0x0F);
620 if (isByteSizedArithType(Ty)) {
621 emitUint8(0xF8);
622 } else if (Ty == IceType_i16) {
623 emitUint8(0xF9);
624 } else {
625 emitUint8(0xFA);
626 }
627 emitXmmRegisterOperand(dst, src);
628 }
629
630 void AssemblerX8632::psub(Type Ty, XmmRegister dst, const Address &src) {
631 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
632 emitUint8(0x66);
633 emitUint8(0x0F);
634 if (isByteSizedArithType(Ty)) {
635 emitUint8(0xF8);
636 } else if (Ty == IceType_i16) {
637 emitUint8(0xF9);
638 } else {
639 emitUint8(0xFA);
640 }
641 emitOperand(dst, src);
642 }
643
644 void AssemblerX8632::pxor(Type /* Ty */, XmmRegister dst, XmmRegister src) {
645 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
646 emitUint8(0x66);
647 emitUint8(0x0F);
648 emitUint8(0xEF);
649 emitXmmRegisterOperand(dst, src);
650 }
651
652 void AssemblerX8632::pxor(Type /* Ty */, XmmRegister dst, const Address &src) {
653 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
654 emitUint8(0x66);
655 emitUint8(0x0F);
656 emitUint8(0xEF);
657 emitOperand(dst, src);
658 }
659
660 void AssemblerX8632::psll(Type Ty, XmmRegister dst, XmmRegister src) {
661 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
662 emitUint8(0x66);
663 emitUint8(0x0F);
664 if (Ty == IceType_i16) {
665 emitUint8(0xF1);
666 } else {
667 assert(Ty == IceType_i32);
668 emitUint8(0xF2);
669 }
670 emitXmmRegisterOperand(dst, src);
671 }
672
673 void AssemblerX8632::psll(Type Ty, XmmRegister dst, const Address &src) {
674 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
675 emitUint8(0x66);
676 emitUint8(0x0F);
677 if (Ty == IceType_i16) {
678 emitUint8(0xF1);
679 } else {
680 assert(Ty == IceType_i32);
681 emitUint8(0xF2);
682 }
683 emitOperand(dst, src);
684 }
685
686 void AssemblerX8632::psll(Type Ty, XmmRegister dst, const Immediate &imm) {
687 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
688 assert(imm.is_int8());
689 emitUint8(0x66);
690 emitUint8(0x0F);
691 if (Ty == IceType_i16) {
692 emitUint8(0x71);
693 } else {
694 assert(Ty == IceType_i32);
695 emitUint8(0x72);
696 }
697 emitRegisterOperand(6, dst);
698 emitUint8(imm.value() & 0xFF);
699 }
700
701 void AssemblerX8632::psra(Type Ty, XmmRegister dst, XmmRegister src) {
702 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
703 emitUint8(0x66);
704 emitUint8(0x0F);
705 if (Ty == IceType_i16) {
706 emitUint8(0xE1);
707 } else {
708 assert(Ty == IceType_i32);
709 emitUint8(0xE2);
710 }
711 emitXmmRegisterOperand(dst, src);
712 }
713
714 void AssemblerX8632::psra(Type Ty, XmmRegister dst, const Address &src) {
715 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
716 emitUint8(0x66);
717 emitUint8(0x0F);
718 if (Ty == IceType_i16) {
719 emitUint8(0xE1);
720 } else {
721 assert(Ty == IceType_i32);
722 emitUint8(0xE2);
723 }
724 emitOperand(dst, src);
725 }
726
727 void AssemblerX8632::psra(Type Ty, XmmRegister dst, const Immediate &imm) {
728 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
729 assert(imm.is_int8());
730 emitUint8(0x66);
731 emitUint8(0x0F);
732 if (Ty == IceType_i16) {
733 emitUint8(0x71);
734 } else {
735 assert(Ty == IceType_i32);
736 emitUint8(0x72);
737 }
738 emitRegisterOperand(4, dst);
739 emitUint8(imm.value() & 0xFF);
740 }
741
742 void AssemblerX8632::psrl(Type Ty, XmmRegister dst, XmmRegister src) {
743 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
744 emitUint8(0x66);
745 emitUint8(0x0F);
746 if (Ty == IceType_i16) {
747 emitUint8(0xD1);
748 } else if (Ty == IceType_f64) {
749 emitUint8(0xD3);
750 } else {
751 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
752 emitUint8(0xD2);
753 }
754 emitXmmRegisterOperand(dst, src);
755 }
756
757 void AssemblerX8632::psrl(Type Ty, XmmRegister dst, const Address &src) {
758 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
759 emitUint8(0x66);
760 emitUint8(0x0F);
761 if (Ty == IceType_i16) {
762 emitUint8(0xD1);
763 } else if (Ty == IceType_f64) {
764 emitUint8(0xD3);
765 } else {
766 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
767 emitUint8(0xD2);
768 }
769 emitOperand(dst, src);
770 }
771
772 void AssemblerX8632::psrl(Type Ty, XmmRegister dst, const Immediate &imm) {
773 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
774 assert(imm.is_int8());
775 emitUint8(0x66);
776 emitUint8(0x0F);
777 if (Ty == IceType_i16) {
778 emitUint8(0x71);
779 } else if (Ty == IceType_f64) {
780 emitUint8(0x73);
781 } else {
782 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
783 emitUint8(0x72);
784 }
785 emitRegisterOperand(2, dst);
786 emitUint8(imm.value() & 0xFF);
787 }
788
789 // {add,sub,mul,div}ps are given a Ty parameter for consistency with
790 // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows
791 // addpd, etc., we can use the Ty parameter to decide on adding
792 // a 0x66 prefix.
793 void AssemblerX8632::addps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
794 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
795 emitUint8(0x0F);
796 emitUint8(0x58);
797 emitXmmRegisterOperand(dst, src);
798 }
799
800 void AssemblerX8632::addps(Type /* Ty */, XmmRegister dst, const Address &src) {
801 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
802 emitUint8(0x0F);
803 emitUint8(0x58);
804 emitOperand(dst, src);
805 }
806
807 void AssemblerX8632::subps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
808 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
809 emitUint8(0x0F);
810 emitUint8(0x5C);
811 emitXmmRegisterOperand(dst, src);
812 }
813
814 void AssemblerX8632::subps(Type /* Ty */, XmmRegister dst, const Address &src) {
815 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
816 emitUint8(0x0F);
817 emitUint8(0x5C);
818 emitOperand(dst, src);
819 }
820
821 void AssemblerX8632::divps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
822 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
823 emitUint8(0x0F);
824 emitUint8(0x5E);
825 emitXmmRegisterOperand(dst, src);
826 }
827
828 void AssemblerX8632::divps(Type /* Ty */, XmmRegister dst, const Address &src) {
829 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
830 emitUint8(0x0F);
831 emitUint8(0x5E);
832 emitOperand(dst, src);
833 }
834
835 void AssemblerX8632::mulps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
836 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
837 emitUint8(0x0F);
838 emitUint8(0x59);
839 emitXmmRegisterOperand(dst, src);
840 }
841
842 void AssemblerX8632::mulps(Type /* Ty */, XmmRegister dst, const Address &src) {
843 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
844 emitUint8(0x0F);
845 emitUint8(0x59);
846 emitOperand(dst, src);
847 }
848
849 void AssemblerX8632::minps(XmmRegister dst, XmmRegister src) {
850 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
851 emitUint8(0x0F);
852 emitUint8(0x5D);
853 emitXmmRegisterOperand(dst, src);
854 }
855
856 void AssemblerX8632::maxps(XmmRegister dst, XmmRegister src) {
857 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
858 emitUint8(0x0F);
859 emitUint8(0x5F);
860 emitXmmRegisterOperand(dst, src);
861 }
862
863 void AssemblerX8632::andps(XmmRegister dst, XmmRegister src) {
864 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
865 emitUint8(0x0F);
866 emitUint8(0x54);
867 emitXmmRegisterOperand(dst, src);
868 }
869
870 void AssemblerX8632::andps(XmmRegister dst, const Address &src) {
871 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
872 emitUint8(0x0F);
873 emitUint8(0x54);
874 emitOperand(dst, src);
875 }
876
877 void AssemblerX8632::orps(XmmRegister dst, XmmRegister src) {
878 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
879 emitUint8(0x0F);
880 emitUint8(0x56);
881 emitXmmRegisterOperand(dst, src);
882 }
883
884 void AssemblerX8632::blendvps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
885 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
886 emitUint8(0x66);
887 emitUint8(0x0F);
888 emitUint8(0x38);
889 emitUint8(0x14);
890 emitXmmRegisterOperand(dst, src);
891 }
892
893 void AssemblerX8632::blendvps(Type /* Ty */, XmmRegister dst,
894 const Address &src) {
895 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
896 emitUint8(0x66);
897 emitUint8(0x0F);
898 emitUint8(0x38);
899 emitUint8(0x14);
900 emitOperand(dst, src);
901 }
902
903 void AssemblerX8632::pblendvb(Type /* Ty */, XmmRegister dst, XmmRegister src) {
904 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
905 emitUint8(0x66);
906 emitUint8(0x0F);
907 emitUint8(0x38);
908 emitUint8(0x10);
909 emitXmmRegisterOperand(dst, src);
910 }
911
912 void AssemblerX8632::pblendvb(Type /* Ty */, XmmRegister dst,
913 const Address &src) {
914 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
915 emitUint8(0x66);
916 emitUint8(0x0F);
917 emitUint8(0x38);
918 emitUint8(0x10);
919 emitOperand(dst, src);
920 }
921
922 void AssemblerX8632::cmpps(XmmRegister dst, XmmRegister src,
923 CondX86::CmppsCond CmpCondition) {
924 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
925 emitUint8(0x0F);
926 emitUint8(0xC2);
927 emitXmmRegisterOperand(dst, src);
928 emitUint8(CmpCondition);
929 }
930
931 void AssemblerX8632::cmpps(XmmRegister dst, const Address &src,
932 CondX86::CmppsCond CmpCondition) {
933 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
934 emitUint8(0x0F);
935 emitUint8(0xC2);
936 emitOperand(dst, src);
937 emitUint8(CmpCondition);
938 }
939
940 void AssemblerX8632::sqrtps(XmmRegister dst) {
941 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
942 emitUint8(0x0F);
943 emitUint8(0x51);
944 emitXmmRegisterOperand(dst, dst);
945 }
946
947 void AssemblerX8632::rsqrtps(XmmRegister dst) {
948 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
949 emitUint8(0x0F);
950 emitUint8(0x52);
951 emitXmmRegisterOperand(dst, dst);
952 }
953
954 void AssemblerX8632::reciprocalps(XmmRegister dst) {
955 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
956 emitUint8(0x0F);
957 emitUint8(0x53);
958 emitXmmRegisterOperand(dst, dst);
959 }
960
961 void AssemblerX8632::movhlps(XmmRegister dst, XmmRegister src) {
962 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
963 emitUint8(0x0F);
964 emitUint8(0x12);
965 emitXmmRegisterOperand(dst, src);
966 }
967
968 void AssemblerX8632::movlhps(XmmRegister dst, XmmRegister src) {
969 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
970 emitUint8(0x0F);
971 emitUint8(0x16);
972 emitXmmRegisterOperand(dst, src);
973 }
974
975 void AssemblerX8632::unpcklps(XmmRegister dst, XmmRegister src) {
976 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
977 emitUint8(0x0F);
978 emitUint8(0x14);
979 emitXmmRegisterOperand(dst, src);
980 }
981
982 void AssemblerX8632::unpckhps(XmmRegister dst, XmmRegister src) {
983 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
984 emitUint8(0x0F);
985 emitUint8(0x15);
986 emitXmmRegisterOperand(dst, src);
987 }
988
989 void AssemblerX8632::unpcklpd(XmmRegister dst, XmmRegister src) {
990 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
991 emitUint8(0x66);
992 emitUint8(0x0F);
993 emitUint8(0x14);
994 emitXmmRegisterOperand(dst, src);
995 }
996
997 void AssemblerX8632::unpckhpd(XmmRegister dst, XmmRegister src) {
998 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
999 emitUint8(0x66);
1000 emitUint8(0x0F);
1001 emitUint8(0x15);
1002 emitXmmRegisterOperand(dst, src);
1003 }
1004
1005 void AssemblerX8632::set1ps(XmmRegister dst, GPRRegister tmp1,
1006 const Immediate &imm) {
1007 // Load 32-bit immediate value into tmp1.
1008 mov(IceType_i32, tmp1, imm);
1009 // Move value from tmp1 into dst.
1010 movd(dst, tmp1);
1011 // Broadcast low lane into other three lanes.
1012 shufps(dst, dst, Immediate(0x0));
1013 }
1014
1015 void AssemblerX8632::shufps(XmmRegister dst, XmmRegister src,
1016 const Immediate &imm) {
1017 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1018 emitUint8(0x0F);
1019 emitUint8(0xC6);
1020 emitXmmRegisterOperand(dst, src);
1021 assert(imm.is_uint8());
1022 emitUint8(imm.value());
1023 }
1024
1025 void AssemblerX8632::pshufd(Type /* Ty */, XmmRegister dst, XmmRegister src,
1026 const Immediate &imm) {
1027 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1028 emitUint8(0x66);
1029 emitUint8(0x0F);
1030 emitUint8(0x70);
1031 emitXmmRegisterOperand(dst, src);
1032 assert(imm.is_uint8());
1033 emitUint8(imm.value());
1034 }
1035
1036 void AssemblerX8632::pshufd(Type /* Ty */, XmmRegister dst, const Address &src,
1037 const Immediate &imm) {
1038 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1039 emitUint8(0x66);
1040 emitUint8(0x0F);
1041 emitUint8(0x70);
1042 emitOperand(dst, src);
1043 assert(imm.is_uint8());
1044 emitUint8(imm.value());
1045 }
1046
1047 void AssemblerX8632::shufps(Type /* Ty */, XmmRegister dst, XmmRegister src,
1048 const Immediate &imm) {
1049 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1050 emitUint8(0x0F);
1051 emitUint8(0xC6);
1052 emitXmmRegisterOperand(dst, src);
1053 assert(imm.is_uint8());
1054 emitUint8(imm.value());
1055 }
1056
1057 void AssemblerX8632::shufps(Type /* Ty */, XmmRegister dst, const Address &src,
1058 const Immediate &imm) {
1059 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1060 emitUint8(0x0F);
1061 emitUint8(0xC6);
1062 emitOperand(dst, src);
1063 assert(imm.is_uint8());
1064 emitUint8(imm.value());
1065 }
1066
1067 void AssemblerX8632::minpd(XmmRegister dst, XmmRegister src) {
1068 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1069 emitUint8(0x66);
1070 emitUint8(0x0F);
1071 emitUint8(0x5D);
1072 emitXmmRegisterOperand(dst, src);
1073 }
1074
1075 void AssemblerX8632::maxpd(XmmRegister dst, XmmRegister src) {
1076 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1077 emitUint8(0x66);
1078 emitUint8(0x0F);
1079 emitUint8(0x5F);
1080 emitXmmRegisterOperand(dst, src);
1081 }
1082
1083 void AssemblerX8632::sqrtpd(XmmRegister dst) {
1084 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1085 emitUint8(0x66);
1086 emitUint8(0x0F);
1087 emitUint8(0x51);
1088 emitXmmRegisterOperand(dst, dst);
1089 }
1090
1091 void AssemblerX8632::shufpd(XmmRegister dst, XmmRegister src,
1092 const Immediate &imm) {
1093 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1094 emitUint8(0x66);
1095 emitUint8(0x0F);
1096 emitUint8(0xC6);
1097 emitXmmRegisterOperand(dst, src);
1098 assert(imm.is_uint8());
1099 emitUint8(imm.value());
1100 }
1101
1102 void AssemblerX8632::cvtdq2ps(Type /* Ignore */, XmmRegister dst,
1103 XmmRegister src) {
1104 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1105 emitUint8(0x0F);
1106 emitUint8(0x5B);
1107 emitXmmRegisterOperand(dst, src);
1108 }
1109
1110 void AssemblerX8632::cvtdq2ps(Type /* Ignore */, XmmRegister dst,
1111 const Address &src) {
1112 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1113 emitUint8(0x0F);
1114 emitUint8(0x5B);
1115 emitOperand(dst, src);
1116 }
1117
1118 void AssemblerX8632::cvttps2dq(Type /* Ignore */, XmmRegister dst,
1119 XmmRegister src) {
1120 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1121 emitUint8(0xF3);
1122 emitUint8(0x0F);
1123 emitUint8(0x5B);
1124 emitXmmRegisterOperand(dst, src);
1125 }
1126
1127 void AssemblerX8632::cvttps2dq(Type /* Ignore */, XmmRegister dst,
1128 const Address &src) {
1129 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1130 emitUint8(0xF3);
1131 emitUint8(0x0F);
1132 emitUint8(0x5B);
1133 emitOperand(dst, src);
1134 }
1135
1136 void AssemblerX8632::cvtsi2ss(Type DestTy, XmmRegister dst, GPRRegister src) {
1137 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1138 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1139 emitUint8(0x0F);
1140 emitUint8(0x2A);
1141 emitRegisterOperand(dst, src);
1142 }
1143
1144 void AssemblerX8632::cvtsi2ss(Type DestTy, XmmRegister dst,
1145 const Address &src) {
1146 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1147 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1148 emitUint8(0x0F);
1149 emitUint8(0x2A);
1150 emitOperand(dst, src);
1151 }
1152
1153 void AssemblerX8632::cvtfloat2float(Type SrcTy, XmmRegister dst,
1154 XmmRegister src) {
1155 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1156 // ss2sd or sd2ss
1157 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1158 emitUint8(0x0F);
1159 emitUint8(0x5A);
1160 emitXmmRegisterOperand(dst, src);
1161 }
1162
1163 void AssemblerX8632::cvtfloat2float(Type SrcTy, XmmRegister dst,
1164 const Address &src) {
1165 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1166 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1167 emitUint8(0x0F);
1168 emitUint8(0x5A);
1169 emitOperand(dst, src);
1170 }
1171
1172 void AssemblerX8632::cvttss2si(Type SrcTy, GPRRegister dst, XmmRegister src) {
1173 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1174 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1175 emitUint8(0x0F);
1176 emitUint8(0x2C);
1177 emitXmmRegisterOperand(dst, src);
1178 }
1179
1180 void AssemblerX8632::cvttss2si(Type SrcTy, GPRRegister dst,
1181 const Address &src) {
1182 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1183 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1184 emitUint8(0x0F);
1185 emitUint8(0x2C);
1186 emitOperand(dst, src);
1187 }
1188
1189 void AssemblerX8632::ucomiss(Type Ty, XmmRegister a, XmmRegister b) {
1190 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1191 if (Ty == IceType_f64)
1192 emitUint8(0x66);
1193 emitUint8(0x0F);
1194 emitUint8(0x2E);
1195 emitXmmRegisterOperand(a, b);
1196 }
1197
1198 void AssemblerX8632::ucomiss(Type Ty, XmmRegister a, const Address &b) {
1199 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1200 if (Ty == IceType_f64)
1201 emitUint8(0x66);
1202 emitUint8(0x0F);
1203 emitUint8(0x2E);
1204 emitOperand(a, b);
1205 }
1206
1207 void AssemblerX8632::movmskpd(GPRRegister dst, XmmRegister src) {
1208 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1209 emitUint8(0x66);
1210 emitUint8(0x0F);
1211 emitUint8(0x50);
1212 emitXmmRegisterOperand(dst, src);
1213 }
1214
1215 void AssemblerX8632::movmskps(GPRRegister dst, XmmRegister src) {
1216 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1217 emitUint8(0x0F);
1218 emitUint8(0x50);
1219 emitXmmRegisterOperand(dst, src);
1220 }
1221
1222 void AssemblerX8632::sqrtss(Type Ty, XmmRegister dst, const Address &src) {
1223 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1224 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1225 emitUint8(0x0F);
1226 emitUint8(0x51);
1227 emitOperand(dst, src);
1228 }
1229
1230 void AssemblerX8632::sqrtss(Type Ty, XmmRegister dst, XmmRegister src) {
1231 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1232 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1233 emitUint8(0x0F);
1234 emitUint8(0x51);
1235 emitXmmRegisterOperand(dst, src);
1236 }
1237
1238 void AssemblerX8632::xorpd(XmmRegister dst, const Address &src) {
1239 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1240 emitUint8(0x66);
1241 emitUint8(0x0F);
1242 emitUint8(0x57);
1243 emitOperand(dst, src);
1244 }
1245
1246 void AssemblerX8632::xorpd(XmmRegister dst, XmmRegister src) {
1247 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1248 emitUint8(0x66);
1249 emitUint8(0x0F);
1250 emitUint8(0x57);
1251 emitXmmRegisterOperand(dst, src);
1252 }
1253
1254 void AssemblerX8632::orpd(XmmRegister dst, XmmRegister src) {
1255 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1256 emitUint8(0x66);
1257 emitUint8(0x0F);
1258 emitUint8(0x56);
1259 emitXmmRegisterOperand(dst, src);
1260 }
1261
1262 void AssemblerX8632::xorps(XmmRegister dst, const Address &src) {
1263 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1264 emitUint8(0x0F);
1265 emitUint8(0x57);
1266 emitOperand(dst, src);
1267 }
1268
1269 void AssemblerX8632::xorps(XmmRegister dst, XmmRegister src) {
1270 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1271 emitUint8(0x0F);
1272 emitUint8(0x57);
1273 emitXmmRegisterOperand(dst, src);
1274 }
1275
1276 void AssemblerX8632::andpd(XmmRegister dst, const Address &src) {
1277 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1278 emitUint8(0x66);
1279 emitUint8(0x0F);
1280 emitUint8(0x54);
1281 emitOperand(dst, src);
1282 }
1283
1284 void AssemblerX8632::andpd(XmmRegister dst, XmmRegister src) {
1285 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1286 emitUint8(0x66);
1287 emitUint8(0x0F);
1288 emitUint8(0x54);
1289 emitXmmRegisterOperand(dst, src);
1290 }
1291
1292 void AssemblerX8632::insertps(Type Ty, XmmRegister dst, XmmRegister src,
1293 const Immediate &imm) {
1294 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1295 assert(imm.is_uint8());
1296 assert(isVectorFloatingType(Ty));
1297 (void)Ty;
1298 emitUint8(0x66);
1299 emitUint8(0x0F);
1300 emitUint8(0x3A);
1301 emitUint8(0x21);
1302 emitXmmRegisterOperand(dst, src);
1303 emitUint8(imm.value());
1304 }
1305
1306 void AssemblerX8632::insertps(Type Ty, XmmRegister dst, const Address &src,
1307 const Immediate &imm) {
1308 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1309 assert(imm.is_uint8());
1310 assert(isVectorFloatingType(Ty));
1311 (void)Ty;
1312 emitUint8(0x66);
1313 emitUint8(0x0F);
1314 emitUint8(0x3A);
1315 emitUint8(0x21);
1316 emitOperand(dst, src);
1317 emitUint8(imm.value());
1318 }
1319
1320 void AssemblerX8632::pinsr(Type Ty, XmmRegister dst, GPRRegister src,
1321 const Immediate &imm) {
1322 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1323 assert(imm.is_uint8());
1324 if (Ty == IceType_i16) {
1325 emitUint8(0x66);
1326 emitUint8(0x0F);
1327 emitUint8(0xC4);
1328 emitXmmRegisterOperand(dst, XmmRegister(src));
1329 emitUint8(imm.value());
1330 } else {
1331 emitUint8(0x66);
1332 emitUint8(0x0F);
1333 emitUint8(0x3A);
1334 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1335 emitXmmRegisterOperand(dst, XmmRegister(src));
1336 emitUint8(imm.value());
1337 }
1338 }
1339
1340 void AssemblerX8632::pinsr(Type Ty, XmmRegister dst, const Address &src,
1341 const Immediate &imm) {
1342 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1343 assert(imm.is_uint8());
1344 if (Ty == IceType_i16) {
1345 emitUint8(0x66);
1346 emitUint8(0x0F);
1347 emitUint8(0xC4);
1348 emitOperand(dst, src);
1349 emitUint8(imm.value());
1350 } else {
1351 emitUint8(0x66);
1352 emitUint8(0x0F);
1353 emitUint8(0x3A);
1354 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1355 emitOperand(dst, src);
1356 emitUint8(imm.value());
1357 }
1358 }
1359
1360 void AssemblerX8632::pextr(Type Ty, GPRRegister dst, XmmRegister src,
1361 const Immediate &imm) {
1362 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1363 assert(imm.is_uint8());
1364 if (Ty == IceType_i16) {
1365 emitUint8(0x66);
1366 emitUint8(0x0F);
1367 emitUint8(0xC5);
1368 emitXmmRegisterOperand(XmmRegister(dst), src);
1369 emitUint8(imm.value());
1370 } else {
1371 emitUint8(0x66);
1372 emitUint8(0x0F);
1373 emitUint8(0x3A);
1374 emitUint8(isByteSizedType(Ty) ? 0x14 : 0x16);
1375 // SSE 4.1 versions are "MRI" because dst can be mem, while
1376 // pextrw (SSE2) is RMI because dst must be reg.
1377 emitXmmRegisterOperand(src, XmmRegister(dst));
1378 emitUint8(imm.value());
1379 }
1380 }
1381
1382 void AssemblerX8632::pmovsxdq(XmmRegister dst, XmmRegister src) {
1383 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1384 emitUint8(0x66);
1385 emitUint8(0x0F);
1386 emitUint8(0x38);
1387 emitUint8(0x25);
1388 emitXmmRegisterOperand(dst, src);
1389 }
1390
1391 void AssemblerX8632::pcmpeq(Type Ty, XmmRegister dst, XmmRegister src) {
1392 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1393 emitUint8(0x66);
1394 emitUint8(0x0F);
1395 if (isByteSizedArithType(Ty)) {
1396 emitUint8(0x74);
1397 } else if (Ty == IceType_i16) {
1398 emitUint8(0x75);
1399 } else {
1400 emitUint8(0x76);
1401 }
1402 emitXmmRegisterOperand(dst, src);
1403 }
1404
1405 void AssemblerX8632::pcmpeq(Type Ty, XmmRegister dst, const Address &src) {
1406 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1407 emitUint8(0x66);
1408 emitUint8(0x0F);
1409 if (isByteSizedArithType(Ty)) {
1410 emitUint8(0x74);
1411 } else if (Ty == IceType_i16) {
1412 emitUint8(0x75);
1413 } else {
1414 emitUint8(0x76);
1415 }
1416 emitOperand(dst, src);
1417 }
1418
1419 void AssemblerX8632::pcmpgt(Type Ty, XmmRegister dst, XmmRegister src) {
1420 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1421 emitUint8(0x66);
1422 emitUint8(0x0F);
1423 if (isByteSizedArithType(Ty)) {
1424 emitUint8(0x64);
1425 } else if (Ty == IceType_i16) {
1426 emitUint8(0x65);
1427 } else {
1428 emitUint8(0x66);
1429 }
1430 emitXmmRegisterOperand(dst, src);
1431 }
1432
1433 void AssemblerX8632::pcmpgt(Type Ty, XmmRegister dst, const Address &src) {
1434 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1435 emitUint8(0x66);
1436 emitUint8(0x0F);
1437 if (isByteSizedArithType(Ty)) {
1438 emitUint8(0x64);
1439 } else if (Ty == IceType_i16) {
1440 emitUint8(0x65);
1441 } else {
1442 emitUint8(0x66);
1443 }
1444 emitOperand(dst, src);
1445 }
1446
1447 void AssemblerX8632::roundsd(XmmRegister dst, XmmRegister src,
1448 RoundingMode mode) {
1449 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1450 emitUint8(0x66);
1451 emitUint8(0x0F);
1452 emitUint8(0x3A);
1453 emitUint8(0x0B);
1454 emitXmmRegisterOperand(dst, src);
1455 // Mask precision exeption.
1456 emitUint8(static_cast<uint8_t>(mode) | 0x8);
1457 }
1458
1459 void AssemblerX8632::fnstcw(const Address &dst) {
1460 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1461 emitUint8(0xD9);
1462 emitOperand(7, dst);
1463 }
1464
1465 void AssemblerX8632::fldcw(const Address &src) {
1466 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1467 emitUint8(0xD9);
1468 emitOperand(5, src);
1469 }
1470
1471 void AssemblerX8632::fistpl(const Address &dst) {
1472 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1473 emitUint8(0xDF);
1474 emitOperand(7, dst);
1475 }
1476
1477 void AssemblerX8632::fistps(const Address &dst) {
1478 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1479 emitUint8(0xDB);
1480 emitOperand(3, dst);
1481 }
1482
1483 void AssemblerX8632::fildl(const Address &src) {
1484 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1485 emitUint8(0xDF);
1486 emitOperand(5, src);
1487 }
1488
1489 void AssemblerX8632::filds(const Address &src) {
1490 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1491 emitUint8(0xDB);
1492 emitOperand(0, src);
1493 }
1494
1495 void AssemblerX8632::fincstp() {
1496 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1497 emitUint8(0xD9);
1498 emitUint8(0xF7);
1499 }
1500
1501 void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Immediate &imm) {
1502 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1503 if (isByteSizedType(Ty)) {
1504 emitComplexI8(7, Operand(reg), imm);
1505 return;
1506 }
1507 if (Ty == IceType_i16)
1508 emitOperandSizeOverride();
1509 emitComplex(Ty, 7, Operand(reg), imm);
1510 }
1511
1512 void AssemblerX8632::cmp(Type Ty, GPRRegister reg0, GPRRegister reg1) {
1513 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1514 if (Ty == IceType_i16)
1515 emitOperandSizeOverride();
1516 if (isByteSizedType(Ty))
1517 emitUint8(0x3A);
1518 else
1519 emitUint8(0x3B);
1520 emitRegisterOperand(reg0, reg1);
1521 }
1522
1523 void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Address &address) {
1524 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1525 if (Ty == IceType_i16)
1526 emitOperandSizeOverride();
1527 if (isByteSizedType(Ty))
1528 emitUint8(0x3A);
1529 else
1530 emitUint8(0x3B);
1531 emitOperand(reg, address);
1532 }
1533
1534 void AssemblerX8632::cmp(Type Ty, const Address &address, GPRRegister reg) {
1535 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1536 if (Ty == IceType_i16)
1537 emitOperandSizeOverride();
1538 if (isByteSizedType(Ty))
1539 emitUint8(0x38);
1540 else
1541 emitUint8(0x39);
1542 emitOperand(reg, address);
1543 }
1544
1545 void AssemblerX8632::cmp(Type Ty, const Address &address,
1546 const Immediate &imm) {
1547 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1548 if (isByteSizedType(Ty)) {
1549 emitComplexI8(7, address, imm);
1550 return;
1551 }
1552 if (Ty == IceType_i16)
1553 emitOperandSizeOverride();
1554 emitComplex(Ty, 7, address, imm);
1555 }
1556
1557 void AssemblerX8632::test(Type Ty, GPRRegister reg1, GPRRegister reg2) {
1558 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1559 if (Ty == IceType_i16)
1560 emitOperandSizeOverride();
1561 if (isByteSizedType(Ty))
1562 emitUint8(0x84);
1563 else
1564 emitUint8(0x85);
1565 emitRegisterOperand(reg1, reg2);
1566 }
1567
1568 void AssemblerX8632::test(Type Ty, const Address &addr, GPRRegister reg) {
1569 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1570 if (Ty == IceType_i16)
1571 emitOperandSizeOverride();
1572 if (isByteSizedType(Ty))
1573 emitUint8(0x84);
1574 else
1575 emitUint8(0x85);
1576 emitOperand(reg, addr);
1577 }
1578
1579 void AssemblerX8632::test(Type Ty, GPRRegister reg,
1580 const Immediate &immediate) {
1581 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1582 // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
1583 // we only test the byte register to keep the encoding short.
1584 // This is legal even if the register had high bits set since
1585 // this only sets flags registers based on the "AND" of the two operands,
1586 // and the immediate had zeros at those high bits.
1587 if (immediate.is_uint8() && reg < 4) {
1588 // Use zero-extended 8-bit immediate.
1589 if (reg == RegX8632::Encoded_Reg_eax) {
1590 emitUint8(0xA8);
1591 } else {
1592 emitUint8(0xF6);
1593 emitUint8(0xC0 + reg);
1594 }
1595 emitUint8(immediate.value() & 0xFF);
1596 } else if (reg == RegX8632::Encoded_Reg_eax) {
1597 // Use short form if the destination is EAX.
1598 if (Ty == IceType_i16)
1599 emitOperandSizeOverride();
1600 emitUint8(0xA9);
1601 emitImmediate(Ty, immediate);
1602 } else {
1603 if (Ty == IceType_i16)
1604 emitOperandSizeOverride();
1605 emitUint8(0xF7);
1606 emitRegisterOperand(0, reg);
1607 emitImmediate(Ty, immediate);
1608 }
1609 }
1610
1611 void AssemblerX8632::test(Type Ty, const Address &addr,
1612 const Immediate &immediate) {
1613 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1614 // If the immediate is short, we only test the byte addr to keep the
1615 // encoding short.
1616 if (immediate.is_uint8()) {
1617 // Use zero-extended 8-bit immediate.
1618 emitUint8(0xF6);
1619 emitOperand(0, addr);
1620 emitUint8(immediate.value() & 0xFF);
1621 } else {
1622 if (Ty == IceType_i16)
1623 emitOperandSizeOverride();
1624 emitUint8(0xF7);
1625 emitOperand(0, addr);
1626 emitImmediate(Ty, immediate);
1627 }
1628 }
1629
1630 void AssemblerX8632::And(Type Ty, GPRRegister dst, GPRRegister src) {
1631 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1632 if (Ty == IceType_i16)
1633 emitOperandSizeOverride();
1634 if (isByteSizedType(Ty))
1635 emitUint8(0x22);
1636 else
1637 emitUint8(0x23);
1638 emitRegisterOperand(dst, src);
1639 }
1640
1641 void AssemblerX8632::And(Type Ty, GPRRegister dst, const Address &address) {
1642 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1643 if (Ty == IceType_i16)
1644 emitOperandSizeOverride();
1645 if (isByteSizedType(Ty))
1646 emitUint8(0x22);
1647 else
1648 emitUint8(0x23);
1649 emitOperand(dst, address);
1650 }
1651
1652 void AssemblerX8632::And(Type Ty, GPRRegister dst, const Immediate &imm) {
1653 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1654 if (isByteSizedType(Ty)) {
1655 emitComplexI8(4, Operand(dst), imm);
1656 return;
1657 }
1658 if (Ty == IceType_i16)
1659 emitOperandSizeOverride();
1660 emitComplex(Ty, 4, Operand(dst), imm);
1661 }
1662
1663 void AssemblerX8632::Or(Type Ty, GPRRegister dst, GPRRegister src) {
1664 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1665 if (Ty == IceType_i16)
1666 emitOperandSizeOverride();
1667 if (isByteSizedType(Ty))
1668 emitUint8(0x0A);
1669 else
1670 emitUint8(0x0B);
1671 emitRegisterOperand(dst, src);
1672 }
1673
1674 void AssemblerX8632::Or(Type Ty, GPRRegister dst, const Address &address) {
1675 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1676 if (Ty == IceType_i16)
1677 emitOperandSizeOverride();
1678 if (isByteSizedType(Ty))
1679 emitUint8(0x0A);
1680 else
1681 emitUint8(0x0B);
1682 emitOperand(dst, address);
1683 }
1684
1685 void AssemblerX8632::Or(Type Ty, GPRRegister dst, const Immediate &imm) {
1686 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1687 if (isByteSizedType(Ty)) {
1688 emitComplexI8(1, Operand(dst), imm);
1689 return;
1690 }
1691 if (Ty == IceType_i16)
1692 emitOperandSizeOverride();
1693 emitComplex(Ty, 1, Operand(dst), imm);
1694 }
1695
1696 void AssemblerX8632::Xor(Type Ty, GPRRegister dst, GPRRegister src) {
1697 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1698 if (Ty == IceType_i16)
1699 emitOperandSizeOverride();
1700 if (isByteSizedType(Ty))
1701 emitUint8(0x32);
1702 else
1703 emitUint8(0x33);
1704 emitRegisterOperand(dst, src);
1705 }
1706
1707 void AssemblerX8632::Xor(Type Ty, GPRRegister dst, const Address &address) {
1708 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1709 if (Ty == IceType_i16)
1710 emitOperandSizeOverride();
1711 if (isByteSizedType(Ty))
1712 emitUint8(0x32);
1713 else
1714 emitUint8(0x33);
1715 emitOperand(dst, address);
1716 }
1717
1718 void AssemblerX8632::Xor(Type Ty, GPRRegister dst, const Immediate &imm) {
1719 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1720 if (isByteSizedType(Ty)) {
1721 emitComplexI8(6, Operand(dst), imm);
1722 return;
1723 }
1724 if (Ty == IceType_i16)
1725 emitOperandSizeOverride();
1726 emitComplex(Ty, 6, Operand(dst), imm);
1727 }
1728
1729 void AssemblerX8632::add(Type Ty, GPRRegister dst, GPRRegister src) {
1730 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1731 if (Ty == IceType_i16)
1732 emitOperandSizeOverride();
1733 if (isByteSizedArithType(Ty))
1734 emitUint8(0x02);
1735 else
1736 emitUint8(0x03);
1737 emitRegisterOperand(dst, src);
1738 }
1739
1740 void AssemblerX8632::add(Type Ty, GPRRegister reg, const Address &address) {
1741 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1742 if (Ty == IceType_i16)
1743 emitOperandSizeOverride();
1744 if (isByteSizedArithType(Ty))
1745 emitUint8(0x02);
1746 else
1747 emitUint8(0x03);
1748 emitOperand(reg, address);
1749 }
1750
1751 void AssemblerX8632::add(Type Ty, GPRRegister reg, const Immediate &imm) {
1752 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1753 if (isByteSizedArithType(Ty)) {
1754 emitComplexI8(0, Operand(reg), imm);
1755 return;
1756 }
1757 if (Ty == IceType_i16)
1758 emitOperandSizeOverride();
1759 emitComplex(Ty, 0, Operand(reg), imm);
1760 }
1761
1762 void AssemblerX8632::adc(Type Ty, GPRRegister dst, GPRRegister src) {
1763 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1764 if (Ty == IceType_i16)
1765 emitOperandSizeOverride();
1766 if (isByteSizedArithType(Ty))
1767 emitUint8(0x12);
1768 else
1769 emitUint8(0x13);
1770 emitRegisterOperand(dst, src);
1771 }
1772
1773 void AssemblerX8632::adc(Type Ty, GPRRegister dst, const Address &address) {
1774 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1775 if (Ty == IceType_i16)
1776 emitOperandSizeOverride();
1777 if (isByteSizedArithType(Ty))
1778 emitUint8(0x12);
1779 else
1780 emitUint8(0x13);
1781 emitOperand(dst, address);
1782 }
1783
1784 void AssemblerX8632::adc(Type Ty, GPRRegister reg, const Immediate &imm) {
1785 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1786 if (isByteSizedArithType(Ty)) {
1787 emitComplexI8(2, Operand(reg), imm);
1788 return;
1789 }
1790 if (Ty == IceType_i16)
1791 emitOperandSizeOverride();
1792 emitComplex(Ty, 2, Operand(reg), imm);
1793 }
1794
1795 void AssemblerX8632::sub(Type Ty, GPRRegister dst, GPRRegister src) {
1796 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1797 if (Ty == IceType_i16)
1798 emitOperandSizeOverride();
1799 if (isByteSizedArithType(Ty))
1800 emitUint8(0x2A);
1801 else
1802 emitUint8(0x2B);
1803 emitRegisterOperand(dst, src);
1804 }
1805
1806 void AssemblerX8632::sub(Type Ty, GPRRegister reg, const Address &address) {
1807 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1808 if (Ty == IceType_i16)
1809 emitOperandSizeOverride();
1810 if (isByteSizedArithType(Ty))
1811 emitUint8(0x2A);
1812 else
1813 emitUint8(0x2B);
1814 emitOperand(reg, address);
1815 }
1816
1817 void AssemblerX8632::sub(Type Ty, GPRRegister reg, const Immediate &imm) {
1818 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1819 if (isByteSizedArithType(Ty)) {
1820 emitComplexI8(5, Operand(reg), imm);
1821 return;
1822 }
1823 if (Ty == IceType_i16)
1824 emitOperandSizeOverride();
1825 emitComplex(Ty, 5, Operand(reg), imm);
1826 }
1827
1828 void AssemblerX8632::sbb(Type Ty, GPRRegister dst, GPRRegister src) {
1829 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1830 if (Ty == IceType_i16)
1831 emitOperandSizeOverride();
1832 if (isByteSizedArithType(Ty))
1833 emitUint8(0x1A);
1834 else
1835 emitUint8(0x1B);
1836 emitRegisterOperand(dst, src);
1837 }
1838
1839 void AssemblerX8632::sbb(Type Ty, GPRRegister dst, const Address &address) {
1840 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1841 if (Ty == IceType_i16)
1842 emitOperandSizeOverride();
1843 if (isByteSizedArithType(Ty))
1844 emitUint8(0x1A);
1845 else
1846 emitUint8(0x1B);
1847 emitOperand(dst, address);
1848 }
1849
1850 void AssemblerX8632::sbb(Type Ty, GPRRegister reg, const Immediate &imm) {
1851 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1852 if (isByteSizedArithType(Ty)) {
1853 emitComplexI8(3, Operand(reg), imm);
1854 return;
1855 }
1856 if (Ty == IceType_i16)
1857 emitOperandSizeOverride();
1858 emitComplex(Ty, 3, Operand(reg), imm);
1859 }
1860
1861 void AssemblerX8632::cbw() {
1862 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1863 emitOperandSizeOverride();
1864 emitUint8(0x98);
1865 }
1866
1867 void AssemblerX8632::cwd() {
1868 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1869 emitOperandSizeOverride();
1870 emitUint8(0x99);
1871 }
1872
1873 void AssemblerX8632::cdq() {
1874 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1875 emitUint8(0x99);
1876 }
1877
1878 void AssemblerX8632::div(Type Ty, GPRRegister reg) {
1879 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1880 if (Ty == IceType_i16)
1881 emitOperandSizeOverride();
1882 if (isByteSizedArithType(Ty))
1883 emitUint8(0xF6);
1884 else
1885 emitUint8(0xF7);
1886 emitRegisterOperand(6, reg);
1887 }
1888
1889 void AssemblerX8632::div(Type Ty, const Address &addr) {
1890 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1891 if (Ty == IceType_i16)
1892 emitOperandSizeOverride();
1893 if (isByteSizedArithType(Ty))
1894 emitUint8(0xF6);
1895 else
1896 emitUint8(0xF7);
1897 emitOperand(6, addr);
1898 }
1899
1900 void AssemblerX8632::idiv(Type Ty, GPRRegister reg) {
1901 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1902 if (Ty == IceType_i16)
1903 emitOperandSizeOverride();
1904 if (isByteSizedArithType(Ty))
1905 emitUint8(0xF6);
1906 else
1907 emitUint8(0xF7);
1908 emitRegisterOperand(7, reg);
1909 }
1910
1911 void AssemblerX8632::idiv(Type Ty, const Address &addr) {
1912 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1913 if (Ty == IceType_i16)
1914 emitOperandSizeOverride();
1915 if (isByteSizedArithType(Ty))
1916 emitUint8(0xF6);
1917 else
1918 emitUint8(0xF7);
1919 emitOperand(7, addr);
1920 }
1921
1922 void AssemblerX8632::imul(Type Ty, GPRRegister dst, GPRRegister src) {
1923 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1924 assert(Ty == IceType_i16 || Ty == IceType_i32);
1925 if (Ty == IceType_i16)
1926 emitOperandSizeOverride();
1927 emitUint8(0x0F);
1928 emitUint8(0xAF);
1929 emitRegisterOperand(dst, src);
1930 }
1931
1932 void AssemblerX8632::imul(Type Ty, GPRRegister reg, const Address &address) {
1933 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1934 assert(Ty == IceType_i16 || Ty == IceType_i32);
1935 if (Ty == IceType_i16)
1936 emitOperandSizeOverride();
1937 emitUint8(0x0F);
1938 emitUint8(0xAF);
1939 emitOperand(reg, address);
1940 }
1941
1942 void AssemblerX8632::imul(Type Ty, GPRRegister reg, const Immediate &imm) {
1943 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1944 assert(Ty == IceType_i16 || Ty == IceType_i32);
1945 if (Ty == IceType_i16)
1946 emitOperandSizeOverride();
1947 if (imm.is_int8()) {
1948 emitUint8(0x6B);
1949 emitRegisterOperand(reg, reg);
1950 emitUint8(imm.value() & 0xFF);
1951 } else {
1952 emitUint8(0x69);
1953 emitRegisterOperand(reg, reg);
1954 emitImmediate(Ty, imm);
1955 }
1956 }
1957
1958 void AssemblerX8632::imul(Type Ty, GPRRegister reg) {
1959 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1960 if (Ty == IceType_i16)
1961 emitOperandSizeOverride();
1962 if (isByteSizedArithType(Ty))
1963 emitUint8(0xF6);
1964 else
1965 emitUint8(0xF7);
1966 emitRegisterOperand(5, reg);
1967 }
1968
1969 void AssemblerX8632::imul(Type Ty, const Address &address) {
1970 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1971 if (Ty == IceType_i16)
1972 emitOperandSizeOverride();
1973 if (isByteSizedArithType(Ty))
1974 emitUint8(0xF6);
1975 else
1976 emitUint8(0xF7);
1977 emitOperand(5, address);
1978 }
1979
1980 void AssemblerX8632::mul(Type Ty, GPRRegister reg) {
1981 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1982 if (Ty == IceType_i16)
1983 emitOperandSizeOverride();
1984 if (isByteSizedArithType(Ty))
1985 emitUint8(0xF6);
1986 else
1987 emitUint8(0xF7);
1988 emitRegisterOperand(4, reg);
1989 }
1990
1991 void AssemblerX8632::mul(Type Ty, const Address &address) {
1992 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1993 if (Ty == IceType_i16)
1994 emitOperandSizeOverride();
1995 if (isByteSizedArithType(Ty))
1996 emitUint8(0xF6);
1997 else
1998 emitUint8(0xF7);
1999 emitOperand(4, address);
2000 }
2001
2002 void AssemblerX8632::incl(GPRRegister reg) {
2003 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2004 emitUint8(0x40 + reg);
2005 }
2006
2007 void AssemblerX8632::incl(const Address &address) {
2008 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2009 emitUint8(0xFF);
2010 emitOperand(0, address);
2011 }
2012
2013 void AssemblerX8632::decl(GPRRegister reg) {
2014 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2015 emitUint8(0x48 + reg);
2016 }
2017
2018 void AssemblerX8632::decl(const Address &address) {
2019 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2020 emitUint8(0xFF);
2021 emitOperand(1, address);
2022 }
2023
2024 void AssemblerX8632::rol(Type Ty, GPRRegister reg, const Immediate &imm) {
2025 emitGenericShift(0, Ty, reg, imm);
2026 }
2027
2028 void AssemblerX8632::rol(Type Ty, GPRRegister operand, GPRRegister shifter) {
2029 emitGenericShift(0, Ty, Operand(operand), shifter);
2030 }
2031
2032 void AssemblerX8632::rol(Type Ty, const Address &operand, GPRRegister shifter) {
2033 emitGenericShift(0, Ty, operand, shifter);
2034 }
2035
2036 void AssemblerX8632::shl(Type Ty, GPRRegister reg, const Immediate &imm) {
2037 emitGenericShift(4, Ty, reg, imm);
2038 }
2039
2040 void AssemblerX8632::shl(Type Ty, GPRRegister operand, GPRRegister shifter) {
2041 emitGenericShift(4, Ty, Operand(operand), shifter);
2042 }
2043
2044 void AssemblerX8632::shl(Type Ty, const Address &operand, GPRRegister shifter) {
2045 emitGenericShift(4, Ty, operand, shifter);
2046 }
2047
2048 void AssemblerX8632::shr(Type Ty, GPRRegister reg, const Immediate &imm) {
2049 emitGenericShift(5, Ty, reg, imm);
2050 }
2051
2052 void AssemblerX8632::shr(Type Ty, GPRRegister operand, GPRRegister shifter) {
2053 emitGenericShift(5, Ty, Operand(operand), shifter);
2054 }
2055
2056 void AssemblerX8632::shr(Type Ty, const Address &operand, GPRRegister shifter) {
2057 emitGenericShift(5, Ty, operand, shifter);
2058 }
2059
2060 void AssemblerX8632::sar(Type Ty, GPRRegister reg, const Immediate &imm) {
2061 emitGenericShift(7, Ty, reg, imm);
2062 }
2063
2064 void AssemblerX8632::sar(Type Ty, GPRRegister operand, GPRRegister shifter) {
2065 emitGenericShift(7, Ty, Operand(operand), shifter);
2066 }
2067
2068 void AssemblerX8632::sar(Type Ty, const Address &address, GPRRegister shifter) {
2069 emitGenericShift(7, Ty, address, shifter);
2070 }
2071
2072 void AssemblerX8632::shld(Type Ty, GPRRegister dst, GPRRegister src) {
2073 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2074 assert(Ty == IceType_i16 || Ty == IceType_i32);
2075 if (Ty == IceType_i16)
2076 emitOperandSizeOverride();
2077 emitUint8(0x0F);
2078 emitUint8(0xA5);
2079 emitRegisterOperand(src, dst);
2080 }
2081
2082 void AssemblerX8632::shld(Type Ty, GPRRegister dst, GPRRegister src,
2083 const Immediate &imm) {
2084 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2085 assert(Ty == IceType_i16 || Ty == IceType_i32);
2086 assert(imm.is_int8());
2087 if (Ty == IceType_i16)
2088 emitOperandSizeOverride();
2089 emitUint8(0x0F);
2090 emitUint8(0xA4);
2091 emitRegisterOperand(src, dst);
2092 emitUint8(imm.value() & 0xFF);
2093 }
2094
2095 void AssemblerX8632::shld(Type Ty, const Address &operand, GPRRegister src) {
2096 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2097 assert(Ty == IceType_i16 || Ty == IceType_i32);
2098 if (Ty == IceType_i16)
2099 emitOperandSizeOverride();
2100 emitUint8(0x0F);
2101 emitUint8(0xA5);
2102 emitOperand(src, operand);
2103 }
2104
2105 void AssemblerX8632::shrd(Type Ty, GPRRegister dst, GPRRegister src) {
2106 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2107 assert(Ty == IceType_i16 || Ty == IceType_i32);
2108 if (Ty == IceType_i16)
2109 emitOperandSizeOverride();
2110 emitUint8(0x0F);
2111 emitUint8(0xAD);
2112 emitRegisterOperand(src, dst);
2113 }
2114
2115 void AssemblerX8632::shrd(Type Ty, GPRRegister dst, GPRRegister src,
2116 const Immediate &imm) {
2117 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2118 assert(Ty == IceType_i16 || Ty == IceType_i32);
2119 assert(imm.is_int8());
2120 if (Ty == IceType_i16)
2121 emitOperandSizeOverride();
2122 emitUint8(0x0F);
2123 emitUint8(0xAC);
2124 emitRegisterOperand(src, dst);
2125 emitUint8(imm.value() & 0xFF);
2126 }
2127
2128 void AssemblerX8632::shrd(Type Ty, const Address &dst, GPRRegister src) {
2129 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2130 assert(Ty == IceType_i16 || Ty == IceType_i32);
2131 if (Ty == IceType_i16)
2132 emitOperandSizeOverride();
2133 emitUint8(0x0F);
2134 emitUint8(0xAD);
2135 emitOperand(src, dst);
2136 }
2137
2138 void AssemblerX8632::neg(Type Ty, GPRRegister reg) {
2139 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2140 if (Ty == IceType_i16)
2141 emitOperandSizeOverride();
2142 if (isByteSizedArithType(Ty))
2143 emitUint8(0xF6);
2144 else
2145 emitUint8(0xF7);
2146 emitRegisterOperand(3, reg);
2147 }
2148
2149 void AssemblerX8632::neg(Type Ty, const Address &addr) {
2150 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2151 if (Ty == IceType_i16)
2152 emitOperandSizeOverride();
2153 if (isByteSizedArithType(Ty))
2154 emitUint8(0xF6);
2155 else
2156 emitUint8(0xF7);
2157 emitOperand(3, addr);
2158 }
2159
2160 void AssemblerX8632::notl(GPRRegister reg) {
2161 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2162 emitUint8(0xF7);
2163 emitUint8(0xD0 | reg);
2164 }
2165
2166 void AssemblerX8632::bswap(Type Ty, GPRRegister reg) {
2167 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2168 assert(Ty == IceType_i32);
2169 (void)Ty;
2170 emitUint8(0x0F);
2171 emitUint8(0xC8 | reg);
2172 }
2173
2174 void AssemblerX8632::bsf(Type Ty, GPRRegister dst, GPRRegister src) {
2175 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2176 assert(Ty == IceType_i16 || Ty == IceType_i32);
2177 if (Ty == IceType_i16)
2178 emitOperandSizeOverride();
2179 emitUint8(0x0F);
2180 emitUint8(0xBC);
2181 emitRegisterOperand(dst, src);
2182 }
2183
2184 void AssemblerX8632::bsf(Type Ty, GPRRegister dst, const Address &src) {
2185 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2186 assert(Ty == IceType_i16 || Ty == IceType_i32);
2187 if (Ty == IceType_i16)
2188 emitOperandSizeOverride();
2189 emitUint8(0x0F);
2190 emitUint8(0xBC);
2191 emitOperand(dst, src);
2192 }
2193
2194 void AssemblerX8632::bsr(Type Ty, GPRRegister dst, GPRRegister src) {
2195 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2196 assert(Ty == IceType_i16 || Ty == IceType_i32);
2197 if (Ty == IceType_i16)
2198 emitOperandSizeOverride();
2199 emitUint8(0x0F);
2200 emitUint8(0xBD);
2201 emitRegisterOperand(dst, src);
2202 }
2203
2204 void AssemblerX8632::bsr(Type Ty, GPRRegister dst, const Address &src) {
2205 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2206 assert(Ty == IceType_i16 || Ty == IceType_i32);
2207 if (Ty == IceType_i16)
2208 emitOperandSizeOverride();
2209 emitUint8(0x0F);
2210 emitUint8(0xBD);
2211 emitOperand(dst, src);
2212 }
2213
2214 void AssemblerX8632::bt(GPRRegister base, GPRRegister offset) {
2215 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2216 emitUint8(0x0F);
2217 emitUint8(0xA3);
2218 emitRegisterOperand(offset, base);
2219 }
2220
2221 void AssemblerX8632::ret() {
2222 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2223 emitUint8(0xC3);
2224 }
2225
2226 void AssemblerX8632::ret(const Immediate &imm) {
2227 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2228 emitUint8(0xC2);
2229 assert(imm.is_uint16());
2230 emitUint8(imm.value() & 0xFF);
2231 emitUint8((imm.value() >> 8) & 0xFF);
2232 }
2233
2234 void AssemblerX8632::nop(int size) {
2235 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2236 // There are nops up to size 15, but for now just provide up to size 8.
2237 assert(0 < size && size <= MAX_NOP_SIZE);
2238 switch (size) {
2239 case 1:
2240 emitUint8(0x90);
2241 break;
2242 case 2:
2243 emitUint8(0x66);
2244 emitUint8(0x90);
2245 break;
2246 case 3:
2247 emitUint8(0x0F);
2248 emitUint8(0x1F);
2249 emitUint8(0x00);
2250 break;
2251 case 4:
2252 emitUint8(0x0F);
2253 emitUint8(0x1F);
2254 emitUint8(0x40);
2255 emitUint8(0x00);
2256 break;
2257 case 5:
2258 emitUint8(0x0F);
2259 emitUint8(0x1F);
2260 emitUint8(0x44);
2261 emitUint8(0x00);
2262 emitUint8(0x00);
2263 break;
2264 case 6:
2265 emitUint8(0x66);
2266 emitUint8(0x0F);
2267 emitUint8(0x1F);
2268 emitUint8(0x44);
2269 emitUint8(0x00);
2270 emitUint8(0x00);
2271 break;
2272 case 7:
2273 emitUint8(0x0F);
2274 emitUint8(0x1F);
2275 emitUint8(0x80);
2276 emitUint8(0x00);
2277 emitUint8(0x00);
2278 emitUint8(0x00);
2279 emitUint8(0x00);
2280 break;
2281 case 8:
2282 emitUint8(0x0F);
2283 emitUint8(0x1F);
2284 emitUint8(0x84);
2285 emitUint8(0x00);
2286 emitUint8(0x00);
2287 emitUint8(0x00);
2288 emitUint8(0x00);
2289 emitUint8(0x00);
2290 break;
2291 default:
2292 llvm_unreachable("Unimplemented");
2293 }
2294 }
2295
2296 void AssemblerX8632::int3() {
2297 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2298 emitUint8(0xCC);
2299 }
2300
2301 void AssemblerX8632::hlt() {
2302 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2303 emitUint8(0xF4);
2304 }
2305
2306 void AssemblerX8632::ud2() {
2307 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2308 emitUint8(0x0F);
2309 emitUint8(0x0B);
2310 }
2311
2312 void AssemblerX8632::j(CondX86::BrCond condition, Label *label, bool near) {
2313 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2314 if (label->IsBound()) {
2315 static const int kShortSize = 2;
2316 static const int kLongSize = 6;
2317 intptr_t offset = label->Position() - Buffer.size();
2318 assert(offset <= 0);
2319 if (Utils::IsInt(8, offset - kShortSize)) {
2320 // TODO(stichnot): Here and in jmp(), we may need to be more
2321 // conservative about the backward branch distance if the branch
2322 // instruction is within a bundle_lock sequence, because the
2323 // distance may increase when padding is added. This isn't an
2324 // issue for branches outside a bundle_lock, because if padding
2325 // is added, the retry may change it to a long backward branch
2326 // without affecting any of the bookkeeping.
2327 emitUint8(0x70 + condition);
2328 emitUint8((offset - kShortSize) & 0xFF);
2329 } else {
2330 emitUint8(0x0F);
2331 emitUint8(0x80 + condition);
2332 emitInt32(offset - kLongSize);
2333 }
2334 } else if (near) {
2335 emitUint8(0x70 + condition);
2336 emitNearLabelLink(label);
2337 } else {
2338 emitUint8(0x0F);
2339 emitUint8(0x80 + condition);
2340 emitLabelLink(label);
2341 }
2342 }
2343
2344 void AssemblerX8632::j(CondX86::BrCond condition,
2345 const ConstantRelocatable *label) {
2346 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2347 emitUint8(0x0F);
2348 emitUint8(0x80 + condition);
2349 emitFixup(this->createFixup(llvm::ELF::R_386_PC32, label));
2350 emitInt32(-4);
2351 }
2352
2353 void AssemblerX8632::jmp(GPRRegister reg) {
2354 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2355 emitUint8(0xFF);
2356 emitRegisterOperand(4, reg);
2357 }
2358
2359 void AssemblerX8632::jmp(Label *label, bool near) {
2360 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2361 if (label->IsBound()) {
2362 static const int kShortSize = 2;
2363 static const int kLongSize = 5;
2364 intptr_t offset = label->Position() - Buffer.size();
2365 assert(offset <= 0);
2366 if (Utils::IsInt(8, offset - kShortSize)) {
2367 emitUint8(0xEB);
2368 emitUint8((offset - kShortSize) & 0xFF);
2369 } else {
2370 emitUint8(0xE9);
2371 emitInt32(offset - kLongSize);
2372 }
2373 } else if (near) {
2374 emitUint8(0xEB);
2375 emitNearLabelLink(label);
2376 } else {
2377 emitUint8(0xE9);
2378 emitLabelLink(label);
2379 }
2380 }
2381
2382 void AssemblerX8632::jmp(const ConstantRelocatable *label) {
2383 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2384 emitUint8(0xE9);
2385 emitFixup(this->createFixup(llvm::ELF::R_386_PC32, label));
2386 emitInt32(-4);
2387 }
2388
2389 void AssemblerX8632::mfence() {
2390 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2391 emitUint8(0x0F);
2392 emitUint8(0xAE);
2393 emitUint8(0xF0);
2394 }
2395
2396 void AssemblerX8632::lock() {
2397 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2398 emitUint8(0xF0);
2399 }
2400
2401 void AssemblerX8632::cmpxchg(Type Ty, const Address &address, GPRRegister reg,
2402 bool Locked) {
2403 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2404 if (Ty == IceType_i16)
2405 emitOperandSizeOverride();
2406 if (Locked)
2407 emitUint8(0xF0);
2408 emitUint8(0x0F);
2409 if (isByteSizedArithType(Ty))
2410 emitUint8(0xB0);
2411 else
2412 emitUint8(0xB1);
2413 emitOperand(reg, address);
2414 }
2415
2416 void AssemblerX8632::cmpxchg8b(const Address &address, bool Locked) {
2417 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2418 if (Locked)
2419 emitUint8(0xF0);
2420 emitUint8(0x0F);
2421 emitUint8(0xC7);
2422 emitOperand(1, address);
2423 }
2424
2425 void AssemblerX8632::xadd(Type Ty, const Address &addr, GPRRegister reg,
2426 bool Locked) {
2427 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2428 if (Ty == IceType_i16)
2429 emitOperandSizeOverride();
2430 if (Locked)
2431 emitUint8(0xF0);
2432 emitUint8(0x0F);
2433 if (isByteSizedArithType(Ty))
2434 emitUint8(0xC0);
2435 else
2436 emitUint8(0xC1);
2437 emitOperand(reg, addr);
2438 }
2439
2440 void AssemblerX8632::xchg(Type Ty, const Address &addr, GPRRegister reg) {
2441 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2442 if (Ty == IceType_i16)
2443 emitOperandSizeOverride();
2444 if (isByteSizedArithType(Ty))
2445 emitUint8(0x86);
2446 else
2447 emitUint8(0x87);
2448 emitOperand(reg, addr);
2449 }
2450
2451 void AssemblerX8632::emitSegmentOverride(uint8_t prefix) {
2452 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2453 emitUint8(prefix);
2454 }
2455
2456 void AssemblerX8632::align(intptr_t alignment, intptr_t offset) {
2457 assert(llvm::isPowerOf2_32(alignment));
2458 intptr_t pos = offset + Buffer.getPosition();
2459 intptr_t mod = pos & (alignment - 1);
2460 if (mod == 0) {
2461 return;
2462 }
2463 intptr_t bytes_needed = alignment - mod;
2464 while (bytes_needed > MAX_NOP_SIZE) {
2465 nop(MAX_NOP_SIZE);
2466 bytes_needed -= MAX_NOP_SIZE;
2467 }
2468 if (bytes_needed) {
2469 nop(bytes_needed);
2470 }
2471 assert(((offset + Buffer.getPosition()) & (alignment - 1)) == 0);
2472 }
2473
2474 void AssemblerX8632::bind(Label *label) {
2475 intptr_t bound = Buffer.size();
2476 assert(!label->IsBound()); // Labels can only be bound once.
2477 while (label->IsLinked()) {
2478 intptr_t position = label->LinkPosition();
2479 intptr_t next = Buffer.load<int32_t>(position);
2480 Buffer.store<int32_t>(position, bound - (position + 4));
2481 label->position_ = next;
2482 }
2483 while (label->HasNear()) {
2484 intptr_t position = label->NearPosition();
2485 intptr_t offset = bound - (position + 1);
2486 assert(Utils::IsInt(8, offset));
2487 Buffer.store<int8_t>(position, offset);
2488 }
2489 label->BindTo(bound);
2490 }
2491
2492 void AssemblerX8632::emitOperand(int rm, const Operand &operand) {
2493 assert(rm >= 0 && rm < 8);
2494 const intptr_t length = operand.length_;
2495 assert(length > 0);
2496 // Emit the ModRM byte updated with the given RM value.
2497 assert((operand.encoding_[0] & 0x38) == 0);
2498 emitUint8(operand.encoding_[0] + (rm << 3));
2499 if (operand.fixup()) {
2500 emitFixup(operand.fixup());
2501 }
2502 // Emit the rest of the encoded operand.
2503 for (intptr_t i = 1; i < length; i++) {
2504 emitUint8(operand.encoding_[i]);
2505 }
2506 }
2507
2508 void AssemblerX8632::emitImmediate(Type Ty, const Immediate &imm) {
2509 if (Ty == IceType_i16) {
2510 assert(!imm.fixup());
2511 emitInt16(imm.value());
2512 } else {
2513 if (imm.fixup()) {
2514 emitFixup(imm.fixup());
2515 }
2516 emitInt32(imm.value());
2517 }
2518 }
2519
2520 void AssemblerX8632::emitComplexI8(int rm, const Operand &operand,
2521 const Immediate &immediate) {
2522 assert(rm >= 0 && rm < 8);
2523 assert(immediate.is_int8());
2524 if (operand.IsRegister(RegX8632::Encoded_Reg_eax)) {
2525 // Use short form if the destination is al.
2526 emitUint8(0x04 + (rm << 3));
2527 emitUint8(immediate.value() & 0xFF);
2528 } else {
2529 // Use sign-extended 8-bit immediate.
2530 emitUint8(0x80);
2531 emitOperand(rm, operand);
2532 emitUint8(immediate.value() & 0xFF);
2533 }
2534 }
2535
2536 void AssemblerX8632::emitComplex(Type Ty, int rm, const Operand &operand,
2537 const Immediate &immediate) {
2538 assert(rm >= 0 && rm < 8);
2539 if (immediate.is_int8()) {
2540 // Use sign-extended 8-bit immediate.
2541 emitUint8(0x83);
2542 emitOperand(rm, operand);
2543 emitUint8(immediate.value() & 0xFF);
2544 } else if (operand.IsRegister(RegX8632::Encoded_Reg_eax)) {
2545 // Use short form if the destination is eax.
2546 emitUint8(0x05 + (rm << 3));
2547 emitImmediate(Ty, immediate);
2548 } else {
2549 emitUint8(0x81);
2550 emitOperand(rm, operand);
2551 emitImmediate(Ty, immediate);
2552 }
2553 }
2554
2555 void AssemblerX8632::emitLabel(Label *label, intptr_t instruction_size) {
2556 if (label->IsBound()) {
2557 intptr_t offset = label->Position() - Buffer.size();
2558 assert(offset <= 0);
2559 emitInt32(offset - instruction_size);
2560 } else {
2561 emitLabelLink(label);
2562 }
2563 }
2564
2565 void AssemblerX8632::emitLabelLink(Label *Label) {
2566 assert(!Label->IsBound());
2567 intptr_t Position = Buffer.size();
2568 emitInt32(Label->position_);
2569 if (!getPreliminary())
2570 Label->LinkTo(Position);
2571 }
2572
2573 void AssemblerX8632::emitNearLabelLink(Label *label) {
2574 assert(!label->IsBound());
2575 intptr_t position = Buffer.size();
2576 emitUint8(0);
2577 if (!getPreliminary())
2578 label->NearLinkTo(position);
2579 }
2580
2581 void AssemblerX8632::emitGenericShift(int rm, Type Ty, GPRRegister reg,
2582 const Immediate &imm) {
2583 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2584 assert(imm.is_int8());
2585 if (Ty == IceType_i16)
2586 emitOperandSizeOverride();
2587 if (imm.value() == 1) {
2588 emitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1);
2589 emitOperand(rm, Operand(reg));
2590 } else {
2591 emitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1);
2592 emitOperand(rm, Operand(reg));
2593 emitUint8(imm.value() & 0xFF);
2594 }
2595 }
2596
2597 void AssemblerX8632::emitGenericShift(int rm, Type Ty, const Operand &operand,
2598 GPRRegister shifter) {
2599 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2600 assert(shifter == RegX8632::Encoded_Reg_ecx);
2601 (void)shifter;
2602 if (Ty == IceType_i16)
2603 emitOperandSizeOverride();
2604 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3);
2605 emitOperand(rm, operand);
2606 }
2607
2608 } // end of namespace X8632
2609 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceAssemblerX8632.h ('k') | src/IceCfg.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698