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