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

Side by Side Diff: src/IceAssemblerX8632.cpp

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

Powered by Google App Engine
This is Rietveld 408576698