OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 // | 4 // |
5 // Modified by the Subzero authors. | 5 // Modified by the Subzero authors. |
6 // | 6 // |
7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// | 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// |
8 // | 8 // |
9 // The Subzero Code Generator | 9 // The Subzero Code Generator |
10 // | 10 // |
(...skipping 17 matching lines...) Expand all Loading... |
28 const Type BrokenType = IceType_i32; | 28 const Type BrokenType = IceType_i32; |
29 | 29 |
30 class DirectCallRelocation : public AssemblerFixup { | 30 class DirectCallRelocation : public AssemblerFixup { |
31 public: | 31 public: |
32 static DirectCallRelocation *create(Assembler *Asm, FixupKind Kind, | 32 static DirectCallRelocation *create(Assembler *Asm, FixupKind Kind, |
33 const ConstantRelocatable *Sym) { | 33 const ConstantRelocatable *Sym) { |
34 return new (Asm->Allocate<DirectCallRelocation>()) | 34 return new (Asm->Allocate<DirectCallRelocation>()) |
35 DirectCallRelocation(Kind, Sym); | 35 DirectCallRelocation(Kind, Sym); |
36 } | 36 } |
37 | 37 |
38 void Process(const MemoryRegion ®ion, intptr_t position) { | 38 void Process(const MemoryRegion ®ion, intptr_t position) override { |
39 // Direct calls are relative to the following instruction on x86. | 39 // Direct calls are relative to the following instruction on x86. |
40 int32_t pointer = region.Load<int32_t>(position); | 40 int32_t pointer = region.Load<int32_t>(position); |
41 int32_t delta = region.start() + position + sizeof(int32_t); | 41 int32_t delta = region.start() + position + sizeof(int32_t); |
42 region.Store<int32_t>(position, pointer - delta); | 42 region.Store<int32_t>(position, pointer - delta); |
43 } | 43 } |
44 | 44 |
45 private: | 45 private: |
46 DirectCallRelocation(FixupKind Kind, const ConstantRelocatable *Sym) | 46 DirectCallRelocation(FixupKind Kind, const ConstantRelocatable *Sym) |
47 : AssemblerFixup(Kind, Sym) {} | 47 : AssemblerFixup(Kind, Sym) {} |
48 }; | 48 }; |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 void AssemblerX86::movq(XmmRegister dst, const Address &src) { | 350 void AssemblerX86::movq(XmmRegister dst, const Address &src) { |
351 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 351 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
352 EmitUint8(0xF3); | 352 EmitUint8(0xF3); |
353 EmitUint8(0x0F); | 353 EmitUint8(0x0F); |
354 EmitUint8(0x7E); | 354 EmitUint8(0x7E); |
355 EmitOperand(dst, Operand(src)); | 355 EmitOperand(dst, Operand(src)); |
356 } | 356 } |
357 | 357 |
358 void AssemblerX86::addss(Type Ty, XmmRegister dst, XmmRegister src) { | 358 void AssemblerX86::addss(Type Ty, XmmRegister dst, XmmRegister src) { |
359 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 359 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
360 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 360 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
361 EmitUint8(0x0F); | 361 EmitUint8(0x0F); |
362 EmitUint8(0x58); | 362 EmitUint8(0x58); |
363 EmitXmmRegisterOperand(dst, src); | 363 EmitXmmRegisterOperand(dst, src); |
364 } | 364 } |
365 | 365 |
366 void AssemblerX86::addss(Type Ty, XmmRegister dst, const Address &src) { | 366 void AssemblerX86::addss(Type Ty, XmmRegister dst, const Address &src) { |
367 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 367 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
368 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 368 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
369 EmitUint8(0x0F); | 369 EmitUint8(0x0F); |
370 EmitUint8(0x58); | 370 EmitUint8(0x58); |
371 EmitOperand(dst, src); | 371 EmitOperand(dst, src); |
372 } | 372 } |
373 | 373 |
374 void AssemblerX86::subss(Type Ty, XmmRegister dst, XmmRegister src) { | 374 void AssemblerX86::subss(Type Ty, XmmRegister dst, XmmRegister src) { |
375 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 375 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
376 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 376 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
377 EmitUint8(0x0F); | 377 EmitUint8(0x0F); |
378 EmitUint8(0x5C); | 378 EmitUint8(0x5C); |
379 EmitXmmRegisterOperand(dst, src); | 379 EmitXmmRegisterOperand(dst, src); |
380 } | 380 } |
381 | 381 |
382 void AssemblerX86::subss(Type Ty, XmmRegister dst, const Address &src) { | 382 void AssemblerX86::subss(Type Ty, XmmRegister dst, const Address &src) { |
383 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 383 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
384 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 384 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
385 EmitUint8(0x0F); | 385 EmitUint8(0x0F); |
386 EmitUint8(0x5C); | 386 EmitUint8(0x5C); |
387 EmitOperand(dst, src); | 387 EmitOperand(dst, src); |
388 } | 388 } |
389 | 389 |
390 void AssemblerX86::mulss(Type Ty, XmmRegister dst, XmmRegister src) { | 390 void AssemblerX86::mulss(Type Ty, XmmRegister dst, XmmRegister src) { |
391 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 391 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
392 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 392 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
393 EmitUint8(0x0F); | 393 EmitUint8(0x0F); |
394 EmitUint8(0x59); | 394 EmitUint8(0x59); |
395 EmitXmmRegisterOperand(dst, src); | 395 EmitXmmRegisterOperand(dst, src); |
396 } | 396 } |
397 | 397 |
398 void AssemblerX86::mulss(Type Ty, XmmRegister dst, const Address &src) { | 398 void AssemblerX86::mulss(Type Ty, XmmRegister dst, const Address &src) { |
399 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 399 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
400 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 400 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
401 EmitUint8(0x0F); | 401 EmitUint8(0x0F); |
402 EmitUint8(0x59); | 402 EmitUint8(0x59); |
403 EmitOperand(dst, src); | 403 EmitOperand(dst, src); |
404 } | 404 } |
405 | 405 |
406 void AssemblerX86::divss(Type Ty, XmmRegister dst, XmmRegister src) { | 406 void AssemblerX86::divss(Type Ty, XmmRegister dst, XmmRegister src) { |
407 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 407 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
408 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 408 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
409 EmitUint8(0x0F); | 409 EmitUint8(0x0F); |
410 EmitUint8(0x5E); | 410 EmitUint8(0x5E); |
411 EmitXmmRegisterOperand(dst, src); | 411 EmitXmmRegisterOperand(dst, src); |
412 } | 412 } |
413 | 413 |
414 void AssemblerX86::divss(Type Ty, XmmRegister dst, const Address &src) { | 414 void AssemblerX86::divss(Type Ty, XmmRegister dst, const Address &src) { |
415 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 415 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
416 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 416 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
417 EmitUint8(0x0F); | 417 EmitUint8(0x0F); |
418 EmitUint8(0x5E); | 418 EmitUint8(0x5E); |
419 EmitOperand(dst, src); | 419 EmitOperand(dst, src); |
420 } | 420 } |
421 | 421 |
422 void AssemblerX86::flds(const Address &src) { | 422 void AssemblerX86::flds(const Address &src) { |
423 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 423 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
424 EmitUint8(0xD9); | 424 EmitUint8(0xD9); |
425 EmitOperand(0, src); | 425 EmitOperand(0, src); |
426 } | 426 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 473 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
474 EmitUint8(0x0F); | 474 EmitUint8(0x0F); |
475 EmitUint8(0x11); | 475 EmitUint8(0x11); |
476 EmitOperand(src, dst); | 476 EmitOperand(src, dst); |
477 } | 477 } |
478 | 478 |
479 void AssemblerX86::padd(Type Ty, XmmRegister dst, XmmRegister src) { | 479 void AssemblerX86::padd(Type Ty, XmmRegister dst, XmmRegister src) { |
480 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 480 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
481 EmitUint8(0x66); | 481 EmitUint8(0x66); |
482 EmitUint8(0x0F); | 482 EmitUint8(0x0F); |
483 if (Ty == IceType_i8 || Ty == IceType_i1) { | 483 if (isByteSizedArithType(Ty)) { |
484 EmitUint8(0xFC); | 484 EmitUint8(0xFC); |
485 } else if (Ty == IceType_i16) { | 485 } else if (Ty == IceType_i16) { |
486 EmitUint8(0xFD); | 486 EmitUint8(0xFD); |
487 } else { | 487 } else { |
488 EmitUint8(0xFE); | 488 EmitUint8(0xFE); |
489 } | 489 } |
490 EmitXmmRegisterOperand(dst, src); | 490 EmitXmmRegisterOperand(dst, src); |
491 } | 491 } |
492 | 492 |
493 void AssemblerX86::padd(Type Ty, XmmRegister dst, const Address &src) { | 493 void AssemblerX86::padd(Type Ty, XmmRegister dst, const Address &src) { |
494 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 494 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
495 EmitUint8(0x66); | 495 EmitUint8(0x66); |
496 EmitUint8(0x0F); | 496 EmitUint8(0x0F); |
497 if (Ty == IceType_i8 || Ty == IceType_i1) { | 497 if (isByteSizedArithType(Ty)) { |
498 EmitUint8(0xFC); | 498 EmitUint8(0xFC); |
499 } else if (Ty == IceType_i16) { | 499 } else if (Ty == IceType_i16) { |
500 EmitUint8(0xFD); | 500 EmitUint8(0xFD); |
501 } else { | 501 } else { |
502 EmitUint8(0xFE); | 502 EmitUint8(0xFE); |
503 } | 503 } |
504 EmitOperand(dst, src); | 504 EmitOperand(dst, src); |
505 } | 505 } |
506 | 506 |
507 void AssemblerX86::pand(Type /* Ty */, XmmRegister dst, XmmRegister src) { | 507 void AssemblerX86::pand(Type /* Ty */, XmmRegister dst, XmmRegister src) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
565 EmitUint8(0x66); | 565 EmitUint8(0x66); |
566 EmitUint8(0x0F); | 566 EmitUint8(0x0F); |
567 EmitUint8(0xEB); | 567 EmitUint8(0xEB); |
568 EmitOperand(dst, src); | 568 EmitOperand(dst, src); |
569 } | 569 } |
570 | 570 |
571 void AssemblerX86::psub(Type Ty, XmmRegister dst, XmmRegister src) { | 571 void AssemblerX86::psub(Type Ty, XmmRegister dst, XmmRegister src) { |
572 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 572 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
573 EmitUint8(0x66); | 573 EmitUint8(0x66); |
574 EmitUint8(0x0F); | 574 EmitUint8(0x0F); |
575 if (Ty == IceType_i8 || Ty == IceType_i1) { | 575 if (isByteSizedArithType(Ty)) { |
576 EmitUint8(0xF8); | 576 EmitUint8(0xF8); |
577 } else if (Ty == IceType_i16) { | 577 } else if (Ty == IceType_i16) { |
578 EmitUint8(0xF9); | 578 EmitUint8(0xF9); |
579 } else { | 579 } else { |
580 EmitUint8(0xFA); | 580 EmitUint8(0xFA); |
581 } | 581 } |
582 EmitXmmRegisterOperand(dst, src); | 582 EmitXmmRegisterOperand(dst, src); |
583 } | 583 } |
584 | 584 |
585 void AssemblerX86::psub(Type Ty, XmmRegister dst, const Address &src) { | 585 void AssemblerX86::psub(Type Ty, XmmRegister dst, const Address &src) { |
586 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 586 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
587 EmitUint8(0x66); | 587 EmitUint8(0x66); |
588 EmitUint8(0x0F); | 588 EmitUint8(0x0F); |
589 if (Ty == IceType_i8 || Ty == IceType_i1) { | 589 if (isByteSizedArithType(Ty)) { |
590 EmitUint8(0xF8); | 590 EmitUint8(0xF8); |
591 } else if (Ty == IceType_i16) { | 591 } else if (Ty == IceType_i16) { |
592 EmitUint8(0xF9); | 592 EmitUint8(0xF9); |
593 } else { | 593 } else { |
594 EmitUint8(0xFA); | 594 EmitUint8(0xFA); |
595 } | 595 } |
596 EmitOperand(dst, src); | 596 EmitOperand(dst, src); |
597 } | 597 } |
598 | 598 |
599 void AssemblerX86::pxor(Type /* Ty */, XmmRegister dst, XmmRegister src) { | 599 void AssemblerX86::pxor(Type /* Ty */, XmmRegister dst, XmmRegister src) { |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 | 960 |
961 void AssemblerX86::movmskps(GPRRegister dst, XmmRegister src) { | 961 void AssemblerX86::movmskps(GPRRegister dst, XmmRegister src) { |
962 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 962 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
963 EmitUint8(0x0F); | 963 EmitUint8(0x0F); |
964 EmitUint8(0x50); | 964 EmitUint8(0x50); |
965 EmitXmmRegisterOperand(dst, src); | 965 EmitXmmRegisterOperand(dst, src); |
966 } | 966 } |
967 | 967 |
968 void AssemblerX86::sqrtss(Type Ty, XmmRegister dst, const Address &src) { | 968 void AssemblerX86::sqrtss(Type Ty, XmmRegister dst, const Address &src) { |
969 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 969 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
970 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 970 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
971 EmitUint8(0x0F); | 971 EmitUint8(0x0F); |
972 EmitUint8(0x51); | 972 EmitUint8(0x51); |
973 EmitOperand(dst, src); | 973 EmitOperand(dst, src); |
974 } | 974 } |
975 | 975 |
976 void AssemblerX86::sqrtss(Type Ty, XmmRegister dst, XmmRegister src) { | 976 void AssemblerX86::sqrtss(Type Ty, XmmRegister dst, XmmRegister src) { |
977 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 977 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
978 EmitUint8(Ty == IceType_f32 ? 0xF3 : 0xF2); | 978 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
979 EmitUint8(0x0F); | 979 EmitUint8(0x0F); |
980 EmitUint8(0x51); | 980 EmitUint8(0x51); |
981 EmitXmmRegisterOperand(dst, src); | 981 EmitXmmRegisterOperand(dst, src); |
982 } | 982 } |
983 | 983 |
984 void AssemblerX86::xorpd(XmmRegister dst, const Address &src) { | 984 void AssemblerX86::xorpd(XmmRegister dst, const Address &src) { |
985 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 985 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
986 EmitUint8(0x66); | 986 EmitUint8(0x66); |
987 EmitUint8(0x0F); | 987 EmitUint8(0x0F); |
988 EmitUint8(0x57); | 988 EmitUint8(0x57); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1194 EmitUint8(0xF7); | 1194 EmitUint8(0xF7); |
1195 EmitOperand(0, Operand(reg)); | 1195 EmitOperand(0, Operand(reg)); |
1196 EmitImmediate(BrokenType, immediate); | 1196 EmitImmediate(BrokenType, immediate); |
1197 } | 1197 } |
1198 } | 1198 } |
1199 | 1199 |
1200 void AssemblerX86::And(Type Ty, GPRRegister dst, GPRRegister src) { | 1200 void AssemblerX86::And(Type Ty, GPRRegister dst, GPRRegister src) { |
1201 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1201 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1202 if (Ty == IceType_i16) | 1202 if (Ty == IceType_i16) |
1203 EmitOperandSizeOverride(); | 1203 EmitOperandSizeOverride(); |
1204 if (Ty == IceType_i8 || Ty == IceType_i1) | 1204 if (isByteSizedType(Ty)) |
1205 EmitUint8(0x22); | 1205 EmitUint8(0x22); |
1206 else | 1206 else |
1207 EmitUint8(0x23); | 1207 EmitUint8(0x23); |
1208 EmitRegisterOperand(dst, src); | 1208 EmitRegisterOperand(dst, src); |
1209 } | 1209 } |
1210 | 1210 |
1211 void AssemblerX86::And(Type Ty, GPRRegister dst, const Address &address) { | 1211 void AssemblerX86::And(Type Ty, GPRRegister dst, const Address &address) { |
1212 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1212 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1213 if (Ty == IceType_i16) | 1213 if (Ty == IceType_i16) |
1214 EmitOperandSizeOverride(); | 1214 EmitOperandSizeOverride(); |
1215 if (Ty == IceType_i8 || Ty == IceType_i1) | 1215 if (isByteSizedType(Ty)) |
1216 EmitUint8(0x22); | 1216 EmitUint8(0x22); |
1217 else | 1217 else |
1218 EmitUint8(0x23); | 1218 EmitUint8(0x23); |
1219 EmitOperand(dst, address); | 1219 EmitOperand(dst, address); |
1220 } | 1220 } |
1221 | 1221 |
1222 void AssemblerX86::And(Type Ty, GPRRegister dst, const Immediate &imm) { | 1222 void AssemblerX86::And(Type Ty, GPRRegister dst, const Immediate &imm) { |
1223 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1223 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1224 if (Ty == IceType_i8 || Ty == IceType_i1) { | 1224 if (isByteSizedType(Ty)) { |
1225 EmitComplexI8(4, Operand(dst), imm); | 1225 EmitComplexI8(4, Operand(dst), imm); |
1226 return; | 1226 return; |
1227 } | 1227 } |
1228 if (Ty == IceType_i16) | 1228 if (Ty == IceType_i16) |
1229 EmitOperandSizeOverride(); | 1229 EmitOperandSizeOverride(); |
1230 EmitComplex(Ty, 4, Operand(dst), imm); | 1230 EmitComplex(Ty, 4, Operand(dst), imm); |
1231 } | 1231 } |
1232 | 1232 |
1233 void AssemblerX86::Or(Type Ty, GPRRegister dst, GPRRegister src) { | 1233 void AssemblerX86::Or(Type Ty, GPRRegister dst, GPRRegister src) { |
1234 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1234 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1235 if (Ty == IceType_i16) | 1235 if (Ty == IceType_i16) |
1236 EmitOperandSizeOverride(); | 1236 EmitOperandSizeOverride(); |
1237 if (Ty == IceType_i8 || Ty == IceType_i1) | 1237 if (isByteSizedType(Ty)) |
1238 EmitUint8(0x0A); | 1238 EmitUint8(0x0A); |
1239 else | 1239 else |
1240 EmitUint8(0x0B); | 1240 EmitUint8(0x0B); |
1241 EmitRegisterOperand(dst, src); | 1241 EmitRegisterOperand(dst, src); |
1242 } | 1242 } |
1243 | 1243 |
1244 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Address &address) { | 1244 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Address &address) { |
1245 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1245 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1246 if (Ty == IceType_i16) | 1246 if (Ty == IceType_i16) |
1247 EmitOperandSizeOverride(); | 1247 EmitOperandSizeOverride(); |
1248 if (Ty == IceType_i8 || Ty == IceType_i1) | 1248 if (isByteSizedType(Ty)) |
1249 EmitUint8(0x0A); | 1249 EmitUint8(0x0A); |
1250 else | 1250 else |
1251 EmitUint8(0x0B); | 1251 EmitUint8(0x0B); |
1252 EmitOperand(dst, address); | 1252 EmitOperand(dst, address); |
1253 } | 1253 } |
1254 | 1254 |
1255 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Immediate &imm) { | 1255 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Immediate &imm) { |
1256 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1256 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1257 if (Ty == IceType_i8 || Ty == IceType_i1) { | 1257 if (isByteSizedType(Ty)) { |
1258 EmitComplexI8(1, Operand(dst), imm); | 1258 EmitComplexI8(1, Operand(dst), imm); |
1259 return; | 1259 return; |
1260 } | 1260 } |
1261 if (Ty == IceType_i16) | 1261 if (Ty == IceType_i16) |
1262 EmitOperandSizeOverride(); | 1262 EmitOperandSizeOverride(); |
1263 EmitComplex(Ty, 1, Operand(dst), imm); | 1263 EmitComplex(Ty, 1, Operand(dst), imm); |
1264 } | 1264 } |
1265 | 1265 |
1266 void AssemblerX86::Xor(Type Ty, GPRRegister dst, GPRRegister src) { | 1266 void AssemblerX86::Xor(Type Ty, GPRRegister dst, GPRRegister src) { |
1267 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1267 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1268 if (Ty == IceType_i16) | 1268 if (Ty == IceType_i16) |
1269 EmitOperandSizeOverride(); | 1269 EmitOperandSizeOverride(); |
1270 if (Ty == IceType_i8 || Ty == IceType_i1) | 1270 if (isByteSizedType(Ty)) |
1271 EmitUint8(0x32); | 1271 EmitUint8(0x32); |
1272 else | 1272 else |
1273 EmitUint8(0x33); | 1273 EmitUint8(0x33); |
1274 EmitRegisterOperand(dst, src); | 1274 EmitRegisterOperand(dst, src); |
1275 } | 1275 } |
1276 | 1276 |
1277 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Address &address) { | 1277 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Address &address) { |
1278 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1278 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1279 if (Ty == IceType_i16) | 1279 if (Ty == IceType_i16) |
1280 EmitOperandSizeOverride(); | 1280 EmitOperandSizeOverride(); |
1281 if (Ty == IceType_i8 || Ty == IceType_i1) | 1281 if (isByteSizedType(Ty)) |
1282 EmitUint8(0x32); | 1282 EmitUint8(0x32); |
1283 else | 1283 else |
1284 EmitUint8(0x33); | 1284 EmitUint8(0x33); |
1285 EmitOperand(dst, address); | 1285 EmitOperand(dst, address); |
1286 } | 1286 } |
1287 | 1287 |
1288 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Immediate &imm) { | 1288 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Immediate &imm) { |
1289 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1289 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1290 if (Ty == IceType_i8 || Ty == IceType_i1) { | 1290 if (isByteSizedType(Ty)) { |
1291 EmitComplexI8(6, Operand(dst), imm); | 1291 EmitComplexI8(6, Operand(dst), imm); |
1292 return; | 1292 return; |
1293 } | 1293 } |
1294 if (Ty == IceType_i16) | 1294 if (Ty == IceType_i16) |
1295 EmitOperandSizeOverride(); | 1295 EmitOperandSizeOverride(); |
1296 EmitComplex(Ty, 6, Operand(dst), imm); | 1296 EmitComplex(Ty, 6, Operand(dst), imm); |
1297 } | 1297 } |
1298 | 1298 |
1299 void AssemblerX86::add(Type Ty, GPRRegister dst, GPRRegister src) { | 1299 void AssemblerX86::add(Type Ty, GPRRegister dst, GPRRegister src) { |
1300 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1300 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1301 if (Ty == IceType_i16) | 1301 if (Ty == IceType_i16) |
1302 EmitOperandSizeOverride(); | 1302 EmitOperandSizeOverride(); |
1303 if (Ty == IceType_i8 || Ty == IceType_i1) | 1303 if (isByteSizedArithType(Ty)) |
1304 EmitUint8(0x02); | 1304 EmitUint8(0x02); |
1305 else | 1305 else |
1306 EmitUint8(0x03); | 1306 EmitUint8(0x03); |
1307 EmitRegisterOperand(dst, src); | 1307 EmitRegisterOperand(dst, src); |
1308 } | 1308 } |
1309 | 1309 |
1310 void AssemblerX86::add(Type Ty, GPRRegister reg, const Address &address) { | 1310 void AssemblerX86::add(Type Ty, GPRRegister reg, const Address &address) { |
1311 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1311 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1312 if (Ty == IceType_i16) | 1312 if (Ty == IceType_i16) |
1313 EmitOperandSizeOverride(); | 1313 EmitOperandSizeOverride(); |
1314 if (Ty == IceType_i8 || Ty == IceType_i1) | 1314 if (isByteSizedArithType(Ty)) |
1315 EmitUint8(0x02); | 1315 EmitUint8(0x02); |
1316 else | 1316 else |
1317 EmitUint8(0x03); | 1317 EmitUint8(0x03); |
1318 EmitOperand(reg, address); | 1318 EmitOperand(reg, address); |
1319 } | 1319 } |
1320 | 1320 |
1321 void AssemblerX86::add(Type Ty, GPRRegister reg, const Immediate &imm) { | 1321 void AssemblerX86::add(Type Ty, GPRRegister reg, const Immediate &imm) { |
1322 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1322 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1323 if (Ty == IceType_i8 || Ty == IceType_i1) { | 1323 if (isByteSizedArithType(Ty)) { |
1324 EmitComplexI8(0, Operand(reg), imm); | 1324 EmitComplexI8(0, Operand(reg), imm); |
1325 return; | 1325 return; |
1326 } | 1326 } |
1327 if (Ty == IceType_i16) | 1327 if (Ty == IceType_i16) |
1328 EmitOperandSizeOverride(); | 1328 EmitOperandSizeOverride(); |
1329 EmitComplex(Ty, 0, Operand(reg), imm); | 1329 EmitComplex(Ty, 0, Operand(reg), imm); |
1330 } | 1330 } |
1331 | 1331 |
1332 void AssemblerX86::adc(Type Ty, GPRRegister dst, GPRRegister src) { | 1332 void AssemblerX86::adc(Type Ty, GPRRegister dst, GPRRegister src) { |
1333 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1333 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1334 if (Ty == IceType_i16) | 1334 if (Ty == IceType_i16) |
1335 EmitOperandSizeOverride(); | 1335 EmitOperandSizeOverride(); |
1336 if (Ty == IceType_i8 || Ty == IceType_i1) | 1336 if (isByteSizedArithType(Ty)) |
1337 EmitUint8(0x12); | 1337 EmitUint8(0x12); |
1338 else | 1338 else |
1339 EmitUint8(0x13); | 1339 EmitUint8(0x13); |
1340 EmitRegisterOperand(dst, src); | 1340 EmitRegisterOperand(dst, src); |
1341 } | 1341 } |
1342 | 1342 |
1343 void AssemblerX86::adc(Type Ty, GPRRegister dst, const Address &address) { | 1343 void AssemblerX86::adc(Type Ty, GPRRegister dst, const Address &address) { |
1344 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1344 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1345 if (Ty == IceType_i16) | 1345 if (Ty == IceType_i16) |
1346 EmitOperandSizeOverride(); | 1346 EmitOperandSizeOverride(); |
1347 if (Ty == IceType_i8 || Ty == IceType_i1) | 1347 if (isByteSizedArithType(Ty)) |
1348 EmitUint8(0x12); | 1348 EmitUint8(0x12); |
1349 else | 1349 else |
1350 EmitUint8(0x13); | 1350 EmitUint8(0x13); |
1351 EmitOperand(dst, address); | 1351 EmitOperand(dst, address); |
1352 } | 1352 } |
1353 | 1353 |
1354 void AssemblerX86::adc(Type Ty, GPRRegister reg, const Immediate &imm) { | 1354 void AssemblerX86::adc(Type Ty, GPRRegister reg, const Immediate &imm) { |
1355 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1355 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1356 if (Ty == IceType_i8 || Ty == IceType_i1) { | 1356 if (isByteSizedArithType(Ty)) { |
1357 EmitComplexI8(2, Operand(reg), imm); | 1357 EmitComplexI8(2, Operand(reg), imm); |
1358 return; | 1358 return; |
1359 } | 1359 } |
1360 if (Ty == IceType_i16) | 1360 if (Ty == IceType_i16) |
1361 EmitOperandSizeOverride(); | 1361 EmitOperandSizeOverride(); |
1362 EmitComplex(Ty, 2, Operand(reg), imm); | 1362 EmitComplex(Ty, 2, Operand(reg), imm); |
1363 } | 1363 } |
1364 | 1364 |
1365 void AssemblerX86::sub(Type Ty, GPRRegister dst, GPRRegister src) { | 1365 void AssemblerX86::sub(Type Ty, GPRRegister dst, GPRRegister src) { |
1366 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1366 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1367 if (Ty == IceType_i16) | 1367 if (Ty == IceType_i16) |
1368 EmitOperandSizeOverride(); | 1368 EmitOperandSizeOverride(); |
1369 if (Ty == IceType_i8 || Ty == IceType_i1) | 1369 if (isByteSizedArithType(Ty)) |
1370 EmitUint8(0x2A); | 1370 EmitUint8(0x2A); |
1371 else | 1371 else |
1372 EmitUint8(0x2B); | 1372 EmitUint8(0x2B); |
1373 EmitRegisterOperand(dst, src); | 1373 EmitRegisterOperand(dst, src); |
1374 } | 1374 } |
1375 | 1375 |
1376 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Address &address) { | 1376 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Address &address) { |
1377 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1377 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1378 if (Ty == IceType_i16) | 1378 if (Ty == IceType_i16) |
1379 EmitOperandSizeOverride(); | 1379 EmitOperandSizeOverride(); |
1380 if (Ty == IceType_i8 || Ty == IceType_i1) | 1380 if (isByteSizedArithType(Ty)) |
1381 EmitUint8(0x2A); | 1381 EmitUint8(0x2A); |
1382 else | 1382 else |
1383 EmitUint8(0x2B); | 1383 EmitUint8(0x2B); |
1384 EmitOperand(reg, address); | 1384 EmitOperand(reg, address); |
1385 } | 1385 } |
1386 | 1386 |
1387 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Immediate &imm) { | 1387 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Immediate &imm) { |
1388 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1388 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1389 if (Ty == IceType_i8 || Ty == IceType_i1) { | 1389 if (isByteSizedArithType(Ty)) { |
1390 EmitComplexI8(5, Operand(reg), imm); | 1390 EmitComplexI8(5, Operand(reg), imm); |
1391 return; | 1391 return; |
1392 } | 1392 } |
1393 if (Ty == IceType_i16) | 1393 if (Ty == IceType_i16) |
1394 EmitOperandSizeOverride(); | 1394 EmitOperandSizeOverride(); |
1395 EmitComplex(Ty, 5, Operand(reg), imm); | 1395 EmitComplex(Ty, 5, Operand(reg), imm); |
1396 } | 1396 } |
1397 | 1397 |
1398 void AssemblerX86::sbb(Type Ty, GPRRegister dst, GPRRegister src) { | 1398 void AssemblerX86::sbb(Type Ty, GPRRegister dst, GPRRegister src) { |
1399 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1399 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1400 if (Ty == IceType_i16) | 1400 if (Ty == IceType_i16) |
1401 EmitOperandSizeOverride(); | 1401 EmitOperandSizeOverride(); |
1402 if (Ty == IceType_i8 || Ty == IceType_i1) | 1402 if (isByteSizedArithType(Ty)) |
1403 EmitUint8(0x1A); | 1403 EmitUint8(0x1A); |
1404 else | 1404 else |
1405 EmitUint8(0x1B); | 1405 EmitUint8(0x1B); |
1406 EmitRegisterOperand(dst, src); | 1406 EmitRegisterOperand(dst, src); |
1407 } | 1407 } |
1408 | 1408 |
1409 void AssemblerX86::sbb(Type Ty, GPRRegister dst, const Address &address) { | 1409 void AssemblerX86::sbb(Type Ty, GPRRegister dst, const Address &address) { |
1410 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1410 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1411 if (Ty == IceType_i16) | 1411 if (Ty == IceType_i16) |
1412 EmitOperandSizeOverride(); | 1412 EmitOperandSizeOverride(); |
1413 if (Ty == IceType_i8 || Ty == IceType_i1) | 1413 if (isByteSizedArithType(Ty)) |
1414 EmitUint8(0x1A); | 1414 EmitUint8(0x1A); |
1415 else | 1415 else |
1416 EmitUint8(0x1B); | 1416 EmitUint8(0x1B); |
1417 EmitOperand(dst, address); | 1417 EmitOperand(dst, address); |
1418 } | 1418 } |
1419 | 1419 |
1420 void AssemblerX86::sbb(Type Ty, GPRRegister reg, const Immediate &imm) { | 1420 void AssemblerX86::sbb(Type Ty, GPRRegister reg, const Immediate &imm) { |
1421 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1421 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1422 if (Ty == IceType_i8 || Ty == IceType_i1) { | 1422 if (isByteSizedArithType(Ty)) { |
1423 EmitComplexI8(3, Operand(reg), imm); | 1423 EmitComplexI8(3, Operand(reg), imm); |
1424 return; | 1424 return; |
1425 } | 1425 } |
1426 if (Ty == IceType_i16) | 1426 if (Ty == IceType_i16) |
1427 EmitOperandSizeOverride(); | 1427 EmitOperandSizeOverride(); |
1428 EmitComplex(Ty, 3, Operand(reg), imm); | 1428 EmitComplex(Ty, 3, Operand(reg), imm); |
1429 } | 1429 } |
1430 | 1430 |
1431 void AssemblerX86::cbw() { | 1431 void AssemblerX86::cbw() { |
1432 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1432 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1433 EmitOperandSizeOverride(); | 1433 EmitOperandSizeOverride(); |
1434 EmitUint8(0x98); | 1434 EmitUint8(0x98); |
1435 } | 1435 } |
1436 | 1436 |
1437 void AssemblerX86::cwd() { | 1437 void AssemblerX86::cwd() { |
1438 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1438 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1439 EmitOperandSizeOverride(); | 1439 EmitOperandSizeOverride(); |
1440 EmitUint8(0x99); | 1440 EmitUint8(0x99); |
1441 } | 1441 } |
1442 | 1442 |
1443 void AssemblerX86::cdq() { | 1443 void AssemblerX86::cdq() { |
1444 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1444 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1445 EmitUint8(0x99); | 1445 EmitUint8(0x99); |
1446 } | 1446 } |
1447 | 1447 |
1448 void AssemblerX86::div(Type Ty, GPRRegister reg) { | 1448 void AssemblerX86::div(Type Ty, GPRRegister reg) { |
1449 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1449 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1450 if (Ty == IceType_i16) | 1450 if (Ty == IceType_i16) |
1451 EmitOperandSizeOverride(); | 1451 EmitOperandSizeOverride(); |
1452 if (Ty == IceType_i8 || Ty == IceType_i1) | 1452 if (isByteSizedArithType(Ty)) |
1453 EmitUint8(0xF6); | 1453 EmitUint8(0xF6); |
1454 else | 1454 else |
1455 EmitUint8(0xF7); | 1455 EmitUint8(0xF7); |
1456 EmitRegisterOperand(6, reg); | 1456 EmitRegisterOperand(6, reg); |
1457 } | 1457 } |
1458 | 1458 |
1459 void AssemblerX86::div(Type Ty, const Address &addr) { | 1459 void AssemblerX86::div(Type Ty, const Address &addr) { |
1460 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1460 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1461 if (Ty == IceType_i16) | 1461 if (Ty == IceType_i16) |
1462 EmitOperandSizeOverride(); | 1462 EmitOperandSizeOverride(); |
1463 if (Ty == IceType_i8 || Ty == IceType_i1) | 1463 if (isByteSizedArithType(Ty)) |
1464 EmitUint8(0xF6); | 1464 EmitUint8(0xF6); |
1465 else | 1465 else |
1466 EmitUint8(0xF7); | 1466 EmitUint8(0xF7); |
1467 EmitOperand(6, addr); | 1467 EmitOperand(6, addr); |
1468 } | 1468 } |
1469 | 1469 |
1470 void AssemblerX86::idiv(Type Ty, GPRRegister reg) { | 1470 void AssemblerX86::idiv(Type Ty, GPRRegister reg) { |
1471 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1471 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1472 if (Ty == IceType_i16) | 1472 if (Ty == IceType_i16) |
1473 EmitOperandSizeOverride(); | 1473 EmitOperandSizeOverride(); |
1474 if (Ty == IceType_i8 || Ty == IceType_i1) | 1474 if (isByteSizedArithType(Ty)) |
1475 EmitUint8(0xF6); | 1475 EmitUint8(0xF6); |
1476 else | 1476 else |
1477 EmitUint8(0xF7); | 1477 EmitUint8(0xF7); |
1478 EmitRegisterOperand(7, reg); | 1478 EmitRegisterOperand(7, reg); |
1479 } | 1479 } |
1480 | 1480 |
1481 void AssemblerX86::idiv(Type Ty, const Address &addr) { | 1481 void AssemblerX86::idiv(Type Ty, const Address &addr) { |
1482 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1482 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1483 if (Ty == IceType_i16) | 1483 if (Ty == IceType_i16) |
1484 EmitOperandSizeOverride(); | 1484 EmitOperandSizeOverride(); |
1485 if (Ty == IceType_i8 || Ty == IceType_i1) | 1485 if (isByteSizedArithType(Ty)) |
1486 EmitUint8(0xF6); | 1486 EmitUint8(0xF6); |
1487 else | 1487 else |
1488 EmitUint8(0xF7); | 1488 EmitUint8(0xF7); |
1489 EmitOperand(7, addr); | 1489 EmitOperand(7, addr); |
1490 } | 1490 } |
1491 | 1491 |
1492 void AssemblerX86::imull(GPRRegister dst, GPRRegister src) { | 1492 void AssemblerX86::imull(GPRRegister dst, GPRRegister src) { |
1493 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1493 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1494 EmitUint8(0x0F); | 1494 EmitUint8(0x0F); |
1495 EmitUint8(0xAF); | 1495 EmitUint8(0xAF); |
(...skipping 23 matching lines...) Expand all Loading... |
1519 void AssemblerX86::imull(const Address &address) { | 1519 void AssemblerX86::imull(const Address &address) { |
1520 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1520 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1521 EmitUint8(0xF7); | 1521 EmitUint8(0xF7); |
1522 EmitOperand(5, address); | 1522 EmitOperand(5, address); |
1523 } | 1523 } |
1524 | 1524 |
1525 void AssemblerX86::mul(Type Ty, GPRRegister reg) { | 1525 void AssemblerX86::mul(Type Ty, GPRRegister reg) { |
1526 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1526 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1527 if (Ty == IceType_i16) | 1527 if (Ty == IceType_i16) |
1528 EmitOperandSizeOverride(); | 1528 EmitOperandSizeOverride(); |
1529 if (Ty == IceType_i8 || Ty == IceType_i1) | 1529 if (isByteSizedArithType(Ty)) |
1530 EmitUint8(0xF6); | 1530 EmitUint8(0xF6); |
1531 else | 1531 else |
1532 EmitUint8(0xF7); | 1532 EmitUint8(0xF7); |
1533 EmitRegisterOperand(4, reg); | 1533 EmitRegisterOperand(4, reg); |
1534 } | 1534 } |
1535 | 1535 |
1536 void AssemblerX86::mul(Type Ty, const Address &address) { | 1536 void AssemblerX86::mul(Type Ty, const Address &address) { |
1537 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1537 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1538 if (Ty == IceType_i16) | 1538 if (Ty == IceType_i16) |
1539 EmitOperandSizeOverride(); | 1539 EmitOperandSizeOverride(); |
1540 if (Ty == IceType_i8 || Ty == IceType_i1) | 1540 if (isByteSizedArithType(Ty)) |
1541 EmitUint8(0xF6); | 1541 EmitUint8(0xF6); |
1542 else | 1542 else |
1543 EmitUint8(0xF7); | 1543 EmitUint8(0xF7); |
1544 EmitOperand(4, address); | 1544 EmitOperand(4, address); |
1545 } | 1545 } |
1546 | 1546 |
1547 void AssemblerX86::incl(GPRRegister reg) { | 1547 void AssemblerX86::incl(GPRRegister reg) { |
1548 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1548 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1549 EmitUint8(0x40 + reg); | 1549 EmitUint8(0x40 + reg); |
1550 } | 1550 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1643 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1643 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1644 EmitUint8(0x0F); | 1644 EmitUint8(0x0F); |
1645 EmitUint8(0xAD); | 1645 EmitUint8(0xAD); |
1646 EmitOperand(src, Operand(dst)); | 1646 EmitOperand(src, Operand(dst)); |
1647 } | 1647 } |
1648 | 1648 |
1649 void AssemblerX86::neg(Type Ty, GPRRegister reg) { | 1649 void AssemblerX86::neg(Type Ty, GPRRegister reg) { |
1650 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1650 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1651 if (Ty == IceType_i16) | 1651 if (Ty == IceType_i16) |
1652 EmitOperandSizeOverride(); | 1652 EmitOperandSizeOverride(); |
1653 if (Ty == IceType_i8 || Ty == IceType_i1) | 1653 if (isByteSizedArithType(Ty)) |
1654 EmitUint8(0xF6); | 1654 EmitUint8(0xF6); |
1655 else | 1655 else |
1656 EmitUint8(0xF7); | 1656 EmitUint8(0xF7); |
1657 EmitRegisterOperand(3, reg); | 1657 EmitRegisterOperand(3, reg); |
1658 } | 1658 } |
1659 | 1659 |
1660 void AssemblerX86::neg(Type Ty, const Address &addr) { | 1660 void AssemblerX86::neg(Type Ty, const Address &addr) { |
1661 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1661 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1662 if (Ty == IceType_i16) | 1662 if (Ty == IceType_i16) |
1663 EmitOperandSizeOverride(); | 1663 EmitOperandSizeOverride(); |
1664 if (Ty == IceType_i8 || Ty == IceType_i1) | 1664 if (isByteSizedArithType(Ty)) |
1665 EmitUint8(0xF6); | 1665 EmitUint8(0xF6); |
1666 else | 1666 else |
1667 EmitUint8(0xF7); | 1667 EmitUint8(0xF7); |
1668 EmitOperand(3, addr); | 1668 EmitOperand(3, addr); |
1669 } | 1669 } |
1670 | 1670 |
1671 void AssemblerX86::notl(GPRRegister reg) { | 1671 void AssemblerX86::notl(GPRRegister reg) { |
1672 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1672 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1673 EmitUint8(0xF7); | 1673 EmitUint8(0xF7); |
1674 EmitUint8(0xD0 | reg); | 1674 EmitUint8(0xD0 | reg); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1893 void AssemblerX86::lock() { | 1893 void AssemblerX86::lock() { |
1894 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1894 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1895 EmitUint8(0xF0); | 1895 EmitUint8(0xF0); |
1896 } | 1896 } |
1897 | 1897 |
1898 void AssemblerX86::cmpxchg(Type Ty, const Address &address, GPRRegister reg) { | 1898 void AssemblerX86::cmpxchg(Type Ty, const Address &address, GPRRegister reg) { |
1899 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1899 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1900 if (Ty == IceType_i16) | 1900 if (Ty == IceType_i16) |
1901 EmitOperandSizeOverride(); | 1901 EmitOperandSizeOverride(); |
1902 EmitUint8(0x0F); | 1902 EmitUint8(0x0F); |
1903 if (Ty == IceType_i8 || Ty == IceType_i1) | 1903 if (isByteSizedArithType(Ty)) |
1904 EmitUint8(0xB0); | 1904 EmitUint8(0xB0); |
1905 else | 1905 else |
1906 EmitUint8(0xB1); | 1906 EmitUint8(0xB1); |
1907 EmitOperand(reg, address); | 1907 EmitOperand(reg, address); |
1908 } | 1908 } |
1909 | 1909 |
1910 void AssemblerX86::cmpxchg8b(const Address &address) { | 1910 void AssemblerX86::cmpxchg8b(const Address &address) { |
1911 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1911 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1912 EmitUint8(0x0F); | 1912 EmitUint8(0x0F); |
1913 EmitUint8(0xC7); | 1913 EmitUint8(0xC7); |
1914 EmitOperand(1, address); | 1914 EmitOperand(1, address); |
1915 } | 1915 } |
1916 | 1916 |
1917 void AssemblerX86::xadd(Type Ty, const Address &addr, GPRRegister reg) { | 1917 void AssemblerX86::xadd(Type Ty, const Address &addr, GPRRegister reg) { |
1918 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1918 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1919 if (Ty == IceType_i16) | 1919 if (Ty == IceType_i16) |
1920 EmitOperandSizeOverride(); | 1920 EmitOperandSizeOverride(); |
1921 EmitUint8(0x0F); | 1921 EmitUint8(0x0F); |
1922 if (Ty == IceType_i8 || Ty == IceType_i1) | 1922 if (isByteSizedArithType(Ty)) |
1923 EmitUint8(0xC0); | 1923 EmitUint8(0xC0); |
1924 else | 1924 else |
1925 EmitUint8(0xC1); | 1925 EmitUint8(0xC1); |
1926 EmitOperand(reg, addr); | 1926 EmitOperand(reg, addr); |
1927 } | 1927 } |
1928 | 1928 |
1929 void AssemblerX86::xchg(Type Ty, const Address &addr, GPRRegister reg) { | 1929 void AssemblerX86::xchg(Type Ty, const Address &addr, GPRRegister reg) { |
1930 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1930 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1931 if (Ty == IceType_i16) | 1931 if (Ty == IceType_i16) |
1932 EmitOperandSizeOverride(); | 1932 EmitOperandSizeOverride(); |
1933 if (Ty == IceType_i8 || Ty == IceType_i1) | 1933 if (isByteSizedArithType(Ty)) |
1934 EmitUint8(0x86); | 1934 EmitUint8(0x86); |
1935 else | 1935 else |
1936 EmitUint8(0x87); | 1936 EmitUint8(0x87); |
1937 EmitOperand(reg, addr); | 1937 EmitOperand(reg, addr); |
1938 } | 1938 } |
1939 | 1939 |
1940 void AssemblerX86::Align(intptr_t alignment, intptr_t offset) { | 1940 void AssemblerX86::Align(intptr_t alignment, intptr_t offset) { |
1941 assert(llvm::isPowerOf2_32(alignment)); | 1941 assert(llvm::isPowerOf2_32(alignment)); |
1942 intptr_t pos = offset + buffer_.GetPosition(); | 1942 intptr_t pos = offset + buffer_.GetPosition(); |
1943 intptr_t mod = pos & (alignment - 1); | 1943 intptr_t mod = pos & (alignment - 1); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2072 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, | 2072 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, |
2073 GPRRegister shifter) { | 2073 GPRRegister shifter) { |
2074 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2074 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
2075 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2075 assert(shifter == RegX8632::Encoded_Reg_ecx); |
2076 EmitUint8(0xD3); | 2076 EmitUint8(0xD3); |
2077 EmitOperand(rm, Operand(operand)); | 2077 EmitOperand(rm, Operand(operand)); |
2078 } | 2078 } |
2079 | 2079 |
2080 } // end of namespace x86 | 2080 } // end of namespace x86 |
2081 } // end of namespace Ice | 2081 } // end of namespace Ice |
OLD | NEW |