1356843Sdim//===- GIMatchDagPredicate.cpp - Represent a predicate to check -----------===//
2356843Sdim//
3356843Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4356843Sdim// See https://llvm.org/LICENSE.txt for license information.
5356843Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6356843Sdim//
7356843Sdim//===----------------------------------------------------------------------===//
8356843Sdim
9356843Sdim#include "GIMatchDagPredicate.h"
10356843Sdim
11356843Sdim#include "llvm/TableGen/Record.h"
12356843Sdim
13356843Sdim#include "GIMatchDagOperands.h"
14356843Sdim#include "../CodeGenInstruction.h"
15356843Sdim
16356843Sdimusing namespace llvm;
17356843Sdim
18356843Sdimvoid GIMatchDagPredicate::print(raw_ostream &OS) const {
19356843Sdim  OS << "<<";
20356843Sdim  printDescription(OS);
21356843Sdim  OS << ">>:$" << Name;
22356843Sdim}
23356843Sdim
24356843Sdimvoid GIMatchDagPredicate::printDescription(raw_ostream &OS) const { OS << ""; }
25356843Sdim
26356843SdimGIMatchDagOpcodePredicate::GIMatchDagOpcodePredicate(
27356843Sdim    GIMatchDagContext &Ctx, StringRef Name, const CodeGenInstruction &Instr)
28356843Sdim    : GIMatchDagPredicate(GIMatchDagPredicateKind_Opcode, Name,
29356843Sdim                          Ctx.makeMIPredicateOperandList()),
30356843Sdim      Instr(Instr) {}
31356843Sdim
32356843Sdimvoid GIMatchDagOpcodePredicate::printDescription(raw_ostream &OS) const {
33356843Sdim  OS << "$mi.getOpcode() == " << Instr.TheDef->getName();
34356843Sdim}
35356843Sdim
36356843SdimGIMatchDagOneOfOpcodesPredicate::GIMatchDagOneOfOpcodesPredicate(
37356843Sdim    GIMatchDagContext &Ctx, StringRef Name)
38356843Sdim    : GIMatchDagPredicate(GIMatchDagPredicateKind_OneOfOpcodes, Name,
39356843Sdim                          Ctx.makeMIPredicateOperandList()) {}
40356843Sdim
41356843Sdimvoid GIMatchDagOneOfOpcodesPredicate::printDescription(raw_ostream &OS) const {
42356843Sdim  OS << "$mi.getOpcode() == oneof(";
43356843Sdim  StringRef Separator = "";
44356843Sdim  for (const CodeGenInstruction *Instr : Instrs) {
45356843Sdim    OS << Separator << Instr->TheDef->getName();
46356843Sdim    Separator = ",";
47356843Sdim  }
48356843Sdim  OS << ")";
49356843Sdim}
50356843Sdim
51356843SdimGIMatchDagSameMOPredicate::GIMatchDagSameMOPredicate(GIMatchDagContext &Ctx,
52356843Sdim                                                     StringRef Name)
53356843Sdim    : GIMatchDagPredicate(GIMatchDagPredicateKind_SameMO, Name,
54356843Sdim                          Ctx.makeTwoMOPredicateOperandList()) {}
55356843Sdim
56356843Sdimvoid GIMatchDagSameMOPredicate::printDescription(raw_ostream &OS) const {
57356843Sdim  OS << "$mi0 == $mi1";
58356843Sdim}
59356843Sdim
60356843Sdimraw_ostream &llvm::operator<<(raw_ostream &OS, const GIMatchDagPredicate &N) {
61356843Sdim  N.print(OS);
62356843Sdim  return OS;
63356843Sdim}
64356843Sdim
65356843Sdimraw_ostream &llvm::operator<<(raw_ostream &OS,
66356843Sdim                              const GIMatchDagOpcodePredicate &N) {
67356843Sdim  N.print(OS);
68356843Sdim  return OS;
69356843Sdim}
70