714 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
716 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
723 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
740 cir::VectorType vTy =
getNeonType(&cgf, neonType, hasLegalHalfType,
741 false, allowBFloatArgsAndRet);
742 cir::VectorType ty = vTy;
747 case NEON::BI__builtin_neon_splat_lane_v:
748 case NEON::BI__builtin_neon_splat_laneq_v:
749 case NEON::BI__builtin_neon_splatq_lane_v:
750 case NEON::BI__builtin_neon_splatq_laneq_v: {
751 uint64_t numElements = vTy.getSize();
752 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
754 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
759 case NEON::BI__builtin_neon_vpadd_v:
760 case NEON::BI__builtin_neon_vpaddq_v:
761 case NEON::BI__builtin_neon_vabs_v:
762 case NEON::BI__builtin_neon_vabsq_v:
764 std::string(
"unimplemented AArch64 builtin call: ") +
766 return mlir::Value{};
767 case NEON::BI__builtin_neon_vadd_v:
768 case NEON::BI__builtin_neon_vaddq_v: {
769 unsigned numBytes = (builtinID == NEON::BI__builtin_neon_vaddq_v) ? 16 : 8;
770 cir::VectorType byteTy =
777 case NEON::BI__builtin_neon_vaddhn_v: {
780 cir::VectorType srcTy =
790 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
792 loc, wideEltTy, wideEltTy.getWidth() / 2);
793 mlir::Value shiftVec =
801 case NEON::BI__builtin_neon_vsubhn_v: {
804 cir::VectorType srcTy =
814 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
816 loc, wideEltTy, wideEltTy.getWidth() / 2);
817 mlir::Value shiftVec =
825 case NEON::BI__builtin_neon_vcale_v:
826 case NEON::BI__builtin_neon_vcaleq_v:
827 case NEON::BI__builtin_neon_vcalt_v:
828 case NEON::BI__builtin_neon_vcaltq_v:
829 case NEON::BI__builtin_neon_vcage_v:
830 case NEON::BI__builtin_neon_vcageq_v:
831 case NEON::BI__builtin_neon_vcagt_v:
832 case NEON::BI__builtin_neon_vcagtq_v:
834 std::string(
"unimplemented AArch64 builtin call: ") +
836 return mlir::Value{};
837 case NEON::BI__builtin_neon_vceqz_v:
838 case NEON::BI__builtin_neon_vceqzq_v:
840 vTy, cir::CmpOpKind::eq);
841 case NEON::BI__builtin_neon_vcgez_v:
842 case NEON::BI__builtin_neon_vcgezq_v:
843 case NEON::BI__builtin_neon_vclez_v:
844 case NEON::BI__builtin_neon_vclezq_v:
845 case NEON::BI__builtin_neon_vcgtz_v:
846 case NEON::BI__builtin_neon_vcgtzq_v:
847 case NEON::BI__builtin_neon_vcltz_v:
848 case NEON::BI__builtin_neon_vcltzq_v:
849 case NEON::BI__builtin_neon_vclz_v:
850 case NEON::BI__builtin_neon_vclzq_v:
851 case NEON::BI__builtin_neon_vcvt_f32_v:
852 case NEON::BI__builtin_neon_vcvtq_f32_v:
853 case NEON::BI__builtin_neon_vcvt_f16_s16:
854 case NEON::BI__builtin_neon_vcvt_f16_u16:
855 case NEON::BI__builtin_neon_vcvtq_f16_s16:
856 case NEON::BI__builtin_neon_vcvtq_f16_u16:
857 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
858 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
859 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
860 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
862 std::string(
"unimplemented AArch64 builtin call: ") +
864 return mlir::Value{};
865 case NEON::BI__builtin_neon_vcvt_n_f32_v:
866 case NEON::BI__builtin_neon_vcvt_n_f64_v:
867 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
868 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
871 llvm::StringRef llvmIntrName =
873 usgn ? llvmIntrinsic : altLLVMIntrinsic));
875 {vTy, cstIntTy}, ops, llvmIntrName,
878 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
879 case NEON::BI__builtin_neon_vcvt_n_s32_v:
880 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
881 case NEON::BI__builtin_neon_vcvt_n_u32_v:
882 case NEON::BI__builtin_neon_vcvt_n_s64_v:
883 case NEON::BI__builtin_neon_vcvt_n_u64_v:
884 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
885 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
886 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
887 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
888 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
889 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
893 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
896 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
900 case NEON::BI__builtin_neon_vcvt_s32_v:
901 case NEON::BI__builtin_neon_vcvt_u32_v:
902 case NEON::BI__builtin_neon_vcvt_s64_v:
903 case NEON::BI__builtin_neon_vcvt_u64_v:
904 case NEON::BI__builtin_neon_vcvt_s16_f16:
905 case NEON::BI__builtin_neon_vcvt_u16_f16:
906 case NEON::BI__builtin_neon_vcvtq_s32_v:
907 case NEON::BI__builtin_neon_vcvtq_u32_v:
908 case NEON::BI__builtin_neon_vcvtq_s64_v:
909 case NEON::BI__builtin_neon_vcvtq_u64_v:
910 case NEON::BI__builtin_neon_vcvtq_s16_f16:
911 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
921 llvm::StringRef llvmIntrName = usgn ?
"fptoui.sat" :
"fptosi.sat";
923 {ty}, ops, llvmIntrName, vTy, loc);
925 case NEON::BI__builtin_neon_vcvta_s16_f16:
926 case NEON::BI__builtin_neon_vcvta_s32_v:
927 case NEON::BI__builtin_neon_vcvta_s64_v:
928 case NEON::BI__builtin_neon_vcvta_u16_f16:
929 case NEON::BI__builtin_neon_vcvta_u32_v:
930 case NEON::BI__builtin_neon_vcvta_u64_v:
931 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
932 case NEON::BI__builtin_neon_vcvtaq_s32_v:
933 case NEON::BI__builtin_neon_vcvtaq_s64_v:
934 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
935 case NEON::BI__builtin_neon_vcvtaq_u32_v:
936 case NEON::BI__builtin_neon_vcvtaq_u64_v:
937 case NEON::BI__builtin_neon_vcvtn_s16_f16:
938 case NEON::BI__builtin_neon_vcvtn_s32_v:
939 case NEON::BI__builtin_neon_vcvtn_s64_v:
940 case NEON::BI__builtin_neon_vcvtn_u16_f16:
941 case NEON::BI__builtin_neon_vcvtn_u32_v:
942 case NEON::BI__builtin_neon_vcvtn_u64_v:
943 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
944 case NEON::BI__builtin_neon_vcvtnq_s32_v:
945 case NEON::BI__builtin_neon_vcvtnq_s64_v:
946 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
947 case NEON::BI__builtin_neon_vcvtnq_u32_v:
948 case NEON::BI__builtin_neon_vcvtnq_u64_v:
949 case NEON::BI__builtin_neon_vcvtp_s16_f16:
950 case NEON::BI__builtin_neon_vcvtp_s32_v:
951 case NEON::BI__builtin_neon_vcvtp_s64_v:
952 case NEON::BI__builtin_neon_vcvtp_u16_f16:
953 case NEON::BI__builtin_neon_vcvtp_u32_v:
954 case NEON::BI__builtin_neon_vcvtp_u64_v:
955 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
956 case NEON::BI__builtin_neon_vcvtpq_s32_v:
957 case NEON::BI__builtin_neon_vcvtpq_s64_v:
958 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
959 case NEON::BI__builtin_neon_vcvtpq_u32_v:
960 case NEON::BI__builtin_neon_vcvtpq_u64_v:
961 case NEON::BI__builtin_neon_vcvtm_s16_f16:
962 case NEON::BI__builtin_neon_vcvtm_s32_v:
963 case NEON::BI__builtin_neon_vcvtm_s64_v:
964 case NEON::BI__builtin_neon_vcvtm_u16_f16:
965 case NEON::BI__builtin_neon_vcvtm_u32_v:
966 case NEON::BI__builtin_neon_vcvtm_u64_v:
967 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
968 case NEON::BI__builtin_neon_vcvtmq_s32_v:
969 case NEON::BI__builtin_neon_vcvtmq_s64_v:
970 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
971 case NEON::BI__builtin_neon_vcvtmq_u32_v:
972 case NEON::BI__builtin_neon_vcvtmq_u64_v:
973 case NEON::BI__builtin_neon_vcvtx_f32_v:
974 case NEON::BI__builtin_neon_vext_v:
975 case NEON::BI__builtin_neon_vextq_v:
977 std::string(
"unimplemented AArch64 builtin call: ") +
979 return mlir::Value{};
980 case NEON::BI__builtin_neon_vfma_v:
981 case NEON::BI__builtin_neon_vfmaq_v: {
992 case NEON::BI__builtin_neon_vld1_v:
993 case NEON::BI__builtin_neon_vld1q_v:
994 case NEON::BI__builtin_neon_vld1_x2_v:
995 case NEON::BI__builtin_neon_vld1q_x2_v:
996 case NEON::BI__builtin_neon_vld1_x3_v:
997 case NEON::BI__builtin_neon_vld1q_x3_v:
998 case NEON::BI__builtin_neon_vld1_x4_v:
999 case NEON::BI__builtin_neon_vld1q_x4_v:
1000 case NEON::BI__builtin_neon_vld2_v:
1001 case NEON::BI__builtin_neon_vld2q_v:
1002 case NEON::BI__builtin_neon_vld3_v:
1003 case NEON::BI__builtin_neon_vld3q_v:
1004 case NEON::BI__builtin_neon_vld4_v:
1005 case NEON::BI__builtin_neon_vld4q_v:
1006 case NEON::BI__builtin_neon_vld2_dup_v:
1007 case NEON::BI__builtin_neon_vld2q_dup_v:
1008 case NEON::BI__builtin_neon_vld3_dup_v:
1009 case NEON::BI__builtin_neon_vld3q_dup_v:
1010 case NEON::BI__builtin_neon_vld4_dup_v:
1011 case NEON::BI__builtin_neon_vld4q_dup_v:
1012 case NEON::BI__builtin_neon_vld1_dup_v:
1013 case NEON::BI__builtin_neon_vld1q_dup_v:
1014 case NEON::BI__builtin_neon_vld2_lane_v:
1015 case NEON::BI__builtin_neon_vld2q_lane_v:
1016 case NEON::BI__builtin_neon_vld3_lane_v:
1017 case NEON::BI__builtin_neon_vld3q_lane_v:
1018 case NEON::BI__builtin_neon_vld4_lane_v:
1019 case NEON::BI__builtin_neon_vld4q_lane_v:
1021 std::string(
"Reached code-path for ARM builtin call ") +
1023 "(ARM builtins are not supported ATM)");
1024 return mlir::Value{};
1025 case NEON::BI__builtin_neon_vmovl_v: {
1026 cir::VectorType dTy =
1032 case NEON::BI__builtin_neon_vmovn_v:
1033 case NEON::BI__builtin_neon_vmull_v:
1034 case NEON::BI__builtin_neon_vpadal_v:
1035 case NEON::BI__builtin_neon_vpadalq_v:
1037 std::string(
"Reached code-path for ARM builtin call ") +
1039 "(ARM builtins are not supported ATM)");
1040 return mlir::Value{};
1041 case NEON::BI__builtin_neon_vpaddl_v:
1042 case NEON::BI__builtin_neon_vpaddlq_v: {
1043 llvm::StringRef llvmIntrName =
1045 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1047 {getNeonPairwiseWidenInputType(vTy, usgn)},
1051 case NEON::BI__builtin_neon_vqdmlal_v:
1052 case NEON::BI__builtin_neon_vqdmlsl_v:
1053 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
1054 case NEON::BI__builtin_neon_vqdmulh_lane_v:
1055 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
1056 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
1057 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
1058 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
1059 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
1060 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
1061 case NEON::BI__builtin_neon_vqshl_n_v:
1062 case NEON::BI__builtin_neon_vqshlq_n_v:
1063 case NEON::BI__builtin_neon_vqshlu_n_v:
1064 case NEON::BI__builtin_neon_vqshluq_n_v:
1065 case NEON::BI__builtin_neon_vrecpe_v:
1066 case NEON::BI__builtin_neon_vrecpeq_v:
1067 case NEON::BI__builtin_neon_vrsqrte_v:
1068 case NEON::BI__builtin_neon_vrsqrteq_v:
1070 std::string(
"unimplemented AArch64 builtin call: ") +
1072 return mlir::Value{};
1073 case NEON::BI__builtin_neon_vrndi_v:
1074 case NEON::BI__builtin_neon_vrndiq_v:
1077 ops, std::nullopt, ty, loc);
1078 case NEON::BI__builtin_neon_vrshr_n_v:
1079 case NEON::BI__builtin_neon_vrshrq_n_v: {
1080 llvm::StringRef intrName =
1081 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
1084 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
1085 intrName, ty, loc,
false,
1089 case NEON::BI__builtin_neon_vsha512hq_u64:
1090 case NEON::BI__builtin_neon_vsha512h2q_u64:
1091 case NEON::BI__builtin_neon_vsha512su0q_u64:
1092 case NEON::BI__builtin_neon_vsha512su1q_u64:
1094 std::string(
"unimplemented AArch64 builtin call: ") +
1096 return mlir::Value{};
1097 case NEON::BI__builtin_neon_vshl_n_v:
1098 case NEON::BI__builtin_neon_vshlq_n_v:
1101 case NEON::BI__builtin_neon_vshll_n_v: {
1103 cir::VectorType narrowVecTy =
1107 mlir::Value src = builder.
createBitcast(ops[0], narrowVecTy);
1112 case NEON::BI__builtin_neon_vshrn_n_v:
1114 std::string(
"unimplemented AArch64 builtin call: ") +
1116 return mlir::Value{};
1117 case NEON::BI__builtin_neon_vshr_n_v:
1118 case NEON::BI__builtin_neon_vshrq_n_v:
1120 case NEON::BI__builtin_neon_vst1_v:
1121 case NEON::BI__builtin_neon_vst1q_v:
1122 case NEON::BI__builtin_neon_vst2_v:
1123 case NEON::BI__builtin_neon_vst2q_v:
1124 case NEON::BI__builtin_neon_vst3_v:
1125 case NEON::BI__builtin_neon_vst3q_v:
1126 case NEON::BI__builtin_neon_vst4_v:
1127 case NEON::BI__builtin_neon_vst4q_v:
1128 case NEON::BI__builtin_neon_vst2_lane_v:
1129 case NEON::BI__builtin_neon_vst2q_lane_v:
1130 case NEON::BI__builtin_neon_vst3_lane_v:
1131 case NEON::BI__builtin_neon_vst3q_lane_v:
1132 case NEON::BI__builtin_neon_vst4_lane_v:
1133 case NEON::BI__builtin_neon_vst4q_lane_v:
1134 case NEON::BI__builtin_neon_vsm3partw1q_u32:
1135 case NEON::BI__builtin_neon_vsm3partw2q_u32:
1136 case NEON::BI__builtin_neon_vsm3ss1q_u32:
1137 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
1138 case NEON::BI__builtin_neon_vsm4eq_u32:
1139 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
1140 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
1141 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
1142 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
1144 std::string(
"unimplemented AArch64 builtin call: ") +
1146 return mlir::Value{};
1147 case NEON::BI__builtin_neon_vst1_x2_v:
1148 case NEON::BI__builtin_neon_vst1q_x2_v:
1149 case NEON::BI__builtin_neon_vst1_x3_v:
1150 case NEON::BI__builtin_neon_vst1q_x3_v:
1151 case NEON::BI__builtin_neon_vst1_x4_v:
1152 case NEON::BI__builtin_neon_vst1q_x4_v: {
1155 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
1159 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1163 case NEON::BI__builtin_neon_vtrn_v:
1164 case NEON::BI__builtin_neon_vtrnq_v:
1165 case NEON::BI__builtin_neon_vtst_v:
1166 case NEON::BI__builtin_neon_vtstq_v:
1167 case NEON::BI__builtin_neon_vuzp_v:
1168 case NEON::BI__builtin_neon_vuzpq_v:
1169 case NEON::BI__builtin_neon_vxarq_u64:
1170 case NEON::BI__builtin_neon_vzip_v:
1171 case NEON::BI__builtin_neon_vzipq_v:
1172 case NEON::BI__builtin_neon_vdot_s32:
1173 case NEON::BI__builtin_neon_vdot_u32:
1174 case NEON::BI__builtin_neon_vdotq_s32:
1175 case NEON::BI__builtin_neon_vdotq_u32:
1176 case NEON::BI__builtin_neon_vfmlal_low_f16:
1177 case NEON::BI__builtin_neon_vfmlalq_low_f16:
1178 case NEON::BI__builtin_neon_vfmlsl_low_f16:
1179 case NEON::BI__builtin_neon_vfmlslq_low_f16:
1180 case NEON::BI__builtin_neon_vfmlal_high_f16:
1181 case NEON::BI__builtin_neon_vfmlalq_high_f16:
1182 case NEON::BI__builtin_neon_vfmlsl_high_f16:
1183 case NEON::BI__builtin_neon_vfmlslq_high_f16:
1184 case NEON::BI__builtin_neon_vmmlaq_s32:
1185 case NEON::BI__builtin_neon_vmmlaq_u32:
1187 std::string(
"unimplemented AArch64 builtin call: ") +
1189 return mlir::Value{};
1190 case NEON::BI__builtin_neon_vmul_v:
1191 case NEON::BI__builtin_neon_vmulq_v:
1194 case NEON::BI__builtin_neon_vusmmlaq_s32:
1195 case NEON::BI__builtin_neon_vusdot_s32:
1196 case NEON::BI__builtin_neon_vusdotq_s32:
1197 case NEON::BI__builtin_neon_vbfdot_f32:
1198 case NEON::BI__builtin_neon_vbfdotq_f32:
1199 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
1201 std::string(
"unimplemented AArch64 builtin call: ") +
1203 return mlir::Value{};
1209 switch (builtinID) {
1212 std::string(
"unimplemented AArch64 builtin call: ") +
1215 case NEON::BI__builtin_neon_vrnd32x_f32:
1216 case NEON::BI__builtin_neon_vrnd32xq_f32:
1217 case NEON::BI__builtin_neon_vrnd32x_f64:
1218 case NEON::BI__builtin_neon_vrnd32xq_f64:
1219 case NEON::BI__builtin_neon_vrnd32z_f32:
1220 case NEON::BI__builtin_neon_vrnd32zq_f32:
1221 case NEON::BI__builtin_neon_vrnd32z_f64:
1222 case NEON::BI__builtin_neon_vrnd32zq_f64:
1223 case NEON::BI__builtin_neon_vrnd64x_f32:
1224 case NEON::BI__builtin_neon_vrnd64xq_f32:
1225 case NEON::BI__builtin_neon_vrnd64x_f64:
1226 case NEON::BI__builtin_neon_vrnd64xq_f64:
1227 case NEON::BI__builtin_neon_vrnd64z_f32:
1228 case NEON::BI__builtin_neon_vrnd64zq_f32:
1229 case NEON::BI__builtin_neon_vrnd64z_f64:
1230 case NEON::BI__builtin_neon_vrnd64zq_f64: {
1232 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1233 mlir::Value result =
1235 llvmIntrName, vTy, loc);
1239 case NEON::BI__builtin_neon_vhadd_v:
1240 case NEON::BI__builtin_neon_vhaddq_v:
1241 case NEON::BI__builtin_neon_vhsub_v:
1242 case NEON::BI__builtin_neon_vhsubq_v:
1243 case NEON::BI__builtin_neon_vrhadd_v:
1244 case NEON::BI__builtin_neon_vrhaddq_v:
1245 case NEON::BI__builtin_neon_vshl_v:
1246 case NEON::BI__builtin_neon_vshlq_v:
1247 case NEON::BI__builtin_neon_vraddhn_v:
1248 case NEON::BI__builtin_neon_vrsubhn_v: {
1251 unsigned intrinsic =
1252 ((modifier &
UnsignedAlts) && !usgn) ? altLLVMIntrinsic : llvmIntrinsic;
1253 llvm::StringRef llvmIntrName =
1256 cir::VectorType argTy =
1259 mlir::Value result =
1261 {argTy, argTy}, ops, llvmIntrName,
1678 NEON::BI__builtin_neon_vabd_f16,
1679 NEON::BI__builtin_neon_vabd_v,
1682 NEON::BI__builtin_neon_vabdq_f16,
1683 NEON::BI__builtin_neon_vabdq_v,
1686 NEON::BI__builtin_neon_vabs_f16,
1687 NEON::BI__builtin_neon_vabs_v,
1690 NEON::BI__builtin_neon_vabsq_f16,
1691 NEON::BI__builtin_neon_vabsq_v,
1694 NEON::BI__builtin_neon_vcage_f16,
1695 NEON::BI__builtin_neon_vcage_v,
1698 NEON::BI__builtin_neon_vcageq_f16,
1699 NEON::BI__builtin_neon_vcageq_v,
1702 NEON::BI__builtin_neon_vcagt_f16,
1703 NEON::BI__builtin_neon_vcagt_v,
1706 NEON::BI__builtin_neon_vcagtq_f16,
1707 NEON::BI__builtin_neon_vcagtq_v,
1710 NEON::BI__builtin_neon_vcale_f16,
1711 NEON::BI__builtin_neon_vcale_v,
1714 NEON::BI__builtin_neon_vcaleq_f16,
1715 NEON::BI__builtin_neon_vcaleq_v,
1718 NEON::BI__builtin_neon_vcalt_f16,
1719 NEON::BI__builtin_neon_vcalt_v,
1722 NEON::BI__builtin_neon_vcaltq_f16,
1723 NEON::BI__builtin_neon_vcaltq_v,
1726 NEON::BI__builtin_neon_vceqz_f16,
1727 NEON::BI__builtin_neon_vceqz_v,
1730 NEON::BI__builtin_neon_vceqzq_f16,
1731 NEON::BI__builtin_neon_vceqzq_v,
1734 NEON::BI__builtin_neon_vcgez_f16,
1735 NEON::BI__builtin_neon_vcgez_v,
1738 NEON::BI__builtin_neon_vcgezq_f16,
1739 NEON::BI__builtin_neon_vcgezq_v,
1742 NEON::BI__builtin_neon_vcgtz_f16,
1743 NEON::BI__builtin_neon_vcgtz_v,
1746 NEON::BI__builtin_neon_vcgtzq_f16,
1747 NEON::BI__builtin_neon_vcgtzq_v,
1750 NEON::BI__builtin_neon_vclez_f16,
1751 NEON::BI__builtin_neon_vclez_v,
1754 NEON::BI__builtin_neon_vclezq_f16,
1755 NEON::BI__builtin_neon_vclezq_v,
1758 NEON::BI__builtin_neon_vcltz_f16,
1759 NEON::BI__builtin_neon_vcltz_v,
1762 NEON::BI__builtin_neon_vcltzq_f16,
1763 NEON::BI__builtin_neon_vcltzq_v,
1766 NEON::BI__builtin_neon_vfma_f16,
1767 NEON::BI__builtin_neon_vfma_v,
1770 NEON::BI__builtin_neon_vfma_lane_f16,
1771 NEON::BI__builtin_neon_vfma_lane_v,
1774 NEON::BI__builtin_neon_vfma_laneq_f16,
1775 NEON::BI__builtin_neon_vfma_laneq_v,
1778 NEON::BI__builtin_neon_vfmaq_f16,
1779 NEON::BI__builtin_neon_vfmaq_v,
1782 NEON::BI__builtin_neon_vfmaq_lane_f16,
1783 NEON::BI__builtin_neon_vfmaq_lane_v,
1786 NEON::BI__builtin_neon_vfmaq_laneq_f16,
1787 NEON::BI__builtin_neon_vfmaq_laneq_v,
1790 NEON::BI__builtin_neon_vmax_f16,
1791 NEON::BI__builtin_neon_vmax_v,
1794 NEON::BI__builtin_neon_vmaxnm_f16,
1795 NEON::BI__builtin_neon_vmaxnm_v,
1798 NEON::BI__builtin_neon_vmaxnmq_f16,
1799 NEON::BI__builtin_neon_vmaxnmq_v,
1802 NEON::BI__builtin_neon_vmaxq_f16,
1803 NEON::BI__builtin_neon_vmaxq_v,
1806 NEON::BI__builtin_neon_vmin_f16,
1807 NEON::BI__builtin_neon_vmin_v,
1810 NEON::BI__builtin_neon_vminnm_f16,
1811 NEON::BI__builtin_neon_vminnm_v,
1814 NEON::BI__builtin_neon_vminnmq_f16,
1815 NEON::BI__builtin_neon_vminnmq_v,
1818 NEON::BI__builtin_neon_vminq_f16,
1819 NEON::BI__builtin_neon_vminq_v,
1822 NEON::BI__builtin_neon_vmulx_f16,
1823 NEON::BI__builtin_neon_vmulx_v,
1826 NEON::BI__builtin_neon_vmulxq_f16,
1827 NEON::BI__builtin_neon_vmulxq_v,
1830 NEON::BI__builtin_neon_vpadd_f16,
1831 NEON::BI__builtin_neon_vpadd_v,
1834 NEON::BI__builtin_neon_vpaddq_f16,
1835 NEON::BI__builtin_neon_vpaddq_v,
1838 NEON::BI__builtin_neon_vpmax_f16,
1839 NEON::BI__builtin_neon_vpmax_v,
1842 NEON::BI__builtin_neon_vpmaxnm_f16,
1843 NEON::BI__builtin_neon_vpmaxnm_v,
1846 NEON::BI__builtin_neon_vpmaxnmq_f16,
1847 NEON::BI__builtin_neon_vpmaxnmq_v,
1850 NEON::BI__builtin_neon_vpmaxq_f16,
1851 NEON::BI__builtin_neon_vpmaxq_v,
1854 NEON::BI__builtin_neon_vpmin_f16,
1855 NEON::BI__builtin_neon_vpmin_v,
1858 NEON::BI__builtin_neon_vpminnm_f16,
1859 NEON::BI__builtin_neon_vpminnm_v,
1862 NEON::BI__builtin_neon_vpminnmq_f16,
1863 NEON::BI__builtin_neon_vpminnmq_v,
1866 NEON::BI__builtin_neon_vpminq_f16,
1867 NEON::BI__builtin_neon_vpminq_v,
1870 NEON::BI__builtin_neon_vrecpe_f16,
1871 NEON::BI__builtin_neon_vrecpe_v,
1874 NEON::BI__builtin_neon_vrecpeq_f16,
1875 NEON::BI__builtin_neon_vrecpeq_v,
1878 NEON::BI__builtin_neon_vrecps_f16,
1879 NEON::BI__builtin_neon_vrecps_v,
1882 NEON::BI__builtin_neon_vrecpsq_f16,
1883 NEON::BI__builtin_neon_vrecpsq_v,
1886 NEON::BI__builtin_neon_vrnd_f16,
1887 NEON::BI__builtin_neon_vrnd_v,
1890 NEON::BI__builtin_neon_vrnda_f16,
1891 NEON::BI__builtin_neon_vrnda_v,
1894 NEON::BI__builtin_neon_vrndaq_f16,
1895 NEON::BI__builtin_neon_vrndaq_v,
1898 NEON::BI__builtin_neon_vrndi_f16,
1899 NEON::BI__builtin_neon_vrndi_v,
1902 NEON::BI__builtin_neon_vrndiq_f16,
1903 NEON::BI__builtin_neon_vrndiq_v,
1906 NEON::BI__builtin_neon_vrndm_f16,
1907 NEON::BI__builtin_neon_vrndm_v,
1910 NEON::BI__builtin_neon_vrndmq_f16,
1911 NEON::BI__builtin_neon_vrndmq_v,
1914 NEON::BI__builtin_neon_vrndn_f16,
1915 NEON::BI__builtin_neon_vrndn_v,
1918 NEON::BI__builtin_neon_vrndnq_f16,
1919 NEON::BI__builtin_neon_vrndnq_v,
1922 NEON::BI__builtin_neon_vrndp_f16,
1923 NEON::BI__builtin_neon_vrndp_v,
1926 NEON::BI__builtin_neon_vrndpq_f16,
1927 NEON::BI__builtin_neon_vrndpq_v,
1930 NEON::BI__builtin_neon_vrndq_f16,
1931 NEON::BI__builtin_neon_vrndq_v,
1934 NEON::BI__builtin_neon_vrndx_f16,
1935 NEON::BI__builtin_neon_vrndx_v,
1938 NEON::BI__builtin_neon_vrndxq_f16,
1939 NEON::BI__builtin_neon_vrndxq_v,
1942 NEON::BI__builtin_neon_vrsqrte_f16,
1943 NEON::BI__builtin_neon_vrsqrte_v,
1946 NEON::BI__builtin_neon_vrsqrteq_f16,
1947 NEON::BI__builtin_neon_vrsqrteq_v,
1950 NEON::BI__builtin_neon_vrsqrts_f16,
1951 NEON::BI__builtin_neon_vrsqrts_v,
1954 NEON::BI__builtin_neon_vrsqrtsq_f16,
1955 NEON::BI__builtin_neon_vrsqrtsq_v,
1958 NEON::BI__builtin_neon_vsqrt_f16,
1959 NEON::BI__builtin_neon_vsqrt_v,
1962 NEON::BI__builtin_neon_vsqrtq_f16,
1963 NEON::BI__builtin_neon_vsqrtq_v,
1968 {NEON::BI__builtin_neon_vldap1_lane_u64,
1969 NEON::BI__builtin_neon_vldap1_lane_s64},
1970 {NEON::BI__builtin_neon_vldap1_lane_f64,
1971 NEON::BI__builtin_neon_vldap1_lane_s64},
1972 {NEON::BI__builtin_neon_vldap1_lane_p64,
1973 NEON::BI__builtin_neon_vldap1_lane_s64},
1974 {NEON::BI__builtin_neon_vldap1q_lane_u64,
1975 NEON::BI__builtin_neon_vldap1q_lane_s64},
1976 {NEON::BI__builtin_neon_vldap1q_lane_f64,
1977 NEON::BI__builtin_neon_vldap1q_lane_s64},
1978 {NEON::BI__builtin_neon_vldap1q_lane_p64,
1979 NEON::BI__builtin_neon_vldap1q_lane_s64},
1980 {NEON::BI__builtin_neon_vstl1_lane_u64,
1981 NEON::BI__builtin_neon_vstl1_lane_s64},
1982 {NEON::BI__builtin_neon_vstl1_lane_f64,
1983 NEON::BI__builtin_neon_vstl1_lane_s64},
1984 {NEON::BI__builtin_neon_vstl1_lane_p64,
1985 NEON::BI__builtin_neon_vstl1_lane_s64},
1986 {NEON::BI__builtin_neon_vstl1q_lane_u64,
1987 NEON::BI__builtin_neon_vstl1q_lane_s64},
1988 {NEON::BI__builtin_neon_vstl1q_lane_f64,
1989 NEON::BI__builtin_neon_vstl1q_lane_s64},
1990 {NEON::BI__builtin_neon_vstl1q_lane_p64,
1991 NEON::BI__builtin_neon_vstl1q_lane_s64},
1997 llvm::Triple::ArchType arch) {
2006 if (builtinID == Builtin::BI__builtin_cpu_supports) {
2007 cgm.errorNYI(
expr->getSourceRange(),
2008 std::string(
"unimplemented AArch64 builtin call: ") +
2009 getContext().BuiltinInfo.getName(builtinID));
2010 return mlir::Value{};
2013 switch (builtinID) {
2016 case clang::AArch64::BI__builtin_arm_nop:
2017 case clang::AArch64::BI__builtin_arm_yield:
2018 case clang::AArch64::BI__yield:
2019 case clang::AArch64::BI__builtin_arm_wfe:
2020 case clang::AArch64::BI__wfe:
2021 case clang::AArch64::BI__builtin_arm_wfi:
2022 case clang::AArch64::BI__wfi:
2023 case clang::AArch64::BI__builtin_arm_sev:
2024 case clang::AArch64::BI__sev:
2025 case clang::AArch64::BI__builtin_arm_sevl:
2026 case clang::AArch64::BI__sevl:
2027 cgm.errorNYI(
expr->getSourceRange(),
2028 std::string(
"unimplemented AArch64 builtin call: ") +
2029 getContext().BuiltinInfo.getName(builtinID));
2030 return mlir::Value{};
2033 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
2034 cgm.errorNYI(
expr->getSourceRange(),
2035 std::string(
"unimplemented AArch64 builtin call: ") +
2036 getContext().BuiltinInfo.getName(builtinID));
2037 return mlir::Value{};
2040 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
2041 cgm.errorNYI(
expr->getSourceRange(),
2042 std::string(
"unimplemented AArch64 builtin call: ") +
2043 getContext().BuiltinInfo.getName(builtinID));
2044 return mlir::Value{};
2047 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
2048 cgm.errorNYI(
expr->getSourceRange(),
2049 std::string(
"unimplemented AArch64 builtin call: ") +
2050 getContext().BuiltinInfo.getName(builtinID));
2051 return mlir::Value{};
2053 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
2054 cgm.errorNYI(
expr->getSourceRange(),
2055 std::string(
"unimplemented AArch64 builtin call: ") +
2056 getContext().BuiltinInfo.getName(builtinID));
2057 return mlir::Value{};
2060 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
2061 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
2062 cgm.errorNYI(
expr->getSourceRange(),
2063 std::string(
"unimplemented AArch64 builtin call: ") +
2064 getContext().BuiltinInfo.getName(builtinID));
2065 return mlir::Value{};
2068 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
2069 cgm.errorNYI(
expr->getSourceRange(),
2070 std::string(
"unimplemented AArch64 builtin call: ") +
2071 getContext().BuiltinInfo.getName(builtinID));
2072 return mlir::Value{};
2074 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
2075 cgm.errorNYI(
expr->getSourceRange(),
2076 std::string(
"unimplemented AArch64 builtin call: ") +
2077 getContext().BuiltinInfo.getName(builtinID));
2078 return mlir::Value{};
2081 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
2082 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
2083 cgm.errorNYI(
expr->getSourceRange(),
2084 std::string(
"unimplemented AArch64 builtin call: ") +
2085 getContext().BuiltinInfo.getName(builtinID));
2086 return mlir::Value{};
2089 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
2090 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
2091 cgm.errorNYI(
expr->getSourceRange(),
2092 std::string(
"unimplemented AArch64 builtin call: ") +
2093 getContext().BuiltinInfo.getName(builtinID));
2094 return mlir::Value{};
2097 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
2098 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
2099 cgm.errorNYI(
expr->getSourceRange(),
2100 std::string(
"unimplemented AArch64 builtin call: ") +
2101 getContext().BuiltinInfo.getName(builtinID));
2102 return mlir::Value{};
2105 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
2106 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
2107 cgm.errorNYI(
expr->getSourceRange(),
2108 std::string(
"unimplemented AArch64 builtin call: ") +
2109 getContext().BuiltinInfo.getName(builtinID));
2110 return mlir::Value{};
2113 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
2114 cgm.errorNYI(
expr->getSourceRange(),
2115 std::string(
"unimplemented AArch64 builtin call: ") +
2116 getContext().BuiltinInfo.getName(builtinID));
2117 return mlir::Value{};
2120 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
2121 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
2122 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
2123 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2124 cgm.errorNYI(
expr->getSourceRange(),
2125 std::string(
"unimplemented AArch64 builtin call: ") +
2126 getContext().BuiltinInfo.getName(builtinID));
2127 return mlir::Value{};
2130 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2131 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
2132 cgm.errorNYI(
expr->getSourceRange(),
2133 std::string(
"unimplemented AArch64 builtin call: ") +
2134 getContext().BuiltinInfo.getName(builtinID));
2135 return mlir::Value{};
2138 if (builtinID == clang::AArch64::BI__clear_cache) {
2139 cgm.errorNYI(
expr->getSourceRange(),
2140 std::string(
"unimplemented AArch64 builtin call: ") +
2141 getContext().BuiltinInfo.getName(builtinID));
2142 return mlir::Value{};
2145 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2146 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2148 cgm.errorNYI(
expr->getSourceRange(),
2149 std::string(
"unimplemented AArch64 builtin call: ") +
2150 getContext().BuiltinInfo.getName(builtinID));
2151 return mlir::Value{};
2153 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2154 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2155 cgm.errorNYI(
expr->getSourceRange(),
2156 std::string(
"unimplemented AArch64 builtin call: ") +
2157 getContext().BuiltinInfo.getName(builtinID));
2158 return mlir::Value{};
2161 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2162 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
2164 cgm.errorNYI(
expr->getSourceRange(),
2165 std::string(
"unimplemented AArch64 builtin call: ") +
2166 getContext().BuiltinInfo.getName(builtinID));
2167 return mlir::Value{};
2170 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2171 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
2172 cgm.errorNYI(
expr->getSourceRange(),
2173 std::string(
"unimplemented AArch64 builtin call: ") +
2174 getContext().BuiltinInfo.getName(builtinID));
2175 return mlir::Value{};
2178 if (builtinID == clang::AArch64::BI__getReg ||
2179 builtinID == clang::AArch64::BI__setReg ||
2180 builtinID == clang::AArch64::BI__getRegFp ||
2181 builtinID == clang::AArch64::BI__setRegFp) {
2182 cgm.errorNYI(
expr->getSourceRange(),
2183 std::string(
"unimplemented AArch64 builtin call: ") +
2184 getContext().BuiltinInfo.getName(builtinID));
2185 return mlir::Value{};
2188 if (builtinID == clang::AArch64::BI__break) {
2189 cgm.errorNYI(
expr->getSourceRange(),
2190 std::string(
"unimplemented AArch64 builtin call: ") +
2191 getContext().BuiltinInfo.getName(builtinID));
2192 return mlir::Value{};
2195 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2196 cgm.errorNYI(
expr->getSourceRange(),
2197 std::string(
"unimplemented AArch64 builtin call: ") +
2198 getContext().BuiltinInfo.getName(builtinID));
2199 return mlir::Value{};
2202 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2203 cgm.errorNYI(
expr->getSourceRange(),
2204 std::string(
"unimplemented AArch64 builtin call: ") +
2205 getContext().BuiltinInfo.getName(builtinID));
2206 return mlir::Value{};
2210 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2211 switch (builtinID) {
2212 case clang::AArch64::BI__builtin_arm_crc32b:
2213 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2215 case clang::AArch64::BI__builtin_arm_crc32cb:
2216 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2218 case clang::AArch64::BI__builtin_arm_crc32h:
2219 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2221 case clang::AArch64::BI__builtin_arm_crc32ch:
2222 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2224 case clang::AArch64::BI__builtin_arm_crc32w:
2225 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2227 case clang::AArch64::BI__builtin_arm_crc32cw:
2228 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2230 case clang::AArch64::BI__builtin_arm_crc32d:
2231 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2233 case clang::AArch64::BI__builtin_arm_crc32cd:
2234 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2238 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2239 cgm.errorNYI(
expr->getSourceRange(),
2240 std::string(
"unimplemented AArch64 builtin call: ") +
2241 getContext().BuiltinInfo.getName(builtinID));
2242 return mlir::Value{};
2246 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2247 cgm.errorNYI(
expr->getSourceRange(),
2248 std::string(
"unimplemented AArch64 builtin call: ") +
2249 getContext().BuiltinInfo.getName(builtinID));
2250 return mlir::Value{};
2254 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2255 switch (builtinID) {
2256 case clang::AArch64::BI__builtin_arm_irg:
2257 mteIntrinsicID = Intrinsic::aarch64_irg;
2259 case clang::AArch64::BI__builtin_arm_addg:
2260 mteIntrinsicID = Intrinsic::aarch64_addg;
2262 case clang::AArch64::BI__builtin_arm_gmi:
2263 mteIntrinsicID = Intrinsic::aarch64_gmi;
2265 case clang::AArch64::BI__builtin_arm_ldg:
2266 mteIntrinsicID = Intrinsic::aarch64_ldg;
2268 case clang::AArch64::BI__builtin_arm_stg:
2269 mteIntrinsicID = Intrinsic::aarch64_stg;
2271 case clang::AArch64::BI__builtin_arm_subp:
2272 mteIntrinsicID = Intrinsic::aarch64_subp;
2276 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
2277 cgm.errorNYI(
expr->getSourceRange(),
2278 std::string(
"unimplemented AArch64 builtin call: ") +
2279 getContext().BuiltinInfo.getName(builtinID));
2280 return mlir::Value{};
2283 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
2284 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2285 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2286 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2287 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2288 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2289 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2290 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2291 cgm.errorNYI(
expr->getSourceRange(),
2292 std::string(
"unimplemented AArch64 builtin call: ") +
2293 getContext().BuiltinInfo.getName(builtinID));
2294 return mlir::Value{};
2297 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2298 builtinID == clang::AArch64::BI_WriteStatusReg ||
2299 builtinID == clang::AArch64::BI__sys) {
2300 cgm.errorNYI(
expr->getSourceRange(),
2301 std::string(
"unimplemented AArch64 builtin call: ") +
2302 getContext().BuiltinInfo.getName(builtinID));
2303 return mlir::Value{};
2306 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
2307 cgm.errorNYI(
expr->getSourceRange(),
2308 std::string(
"unimplemented AArch64 builtin call: ") +
2309 getContext().BuiltinInfo.getName(builtinID));
2310 return mlir::Value{};
2313 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2314 cgm.errorNYI(
expr->getSourceRange(),
2315 std::string(
"unimplemented AArch64 builtin call: ") +
2316 getContext().BuiltinInfo.getName(builtinID));
2317 return mlir::Value{};
2320 if (builtinID == clang::AArch64::BI__mulh ||
2321 builtinID == clang::AArch64::BI__umulh) {
2322 cgm.errorNYI(
expr->getSourceRange(),
2323 std::string(
"unimplemented AArch64 builtin call: ") +
2324 getContext().BuiltinInfo.getName(builtinID));
2325 return mlir::Value{};
2328 if (builtinID == AArch64::BI__writex18byte ||
2329 builtinID == AArch64::BI__writex18word ||
2330 builtinID == AArch64::BI__writex18dword ||
2331 builtinID == AArch64::BI__writex18qword) {
2332 cgm.errorNYI(
expr->getSourceRange(),
2333 std::string(
"unimplemented AArch64 builtin call: ") +
2334 getContext().BuiltinInfo.getName(builtinID));
2335 return mlir::Value{};
2338 if (builtinID == AArch64::BI__readx18byte ||
2339 builtinID == AArch64::BI__readx18word ||
2340 builtinID == AArch64::BI__readx18dword ||
2341 builtinID == AArch64::BI__readx18qword) {
2342 cgm.errorNYI(
expr->getSourceRange(),
2343 std::string(
"unimplemented AArch64 builtin call: ") +
2344 getContext().BuiltinInfo.getName(builtinID));
2345 return mlir::Value{};
2348 if (builtinID == AArch64::BI__addx18byte ||
2349 builtinID == AArch64::BI__addx18word ||
2350 builtinID == AArch64::BI__addx18dword ||
2351 builtinID == AArch64::BI__addx18qword ||
2352 builtinID == AArch64::BI__incx18byte ||
2353 builtinID == AArch64::BI__incx18word ||
2354 builtinID == AArch64::BI__incx18dword ||
2355 builtinID == AArch64::BI__incx18qword) {
2356 cgm.errorNYI(
expr->getSourceRange(),
2357 std::string(
"unimplemented AArch64 builtin call: ") +
2358 getContext().BuiltinInfo.getName(builtinID));
2359 return mlir::Value{};
2362 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2363 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2364 builtinID == AArch64::BI_CopyInt32FromFloat ||
2365 builtinID == AArch64::BI_CopyInt64FromDouble) {
2366 cgm.errorNYI(
expr->getSourceRange(),
2367 std::string(
"unimplemented AArch64 builtin call: ") +
2368 getContext().BuiltinInfo.getName(builtinID));
2369 return mlir::Value{};
2372 if (builtinID == AArch64::BI_CountLeadingOnes ||
2373 builtinID == AArch64::BI_CountLeadingOnes64 ||
2374 builtinID == AArch64::BI_CountLeadingZeros ||
2375 builtinID == AArch64::BI_CountLeadingZeros64) {
2376 cgm.errorNYI(
expr->getSourceRange(),
2377 std::string(
"unimplemented AArch64 builtin call: ") +
2378 getContext().BuiltinInfo.getName(builtinID));
2379 return mlir::Value{};
2382 if (builtinID == AArch64::BI_CountLeadingSigns ||
2383 builtinID == AArch64::BI_CountLeadingSigns64) {
2384 cgm.errorNYI(
expr->getSourceRange(),
2385 std::string(
"unimplemented AArch64 builtin call: ") +
2386 getContext().BuiltinInfo.getName(builtinID));
2387 return mlir::Value{};
2390 if (builtinID == AArch64::BI_CountOneBits ||
2391 builtinID == AArch64::BI_CountOneBits64 ||
2392 builtinID == AArch64::BI_CountTrailingZeros ||
2393 builtinID == AArch64::BI_CountTrailingZeros64) {
2394 cgm.errorNYI(
expr->getSourceRange(),
2395 std::string(
"unimplemented AArch64 builtin call: ") +
2396 getContext().BuiltinInfo.getName(builtinID));
2397 return mlir::Value{};
2400 if (builtinID == AArch64::BI__prefetch ||
2401 builtinID == AArch64::BI__prefetch2) {
2402 cgm.errorNYI(
expr->getSourceRange(),
2403 std::string(
"unimplemented AArch64 builtin call: ") +
2404 getContext().BuiltinInfo.getName(builtinID));
2405 return mlir::Value{};
2408 if (builtinID == AArch64::BI__hlt) {
2409 cgm.errorNYI(
expr->getSourceRange(),
2410 std::string(
"unimplemented AArch64 builtin call: ") +
2411 getContext().BuiltinInfo.getName(builtinID));
2412 return mlir::Value{};
2415 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2416 cgm.errorNYI(
expr->getSourceRange(),
2417 std::string(
"unimplemented AArch64 builtin call: ") +
2418 getContext().BuiltinInfo.getName(builtinID));
2419 return mlir::Value{};
2428 return p.first == builtinID;
2431 builtinID = it->second;
2436 unsigned iceArguments = 0;
2451 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2452 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2454 switch (builtinID) {
2455 case NEON::BI__builtin_neon_vld1_v:
2456 case NEON::BI__builtin_neon_vld1q_v:
2457 case NEON::BI__builtin_neon_vld1_dup_v:
2458 case NEON::BI__builtin_neon_vld1q_dup_v:
2459 case NEON::BI__builtin_neon_vld1_lane_v:
2460 case NEON::BI__builtin_neon_vld1q_lane_v:
2462 expr->getSourceRange(),
2463 std::string(
"unimplemented AArch64 builtin argument handling ") +
2464 getContext().BuiltinInfo.getName(builtinID));
2466 case NEON::BI__builtin_neon_vst1_v:
2467 case NEON::BI__builtin_neon_vst1q_v:
2468 case NEON::BI__builtin_neon_vst1_lane_v:
2469 case NEON::BI__builtin_neon_vst1q_lane_v:
2475 case NEON::BI__builtin_neon_vldap1_lane_s64:
2476 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2477 case NEON::BI__builtin_neon_vstl1_lane_s64:
2478 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2480 expr->getSourceRange(),
2481 std::string(
"unimplemented AArch64 builtin argument handling ") +
2482 getContext().BuiltinInfo.getName(builtinID));
2503 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2507 if (std::optional<llvm::APSInt> result =
2511 bool usgn =
type.isUnsigned();
2513 mlir::Location loc =
getLoc(
expr->getExprLoc());
2527 switch (builtinID) {
2530 case NEON::BI__builtin_neon_vabsh_f16: {
2531 return cir::FAbsOp::create(builder, loc, ops);
2533 case NEON::BI__builtin_neon_vaddq_p128: {
2534 cir::VectorType byteTy = cir::VectorType::get(builder.getUInt8Ty(), 16);
2535 ops[0] = builder.createBitcast(ops[0], byteTy);
2536 ops[1] = builder.createBitcast(ops[1], byteTy);
2537 mlir::Value result = builder.createXor(loc, ops[0], ops[1]);
2540 case NEON::BI__builtin_neon_vldrq_p128:
2541 case NEON::BI__builtin_neon_vstrq_p128:
2542 case NEON::BI__builtin_neon_vcvts_f32_u32:
2543 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2544 case NEON::BI__builtin_neon_vcvts_f32_s32:
2545 case NEON::BI__builtin_neon_vcvtd_f64_s64:
2546 case NEON::BI__builtin_neon_vcvth_f16_u16:
2547 case NEON::BI__builtin_neon_vcvth_f16_u32:
2548 case NEON::BI__builtin_neon_vcvth_f16_u64:
2549 case NEON::BI__builtin_neon_vcvth_f16_s16:
2550 case NEON::BI__builtin_neon_vcvth_f16_s32:
2551 case NEON::BI__builtin_neon_vcvth_f16_s64:
2552 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2553 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2554 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2555 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2556 case NEON::BI__builtin_neon_vcvth_u16_f16:
2557 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2558 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2559 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2560 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2561 case NEON::BI__builtin_neon_vcvth_s16_f16:
2562 case NEON::BI__builtin_neon_vcaleh_f16:
2563 case NEON::BI__builtin_neon_vcalth_f16:
2564 case NEON::BI__builtin_neon_vcageh_f16:
2565 case NEON::BI__builtin_neon_vcagth_f16:
2566 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2567 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2568 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2569 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2570 case NEON::BI__builtin_neon_vpaddd_s64:
2571 case NEON::BI__builtin_neon_vpaddd_f64:
2572 case NEON::BI__builtin_neon_vpadds_f32:
2573 cgm.errorNYI(
expr->getSourceRange(),
2574 std::string(
"unimplemented AArch64 builtin call: ") +
2575 getContext().BuiltinInfo.getName(builtinID));
2576 return mlir::Value{};
2577 case NEON::BI__builtin_neon_vceqzd_s64:
2578 case NEON::BI__builtin_neon_vceqzd_f64:
2579 case NEON::BI__builtin_neon_vceqzs_f32:
2580 case NEON::BI__builtin_neon_vceqzh_f16:
2582 *
this, builder, loc, ops[0],
2584 case NEON::BI__builtin_neon_vcgezd_s64:
2585 case NEON::BI__builtin_neon_vcgezd_f64:
2586 case NEON::BI__builtin_neon_vcgezs_f32:
2587 case NEON::BI__builtin_neon_vcgezh_f16:
2588 case NEON::BI__builtin_neon_vclezd_s64:
2589 case NEON::BI__builtin_neon_vclezd_f64:
2590 case NEON::BI__builtin_neon_vclezs_f32:
2591 case NEON::BI__builtin_neon_vclezh_f16:
2592 case NEON::BI__builtin_neon_vcgtzd_s64:
2593 case NEON::BI__builtin_neon_vcgtzd_f64:
2594 case NEON::BI__builtin_neon_vcgtzs_f32:
2595 case NEON::BI__builtin_neon_vcgtzh_f16:
2596 case NEON::BI__builtin_neon_vcltzd_s64:
2597 case NEON::BI__builtin_neon_vcltzd_f64:
2598 case NEON::BI__builtin_neon_vcltzs_f32:
2599 case NEON::BI__builtin_neon_vcltzh_f16:
2600 case NEON::BI__builtin_neon_vceqzd_u64: {
2602 *
this, builder, loc, ops[0],
2605 case NEON::BI__builtin_neon_vceqd_f64:
2606 case NEON::BI__builtin_neon_vcled_f64:
2607 case NEON::BI__builtin_neon_vcltd_f64:
2608 case NEON::BI__builtin_neon_vcged_f64:
2609 case NEON::BI__builtin_neon_vcgtd_f64:
2610 case NEON::BI__builtin_neon_vceqs_f32:
2611 case NEON::BI__builtin_neon_vcles_f32:
2612 case NEON::BI__builtin_neon_vclts_f32:
2613 case NEON::BI__builtin_neon_vcges_f32:
2614 case NEON::BI__builtin_neon_vcgts_f32:
2615 case NEON::BI__builtin_neon_vceqh_f16:
2616 case NEON::BI__builtin_neon_vcleh_f16:
2617 case NEON::BI__builtin_neon_vclth_f16:
2618 case NEON::BI__builtin_neon_vcgeh_f16:
2619 case NEON::BI__builtin_neon_vcgth_f16:
2620 case NEON::BI__builtin_neon_vceqd_s64:
2621 case NEON::BI__builtin_neon_vceqd_u64:
2622 case NEON::BI__builtin_neon_vcgtd_s64:
2623 case NEON::BI__builtin_neon_vcgtd_u64:
2624 case NEON::BI__builtin_neon_vcltd_s64:
2625 case NEON::BI__builtin_neon_vcltd_u64:
2626 case NEON::BI__builtin_neon_vcged_u64:
2627 case NEON::BI__builtin_neon_vcged_s64:
2628 case NEON::BI__builtin_neon_vcled_u64:
2629 case NEON::BI__builtin_neon_vcled_s64:
2630 cgm.errorNYI(
expr->getSourceRange(),
2631 std::string(
"unimplemented AArch64 builtin call: ") +
2632 getContext().BuiltinInfo.getName(builtinID));
2633 return mlir::Value{};
2634 case NEON::BI__builtin_neon_vnegd_s64: {
2635 return builder.createNeg(loc, ops[0]);
2637 case NEON::BI__builtin_neon_vnegh_f16: {
2638 return builder.createFNeg(loc, ops[0]);
2640 case NEON::BI__builtin_neon_vtstd_s64:
2641 case NEON::BI__builtin_neon_vtstd_u64:
2642 case NEON::BI__builtin_neon_vset_lane_i8:
2643 case NEON::BI__builtin_neon_vset_lane_i16:
2644 case NEON::BI__builtin_neon_vset_lane_i32:
2645 case NEON::BI__builtin_neon_vset_lane_i64:
2646 case NEON::BI__builtin_neon_vset_lane_bf16:
2647 case NEON::BI__builtin_neon_vset_lane_f32:
2648 case NEON::BI__builtin_neon_vsetq_lane_i8:
2649 case NEON::BI__builtin_neon_vsetq_lane_i16:
2650 case NEON::BI__builtin_neon_vsetq_lane_i32:
2651 case NEON::BI__builtin_neon_vsetq_lane_i64:
2652 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2653 case NEON::BI__builtin_neon_vsetq_lane_f32:
2654 case NEON::BI__builtin_neon_vset_lane_f64:
2655 case NEON::BI__builtin_neon_vset_lane_mf8:
2656 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2657 case NEON::BI__builtin_neon_vsetq_lane_f64:
2658 cgm.errorNYI(
expr->getSourceRange(),
2659 std::string(
"unimplemented AArch64 builtin call: ") +
2660 getContext().BuiltinInfo.getName(builtinID));
2661 return mlir::Value{};
2663 case NEON::BI__builtin_neon_vget_lane_i8:
2664 case NEON::BI__builtin_neon_vdupb_lane_i8:
2665 case NEON::BI__builtin_neon_vgetq_lane_i8:
2666 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2667 case NEON::BI__builtin_neon_vget_lane_mf8:
2668 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2669 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2670 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2671 case NEON::BI__builtin_neon_vget_lane_i16:
2672 case NEON::BI__builtin_neon_vduph_lane_i16:
2673 case NEON::BI__builtin_neon_vgetq_lane_i16:
2674 case NEON::BI__builtin_neon_vduph_laneq_i16:
2675 case NEON::BI__builtin_neon_vget_lane_i32:
2676 case NEON::BI__builtin_neon_vdups_lane_i32:
2677 case NEON::BI__builtin_neon_vdups_lane_f32:
2678 case NEON::BI__builtin_neon_vgetq_lane_i32:
2679 case NEON::BI__builtin_neon_vdups_laneq_i32:
2680 case NEON::BI__builtin_neon_vget_lane_i64:
2681 case NEON::BI__builtin_neon_vdupd_lane_i64:
2682 case NEON::BI__builtin_neon_vdupd_lane_f64:
2683 case NEON::BI__builtin_neon_vgetq_lane_i64:
2684 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2685 case NEON::BI__builtin_neon_vget_lane_f32:
2686 case NEON::BI__builtin_neon_vget_lane_f64:
2687 case NEON::BI__builtin_neon_vgetq_lane_f32:
2688 case NEON::BI__builtin_neon_vdups_laneq_f32:
2689 case NEON::BI__builtin_neon_vgetq_lane_f64:
2690 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2691 return cir::VecExtractOp::create(builder, loc, ops[0],
2693 case NEON::BI__builtin_neon_vaddh_f16:
2694 return builder.createFAdd(loc, ops[0], ops[1]);
2695 case NEON::BI__builtin_neon_vsubh_f16:
2696 return builder.createFSub(loc, ops[0], ops[1]);
2697 case NEON::BI__builtin_neon_vmulh_f16:
2698 return builder.createFMul(loc, ops[0], ops[1]);
2699 case NEON::BI__builtin_neon_vdivh_f16:
2700 return builder.createFDiv(loc, ops[0], ops[1]);
2701 case NEON::BI__builtin_neon_vfmah_f16:
2703 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2707 case NEON::BI__builtin_neon_vfmsh_f16:
2709 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2710 ops[0] = builder.createFNeg(loc, ops[0]);
2713 case NEON::BI__builtin_neon_vaddd_s64:
2714 case NEON::BI__builtin_neon_vaddd_u64:
2715 return builder.createAdd(loc, ops[0], ops[1]);
2716 case NEON::BI__builtin_neon_vsubd_s64:
2717 case NEON::BI__builtin_neon_vsubd_u64:
2718 return builder.createSub(loc, ops[0], ops[1]);
2719 case NEON::BI__builtin_neon_vqdmlalh_s16:
2720 case NEON::BI__builtin_neon_vqdmlslh_s16:
2721 cgm.errorNYI(
expr->getSourceRange(),
2722 std::string(
"unimplemented AArch64 builtin call: ") +
2723 getContext().BuiltinInfo.getName(builtinID));
2724 return mlir::Value{};
2725 case NEON::BI__builtin_neon_vqshlud_n_s64: {
2726 cir::IntType int64Type = builder.getSInt64Ty();
2732 case NEON::BI__builtin_neon_vqshld_n_u64:
2733 case NEON::BI__builtin_neon_vqshld_n_s64: {
2734 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2735 ? builder.getUInt64Ty()
2736 : builder.getSInt64Ty();
2737 llvm::StringRef intrinsicName =
2738 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
2739 :
"aarch64.neon.sqshl";
2744 case NEON::BI__builtin_neon_vrshrd_n_u64:
2745 case NEON::BI__builtin_neon_vrshrd_n_s64: {
2746 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
2747 ?
"aarch64.neon.srshl"
2748 :
"aarch64.neon.urshl";
2749 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2750 ? builder.getUInt64Ty()
2751 : builder.getSInt64Ty();
2755 ops[1] = builder.getSInt64(sv, loc);
2756 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
2757 intrName, int64Ty, loc);
2759 case NEON::BI__builtin_neon_vrsrad_n_u64:
2760 case NEON::BI__builtin_neon_vrsrad_n_s64: {
2761 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2762 ? builder.getUInt64Ty()
2763 : builder.getSInt64Ty();
2764 ops[2] = builder.createNeg(loc, ops[2]);
2765 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2766 ?
"aarch64.neon.urshl"
2767 :
"aarch64.neon.srshl";
2770 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
2771 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
2772 return builder.createAdd(loc, ops[0],
2773 builder.createBitcast(ops[1], int64Type));
2775 case NEON::BI__builtin_neon_vshld_n_s64:
2776 case NEON::BI__builtin_neon_vshld_n_u64: {
2778 std::optional<llvm::APSInt> amt =
2780 assert(amt &&
"Expected argument to be a constant");
2781 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
2783 case NEON::BI__builtin_neon_vshrd_n_s64: {
2784 std::optional<llvm::APSInt> amt =
2786 assert(amt &&
"Expected argument to be a constant");
2787 return builder.createShiftRight(
2788 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
2790 case NEON::BI__builtin_neon_vshrd_n_u64: {
2791 std::optional<llvm::APSInt> amt =
2793 assert(amt &&
"Expected argument to be a constant");
2794 uint64_t shiftAmt = amt->getZExtValue();
2797 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
2798 return builder.createShiftRight(loc, ops[0], shiftAmt);
2800 case NEON::BI__builtin_neon_vsrad_n_s64: {
2801 std::optional<llvm::APSInt> amt =
2803 assert(amt &&
"Expected argument to be a constant");
2805 std::min(
static_cast<uint64_t
>(63), amt->getZExtValue());
2806 mlir::Value shifted =
2807 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2808 return builder.createAdd(loc, ops[0], shifted);
2810 case NEON::BI__builtin_neon_vsrad_n_u64: {
2811 std::optional<llvm::APSInt> amt =
2813 assert(amt &&
"Expected argument to be a constant");
2814 uint64_t shiftAmt = amt->getZExtValue();
2818 mlir::Value shifted =
2819 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2820 return builder.createAdd(loc, ops[0], shifted);
2822 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
2823 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
2824 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
2825 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
2826 case NEON::BI__builtin_neon_vqdmlals_s32:
2827 case NEON::BI__builtin_neon_vqdmlsls_s32:
2828 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
2829 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
2830 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
2831 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
2832 cgm.errorNYI(
expr->getSourceRange(),
2833 std::string(
"unimplemented AArch64 builtin call: ") +
2834 getContext().BuiltinInfo.getName(builtinID));
2835 return mlir::Value{};
2837 case NEON::BI__builtin_neon_vget_lane_bf16:
2838 case NEON::BI__builtin_neon_vduph_lane_bf16:
2839 case NEON::BI__builtin_neon_vduph_lane_f16:
2840 case NEON::BI__builtin_neon_vgetq_lane_bf16:
2841 case NEON::BI__builtin_neon_vduph_laneq_bf16:
2842 case NEON::BI__builtin_neon_vduph_laneq_f16: {
2843 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
2845 case NEON::BI__builtin_neon_vcvt_bf16_f32:
2846 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
2847 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
2848 case NEON::BI__builtin_neon_vcvt_f16_f32:
2849 case NEON::BI__builtin_neon_vcvt_f32_f16:
2850 case clang::AArch64::BI_InterlockedAdd:
2851 case clang::AArch64::BI_InterlockedAdd_acq:
2852 case clang::AArch64::BI_InterlockedAdd_rel:
2853 case clang::AArch64::BI_InterlockedAdd_nf:
2854 case clang::AArch64::BI_InterlockedAdd64:
2855 case clang::AArch64::BI_InterlockedAdd64_acq:
2856 case clang::AArch64::BI_InterlockedAdd64_rel:
2857 case clang::AArch64::BI_InterlockedAdd64_nf:
2858 cgm.errorNYI(
expr->getSourceRange(),
2859 std::string(
"unimplemented AArch64 builtin call: ") +
2860 getContext().BuiltinInfo.getName(builtinID));
2861 return mlir::Value{};
2868 llvm::StringRef intrName;
2870 switch (builtinID) {
2872 return std::nullopt;
2873 case NEON::BI__builtin_neon_vbsl_v:
2874 case NEON::BI__builtin_neon_vbslq_v: {
2877 ops[0] = builder.createBitcast(ops[0], bitTy);
2878 ops[1] = builder.createBitcast(ops[1], bitTy);
2879 ops[2] = builder.createBitcast(ops[2], bitTy);
2881 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
2882 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
2883 ops[0] = builder.createOr(loc, ops[1], ops[2]);
2884 return builder.createBitcast(ops[0], ty);
2886 case NEON::BI__builtin_neon_vfma_lane_v:
2887 case NEON::BI__builtin_neon_vfmaq_lane_v: {
2888 mlir::Value addend = builder.createBitcast(ops[0], ty);
2889 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2893 cir::VectorType sourceTy = cir::VectorType::get(
2894 ty.getElementType(), builtinID == NEON::BI__builtin_neon_vfmaq_lane_v
2897 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2898 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2903 case NEON::BI__builtin_neon_vfma_laneq_v: {
2905 if (ty.getElementType() ==
cgm.doubleTy) {
2906 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
2907 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
2910 cir::VectorType sourceTy = cir::VectorType::get(
cgm.doubleTy, 2);
2911 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2912 laneSource = builder.createExtractElement(
2918 return builder.createBitcast(
2924 mlir::Value addend = builder.createBitcast(ops[0], ty);
2925 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2928 cir::VectorType sourceTy =
2929 cir::VectorType::get(ty.getElementType(), ty.getSize() * 2);
2930 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2931 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2936 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
2937 mlir::Value addend = builder.createBitcast(ops[0], ty);
2938 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2939 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
2940 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2945 case NEON::BI__builtin_neon_vfmah_lane_f16:
2946 case NEON::BI__builtin_neon_vfmas_lane_f32:
2947 case NEON::BI__builtin_neon_vfmah_laneq_f16:
2948 case NEON::BI__builtin_neon_vfmas_laneq_f32: {
2950 mlir::Value laneSource = builder.createExtractElement(
2957 case NEON::BI__builtin_neon_vfmad_lane_f64:
2958 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
2961 mlir::Value laneSource = builder.createExtractElement(
2968 case NEON::BI__builtin_neon_vmull_v: {
2969 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
2971 intrName =
"aarch64.neon.pmull";
2972 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2974 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
2976 case NEON::BI__builtin_neon_vmax_v:
2977 case NEON::BI__builtin_neon_vmaxq_v:
2978 intrName = usgn ?
"aarch64.neon.umax" :
"aarch64.neon.smax";
2979 if (cir::isFPOrVectorOfFPType(ty))
2980 intrName =
"aarch64.neon.fmax";
2982 case NEON::BI__builtin_neon_vmaxh_f16: {
2983 auto halfTy = builder.getFp16Ty();
2984 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmax", halfTy, ops);
2986 case NEON::BI__builtin_neon_vmin_v:
2987 case NEON::BI__builtin_neon_vminq_v:
2988 intrName = usgn ?
"aarch64.neon.umin" :
"aarch64.neon.smin";
2989 if (cir::isFPOrVectorOfFPType(ty))
2990 intrName =
"aarch64.neon.fmin";
2992 case NEON::BI__builtin_neon_vminh_f16: {
2993 auto halfTy = builder.getFp16Ty();
2994 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmin", halfTy, ops);
2996 case NEON::BI__builtin_neon_vabd_v:
2997 case NEON::BI__builtin_neon_vabdq_v:
2998 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
2999 if (cir::isFPOrVectorOfFPType(ty))
3000 intrName =
"aarch64.neon.fabd";
3002 case NEON::BI__builtin_neon_vpadal_v:
3003 case NEON::BI__builtin_neon_vpadalq_v: {
3004 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
3006 mlir::Value pairwiseSum =
3008 inputs, intrName, ty, loc);
3009 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
3010 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
3012 case NEON::BI__builtin_neon_vpmin_v:
3013 case NEON::BI__builtin_neon_vpminq_v:
3014 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
3015 if (cir::isFPOrVectorOfFPType(ty))
3016 intrName =
"aarch64.neon.fminp";
3018 case NEON::BI__builtin_neon_vpmax_v:
3019 case NEON::BI__builtin_neon_vpmaxq_v:
3020 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
3021 if (cir::isFPOrVectorOfFPType(ty))
3022 intrName =
"aarch64.neon.fmaxp";
3024 case NEON::BI__builtin_neon_vminnm_v:
3025 case NEON::BI__builtin_neon_vminnmq_v:
3026 intrName =
"aarch64.neon.fminnm";
3028 case NEON::BI__builtin_neon_vminnmh_f16: {
3029 auto halfTy = builder.getFp16Ty();
3030 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fminnm", halfTy, ops);
3032 case NEON::BI__builtin_neon_vmaxnm_v:
3033 case NEON::BI__builtin_neon_vmaxnmq_v:
3034 intrName =
"aarch64.neon.fmaxnm";
3036 case NEON::BI__builtin_neon_vmaxnmh_f16: {
3037 auto halfTy = builder.getFp16Ty();
3038 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmaxnm", halfTy, ops);
3040 case NEON::BI__builtin_neon_vrecpss_f32:
3041 case NEON::BI__builtin_neon_vrecpsd_f64:
3042 cgm.errorNYI(
expr->getSourceRange(),
3043 std::string(
"unimplemented AArch64 builtin call: ") +
3044 getContext().BuiltinInfo.getName(builtinID));
3045 return mlir::Value{};
3046 case NEON::BI__builtin_neon_vrecpsh_f16: {
3047 auto halfTy = builder.getFp16Ty();
3048 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.frecps", halfTy, ops);
3050 case NEON::BI__builtin_neon_vqshrun_n_v: {
3051 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3054 "aarch64.neon.sqshrun", ty, loc);
3056 case NEON::BI__builtin_neon_vqrshrun_n_v: {
3057 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3060 "aarch64.neon.sqrshrun", ty, loc);
3062 case NEON::BI__builtin_neon_vqshrn_n_v: {
3063 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3065 llvm::StringRef intrName =
3066 usgn ?
"aarch64.neon.uqshrn" :
"aarch64.neon.sqshrn";
3070 case NEON::BI__builtin_neon_vrshrn_n_v:
3071 cgm.errorNYI(
expr->getSourceRange(),
3072 std::string(
"unimplemented AArch64 builtin call: ") +
3073 getContext().BuiltinInfo.getName(builtinID));
3074 return mlir::Value{};
3075 case NEON::BI__builtin_neon_vqrshrn_n_v: {
3076 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3078 llvm::StringRef intrName =
3079 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
3083 case NEON::BI__builtin_neon_vrndah_f16:
3085 return cir::RoundOp::create(builder, loc, ops[0]);
3086 case NEON::BI__builtin_neon_vrnda_v:
3087 case NEON::BI__builtin_neon_vrndaq_v:
3091 case NEON::BI__builtin_neon_vrndih_f16:
3093 return cir::NearbyintOp::create(builder, loc, ops[0]);
3094 case NEON::BI__builtin_neon_vrndmh_f16:
3096 return cir::FloorOp::create(builder, loc, ops[0]);
3097 case NEON::BI__builtin_neon_vrndm_v:
3098 case NEON::BI__builtin_neon_vrndmq_v:
3102 case NEON::BI__builtin_neon_vrndnh_f16:
3104 return cir::RoundEvenOp::create(builder, loc, ops[0]);
3105 case NEON::BI__builtin_neon_vrndn_v:
3106 case NEON::BI__builtin_neon_vrndnq_v:
3109 std::nullopt, ty, loc);
3110 case NEON::BI__builtin_neon_vrndns_f32: {
3113 return cir::RoundEvenOp::create(builder,
getLoc(
expr->getExprLoc()), arg0);
3115 case NEON::BI__builtin_neon_vrndph_f16:
3117 return cir::CeilOp::create(builder, loc, ops[0]);
3118 case NEON::BI__builtin_neon_vrndp_v:
3119 case NEON::BI__builtin_neon_vrndpq_v:
3123 case NEON::BI__builtin_neon_vrndxh_f16:
3125 return cir::RintOp::create(builder, loc, ops[0]);
3126 case NEON::BI__builtin_neon_vrndx_v:
3127 case NEON::BI__builtin_neon_vrndxq_v:
3131 case NEON::BI__builtin_neon_vrndh_f16:
3133 return cir::TruncOp::create(builder, loc, ops[0]);
3134 case NEON::BI__builtin_neon_vrnd_v:
3135 case NEON::BI__builtin_neon_vrndq_v:
3139 case NEON::BI__builtin_neon_vcvt_f64_v:
3140 case NEON::BI__builtin_neon_vcvtq_f64_v:
3141 ops[0] = builder.createBitcast(ops[0], ty);
3144 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
3145 case NEON::BI__builtin_neon_vcvt_f64_f32:
3146 case NEON::BI__builtin_neon_vcvt_f32_f64:
3147 case NEON::BI__builtin_neon_vcvt_s32_v:
3148 case NEON::BI__builtin_neon_vcvt_u32_v:
3149 case NEON::BI__builtin_neon_vcvt_s64_v:
3150 case NEON::BI__builtin_neon_vcvt_u64_v:
3151 case NEON::BI__builtin_neon_vcvt_s16_f16:
3152 case NEON::BI__builtin_neon_vcvt_u16_f16:
3153 case NEON::BI__builtin_neon_vcvtq_s32_v:
3154 case NEON::BI__builtin_neon_vcvtq_u32_v:
3155 case NEON::BI__builtin_neon_vcvtq_s64_v:
3156 case NEON::BI__builtin_neon_vcvtq_u64_v:
3157 case NEON::BI__builtin_neon_vcvtq_s16_f16:
3158 case NEON::BI__builtin_neon_vcvtq_u16_f16:
3159 case NEON::BI__builtin_neon_vcvta_s16_f16:
3160 case NEON::BI__builtin_neon_vcvta_u16_f16:
3161 case NEON::BI__builtin_neon_vcvta_s32_v:
3162 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
3163 case NEON::BI__builtin_neon_vcvtaq_s32_v:
3164 case NEON::BI__builtin_neon_vcvta_u32_v:
3165 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
3166 case NEON::BI__builtin_neon_vcvtaq_u32_v:
3167 case NEON::BI__builtin_neon_vcvta_s64_v:
3168 case NEON::BI__builtin_neon_vcvtaq_s64_v:
3169 case NEON::BI__builtin_neon_vcvta_u64_v:
3170 case NEON::BI__builtin_neon_vcvtaq_u64_v:
3171 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3172 case NEON::BI__builtin_neon_vcvtm_s32_v:
3173 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3174 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3175 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3176 case NEON::BI__builtin_neon_vcvtm_u32_v:
3177 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3178 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3179 case NEON::BI__builtin_neon_vcvtm_s64_v:
3180 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3181 case NEON::BI__builtin_neon_vcvtm_u64_v:
3182 case NEON::BI__builtin_neon_vcvtmq_u64_v:
3183 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3184 case NEON::BI__builtin_neon_vcvtn_s32_v:
3185 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3186 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3187 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3188 case NEON::BI__builtin_neon_vcvtn_u32_v:
3189 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3190 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3191 case NEON::BI__builtin_neon_vcvtn_s64_v:
3192 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3193 case NEON::BI__builtin_neon_vcvtn_u64_v:
3194 case NEON::BI__builtin_neon_vcvtnq_u64_v:
3195 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3196 case NEON::BI__builtin_neon_vcvtp_s32_v:
3197 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3198 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3199 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3200 case NEON::BI__builtin_neon_vcvtp_u32_v:
3201 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3202 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3203 case NEON::BI__builtin_neon_vcvtp_s64_v:
3204 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3205 case NEON::BI__builtin_neon_vcvtp_u64_v:
3206 case NEON::BI__builtin_neon_vcvtpq_u64_v:
3207 case NEON::BI__builtin_neon_vmulx_v:
3208 case NEON::BI__builtin_neon_vmulxq_v:
3209 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3210 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3211 case NEON::BI__builtin_neon_vmul_lane_v:
3212 case NEON::BI__builtin_neon_vmul_laneq_v:
3213 case NEON::BI__builtin_neon_vpmaxnm_v:
3214 case NEON::BI__builtin_neon_vpmaxnmq_v:
3215 cgm.errorNYI(
expr->getSourceRange(),
3216 std::string(
"unimplemented AArch64 builtin call: ") +
3217 getContext().BuiltinInfo.getName(builtinID));
3218 return mlir::Value{};
3219 case NEON::BI__builtin_neon_vpminnm_v:
3220 case NEON::BI__builtin_neon_vpminnmq_v:
3221 intrName =
"aarch64.neon.fminnmp";
3223 case NEON::BI__builtin_neon_vsqrth_f16: {
3224 auto halfTy = builder.getFp16Ty();
3227 case NEON::BI__builtin_neon_vsqrt_v:
3228 case NEON::BI__builtin_neon_vsqrtq_v:
3231 case NEON::BI__builtin_neon_vrbit_v:
3232 case NEON::BI__builtin_neon_vrbitq_v:
3233 case NEON::BI__builtin_neon_vmaxv_f16:
3234 case NEON::BI__builtin_neon_vmaxvq_f16:
3235 case NEON::BI__builtin_neon_vminv_f16:
3236 case NEON::BI__builtin_neon_vminvq_f16:
3237 case NEON::BI__builtin_neon_vmaxnmv_f16:
3238 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3239 case NEON::BI__builtin_neon_vminnmv_f16:
3240 case NEON::BI__builtin_neon_vminnmvq_f16:
3241 case NEON::BI__builtin_neon_vmul_n_f64:
3242 cgm.errorNYI(
expr->getSourceRange(),
3243 std::string(
"unimplemented AArch64 builtin call: ") +
3244 getContext().BuiltinInfo.getName(builtinID));
3245 return mlir::Value{};
3246 case NEON::BI__builtin_neon_vaddlv_u8:
3247 case NEON::BI__builtin_neon_vaddlvq_u8:
3248 case NEON::BI__builtin_neon_vaddlv_u16:
3249 case NEON::BI__builtin_neon_vaddlvq_u16:
3250 case NEON::BI__builtin_neon_vaddlv_s8:
3251 case NEON::BI__builtin_neon_vaddlvq_s8:
3252 case NEON::BI__builtin_neon_vaddlv_s16:
3253 case NEON::BI__builtin_neon_vaddlvq_s16: {
3256 auto eltTy = mlir::cast<cir::IntType>(
3257 mlir::cast<cir::VectorType>(argTy).getElementType());
3262 bool needsTrunc = eltTy.getWidth() == 8;
3263 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3264 mlir::Type intrRetTy = userRetTy;
3266 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3267 mlir::Value result =
3270 result = builder.createIntCast(result, userRetTy);
3273 case NEON::BI__builtin_neon_vsri_n_v:
3274 case NEON::BI__builtin_neon_vsriq_n_v: {
3276 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3277 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3278 "aarch64.neon.vsri", ty, loc);
3280 case NEON::BI__builtin_neon_vsli_n_v:
3281 case NEON::BI__builtin_neon_vsliq_n_v: {
3283 intrName =
"aarch64.neon.vsli";
3291 case NEON::BI__builtin_neon_vsra_n_v:
3292 case NEON::BI__builtin_neon_vsraq_n_v: {
3293 ops[0] = builder.createBitcast(ops[0], ty);
3295 return builder.createAdd(loc, ops[0], ops[1]);
3297 case NEON::BI__builtin_neon_vrsra_n_v:
3298 case NEON::BI__builtin_neon_vrsraq_n_v: {
3299 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3302 cir::VectorType shiftAmtVecTy =
3305 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3309 ops[0] = builder.createBitcast(ops[0], ty);
3310 return builder.createAdd(loc, ops[0], tmp);
3312 case NEON::BI__builtin_neon_vld1_v:
3313 case NEON::BI__builtin_neon_vld1q_v:
3314 cgm.errorNYI(
expr->getSourceRange(),
3315 std::string(
"unimplemented AArch64 builtin call: ") +
3316 getContext().BuiltinInfo.getName(builtinID));
3317 return mlir::Value{};
3318 case NEON::BI__builtin_neon_vst1_v:
3319 case NEON::BI__builtin_neon_vst1q_v: {
3320 ops[1] = builder.createBitcast(ops[1], ty);
3321 builder.createStore(loc, ops[1], ptrOp0.
withElementType(builder, ty));
3324 case NEON::BI__builtin_neon_vld1_lane_v:
3325 case NEON::BI__builtin_neon_vld1q_lane_v:
3326 case NEON::BI__builtin_neon_vldap1_lane_s64:
3327 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3328 case NEON::BI__builtin_neon_vld1_dup_v:
3329 case NEON::BI__builtin_neon_vld1q_dup_v:
3330 cgm.errorNYI(
expr->getSourceRange(),
3331 std::string(
"unimplemented AArch64 builtin call: ") +
3332 getContext().BuiltinInfo.getName(builtinID));
3333 return mlir::Value{};
3334 case NEON::BI__builtin_neon_vst1_lane_v:
3335 case NEON::BI__builtin_neon_vst1q_lane_v: {
3336 ops[1] = builder.createBitcast(ops[1], ty);
3337 mlir::Value scalar = builder.createExtractElement(
3339 builder.createStore(loc, scalar,
3343 case NEON::BI__builtin_neon_vstl1_lane_s64:
3344 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3345 case NEON::BI__builtin_neon_vld2_v:
3346 case NEON::BI__builtin_neon_vld2q_v:
3347 case NEON::BI__builtin_neon_vld3_v:
3348 case NEON::BI__builtin_neon_vld3q_v:
3349 case NEON::BI__builtin_neon_vld4_v:
3350 case NEON::BI__builtin_neon_vld4q_v:
3351 case NEON::BI__builtin_neon_vld2_dup_v:
3352 case NEON::BI__builtin_neon_vld2q_dup_v:
3353 case NEON::BI__builtin_neon_vld3_dup_v:
3354 case NEON::BI__builtin_neon_vld3q_dup_v:
3355 case NEON::BI__builtin_neon_vld4_dup_v:
3356 case NEON::BI__builtin_neon_vld4q_dup_v:
3357 case NEON::BI__builtin_neon_vld2_lane_v:
3358 case NEON::BI__builtin_neon_vld2q_lane_v:
3359 case NEON::BI__builtin_neon_vld3_lane_v:
3360 case NEON::BI__builtin_neon_vld3q_lane_v:
3361 case NEON::BI__builtin_neon_vld4_lane_v:
3362 case NEON::BI__builtin_neon_vld4q_lane_v:
3363 case NEON::BI__builtin_neon_vst2_v:
3364 case NEON::BI__builtin_neon_vst2q_v:
3365 case NEON::BI__builtin_neon_vst2_lane_v:
3366 case NEON::BI__builtin_neon_vst2q_lane_v:
3367 case NEON::BI__builtin_neon_vst3_v:
3368 case NEON::BI__builtin_neon_vst3q_v:
3369 case NEON::BI__builtin_neon_vst3_lane_v:
3370 case NEON::BI__builtin_neon_vst3q_lane_v:
3371 case NEON::BI__builtin_neon_vst4_v:
3372 case NEON::BI__builtin_neon_vst4q_v:
3373 case NEON::BI__builtin_neon_vst4_lane_v:
3374 case NEON::BI__builtin_neon_vst4q_lane_v:
3375 cgm.errorNYI(
expr->getSourceRange(),
3376 std::string(
"unimplemented AArch64 builtin call: ") +
3377 getContext().BuiltinInfo.getName(builtinID));
3378 return mlir::Value{};
3379 case NEON::BI__builtin_neon_vtrn_v:
3380 case NEON::BI__builtin_neon_vtrnq_v: {
3381 ops[1] = builder.createBitcast(ops[1], ty);
3382 ops[2] = builder.createBitcast(ops[2], ty);
3384 mlir::Value baseAddr =
3385 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3388 for (
unsigned vi = 0; vi != 2; ++vi) {
3390 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3391 indices.push_back(i + vi);
3392 indices.push_back(i + e + vi);
3394 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3395 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3396 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3397 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3401 case NEON::BI__builtin_neon_vuzp_v:
3402 case NEON::BI__builtin_neon_vuzpq_v: {
3403 ops[1] = builder.createBitcast(ops[1], ty);
3404 ops[2] = builder.createBitcast(ops[2], ty);
3406 mlir::Value baseAddr =
3407 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3409 for (
unsigned vi = 0; vi != 2; ++vi) {
3411 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3412 indices.push_back(2 * i + vi);
3414 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3415 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3416 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3417 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3421 case NEON::BI__builtin_neon_vzip_v:
3422 case NEON::BI__builtin_neon_vzipq_v: {
3423 ops[1] = builder.createBitcast(ops[1], ty);
3424 ops[2] = builder.createBitcast(ops[2], ty);
3426 mlir::Value baseAddr =
3427 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3429 for (
unsigned vi = 0; vi != 2; ++vi) {
3431 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3432 indices.push_back((i + vi * e) >> 1);
3433 indices.push_back(((i + vi * e) >> 1) + e);
3435 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3436 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3437 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3438 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3442 case NEON::BI__builtin_neon_vqtbl1q_v:
3443 case NEON::BI__builtin_neon_vqtbl2q_v:
3444 case NEON::BI__builtin_neon_vqtbl3q_v:
3445 case NEON::BI__builtin_neon_vqtbl4q_v:
3446 case NEON::BI__builtin_neon_vqtbx1q_v:
3447 case NEON::BI__builtin_neon_vqtbx2q_v:
3448 case NEON::BI__builtin_neon_vqtbx3q_v:
3449 case NEON::BI__builtin_neon_vqtbx4q_v:
3450 case NEON::BI__builtin_neon_vsqadd_v:
3451 case NEON::BI__builtin_neon_vsqaddq_v:
3452 case NEON::BI__builtin_neon_vuqadd_v:
3453 case NEON::BI__builtin_neon_vuqaddq_v:
3454 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3455 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3456 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3457 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3458 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3459 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3460 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3461 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3462 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3463 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3464 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3465 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3466 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3467 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3468 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3469 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3470 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3471 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3472 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3473 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3474 case NEON::BI__builtin_neon_vluti2_lane_f16:
3475 case NEON::BI__builtin_neon_vluti2_lane_p16:
3476 case NEON::BI__builtin_neon_vluti2_lane_p8:
3477 case NEON::BI__builtin_neon_vluti2_lane_s16:
3478 case NEON::BI__builtin_neon_vluti2_lane_s8:
3479 case NEON::BI__builtin_neon_vluti2_lane_u16:
3480 case NEON::BI__builtin_neon_vluti2_lane_u8:
3481 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3482 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3483 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3484 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3485 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3486 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3487 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3488 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3489 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3490 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3491 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3492 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3493 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3494 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3495 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3496 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3497 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3498 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3499 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3500 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3501 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3502 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3503 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3504 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3505 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3506 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3507 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3508 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3509 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3510 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3511 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3512 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3513 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3514 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3515 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3516 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3517 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3518 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3519 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3520 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3521 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3522 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3523 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3524 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3525 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3526 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3527 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3528 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3529 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3530 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3531 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3532 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
3533 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
3534 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
3535 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
3536 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
3537 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
3538 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
3539 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
3540 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
3541 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
3542 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
3543 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
3544 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
3545 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
3546 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
3547 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
3548 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
3549 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
3550 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
3551 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
3552 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
3553 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
3554 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
3555 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
3556 case NEON::BI__builtin_neon_vamin_f16:
3557 case NEON::BI__builtin_neon_vaminq_f16:
3558 case NEON::BI__builtin_neon_vamin_f32:
3559 case NEON::BI__builtin_neon_vaminq_f32:
3560 case NEON::BI__builtin_neon_vaminq_f64:
3561 case NEON::BI__builtin_neon_vamax_f16:
3562 case NEON::BI__builtin_neon_vamaxq_f16:
3563 case NEON::BI__builtin_neon_vamax_f32:
3564 case NEON::BI__builtin_neon_vamaxq_f32:
3565 case NEON::BI__builtin_neon_vamaxq_f64:
3566 case NEON::BI__builtin_neon_vscale_f16:
3567 case NEON::BI__builtin_neon_vscaleq_f16:
3568 case NEON::BI__builtin_neon_vscale_f32:
3569 case NEON::BI__builtin_neon_vscaleq_f32:
3570 case NEON::BI__builtin_neon_vscaleq_f64:
3571 cgm.errorNYI(
expr->getSourceRange(),
3572 std::string(
"unimplemented AArch64 builtin call: ") +
3573 getContext().BuiltinInfo.getName(builtinID));
3574 return mlir::Value{};