89 lines · c
1//===- HexagonMCCodeEmitter.h - Hexagon Target Descriptions -----*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// Definition for classes that emit Hexagon machine code from MCInsts11///12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCCODEEMITTER_H15#define LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCCODEEMITTER_H16 17#include "MCTargetDesc/HexagonFixupKinds.h"18#include "MCTargetDesc/HexagonMCExpr.h"19#include "llvm/MC/MCCodeEmitter.h"20#include "llvm/MC/MCExpr.h"21#include "llvm/TargetParser/SubtargetFeature.h"22#include <cstddef>23#include <cstdint>24 25namespace llvm {26 27class MCContext;28class MCInst;29class MCInstrInfo;30class MCOperand;31class MCSubtargetInfo;32class raw_ostream;33 34class HexagonMCCodeEmitter : public MCCodeEmitter {35 MCContext &MCT;36 MCInstrInfo const &MCII;37 38 // A mutable state of the emitter when encoding bundles and duplexes.39 struct EmitterState {40 unsigned Addend = 0;41 bool Extended = false;42 bool SubInst1 = false;43 const MCInst *Bundle = nullptr;44 size_t Index = 0;45 };46 mutable EmitterState State;47 48public:49 HexagonMCCodeEmitter(MCInstrInfo const &MII, MCContext &MCT)50 : MCT(MCT), MCII(MII) {}51 52 void encodeInstruction(MCInst const &MI, SmallVectorImpl<char> &CB,53 SmallVectorImpl<MCFixup> &Fixups,54 MCSubtargetInfo const &STI) const override;55 56 void encodeSingleInstruction(const MCInst &MI, SmallVectorImpl<char> &CB,57 SmallVectorImpl<MCFixup> &Fixups,58 const MCSubtargetInfo &STI,59 uint32_t Parse) const;60 61 // TableGen'erated function for getting the62 // binary encoding for an instruction.63 uint64_t getBinaryCodeForInstr(MCInst const &MI,64 SmallVectorImpl<MCFixup> &Fixups,65 MCSubtargetInfo const &STI) const;66 67 /// Return binary encoding of operand.68 unsigned getMachineOpValue(MCInst const &MI, MCOperand const &MO,69 SmallVectorImpl<MCFixup> &Fixups,70 MCSubtargetInfo const &STI) const;71 72private:73 // helper routine for getMachineOpValue()74 unsigned getExprOpValue(const MCInst &MI, const MCOperand &MO,75 const MCExpr *ME, SmallVectorImpl<MCFixup> &Fixups,76 const MCSubtargetInfo &STI) const;77 78 Hexagon::Fixups getFixupNoBits(MCInstrInfo const &MCII, const MCInst &MI,79 const MCOperand &MO,80 HexagonMCExpr::VariantKind Kind) const;81 82 // Return parse bits for instruction `MCI' inside bundle `MCB'83 uint32_t parseBits(size_t Last, MCInst const &MCB, MCInst const &MCI) const;84};85 86} // end namespace llvm87 88#endif // LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCCODEEMITTER_H89