clang: lib/Sema/SemaRISCV.cpp Source File (original) (raw)

64#define DECL_SIGNATURE_TABLE

65#include "clang/Basic/riscv_vector_builtin_sema.inc"

66#undef DECL_SIGNATURE_TABLE

67};

70#define DECL_SIGNATURE_TABLE

71#include "clang/Basic/riscv_sifive_vector_builtin_sema.inc"

72#undef DECL_SIGNATURE_TABLE

73};

76#define DECL_SIGNATURE_TABLE

77#include "clang/Basic/riscv_andes_vector_builtin_sema.inc"

78#undef DECL_SIGNATURE_TABLE

79};

82#define DECL_INTRINSIC_RECORDS

83#include "clang/Basic/riscv_vector_builtin_sema.inc"

84#undef DECL_INTRINSIC_RECORDS

85};

88#define DECL_INTRINSIC_RECORDS

89#include "clang/Basic/riscv_sifive_vector_builtin_sema.inc"

90#undef DECL_INTRINSIC_RECORDS

91};

94#define DECL_INTRINSIC_RECORDS

95#include "clang/Basic/riscv_andes_vector_builtin_sema.inc"

96#undef DECL_INTRINSIC_RECORDS

97};

102 switch (K) {

103 case IntrinsicKind::RVV:

105 case IntrinsicKind::SIFIVE_VECTOR:

107 case IntrinsicKind::ANDES_VECTOR:

109 }

110 llvm_unreachable("Unhandled IntrinsicKind");

111}

115 switch (Type->getScalarType()) {

117 QT = Context.VoidTy;

118 break;

120 QT = Context.getSizeType();

121 break;

123 QT = Context.getPointerDiffType();

124 break;

126 QT = Context.UnsignedLongTy;

127 break;

129 QT = Context.LongTy;

130 break;

132 QT = Context.BoolTy;

133 break;

135 QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), true);

136 break;

138 QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), false);

139 break;

141 QT = Context.BFloat16Ty;

142 break;

144 switch (Type->getElementBitwidth()) {

145 case 64:

146 QT = Context.DoubleTy;

147 break;

148 case 32:

149 QT = Context.FloatTy;

150 break;

151 case 16:

152 QT = Context.Float16Ty;

153 break;

154 default:

155 llvm_unreachable("Unsupported floating point width.");

156 }

157 break;

160 llvm_unreachable("Unhandled type.");

161 }

162 if (Type->isVector()) {

163 if (Type->isTuple())

164 QT = Context.getScalableVectorType(QT, *Type->getScale(), Type->getNF());

165 else

166 QT = Context.getScalableVectorType(QT, *Type->getScale());

167 }

168

169 if (Type->isConstant())

170 QT = Context.getConstType(QT);

171

172

173 if (Type->isPointer())

174 QT = Context.getPointerType(QT);

175

176 return QT;

177}

388 IntrinsicList.push_back({BuiltinName, Record.RequiredExtensions, Signature});

499 return std::make_unique(S);

500}

504

505

508 return false;

509

510

511 if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result))

512 return true;

513

514 int64_t Val = Result.getSExtValue();

515 if ((Val >= 0 && Val <= 3) || (Val >= 5 && Val <= 7))

516 return false;

517

518 return Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_invalid_lmul)

520}

523 llvm::StringMap &FunctionFeatureMap,

525 int EGW) {

526 assert((EGW == 128 || EGW == 256) && "EGW can only be 128 or 256 bits");

527

528

532 unsigned MinElemCount = Info.EC.getKnownMinValue();

533

534 unsigned EGS = EGW / ElemSize;

535

536

537 if (EGS <= MinElemCount)

538 return false;

539

540

541 assert(EGS % MinElemCount == 0);

542 unsigned VScaleFactor = EGS / MinElemCount;

543

544 unsigned MinRequiredVLEN = VScaleFactor * llvm::RISCV::RVVBitsPerBlock;

545 std::string RequiredExt = "zvl" + std::to_string(MinRequiredVLEN) + "b";

546 if (!TI.hasFeature(RequiredExt) && !FunctionFeatureMap.lookup(RequiredExt))

548 diag::err_riscv_type_requires_extension)

549 << Type << RequiredExt;

550

551 return false;

552}

555 unsigned BuiltinID,

559 llvm::StringMap FunctionFeatureMap;

560 Context.getFunctionFeatureMap(FunctionFeatureMap, FD);

561

563 StringRef FeaturesStr = A->getFeaturesStr();

565 FeaturesStr.split(RequiredFeatures, ',');

566 for (auto RF : RequiredFeatures)

567 if (!TI.hasFeature(RF) && !FunctionFeatureMap.lookup(RF))

569 diag::err_riscv_builtin_requires_extension)

570 << true << TheCall->getSourceRange() << RF;

571 }

572

573

574

575 switch (BuiltinID) {

576 default:

577 break;

578 case RISCVVector::BI__builtin_rvv_vmulhsu_vv:

579 case RISCVVector::BI__builtin_rvv_vmulhsu_vx:

580 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tu:

581 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tu:

582 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_m:

583 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_m:

584 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_mu:

585 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_mu:

586 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tum:

587 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tum:

588 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tumu:

589 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tumu:

590 case RISCVVector::BI__builtin_rvv_vmulhu_vv:

591 case RISCVVector::BI__builtin_rvv_vmulhu_vx:

592 case RISCVVector::BI__builtin_rvv_vmulhu_vv_tu:

593 case RISCVVector::BI__builtin_rvv_vmulhu_vx_tu:

594 case RISCVVector::BI__builtin_rvv_vmulhu_vv_m:

595 case RISCVVector::BI__builtin_rvv_vmulhu_vx_m:

596 case RISCVVector::BI__builtin_rvv_vmulhu_vv_mu:

597 case RISCVVector::BI__builtin_rvv_vmulhu_vx_mu:

598 case RISCVVector::BI__builtin_rvv_vmulhu_vv_tum:

599 case RISCVVector::BI__builtin_rvv_vmulhu_vx_tum:

600 case RISCVVector::BI__builtin_rvv_vmulhu_vv_tumu:

601 case RISCVVector::BI__builtin_rvv_vmulhu_vx_tumu:

602 case RISCVVector::BI__builtin_rvv_vmulh_vv:

603 case RISCVVector::BI__builtin_rvv_vmulh_vx:

604 case RISCVVector::BI__builtin_rvv_vmulh_vv_tu:

605 case RISCVVector::BI__builtin_rvv_vmulh_vx_tu:

606 case RISCVVector::BI__builtin_rvv_vmulh_vv_m:

607 case RISCVVector::BI__builtin_rvv_vmulh_vx_m:

608 case RISCVVector::BI__builtin_rvv_vmulh_vv_mu:

609 case RISCVVector::BI__builtin_rvv_vmulh_vx_mu:

610 case RISCVVector::BI__builtin_rvv_vmulh_vv_tum:

611 case RISCVVector::BI__builtin_rvv_vmulh_vx_tum:

612 case RISCVVector::BI__builtin_rvv_vmulh_vv_tumu:

613 case RISCVVector::BI__builtin_rvv_vmulh_vx_tumu:

614 case RISCVVector::BI__builtin_rvv_vsmul_vv:

615 case RISCVVector::BI__builtin_rvv_vsmul_vx:

616 case RISCVVector::BI__builtin_rvv_vsmul_vv_tu:

617 case RISCVVector::BI__builtin_rvv_vsmul_vx_tu:

618 case RISCVVector::BI__builtin_rvv_vsmul_vv_m:

619 case RISCVVector::BI__builtin_rvv_vsmul_vx_m:

620 case RISCVVector::BI__builtin_rvv_vsmul_vv_mu:

621 case RISCVVector::BI__builtin_rvv_vsmul_vx_mu:

622 case RISCVVector::BI__builtin_rvv_vsmul_vv_tum:

623 case RISCVVector::BI__builtin_rvv_vsmul_vx_tum:

624 case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu:

625 case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu: {

628

630 !FunctionFeatureMap.lookup("v"))

632 diag::err_riscv_builtin_requires_extension)

633 << true << TheCall->getSourceRange() << "v";

634

635 break;

636 }

637 }

638

639 auto CheckVSetVL = [&](unsigned SEWOffset, unsigned LMULOffset) -> bool {

641 llvm::StringMap FunctionFeatureMap;

642 Context.getFunctionFeatureMap(FunctionFeatureMap, FD);

643 llvm::APSInt SEWResult;

644 llvm::APSInt LMULResult;

645 if (SemaRef.BuiltinConstantArg(TheCall, SEWOffset, SEWResult) ||

646 SemaRef.BuiltinConstantArg(TheCall, LMULOffset, LMULResult))

647 return true;

648 int SEWValue = SEWResult.getSExtValue();

649 int LMULValue = LMULResult.getSExtValue();

650 if (((SEWValue == 0 && LMULValue == 5) ||

651 (SEWValue == 1 && LMULValue == 6) ||

652 (SEWValue == 2 && LMULValue == 7) ||

653 SEWValue == 3) &&

655 !FunctionFeatureMap.lookup("zve64x"))

657 diag::err_riscv_builtin_requires_extension)

658 << true << TheCall->getSourceRange() << "zve64x";

659 return SemaRef.BuiltinConstantArgRange(TheCall, SEWOffset, 0, 3) ||

661 };

662 switch (BuiltinID) {

663 case RISCVVector::BI__builtin_rvv_vsetvli:

664 return CheckVSetVL(1, 2);

665 case RISCVVector::BI__builtin_rvv_vsetvlimax:

666 return CheckVSetVL(0, 1);

667 case RISCVVector::BI__builtin_rvv_sf_vsettnt:

668 case RISCVVector::BI__builtin_rvv_sf_vsettm:

669 case RISCVVector::BI__builtin_rvv_sf_vsettn:

670 case RISCVVector::BI__builtin_rvv_sf_vsettk:

671 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3) ||

672 SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 3);

673 case RISCVVector::BI__builtin_rvv_sf_mm_f_f_w1:

674 case RISCVVector::BI__builtin_rvv_sf_mm_f_f_w2:

675 case RISCVVector::BI__builtin_rvv_sf_mm_e5m2_e4m3_w4:

676 case RISCVVector::BI__builtin_rvv_sf_mm_e5m2_e5m2_w4:

677 case RISCVVector::BI__builtin_rvv_sf_mm_e4m3_e4m3_w4:

678 case RISCVVector::BI__builtin_rvv_sf_mm_e4m3_e5m2_w4:

679 case RISCVVector::BI__builtin_rvv_sf_mm_u_u_w4:

680 case RISCVVector::BI__builtin_rvv_sf_mm_u_s_w4:

681 case RISCVVector::BI__builtin_rvv_sf_mm_s_u_w4:

682 case RISCVVector::BI__builtin_rvv_sf_mm_s_s_w4: {

685 SemaRef.Context.getBuiltinVectorTypeInfo(

689

690

693 return false;

694

695

696 if (SemaRef.BuiltinConstantArg(TheCall, 0, Result))

697 return true;

698

699

700

701

702 if ((BuiltinID == RISCVVector::BI__builtin_rvv_sf_mm_f_f_w1 &&

703 EltSize == 64) ||

704 (BuiltinID == RISCVVector::BI__builtin_rvv_sf_mm_f_f_w2 &&

705 EltSize == 32))

706 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 15) ||

707 SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 2);

708 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 15) ||

709 SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 4);

710 }

711 case RISCVVector::BI__builtin_rvv_sf_vtzero_t: {

712 llvm::APSInt Log2SEWResult;

713 llvm::APSInt TWidenResult;

714 if (SemaRef.BuiltinConstantArg(TheCall, 3, Log2SEWResult) ||

715 SemaRef.BuiltinConstantArg(TheCall, 4, TWidenResult))

716 return true;

717

718 int Log2SEW = Log2SEWResult.getSExtValue();

719 int TWiden = TWidenResult.getSExtValue();

720

721

722 if (SemaRef.BuiltinConstantArgRange(TheCall, 3, 3, 6))

723 return true;

724

725

726 if (TWiden != 1 && TWiden != 2 && TWiden != 4)

728 diag::err_riscv_builtin_invalid_twiden);

729

730 int TEW = (1 << Log2SEW) * TWiden;

731

732

733

734

735 if (SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 15))

736 return true;

737 if (TEW == 16 || TEW == 64)

738 return SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 2);

739 return SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 4);

740 }

741 case RISCVVector::BI__builtin_rvv_vget_v: {

748 unsigned MaxIndex;

749 if (VecInfo.NumVectors != 1)

751 else

752 MaxIndex = (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors) /

753 (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors);

754 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);

755 }

756 case RISCVVector::BI__builtin_rvv_vset_v: {

763 unsigned MaxIndex;

764 if (ResVecInfo.NumVectors != 1)

766 else

767 MaxIndex = (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors) /

768 (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors);

769 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);

770 }

771

772 case RISCVVector::BI__builtin_rvv_vaeskf1_vi_tu:

773 case RISCVVector::BI__builtin_rvv_vaeskf2_vi_tu:

774 case RISCVVector::BI__builtin_rvv_vaeskf2_vi:

775 case RISCVVector::BI__builtin_rvv_vsm4k_vi_tu: {

779 Arg0Type, 128) ||

781 Arg1Type, 128) ||

782 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);

783 }

784 case RISCVVector::BI__builtin_rvv_vsm3c_vi_tu:

785 case RISCVVector::BI__builtin_rvv_vsm3c_vi: {

788 Arg0Type, 256) ||

789 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);

790 }

791 case RISCVVector::BI__builtin_rvv_vaeskf1_vi:

792 case RISCVVector::BI__builtin_rvv_vsm4k_vi: {

795 Arg0Type, 128) ||

796 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);

797 }

798 case RISCVVector::BI__builtin_rvv_vaesdf_vv:

799 case RISCVVector::BI__builtin_rvv_vaesdf_vs:

800 case RISCVVector::BI__builtin_rvv_vaesdm_vv:

801 case RISCVVector::BI__builtin_rvv_vaesdm_vs:

802 case RISCVVector::BI__builtin_rvv_vaesef_vv:

803 case RISCVVector::BI__builtin_rvv_vaesef_vs:

804 case RISCVVector::BI__builtin_rvv_vaesem_vv:

805 case RISCVVector::BI__builtin_rvv_vaesem_vs:

806 case RISCVVector::BI__builtin_rvv_vaesz_vs:

807 case RISCVVector::BI__builtin_rvv_vsm4r_vv:

808 case RISCVVector::BI__builtin_rvv_vsm4r_vs:

809 case RISCVVector::BI__builtin_rvv_vaesdf_vv_tu:

810 case RISCVVector::BI__builtin_rvv_vaesdf_vs_tu:

811 case RISCVVector::BI__builtin_rvv_vaesdm_vv_tu:

812 case RISCVVector::BI__builtin_rvv_vaesdm_vs_tu:

813 case RISCVVector::BI__builtin_rvv_vaesef_vv_tu:

814 case RISCVVector::BI__builtin_rvv_vaesef_vs_tu:

815 case RISCVVector::BI__builtin_rvv_vaesem_vv_tu:

816 case RISCVVector::BI__builtin_rvv_vaesem_vs_tu:

817 case RISCVVector::BI__builtin_rvv_vaesz_vs_tu:

818 case RISCVVector::BI__builtin_rvv_vsm4r_vv_tu:

819 case RISCVVector::BI__builtin_rvv_vsm4r_vs_tu: {

823 Arg0Type, 128) ||

825 Arg1Type, 128);

826 }

827 case RISCVVector::BI__builtin_rvv_vsha2ch_vv:

828 case RISCVVector::BI__builtin_rvv_vsha2cl_vv:

829 case RISCVVector::BI__builtin_rvv_vsha2ms_vv:

830 case RISCVVector::BI__builtin_rvv_vsha2ch_vv_tu:

831 case RISCVVector::BI__builtin_rvv_vsha2cl_vv_tu:

832 case RISCVVector::BI__builtin_rvv_vsha2ms_vv_tu: {

837 Context.getBuiltinVectorTypeInfo(Arg0Type->castAs<BuiltinType>());

838 uint64_t ElemSize = Context.getTypeSize(Info.ElementType);

839 if (ElemSize == 64 && !TI.hasFeature("zvknhb") &&

840 !FunctionFeatureMap.lookup("zvknhb"))

842 diag::err_riscv_builtin_requires_extension)

843 << true << TheCall->getSourceRange() << "zvknhb";

844

845 if (!TI.hasFeature("zvknha") && !FunctionFeatureMap.lookup("zvknha") &&

846 !TI.hasFeature("zvknhb") && !FunctionFeatureMap.lookup("zvknhb"))

848 diag::err_riscv_builtin_requires_extension)

849 << true << TheCall->getSourceRange()

850 << "zvknha or zvknhb";

851

853 Arg0Type, ElemSize * 4) ||

855 Arg1Type, ElemSize * 4) ||

857 Arg2Type, ElemSize * 4);

858 }

859

860 case RISCVVector::BI__builtin_rvv_sf_vc_i_se:

861

862 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||

863 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||

864 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||

865 SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15) ||

867 case RISCVVector::BI__builtin_rvv_sf_vc_iv_se:

868

869 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||

870 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||

871 SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15);

872 case RISCVVector::BI__builtin_rvv_sf_vc_v_i:

873 case RISCVVector::BI__builtin_rvv_sf_vc_v_i_se:

874

875 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||

876 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||

877 SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15);

878 case RISCVVector::BI__builtin_rvv_sf_vc_v_iv:

879 case RISCVVector::BI__builtin_rvv_sf_vc_v_iv_se:

880

881 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||

882 SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15);

883 case RISCVVector::BI__builtin_rvv_sf_vc_ivv_se:

884 case RISCVVector::BI__builtin_rvv_sf_vc_ivw_se:

885 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv:

886 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw:

887 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv_se:

888 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw_se:

889

890 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||

891 SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15);

892 case RISCVVector::BI__builtin_rvv_sf_vc_x_se:

893

894 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||

895 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||

896 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||

898 case RISCVVector::BI__builtin_rvv_sf_vc_xv_se:

899 case RISCVVector::BI__builtin_rvv_sf_vc_vv_se:

900

901 case RISCVVector::BI__builtin_rvv_sf_vc_v_x:

902 case RISCVVector::BI__builtin_rvv_sf_vc_v_x_se:

903

904 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||

905 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);

906 case RISCVVector::BI__builtin_rvv_sf_vc_vvv_se:

907 case RISCVVector::BI__builtin_rvv_sf_vc_xvv_se:

908 case RISCVVector::BI__builtin_rvv_sf_vc_vvw_se:

909 case RISCVVector::BI__builtin_rvv_sf_vc_xvw_se:

910

911 case RISCVVector::BI__builtin_rvv_sf_vc_v_xv:

912 case RISCVVector::BI__builtin_rvv_sf_vc_v_vv:

913 case RISCVVector::BI__builtin_rvv_sf_vc_v_xv_se:

914 case RISCVVector::BI__builtin_rvv_sf_vc_v_vv_se:

915

916 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv:

917 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv:

918 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw:

919 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw:

920 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv_se:

921 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv_se:

922 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw_se:

923 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw_se:

924

925 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);

926 case RISCVVector::BI__builtin_rvv_sf_vc_fv_se:

927

928 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1) ||

929 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);

930 case RISCVVector::BI__builtin_rvv_sf_vc_fvv_se:

931 case RISCVVector::BI__builtin_rvv_sf_vc_fvw_se:

932 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv:

933 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw:

934 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv_se:

935 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw_se:

936

937 case RISCVVector::BI__builtin_rvv_sf_vc_v_fv:

938 case RISCVVector::BI__builtin_rvv_sf_vc_v_fv_se:

939

940 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);

941

942 case RISCV::BI__builtin_riscv_aes32dsi:

943 case RISCV::BI__builtin_riscv_aes32dsmi:

944 case RISCV::BI__builtin_riscv_aes32esi:

945 case RISCV::BI__builtin_riscv_aes32esmi:

946 case RISCV::BI__builtin_riscv_sm4ks:

947 case RISCV::BI__builtin_riscv_sm4ed:

948 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);

949

950 case RISCV::BI__builtin_riscv_aes64ks1i:

951 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 10);

952

953 case RISCVVector::BI__builtin_rvv_vaaddu_vv:

954 case RISCVVector::BI__builtin_rvv_vaaddu_vx:

955 case RISCVVector::BI__builtin_rvv_vaadd_vv:

956 case RISCVVector::BI__builtin_rvv_vaadd_vx:

957 case RISCVVector::BI__builtin_rvv_vasubu_vv:

958 case RISCVVector::BI__builtin_rvv_vasubu_vx:

959 case RISCVVector::BI__builtin_rvv_vasub_vv:

960 case RISCVVector::BI__builtin_rvv_vasub_vx:

961 case RISCVVector::BI__builtin_rvv_vsmul_vv:

962 case RISCVVector::BI__builtin_rvv_vsmul_vx:

963 case RISCVVector::BI__builtin_rvv_vssra_vv:

964 case RISCVVector::BI__builtin_rvv_vssra_vx:

965 case RISCVVector::BI__builtin_rvv_vssrl_vv:

966 case RISCVVector::BI__builtin_rvv_vssrl_vx:

967 case RISCVVector::BI__builtin_rvv_vnclip_wv:

968 case RISCVVector::BI__builtin_rvv_vnclip_wx:

969 case RISCVVector::BI__builtin_rvv_vnclipu_wv:

970 case RISCVVector::BI__builtin_rvv_vnclipu_wx:

971 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);

972 case RISCVVector::BI__builtin_rvv_vaaddu_vv_tu:

973 case RISCVVector::BI__builtin_rvv_vaaddu_vx_tu:

974 case RISCVVector::BI__builtin_rvv_vaadd_vv_tu:

975 case RISCVVector::BI__builtin_rvv_vaadd_vx_tu:

976 case RISCVVector::BI__builtin_rvv_vasubu_vv_tu:

977 case RISCVVector::BI__builtin_rvv_vasubu_vx_tu:

978 case RISCVVector::BI__builtin_rvv_vasub_vv_tu:

979 case RISCVVector::BI__builtin_rvv_vasub_vx_tu:

980 case RISCVVector::BI__builtin_rvv_vsmul_vv_tu:

981 case RISCVVector::BI__builtin_rvv_vsmul_vx_tu:

982 case RISCVVector::BI__builtin_rvv_vssra_vv_tu:

983 case RISCVVector::BI__builtin_rvv_vssra_vx_tu:

984 case RISCVVector::BI__builtin_rvv_vssrl_vv_tu:

985 case RISCVVector::BI__builtin_rvv_vssrl_vx_tu:

986 case RISCVVector::BI__builtin_rvv_vnclip_wv_tu:

987 case RISCVVector::BI__builtin_rvv_vnclip_wx_tu:

988 case RISCVVector::BI__builtin_rvv_vnclipu_wv_tu:

989 case RISCVVector::BI__builtin_rvv_vnclipu_wx_tu:

990 case RISCVVector::BI__builtin_rvv_vaaddu_vv_m:

991 case RISCVVector::BI__builtin_rvv_vaaddu_vx_m:

992 case RISCVVector::BI__builtin_rvv_vaadd_vv_m:

993 case RISCVVector::BI__builtin_rvv_vaadd_vx_m:

994 case RISCVVector::BI__builtin_rvv_vasubu_vv_m:

995 case RISCVVector::BI__builtin_rvv_vasubu_vx_m:

996 case RISCVVector::BI__builtin_rvv_vasub_vv_m:

997 case RISCVVector::BI__builtin_rvv_vasub_vx_m:

998 case RISCVVector::BI__builtin_rvv_vsmul_vv_m:

999 case RISCVVector::BI__builtin_rvv_vsmul_vx_m:

1000 case RISCVVector::BI__builtin_rvv_vssra_vv_m:

1001 case RISCVVector::BI__builtin_rvv_vssra_vx_m:

1002 case RISCVVector::BI__builtin_rvv_vssrl_vv_m:

1003 case RISCVVector::BI__builtin_rvv_vssrl_vx_m:

1004 case RISCVVector::BI__builtin_rvv_vnclip_wv_m:

1005 case RISCVVector::BI__builtin_rvv_vnclip_wx_m:

1006 case RISCVVector::BI__builtin_rvv_vnclipu_wv_m:

1007 case RISCVVector::BI__builtin_rvv_vnclipu_wx_m:

1008 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 3);

1009 case RISCVVector::BI__builtin_rvv_vaaddu_vv_tum:

1010 case RISCVVector::BI__builtin_rvv_vaaddu_vv_tumu:

1011 case RISCVVector::BI__builtin_rvv_vaaddu_vv_mu:

1012 case RISCVVector::BI__builtin_rvv_vaaddu_vx_tum:

1013 case RISCVVector::BI__builtin_rvv_vaaddu_vx_tumu:

1014 case RISCVVector::BI__builtin_rvv_vaaddu_vx_mu:

1015 case RISCVVector::BI__builtin_rvv_vaadd_vv_tum:

1016 case RISCVVector::BI__builtin_rvv_vaadd_vv_tumu:

1017 case RISCVVector::BI__builtin_rvv_vaadd_vv_mu:

1018 case RISCVVector::BI__builtin_rvv_vaadd_vx_tum:

1019 case RISCVVector::BI__builtin_rvv_vaadd_vx_tumu:

1020 case RISCVVector::BI__builtin_rvv_vaadd_vx_mu:

1021 case RISCVVector::BI__builtin_rvv_vasubu_vv_tum:

1022 case RISCVVector::BI__builtin_rvv_vasubu_vv_tumu:

1023 case RISCVVector::BI__builtin_rvv_vasubu_vv_mu:

1024 case RISCVVector::BI__builtin_rvv_vasubu_vx_tum:

1025 case RISCVVector::BI__builtin_rvv_vasubu_vx_tumu:

1026 case RISCVVector::BI__builtin_rvv_vasubu_vx_mu:

1027 case RISCVVector::BI__builtin_rvv_vasub_vv_tum:

1028 case RISCVVector::BI__builtin_rvv_vasub_vv_tumu:

1029 case RISCVVector::BI__builtin_rvv_vasub_vv_mu:

1030 case RISCVVector::BI__builtin_rvv_vasub_vx_tum:

1031 case RISCVVector::BI__builtin_rvv_vasub_vx_tumu:

1032 case RISCVVector::BI__builtin_rvv_vasub_vx_mu:

1033 case RISCVVector::BI__builtin_rvv_vsmul_vv_mu:

1034 case RISCVVector::BI__builtin_rvv_vsmul_vx_mu:

1035 case RISCVVector::BI__builtin_rvv_vssra_vv_mu:

1036 case RISCVVector::BI__builtin_rvv_vssra_vx_mu:

1037 case RISCVVector::BI__builtin_rvv_vssrl_vv_mu:

1038 case RISCVVector::BI__builtin_rvv_vssrl_vx_mu:

1039 case RISCVVector::BI__builtin_rvv_vnclip_wv_mu:

1040 case RISCVVector::BI__builtin_rvv_vnclip_wx_mu:

1041 case RISCVVector::BI__builtin_rvv_vnclipu_wv_mu:

1042 case RISCVVector::BI__builtin_rvv_vnclipu_wx_mu:

1043 case RISCVVector::BI__builtin_rvv_vsmul_vv_tum:

1044 case RISCVVector::BI__builtin_rvv_vsmul_vx_tum:

1045 case RISCVVector::BI__builtin_rvv_vssra_vv_tum:

1046 case RISCVVector::BI__builtin_rvv_vssra_vx_tum:

1047 case RISCVVector::BI__builtin_rvv_vssrl_vv_tum:

1048 case RISCVVector::BI__builtin_rvv_vssrl_vx_tum:

1049 case RISCVVector::BI__builtin_rvv_vnclip_wv_tum:

1050 case RISCVVector::BI__builtin_rvv_vnclip_wx_tum:

1051 case RISCVVector::BI__builtin_rvv_vnclipu_wv_tum:

1052 case RISCVVector::BI__builtin_rvv_vnclipu_wx_tum:

1053 case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu:

1054 case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu:

1055 case RISCVVector::BI__builtin_rvv_vssra_vv_tumu:

1056 case RISCVVector::BI__builtin_rvv_vssra_vx_tumu:

1057 case RISCVVector::BI__builtin_rvv_vssrl_vv_tumu:

1058 case RISCVVector::BI__builtin_rvv_vssrl_vx_tumu:

1059 case RISCVVector::BI__builtin_rvv_vnclip_wv_tumu:

1060 case RISCVVector::BI__builtin_rvv_vnclip_wx_tumu:

1061 case RISCVVector::BI__builtin_rvv_vnclipu_wv_tumu:

1062 case RISCVVector::BI__builtin_rvv_vnclipu_wx_tumu:

1063 return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 3);

1064 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm:

1065 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm:

1066 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm:

1067 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm:

1068 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm:

1069 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm:

1070 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm:

1071 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm:

1072 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm:

1073 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm:

1074 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm:

1075 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm:

1076 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm:

1077 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm:

1078 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 4);

1079 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm:

1080 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm:

1081 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm:

1082 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm:

1083 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm:

1084 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm:

1085 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm:

1086 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm:

1087 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm:

1088 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm:

1089 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm:

1090 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm:

1091 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm:

1092 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm:

1093 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm:

1094 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm:

1095 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm:

1096 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm:

1097 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm:

1098 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm:

1099 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm:

1100 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm:

1101 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm:

1102 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm:

1103 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tu:

1104 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tu:

1105 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tu:

1106 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tu:

1107 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tu:

1108 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tu:

1109 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tu:

1110 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tu:

1111 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tu:

1112 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tu:

1113 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tu:

1114 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tu:

1115 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tu:

1116 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_tu:

1117 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_m:

1118 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_m:

1119 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_m:

1120 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_m:

1121 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_m:

1122 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_m:

1123 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_m:

1124 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_m:

1125 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_m:

1126 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_m:

1127 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_m:

1128 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_m:

1129 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_m:

1130 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_m:

1131 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 4);

1132 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tu:

1133 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tu:

1134 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tu:

1135 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tu:

1136 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tu:

1137 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tu:

1138 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tu:

1139 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tu:

1140 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tu:

1141 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tu:

1142 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tu:

1143 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tu:

1144 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tu:

1145 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tu:

1146 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tu:

1147 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tu:

1148 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tu:

1149 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tu:

1150 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tu:

1151 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tu:

1152 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tu:

1153 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tu:

1154 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tu:

1155 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tu:

1156 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm:

1157 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm:

1158 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm:

1159 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm:

1160 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm:

1161 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm:

1162 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm:

1163 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm:

1164 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm:

1165 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm:

1166 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm:

1167 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm:

1168 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm:

1169 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm:

1170 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm:

1171 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm:

1172 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm:

1173 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm:

1174 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm:

1175 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm:

1176 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm:

1177 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm:

1178 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm:

1179 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm:

1180 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm:

1181 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm:

1182 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tu:

1183 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tu:

1184 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tu:

1185 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tu:

1186 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tu:

1187 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tu:

1188 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tu:

1189 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tu:

1190 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tu:

1191 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tu:

1192 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tu:

1193 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tu:

1194 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tu:

1195 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tu:

1196 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tu:

1197 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tu:

1198 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tu:

1199 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tu:

1200 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tu:

1201 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tu:

1202 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tu:

1203 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tu:

1204 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tu:

1205 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tu:

1206 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_tu:

1207 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_tu:

1208 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_m:

1209 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_m:

1210 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_m:

1211 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_m:

1212 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_m:

1213 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_m:

1214 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_m:

1215 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_m:

1216 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_m:

1217 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_m:

1218 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_m:

1219 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_m:

1220 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_m:

1221 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_m:

1222 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_m:

1223 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_m:

1224 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_m:

1225 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_m:

1226 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_m:

1227 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_m:

1228 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_m:

1229 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_m:

1230 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_m:

1231 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_m:

1232 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tum:

1233 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tum:

1234 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tum:

1235 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tum:

1236 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tum:

1237 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tum:

1238 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tum:

1239 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tum:

1240 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tum:

1241 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tum:

1242 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tum:

1243 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tum:

1244 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tum:

1245 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_tum:

1246 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tumu:

1247 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tumu:

1248 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tumu:

1249 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tumu:

1250 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tumu:

1251 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tumu:

1252 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tumu:

1253 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tumu:

1254 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tumu:

1255 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tumu:

1256 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tumu:

1257 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tumu:

1258 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tumu:

1259 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_tumu:

1260 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_mu:

1261 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_mu:

1262 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_mu:

1263 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_mu:

1264 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_mu:

1265 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_mu:

1266 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_mu:

1267 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_mu:

1268 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_mu:

1269 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_mu:

1270 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_mu:

1271 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_mu:

1272 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_mu:

1273 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_mu:

1274 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 4);

1275 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_m:

1276 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_m:

1277 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_m:

1278 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_m:

1279 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_m:

1280 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_m:

1281 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_m:

1282 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_m:

1283 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_m:

1284 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_m:

1285 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_m:

1286 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_m:

1287 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_m:

1288 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_m:

1289 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_m:

1290 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_m:

1291 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_m:

1292 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_m:

1293 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_m:

1294 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_m:

1295 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_m:

1296 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_m:

1297 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_m:

1298 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_m:

1299 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_m:

1300 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_m:

1301 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tum:

1302 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tum:

1303 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tum:

1304 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tum:

1305 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tum:

1306 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tum:

1307 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tum:

1308 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tum:

1309 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tum:

1310 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tum:

1311 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tum:

1312 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tum:

1313 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tum:

1314 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tum:

1315 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tum:

1316 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tum:

1317 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tum:

1318 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tum:

1319 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tum:

1320 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tum:

1321 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tum:

1322 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tum:

1323 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tum:

1324 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tum:

1325 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tum:

1326 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tum:

1327 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tum:

1328 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tum:

1329 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tum:

1330 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tum:

1331 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tum:

1332 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tum:

1333 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tum:

1334 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tum:

1335 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tum:

1336 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tum:

1337 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tum:

1338 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tum:

1339 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tum:

1340 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tum:

1341 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tum:

1342 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tum:

1343 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tum:

1344 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tum:

1345 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_tum:

1346 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_tum:

1347 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tum:

1348 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tum:

1349 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tum:

1350 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tum:

1351 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tumu:

1352 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tumu:

1353 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tumu:

1354 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tumu:

1355 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tumu:

1356 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tumu:

1357 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tumu:

1358 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tumu:

1359 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tumu:

1360 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tumu:

1361 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tumu:

1362 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tumu:

1363 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tumu:

1364 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tumu:

1365 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tumu:

1366 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tumu:

1367 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tumu:

1368 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tumu:

1369 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tumu:

1370 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tumu:

1371 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tumu:

1372 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tumu:

1373 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tumu:

1374 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tumu:

1375 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tumu:

1376 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tumu:

1377 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tumu:

1378 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tumu:

1379 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tumu:

1380 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tumu:

1381 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tumu:

1382 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tumu:

1383 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tumu:

1384 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tumu:

1385 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tumu:

1386 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tumu:

1387 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tumu:

1388 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tumu:

1389 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tumu:

1390 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tumu:

1391 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tumu:

1392 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tumu:

1393 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tumu:

1394 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tumu:

1395 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_tumu:

1396 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_tumu:

1397 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_mu:

1398 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_mu:

1399 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_mu:

1400 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_mu:

1401 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_mu:

1402 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_mu:

1403 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_mu:

1404 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_mu:

1405 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_mu:

1406 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_mu:

1407 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_mu:

1408 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_mu:

1409 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_mu:

1410 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_mu:

1411 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_mu:

1412 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_mu:

1413 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_mu:

1414 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_mu:

1415 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_mu:

1416 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_mu:

1417 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_mu:

1418 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_mu:

1419 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_mu:

1420 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_mu:

1421 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_mu:

1422 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_mu:

1423 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_mu:

1424 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_mu:

1425 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_mu:

1426 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_mu:

1427 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_mu:

1428 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_mu:

1429 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_mu:

1430 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_mu:

1431 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_mu:

1432 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_mu:

1433 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_mu:

1434 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_mu:

1435 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_mu:

1436 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_mu:

1437 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_mu:

1438 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_mu:

1439 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_mu:

1440 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_mu:

1441 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_mu:

1442 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_mu:

1443 return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 4);

1444 case RISCV::BI__builtin_riscv_ntl_load:

1445 case RISCV::BI__builtin_riscv_ntl_store:

1448 assert((BuiltinID == RISCV::BI__builtin_riscv_ntl_store ||

1449 BuiltinID == RISCV::BI__builtin_riscv_ntl_load) &&

1450 "Unexpected RISC-V nontemporal load/store builtin!");

1451 bool IsStore = BuiltinID == RISCV::BI__builtin_riscv_ntl_store;

1452 unsigned NumArgs = IsStore ? 3 : 2;

1453

1454 if (SemaRef.checkArgCountAtLeast(TheCall, NumArgs - 1))

1455 return true;

1456

1457 if (SemaRef.checkArgCountAtMost(TheCall, NumArgs))

1458 return true;

1459

1460

1461

1462 if (TheCall->getNumArgs() == NumArgs &&

1463 SemaRef.BuiltinConstantArgRange(TheCall, NumArgs - 1, 2, 5))

1464 return true;

1465

1466 Expr *PointerArg = TheCall->getArg(0);

1468 SemaRef.DefaultFunctionArrayLvalueConversion(PointerArg);

1469

1470 if (PointerArgResult.isInvalid())

1471 return true;

1472 PointerArg = PointerArgResult.get();

1473

1475 if (!PtrType) {

1476 Diag(DRE->getBeginLoc(), diag::err_nontemporal_builtin_must_be_pointer)

1478 return true;

1479 }

1480

1487 diag::err_nontemporal_builtin_must_be_pointer_intfltptr_or_vector)

1489 return true;

1490 }

1491

1492 if (!IsStore) {

1493 TheCall->setType(ValType);

1494 return false;

1495 }

1496

1499 Context, ValType, false);

1500 ValArg =

1503 return true;

1504

1505 TheCall->setArg(1, ValArg.get());

1506 TheCall->setType(Context.VoidTy);

1507 return false;

1508 }

1509

1510 return false;

1511}

1514 const llvm::StringMap &FeatureMap) {

1518 unsigned MinElts = Info.EC.getKnownMinValue();

1519

1521 !FeatureMap.lookup("zve64d"))

1522 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve64d";

1523

1524

1526 MinElts == 1) &&

1527 !FeatureMap.lookup("zve64x"))

1528 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve64x";

1530 !FeatureMap.lookup("zvfhmin") &&

1531 !FeatureMap.lookup("xandesvpackfph"))

1533 Diag(Loc, diag::err_riscv_type_requires_extension)

1534 << Ty << "zvfh, zvfhmin or xandesvpackfph";

1535 } else {

1536 Diag(Loc, diag::err_riscv_type_requires_extension)

1537 << Ty << "zvfh or zvfhmin";

1538 }

1540 !FeatureMap.lookup("zvfbfmin") &&

1541 !FeatureMap.lookup("xandesvbfhcvt") &&

1542 !FeatureMap.lookup("experimental-zvfbfa"))

1544 Diag(Loc, diag::err_riscv_type_requires_extension)

1545 << Ty << "zvfbfmin or xandesvbfhcvt";

1546 } else {

1547 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zvfbfmin";

1548 }

1550 !FeatureMap.lookup("zve32f"))

1551 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve32f";

1552

1553

1554 else if (!FeatureMap.lookup("zve32x"))

1555 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve32x";

1556}

1566

1567 auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) {

1569 return false;

1570

1571 const auto *VecTy = SecondType->getAs<VectorType>();

1573 };

1574

1575 return ValidScalableConversion(srcTy, destTy) ||

1576 ValidScalableConversion(destTy, srcTy);

1577}

1580

1581 if (const auto *A = D->getAttr()) {

1583 diag::warn_riscv_repeated_interrupt_attribute);

1584 Diag(A->getLocation(), diag::note_riscv_repeated_interrupt_attribute);

1585 return;

1586 }

1587

1588

1589

1590

1591

1592

1593

1594

1595

1596

1598 Diag(D->getLocation(), diag::warn_attribute_wrong_decl_type)

1600 return;

1601 }

1602

1604 Diag(D->getLocation(), diag::warn_interrupt_signal_attribute_invalid)

1605 << 2 << 0 << 0;

1606 return;

1607 }

1608

1610 Diag(D->getLocation(), diag::warn_interrupt_signal_attribute_invalid)

1611 << 2 << 0 << 1;

1612 return;

1613 }

1614

1616 return;

1617

1618 bool HasSiFiveCLICType = false;

1619 bool HasUnaryType = false;

1620

1621 SmallSet<RISCVInterruptAttr::InterruptType, 2> Types;

1622 for (unsigned ArgIndex = 0; ArgIndex < AL.getNumArgs(); ++ArgIndex) {

1623 RISCVInterruptAttr::InterruptType Type;

1624 StringRef TypeString;

1626

1627 if (SemaRef.checkStringLiteralArgumentAttr(AL, ArgIndex, TypeString, &Loc))

1628 return;

1629

1630 if (!RISCVInterruptAttr::ConvertStrToInterruptType(TypeString, Type)) {

1631 std::string TypeLiteral = ("\"" + TypeString + "\"").str();

1632 Diag(AL.getLoc(), diag::warn_attribute_type_not_supported)

1633 << AL << TypeLiteral << Loc;

1634 return;

1635 }

1636

1637 switch (Type) {

1638 case RISCVInterruptAttr::machine:

1639

1640

1641 break;

1642 case RISCVInterruptAttr::SiFiveCLICPreemptible:

1643 case RISCVInterruptAttr::SiFiveCLICStackSwap:

1644

1645 HasSiFiveCLICType = true;

1646 break;

1647 case RISCVInterruptAttr::supervisor:

1648 case RISCVInterruptAttr::rnmi:

1649 case RISCVInterruptAttr::qcinest:

1650 case RISCVInterruptAttr::qcinonest:

1651

1652

1653 HasUnaryType = true;

1654 break;

1655 }

1656

1657 Types.insert(Type);

1658 }

1659

1660 if (HasUnaryType && Types.size() > 1) {

1661 Diag(AL.getLoc(), diag::err_riscv_attribute_interrupt_invalid_combination);

1662 return;

1663 }

1664

1665 if (HasUnaryType && HasSiFiveCLICType) {

1666 Diag(AL.getLoc(), diag::err_riscv_attribute_interrupt_invalid_combination);

1667 return;

1668 }

1669

1670

1672 Types.insert(RISCVInterruptAttr::machine);

1673

1675 llvm::StringMap FunctionFeatureMap;

1676 getASTContext().getFunctionFeatureMap(FunctionFeatureMap,

1677 dyn_cast(D));

1678

1679 auto HasFeature = [&](StringRef FeatureName) -> bool {

1680 return TI.hasFeature(FeatureName) || FunctionFeatureMap.lookup(FeatureName);

1681 };

1682

1683 for (RISCVInterruptAttr::InterruptType Type : Types) {

1684 switch (Type) {

1685

1686 case RISCVInterruptAttr::qcinest:

1687 case RISCVInterruptAttr::qcinonest: {

1688 if (HasFeature("experimental-xqciint")) {

1690 diag::err_riscv_attribute_interrupt_requires_extension)

1691 << RISCVInterruptAttr::ConvertInterruptTypeToStr(Type) << "Xqciint";

1692 return;

1693 }

1694 } break;

1695

1696 case RISCVInterruptAttr::SiFiveCLICPreemptible:

1697 case RISCVInterruptAttr::SiFiveCLICStackSwap: {

1698 if (HasFeature("experimental-xsfmclic")) {

1700 diag::err_riscv_attribute_interrupt_requires_extension)

1701 << RISCVInterruptAttr::ConvertInterruptTypeToStr(Type)

1702 << "XSfmclic";

1703 return;

1704 }

1705 } break;

1706 case RISCVInterruptAttr::rnmi: {

1709 diag::err_riscv_attribute_interrupt_requires_extension)

1710 << RISCVInterruptAttr::ConvertInterruptTypeToStr(Type) << "Smrnmi";

1711 return;

1712 }

1713 } break;

1714 default:

1715 break;

1716 }

1717 }

1718

1720 Types.end());

1721

1723 getASTContext(), AL, TypesVec.data(), TypesVec.size()));

1724}

1732 if (Ext.empty())

1733 return false;

1734

1735 if (!Ext.consume_front("+"))

1736 return false;

1737

1738 return -1 != RISCVISAInfo::getRISCVFeaturesBitsInfo(Ext).second;

1739}

1745

1747 Param.split(AttrStrs, ';');

1748

1749 bool HasArch = false;

1750 bool HasPriority = false;

1751 bool HasDefault = false;

1752 bool DuplicateAttr = false;

1753 for (StringRef AttrStr : AttrStrs) {

1754 AttrStr = AttrStr.trim();

1755

1756 if (AttrStr.starts_with("arch=+")) {

1757 DuplicateAttr = HasArch;

1758 HasArch = true;

1760 getASTContext().getTargetInfo().parseTargetAttr(AttrStr);

1761

1762 if (TargetAttr.Features.empty() ||

1763 llvm::any_of(TargetAttr.Features, [&](const StringRef Ext) {

1764 return !isValidFMVExtension(Ext);

1765 }))

1766 return Diag(Loc, diag::warn_unsupported_target_attribute)

1768 } else if (AttrStr == "default") {

1769 DuplicateAttr = HasDefault;

1770 HasDefault = true;

1771 } else if (AttrStr.consume_front("priority=")) {

1772 DuplicateAttr = HasPriority;

1773 HasPriority = true;

1774 unsigned Digit;

1775 if (AttrStr.getAsInteger(0, Digit))

1776 return Diag(Loc, diag::warn_unsupported_target_attribute)

1778 } else {

1779 return Diag(Loc, diag::warn_unsupported_target_attribute)

1781 }

1782 }

1783

1784 if (((HasPriority || HasArch) && HasDefault) || DuplicateAttr ||

1785 (HasPriority && !HasArch))

1786 return Diag(Loc, diag::warn_unsupported_target_attribute)

1788

1789 NewParam = Param;

1790 return false;

1791}

1797

1798 assert(Params.size() == Locs.size() &&

1799 "Mismatch between number of string parameters and locations");

1800

1801 bool HasDefault = false;

1802 for (unsigned I = 0, E = Params.size(); I < E; ++I) {

1803 const StringRef Param = Params[I].trim();

1805

1807 Param.split(AttrStrs, ';');

1808

1809 bool IsPriority = false;

1810 bool IsDefault = false;

1811 for (StringRef AttrStr : AttrStrs) {

1812 AttrStr = AttrStr.trim();

1813

1814 if (AttrStr.starts_with("arch=+")) {

1816 getASTContext().getTargetInfo().parseTargetAttr(AttrStr);

1817

1818 if (TargetAttr.Features.empty() ||

1819 llvm::any_of(TargetAttr.Features, [&](const StringRef Ext) {

1820 return !isValidFMVExtension(Ext);

1821 }))

1822 return Diag(Loc, diag::warn_unsupported_target_attribute)

1824 } else if (AttrStr == "default") {

1825 IsDefault = true;

1826 HasDefault = true;

1827 } else if (AttrStr.consume_front("priority=")) {

1828 IsPriority = true;

1829 unsigned Digit;

1830 if (AttrStr.getAsInteger(0, Digit))

1831 return Diag(Loc, diag::warn_unsupported_target_attribute)

1833 } else {

1834 return Diag(Loc, diag::warn_unsupported_target_attribute)

1836 }

1837 }

1838

1839 if (IsPriority && IsDefault)

1840 return Diag(Loc, diag::warn_unsupported_target_attribute)

1842

1843 if (llvm::is_contained(NewParams, Param))

1844 Diag(Loc, diag::warn_target_clone_duplicate_options);

1845 NewParams.push_back(Param);

1846 }

1847 if (!HasDefault)

1848 return Diag(Locs[0], diag::err_target_clone_must_have_default);

1849

1850 return false;

1851}