Refactor AsmAddress creation Instead of using target lowering methods such as stackVarToAsmAddress() for creating AsmAddress objects, which requires assembler-specific knowledge, move this logic into AsmAddress constructors and encapsulate its details. This will facilitate moving the assembler traits into the assembler header and source files. Bug: b/192890685 Change-Id: I59eef85c03ab71e2ac9396e60cbb4c3c59151cd4 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/55808 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Sean Risser <srisser@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/third_party/subzero/src/IceAssemblerX8632.cpp b/third_party/subzero/src/IceAssemblerX8632.cpp index 03696de..dbe6da2 100644 --- a/third_party/subzero/src/IceAssemblerX8632.cpp +++ b/third_party/subzero/src/IceAssemblerX8632.cpp
@@ -24,10 +24,97 @@ #include "IceCfg.h" #include "IceCfgNode.h" #include "IceOperand.h" +#include "IceTargetLoweringX8632.h" namespace Ice { namespace X8632 { +AsmAddress::AsmAddress(const Variable *Var, const TargetX8632 *Target) { + if (Var->hasReg()) + llvm::report_fatal_error("Stack Variable has a register assigned"); + if (Var->mustHaveReg()) { + llvm::report_fatal_error("Infinite-weight Variable (" + Var->getName() + + ") has no register assigned - function " + + Target->getFunc()->getFunctionName()); + } + int32_t Offset = Var->getStackOffset(); + auto BaseRegNum = Var->getBaseRegNum(); + if (Var->getBaseRegNum().hasNoValue()) { + // If the stack pointer needs alignment, we must use the frame pointer + // for arguments. For locals, getFrameOrStackReg will return the stack + // pointer in this case. + if (Target->needsStackPointerAlignment() && Var->getIsArg()) { + assert(Target->hasFramePointer()); + BaseRegNum = Target->getFrameReg(); + } else { + BaseRegNum = Target->getFrameOrStackReg(); + } + } + + GPRRegister Base = Traits::getEncodedGPR(BaseRegNum); + + if (Utils::IsInt(8, Offset)) { + SetModRM(1, Base); + if (Base == RegX8632::Encoded_Reg_esp) + SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, Base); + SetDisp8(Offset); + } else { + SetModRM(2, Base); + if (Base == RegX8632::Encoded_Reg_esp) + SetSIB(TIMES_1, RegX8632::Encoded_Reg_esp, Base); + SetDisp32(Offset); + } +} + +AsmAddress::AsmAddress(const X86OperandMem *Mem, Ice::Assembler *Asm, + const Ice::TargetLowering *Target) { + Mem->validateMemOperandPIC(); + int32_t Disp = 0; + if (Mem->getBase() && Mem->getBase()->isRematerializable()) { + Disp += Mem->getBase()->getRematerializableOffset(Target); + } + // The index should never be rematerializable. But if we ever allow it, then + // we should make sure the rematerialization offset is shifted by the Shift + // value. + assert(!Mem->getIndex() || !Mem->getIndex()->isRematerializable()); + + AssemblerFixup *Fixup = nullptr; + // Determine the offset (is it relocatable?) + if (Mem->getOffset()) { + if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(Mem->getOffset())) { + Disp += static_cast<int32_t>(CI->getValue()); + } else if (const auto CR = + llvm::dyn_cast<ConstantRelocatable>(Mem->getOffset())) { + Disp += CR->getOffset(); + Fixup = Asm->createFixup(Traits::FK_Abs, CR); + } else { + llvm_unreachable("Unexpected offset type"); + } + } + + // Now convert to the various possible forms. + if (Mem->getBase() && Mem->getIndex()) { + SetBaseIndex(getEncodedGPR(Mem->getBase()->getRegNum()), + getEncodedGPR(Mem->getIndex()->getRegNum()), + X8632::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); + } else if (Mem->getBase()) { + SetBase(getEncodedGPR(Mem->getBase()->getRegNum()), Disp, Fixup); + } else if (Mem->getIndex()) { + SetIndex(getEncodedGPR(Mem->getIndex()->getRegNum()), + X8632::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); + } else { + SetAbsolute(Disp, Fixup); + } +} + +AsmAddress::AsmAddress(const VariableSplit *Split, const Cfg *Func) { + assert(!Split->getVar()->hasReg()); + const ::Ice::TargetLowering *Target = Func->getTarget(); + int32_t Offset = Split->getVar()->getStackOffset() + Split->getOffset(); + SetBase(getEncodedGPR(Target->getFrameOrStackReg()), Offset, + AssemblerFixup::NoFixup); +} + AssemblerX8632::~AssemblerX8632() { if (BuildDefs::asserts()) { for (const Label *Label : CfgNodeLabels) { @@ -616,7 +703,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::pand(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::pand(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitUint8(0x0F); @@ -632,7 +720,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::pandn(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::pandn(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitUint8(0x0F); @@ -753,7 +842,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::por(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::por(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitUint8(0x0F); @@ -853,7 +943,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::pxor(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::pxor(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitUint8(0x0F); @@ -1001,7 +1092,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::addps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::addps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x0F); emitUint8(0x58); @@ -1015,7 +1107,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::subps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::subps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x0F); emitUint8(0x5C); @@ -1029,7 +1122,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::divps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::divps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x0F); emitUint8(0x5E); @@ -1043,7 +1137,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8632::mulps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8632::mulps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x0F); emitUint8(0x59); @@ -1338,8 +1433,8 @@ emitUint8(imm.value()); } -void AssemblerX8632::pshufd(Type /* Ty */, XmmRegister dst, const AsmAddress &src, - const Immediate &imm) { +void AssemblerX8632::pshufd(Type /* Ty */, XmmRegister dst, + const AsmAddress &src, const Immediate &imm) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitUint8(0x0F); @@ -1482,8 +1577,8 @@ emitUint8(imm.value()); } -void AssemblerX8632::shufps(Type /* Ty */, XmmRegister dst, const AsmAddress &src, - const Immediate &imm) { +void AssemblerX8632::shufps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src, const Immediate &imm) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x0F); emitUint8(0xC6); @@ -2140,7 +2235,8 @@ arith_int<1>(Ty, address, reg); } -void AssemblerX8632::Or(Type Ty, const AsmAddress &address, const Immediate &imm) { +void AssemblerX8632::Or(Type Ty, const AsmAddress &address, + const Immediate &imm) { arith_int<1>(Ty, address, imm); } @@ -2456,7 +2552,8 @@ emitGenericShift(0, Ty, AsmOperand(operand), shifter); } -void AssemblerX8632::rol(Type Ty, const AsmAddress &operand, GPRRegister shifter) { +void AssemblerX8632::rol(Type Ty, const AsmAddress &operand, + GPRRegister shifter) { emitGenericShift(0, Ty, operand, shifter); } @@ -2468,7 +2565,8 @@ emitGenericShift(4, Ty, AsmOperand(operand), shifter); } -void AssemblerX8632::shl(Type Ty, const AsmAddress &operand, GPRRegister shifter) { +void AssemblerX8632::shl(Type Ty, const AsmAddress &operand, + GPRRegister shifter) { emitGenericShift(4, Ty, operand, shifter); } @@ -2480,7 +2578,8 @@ emitGenericShift(5, Ty, AsmOperand(operand), shifter); } -void AssemblerX8632::shr(Type Ty, const AsmAddress &operand, GPRRegister shifter) { +void AssemblerX8632::shr(Type Ty, const AsmAddress &operand, + GPRRegister shifter) { emitGenericShift(5, Ty, operand, shifter); } @@ -2492,7 +2591,8 @@ emitGenericShift(7, Ty, AsmOperand(operand), shifter); } -void AssemblerX8632::sar(Type Ty, const AsmAddress &address, GPRRegister shifter) { +void AssemblerX8632::sar(Type Ty, const AsmAddress &address, + GPRRegister shifter) { emitGenericShift(7, Ty, address, shifter); } @@ -2831,8 +2931,8 @@ emitUint8(0xF0); } -void AssemblerX8632::cmpxchg(Type Ty, const AsmAddress &address, GPRRegister reg, - bool Locked) { +void AssemblerX8632::cmpxchg(Type Ty, const AsmAddress &address, + GPRRegister reg, bool Locked) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); if (Ty == IceType_i16) emitOperandSizeOverride(); @@ -3112,7 +3212,8 @@ } } -void AssemblerX8632::emitGenericShift(int rm, Type Ty, const AsmOperand &operand, +void AssemblerX8632::emitGenericShift(int rm, Type Ty, + const AsmOperand &operand, GPRRegister shifter) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); assert(shifter == Traits::Encoded_Reg_Counter);
diff --git a/third_party/subzero/src/IceAssemblerX8632.h b/third_party/subzero/src/IceAssemblerX8632.h index b0a375b..d4c1716 100644 --- a/third_party/subzero/src/IceAssemblerX8632.h +++ b/third_party/subzero/src/IceAssemblerX8632.h
@@ -34,6 +34,15 @@ namespace Ice { namespace X8632 { +using Traits = TargetX8632Traits; +using AsmAddress = typename Traits::AsmAddress; +using ByteRegister = typename Traits::ByteRegister; +using BrCond = CondX86::BrCond; +using CmppsCond = CondX86::CmppsCond; +using GPRRegister = typename Traits::GPRRegister; +using AsmOperand = typename Traits::AsmOperand; +using XmmRegister = typename Traits::XmmRegister; + class AssemblerX8632 : public ::Ice::Assembler { AssemblerX8632(const AssemblerX8632 &) = delete; AssemblerX8632 &operator=(const AssemblerX8632 &) = delete; @@ -42,15 +51,6 @@ explicit AssemblerX8632() : Assembler(Asm_X8632) {} public: - using Traits = TargetX8632Traits; - using AsmAddress = typename Traits::AsmAddress; - using ByteRegister = typename Traits::ByteRegister; - using BrCond = CondX86::BrCond; - using CmppsCond = CondX86::CmppsCond; - using GPRRegister = typename Traits::GPRRegister; - using AsmOperand = typename Traits::AsmOperand; - using XmmRegister = typename Traits::XmmRegister; - static constexpr int MAX_NOP_SIZE = 8; static bool classof(const Assembler *Asm) { @@ -447,16 +447,19 @@ void cvtps2dq(Type, XmmRegister dst, const AsmAddress &src); void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, GPRRegister src); - void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, const AsmAddress &src); + void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, + const AsmAddress &src); void cvtfloat2float(Type SrcTy, XmmRegister dst, XmmRegister src); void cvtfloat2float(Type SrcTy, XmmRegister dst, const AsmAddress &src); void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, XmmRegister src); - void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, const AsmAddress &src); + void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, + const AsmAddress &src); void cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy, XmmRegister src); - void cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy, const AsmAddress &src); + void cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy, + const AsmAddress &src); void ucomiss(Type Ty, XmmRegister a, XmmRegister b); void ucomiss(Type Ty, XmmRegister a, const AsmAddress &b); @@ -661,7 +664,8 @@ void mfence(); void lock(); - void cmpxchg(Type Ty, const AsmAddress &address, GPRRegister reg, bool Locked); + void cmpxchg(Type Ty, const AsmAddress &address, GPRRegister reg, + bool Locked); void cmpxchg8b(const AsmAddress &address, bool Locked); void xadd(Type Ty, const AsmAddress &address, GPRRegister reg, bool Locked); void xchg(Type Ty, GPRRegister reg0, GPRRegister reg1);
diff --git a/third_party/subzero/src/IceAssemblerX8664.cpp b/third_party/subzero/src/IceAssemblerX8664.cpp index f730760..24c4c10 100644 --- a/third_party/subzero/src/IceAssemblerX8664.cpp +++ b/third_party/subzero/src/IceAssemblerX8664.cpp
@@ -24,10 +24,82 @@ #include "IceCfg.h" #include "IceCfgNode.h" #include "IceOperand.h" +#include "IceTargetLoweringX8664.h" namespace Ice { namespace X8664 { +AsmAddress::AsmAddress(const Variable *Var, const TargetX8664 *Target) { + if (Var->hasReg()) + llvm::report_fatal_error("Stack Variable has a register assigned"); + if (Var->mustHaveReg()) { + llvm::report_fatal_error("Infinite-weight Variable (" + Var->getName() + + ") has no register assigned - function " + + Target->getFunc()->getFunctionName()); + } + int32_t Offset = Var->getStackOffset(); + auto BaseRegNum = Var->getBaseRegNum(); + if (Var->getBaseRegNum().hasNoValue()) { + // If the stack pointer needs alignment, we must use the frame pointer for + // arguments. For locals, getFrameOrStackReg will return the stack pointer + // in this case. + if (Target->needsStackPointerAlignment() && Var->getIsArg()) { + assert(Target->hasFramePointer()); + BaseRegNum = Target->getFrameReg(); + } else { + BaseRegNum = Target->getFrameOrStackReg(); + } + } + SetBase(Traits::getEncodedGPR(BaseRegNum), Offset, AssemblerFixup::NoFixup); +} + +AsmAddress::AsmAddress(const X86OperandMem *Mem, Ice::Assembler *Asm, + const Ice::TargetLowering *Target) { + int32_t Disp = 0; + if (Mem->getBase() && Mem->getBase()->isRematerializable()) { + Disp += Mem->getBase()->getRematerializableOffset(Target); + } + // The index should never be rematerializable. But if we ever allow it, then + // we should make sure the rematerialization offset is shifted by the Shift + // value. + assert(!Mem->getIndex() || !Mem->getIndex()->isRematerializable()); + + AssemblerFixup *Fixup = nullptr; + // Determine the offset (is it relocatable?) + if (Mem->getOffset() != nullptr) { + if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(Mem->getOffset())) { + Disp += static_cast<int32_t>(CI->getValue()); + } else if (const auto *CR = + llvm::dyn_cast<ConstantRelocatable>(Mem->getOffset())) { + const auto FixupKind = + (Mem->getBase() != nullptr || Mem->getIndex() != nullptr) ? FK_Abs + : FK_PcRel; + const RelocOffsetT DispAdjustment = FixupKind == FK_PcRel ? 4 : 0; + Fixup = Asm->createFixup(FixupKind, CR); + Fixup->set_addend(-DispAdjustment); + Disp = CR->getOffset(); + } else { + llvm_unreachable("Unexpected offset type"); + } + } + + // Now convert to the various possible forms. + if (Mem->getBase() && Mem->getIndex()) { + SetBaseIndex(getEncodedGPR(Mem->getBase()->getRegNum()), + getEncodedGPR(Mem->getIndex()->getRegNum()), + X8664::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); + } else if (Mem->getBase()) { + SetBase(getEncodedGPR(Mem->getBase()->getRegNum()), Disp, Fixup); + } else if (Mem->getIndex()) { + SetIndex(getEncodedGPR(Mem->getIndex()->getRegNum()), + X8664::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); + } else if (Fixup == nullptr) { + SetAbsolute(Disp); + } else { + SetRipRelative(Disp, Fixup); + } +} + AssemblerX8664::~AssemblerX8664() { if (BuildDefs::asserts()) { for (const Label *Label : CfgNodeLabels) { @@ -672,7 +744,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::pand(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::pand(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitRex(RexTypeIrrelevant, src, dst); @@ -690,7 +763,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::pandn(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::pandn(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitRex(RexTypeIrrelevant, src, dst); @@ -823,7 +897,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::por(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::por(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitRex(RexTypeIrrelevant, src, dst); @@ -931,7 +1006,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::pxor(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::pxor(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitRex(RexTypeIrrelevant, src, dst); @@ -1090,7 +1166,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::addps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::addps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitRex(RexTypeIrrelevant, src, dst); emitUint8(0x0F); @@ -1106,7 +1183,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::subps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::subps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitRex(RexTypeIrrelevant, src, dst); emitUint8(0x0F); @@ -1122,7 +1200,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::divps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::divps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitRex(RexTypeIrrelevant, src, dst); emitUint8(0x0F); @@ -1138,7 +1217,8 @@ emitXmmRegisterOperand(dst, src); } -void AssemblerX8664::mulps(Type /* Ty */, XmmRegister dst, const AsmAddress &src) { +void AssemblerX8664::mulps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitRex(RexTypeIrrelevant, src, dst); emitUint8(0x0F); @@ -1466,8 +1546,8 @@ emitUint8(imm.value()); } -void AssemblerX8664::pshufd(Type /* Ty */, XmmRegister dst, const AsmAddress &src, - const Immediate &imm) { +void AssemblerX8664::pshufd(Type /* Ty */, XmmRegister dst, + const AsmAddress &src, const Immediate &imm) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitUint8(0x66); emitRex(RexTypeIrrelevant, src, dst); @@ -1620,8 +1700,8 @@ emitUint8(imm.value()); } -void AssemblerX8664::shufps(Type /* Ty */, XmmRegister dst, const AsmAddress &src, - const Immediate &imm) { +void AssemblerX8664::shufps(Type /* Ty */, XmmRegister dst, + const AsmAddress &src, const Immediate &imm) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); emitRex(RexTypeIrrelevant, src, dst); emitUint8(0x0F); @@ -2283,7 +2363,8 @@ arith_int<1>(Ty, address, reg); } -void AssemblerX8664::Or(Type Ty, const AsmAddress &address, const Immediate &imm) { +void AssemblerX8664::Or(Type Ty, const AsmAddress &address, + const Immediate &imm) { arith_int<1>(Ty, address, imm); } @@ -2610,7 +2691,8 @@ emitGenericShift(0, Ty, AsmOperand(operand), shifter); } -void AssemblerX8664::rol(Type Ty, const AsmAddress &operand, GPRRegister shifter) { +void AssemblerX8664::rol(Type Ty, const AsmAddress &operand, + GPRRegister shifter) { emitGenericShift(0, Ty, operand, shifter); } @@ -2622,7 +2704,8 @@ emitGenericShift(4, Ty, AsmOperand(operand), shifter); } -void AssemblerX8664::shl(Type Ty, const AsmAddress &operand, GPRRegister shifter) { +void AssemblerX8664::shl(Type Ty, const AsmAddress &operand, + GPRRegister shifter) { emitGenericShift(4, Ty, operand, shifter); } @@ -2634,7 +2717,8 @@ emitGenericShift(5, Ty, AsmOperand(operand), shifter); } -void AssemblerX8664::shr(Type Ty, const AsmAddress &operand, GPRRegister shifter) { +void AssemblerX8664::shr(Type Ty, const AsmAddress &operand, + GPRRegister shifter) { emitGenericShift(5, Ty, operand, shifter); } @@ -2646,7 +2730,8 @@ emitGenericShift(7, Ty, AsmOperand(operand), shifter); } -void AssemblerX8664::sar(Type Ty, const AsmAddress &address, GPRRegister shifter) { +void AssemblerX8664::sar(Type Ty, const AsmAddress &address, + GPRRegister shifter) { emitGenericShift(7, Ty, address, shifter); } @@ -3001,8 +3086,8 @@ emitUint8(0xF0); } -void AssemblerX8664::cmpxchg(Type Ty, const AsmAddress &address, GPRRegister reg, - bool Locked) { +void AssemblerX8664::cmpxchg(Type Ty, const AsmAddress &address, + GPRRegister reg, bool Locked) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); if (Ty == IceType_i16) emitOperandSizeOverride(); @@ -3292,7 +3377,8 @@ } } -void AssemblerX8664::emitGenericShift(int rm, Type Ty, const AsmOperand &operand, +void AssemblerX8664::emitGenericShift(int rm, Type Ty, + const AsmOperand &operand, GPRRegister shifter) { AssemblerBuffer::EnsureCapacity ensured(&Buffer); assert(shifter == Traits::Encoded_Reg_Counter);
diff --git a/third_party/subzero/src/IceAssemblerX8664.h b/third_party/subzero/src/IceAssemblerX8664.h index 22f8292..457a572 100644 --- a/third_party/subzero/src/IceAssemblerX8664.h +++ b/third_party/subzero/src/IceAssemblerX8664.h
@@ -34,6 +34,15 @@ namespace Ice { namespace X8664 { +using Traits = TargetX8664Traits; +using AsmAddress = typename Traits::AsmAddress; +using ByteRegister = typename Traits::ByteRegister; +using BrCond = CondX86::BrCond; +using CmppsCond = CondX86::CmppsCond; +using GPRRegister = typename Traits::GPRRegister; +using AsmOperand = typename Traits::AsmOperand; +using XmmRegister = typename Traits::XmmRegister; + class AssemblerX8664 : public ::Ice::Assembler { AssemblerX8664(const AssemblerX8664 &) = delete; AssemblerX8664 &operator=(const AssemblerX8664 &) = delete; @@ -42,15 +51,6 @@ explicit AssemblerX8664() : Assembler(Asm_X8664) {} public: - using Traits = TargetX8664Traits; - using AsmAddress = typename Traits::AsmAddress; - using ByteRegister = typename Traits::ByteRegister; - using BrCond = CondX86::BrCond; - using CmppsCond = CondX86::CmppsCond; - using GPRRegister = typename Traits::GPRRegister; - using AsmOperand = typename Traits::AsmOperand; - using XmmRegister = typename Traits::XmmRegister; - static constexpr int MAX_NOP_SIZE = 8; static bool classof(const Assembler *Asm) { @@ -446,16 +446,19 @@ void cvtps2dq(Type, XmmRegister dst, const AsmAddress &src); void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, GPRRegister src); - void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, const AsmAddress &src); + void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, + const AsmAddress &src); void cvtfloat2float(Type SrcTy, XmmRegister dst, XmmRegister src); void cvtfloat2float(Type SrcTy, XmmRegister dst, const AsmAddress &src); void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, XmmRegister src); - void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, const AsmAddress &src); + void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, + const AsmAddress &src); void cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy, XmmRegister src); - void cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy, const AsmAddress &src); + void cvtss2si(Type DestTy, GPRRegister dst, Type SrcTy, + const AsmAddress &src); void ucomiss(Type Ty, XmmRegister a, XmmRegister b); void ucomiss(Type Ty, XmmRegister a, const AsmAddress &b); @@ -637,7 +640,8 @@ void mfence(); void lock(); - void cmpxchg(Type Ty, const AsmAddress &address, GPRRegister reg, bool Locked); + void cmpxchg(Type Ty, const AsmAddress &address, GPRRegister reg, + bool Locked); void cmpxchg8b(const AsmAddress &address, bool Locked); void xadd(Type Ty, const AsmAddress &address, GPRRegister reg, bool Locked); void xchg(Type Ty, GPRRegister reg0, GPRRegister reg1); @@ -749,8 +753,7 @@ // Addr's size. template <typename RegType, typename RmType> void assembleAndEmitRex(const Type TyReg, const RegType Reg, const Type TyRm, - const RmType Rm, - const AsmAddress *Addr = nullptr) { + const RmType Rm, const AsmAddress *Addr = nullptr) { const uint8_t W = (TyReg == IceType_i64 || TyRm == IceType_i64) ? AsmOperand::RexW : AsmOperand::RexNone;
diff --git a/third_party/subzero/src/IceInstX8632.cpp b/third_party/subzero/src/IceInstX8632.cpp index 29bef3b..f82679c 100644 --- a/third_party/subzero/src/IceInstX8632.cpp +++ b/third_party/subzero/src/IceInstX8632.cpp
@@ -527,11 +527,11 @@ if (Var->hasReg()) { Asm->call(Traits::getEncodedGPR(Var->getRegNum())); } else { - Asm->call(Target->stackVarToAsmAddress(Var, Target)); + Asm->call(AsmAddress(Var, Target)); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(CallTarget)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - Asm->call(Mem->toAsmAddress(Mem, Asm, Target)); + Asm->call(AsmAddress(Mem, Asm, Target)); } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { Asm->call(CR); } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { @@ -584,21 +584,20 @@ GPRRegister VarReg = Traits::getEncodedGPR(Var->getRegNum()); (Asm->*(Emitter.Reg))(Ty, VarReg); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Var, Target)); + AsmAddress StackAddr(AsmAddress(Var, Target)); (Asm->*(Emitter.Addr))(Ty, StackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Op)) { Mem->emitSegmentOverride(Asm); - (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Mem, Asm, Target)); + (Asm->*(Emitter.Addr))(Ty, AsmAddress(Mem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } } template <bool VarCanBeByte, bool SrcCanBeByte> -void emitIASRegOpTyGPR(const Cfg *Func, bool IsLea, Type Ty, - const Variable *Var, const Operand *Src, - const GPREmitterRegOp &Emitter) { +void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Var, + const Operand *Src, const GPREmitterRegOp &Emitter) { auto *Target = InstX86Base::getTarget(Func); Assembler *Asm = Func->getAssembler<Assembler>(); assert(Var->hasReg()); @@ -612,24 +611,23 @@ : Traits::getEncodedGPR(SrcVar->getRegNum()); (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { Mem->emitSegmentOverride(Asm); - (Asm->*(Emitter.GPRAddr))(Ty, VarReg, - Mem->toAsmAddress(Mem, Asm, Target, IsLea)); + (Asm->*(Emitter.GPRAddr))(Ty, VarReg, AsmAddress(Mem, Asm, Target)); } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { (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) ? Traits::FK_GotPC - : Traits::TargetLowering::getAbsFixup(); + : Traits::FK_Abs; AssemblerFixup *Fixup = Asm->createFixup(FixupKind, Reloc); (Asm->*(Emitter.GPRImm))(Ty, VarReg, AssemblerImmediate(Fixup)); } else if (const auto *Split = llvm::dyn_cast<VariableSplit>(Src)) { - (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Split, Func)); + (Asm->*(Emitter.GPRAddr))(Ty, VarReg, AsmAddress(Split, Func)); } else { llvm_unreachable("Unexpected operand type"); } @@ -649,7 +647,7 @@ const auto FixupKind = (Reloc->getName().hasStdString() && Reloc->getName().toString() == GlobalOffsetTable) ? Traits::FK_GotPC - : Traits::TargetLowering::getAbsFixup(); + : Traits::FK_Abs; AssemblerFixup *Fixup = Asm->createFixup(FixupKind, Reloc); (Asm->*(Emitter.AddrImm))(Ty, Addr, AssemblerImmediate(Fixup)); } else { @@ -662,16 +660,14 @@ auto *Target = InstX86Base::getTarget(Func); if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) { assert(!Op0Var->hasReg()); - AsmAddress StackAddr(Target->stackVarToAsmAddress(Op0Var, Target)); + AsmAddress StackAddr(AsmAddress(Op0Var, Target)); emitIASAddrOpTyGPR(Func, Ty, StackAddr, Op1, Emitter); } else if (const auto *Op0Mem = llvm::dyn_cast<X86OperandMem>(Op0)) { Assembler *Asm = Func->getAssembler<Assembler>(); Op0Mem->emitSegmentOverride(Asm); - emitIASAddrOpTyGPR(Func, Ty, Op0Mem->toAsmAddress(Op0Mem, Asm, Target), Op1, - Emitter); + emitIASAddrOpTyGPR(Func, Ty, AsmAddress(Op0Mem, Asm, Target), Op1, Emitter); } else if (const auto *Split = llvm::dyn_cast<VariableSplit>(Op0)) { - emitIASAddrOpTyGPR(Func, Ty, Split->toAsmAddress(Split, Func), Op1, - Emitter); + emitIASAddrOpTyGPR(Func, Ty, AsmAddress(Split, Func), Op1, Emitter); } else { llvm_unreachable("Unexpected operand type"); } @@ -730,12 +726,12 @@ XmmRegister SrcReg = Traits::getEncodedXmm(SrcVar->getRegNum()); (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Mem, Asm, Target)); + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress(Mem, Asm, Target)); } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { (Asm->*(Emitter.XmmImm))(Ty, VarReg, AssemblerImmediate(Imm->getValue())); } else { @@ -754,14 +750,14 @@ XmmRegister SrcReg = Traits::getEncodedXmm(SrcVar->getRegNum()); (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Mem, Asm, Target)); + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress(Mem, Asm, Target)); } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress::ofConstPool(Asm, Imm)); + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress(Imm, Asm)); } else { llvm_unreachable("Unexpected operand type"); } @@ -781,13 +777,13 @@ SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { Mem->emitSegmentOverride(Asm); (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, - Mem->toAsmAddress(Mem, Asm, Target)); + AsmAddress(Mem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } @@ -810,13 +806,13 @@ SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src0)) { Mem->emitSegmentOverride(Asm); (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, - Mem->toAsmAddress(Mem, Asm, Target), Imm); + AsmAddress(Mem, Asm, Target), Imm); } else { llvm_unreachable("Unexpected operand type"); } @@ -833,18 +829,17 @@ (Asm->*(Emitter.XmmXmm))(DestReg, Traits::getEncodedXmm(SrcVar->getRegNum())); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(SrcVar, Target)); + AsmAddress StackAddr(AsmAddress(SrcVar, Target)); (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); } } else if (const auto *SrcMem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(SrcMem->getSegmentRegister() == X86OperandMem::DefaultSegment); - (Asm->*(Emitter.XmmAddr))(DestReg, - SrcMem->toAsmAddress(SrcMem, Asm, Target)); + (Asm->*(Emitter.XmmAddr))(DestReg, AsmAddress(SrcMem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Dest, Target)); + AsmAddress StackAddr(AsmAddress(Dest, Target)); // Src must be a register in this case. const auto *SrcVar = llvm::cast<Variable>(Src); assert(SrcVar->hasReg()); @@ -1052,8 +1047,7 @@ assert(Var == this->getSrc(0)); static const GPREmitterRegOp Emitter = {&Assembler::imul, &Assembler::imul, &Assembler::imul}; - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, Ty, Var, Src, Emitter); + emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter); } } @@ -1309,13 +1303,13 @@ } else { Asm->cmov(SrcTy, Condition, Traits::getEncodedGPR(this->getDest()->getRegNum()), - Target->stackVarToAsmAddress(SrcVar, Target)); + AsmAddress(SrcVar, Target)); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); Asm->cmov(SrcTy, Condition, Traits::getEncodedGPR(this->getDest()->getRegNum()), - Mem->toAsmAddress(Mem, Asm, Target)); + AsmAddress(Mem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } @@ -1362,7 +1356,7 @@ Traits::getEncodedXmm(this->getDest()->getRegNum()), Traits::getEncodedXmm(SrcVar->getRegNum()), Condition); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); Asm->cmpps(this->getDest()->getType(), Traits::getEncodedXmm(this->getDest()->getRegNum()), SrcStackAddr, Condition); @@ -1405,7 +1399,7 @@ auto *Target = InstX86Base::getTarget(Func); const auto Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); assert(VarReg->hasReg()); const GPRRegister Reg = Traits::getEncodedGPR(VarReg->getRegNum()); @@ -1443,7 +1437,7 @@ const auto Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); auto *Target = InstX86Base::getTarget(Func); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); Asm->cmpxchg8b(Addr, this->Locked); } @@ -1613,8 +1607,7 @@ &Assembler::cmp}; if (const auto *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { if (SrcVar0->hasReg()) { - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, Ty, SrcVar0, Src1, RegEmitter); + emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); return; } } @@ -1729,8 +1722,7 @@ &Assembler::test}; if (const auto *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { if (SrcVar0->hasReg()) { - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, Ty, SrcVar0, Src1, RegEmitter); + emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); return; } } @@ -1795,12 +1787,12 @@ auto *Target = InstX86Base::getTarget(Func); if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { assert(!DestVar->hasReg()); - AsmAddress StackAddr(Target->stackVarToAsmAddress(DestVar, Target)); + AsmAddress StackAddr(AsmAddress(DestVar, Target)); Asm->movss(DestTy, StackAddr, SrcReg); } else { const auto DestMem = llvm::cast<X86OperandMem>(Dest); assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); - Asm->movss(DestTy, DestMem->toAsmAddress(DestMem, Asm, Target), SrcReg); + Asm->movss(DestTy, AsmAddress(DestMem, Asm, Target), SrcReg); } return; } else { @@ -1842,7 +1834,7 @@ assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); assert(SrcVar->hasReg()); auto *Target = InstX86Base::getTarget(Func); - Asm->movups(DestMem->toAsmAddress(DestMem, Asm, Target), + Asm->movups(AsmAddress(DestMem, Asm, Target), Traits::getEncodedXmm(SrcVar->getRegNum())); } @@ -1879,7 +1871,7 @@ assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); assert(SrcVar->hasReg()); auto *Target = InstX86Base::getTarget(Func); - Asm->movq(DestMem->toAsmAddress(DestMem, Asm, Target), + Asm->movq(AsmAddress(DestMem, Asm, Target), Traits::getEncodedXmm(SrcVar->getRegNum())); } @@ -1916,7 +1908,7 @@ assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); assert(SrcVar->hasReg()); auto *Target = InstX86Base::getTarget(Func); - Asm->movd(SrcVar->getType(), DestMem->toAsmAddress(DestMem, Asm, Target), + Asm->movd(SrcVar->getType(), AsmAddress(DestMem, Asm, Target), Traits::getEncodedXmm(SrcVar->getRegNum())); } @@ -1963,14 +1955,13 @@ const Variable *Var = this->getDest(); Type Ty = Var->getType(); const Operand *Src = this->getSrc(0); - bool IsLea = true; if (auto *Add = this->deoptToAddOrNull(Func)) { Add->emitIAS(Func); return; } - emitIASRegOpTyGPR(Func, IsLea, Ty, Var, Src, Emitter); + emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter); } Inst *InstX86Lea::deoptToAddOrNull(const Cfg *Func) const { @@ -2061,14 +2052,13 @@ if (isScalarIntegerType(SrcTy)) { SrcTy = DestTy; } - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, DestTy, Dest, Src, GPRRegEmitter); + emitIASRegOpTyGPR(Func, DestTy, Dest, Src, GPRRegEmitter); return; } } else { // Dest must be Stack and Src *could* be a register. Use Src's type to // decide on the emitters. - AsmAddress StackAddr(Target->stackVarToAsmAddress(Dest, Target)); + AsmAddress StackAddr(AsmAddress(Dest, Target)); if (isScalarFloatingType(SrcTy)) { // Src must be a register. const auto *SrcVar = llvm::cast<Variable>(Src); @@ -2134,7 +2124,7 @@ Asm->movd(SrcVar->getType(), DestReg, Traits::getEncodedGPR(SrcVar->getRegNum())); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(SrcVar, Target)); + AsmAddress StackAddr(AsmAddress(SrcVar, Target)); Asm->movd(SrcVar->getType(), DestReg, StackAddr); } } else { @@ -2149,7 +2139,7 @@ Asm->movd(Dest->getType(), Traits::getEncodedGPR(Dest->getRegNum()), SrcReg); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Dest, Target)); + AsmAddress StackAddr(AsmAddress(Dest, Target)); Asm->movd(Dest->getType(), StackAddr, SrcReg); } } @@ -2157,7 +2147,7 @@ assert(Dest->hasReg()); XmmRegister DestReg = Traits::getEncodedXmm(Dest->getRegNum()); auto *Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); - Asm->movd(Mem->getType(), DestReg, Mem->toAsmAddress(Mem, Asm, Target)); + Asm->movd(Mem->getType(), DestReg, AsmAddress(Mem, Asm, Target)); } } @@ -2236,8 +2226,7 @@ Type SrcTy = Src->getType(); assert(typeWidthInBytes(Dest->getType()) > 1); assert(typeWidthInBytes(Dest->getType()) > typeWidthInBytes(SrcTy)); - constexpr bool NotLea = false; - emitIASRegOpTyGPR<false, true>(Func, NotLea, SrcTy, Dest, Src, this->Emitter); + emitIASRegOpTyGPR<false, true>(Func, SrcTy, Dest, Src, this->Emitter); } void InstX86Movzx::emit(const Cfg *Func) const { @@ -2253,8 +2242,7 @@ Type SrcTy = Src->getType(); assert(typeWidthInBytes(Dest->getType()) > 1); assert(typeWidthInBytes(Dest->getType()) > typeWidthInBytes(SrcTy)); - constexpr bool NotLea = false; - emitIASRegOpTyGPR<false, true>(Func, NotLea, SrcTy, Dest, Src, this->Emitter); + emitIASRegOpTyGPR<false, true>(Func, SrcTy, Dest, Src, this->Emitter); } void InstX86Nop::emit(const Cfg *Func) const { @@ -2320,19 +2308,18 @@ // This is a physical xmm register, so we need to spill it to a temporary // stack slot. Function prolog emission guarantees that there is // sufficient space to do this. - AsmAddress StackSlot = - AsmAddress(RegisterSet::Encoded_Reg_esp, 0, AssemblerFixup::NoFixup); + AsmAddress StackSlot = AsmAddress(RegisterSet::Encoded_Reg_esp, 0); Asm->movss(Ty, StackSlot, Traits::getEncodedXmm(Var->getRegNum())); Asm->fld(Ty, StackSlot); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Var, Target)); + AsmAddress StackAddr(AsmAddress(Var, Target)); Asm->fld(Ty, StackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - Asm->fld(Ty, Mem->toAsmAddress(Mem, Asm, Target)); + Asm->fld(Ty, AsmAddress(Mem, Asm, Target)); } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { - Asm->fld(Ty, AsmAddress::ofConstPool(Asm, Imm)); + Asm->fld(Ty, AsmAddress(Imm, Asm)); } else { llvm_unreachable("Unexpected operand type"); } @@ -2398,14 +2385,13 @@ auto *Target = InstX86Base::getTarget(Func); Type Ty = Dest->getType(); if (!Dest->hasReg()) { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Dest, Target)); + AsmAddress StackAddr(AsmAddress(Dest, Target)); Asm->fstp(Ty, StackAddr); } else { // Dest is a physical (xmm) register, so st(0) needs to go through memory. // Hack this by using caller-reserved memory at the top of stack, spilling // st(0) there, and loading it into the xmm register. - AsmAddress StackSlot = - AsmAddress(RegisterSet::Encoded_Reg_esp, 0, AssemblerFixup::NoFixup); + AsmAddress StackSlot = AsmAddress(RegisterSet::Encoded_Reg_esp, 0); Asm->fstp(Ty, StackSlot); Asm->movss(Ty, Traits::getEncodedXmm(Dest->getRegNum()), StackSlot); } @@ -2553,7 +2539,7 @@ Asm->popl(Traits::getEncodedGPR(this->getDest()->getRegNum())); } else { auto *Target = InstX86Base::getTarget(Func); - Asm->popl(Target->stackVarToAsmAddress(this->getDest(), Target)); + Asm->popl(AsmAddress(this->getDest(), Target)); } } @@ -2645,8 +2631,7 @@ Asm->setcc(Condition, Traits::getEncodedByteReg(this->getDest()->getRegNum())); else - Asm->setcc(Condition, - Target->stackVarToAsmAddress(this->getDest(), Target)); + Asm->setcc(Condition, AsmAddress(this->getDest(), Target)); return; } @@ -2681,7 +2666,7 @@ const auto Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); auto *Target = InstX86Base::getTarget(Func); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); assert(VarReg->hasReg()); const GPRRegister Reg = Traits::getEncodedGPR(VarReg->getRegNum()); @@ -2730,7 +2715,7 @@ const auto *Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); auto *Target = InstX86Base::getTarget(Func); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); Asm->xchg(Ty, Addr, Reg1); } @@ -2851,44 +2836,17 @@ } } -namespace { - -int32_t getRematerializableOffset(Variable *Var, - const Ice::X8632::TargetX8632 *Target) { - int32_t Disp = Var->getStackOffset(); - const auto RegNum = Var->getRegNum(); - if (RegNum == Target->getFrameReg()) { - Disp += Target->getFrameFixedAllocaOffset(); - } else if (RegNum != Target->getStackReg()) { - llvm::report_fatal_error("Unexpected rematerializable register type"); - } - return Disp; -} - -void validateMemOperandPIC(const TargetX8632Traits::X86OperandMem *Mem) { - if (!BuildDefs::asserts()) - return; - const bool HasCR = - Mem->getOffset() && llvm::isa<ConstantRelocatable>(Mem->getOffset()); - (void)HasCR; - const bool IsRebased = Mem->getIsRebased(); - (void)IsRebased; - assert(!IsRebased); -} - -} // end of anonymous namespace - void TargetX8632Traits::X86OperandMem::emit(const Cfg *Func) const { if (!BuildDefs::dump()) return; - validateMemOperandPIC(this); + validateMemOperandPIC(); const auto *Target = static_cast<const ::Ice::X8632::TargetX8632 *>(Func->getTarget()); // If the base is rematerializable, we need to replace it with the correct // physical register (esp or ebp), and update the Offset. int32_t Disp = 0; if (getBase() && getBase()->isRematerializable()) { - Disp += getRematerializableOffset(getBase(), Target); + Disp += getBase()->getRematerializableOffset(Target); } // The index should never be rematerializable. But if we ever allow it, then // we should make sure the rematerialization offset is shifted by the Shift @@ -2948,7 +2906,7 @@ const auto *Target = static_cast<const ::Ice::X8632::TargetX8632 *>(Func->getTarget()); if (getBase() && getBase()->isRematerializable()) { - Disp += getRematerializableOffset(getBase(), Target); + Disp += getBase()->getRematerializableOffset(Target); } if (getBase()) { if (Func) @@ -3007,60 +2965,6 @@ } } -AsmAddress TargetX8632Traits::X86OperandMem::toAsmAddress( - const X86OperandMem *Mem, TargetX8632Traits::Assembler *Asm, - const Ice::TargetLowering *TargetLowering, bool /*IsLeaAddr*/) { - const auto *Target = - static_cast<const ::Ice::X8632::TargetX8632 *>(TargetLowering); - validateMemOperandPIC(Mem); - int32_t Disp = 0; - if (Mem->getBase() && Mem->getBase()->isRematerializable()) { - Disp += getRematerializableOffset(Mem->getBase(), Target); - } - // The index should never be rematerializable. But if we ever allow it, then - // we should make sure the rematerialization offset is shifted by the Shift - // value. - if (Mem->getIndex()) - assert(!Mem->getIndex()->isRematerializable()); - AssemblerFixup *Fixup = nullptr; - // Determine the offset (is it relocatable?) - if (Mem->getOffset()) { - if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(Mem->getOffset())) { - Disp += static_cast<int32_t>(CI->getValue()); - } else if (const auto CR = - llvm::dyn_cast<ConstantRelocatable>(Mem->getOffset())) { - Disp += CR->getOffset(); - Fixup = Asm->createFixup(Target->getAbsFixup(), CR); - } else { - llvm_unreachable("Unexpected offset type"); - } - } - - // Now convert to the various possible forms. - if (Mem->getBase() && Mem->getIndex()) { - return AsmAddress(getEncodedGPR(Mem->getBase()->getRegNum()), - getEncodedGPR(Mem->getIndex()->getRegNum()), - X8632::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); - } else if (Mem->getBase()) { - return AsmAddress(getEncodedGPR(Mem->getBase()->getRegNum()), Disp, Fixup); - } else if (Mem->getIndex()) { - return AsmAddress(getEncodedGPR(Mem->getIndex()->getRegNum()), - X8632::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); - } else { - return AsmAddress(Disp, Fixup); - } -} - -AsmAddress -TargetX8632Traits::VariableSplit::toAsmAddress(const VariableSplit *Split, - const Cfg *Func) { - assert(!Split->getVar()->hasReg()); - const ::Ice::TargetLowering *Target = Func->getTarget(); - int32_t Offset = Split->getVar()->getStackOffset() + Split->getOffset(); - return AsmAddress(getEncodedGPR(Target->getFrameOrStackReg()), Offset, - AssemblerFixup::NoFixup); -} - void TargetX8632Traits::VariableSplit::emit(const Cfg *Func) const { if (!BuildDefs::dump()) return;
diff --git a/third_party/subzero/src/IceInstX8632.h b/third_party/subzero/src/IceInstX8632.h index ce0b44a..e38d627 100644 --- a/third_party/subzero/src/IceInstX8632.h +++ b/third_party/subzero/src/IceInstX8632.h
@@ -516,9 +516,8 @@ /// Emit a two-operand (GPR) instruction, where the dest operand is a Variable /// that's guaranteed to be a register. template <bool VarCanBeByte = true, bool SrcCanBeByte = true> -void emitIASRegOpTyGPR(const Cfg *Func, bool IsLea, Type Ty, - const Variable *Dst, const Operand *Src, - const GPREmitterRegOp &Emitter); +void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Dst, + const Operand *Src, const GPREmitterRegOp &Emitter); /// Instructions of the form x := op(x). template <typename InstX86Base::InstKindX86 K> @@ -600,8 +599,7 @@ const Variable *Var = this->getDest(); Type Ty = Var->getType(); const Operand *Src = this->getSrc(0); - bool IsLea = false; - emitIASRegOpTyGPR(Func, IsLea, Ty, Var, Src, Emitter); + emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter); } void dump(const Cfg *Func) const override { if (!BuildDefs::dump()) @@ -732,10 +730,8 @@ void emitIAS(const Cfg *Func) const override { Type Ty = this->getDest()->getType(); assert(this->getSrcSize() == 2); - constexpr bool ThisIsLEA = K == InstX86Base::Lea; - static_assert(!ThisIsLEA, "Lea should be a unaryop."); - emitIASRegOpTyGPR(Func, !ThisIsLEA, Ty, this->getDest(), this->getSrc(1), - Emitter); + static_assert(K != InstX86Base::Lea, "Lea should be a unaryop."); + emitIASRegOpTyGPR(Func, Ty, this->getDest(), this->getSrc(1), Emitter); } void dump(const Cfg *Func) const override { if (!BuildDefs::dump())
diff --git a/third_party/subzero/src/IceInstX8664.cpp b/third_party/subzero/src/IceInstX8664.cpp index 4f5a53a..39f5212 100644 --- a/third_party/subzero/src/IceInstX8664.cpp +++ b/third_party/subzero/src/IceInstX8664.cpp
@@ -527,11 +527,11 @@ if (Var->hasReg()) { Asm->call(Traits::getEncodedGPR(Var->getRegNum())); } else { - Asm->call(Target->stackVarToAsmAddress(Var, Target)); + Asm->call(AsmAddress(Var, Target)); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(CallTarget)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - Asm->call(Mem->toAsmAddress(Mem, Asm, Target)); + Asm->call(AsmAddress(Mem, Asm, Target)); } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { Asm->call(CR); } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { @@ -584,21 +584,20 @@ GPRRegister VarReg = Traits::getEncodedGPR(Var->getRegNum()); (Asm->*(Emitter.Reg))(Ty, VarReg); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Var, Target)); + AsmAddress StackAddr(AsmAddress(Var, Target)); (Asm->*(Emitter.Addr))(Ty, StackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Op)) { Mem->emitSegmentOverride(Asm); - (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Mem, Asm, Target)); + (Asm->*(Emitter.Addr))(Ty, AsmAddress(Mem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } } template <bool VarCanBeByte, bool SrcCanBeByte> -void emitIASRegOpTyGPR(const Cfg *Func, bool IsLea, Type Ty, - const Variable *Var, const Operand *Src, - const GPREmitterRegOp &Emitter) { +void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Var, + const Operand *Src, const GPREmitterRegOp &Emitter) { auto *Target = InstX86Base::getTarget(Func); Assembler *Asm = Func->getAssembler<Assembler>(); assert(Var->hasReg()); @@ -612,13 +611,12 @@ : Traits::getEncodedGPR(SrcVar->getRegNum()); (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { Mem->emitSegmentOverride(Asm); - (Asm->*(Emitter.GPRAddr))(Ty, VarReg, - Mem->toAsmAddress(Mem, Asm, Target, IsLea)); + (Asm->*(Emitter.GPRAddr))(Ty, VarReg, AsmAddress(Mem, Asm, Target)); } 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)) { @@ -628,7 +626,7 @@ const auto FixupKind = (Reloc->getName().hasStdString() && Reloc->getName().toString() == GlobalOffsetTable) ? Traits::FK_GotPC - : Traits::TargetLowering::getAbsFixup(); + : Traits::FK_Abs; AssemblerFixup *Fixup = Asm->createFixup(FixupKind, Reloc); (Asm->*(Emitter.GPRImm))(Ty, VarReg, AssemblerImmediate(Fixup)); } else { @@ -653,7 +651,7 @@ const auto FixupKind = (Reloc->getName().hasStdString() && Reloc->getName().toString() == GlobalOffsetTable) ? Traits::FK_GotPC - : Traits::TargetLowering::getAbsFixup(); + : Traits::FK_Abs; AssemblerFixup *Fixup = Asm->createFixup(FixupKind, Reloc); (Asm->*(Emitter.AddrImm))(Ty, Addr, AssemblerImmediate(Fixup)); } else { @@ -666,13 +664,12 @@ auto *Target = InstX86Base::getTarget(Func); if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) { assert(!Op0Var->hasReg()); - AsmAddress StackAddr(Target->stackVarToAsmAddress(Op0Var, Target)); + AsmAddress StackAddr(AsmAddress(Op0Var, Target)); emitIASAddrOpTyGPR(Func, Ty, StackAddr, Op1, Emitter); } else if (const auto *Op0Mem = llvm::dyn_cast<X86OperandMem>(Op0)) { Assembler *Asm = Func->getAssembler<Assembler>(); Op0Mem->emitSegmentOverride(Asm); - emitIASAddrOpTyGPR(Func, Ty, Op0Mem->toAsmAddress(Op0Mem, Asm, Target), Op1, - Emitter); + emitIASAddrOpTyGPR(Func, Ty, AsmAddress(Op0Mem, Asm, Target), Op1, Emitter); } else { llvm_unreachable("Unexpected operand type"); } @@ -734,12 +731,12 @@ XmmRegister SrcReg = Traits::getEncodedXmm(SrcVar->getRegNum()); (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Mem, Asm, Target)); + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress(Mem, Asm, Target)); } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { (Asm->*(Emitter.XmmImm))(Ty, VarReg, AssemblerImmediate(Imm->getValue())); } else { @@ -758,14 +755,14 @@ XmmRegister SrcReg = Traits::getEncodedXmm(SrcVar->getRegNum()); (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Mem, Asm, Target)); + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress(Mem, Asm, Target)); } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress::ofConstPool(Asm, Imm)); + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, AsmAddress(Imm, Asm)); } else { llvm_unreachable("Unexpected operand type"); } @@ -785,13 +782,13 @@ SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { Mem->emitSegmentOverride(Asm); (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, - Mem->toAsmAddress(Mem, Asm, Target)); + AsmAddress(Mem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } @@ -814,13 +811,13 @@ SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src0)) { Mem->emitSegmentOverride(Asm); (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, - Mem->toAsmAddress(Mem, Asm, Target), Imm); + AsmAddress(Mem, Asm, Target), Imm); } else { llvm_unreachable("Unexpected operand type"); } @@ -837,18 +834,17 @@ (Asm->*(Emitter.XmmXmm))(DestReg, Traits::getEncodedXmm(SrcVar->getRegNum())); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(SrcVar, Target)); + AsmAddress StackAddr(AsmAddress(SrcVar, Target)); (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); } } else if (const auto *SrcMem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(SrcMem->getSegmentRegister() == X86OperandMem::DefaultSegment); - (Asm->*(Emitter.XmmAddr))(DestReg, - SrcMem->toAsmAddress(SrcMem, Asm, Target)); + (Asm->*(Emitter.XmmAddr))(DestReg, AsmAddress(SrcMem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Dest, Target)); + AsmAddress StackAddr(AsmAddress(Dest, Target)); // Src must be a register in this case. const auto *SrcVar = llvm::cast<Variable>(Src); assert(SrcVar->hasReg()); @@ -1056,8 +1052,7 @@ assert(Var == this->getSrc(0)); static const GPREmitterRegOp Emitter = {&Assembler::imul, &Assembler::imul, &Assembler::imul}; - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, Ty, Var, Src, Emitter); + emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter); } } @@ -1323,13 +1318,13 @@ } else { Asm->cmov(SrcTy, Condition, Traits::getEncodedGPR(this->getDest()->getRegNum()), - Target->stackVarToAsmAddress(SrcVar, Target)); + AsmAddress(SrcVar, Target)); } } else if (const auto *Mem = llvm::dyn_cast<X86OperandMem>(Src)) { assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); Asm->cmov(SrcTy, Condition, Traits::getEncodedGPR(this->getDest()->getRegNum()), - Mem->toAsmAddress(Mem, Asm, Target)); + AsmAddress(Mem, Asm, Target)); } else { llvm_unreachable("Unexpected operand type"); } @@ -1376,7 +1371,7 @@ Traits::getEncodedXmm(this->getDest()->getRegNum()), Traits::getEncodedXmm(SrcVar->getRegNum()), Condition); } else { - AsmAddress SrcStackAddr = Target->stackVarToAsmAddress(SrcVar, Target); + AsmAddress SrcStackAddr = AsmAddress(SrcVar, Target); Asm->cmpps(this->getDest()->getType(), Traits::getEncodedXmm(this->getDest()->getRegNum()), SrcStackAddr, Condition); @@ -1419,7 +1414,7 @@ auto *Target = InstX86Base::getTarget(Func); const auto Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); assert(VarReg->hasReg()); const GPRRegister Reg = Traits::getEncodedGPR(VarReg->getRegNum()); @@ -1457,7 +1452,7 @@ const auto Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); auto *Target = InstX86Base::getTarget(Func); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); Asm->cmpxchg8b(Addr, this->Locked); } @@ -1627,8 +1622,7 @@ &Assembler::cmp}; if (const auto *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { if (SrcVar0->hasReg()) { - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, Ty, SrcVar0, Src1, RegEmitter); + emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); return; } } @@ -1743,8 +1737,7 @@ &Assembler::test}; if (const auto *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { if (SrcVar0->hasReg()) { - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, Ty, SrcVar0, Src1, RegEmitter); + emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); return; } } @@ -1809,12 +1802,12 @@ auto *Target = InstX86Base::getTarget(Func); if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { assert(!DestVar->hasReg()); - AsmAddress StackAddr(Target->stackVarToAsmAddress(DestVar, Target)); + AsmAddress StackAddr(AsmAddress(DestVar, Target)); Asm->movss(DestTy, StackAddr, SrcReg); } else { const auto DestMem = llvm::cast<X86OperandMem>(Dest); assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); - Asm->movss(DestTy, DestMem->toAsmAddress(DestMem, Asm, Target), SrcReg); + Asm->movss(DestTy, AsmAddress(DestMem, Asm, Target), SrcReg); } return; } else { @@ -1856,7 +1849,7 @@ assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); assert(SrcVar->hasReg()); auto *Target = InstX86Base::getTarget(Func); - Asm->movups(DestMem->toAsmAddress(DestMem, Asm, Target), + Asm->movups(AsmAddress(DestMem, Asm, Target), Traits::getEncodedXmm(SrcVar->getRegNum())); } @@ -1893,7 +1886,7 @@ assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); assert(SrcVar->hasReg()); auto *Target = InstX86Base::getTarget(Func); - Asm->movq(DestMem->toAsmAddress(DestMem, Asm, Target), + Asm->movq(AsmAddress(DestMem, Asm, Target), Traits::getEncodedXmm(SrcVar->getRegNum())); } @@ -1930,7 +1923,7 @@ assert(DestMem->getSegmentRegister() == X86OperandMem::DefaultSegment); assert(SrcVar->hasReg()); auto *Target = InstX86Base::getTarget(Func); - Asm->movd(SrcVar->getType(), DestMem->toAsmAddress(DestMem, Asm, Target), + Asm->movd(SrcVar->getType(), AsmAddress(DestMem, Asm, Target), Traits::getEncodedXmm(SrcVar->getRegNum())); } @@ -1977,14 +1970,13 @@ const Variable *Var = this->getDest(); Type Ty = Var->getType(); const Operand *Src = this->getSrc(0); - bool IsLea = true; if (auto *Add = this->deoptToAddOrNull(Func)) { Add->emitIAS(Func); return; } - emitIASRegOpTyGPR(Func, IsLea, Ty, Var, Src, Emitter); + emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter); } Inst *InstX86Lea::deoptToAddOrNull(const Cfg *Func) const { @@ -2089,14 +2081,13 @@ if (isScalarIntegerType(SrcTy)) { SrcTy = DestTy; } - constexpr bool NotLea = false; - emitIASRegOpTyGPR(Func, NotLea, DestTy, Dest, Src, GPRRegEmitter); + emitIASRegOpTyGPR(Func, DestTy, Dest, Src, GPRRegEmitter); return; } } else { // Dest must be Stack and Src *could* be a register. Use Src's type to // decide on the emitters. - AsmAddress StackAddr(Target->stackVarToAsmAddress(Dest, Target)); + AsmAddress StackAddr(AsmAddress(Dest, Target)); if (isScalarFloatingType(SrcTy)) { // Src must be a register. const auto *SrcVar = llvm::cast<Variable>(Src); @@ -2162,7 +2153,7 @@ Asm->movd(SrcVar->getType(), DestReg, Traits::getEncodedGPR(SrcVar->getRegNum())); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(SrcVar, Target)); + AsmAddress StackAddr(AsmAddress(SrcVar, Target)); Asm->movd(SrcVar->getType(), DestReg, StackAddr); } } else { @@ -2177,7 +2168,7 @@ Asm->movd(Dest->getType(), Traits::getEncodedGPR(Dest->getRegNum()), SrcReg); } else { - AsmAddress StackAddr(Target->stackVarToAsmAddress(Dest, Target)); + AsmAddress StackAddr(AsmAddress(Dest, Target)); Asm->movd(Dest->getType(), StackAddr, SrcReg); } } @@ -2185,7 +2176,7 @@ assert(Dest->hasReg()); XmmRegister DestReg = Traits::getEncodedXmm(Dest->getRegNum()); auto *Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); - Asm->movd(Mem->getType(), DestReg, Mem->toAsmAddress(Mem, Asm, Target)); + Asm->movd(Mem->getType(), DestReg, AsmAddress(Mem, Asm, Target)); } } @@ -2264,8 +2255,7 @@ Type SrcTy = Src->getType(); assert(typeWidthInBytes(Dest->getType()) > 1); assert(typeWidthInBytes(Dest->getType()) > typeWidthInBytes(SrcTy)); - constexpr bool NotLea = false; - emitIASRegOpTyGPR<false, true>(Func, NotLea, SrcTy, Dest, Src, this->Emitter); + emitIASRegOpTyGPR<false, true>(Func, SrcTy, Dest, Src, this->Emitter); } bool InstX86Movzx::mayBeElided(const Variable *Dest, @@ -2329,8 +2319,7 @@ mayBeElided(Dest, Src)) { return; } - constexpr bool NotLea = false; - emitIASRegOpTyGPR<false, true>(Func, NotLea, SrcTy, Dest, Src, this->Emitter); + emitIASRegOpTyGPR<false, true>(Func, SrcTy, Dest, Src, this->Emitter); } void InstX86Nop::emit(const Cfg *Func) const { @@ -2490,7 +2479,7 @@ Asm->popl(Traits::getEncodedGPR(this->getDest()->getRegNum())); } else { auto *Target = InstX86Base::getTarget(Func); - Asm->popl(Target->stackVarToAsmAddress(this->getDest(), Target)); + Asm->popl(AsmAddress(this->getDest(), Target)); } } @@ -2582,8 +2571,7 @@ Asm->setcc(Condition, Traits::getEncodedByteReg(this->getDest()->getRegNum())); else - Asm->setcc(Condition, - Target->stackVarToAsmAddress(this->getDest(), Target)); + Asm->setcc(Condition, AsmAddress(this->getDest(), Target)); return; } @@ -2618,7 +2606,7 @@ const auto Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); auto *Target = InstX86Base::getTarget(Func); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); assert(VarReg->hasReg()); const GPRRegister Reg = Traits::getEncodedGPR(VarReg->getRegNum()); @@ -2667,7 +2655,7 @@ const auto *Mem = llvm::cast<X86OperandMem>(this->getSrc(0)); assert(Mem->getSegmentRegister() == X86OperandMem::DefaultSegment); auto *Target = InstX86Base::getTarget(Func); - const AsmAddress Addr = Mem->toAsmAddress(Mem, Asm, Target); + const AsmAddress Addr = AsmAddress(Mem, Asm, Target); Asm->xchg(Ty, Addr, Reg1); } @@ -2778,30 +2766,15 @@ } } -namespace { -int32_t getRematerializableOffset(Variable *Var, - const ::Ice::X8664::TargetX8664 *Target) { - int32_t Disp = Var->getStackOffset(); - const auto RegNum = Var->getRegNum(); - if (RegNum == Target->getFrameReg()) { - Disp += Target->getFrameFixedAllocaOffset(); - } else if (RegNum != Target->getStackReg()) { - llvm::report_fatal_error("Unexpected rematerializable register type"); - } - return Disp; -} -} // end of anonymous namespace - void TargetX8664Traits::X86OperandMem::emit(const Cfg *Func) const { if (!BuildDefs::dump()) return; - const auto *Target = - static_cast<const ::Ice::X8664::TargetX8664 *>(Func->getTarget()); + const auto *Target = Func->getTarget(); // If the base is rematerializable, we need to replace it with the correct // physical register (stack or base pointer), and update the Offset. int32_t Disp = 0; if (getBase() && getBase()->isRematerializable()) { - Disp += getRematerializableOffset(getBase(), Target); + Disp += getBase()->getRematerializableOffset(Target); } // The index should never be rematerializable. But if we ever allow it, then // we should make sure the rematerialization offset is shifted by the Shift @@ -2878,7 +2851,7 @@ const auto *Target = static_cast<const ::Ice::X8664::TargetX8664 *>(Func->getTarget()); if (getBase() && getBase()->isRematerializable()) { - Disp += getRematerializableOffset(getBase(), Target); + Disp += getBase()->getRematerializableOffset(Target); } if (Base) { if (Func) @@ -2928,59 +2901,5 @@ Str << "]"; } -AsmAddress TargetX8664Traits::X86OperandMem::toAsmAddress( - const X86OperandMem *Mem, TargetX8664Traits::Assembler *Asm, - const Ice::TargetLowering *TargetLowering, bool IsLeaAddr) { - (void)IsLeaAddr; - const auto *Target = - static_cast<const ::Ice::X8664::TargetX8664 *>(TargetLowering); - int32_t Disp = 0; - if (Mem->getBase() && Mem->getBase()->isRematerializable()) { - Disp += getRematerializableOffset(Mem->getBase(), Target); - } - assert(!Mem->getIndex() || !Mem->getIndex()->isRematerializable()); - - AssemblerFixup *Fixup = nullptr; - // Determine the offset (is it relocatable?) - if (Mem->getOffset() != nullptr) { - if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(Mem->getOffset())) { - Disp += static_cast<int32_t>(CI->getValue()); - } else if (const auto *CR = - llvm::dyn_cast<ConstantRelocatable>(Mem->getOffset())) { - const auto FixupKind = - (Mem->getBase() != nullptr || Mem->getIndex() != nullptr) ? FK_Abs - : FK_PcRel; - const RelocOffsetT DispAdjustment = FixupKind == FK_PcRel ? 4 : 0; - Fixup = Asm->createFixup(FixupKind, CR); - Fixup->set_addend(-DispAdjustment); - Disp = CR->getOffset(); - } else { - llvm_unreachable("Unexpected offset type"); - } - } - - // Now convert to the various possible forms. - if (Mem->getBase() && Mem->getIndex()) { - return AsmAddress(getEncodedGPR(Mem->getBase()->getRegNum()), - getEncodedGPR(Mem->getIndex()->getRegNum()), - X8664::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); - } - - if (Mem->getBase()) { - return AsmAddress(getEncodedGPR(Mem->getBase()->getRegNum()), Disp, Fixup); - } - - if (Mem->getIndex()) { - return AsmAddress(getEncodedGPR(Mem->getIndex()->getRegNum()), - X8664::Traits::ScaleFactor(Mem->getShift()), Disp, Fixup); - } - - if (Fixup == nullptr) { - return AsmAddress::Absolute(Disp); - } - - return AsmAddress::RipRelative(Disp, Fixup); -} - } // namespace X8664 } // end of namespace Ice
diff --git a/third_party/subzero/src/IceInstX8664.h b/third_party/subzero/src/IceInstX8664.h index 5e29545..f0aa3fa 100644 --- a/third_party/subzero/src/IceInstX8664.h +++ b/third_party/subzero/src/IceInstX8664.h
@@ -513,9 +513,8 @@ /// Emit a two-operand (GPR) instruction, where the dest operand is a Variable /// that's guaranteed to be a register. template <bool VarCanBeByte = true, bool SrcCanBeByte = true> -void emitIASRegOpTyGPR(const Cfg *Func, bool IsLea, Type Ty, - const Variable *Dst, const Operand *Src, - const GPREmitterRegOp &Emitter); +void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Dst, + const Operand *Src, const GPREmitterRegOp &Emitter); /// Instructions of the form x := op(x). template <typename InstX86Base::InstKindX86 K> @@ -597,8 +596,7 @@ const Variable *Var = this->getDest(); Type Ty = Var->getType(); const Operand *Src = this->getSrc(0); - bool IsLea = false; - emitIASRegOpTyGPR(Func, IsLea, Ty, Var, Src, Emitter); + emitIASRegOpTyGPR(Func, Ty, Var, Src, Emitter); } void dump(const Cfg *Func) const override { if (!BuildDefs::dump()) @@ -729,10 +727,8 @@ void emitIAS(const Cfg *Func) const override { Type Ty = this->getDest()->getType(); assert(this->getSrcSize() == 2); - constexpr bool ThisIsLEA = K == InstX86Base::Lea; - static_assert(!ThisIsLEA, "Lea should be a unaryop."); - emitIASRegOpTyGPR(Func, !ThisIsLEA, Ty, this->getDest(), this->getSrc(1), - Emitter); + static_assert(K != InstX86Base::Lea, "Lea should be a unaryop."); + emitIASRegOpTyGPR(Func, Ty, this->getDest(), this->getSrc(1), Emitter); } void dump(const Cfg *Func) const override { if (!BuildDefs::dump()) @@ -2270,7 +2266,7 @@ Source1) {} }; -/// Base class for a lockable x86-32 instruction (emits a locked prefix). +/// Base class for a lockable x86-64 instruction (emits a locked prefix). class InstX86BaseLockable : public InstX86Base { InstX86BaseLockable() = delete; InstX86BaseLockable(const InstX86BaseLockable &) = delete;
diff --git a/third_party/subzero/src/IceOperand.cpp b/third_party/subzero/src/IceOperand.cpp index 1e98324..0758f7d 100644 --- a/third_party/subzero/src/IceOperand.cpp +++ b/third_party/subzero/src/IceOperand.cpp
@@ -222,6 +222,17 @@ return Func->getVMetadata()->getUseWeight(this); } +int32_t +Variable::getRematerializableOffset(const ::Ice::TargetLowering *Target) { + int32_t Disp = getStackOffset(); + const auto RegNum = getRegNum(); + if (RegNum == Target->getFrameReg()) { + Disp += Target->getFrameFixedAllocaOffset(); + } else if (RegNum != Target->getStackReg()) { + llvm::report_fatal_error("Unexpected rematerializable register type"); + } + return Disp; +} void VariableTracking::markUse(MetadataKind TrackingKind, const Inst *Instr, CfgNode *Node, bool IsImplicit) { (void)TrackingKind;
diff --git a/third_party/subzero/src/IceOperand.h b/third_party/subzero/src/IceOperand.h index 9229656..36f845d 100644 --- a/third_party/subzero/src/IceOperand.h +++ b/third_party/subzero/src/IceOperand.h
@@ -765,6 +765,7 @@ setMustHaveReg(); } bool isRematerializable() const { return IsRematerializable; } + int32_t getRematerializableOffset(const ::Ice::TargetLowering *Target); void setRegClass(uint8_t RC) { RegisterClass = static_cast<RegClass>(RC); } RegClass getRegClass() const { return RegisterClass; }
diff --git a/third_party/subzero/src/IceTargetLoweringX8632.cpp b/third_party/subzero/src/IceTargetLoweringX8632.cpp index abf47ae..3489fec 100644 --- a/third_party/subzero/src/IceTargetLoweringX8632.cpp +++ b/third_party/subzero/src/IceTargetLoweringX8632.cpp
@@ -871,32 +871,6 @@ Str << "(%" << getRegName(BaseRegNum, FrameSPTy) << ")"; } -AsmAddress TargetX8632::stackVarToAsmAddress(const Variable *Var, - const TargetX8632 *Target) { - if (Var->hasReg()) - llvm::report_fatal_error("Stack Variable has a register assigned"); - if (Var->mustHaveReg()) { - llvm::report_fatal_error("Infinite-weight Variable (" + Var->getName() + - ") has no register assigned - function " + - Target->getFunc()->getFunctionName()); - } - int32_t Offset = Var->getStackOffset(); - auto BaseRegNum = Var->getBaseRegNum(); - if (Var->getBaseRegNum().hasNoValue()) { - // If the stack pointer needs alignment, we must use the frame pointer for - // arguments. For locals, getFrameOrStackReg will return the stack pointer - // in this case. - if (Target->needsStackPointerAlignment() && Var->getIsArg()) { - assert(Target->hasFramePointer()); - BaseRegNum = Target->getFrameReg(); - } else { - BaseRegNum = Target->getFrameOrStackReg(); - } - } - return AsmAddress(Traits::getEncodedGPR(BaseRegNum), Offset, - AssemblerFixup::NoFixup); -} - void TargetX8632::addProlog(CfgNode *Node) { // Stack frame layout: //
diff --git a/third_party/subzero/src/IceTargetLoweringX8632.h b/third_party/subzero/src/IceTargetLoweringX8632.h index 9976e1c..463ae2e 100644 --- a/third_party/subzero/src/IceTargetLoweringX8632.h +++ b/third_party/subzero/src/IceTargetLoweringX8632.h
@@ -141,9 +141,6 @@ static bool shouldBePooled(const Constant *C); static ::Ice::Type getPointerType(); - static FixupKind getPcRelFixup() { return PcRelFixup; } - static FixupKind getAbsFixup() { return AbsFixup; } - void translateOm1() override; void translateO2() override; void doLoadOpt(); @@ -272,8 +269,6 @@ size_t BasicFrameOffset, size_t StackAdjBytes, size_t &InArgsSizeBytes); void addEpilog(CfgNode *Node) override; - static AsmAddress stackVarToAsmAddress(const Variable *Var, - const TargetX8632 *Target); Operand *legalizeUndef(Operand *From, RegNumT RegNum = RegNumT());
diff --git a/third_party/subzero/src/IceTargetLoweringX8632Traits.h b/third_party/subzero/src/IceTargetLoweringX8632Traits.h index a662331..4fa67b2 100644 --- a/third_party/subzero/src/IceTargetLoweringX8632Traits.h +++ b/third_party/subzero/src/IceTargetLoweringX8632Traits.h
@@ -35,7 +35,6 @@ struct Insts; class TargetX8632; class AssemblerX8632; - class TargetX8632; struct TargetX8632Traits { @@ -68,6 +67,9 @@ static constexpr FixupKind FK_Gotoff = llvm::ELF::R_386_GOTOFF; static constexpr FixupKind FK_GotPC = llvm::ELF::R_386_GOTPC; + class X86OperandMem; + class VariableSplit; + class AsmOperand { public: AsmOperand(const AsmOperand &other) @@ -105,14 +107,6 @@ return static_cast<int8_t>(encoding_[length_ - 1]); } - int32_t disp32() const { - assert(length_ >= 5); - // TODO(stichnot): This method is not currently used. Delete it along - // with other unused methods, or use a safe version of bitCopy(). - llvm::report_fatal_error("Unexpected call to disp32()"); - // return Utils::bitCopy<int32_t>(encoding_[length_ - 4]); - } - AssemblerFixup *fixup() const { return fixup_; } protected: @@ -174,6 +168,23 @@ AsmAddress() = delete; public: + AsmAddress(GPRRegister Base, int32_t Disp, + AssemblerFixup *Fixup = nullptr) { + SetBase(Base, Disp, Fixup); + } + AsmAddress(const Variable *Var, const TargetX8632 *Target); + AsmAddress(const X86OperandMem *Mem, Ice::Assembler *Asm, + const Ice::TargetLowering *Target); + AsmAddress(const VariableSplit *Split, const Cfg *Func); + + // Address into the constant pool. + AsmAddress(const Constant *Imm, Ice::Assembler *Asm) { + AssemblerFixup *Fixup = Asm->createFixup(llvm::ELF::R_386_32, Imm); + const RelocOffsetT Offset = 0; + SetAbsolute(Offset, Fixup); + } + + private: AsmAddress(const AsmAddress &other) : AsmOperand(other) {} AsmAddress &operator=(const AsmAddress &other) { @@ -181,7 +192,7 @@ return *this; } - AsmAddress(GPRRegister Base, int32_t Disp, AssemblerFixup *Fixup) { + void SetBase(GPRRegister Base, int32_t Disp, AssemblerFixup *Fixup) { if (Fixup == nullptr && Disp == 0 && Base != RegX8632::Encoded_Reg_ebp) { SetModRM(0, Base); if (Base == RegX8632::Encoded_Reg_esp) @@ -201,8 +212,8 @@ } } - AsmAddress(GPRRegister Index, ScaleFactor Scale, int32_t Disp, - AssemblerFixup *Fixup) { + void SetIndex(GPRRegister Index, ScaleFactor Scale, int32_t Disp, + AssemblerFixup *Fixup) { assert(Index != RegX8632::Encoded_Reg_esp); // Illegal addressing mode. SetModRM(0, RegX8632::Encoded_Reg_esp); SetSIB(Scale, Index, RegX8632::Encoded_Reg_ebp); @@ -211,8 +222,8 @@ SetFixup(Fixup); } - AsmAddress(GPRRegister Base, GPRRegister Index, ScaleFactor Scale, - int32_t Disp, AssemblerFixup *Fixup) { + void SetBaseIndex(GPRRegister Base, GPRRegister Index, ScaleFactor Scale, + int32_t Disp, AssemblerFixup *Fixup) { assert(Index != RegX8632::Encoded_Reg_esp); // Illegal addressing mode. if (Fixup == nullptr && Disp == 0 && Base != RegX8632::Encoded_Reg_ebp) { SetModRM(0, RegX8632::Encoded_Reg_esp); @@ -231,7 +242,7 @@ } /// Generate an absolute address expression on x86-32. - AsmAddress(RelocOffsetT Offset, AssemblerFixup *Fixup) { + void SetAbsolute(RelocOffsetT Offset, AssemblerFixup *Fixup) { SetModRM(0, RegX8632::Encoded_Reg_ebp); // Use the Offset in the displacement for now. If we decide to process // fixups later, we'll need to patch up the emitted displacement. @@ -239,12 +250,6 @@ if (Fixup) SetFixup(Fixup); } - - static AsmAddress ofConstPool(Assembler *Asm, const Constant *Imm) { - AssemblerFixup *Fixup = Asm->createFixup(llvm::ELF::R_386_32, Imm); - const RelocOffsetT Offset = 0; - return AsmAddress(Offset, Fixup); - } }; //---------------------------------------------------------------------------- @@ -785,9 +790,17 @@ SegmentRegisters getSegmentRegister() const { return SegmentReg; } void emitSegmentOverride(Assembler *Asm) const; bool getIsRebased() const { return IsRebased; } - static AsmAddress toAsmAddress(const X86OperandMem *Mem, Assembler *Asm, - const Ice::TargetLowering *Target, - bool LeaAddr = false); + + void validateMemOperandPIC() const { + if (!BuildDefs::asserts()) + return; + const bool HasCR = + getOffset() && llvm::isa<ConstantRelocatable>(getOffset()); + (void)HasCR; + const bool IsRebased = getIsRebased(); + (void)IsRebased; + assert(!IsRebased); + } void emit(const Cfg *Func) const override; using X86Operand::dump; @@ -831,7 +844,6 @@ const Variable *getVar() const { return Var; } int32_t getOffset() const { return Part == High ? 4 : 0; } - static AsmAddress toAsmAddress(const VariableSplit *Split, const Cfg *Func); void emit(const Cfg *Func) const override; using X86Operand::dump; void dump(const Cfg *Func, Ostream &Str) const override;
diff --git a/third_party/subzero/src/IceTargetLoweringX8664.cpp b/third_party/subzero/src/IceTargetLoweringX8664.cpp index 07c9fa4..c411d12 100644 --- a/third_party/subzero/src/IceTargetLoweringX8664.cpp +++ b/third_party/subzero/src/IceTargetLoweringX8664.cpp
@@ -885,32 +885,6 @@ Str << "(%" << getRegName(BaseRegNum, FrameSPTy) << ")"; } -AsmAddress TargetX8664::stackVarToAsmAddress(const Variable *Var, - const TargetX8664 *Target) { - if (Var->hasReg()) - llvm::report_fatal_error("Stack Variable has a register assigned"); - if (Var->mustHaveReg()) { - llvm::report_fatal_error("Infinite-weight Variable (" + Var->getName() + - ") has no register assigned - function " + - Target->getFunc()->getFunctionName()); - } - int32_t Offset = Var->getStackOffset(); - auto BaseRegNum = Var->getBaseRegNum(); - if (Var->getBaseRegNum().hasNoValue()) { - // If the stack pointer needs alignment, we must use the frame pointer for - // arguments. For locals, getFrameOrStackReg will return the stack pointer - // in this case. - if (Target->needsStackPointerAlignment() && Var->getIsArg()) { - assert(Target->hasFramePointer()); - BaseRegNum = Target->getFrameReg(); - } else { - BaseRegNum = Target->getFrameOrStackReg(); - } - } - return AsmAddress(Traits::getEncodedGPR(BaseRegNum), Offset, - AssemblerFixup::NoFixup); -} - void TargetX8664::addProlog(CfgNode *Node) { // Stack frame layout: //
diff --git a/third_party/subzero/src/IceTargetLoweringX8664.h b/third_party/subzero/src/IceTargetLoweringX8664.h index 9ea7bfb..e84d29d 100644 --- a/third_party/subzero/src/IceTargetLoweringX8664.h +++ b/third_party/subzero/src/IceTargetLoweringX8664.h
@@ -142,9 +142,6 @@ static bool shouldBePooled(const Constant *C); static ::Ice::Type getPointerType(); - static FixupKind getPcRelFixup() { return PcRelFixup; } - static FixupKind getAbsFixup() { return AbsFixup; } - void translateOm1() override; void translateO2() override; void doLoadOpt(); @@ -268,8 +265,6 @@ size_t BasicFrameOffset, size_t StackAdjBytes, size_t &InArgsSizeBytes); void addEpilog(CfgNode *Node) override; - static AsmAddress stackVarToAsmAddress(const Variable *Var, - const TargetX8664 *Target); Operand *legalizeUndef(Operand *From, RegNumT RegNum = RegNumT());
diff --git a/third_party/subzero/src/IceTargetLoweringX8664Traits.h b/third_party/subzero/src/IceTargetLoweringX8664Traits.h index eba550f..bba2281 100644 --- a/third_party/subzero/src/IceTargetLoweringX8664Traits.h +++ b/third_party/subzero/src/IceTargetLoweringX8664Traits.h
@@ -36,7 +36,6 @@ class AssemblerX8664; struct Insts; class TargetX8664; - class TargetX8664; struct TargetX8664Traits { @@ -68,6 +67,8 @@ static constexpr FixupKind FK_Gotoff = llvm::ELF::R_X86_64_GOTOFF64; static constexpr FixupKind FK_GotPC = llvm::ELF::R_X86_64_GOTPC32; + class X86OperandMem; + class AsmOperand { public: enum RexBits { @@ -180,12 +181,25 @@ AsmAddress() = default; public: + AsmAddress(const Variable *Var, const TargetX8664 *Target); + AsmAddress(const X86OperandMem *Mem, Ice::Assembler *Asm, + const Ice::TargetLowering *Target); + + // Address into the constant pool. + AsmAddress(const Constant *Imm, Ice::Assembler *Asm) { + // TODO(jpp): ??? + AssemblerFixup *Fixup = Asm->createFixup(FK_Abs, Imm); + const RelocOffsetT Offset = 4; + SetRipRelative(Offset, Fixup); + } + + private: AsmAddress(const AsmAddress &) = default; AsmAddress(AsmAddress &&) = default; AsmAddress &operator=(const AsmAddress &) = default; AsmAddress &operator=(AsmAddress &&) = default; - AsmAddress(GPRRegister Base, int32_t Disp, AssemblerFixup *Fixup) { + void SetBase(GPRRegister Base, int32_t Disp, AssemblerFixup *Fixup) { if (Fixup == nullptr && Disp == 0 && (Base & 7) != RegX8664::Encoded_Reg_rbp) { SetModRM(0, Base); @@ -206,8 +220,8 @@ } } - AsmAddress(GPRRegister Index, ScaleFactor Scale, int32_t Disp, - AssemblerFixup *Fixup) { + void SetIndex(GPRRegister Index, ScaleFactor Scale, int32_t Disp, + AssemblerFixup *Fixup) { assert(Index != RegX8664::Encoded_Reg_rsp); // Illegal addressing mode. SetModRM(0, RegX8664::Encoded_Reg_rsp); SetSIB(Scale, Index, RegX8664::Encoded_Reg_rbp); @@ -216,8 +230,8 @@ SetFixup(Fixup); } - AsmAddress(GPRRegister Base, GPRRegister Index, ScaleFactor Scale, - int32_t Disp, AssemblerFixup *Fixup) { + void SetBaseIndex(GPRRegister Base, GPRRegister Index, ScaleFactor Scale, + int32_t Disp, AssemblerFixup *Fixup) { assert(Index != RegX8664::Encoded_Reg_rsp); // Illegal addressing mode. if (Fixup == nullptr && Disp == 0 && (Base & 7) != RegX8664::Encoded_Reg_rbp) { @@ -237,37 +251,25 @@ } /// Generate a RIP-relative address expression on x86-64. - static AsmAddress RipRelative(RelocOffsetT Offset, AssemblerFixup *Fixup) { + void SetRipRelative(RelocOffsetT Offset, AssemblerFixup *Fixup) { assert(Fixup != nullptr); assert(Fixup->kind() == FK_PcRel); - AsmAddress NewAddress; - NewAddress.SetModRM(0x0, RegX8664::Encoded_Reg_rbp); + + SetModRM(0x0, RegX8664::Encoded_Reg_rbp); // Use the Offset in the displacement for now. If we decide to process // fixups later, we'll need to patch up the emitted displacement. - NewAddress.SetDisp32(Offset); + SetDisp32(Offset); if (Fixup) - NewAddress.SetFixup(Fixup); - - return NewAddress; + SetFixup(Fixup); } /// Generate an absolute address. - static AsmAddress Absolute(RelocOffsetT Addr) { - AsmAddress NewAddress; - NewAddress.SetModRM(0x0, RegX8664::Encoded_Reg_rsp); + void SetAbsolute(RelocOffsetT Addr) { + SetModRM(0x0, RegX8664::Encoded_Reg_rsp); static constexpr ScaleFactor NoScale = TIMES_1; - NewAddress.SetSIB(NoScale, RegX8664::Encoded_Reg_rsp, - RegX8664::Encoded_Reg_rbp); - NewAddress.SetDisp32(Addr); - return NewAddress; - } - - static AsmAddress ofConstPool(Assembler *Asm, const Constant *Imm) { - // TODO(jpp): ??? - AssemblerFixup *Fixup = Asm->createFixup(FK_Abs, Imm); - const RelocOffsetT Offset = 4; - return AsmAddress::RipRelative(Offset, Fixup); + SetSIB(NoScale, RegX8664::Encoded_Reg_rsp, RegX8664::Encoded_Reg_rbp); + SetDisp32(Addr); } }; @@ -866,9 +868,6 @@ SegmentRegisters getSegmentRegister() const { return DefaultSegment; } void emitSegmentOverride(Assembler *) const {} bool getIsRebased() const { return IsRebased; } - static AsmAddress toAsmAddress(const X86OperandMem *Mem, Assembler *Asm, - const Ice::TargetLowering *Target, - bool IsLeaAddr = false); void emit(const Cfg *Func) const override; using X86Operand::dump;