Index: llvm/trunk/lib/AsmParser/LLParser.h =================================================================== --- llvm/trunk/lib/AsmParser/LLParser.h +++ llvm/trunk/lib/AsmParser/LLParser.h @@ -573,9 +573,9 @@ bool ParseCallBr(Instruction *&Inst, PerFunctionState &PFS); bool ParseUnaryOp(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc, - unsigned OperandType); + bool IsFP); bool ParseArithmetic(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc, - unsigned OperandType); + bool IsFP); bool ParseLogical(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc); bool ParseCompare(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc); bool ParseCast(Instruction *&Inst, PerFunctionState &PFS, unsigned Opc); Index: llvm/trunk/lib/AsmParser/LLParser.cpp =================================================================== --- llvm/trunk/lib/AsmParser/LLParser.cpp +++ llvm/trunk/lib/AsmParser/LLParser.cpp @@ -5629,7 +5629,7 @@ // Unary Operators. case lltok::kw_fneg: { FastMathFlags FMF = EatFastMathFlagsIfPresent(); - int Res = ParseUnaryOp(Inst, PFS, KeywordVal, 2); + int Res = ParseUnaryOp(Inst, PFS, KeywordVal, /*IsFP*/true); if (Res != 0) return Res; if (FMF.any()) @@ -5645,7 +5645,7 @@ bool NSW = EatIfPresent(lltok::kw_nsw); if (!NUW) NUW = EatIfPresent(lltok::kw_nuw); - if (ParseArithmetic(Inst, PFS, KeywordVal, 1)) return true; + if (ParseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/false)) return true; if (NUW) cast(Inst)->setHasNoUnsignedWrap(true); if (NSW) cast(Inst)->setHasNoSignedWrap(true); @@ -5657,7 +5657,7 @@ case lltok::kw_fdiv: case lltok::kw_frem: { FastMathFlags FMF = EatFastMathFlagsIfPresent(); - int Res = ParseArithmetic(Inst, PFS, KeywordVal, 2); + int Res = ParseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/true); if (Res != 0) return Res; if (FMF.any()) @@ -5671,13 +5671,14 @@ case lltok::kw_ashr: { bool Exact = EatIfPresent(lltok::kw_exact); - if (ParseArithmetic(Inst, PFS, KeywordVal, 1)) return true; + if (ParseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/false)) return true; if (Exact) cast(Inst)->setIsExact(true); return false; } case lltok::kw_urem: - case lltok::kw_srem: return ParseArithmetic(Inst, PFS, KeywordVal, 1); + case lltok::kw_srem: return ParseArithmetic(Inst, PFS, KeywordVal, + /*IsFP*/false); case lltok::kw_and: case lltok::kw_or: case lltok::kw_xor: return ParseLogical(Inst, PFS, KeywordVal); @@ -6214,28 +6215,16 @@ /// ParseUnaryOp /// ::= UnaryOp TypeAndValue ',' Value /// -/// If OperandType is 0, then any FP or integer operand is allowed. If it is 1, -/// then any integer operand is allowed, if it is 2, any fp operand is allowed. +/// If IsFP is false, then any integer operand is allowed, if it is true, any fp +/// operand is allowed. bool LLParser::ParseUnaryOp(Instruction *&Inst, PerFunctionState &PFS, - unsigned Opc, unsigned OperandType) { + unsigned Opc, bool IsFP) { LocTy Loc; Value *LHS; if (ParseTypeAndValue(LHS, Loc, PFS)) return true; - bool Valid; - switch (OperandType) { - default: llvm_unreachable("Unknown operand type!"); - case 0: // int or FP. - Valid = LHS->getType()->isIntOrIntVectorTy() || - LHS->getType()->isFPOrFPVectorTy(); - break; - case 1: - Valid = LHS->getType()->isIntOrIntVectorTy(); - break; - case 2: - Valid = LHS->getType()->isFPOrFPVectorTy(); - break; - } + bool Valid = IsFP ? LHS->getType()->isFPOrFPVectorTy() + : LHS->getType()->isIntOrIntVectorTy(); if (!Valid) return Error(Loc, "invalid operand type for instruction"); @@ -6369,26 +6358,18 @@ /// ParseArithmetic /// ::= ArithmeticOps TypeAndValue ',' Value /// -/// If OperandType is 0, then any FP or integer operand is allowed. If it is 1, -/// then any integer operand is allowed, if it is 2, any fp operand is allowed. +/// If IsFP is false, then any integer operand is allowed, if it is true, any fp +/// operand is allowed. bool LLParser::ParseArithmetic(Instruction *&Inst, PerFunctionState &PFS, - unsigned Opc, unsigned OperandType) { + unsigned Opc, bool IsFP) { LocTy Loc; Value *LHS, *RHS; if (ParseTypeAndValue(LHS, Loc, PFS) || ParseToken(lltok::comma, "expected ',' in arithmetic operation") || ParseValue(LHS->getType(), RHS, PFS)) return true; - bool Valid; - switch (OperandType) { - default: llvm_unreachable("Unknown operand type!"); - case 0: // int or FP. - Valid = LHS->getType()->isIntOrIntVectorTy() || - LHS->getType()->isFPOrFPVectorTy(); - break; - case 1: Valid = LHS->getType()->isIntOrIntVectorTy(); break; - case 2: Valid = LHS->getType()->isFPOrFPVectorTy(); break; - } + bool Valid = IsFP ? LHS->getType()->isFPOrFPVectorTy() + : LHS->getType()->isIntOrIntVectorTy(); if (!Valid) return Error(Loc, "invalid operand type for instruction");