| Index: src/IceInstX8632.cpp
|
| diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp
|
| index 95be640666c04dddefede50c7630d460f893d589..77f54efb242128eb6df0488d284e8fa444042442 100644
|
| --- a/src/IceInstX8632.cpp
|
| +++ b/src/IceInstX8632.cpp
|
| @@ -587,7 +587,8 @@ void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Var,
|
| } else if (const auto Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) {
|
| AssemblerFixup *Fixup =
|
| x86::DisplacementRelocation::create(Asm, FK_Abs_4, Reloc);
|
| - (Asm->*(Emitter.GPRImm))(Ty, VarReg, x86::Immediate(Fixup));
|
| + (Asm->*(Emitter.GPRImm))(Ty, VarReg,
|
| + x86::Immediate(Reloc->getOffset(), Fixup));
|
| } else if (const auto Split = llvm::dyn_cast<VariableSplit>(Src)) {
|
| (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func));
|
| } else {
|
| @@ -610,7 +611,8 @@ void emitIASAddrOpTyGPR(const Cfg *Func, Type Ty, const x86::Address &Addr,
|
| } else if (const auto Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) {
|
| AssemblerFixup *Fixup =
|
| x86::DisplacementRelocation::create(Asm, FK_Abs_4, Reloc);
|
| - (Asm->*(Emitter.AddrImm))(Ty, Addr, x86::Immediate(Fixup));
|
| + (Asm->*(Emitter.AddrImm))(Ty, Addr,
|
| + x86::Immediate(Reloc->getOffset(), Fixup));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| @@ -727,8 +729,7 @@ void emitIASRegOpTyXMM(const Cfg *Func, Type Ty, const Variable *Var,
|
| assert(Mem->getSegmentRegister() == OperandX8632Mem::DefaultSegment);
|
| (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm));
|
| } else if (const auto Imm = llvm::dyn_cast<Constant>(Src)) {
|
| - (Asm->*(Emitter.XmmAddr))(
|
| - Ty, VarReg, x86::Address::ofConstPool(Func->getContext(), Asm, Imm));
|
| + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, x86::Address::ofConstPool(Asm, Imm));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| @@ -2319,7 +2320,7 @@ void InstX8632Fld::emitIAS(const Cfg *Func) const {
|
| assert(Mem->getSegmentRegister() == OperandX8632Mem::DefaultSegment);
|
| Asm->fld(Ty, Mem->toAsmAddress(Asm));
|
| } else if (const auto Imm = llvm::dyn_cast<Constant>(Src)) {
|
| - Asm->fld(Ty, x86::Address::ofConstPool(Func->getContext(), Asm, Imm));
|
| + Asm->fld(Ty, x86::Address::ofConstPool(Asm, Imm));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| @@ -2849,6 +2850,7 @@ x86::Address OperandX8632Mem::toAsmAddress(Assembler *Asm) const {
|
| Disp = static_cast<int32_t>(CI->getValue());
|
| } else if (const auto CR =
|
| llvm::dyn_cast<ConstantRelocatable>(getOffset())) {
|
| + Disp = CR->getOffset();
|
| Fixup = x86::DisplacementRelocation::create(Asm, FK_Abs_4, CR);
|
| } else {
|
| llvm_unreachable("Unexpected offset type");
|
| @@ -2866,9 +2868,7 @@ x86::Address OperandX8632Mem::toAsmAddress(Assembler *Asm) const {
|
| return x86::Address(RegX8632::getEncodedGPR(getIndex()->getRegNum()),
|
| x86::ScaleFactor(getShift()), Disp);
|
| } else if (Fixup) {
|
| - // The fixup itself has an offset, so Disp should still be 0.
|
| - assert(Disp == 0);
|
| - return x86::Address::Absolute(Fixup);
|
| + return x86::Address::Absolute(Disp, Fixup);
|
| } else {
|
| return x86::Address::Absolute(Disp);
|
| }
|
|
|