10b57cec5SDimitry Andric //===-- ARMMCTargetDesc.h - ARM Target Descriptions -------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file provides ARM specific target descriptions.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric #include "llvm/Support/DataTypes.h"
170b57cec5SDimitry Andric #include "llvm/MC/MCInstrDesc.h"
180b57cec5SDimitry Andric #include <memory>
190b57cec5SDimitry Andric #include <string>
200b57cec5SDimitry Andric
210b57cec5SDimitry Andric namespace llvm {
220b57cec5SDimitry Andric class formatted_raw_ostream;
230b57cec5SDimitry Andric class MCAsmBackend;
240b57cec5SDimitry Andric class MCCodeEmitter;
250b57cec5SDimitry Andric class MCContext;
260b57cec5SDimitry Andric class MCInstrInfo;
270b57cec5SDimitry Andric class MCInstPrinter;
280b57cec5SDimitry Andric class MCObjectTargetWriter;
290b57cec5SDimitry Andric class MCObjectWriter;
300b57cec5SDimitry Andric class MCRegisterInfo;
310b57cec5SDimitry Andric class MCSubtargetInfo;
320b57cec5SDimitry Andric class MCStreamer;
330b57cec5SDimitry Andric class MCTargetOptions;
340b57cec5SDimitry Andric class MCRelocationInfo;
350b57cec5SDimitry Andric class MCTargetStreamer;
360b57cec5SDimitry Andric class StringRef;
370b57cec5SDimitry Andric class Target;
380b57cec5SDimitry Andric class Triple;
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric namespace ARM_MC {
410b57cec5SDimitry Andric std::string ParseARMTriple(const Triple &TT, StringRef CPU);
42e8d8bef9SDimitry Andric void initLLVMToCVRegMapping(MCRegisterInfo *MRI);
43e8d8bef9SDimitry Andric
44e8d8bef9SDimitry Andric bool isPredicated(const MCInst &MI, const MCInstrInfo *MCII);
45e8d8bef9SDimitry Andric bool isCPSRDefined(const MCInst &MI, const MCInstrInfo *MCII);
46e8d8bef9SDimitry Andric
47e8d8bef9SDimitry Andric template<class Inst>
isLDMBaseRegInList(const Inst & MI)48e8d8bef9SDimitry Andric bool isLDMBaseRegInList(const Inst &MI) {
49e8d8bef9SDimitry Andric auto BaseReg = MI.getOperand(0).getReg();
50e8d8bef9SDimitry Andric for (unsigned I = 1, E = MI.getNumOperands(); I < E; ++I) {
51e8d8bef9SDimitry Andric const auto &Op = MI.getOperand(I);
52e8d8bef9SDimitry Andric if (Op.isReg() && Op.getReg() == BaseReg)
53e8d8bef9SDimitry Andric return true;
54e8d8bef9SDimitry Andric }
55e8d8bef9SDimitry Andric return false;
56e8d8bef9SDimitry Andric }
570b57cec5SDimitry Andric
58fe6060f1SDimitry Andric uint64_t evaluateBranchTarget(const MCInstrDesc &InstDesc, uint64_t Addr,
59fe6060f1SDimitry Andric int64_t Imm);
60fe6060f1SDimitry Andric
610b57cec5SDimitry Andric /// Create a ARM MCSubtargetInfo instance. This is exposed so Asm parser, etc.
620b57cec5SDimitry Andric /// do not need to go through TargetRegistry.
630b57cec5SDimitry Andric MCSubtargetInfo *createARMMCSubtargetInfo(const Triple &TT, StringRef CPU,
640b57cec5SDimitry Andric StringRef FS);
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric MCTargetStreamer *createARMNullTargetStreamer(MCStreamer &S);
680b57cec5SDimitry Andric MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,
690b57cec5SDimitry Andric formatted_raw_ostream &OS,
70*0fca6ea1SDimitry Andric MCInstPrinter *InstPrint);
710b57cec5SDimitry Andric MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S,
720b57cec5SDimitry Andric const MCSubtargetInfo &STI);
7381ad6265SDimitry Andric MCTargetStreamer *createARMObjectTargetELFStreamer(MCStreamer &S);
7481ad6265SDimitry Andric MCTargetStreamer *createARMObjectTargetWinCOFFStreamer(MCStreamer &S);
750b57cec5SDimitry Andric
760b57cec5SDimitry Andric MCCodeEmitter *createARMLEMCCodeEmitter(const MCInstrInfo &MCII,
770b57cec5SDimitry Andric MCContext &Ctx);
780b57cec5SDimitry Andric
790b57cec5SDimitry Andric MCCodeEmitter *createARMBEMCCodeEmitter(const MCInstrInfo &MCII,
800b57cec5SDimitry Andric MCContext &Ctx);
810b57cec5SDimitry Andric
820b57cec5SDimitry Andric MCAsmBackend *createARMLEAsmBackend(const Target &T, const MCSubtargetInfo &STI,
830b57cec5SDimitry Andric const MCRegisterInfo &MRI,
840b57cec5SDimitry Andric const MCTargetOptions &Options);
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric MCAsmBackend *createARMBEAsmBackend(const Target &T, const MCSubtargetInfo &STI,
870b57cec5SDimitry Andric const MCRegisterInfo &MRI,
880b57cec5SDimitry Andric const MCTargetOptions &Options);
890b57cec5SDimitry Andric
900b57cec5SDimitry Andric // Construct a PE/COFF machine code streamer which will generate a PE/COFF
910b57cec5SDimitry Andric // object file.
920b57cec5SDimitry Andric MCStreamer *createARMWinCOFFStreamer(MCContext &Context,
930b57cec5SDimitry Andric std::unique_ptr<MCAsmBackend> &&MAB,
940b57cec5SDimitry Andric std::unique_ptr<MCObjectWriter> &&OW,
95*0fca6ea1SDimitry Andric std::unique_ptr<MCCodeEmitter> &&Emitter);
960b57cec5SDimitry Andric
970b57cec5SDimitry Andric /// Construct an ELF Mach-O object writer.
980b57cec5SDimitry Andric std::unique_ptr<MCObjectTargetWriter> createARMELFObjectWriter(uint8_t OSABI);
990b57cec5SDimitry Andric
1000b57cec5SDimitry Andric /// Construct an ARM Mach-O object writer.
1010b57cec5SDimitry Andric std::unique_ptr<MCObjectTargetWriter>
1020b57cec5SDimitry Andric createARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
1030b57cec5SDimitry Andric uint32_t CPUSubtype);
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric /// Construct an ARM PE/COFF object writer.
1060b57cec5SDimitry Andric std::unique_ptr<MCObjectTargetWriter>
107fe6060f1SDimitry Andric createARMWinCOFFObjectWriter();
1080b57cec5SDimitry Andric
1090b57cec5SDimitry Andric /// Construct ARM Mach-O relocation info.
1100b57cec5SDimitry Andric MCRelocationInfo *createARMMachORelocationInfo(MCContext &Ctx);
1110b57cec5SDimitry Andric
1120b57cec5SDimitry Andric namespace ARM {
1130b57cec5SDimitry Andric enum OperandType {
1140b57cec5SDimitry Andric OPERAND_VPRED_R = MCOI::OPERAND_FIRST_TARGET,
1150b57cec5SDimitry Andric OPERAND_VPRED_N,
1160b57cec5SDimitry Andric };
isVpred(OperandType op)1170b57cec5SDimitry Andric inline bool isVpred(OperandType op) {
1180b57cec5SDimitry Andric return op == OPERAND_VPRED_R || op == OPERAND_VPRED_N;
1190b57cec5SDimitry Andric }
isVpred(uint8_t op)1200b57cec5SDimitry Andric inline bool isVpred(uint8_t op) {
1210b57cec5SDimitry Andric return isVpred(static_cast<OperandType>(op));
1220b57cec5SDimitry Andric }
1235ffd83dbSDimitry Andric
1245ffd83dbSDimitry Andric bool isCDECoproc(size_t Coproc, const MCSubtargetInfo &STI);
1255ffd83dbSDimitry Andric
1260b57cec5SDimitry Andric } // end namespace ARM
1270b57cec5SDimitry Andric
1280b57cec5SDimitry Andric } // End llvm namespace
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric // Defines symbolic names for ARM registers. This defines a mapping from
1310b57cec5SDimitry Andric // register name to register number.
1320b57cec5SDimitry Andric //
1330b57cec5SDimitry Andric #define GET_REGINFO_ENUM
1340b57cec5SDimitry Andric #include "ARMGenRegisterInfo.inc"
1350b57cec5SDimitry Andric
1360b57cec5SDimitry Andric // Defines symbolic names for the ARM instructions.
1370b57cec5SDimitry Andric //
1380b57cec5SDimitry Andric #define GET_INSTRINFO_ENUM
139753f127fSDimitry Andric #define GET_INSTRINFO_MC_HELPER_DECLS
1400b57cec5SDimitry Andric #include "ARMGenInstrInfo.inc"
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric #define GET_SUBTARGETINFO_ENUM
1430b57cec5SDimitry Andric #include "ARMGenSubtargetInfo.inc"
1440b57cec5SDimitry Andric
1450b57cec5SDimitry Andric #endif
146