================ @@ -403,142 +368,183 @@ enum ArmSMEState : unsigned { ArmZT0Mask = 0b11 << 2 }; +bool SemaARM::CheckImmediateArg(CallExpr *TheCall, unsigned CheckTy, + unsigned ArgIdx, unsigned EltBitWidth, + unsigned VecBitWidth) { + + typedef bool (*OptionSetCheckFnTy)(int64_t Value); + + // Function that checks whether the operand (ArgIdx) is an immediate + // that is one of the predefined values. + auto CheckImmediateInSet = [&](OptionSetCheckFnTy CheckImm, + 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 (!CheckImm(Imm.getSExtValue())) + 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: ---------------- SpencerAbson wrote:
Ok sounds good, they both do `1..sizeinbits(elt)` so I could replace them both with `ImmCheck1_EltSize`. 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