// 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())
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<BinaryOperator>(Inst)->setHasNoUnsignedWrap(true);
if (NSW) cast<BinaryOperator>(Inst)->setHasNoSignedWrap(true);
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())
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<BinaryOperator>(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);
/// 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");
/// 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");