brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · 3d9e687 Raw
122 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 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"14 15#include "gtest/gtest.h"16 17#include <memory>18 19using namespace llvm;20 21namespace {22 23class InstrAnalysisTest : public testing::TestWithParam<const char *> {24protected:25  std::unique_ptr<const MCInstrInfo> Info;26  std::unique_ptr<const MCInstrAnalysis> Analysis;27 28  static void SetUpTestSuite() {29    LLVMInitializeLoongArchTargetInfo();30    LLVMInitializeLoongArchTarget();31    LLVMInitializeLoongArchTargetMC();32  }33 34  InstrAnalysisTest() {35    std::string Error;36    Triple TT(Triple::normalize(GetParam()));37    const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);38    Info = std::unique_ptr<const MCInstrInfo>(TheTarget->createMCInstrInfo());39    Analysis = std::unique_ptr<const MCInstrAnalysis>(40        TheTarget->createMCInstrAnalysis(Info.get()));41  }42};43 44} // namespace45 46static MCInst beq() {47  return MCInstBuilder(LoongArch::BEQ)48      .addReg(LoongArch::R0)49      .addReg(LoongArch::R1)50      .addImm(32);51}52 53static MCInst b() { return MCInstBuilder(LoongArch::B).addImm(32); }54 55static MCInst bl() { return MCInstBuilder(LoongArch::BL).addImm(32); }56 57static MCInst jirl(unsigned RD, unsigned RJ = LoongArch::R10) {58  return MCInstBuilder(LoongArch::JIRL).addReg(RD).addReg(RJ).addImm(16);59}60 61TEST_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)));67}68 69TEST_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)));75}76 77TEST_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)));84}85 86TEST_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)));93}94 95TEST_P(InstrAnalysisTest, IsConditionalBranch) {96  EXPECT_TRUE(Analysis->isConditionalBranch(beq()));97  EXPECT_FALSE(Analysis->isConditionalBranch(b()));98  EXPECT_FALSE(Analysis->isConditionalBranch(bl()));99}100 101TEST_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)));109}110 111TEST_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)));118}119 120INSTANTIATE_TEST_SUITE_P(LA32And64, InstrAnalysisTest,121                         testing::Values("loongarch32", "loongarch64"));122