| Index: src/assembler_ia32.cpp
|
| diff --git a/src/assembler_ia32.cpp b/src/assembler_ia32.cpp
|
| index 76ff93fa0e23314f811c4488cff691a68e3344ba..16d01ce7cc1773c0d9671bac1615910329c1fdcb 100644
|
| --- a/src/assembler_ia32.cpp
|
| +++ b/src/assembler_ia32.cpp
|
| @@ -25,8 +25,6 @@
|
| namespace Ice {
|
| namespace x86 {
|
|
|
| -const Type BrokenType = IceType_i32;
|
| -
|
| class DirectCallRelocation : public AssemblerFixup {
|
| public:
|
| static DirectCallRelocation *create(Assembler *Asm, FixupKind Kind,
|
| @@ -56,13 +54,13 @@ Address Address::ofConstPool(GlobalContext *Ctx, Assembler *Asm,
|
| Type Ty = Imm->getType();
|
| assert(llvm::isa<ConstantFloat>(Imm) || llvm::isa<ConstantDouble>(Imm));
|
| StrBuf << "L$" << Ty << "$" << Imm->getPoolEntryID();
|
| - const int64_t Offset = 0;
|
| + const RelocOffsetT Offset = 0;
|
| const bool SuppressMangling = true;
|
| Constant *Sym =
|
| Ctx->getConstantSym(Ty, Offset, StrBuf.str(), SuppressMangling);
|
| AssemblerFixup *Fixup = x86::DisplacementRelocation::create(
|
| Asm, FK_Abs_4, llvm::cast<ConstantRelocatable>(Sym));
|
| - return x86::Address::Absolute(Offset, Fixup);
|
| + return x86::Address::Absolute(Fixup);
|
| }
|
|
|
| void AssemblerX86::call(GPRRegister reg) {
|
| @@ -127,35 +125,68 @@ void AssemblerX86::setcc(CondX86::BrCond condition, ByteRegister dst) {
|
| EmitUint8(0xC0 + dst);
|
| }
|
|
|
| -void AssemblerX86::movl(GPRRegister dst, const Immediate &imm) {
|
| +void AssemblerX86::mov(Type Ty, GPRRegister dst, const Immediate &imm) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + if (isByteSizedType(Ty)) {
|
| + EmitUint8(0xB0 + dst);
|
| + EmitUint8(imm.value() & 0xFF);
|
| + return;
|
| + }
|
| + if (Ty == IceType_i16)
|
| + EmitOperandSizeOverride();
|
| EmitUint8(0xB8 + dst);
|
| - EmitImmediate(BrokenType, imm);
|
| + EmitImmediate(Ty, imm);
|
| }
|
|
|
| -void AssemblerX86::movl(GPRRegister dst, GPRRegister src) {
|
| +void AssemblerX86::mov(Type Ty, GPRRegister dst, GPRRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitUint8(0x89);
|
| + if (Ty == IceType_i16)
|
| + EmitOperandSizeOverride();
|
| + if (isByteSizedType(Ty)) {
|
| + EmitUint8(0x88);
|
| + } else {
|
| + EmitUint8(0x89);
|
| + }
|
| EmitRegisterOperand(src, dst);
|
| }
|
|
|
| -void AssemblerX86::movl(GPRRegister dst, const Address &src) {
|
| +void AssemblerX86::mov(Type Ty, GPRRegister dst, const Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitUint8(0x8B);
|
| + if (Ty == IceType_i16)
|
| + EmitOperandSizeOverride();
|
| + if (isByteSizedType(Ty)) {
|
| + EmitUint8(0x8A);
|
| + } else {
|
| + EmitUint8(0x8B);
|
| + }
|
| EmitOperand(dst, src);
|
| }
|
|
|
| -void AssemblerX86::movl(const Address &dst, GPRRegister src) {
|
| +void AssemblerX86::mov(Type Ty, const Address &dst, GPRRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitUint8(0x89);
|
| + if (Ty == IceType_i16)
|
| + EmitOperandSizeOverride();
|
| + if (isByteSizedType(Ty)) {
|
| + EmitUint8(0x88);
|
| + } else {
|
| + EmitUint8(0x89);
|
| + }
|
| EmitOperand(src, dst);
|
| }
|
|
|
| -void AssemblerX86::movl(const Address &dst, const Immediate &imm) {
|
| +void AssemblerX86::mov(Type Ty, const Address &dst, const Immediate &imm) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitUint8(0xC7);
|
| - EmitOperand(0, dst);
|
| - EmitImmediate(BrokenType, imm);
|
| + if (Ty == IceType_i16)
|
| + EmitOperandSizeOverride();
|
| + if (isByteSizedType(Ty)) {
|
| + EmitUint8(0xC6);
|
| + EmitOperand(0, dst);
|
| + EmitUint8(imm.value() & 0xFF);
|
| + } else {
|
| + EmitUint8(0xC7);
|
| + EmitOperand(0, dst);
|
| + EmitImmediate(Ty, imm);
|
| + }
|
| }
|
|
|
| void AssemblerX86::movzxb(GPRRegister dst, ByteRegister src) {
|
| @@ -186,27 +217,6 @@ void AssemblerX86::movsxb(GPRRegister dst, const Address &src) {
|
| EmitOperand(dst, src);
|
| }
|
|
|
| -void AssemblerX86::movb(ByteRegister dst, const Address &src) {
|
| - (void)dst;
|
| - (void)src;
|
| - // FATAL
|
| - llvm_unreachable("Use movzxb or movsxb instead.");
|
| -}
|
| -
|
| -void AssemblerX86::movb(const Address &dst, ByteRegister src) {
|
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitUint8(0x88);
|
| - EmitOperand(src, dst);
|
| -}
|
| -
|
| -void AssemblerX86::movb(const Address &dst, const Immediate &imm) {
|
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitUint8(0xC6);
|
| - EmitOperand(RegX8632::Encoded_Reg_eax, dst);
|
| - assert(imm.is_int8());
|
| - EmitUint8(imm.value() & 0xFF);
|
| -}
|
| -
|
| void AssemblerX86::movzxw(GPRRegister dst, GPRRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| EmitUint8(0x0F);
|
| @@ -235,20 +245,6 @@ void AssemblerX86::movsxw(GPRRegister dst, const Address &src) {
|
| EmitOperand(dst, src);
|
| }
|
|
|
| -void AssemblerX86::movw(GPRRegister dst, const Address &src) {
|
| - (void)dst;
|
| - (void)src;
|
| - // FATAL
|
| - llvm_unreachable("Use movzxw or movsxw instead.");
|
| -}
|
| -
|
| -void AssemblerX86::movw(const Address &dst, GPRRegister src) {
|
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitOperandSizeOverride();
|
| - EmitUint8(0x89);
|
| - EmitOperand(src, dst);
|
| -}
|
| -
|
| void AssemblerX86::lea(Type Ty, GPRRegister dst, const Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| @@ -927,7 +923,7 @@ void AssemblerX86::unpckhpd(XmmRegister dst, XmmRegister src) {
|
| void AssemblerX86::set1ps(XmmRegister dst, GPRRegister tmp1,
|
| const Immediate &imm) {
|
| // Load 32-bit immediate value into tmp1.
|
| - movl(tmp1, imm);
|
| + mov(IceType_i32, tmp1, imm);
|
| // Move value from tmp1 into dst.
|
| movd(dst, tmp1);
|
| // Broadcast low lane into other three lanes.
|
| @@ -2266,10 +2262,15 @@ void AssemblerX86::EmitOperand(int rm, const Operand &operand) {
|
| }
|
|
|
| void AssemblerX86::EmitImmediate(Type Ty, const Immediate &imm) {
|
| - if (Ty == IceType_i16)
|
| + if (Ty == IceType_i16) {
|
| + assert(!imm.fixup());
|
| EmitInt16(imm.value());
|
| - else
|
| + } else {
|
| + if (imm.fixup()) {
|
| + EmitFixup(imm.fixup());
|
| + }
|
| EmitInt32(imm.value());
|
| + }
|
| }
|
|
|
| void AssemblerX86::EmitComplexI8(int rm, const Operand &operand,
|
|
|