17ea2e519SDaniel Sanders //===- GIMatchDagPredicate.cpp - Represent a predicate to check -----------===//
27ea2e519SDaniel Sanders //
37ea2e519SDaniel Sanders // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47ea2e519SDaniel Sanders // See https://llvm.org/LICENSE.txt for license information.
57ea2e519SDaniel Sanders // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67ea2e519SDaniel Sanders //
77ea2e519SDaniel Sanders //===----------------------------------------------------------------------===//
87ea2e519SDaniel Sanders 
97ea2e519SDaniel Sanders #include "GIMatchDagPredicate.h"
101d94fb21SDaniel Sanders 
117ea2e519SDaniel Sanders #include "llvm/TableGen/Record.h"
127ea2e519SDaniel Sanders 
137ea2e519SDaniel Sanders #include "../CodeGenInstruction.h"
14*bd059b3bSserge-sans-paille #include "GIMatchDag.h"
157ea2e519SDaniel Sanders 
167ea2e519SDaniel Sanders using namespace llvm;
177ea2e519SDaniel Sanders 
print(raw_ostream & OS) const187ea2e519SDaniel Sanders void GIMatchDagPredicate::print(raw_ostream &OS) const {
197ea2e519SDaniel Sanders   OS << "<<";
207ea2e519SDaniel Sanders   printDescription(OS);
217ea2e519SDaniel Sanders   OS << ">>:$" << Name;
227ea2e519SDaniel Sanders }
237ea2e519SDaniel Sanders 
printDescription(raw_ostream & OS) const247ea2e519SDaniel Sanders void GIMatchDagPredicate::printDescription(raw_ostream &OS) const { OS << ""; }
257ea2e519SDaniel Sanders 
GIMatchDagOpcodePredicate(GIMatchDagContext & Ctx,StringRef Name,const CodeGenInstruction & Instr)267ea2e519SDaniel Sanders GIMatchDagOpcodePredicate::GIMatchDagOpcodePredicate(
277ea2e519SDaniel Sanders     GIMatchDagContext &Ctx, StringRef Name, const CodeGenInstruction &Instr)
287ea2e519SDaniel Sanders     : GIMatchDagPredicate(GIMatchDagPredicateKind_Opcode, Name,
297ea2e519SDaniel Sanders                           Ctx.makeMIPredicateOperandList()),
307ea2e519SDaniel Sanders       Instr(Instr) {}
317ea2e519SDaniel Sanders 
printDescription(raw_ostream & OS) const327ea2e519SDaniel Sanders void GIMatchDagOpcodePredicate::printDescription(raw_ostream &OS) const {
337ea2e519SDaniel Sanders   OS << "$mi.getOpcode() == " << Instr.TheDef->getName();
347ea2e519SDaniel Sanders }
357ea2e519SDaniel Sanders 
GIMatchDagOneOfOpcodesPredicate(GIMatchDagContext & Ctx,StringRef Name)361d94fb21SDaniel Sanders GIMatchDagOneOfOpcodesPredicate::GIMatchDagOneOfOpcodesPredicate(
371d94fb21SDaniel Sanders     GIMatchDagContext &Ctx, StringRef Name)
381d94fb21SDaniel Sanders     : GIMatchDagPredicate(GIMatchDagPredicateKind_OneOfOpcodes, Name,
391d94fb21SDaniel Sanders                           Ctx.makeMIPredicateOperandList()) {}
401d94fb21SDaniel Sanders 
printDescription(raw_ostream & OS) const411d94fb21SDaniel Sanders void GIMatchDagOneOfOpcodesPredicate::printDescription(raw_ostream &OS) const {
421d94fb21SDaniel Sanders   OS << "$mi.getOpcode() == oneof(";
431d94fb21SDaniel Sanders   StringRef Separator = "";
441d94fb21SDaniel Sanders   for (const CodeGenInstruction *Instr : Instrs) {
451d94fb21SDaniel Sanders     OS << Separator << Instr->TheDef->getName();
461d94fb21SDaniel Sanders     Separator = ",";
471d94fb21SDaniel Sanders   }
481d94fb21SDaniel Sanders   OS << ")";
491d94fb21SDaniel Sanders }
501d94fb21SDaniel Sanders 
GIMatchDagSameMOPredicate(GIMatchDagContext & Ctx,StringRef Name)517ea2e519SDaniel Sanders GIMatchDagSameMOPredicate::GIMatchDagSameMOPredicate(GIMatchDagContext &Ctx,
527ea2e519SDaniel Sanders                                                      StringRef Name)
537ea2e519SDaniel Sanders     : GIMatchDagPredicate(GIMatchDagPredicateKind_SameMO, Name,
547ea2e519SDaniel Sanders                           Ctx.makeTwoMOPredicateOperandList()) {}
557ea2e519SDaniel Sanders 
printDescription(raw_ostream & OS) const567ea2e519SDaniel Sanders void GIMatchDagSameMOPredicate::printDescription(raw_ostream &OS) const {
577ea2e519SDaniel Sanders   OS << "$mi0 == $mi1";
587ea2e519SDaniel Sanders }
597ea2e519SDaniel Sanders 
operator <<(raw_ostream & OS,const GIMatchDagPredicate & N)607ea2e519SDaniel Sanders raw_ostream &llvm::operator<<(raw_ostream &OS, const GIMatchDagPredicate &N) {
617ea2e519SDaniel Sanders   N.print(OS);
627ea2e519SDaniel Sanders   return OS;
637ea2e519SDaniel Sanders }
647ea2e519SDaniel Sanders 
operator <<(raw_ostream & OS,const GIMatchDagOpcodePredicate & N)657ea2e519SDaniel Sanders raw_ostream &llvm::operator<<(raw_ostream &OS,
667ea2e519SDaniel Sanders                               const GIMatchDagOpcodePredicate &N) {
677ea2e519SDaniel Sanders   N.print(OS);
687ea2e519SDaniel Sanders   return OS;
697ea2e519SDaniel Sanders }
70