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