virtual unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
- unsigned OperandNum) = 0;
+ unsigned OperandNum,
+ unsigned &NumMCOperands) = 0;
};
} // End llvm namespace
unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
- unsigned OperandNum) {
- return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum);
+ unsigned OperandNum, unsigned &NumMCOperands) {
+ return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum, NumMCOperands);
}
};
} // end anonymous namespace
unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
- unsigned OperandNum) {
- return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum);
+ unsigned OperandNum, unsigned &NumMCOperands) {
+ return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum,
+ NumMCOperands);
}
public:
unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
- unsigned OperandNum);
+ unsigned OperandNum, unsigned &NumMCOperands);
public:
MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
unsigned MipsAsmParser::
GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
- unsigned OperandNum) {
+ unsigned OperandNum, unsigned &NumMCOperands) {
assert (0 && "GetMCInstOperandNum() not supported by the Mips target.");
// The Mips backend doesn't currently include the matcher implementation, so
// the GetMCInstOperandNumImpl() is undefined. This is a temporary
// work around.
+ NumMCOperands = 0;
return 0;
}
unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
- unsigned OperandNum) {
- return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum);
+ unsigned OperandNum, unsigned &NumMCOperands) {
+ return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum,
+ NumMCOperands);
}
/// isSrcOp - Returns true if operand is either (%rsi) or %ds:%(rsi)
OpOS << "unsigned " << Target.getName() << ClassName << "::\n"
<< "GetMCInstOperandNumImpl(unsigned Kind, MCInst &Inst,\n"
<< " const SmallVectorImpl<MCParsedAsmOperand*> "
- << "&Operands,\n unsigned OperandNum) {\n"
+ << "&Operands,\n unsigned OperandNum, unsigned "
+ << "&NumMCOperands) {\n"
<< " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n"
+ << " NumMCOperands = 0;\n"
<< " unsigned MCOperandNum = 0;\n"
<< " uint8_t *Converter = ConversionTable[Kind];\n"
<< " for (uint8_t *p = Converter; *p; p+= 2) {\n"
<< " switch (*p) {\n"
<< " default: llvm_unreachable(\"invalid conversion entry!\");\n"
<< " case CVT_Reg:\n"
+ << " if (*(p + 1) == OperandNum) {\n"
+ << " NumMCOperands = 1;\n"
+ << " break;\n"
+ << " }\n"
<< " ++MCOperandNum;\n"
<< " break;\n"
<< " case CVT_Tied:\n"
// Add a handler for the operand number lookup.
OpOS << " case " << Name << ":\n"
+ << " if (*(p + 1) == OperandNum) {\n"
+ << " NumMCOperands = " << OpInfo.MINumOperands << ";\n"
+ << " break;\n"
+ << " }\n"
<< " MCOperandNum += " << OpInfo.MINumOperands << ";\n"
<< " break;\n";
break;
<< " break;\n";
OpOS << " case " << Name << ":\n"
+ << " if (*(p + 1) == OperandNum) {\n"
+ << " NumMCOperands = 1;\n"
+ << " break;\n"
+ << " }\n"
<< " ++MCOperandNum;\n"
<< " break;\n";
break;
<< " break;\n";
OpOS << " case " << Name << ":\n"
+ << " if (*(p + 1) == OperandNum) {\n"
+ << " NumMCOperands = 1;\n"
+ << " break;\n"
+ << " }\n"
<< " ++MCOperandNum;\n"
<< " break;\n";
}
OS << " unsigned GetMCInstOperandNumImpl(unsigned Kind, MCInst &Inst,\n "
<< " const "
<< "SmallVectorImpl<MCParsedAsmOperand*> &Operands,\n "
- << " unsigned OperandNum);\n";
+ << " unsigned OperandNum, unsigned &NumMCOperands);\n";
OS << " bool MnemonicIsValid(StringRef Mnemonic);\n";
OS << " unsigned MatchInstructionImpl(\n"
<< " const SmallVectorImpl<MCParsedAsmOperand*> &Operands,\n"