//===--------------------- PredicateExpander.h ----------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
/// \file
/// Functionalities used by the Tablegen backends to expand machine predicates.
///
/// See file llvm/Target/TargetInstrPredicate.td for a full list and description
/// of all the supported MCInstPredicate classes.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H
#define LLVM_UTILS_TABLEGEN_PREDICATEEXPANDER_H

#include "llvm/ADT/StringRef.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/TableGen/Record.h"

namespace llvm {

class formatted_raw_ostream;

class PredicateExpander {
  bool EmitCallsByRef;
  bool NegatePredicate;
  bool ExpandForMC;
  unsigned IndentLevel;

  PredicateExpander(const PredicateExpander &) = delete;
  PredicateExpander &operator=(const PredicateExpander &) = delete;

public:
  PredicateExpander()
      : EmitCallsByRef(true), NegatePredicate(false), ExpandForMC(false),
        IndentLevel(1U) {}
  bool isByRef() const { return EmitCallsByRef; }
  bool shouldNegate() const { return NegatePredicate; }
  bool shouldExpandForMC() const { return ExpandForMC; }
  unsigned getIndentLevel() const { return IndentLevel; }

  void setByRef(bool Value) { EmitCallsByRef = Value; }
  void flipNegatePredicate() { NegatePredicate = !NegatePredicate; }
  void setNegatePredicate(bool Value) { NegatePredicate = Value; }
  void setExpandForMC(bool Value) { ExpandForMC = Value; }
  void increaseIndentLevel() { ++IndentLevel; }
  void decreaseIndentLevel() { --IndentLevel; }
  void setIndentLevel(unsigned Level) { IndentLevel = Level; }

  using RecVec = std::vector<Record *>;
  void expandTrue(formatted_raw_ostream &OS);
  void expandFalse(formatted_raw_ostream &OS);
  void expandCheckImmOperand(formatted_raw_ostream &OS, int OpIndex,
                             int ImmVal);
  void expandCheckImmOperand(formatted_raw_ostream &OS, int OpIndex,
                             StringRef ImmVal);
  void expandCheckRegOperand(formatted_raw_ostream &OS, int OpIndex,
                             const Record *Reg);
  void expandCheckSameRegOperand(formatted_raw_ostream &OS, int First,
                                 int Second);
  void expandCheckNumOperands(formatted_raw_ostream &OS, int NumOps);
  void expandCheckOpcode(formatted_raw_ostream &OS, const Record *Inst);

  void expandCheckPseudo(formatted_raw_ostream &OS, const RecVec &Opcodes);
  void expandCheckOpcode(formatted_raw_ostream &OS, const RecVec &Opcodes);
  void expandPredicateSequence(formatted_raw_ostream &OS,
                               const RecVec &Sequence, bool IsCheckAll);
  void expandTIIFunctionCall(formatted_raw_ostream &OS, StringRef TargetName,
                             StringRef MethodName);
  void expandCheckIsRegOperand(formatted_raw_ostream &OS, int OpIndex);
  void expandCheckIsImmOperand(formatted_raw_ostream &OS, int OpIndex);
  void expandCheckInvalidRegOperand(formatted_raw_ostream &OS, int OpIndex);
  void expandCheckFunctionPredicate(formatted_raw_ostream &OS,
                                    StringRef MCInstFn,
                                    StringRef MachineInstrFn);
  void expandCheckNonPortable(formatted_raw_ostream &OS, StringRef CodeBlock);
  void expandPredicate(formatted_raw_ostream &OS, const Record *Rec);
};

} // namespace llvm

#endif
