diff options
author | Clement Courbet <courbet@google.com> | 2018-07-03 06:17:05 +0000 |
---|---|---|
committer | Clement Courbet <courbet@google.com> | 2018-07-03 06:17:05 +0000 |
commit | c978388e74bafcab21d2e12fa1999eebc25f03e8 (patch) | |
tree | c19e55affadb17b8166b3e83182a61d70d62fd37 /tools | |
parent | aabbcb39787502687469688a189fe0e81c055496 (diff) |
[llvm-exegesis] ExegisX86Target::setRegToConstant() should depend on the subtarget features.
Summary: This fixes PR38008.
Reviewers: gchatelet, RKSimon
Subscribers: tschuett, craig.topper, llvm-commits
Differential Revision: https://reviews.llvm.org/D48820
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336171 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r-- | tools/llvm-exegesis/lib/Assembler.cpp | 7 | ||||
-rw-r--r-- | tools/llvm-exegesis/lib/Target.h | 3 | ||||
-rw-r--r-- | tools/llvm-exegesis/lib/X86/Target.cpp | 30 |
3 files changed, 28 insertions, 12 deletions
diff --git a/tools/llvm-exegesis/lib/Assembler.cpp b/tools/llvm-exegesis/lib/Assembler.cpp index c7fc6bd9ee9..d2be7f4829a 100644 --- a/tools/llvm-exegesis/lib/Assembler.cpp +++ b/tools/llvm-exegesis/lib/Assembler.cpp @@ -30,12 +30,13 @@ static constexpr const char FunctionID[] = "foo"; static std::vector<llvm::MCInst> generateSnippetSetupCode(const llvm::ArrayRef<unsigned> RegsToDef, - const ExegesisTarget &ET, bool &IsComplete) { + const ExegesisTarget &ET, + const llvm::LLVMTargetMachine &TM, bool &IsComplete) { IsComplete = true; std::vector<llvm::MCInst> Result; for (const unsigned Reg : RegsToDef) { // Load a constant in the register. - const auto Code = ET.setRegToConstant(Reg); + const auto Code = ET.setRegToConstant(*TM.getMCSubtargetInfo(), Reg); if (Code.empty()) IsComplete = false; Result.insert(Result.end(), Code.begin(), Code.end()); @@ -159,7 +160,7 @@ void assembleToStream(const ExegesisTarget &ET, Properties.reset(llvm::MachineFunctionProperties::Property::IsSSA); bool IsSnippetSetupComplete = false; std::vector<llvm::MCInst> SnippetWithSetup = - generateSnippetSetupCode(RegsToDef, ET, IsSnippetSetupComplete); + generateSnippetSetupCode(RegsToDef, ET, *TM, IsSnippetSetupComplete); if (!SnippetWithSetup.empty()) { SnippetWithSetup.insert(SnippetWithSetup.end(), Instructions.begin(), Instructions.end()); diff --git a/tools/llvm-exegesis/lib/Target.h b/tools/llvm-exegesis/lib/Target.h index cb87e3a6d4b..4f1f2869b74 100644 --- a/tools/llvm-exegesis/lib/Target.h +++ b/tools/llvm-exegesis/lib/Target.h @@ -34,7 +34,8 @@ public: virtual void addTargetSpecificPasses(llvm::PassManagerBase &PM) const {} // Generates code to move a constant into a the given register. - virtual std::vector<llvm::MCInst> setRegToConstant(unsigned Reg) const { + virtual std::vector<llvm::MCInst> + setRegToConstant(const llvm::MCSubtargetInfo &STI, unsigned Reg) const { return {}; } diff --git a/tools/llvm-exegesis/lib/X86/Target.cpp b/tools/llvm-exegesis/lib/X86/Target.cpp index 594c48bbdba..f0b411cd3c4 100644 --- a/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/tools/llvm-exegesis/lib/X86/Target.cpp @@ -14,6 +14,7 @@ #include "MCTargetDesc/X86MCTargetDesc.h" #include "X86.h" #include "X86RegisterInfo.h" +#include "X86Subtarget.h" #include "llvm/MC/MCInstBuilder.h" namespace exegesis { @@ -130,8 +131,9 @@ class ExegesisX86Target : public ExegesisTarget { PM.add(llvm::createX86FloatingPointStackifierPass()); } - std::vector<llvm::MCInst> - setRegToConstant(unsigned Reg) const override { + std::vector<llvm::MCInst> setRegToConstant(const llvm::MCSubtargetInfo &STI, + unsigned Reg) const override { + // GPR. if (llvm::X86::GR8RegClass.contains(Reg)) return {llvm::MCInstBuilder(llvm::X86::MOV8ri).addReg(Reg).addImm(1)}; if (llvm::X86::GR16RegClass.contains(Reg)) @@ -140,12 +142,25 @@ class ExegesisX86Target : public ExegesisTarget { return {llvm::MCInstBuilder(llvm::X86::MOV32ri).addReg(Reg).addImm(1)}; if (llvm::X86::GR64RegClass.contains(Reg)) return {llvm::MCInstBuilder(llvm::X86::MOV64ri32).addReg(Reg).addImm(1)}; - if (llvm::X86::VR128XRegClass.contains(Reg)) - return setVectorRegToConstant(Reg, 16, llvm::X86::VMOVDQUrm); - if (llvm::X86::VR256XRegClass.contains(Reg)) + // MMX. + if (llvm::X86::VR64RegClass.contains(Reg)) + return setVectorRegToConstant(Reg, 8, llvm::X86::MMX_MOVQ64rm); + // {X,Y,Z}MM. + if (llvm::X86::VR128XRegClass.contains(Reg)) { + if (STI.getFeatureBits()[llvm::X86::FeatureAVX512]) + return setVectorRegToConstant(Reg, 16, llvm::X86::VMOVDQU32Z128rm); + if (STI.getFeatureBits()[llvm::X86::FeatureAVX]) + return setVectorRegToConstant(Reg, 16, llvm::X86::VMOVDQUrm); + return setVectorRegToConstant(Reg, 16, llvm::X86::MOVDQUrm); + } + if (llvm::X86::VR256XRegClass.contains(Reg)) { + if (STI.getFeatureBits()[llvm::X86::FeatureAVX512]) + return setVectorRegToConstant(Reg, 32, llvm::X86::VMOVDQU32Z256rm); return setVectorRegToConstant(Reg, 32, llvm::X86::VMOVDQUYrm); + } if (llvm::X86::VR512RegClass.contains(Reg)) - return setVectorRegToConstant(Reg, 64, llvm::X86::VMOVDQU64Zrm); + return setVectorRegToConstant(Reg, 64, llvm::X86::VMOVDQU32Zrm); + // X87. if (llvm::X86::RFP32RegClass.contains(Reg) || llvm::X86::RFP64RegClass.contains(Reg) || llvm::X86::RFP80RegClass.contains(Reg)) @@ -155,8 +170,7 @@ class ExegesisX86Target : public ExegesisTarget { std::unique_ptr<BenchmarkRunner> createLatencyBenchmarkRunner(const LLVMState &State) const override { - return llvm::make_unique<X86BenchmarkRunner<X86LatencyImpl>>( - State); + return llvm::make_unique<X86BenchmarkRunner<X86LatencyImpl>>(State); } std::unique_ptr<BenchmarkRunner> |