37#define DEBUG_TYPE "mccodeemitter"
39#define GET_INSTRMAP_INFO
40#include "MipsGenInstrInfo.inc"
41#undef GET_INSTRMAP_INFO
115void MipsMCCodeEmitter::LowerCompactBranch(
MCInst& Inst)
const {
121 unsigned Reg0 = Ctx.getRegisterInfo()->getEncodingValue(RegOp0);
122 unsigned Reg1 = Ctx.getRegisterInfo()->getEncodingValue(RegOp1);
126 assert(Reg0 != Reg1 &&
"Instruction has bad operands ($rs == $rt)!");
132 }
else if (Inst.
getOpcode() == Mips::BNVC_MMR6 ||
144 return STI.
hasFeature(Mips::FeatureMicroMips);
166 switch (
MI.getOpcode()) {
180 case Mips::BOVC_MMR6:
182 case Mips::BNVC_MMR6:
183 LowerCompactBranch(TmpInst);
186 size_t N = Fixups.size();
192 const unsigned Opcode = TmpInst.
getOpcode();
193 if ((Opcode != Mips::NOP) && (Opcode != Mips::SLL) &&
194 (Opcode != Mips::SLL_MM) && (Opcode != Mips::SLL_MMR6) && !
Binary)
198 if (isMicroMips(STI)) {
199 if (isMips32r6(STI)) {
200 NewOpcode = Mips::MipsR62MicroMipsR6(Opcode, Mips::Arch_micromipsr6);
202 NewOpcode = Mips::Std2MicroMipsR6(Opcode, Mips::Arch_micromipsr6);
205 NewOpcode = Mips::Std2MicroMips(Opcode, Mips::Arch_micromips);
209 NewOpcode = Mips::Dsp2MicroMips(Opcode, Mips::Arch_mmdsp);
211 if (NewOpcode != -1) {
212 if (Fixups.size() >
N)
219 if (((
MI.getOpcode() == Mips::MOVEP_MM) ||
220 (
MI.getOpcode() == Mips::MOVEP_MMR6))) {
237 }
else if (IsLittleEndian && isMicroMips(STI)) {
258 "getBranchTargetOpValue expects only expressions or immediates");
279 "getBranchTargetOpValue expects only expressions or immediates");
301 "getBranchTargetOpValueMMR6 expects only expressions or immediates");
323 "getBranchTargetOpValueLsl2MMR6 expects only expressions or immediates");
344 "getBranchTargetOpValueMM expects only expressions or immediates");
364 "getBranchTargetOpValuePC10 expects only expressions or immediates");
384 "getBranchTargetOpValueMM expects only expressions or immediates");
404 "getBranchTarget21OpValue expects only expressions or immediates");
425 "getBranchTarget21OpValueMM expects only expressions or immediates");
446 "getBranchTarget26OpValue expects only expressions or immediates");
467 "getBranchTarget26OpValueMM expects only expressions or immediates");
487 "getJumpOffset16OpValue expects only expressions or an immediate");
508 "getJumpTargetOpValue expects only expressions or an immediate");
524 "getJumpTargetOpValueMM expects only expressions or an immediate");
544 "getUImm5Lsl2Encoding expects only expressions or an immediate");
596 switch (MipsExpr->getSpecifier()) {
709 Ctx.reportError(Expr->
getLoc(),
"expected an immediate");
721 unsigned RegNo = Ctx.getRegisterInfo()->getEncodingValue(Reg);
723 }
else if (MO.
isImm()) {
724 return static_cast<unsigned>(MO.
getImm());
739 assert(MO.
isExpr() &&
"getImmOpValue expects only expressions or immediates");
742 if (Expr->evaluateAsAbsolute(Res))
752template <
unsigned Shift>
760template <
unsigned FromEnd,
unsigned Shift>
775 assert(
MI.getOperand(OpNo-1).isImm());
776 assert(
MI.getOperand(OpNo).isImm());
780 return Position +
Size - 1;
783template <
unsigned Bits,
int Offset>
788 assert(
MI.getOperand(OpNo).isImm());
807 "getSimm19Lsl2Encoding expects only expressions or an immediate");
829 "getSimm18Lsl2Encoding expects only expressions or an immediate");
842 assert(
MI.getOperand(OpNo).isImm());
851 assert(
MI.getOperand(OpNo).isImm());
855 case 128:
return 0x0;
868 case 255:
return 0xd;
869 case 32768:
return 0xe;
870 case 65535:
return 0xf;
884 for (
unsigned I = OpNo, E =
MI.getNumOperands() - 2;
I < E; ++
I) {
886 unsigned RegNo = Ctx.getRegisterInfo()->getEncodingValue(Reg);
899 return (
MI.getNumOperands() - 4);
908 if (
MI.getOperand(0).getReg() == Mips::R5 &&
909 MI.getOperand(1).getReg() == Mips::R6)
911 else if (
MI.getOperand(0).getReg() == Mips::R5 &&
912 MI.getOperand(1).getReg() == Mips::R7)
914 else if (
MI.getOperand(0).getReg() == Mips::R6 &&
915 MI.getOperand(1).getReg() == Mips::R7)
917 else if (
MI.getOperand(0).getReg() == Mips::R4 &&
918 MI.getOperand(1).getReg() == Mips::R21)
920 else if (
MI.getOperand(0).getReg() == Mips::R4 &&
921 MI.getOperand(1).getReg() == Mips::R22)
923 else if (
MI.getOperand(0).getReg() == Mips::R4 &&
924 MI.getOperand(1).getReg() == Mips::R5)
926 else if (
MI.getOperand(0).getReg() == Mips::R4 &&
927 MI.getOperand(1).getReg() == Mips::R6)
929 else if (
MI.getOperand(0).getReg() == Mips::R4 &&
930 MI.getOperand(1).getReg() == Mips::R7)
940 assert(((OpNo == 2) || (OpNo == 3)) &&
941 "Unexpected OpNo for movep operand encoding!");
944 assert(
Op.isReg() &&
"Operand of movep is not a register!");
945 switch (
Op.getReg().id()) {
972 assert(MO.
isImm() &&
"getSimm23Lsl2Encoding expects only an immediate");
974 unsigned Res =
static_cast<unsigned>(MO.
getImm());
979#include "MipsGenMCCodeEmitter.inc"
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static void LowerLargeShift(MCInst &Inst)
This file defines the SmallVector class.
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
MCCodeEmitter - Generic instruction encoding interface.
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
Base class for the full range of assembler expressions which are needed for parsing.
@ Specifier
Expression with a relocation specifier.
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, bool PCRel=false)
Consider bit fields if we need more flags.
Instances of this class represent a single low-level machine instruction.
unsigned getNumOperands() const
unsigned getOpcode() const
void setOpcode(unsigned Op)
const MCOperand & getOperand(unsigned i) const
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
Instances of this class represent operands of the MCInst class.
void setReg(MCRegister Reg)
Set the register number.
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
uint64_t getDFPImm() const
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
unsigned getBranchTargetOpValueLsl2MMR6(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValueLsl2MMR6 - Return binary encoding of the branch target operand.
unsigned getSimm23Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget21OpValue - Return binary encoding of the branch target operand.
uint64_t getBinaryCodeForInstr(const MCInst &MI, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getMachineOpValue - Return binary encoding of operand.
unsigned getUImmWithOffsetEncoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
Subtract Offset then encode as a N-bit unsigned integer.
unsigned getOperandFromEndValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSizeInsEncoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getScaledImmOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getMovePRegPairOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTargetOpValueMMR6(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValueMMR6 - Return binary encoding of the branch target operand.
unsigned getBranchTargetOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValue - Return binary encoding of the branch target operand.
unsigned getRegisterListOpValue16(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget26OpValue - Return binary encoding of the branch target operand.
unsigned getBranchTarget26OpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget26OpValueMM - Return binary encoding of the branch target operand.
unsigned getImmOpValue(const MCInst &MI, const MCOperand &MO, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTargetOpValue1SImm16(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValue1SImm16 - Return binary encoding of the branch target operand.
unsigned getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSImm3Lsa2Value(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getJumpOffset16OpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getJumpOffset16OpValue - Return binary encoding of the jump target operand.
unsigned getBranchTargetOpValueMMPC10(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValueMMPC10 - Return binary encoding of the microMIPS 10-bit branch target operand.
unsigned getJumpTargetOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getJumpTargetOpValue - Return binary encoding of the jump target operand.
unsigned getUImm4AndValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getRegisterListOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getExprOpValue(const MCExpr *Expr, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTargetOpValue - Return binary encoding of the microMIPS branch target operand.
unsigned getMovePRegSingleOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
void encodeInstruction(const MCInst &MI, SmallVectorImpl< char > &CB, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const override
encodeInstruction - Emit the instruction.
unsigned getUImm3Mod8Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
unsigned getBranchTarget21OpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget21OpValueMM - Return binary encoding of the branch target operand for microMIPS.
unsigned getBranchTarget7OpValueMM(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
getBranchTarget7OpValueMM - Return binary encoding of the microMIPS branch target operand.
unsigned getUImm6Lsl2Encoding(const MCInst &MI, unsigned OpNo, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const
void EmitByte(unsigned char C, raw_ostream &OS) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static unsigned getFormat(uint64_t TSFlags)
@ fixup_MICROMIPS_TLS_TPREL_LO16
@ fixup_MICROMIPS_GOT_PAGE
@ fixup_MICROMIPS_PC16_S1
@ fixup_MICROMIPS_TLS_TPREL_HI16
@ fixup_MICROMIPS_PC21_S1
@ fixup_MICROMIPS_GPOFF_LO
@ fixup_MICROMIPS_PC19_S2
@ fixup_MICROMIPS_TLS_LDM
@ fixup_MICROMIPS_GOT_OFST
@ fixup_MICROMIPS_TLS_DTPREL_HI16
@ fixup_MICROMIPS_PC10_S1
@ fixup_MICROMIPS_HIGHEST
@ fixup_MICROMIPS_GOT_DISP
@ fixup_MICROMIPS_PC18_S3
@ fixup_MICROMIPS_PC26_S1
@ fixup_MICROMIPS_GOTTPREL
@ fixup_MICROMIPS_TLS_DTPREL_LO16
@ fixup_Mips_Branch_PCRel
@ fixup_MICROMIPS_GPOFF_HI
bool isGpOff(const MCSpecifierExpr &E)
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
This is an optimization pass for GlobalISel generic memory operations.
MCCodeEmitter * createMipsMCCodeEmitterEL(const MCInstrInfo &MCII, MCContext &Ctx)
MCCodeEmitter * createMipsMCCodeEmitterEB(const MCInstrInfo &MCII, MCContext &Ctx)
uint16_t MCFixupKind
Extensible enumeration to represent the type of a fixup.
static Lanai::Fixups FixupKind(const MCExpr *Expr)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
static void addFixup(SmallVectorImpl< MCFixup > &Fixups, uint32_t Offset, const MCExpr *Value, uint16_t Kind)
To bit_cast(const From &from) noexcept
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.