diff options
Diffstat (limited to 'lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp')
-rw-r--r-- | lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp | 415 |
1 files changed, 252 insertions, 163 deletions
diff --git a/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp b/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp index 4b030ebfce8c..401c7d42c4ce 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp @@ -78,19 +78,25 @@ static void LowerLargeShift(MCInst& Inst) { case Mips::DROTR: Inst.setOpcode(Mips::DROTR32); return; + case Mips::DSLL_MM64R6: + Inst.setOpcode(Mips::DSLL32_MM64R6); + return; + case Mips::DSRL_MM64R6: + Inst.setOpcode(Mips::DSRL32_MM64R6); + return; + case Mips::DSRA_MM64R6: + Inst.setOpcode(Mips::DSRA32_MM64R6); + return; + case Mips::DROTR_MM64R6: + Inst.setOpcode(Mips::DROTR32_MM64R6); + return; } } -// Pick a DEXT or DINS instruction variant based on the pos and size operands -static void LowerDextDins(MCInst& InstIn) { - int Opcode = InstIn.getOpcode(); - - if (Opcode == Mips::DEXT) - assert(InstIn.getNumOperands() == 4 && - "Invalid no. of machine operands for DEXT!"); - else // Only DEXT and DINS are possible - assert(InstIn.getNumOperands() == 5 && - "Invalid no. of machine operands for DINS!"); +// Pick a DINS instruction variant based on the pos and size operands +static void LowerDins(MCInst& InstIn) { + assert(InstIn.getNumOperands() == 5 && + "Invalid no. of machine operands for DINS!"); assert(InstIn.getOperand(2).isImm()); int64_t pos = InstIn.getOperand(2).getImm(); @@ -98,20 +104,50 @@ static void LowerDextDins(MCInst& InstIn) { int64_t size = InstIn.getOperand(3).getImm(); if (size <= 32) { - if (pos < 32) // DEXT/DINS, do nothing + if (pos < 32) // DINS, do nothing return; - // DEXTU/DINSU + // DINSU InstIn.getOperand(2).setImm(pos - 32); - InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTU : Mips::DINSU); + InstIn.setOpcode(Mips::DINSU); return; } - // DEXTM/DINSM - assert(pos < 32 && "DEXT/DINS cannot have both size and pos > 32"); + // DINSM + assert(pos < 32 && "DINS cannot have both size and pos > 32"); InstIn.getOperand(3).setImm(size - 32); - InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTM : Mips::DINSM); + InstIn.setOpcode(Mips::DINSM); return; } +// Fix a bad compact branch encoding for beqc/bnec. +void MipsMCCodeEmitter::LowerCompactBranch(MCInst& Inst) const { + + // Encoding may be illegal !(rs < rt), but this situation is + // easily fixed. + unsigned RegOp0 = Inst.getOperand(0).getReg(); + unsigned RegOp1 = Inst.getOperand(1).getReg(); + + unsigned Reg0 = Ctx.getRegisterInfo()->getEncodingValue(RegOp0); + unsigned Reg1 = Ctx.getRegisterInfo()->getEncodingValue(RegOp1); + + if (Inst.getOpcode() == Mips::BNEC || Inst.getOpcode() == Mips::BEQC) { + assert(Reg0 != Reg1 && "Instruction has bad operands ($rs == $rt)!"); + if (Reg0 < Reg1) + return; + } else if (Inst.getOpcode() == Mips::BNVC || Inst.getOpcode() == Mips::BOVC) { + if (Reg0 >= Reg1) + return; + } else if (Inst.getOpcode() == Mips::BNVC_MMR6 || + Inst.getOpcode() == Mips::BOVC_MMR6) { + if (Reg1 >= Reg0) + return; + } else + llvm_unreachable("Cannot rewrite unknown branch!"); + + Inst.getOperand(0).setReg(RegOp1); + Inst.getOperand(1).setReg(RegOp0); + +} + bool MipsMCCodeEmitter::isMicroMips(const MCSubtargetInfo &STI) const { return STI.getFeatureBits()[Mips::FeatureMicroMips]; } @@ -161,12 +197,24 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS, case Mips::DSRL: case Mips::DSRA: case Mips::DROTR: + case Mips::DSLL_MM64R6: + case Mips::DSRL_MM64R6: + case Mips::DSRA_MM64R6: + case Mips::DROTR_MM64R6: LowerLargeShift(TmpInst); break; // Double extract instruction is chosen by pos and size operands - case Mips::DEXT: case Mips::DINS: - LowerDextDins(TmpInst); + LowerDins(TmpInst); + break; + // Compact branches, enforce encoding restrictions. + case Mips::BEQC: + case Mips::BNEC: + case Mips::BOVC: + case Mips::BOVC_MMR6: + case Mips::BNVC: + case Mips::BNVC_MMR6: + LowerCompactBranch(TmpInst); } unsigned long N = Fixups.size(); @@ -237,6 +285,53 @@ getBranchTargetOpValue(const MCInst &MI, unsigned OpNo, return 0; } +/// getBranchTargetOpValue1SImm16 - Return binary encoding of the branch +/// target operand. If the machine operand requires relocation, +/// record the relocation and return zero. +unsigned MipsMCCodeEmitter:: +getBranchTargetOpValue1SImm16(const MCInst &MI, unsigned OpNo, + SmallVectorImpl<MCFixup> &Fixups, + const MCSubtargetInfo &STI) const { + + const MCOperand &MO = MI.getOperand(OpNo); + + // If the destination is an immediate, divide by 2. + if (MO.isImm()) return MO.getImm() >> 1; + + assert(MO.isExpr() && + "getBranchTargetOpValue expects only expressions or immediates"); + + const MCExpr *FixupExpression = MCBinaryExpr::createAdd( + MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx); + Fixups.push_back(MCFixup::create(0, FixupExpression, + MCFixupKind(Mips::fixup_Mips_PC16))); + return 0; +} + +/// getBranchTargetOpValueMMR6 - Return binary encoding of the branch +/// target operand. If the machine operand requires relocation, +/// record the relocation and return zero. +unsigned MipsMCCodeEmitter:: +getBranchTargetOpValueMMR6(const MCInst &MI, unsigned OpNo, + SmallVectorImpl<MCFixup> &Fixups, + const MCSubtargetInfo &STI) const { + + const MCOperand &MO = MI.getOperand(OpNo); + + // If the destination is an immediate, divide by 2. + if (MO.isImm()) + return MO.getImm() >> 1; + + assert(MO.isExpr() && + "getBranchTargetOpValueMMR6 expects only expressions or immediates"); + + const MCExpr *FixupExpression = MCBinaryExpr::createAdd( + MO.getExpr(), MCConstantExpr::create(-2, Ctx), Ctx); + Fixups.push_back(MCFixup::create(0, FixupExpression, + MCFixupKind(Mips::fixup_Mips_PC16))); + return 0; +} + /// getBranchTarget7OpValueMM - Return binary encoding of the microMIPS branch /// target operand. If the machine operand requires relocation, /// record the relocation and return zero. @@ -327,6 +422,29 @@ getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo, return 0; } +/// getBranchTarget21OpValueMM - Return binary encoding of the branch +/// target operand for microMIPS. If the machine operand requires +/// relocation, record the relocation and return zero. +unsigned MipsMCCodeEmitter:: +getBranchTarget21OpValueMM(const MCInst &MI, unsigned OpNo, + SmallVectorImpl<MCFixup> &Fixups, + const MCSubtargetInfo &STI) const { + + const MCOperand &MO = MI.getOperand(OpNo); + + // If the destination is an immediate, divide by 2. + if (MO.isImm()) return MO.getImm() >> 1; + + assert(MO.isExpr() && + "getBranchTarget21OpValueMM expects only expressions or immediates"); + + const MCExpr *FixupExpression = MCBinaryExpr::createAdd( + MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx); + Fixups.push_back(MCFixup::create(0, FixupExpression, + MCFixupKind(Mips::fixup_MICROMIPS_PC21_S1))); + return 0; +} + /// getBranchTarget26OpValue - Return binary encoding of the branch /// target operand. If the machine operand requires relocation, /// record the relocation and return zero. @@ -363,7 +481,13 @@ unsigned MipsMCCodeEmitter::getBranchTarget26OpValueMM( if (MO.isImm()) return MO.getImm() >> 1; - // TODO: Push 26 PC fixup. + assert(MO.isExpr() && + "getBranchTarget26OpValueMM expects only expressions or immediates"); + + const MCExpr *FixupExpression = MCBinaryExpr::createAdd( + MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx); + Fixups.push_back(MCFixup::create(0, FixupExpression, + MCFixupKind(Mips::fixup_MICROMIPS_PC26_S1))); return 0; } @@ -510,126 +634,117 @@ getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups, Mips::Fixups FixupKind = Mips::Fixups(0); switch (MipsExpr->getKind()) { - default: llvm_unreachable("Unsupported fixup kind for target expression!"); - case MipsMCExpr::VK_Mips_HIGHEST: - FixupKind = Mips::fixup_Mips_HIGHEST; + case MipsMCExpr::MEK_NEG: + case MipsMCExpr::MEK_None: + case MipsMCExpr::MEK_Special: + llvm_unreachable("Unhandled fixup kind!"); break; - case MipsMCExpr::VK_Mips_HIGHER: - FixupKind = Mips::fixup_Mips_HIGHER; + case MipsMCExpr::MEK_CALL_HI16: + FixupKind = Mips::fixup_Mips_CALL_HI16; break; - case MipsMCExpr::VK_Mips_HI: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 - : Mips::fixup_Mips_HI16; + case MipsMCExpr::MEK_CALL_LO16: + FixupKind = Mips::fixup_Mips_CALL_LO16; break; - case MipsMCExpr::VK_Mips_LO: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 - : Mips::fixup_Mips_LO16; + case MipsMCExpr::MEK_DTPREL_HI: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_HI16 + : Mips::fixup_Mips_DTPREL_HI; break; - } - Fixups.push_back(MCFixup::create(0, MipsExpr, MCFixupKind(FixupKind))); - return 0; - } - - if (Kind == MCExpr::SymbolRef) { - Mips::Fixups FixupKind = Mips::Fixups(0); - - switch(cast<MCSymbolRefExpr>(Expr)->getKind()) { - default: llvm_unreachable("Unknown fixup kind!"); + case MipsMCExpr::MEK_DTPREL_LO: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_LO16 + : Mips::fixup_Mips_DTPREL_LO; break; - case MCSymbolRefExpr::VK_None: - FixupKind = Mips::fixup_Mips_32; // FIXME: This is ok for O32/N32 but not N64. + case MipsMCExpr::MEK_GOTTPREL: + FixupKind = Mips::fixup_Mips_GOTTPREL; + break; + case MipsMCExpr::MEK_GOT: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 + : Mips::fixup_Mips_GOT; + break; + case MipsMCExpr::MEK_GOT_CALL: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_CALL16 + : Mips::fixup_Mips_CALL16; + break; + case MipsMCExpr::MEK_GOT_DISP: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_DISP + : Mips::fixup_Mips_GOT_DISP; break; - case MCSymbolRefExpr::VK_Mips_GPOFF_HI : - FixupKind = Mips::fixup_Mips_GPOFF_HI; + case MipsMCExpr::MEK_GOT_HI16: + FixupKind = Mips::fixup_Mips_GOT_HI16; break; - case MCSymbolRefExpr::VK_Mips_GPOFF_LO : - FixupKind = Mips::fixup_Mips_GPOFF_LO; + case MipsMCExpr::MEK_GOT_LO16: + FixupKind = Mips::fixup_Mips_GOT_LO16; break; - case MCSymbolRefExpr::VK_Mips_GOT_PAGE : + case MipsMCExpr::MEK_GOT_PAGE: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_PAGE - : Mips::fixup_Mips_GOT_PAGE; + : Mips::fixup_Mips_GOT_PAGE; break; - case MCSymbolRefExpr::VK_Mips_GOT_OFST : + case MipsMCExpr::MEK_GOT_OFST: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_OFST - : Mips::fixup_Mips_GOT_OFST; + : Mips::fixup_Mips_GOT_OFST; break; - case MCSymbolRefExpr::VK_Mips_GOT_DISP : - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_DISP - : Mips::fixup_Mips_GOT_DISP; - break; - case MCSymbolRefExpr::VK_Mips_GPREL: + case MipsMCExpr::MEK_GPREL: FixupKind = Mips::fixup_Mips_GPREL16; break; - case MCSymbolRefExpr::VK_Mips_GOT_CALL: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_CALL16 - : Mips::fixup_Mips_CALL16; + case MipsMCExpr::MEK_LO: { + // Check for %lo(%neg(%gp_rel(X))) + if (MipsExpr->isGpOff()) { + FixupKind = Mips::fixup_Mips_GPOFF_LO; + break; + } + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 + : Mips::fixup_Mips_LO16; break; - case MCSymbolRefExpr::VK_Mips_GOT16: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 - : Mips::fixup_Mips_GOT_Global; + } + case MipsMCExpr::MEK_HIGHEST: + FixupKind = Mips::fixup_Mips_HIGHEST; break; - case MCSymbolRefExpr::VK_Mips_GOT: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 - : Mips::fixup_Mips_GOT_Local; + case MipsMCExpr::MEK_HIGHER: + FixupKind = Mips::fixup_Mips_HIGHER; break; - case MCSymbolRefExpr::VK_Mips_ABS_HI: + case MipsMCExpr::MEK_HI: + // Check for %hi(%neg(%gp_rel(X))) + if (MipsExpr->isGpOff()) { + FixupKind = Mips::fixup_Mips_GPOFF_HI; + break; + } FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 - : Mips::fixup_Mips_HI16; + : Mips::fixup_Mips_HI16; break; - case MCSymbolRefExpr::VK_Mips_ABS_LO: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 - : Mips::fixup_Mips_LO16; + case MipsMCExpr::MEK_PCREL_HI16: + FixupKind = Mips::fixup_MIPS_PCHI16; + break; + case MipsMCExpr::MEK_PCREL_LO16: + FixupKind = Mips::fixup_MIPS_PCLO16; break; - case MCSymbolRefExpr::VK_Mips_TLSGD: + case MipsMCExpr::MEK_TLSGD: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_GD - : Mips::fixup_Mips_TLSGD; + : Mips::fixup_Mips_TLSGD; break; - case MCSymbolRefExpr::VK_Mips_TLSLDM: + case MipsMCExpr::MEK_TLSLDM: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_LDM - : Mips::fixup_Mips_TLSLDM; - break; - case MCSymbolRefExpr::VK_Mips_DTPREL_HI: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_HI16 - : Mips::fixup_Mips_DTPREL_HI; - break; - case MCSymbolRefExpr::VK_Mips_DTPREL_LO: - FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_LO16 - : Mips::fixup_Mips_DTPREL_LO; - break; - case MCSymbolRefExpr::VK_Mips_GOTTPREL: - FixupKind = Mips::fixup_Mips_GOTTPREL; + : Mips::fixup_Mips_TLSLDM; break; - case MCSymbolRefExpr::VK_Mips_TPREL_HI: + case MipsMCExpr::MEK_TPREL_HI: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_HI16 - : Mips::fixup_Mips_TPREL_HI; + : Mips::fixup_Mips_TPREL_HI; break; - case MCSymbolRefExpr::VK_Mips_TPREL_LO: + case MipsMCExpr::MEK_TPREL_LO: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_LO16 - : Mips::fixup_Mips_TPREL_LO; + : Mips::fixup_Mips_TPREL_LO; break; - case MCSymbolRefExpr::VK_Mips_HIGHER: - FixupKind = Mips::fixup_Mips_HIGHER; - break; - case MCSymbolRefExpr::VK_Mips_HIGHEST: - FixupKind = Mips::fixup_Mips_HIGHEST; - break; - case MCSymbolRefExpr::VK_Mips_GOT_HI16: - FixupKind = Mips::fixup_Mips_GOT_HI16; - break; - case MCSymbolRefExpr::VK_Mips_GOT_LO16: - FixupKind = Mips::fixup_Mips_GOT_LO16; - break; - case MCSymbolRefExpr::VK_Mips_CALL_HI16: - FixupKind = Mips::fixup_Mips_CALL_HI16; - break; - case MCSymbolRefExpr::VK_Mips_CALL_LO16: - FixupKind = Mips::fixup_Mips_CALL_LO16; - break; - case MCSymbolRefExpr::VK_Mips_PCREL_HI16: - FixupKind = Mips::fixup_MIPS_PCHI16; + } + Fixups.push_back(MCFixup::create(0, MipsExpr, MCFixupKind(FixupKind))); + return 0; + } + + if (Kind == MCExpr::SymbolRef) { + Mips::Fixups FixupKind = Mips::Fixups(0); + + switch(cast<MCSymbolRefExpr>(Expr)->getKind()) { + default: llvm_unreachable("Unknown fixup kind!"); break; - case MCSymbolRefExpr::VK_Mips_PCREL_LO16: - FixupKind = Mips::fixup_MIPS_PCLO16; + case MCSymbolRefExpr::VK_None: + FixupKind = Mips::fixup_Mips_32; // FIXME: This is ok for O32/N32 but not N64. break; } // switch @@ -660,61 +775,20 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO, return getExprOpValue(MO.getExpr(),Fixups, STI); } -/// getMSAMemEncoding - Return binary encoding of memory operand for LD/ST -/// instructions. -unsigned -MipsMCCodeEmitter::getMSAMemEncoding(const MCInst &MI, unsigned OpNo, - SmallVectorImpl<MCFixup> &Fixups, - const MCSubtargetInfo &STI) const { - // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. - assert(MI.getOperand(OpNo).isReg()); - unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo),Fixups, STI) << 16; - unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); - - // The immediate field of an LD/ST instruction is scaled which means it must - // be divided (when encoding) by the size (in bytes) of the instructions' - // data format. - // .b - 1 byte - // .h - 2 bytes - // .w - 4 bytes - // .d - 8 bytes - switch(MI.getOpcode()) - { - default: - assert (0 && "Unexpected instruction"); - break; - case Mips::LD_B: - case Mips::ST_B: - // We don't need to scale the offset in this case - break; - case Mips::LD_H: - case Mips::ST_H: - OffBits >>= 1; - break; - case Mips::LD_W: - case Mips::ST_W: - OffBits >>= 2; - break; - case Mips::LD_D: - case Mips::ST_D: - OffBits >>= 3; - break; - } - - return (OffBits & 0xFFFF) | RegBits; -} - -/// getMemEncoding - Return binary encoding of memory related operand. +/// Return binary encoding of memory related operand. /// If the offset operand requires relocation, record the relocation. -unsigned -MipsMCCodeEmitter::getMemEncoding(const MCInst &MI, unsigned OpNo, - SmallVectorImpl<MCFixup> &Fixups, - const MCSubtargetInfo &STI) const { +template <unsigned ShiftAmount> +unsigned MipsMCCodeEmitter::getMemEncoding(const MCInst &MI, unsigned OpNo, + SmallVectorImpl<MCFixup> &Fixups, + const MCSubtargetInfo &STI) const { // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. assert(MI.getOperand(OpNo).isReg()); unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo),Fixups, STI) << 16; unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); + // Apply the scale factor if there is one. + OffBits >>= ShiftAmount; + return (OffBits & 0xFFFF) | RegBits; } @@ -804,6 +878,19 @@ getMemEncodingMMImm9(const MCInst &MI, unsigned OpNo, } unsigned MipsMCCodeEmitter:: +getMemEncodingMMImm11(const MCInst &MI, unsigned OpNo, + SmallVectorImpl<MCFixup> &Fixups, + const MCSubtargetInfo &STI) const { + // Base register is encoded in bits 20-16, offset is encoded in bits 10-0. + assert(MI.getOperand(OpNo).isReg()); + unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, + STI) << 16; + unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); + + return (OffBits & 0x07FF) | RegBits; +} + +unsigned MipsMCCodeEmitter:: getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const { @@ -906,8 +993,9 @@ MipsMCCodeEmitter::getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo, "getSimm19Lsl2Encoding expects only expressions or an immediate"); const MCExpr *Expr = MO.getExpr(); - Fixups.push_back(MCFixup::create(0, Expr, - MCFixupKind(Mips::fixup_MIPS_PC19_S2))); + Mips::Fixups FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_PC19_S2 + : Mips::fixup_MIPS_PC19_S2; + Fixups.push_back(MCFixup::create(0, Expr, MCFixupKind(FixupKind))); return 0; } @@ -927,8 +1015,9 @@ MipsMCCodeEmitter::getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo, "getSimm18Lsl2Encoding expects only expressions or an immediate"); const MCExpr *Expr = MO.getExpr(); - Fixups.push_back(MCFixup::create(0, Expr, - MCFixupKind(Mips::fixup_MIPS_PC18_S3))); + Mips::Fixups FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_PC18_S3 + : Mips::fixup_MIPS_PC18_S3; + Fixups.push_back(MCFixup::create(0, Expr, MCFixupKind(FixupKind))); return 0; } |