| 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 |