1e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//===-- llvm/MC/MCInstrInfo.h - Target Instruction Info ---------*- C++ -*-===//
2e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//
3e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//                     The LLVM Compiler Infrastructure
4e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//
5e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng// This file is distributed under the University of Illinois Open Source
6e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng// License. See LICENSE.TXT for details.
7e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//
8e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//===----------------------------------------------------------------------===//
9e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//
10e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng// This file describes the target machine instruction set.
11e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//
12e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//===----------------------------------------------------------------------===//
13e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
14e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng#ifndef LLVM_MC_MCINSTRINFO_H
15e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng#define LLVM_MC_MCINSTRINFO_H
16e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
17e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng#include "llvm/MC/MCInstrDesc.h"
18e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng#include <cassert>
19e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
20e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Chengnamespace llvm {
21e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
22e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng//---------------------------------------------------------------------------
236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// \brief Interface to description of machine instruction set.
24e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Chengclass MCInstrInfo {
25c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer  const MCInstrDesc *Desc;          // Raw array to allow static init'n
26c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer  const unsigned *InstrNameIndices; // Array for name indices in InstrNameData
27c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer  const char *InstrNameData;        // Instruction name string pool
28c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer  unsigned NumOpcodes;              // Number of entries in the desc array
29e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
30e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Chengpublic:
316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Initialize MCInstrInfo, called by TableGen auto-generated routines.
326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// *DO NOT USE*.
33c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer  void InitMCInstrInfo(const MCInstrDesc *D, const unsigned *NI, const char *ND,
34c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer                       unsigned NO) {
35e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng    Desc = D;
36c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer    InstrNameIndices = NI;
37c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer    InstrNameData = ND;
38e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng    NumOpcodes = NO;
39e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  }
40e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
41e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  unsigned getNumOpcodes() const { return NumOpcodes; }
42e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Return the machine instruction descriptor that corresponds to the
44e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  /// specified instruction opcode.
45e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  const MCInstrDesc &get(unsigned Opcode) const {
46e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng    assert(Opcode < NumOpcodes && "Invalid opcode!");
47e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng    return Desc[Opcode];
48e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  }
49c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer
506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Returns the name for the instructions with the given opcode.
51c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer  const char *getName(unsigned Opcode) const {
52c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer    assert(Opcode < NumOpcodes && "Invalid opcode!");
53c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer    return &InstrNameData[InstrNameIndices[Opcode]];
54c667ba69ac342563c0886e20509e68705d78a0a5Benjamin Kramer  }
55e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng};
56e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
57e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng} // End llvm namespace
58e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng
59e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng#endif
60