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;