/* Capstone Disassembly Engine, http://www.capstone-engine.org */ /* By Nguyen Anh Quynh , 2013-2022, */ /* Rot127 2022-2023 */ /* Automatically translated source file from LLVM. */ /* LLVM-commit: 464bda7750a3ba9e23823fc707d7e7b6fc38438d */ /* LLVM-tag: llvmorg-16.0.2-5-g464bda7750a3 */ /* Only small edits allowed. */ /* For multiple similar edits, please create a Patch for the translator. */ /* Capstone's C++ file translator: */ /* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */ //===- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax -*- C++ -*-===// // // 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 class prints an ARM MCInst to a .s file. // //===----------------------------------------------------------------------===// #ifndef CS_ARM_INSTPRINTER_H #define CS_ARM_INSTPRINTER_H #include #include #include #include #include "../../MCInst.h" #include "../../MCInstPrinter.h" #include "../../MCRegisterInfo.h" #include "../../SStream.h" #include "../../utils.h" #define CONCAT(a, b) CONCAT_(a, b) #define CONCAT_(a, b) a##_##b bool applyTargetSpecificCLOption(const char *Opt); // Autogenerated by tblgen. void printOperandAddr(MCInst *MI, uint64_t Address, unsigned OpNum, SStream *O); void printSORegRegOperand(MCInst *MI, unsigned OpNum, SStream *O); void printSORegImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printAddrModeTBB(MCInst *MI, unsigned OpNum, SStream *O); void printAddrModeTBH(MCInst *MI, unsigned OpNum, SStream *O); void printAddrMode2Operand(MCInst *MI, unsigned OpNum, SStream *O); void printAM2PostIndexOp(MCInst *MI, unsigned OpNum, SStream *O); void printAM2PreOrOffsetIndexOp(MCInst *MI, unsigned OpNum, SStream *O); void printAddrMode2OffsetOperand(MCInst *MI, unsigned OpNum, SStream *O); #define DECLARE_printAddrMode3Operand(AlwaysPrintImm0) \ void CONCAT(printAddrMode3Operand, \ AlwaysPrintImm0)(MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printAddrMode3Operand(false) DECLARE_printAddrMode3Operand(true) void printAddrMode3OffsetOperand(MCInst *MI, unsigned OpNum, SStream *O); void printAM3PreOrOffsetIndexOp(MCInst *MI, unsigned Op, SStream *O, bool AlwaysPrintImm0); void printPostIdxImm8Operand(MCInst *MI, unsigned OpNum, SStream *O); void printPostIdxRegOperand(MCInst *MI, unsigned OpNum, SStream *O); void printPostIdxImm8s4Operand(MCInst *MI, unsigned OpNum, SStream *O); void printLdStmModeOperand(MCInst *MI, unsigned OpNum, SStream *O); #define DECLARE_printAddrMode5Operand(AlwaysPrintImm0) \ void CONCAT(printAddrMode5Operand, \ AlwaysPrintImm0)(MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printAddrMode5Operand(false) DECLARE_printAddrMode5Operand(true) #define DECLARE_printAddrMode5FP16Operand(AlwaysPrintImm0) \ void CONCAT(printAddrMode5FP16Operand, \ AlwaysPrintImm0)(MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printAddrMode5FP16Operand(false) void printAddrMode6Operand(MCInst *MI, unsigned OpNum, SStream *O); void printAddrMode7Operand(MCInst *MI, unsigned OpNum, SStream *O); void printAddrMode6OffsetOperand(MCInst *MI, unsigned OpNum, SStream *O); void printBitfieldInvMaskImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printMemBOption(MCInst *MI, unsigned OpNum, SStream *O); void printInstSyncBOption(MCInst *MI, unsigned OpNum, SStream *O); void printTraceSyncBOption(MCInst *MI, unsigned OpNum, SStream *O); void printShiftImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printPKHLSLShiftImm(MCInst *MI, unsigned OpNum, SStream *O); void printPKHASRShiftImm(MCInst *MI, unsigned OpNum, SStream *O); #define DECLARE_printAdrLabelOperand(scale) \ void CONCAT(printAdrLabelOperand, scale)(MCInst * MI, unsigned OpNum, \ SStream *O); DECLARE_printAdrLabelOperand(0) DECLARE_printAdrLabelOperand(2) #define DEFINE_printAdrLabelOperandAddr(scale) \ static inline void CONCAT(printAdrLabelOperandAddr, scale)( \ MCInst * MI, uint64_t Address, unsigned OpNum, SStream *O) \ { \ CONCAT(printAdrLabelOperand, scale)(MI, OpNum, O); \ } DEFINE_printAdrLabelOperandAddr(0) DEFINE_printAdrLabelOperandAddr(2) void printThumbS4ImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printThumbSRImm(MCInst *MI, unsigned OpNum, SStream *O); void printThumbITMask(MCInst *MI, unsigned OpNum, SStream *O); void printThumbAddrModeRROperand(MCInst *MI, unsigned OpNum, SStream *O); void printThumbAddrModeImm5SOperand(MCInst *MI, unsigned OpNum, SStream *O, unsigned Scale); void printThumbAddrModeImm5S1Operand(MCInst *MI, unsigned OpNum, SStream *O); void printThumbAddrModeImm5S2Operand(MCInst *MI, unsigned OpNum, SStream *O); void printThumbAddrModeImm5S4Operand(MCInst *MI, unsigned OpNum, SStream *O); void printThumbAddrModeSPOperand(MCInst *MI, unsigned OpNum, SStream *O); void printT2SOOperand(MCInst *MI, unsigned OpNum, SStream *O); #define DECLARE_printAddrModeImm12Operand(AlwaysPrintImm0) \ void CONCAT(printAddrModeImm12Operand, \ AlwaysPrintImm0)(MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printAddrModeImm12Operand(false) DECLARE_printAddrModeImm12Operand(true) #define DECLARE_printT2AddrModeImm8Operand(AlwaysPrintImm0) \ void CONCAT(printT2AddrModeImm8Operand, \ AlwaysPrintImm0)(MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printT2AddrModeImm8Operand(true) DECLARE_printT2AddrModeImm8Operand(false) #define DECLARE_printT2AddrModeImm8s4Operand(AlwaysPrintImm0) \ void CONCAT(printT2AddrModeImm8s4Operand, \ AlwaysPrintImm0)(MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printT2AddrModeImm8s4Operand(false) DECLARE_printT2AddrModeImm8s4Operand(true) void printT2AddrModeImm0_1020s4Operand( MCInst *MI, unsigned OpNum, SStream *O); void printT2AddrModeImm8OffsetOperand(MCInst *MI, unsigned OpNum, SStream *O); void printT2AddrModeImm8s4OffsetOperand(MCInst *MI, unsigned OpNum, SStream *O); void printT2AddrModeSoRegOperand(MCInst *MI, unsigned OpNum, SStream *O); void printSetendOperand(MCInst *MI, unsigned OpNum, SStream *O); void printCPSIMod(MCInst *MI, unsigned OpNum, SStream *O); void printCPSIFlag(MCInst *MI, unsigned OpNum, SStream *O); void printMSRMaskOperand(MCInst *MI, unsigned OpNum, SStream *O); void printBankedRegOperand(MCInst *MI, unsigned OpNum, SStream *O); void printMandatoryPredicateOperand(MCInst *MI, unsigned OpNum, SStream *O); void printMandatoryRestrictedPredicateOperand(MCInst *MI, unsigned OpNum, SStream *O); void printMandatoryInvertedPredicateOperand(MCInst *MI, unsigned OpNum, SStream *O); void printSBitModifierOperand(MCInst *MI, unsigned OpNum, SStream *O); void printRegisterList(MCInst *MI, unsigned OpNum, SStream *O); void printNoHashImmediate(MCInst *MI, unsigned OpNum, SStream *O); void printPImmediate(MCInst *MI, unsigned OpNum, SStream *O); void printCImmediate(MCInst *MI, unsigned OpNum, SStream *O); void printCoprocOptionImm(MCInst *MI, unsigned OpNum, SStream *O); void printFPImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printVMOVModImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printImmPlusOneOperand(MCInst *MI, unsigned OpNum, SStream *O); void printRotImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printModImmOperand(MCInst *MI, unsigned OpNum, SStream *O); void printGPRPairOperand(MCInst *MI, unsigned OpNum, SStream *O); void printPCLabel(MCInst *MI, unsigned OpNum, SStream *O); void printThumbLdrLabelOperand(MCInst *MI, unsigned OpNum, SStream *O); void printFBits16(MCInst *MI, unsigned OpNum, SStream *O); void printFBits32(MCInst *MI, unsigned OpNum, SStream *O); void printVectorIndex(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListOne(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListTwo(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListTwoSpaced(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListThree(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListFour(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListOneAllLanes(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListTwoAllLanes(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListThreeAllLanes(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListFourAllLanes(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListTwoSpacedAllLanes(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListThreeSpacedAllLanes(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListFourSpacedAllLanes(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListThreeSpaced(MCInst *MI, unsigned OpNum, SStream *O); void printVectorListFourSpaced(MCInst *MI, unsigned OpNum, SStream *O); #define DECLARE_printMVEVectorList(NumRegs) \ void CONCAT(printMVEVectorList, NumRegs)(MCInst * MI, unsigned OpNum, \ SStream *O); DECLARE_printMVEVectorList(2) DECLARE_printMVEVectorList(4) #define DECLARE_printComplexRotationOp(Angle, Remainder) \ void CONCAT(printComplexRotationOp, CONCAT(Angle, Remainder))( \ MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printComplexRotationOp(90, 0) DECLARE_printComplexRotationOp(180, 90) // MVE void printVPTPredicateOperand(MCInst *MI, unsigned OpNum, SStream *O); void printVPTMask(MCInst *MI, unsigned OpNum, SStream *O); #define DECLARE_printMveAddrModeRQOperand(shift) \ void CONCAT(printMveAddrModeRQOperand, \ shift)(MCInst * MI, unsigned OpNum, SStream *O); DECLARE_printMveAddrModeRQOperand(0) DECLARE_printMveAddrModeRQOperand(3) DECLARE_printMveAddrModeRQOperand(1) DECLARE_printMveAddrModeRQOperand(2) void printMveSaturateOp(MCInst *MI, unsigned OpNum, SStream *O); unsigned translateShiftImm(unsigned imm); #endif // CS_ARM_INSTPRINTER_H