30 if (BuiltinID == AArch64::BI__builtin_arm_irg) {
41 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
50 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_integer)
58 if (BuiltinID == AArch64::BI__builtin_arm_addg) {
68 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
79 if (BuiltinID == AArch64::BI__builtin_arm_gmi) {
90 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
95 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_integer)
97 TheCall->
setType(Context.IntTy);
101 if (BuiltinID == AArch64::BI__builtin_arm_ldg ||
102 BuiltinID == AArch64::BI__builtin_arm_stg) {
112 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
117 if (BuiltinID == AArch64::BI__builtin_arm_ldg)
118 TheCall->
setType(FirstArgType);
122 if (BuiltinID == AArch64::BI__builtin_arm_subp) {
135 auto isNull = [&](
Expr *
E) ->
bool {
136 return E->isNullPointerConstant(Context,
142 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_null_or_pointer)
146 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_null_or_pointer)
154 if (!Context.typesAreCompatible(
155 Context.getCanonicalType(pointeeA).getUnqualifiedType(),
156 Context.getCanonicalType(pointeeB).getUnqualifiedType())) {
158 diag::err_typecheck_sub_ptr_compatible)
179 TheCall->
setType(Context.LongLongTy);
182 assert(
false &&
"Unhandled ARM MTE intrinsic");
189 int ArgNum,
unsigned ExpectedFieldNum,
191 bool IsARMBuiltin = BuiltinID == ARM::BI__builtin_arm_rsr64 ||
192 BuiltinID == ARM::BI__builtin_arm_wsr64 ||
193 BuiltinID == ARM::BI__builtin_arm_rsr ||
194 BuiltinID == ARM::BI__builtin_arm_rsrp ||
195 BuiltinID == ARM::BI__builtin_arm_wsr ||
196 BuiltinID == ARM::BI__builtin_arm_wsrp;
197 bool IsAArch64Builtin = BuiltinID == AArch64::BI__builtin_arm_rsr64 ||
198 BuiltinID == AArch64::BI__builtin_arm_wsr64 ||
199 BuiltinID == AArch64::BI__builtin_arm_rsr128 ||
200 BuiltinID == AArch64::BI__builtin_arm_wsr128 ||
201 BuiltinID == AArch64::BI__builtin_arm_rsr ||
202 BuiltinID == AArch64::BI__builtin_arm_rsrp ||
203 BuiltinID == AArch64::BI__builtin_arm_wsr ||
204 BuiltinID == AArch64::BI__builtin_arm_wsrp;
205 assert((IsARMBuiltin || IsAArch64Builtin) &&
"Unexpected ARM builtin.");
220 Reg.split(Fields,
":");
222 if (Fields.size() != ExpectedFieldNum && !(AllowName && Fields.size() == 1))
230 if (Fields.size() > 1) {
231 bool FiveFields = Fields.size() == 5;
233 bool ValidString =
true;
235 ValidString &= Fields[0].starts_with_insensitive(
"cp") ||
236 Fields[0].starts_with_insensitive(
"p");
238 Fields[0] = Fields[0].drop_front(
239 Fields[0].starts_with_insensitive(
"cp") ? 2 : 1);
241 ValidString &= Fields[2].starts_with_insensitive(
"c");
243 Fields[2] = Fields[2].drop_front(1);
246 ValidString &= Fields[3].starts_with_insensitive(
"c");
248 Fields[3] = Fields[3].drop_front(1);
254 Ranges.append({IsAArch64Builtin ? 1 : 15, 7, 15, 15, 7});
256 Ranges.append({15, 7, 15});
258 for (
unsigned i = 0; i < Fields.size(); ++i) {
260 ValidString &= !Fields[i].getAsInteger(10, IntField);
261 ValidString &= (IntField >= 0 && IntField <= Ranges[i]);
267 }
else if (IsAArch64Builtin && Fields.size() == 1) {
275 if (BuiltinID == AArch64::BI__builtin_arm_rsr128 ||
276 BuiltinID == AArch64::BI__builtin_arm_wsr128)
281 auto MaxLimit = llvm::StringSwitch<std::optional<unsigned>>(Reg)
282 .CaseLower(
"spsel", 15)
283 .CaseLower(
"daifclr", 15)
284 .CaseLower(
"daifset", 15)
285 .CaseLower(
"pan", 15)
286 .CaseLower(
"uao", 15)
287 .CaseLower(
"dit", 15)
288 .CaseLower(
"ssbs", 15)
289 .CaseLower(
"tco", 15)
290 .CaseLower(
"allint", 1)
292 .Default(std::nullopt);
322 bool IsPolyUnsigned,
bool IsInt64Long) {
356 llvm_unreachable(
"Invalid NeonTypeFlag!");
374 unsigned ArgIdx,
unsigned EltBitWidth,
375 unsigned ContainerBitWidth) {
378 auto CheckImmediateInSet = [&](std::initializer_list<int64_t>
Set,
379 int ErrDiag) ->
bool {
390 if (std::find(
Set.begin(),
Set.end(), Imm.getSExtValue()) ==
Set.end())
396 case ImmCheckType::ImmCheck0_31:
400 case ImmCheckType::ImmCheck0_13:
404 case ImmCheckType::ImmCheck0_63:
408 case ImmCheckType::ImmCheck1_16:
412 case ImmCheckType::ImmCheck0_7:
416 case ImmCheckType::ImmCheck1_1:
420 case ImmCheckType::ImmCheck1_3:
424 case ImmCheckType::ImmCheck1_7:
428 case ImmCheckType::ImmCheckExtract:
430 (2048 / EltBitWidth) - 1))
433 case ImmCheckType::ImmCheckCvt:
434 case ImmCheckType::ImmCheckShiftRight:
438 case ImmCheckType::ImmCheckShiftRightNarrow:
442 case ImmCheckType::ImmCheckShiftLeft:
446 case ImmCheckType::ImmCheckLaneIndex:
448 (ContainerBitWidth / EltBitWidth) - 1))
451 case ImmCheckType::ImmCheckLaneIndexCompRotate:
453 TheCall, ArgIdx, 0, (ContainerBitWidth / (2 * EltBitWidth)) - 1))
456 case ImmCheckType::ImmCheckLaneIndexDot:
458 TheCall, ArgIdx, 0, (ContainerBitWidth / (4 * EltBitWidth)) - 1))
461 case ImmCheckType::ImmCheckComplexRot90_270:
462 if (CheckImmediateInSet({90, 270}, diag::err_rotation_argument_to_cadd))
465 case ImmCheckType::ImmCheckComplexRotAll90:
466 if (CheckImmediateInSet({0, 90, 180, 270},
467 diag::err_rotation_argument_to_cmla))
470 case ImmCheckType::ImmCheck0_1:
474 case ImmCheckType::ImmCheck0_2:
478 case ImmCheckType::ImmCheck0_3:
482 case ImmCheckType::ImmCheck0_0:
486 case ImmCheckType::ImmCheck0_15:
490 case ImmCheckType::ImmCheck0_255:
494 case ImmCheckType::ImmCheck1_32:
498 case ImmCheckType::ImmCheck1_64:
502 case ImmCheckType::ImmCheck2_4_Mul2:
515 bool HasError =
false;
517 for (
const auto &I : ImmChecks) {
518 auto [ArgIdx, CheckTy, ElementBitWidth, VecBitWidth] = I;
520 if (OverloadType >= 0)
532 bool HasError =
false;
534 for (
const auto &I : ImmChecks) {
535 auto [ArgIdx, CheckTy, ElementBitWidth] = I;
544 if (FD->
hasAttr<ArmLocallyStreamingAttr>())
548 if (FPT->getAArch64SMEAttributes() &
551 if (FPT->getAArch64SMEAttributes() &
562 unsigned BuiltinID) {
570 llvm::StringMap<bool> CallerFeatureMapWithoutSVE;
572 CallerFeatureMapWithoutSVE[
"sve"] =
false;
578 llvm::StringMap<bool> CallerFeatureMapWithoutSME;
580 CallerFeatureMapWithoutSME[
"sme"] =
false;
592 StringRef BuiltinTargetGuards(
595 BuiltinTargetGuards, CallerFeatureMapWithoutSME);
597 BuiltinTargetGuards, CallerFeatureMapWithoutSVE);
599 if ((SatisfiesSVE && SatisfiesSME) ||
602 else if (SatisfiesSVE)
604 else if (SatisfiesSME)
613 S.
Diag(TheCall->
getBeginLoc(), diag::err_attribute_arm_sm_incompat_builtin)
617 S.
Diag(TheCall->
getBeginLoc(), diag::err_attribute_arm_sm_incompat_builtin)
629 (FD->
hasAttr<ArmNewAttr>() && FD->
getAttr<ArmNewAttr>()->isNewZA());
636 (FD->
hasAttr<ArmNewAttr>() && FD->
getAttr<ArmNewAttr>()->isNewZT0());
643#define GET_SME_BUILTIN_GET_STATE
644#include "clang/Basic/arm_sme_builtins_za_state.inc"
645#undef GET_SME_BUILTIN_GET_STATE
655#define GET_SME_STREAMING_ATTRS
656#include "clang/Basic/arm_sme_streaming_attrs.inc"
657#undef GET_SME_STREAMING_ATTRS
666 diag::warn_attribute_arm_za_builtin_no_za_state)
671 diag::warn_attribute_arm_zt0_builtin_no_zt0_state)
681#define GET_SME_IMMEDIATE_CHECK
682#include "clang/Basic/arm_sme_sema_rangechecks.inc"
683#undef GET_SME_IMMEDIATE_CHECK
695#define GET_SVE_STREAMING_ATTRS
696#include "clang/Basic/arm_sve_streaming_attrs.inc"
697#undef GET_SVE_STREAMING_ATTRS
709#define GET_SVE_IMMEDIATE_CHECK
710#include "clang/Basic/arm_sve_sema_rangechecks.inc"
711#undef GET_SVE_IMMEDIATE_CHECK
725#define GET_NEON_BUILTINS
726#define TARGET_BUILTIN(id, ...) case NEON::BI##id:
727#define BUILTIN(id, ...) case NEON::BI##id:
728#include "clang/Basic/arm_neon.inc"