summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp')
-rw-r--r--llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp
index edacd7fe629..7467222db13 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp
@@ -18,6 +18,9 @@
#include <unordered_set>
namespace exegesis {
+
+void InitializeX86ExegesisTarget();
+
namespace {
using testing::AnyOf;
@@ -41,6 +44,7 @@ protected:
LLVMInitializeX86TargetMC();
LLVMInitializeX86Target();
LLVMInitializeX86AsmPrinter();
+ InitializeX86ExegesisTarget();
}
const LLVMState State;
@@ -215,6 +219,30 @@ TEST_F(UopsSnippetGeneratorTest, NoTiedVariables) {
EXPECT_THAT(II.VariableValues[3], IsInvalid());
}
+TEST_F(UopsSnippetGeneratorTest, MemoryUse) {
+ // Mov32rm reads from memory.
+ const unsigned Opcode = llvm::X86::MOV32rm;
+ const SnippetPrototype Proto = checkAndGetConfigurations(Opcode);
+ EXPECT_THAT(Proto.Explanation, HasSubstr("no tied variables"));
+ ASSERT_THAT(Proto.Snippet,
+ SizeIs(UopsBenchmarkRunner::kMinNumDifferentAddresses));
+ const InstructionInstance &II = Proto.Snippet[0];
+ EXPECT_THAT(II.getOpcode(), Opcode);
+ ASSERT_THAT(II.VariableValues, SizeIs(6));
+ EXPECT_EQ(II.VariableValues[2].getImm(), 1);
+ EXPECT_EQ(II.VariableValues[3].getReg(), 0u);
+ EXPECT_EQ(II.VariableValues[4].getImm(), 0);
+ EXPECT_EQ(II.VariableValues[5].getReg(), 0u);
+}
+
+TEST_F(UopsSnippetGeneratorTest, MemoryUse_Movsb) {
+ // MOVSB writes to scratch memory register.
+ const unsigned Opcode = llvm::X86::MOVSB;
+ auto Error = Runner.generatePrototype(Opcode).takeError();
+ EXPECT_TRUE((bool)Error);
+ llvm::consumeError(std::move(Error));
+}
+
class FakeBenchmarkRunner : public BenchmarkRunner {
public:
FakeBenchmarkRunner(const LLVMState &State)
@@ -232,7 +260,7 @@ private:
}
std::vector<BenchmarkMeasure>
- runMeasurements(const ExecutableFunction &EF,
+ runMeasurements(const ExecutableFunction &EF, ScratchSpace &Scratch,
const unsigned NumRepetitions) const override {
return {};
}
OpenPOWER on IntegriCloud