Index: src/IceInstX86BaseImpl.h |
diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h |
index bc5811ed1897ccdfc113d0504067086cbc3c8238..cfc36d44a4fb3827d3329385015dc6de47a9631b 100644 |
--- a/src/IceInstX86BaseImpl.h |
+++ b/src/IceInstX86BaseImpl.h |
@@ -738,6 +738,10 @@ void InstImpl<TraitsType>::emitIASRegOpTyGPR(const Cfg *Func, bool IsLea, |
Mem->toAsmAddress(Asm, Target, IsLea)); |
} else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
(Asm->*(Emitter.GPRImm))(Ty, VarReg, AssemblerImmediate(Imm->getValue())); |
+ } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger64>(Src)) { |
+ assert(Traits::Is64Bit); |
+ assert(Utils::IsInt(32, Imm->getValue())); |
+ (Asm->*(Emitter.GPRImm))(Ty, VarReg, AssemblerImmediate(Imm->getValue())); |
} else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
const auto FixupKind = (Reloc->getName().hasStdString() && |
Reloc->getName().toString() == GlobalOffsetTable) |
@@ -765,6 +769,10 @@ void InstImpl<TraitsType>::emitIASAddrOpTyGPR(const Cfg *Func, Type Ty, |
(Asm->*(Emitter.AddrGPR))(Ty, Addr, SrcReg); |
} else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
(Asm->*(Emitter.AddrImm))(Ty, Addr, AssemblerImmediate(Imm->getValue())); |
+ } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger64>(Src)) { |
+ assert(Traits::Is64Bit); |
+ assert(Utils::IsInt(32, Imm->getValue())); |
+ (Asm->*(Emitter.AddrImm))(Ty, Addr, AssemblerImmediate(Imm->getValue())); |
} else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
const auto FixupKind = (Reloc->getName().hasStdString() && |
Reloc->getName().toString() == GlobalOffsetTable) |
@@ -816,6 +824,10 @@ void InstImpl<TraitsType>::emitIASGPRShift(const Cfg *Func, Type Ty, |
(Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); |
} else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
(Asm->*(Emitter.GPRImm))(Ty, VarReg, AssemblerImmediate(Imm->getValue())); |
+ } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger64>(Src)) { |
+ assert(Traits::Is64Bit); |
+ assert(Utils::IsInt(32, Imm->getValue())); |
+ (Asm->*(Emitter.GPRImm))(Ty, VarReg, AssemblerImmediate(Imm->getValue())); |
} else { |
llvm_unreachable("Unexpected operand type"); |
} |
@@ -2042,7 +2054,8 @@ void InstImpl<TraitsType>::InstX86Mov::emit(const Cfg *Func) const { |
Type SrcTy = Src->getType(); |
Type DestTy = this->getDest()->getType(); |
if (Traits::Is64Bit && DestTy == IceType_i64 && |
- llvm::isa<ConstantInteger64>(Src)) { |
+ llvm::isa<ConstantInteger64>(Src) && |
+ !Utils::IsInt(32, llvm::cast<ConstantInteger64>(Src)->getValue())) { |
Str << "\t" |
"movabs" |
"\t"; |