@@ -3117,6 +3117,18 @@ bool Sema::ParseSVEImmChecks(
3117
3117
if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 255))
3118
3118
HasError = true;
3119
3119
break;
3120
+ case SVETypeFlags::ImmCheck1_1:
3121
+ if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 1))
3122
+ HasError = true;
3123
+ break;
3124
+ case SVETypeFlags::ImmCheck1_3:
3125
+ if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 3))
3126
+ HasError = true;
3127
+ break;
3128
+ case SVETypeFlags::ImmCheck1_7:
3129
+ if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 7))
3130
+ HasError = true;
3131
+ break;
3120
3132
case SVETypeFlags::ImmCheck2_4_Mul2:
3121
3133
if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 2, 4) ||
3122
3134
SemaBuiltinConstantArgMultiple(TheCall, ArgNum, 2))
@@ -3233,141 +3245,7 @@ bool Sema::CheckSVEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
3233
3245
}
3234
3246
3235
3247
// Perform all the immediate checks for this builtin call.
3236
- bool HasError = false;
3237
- for (auto &I : ImmChecks) {
3238
- int ArgNum, CheckTy, ElementSizeInBits;
3239
- std::tie(ArgNum, CheckTy, ElementSizeInBits) = I;
3240
-
3241
- typedef bool(*OptionSetCheckFnTy)(int64_t Value);
3242
-
3243
- // Function that checks whether the operand (ArgNum) is an immediate
3244
- // that is one of the predefined values.
3245
- auto CheckImmediateInSet = [&](OptionSetCheckFnTy CheckImm,
3246
- int ErrDiag) -> bool {
3247
- // We can't check the value of a dependent argument.
3248
- Expr *Arg = TheCall->getArg(ArgNum);
3249
- if (Arg->isTypeDependent() || Arg->isValueDependent())
3250
- return false;
3251
-
3252
- // Check constant-ness first.
3253
- llvm::APSInt Imm;
3254
- if (SemaBuiltinConstantArg(TheCall, ArgNum, Imm))
3255
- return true;
3256
-
3257
- if (!CheckImm(Imm.getSExtValue()))
3258
- return Diag(TheCall->getBeginLoc(), ErrDiag) << Arg->getSourceRange();
3259
- return false;
3260
- };
3261
-
3262
- switch ((SVETypeFlags::ImmCheckType)CheckTy) {
3263
- case SVETypeFlags::ImmCheck0_31:
3264
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 31))
3265
- HasError = true;
3266
- break;
3267
- case SVETypeFlags::ImmCheck0_13:
3268
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 13))
3269
- HasError = true;
3270
- break;
3271
- case SVETypeFlags::ImmCheck1_16:
3272
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 16))
3273
- HasError = true;
3274
- break;
3275
- case SVETypeFlags::ImmCheck0_7:
3276
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 7))
3277
- HasError = true;
3278
- break;
3279
- case SVETypeFlags::ImmCheck1_1:
3280
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 1))
3281
- HasError = true;
3282
- break;
3283
- case SVETypeFlags::ImmCheck1_3:
3284
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 3))
3285
- HasError = true;
3286
- break;
3287
- case SVETypeFlags::ImmCheck1_7:
3288
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 7))
3289
- HasError = true;
3290
- break;
3291
- case SVETypeFlags::ImmCheckExtract:
3292
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
3293
- (2048 / ElementSizeInBits) - 1))
3294
- HasError = true;
3295
- break;
3296
- case SVETypeFlags::ImmCheckShiftRight:
3297
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, ElementSizeInBits))
3298
- HasError = true;
3299
- break;
3300
- case SVETypeFlags::ImmCheckShiftRightNarrow:
3301
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1,
3302
- ElementSizeInBits / 2))
3303
- HasError = true;
3304
- break;
3305
- case SVETypeFlags::ImmCheckShiftLeft:
3306
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
3307
- ElementSizeInBits - 1))
3308
- HasError = true;
3309
- break;
3310
- case SVETypeFlags::ImmCheckLaneIndex:
3311
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
3312
- (128 / (1 * ElementSizeInBits)) - 1))
3313
- HasError = true;
3314
- break;
3315
- case SVETypeFlags::ImmCheckLaneIndexCompRotate:
3316
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
3317
- (128 / (2 * ElementSizeInBits)) - 1))
3318
- HasError = true;
3319
- break;
3320
- case SVETypeFlags::ImmCheckLaneIndexDot:
3321
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
3322
- (128 / (4 * ElementSizeInBits)) - 1))
3323
- HasError = true;
3324
- break;
3325
- case SVETypeFlags::ImmCheckComplexRot90_270:
3326
- if (CheckImmediateInSet([](int64_t V) { return V == 90 || V == 270; },
3327
- diag::err_rotation_argument_to_cadd))
3328
- HasError = true;
3329
- break;
3330
- case SVETypeFlags::ImmCheckComplexRotAll90:
3331
- if (CheckImmediateInSet(
3332
- [](int64_t V) {
3333
- return V == 0 || V == 90 || V == 180 || V == 270;
3334
- },
3335
- diag::err_rotation_argument_to_cmla))
3336
- HasError = true;
3337
- break;
3338
- case SVETypeFlags::ImmCheck0_1:
3339
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 1))
3340
- HasError = true;
3341
- break;
3342
- case SVETypeFlags::ImmCheck0_2:
3343
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 2))
3344
- HasError = true;
3345
- break;
3346
- case SVETypeFlags::ImmCheck0_3:
3347
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 3))
3348
- HasError = true;
3349
- break;
3350
- case SVETypeFlags::ImmCheck0_0:
3351
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 0))
3352
- HasError = true;
3353
- break;
3354
- case SVETypeFlags::ImmCheck0_15:
3355
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 15))
3356
- HasError = true;
3357
- break;
3358
- case SVETypeFlags::ImmCheck0_255:
3359
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 255))
3360
- HasError = true;
3361
- break;
3362
- case SVETypeFlags::ImmCheck2_4_Mul2:
3363
- if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 2, 4) ||
3364
- SemaBuiltinConstantArgMultiple(TheCall, ArgNum, 2))
3365
- HasError = true;
3366
- break;
3367
- }
3368
- }
3369
-
3370
- return HasError;
3248
+ return ParseSVEImmChecks(TheCall, ImmChecks);
3371
3249
}
3372
3250
3373
3251
bool Sema::CheckNeonBuiltinFunctionCall(const TargetInfo &TI,
0 commit comments