| //===-- CSKYMCCodeEmitter.cpp - CSKY Code Emitter interface ---------------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements the CSKYMCCodeEmitter class. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_CSKY_MCTARGETDESC_CSKYMCCODEEMITTER_H |
| #define LLVM_LIB_TARGET_CSKY_MCTARGETDESC_CSKYMCCODEEMITTER_H |
| |
| #include "MCTargetDesc/CSKYFixupKinds.h" |
| #include "MCTargetDesc/CSKYMCExpr.h" |
| #include "llvm/MC/MCCodeEmitter.h" |
| #include "llvm/MC/MCContext.h" |
| |
| namespace llvm { |
| |
| class MCInstrInfo; |
| |
| class CSKYMCCodeEmitter : public MCCodeEmitter { |
| MCContext &Ctx; |
| const MCInstrInfo &MII; |
| |
| public: |
| CSKYMCCodeEmitter(MCContext &Ctx, const MCInstrInfo &MII) |
| : Ctx(Ctx), MII(MII) {} |
| |
| ~CSKYMCCodeEmitter() {} |
| |
| void encodeInstruction(const MCInst &Inst, raw_ostream &OS, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const override; |
| |
| // Generated by tablegen. |
| uint64_t getBinaryCodeForInstr(const MCInst &MI, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| // Default encoding method used by tablegen. |
| unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| template <int shift = 0> |
| unsigned getImmOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const { |
| const MCOperand &MO = MI.getOperand(Idx); |
| if (MO.isImm()) |
| return (MO.getImm() >> shift); |
| |
| assert(MO.isExpr() && "Unexpected MO type."); |
| |
| MCFixupKind Kind = getTargetFixup(MO.getExpr()); |
| Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc())); |
| return 0; |
| } |
| |
| unsigned getRegSeqImmOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| unsigned getRegisterSeqOpValue(const MCInst &MI, unsigned Op, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| unsigned getOImmOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| unsigned getImmOpValueIDLY(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| unsigned getImmJMPIX(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| unsigned getImmOpValueMSBSize(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| |
| unsigned getImmShiftOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const { |
| const MCOperand &MO = MI.getOperand(Idx); |
| assert(MO.isImm() && "Unexpected MO type."); |
| return 1 << MO.getImm(); |
| } |
| |
| MCFixupKind getTargetFixup(const MCExpr *Expr) const; |
| |
| template <llvm::CSKY::Fixups FIXUP> |
| unsigned getBranchSymbolOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const { |
| const MCOperand &MO = MI.getOperand(Idx); |
| |
| if (MO.isImm()) |
| return MO.getImm() >> 1; |
| |
| assert(MO.isExpr() && "Unexpected MO type."); |
| |
| MCFixupKind Kind = MCFixupKind(FIXUP); |
| if (MO.getExpr()->getKind() == MCExpr::Target) |
| Kind = getTargetFixup(MO.getExpr()); |
| |
| Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc())); |
| return 0; |
| } |
| |
| template <llvm::CSKY::Fixups FIXUP> |
| unsigned getConstpoolSymbolOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const { |
| const MCOperand &MO = MI.getOperand(Idx); |
| assert(MO.isExpr() && "Unexpected MO type."); |
| |
| MCFixupKind Kind = MCFixupKind(FIXUP); |
| if (MO.getExpr()->getKind() == MCExpr::Target) |
| Kind = getTargetFixup(MO.getExpr()); |
| |
| Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc())); |
| return 0; |
| } |
| |
| template <llvm::CSKY::Fixups FIXUP> |
| unsigned getDataSymbolOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const { |
| const MCOperand &MO = MI.getOperand(Idx); |
| assert(MO.isExpr() && "Unexpected MO type."); |
| |
| MCFixupKind Kind = MCFixupKind(FIXUP); |
| if (MO.getExpr()->getKind() == MCExpr::Target) |
| Kind = getTargetFixup(MO.getExpr()); |
| |
| Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc())); |
| return 0; |
| } |
| |
| unsigned getCallSymbolOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const { |
| const MCOperand &MO = MI.getOperand(Idx); |
| assert(MO.isExpr() && "Unexpected MO type."); |
| |
| MCFixupKind Kind = MCFixupKind(CSKY::fixup_csky_pcrel_imm26_scale2); |
| if (MO.getExpr()->getKind() == MCExpr::Target) |
| Kind = getTargetFixup(MO.getExpr()); |
| |
| Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc())); |
| return 0; |
| } |
| |
| unsigned getBareSymbolOpValue(const MCInst &MI, unsigned Idx, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const { |
| const MCOperand &MO = MI.getOperand(Idx); |
| assert(MO.isExpr() && "Unexpected MO type."); |
| |
| MCFixupKind Kind = MCFixupKind(CSKY::fixup_csky_pcrel_imm18_scale2); |
| if (MO.getExpr()->getKind() == MCExpr::Target) |
| Kind = getTargetFixup(MO.getExpr()); |
| |
| Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc())); |
| return 0; |
| } |
| |
| void expandJBTF(const MCInst &MI, raw_ostream &OS, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| void expandNEG(const MCInst &MI, raw_ostream &OS, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| void expandRSUBI(const MCInst &MI, raw_ostream &OS, |
| SmallVectorImpl<MCFixup> &Fixups, |
| const MCSubtargetInfo &STI) const; |
| }; |
| |
| } // namespace llvm |
| |
| #endif // LLVM_LIB_TARGET_CSKY_MCTARGETDESC_CSKYMCCODEEMITTER_H |