742 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
744 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
751 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
768 cir::VectorType vTy =
getNeonType(&cgf, neonType, hasLegalHalfType,
769 false, allowBFloatArgsAndRet);
770 cir::VectorType ty = vTy;
775 case NEON::BI__builtin_neon_splat_lane_v:
776 case NEON::BI__builtin_neon_splat_laneq_v:
777 case NEON::BI__builtin_neon_splatq_lane_v:
778 case NEON::BI__builtin_neon_splatq_laneq_v: {
779 uint64_t numElements = vTy.getSize();
780 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
782 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
787 case NEON::BI__builtin_neon_vpadd_v:
788 case NEON::BI__builtin_neon_vpaddq_v:
789 case NEON::BI__builtin_neon_vabs_v:
790 case NEON::BI__builtin_neon_vabsq_v:
792 std::string(
"unimplemented AArch64 builtin call: ") +
794 return mlir::Value{};
795 case NEON::BI__builtin_neon_vadd_v:
796 case NEON::BI__builtin_neon_vaddq_v: {
797 unsigned numBytes = (builtinID == NEON::BI__builtin_neon_vaddq_v) ? 16 : 8;
798 cir::VectorType byteTy =
805 case NEON::BI__builtin_neon_vaddhn_v: {
808 cir::VectorType srcTy =
818 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
820 loc, wideEltTy, wideEltTy.getWidth() / 2);
821 mlir::Value shiftVec =
829 case NEON::BI__builtin_neon_vsubhn_v: {
832 cir::VectorType srcTy =
842 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
844 loc, wideEltTy, wideEltTy.getWidth() / 2);
845 mlir::Value shiftVec =
853 case NEON::BI__builtin_neon_vcale_v:
854 case NEON::BI__builtin_neon_vcaleq_v:
855 case NEON::BI__builtin_neon_vcalt_v:
856 case NEON::BI__builtin_neon_vcaltq_v:
857 case NEON::BI__builtin_neon_vcage_v:
858 case NEON::BI__builtin_neon_vcageq_v:
859 case NEON::BI__builtin_neon_vcagt_v:
860 case NEON::BI__builtin_neon_vcagtq_v:
862 std::string(
"unimplemented AArch64 builtin call: ") +
864 return mlir::Value{};
865 case NEON::BI__builtin_neon_vceqz_v:
866 case NEON::BI__builtin_neon_vceqzq_v:
868 vTy, cir::CmpOpKind::eq);
869 case NEON::BI__builtin_neon_vcgez_v:
870 case NEON::BI__builtin_neon_vcgezq_v:
871 case NEON::BI__builtin_neon_vclez_v:
872 case NEON::BI__builtin_neon_vclezq_v:
873 case NEON::BI__builtin_neon_vcgtz_v:
874 case NEON::BI__builtin_neon_vcgtzq_v:
875 case NEON::BI__builtin_neon_vcltz_v:
876 case NEON::BI__builtin_neon_vcltzq_v:
877 case NEON::BI__builtin_neon_vclz_v:
878 case NEON::BI__builtin_neon_vclzq_v:
879 case NEON::BI__builtin_neon_vcvt_f32_v:
880 case NEON::BI__builtin_neon_vcvtq_f32_v:
881 case NEON::BI__builtin_neon_vcvt_f16_s16:
882 case NEON::BI__builtin_neon_vcvt_f16_u16:
883 case NEON::BI__builtin_neon_vcvtq_f16_s16:
884 case NEON::BI__builtin_neon_vcvtq_f16_u16:
885 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
886 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
887 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
888 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
890 std::string(
"unimplemented AArch64 builtin call: ") +
892 return mlir::Value{};
893 case NEON::BI__builtin_neon_vcvt_n_f32_v:
894 case NEON::BI__builtin_neon_vcvt_n_f64_v:
895 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
896 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
899 llvm::StringRef llvmIntrName =
901 usgn ? llvmIntrinsic : altLLVMIntrinsic));
903 {vTy, cstIntTy}, ops, llvmIntrName,
906 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
907 case NEON::BI__builtin_neon_vcvt_n_s32_v:
908 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
909 case NEON::BI__builtin_neon_vcvt_n_u32_v:
910 case NEON::BI__builtin_neon_vcvt_n_s64_v:
911 case NEON::BI__builtin_neon_vcvt_n_u64_v:
912 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
913 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
914 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
915 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
916 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
917 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
921 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
924 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
928 case NEON::BI__builtin_neon_vcvt_s32_v:
929 case NEON::BI__builtin_neon_vcvt_u32_v:
930 case NEON::BI__builtin_neon_vcvt_s64_v:
931 case NEON::BI__builtin_neon_vcvt_u64_v:
932 case NEON::BI__builtin_neon_vcvt_s16_f16:
933 case NEON::BI__builtin_neon_vcvt_u16_f16:
934 case NEON::BI__builtin_neon_vcvtq_s32_v:
935 case NEON::BI__builtin_neon_vcvtq_u32_v:
936 case NEON::BI__builtin_neon_vcvtq_s64_v:
937 case NEON::BI__builtin_neon_vcvtq_u64_v:
938 case NEON::BI__builtin_neon_vcvtq_s16_f16:
939 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
949 llvm::StringRef llvmIntrName = usgn ?
"fptoui.sat" :
"fptosi.sat";
951 {ty}, ops, llvmIntrName, vTy, loc);
953 case NEON::BI__builtin_neon_vcvta_s16_f16:
954 case NEON::BI__builtin_neon_vcvta_s32_v:
955 case NEON::BI__builtin_neon_vcvta_s64_v:
956 case NEON::BI__builtin_neon_vcvta_u16_f16:
957 case NEON::BI__builtin_neon_vcvta_u32_v:
958 case NEON::BI__builtin_neon_vcvta_u64_v:
959 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
960 case NEON::BI__builtin_neon_vcvtaq_s32_v:
961 case NEON::BI__builtin_neon_vcvtaq_s64_v:
962 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
963 case NEON::BI__builtin_neon_vcvtaq_u32_v:
964 case NEON::BI__builtin_neon_vcvtaq_u64_v:
965 case NEON::BI__builtin_neon_vcvtn_s16_f16:
966 case NEON::BI__builtin_neon_vcvtn_s32_v:
967 case NEON::BI__builtin_neon_vcvtn_s64_v:
968 case NEON::BI__builtin_neon_vcvtn_u16_f16:
969 case NEON::BI__builtin_neon_vcvtn_u32_v:
970 case NEON::BI__builtin_neon_vcvtn_u64_v:
971 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
972 case NEON::BI__builtin_neon_vcvtnq_s32_v:
973 case NEON::BI__builtin_neon_vcvtnq_s64_v:
974 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
975 case NEON::BI__builtin_neon_vcvtnq_u32_v:
976 case NEON::BI__builtin_neon_vcvtnq_u64_v:
977 case NEON::BI__builtin_neon_vcvtp_s16_f16:
978 case NEON::BI__builtin_neon_vcvtp_s32_v:
979 case NEON::BI__builtin_neon_vcvtp_s64_v:
980 case NEON::BI__builtin_neon_vcvtp_u16_f16:
981 case NEON::BI__builtin_neon_vcvtp_u32_v:
982 case NEON::BI__builtin_neon_vcvtp_u64_v:
983 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
984 case NEON::BI__builtin_neon_vcvtpq_s32_v:
985 case NEON::BI__builtin_neon_vcvtpq_s64_v:
986 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
987 case NEON::BI__builtin_neon_vcvtpq_u32_v:
988 case NEON::BI__builtin_neon_vcvtpq_u64_v:
989 case NEON::BI__builtin_neon_vcvtm_s16_f16:
990 case NEON::BI__builtin_neon_vcvtm_s32_v:
991 case NEON::BI__builtin_neon_vcvtm_s64_v:
992 case NEON::BI__builtin_neon_vcvtm_u16_f16:
993 case NEON::BI__builtin_neon_vcvtm_u32_v:
994 case NEON::BI__builtin_neon_vcvtm_u64_v:
995 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
996 case NEON::BI__builtin_neon_vcvtmq_s32_v:
997 case NEON::BI__builtin_neon_vcvtmq_s64_v:
998 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
999 case NEON::BI__builtin_neon_vcvtmq_u32_v:
1000 case NEON::BI__builtin_neon_vcvtmq_u64_v:
1001 case NEON::BI__builtin_neon_vcvtx_f32_v:
1002 case NEON::BI__builtin_neon_vext_v:
1003 case NEON::BI__builtin_neon_vextq_v:
1005 std::string(
"unimplemented AArch64 builtin call: ") +
1007 return mlir::Value{};
1008 case NEON::BI__builtin_neon_vfma_v:
1009 case NEON::BI__builtin_neon_vfmaq_v: {
1018 fmaOps, std::nullopt, ty, loc);
1020 case NEON::BI__builtin_neon_vld1_v:
1021 case NEON::BI__builtin_neon_vld1q_v:
1022 case NEON::BI__builtin_neon_vld1_x2_v:
1023 case NEON::BI__builtin_neon_vld1q_x2_v:
1024 case NEON::BI__builtin_neon_vld1_x3_v:
1025 case NEON::BI__builtin_neon_vld1q_x3_v:
1026 case NEON::BI__builtin_neon_vld1_x4_v:
1027 case NEON::BI__builtin_neon_vld1q_x4_v:
1028 case NEON::BI__builtin_neon_vld2_v:
1029 case NEON::BI__builtin_neon_vld2q_v:
1030 case NEON::BI__builtin_neon_vld3_v:
1031 case NEON::BI__builtin_neon_vld3q_v:
1032 case NEON::BI__builtin_neon_vld4_v:
1033 case NEON::BI__builtin_neon_vld4q_v:
1034 case NEON::BI__builtin_neon_vld2_dup_v:
1035 case NEON::BI__builtin_neon_vld2q_dup_v:
1036 case NEON::BI__builtin_neon_vld3_dup_v:
1037 case NEON::BI__builtin_neon_vld3q_dup_v:
1038 case NEON::BI__builtin_neon_vld4_dup_v:
1039 case NEON::BI__builtin_neon_vld4q_dup_v:
1040 case NEON::BI__builtin_neon_vld1_dup_v:
1041 case NEON::BI__builtin_neon_vld1q_dup_v:
1042 case NEON::BI__builtin_neon_vld2_lane_v:
1043 case NEON::BI__builtin_neon_vld2q_lane_v:
1044 case NEON::BI__builtin_neon_vld3_lane_v:
1045 case NEON::BI__builtin_neon_vld3q_lane_v:
1046 case NEON::BI__builtin_neon_vld4_lane_v:
1047 case NEON::BI__builtin_neon_vld4q_lane_v:
1049 std::string(
"Reached code-path for ARM builtin call ") +
1051 "(ARM builtins are not supported ATM)");
1052 return mlir::Value{};
1053 case NEON::BI__builtin_neon_vmovl_v: {
1054 cir::VectorType dTy =
1060 case NEON::BI__builtin_neon_vmovn_v:
1061 case NEON::BI__builtin_neon_vmull_v:
1062 case NEON::BI__builtin_neon_vpadal_v:
1063 case NEON::BI__builtin_neon_vpadalq_v:
1065 std::string(
"Reached code-path for ARM builtin call ") +
1067 "(ARM builtins are not supported ATM)");
1068 return mlir::Value{};
1069 case NEON::BI__builtin_neon_vpaddl_v:
1070 case NEON::BI__builtin_neon_vpaddlq_v: {
1071 llvm::StringRef llvmIntrName =
1073 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1075 {getNeonPairwiseWidenInputType(vTy, usgn)},
1079 case NEON::BI__builtin_neon_vqdmlal_v:
1080 case NEON::BI__builtin_neon_vqdmlsl_v:
1081 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
1082 case NEON::BI__builtin_neon_vqdmulh_lane_v:
1083 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
1084 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
1085 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
1086 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
1087 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
1088 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
1089 case NEON::BI__builtin_neon_vqshl_n_v:
1090 case NEON::BI__builtin_neon_vqshlq_n_v:
1091 case NEON::BI__builtin_neon_vqshlu_n_v:
1092 case NEON::BI__builtin_neon_vqshluq_n_v:
1093 case NEON::BI__builtin_neon_vrecpe_v:
1094 case NEON::BI__builtin_neon_vrecpeq_v:
1095 case NEON::BI__builtin_neon_vrsqrte_v:
1096 case NEON::BI__builtin_neon_vrsqrteq_v:
1098 std::string(
"unimplemented AArch64 builtin call: ") +
1100 return mlir::Value{};
1101 case NEON::BI__builtin_neon_vrndi_v:
1102 case NEON::BI__builtin_neon_vrndiq_v:
1105 ops, std::nullopt, ty, loc);
1106 case NEON::BI__builtin_neon_vrshr_n_v:
1107 case NEON::BI__builtin_neon_vrshrq_n_v: {
1108 llvm::StringRef intrName =
1109 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
1112 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
1113 intrName, ty, loc,
false,
1117 case NEON::BI__builtin_neon_vsha512hq_u64:
1118 case NEON::BI__builtin_neon_vsha512h2q_u64:
1119 case NEON::BI__builtin_neon_vsha512su0q_u64:
1120 case NEON::BI__builtin_neon_vsha512su1q_u64:
1122 std::string(
"unimplemented AArch64 builtin call: ") +
1124 return mlir::Value{};
1125 case NEON::BI__builtin_neon_vshl_n_v:
1126 case NEON::BI__builtin_neon_vshlq_n_v:
1129 case NEON::BI__builtin_neon_vshll_n_v: {
1131 cir::VectorType narrowVecTy =
1135 mlir::Value src = builder.
createBitcast(ops[0], narrowVecTy);
1140 case NEON::BI__builtin_neon_vshrn_n_v:
1142 std::string(
"unimplemented AArch64 builtin call: ") +
1144 return mlir::Value{};
1145 case NEON::BI__builtin_neon_vshr_n_v:
1146 case NEON::BI__builtin_neon_vshrq_n_v:
1148 case NEON::BI__builtin_neon_vst1_v:
1149 case NEON::BI__builtin_neon_vst1q_v:
1150 case NEON::BI__builtin_neon_vst2_v:
1151 case NEON::BI__builtin_neon_vst2q_v:
1152 case NEON::BI__builtin_neon_vst3_v:
1153 case NEON::BI__builtin_neon_vst3q_v:
1154 case NEON::BI__builtin_neon_vst4_v:
1155 case NEON::BI__builtin_neon_vst4q_v:
1156 case NEON::BI__builtin_neon_vst2_lane_v:
1157 case NEON::BI__builtin_neon_vst2q_lane_v:
1158 case NEON::BI__builtin_neon_vst3_lane_v:
1159 case NEON::BI__builtin_neon_vst3q_lane_v:
1160 case NEON::BI__builtin_neon_vst4_lane_v:
1161 case NEON::BI__builtin_neon_vst4q_lane_v:
1162 case NEON::BI__builtin_neon_vsm3partw1q_u32:
1163 case NEON::BI__builtin_neon_vsm3partw2q_u32:
1164 case NEON::BI__builtin_neon_vsm3ss1q_u32:
1165 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
1166 case NEON::BI__builtin_neon_vsm4eq_u32:
1167 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
1168 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
1169 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
1170 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
1172 std::string(
"unimplemented AArch64 builtin call: ") +
1174 return mlir::Value{};
1175 case NEON::BI__builtin_neon_vst1_x2_v:
1176 case NEON::BI__builtin_neon_vst1q_x2_v:
1177 case NEON::BI__builtin_neon_vst1_x3_v:
1178 case NEON::BI__builtin_neon_vst1q_x3_v:
1179 case NEON::BI__builtin_neon_vst1_x4_v:
1180 case NEON::BI__builtin_neon_vst1q_x4_v: {
1183 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
1187 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1191 case NEON::BI__builtin_neon_vtrn_v:
1192 case NEON::BI__builtin_neon_vtrnq_v:
1193 case NEON::BI__builtin_neon_vtst_v:
1194 case NEON::BI__builtin_neon_vtstq_v:
1195 case NEON::BI__builtin_neon_vuzp_v:
1196 case NEON::BI__builtin_neon_vuzpq_v:
1197 case NEON::BI__builtin_neon_vxarq_u64:
1198 case NEON::BI__builtin_neon_vzip_v:
1199 case NEON::BI__builtin_neon_vzipq_v:
1200 case NEON::BI__builtin_neon_vdot_s32:
1201 case NEON::BI__builtin_neon_vdot_u32:
1202 case NEON::BI__builtin_neon_vdotq_s32:
1203 case NEON::BI__builtin_neon_vdotq_u32:
1204 case NEON::BI__builtin_neon_vfmlal_low_f16:
1205 case NEON::BI__builtin_neon_vfmlalq_low_f16:
1206 case NEON::BI__builtin_neon_vfmlsl_low_f16:
1207 case NEON::BI__builtin_neon_vfmlslq_low_f16:
1208 case NEON::BI__builtin_neon_vfmlal_high_f16:
1209 case NEON::BI__builtin_neon_vfmlalq_high_f16:
1210 case NEON::BI__builtin_neon_vfmlsl_high_f16:
1211 case NEON::BI__builtin_neon_vfmlslq_high_f16:
1212 case NEON::BI__builtin_neon_vmmlaq_s32:
1213 case NEON::BI__builtin_neon_vmmlaq_u32:
1215 std::string(
"unimplemented AArch64 builtin call: ") +
1217 return mlir::Value{};
1218 case NEON::BI__builtin_neon_vmul_v:
1219 case NEON::BI__builtin_neon_vmulq_v:
1222 case NEON::BI__builtin_neon_vusmmlaq_s32:
1223 case NEON::BI__builtin_neon_vusdot_s32:
1224 case NEON::BI__builtin_neon_vusdotq_s32:
1225 case NEON::BI__builtin_neon_vbfdot_f32:
1226 case NEON::BI__builtin_neon_vbfdotq_f32:
1227 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
1229 std::string(
"unimplemented AArch64 builtin call: ") +
1231 return mlir::Value{};
1237 switch (builtinID) {
1240 std::string(
"unimplemented AArch64 builtin call: ") +
1243 case NEON::BI__builtin_neon_vrnd32x_f32:
1244 case NEON::BI__builtin_neon_vrnd32xq_f32:
1245 case NEON::BI__builtin_neon_vrnd32x_f64:
1246 case NEON::BI__builtin_neon_vrnd32xq_f64:
1247 case NEON::BI__builtin_neon_vrnd32z_f32:
1248 case NEON::BI__builtin_neon_vrnd32zq_f32:
1249 case NEON::BI__builtin_neon_vrnd32z_f64:
1250 case NEON::BI__builtin_neon_vrnd32zq_f64:
1251 case NEON::BI__builtin_neon_vrnd64x_f32:
1252 case NEON::BI__builtin_neon_vrnd64xq_f32:
1253 case NEON::BI__builtin_neon_vrnd64x_f64:
1254 case NEON::BI__builtin_neon_vrnd64xq_f64:
1255 case NEON::BI__builtin_neon_vrnd64z_f32:
1256 case NEON::BI__builtin_neon_vrnd64zq_f32:
1257 case NEON::BI__builtin_neon_vrnd64z_f64:
1258 case NEON::BI__builtin_neon_vrnd64zq_f64: {
1260 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1261 mlir::Value result =
1263 llvmIntrName, vTy, loc);
1267 case NEON::BI__builtin_neon_vhadd_v:
1268 case NEON::BI__builtin_neon_vhaddq_v:
1269 case NEON::BI__builtin_neon_vhsub_v:
1270 case NEON::BI__builtin_neon_vhsubq_v:
1271 case NEON::BI__builtin_neon_vqadd_v:
1272 case NEON::BI__builtin_neon_vqaddq_v:
1273 case NEON::BI__builtin_neon_vrhadd_v:
1274 case NEON::BI__builtin_neon_vrhaddq_v:
1275 case NEON::BI__builtin_neon_vshl_v:
1276 case NEON::BI__builtin_neon_vshlq_v:
1277 case NEON::BI__builtin_neon_vraddhn_v:
1278 case NEON::BI__builtin_neon_vrsubhn_v: {
1281 unsigned intrinsic =
1282 ((modifier &
UnsignedAlts) && !usgn) ? altLLVMIntrinsic : llvmIntrinsic;
1283 llvm::StringRef llvmIntrName =
1286 cir::VectorType argTy =
1289 mlir::Value result =
1291 {argTy, argTy}, ops, llvmIntrName,
1708 NEON::BI__builtin_neon_vabd_f16,
1709 NEON::BI__builtin_neon_vabd_v,
1712 NEON::BI__builtin_neon_vabdq_f16,
1713 NEON::BI__builtin_neon_vabdq_v,
1716 NEON::BI__builtin_neon_vabs_f16,
1717 NEON::BI__builtin_neon_vabs_v,
1720 NEON::BI__builtin_neon_vabsq_f16,
1721 NEON::BI__builtin_neon_vabsq_v,
1724 NEON::BI__builtin_neon_vcage_f16,
1725 NEON::BI__builtin_neon_vcage_v,
1728 NEON::BI__builtin_neon_vcageq_f16,
1729 NEON::BI__builtin_neon_vcageq_v,
1732 NEON::BI__builtin_neon_vcagt_f16,
1733 NEON::BI__builtin_neon_vcagt_v,
1736 NEON::BI__builtin_neon_vcagtq_f16,
1737 NEON::BI__builtin_neon_vcagtq_v,
1740 NEON::BI__builtin_neon_vcale_f16,
1741 NEON::BI__builtin_neon_vcale_v,
1744 NEON::BI__builtin_neon_vcaleq_f16,
1745 NEON::BI__builtin_neon_vcaleq_v,
1748 NEON::BI__builtin_neon_vcalt_f16,
1749 NEON::BI__builtin_neon_vcalt_v,
1752 NEON::BI__builtin_neon_vcaltq_f16,
1753 NEON::BI__builtin_neon_vcaltq_v,
1756 NEON::BI__builtin_neon_vceqz_f16,
1757 NEON::BI__builtin_neon_vceqz_v,
1760 NEON::BI__builtin_neon_vceqzq_f16,
1761 NEON::BI__builtin_neon_vceqzq_v,
1764 NEON::BI__builtin_neon_vcgez_f16,
1765 NEON::BI__builtin_neon_vcgez_v,
1768 NEON::BI__builtin_neon_vcgezq_f16,
1769 NEON::BI__builtin_neon_vcgezq_v,
1772 NEON::BI__builtin_neon_vcgtz_f16,
1773 NEON::BI__builtin_neon_vcgtz_v,
1776 NEON::BI__builtin_neon_vcgtzq_f16,
1777 NEON::BI__builtin_neon_vcgtzq_v,
1780 NEON::BI__builtin_neon_vclez_f16,
1781 NEON::BI__builtin_neon_vclez_v,
1784 NEON::BI__builtin_neon_vclezq_f16,
1785 NEON::BI__builtin_neon_vclezq_v,
1788 NEON::BI__builtin_neon_vcltz_f16,
1789 NEON::BI__builtin_neon_vcltz_v,
1792 NEON::BI__builtin_neon_vcltzq_f16,
1793 NEON::BI__builtin_neon_vcltzq_v,
1796 NEON::BI__builtin_neon_vfma_f16,
1797 NEON::BI__builtin_neon_vfma_v,
1800 NEON::BI__builtin_neon_vfma_lane_f16,
1801 NEON::BI__builtin_neon_vfma_lane_v,
1804 NEON::BI__builtin_neon_vfma_laneq_f16,
1805 NEON::BI__builtin_neon_vfma_laneq_v,
1808 NEON::BI__builtin_neon_vfmaq_f16,
1809 NEON::BI__builtin_neon_vfmaq_v,
1812 NEON::BI__builtin_neon_vfmaq_lane_f16,
1813 NEON::BI__builtin_neon_vfmaq_lane_v,
1816 NEON::BI__builtin_neon_vfmaq_laneq_f16,
1817 NEON::BI__builtin_neon_vfmaq_laneq_v,
1820 NEON::BI__builtin_neon_vmax_f16,
1821 NEON::BI__builtin_neon_vmax_v,
1824 NEON::BI__builtin_neon_vmaxnm_f16,
1825 NEON::BI__builtin_neon_vmaxnm_v,
1828 NEON::BI__builtin_neon_vmaxnmq_f16,
1829 NEON::BI__builtin_neon_vmaxnmq_v,
1832 NEON::BI__builtin_neon_vmaxq_f16,
1833 NEON::BI__builtin_neon_vmaxq_v,
1836 NEON::BI__builtin_neon_vmin_f16,
1837 NEON::BI__builtin_neon_vmin_v,
1840 NEON::BI__builtin_neon_vminnm_f16,
1841 NEON::BI__builtin_neon_vminnm_v,
1844 NEON::BI__builtin_neon_vminnmq_f16,
1845 NEON::BI__builtin_neon_vminnmq_v,
1848 NEON::BI__builtin_neon_vminq_f16,
1849 NEON::BI__builtin_neon_vminq_v,
1852 NEON::BI__builtin_neon_vmulx_f16,
1853 NEON::BI__builtin_neon_vmulx_v,
1856 NEON::BI__builtin_neon_vmulxq_f16,
1857 NEON::BI__builtin_neon_vmulxq_v,
1860 NEON::BI__builtin_neon_vpadd_f16,
1861 NEON::BI__builtin_neon_vpadd_v,
1864 NEON::BI__builtin_neon_vpaddq_f16,
1865 NEON::BI__builtin_neon_vpaddq_v,
1868 NEON::BI__builtin_neon_vpmax_f16,
1869 NEON::BI__builtin_neon_vpmax_v,
1872 NEON::BI__builtin_neon_vpmaxnm_f16,
1873 NEON::BI__builtin_neon_vpmaxnm_v,
1876 NEON::BI__builtin_neon_vpmaxnmq_f16,
1877 NEON::BI__builtin_neon_vpmaxnmq_v,
1880 NEON::BI__builtin_neon_vpmaxq_f16,
1881 NEON::BI__builtin_neon_vpmaxq_v,
1884 NEON::BI__builtin_neon_vpmin_f16,
1885 NEON::BI__builtin_neon_vpmin_v,
1888 NEON::BI__builtin_neon_vpminnm_f16,
1889 NEON::BI__builtin_neon_vpminnm_v,
1892 NEON::BI__builtin_neon_vpminnmq_f16,
1893 NEON::BI__builtin_neon_vpminnmq_v,
1896 NEON::BI__builtin_neon_vpminq_f16,
1897 NEON::BI__builtin_neon_vpminq_v,
1900 NEON::BI__builtin_neon_vrecpe_f16,
1901 NEON::BI__builtin_neon_vrecpe_v,
1904 NEON::BI__builtin_neon_vrecpeq_f16,
1905 NEON::BI__builtin_neon_vrecpeq_v,
1908 NEON::BI__builtin_neon_vrecps_f16,
1909 NEON::BI__builtin_neon_vrecps_v,
1912 NEON::BI__builtin_neon_vrecpsq_f16,
1913 NEON::BI__builtin_neon_vrecpsq_v,
1916 NEON::BI__builtin_neon_vrnd_f16,
1917 NEON::BI__builtin_neon_vrnd_v,
1920 NEON::BI__builtin_neon_vrnda_f16,
1921 NEON::BI__builtin_neon_vrnda_v,
1924 NEON::BI__builtin_neon_vrndaq_f16,
1925 NEON::BI__builtin_neon_vrndaq_v,
1928 NEON::BI__builtin_neon_vrndi_f16,
1929 NEON::BI__builtin_neon_vrndi_v,
1932 NEON::BI__builtin_neon_vrndiq_f16,
1933 NEON::BI__builtin_neon_vrndiq_v,
1936 NEON::BI__builtin_neon_vrndm_f16,
1937 NEON::BI__builtin_neon_vrndm_v,
1940 NEON::BI__builtin_neon_vrndmq_f16,
1941 NEON::BI__builtin_neon_vrndmq_v,
1944 NEON::BI__builtin_neon_vrndn_f16,
1945 NEON::BI__builtin_neon_vrndn_v,
1948 NEON::BI__builtin_neon_vrndnq_f16,
1949 NEON::BI__builtin_neon_vrndnq_v,
1952 NEON::BI__builtin_neon_vrndp_f16,
1953 NEON::BI__builtin_neon_vrndp_v,
1956 NEON::BI__builtin_neon_vrndpq_f16,
1957 NEON::BI__builtin_neon_vrndpq_v,
1960 NEON::BI__builtin_neon_vrndq_f16,
1961 NEON::BI__builtin_neon_vrndq_v,
1964 NEON::BI__builtin_neon_vrndx_f16,
1965 NEON::BI__builtin_neon_vrndx_v,
1968 NEON::BI__builtin_neon_vrndxq_f16,
1969 NEON::BI__builtin_neon_vrndxq_v,
1972 NEON::BI__builtin_neon_vrsqrte_f16,
1973 NEON::BI__builtin_neon_vrsqrte_v,
1976 NEON::BI__builtin_neon_vrsqrteq_f16,
1977 NEON::BI__builtin_neon_vrsqrteq_v,
1980 NEON::BI__builtin_neon_vrsqrts_f16,
1981 NEON::BI__builtin_neon_vrsqrts_v,
1984 NEON::BI__builtin_neon_vrsqrtsq_f16,
1985 NEON::BI__builtin_neon_vrsqrtsq_v,
1988 NEON::BI__builtin_neon_vsqrt_f16,
1989 NEON::BI__builtin_neon_vsqrt_v,
1992 NEON::BI__builtin_neon_vsqrtq_f16,
1993 NEON::BI__builtin_neon_vsqrtq_v,
1998 {NEON::BI__builtin_neon_vldap1_lane_u64,
1999 NEON::BI__builtin_neon_vldap1_lane_s64},
2000 {NEON::BI__builtin_neon_vldap1_lane_f64,
2001 NEON::BI__builtin_neon_vldap1_lane_s64},
2002 {NEON::BI__builtin_neon_vldap1_lane_p64,
2003 NEON::BI__builtin_neon_vldap1_lane_s64},
2004 {NEON::BI__builtin_neon_vldap1q_lane_u64,
2005 NEON::BI__builtin_neon_vldap1q_lane_s64},
2006 {NEON::BI__builtin_neon_vldap1q_lane_f64,
2007 NEON::BI__builtin_neon_vldap1q_lane_s64},
2008 {NEON::BI__builtin_neon_vldap1q_lane_p64,
2009 NEON::BI__builtin_neon_vldap1q_lane_s64},
2010 {NEON::BI__builtin_neon_vstl1_lane_u64,
2011 NEON::BI__builtin_neon_vstl1_lane_s64},
2012 {NEON::BI__builtin_neon_vstl1_lane_f64,
2013 NEON::BI__builtin_neon_vstl1_lane_s64},
2014 {NEON::BI__builtin_neon_vstl1_lane_p64,
2015 NEON::BI__builtin_neon_vstl1_lane_s64},
2016 {NEON::BI__builtin_neon_vstl1q_lane_u64,
2017 NEON::BI__builtin_neon_vstl1q_lane_s64},
2018 {NEON::BI__builtin_neon_vstl1q_lane_f64,
2019 NEON::BI__builtin_neon_vstl1q_lane_s64},
2020 {NEON::BI__builtin_neon_vstl1q_lane_p64,
2021 NEON::BI__builtin_neon_vstl1q_lane_s64},
2027 llvm::Triple::ArchType arch) {
2036 if (builtinID == Builtin::BI__builtin_cpu_supports) {
2037 cgm.errorNYI(
expr->getSourceRange(),
2038 std::string(
"unimplemented AArch64 builtin call: ") +
2039 getContext().BuiltinInfo.getName(builtinID));
2040 return mlir::Value{};
2043 switch (builtinID) {
2046 case clang::AArch64::BI__builtin_arm_nop:
2047 case clang::AArch64::BI__builtin_arm_yield:
2048 case clang::AArch64::BI__yield:
2049 case clang::AArch64::BI__builtin_arm_wfe:
2050 case clang::AArch64::BI__wfe:
2051 case clang::AArch64::BI__builtin_arm_wfi:
2052 case clang::AArch64::BI__wfi:
2053 case clang::AArch64::BI__builtin_arm_sev:
2054 case clang::AArch64::BI__sev:
2055 case clang::AArch64::BI__builtin_arm_sevl:
2056 case clang::AArch64::BI__sevl:
2057 cgm.errorNYI(
expr->getSourceRange(),
2058 std::string(
"unimplemented AArch64 builtin call: ") +
2059 getContext().BuiltinInfo.getName(builtinID));
2060 return mlir::Value{};
2063 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
2064 cgm.errorNYI(
expr->getSourceRange(),
2065 std::string(
"unimplemented AArch64 builtin call: ") +
2066 getContext().BuiltinInfo.getName(builtinID));
2067 return mlir::Value{};
2070 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
2071 cgm.errorNYI(
expr->getSourceRange(),
2072 std::string(
"unimplemented AArch64 builtin call: ") +
2073 getContext().BuiltinInfo.getName(builtinID));
2074 return mlir::Value{};
2077 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
2078 cgm.errorNYI(
expr->getSourceRange(),
2079 std::string(
"unimplemented AArch64 builtin call: ") +
2080 getContext().BuiltinInfo.getName(builtinID));
2081 return mlir::Value{};
2083 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
2084 cgm.errorNYI(
expr->getSourceRange(),
2085 std::string(
"unimplemented AArch64 builtin call: ") +
2086 getContext().BuiltinInfo.getName(builtinID));
2087 return mlir::Value{};
2090 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
2091 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
2092 cgm.errorNYI(
expr->getSourceRange(),
2093 std::string(
"unimplemented AArch64 builtin call: ") +
2094 getContext().BuiltinInfo.getName(builtinID));
2095 return mlir::Value{};
2098 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
2099 cgm.errorNYI(
expr->getSourceRange(),
2100 std::string(
"unimplemented AArch64 builtin call: ") +
2101 getContext().BuiltinInfo.getName(builtinID));
2102 return mlir::Value{};
2104 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
2105 cgm.errorNYI(
expr->getSourceRange(),
2106 std::string(
"unimplemented AArch64 builtin call: ") +
2107 getContext().BuiltinInfo.getName(builtinID));
2108 return mlir::Value{};
2111 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
2112 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
2113 cgm.errorNYI(
expr->getSourceRange(),
2114 std::string(
"unimplemented AArch64 builtin call: ") +
2115 getContext().BuiltinInfo.getName(builtinID));
2116 return mlir::Value{};
2119 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
2120 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
2121 cgm.errorNYI(
expr->getSourceRange(),
2122 std::string(
"unimplemented AArch64 builtin call: ") +
2123 getContext().BuiltinInfo.getName(builtinID));
2124 return mlir::Value{};
2127 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
2128 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
2129 cgm.errorNYI(
expr->getSourceRange(),
2130 std::string(
"unimplemented AArch64 builtin call: ") +
2131 getContext().BuiltinInfo.getName(builtinID));
2132 return mlir::Value{};
2135 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
2136 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
2137 cgm.errorNYI(
expr->getSourceRange(),
2138 std::string(
"unimplemented AArch64 builtin call: ") +
2139 getContext().BuiltinInfo.getName(builtinID));
2140 return mlir::Value{};
2143 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
2144 cgm.errorNYI(
expr->getSourceRange(),
2145 std::string(
"unimplemented AArch64 builtin call: ") +
2146 getContext().BuiltinInfo.getName(builtinID));
2147 return mlir::Value{};
2150 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
2151 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
2152 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
2153 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2154 cgm.errorNYI(
expr->getSourceRange(),
2155 std::string(
"unimplemented AArch64 builtin call: ") +
2156 getContext().BuiltinInfo.getName(builtinID));
2157 return mlir::Value{};
2160 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2161 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
2162 cgm.errorNYI(
expr->getSourceRange(),
2163 std::string(
"unimplemented AArch64 builtin call: ") +
2164 getContext().BuiltinInfo.getName(builtinID));
2165 return mlir::Value{};
2168 if (builtinID == clang::AArch64::BI__clear_cache) {
2169 cgm.errorNYI(
expr->getSourceRange(),
2170 std::string(
"unimplemented AArch64 builtin call: ") +
2171 getContext().BuiltinInfo.getName(builtinID));
2172 return mlir::Value{};
2175 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2176 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2178 cgm.errorNYI(
expr->getSourceRange(),
2179 std::string(
"unimplemented AArch64 builtin call: ") +
2180 getContext().BuiltinInfo.getName(builtinID));
2181 return mlir::Value{};
2183 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2184 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2185 cgm.errorNYI(
expr->getSourceRange(),
2186 std::string(
"unimplemented AArch64 builtin call: ") +
2187 getContext().BuiltinInfo.getName(builtinID));
2188 return mlir::Value{};
2191 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2192 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
2194 cgm.errorNYI(
expr->getSourceRange(),
2195 std::string(
"unimplemented AArch64 builtin call: ") +
2196 getContext().BuiltinInfo.getName(builtinID));
2197 return mlir::Value{};
2200 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2201 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
2202 cgm.errorNYI(
expr->getSourceRange(),
2203 std::string(
"unimplemented AArch64 builtin call: ") +
2204 getContext().BuiltinInfo.getName(builtinID));
2205 return mlir::Value{};
2208 if (builtinID == clang::AArch64::BI__getReg ||
2209 builtinID == clang::AArch64::BI__setReg ||
2210 builtinID == clang::AArch64::BI__getRegFp ||
2211 builtinID == clang::AArch64::BI__setRegFp) {
2212 cgm.errorNYI(
expr->getSourceRange(),
2213 std::string(
"unimplemented AArch64 builtin call: ") +
2214 getContext().BuiltinInfo.getName(builtinID));
2215 return mlir::Value{};
2218 if (builtinID == clang::AArch64::BI__break) {
2219 cgm.errorNYI(
expr->getSourceRange(),
2220 std::string(
"unimplemented AArch64 builtin call: ") +
2221 getContext().BuiltinInfo.getName(builtinID));
2222 return mlir::Value{};
2225 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2226 cgm.errorNYI(
expr->getSourceRange(),
2227 std::string(
"unimplemented AArch64 builtin call: ") +
2228 getContext().BuiltinInfo.getName(builtinID));
2229 return mlir::Value{};
2232 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2233 cgm.errorNYI(
expr->getSourceRange(),
2234 std::string(
"unimplemented AArch64 builtin call: ") +
2235 getContext().BuiltinInfo.getName(builtinID));
2236 return mlir::Value{};
2240 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2241 switch (builtinID) {
2242 case clang::AArch64::BI__builtin_arm_crc32b:
2243 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2245 case clang::AArch64::BI__builtin_arm_crc32cb:
2246 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2248 case clang::AArch64::BI__builtin_arm_crc32h:
2249 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2251 case clang::AArch64::BI__builtin_arm_crc32ch:
2252 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2254 case clang::AArch64::BI__builtin_arm_crc32w:
2255 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2257 case clang::AArch64::BI__builtin_arm_crc32cw:
2258 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2260 case clang::AArch64::BI__builtin_arm_crc32d:
2261 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2263 case clang::AArch64::BI__builtin_arm_crc32cd:
2264 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2268 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2269 cgm.errorNYI(
expr->getSourceRange(),
2270 std::string(
"unimplemented AArch64 builtin call: ") +
2271 getContext().BuiltinInfo.getName(builtinID));
2272 return mlir::Value{};
2276 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2277 cgm.errorNYI(
expr->getSourceRange(),
2278 std::string(
"unimplemented AArch64 builtin call: ") +
2279 getContext().BuiltinInfo.getName(builtinID));
2280 return mlir::Value{};
2284 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2285 switch (builtinID) {
2286 case clang::AArch64::BI__builtin_arm_irg:
2287 mteIntrinsicID = Intrinsic::aarch64_irg;
2289 case clang::AArch64::BI__builtin_arm_addg:
2290 mteIntrinsicID = Intrinsic::aarch64_addg;
2292 case clang::AArch64::BI__builtin_arm_gmi:
2293 mteIntrinsicID = Intrinsic::aarch64_gmi;
2295 case clang::AArch64::BI__builtin_arm_ldg:
2296 mteIntrinsicID = Intrinsic::aarch64_ldg;
2298 case clang::AArch64::BI__builtin_arm_stg:
2299 mteIntrinsicID = Intrinsic::aarch64_stg;
2301 case clang::AArch64::BI__builtin_arm_subp:
2302 mteIntrinsicID = Intrinsic::aarch64_subp;
2306 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
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_arm_rsr ||
2314 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2315 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2316 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2317 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2318 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2319 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2320 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2321 cgm.errorNYI(
expr->getSourceRange(),
2322 std::string(
"unimplemented AArch64 builtin call: ") +
2323 getContext().BuiltinInfo.getName(builtinID));
2324 return mlir::Value{};
2327 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2328 builtinID == clang::AArch64::BI_WriteStatusReg ||
2329 builtinID == clang::AArch64::BI__sys) {
2330 cgm.errorNYI(
expr->getSourceRange(),
2331 std::string(
"unimplemented AArch64 builtin call: ") +
2332 getContext().BuiltinInfo.getName(builtinID));
2333 return mlir::Value{};
2336 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
2337 cgm.errorNYI(
expr->getSourceRange(),
2338 std::string(
"unimplemented AArch64 builtin call: ") +
2339 getContext().BuiltinInfo.getName(builtinID));
2340 return mlir::Value{};
2343 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2344 cgm.errorNYI(
expr->getSourceRange(),
2345 std::string(
"unimplemented AArch64 builtin call: ") +
2346 getContext().BuiltinInfo.getName(builtinID));
2347 return mlir::Value{};
2350 if (builtinID == clang::AArch64::BI__mulh ||
2351 builtinID == clang::AArch64::BI__umulh) {
2352 cgm.errorNYI(
expr->getSourceRange(),
2353 std::string(
"unimplemented AArch64 builtin call: ") +
2354 getContext().BuiltinInfo.getName(builtinID));
2355 return mlir::Value{};
2358 if (builtinID == AArch64::BI__writex18byte ||
2359 builtinID == AArch64::BI__writex18word ||
2360 builtinID == AArch64::BI__writex18dword ||
2361 builtinID == AArch64::BI__writex18qword) {
2362 cgm.errorNYI(
expr->getSourceRange(),
2363 std::string(
"unimplemented AArch64 builtin call: ") +
2364 getContext().BuiltinInfo.getName(builtinID));
2365 return mlir::Value{};
2368 if (builtinID == AArch64::BI__readx18byte ||
2369 builtinID == AArch64::BI__readx18word ||
2370 builtinID == AArch64::BI__readx18dword ||
2371 builtinID == AArch64::BI__readx18qword) {
2372 cgm.errorNYI(
expr->getSourceRange(),
2373 std::string(
"unimplemented AArch64 builtin call: ") +
2374 getContext().BuiltinInfo.getName(builtinID));
2375 return mlir::Value{};
2378 if (builtinID == AArch64::BI__addx18byte ||
2379 builtinID == AArch64::BI__addx18word ||
2380 builtinID == AArch64::BI__addx18dword ||
2381 builtinID == AArch64::BI__addx18qword ||
2382 builtinID == AArch64::BI__incx18byte ||
2383 builtinID == AArch64::BI__incx18word ||
2384 builtinID == AArch64::BI__incx18dword ||
2385 builtinID == AArch64::BI__incx18qword) {
2386 cgm.errorNYI(
expr->getSourceRange(),
2387 std::string(
"unimplemented AArch64 builtin call: ") +
2388 getContext().BuiltinInfo.getName(builtinID));
2389 return mlir::Value{};
2392 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2393 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2394 builtinID == AArch64::BI_CopyInt32FromFloat ||
2395 builtinID == AArch64::BI_CopyInt64FromDouble) {
2396 cgm.errorNYI(
expr->getSourceRange(),
2397 std::string(
"unimplemented AArch64 builtin call: ") +
2398 getContext().BuiltinInfo.getName(builtinID));
2399 return mlir::Value{};
2402 if (builtinID == AArch64::BI_CountLeadingOnes ||
2403 builtinID == AArch64::BI_CountLeadingOnes64 ||
2404 builtinID == AArch64::BI_CountLeadingZeros ||
2405 builtinID == AArch64::BI_CountLeadingZeros64) {
2406 cgm.errorNYI(
expr->getSourceRange(),
2407 std::string(
"unimplemented AArch64 builtin call: ") +
2408 getContext().BuiltinInfo.getName(builtinID));
2409 return mlir::Value{};
2412 if (builtinID == AArch64::BI_CountLeadingSigns ||
2413 builtinID == AArch64::BI_CountLeadingSigns64) {
2414 cgm.errorNYI(
expr->getSourceRange(),
2415 std::string(
"unimplemented AArch64 builtin call: ") +
2416 getContext().BuiltinInfo.getName(builtinID));
2417 return mlir::Value{};
2420 if (builtinID == AArch64::BI_CountOneBits ||
2421 builtinID == AArch64::BI_CountOneBits64 ||
2422 builtinID == AArch64::BI_CountTrailingZeros ||
2423 builtinID == AArch64::BI_CountTrailingZeros64) {
2424 cgm.errorNYI(
expr->getSourceRange(),
2425 std::string(
"unimplemented AArch64 builtin call: ") +
2426 getContext().BuiltinInfo.getName(builtinID));
2427 return mlir::Value{};
2430 if (builtinID == AArch64::BI__prefetch ||
2431 builtinID == AArch64::BI__prefetch2) {
2432 cgm.errorNYI(
expr->getSourceRange(),
2433 std::string(
"unimplemented AArch64 builtin call: ") +
2434 getContext().BuiltinInfo.getName(builtinID));
2435 return mlir::Value{};
2438 if (builtinID == AArch64::BI__hlt) {
2439 cgm.errorNYI(
expr->getSourceRange(),
2440 std::string(
"unimplemented AArch64 builtin call: ") +
2441 getContext().BuiltinInfo.getName(builtinID));
2442 return mlir::Value{};
2445 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2446 cgm.errorNYI(
expr->getSourceRange(),
2447 std::string(
"unimplemented AArch64 builtin call: ") +
2448 getContext().BuiltinInfo.getName(builtinID));
2449 return mlir::Value{};
2458 return p.first == builtinID;
2461 builtinID = it->second;
2466 unsigned iceArguments = 0;
2481 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2482 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2484 switch (builtinID) {
2485 case NEON::BI__builtin_neon_vld1_v:
2486 case NEON::BI__builtin_neon_vld1q_v:
2487 case NEON::BI__builtin_neon_vld1_dup_v:
2488 case NEON::BI__builtin_neon_vld1q_dup_v:
2489 case NEON::BI__builtin_neon_vld1_lane_v:
2490 case NEON::BI__builtin_neon_vld1q_lane_v:
2492 expr->getSourceRange(),
2493 std::string(
"unimplemented AArch64 builtin argument handling ") +
2494 getContext().BuiltinInfo.getName(builtinID));
2496 case NEON::BI__builtin_neon_vst1_v:
2497 case NEON::BI__builtin_neon_vst1q_v:
2498 case NEON::BI__builtin_neon_vst1_lane_v:
2499 case NEON::BI__builtin_neon_vst1q_lane_v:
2500 case NEON::BI__builtin_neon_vstrq_p128:
2501 case NEON::BI__builtin_neon_vst2_v:
2502 case NEON::BI__builtin_neon_vst2q_v:
2503 case NEON::BI__builtin_neon_vst2_lane_v:
2504 case NEON::BI__builtin_neon_vst2q_lane_v:
2505 case NEON::BI__builtin_neon_vst3_v:
2506 case NEON::BI__builtin_neon_vst3q_v:
2507 case NEON::BI__builtin_neon_vst3_lane_v:
2508 case NEON::BI__builtin_neon_vst3q_lane_v:
2509 case NEON::BI__builtin_neon_vst4_v:
2510 case NEON::BI__builtin_neon_vst4q_v:
2511 case NEON::BI__builtin_neon_vst4_lane_v:
2512 case NEON::BI__builtin_neon_vst4q_lane_v:
2518 case NEON::BI__builtin_neon_vldap1_lane_s64:
2519 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2520 case NEON::BI__builtin_neon_vstl1_lane_s64:
2521 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2523 expr->getSourceRange(),
2524 std::string(
"unimplemented AArch64 builtin argument handling ") +
2525 getContext().BuiltinInfo.getName(builtinID));
2546 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2550 if (std::optional<llvm::APSInt> result =
2554 bool usgn =
type.isUnsigned();
2556 mlir::Location loc =
getLoc(
expr->getExprLoc());
2570 switch (builtinID) {
2573 case NEON::BI__builtin_neon_vabsh_f16: {
2574 mlir::Type halfTy = builder.getFp16Ty();
2576 std::nullopt, halfTy, loc);
2578 case NEON::BI__builtin_neon_vaddq_p128: {
2579 cir::VectorType byteTy = cir::VectorType::get(builder.getUInt8Ty(), 16);
2580 ops[0] = builder.createBitcast(ops[0], byteTy);
2581 ops[1] = builder.createBitcast(ops[1], byteTy);
2582 mlir::Value result = builder.createXor(loc, ops[0], ops[1]);
2585 case NEON::BI__builtin_neon_vldrq_p128:
2586 cgm.errorNYI(
expr->getSourceRange(),
2587 std::string(
"unimplemented AArch64 builtin call: ") +
2588 getContext().BuiltinInfo.getName(builtinID));
2589 return mlir::Value{};
2590 case NEON::BI__builtin_neon_vstrq_p128: {
2591 builder.createStore(loc, ops[1], ptrOp0);
2594 case NEON::BI__builtin_neon_vcvts_f32_u32:
2595 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2596 case NEON::BI__builtin_neon_vcvts_f32_s32:
2597 case NEON::BI__builtin_neon_vcvtd_f64_s64:
2598 case NEON::BI__builtin_neon_vcvth_f16_u16:
2599 case NEON::BI__builtin_neon_vcvth_f16_u32:
2600 case NEON::BI__builtin_neon_vcvth_f16_u64:
2601 case NEON::BI__builtin_neon_vcvth_f16_s16:
2602 case NEON::BI__builtin_neon_vcvth_f16_s32:
2603 case NEON::BI__builtin_neon_vcvth_f16_s64:
2604 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2605 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2606 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2607 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2608 case NEON::BI__builtin_neon_vcvth_u16_f16:
2609 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2610 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2611 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2612 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2613 case NEON::BI__builtin_neon_vcvth_s16_f16:
2614 case NEON::BI__builtin_neon_vcaleh_f16:
2615 case NEON::BI__builtin_neon_vcalth_f16:
2616 case NEON::BI__builtin_neon_vcageh_f16:
2617 case NEON::BI__builtin_neon_vcagth_f16:
2618 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2619 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2620 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2621 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2622 case NEON::BI__builtin_neon_vpaddd_s64:
2623 case NEON::BI__builtin_neon_vpaddd_f64:
2624 case NEON::BI__builtin_neon_vpadds_f32:
2625 cgm.errorNYI(
expr->getSourceRange(),
2626 std::string(
"unimplemented AArch64 builtin call: ") +
2627 getContext().BuiltinInfo.getName(builtinID));
2628 return mlir::Value{};
2629 case NEON::BI__builtin_neon_vceqzd_s64:
2630 case NEON::BI__builtin_neon_vceqzd_f64:
2631 case NEON::BI__builtin_neon_vceqzs_f32:
2632 case NEON::BI__builtin_neon_vceqzh_f16:
2634 *
this, builder, loc, ops[0],
2636 case NEON::BI__builtin_neon_vcgezd_s64:
2637 case NEON::BI__builtin_neon_vcgezd_f64:
2638 case NEON::BI__builtin_neon_vcgezs_f32:
2639 case NEON::BI__builtin_neon_vcgezh_f16:
2640 case NEON::BI__builtin_neon_vclezd_s64:
2641 case NEON::BI__builtin_neon_vclezd_f64:
2642 case NEON::BI__builtin_neon_vclezs_f32:
2643 case NEON::BI__builtin_neon_vclezh_f16:
2644 case NEON::BI__builtin_neon_vcgtzd_s64:
2645 case NEON::BI__builtin_neon_vcgtzd_f64:
2646 case NEON::BI__builtin_neon_vcgtzs_f32:
2647 case NEON::BI__builtin_neon_vcgtzh_f16:
2648 case NEON::BI__builtin_neon_vcltzd_s64:
2649 case NEON::BI__builtin_neon_vcltzd_f64:
2650 case NEON::BI__builtin_neon_vcltzs_f32:
2651 case NEON::BI__builtin_neon_vcltzh_f16:
2652 case NEON::BI__builtin_neon_vceqzd_u64: {
2654 *
this, builder, loc, ops[0],
2657 case NEON::BI__builtin_neon_vceqd_f64:
2658 case NEON::BI__builtin_neon_vcled_f64:
2659 case NEON::BI__builtin_neon_vcltd_f64:
2660 case NEON::BI__builtin_neon_vcged_f64:
2661 case NEON::BI__builtin_neon_vcgtd_f64:
2662 case NEON::BI__builtin_neon_vceqs_f32:
2663 case NEON::BI__builtin_neon_vcles_f32:
2664 case NEON::BI__builtin_neon_vclts_f32:
2665 case NEON::BI__builtin_neon_vcges_f32:
2666 case NEON::BI__builtin_neon_vcgts_f32:
2667 case NEON::BI__builtin_neon_vceqh_f16:
2668 case NEON::BI__builtin_neon_vcleh_f16:
2669 case NEON::BI__builtin_neon_vclth_f16:
2670 case NEON::BI__builtin_neon_vcgeh_f16:
2671 case NEON::BI__builtin_neon_vcgth_f16:
2672 case NEON::BI__builtin_neon_vceqd_s64:
2673 case NEON::BI__builtin_neon_vceqd_u64:
2674 case NEON::BI__builtin_neon_vcgtd_s64:
2675 case NEON::BI__builtin_neon_vcgtd_u64:
2676 case NEON::BI__builtin_neon_vcltd_s64:
2677 case NEON::BI__builtin_neon_vcltd_u64:
2678 case NEON::BI__builtin_neon_vcged_u64:
2679 case NEON::BI__builtin_neon_vcged_s64:
2680 case NEON::BI__builtin_neon_vcled_u64:
2681 case NEON::BI__builtin_neon_vcled_s64:
2682 cgm.errorNYI(
expr->getSourceRange(),
2683 std::string(
"unimplemented AArch64 builtin call: ") +
2684 getContext().BuiltinInfo.getName(builtinID));
2685 return mlir::Value{};
2686 case NEON::BI__builtin_neon_vnegd_s64: {
2687 return builder.createNeg(loc, ops[0]);
2689 case NEON::BI__builtin_neon_vnegh_f16: {
2690 return builder.createFNeg(loc, ops[0]);
2692 case NEON::BI__builtin_neon_vtstd_s64:
2693 case NEON::BI__builtin_neon_vtstd_u64:
2694 case NEON::BI__builtin_neon_vset_lane_i8:
2695 case NEON::BI__builtin_neon_vset_lane_i16:
2696 case NEON::BI__builtin_neon_vset_lane_i32:
2697 case NEON::BI__builtin_neon_vset_lane_i64:
2698 case NEON::BI__builtin_neon_vset_lane_bf16:
2699 case NEON::BI__builtin_neon_vset_lane_f32:
2700 case NEON::BI__builtin_neon_vsetq_lane_i8:
2701 case NEON::BI__builtin_neon_vsetq_lane_i16:
2702 case NEON::BI__builtin_neon_vsetq_lane_i32:
2703 case NEON::BI__builtin_neon_vsetq_lane_i64:
2704 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2705 case NEON::BI__builtin_neon_vsetq_lane_f32:
2706 case NEON::BI__builtin_neon_vset_lane_f64:
2707 case NEON::BI__builtin_neon_vset_lane_mf8:
2708 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2709 case NEON::BI__builtin_neon_vsetq_lane_f64:
2710 cgm.errorNYI(
expr->getSourceRange(),
2711 std::string(
"unimplemented AArch64 builtin call: ") +
2712 getContext().BuiltinInfo.getName(builtinID));
2713 return mlir::Value{};
2715 case NEON::BI__builtin_neon_vget_lane_i8:
2716 case NEON::BI__builtin_neon_vdupb_lane_i8:
2717 case NEON::BI__builtin_neon_vgetq_lane_i8:
2718 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2719 case NEON::BI__builtin_neon_vget_lane_mf8:
2720 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2721 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2722 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2723 case NEON::BI__builtin_neon_vget_lane_i16:
2724 case NEON::BI__builtin_neon_vduph_lane_i16:
2725 case NEON::BI__builtin_neon_vgetq_lane_i16:
2726 case NEON::BI__builtin_neon_vduph_laneq_i16:
2727 case NEON::BI__builtin_neon_vget_lane_i32:
2728 case NEON::BI__builtin_neon_vdups_lane_i32:
2729 case NEON::BI__builtin_neon_vdups_lane_f32:
2730 case NEON::BI__builtin_neon_vgetq_lane_i32:
2731 case NEON::BI__builtin_neon_vdups_laneq_i32:
2732 case NEON::BI__builtin_neon_vget_lane_i64:
2733 case NEON::BI__builtin_neon_vdupd_lane_i64:
2734 case NEON::BI__builtin_neon_vdupd_lane_f64:
2735 case NEON::BI__builtin_neon_vgetq_lane_i64:
2736 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2737 case NEON::BI__builtin_neon_vget_lane_f32:
2738 case NEON::BI__builtin_neon_vget_lane_f64:
2739 case NEON::BI__builtin_neon_vgetq_lane_f32:
2740 case NEON::BI__builtin_neon_vdups_laneq_f32:
2741 case NEON::BI__builtin_neon_vgetq_lane_f64:
2742 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2743 return cir::VecExtractOp::create(builder, loc, ops[0],
2745 case NEON::BI__builtin_neon_vaddh_f16:
2746 return builder.createFAdd(loc, ops[0], ops[1]);
2747 case NEON::BI__builtin_neon_vsubh_f16:
2748 return builder.createFSub(loc, ops[0], ops[1]);
2749 case NEON::BI__builtin_neon_vmulh_f16:
2750 return builder.createFMul(loc, ops[0], ops[1]);
2751 case NEON::BI__builtin_neon_vdivh_f16:
2752 return builder.createFDiv(loc, ops[0], ops[1]);
2753 case NEON::BI__builtin_neon_vfmah_f16: {
2755 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2758 std::nullopt, ty, loc);
2760 case NEON::BI__builtin_neon_vfmsh_f16: {
2762 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2763 ops[0] = builder.createFNeg(loc, ops[0]);
2766 std::nullopt, ty, loc);
2768 case NEON::BI__builtin_neon_vaddd_s64:
2769 case NEON::BI__builtin_neon_vaddd_u64:
2770 return builder.createAdd(loc, ops[0], ops[1]);
2771 case NEON::BI__builtin_neon_vsubd_s64:
2772 case NEON::BI__builtin_neon_vsubd_u64:
2773 return builder.createSub(loc, ops[0], ops[1]);
2774 case NEON::BI__builtin_neon_vqdmlalh_s16:
2775 case NEON::BI__builtin_neon_vqdmlslh_s16:
2776 cgm.errorNYI(
expr->getSourceRange(),
2777 std::string(
"unimplemented AArch64 builtin call: ") +
2778 getContext().BuiltinInfo.getName(builtinID));
2779 return mlir::Value{};
2780 case NEON::BI__builtin_neon_vqshlud_n_s64: {
2781 cir::IntType int64Type = builder.getSInt64Ty();
2787 case NEON::BI__builtin_neon_vqshld_n_u64:
2788 case NEON::BI__builtin_neon_vqshld_n_s64: {
2789 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2790 ? builder.getUInt64Ty()
2791 : builder.getSInt64Ty();
2792 llvm::StringRef intrinsicName =
2793 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
2794 :
"aarch64.neon.sqshl";
2799 case NEON::BI__builtin_neon_vrshrd_n_u64:
2800 case NEON::BI__builtin_neon_vrshrd_n_s64: {
2801 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
2802 ?
"aarch64.neon.srshl"
2803 :
"aarch64.neon.urshl";
2804 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2805 ? builder.getUInt64Ty()
2806 : builder.getSInt64Ty();
2810 ops[1] = builder.getSInt64(sv, loc);
2811 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
2812 intrName, int64Ty, loc);
2814 case NEON::BI__builtin_neon_vrsrad_n_u64:
2815 case NEON::BI__builtin_neon_vrsrad_n_s64: {
2816 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2817 ? builder.getUInt64Ty()
2818 : builder.getSInt64Ty();
2819 ops[2] = builder.createNeg(loc, ops[2]);
2820 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2821 ?
"aarch64.neon.urshl"
2822 :
"aarch64.neon.srshl";
2825 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
2826 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
2827 return builder.createAdd(loc, ops[0],
2828 builder.createBitcast(ops[1], int64Type));
2830 case NEON::BI__builtin_neon_vshld_n_s64:
2831 case NEON::BI__builtin_neon_vshld_n_u64: {
2833 std::optional<llvm::APSInt> amt =
2835 assert(amt &&
"Expected argument to be a constant");
2836 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
2838 case NEON::BI__builtin_neon_vshrd_n_s64: {
2839 std::optional<llvm::APSInt> amt =
2841 assert(amt &&
"Expected argument to be a constant");
2842 return builder.createShiftRight(
2843 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
2845 case NEON::BI__builtin_neon_vshrd_n_u64: {
2846 std::optional<llvm::APSInt> amt =
2848 assert(amt &&
"Expected argument to be a constant");
2849 uint64_t shiftAmt = amt->getZExtValue();
2852 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
2853 return builder.createShiftRight(loc, ops[0], shiftAmt);
2855 case NEON::BI__builtin_neon_vsrad_n_s64: {
2856 std::optional<llvm::APSInt> amt =
2858 assert(amt &&
"Expected argument to be a constant");
2860 std::min(
static_cast<uint64_t
>(63), amt->getZExtValue());
2861 mlir::Value shifted =
2862 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2863 return builder.createAdd(loc, ops[0], shifted);
2865 case NEON::BI__builtin_neon_vsrad_n_u64: {
2866 std::optional<llvm::APSInt> amt =
2868 assert(amt &&
"Expected argument to be a constant");
2869 uint64_t shiftAmt = amt->getZExtValue();
2873 mlir::Value shifted =
2874 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2875 return builder.createAdd(loc, ops[0], shifted);
2877 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
2878 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
2879 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
2880 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
2881 case NEON::BI__builtin_neon_vqdmlals_s32:
2882 case NEON::BI__builtin_neon_vqdmlsls_s32:
2883 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
2884 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
2885 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
2886 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
2887 cgm.errorNYI(
expr->getSourceRange(),
2888 std::string(
"unimplemented AArch64 builtin call: ") +
2889 getContext().BuiltinInfo.getName(builtinID));
2890 return mlir::Value{};
2892 case NEON::BI__builtin_neon_vget_lane_bf16:
2893 case NEON::BI__builtin_neon_vduph_lane_bf16:
2894 case NEON::BI__builtin_neon_vduph_lane_f16:
2895 case NEON::BI__builtin_neon_vgetq_lane_bf16:
2896 case NEON::BI__builtin_neon_vduph_laneq_bf16:
2897 case NEON::BI__builtin_neon_vduph_laneq_f16: {
2898 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
2900 case NEON::BI__builtin_neon_vcvt_bf16_f32:
2901 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
2902 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
2903 case NEON::BI__builtin_neon_vcvt_f16_f32:
2904 case NEON::BI__builtin_neon_vcvt_f32_f16:
2905 case clang::AArch64::BI_InterlockedAdd:
2906 case clang::AArch64::BI_InterlockedAdd_acq:
2907 case clang::AArch64::BI_InterlockedAdd_rel:
2908 case clang::AArch64::BI_InterlockedAdd_nf:
2909 case clang::AArch64::BI_InterlockedAdd64:
2910 case clang::AArch64::BI_InterlockedAdd64_acq:
2911 case clang::AArch64::BI_InterlockedAdd64_rel:
2912 case clang::AArch64::BI_InterlockedAdd64_nf:
2913 cgm.errorNYI(
expr->getSourceRange(),
2914 std::string(
"unimplemented AArch64 builtin call: ") +
2915 getContext().BuiltinInfo.getName(builtinID));
2916 return mlir::Value{};
2923 llvm::StringRef intrName;
2925 switch (builtinID) {
2927 return std::nullopt;
2928 case NEON::BI__builtin_neon_vbsl_v:
2929 case NEON::BI__builtin_neon_vbslq_v: {
2932 ops[0] = builder.createBitcast(ops[0], bitTy);
2933 ops[1] = builder.createBitcast(ops[1], bitTy);
2934 ops[2] = builder.createBitcast(ops[2], bitTy);
2936 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
2937 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
2938 ops[0] = builder.createOr(loc, ops[1], ops[2]);
2939 return builder.createBitcast(ops[0], ty);
2941 case NEON::BI__builtin_neon_vfma_lane_v:
2942 case NEON::BI__builtin_neon_vfmaq_lane_v: {
2943 mlir::Value addend = builder.createBitcast(ops[0], ty);
2944 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2948 cir::VectorType sourceTy = cir::VectorType::get(
2949 ty.getElementType(), builtinID == NEON::BI__builtin_neon_vfmaq_lane_v
2952 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2953 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2957 std::nullopt, ty, loc);
2959 case NEON::BI__builtin_neon_vfma_laneq_v: {
2961 if (ty.getElementType() ==
cgm.doubleTy) {
2962 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
2963 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
2966 cir::VectorType sourceTy = cir::VectorType::get(
cgm.doubleTy, 2);
2967 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2968 laneSource = builder.createExtractElement(
2974 return builder.createBitcast(
2976 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
2977 std::nullopt,
cgm.doubleTy, loc),
2981 mlir::Value addend = builder.createBitcast(ops[0], ty);
2982 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2985 cir::VectorType sourceTy =
2986 cir::VectorType::get(ty.getElementType(), ty.getSize() * 2);
2987 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2988 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2992 std::nullopt, ty, loc);
2994 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
2995 mlir::Value addend = builder.createBitcast(ops[0], ty);
2996 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2997 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
2998 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3002 std::nullopt, ty, loc);
3004 case NEON::BI__builtin_neon_vfmah_lane_f16:
3005 case NEON::BI__builtin_neon_vfmas_lane_f32:
3006 case NEON::BI__builtin_neon_vfmah_laneq_f16:
3007 case NEON::BI__builtin_neon_vfmas_laneq_f32: {
3009 mlir::Value laneSource = builder.createExtractElement(
3015 std::nullopt, ty, loc);
3017 case NEON::BI__builtin_neon_vfmad_lane_f64:
3018 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
3021 mlir::Value laneSource = builder.createExtractElement(
3026 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3027 std::nullopt,
cgm.doubleTy, loc);
3029 case NEON::BI__builtin_neon_vmull_v: {
3030 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
3032 intrName =
"aarch64.neon.pmull";
3033 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3035 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
3037 case NEON::BI__builtin_neon_vmax_v:
3038 case NEON::BI__builtin_neon_vmaxq_v:
3039 intrName = usgn ?
"aarch64.neon.umax" :
"aarch64.neon.smax";
3040 if (cir::isFPOrVectorOfFPType(ty))
3041 intrName =
"aarch64.neon.fmax";
3043 case NEON::BI__builtin_neon_vmaxh_f16: {
3044 auto halfTy = builder.getFp16Ty();
3045 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmax", halfTy, ops);
3047 case NEON::BI__builtin_neon_vmin_v:
3048 case NEON::BI__builtin_neon_vminq_v:
3049 intrName = usgn ?
"aarch64.neon.umin" :
"aarch64.neon.smin";
3050 if (cir::isFPOrVectorOfFPType(ty))
3051 intrName =
"aarch64.neon.fmin";
3053 case NEON::BI__builtin_neon_vminh_f16: {
3054 auto halfTy = builder.getFp16Ty();
3055 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmin", halfTy, ops);
3057 case NEON::BI__builtin_neon_vabd_v:
3058 case NEON::BI__builtin_neon_vabdq_v:
3059 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
3060 if (cir::isFPOrVectorOfFPType(ty))
3061 intrName =
"aarch64.neon.fabd";
3063 case NEON::BI__builtin_neon_vpadal_v:
3064 case NEON::BI__builtin_neon_vpadalq_v: {
3065 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
3067 mlir::Value pairwiseSum =
3069 inputs, intrName, ty, loc);
3070 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
3071 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
3073 case NEON::BI__builtin_neon_vpmin_v:
3074 case NEON::BI__builtin_neon_vpminq_v:
3075 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
3076 if (cir::isFPOrVectorOfFPType(ty))
3077 intrName =
"aarch64.neon.fminp";
3079 case NEON::BI__builtin_neon_vpmax_v:
3080 case NEON::BI__builtin_neon_vpmaxq_v:
3081 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
3082 if (cir::isFPOrVectorOfFPType(ty))
3083 intrName =
"aarch64.neon.fmaxp";
3085 case NEON::BI__builtin_neon_vminnm_v:
3086 case NEON::BI__builtin_neon_vminnmq_v:
3087 intrName =
"aarch64.neon.fminnm";
3089 case NEON::BI__builtin_neon_vminnmh_f16: {
3090 auto halfTy = builder.getFp16Ty();
3091 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fminnm", halfTy, ops);
3093 case NEON::BI__builtin_neon_vmaxnm_v:
3094 case NEON::BI__builtin_neon_vmaxnmq_v:
3095 intrName =
"aarch64.neon.fmaxnm";
3097 case NEON::BI__builtin_neon_vmaxnmh_f16: {
3098 auto halfTy = builder.getFp16Ty();
3099 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmaxnm", halfTy, ops);
3101 case NEON::BI__builtin_neon_vrecpss_f32:
3102 case NEON::BI__builtin_neon_vrecpsd_f64:
3103 cgm.errorNYI(
expr->getSourceRange(),
3104 std::string(
"unimplemented AArch64 builtin call: ") +
3105 getContext().BuiltinInfo.getName(builtinID));
3106 return mlir::Value{};
3107 case NEON::BI__builtin_neon_vrecpsh_f16: {
3108 auto halfTy = builder.getFp16Ty();
3109 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.frecps", halfTy, ops);
3111 case NEON::BI__builtin_neon_vqshrun_n_v: {
3112 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3115 "aarch64.neon.sqshrun", ty, loc);
3117 case NEON::BI__builtin_neon_vqrshrun_n_v: {
3118 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3121 "aarch64.neon.sqrshrun", ty, loc);
3123 case NEON::BI__builtin_neon_vqshrn_n_v: {
3124 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3126 llvm::StringRef intrName =
3127 usgn ?
"aarch64.neon.uqshrn" :
"aarch64.neon.sqshrn";
3131 case NEON::BI__builtin_neon_vrshrn_n_v:
3132 cgm.errorNYI(
expr->getSourceRange(),
3133 std::string(
"unimplemented AArch64 builtin call: ") +
3134 getContext().BuiltinInfo.getName(builtinID));
3135 return mlir::Value{};
3136 case NEON::BI__builtin_neon_vqrshrn_n_v: {
3137 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3139 llvm::StringRef intrName =
3140 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
3144 case NEON::BI__builtin_neon_vrndah_f16: {
3146 mlir::Type halfTy = builder.getFp16Ty();
3148 std::nullopt, halfTy, loc);
3150 case NEON::BI__builtin_neon_vrnda_v:
3151 case NEON::BI__builtin_neon_vrndaq_v:
3155 case NEON::BI__builtin_neon_vrndih_f16: {
3157 mlir::Type halfTy = builder.getFp16Ty();
3159 std::nullopt, halfTy, loc);
3161 case NEON::BI__builtin_neon_vrndmh_f16: {
3163 mlir::Type halfTy = builder.getFp16Ty();
3165 std::nullopt, halfTy, loc);
3167 case NEON::BI__builtin_neon_vrndm_v:
3168 case NEON::BI__builtin_neon_vrndmq_v:
3172 case NEON::BI__builtin_neon_vrndnh_f16: {
3174 mlir::Type halfTy = builder.getFp16Ty();
3176 std::nullopt, halfTy, loc);
3178 case NEON::BI__builtin_neon_vrndn_v:
3179 case NEON::BI__builtin_neon_vrndnq_v:
3182 std::nullopt, ty, loc);
3183 case NEON::BI__builtin_neon_vrndns_f32: {
3185 mlir::Type
floatTy = builder.getSingleTy();
3189 case NEON::BI__builtin_neon_vrndph_f16: {
3191 mlir::Type halfTy = builder.getFp16Ty();
3193 std::nullopt, halfTy, loc);
3195 case NEON::BI__builtin_neon_vrndp_v:
3196 case NEON::BI__builtin_neon_vrndpq_v:
3200 case NEON::BI__builtin_neon_vrndxh_f16: {
3202 mlir::Type halfTy = builder.getFp16Ty();
3204 std::nullopt, halfTy, loc);
3206 case NEON::BI__builtin_neon_vrndx_v:
3207 case NEON::BI__builtin_neon_vrndxq_v:
3211 case NEON::BI__builtin_neon_vrndh_f16: {
3213 mlir::Type halfTy = builder.getFp16Ty();
3215 std::nullopt, halfTy, loc);
3217 case NEON::BI__builtin_neon_vrnd_v:
3218 case NEON::BI__builtin_neon_vrndq_v:
3222 case NEON::BI__builtin_neon_vcvt_f64_v:
3223 case NEON::BI__builtin_neon_vcvtq_f64_v:
3224 ops[0] = builder.createBitcast(ops[0], ty);
3227 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
3228 case NEON::BI__builtin_neon_vcvt_f64_f32:
3229 case NEON::BI__builtin_neon_vcvt_f32_f64:
3230 case NEON::BI__builtin_neon_vcvt_s32_v:
3231 case NEON::BI__builtin_neon_vcvt_u32_v:
3232 case NEON::BI__builtin_neon_vcvt_s64_v:
3233 case NEON::BI__builtin_neon_vcvt_u64_v:
3234 case NEON::BI__builtin_neon_vcvt_s16_f16:
3235 case NEON::BI__builtin_neon_vcvt_u16_f16:
3236 case NEON::BI__builtin_neon_vcvtq_s32_v:
3237 case NEON::BI__builtin_neon_vcvtq_u32_v:
3238 case NEON::BI__builtin_neon_vcvtq_s64_v:
3239 case NEON::BI__builtin_neon_vcvtq_u64_v:
3240 case NEON::BI__builtin_neon_vcvtq_s16_f16:
3241 case NEON::BI__builtin_neon_vcvtq_u16_f16:
3242 case NEON::BI__builtin_neon_vcvta_s16_f16:
3243 case NEON::BI__builtin_neon_vcvta_u16_f16:
3244 case NEON::BI__builtin_neon_vcvta_s32_v:
3245 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
3246 case NEON::BI__builtin_neon_vcvtaq_s32_v:
3247 case NEON::BI__builtin_neon_vcvta_u32_v:
3248 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
3249 case NEON::BI__builtin_neon_vcvtaq_u32_v:
3250 case NEON::BI__builtin_neon_vcvta_s64_v:
3251 case NEON::BI__builtin_neon_vcvtaq_s64_v:
3252 case NEON::BI__builtin_neon_vcvta_u64_v:
3253 case NEON::BI__builtin_neon_vcvtaq_u64_v:
3254 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3255 case NEON::BI__builtin_neon_vcvtm_s32_v:
3256 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3257 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3258 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3259 case NEON::BI__builtin_neon_vcvtm_u32_v:
3260 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3261 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3262 case NEON::BI__builtin_neon_vcvtm_s64_v:
3263 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3264 case NEON::BI__builtin_neon_vcvtm_u64_v:
3265 case NEON::BI__builtin_neon_vcvtmq_u64_v:
3266 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3267 case NEON::BI__builtin_neon_vcvtn_s32_v:
3268 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3269 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3270 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3271 case NEON::BI__builtin_neon_vcvtn_u32_v:
3272 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3273 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3274 case NEON::BI__builtin_neon_vcvtn_s64_v:
3275 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3276 case NEON::BI__builtin_neon_vcvtn_u64_v:
3277 case NEON::BI__builtin_neon_vcvtnq_u64_v:
3278 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3279 case NEON::BI__builtin_neon_vcvtp_s32_v:
3280 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3281 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3282 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3283 case NEON::BI__builtin_neon_vcvtp_u32_v:
3284 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3285 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3286 case NEON::BI__builtin_neon_vcvtp_s64_v:
3287 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3288 case NEON::BI__builtin_neon_vcvtp_u64_v:
3289 case NEON::BI__builtin_neon_vcvtpq_u64_v:
3290 case NEON::BI__builtin_neon_vmulx_v:
3291 case NEON::BI__builtin_neon_vmulxq_v:
3292 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3293 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3294 case NEON::BI__builtin_neon_vmul_lane_v:
3295 case NEON::BI__builtin_neon_vmul_laneq_v:
3296 case NEON::BI__builtin_neon_vpmaxnm_v:
3297 case NEON::BI__builtin_neon_vpmaxnmq_v:
3298 cgm.errorNYI(
expr->getSourceRange(),
3299 std::string(
"unimplemented AArch64 builtin call: ") +
3300 getContext().BuiltinInfo.getName(builtinID));
3301 return mlir::Value{};
3302 case NEON::BI__builtin_neon_vpminnm_v:
3303 case NEON::BI__builtin_neon_vpminnmq_v:
3304 intrName =
"aarch64.neon.fminnmp";
3306 case NEON::BI__builtin_neon_vsqrth_f16: {
3307 mlir::Type halfTy = builder.getFp16Ty();
3309 std::nullopt, halfTy, loc);
3311 case NEON::BI__builtin_neon_vsqrt_v:
3312 case NEON::BI__builtin_neon_vsqrtq_v:
3316 case NEON::BI__builtin_neon_vrbit_v:
3317 case NEON::BI__builtin_neon_vrbitq_v:
3318 case NEON::BI__builtin_neon_vmaxv_f16:
3319 case NEON::BI__builtin_neon_vmaxvq_f16:
3320 case NEON::BI__builtin_neon_vminv_f16:
3321 case NEON::BI__builtin_neon_vminvq_f16:
3322 case NEON::BI__builtin_neon_vmaxnmv_f16:
3323 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3324 case NEON::BI__builtin_neon_vminnmv_f16:
3325 case NEON::BI__builtin_neon_vminnmvq_f16:
3326 case NEON::BI__builtin_neon_vmul_n_f64:
3327 cgm.errorNYI(
expr->getSourceRange(),
3328 std::string(
"unimplemented AArch64 builtin call: ") +
3329 getContext().BuiltinInfo.getName(builtinID));
3330 return mlir::Value{};
3331 case NEON::BI__builtin_neon_vaddlv_u8:
3332 case NEON::BI__builtin_neon_vaddlvq_u8:
3333 case NEON::BI__builtin_neon_vaddlv_u16:
3334 case NEON::BI__builtin_neon_vaddlvq_u16:
3335 case NEON::BI__builtin_neon_vaddlv_s8:
3336 case NEON::BI__builtin_neon_vaddlvq_s8:
3337 case NEON::BI__builtin_neon_vaddlv_s16:
3338 case NEON::BI__builtin_neon_vaddlvq_s16: {
3341 auto eltTy = mlir::cast<cir::IntType>(
3342 mlir::cast<cir::VectorType>(argTy).getElementType());
3347 bool needsTrunc = eltTy.getWidth() == 8;
3348 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3349 mlir::Type intrRetTy = userRetTy;
3351 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3352 mlir::Value result =
3355 result = builder.createIntCast(result, userRetTy);
3358 case NEON::BI__builtin_neon_vsri_n_v:
3359 case NEON::BI__builtin_neon_vsriq_n_v: {
3361 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3362 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3363 "aarch64.neon.vsri", ty, loc);
3365 case NEON::BI__builtin_neon_vsli_n_v:
3366 case NEON::BI__builtin_neon_vsliq_n_v: {
3368 intrName =
"aarch64.neon.vsli";
3376 case NEON::BI__builtin_neon_vsra_n_v:
3377 case NEON::BI__builtin_neon_vsraq_n_v: {
3378 ops[0] = builder.createBitcast(ops[0], ty);
3380 return builder.createAdd(loc, ops[0], ops[1]);
3382 case NEON::BI__builtin_neon_vrsra_n_v:
3383 case NEON::BI__builtin_neon_vrsraq_n_v: {
3384 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3387 cir::VectorType shiftAmtVecTy =
3390 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3394 ops[0] = builder.createBitcast(ops[0], ty);
3395 return builder.createAdd(loc, ops[0], tmp);
3397 case NEON::BI__builtin_neon_vld1_v:
3398 case NEON::BI__builtin_neon_vld1q_v:
3399 cgm.errorNYI(
expr->getSourceRange(),
3400 std::string(
"unimplemented AArch64 builtin call: ") +
3401 getContext().BuiltinInfo.getName(builtinID));
3402 return mlir::Value{};
3403 case NEON::BI__builtin_neon_vst1_v:
3404 case NEON::BI__builtin_neon_vst1q_v: {
3405 ops[1] = builder.createBitcast(ops[1], ty);
3406 builder.createStore(loc, ops[1], ptrOp0.
withElementType(builder, ty));
3409 case NEON::BI__builtin_neon_vld1_lane_v:
3410 case NEON::BI__builtin_neon_vld1q_lane_v:
3411 case NEON::BI__builtin_neon_vldap1_lane_s64:
3412 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3413 case NEON::BI__builtin_neon_vld1_dup_v:
3414 case NEON::BI__builtin_neon_vld1q_dup_v:
3415 cgm.errorNYI(
expr->getSourceRange(),
3416 std::string(
"unimplemented AArch64 builtin call: ") +
3417 getContext().BuiltinInfo.getName(builtinID));
3418 return mlir::Value{};
3419 case NEON::BI__builtin_neon_vst1_lane_v:
3420 case NEON::BI__builtin_neon_vst1q_lane_v: {
3421 ops[1] = builder.createBitcast(ops[1], ty);
3422 mlir::Value scalar = builder.createExtractElement(
3424 builder.createStore(loc, scalar,
3428 case NEON::BI__builtin_neon_vstl1_lane_s64:
3429 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3430 case NEON::BI__builtin_neon_vld2_v:
3431 case NEON::BI__builtin_neon_vld2q_v:
3432 case NEON::BI__builtin_neon_vld3_v:
3433 case NEON::BI__builtin_neon_vld3q_v:
3434 case NEON::BI__builtin_neon_vld4_v:
3435 case NEON::BI__builtin_neon_vld4q_v:
3436 case NEON::BI__builtin_neon_vld2_dup_v:
3437 case NEON::BI__builtin_neon_vld2q_dup_v:
3438 case NEON::BI__builtin_neon_vld3_dup_v:
3439 case NEON::BI__builtin_neon_vld3q_dup_v:
3440 case NEON::BI__builtin_neon_vld4_dup_v:
3441 case NEON::BI__builtin_neon_vld4q_dup_v:
3442 case NEON::BI__builtin_neon_vld2_lane_v:
3443 case NEON::BI__builtin_neon_vld2q_lane_v:
3444 case NEON::BI__builtin_neon_vld3_lane_v:
3445 case NEON::BI__builtin_neon_vld3q_lane_v:
3446 case NEON::BI__builtin_neon_vld4_lane_v:
3447 case NEON::BI__builtin_neon_vld4q_lane_v:
3448 cgm.errorNYI(
expr->getSourceRange(),
3449 std::string(
"unimplemented AArch64 builtin call: ") +
3450 getContext().BuiltinInfo.getName(builtinID));
3451 return mlir::Value{};
3452 case NEON::BI__builtin_neon_vst2_v:
3453 case NEON::BI__builtin_neon_vst2q_v: {
3456 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3461 case NEON::BI__builtin_neon_vst2_lane_v:
3462 case NEON::BI__builtin_neon_vst2q_lane_v: {
3463 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3464 ops[2] = builder.createIntCast(ops[2],
sInt64Ty);
3466 builder.getVoidPtrTy()};
3467 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st2lane",
3470 case NEON::BI__builtin_neon_vst3_v:
3471 case NEON::BI__builtin_neon_vst3q_v: {
3472 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3474 builder.getVoidPtrTy()};
3478 case NEON::BI__builtin_neon_vst3_lane_v:
3479 case NEON::BI__builtin_neon_vst3q_lane_v: {
3480 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3481 ops[3] = builder.createIntCast(ops[3],
sInt64Ty);
3483 builder.getVoidPtrTy()};
3484 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st3lane",
3487 case NEON::BI__builtin_neon_vst4_v:
3488 case NEON::BI__builtin_neon_vst4q_v: {
3489 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3491 builder.getVoidPtrTy()};
3495 case NEON::BI__builtin_neon_vst4_lane_v:
3496 case NEON::BI__builtin_neon_vst4q_lane_v: {
3497 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3498 ops[4] = builder.createIntCast(ops[4],
sInt64Ty);
3500 ty, ty, ty, ty,
sInt64Ty, builder.getVoidPtrTy()};
3501 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st4lane",
3504 case NEON::BI__builtin_neon_vtrn_v:
3505 case NEON::BI__builtin_neon_vtrnq_v: {
3506 ops[1] = builder.createBitcast(ops[1], ty);
3507 ops[2] = builder.createBitcast(ops[2], ty);
3509 mlir::Value baseAddr =
3510 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3513 for (
unsigned vi = 0; vi != 2; ++vi) {
3515 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3516 indices.push_back(i + vi);
3517 indices.push_back(i + e + vi);
3519 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3520 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3521 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3522 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3526 case NEON::BI__builtin_neon_vuzp_v:
3527 case NEON::BI__builtin_neon_vuzpq_v: {
3528 ops[1] = builder.createBitcast(ops[1], ty);
3529 ops[2] = builder.createBitcast(ops[2], ty);
3531 mlir::Value baseAddr =
3532 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3534 for (
unsigned vi = 0; vi != 2; ++vi) {
3536 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3537 indices.push_back(2 * i + vi);
3539 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3540 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3541 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3542 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3546 case NEON::BI__builtin_neon_vzip_v:
3547 case NEON::BI__builtin_neon_vzipq_v: {
3548 ops[1] = builder.createBitcast(ops[1], ty);
3549 ops[2] = builder.createBitcast(ops[2], ty);
3551 mlir::Value baseAddr =
3552 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3554 for (
unsigned vi = 0; vi != 2; ++vi) {
3556 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3557 indices.push_back((i + vi * e) >> 1);
3558 indices.push_back(((i + vi * e) >> 1) + e);
3560 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3561 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3562 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3563 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3567 case NEON::BI__builtin_neon_vqtbl1q_v:
3568 case NEON::BI__builtin_neon_vqtbl2q_v:
3569 case NEON::BI__builtin_neon_vqtbl3q_v:
3570 case NEON::BI__builtin_neon_vqtbl4q_v:
3571 case NEON::BI__builtin_neon_vqtbx1q_v:
3572 case NEON::BI__builtin_neon_vqtbx2q_v:
3573 case NEON::BI__builtin_neon_vqtbx3q_v:
3574 case NEON::BI__builtin_neon_vqtbx4q_v:
3575 cgm.errorNYI(
expr->getSourceRange(),
3576 std::string(
"unimplemented AArch64 builtin call: ") +
3577 getContext().BuiltinInfo.getName(builtinID));
3578 return mlir::Value{};
3579 case NEON::BI__builtin_neon_vsqadd_v:
3580 case NEON::BI__builtin_neon_vsqaddq_v:
3581 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.usqadd", ty,
3583 case NEON::BI__builtin_neon_vuqadd_v:
3584 case NEON::BI__builtin_neon_vuqaddq_v:
3585 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.suqadd", ty,
3587 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3588 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3589 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3590 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3591 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3592 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3593 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3594 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3595 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3596 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3597 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3598 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3599 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3600 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3601 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3602 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3603 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3604 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3605 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3606 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3607 case NEON::BI__builtin_neon_vluti2_lane_f16:
3608 case NEON::BI__builtin_neon_vluti2_lane_p16:
3609 case NEON::BI__builtin_neon_vluti2_lane_p8:
3610 case NEON::BI__builtin_neon_vluti2_lane_s16:
3611 case NEON::BI__builtin_neon_vluti2_lane_s8:
3612 case NEON::BI__builtin_neon_vluti2_lane_u16:
3613 case NEON::BI__builtin_neon_vluti2_lane_u8:
3614 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3615 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3616 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3617 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3618 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3619 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3620 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3621 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3622 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3623 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3624 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3625 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3626 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3627 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3628 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3629 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3630 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3631 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3632 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3633 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3634 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3635 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3636 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3637 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3638 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3639 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3640 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3641 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3642 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3643 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3644 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3645 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3646 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3647 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3648 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3649 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3650 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3651 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3652 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3653 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3654 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3655 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3656 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3657 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3658 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3659 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3660 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3661 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3662 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3663 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3664 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3665 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
3666 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
3667 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
3668 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
3669 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
3670 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
3671 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
3672 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
3673 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
3674 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
3675 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
3676 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
3677 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
3678 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
3679 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
3680 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
3681 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
3682 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
3683 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
3684 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
3685 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
3686 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
3687 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
3688 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
3689 case NEON::BI__builtin_neon_vamin_f16:
3690 case NEON::BI__builtin_neon_vaminq_f16:
3691 case NEON::BI__builtin_neon_vamin_f32:
3692 case NEON::BI__builtin_neon_vaminq_f32:
3693 case NEON::BI__builtin_neon_vaminq_f64:
3694 case NEON::BI__builtin_neon_vamax_f16:
3695 case NEON::BI__builtin_neon_vamaxq_f16:
3696 case NEON::BI__builtin_neon_vamax_f32:
3697 case NEON::BI__builtin_neon_vamaxq_f32:
3698 case NEON::BI__builtin_neon_vamaxq_f64:
3699 case NEON::BI__builtin_neon_vscale_f16:
3700 case NEON::BI__builtin_neon_vscaleq_f16:
3701 case NEON::BI__builtin_neon_vscale_f32:
3702 case NEON::BI__builtin_neon_vscaleq_f32:
3703 case NEON::BI__builtin_neon_vscaleq_f64:
3704 cgm.errorNYI(
expr->getSourceRange(),
3705 std::string(
"unimplemented AArch64 builtin call: ") +
3706 getContext().BuiltinInfo.getName(builtinID));
3707 return mlir::Value{};