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" 10*1d94fb21SDaniel Sanders 117ea2e519SDaniel Sanders #include "llvm/TableGen/Record.h" 127ea2e519SDaniel Sanders 137ea2e519SDaniel Sanders #include "GIMatchDagOperands.h" 147ea2e519SDaniel Sanders #include "../CodeGenInstruction.h" 157ea2e519SDaniel Sanders 167ea2e519SDaniel Sanders using namespace llvm; 177ea2e519SDaniel Sanders 187ea2e519SDaniel Sanders void GIMatchDagPredicate::print(raw_ostream &OS) const { 197ea2e519SDaniel Sanders OS << "<<"; 207ea2e519SDaniel Sanders printDescription(OS); 217ea2e519SDaniel Sanders OS << ">>:$" << Name; 227ea2e519SDaniel Sanders } 237ea2e519SDaniel Sanders 247ea2e519SDaniel Sanders void GIMatchDagPredicate::printDescription(raw_ostream &OS) const { OS << ""; } 257ea2e519SDaniel Sanders 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 327ea2e519SDaniel Sanders void GIMatchDagOpcodePredicate::printDescription(raw_ostream &OS) const { 337ea2e519SDaniel Sanders OS << "$mi.getOpcode() == " << Instr.TheDef->getName(); 347ea2e519SDaniel Sanders } 357ea2e519SDaniel Sanders 36*1d94fb21SDaniel Sanders GIMatchDagOneOfOpcodesPredicate::GIMatchDagOneOfOpcodesPredicate( 37*1d94fb21SDaniel Sanders GIMatchDagContext &Ctx, StringRef Name) 38*1d94fb21SDaniel Sanders : GIMatchDagPredicate(GIMatchDagPredicateKind_OneOfOpcodes, Name, 39*1d94fb21SDaniel Sanders Ctx.makeMIPredicateOperandList()) {} 40*1d94fb21SDaniel Sanders 41*1d94fb21SDaniel Sanders void GIMatchDagOneOfOpcodesPredicate::printDescription(raw_ostream &OS) const { 42*1d94fb21SDaniel Sanders OS << "$mi.getOpcode() == oneof("; 43*1d94fb21SDaniel Sanders StringRef Separator = ""; 44*1d94fb21SDaniel Sanders for (const CodeGenInstruction *Instr : Instrs) { 45*1d94fb21SDaniel Sanders OS << Separator << Instr->TheDef->getName(); 46*1d94fb21SDaniel Sanders Separator = ","; 47*1d94fb21SDaniel Sanders } 48*1d94fb21SDaniel Sanders OS << ")"; 49*1d94fb21SDaniel Sanders } 50*1d94fb21SDaniel Sanders 517ea2e519SDaniel Sanders GIMatchDagSameMOPredicate::GIMatchDagSameMOPredicate(GIMatchDagContext &Ctx, 527ea2e519SDaniel Sanders StringRef Name) 537ea2e519SDaniel Sanders : GIMatchDagPredicate(GIMatchDagPredicateKind_SameMO, Name, 547ea2e519SDaniel Sanders Ctx.makeTwoMOPredicateOperandList()) {} 557ea2e519SDaniel Sanders 567ea2e519SDaniel Sanders void GIMatchDagSameMOPredicate::printDescription(raw_ostream &OS) const { 577ea2e519SDaniel Sanders OS << "$mi0 == $mi1"; 587ea2e519SDaniel Sanders } 597ea2e519SDaniel Sanders 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 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