@@ -6390,6 +6390,55 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
6390
6390
" llvm.amdgcn.s.prefetch.data only supports global or constant memory" );
6391
6391
break ;
6392
6392
}
6393
+ case Intrinsic::amdgcn_mfma_scale_f32_16x16x128_f8f6f4:
6394
+ case Intrinsic::amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {
6395
+ Value *Src0 = Call.getArgOperand (0 );
6396
+ Value *Src1 = Call.getArgOperand (1 );
6397
+
6398
+ uint64_t CBSZ = cast<ConstantInt>(Call.getArgOperand (3 ))->getZExtValue ();
6399
+ uint64_t BLGP = cast<ConstantInt>(Call.getArgOperand (4 ))->getZExtValue ();
6400
+ Check (CBSZ <= 4 , " invalid value for cbsz format" , Call,
6401
+ Call.getArgOperand (3 ));
6402
+ Check (BLGP <= 4 , " invalid value for blgp format" , Call,
6403
+ Call.getArgOperand (4 ));
6404
+
6405
+ // AMDGPU::MFMAScaleFormats values
6406
+ auto getFormatNumRegs = [](unsigned FormatVal) {
6407
+ switch (FormatVal) {
6408
+ case 0 :
6409
+ case 1 :
6410
+ return 8u ;
6411
+ case 2 :
6412
+ case 3 :
6413
+ return 6u ;
6414
+ case 4 :
6415
+ return 4u ;
6416
+ default :
6417
+ llvm_unreachable (" invalid format value" );
6418
+ }
6419
+ };
6420
+
6421
+ auto isValidSrcASrcBVector = [](FixedVectorType *Ty) {
6422
+ if (!Ty || !Ty->getElementType ()->isIntegerTy (32 ))
6423
+ return false ;
6424
+ unsigned NumElts = Ty->getNumElements ();
6425
+ return NumElts == 4 || NumElts == 6 || NumElts == 8 ;
6426
+ };
6427
+
6428
+ auto *Src0Ty = dyn_cast<FixedVectorType>(Src0->getType ());
6429
+ auto *Src1Ty = dyn_cast<FixedVectorType>(Src1->getType ());
6430
+ Check (isValidSrcASrcBVector (Src0Ty),
6431
+ " operand 0 must be 4, 6 or 8 element i32 vector" , &Call, Src0);
6432
+ Check (isValidSrcASrcBVector (Src1Ty),
6433
+ " operand 1 must be 4, 6 or 8 element i32 vector" , &Call, Src1);
6434
+
6435
+ // Permit excess registers for the format.
6436
+ Check (Src0Ty->getNumElements () >= getFormatNumRegs (CBSZ),
6437
+ " invalid vector type for format" , &Call, Src0, Call.getArgOperand (3 ));
6438
+ Check (Src1Ty->getNumElements () >= getFormatNumRegs (BLGP),
6439
+ " invalid vector type for format" , &Call, Src1, Call.getArgOperand (5 ));
6440
+ break ;
6441
+ }
6393
6442
case Intrinsic::nvvm_setmaxnreg_inc_sync_aligned_u32:
6394
6443
case Intrinsic::nvvm_setmaxnreg_dec_sync_aligned_u32: {
6395
6444
Value *V = Call.getArgOperand (0 );
0 commit comments