================ @@ -404,142 +370,174 @@ enum ArmSMEState : unsigned { ArmZT0Mask = 0b11 << 2 }; -bool SemaARM::ParseSVEImmChecks( - CallExpr *TheCall, SmallVector<std::tuple<int, int, int>, 3> &ImmChecks) { - // Perform all the immediate checks for this builtin call. +bool SemaARM::CheckImmediateArg(CallExpr *TheCall, unsigned CheckTy, + unsigned ArgIdx, unsigned EltBitWidth, + unsigned VecBitWidth) { + // Function that checks whether the operand (ArgIdx) is an immediate + // that is one of a given set of values. + auto CheckImmediateInSet = [&](std::initializer_list<int64_t> Set, + int ErrDiag) -> bool { + // We can't check the value of a dependent argument. + Expr *Arg = TheCall->getArg(ArgIdx); + if (Arg->isTypeDependent() || Arg->isValueDependent()) + return false; + + // Check constant-ness first. + llvm::APSInt Imm; + if (SemaRef.BuiltinConstantArg(TheCall, ArgIdx, Imm)) + return true; + + if (std::find(Set.begin(), Set.end(), Imm.getSExtValue()) == Set.end()) + return Diag(TheCall->getBeginLoc(), ErrDiag) << Arg->getSourceRange(); + return false; + }; + + switch ((ImmCheckType)CheckTy) { + case ImmCheckType::ImmCheck0_31: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 31)) + return true; + break; + case ImmCheckType::ImmCheck0_13: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 13)) + return true; + break; + case ImmCheckType::ImmCheck0_63: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 63)) + return true; + break; + case ImmCheckType::ImmCheck1_16: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, 16)) + return true; + break; + case ImmCheckType::ImmCheck0_7: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 7)) + return true; + break; + case ImmCheckType::ImmCheck1_1: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, 1)) + return true; + break; + case ImmCheckType::ImmCheck1_3: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, 3)) + return true; + break; + case ImmCheckType::ImmCheck1_7: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, 7)) + return true; + break; + case ImmCheckType::ImmCheckExtract: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, + (2048 / EltBitWidth) - 1)) + return true; + break; + case ImmCheckType::ImmCheckCvt: + case ImmCheckType::ImmCheckShiftRight: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, EltBitWidth)) + return true; + break; + case ImmCheckType::ImmCheckShiftRightNarrow: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, EltBitWidth / 2)) + return true; + break; + case ImmCheckType::ImmCheckShiftLeft: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, EltBitWidth - 1)) + return true; + break; + case ImmCheckType::ImmCheckLaneIndex: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, + (VecBitWidth / EltBitWidth) - 1)) + return true; + break; + case ImmCheckType::ImmCheckLaneIndexCompRotate: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, + (VecBitWidth / (2 * EltBitWidth)) - 1)) + return true; + break; + case ImmCheckType::ImmCheckLaneIndexDot: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, + (VecBitWidth / (4 * EltBitWidth)) - 1)) + return true; + break; + case ImmCheckType::ImmCheckComplexRot90_270: + if (CheckImmediateInSet({90, 270}, diag::err_rotation_argument_to_cadd)) + return true; + break; + case ImmCheckType::ImmCheckComplexRotAll90: + if (CheckImmediateInSet({0, 90, 180, 270}, + diag::err_rotation_argument_to_cmla)) + return true; + break; + case ImmCheckType::ImmCheck0_1: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 1)) + return true; + break; + case ImmCheckType::ImmCheck0_2: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 2)) + return true; + break; + case ImmCheckType::ImmCheck0_3: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 3)) + return true; + break; + case ImmCheckType::ImmCheck0_0: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 0)) + return true; + break; + case ImmCheckType::ImmCheck0_15: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 15)) + return true; + break; + case ImmCheckType::ImmCheck0_255: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 0, 255)) + return true; + break; + case ImmCheckType::ImmCheck1_32: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, 32)) + return true; + break; + case ImmCheckType::ImmCheck1_64: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 1, 64)) + return true; + break; + case ImmCheckType::ImmCheck2_4_Mul2: + if (SemaRef.BuiltinConstantArgRange(TheCall, ArgIdx, 2, 4) || + SemaRef.BuiltinConstantArgMultiple(TheCall, ArgIdx, 2)) + return true; + break; + default: ---------------- SpencerAbson wrote:
I removed this here https://github.com/llvm/llvm-project/commit/383057e5a0b53a79926dbdbae4cfcd39bfb44645. https://github.com/llvm/llvm-project/pull/100278 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits