Index: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -10168,6 +10168,7 @@ // to only report the widest one. std::multimap OperandMissesSeen; SmallSet FeatureMissesSeen; + bool ReportedTooFewOperands = false; // Process the near-misses in reverse order, so that we see more general ones // first, and so can avoid emitting more specific ones. @@ -10288,9 +10289,12 @@ break; } case NearMissInfo::NearMissTooFewOperands: { - SMLoc EndLoc = ((ARMOperand &)*Operands.back()).getEndLoc(); - NearMissesOut.emplace_back( - NearMissMessage{ EndLoc, StringRef("too few operands for instruction") }); + if (!ReportedTooFewOperands) { + SMLoc EndLoc = ((ARMOperand &)*Operands.back()).getEndLoc(); + NearMissesOut.emplace_back(NearMissMessage{ + EndLoc, StringRef("too few operands for instruction")}); + ReportedTooFewOperands = true; + } break; } case NearMissInfo::NoNearMiss: Index: llvm/trunk/test/MC/ARM/diagnostics.s =================================================================== --- llvm/trunk/test/MC/ARM/diagnostics.s +++ llvm/trunk/test/MC/ARM/diagnostics.s @@ -736,3 +736,9 @@ @ CHECK-ERRORS: error: immediate operand must an even number in the range [0, 30] @ CHECK-ERRORS: error: immediate operand must a number in the range [0, 255] @ CHECK-ERRORS: error: immediate operand must an even number in the range [0, 30] + + @ Generic error for too few operands + adds + adds r0 +@ CHECK-ERRORS: error: too few operands for instruction +@ CHECK-ERRORS: error: too few operands for instruction Index: llvm/trunk/test/MC/ARM/ldrd-strd-gnu-bad-inst.s =================================================================== --- llvm/trunk/test/MC/ARM/ldrd-strd-gnu-bad-inst.s +++ llvm/trunk/test/MC/ARM/ldrd-strd-gnu-bad-inst.s @@ -2,26 +2,26 @@ .text .thumb -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd r0 -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd r0 @ CHECK: error: invalid instruction strd s0, [r0] @ CHECK: error: invalid instruction ldrd s0, [r0] .arm -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction strd r0 -@ CHECK: error: invalid instruction +@ CHECK: error: too few operands for instruction ldrd r0 @ CHECK: error: invalid instruction strd s0, [r0] Index: llvm/trunk/test/MC/ARM/thumb-diagnostics.s =================================================================== --- llvm/trunk/test/MC/ARM/thumb-diagnostics.s +++ llvm/trunk/test/MC/ARM/thumb-diagnostics.s @@ -351,3 +351,12 @@ @ CHECK-ERRORS: error: invalid instruction @ CHECK-ERRORS: error: invalid instruction @ CHECK-ERRORS: error: invalid instruction + +@------------------------------------------------------------------------------ +@ Generic error for too few operands +@------------------------------------------------------------------------------ + + adds + adds r0 +@ CHECK-ERRORS: error: too few operands for instruction +@ CHECK-ERRORS: error: too few operands for instruction Index: llvm/trunk/test/MC/ARM/thumb2-diagnostics.s =================================================================== --- llvm/trunk/test/MC/ARM/thumb2-diagnostics.s +++ llvm/trunk/test/MC/ARM/thumb2-diagnostics.s @@ -145,3 +145,9 @@ @ CHECK-ERRORS-V7: error: instruction requires: arm-mode @ CHECK-ERRORS-V8: error: invalid instruction @ CHECK-ERRORS-V8: error: invalid instruction + + @ Generic error for too few operands + adds + adds r0 +@ CHECK-ERRORS: error: too few operands for instruction +@ CHECK-ERRORS: error: too few operands for instruction Index: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp =================================================================== --- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp +++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp @@ -3313,7 +3313,7 @@ OS << " DEBUG_WITH_TYPE(\"asm-matcher\", dbgs() << \"recording too-few-operands near miss\\n\");\n"; OS << " OperandNearMiss =\n"; OS << " NearMissInfo::getTooFewOperands(Formal, it->Opcode);\n"; - OS << " } else {\n"; + OS << " } else if (OperandNearMiss.getKind() != NearMissInfo::NearMissTooFewOperands) {\n"; OS << " // If more than one operand is invalid, give up on this match entry.\n"; OS << " DEBUG_WITH_TYPE(\n"; OS << " \"asm-matcher\",\n";