634 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
636 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
643 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
660 cir::VectorType vTy =
getNeonType(&cgf, neonType, hasLegalHalfType,
661 false, allowBFloatArgsAndRet);
662 cir::VectorType ty = vTy;
667 case NEON::BI__builtin_neon_splat_lane_v:
668 case NEON::BI__builtin_neon_splat_laneq_v:
669 case NEON::BI__builtin_neon_splatq_lane_v:
670 case NEON::BI__builtin_neon_splatq_laneq_v: {
671 uint64_t numElements = vTy.getSize();
672 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
674 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
679 case NEON::BI__builtin_neon_vpadd_v:
680 case NEON::BI__builtin_neon_vpaddq_v:
681 case NEON::BI__builtin_neon_vabs_v:
682 case NEON::BI__builtin_neon_vabsq_v:
684 std::string(
"unimplemented AArch64 builtin call: ") +
686 return mlir::Value{};
687 case NEON::BI__builtin_neon_vadd_v:
688 case NEON::BI__builtin_neon_vaddq_v: {
689 unsigned numBytes = (builtinID == NEON::BI__builtin_neon_vaddq_v) ? 16 : 8;
690 cir::VectorType byteTy =
697 case NEON::BI__builtin_neon_vaddhn_v: {
700 cir::VectorType srcTy =
710 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
712 loc, wideEltTy, wideEltTy.getWidth() / 2);
713 mlir::Value shiftVec =
721 case NEON::BI__builtin_neon_vsubhn_v: {
724 cir::VectorType srcTy =
734 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
736 loc, wideEltTy, wideEltTy.getWidth() / 2);
737 mlir::Value shiftVec =
745 case NEON::BI__builtin_neon_vcale_v:
746 case NEON::BI__builtin_neon_vcaleq_v:
747 case NEON::BI__builtin_neon_vcalt_v:
748 case NEON::BI__builtin_neon_vcaltq_v:
749 case NEON::BI__builtin_neon_vcage_v:
750 case NEON::BI__builtin_neon_vcageq_v:
751 case NEON::BI__builtin_neon_vcagt_v:
752 case NEON::BI__builtin_neon_vcagtq_v:
754 std::string(
"unimplemented AArch64 builtin call: ") +
756 return mlir::Value{};
757 case NEON::BI__builtin_neon_vceqz_v:
758 case NEON::BI__builtin_neon_vceqzq_v:
760 vTy, cir::CmpOpKind::eq);
761 case NEON::BI__builtin_neon_vcgez_v:
762 case NEON::BI__builtin_neon_vcgezq_v:
763 case NEON::BI__builtin_neon_vclez_v:
764 case NEON::BI__builtin_neon_vclezq_v:
765 case NEON::BI__builtin_neon_vcgtz_v:
766 case NEON::BI__builtin_neon_vcgtzq_v:
767 case NEON::BI__builtin_neon_vcltz_v:
768 case NEON::BI__builtin_neon_vcltzq_v:
769 case NEON::BI__builtin_neon_vclz_v:
770 case NEON::BI__builtin_neon_vclzq_v:
771 case NEON::BI__builtin_neon_vcvt_f32_v:
772 case NEON::BI__builtin_neon_vcvtq_f32_v:
773 case NEON::BI__builtin_neon_vcvt_f16_s16:
774 case NEON::BI__builtin_neon_vcvt_f16_u16:
775 case NEON::BI__builtin_neon_vcvtq_f16_s16:
776 case NEON::BI__builtin_neon_vcvtq_f16_u16:
777 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
778 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
779 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
780 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
782 std::string(
"unimplemented AArch64 builtin call: ") +
784 return mlir::Value{};
785 case NEON::BI__builtin_neon_vcvt_n_f32_v:
786 case NEON::BI__builtin_neon_vcvt_n_f64_v:
787 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
788 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
791 llvm::StringRef llvmIntrName =
793 usgn ? llvmIntrinsic : altLLVMIntrinsic));
795 {vTy, cstIntTy}, ops, llvmIntrName,
798 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
799 case NEON::BI__builtin_neon_vcvt_n_s32_v:
800 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
801 case NEON::BI__builtin_neon_vcvt_n_u32_v:
802 case NEON::BI__builtin_neon_vcvt_n_s64_v:
803 case NEON::BI__builtin_neon_vcvt_n_u64_v:
804 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
805 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
806 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
807 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
808 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
809 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
813 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
816 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
820 case NEON::BI__builtin_neon_vcvt_s32_v:
821 case NEON::BI__builtin_neon_vcvt_u32_v:
822 case NEON::BI__builtin_neon_vcvt_s64_v:
823 case NEON::BI__builtin_neon_vcvt_u64_v:
824 case NEON::BI__builtin_neon_vcvt_s16_f16:
825 case NEON::BI__builtin_neon_vcvt_u16_f16:
826 case NEON::BI__builtin_neon_vcvtq_s32_v:
827 case NEON::BI__builtin_neon_vcvtq_u32_v:
828 case NEON::BI__builtin_neon_vcvtq_s64_v:
829 case NEON::BI__builtin_neon_vcvtq_u64_v:
830 case NEON::BI__builtin_neon_vcvtq_s16_f16:
831 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
841 llvm::StringRef llvmIntrName = usgn ?
"fptoui.sat" :
"fptosi.sat";
843 {ty}, ops, llvmIntrName, vTy, loc);
845 case NEON::BI__builtin_neon_vcvta_s16_f16:
846 case NEON::BI__builtin_neon_vcvta_s32_v:
847 case NEON::BI__builtin_neon_vcvta_s64_v:
848 case NEON::BI__builtin_neon_vcvta_u16_f16:
849 case NEON::BI__builtin_neon_vcvta_u32_v:
850 case NEON::BI__builtin_neon_vcvta_u64_v:
851 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
852 case NEON::BI__builtin_neon_vcvtaq_s32_v:
853 case NEON::BI__builtin_neon_vcvtaq_s64_v:
854 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
855 case NEON::BI__builtin_neon_vcvtaq_u32_v:
856 case NEON::BI__builtin_neon_vcvtaq_u64_v:
857 case NEON::BI__builtin_neon_vcvtn_s16_f16:
858 case NEON::BI__builtin_neon_vcvtn_s32_v:
859 case NEON::BI__builtin_neon_vcvtn_s64_v:
860 case NEON::BI__builtin_neon_vcvtn_u16_f16:
861 case NEON::BI__builtin_neon_vcvtn_u32_v:
862 case NEON::BI__builtin_neon_vcvtn_u64_v:
863 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
864 case NEON::BI__builtin_neon_vcvtnq_s32_v:
865 case NEON::BI__builtin_neon_vcvtnq_s64_v:
866 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
867 case NEON::BI__builtin_neon_vcvtnq_u32_v:
868 case NEON::BI__builtin_neon_vcvtnq_u64_v:
869 case NEON::BI__builtin_neon_vcvtp_s16_f16:
870 case NEON::BI__builtin_neon_vcvtp_s32_v:
871 case NEON::BI__builtin_neon_vcvtp_s64_v:
872 case NEON::BI__builtin_neon_vcvtp_u16_f16:
873 case NEON::BI__builtin_neon_vcvtp_u32_v:
874 case NEON::BI__builtin_neon_vcvtp_u64_v:
875 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
876 case NEON::BI__builtin_neon_vcvtpq_s32_v:
877 case NEON::BI__builtin_neon_vcvtpq_s64_v:
878 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
879 case NEON::BI__builtin_neon_vcvtpq_u32_v:
880 case NEON::BI__builtin_neon_vcvtpq_u64_v:
881 case NEON::BI__builtin_neon_vcvtm_s16_f16:
882 case NEON::BI__builtin_neon_vcvtm_s32_v:
883 case NEON::BI__builtin_neon_vcvtm_s64_v:
884 case NEON::BI__builtin_neon_vcvtm_u16_f16:
885 case NEON::BI__builtin_neon_vcvtm_u32_v:
886 case NEON::BI__builtin_neon_vcvtm_u64_v:
887 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
888 case NEON::BI__builtin_neon_vcvtmq_s32_v:
889 case NEON::BI__builtin_neon_vcvtmq_s64_v:
890 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
891 case NEON::BI__builtin_neon_vcvtmq_u32_v:
892 case NEON::BI__builtin_neon_vcvtmq_u64_v:
893 case NEON::BI__builtin_neon_vcvtx_f32_v:
894 case NEON::BI__builtin_neon_vext_v:
895 case NEON::BI__builtin_neon_vextq_v:
897 std::string(
"unimplemented AArch64 builtin call: ") +
899 return mlir::Value{};
900 case NEON::BI__builtin_neon_vfma_v:
901 case NEON::BI__builtin_neon_vfmaq_v: {
912 case NEON::BI__builtin_neon_vld1_v:
913 case NEON::BI__builtin_neon_vld1q_v:
914 case NEON::BI__builtin_neon_vld1_x2_v:
915 case NEON::BI__builtin_neon_vld1q_x2_v:
916 case NEON::BI__builtin_neon_vld1_x3_v:
917 case NEON::BI__builtin_neon_vld1q_x3_v:
918 case NEON::BI__builtin_neon_vld1_x4_v:
919 case NEON::BI__builtin_neon_vld1q_x4_v:
920 case NEON::BI__builtin_neon_vld2_v:
921 case NEON::BI__builtin_neon_vld2q_v:
922 case NEON::BI__builtin_neon_vld3_v:
923 case NEON::BI__builtin_neon_vld3q_v:
924 case NEON::BI__builtin_neon_vld4_v:
925 case NEON::BI__builtin_neon_vld4q_v:
926 case NEON::BI__builtin_neon_vld2_dup_v:
927 case NEON::BI__builtin_neon_vld2q_dup_v:
928 case NEON::BI__builtin_neon_vld3_dup_v:
929 case NEON::BI__builtin_neon_vld3q_dup_v:
930 case NEON::BI__builtin_neon_vld4_dup_v:
931 case NEON::BI__builtin_neon_vld4q_dup_v:
932 case NEON::BI__builtin_neon_vld1_dup_v:
933 case NEON::BI__builtin_neon_vld1q_dup_v:
934 case NEON::BI__builtin_neon_vld2_lane_v:
935 case NEON::BI__builtin_neon_vld2q_lane_v:
936 case NEON::BI__builtin_neon_vld3_lane_v:
937 case NEON::BI__builtin_neon_vld3q_lane_v:
938 case NEON::BI__builtin_neon_vld4_lane_v:
939 case NEON::BI__builtin_neon_vld4q_lane_v:
941 std::string(
"Reached code-path for ARM builtin call ") +
943 "(ARM builtins are not supported ATM)");
944 return mlir::Value{};
945 case NEON::BI__builtin_neon_vmovl_v: {
946 cir::VectorType dTy =
952 case NEON::BI__builtin_neon_vmovn_v:
953 case NEON::BI__builtin_neon_vmull_v:
954 case NEON::BI__builtin_neon_vpadal_v:
955 case NEON::BI__builtin_neon_vpadalq_v:
957 std::string(
"Reached code-path for ARM builtin call ") +
959 "(ARM builtins are not supported ATM)");
960 return mlir::Value{};
961 case NEON::BI__builtin_neon_vpaddl_v:
962 case NEON::BI__builtin_neon_vpaddlq_v: {
963 llvm::StringRef llvmIntrName =
965 usgn ? llvmIntrinsic : altLLVMIntrinsic));
967 {getNeonPairwiseWidenInputType(vTy, usgn)},
971 case NEON::BI__builtin_neon_vqdmlal_v:
972 case NEON::BI__builtin_neon_vqdmlsl_v:
973 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
974 case NEON::BI__builtin_neon_vqdmulh_lane_v:
975 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
976 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
977 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
978 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
979 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
980 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
981 case NEON::BI__builtin_neon_vqshl_n_v:
982 case NEON::BI__builtin_neon_vqshlq_n_v:
983 case NEON::BI__builtin_neon_vqshlu_n_v:
984 case NEON::BI__builtin_neon_vqshluq_n_v:
985 case NEON::BI__builtin_neon_vrecpe_v:
986 case NEON::BI__builtin_neon_vrecpeq_v:
987 case NEON::BI__builtin_neon_vrsqrte_v:
988 case NEON::BI__builtin_neon_vrsqrteq_v:
990 std::string(
"unimplemented AArch64 builtin call: ") +
992 return mlir::Value{};
993 case NEON::BI__builtin_neon_vrndi_v:
994 case NEON::BI__builtin_neon_vrndiq_v:
997 ops, std::nullopt, ty, loc);
998 case NEON::BI__builtin_neon_vrshr_n_v:
999 case NEON::BI__builtin_neon_vrshrq_n_v: {
1000 llvm::StringRef intrName =
1001 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
1004 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
1005 intrName, ty, loc,
false,
1009 case NEON::BI__builtin_neon_vsha512hq_u64:
1010 case NEON::BI__builtin_neon_vsha512h2q_u64:
1011 case NEON::BI__builtin_neon_vsha512su0q_u64:
1012 case NEON::BI__builtin_neon_vsha512su1q_u64:
1014 std::string(
"unimplemented AArch64 builtin call: ") +
1016 return mlir::Value{};
1017 case NEON::BI__builtin_neon_vshl_n_v:
1018 case NEON::BI__builtin_neon_vshlq_n_v:
1021 case NEON::BI__builtin_neon_vshll_n_v: {
1023 cir::VectorType narrowVecTy =
1027 mlir::Value src = builder.
createBitcast(ops[0], narrowVecTy);
1032 case NEON::BI__builtin_neon_vshrn_n_v:
1034 std::string(
"unimplemented AArch64 builtin call: ") +
1036 return mlir::Value{};
1037 case NEON::BI__builtin_neon_vshr_n_v:
1038 case NEON::BI__builtin_neon_vshrq_n_v:
1040 case NEON::BI__builtin_neon_vst1_v:
1041 case NEON::BI__builtin_neon_vst1q_v:
1042 case NEON::BI__builtin_neon_vst2_v:
1043 case NEON::BI__builtin_neon_vst2q_v:
1044 case NEON::BI__builtin_neon_vst3_v:
1045 case NEON::BI__builtin_neon_vst3q_v:
1046 case NEON::BI__builtin_neon_vst4_v:
1047 case NEON::BI__builtin_neon_vst4q_v:
1048 case NEON::BI__builtin_neon_vst2_lane_v:
1049 case NEON::BI__builtin_neon_vst2q_lane_v:
1050 case NEON::BI__builtin_neon_vst3_lane_v:
1051 case NEON::BI__builtin_neon_vst3q_lane_v:
1052 case NEON::BI__builtin_neon_vst4_lane_v:
1053 case NEON::BI__builtin_neon_vst4q_lane_v:
1054 case NEON::BI__builtin_neon_vsm3partw1q_u32:
1055 case NEON::BI__builtin_neon_vsm3partw2q_u32:
1056 case NEON::BI__builtin_neon_vsm3ss1q_u32:
1057 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
1058 case NEON::BI__builtin_neon_vsm4eq_u32:
1059 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
1060 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
1061 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
1062 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
1063 case NEON::BI__builtin_neon_vst1_x2_v:
1064 case NEON::BI__builtin_neon_vst1q_x2_v:
1065 case NEON::BI__builtin_neon_vst1_x3_v:
1066 case NEON::BI__builtin_neon_vst1q_x3_v:
1067 case NEON::BI__builtin_neon_vst1_x4_v:
1068 case NEON::BI__builtin_neon_vst1q_x4_v:
1069 case NEON::BI__builtin_neon_vtrn_v:
1070 case NEON::BI__builtin_neon_vtrnq_v:
1071 case NEON::BI__builtin_neon_vtst_v:
1072 case NEON::BI__builtin_neon_vtstq_v:
1073 case NEON::BI__builtin_neon_vuzp_v:
1074 case NEON::BI__builtin_neon_vuzpq_v:
1075 case NEON::BI__builtin_neon_vxarq_u64:
1076 case NEON::BI__builtin_neon_vzip_v:
1077 case NEON::BI__builtin_neon_vzipq_v:
1078 case NEON::BI__builtin_neon_vdot_s32:
1079 case NEON::BI__builtin_neon_vdot_u32:
1080 case NEON::BI__builtin_neon_vdotq_s32:
1081 case NEON::BI__builtin_neon_vdotq_u32:
1082 case NEON::BI__builtin_neon_vfmlal_low_f16:
1083 case NEON::BI__builtin_neon_vfmlalq_low_f16:
1084 case NEON::BI__builtin_neon_vfmlsl_low_f16:
1085 case NEON::BI__builtin_neon_vfmlslq_low_f16:
1086 case NEON::BI__builtin_neon_vfmlal_high_f16:
1087 case NEON::BI__builtin_neon_vfmlalq_high_f16:
1088 case NEON::BI__builtin_neon_vfmlsl_high_f16:
1089 case NEON::BI__builtin_neon_vfmlslq_high_f16:
1090 case NEON::BI__builtin_neon_vmmlaq_s32:
1091 case NEON::BI__builtin_neon_vmmlaq_u32:
1093 std::string(
"unimplemented AArch64 builtin call: ") +
1095 return mlir::Value{};
1096 case NEON::BI__builtin_neon_vmul_v:
1097 case NEON::BI__builtin_neon_vmulq_v:
1100 case NEON::BI__builtin_neon_vusmmlaq_s32:
1101 case NEON::BI__builtin_neon_vusdot_s32:
1102 case NEON::BI__builtin_neon_vusdotq_s32:
1103 case NEON::BI__builtin_neon_vbfdot_f32:
1104 case NEON::BI__builtin_neon_vbfdotq_f32:
1105 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
1107 std::string(
"unimplemented AArch64 builtin call: ") +
1109 return mlir::Value{};
1115 switch (builtinID) {
1118 std::string(
"unimplemented AArch64 builtin call: ") +
1121 case NEON::BI__builtin_neon_vrnd32x_f32:
1122 case NEON::BI__builtin_neon_vrnd32xq_f32:
1123 case NEON::BI__builtin_neon_vrnd32x_f64:
1124 case NEON::BI__builtin_neon_vrnd32xq_f64:
1125 case NEON::BI__builtin_neon_vrnd32z_f32:
1126 case NEON::BI__builtin_neon_vrnd32zq_f32:
1127 case NEON::BI__builtin_neon_vrnd32z_f64:
1128 case NEON::BI__builtin_neon_vrnd32zq_f64:
1129 case NEON::BI__builtin_neon_vrnd64x_f32:
1130 case NEON::BI__builtin_neon_vrnd64xq_f32:
1131 case NEON::BI__builtin_neon_vrnd64x_f64:
1132 case NEON::BI__builtin_neon_vrnd64xq_f64:
1133 case NEON::BI__builtin_neon_vrnd64z_f32:
1134 case NEON::BI__builtin_neon_vrnd64zq_f32:
1135 case NEON::BI__builtin_neon_vrnd64z_f64:
1136 case NEON::BI__builtin_neon_vrnd64zq_f64: {
1138 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1139 mlir::Value result =
1141 llvmIntrName, vTy, loc);
1145 case NEON::BI__builtin_neon_vhadd_v:
1146 case NEON::BI__builtin_neon_vhaddq_v:
1147 case NEON::BI__builtin_neon_vhsub_v:
1148 case NEON::BI__builtin_neon_vhsubq_v:
1149 case NEON::BI__builtin_neon_vrhadd_v:
1150 case NEON::BI__builtin_neon_vrhaddq_v:
1151 case NEON::BI__builtin_neon_vshl_v:
1152 case NEON::BI__builtin_neon_vshlq_v:
1153 case NEON::BI__builtin_neon_vraddhn_v:
1154 case NEON::BI__builtin_neon_vrsubhn_v: {
1157 unsigned intrinsic =
1158 ((modifier &
UnsignedAlts) && !usgn) ? altLLVMIntrinsic : llvmIntrinsic;
1159 llvm::StringRef llvmIntrName =
1162 cir::VectorType argTy =
1165 mlir::Value result =
1167 {argTy, argTy}, ops, llvmIntrName,
1584 NEON::BI__builtin_neon_vabd_f16,
1585 NEON::BI__builtin_neon_vabd_v,
1588 NEON::BI__builtin_neon_vabdq_f16,
1589 NEON::BI__builtin_neon_vabdq_v,
1592 NEON::BI__builtin_neon_vabs_f16,
1593 NEON::BI__builtin_neon_vabs_v,
1596 NEON::BI__builtin_neon_vabsq_f16,
1597 NEON::BI__builtin_neon_vabsq_v,
1600 NEON::BI__builtin_neon_vcage_f16,
1601 NEON::BI__builtin_neon_vcage_v,
1604 NEON::BI__builtin_neon_vcageq_f16,
1605 NEON::BI__builtin_neon_vcageq_v,
1608 NEON::BI__builtin_neon_vcagt_f16,
1609 NEON::BI__builtin_neon_vcagt_v,
1612 NEON::BI__builtin_neon_vcagtq_f16,
1613 NEON::BI__builtin_neon_vcagtq_v,
1616 NEON::BI__builtin_neon_vcale_f16,
1617 NEON::BI__builtin_neon_vcale_v,
1620 NEON::BI__builtin_neon_vcaleq_f16,
1621 NEON::BI__builtin_neon_vcaleq_v,
1624 NEON::BI__builtin_neon_vcalt_f16,
1625 NEON::BI__builtin_neon_vcalt_v,
1628 NEON::BI__builtin_neon_vcaltq_f16,
1629 NEON::BI__builtin_neon_vcaltq_v,
1632 NEON::BI__builtin_neon_vceqz_f16,
1633 NEON::BI__builtin_neon_vceqz_v,
1636 NEON::BI__builtin_neon_vceqzq_f16,
1637 NEON::BI__builtin_neon_vceqzq_v,
1640 NEON::BI__builtin_neon_vcgez_f16,
1641 NEON::BI__builtin_neon_vcgez_v,
1644 NEON::BI__builtin_neon_vcgezq_f16,
1645 NEON::BI__builtin_neon_vcgezq_v,
1648 NEON::BI__builtin_neon_vcgtz_f16,
1649 NEON::BI__builtin_neon_vcgtz_v,
1652 NEON::BI__builtin_neon_vcgtzq_f16,
1653 NEON::BI__builtin_neon_vcgtzq_v,
1656 NEON::BI__builtin_neon_vclez_f16,
1657 NEON::BI__builtin_neon_vclez_v,
1660 NEON::BI__builtin_neon_vclezq_f16,
1661 NEON::BI__builtin_neon_vclezq_v,
1664 NEON::BI__builtin_neon_vcltz_f16,
1665 NEON::BI__builtin_neon_vcltz_v,
1668 NEON::BI__builtin_neon_vcltzq_f16,
1669 NEON::BI__builtin_neon_vcltzq_v,
1672 NEON::BI__builtin_neon_vfma_f16,
1673 NEON::BI__builtin_neon_vfma_v,
1676 NEON::BI__builtin_neon_vfma_lane_f16,
1677 NEON::BI__builtin_neon_vfma_lane_v,
1680 NEON::BI__builtin_neon_vfma_laneq_f16,
1681 NEON::BI__builtin_neon_vfma_laneq_v,
1684 NEON::BI__builtin_neon_vfmaq_f16,
1685 NEON::BI__builtin_neon_vfmaq_v,
1688 NEON::BI__builtin_neon_vfmaq_lane_f16,
1689 NEON::BI__builtin_neon_vfmaq_lane_v,
1692 NEON::BI__builtin_neon_vfmaq_laneq_f16,
1693 NEON::BI__builtin_neon_vfmaq_laneq_v,
1696 NEON::BI__builtin_neon_vmax_f16,
1697 NEON::BI__builtin_neon_vmax_v,
1700 NEON::BI__builtin_neon_vmaxnm_f16,
1701 NEON::BI__builtin_neon_vmaxnm_v,
1704 NEON::BI__builtin_neon_vmaxnmq_f16,
1705 NEON::BI__builtin_neon_vmaxnmq_v,
1708 NEON::BI__builtin_neon_vmaxq_f16,
1709 NEON::BI__builtin_neon_vmaxq_v,
1712 NEON::BI__builtin_neon_vmin_f16,
1713 NEON::BI__builtin_neon_vmin_v,
1716 NEON::BI__builtin_neon_vminnm_f16,
1717 NEON::BI__builtin_neon_vminnm_v,
1720 NEON::BI__builtin_neon_vminnmq_f16,
1721 NEON::BI__builtin_neon_vminnmq_v,
1724 NEON::BI__builtin_neon_vminq_f16,
1725 NEON::BI__builtin_neon_vminq_v,
1728 NEON::BI__builtin_neon_vmulx_f16,
1729 NEON::BI__builtin_neon_vmulx_v,
1732 NEON::BI__builtin_neon_vmulxq_f16,
1733 NEON::BI__builtin_neon_vmulxq_v,
1736 NEON::BI__builtin_neon_vpadd_f16,
1737 NEON::BI__builtin_neon_vpadd_v,
1740 NEON::BI__builtin_neon_vpaddq_f16,
1741 NEON::BI__builtin_neon_vpaddq_v,
1744 NEON::BI__builtin_neon_vpmax_f16,
1745 NEON::BI__builtin_neon_vpmax_v,
1748 NEON::BI__builtin_neon_vpmaxnm_f16,
1749 NEON::BI__builtin_neon_vpmaxnm_v,
1752 NEON::BI__builtin_neon_vpmaxnmq_f16,
1753 NEON::BI__builtin_neon_vpmaxnmq_v,
1756 NEON::BI__builtin_neon_vpmaxq_f16,
1757 NEON::BI__builtin_neon_vpmaxq_v,
1760 NEON::BI__builtin_neon_vpmin_f16,
1761 NEON::BI__builtin_neon_vpmin_v,
1764 NEON::BI__builtin_neon_vpminnm_f16,
1765 NEON::BI__builtin_neon_vpminnm_v,
1768 NEON::BI__builtin_neon_vpminnmq_f16,
1769 NEON::BI__builtin_neon_vpminnmq_v,
1772 NEON::BI__builtin_neon_vpminq_f16,
1773 NEON::BI__builtin_neon_vpminq_v,
1776 NEON::BI__builtin_neon_vrecpe_f16,
1777 NEON::BI__builtin_neon_vrecpe_v,
1780 NEON::BI__builtin_neon_vrecpeq_f16,
1781 NEON::BI__builtin_neon_vrecpeq_v,
1784 NEON::BI__builtin_neon_vrecps_f16,
1785 NEON::BI__builtin_neon_vrecps_v,
1788 NEON::BI__builtin_neon_vrecpsq_f16,
1789 NEON::BI__builtin_neon_vrecpsq_v,
1792 NEON::BI__builtin_neon_vrnd_f16,
1793 NEON::BI__builtin_neon_vrnd_v,
1796 NEON::BI__builtin_neon_vrnda_f16,
1797 NEON::BI__builtin_neon_vrnda_v,
1800 NEON::BI__builtin_neon_vrndaq_f16,
1801 NEON::BI__builtin_neon_vrndaq_v,
1804 NEON::BI__builtin_neon_vrndi_f16,
1805 NEON::BI__builtin_neon_vrndi_v,
1808 NEON::BI__builtin_neon_vrndiq_f16,
1809 NEON::BI__builtin_neon_vrndiq_v,
1812 NEON::BI__builtin_neon_vrndm_f16,
1813 NEON::BI__builtin_neon_vrndm_v,
1816 NEON::BI__builtin_neon_vrndmq_f16,
1817 NEON::BI__builtin_neon_vrndmq_v,
1820 NEON::BI__builtin_neon_vrndn_f16,
1821 NEON::BI__builtin_neon_vrndn_v,
1824 NEON::BI__builtin_neon_vrndnq_f16,
1825 NEON::BI__builtin_neon_vrndnq_v,
1828 NEON::BI__builtin_neon_vrndp_f16,
1829 NEON::BI__builtin_neon_vrndp_v,
1832 NEON::BI__builtin_neon_vrndpq_f16,
1833 NEON::BI__builtin_neon_vrndpq_v,
1836 NEON::BI__builtin_neon_vrndq_f16,
1837 NEON::BI__builtin_neon_vrndq_v,
1840 NEON::BI__builtin_neon_vrndx_f16,
1841 NEON::BI__builtin_neon_vrndx_v,
1844 NEON::BI__builtin_neon_vrndxq_f16,
1845 NEON::BI__builtin_neon_vrndxq_v,
1848 NEON::BI__builtin_neon_vrsqrte_f16,
1849 NEON::BI__builtin_neon_vrsqrte_v,
1852 NEON::BI__builtin_neon_vrsqrteq_f16,
1853 NEON::BI__builtin_neon_vrsqrteq_v,
1856 NEON::BI__builtin_neon_vrsqrts_f16,
1857 NEON::BI__builtin_neon_vrsqrts_v,
1860 NEON::BI__builtin_neon_vrsqrtsq_f16,
1861 NEON::BI__builtin_neon_vrsqrtsq_v,
1864 NEON::BI__builtin_neon_vsqrt_f16,
1865 NEON::BI__builtin_neon_vsqrt_v,
1868 NEON::BI__builtin_neon_vsqrtq_f16,
1869 NEON::BI__builtin_neon_vsqrtq_v,
1874 {NEON::BI__builtin_neon_vldap1_lane_u64,
1875 NEON::BI__builtin_neon_vldap1_lane_s64},
1876 {NEON::BI__builtin_neon_vldap1_lane_f64,
1877 NEON::BI__builtin_neon_vldap1_lane_s64},
1878 {NEON::BI__builtin_neon_vldap1_lane_p64,
1879 NEON::BI__builtin_neon_vldap1_lane_s64},
1880 {NEON::BI__builtin_neon_vldap1q_lane_u64,
1881 NEON::BI__builtin_neon_vldap1q_lane_s64},
1882 {NEON::BI__builtin_neon_vldap1q_lane_f64,
1883 NEON::BI__builtin_neon_vldap1q_lane_s64},
1884 {NEON::BI__builtin_neon_vldap1q_lane_p64,
1885 NEON::BI__builtin_neon_vldap1q_lane_s64},
1886 {NEON::BI__builtin_neon_vstl1_lane_u64,
1887 NEON::BI__builtin_neon_vstl1_lane_s64},
1888 {NEON::BI__builtin_neon_vstl1_lane_f64,
1889 NEON::BI__builtin_neon_vstl1_lane_s64},
1890 {NEON::BI__builtin_neon_vstl1_lane_p64,
1891 NEON::BI__builtin_neon_vstl1_lane_s64},
1892 {NEON::BI__builtin_neon_vstl1q_lane_u64,
1893 NEON::BI__builtin_neon_vstl1q_lane_s64},
1894 {NEON::BI__builtin_neon_vstl1q_lane_f64,
1895 NEON::BI__builtin_neon_vstl1q_lane_s64},
1896 {NEON::BI__builtin_neon_vstl1q_lane_p64,
1897 NEON::BI__builtin_neon_vstl1q_lane_s64},
1903 llvm::Triple::ArchType arch) {
1912 if (builtinID == Builtin::BI__builtin_cpu_supports) {
1913 cgm.errorNYI(
expr->getSourceRange(),
1914 std::string(
"unimplemented AArch64 builtin call: ") +
1915 getContext().BuiltinInfo.getName(builtinID));
1916 return mlir::Value{};
1919 switch (builtinID) {
1922 case clang::AArch64::BI__builtin_arm_nop:
1923 case clang::AArch64::BI__builtin_arm_yield:
1924 case clang::AArch64::BI__yield:
1925 case clang::AArch64::BI__builtin_arm_wfe:
1926 case clang::AArch64::BI__wfe:
1927 case clang::AArch64::BI__builtin_arm_wfi:
1928 case clang::AArch64::BI__wfi:
1929 case clang::AArch64::BI__builtin_arm_sev:
1930 case clang::AArch64::BI__sev:
1931 case clang::AArch64::BI__builtin_arm_sevl:
1932 case clang::AArch64::BI__sevl:
1933 cgm.errorNYI(
expr->getSourceRange(),
1934 std::string(
"unimplemented AArch64 builtin call: ") +
1935 getContext().BuiltinInfo.getName(builtinID));
1936 return mlir::Value{};
1939 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
1940 cgm.errorNYI(
expr->getSourceRange(),
1941 std::string(
"unimplemented AArch64 builtin call: ") +
1942 getContext().BuiltinInfo.getName(builtinID));
1943 return mlir::Value{};
1946 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
1947 cgm.errorNYI(
expr->getSourceRange(),
1948 std::string(
"unimplemented AArch64 builtin call: ") +
1949 getContext().BuiltinInfo.getName(builtinID));
1950 return mlir::Value{};
1953 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
1954 cgm.errorNYI(
expr->getSourceRange(),
1955 std::string(
"unimplemented AArch64 builtin call: ") +
1956 getContext().BuiltinInfo.getName(builtinID));
1957 return mlir::Value{};
1959 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
1960 cgm.errorNYI(
expr->getSourceRange(),
1961 std::string(
"unimplemented AArch64 builtin call: ") +
1962 getContext().BuiltinInfo.getName(builtinID));
1963 return mlir::Value{};
1966 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
1967 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
1968 cgm.errorNYI(
expr->getSourceRange(),
1969 std::string(
"unimplemented AArch64 builtin call: ") +
1970 getContext().BuiltinInfo.getName(builtinID));
1971 return mlir::Value{};
1974 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
1975 cgm.errorNYI(
expr->getSourceRange(),
1976 std::string(
"unimplemented AArch64 builtin call: ") +
1977 getContext().BuiltinInfo.getName(builtinID));
1978 return mlir::Value{};
1980 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
1981 cgm.errorNYI(
expr->getSourceRange(),
1982 std::string(
"unimplemented AArch64 builtin call: ") +
1983 getContext().BuiltinInfo.getName(builtinID));
1984 return mlir::Value{};
1987 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
1988 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
1989 cgm.errorNYI(
expr->getSourceRange(),
1990 std::string(
"unimplemented AArch64 builtin call: ") +
1991 getContext().BuiltinInfo.getName(builtinID));
1992 return mlir::Value{};
1995 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
1996 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
1997 cgm.errorNYI(
expr->getSourceRange(),
1998 std::string(
"unimplemented AArch64 builtin call: ") +
1999 getContext().BuiltinInfo.getName(builtinID));
2000 return mlir::Value{};
2003 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
2004 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
2005 cgm.errorNYI(
expr->getSourceRange(),
2006 std::string(
"unimplemented AArch64 builtin call: ") +
2007 getContext().BuiltinInfo.getName(builtinID));
2008 return mlir::Value{};
2011 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
2012 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
2013 cgm.errorNYI(
expr->getSourceRange(),
2014 std::string(
"unimplemented AArch64 builtin call: ") +
2015 getContext().BuiltinInfo.getName(builtinID));
2016 return mlir::Value{};
2019 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
2020 cgm.errorNYI(
expr->getSourceRange(),
2021 std::string(
"unimplemented AArch64 builtin call: ") +
2022 getContext().BuiltinInfo.getName(builtinID));
2023 return mlir::Value{};
2026 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
2027 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
2028 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
2029 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2030 cgm.errorNYI(
expr->getSourceRange(),
2031 std::string(
"unimplemented AArch64 builtin call: ") +
2032 getContext().BuiltinInfo.getName(builtinID));
2033 return mlir::Value{};
2036 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2037 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
2038 cgm.errorNYI(
expr->getSourceRange(),
2039 std::string(
"unimplemented AArch64 builtin call: ") +
2040 getContext().BuiltinInfo.getName(builtinID));
2041 return mlir::Value{};
2044 if (builtinID == clang::AArch64::BI__clear_cache) {
2045 cgm.errorNYI(
expr->getSourceRange(),
2046 std::string(
"unimplemented AArch64 builtin call: ") +
2047 getContext().BuiltinInfo.getName(builtinID));
2048 return mlir::Value{};
2051 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2052 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2054 cgm.errorNYI(
expr->getSourceRange(),
2055 std::string(
"unimplemented AArch64 builtin call: ") +
2056 getContext().BuiltinInfo.getName(builtinID));
2057 return mlir::Value{};
2059 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2060 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2061 cgm.errorNYI(
expr->getSourceRange(),
2062 std::string(
"unimplemented AArch64 builtin call: ") +
2063 getContext().BuiltinInfo.getName(builtinID));
2064 return mlir::Value{};
2067 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2068 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
2070 cgm.errorNYI(
expr->getSourceRange(),
2071 std::string(
"unimplemented AArch64 builtin call: ") +
2072 getContext().BuiltinInfo.getName(builtinID));
2073 return mlir::Value{};
2076 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2077 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
2078 cgm.errorNYI(
expr->getSourceRange(),
2079 std::string(
"unimplemented AArch64 builtin call: ") +
2080 getContext().BuiltinInfo.getName(builtinID));
2081 return mlir::Value{};
2084 if (builtinID == clang::AArch64::BI__getReg ||
2085 builtinID == clang::AArch64::BI__setReg ||
2086 builtinID == clang::AArch64::BI__getRegFp ||
2087 builtinID == clang::AArch64::BI__setRegFp) {
2088 cgm.errorNYI(
expr->getSourceRange(),
2089 std::string(
"unimplemented AArch64 builtin call: ") +
2090 getContext().BuiltinInfo.getName(builtinID));
2091 return mlir::Value{};
2094 if (builtinID == clang::AArch64::BI__break) {
2095 cgm.errorNYI(
expr->getSourceRange(),
2096 std::string(
"unimplemented AArch64 builtin call: ") +
2097 getContext().BuiltinInfo.getName(builtinID));
2098 return mlir::Value{};
2101 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2102 cgm.errorNYI(
expr->getSourceRange(),
2103 std::string(
"unimplemented AArch64 builtin call: ") +
2104 getContext().BuiltinInfo.getName(builtinID));
2105 return mlir::Value{};
2108 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2109 cgm.errorNYI(
expr->getSourceRange(),
2110 std::string(
"unimplemented AArch64 builtin call: ") +
2111 getContext().BuiltinInfo.getName(builtinID));
2112 return mlir::Value{};
2116 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2117 switch (builtinID) {
2118 case clang::AArch64::BI__builtin_arm_crc32b:
2119 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2121 case clang::AArch64::BI__builtin_arm_crc32cb:
2122 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2124 case clang::AArch64::BI__builtin_arm_crc32h:
2125 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2127 case clang::AArch64::BI__builtin_arm_crc32ch:
2128 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2130 case clang::AArch64::BI__builtin_arm_crc32w:
2131 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2133 case clang::AArch64::BI__builtin_arm_crc32cw:
2134 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2136 case clang::AArch64::BI__builtin_arm_crc32d:
2137 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2139 case clang::AArch64::BI__builtin_arm_crc32cd:
2140 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2144 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2145 cgm.errorNYI(
expr->getSourceRange(),
2146 std::string(
"unimplemented AArch64 builtin call: ") +
2147 getContext().BuiltinInfo.getName(builtinID));
2148 return mlir::Value{};
2152 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2153 cgm.errorNYI(
expr->getSourceRange(),
2154 std::string(
"unimplemented AArch64 builtin call: ") +
2155 getContext().BuiltinInfo.getName(builtinID));
2156 return mlir::Value{};
2160 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2161 switch (builtinID) {
2162 case clang::AArch64::BI__builtin_arm_irg:
2163 mteIntrinsicID = Intrinsic::aarch64_irg;
2165 case clang::AArch64::BI__builtin_arm_addg:
2166 mteIntrinsicID = Intrinsic::aarch64_addg;
2168 case clang::AArch64::BI__builtin_arm_gmi:
2169 mteIntrinsicID = Intrinsic::aarch64_gmi;
2171 case clang::AArch64::BI__builtin_arm_ldg:
2172 mteIntrinsicID = Intrinsic::aarch64_ldg;
2174 case clang::AArch64::BI__builtin_arm_stg:
2175 mteIntrinsicID = Intrinsic::aarch64_stg;
2177 case clang::AArch64::BI__builtin_arm_subp:
2178 mteIntrinsicID = Intrinsic::aarch64_subp;
2182 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
2183 cgm.errorNYI(
expr->getSourceRange(),
2184 std::string(
"unimplemented AArch64 builtin call: ") +
2185 getContext().BuiltinInfo.getName(builtinID));
2186 return mlir::Value{};
2189 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
2190 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2191 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2192 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2193 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2194 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2195 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2196 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2197 cgm.errorNYI(
expr->getSourceRange(),
2198 std::string(
"unimplemented AArch64 builtin call: ") +
2199 getContext().BuiltinInfo.getName(builtinID));
2200 return mlir::Value{};
2203 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2204 builtinID == clang::AArch64::BI_WriteStatusReg ||
2205 builtinID == clang::AArch64::BI__sys) {
2206 cgm.errorNYI(
expr->getSourceRange(),
2207 std::string(
"unimplemented AArch64 builtin call: ") +
2208 getContext().BuiltinInfo.getName(builtinID));
2209 return mlir::Value{};
2212 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
2213 cgm.errorNYI(
expr->getSourceRange(),
2214 std::string(
"unimplemented AArch64 builtin call: ") +
2215 getContext().BuiltinInfo.getName(builtinID));
2216 return mlir::Value{};
2219 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2220 cgm.errorNYI(
expr->getSourceRange(),
2221 std::string(
"unimplemented AArch64 builtin call: ") +
2222 getContext().BuiltinInfo.getName(builtinID));
2223 return mlir::Value{};
2226 if (builtinID == clang::AArch64::BI__mulh ||
2227 builtinID == clang::AArch64::BI__umulh) {
2228 cgm.errorNYI(
expr->getSourceRange(),
2229 std::string(
"unimplemented AArch64 builtin call: ") +
2230 getContext().BuiltinInfo.getName(builtinID));
2231 return mlir::Value{};
2234 if (builtinID == AArch64::BI__writex18byte ||
2235 builtinID == AArch64::BI__writex18word ||
2236 builtinID == AArch64::BI__writex18dword ||
2237 builtinID == AArch64::BI__writex18qword) {
2238 cgm.errorNYI(
expr->getSourceRange(),
2239 std::string(
"unimplemented AArch64 builtin call: ") +
2240 getContext().BuiltinInfo.getName(builtinID));
2241 return mlir::Value{};
2244 if (builtinID == AArch64::BI__readx18byte ||
2245 builtinID == AArch64::BI__readx18word ||
2246 builtinID == AArch64::BI__readx18dword ||
2247 builtinID == AArch64::BI__readx18qword) {
2248 cgm.errorNYI(
expr->getSourceRange(),
2249 std::string(
"unimplemented AArch64 builtin call: ") +
2250 getContext().BuiltinInfo.getName(builtinID));
2251 return mlir::Value{};
2254 if (builtinID == AArch64::BI__addx18byte ||
2255 builtinID == AArch64::BI__addx18word ||
2256 builtinID == AArch64::BI__addx18dword ||
2257 builtinID == AArch64::BI__addx18qword ||
2258 builtinID == AArch64::BI__incx18byte ||
2259 builtinID == AArch64::BI__incx18word ||
2260 builtinID == AArch64::BI__incx18dword ||
2261 builtinID == AArch64::BI__incx18qword) {
2262 cgm.errorNYI(
expr->getSourceRange(),
2263 std::string(
"unimplemented AArch64 builtin call: ") +
2264 getContext().BuiltinInfo.getName(builtinID));
2265 return mlir::Value{};
2268 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2269 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2270 builtinID == AArch64::BI_CopyInt32FromFloat ||
2271 builtinID == AArch64::BI_CopyInt64FromDouble) {
2272 cgm.errorNYI(
expr->getSourceRange(),
2273 std::string(
"unimplemented AArch64 builtin call: ") +
2274 getContext().BuiltinInfo.getName(builtinID));
2275 return mlir::Value{};
2278 if (builtinID == AArch64::BI_CountLeadingOnes ||
2279 builtinID == AArch64::BI_CountLeadingOnes64 ||
2280 builtinID == AArch64::BI_CountLeadingZeros ||
2281 builtinID == AArch64::BI_CountLeadingZeros64) {
2282 cgm.errorNYI(
expr->getSourceRange(),
2283 std::string(
"unimplemented AArch64 builtin call: ") +
2284 getContext().BuiltinInfo.getName(builtinID));
2285 return mlir::Value{};
2288 if (builtinID == AArch64::BI_CountLeadingSigns ||
2289 builtinID == AArch64::BI_CountLeadingSigns64) {
2290 cgm.errorNYI(
expr->getSourceRange(),
2291 std::string(
"unimplemented AArch64 builtin call: ") +
2292 getContext().BuiltinInfo.getName(builtinID));
2293 return mlir::Value{};
2296 if (builtinID == AArch64::BI_CountOneBits ||
2297 builtinID == AArch64::BI_CountOneBits64 ||
2298 builtinID == AArch64::BI_CountTrailingZeros ||
2299 builtinID == AArch64::BI_CountTrailingZeros64) {
2300 cgm.errorNYI(
expr->getSourceRange(),
2301 std::string(
"unimplemented AArch64 builtin call: ") +
2302 getContext().BuiltinInfo.getName(builtinID));
2303 return mlir::Value{};
2306 if (builtinID == AArch64::BI__prefetch ||
2307 builtinID == AArch64::BI__prefetch2) {
2308 cgm.errorNYI(
expr->getSourceRange(),
2309 std::string(
"unimplemented AArch64 builtin call: ") +
2310 getContext().BuiltinInfo.getName(builtinID));
2311 return mlir::Value{};
2314 if (builtinID == AArch64::BI__hlt) {
2315 cgm.errorNYI(
expr->getSourceRange(),
2316 std::string(
"unimplemented AArch64 builtin call: ") +
2317 getContext().BuiltinInfo.getName(builtinID));
2318 return mlir::Value{};
2321 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2322 cgm.errorNYI(
expr->getSourceRange(),
2323 std::string(
"unimplemented AArch64 builtin call: ") +
2324 getContext().BuiltinInfo.getName(builtinID));
2325 return mlir::Value{};
2334 return p.first == builtinID;
2337 builtinID = it->second;
2342 unsigned iceArguments = 0;
2351 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2352 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2354 switch (builtinID) {
2355 case NEON::BI__builtin_neon_vld1_v:
2356 case NEON::BI__builtin_neon_vld1q_v:
2357 case NEON::BI__builtin_neon_vld1_dup_v:
2358 case NEON::BI__builtin_neon_vld1q_dup_v:
2359 case NEON::BI__builtin_neon_vld1_lane_v:
2360 case NEON::BI__builtin_neon_vld1q_lane_v:
2361 case NEON::BI__builtin_neon_vst1_v:
2362 case NEON::BI__builtin_neon_vst1q_v:
2363 case NEON::BI__builtin_neon_vst1_lane_v:
2364 case NEON::BI__builtin_neon_vst1q_lane_v:
2365 case NEON::BI__builtin_neon_vldap1_lane_s64:
2366 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2367 case NEON::BI__builtin_neon_vstl1_lane_s64:
2368 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2372 expr->getSourceRange(),
2373 std::string(
"unimplemented AArch64 builtin argument handling ") +
2374 getContext().BuiltinInfo.getName(builtinID));
2393 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2397 if (std::optional<llvm::APSInt> result =
2401 bool usgn =
type.isUnsigned();
2403 mlir::Location loc =
getLoc(
expr->getExprLoc());
2417 switch (builtinID) {
2420 case NEON::BI__builtin_neon_vabsh_f16: {
2421 return cir::FAbsOp::create(builder, loc, ops);
2423 case NEON::BI__builtin_neon_vaddq_p128: {
2424 cir::VectorType byteTy = cir::VectorType::get(builder.getUInt8Ty(), 16);
2425 ops[0] = builder.createBitcast(ops[0], byteTy);
2426 ops[1] = builder.createBitcast(ops[1], byteTy);
2427 mlir::Value result = builder.createXor(loc, ops[0], ops[1]);
2430 case NEON::BI__builtin_neon_vldrq_p128:
2431 case NEON::BI__builtin_neon_vstrq_p128:
2432 case NEON::BI__builtin_neon_vcvts_f32_u32:
2433 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2434 case NEON::BI__builtin_neon_vcvts_f32_s32:
2435 case NEON::BI__builtin_neon_vcvtd_f64_s64:
2436 case NEON::BI__builtin_neon_vcvth_f16_u16:
2437 case NEON::BI__builtin_neon_vcvth_f16_u32:
2438 case NEON::BI__builtin_neon_vcvth_f16_u64:
2439 case NEON::BI__builtin_neon_vcvth_f16_s16:
2440 case NEON::BI__builtin_neon_vcvth_f16_s32:
2441 case NEON::BI__builtin_neon_vcvth_f16_s64:
2442 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2443 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2444 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2445 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2446 case NEON::BI__builtin_neon_vcvth_u16_f16:
2447 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2448 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2449 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2450 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2451 case NEON::BI__builtin_neon_vcvth_s16_f16:
2452 case NEON::BI__builtin_neon_vcaleh_f16:
2453 case NEON::BI__builtin_neon_vcalth_f16:
2454 case NEON::BI__builtin_neon_vcageh_f16:
2455 case NEON::BI__builtin_neon_vcagth_f16:
2456 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2457 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2458 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2459 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2460 case NEON::BI__builtin_neon_vpaddd_s64:
2461 case NEON::BI__builtin_neon_vpaddd_f64:
2462 case NEON::BI__builtin_neon_vpadds_f32:
2463 cgm.errorNYI(
expr->getSourceRange(),
2464 std::string(
"unimplemented AArch64 builtin call: ") +
2465 getContext().BuiltinInfo.getName(builtinID));
2466 return mlir::Value{};
2467 case NEON::BI__builtin_neon_vceqzd_s64:
2468 case NEON::BI__builtin_neon_vceqzd_f64:
2469 case NEON::BI__builtin_neon_vceqzs_f32:
2470 case NEON::BI__builtin_neon_vceqzh_f16:
2472 *
this, builder, loc, ops[0],
2474 case NEON::BI__builtin_neon_vcgezd_s64:
2475 case NEON::BI__builtin_neon_vcgezd_f64:
2476 case NEON::BI__builtin_neon_vcgezs_f32:
2477 case NEON::BI__builtin_neon_vcgezh_f16:
2478 case NEON::BI__builtin_neon_vclezd_s64:
2479 case NEON::BI__builtin_neon_vclezd_f64:
2480 case NEON::BI__builtin_neon_vclezs_f32:
2481 case NEON::BI__builtin_neon_vclezh_f16:
2482 case NEON::BI__builtin_neon_vcgtzd_s64:
2483 case NEON::BI__builtin_neon_vcgtzd_f64:
2484 case NEON::BI__builtin_neon_vcgtzs_f32:
2485 case NEON::BI__builtin_neon_vcgtzh_f16:
2486 case NEON::BI__builtin_neon_vcltzd_s64:
2487 case NEON::BI__builtin_neon_vcltzd_f64:
2488 case NEON::BI__builtin_neon_vcltzs_f32:
2489 case NEON::BI__builtin_neon_vcltzh_f16:
2490 case NEON::BI__builtin_neon_vceqzd_u64: {
2492 *
this, builder, loc, ops[0],
2495 case NEON::BI__builtin_neon_vceqd_f64:
2496 case NEON::BI__builtin_neon_vcled_f64:
2497 case NEON::BI__builtin_neon_vcltd_f64:
2498 case NEON::BI__builtin_neon_vcged_f64:
2499 case NEON::BI__builtin_neon_vcgtd_f64:
2500 case NEON::BI__builtin_neon_vceqs_f32:
2501 case NEON::BI__builtin_neon_vcles_f32:
2502 case NEON::BI__builtin_neon_vclts_f32:
2503 case NEON::BI__builtin_neon_vcges_f32:
2504 case NEON::BI__builtin_neon_vcgts_f32:
2505 case NEON::BI__builtin_neon_vceqh_f16:
2506 case NEON::BI__builtin_neon_vcleh_f16:
2507 case NEON::BI__builtin_neon_vclth_f16:
2508 case NEON::BI__builtin_neon_vcgeh_f16:
2509 case NEON::BI__builtin_neon_vcgth_f16:
2510 case NEON::BI__builtin_neon_vceqd_s64:
2511 case NEON::BI__builtin_neon_vceqd_u64:
2512 case NEON::BI__builtin_neon_vcgtd_s64:
2513 case NEON::BI__builtin_neon_vcgtd_u64:
2514 case NEON::BI__builtin_neon_vcltd_s64:
2515 case NEON::BI__builtin_neon_vcltd_u64:
2516 case NEON::BI__builtin_neon_vcged_u64:
2517 case NEON::BI__builtin_neon_vcged_s64:
2518 case NEON::BI__builtin_neon_vcled_u64:
2519 case NEON::BI__builtin_neon_vcled_s64:
2520 cgm.errorNYI(
expr->getSourceRange(),
2521 std::string(
"unimplemented AArch64 builtin call: ") +
2522 getContext().BuiltinInfo.getName(builtinID));
2523 return mlir::Value{};
2524 case NEON::BI__builtin_neon_vnegd_s64: {
2525 return builder.createNeg(loc, ops[0]);
2527 case NEON::BI__builtin_neon_vnegh_f16: {
2528 return builder.createFNeg(loc, ops[0]);
2530 case NEON::BI__builtin_neon_vtstd_s64:
2531 case NEON::BI__builtin_neon_vtstd_u64:
2532 case NEON::BI__builtin_neon_vset_lane_i8:
2533 case NEON::BI__builtin_neon_vset_lane_i16:
2534 case NEON::BI__builtin_neon_vset_lane_i32:
2535 case NEON::BI__builtin_neon_vset_lane_i64:
2536 case NEON::BI__builtin_neon_vset_lane_bf16:
2537 case NEON::BI__builtin_neon_vset_lane_f32:
2538 case NEON::BI__builtin_neon_vsetq_lane_i8:
2539 case NEON::BI__builtin_neon_vsetq_lane_i16:
2540 case NEON::BI__builtin_neon_vsetq_lane_i32:
2541 case NEON::BI__builtin_neon_vsetq_lane_i64:
2542 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2543 case NEON::BI__builtin_neon_vsetq_lane_f32:
2544 case NEON::BI__builtin_neon_vset_lane_f64:
2545 case NEON::BI__builtin_neon_vset_lane_mf8:
2546 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2547 case NEON::BI__builtin_neon_vsetq_lane_f64:
2548 cgm.errorNYI(
expr->getSourceRange(),
2549 std::string(
"unimplemented AArch64 builtin call: ") +
2550 getContext().BuiltinInfo.getName(builtinID));
2551 return mlir::Value{};
2553 case NEON::BI__builtin_neon_vget_lane_i8:
2554 case NEON::BI__builtin_neon_vdupb_lane_i8:
2555 case NEON::BI__builtin_neon_vgetq_lane_i8:
2556 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2557 case NEON::BI__builtin_neon_vget_lane_mf8:
2558 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2559 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2560 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2561 case NEON::BI__builtin_neon_vget_lane_i16:
2562 case NEON::BI__builtin_neon_vduph_lane_i16:
2563 case NEON::BI__builtin_neon_vgetq_lane_i16:
2564 case NEON::BI__builtin_neon_vduph_laneq_i16:
2565 case NEON::BI__builtin_neon_vget_lane_i32:
2566 case NEON::BI__builtin_neon_vdups_lane_i32:
2567 case NEON::BI__builtin_neon_vdups_lane_f32:
2568 case NEON::BI__builtin_neon_vgetq_lane_i32:
2569 case NEON::BI__builtin_neon_vdups_laneq_i32:
2570 case NEON::BI__builtin_neon_vget_lane_i64:
2571 case NEON::BI__builtin_neon_vdupd_lane_i64:
2572 case NEON::BI__builtin_neon_vdupd_lane_f64:
2573 case NEON::BI__builtin_neon_vgetq_lane_i64:
2574 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2575 case NEON::BI__builtin_neon_vget_lane_f32:
2576 case NEON::BI__builtin_neon_vget_lane_f64:
2577 case NEON::BI__builtin_neon_vgetq_lane_f32:
2578 case NEON::BI__builtin_neon_vdups_laneq_f32:
2579 case NEON::BI__builtin_neon_vgetq_lane_f64:
2580 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2581 return cir::VecExtractOp::create(builder, loc, ops[0],
2583 case NEON::BI__builtin_neon_vaddh_f16:
2584 return builder.createFAdd(loc, ops[0], ops[1]);
2585 case NEON::BI__builtin_neon_vsubh_f16:
2586 return builder.createFSub(loc, ops[0], ops[1]);
2587 case NEON::BI__builtin_neon_vmulh_f16:
2588 return builder.createFMul(loc, ops[0], ops[1]);
2589 case NEON::BI__builtin_neon_vdivh_f16:
2590 return builder.createFDiv(loc, ops[0], ops[1]);
2591 case NEON::BI__builtin_neon_vfmah_f16:
2593 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2597 case NEON::BI__builtin_neon_vfmsh_f16:
2599 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2600 ops[0] = builder.createFNeg(loc, ops[0]);
2603 case NEON::BI__builtin_neon_vaddd_s64:
2604 case NEON::BI__builtin_neon_vaddd_u64:
2605 return builder.createAdd(loc, ops[0], ops[1]);
2606 case NEON::BI__builtin_neon_vsubd_s64:
2607 case NEON::BI__builtin_neon_vsubd_u64:
2608 return builder.createSub(loc, ops[0], ops[1]);
2609 case NEON::BI__builtin_neon_vqdmlalh_s16:
2610 case NEON::BI__builtin_neon_vqdmlslh_s16:
2611 cgm.errorNYI(
expr->getSourceRange(),
2612 std::string(
"unimplemented AArch64 builtin call: ") +
2613 getContext().BuiltinInfo.getName(builtinID));
2614 return mlir::Value{};
2615 case NEON::BI__builtin_neon_vqshlud_n_s64: {
2616 cir::IntType int64Type = builder.getSInt64Ty();
2622 case NEON::BI__builtin_neon_vqshld_n_u64:
2623 case NEON::BI__builtin_neon_vqshld_n_s64: {
2624 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2625 ? builder.getUInt64Ty()
2626 : builder.getSInt64Ty();
2627 llvm::StringRef intrinsicName =
2628 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
2629 :
"aarch64.neon.sqshl";
2634 case NEON::BI__builtin_neon_vrshrd_n_u64:
2635 case NEON::BI__builtin_neon_vrshrd_n_s64: {
2636 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
2637 ?
"aarch64.neon.srshl"
2638 :
"aarch64.neon.urshl";
2639 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2640 ? builder.getUInt64Ty()
2641 : builder.getSInt64Ty();
2645 ops[1] = builder.getSInt64(sv, loc);
2646 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
2647 intrName, int64Ty, loc);
2649 case NEON::BI__builtin_neon_vrsrad_n_u64:
2650 case NEON::BI__builtin_neon_vrsrad_n_s64: {
2651 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2652 ? builder.getUInt64Ty()
2653 : builder.getSInt64Ty();
2654 ops[2] = builder.createNeg(loc, ops[2]);
2655 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2656 ?
"aarch64.neon.urshl"
2657 :
"aarch64.neon.srshl";
2660 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
2661 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
2662 return builder.createAdd(loc, ops[0],
2663 builder.createBitcast(ops[1], int64Type));
2665 case NEON::BI__builtin_neon_vshld_n_s64:
2666 case NEON::BI__builtin_neon_vshld_n_u64: {
2668 std::optional<llvm::APSInt> amt =
2670 assert(amt &&
"Expected argument to be a constant");
2671 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
2673 case NEON::BI__builtin_neon_vshrd_n_s64: {
2674 std::optional<llvm::APSInt> amt =
2676 assert(amt &&
"Expected argument to be a constant");
2677 return builder.createShiftRight(
2678 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
2680 case NEON::BI__builtin_neon_vshrd_n_u64: {
2681 std::optional<llvm::APSInt> amt =
2683 assert(amt &&
"Expected argument to be a constant");
2684 uint64_t shiftAmt = amt->getZExtValue();
2687 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
2688 return builder.createShiftRight(loc, ops[0], shiftAmt);
2690 case NEON::BI__builtin_neon_vsrad_n_s64: {
2691 std::optional<llvm::APSInt> amt =
2693 assert(amt &&
"Expected argument to be a constant");
2695 std::min(
static_cast<uint64_t
>(63), amt->getZExtValue());
2696 mlir::Value shifted =
2697 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2698 return builder.createAdd(loc, ops[0], shifted);
2700 case NEON::BI__builtin_neon_vsrad_n_u64: {
2701 std::optional<llvm::APSInt> amt =
2703 assert(amt &&
"Expected argument to be a constant");
2704 uint64_t shiftAmt = amt->getZExtValue();
2708 mlir::Value shifted =
2709 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2710 return builder.createAdd(loc, ops[0], shifted);
2712 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
2713 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
2714 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
2715 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
2716 case NEON::BI__builtin_neon_vqdmlals_s32:
2717 case NEON::BI__builtin_neon_vqdmlsls_s32:
2718 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
2719 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
2720 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
2721 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
2722 cgm.errorNYI(
expr->getSourceRange(),
2723 std::string(
"unimplemented AArch64 builtin call: ") +
2724 getContext().BuiltinInfo.getName(builtinID));
2725 return mlir::Value{};
2727 case NEON::BI__builtin_neon_vget_lane_bf16:
2728 case NEON::BI__builtin_neon_vduph_lane_bf16:
2729 case NEON::BI__builtin_neon_vduph_lane_f16:
2730 case NEON::BI__builtin_neon_vgetq_lane_bf16:
2731 case NEON::BI__builtin_neon_vduph_laneq_bf16:
2732 case NEON::BI__builtin_neon_vduph_laneq_f16: {
2733 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
2735 case NEON::BI__builtin_neon_vcvt_bf16_f32:
2736 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
2737 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
2738 case NEON::BI__builtin_neon_vcvt_f16_f32:
2739 case NEON::BI__builtin_neon_vcvt_f32_f16:
2740 case clang::AArch64::BI_InterlockedAdd:
2741 case clang::AArch64::BI_InterlockedAdd_acq:
2742 case clang::AArch64::BI_InterlockedAdd_rel:
2743 case clang::AArch64::BI_InterlockedAdd_nf:
2744 case clang::AArch64::BI_InterlockedAdd64:
2745 case clang::AArch64::BI_InterlockedAdd64_acq:
2746 case clang::AArch64::BI_InterlockedAdd64_rel:
2747 case clang::AArch64::BI_InterlockedAdd64_nf:
2748 cgm.errorNYI(
expr->getSourceRange(),
2749 std::string(
"unimplemented AArch64 builtin call: ") +
2750 getContext().BuiltinInfo.getName(builtinID));
2751 return mlir::Value{};
2758 llvm::StringRef intrName;
2760 switch (builtinID) {
2762 return std::nullopt;
2763 case NEON::BI__builtin_neon_vbsl_v:
2764 case NEON::BI__builtin_neon_vbslq_v: {
2767 ops[0] = builder.createBitcast(ops[0], bitTy);
2768 ops[1] = builder.createBitcast(ops[1], bitTy);
2769 ops[2] = builder.createBitcast(ops[2], bitTy);
2771 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
2772 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
2773 ops[0] = builder.createOr(loc, ops[1], ops[2]);
2774 return builder.createBitcast(ops[0], ty);
2776 case NEON::BI__builtin_neon_vfma_lane_v:
2777 case NEON::BI__builtin_neon_vfmaq_lane_v: {
2778 mlir::Value addend = builder.createBitcast(ops[0], ty);
2779 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2783 cir::VectorType sourceTy = cir::VectorType::get(
2784 ty.getElementType(), builtinID == NEON::BI__builtin_neon_vfmaq_lane_v
2787 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2788 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2793 case NEON::BI__builtin_neon_vfma_laneq_v: {
2795 if (ty.getElementType() ==
cgm.doubleTy) {
2796 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
2797 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
2800 cir::VectorType sourceTy = cir::VectorType::get(
cgm.doubleTy, 2);
2801 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2802 laneSource = builder.createExtractElement(
2808 return builder.createBitcast(
2814 mlir::Value addend = builder.createBitcast(ops[0], ty);
2815 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2818 cir::VectorType sourceTy =
2819 cir::VectorType::get(ty.getElementType(), ty.getSize() * 2);
2820 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2821 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2826 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
2827 mlir::Value addend = builder.createBitcast(ops[0], ty);
2828 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2829 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
2830 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2835 case NEON::BI__builtin_neon_vfmah_lane_f16:
2836 case NEON::BI__builtin_neon_vfmas_lane_f32:
2837 case NEON::BI__builtin_neon_vfmah_laneq_f16:
2838 case NEON::BI__builtin_neon_vfmas_laneq_f32: {
2840 mlir::Value laneSource = builder.createExtractElement(
2847 case NEON::BI__builtin_neon_vfmad_lane_f64:
2848 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
2851 mlir::Value laneSource = builder.createExtractElement(
2858 case NEON::BI__builtin_neon_vmull_v: {
2859 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
2861 intrName =
"aarch64.neon.pmull";
2862 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2864 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
2866 case NEON::BI__builtin_neon_vmax_v:
2867 case NEON::BI__builtin_neon_vmaxq_v:
2868 intrName = usgn ?
"aarch64.neon.umax" :
"aarch64.neon.smax";
2869 if (cir::isFPOrVectorOfFPType(ty))
2870 intrName =
"aarch64.neon.fmax";
2872 case NEON::BI__builtin_neon_vmaxh_f16:
2873 cgm.errorNYI(
expr->getSourceRange(),
2874 std::string(
"unimplemented AArch64 builtin call: ") +
2875 getContext().BuiltinInfo.getName(builtinID));
2876 return mlir::Value{};
2877 case NEON::BI__builtin_neon_vmin_v:
2878 case NEON::BI__builtin_neon_vminq_v:
2879 intrName = usgn ?
"aarch64.neon.umin" :
"aarch64.neon.smin";
2880 if (cir::isFPOrVectorOfFPType(ty))
2881 intrName =
"aarch64.neon.fmin";
2883 case NEON::BI__builtin_neon_vminh_f16:
2884 cgm.errorNYI(
expr->getSourceRange(),
2885 std::string(
"unimplemented AArch64 builtin call: ") +
2886 getContext().BuiltinInfo.getName(builtinID));
2887 return mlir::Value{};
2888 case NEON::BI__builtin_neon_vabd_v:
2889 case NEON::BI__builtin_neon_vabdq_v:
2890 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
2891 if (cir::isFPOrVectorOfFPType(ty))
2892 intrName =
"aarch64.neon.fabd";
2894 case NEON::BI__builtin_neon_vpadal_v:
2895 case NEON::BI__builtin_neon_vpadalq_v: {
2896 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
2898 mlir::Value pairwiseSum =
2900 inputs, intrName, ty, loc);
2901 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
2902 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
2904 case NEON::BI__builtin_neon_vpmin_v:
2905 case NEON::BI__builtin_neon_vpminq_v:
2906 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
2907 if (cir::isFPOrVectorOfFPType(ty))
2908 intrName =
"aarch64.neon.fminp";
2910 case NEON::BI__builtin_neon_vpmax_v:
2911 case NEON::BI__builtin_neon_vpmaxq_v:
2912 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
2913 if (cir::isFPOrVectorOfFPType(ty))
2914 intrName =
"aarch64.neon.fmaxp";
2916 case NEON::BI__builtin_neon_vminnm_v:
2917 case NEON::BI__builtin_neon_vminnmq_v:
2918 intrName =
"aarch64.neon.fminnm";
2920 case NEON::BI__builtin_neon_vminnmh_f16:
2921 cgm.errorNYI(
expr->getSourceRange(),
2922 std::string(
"unimplemented AArch64 builtin call: ") +
2923 getContext().BuiltinInfo.getName(builtinID));
2924 return mlir::Value{};
2925 case NEON::BI__builtin_neon_vmaxnm_v:
2926 case NEON::BI__builtin_neon_vmaxnmq_v:
2927 intrName =
"aarch64.neon.fmaxnm";
2929 case NEON::BI__builtin_neon_vmaxnmh_f16:
2930 case NEON::BI__builtin_neon_vrecpss_f32:
2931 case NEON::BI__builtin_neon_vrecpsd_f64:
2932 cgm.errorNYI(
expr->getSourceRange(),
2933 std::string(
"unimplemented AArch64 builtin call: ") +
2934 getContext().BuiltinInfo.getName(builtinID));
2935 return mlir::Value{};
2936 case NEON::BI__builtin_neon_vrecpsh_f16: {
2937 auto halfTy = builder.getFp16Ty();
2938 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.frecps", halfTy, ops);
2940 case NEON::BI__builtin_neon_vqshrun_n_v:
2941 cgm.errorNYI(
expr->getSourceRange(),
2942 std::string(
"unimplemented AArch64 builtin call: ") +
2943 getContext().BuiltinInfo.getName(builtinID));
2944 return mlir::Value{};
2945 case NEON::BI__builtin_neon_vqrshrun_n_v: {
2946 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2949 "aarch64.neon.sqrshrun", ty, loc);
2951 case NEON::BI__builtin_neon_vqshrn_n_v:
2952 cgm.errorNYI(
expr->getSourceRange(),
2953 std::string(
"unimplemented AArch64 builtin call: ") +
2954 getContext().BuiltinInfo.getName(builtinID));
2955 return mlir::Value{};
2956 case NEON::BI__builtin_neon_vrshrn_n_v:
2957 cgm.errorNYI(
expr->getSourceRange(),
2958 std::string(
"unimplemented AArch64 builtin call: ") +
2959 getContext().BuiltinInfo.getName(builtinID));
2960 return mlir::Value{};
2961 case NEON::BI__builtin_neon_vqrshrn_n_v: {
2962 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2964 llvm::StringRef intrName =
2965 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
2969 case NEON::BI__builtin_neon_vrndah_f16:
2971 return cir::RoundOp::create(builder, loc, ops[0]);
2972 case NEON::BI__builtin_neon_vrnda_v:
2973 case NEON::BI__builtin_neon_vrndaq_v:
2977 case NEON::BI__builtin_neon_vrndih_f16:
2979 return cir::NearbyintOp::create(builder, loc, ops[0]);
2980 case NEON::BI__builtin_neon_vrndmh_f16:
2982 return cir::FloorOp::create(builder, loc, ops[0]);
2983 case NEON::BI__builtin_neon_vrndm_v:
2984 case NEON::BI__builtin_neon_vrndmq_v:
2988 case NEON::BI__builtin_neon_vrndnh_f16:
2990 return cir::RoundEvenOp::create(builder, loc, ops[0]);
2991 case NEON::BI__builtin_neon_vrndn_v:
2992 case NEON::BI__builtin_neon_vrndnq_v:
2995 std::nullopt, ty, loc);
2996 case NEON::BI__builtin_neon_vrndns_f32: {
2999 return cir::RoundEvenOp::create(builder,
getLoc(
expr->getExprLoc()), arg0);
3001 case NEON::BI__builtin_neon_vrndph_f16:
3003 return cir::CeilOp::create(builder, loc, ops[0]);
3004 case NEON::BI__builtin_neon_vrndp_v:
3005 case NEON::BI__builtin_neon_vrndpq_v:
3009 case NEON::BI__builtin_neon_vrndxh_f16:
3011 return cir::RintOp::create(builder, loc, ops[0]);
3012 case NEON::BI__builtin_neon_vrndx_v:
3013 case NEON::BI__builtin_neon_vrndxq_v:
3017 case NEON::BI__builtin_neon_vrndh_f16:
3019 return cir::TruncOp::create(builder, loc, ops[0]);
3020 case NEON::BI__builtin_neon_vrnd_v:
3021 case NEON::BI__builtin_neon_vrndq_v:
3025 case NEON::BI__builtin_neon_vcvt_f64_v:
3026 case NEON::BI__builtin_neon_vcvtq_f64_v:
3027 ops[0] = builder.createBitcast(ops[0], ty);
3030 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
3031 case NEON::BI__builtin_neon_vcvt_f64_f32:
3032 case NEON::BI__builtin_neon_vcvt_f32_f64:
3033 case NEON::BI__builtin_neon_vcvt_s32_v:
3034 case NEON::BI__builtin_neon_vcvt_u32_v:
3035 case NEON::BI__builtin_neon_vcvt_s64_v:
3036 case NEON::BI__builtin_neon_vcvt_u64_v:
3037 case NEON::BI__builtin_neon_vcvt_s16_f16:
3038 case NEON::BI__builtin_neon_vcvt_u16_f16:
3039 case NEON::BI__builtin_neon_vcvtq_s32_v:
3040 case NEON::BI__builtin_neon_vcvtq_u32_v:
3041 case NEON::BI__builtin_neon_vcvtq_s64_v:
3042 case NEON::BI__builtin_neon_vcvtq_u64_v:
3043 case NEON::BI__builtin_neon_vcvtq_s16_f16:
3044 case NEON::BI__builtin_neon_vcvtq_u16_f16:
3045 case NEON::BI__builtin_neon_vcvta_s16_f16:
3046 case NEON::BI__builtin_neon_vcvta_u16_f16:
3047 case NEON::BI__builtin_neon_vcvta_s32_v:
3048 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
3049 case NEON::BI__builtin_neon_vcvtaq_s32_v:
3050 case NEON::BI__builtin_neon_vcvta_u32_v:
3051 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
3052 case NEON::BI__builtin_neon_vcvtaq_u32_v:
3053 case NEON::BI__builtin_neon_vcvta_s64_v:
3054 case NEON::BI__builtin_neon_vcvtaq_s64_v:
3055 case NEON::BI__builtin_neon_vcvta_u64_v:
3056 case NEON::BI__builtin_neon_vcvtaq_u64_v:
3057 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3058 case NEON::BI__builtin_neon_vcvtm_s32_v:
3059 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3060 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3061 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3062 case NEON::BI__builtin_neon_vcvtm_u32_v:
3063 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3064 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3065 case NEON::BI__builtin_neon_vcvtm_s64_v:
3066 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3067 case NEON::BI__builtin_neon_vcvtm_u64_v:
3068 case NEON::BI__builtin_neon_vcvtmq_u64_v:
3069 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3070 case NEON::BI__builtin_neon_vcvtn_s32_v:
3071 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3072 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3073 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3074 case NEON::BI__builtin_neon_vcvtn_u32_v:
3075 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3076 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3077 case NEON::BI__builtin_neon_vcvtn_s64_v:
3078 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3079 case NEON::BI__builtin_neon_vcvtn_u64_v:
3080 case NEON::BI__builtin_neon_vcvtnq_u64_v:
3081 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3082 case NEON::BI__builtin_neon_vcvtp_s32_v:
3083 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3084 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3085 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3086 case NEON::BI__builtin_neon_vcvtp_u32_v:
3087 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3088 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3089 case NEON::BI__builtin_neon_vcvtp_s64_v:
3090 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3091 case NEON::BI__builtin_neon_vcvtp_u64_v:
3092 case NEON::BI__builtin_neon_vcvtpq_u64_v:
3093 case NEON::BI__builtin_neon_vmulx_v:
3094 case NEON::BI__builtin_neon_vmulxq_v:
3095 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3096 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3097 case NEON::BI__builtin_neon_vmul_lane_v:
3098 case NEON::BI__builtin_neon_vmul_laneq_v:
3099 case NEON::BI__builtin_neon_vpmaxnm_v:
3100 case NEON::BI__builtin_neon_vpmaxnmq_v:
3101 cgm.errorNYI(
expr->getSourceRange(),
3102 std::string(
"unimplemented AArch64 builtin call: ") +
3103 getContext().BuiltinInfo.getName(builtinID));
3104 return mlir::Value{};
3105 case NEON::BI__builtin_neon_vpminnm_v:
3106 case NEON::BI__builtin_neon_vpminnmq_v:
3107 intrName =
"aarch64.neon.fminnmp";
3109 case NEON::BI__builtin_neon_vsqrth_f16:
3110 cgm.errorNYI(
expr->getSourceRange(),
3111 std::string(
"unimplemented AArch64 builtin call: ") +
3112 getContext().BuiltinInfo.getName(builtinID));
3113 return mlir::Value{};
3114 case NEON::BI__builtin_neon_vsqrt_v:
3115 case NEON::BI__builtin_neon_vsqrtq_v:
3118 case NEON::BI__builtin_neon_vrbit_v:
3119 case NEON::BI__builtin_neon_vrbitq_v:
3120 case NEON::BI__builtin_neon_vmaxv_f16:
3121 case NEON::BI__builtin_neon_vmaxvq_f16:
3122 case NEON::BI__builtin_neon_vminv_f16:
3123 case NEON::BI__builtin_neon_vminvq_f16:
3124 case NEON::BI__builtin_neon_vmaxnmv_f16:
3125 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3126 case NEON::BI__builtin_neon_vminnmv_f16:
3127 case NEON::BI__builtin_neon_vminnmvq_f16:
3128 case NEON::BI__builtin_neon_vmul_n_f64:
3129 cgm.errorNYI(
expr->getSourceRange(),
3130 std::string(
"unimplemented AArch64 builtin call: ") +
3131 getContext().BuiltinInfo.getName(builtinID));
3132 return mlir::Value{};
3133 case NEON::BI__builtin_neon_vaddlv_u8:
3134 case NEON::BI__builtin_neon_vaddlvq_u8:
3135 case NEON::BI__builtin_neon_vaddlv_u16:
3136 case NEON::BI__builtin_neon_vaddlvq_u16:
3137 case NEON::BI__builtin_neon_vaddlv_s8:
3138 case NEON::BI__builtin_neon_vaddlvq_s8:
3139 case NEON::BI__builtin_neon_vaddlv_s16:
3140 case NEON::BI__builtin_neon_vaddlvq_s16: {
3143 auto eltTy = mlir::cast<cir::IntType>(
3144 mlir::cast<cir::VectorType>(argTy).getElementType());
3149 bool needsTrunc = eltTy.getWidth() == 8;
3150 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3151 mlir::Type intrRetTy = userRetTy;
3153 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3154 mlir::Value result =
3157 result = builder.createIntCast(result, userRetTy);
3160 case NEON::BI__builtin_neon_vsri_n_v:
3161 case NEON::BI__builtin_neon_vsriq_n_v: {
3163 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3164 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3165 "aarch64.neon.vsri", ty, loc);
3167 case NEON::BI__builtin_neon_vsli_n_v:
3168 case NEON::BI__builtin_neon_vsliq_n_v: {
3170 intrName =
"aarch64.neon.vsli";
3178 case NEON::BI__builtin_neon_vsra_n_v:
3179 case NEON::BI__builtin_neon_vsraq_n_v: {
3180 ops[0] = builder.createBitcast(ops[0], ty);
3182 return builder.createAdd(loc, ops[0], ops[1]);
3184 case NEON::BI__builtin_neon_vrsra_n_v:
3185 case NEON::BI__builtin_neon_vrsraq_n_v: {
3186 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3189 cir::VectorType shiftAmtVecTy =
3192 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3196 ops[0] = builder.createBitcast(ops[0], ty);
3197 return builder.createAdd(loc, ops[0], tmp);
3199 case NEON::BI__builtin_neon_vld1_v:
3200 case NEON::BI__builtin_neon_vld1q_v:
3201 case NEON::BI__builtin_neon_vst1_v:
3202 case NEON::BI__builtin_neon_vst1q_v:
3203 case NEON::BI__builtin_neon_vld1_lane_v:
3204 case NEON::BI__builtin_neon_vld1q_lane_v:
3205 case NEON::BI__builtin_neon_vldap1_lane_s64:
3206 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3207 case NEON::BI__builtin_neon_vld1_dup_v:
3208 case NEON::BI__builtin_neon_vld1q_dup_v:
3209 case NEON::BI__builtin_neon_vst1_lane_v:
3210 case NEON::BI__builtin_neon_vst1q_lane_v:
3211 case NEON::BI__builtin_neon_vstl1_lane_s64:
3212 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3213 case NEON::BI__builtin_neon_vld2_v:
3214 case NEON::BI__builtin_neon_vld2q_v:
3215 case NEON::BI__builtin_neon_vld3_v:
3216 case NEON::BI__builtin_neon_vld3q_v:
3217 case NEON::BI__builtin_neon_vld4_v:
3218 case NEON::BI__builtin_neon_vld4q_v:
3219 case NEON::BI__builtin_neon_vld2_dup_v:
3220 case NEON::BI__builtin_neon_vld2q_dup_v:
3221 case NEON::BI__builtin_neon_vld3_dup_v:
3222 case NEON::BI__builtin_neon_vld3q_dup_v:
3223 case NEON::BI__builtin_neon_vld4_dup_v:
3224 case NEON::BI__builtin_neon_vld4q_dup_v:
3225 case NEON::BI__builtin_neon_vld2_lane_v:
3226 case NEON::BI__builtin_neon_vld2q_lane_v:
3227 case NEON::BI__builtin_neon_vld3_lane_v:
3228 case NEON::BI__builtin_neon_vld3q_lane_v:
3229 case NEON::BI__builtin_neon_vld4_lane_v:
3230 case NEON::BI__builtin_neon_vld4q_lane_v:
3231 case NEON::BI__builtin_neon_vst2_v:
3232 case NEON::BI__builtin_neon_vst2q_v:
3233 case NEON::BI__builtin_neon_vst2_lane_v:
3234 case NEON::BI__builtin_neon_vst2q_lane_v:
3235 case NEON::BI__builtin_neon_vst3_v:
3236 case NEON::BI__builtin_neon_vst3q_v:
3237 case NEON::BI__builtin_neon_vst3_lane_v:
3238 case NEON::BI__builtin_neon_vst3q_lane_v:
3239 case NEON::BI__builtin_neon_vst4_v:
3240 case NEON::BI__builtin_neon_vst4q_v:
3241 case NEON::BI__builtin_neon_vst4_lane_v:
3242 case NEON::BI__builtin_neon_vst4q_lane_v:
3243 cgm.errorNYI(
expr->getSourceRange(),
3244 std::string(
"unimplemented AArch64 builtin call: ") +
3245 getContext().BuiltinInfo.getName(builtinID));
3246 return mlir::Value{};
3247 case NEON::BI__builtin_neon_vtrn_v:
3248 case NEON::BI__builtin_neon_vtrnq_v: {
3249 ops[1] = builder.createBitcast(ops[1], ty);
3250 ops[2] = builder.createBitcast(ops[2], ty);
3252 mlir::Value baseAddr =
3253 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3256 for (
unsigned vi = 0; vi != 2; ++vi) {
3258 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3259 indices.push_back(i + vi);
3260 indices.push_back(i + e + vi);
3262 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3263 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3264 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3265 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3269 case NEON::BI__builtin_neon_vuzp_v:
3270 case NEON::BI__builtin_neon_vuzpq_v: {
3271 ops[1] = builder.createBitcast(ops[1], ty);
3272 ops[2] = builder.createBitcast(ops[2], ty);
3274 mlir::Value baseAddr =
3275 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3277 for (
unsigned vi = 0; vi != 2; ++vi) {
3279 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3280 indices.push_back(2 * i + vi);
3282 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3283 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3284 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3285 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3289 case NEON::BI__builtin_neon_vzip_v:
3290 case NEON::BI__builtin_neon_vzipq_v: {
3291 ops[1] = builder.createBitcast(ops[1], ty);
3292 ops[2] = builder.createBitcast(ops[2], ty);
3294 mlir::Value baseAddr =
3295 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3297 for (
unsigned vi = 0; vi != 2; ++vi) {
3299 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3300 indices.push_back((i + vi * e) >> 1);
3301 indices.push_back(((i + vi * e) >> 1) + e);
3303 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3304 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3305 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3306 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3310 case NEON::BI__builtin_neon_vqtbl1q_v:
3311 case NEON::BI__builtin_neon_vqtbl2q_v:
3312 case NEON::BI__builtin_neon_vqtbl3q_v:
3313 case NEON::BI__builtin_neon_vqtbl4q_v:
3314 case NEON::BI__builtin_neon_vqtbx1q_v:
3315 case NEON::BI__builtin_neon_vqtbx2q_v:
3316 case NEON::BI__builtin_neon_vqtbx3q_v:
3317 case NEON::BI__builtin_neon_vqtbx4q_v:
3318 case NEON::BI__builtin_neon_vsqadd_v:
3319 case NEON::BI__builtin_neon_vsqaddq_v:
3320 case NEON::BI__builtin_neon_vuqadd_v:
3321 case NEON::BI__builtin_neon_vuqaddq_v:
3322 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3323 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3324 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3325 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3326 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3327 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3328 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3329 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3330 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3331 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3332 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3333 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3334 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3335 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3336 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3337 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3338 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3339 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3340 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3341 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3342 case NEON::BI__builtin_neon_vluti2_lane_f16:
3343 case NEON::BI__builtin_neon_vluti2_lane_p16:
3344 case NEON::BI__builtin_neon_vluti2_lane_p8:
3345 case NEON::BI__builtin_neon_vluti2_lane_s16:
3346 case NEON::BI__builtin_neon_vluti2_lane_s8:
3347 case NEON::BI__builtin_neon_vluti2_lane_u16:
3348 case NEON::BI__builtin_neon_vluti2_lane_u8:
3349 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3350 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3351 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3352 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3353 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3354 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3355 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3356 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3357 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3358 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3359 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3360 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3361 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3362 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3363 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3364 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3365 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3366 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3367 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3368 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3369 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3370 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3371 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3372 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3373 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3374 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3375 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3376 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3377 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3378 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3379 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3380 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3381 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3382 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3383 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3384 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3385 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3386 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3387 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3388 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3389 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3390 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3391 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3392 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3393 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3394 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3395 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3396 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3397 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3398 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3399 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3400 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
3401 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
3402 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
3403 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
3404 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
3405 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
3406 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
3407 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
3408 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
3409 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
3410 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
3411 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
3412 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
3413 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
3414 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
3415 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
3416 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
3417 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
3418 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
3419 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
3420 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
3421 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
3422 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
3423 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
3424 case NEON::BI__builtin_neon_vamin_f16:
3425 case NEON::BI__builtin_neon_vaminq_f16:
3426 case NEON::BI__builtin_neon_vamin_f32:
3427 case NEON::BI__builtin_neon_vaminq_f32:
3428 case NEON::BI__builtin_neon_vaminq_f64:
3429 case NEON::BI__builtin_neon_vamax_f16:
3430 case NEON::BI__builtin_neon_vamaxq_f16:
3431 case NEON::BI__builtin_neon_vamax_f32:
3432 case NEON::BI__builtin_neon_vamaxq_f32:
3433 case NEON::BI__builtin_neon_vamaxq_f64:
3434 case NEON::BI__builtin_neon_vscale_f16:
3435 case NEON::BI__builtin_neon_vscaleq_f16:
3436 case NEON::BI__builtin_neon_vscale_f32:
3437 case NEON::BI__builtin_neon_vscaleq_f32:
3438 case NEON::BI__builtin_neon_vscaleq_f64:
3439 cgm.errorNYI(
expr->getSourceRange(),
3440 std::string(
"unimplemented AArch64 builtin call: ") +
3441 getContext().BuiltinInfo.getName(builtinID));
3442 return mlir::Value{};