Index: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -5859,14 +5859,21 @@ MipsAsmParser::parseInvNum(OperandVector &Operands) { MCAsmParser &Parser = getParser(); const MCExpr *IdVal; - // If the first token is '$' we may have register operand. - if (Parser.getTok().is(AsmToken::Dollar)) - return MatchOperand_NoMatch; + // If the first token is '$' we may have register operand. We have to reject + // cases where it is not a register. Complicating the matter is that + // register names are not reserved across all ABIs. + // Peek past the dollar to see if it's a register name for this ABI. SMLoc S = Parser.getTok().getLoc(); + if (Parser.getTok().is(AsmToken::Dollar)) { + return matchCPURegisterName(Parser.getLexer().peekTok().getString()) == -1 + ? MatchOperand_ParseFail + : MatchOperand_NoMatch; + } if (getParser().parseExpression(IdVal)) return MatchOperand_ParseFail; const MCConstantExpr *MCE = dyn_cast(IdVal); - assert(MCE && "Unexpected MCExpr type."); + if (!MCE) + return MatchOperand_NoMatch; int64_t Val = MCE->getValue(); SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); Operands.push_back(MipsOperand::CreateImm( Index: llvm/trunk/test/MC/Mips/macro-aliases-invalid-wrong-error.s =================================================================== --- llvm/trunk/test/MC/Mips/macro-aliases-invalid-wrong-error.s +++ llvm/trunk/test/MC/Mips/macro-aliases-invalid-wrong-error.s @@ -0,0 +1,38 @@ +# RUN: not llvm-mc -arch=mips %s 2>%t1 +# RUN: FileCheck --check-prefix=O32 %s < %t1 + +# RUN: not llvm-mc -arch=mips64 %s 2>%t1 +# RUN: FileCheck --check-prefix=N64 %s < %t1 + +# Check that subu only rejects any non-constant values. + +.globl end + subu $4, $4, %lo($start) # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $4, $start # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $a4, $a4 # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $4, %hi(end) # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $4, end + 4 # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $4, end # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $4, sp # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + + subu $4, %lo($start) # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $start # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, $a4 # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, %hi(end) # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, end + 4 # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, end # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + subu $4, sp # O32: [[@LINE]]:{{[0-9]+}}: error: unexpected token in argument list + # N64: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list + +$start: Index: llvm/trunk/test/MC/Mips/macro-aliases.s =================================================================== --- llvm/trunk/test/MC/Mips/macro-aliases.s +++ llvm/trunk/test/MC/Mips/macro-aliases.s @@ -0,0 +1,35 @@ +# RUN: llvm-mc -arch=mips -mcpu=mips32r2 %s -show-inst | FileCheck %s + +# Test that subu accepts constant operands and inverts them when +# rendering the operand. + + subu $4, $4, 4 # CHECK: ADDiu + # CHECK; Imm:-4 + subu $gp, $gp, 4 # CHECK: ADDiu + # CHECK; Imm:-4 + subu $sp, $sp, 4 # CHECK: ADDiu + # CHECK; Imm:-4 + subu $4, $4, -4 # CHECK: ADDiu + # CHECK; Imm:4 + subu $gp, $gp, -4 # CHECK: ADDiu + # CHECK; Imm:4 + subu $sp, $sp, -4 # CHECK: ADDiu + # CHECK; Imm:4 + subu $sp, $sp, -(4 + 4) # CHECK: ADDiu + # CHECK: Imm:8 + + subu $4, 8 # CHECK: ADDiu + # CHECK; Imm:-8 + subu $gp, 8 # CHECK: ADDiu + # CHECK; Imm:-8 + subu $sp, 8 # CHECK: ADDiu + # CHECK; Imm:-8 + subu $4, -8 # CHECK: ADDiu + # CHECK; Imm:8 + subu $gp, -8 # CHECK: ADDiu + # CHECK; Imm:8 + subu $sp, -8 # CHECK: ADDiu + # CHECK; Imm:8 + subu $sp, -(4 + 4) # CHECK: ADDiu + # CHECK: Imm:8 +