[llvm-shlib] Fix the version naming style of libLLVM for Windows (#85710)
[llvm-project.git] / llvm / unittests / Target / LoongArch / MCInstrAnalysisTest.cpp
blob468ee79615d643c953255a8cc7f0450087a4b218
1 //===- MCInstrAnalysisTest.cpp - LoongArchMCInstrAnalysis unit tests ------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include "llvm/MC/MCInstrAnalysis.h"
10 #include "MCTargetDesc/LoongArchMCTargetDesc.h"
11 #include "llvm/MC/MCInstBuilder.h"
12 #include "llvm/MC/TargetRegistry.h"
13 #include "llvm/Support/TargetSelect.h"
15 #include "gtest/gtest.h"
17 #include <memory>
19 using namespace llvm;
21 namespace {
23 class InstrAnalysisTest : public testing::TestWithParam<const char *> {
24 protected:
25 std::unique_ptr<const MCInstrInfo> Info;
26 std::unique_ptr<const MCInstrAnalysis> Analysis;
28 static void SetUpTestSuite() {
29 LLVMInitializeLoongArchTargetInfo();
30 LLVMInitializeLoongArchTarget();
31 LLVMInitializeLoongArchTargetMC();
34 InstrAnalysisTest() {
35 std::string Error;
36 const Target *TheTarget =
37 TargetRegistry::lookupTarget(Triple::normalize(GetParam()), Error);
38 Info = std::unique_ptr<const MCInstrInfo>(TheTarget->createMCInstrInfo());
39 Analysis = std::unique_ptr<const MCInstrAnalysis>(
40 TheTarget->createMCInstrAnalysis(Info.get()));
44 } // namespace
46 static MCInst beq() {
47 return MCInstBuilder(LoongArch::BEQ)
48 .addReg(LoongArch::R0)
49 .addReg(LoongArch::R1)
50 .addImm(32);
53 static MCInst b() { return MCInstBuilder(LoongArch::B).addImm(32); }
55 static MCInst bl() { return MCInstBuilder(LoongArch::BL).addImm(32); }
57 static MCInst jirl(unsigned RD, unsigned RJ = LoongArch::R10) {
58 return MCInstBuilder(LoongArch::JIRL).addReg(RD).addReg(RJ).addImm(16);
61 TEST_P(InstrAnalysisTest, IsTerminator) {
62 EXPECT_TRUE(Analysis->isTerminator(beq()));
63 EXPECT_TRUE(Analysis->isTerminator(b()));
64 EXPECT_FALSE(Analysis->isTerminator(bl()));
65 EXPECT_TRUE(Analysis->isTerminator(jirl(LoongArch::R0)));
66 EXPECT_FALSE(Analysis->isTerminator(jirl(LoongArch::R5)));
69 TEST_P(InstrAnalysisTest, IsCall) {
70 EXPECT_FALSE(Analysis->isCall(beq()));
71 EXPECT_FALSE(Analysis->isCall(b()));
72 EXPECT_TRUE(Analysis->isCall(bl()));
73 EXPECT_TRUE(Analysis->isCall(jirl(LoongArch::R1)));
74 EXPECT_FALSE(Analysis->isCall(jirl(LoongArch::R0)));
77 TEST_P(InstrAnalysisTest, IsReturn) {
78 EXPECT_FALSE(Analysis->isReturn(beq()));
79 EXPECT_FALSE(Analysis->isReturn(b()));
80 EXPECT_FALSE(Analysis->isReturn(bl()));
81 EXPECT_TRUE(Analysis->isReturn(jirl(LoongArch::R0, LoongArch::R1)));
82 EXPECT_FALSE(Analysis->isReturn(jirl(LoongArch::R0)));
83 EXPECT_FALSE(Analysis->isReturn(jirl(LoongArch::R1)));
86 TEST_P(InstrAnalysisTest, IsBranch) {
87 EXPECT_TRUE(Analysis->isBranch(beq()));
88 EXPECT_TRUE(Analysis->isBranch(b()));
89 EXPECT_FALSE(Analysis->isBranch(bl()));
90 EXPECT_TRUE(Analysis->isBranch(jirl(LoongArch::R0)));
91 EXPECT_FALSE(Analysis->isBranch(jirl(LoongArch::R1)));
92 EXPECT_FALSE(Analysis->isBranch(jirl(LoongArch::R0, LoongArch::R1)));
95 TEST_P(InstrAnalysisTest, IsConditionalBranch) {
96 EXPECT_TRUE(Analysis->isConditionalBranch(beq()));
97 EXPECT_FALSE(Analysis->isConditionalBranch(b()));
98 EXPECT_FALSE(Analysis->isConditionalBranch(bl()));
101 TEST_P(InstrAnalysisTest, IsUnconditionalBranch) {
102 EXPECT_FALSE(Analysis->isUnconditionalBranch(beq()));
103 EXPECT_TRUE(Analysis->isUnconditionalBranch(b()));
104 EXPECT_FALSE(Analysis->isUnconditionalBranch(bl()));
105 EXPECT_TRUE(Analysis->isUnconditionalBranch(jirl(LoongArch::R0)));
106 EXPECT_FALSE(Analysis->isUnconditionalBranch(jirl(LoongArch::R1)));
107 EXPECT_FALSE(
108 Analysis->isUnconditionalBranch(jirl(LoongArch::R0, LoongArch::R1)));
111 TEST_P(InstrAnalysisTest, IsIndirectBranch) {
112 EXPECT_FALSE(Analysis->isIndirectBranch(beq()));
113 EXPECT_FALSE(Analysis->isIndirectBranch(b()));
114 EXPECT_FALSE(Analysis->isIndirectBranch(bl()));
115 EXPECT_TRUE(Analysis->isIndirectBranch(jirl(LoongArch::R0)));
116 EXPECT_FALSE(Analysis->isIndirectBranch(jirl(LoongArch::R1)));
117 EXPECT_FALSE(Analysis->isIndirectBranch(jirl(LoongArch::R0, LoongArch::R1)));
120 INSTANTIATE_TEST_SUITE_P(LA32And64, InstrAnalysisTest,
121 testing::Values("loongarch32", "loongarch64"));