From 8ac68f9dc58ab7420449fd49533f62788681e622 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Wed, 20 Nov 2019 15:27:27 +0300 Subject: [PATCH] [mips] Put conditions when we need to expand memory operand into a separate function. NFC `expandMemInst` expects instruction with 3 or 4 operands and the last operand requires expanding. It's redundant to scan all operands in a loop. We can check the last operands. --- llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 65 +++++++++++++----------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index cd64fcf..69c978d 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -1815,6 +1815,37 @@ static bool isEvaluated(const MCExpr *Expr) { return false; } +static bool needsExpandMemInst(MCInst &Inst) { + const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); + + unsigned NumOp = MCID.getNumOperands(); + if (NumOp != 3 && NumOp != 4) + return false; + + const MCOperandInfo &OpInfo = MCID.OpInfo[NumOp - 1]; + if (OpInfo.OperandType != MCOI::OPERAND_MEMORY && + OpInfo.OperandType != MCOI::OPERAND_UNKNOWN) + return false; + + MCOperand &Op = Inst.getOperand(NumOp - 1); + if (Op.isImm()) { + // Offset can't exceed 16bit value. + return !isInt<16>(Op.getImm()); + } + + if (Op.isExpr()) { + const MCExpr *Expr = Op.getExpr(); + if (Expr->getKind() != MCExpr::SymbolRef) + return !isEvaluated(Expr); + + // Expand symbol. + const MCSymbolRefExpr *SR = static_cast(Expr); + return SR->getKind() == MCSymbolRefExpr::VK_None; + } + + return false; +} + bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) { @@ -2102,35 +2133,11 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, if ((MCID.mayLoad() || MCID.mayStore()) && !IsPCRelativeLoad) { // Check the offset of memory operand, if it is a symbol // reference or immediate we may have to expand instructions. - for (unsigned i = 0; i < MCID.getNumOperands(); i++) { - const MCOperandInfo &OpInfo = MCID.OpInfo[i]; - if ((OpInfo.OperandType == MCOI::OPERAND_MEMORY) || - (OpInfo.OperandType == MCOI::OPERAND_UNKNOWN)) { - MCOperand &Op = Inst.getOperand(i); - if (Op.isImm()) { - if (!isInt<16>(Op.getImm())) { - // Offset can't exceed 16bit value. - expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad()); - return getParser().hasPendingError(); - } - } else if (Op.isExpr()) { - const MCExpr *Expr = Op.getExpr(); - if (Expr->getKind() == MCExpr::SymbolRef) { - const MCSymbolRefExpr *SR = - static_cast(Expr); - if (SR->getKind() == MCSymbolRefExpr::VK_None) { - // Expand symbol. - expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad()); - return getParser().hasPendingError(); - } - } else if (!isEvaluated(Expr)) { - expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad()); - return getParser().hasPendingError(); - } - } - } - } // for - } // if load/store + if (needsExpandMemInst(Inst)) { + expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad()); + return getParser().hasPendingError(); + } + } if (inMicroMipsMode()) { if (MCID.mayLoad() && Opcode != Mips::LWP_MM) { -- 2.7.4