summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-exegesis/lib/X86
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/X86')
-rw-r--r--llvm/tools/llvm-exegesis/lib/X86/Target.cpp303
1 files changed, 147 insertions, 156 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
index dd07af45b42..6cf3d465dd9 100644
--- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
@@ -148,34 +148,31 @@ static Error isInvalidMemoryInstr(const Instruction &Instr) {
}
}
-static llvm::Error IsInvalidOpcode(const Instruction &Instr) {
+static Error IsInvalidOpcode(const Instruction &Instr) {
const auto OpcodeName = Instr.Name;
if ((Instr.Description->TSFlags & X86II::FormMask) == X86II::Pseudo)
- return llvm::make_error<Failure>("unsupported opcode: pseudo instruction");
+ return make_error<Failure>("unsupported opcode: pseudo instruction");
if (OpcodeName.startswith("POPF") || OpcodeName.startswith("PUSHF") ||
OpcodeName.startswith("ADJCALLSTACK"))
- return llvm::make_error<Failure>(
- "unsupported opcode: Push/Pop/AdjCallStack");
- if (llvm::Error Error = isInvalidMemoryInstr(Instr))
+ return make_error<Failure>("unsupported opcode: Push/Pop/AdjCallStack");
+ if (Error Error = isInvalidMemoryInstr(Instr))
return Error;
// We do not handle instructions with OPERAND_PCREL.
for (const Operand &Op : Instr.Operands)
if (Op.isExplicit() &&
- Op.getExplicitOperandInfo().OperandType == llvm::MCOI::OPERAND_PCREL)
- return llvm::make_error<Failure>(
- "unsupported opcode: PC relative operand");
+ Op.getExplicitOperandInfo().OperandType == MCOI::OPERAND_PCREL)
+ return make_error<Failure>("unsupported opcode: PC relative operand");
// We do not handle second-form X87 instructions. We only handle first-form
// ones (_Fp), see comment in X86InstrFPStack.td.
for (const Operand &Op : Instr.Operands)
if (Op.isReg() && Op.isExplicit() &&
- Op.getExplicitOperandInfo().RegClass == llvm::X86::RSTRegClassID)
- return llvm::make_error<Failure>(
- "unsupported second-form X87 instruction");
- return llvm::Error::success();
+ Op.getExplicitOperandInfo().RegClass == X86::RSTRegClassID)
+ return make_error<Failure>("unsupported second-form X87 instruction");
+ return Error::success();
}
static unsigned getX86FPFlags(const Instruction &Instr) {
- return Instr.Description->TSFlags & llvm::X86II::FPTypeMask;
+ return Instr.Description->TSFlags & X86II::FPTypeMask;
}
// Helper to fill a memory operand with a value.
@@ -188,7 +185,7 @@ static void setMemOp(InstructionTemplate &IT, int OpIdx,
// Common (latency, uops) code for LEA templates. `GetDestReg` takes the
// addressing base and index registers and returns the LEA destination register.
-static llvm::Expected<std::vector<CodeTemplate>> generateLEATemplatesCommon(
+static Expected<std::vector<CodeTemplate>> generateLEATemplatesCommon(
const Instruction &Instr, const BitVector &ForbiddenRegisters,
const LLVMState &State, const SnippetGenerator::Options &Opts,
std::function<unsigned(unsigned, unsigned)> GetDestReg) {
@@ -249,13 +246,13 @@ class X86LatencySnippetGenerator : public LatencySnippetGenerator {
public:
using LatencySnippetGenerator::LatencySnippetGenerator;
- llvm::Expected<std::vector<CodeTemplate>>
+ Expected<std::vector<CodeTemplate>>
generateCodeTemplates(const Instruction &Instr,
const BitVector &ForbiddenRegisters) const override;
};
} // namespace
-llvm::Expected<std::vector<CodeTemplate>>
+Expected<std::vector<CodeTemplate>>
X86LatencySnippetGenerator::generateCodeTemplates(
const Instruction &Instr, const BitVector &ForbiddenRegisters) const {
if (auto E = IsInvalidOpcode(Instr))
@@ -273,17 +270,17 @@ X86LatencySnippetGenerator::generateCodeTemplates(
}
switch (getX86FPFlags(Instr)) {
- case llvm::X86II::NotFP:
+ case X86II::NotFP:
return LatencySnippetGenerator::generateCodeTemplates(Instr,
ForbiddenRegisters);
- case llvm::X86II::ZeroArgFP:
- case llvm::X86II::OneArgFP:
- case llvm::X86II::SpecialFP:
- case llvm::X86II::CompareFP:
- case llvm::X86II::CondMovFP:
- return llvm::make_error<Failure>("Unsupported x87 Instruction");
- case llvm::X86II::OneArgFPRW:
- case llvm::X86II::TwoArgFP:
+ case X86II::ZeroArgFP:
+ case X86II::OneArgFP:
+ case X86II::SpecialFP:
+ case X86II::CompareFP:
+ case X86II::CondMovFP:
+ return make_error<Failure>("Unsupported x87 Instruction");
+ case X86II::OneArgFPRW:
+ case X86II::TwoArgFP:
// These are instructions like
// - `ST(0) = fsqrt(ST(0))` (OneArgFPRW)
// - `ST(0) = ST(0) + ST(i)` (TwoArgFP)
@@ -299,14 +296,14 @@ class X86UopsSnippetGenerator : public UopsSnippetGenerator {
public:
using UopsSnippetGenerator::UopsSnippetGenerator;
- llvm::Expected<std::vector<CodeTemplate>>
+ Expected<std::vector<CodeTemplate>>
generateCodeTemplates(const Instruction &Instr,
const BitVector &ForbiddenRegisters) const override;
};
} // namespace
-llvm::Expected<std::vector<CodeTemplate>>
+Expected<std::vector<CodeTemplate>>
X86UopsSnippetGenerator::generateCodeTemplates(
const Instruction &Instr, const BitVector &ForbiddenRegisters) const {
if (auto E = IsInvalidOpcode(Instr))
@@ -335,23 +332,23 @@ X86UopsSnippetGenerator::generateCodeTemplates(
}
switch (getX86FPFlags(Instr)) {
- case llvm::X86II::NotFP:
+ case X86II::NotFP:
return UopsSnippetGenerator::generateCodeTemplates(Instr,
ForbiddenRegisters);
- case llvm::X86II::ZeroArgFP:
- case llvm::X86II::OneArgFP:
- case llvm::X86II::SpecialFP:
- return llvm::make_error<Failure>("Unsupported x87 Instruction");
- case llvm::X86II::OneArgFPRW:
- case llvm::X86II::TwoArgFP:
+ case X86II::ZeroArgFP:
+ case X86II::OneArgFP:
+ case X86II::SpecialFP:
+ return make_error<Failure>("Unsupported x87 Instruction");
+ case X86II::OneArgFPRW:
+ case X86II::TwoArgFP:
// These are instructions like
// - `ST(0) = fsqrt(ST(0))` (OneArgFPRW)
// - `ST(0) = ST(0) + ST(i)` (TwoArgFP)
// They are intrinsically serial and do not modify the state of the stack.
// We generate the same code for latency and uops.
return generateSelfAliasingCodeTemplates(Instr);
- case llvm::X86II::CompareFP:
- case llvm::X86II::CondMovFP:
+ case X86II::CompareFP:
+ case X86II::CondMovFP:
// We can compute uops for any FP instruction that does not grow or shrink
// the stack (either do not touch the stack or push as much as they pop).
return generateUnconstrainedCodeTemplates(
@@ -364,66 +361,66 @@ X86UopsSnippetGenerator::generateCodeTemplates(
static unsigned getLoadImmediateOpcode(unsigned RegBitWidth) {
switch (RegBitWidth) {
case 8:
- return llvm::X86::MOV8ri;
+ return X86::MOV8ri;
case 16:
- return llvm::X86::MOV16ri;
+ return X86::MOV16ri;
case 32:
- return llvm::X86::MOV32ri;
+ return X86::MOV32ri;
case 64:
- return llvm::X86::MOV64ri;
+ return X86::MOV64ri;
}
llvm_unreachable("Invalid Value Width");
}
// Generates instruction to load an immediate value into a register.
-static llvm::MCInst loadImmediate(unsigned Reg, unsigned RegBitWidth,
- const llvm::APInt &Value) {
+static MCInst loadImmediate(unsigned Reg, unsigned RegBitWidth,
+ const APInt &Value) {
if (Value.getBitWidth() > RegBitWidth)
llvm_unreachable("Value must fit in the Register");
- return llvm::MCInstBuilder(getLoadImmediateOpcode(RegBitWidth))
+ return MCInstBuilder(getLoadImmediateOpcode(RegBitWidth))
.addReg(Reg)
.addImm(Value.getZExtValue());
}
// Allocates scratch memory on the stack.
-static llvm::MCInst allocateStackSpace(unsigned Bytes) {
- return llvm::MCInstBuilder(llvm::X86::SUB64ri8)
- .addReg(llvm::X86::RSP)
- .addReg(llvm::X86::RSP)
+static MCInst allocateStackSpace(unsigned Bytes) {
+ return MCInstBuilder(X86::SUB64ri8)
+ .addReg(X86::RSP)
+ .addReg(X86::RSP)
.addImm(Bytes);
}
// Fills scratch memory at offset `OffsetBytes` with value `Imm`.
-static llvm::MCInst fillStackSpace(unsigned MovOpcode, unsigned OffsetBytes,
- uint64_t Imm) {
- return llvm::MCInstBuilder(MovOpcode)
+static MCInst fillStackSpace(unsigned MovOpcode, unsigned OffsetBytes,
+ uint64_t Imm) {
+ return MCInstBuilder(MovOpcode)
// Address = ESP
- .addReg(llvm::X86::RSP) // BaseReg
- .addImm(1) // ScaleAmt
- .addReg(0) // IndexReg
- .addImm(OffsetBytes) // Disp
- .addReg(0) // Segment
+ .addReg(X86::RSP) // BaseReg
+ .addImm(1) // ScaleAmt
+ .addReg(0) // IndexReg
+ .addImm(OffsetBytes) // Disp
+ .addReg(0) // Segment
// Immediate.
.addImm(Imm);
}
// Loads scratch memory into register `Reg` using opcode `RMOpcode`.
-static llvm::MCInst loadToReg(unsigned Reg, unsigned RMOpcode) {
- return llvm::MCInstBuilder(RMOpcode)
+static MCInst loadToReg(unsigned Reg, unsigned RMOpcode) {
+ return MCInstBuilder(RMOpcode)
.addReg(Reg)
// Address = ESP
- .addReg(llvm::X86::RSP) // BaseReg
- .addImm(1) // ScaleAmt
- .addReg(0) // IndexReg
- .addImm(0) // Disp
- .addReg(0); // Segment
+ .addReg(X86::RSP) // BaseReg
+ .addImm(1) // ScaleAmt
+ .addReg(0) // IndexReg
+ .addImm(0) // Disp
+ .addReg(0); // Segment
}
// Releases scratch memory.
-static llvm::MCInst releaseStackSpace(unsigned Bytes) {
- return llvm::MCInstBuilder(llvm::X86::ADD64ri8)
- .addReg(llvm::X86::RSP)
- .addReg(llvm::X86::RSP)
+static MCInst releaseStackSpace(unsigned Bytes) {
+ return MCInstBuilder(X86::ADD64ri8)
+ .addReg(X86::RSP)
+ .addReg(X86::RSP)
.addImm(Bytes);
}
@@ -431,19 +428,19 @@ static llvm::MCInst releaseStackSpace(unsigned Bytes) {
// constant and provide methods to load the stack value into a register.
namespace {
struct ConstantInliner {
- explicit ConstantInliner(const llvm::APInt &Constant) : Constant_(Constant) {}
+ explicit ConstantInliner(const APInt &Constant) : Constant_(Constant) {}
- std::vector<llvm::MCInst> loadAndFinalize(unsigned Reg, unsigned RegBitWidth,
- unsigned Opcode);
+ std::vector<MCInst> loadAndFinalize(unsigned Reg, unsigned RegBitWidth,
+ unsigned Opcode);
- std::vector<llvm::MCInst> loadX87STAndFinalize(unsigned Reg);
+ std::vector<MCInst> loadX87STAndFinalize(unsigned Reg);
- std::vector<llvm::MCInst> loadX87FPAndFinalize(unsigned Reg);
+ std::vector<MCInst> loadX87FPAndFinalize(unsigned Reg);
- std::vector<llvm::MCInst> popFlagAndFinalize();
+ std::vector<MCInst> popFlagAndFinalize();
private:
- ConstantInliner &add(const llvm::MCInst &Inst) {
+ ConstantInliner &add(const MCInst &Inst) {
Instructions.push_back(Inst);
return *this;
}
@@ -452,14 +449,14 @@ private:
static constexpr const unsigned kF80Bytes = 10; // 80 bits.
- llvm::APInt Constant_;
- std::vector<llvm::MCInst> Instructions;
+ APInt Constant_;
+ std::vector<MCInst> Instructions;
};
} // namespace
-std::vector<llvm::MCInst> ConstantInliner::loadAndFinalize(unsigned Reg,
- unsigned RegBitWidth,
- unsigned Opcode) {
+std::vector<MCInst> ConstantInliner::loadAndFinalize(unsigned Reg,
+ unsigned RegBitWidth,
+ unsigned Opcode) {
assert((RegBitWidth & 7) == 0 && "RegBitWidth must be a multiple of 8 bits");
initStack(RegBitWidth / 8);
add(loadToReg(Reg, Opcode));
@@ -467,62 +464,62 @@ std::vector<llvm::MCInst> ConstantInliner::loadAndFinalize(unsigned Reg,
return std::move(Instructions);
}
-std::vector<llvm::MCInst> ConstantInliner::loadX87STAndFinalize(unsigned Reg) {
+std::vector<MCInst> ConstantInliner::loadX87STAndFinalize(unsigned Reg) {
initStack(kF80Bytes);
- add(llvm::MCInstBuilder(llvm::X86::LD_F80m)
+ add(MCInstBuilder(X86::LD_F80m)
// Address = ESP
- .addReg(llvm::X86::RSP) // BaseReg
- .addImm(1) // ScaleAmt
- .addReg(0) // IndexReg
- .addImm(0) // Disp
- .addReg(0)); // Segment
- if (Reg != llvm::X86::ST0)
- add(llvm::MCInstBuilder(llvm::X86::ST_Frr).addReg(Reg));
+ .addReg(X86::RSP) // BaseReg
+ .addImm(1) // ScaleAmt
+ .addReg(0) // IndexReg
+ .addImm(0) // Disp
+ .addReg(0)); // Segment
+ if (Reg != X86::ST0)
+ add(MCInstBuilder(X86::ST_Frr).addReg(Reg));
add(releaseStackSpace(kF80Bytes));
return std::move(Instructions);
}
-std::vector<llvm::MCInst> ConstantInliner::loadX87FPAndFinalize(unsigned Reg) {
+std::vector<MCInst> ConstantInliner::loadX87FPAndFinalize(unsigned Reg) {
initStack(kF80Bytes);
- add(llvm::MCInstBuilder(llvm::X86::LD_Fp80m)
+ add(MCInstBuilder(X86::LD_Fp80m)
.addReg(Reg)
// Address = ESP
- .addReg(llvm::X86::RSP) // BaseReg
- .addImm(1) // ScaleAmt
- .addReg(0) // IndexReg
- .addImm(0) // Disp
- .addReg(0)); // Segment
+ .addReg(X86::RSP) // BaseReg
+ .addImm(1) // ScaleAmt
+ .addReg(0) // IndexReg
+ .addImm(0) // Disp
+ .addReg(0)); // Segment
add(releaseStackSpace(kF80Bytes));
return std::move(Instructions);
}
-std::vector<llvm::MCInst> ConstantInliner::popFlagAndFinalize() {
+std::vector<MCInst> ConstantInliner::popFlagAndFinalize() {
initStack(8);
- add(llvm::MCInstBuilder(llvm::X86::POPF64));
+ add(MCInstBuilder(X86::POPF64));
return std::move(Instructions);
}
void ConstantInliner::initStack(unsigned Bytes) {
assert(Constant_.getBitWidth() <= Bytes * 8 &&
"Value does not have the correct size");
- const llvm::APInt WideConstant = Constant_.getBitWidth() < Bytes * 8
- ? Constant_.sext(Bytes * 8)
- : Constant_;
+ const APInt WideConstant = Constant_.getBitWidth() < Bytes * 8
+ ? Constant_.sext(Bytes * 8)
+ : Constant_;
add(allocateStackSpace(Bytes));
size_t ByteOffset = 0;
for (; Bytes - ByteOffset >= 4; ByteOffset += 4)
add(fillStackSpace(
- llvm::X86::MOV32mi, ByteOffset,
+ X86::MOV32mi, ByteOffset,
WideConstant.extractBits(32, ByteOffset * 8).getZExtValue()));
if (Bytes - ByteOffset >= 2) {
add(fillStackSpace(
- llvm::X86::MOV16mi, ByteOffset,
+ X86::MOV16mi, ByteOffset,
WideConstant.extractBits(16, ByteOffset * 8).getZExtValue()));
ByteOffset += 2;
}
if (Bytes - ByteOffset >= 1)
add(fillStackSpace(
- llvm::X86::MOV8mi, ByteOffset,
+ X86::MOV8mi, ByteOffset,
WideConstant.extractBits(8, ByteOffset * 8).getZExtValue()));
}
@@ -534,28 +531,27 @@ public:
ExegesisX86Target() : ExegesisTarget(X86CpuPfmCounters) {}
private:
- void addTargetSpecificPasses(llvm::PassManagerBase &PM) const override;
+ void addTargetSpecificPasses(PassManagerBase &PM) const override;
- unsigned getScratchMemoryRegister(const llvm::Triple &TT) const override;
+ unsigned getScratchMemoryRegister(const Triple &TT) const override;
- unsigned getLoopCounterRegister(const llvm::Triple &) const override;
+ unsigned getLoopCounterRegister(const Triple &) const override;
unsigned getMaxMemoryAccessSize() const override { return 64; }
void randomizeMCOperand(const Instruction &Instr, const Variable &Var,
- llvm::MCOperand &AssignedValue,
- const llvm::BitVector &ForbiddenRegs) const override;
+ MCOperand &AssignedValue,
+ const BitVector &ForbiddenRegs) const override;
void fillMemoryOperands(InstructionTemplate &IT, unsigned Reg,
unsigned Offset) const override;
void decrementLoopCounterAndJump(MachineBasicBlock &MBB,
MachineBasicBlock &TargetMBB,
- const llvm::MCInstrInfo &MII) const override;
+ const MCInstrInfo &MII) const override;
- std::vector<llvm::MCInst> setRegTo(const llvm::MCSubtargetInfo &STI,
- unsigned Reg,
- const llvm::APInt &Value) const override;
+ std::vector<MCInst> setRegTo(const MCSubtargetInfo &STI, unsigned Reg,
+ const APInt &Value) const override;
ArrayRef<unsigned> getUnavailableRegisters() const override {
return makeArrayRef(kUnavailableRegisters,
@@ -575,8 +571,8 @@ private:
return std::make_unique<X86UopsSnippetGenerator>(State, Opts);
}
- bool matchesArch(llvm::Triple::ArchType Arch) const override {
- return Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86;
+ bool matchesArch(Triple::ArchType Arch) const override {
+ return Arch == Triple::x86_64 || Arch == Triple::x86;
}
static const unsigned kUnavailableRegisters[4];
@@ -594,24 +590,21 @@ constexpr const unsigned kLoopCounterReg = X86::R8;
} // namespace
-void ExegesisX86Target::addTargetSpecificPasses(
- llvm::PassManagerBase &PM) const {
+void ExegesisX86Target::addTargetSpecificPasses(PassManagerBase &PM) const {
// Lowers FP pseudo-instructions, e.g. ABS_Fp32 -> ABS_F.
- PM.add(llvm::createX86FloatingPointStackifierPass());
+ PM.add(createX86FloatingPointStackifierPass());
}
-unsigned
-ExegesisX86Target::getScratchMemoryRegister(const llvm::Triple &TT) const {
+unsigned ExegesisX86Target::getScratchMemoryRegister(const Triple &TT) const {
if (!TT.isArch64Bit()) {
// FIXME: This would require popping from the stack, so we would have to
// add some additional setup code.
return 0;
}
- return TT.isOSWindows() ? llvm::X86::RCX : llvm::X86::RDI;
+ return TT.isOSWindows() ? X86::RCX : X86::RDI;
}
-unsigned
-ExegesisX86Target::getLoopCounterRegister(const llvm::Triple &TT) const {
+unsigned ExegesisX86Target::getLoopCounterRegister(const Triple &TT) const {
if (!TT.isArch64Bit()) {
return 0;
}
@@ -619,16 +612,15 @@ ExegesisX86Target::getLoopCounterRegister(const llvm::Triple &TT) const {
}
void ExegesisX86Target::randomizeMCOperand(
- const Instruction &Instr, const Variable &Var,
- llvm::MCOperand &AssignedValue,
- const llvm::BitVector &ForbiddenRegs) const {
+ const Instruction &Instr, const Variable &Var, MCOperand &AssignedValue,
+ const BitVector &ForbiddenRegs) const {
ExegesisTarget::randomizeMCOperand(Instr, Var, AssignedValue, ForbiddenRegs);
const Operand &Op = Instr.getPrimaryOperand(Var);
switch (Op.getExplicitOperandInfo().OperandType) {
- case llvm::X86::OperandType::OPERAND_COND_CODE:
- AssignedValue = llvm::MCOperand::createImm(
- randomIndex(llvm::X86::CondCode::LAST_VALID_COND));
+ case X86::OperandType::OPERAND_COND_CODE:
+ AssignedValue =
+ MCOperand::createImm(randomIndex(X86::CondCode::LAST_VALID_COND));
break;
default:
break;
@@ -658,7 +650,7 @@ void ExegesisX86Target::fillMemoryOperands(InstructionTemplate &IT,
void ExegesisX86Target::decrementLoopCounterAndJump(
MachineBasicBlock &MBB, MachineBasicBlock &TargetMBB,
- const llvm::MCInstrInfo &MII) const {
+ const MCInstrInfo &MII) const {
BuildMI(&MBB, DebugLoc(), MII.get(X86::ADD64ri8))
.addDef(kLoopCounterReg)
.addUse(kLoopCounterReg)
@@ -668,45 +660,44 @@ void ExegesisX86Target::decrementLoopCounterAndJump(
.addImm(X86::COND_NE);
}
-std::vector<llvm::MCInst>
-ExegesisX86Target::setRegTo(const llvm::MCSubtargetInfo &STI, unsigned Reg,
- const llvm::APInt &Value) const {
- if (llvm::X86::GR8RegClass.contains(Reg))
+std::vector<MCInst> ExegesisX86Target::setRegTo(const MCSubtargetInfo &STI,
+ unsigned Reg,
+ const APInt &Value) const {
+ if (X86::GR8RegClass.contains(Reg))
return {loadImmediate(Reg, 8, Value)};
- if (llvm::X86::GR16RegClass.contains(Reg))
+ if (X86::GR16RegClass.contains(Reg))
return {loadImmediate(Reg, 16, Value)};
- if (llvm::X86::GR32RegClass.contains(Reg))
+ if (X86::GR32RegClass.contains(Reg))
return {loadImmediate(Reg, 32, Value)};
- if (llvm::X86::GR64RegClass.contains(Reg))
+ if (X86::GR64RegClass.contains(Reg))
return {loadImmediate(Reg, 64, Value)};
ConstantInliner CI(Value);
- if (llvm::X86::VR64RegClass.contains(Reg))
- return CI.loadAndFinalize(Reg, 64, llvm::X86::MMX_MOVQ64rm);
- if (llvm::X86::VR128XRegClass.contains(Reg)) {
- if (STI.getFeatureBits()[llvm::X86::FeatureAVX512])
- return CI.loadAndFinalize(Reg, 128, llvm::X86::VMOVDQU32Z128rm);
- if (STI.getFeatureBits()[llvm::X86::FeatureAVX])
- return CI.loadAndFinalize(Reg, 128, llvm::X86::VMOVDQUrm);
- return CI.loadAndFinalize(Reg, 128, llvm::X86::MOVDQUrm);
+ if (X86::VR64RegClass.contains(Reg))
+ return CI.loadAndFinalize(Reg, 64, X86::MMX_MOVQ64rm);
+ if (X86::VR128XRegClass.contains(Reg)) {
+ if (STI.getFeatureBits()[X86::FeatureAVX512])
+ return CI.loadAndFinalize(Reg, 128, X86::VMOVDQU32Z128rm);
+ if (STI.getFeatureBits()[X86::FeatureAVX])
+ return CI.loadAndFinalize(Reg, 128, X86::VMOVDQUrm);
+ return CI.loadAndFinalize(Reg, 128, X86::MOVDQUrm);
}
- if (llvm::X86::VR256XRegClass.contains(Reg)) {
- if (STI.getFeatureBits()[llvm::X86::FeatureAVX512])
- return CI.loadAndFinalize(Reg, 256, llvm::X86::VMOVDQU32Z256rm);
- if (STI.getFeatureBits()[llvm::X86::FeatureAVX])
- return CI.loadAndFinalize(Reg, 256, llvm::X86::VMOVDQUYrm);
+ if (X86::VR256XRegClass.contains(Reg)) {
+ if (STI.getFeatureBits()[X86::FeatureAVX512])
+ return CI.loadAndFinalize(Reg, 256, X86::VMOVDQU32Z256rm);
+ if (STI.getFeatureBits()[X86::FeatureAVX])
+ return CI.loadAndFinalize(Reg, 256, X86::VMOVDQUYrm);
}
- if (llvm::X86::VR512RegClass.contains(Reg))
- if (STI.getFeatureBits()[llvm::X86::FeatureAVX512])
- return CI.loadAndFinalize(Reg, 512, llvm::X86::VMOVDQU32Zrm);
- if (llvm::X86::RSTRegClass.contains(Reg)) {
+ if (X86::VR512RegClass.contains(Reg))
+ if (STI.getFeatureBits()[X86::FeatureAVX512])
+ return CI.loadAndFinalize(Reg, 512, X86::VMOVDQU32Zrm);
+ if (X86::RSTRegClass.contains(Reg)) {
return CI.loadX87STAndFinalize(Reg);
}
- if (llvm::X86::RFP32RegClass.contains(Reg) ||
- llvm::X86::RFP64RegClass.contains(Reg) ||
- llvm::X86::RFP80RegClass.contains(Reg)) {
+ if (X86::RFP32RegClass.contains(Reg) || X86::RFP64RegClass.contains(Reg) ||
+ X86::RFP80RegClass.contains(Reg)) {
return CI.loadX87FPAndFinalize(Reg);
}
- if (Reg == llvm::X86::EFLAGS)
+ if (Reg == X86::EFLAGS)
return CI.popFlagAndFinalize();
return {}; // Not yet implemented.
}
OpenPOWER on IntegriCloud