//===-- llvm/Target/AMDGPU/AMDGPUMIRFormatter.h -----------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
/// \file
/// AMDGPU specific overrides of MIRFormatter.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_AMDGPUMIRFORMATTER_H
#define LLVM_LIB_TARGET_AMDGPUMIRFORMATTER_H

#include "llvm/CodeGen/MIRFormatter.h"

namespace llvm {

class MachineFunction;
struct PerFunctionMIParsingState;

class AMDGPUMIRFormatter final : public MIRFormatter {
public:
  AMDGPUMIRFormatter() = default;
  ~AMDGPUMIRFormatter() override = default;

  /// Implement target specific printing for machine operand immediate value, so
  /// that we can have more meaningful mnemonic than a 64-bit integer. Passing
  /// None to OpIdx means the index is unknown.
  void printImm(raw_ostream &OS, const MachineInstr &MI,
                std::optional<unsigned> OpIdx, int64_t Imm) const override;

  /// Implement target specific parsing of immediate mnemonics. The mnemonic is
  /// a string with a leading dot.
  bool parseImmMnemonic(const unsigned OpCode, const unsigned OpIdx,
                        StringRef Src, int64_t &Imm,
                        ErrorCallbackType ErrorCallback) const override;

  /// Implement target specific parsing of target custom pseudo source value.
  bool
  parseCustomPseudoSourceValue(StringRef Src, MachineFunction &MF,
                               PerFunctionMIParsingState &PFS,
                               const PseudoSourceValue *&PSV,
                               ErrorCallbackType ErrorCallback) const override;

private:
  /// Print the string to represent s_delay_alu immediate value
  void printSDelayAluImm(int64_t Imm, llvm::raw_ostream &OS) const;

  /// Parse the immediate pseudo literal for s_delay_alu
  bool parseSDelayAluImmMnemonic(
      const unsigned int OpIdx, int64_t &Imm, llvm::StringRef &Src,
      llvm::MIRFormatter::ErrorCallbackType &ErrorCallback) const;

};

} // end namespace llvm

#endif
