625 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
627 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
634 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
651 cir::VectorType vTy =
getNeonType(&cgf, neonType, loc, hasLegalHalfType,
652 false, allowBFloatArgsAndRet);
653 cir::VectorType ty = vTy;
658 case NEON::BI__builtin_neon_splat_lane_v:
659 case NEON::BI__builtin_neon_splat_laneq_v:
660 case NEON::BI__builtin_neon_splatq_lane_v:
661 case NEON::BI__builtin_neon_splatq_laneq_v: {
662 uint64_t numElements = vTy.getSize();
663 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
665 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
670 case NEON::BI__builtin_neon_vpadd_v:
671 case NEON::BI__builtin_neon_vpaddq_v:
672 case NEON::BI__builtin_neon_vabs_v:
673 case NEON::BI__builtin_neon_vabsq_v:
675 std::string(
"unimplemented AArch64 builtin call: ") +
677 return mlir::Value{};
678 case NEON::BI__builtin_neon_vadd_v:
679 case NEON::BI__builtin_neon_vaddq_v: {
680 unsigned numBytes = (builtinID == NEON::BI__builtin_neon_vaddq_v) ? 16 : 8;
681 cir::VectorType byteTy =
688 case NEON::BI__builtin_neon_vaddhn_v:
689 case NEON::BI__builtin_neon_vcale_v:
690 case NEON::BI__builtin_neon_vcaleq_v:
691 case NEON::BI__builtin_neon_vcalt_v:
692 case NEON::BI__builtin_neon_vcaltq_v:
693 case NEON::BI__builtin_neon_vcage_v:
694 case NEON::BI__builtin_neon_vcageq_v:
695 case NEON::BI__builtin_neon_vcagt_v:
696 case NEON::BI__builtin_neon_vcagtq_v:
698 std::string(
"unimplemented AArch64 builtin call: ") +
700 return mlir::Value{};
701 case NEON::BI__builtin_neon_vceqz_v:
702 case NEON::BI__builtin_neon_vceqzq_v:
704 vTy, cir::CmpOpKind::eq);
705 case NEON::BI__builtin_neon_vcgez_v:
706 case NEON::BI__builtin_neon_vcgezq_v:
707 case NEON::BI__builtin_neon_vclez_v:
708 case NEON::BI__builtin_neon_vclezq_v:
709 case NEON::BI__builtin_neon_vcgtz_v:
710 case NEON::BI__builtin_neon_vcgtzq_v:
711 case NEON::BI__builtin_neon_vcltz_v:
712 case NEON::BI__builtin_neon_vcltzq_v:
713 case NEON::BI__builtin_neon_vclz_v:
714 case NEON::BI__builtin_neon_vclzq_v:
715 case NEON::BI__builtin_neon_vcvt_f32_v:
716 case NEON::BI__builtin_neon_vcvtq_f32_v:
717 case NEON::BI__builtin_neon_vcvt_f16_s16:
718 case NEON::BI__builtin_neon_vcvt_f16_u16:
719 case NEON::BI__builtin_neon_vcvtq_f16_s16:
720 case NEON::BI__builtin_neon_vcvtq_f16_u16:
721 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
722 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
723 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
724 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
726 std::string(
"unimplemented AArch64 builtin call: ") +
728 return mlir::Value{};
729 case NEON::BI__builtin_neon_vcvt_n_f32_v:
730 case NEON::BI__builtin_neon_vcvt_n_f64_v:
731 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
732 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
735 llvm::StringRef llvmIntrName =
737 usgn ? llvmIntrinsic : altLLVMIntrinsic));
739 {vTy, cstIntTy}, ops, llvmIntrName,
742 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
743 case NEON::BI__builtin_neon_vcvt_n_s32_v:
744 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
745 case NEON::BI__builtin_neon_vcvt_n_u32_v:
746 case NEON::BI__builtin_neon_vcvt_n_s64_v:
747 case NEON::BI__builtin_neon_vcvt_n_u64_v:
748 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
749 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
750 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
751 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
752 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
753 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
757 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
760 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
764 case NEON::BI__builtin_neon_vcvt_s32_v:
765 case NEON::BI__builtin_neon_vcvt_u32_v:
766 case NEON::BI__builtin_neon_vcvt_s64_v:
767 case NEON::BI__builtin_neon_vcvt_u64_v:
768 case NEON::BI__builtin_neon_vcvt_s16_f16:
769 case NEON::BI__builtin_neon_vcvt_u16_f16:
770 case NEON::BI__builtin_neon_vcvtq_s32_v:
771 case NEON::BI__builtin_neon_vcvtq_u32_v:
772 case NEON::BI__builtin_neon_vcvtq_s64_v:
773 case NEON::BI__builtin_neon_vcvtq_u64_v:
774 case NEON::BI__builtin_neon_vcvtq_s16_f16:
775 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
785 llvm::StringRef llvmIntrName = usgn ?
"fptoui.sat" :
"fptosi.sat";
787 {ty}, ops, llvmIntrName, vTy, loc);
789 case NEON::BI__builtin_neon_vcvta_s16_f16:
790 case NEON::BI__builtin_neon_vcvta_s32_v:
791 case NEON::BI__builtin_neon_vcvta_s64_v:
792 case NEON::BI__builtin_neon_vcvta_u16_f16:
793 case NEON::BI__builtin_neon_vcvta_u32_v:
794 case NEON::BI__builtin_neon_vcvta_u64_v:
795 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
796 case NEON::BI__builtin_neon_vcvtaq_s32_v:
797 case NEON::BI__builtin_neon_vcvtaq_s64_v:
798 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
799 case NEON::BI__builtin_neon_vcvtaq_u32_v:
800 case NEON::BI__builtin_neon_vcvtaq_u64_v:
801 case NEON::BI__builtin_neon_vcvtn_s16_f16:
802 case NEON::BI__builtin_neon_vcvtn_s32_v:
803 case NEON::BI__builtin_neon_vcvtn_s64_v:
804 case NEON::BI__builtin_neon_vcvtn_u16_f16:
805 case NEON::BI__builtin_neon_vcvtn_u32_v:
806 case NEON::BI__builtin_neon_vcvtn_u64_v:
807 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
808 case NEON::BI__builtin_neon_vcvtnq_s32_v:
809 case NEON::BI__builtin_neon_vcvtnq_s64_v:
810 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
811 case NEON::BI__builtin_neon_vcvtnq_u32_v:
812 case NEON::BI__builtin_neon_vcvtnq_u64_v:
813 case NEON::BI__builtin_neon_vcvtp_s16_f16:
814 case NEON::BI__builtin_neon_vcvtp_s32_v:
815 case NEON::BI__builtin_neon_vcvtp_s64_v:
816 case NEON::BI__builtin_neon_vcvtp_u16_f16:
817 case NEON::BI__builtin_neon_vcvtp_u32_v:
818 case NEON::BI__builtin_neon_vcvtp_u64_v:
819 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
820 case NEON::BI__builtin_neon_vcvtpq_s32_v:
821 case NEON::BI__builtin_neon_vcvtpq_s64_v:
822 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
823 case NEON::BI__builtin_neon_vcvtpq_u32_v:
824 case NEON::BI__builtin_neon_vcvtpq_u64_v:
825 case NEON::BI__builtin_neon_vcvtm_s16_f16:
826 case NEON::BI__builtin_neon_vcvtm_s32_v:
827 case NEON::BI__builtin_neon_vcvtm_s64_v:
828 case NEON::BI__builtin_neon_vcvtm_u16_f16:
829 case NEON::BI__builtin_neon_vcvtm_u32_v:
830 case NEON::BI__builtin_neon_vcvtm_u64_v:
831 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
832 case NEON::BI__builtin_neon_vcvtmq_s32_v:
833 case NEON::BI__builtin_neon_vcvtmq_s64_v:
834 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
835 case NEON::BI__builtin_neon_vcvtmq_u32_v:
836 case NEON::BI__builtin_neon_vcvtmq_u64_v:
837 case NEON::BI__builtin_neon_vcvtx_f32_v:
838 case NEON::BI__builtin_neon_vext_v:
839 case NEON::BI__builtin_neon_vextq_v:
840 case NEON::BI__builtin_neon_vfma_v:
842 std::string(
"unimplemented AArch64 builtin call: ") +
844 return mlir::Value{};
845 case NEON::BI__builtin_neon_vfmaq_v: {
856 case NEON::BI__builtin_neon_vld1_v:
857 case NEON::BI__builtin_neon_vld1q_v:
858 case NEON::BI__builtin_neon_vld1_x2_v:
859 case NEON::BI__builtin_neon_vld1q_x2_v:
860 case NEON::BI__builtin_neon_vld1_x3_v:
861 case NEON::BI__builtin_neon_vld1q_x3_v:
862 case NEON::BI__builtin_neon_vld1_x4_v:
863 case NEON::BI__builtin_neon_vld1q_x4_v:
864 case NEON::BI__builtin_neon_vld2_v:
865 case NEON::BI__builtin_neon_vld2q_v:
866 case NEON::BI__builtin_neon_vld3_v:
867 case NEON::BI__builtin_neon_vld3q_v:
868 case NEON::BI__builtin_neon_vld4_v:
869 case NEON::BI__builtin_neon_vld4q_v:
870 case NEON::BI__builtin_neon_vld2_dup_v:
871 case NEON::BI__builtin_neon_vld2q_dup_v:
872 case NEON::BI__builtin_neon_vld3_dup_v:
873 case NEON::BI__builtin_neon_vld3q_dup_v:
874 case NEON::BI__builtin_neon_vld4_dup_v:
875 case NEON::BI__builtin_neon_vld4q_dup_v:
876 case NEON::BI__builtin_neon_vld1_dup_v:
877 case NEON::BI__builtin_neon_vld1q_dup_v:
878 case NEON::BI__builtin_neon_vld2_lane_v:
879 case NEON::BI__builtin_neon_vld2q_lane_v:
880 case NEON::BI__builtin_neon_vld3_lane_v:
881 case NEON::BI__builtin_neon_vld3q_lane_v:
882 case NEON::BI__builtin_neon_vld4_lane_v:
883 case NEON::BI__builtin_neon_vld4q_lane_v:
885 std::string(
"Reached code-path for ARM builtin call ") +
887 "(ARM builtins are not supported ATM)");
888 return mlir::Value{};
889 case NEON::BI__builtin_neon_vmovl_v: {
890 cir::VectorType dTy =
896 case NEON::BI__builtin_neon_vmovn_v:
897 case NEON::BI__builtin_neon_vmull_v:
898 case NEON::BI__builtin_neon_vpadal_v:
899 case NEON::BI__builtin_neon_vpadalq_v:
901 std::string(
"Reached code-path for ARM builtin call ") +
903 "(ARM builtins are not supported ATM)");
904 return mlir::Value{};
905 case NEON::BI__builtin_neon_vpaddl_v:
906 case NEON::BI__builtin_neon_vpaddlq_v: {
907 llvm::StringRef llvmIntrName =
909 usgn ? llvmIntrinsic : altLLVMIntrinsic));
911 {getNeonPairwiseWidenInputType(vTy, usgn)},
915 case NEON::BI__builtin_neon_vqdmlal_v:
916 case NEON::BI__builtin_neon_vqdmlsl_v:
917 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
918 case NEON::BI__builtin_neon_vqdmulh_lane_v:
919 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
920 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
921 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
922 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
923 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
924 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
925 case NEON::BI__builtin_neon_vqshl_n_v:
926 case NEON::BI__builtin_neon_vqshlq_n_v:
927 case NEON::BI__builtin_neon_vqshlu_n_v:
928 case NEON::BI__builtin_neon_vqshluq_n_v:
929 case NEON::BI__builtin_neon_vrecpe_v:
930 case NEON::BI__builtin_neon_vrecpeq_v:
931 case NEON::BI__builtin_neon_vrsqrte_v:
932 case NEON::BI__builtin_neon_vrsqrteq_v:
933 case NEON::BI__builtin_neon_vrndi_v:
934 case NEON::BI__builtin_neon_vrndiq_v:
936 std::string(
"unimplemented AArch64 builtin call: ") +
938 return mlir::Value{};
939 case NEON::BI__builtin_neon_vrshr_n_v:
940 case NEON::BI__builtin_neon_vrshrq_n_v: {
941 llvm::StringRef intrName =
942 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
945 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
946 intrName, ty, loc,
false,
950 case NEON::BI__builtin_neon_vsha512hq_u64:
951 case NEON::BI__builtin_neon_vsha512h2q_u64:
952 case NEON::BI__builtin_neon_vsha512su0q_u64:
953 case NEON::BI__builtin_neon_vsha512su1q_u64:
955 std::string(
"unimplemented AArch64 builtin call: ") +
957 return mlir::Value{};
958 case NEON::BI__builtin_neon_vshl_n_v:
959 case NEON::BI__builtin_neon_vshlq_n_v:
962 case NEON::BI__builtin_neon_vshll_n_v:
963 case NEON::BI__builtin_neon_vshrn_n_v:
965 std::string(
"unimplemented AArch64 builtin call: ") +
967 return mlir::Value{};
968 case NEON::BI__builtin_neon_vshr_n_v:
969 case NEON::BI__builtin_neon_vshrq_n_v:
971 case NEON::BI__builtin_neon_vst1_v:
972 case NEON::BI__builtin_neon_vst1q_v:
973 case NEON::BI__builtin_neon_vst2_v:
974 case NEON::BI__builtin_neon_vst2q_v:
975 case NEON::BI__builtin_neon_vst3_v:
976 case NEON::BI__builtin_neon_vst3q_v:
977 case NEON::BI__builtin_neon_vst4_v:
978 case NEON::BI__builtin_neon_vst4q_v:
979 case NEON::BI__builtin_neon_vst2_lane_v:
980 case NEON::BI__builtin_neon_vst2q_lane_v:
981 case NEON::BI__builtin_neon_vst3_lane_v:
982 case NEON::BI__builtin_neon_vst3q_lane_v:
983 case NEON::BI__builtin_neon_vst4_lane_v:
984 case NEON::BI__builtin_neon_vst4q_lane_v:
985 case NEON::BI__builtin_neon_vsm3partw1q_u32:
986 case NEON::BI__builtin_neon_vsm3partw2q_u32:
987 case NEON::BI__builtin_neon_vsm3ss1q_u32:
988 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
989 case NEON::BI__builtin_neon_vsm4eq_u32:
990 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
991 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
992 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
993 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
994 case NEON::BI__builtin_neon_vst1_x2_v:
995 case NEON::BI__builtin_neon_vst1q_x2_v:
996 case NEON::BI__builtin_neon_vst1_x3_v:
997 case NEON::BI__builtin_neon_vst1q_x3_v:
998 case NEON::BI__builtin_neon_vst1_x4_v:
999 case NEON::BI__builtin_neon_vst1q_x4_v:
1000 case NEON::BI__builtin_neon_vsubhn_v:
1001 case NEON::BI__builtin_neon_vtrn_v:
1002 case NEON::BI__builtin_neon_vtrnq_v:
1003 case NEON::BI__builtin_neon_vtst_v:
1004 case NEON::BI__builtin_neon_vtstq_v:
1005 case NEON::BI__builtin_neon_vuzp_v:
1006 case NEON::BI__builtin_neon_vuzpq_v:
1007 case NEON::BI__builtin_neon_vxarq_u64:
1008 case NEON::BI__builtin_neon_vzip_v:
1009 case NEON::BI__builtin_neon_vzipq_v:
1010 case NEON::BI__builtin_neon_vdot_s32:
1011 case NEON::BI__builtin_neon_vdot_u32:
1012 case NEON::BI__builtin_neon_vdotq_s32:
1013 case NEON::BI__builtin_neon_vdotq_u32:
1014 case NEON::BI__builtin_neon_vfmlal_low_f16:
1015 case NEON::BI__builtin_neon_vfmlalq_low_f16:
1016 case NEON::BI__builtin_neon_vfmlsl_low_f16:
1017 case NEON::BI__builtin_neon_vfmlslq_low_f16:
1018 case NEON::BI__builtin_neon_vfmlal_high_f16:
1019 case NEON::BI__builtin_neon_vfmlalq_high_f16:
1020 case NEON::BI__builtin_neon_vfmlsl_high_f16:
1021 case NEON::BI__builtin_neon_vfmlslq_high_f16:
1022 case NEON::BI__builtin_neon_vmmlaq_s32:
1023 case NEON::BI__builtin_neon_vmmlaq_u32:
1025 std::string(
"unimplemented AArch64 builtin call: ") +
1027 return mlir::Value{};
1028 case NEON::BI__builtin_neon_vmul_v:
1029 case NEON::BI__builtin_neon_vmulq_v:
1032 case NEON::BI__builtin_neon_vusmmlaq_s32:
1033 case NEON::BI__builtin_neon_vusdot_s32:
1034 case NEON::BI__builtin_neon_vusdotq_s32:
1035 case NEON::BI__builtin_neon_vbfdot_f32:
1036 case NEON::BI__builtin_neon_vbfdotq_f32:
1037 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
1039 std::string(
"unimplemented AArch64 builtin call: ") +
1041 return mlir::Value{};
1047 switch (builtinID) {
1050 std::string(
"unimplemented AArch64 builtin call: ") +
1053 case NEON::BI__builtin_neon_vshl_v:
1054 case NEON::BI__builtin_neon_vshlq_v: {
1055 llvm::StringRef llvmIntrName =
1057 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1059 mlir::Value result =
1061 {vTy, vTy}, ops, llvmIntrName,
1478 NEON::BI__builtin_neon_splat_lane_bf16,
1479 NEON::BI__builtin_neon_splat_lane_v,
1482 NEON::BI__builtin_neon_splat_laneq_bf16,
1483 NEON::BI__builtin_neon_splat_laneq_v,
1486 NEON::BI__builtin_neon_splatq_lane_bf16,
1487 NEON::BI__builtin_neon_splatq_lane_v,
1490 NEON::BI__builtin_neon_splatq_laneq_bf16,
1491 NEON::BI__builtin_neon_splatq_laneq_v,
1494 NEON::BI__builtin_neon_vabd_f16,
1495 NEON::BI__builtin_neon_vabd_v,
1498 NEON::BI__builtin_neon_vabdq_f16,
1499 NEON::BI__builtin_neon_vabdq_v,
1502 NEON::BI__builtin_neon_vabs_f16,
1503 NEON::BI__builtin_neon_vabs_v,
1506 NEON::BI__builtin_neon_vabsq_f16,
1507 NEON::BI__builtin_neon_vabsq_v,
1510 NEON::BI__builtin_neon_vcage_f16,
1511 NEON::BI__builtin_neon_vcage_v,
1514 NEON::BI__builtin_neon_vcageq_f16,
1515 NEON::BI__builtin_neon_vcageq_v,
1518 NEON::BI__builtin_neon_vcagt_f16,
1519 NEON::BI__builtin_neon_vcagt_v,
1522 NEON::BI__builtin_neon_vcagtq_f16,
1523 NEON::BI__builtin_neon_vcagtq_v,
1526 NEON::BI__builtin_neon_vcale_f16,
1527 NEON::BI__builtin_neon_vcale_v,
1530 NEON::BI__builtin_neon_vcaleq_f16,
1531 NEON::BI__builtin_neon_vcaleq_v,
1534 NEON::BI__builtin_neon_vcalt_f16,
1535 NEON::BI__builtin_neon_vcalt_v,
1538 NEON::BI__builtin_neon_vcaltq_f16,
1539 NEON::BI__builtin_neon_vcaltq_v,
1542 NEON::BI__builtin_neon_vceqz_f16,
1543 NEON::BI__builtin_neon_vceqz_v,
1546 NEON::BI__builtin_neon_vceqzq_f16,
1547 NEON::BI__builtin_neon_vceqzq_v,
1550 NEON::BI__builtin_neon_vcgez_f16,
1551 NEON::BI__builtin_neon_vcgez_v,
1554 NEON::BI__builtin_neon_vcgezq_f16,
1555 NEON::BI__builtin_neon_vcgezq_v,
1558 NEON::BI__builtin_neon_vcgtz_f16,
1559 NEON::BI__builtin_neon_vcgtz_v,
1562 NEON::BI__builtin_neon_vcgtzq_f16,
1563 NEON::BI__builtin_neon_vcgtzq_v,
1566 NEON::BI__builtin_neon_vclez_f16,
1567 NEON::BI__builtin_neon_vclez_v,
1570 NEON::BI__builtin_neon_vclezq_f16,
1571 NEON::BI__builtin_neon_vclezq_v,
1574 NEON::BI__builtin_neon_vcltz_f16,
1575 NEON::BI__builtin_neon_vcltz_v,
1578 NEON::BI__builtin_neon_vcltzq_f16,
1579 NEON::BI__builtin_neon_vcltzq_v,
1582 NEON::BI__builtin_neon_vfma_f16,
1583 NEON::BI__builtin_neon_vfma_v,
1586 NEON::BI__builtin_neon_vfma_lane_f16,
1587 NEON::BI__builtin_neon_vfma_lane_v,
1590 NEON::BI__builtin_neon_vfma_laneq_f16,
1591 NEON::BI__builtin_neon_vfma_laneq_v,
1594 NEON::BI__builtin_neon_vfmaq_f16,
1595 NEON::BI__builtin_neon_vfmaq_v,
1598 NEON::BI__builtin_neon_vfmaq_lane_f16,
1599 NEON::BI__builtin_neon_vfmaq_lane_v,
1602 NEON::BI__builtin_neon_vfmaq_laneq_f16,
1603 NEON::BI__builtin_neon_vfmaq_laneq_v,
1605 {NEON::BI__builtin_neon_vld1_bf16_x2, NEON::BI__builtin_neon_vld1_x2_v},
1606 {NEON::BI__builtin_neon_vld1_bf16_x3, NEON::BI__builtin_neon_vld1_x3_v},
1607 {NEON::BI__builtin_neon_vld1_bf16_x4, NEON::BI__builtin_neon_vld1_x4_v},
1608 {NEON::BI__builtin_neon_vld1_bf16, NEON::BI__builtin_neon_vld1_v},
1609 {NEON::BI__builtin_neon_vld1_dup_bf16, NEON::BI__builtin_neon_vld1_dup_v},
1610 {NEON::BI__builtin_neon_vld1_lane_bf16, NEON::BI__builtin_neon_vld1_lane_v},
1611 {NEON::BI__builtin_neon_vld1q_bf16_x2, NEON::BI__builtin_neon_vld1q_x2_v},
1612 {NEON::BI__builtin_neon_vld1q_bf16_x3, NEON::BI__builtin_neon_vld1q_x3_v},
1613 {NEON::BI__builtin_neon_vld1q_bf16_x4, NEON::BI__builtin_neon_vld1q_x4_v},
1614 {NEON::BI__builtin_neon_vld1q_bf16, NEON::BI__builtin_neon_vld1q_v},
1615 {NEON::BI__builtin_neon_vld1q_dup_bf16, NEON::BI__builtin_neon_vld1q_dup_v},
1616 {NEON::BI__builtin_neon_vld1q_lane_bf16,
1617 NEON::BI__builtin_neon_vld1q_lane_v},
1618 {NEON::BI__builtin_neon_vld2_bf16, NEON::BI__builtin_neon_vld2_v},
1619 {NEON::BI__builtin_neon_vld2_dup_bf16, NEON::BI__builtin_neon_vld2_dup_v},
1620 {NEON::BI__builtin_neon_vld2_lane_bf16, NEON::BI__builtin_neon_vld2_lane_v},
1621 {NEON::BI__builtin_neon_vld2q_bf16, NEON::BI__builtin_neon_vld2q_v},
1622 {NEON::BI__builtin_neon_vld2q_dup_bf16, NEON::BI__builtin_neon_vld2q_dup_v},
1623 {NEON::BI__builtin_neon_vld2q_lane_bf16,
1624 NEON::BI__builtin_neon_vld2q_lane_v},
1625 {NEON::BI__builtin_neon_vld3_bf16, NEON::BI__builtin_neon_vld3_v},
1626 {NEON::BI__builtin_neon_vld3_dup_bf16, NEON::BI__builtin_neon_vld3_dup_v},
1627 {NEON::BI__builtin_neon_vld3_lane_bf16, NEON::BI__builtin_neon_vld3_lane_v},
1628 {NEON::BI__builtin_neon_vld3q_bf16, NEON::BI__builtin_neon_vld3q_v},
1629 {NEON::BI__builtin_neon_vld3q_dup_bf16, NEON::BI__builtin_neon_vld3q_dup_v},
1630 {NEON::BI__builtin_neon_vld3q_lane_bf16,
1631 NEON::BI__builtin_neon_vld3q_lane_v},
1632 {NEON::BI__builtin_neon_vld4_bf16, NEON::BI__builtin_neon_vld4_v},
1633 {NEON::BI__builtin_neon_vld4_dup_bf16, NEON::BI__builtin_neon_vld4_dup_v},
1634 {NEON::BI__builtin_neon_vld4_lane_bf16, NEON::BI__builtin_neon_vld4_lane_v},
1635 {NEON::BI__builtin_neon_vld4q_bf16, NEON::BI__builtin_neon_vld4q_v},
1636 {NEON::BI__builtin_neon_vld4q_dup_bf16, NEON::BI__builtin_neon_vld4q_dup_v},
1637 {NEON::BI__builtin_neon_vld4q_lane_bf16,
1638 NEON::BI__builtin_neon_vld4q_lane_v},
1640 NEON::BI__builtin_neon_vmax_f16,
1641 NEON::BI__builtin_neon_vmax_v,
1644 NEON::BI__builtin_neon_vmaxnm_f16,
1645 NEON::BI__builtin_neon_vmaxnm_v,
1648 NEON::BI__builtin_neon_vmaxnmq_f16,
1649 NEON::BI__builtin_neon_vmaxnmq_v,
1652 NEON::BI__builtin_neon_vmaxq_f16,
1653 NEON::BI__builtin_neon_vmaxq_v,
1656 NEON::BI__builtin_neon_vmin_f16,
1657 NEON::BI__builtin_neon_vmin_v,
1660 NEON::BI__builtin_neon_vminnm_f16,
1661 NEON::BI__builtin_neon_vminnm_v,
1664 NEON::BI__builtin_neon_vminnmq_f16,
1665 NEON::BI__builtin_neon_vminnmq_v,
1668 NEON::BI__builtin_neon_vminq_f16,
1669 NEON::BI__builtin_neon_vminq_v,
1672 NEON::BI__builtin_neon_vmulx_f16,
1673 NEON::BI__builtin_neon_vmulx_v,
1676 NEON::BI__builtin_neon_vmulxq_f16,
1677 NEON::BI__builtin_neon_vmulxq_v,
1680 NEON::BI__builtin_neon_vpadd_f16,
1681 NEON::BI__builtin_neon_vpadd_v,
1684 NEON::BI__builtin_neon_vpaddq_f16,
1685 NEON::BI__builtin_neon_vpaddq_v,
1688 NEON::BI__builtin_neon_vpmax_f16,
1689 NEON::BI__builtin_neon_vpmax_v,
1692 NEON::BI__builtin_neon_vpmaxnm_f16,
1693 NEON::BI__builtin_neon_vpmaxnm_v,
1696 NEON::BI__builtin_neon_vpmaxnmq_f16,
1697 NEON::BI__builtin_neon_vpmaxnmq_v,
1700 NEON::BI__builtin_neon_vpmaxq_f16,
1701 NEON::BI__builtin_neon_vpmaxq_v,
1704 NEON::BI__builtin_neon_vpmin_f16,
1705 NEON::BI__builtin_neon_vpmin_v,
1708 NEON::BI__builtin_neon_vpminnm_f16,
1709 NEON::BI__builtin_neon_vpminnm_v,
1712 NEON::BI__builtin_neon_vpminnmq_f16,
1713 NEON::BI__builtin_neon_vpminnmq_v,
1716 NEON::BI__builtin_neon_vpminq_f16,
1717 NEON::BI__builtin_neon_vpminq_v,
1720 NEON::BI__builtin_neon_vrecpe_f16,
1721 NEON::BI__builtin_neon_vrecpe_v,
1724 NEON::BI__builtin_neon_vrecpeq_f16,
1725 NEON::BI__builtin_neon_vrecpeq_v,
1728 NEON::BI__builtin_neon_vrecps_f16,
1729 NEON::BI__builtin_neon_vrecps_v,
1732 NEON::BI__builtin_neon_vrecpsq_f16,
1733 NEON::BI__builtin_neon_vrecpsq_v,
1736 NEON::BI__builtin_neon_vrnd_f16,
1737 NEON::BI__builtin_neon_vrnd_v,
1740 NEON::BI__builtin_neon_vrnda_f16,
1741 NEON::BI__builtin_neon_vrnda_v,
1744 NEON::BI__builtin_neon_vrndaq_f16,
1745 NEON::BI__builtin_neon_vrndaq_v,
1748 NEON::BI__builtin_neon_vrndi_f16,
1749 NEON::BI__builtin_neon_vrndi_v,
1752 NEON::BI__builtin_neon_vrndiq_f16,
1753 NEON::BI__builtin_neon_vrndiq_v,
1756 NEON::BI__builtin_neon_vrndm_f16,
1757 NEON::BI__builtin_neon_vrndm_v,
1760 NEON::BI__builtin_neon_vrndmq_f16,
1761 NEON::BI__builtin_neon_vrndmq_v,
1764 NEON::BI__builtin_neon_vrndn_f16,
1765 NEON::BI__builtin_neon_vrndn_v,
1768 NEON::BI__builtin_neon_vrndnq_f16,
1769 NEON::BI__builtin_neon_vrndnq_v,
1772 NEON::BI__builtin_neon_vrndp_f16,
1773 NEON::BI__builtin_neon_vrndp_v,
1776 NEON::BI__builtin_neon_vrndpq_f16,
1777 NEON::BI__builtin_neon_vrndpq_v,
1780 NEON::BI__builtin_neon_vrndq_f16,
1781 NEON::BI__builtin_neon_vrndq_v,
1784 NEON::BI__builtin_neon_vrndx_f16,
1785 NEON::BI__builtin_neon_vrndx_v,
1788 NEON::BI__builtin_neon_vrndxq_f16,
1789 NEON::BI__builtin_neon_vrndxq_v,
1792 NEON::BI__builtin_neon_vrsqrte_f16,
1793 NEON::BI__builtin_neon_vrsqrte_v,
1796 NEON::BI__builtin_neon_vrsqrteq_f16,
1797 NEON::BI__builtin_neon_vrsqrteq_v,
1800 NEON::BI__builtin_neon_vrsqrts_f16,
1801 NEON::BI__builtin_neon_vrsqrts_v,
1804 NEON::BI__builtin_neon_vrsqrtsq_f16,
1805 NEON::BI__builtin_neon_vrsqrtsq_v,
1808 NEON::BI__builtin_neon_vsqrt_f16,
1809 NEON::BI__builtin_neon_vsqrt_v,
1812 NEON::BI__builtin_neon_vsqrtq_f16,
1813 NEON::BI__builtin_neon_vsqrtq_v,
1815 {NEON::BI__builtin_neon_vst1_bf16_x2, NEON::BI__builtin_neon_vst1_x2_v},
1816 {NEON::BI__builtin_neon_vst1_bf16_x3, NEON::BI__builtin_neon_vst1_x3_v},
1817 {NEON::BI__builtin_neon_vst1_bf16_x4, NEON::BI__builtin_neon_vst1_x4_v},
1818 {NEON::BI__builtin_neon_vst1_bf16, NEON::BI__builtin_neon_vst1_v},
1819 {NEON::BI__builtin_neon_vst1_lane_bf16, NEON::BI__builtin_neon_vst1_lane_v},
1820 {NEON::BI__builtin_neon_vst1q_bf16_x2, NEON::BI__builtin_neon_vst1q_x2_v},
1821 {NEON::BI__builtin_neon_vst1q_bf16_x3, NEON::BI__builtin_neon_vst1q_x3_v},
1822 {NEON::BI__builtin_neon_vst1q_bf16_x4, NEON::BI__builtin_neon_vst1q_x4_v},
1823 {NEON::BI__builtin_neon_vst1q_bf16, NEON::BI__builtin_neon_vst1q_v},
1824 {NEON::BI__builtin_neon_vst1q_lane_bf16,
1825 NEON::BI__builtin_neon_vst1q_lane_v},
1826 {NEON::BI__builtin_neon_vst2_bf16, NEON::BI__builtin_neon_vst2_v},
1827 {NEON::BI__builtin_neon_vst2_lane_bf16, NEON::BI__builtin_neon_vst2_lane_v},
1828 {NEON::BI__builtin_neon_vst2q_bf16, NEON::BI__builtin_neon_vst2q_v},
1829 {NEON::BI__builtin_neon_vst2q_lane_bf16,
1830 NEON::BI__builtin_neon_vst2q_lane_v},
1831 {NEON::BI__builtin_neon_vst3_bf16, NEON::BI__builtin_neon_vst3_v},
1832 {NEON::BI__builtin_neon_vst3_lane_bf16, NEON::BI__builtin_neon_vst3_lane_v},
1833 {NEON::BI__builtin_neon_vst3q_bf16, NEON::BI__builtin_neon_vst3q_v},
1834 {NEON::BI__builtin_neon_vst3q_lane_bf16,
1835 NEON::BI__builtin_neon_vst3q_lane_v},
1836 {NEON::BI__builtin_neon_vst4_bf16, NEON::BI__builtin_neon_vst4_v},
1837 {NEON::BI__builtin_neon_vst4_lane_bf16, NEON::BI__builtin_neon_vst4_lane_v},
1838 {NEON::BI__builtin_neon_vst4q_bf16, NEON::BI__builtin_neon_vst4q_v},
1839 {NEON::BI__builtin_neon_vst4q_lane_bf16,
1840 NEON::BI__builtin_neon_vst4q_lane_v},
1844 {NEON::BI__builtin_neon_vldap1_lane_u64,
1845 NEON::BI__builtin_neon_vldap1_lane_s64},
1846 {NEON::BI__builtin_neon_vldap1_lane_f64,
1847 NEON::BI__builtin_neon_vldap1_lane_s64},
1848 {NEON::BI__builtin_neon_vldap1_lane_p64,
1849 NEON::BI__builtin_neon_vldap1_lane_s64},
1850 {NEON::BI__builtin_neon_vldap1q_lane_u64,
1851 NEON::BI__builtin_neon_vldap1q_lane_s64},
1852 {NEON::BI__builtin_neon_vldap1q_lane_f64,
1853 NEON::BI__builtin_neon_vldap1q_lane_s64},
1854 {NEON::BI__builtin_neon_vldap1q_lane_p64,
1855 NEON::BI__builtin_neon_vldap1q_lane_s64},
1856 {NEON::BI__builtin_neon_vstl1_lane_u64,
1857 NEON::BI__builtin_neon_vstl1_lane_s64},
1858 {NEON::BI__builtin_neon_vstl1_lane_f64,
1859 NEON::BI__builtin_neon_vstl1_lane_s64},
1860 {NEON::BI__builtin_neon_vstl1_lane_p64,
1861 NEON::BI__builtin_neon_vstl1_lane_s64},
1862 {NEON::BI__builtin_neon_vstl1q_lane_u64,
1863 NEON::BI__builtin_neon_vstl1q_lane_s64},
1864 {NEON::BI__builtin_neon_vstl1q_lane_f64,
1865 NEON::BI__builtin_neon_vstl1q_lane_s64},
1866 {NEON::BI__builtin_neon_vstl1q_lane_p64,
1867 NEON::BI__builtin_neon_vstl1q_lane_s64},
1873 llvm::Triple::ArchType arch) {
1882 if (builtinID == Builtin::BI__builtin_cpu_supports) {
1883 cgm.errorNYI(
expr->getSourceRange(),
1884 std::string(
"unimplemented AArch64 builtin call: ") +
1885 getContext().BuiltinInfo.getName(builtinID));
1886 return mlir::Value{};
1889 switch (builtinID) {
1892 case clang::AArch64::BI__builtin_arm_nop:
1893 case clang::AArch64::BI__builtin_arm_yield:
1894 case clang::AArch64::BI__yield:
1895 case clang::AArch64::BI__builtin_arm_wfe:
1896 case clang::AArch64::BI__wfe:
1897 case clang::AArch64::BI__builtin_arm_wfi:
1898 case clang::AArch64::BI__wfi:
1899 case clang::AArch64::BI__builtin_arm_sev:
1900 case clang::AArch64::BI__sev:
1901 case clang::AArch64::BI__builtin_arm_sevl:
1902 case clang::AArch64::BI__sevl:
1903 cgm.errorNYI(
expr->getSourceRange(),
1904 std::string(
"unimplemented AArch64 builtin call: ") +
1905 getContext().BuiltinInfo.getName(builtinID));
1906 return mlir::Value{};
1909 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
1910 cgm.errorNYI(
expr->getSourceRange(),
1911 std::string(
"unimplemented AArch64 builtin call: ") +
1912 getContext().BuiltinInfo.getName(builtinID));
1913 return mlir::Value{};
1916 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
1917 cgm.errorNYI(
expr->getSourceRange(),
1918 std::string(
"unimplemented AArch64 builtin call: ") +
1919 getContext().BuiltinInfo.getName(builtinID));
1920 return mlir::Value{};
1923 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
1924 cgm.errorNYI(
expr->getSourceRange(),
1925 std::string(
"unimplemented AArch64 builtin call: ") +
1926 getContext().BuiltinInfo.getName(builtinID));
1927 return mlir::Value{};
1929 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
1930 cgm.errorNYI(
expr->getSourceRange(),
1931 std::string(
"unimplemented AArch64 builtin call: ") +
1932 getContext().BuiltinInfo.getName(builtinID));
1933 return mlir::Value{};
1936 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
1937 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
1938 cgm.errorNYI(
expr->getSourceRange(),
1939 std::string(
"unimplemented AArch64 builtin call: ") +
1940 getContext().BuiltinInfo.getName(builtinID));
1941 return mlir::Value{};
1944 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
1945 cgm.errorNYI(
expr->getSourceRange(),
1946 std::string(
"unimplemented AArch64 builtin call: ") +
1947 getContext().BuiltinInfo.getName(builtinID));
1948 return mlir::Value{};
1950 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
1951 cgm.errorNYI(
expr->getSourceRange(),
1952 std::string(
"unimplemented AArch64 builtin call: ") +
1953 getContext().BuiltinInfo.getName(builtinID));
1954 return mlir::Value{};
1957 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
1958 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
1959 cgm.errorNYI(
expr->getSourceRange(),
1960 std::string(
"unimplemented AArch64 builtin call: ") +
1961 getContext().BuiltinInfo.getName(builtinID));
1962 return mlir::Value{};
1965 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
1966 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
1967 cgm.errorNYI(
expr->getSourceRange(),
1968 std::string(
"unimplemented AArch64 builtin call: ") +
1969 getContext().BuiltinInfo.getName(builtinID));
1970 return mlir::Value{};
1973 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
1974 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
1975 cgm.errorNYI(
expr->getSourceRange(),
1976 std::string(
"unimplemented AArch64 builtin call: ") +
1977 getContext().BuiltinInfo.getName(builtinID));
1978 return mlir::Value{};
1981 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
1982 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
1983 cgm.errorNYI(
expr->getSourceRange(),
1984 std::string(
"unimplemented AArch64 builtin call: ") +
1985 getContext().BuiltinInfo.getName(builtinID));
1986 return mlir::Value{};
1989 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
1990 cgm.errorNYI(
expr->getSourceRange(),
1991 std::string(
"unimplemented AArch64 builtin call: ") +
1992 getContext().BuiltinInfo.getName(builtinID));
1993 return mlir::Value{};
1996 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
1997 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
1998 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
1999 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2000 cgm.errorNYI(
expr->getSourceRange(),
2001 std::string(
"unimplemented AArch64 builtin call: ") +
2002 getContext().BuiltinInfo.getName(builtinID));
2003 return mlir::Value{};
2006 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2007 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
2008 cgm.errorNYI(
expr->getSourceRange(),
2009 std::string(
"unimplemented AArch64 builtin call: ") +
2010 getContext().BuiltinInfo.getName(builtinID));
2011 return mlir::Value{};
2014 if (builtinID == clang::AArch64::BI__clear_cache) {
2015 cgm.errorNYI(
expr->getSourceRange(),
2016 std::string(
"unimplemented AArch64 builtin call: ") +
2017 getContext().BuiltinInfo.getName(builtinID));
2018 return mlir::Value{};
2021 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2022 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2024 cgm.errorNYI(
expr->getSourceRange(),
2025 std::string(
"unimplemented AArch64 builtin call: ") +
2026 getContext().BuiltinInfo.getName(builtinID));
2027 return mlir::Value{};
2029 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2030 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2031 cgm.errorNYI(
expr->getSourceRange(),
2032 std::string(
"unimplemented AArch64 builtin call: ") +
2033 getContext().BuiltinInfo.getName(builtinID));
2034 return mlir::Value{};
2037 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2038 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
2040 cgm.errorNYI(
expr->getSourceRange(),
2041 std::string(
"unimplemented AArch64 builtin call: ") +
2042 getContext().BuiltinInfo.getName(builtinID));
2043 return mlir::Value{};
2046 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2047 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
2048 cgm.errorNYI(
expr->getSourceRange(),
2049 std::string(
"unimplemented AArch64 builtin call: ") +
2050 getContext().BuiltinInfo.getName(builtinID));
2051 return mlir::Value{};
2054 if (builtinID == clang::AArch64::BI__getReg ||
2055 builtinID == clang::AArch64::BI__setReg ||
2056 builtinID == clang::AArch64::BI__getRegFp ||
2057 builtinID == clang::AArch64::BI__setRegFp) {
2058 cgm.errorNYI(
expr->getSourceRange(),
2059 std::string(
"unimplemented AArch64 builtin call: ") +
2060 getContext().BuiltinInfo.getName(builtinID));
2061 return mlir::Value{};
2064 if (builtinID == clang::AArch64::BI__break) {
2065 cgm.errorNYI(
expr->getSourceRange(),
2066 std::string(
"unimplemented AArch64 builtin call: ") +
2067 getContext().BuiltinInfo.getName(builtinID));
2068 return mlir::Value{};
2071 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2072 cgm.errorNYI(
expr->getSourceRange(),
2073 std::string(
"unimplemented AArch64 builtin call: ") +
2074 getContext().BuiltinInfo.getName(builtinID));
2075 return mlir::Value{};
2078 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2079 cgm.errorNYI(
expr->getSourceRange(),
2080 std::string(
"unimplemented AArch64 builtin call: ") +
2081 getContext().BuiltinInfo.getName(builtinID));
2082 return mlir::Value{};
2086 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2087 switch (builtinID) {
2088 case clang::AArch64::BI__builtin_arm_crc32b:
2089 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2091 case clang::AArch64::BI__builtin_arm_crc32cb:
2092 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2094 case clang::AArch64::BI__builtin_arm_crc32h:
2095 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2097 case clang::AArch64::BI__builtin_arm_crc32ch:
2098 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2100 case clang::AArch64::BI__builtin_arm_crc32w:
2101 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2103 case clang::AArch64::BI__builtin_arm_crc32cw:
2104 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2106 case clang::AArch64::BI__builtin_arm_crc32d:
2107 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2109 case clang::AArch64::BI__builtin_arm_crc32cd:
2110 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2114 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2115 cgm.errorNYI(
expr->getSourceRange(),
2116 std::string(
"unimplemented AArch64 builtin call: ") +
2117 getContext().BuiltinInfo.getName(builtinID));
2118 return mlir::Value{};
2122 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2123 cgm.errorNYI(
expr->getSourceRange(),
2124 std::string(
"unimplemented AArch64 builtin call: ") +
2125 getContext().BuiltinInfo.getName(builtinID));
2126 return mlir::Value{};
2130 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2131 switch (builtinID) {
2132 case clang::AArch64::BI__builtin_arm_irg:
2133 mteIntrinsicID = Intrinsic::aarch64_irg;
2135 case clang::AArch64::BI__builtin_arm_addg:
2136 mteIntrinsicID = Intrinsic::aarch64_addg;
2138 case clang::AArch64::BI__builtin_arm_gmi:
2139 mteIntrinsicID = Intrinsic::aarch64_gmi;
2141 case clang::AArch64::BI__builtin_arm_ldg:
2142 mteIntrinsicID = Intrinsic::aarch64_ldg;
2144 case clang::AArch64::BI__builtin_arm_stg:
2145 mteIntrinsicID = Intrinsic::aarch64_stg;
2147 case clang::AArch64::BI__builtin_arm_subp:
2148 mteIntrinsicID = Intrinsic::aarch64_subp;
2152 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
2153 cgm.errorNYI(
expr->getSourceRange(),
2154 std::string(
"unimplemented AArch64 builtin call: ") +
2155 getContext().BuiltinInfo.getName(builtinID));
2156 return mlir::Value{};
2159 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
2160 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2161 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2162 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2163 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2164 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2165 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2166 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2167 cgm.errorNYI(
expr->getSourceRange(),
2168 std::string(
"unimplemented AArch64 builtin call: ") +
2169 getContext().BuiltinInfo.getName(builtinID));
2170 return mlir::Value{};
2173 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2174 builtinID == clang::AArch64::BI_WriteStatusReg ||
2175 builtinID == clang::AArch64::BI__sys) {
2176 cgm.errorNYI(
expr->getSourceRange(),
2177 std::string(
"unimplemented AArch64 builtin call: ") +
2178 getContext().BuiltinInfo.getName(builtinID));
2179 return mlir::Value{};
2182 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
2183 cgm.errorNYI(
expr->getSourceRange(),
2184 std::string(
"unimplemented AArch64 builtin call: ") +
2185 getContext().BuiltinInfo.getName(builtinID));
2186 return mlir::Value{};
2189 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2190 cgm.errorNYI(
expr->getSourceRange(),
2191 std::string(
"unimplemented AArch64 builtin call: ") +
2192 getContext().BuiltinInfo.getName(builtinID));
2193 return mlir::Value{};
2196 if (builtinID == clang::AArch64::BI__mulh ||
2197 builtinID == clang::AArch64::BI__umulh) {
2198 cgm.errorNYI(
expr->getSourceRange(),
2199 std::string(
"unimplemented AArch64 builtin call: ") +
2200 getContext().BuiltinInfo.getName(builtinID));
2201 return mlir::Value{};
2204 if (builtinID == AArch64::BI__writex18byte ||
2205 builtinID == AArch64::BI__writex18word ||
2206 builtinID == AArch64::BI__writex18dword ||
2207 builtinID == AArch64::BI__writex18qword) {
2208 cgm.errorNYI(
expr->getSourceRange(),
2209 std::string(
"unimplemented AArch64 builtin call: ") +
2210 getContext().BuiltinInfo.getName(builtinID));
2211 return mlir::Value{};
2214 if (builtinID == AArch64::BI__readx18byte ||
2215 builtinID == AArch64::BI__readx18word ||
2216 builtinID == AArch64::BI__readx18dword ||
2217 builtinID == AArch64::BI__readx18qword) {
2218 cgm.errorNYI(
expr->getSourceRange(),
2219 std::string(
"unimplemented AArch64 builtin call: ") +
2220 getContext().BuiltinInfo.getName(builtinID));
2221 return mlir::Value{};
2224 if (builtinID == AArch64::BI__addx18byte ||
2225 builtinID == AArch64::BI__addx18word ||
2226 builtinID == AArch64::BI__addx18dword ||
2227 builtinID == AArch64::BI__addx18qword ||
2228 builtinID == AArch64::BI__incx18byte ||
2229 builtinID == AArch64::BI__incx18word ||
2230 builtinID == AArch64::BI__incx18dword ||
2231 builtinID == AArch64::BI__incx18qword) {
2232 cgm.errorNYI(
expr->getSourceRange(),
2233 std::string(
"unimplemented AArch64 builtin call: ") +
2234 getContext().BuiltinInfo.getName(builtinID));
2235 return mlir::Value{};
2238 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2239 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2240 builtinID == AArch64::BI_CopyInt32FromFloat ||
2241 builtinID == AArch64::BI_CopyInt64FromDouble) {
2242 cgm.errorNYI(
expr->getSourceRange(),
2243 std::string(
"unimplemented AArch64 builtin call: ") +
2244 getContext().BuiltinInfo.getName(builtinID));
2245 return mlir::Value{};
2248 if (builtinID == AArch64::BI_CountLeadingOnes ||
2249 builtinID == AArch64::BI_CountLeadingOnes64 ||
2250 builtinID == AArch64::BI_CountLeadingZeros ||
2251 builtinID == AArch64::BI_CountLeadingZeros64) {
2252 cgm.errorNYI(
expr->getSourceRange(),
2253 std::string(
"unimplemented AArch64 builtin call: ") +
2254 getContext().BuiltinInfo.getName(builtinID));
2255 return mlir::Value{};
2258 if (builtinID == AArch64::BI_CountLeadingSigns ||
2259 builtinID == AArch64::BI_CountLeadingSigns64) {
2260 cgm.errorNYI(
expr->getSourceRange(),
2261 std::string(
"unimplemented AArch64 builtin call: ") +
2262 getContext().BuiltinInfo.getName(builtinID));
2263 return mlir::Value{};
2266 if (builtinID == AArch64::BI_CountOneBits ||
2267 builtinID == AArch64::BI_CountOneBits64 ||
2268 builtinID == AArch64::BI_CountTrailingZeros ||
2269 builtinID == AArch64::BI_CountTrailingZeros64) {
2270 cgm.errorNYI(
expr->getSourceRange(),
2271 std::string(
"unimplemented AArch64 builtin call: ") +
2272 getContext().BuiltinInfo.getName(builtinID));
2273 return mlir::Value{};
2276 if (builtinID == AArch64::BI__prefetch ||
2277 builtinID == AArch64::BI__prefetch2) {
2278 cgm.errorNYI(
expr->getSourceRange(),
2279 std::string(
"unimplemented AArch64 builtin call: ") +
2280 getContext().BuiltinInfo.getName(builtinID));
2281 return mlir::Value{};
2284 if (builtinID == AArch64::BI__hlt) {
2285 cgm.errorNYI(
expr->getSourceRange(),
2286 std::string(
"unimplemented AArch64 builtin call: ") +
2287 getContext().BuiltinInfo.getName(builtinID));
2288 return mlir::Value{};
2291 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2292 cgm.errorNYI(
expr->getSourceRange(),
2293 std::string(
"unimplemented AArch64 builtin call: ") +
2294 getContext().BuiltinInfo.getName(builtinID));
2295 return mlir::Value{};
2304 return p.first == builtinID;
2307 builtinID = it->second;
2312 unsigned iceArguments = 0;
2321 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2322 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2324 switch (builtinID) {
2325 case NEON::BI__builtin_neon_vld1_v:
2326 case NEON::BI__builtin_neon_vld1q_v:
2327 case NEON::BI__builtin_neon_vld1_dup_v:
2328 case NEON::BI__builtin_neon_vld1q_dup_v:
2329 case NEON::BI__builtin_neon_vld1_lane_v:
2330 case NEON::BI__builtin_neon_vld1q_lane_v:
2331 case NEON::BI__builtin_neon_vst1_v:
2332 case NEON::BI__builtin_neon_vst1q_v:
2333 case NEON::BI__builtin_neon_vst1_lane_v:
2334 case NEON::BI__builtin_neon_vst1q_lane_v:
2335 case NEON::BI__builtin_neon_vldap1_lane_s64:
2336 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2337 case NEON::BI__builtin_neon_vstl1_lane_s64:
2338 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2342 expr->getSourceRange(),
2343 std::string(
"unimplemented AArch64 builtin argument handling ") +
2344 getContext().BuiltinInfo.getName(builtinID));
2363 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2367 if (std::optional<llvm::APSInt> result =
2371 bool usgn =
type.isUnsigned();
2373 mlir::Location loc =
getLoc(
expr->getExprLoc());
2387 switch (builtinID) {
2390 case NEON::BI__builtin_neon_vabsh_f16: {
2391 return cir::FAbsOp::create(builder, loc, ops);
2393 case NEON::BI__builtin_neon_vaddq_p128: {
2394 cir::VectorType byteTy = cir::VectorType::get(builder.getUInt8Ty(), 16);
2395 ops[0] = builder.createBitcast(ops[0], byteTy);
2396 ops[1] = builder.createBitcast(ops[1], byteTy);
2397 mlir::Value result = builder.createXor(loc, ops[0], ops[1]);
2400 case NEON::BI__builtin_neon_vldrq_p128:
2401 case NEON::BI__builtin_neon_vstrq_p128:
2402 case NEON::BI__builtin_neon_vcvts_f32_u32:
2403 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2404 case NEON::BI__builtin_neon_vcvts_f32_s32:
2405 case NEON::BI__builtin_neon_vcvtd_f64_s64:
2406 case NEON::BI__builtin_neon_vcvth_f16_u16:
2407 case NEON::BI__builtin_neon_vcvth_f16_u32:
2408 case NEON::BI__builtin_neon_vcvth_f16_u64:
2409 case NEON::BI__builtin_neon_vcvth_f16_s16:
2410 case NEON::BI__builtin_neon_vcvth_f16_s32:
2411 case NEON::BI__builtin_neon_vcvth_f16_s64:
2412 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2413 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2414 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2415 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2416 case NEON::BI__builtin_neon_vcvth_u16_f16:
2417 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2418 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2419 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2420 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2421 case NEON::BI__builtin_neon_vcvth_s16_f16:
2422 case NEON::BI__builtin_neon_vcaleh_f16:
2423 case NEON::BI__builtin_neon_vcalth_f16:
2424 case NEON::BI__builtin_neon_vcageh_f16:
2425 case NEON::BI__builtin_neon_vcagth_f16:
2426 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2427 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2428 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2429 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2430 case NEON::BI__builtin_neon_vpaddd_s64:
2431 case NEON::BI__builtin_neon_vpaddd_f64:
2432 case NEON::BI__builtin_neon_vpadds_f32:
2433 cgm.errorNYI(
expr->getSourceRange(),
2434 std::string(
"unimplemented AArch64 builtin call: ") +
2435 getContext().BuiltinInfo.getName(builtinID));
2436 return mlir::Value{};
2437 case NEON::BI__builtin_neon_vceqzd_s64:
2438 case NEON::BI__builtin_neon_vceqzd_f64:
2439 case NEON::BI__builtin_neon_vceqzs_f32:
2440 case NEON::BI__builtin_neon_vceqzh_f16:
2442 *
this, builder, loc, ops[0],
2444 case NEON::BI__builtin_neon_vcgezd_s64:
2445 case NEON::BI__builtin_neon_vcgezd_f64:
2446 case NEON::BI__builtin_neon_vcgezs_f32:
2447 case NEON::BI__builtin_neon_vcgezh_f16:
2448 case NEON::BI__builtin_neon_vclezd_s64:
2449 case NEON::BI__builtin_neon_vclezd_f64:
2450 case NEON::BI__builtin_neon_vclezs_f32:
2451 case NEON::BI__builtin_neon_vclezh_f16:
2452 case NEON::BI__builtin_neon_vcgtzd_s64:
2453 case NEON::BI__builtin_neon_vcgtzd_f64:
2454 case NEON::BI__builtin_neon_vcgtzs_f32:
2455 case NEON::BI__builtin_neon_vcgtzh_f16:
2456 case NEON::BI__builtin_neon_vcltzd_s64:
2457 case NEON::BI__builtin_neon_vcltzd_f64:
2458 case NEON::BI__builtin_neon_vcltzs_f32:
2459 case NEON::BI__builtin_neon_vcltzh_f16:
2460 case NEON::BI__builtin_neon_vceqzd_u64: {
2462 *
this, builder, loc, ops[0],
2465 case NEON::BI__builtin_neon_vceqd_f64:
2466 case NEON::BI__builtin_neon_vcled_f64:
2467 case NEON::BI__builtin_neon_vcltd_f64:
2468 case NEON::BI__builtin_neon_vcged_f64:
2469 case NEON::BI__builtin_neon_vcgtd_f64:
2470 case NEON::BI__builtin_neon_vceqs_f32:
2471 case NEON::BI__builtin_neon_vcles_f32:
2472 case NEON::BI__builtin_neon_vclts_f32:
2473 case NEON::BI__builtin_neon_vcges_f32:
2474 case NEON::BI__builtin_neon_vcgts_f32:
2475 case NEON::BI__builtin_neon_vceqh_f16:
2476 case NEON::BI__builtin_neon_vcleh_f16:
2477 case NEON::BI__builtin_neon_vclth_f16:
2478 case NEON::BI__builtin_neon_vcgeh_f16:
2479 case NEON::BI__builtin_neon_vcgth_f16:
2480 case NEON::BI__builtin_neon_vceqd_s64:
2481 case NEON::BI__builtin_neon_vceqd_u64:
2482 case NEON::BI__builtin_neon_vcgtd_s64:
2483 case NEON::BI__builtin_neon_vcgtd_u64:
2484 case NEON::BI__builtin_neon_vcltd_s64:
2485 case NEON::BI__builtin_neon_vcltd_u64:
2486 case NEON::BI__builtin_neon_vcged_u64:
2487 case NEON::BI__builtin_neon_vcged_s64:
2488 case NEON::BI__builtin_neon_vcled_u64:
2489 case NEON::BI__builtin_neon_vcled_s64:
2490 cgm.errorNYI(
expr->getSourceRange(),
2491 std::string(
"unimplemented AArch64 builtin call: ") +
2492 getContext().BuiltinInfo.getName(builtinID));
2493 return mlir::Value{};
2494 case NEON::BI__builtin_neon_vnegd_s64: {
2495 return builder.createNeg(loc, ops[0]);
2497 case NEON::BI__builtin_neon_vnegh_f16: {
2498 return builder.createFNeg(loc, ops[0]);
2500 case NEON::BI__builtin_neon_vtstd_s64:
2501 case NEON::BI__builtin_neon_vtstd_u64:
2502 case NEON::BI__builtin_neon_vset_lane_i8:
2503 case NEON::BI__builtin_neon_vset_lane_i16:
2504 case NEON::BI__builtin_neon_vset_lane_i32:
2505 case NEON::BI__builtin_neon_vset_lane_i64:
2506 case NEON::BI__builtin_neon_vset_lane_bf16:
2507 case NEON::BI__builtin_neon_vset_lane_f32:
2508 case NEON::BI__builtin_neon_vsetq_lane_i8:
2509 case NEON::BI__builtin_neon_vsetq_lane_i16:
2510 case NEON::BI__builtin_neon_vsetq_lane_i32:
2511 case NEON::BI__builtin_neon_vsetq_lane_i64:
2512 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2513 case NEON::BI__builtin_neon_vsetq_lane_f32:
2514 case NEON::BI__builtin_neon_vset_lane_f64:
2515 case NEON::BI__builtin_neon_vset_lane_mf8:
2516 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2517 case NEON::BI__builtin_neon_vsetq_lane_f64:
2518 cgm.errorNYI(
expr->getSourceRange(),
2519 std::string(
"unimplemented AArch64 builtin call: ") +
2520 getContext().BuiltinInfo.getName(builtinID));
2521 return mlir::Value{};
2523 case NEON::BI__builtin_neon_vget_lane_i8:
2524 case NEON::BI__builtin_neon_vdupb_lane_i8:
2525 case NEON::BI__builtin_neon_vgetq_lane_i8:
2526 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2527 case NEON::BI__builtin_neon_vget_lane_mf8:
2528 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2529 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2530 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2531 case NEON::BI__builtin_neon_vget_lane_i16:
2532 case NEON::BI__builtin_neon_vduph_lane_i16:
2533 case NEON::BI__builtin_neon_vgetq_lane_i16:
2534 case NEON::BI__builtin_neon_vduph_laneq_i16:
2535 case NEON::BI__builtin_neon_vget_lane_i32:
2536 case NEON::BI__builtin_neon_vdups_lane_i32:
2537 case NEON::BI__builtin_neon_vdups_lane_f32:
2538 case NEON::BI__builtin_neon_vgetq_lane_i32:
2539 case NEON::BI__builtin_neon_vdups_laneq_i32:
2540 case NEON::BI__builtin_neon_vget_lane_i64:
2541 case NEON::BI__builtin_neon_vdupd_lane_i64:
2542 case NEON::BI__builtin_neon_vdupd_lane_f64:
2543 case NEON::BI__builtin_neon_vgetq_lane_i64:
2544 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2545 case NEON::BI__builtin_neon_vget_lane_f32:
2546 case NEON::BI__builtin_neon_vget_lane_f64:
2547 case NEON::BI__builtin_neon_vgetq_lane_f32:
2548 case NEON::BI__builtin_neon_vdups_laneq_f32:
2549 case NEON::BI__builtin_neon_vgetq_lane_f64:
2550 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2551 return cir::VecExtractOp::create(builder, loc, ops[0],
2553 case NEON::BI__builtin_neon_vaddh_f16:
2554 return builder.createFAdd(loc, ops[0], ops[1]);
2555 case NEON::BI__builtin_neon_vsubh_f16:
2556 return builder.createFSub(loc, ops[0], ops[1]);
2557 case NEON::BI__builtin_neon_vmulh_f16:
2558 return builder.createFMul(loc, ops[0], ops[1]);
2559 case NEON::BI__builtin_neon_vdivh_f16:
2560 return builder.createFDiv(loc, ops[0], ops[1]);
2561 case NEON::BI__builtin_neon_vfmah_f16:
2563 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2567 case NEON::BI__builtin_neon_vfmsh_f16:
2569 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2570 ops[0] = builder.createFNeg(loc, ops[0]);
2573 case NEON::BI__builtin_neon_vaddd_s64:
2574 case NEON::BI__builtin_neon_vaddd_u64:
2575 return builder.createAdd(loc, ops[0], ops[1]);
2576 case NEON::BI__builtin_neon_vsubd_s64:
2577 case NEON::BI__builtin_neon_vsubd_u64:
2578 return builder.createSub(loc, ops[0], ops[1]);
2579 case NEON::BI__builtin_neon_vqdmlalh_s16:
2580 case NEON::BI__builtin_neon_vqdmlslh_s16:
2581 cgm.errorNYI(
expr->getSourceRange(),
2582 std::string(
"unimplemented AArch64 builtin call: ") +
2583 getContext().BuiltinInfo.getName(builtinID));
2584 return mlir::Value{};
2585 case NEON::BI__builtin_neon_vqshlud_n_s64: {
2586 cir::IntType int64Type = builder.getSInt64Ty();
2592 case NEON::BI__builtin_neon_vqshld_n_u64:
2593 case NEON::BI__builtin_neon_vqshld_n_s64: {
2594 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2595 ? builder.getUInt64Ty()
2596 : builder.getSInt64Ty();
2597 llvm::StringRef intrinsicName =
2598 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
2599 :
"aarch64.neon.sqshl";
2604 case NEON::BI__builtin_neon_vrshrd_n_u64:
2605 case NEON::BI__builtin_neon_vrshrd_n_s64: {
2606 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
2607 ?
"aarch64.neon.srshl"
2608 :
"aarch64.neon.urshl";
2609 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2610 ? builder.getUInt64Ty()
2611 : builder.getSInt64Ty();
2615 ops[1] = builder.getSInt64(sv, loc);
2616 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
2617 intrName, int64Ty, loc);
2619 case NEON::BI__builtin_neon_vrsrad_n_u64:
2620 case NEON::BI__builtin_neon_vrsrad_n_s64: {
2621 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2622 ? builder.getUInt64Ty()
2623 : builder.getSInt64Ty();
2624 ops[2] = builder.createNeg(loc, ops[2]);
2625 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2626 ?
"aarch64.neon.urshl"
2627 :
"aarch64.neon.srshl";
2630 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
2631 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
2632 return builder.createAdd(loc, ops[0],
2633 builder.createBitcast(ops[1], int64Type));
2635 case NEON::BI__builtin_neon_vshld_n_s64:
2636 case NEON::BI__builtin_neon_vshld_n_u64: {
2638 std::optional<llvm::APSInt> amt =
2640 assert(amt &&
"Expected argument to be a constant");
2641 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
2643 case NEON::BI__builtin_neon_vshrd_n_s64: {
2644 std::optional<llvm::APSInt> amt =
2646 assert(amt &&
"Expected argument to be a constant");
2647 return builder.createShiftRight(
2648 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
2650 case NEON::BI__builtin_neon_vshrd_n_u64: {
2651 std::optional<llvm::APSInt> amt =
2653 assert(amt &&
"Expected argument to be a constant");
2654 uint64_t shiftAmt = amt->getZExtValue();
2657 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
2658 return builder.createShiftRight(loc, ops[0], shiftAmt);
2660 case NEON::BI__builtin_neon_vsrad_n_s64: {
2661 std::optional<llvm::APSInt> amt =
2663 assert(amt &&
"Expected argument to be a constant");
2665 std::min(
static_cast<uint64_t
>(63), amt->getZExtValue());
2666 mlir::Value shifted =
2667 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2668 return builder.createAdd(loc, ops[0], shifted);
2670 case NEON::BI__builtin_neon_vsrad_n_u64: {
2671 std::optional<llvm::APSInt> amt =
2673 assert(amt &&
"Expected argument to be a constant");
2674 uint64_t shiftAmt = amt->getZExtValue();
2678 mlir::Value shifted =
2679 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2680 return builder.createAdd(loc, ops[0], shifted);
2682 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
2683 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
2684 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
2685 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
2686 case NEON::BI__builtin_neon_vqdmlals_s32:
2687 case NEON::BI__builtin_neon_vqdmlsls_s32:
2688 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
2689 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
2690 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
2691 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
2692 cgm.errorNYI(
expr->getSourceRange(),
2693 std::string(
"unimplemented AArch64 builtin call: ") +
2694 getContext().BuiltinInfo.getName(builtinID));
2695 return mlir::Value{};
2697 case NEON::BI__builtin_neon_vget_lane_bf16:
2698 case NEON::BI__builtin_neon_vduph_lane_bf16:
2699 case NEON::BI__builtin_neon_vduph_lane_f16:
2700 case NEON::BI__builtin_neon_vgetq_lane_bf16:
2701 case NEON::BI__builtin_neon_vduph_laneq_bf16:
2702 case NEON::BI__builtin_neon_vduph_laneq_f16: {
2703 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
2705 case NEON::BI__builtin_neon_vcvt_bf16_f32:
2706 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
2707 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
2708 case NEON::BI__builtin_neon_vcvt_f16_f32:
2709 case NEON::BI__builtin_neon_vcvt_f32_f16:
2710 case clang::AArch64::BI_InterlockedAdd:
2711 case clang::AArch64::BI_InterlockedAdd_acq:
2712 case clang::AArch64::BI_InterlockedAdd_rel:
2713 case clang::AArch64::BI_InterlockedAdd_nf:
2714 case clang::AArch64::BI_InterlockedAdd64:
2715 case clang::AArch64::BI_InterlockedAdd64_acq:
2716 case clang::AArch64::BI_InterlockedAdd64_rel:
2717 case clang::AArch64::BI_InterlockedAdd64_nf:
2718 cgm.errorNYI(
expr->getSourceRange(),
2719 std::string(
"unimplemented AArch64 builtin call: ") +
2720 getContext().BuiltinInfo.getName(builtinID));
2721 return mlir::Value{};
2728 llvm::StringRef intrName;
2730 switch (builtinID) {
2732 return std::nullopt;
2733 case NEON::BI__builtin_neon_vbsl_v:
2734 case NEON::BI__builtin_neon_vbslq_v: {
2737 ops[0] = builder.createBitcast(ops[0], bitTy);
2738 ops[1] = builder.createBitcast(ops[1], bitTy);
2739 ops[2] = builder.createBitcast(ops[2], bitTy);
2741 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
2742 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
2743 ops[0] = builder.createOr(loc, ops[1], ops[2]);
2744 return builder.createBitcast(ops[0], ty);
2746 case NEON::BI__builtin_neon_vfma_lane_v:
2747 cgm.errorNYI(
expr->getSourceRange(),
2748 std::string(
"unimplemented AArch64 builtin call: ") +
2749 getContext().BuiltinInfo.getName(builtinID));
2750 return mlir::Value{};
2751 case NEON::BI__builtin_neon_vfmaq_lane_v: {
2752 mlir::Value addend = builder.createBitcast(ops[0], ty);
2753 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2756 cir::VectorType sourceTy =
2757 cir::VectorType::get(ty.getElementType(), ty.getSize() / 2);
2758 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2759 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2764 case NEON::BI__builtin_neon_vfma_laneq_v: {
2766 if (ty.getElementType() ==
cgm.doubleTy) {
2767 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
2768 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
2771 cir::VectorType sourceTy = cir::VectorType::get(
cgm.doubleTy, 2);
2772 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2773 laneSource = builder.createExtractElement(
2779 return builder.createBitcast(
2785 mlir::Value addend = builder.createBitcast(ops[0], ty);
2786 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2789 cir::VectorType sourceTy =
2790 cir::VectorType::get(ty.getElementType(), ty.getSize() * 2);
2791 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
2792 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2797 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
2798 mlir::Value addend = builder.createBitcast(ops[0], ty);
2799 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
2800 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
2801 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
2806 case NEON::BI__builtin_neon_vfmah_lane_f16:
2807 case NEON::BI__builtin_neon_vfmas_lane_f32:
2808 case NEON::BI__builtin_neon_vfmah_laneq_f16:
2809 case NEON::BI__builtin_neon_vfmas_laneq_f32:
2810 case NEON::BI__builtin_neon_vfmad_lane_f64:
2811 cgm.errorNYI(
expr->getSourceRange(),
2812 std::string(
"unimplemented AArch64 builtin call: ") +
2813 getContext().BuiltinInfo.getName(builtinID));
2814 return mlir::Value{};
2815 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
2818 mlir::Value laneSource = builder.createExtractElement(
2825 case NEON::BI__builtin_neon_vmull_v: {
2826 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
2828 intrName =
"aarch64.neon.pmull";
2829 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2831 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
2833 case NEON::BI__builtin_neon_vmax_v:
2834 case NEON::BI__builtin_neon_vmaxq_v:
2835 intrName = usgn ?
"aarch64.neon.umax" :
"aarch64.neon.smax";
2836 if (cir::isFPOrVectorOfFPType(ty))
2837 intrName =
"aarch64.neon.fmax";
2839 case NEON::BI__builtin_neon_vmaxh_f16:
2840 cgm.errorNYI(
expr->getSourceRange(),
2841 std::string(
"unimplemented AArch64 builtin call: ") +
2842 getContext().BuiltinInfo.getName(builtinID));
2843 return mlir::Value{};
2844 case NEON::BI__builtin_neon_vmin_v:
2845 case NEON::BI__builtin_neon_vminq_v:
2846 intrName = usgn ?
"aarch64.neon.umin" :
"aarch64.neon.smin";
2847 if (cir::isFPOrVectorOfFPType(ty))
2848 intrName =
"aarch64.neon.fmin";
2850 case NEON::BI__builtin_neon_vminh_f16:
2851 cgm.errorNYI(
expr->getSourceRange(),
2852 std::string(
"unimplemented AArch64 builtin call: ") +
2853 getContext().BuiltinInfo.getName(builtinID));
2854 return mlir::Value{};
2855 case NEON::BI__builtin_neon_vabd_v:
2856 case NEON::BI__builtin_neon_vabdq_v:
2857 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
2858 if (cir::isFPOrVectorOfFPType(ty))
2859 intrName =
"aarch64.neon.fabd";
2861 case NEON::BI__builtin_neon_vpadal_v:
2862 case NEON::BI__builtin_neon_vpadalq_v: {
2863 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
2865 mlir::Value pairwiseSum =
2867 inputs, intrName, ty, loc);
2868 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
2869 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
2871 case NEON::BI__builtin_neon_vpmin_v:
2872 case NEON::BI__builtin_neon_vpminq_v:
2873 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
2874 if (cir::isFPOrVectorOfFPType(ty))
2875 intrName =
"aarch64.neon.fminp";
2877 case NEON::BI__builtin_neon_vpmax_v:
2878 case NEON::BI__builtin_neon_vpmaxq_v:
2879 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
2880 if (cir::isFPOrVectorOfFPType(ty))
2881 intrName =
"aarch64.neon.fmaxp";
2883 case NEON::BI__builtin_neon_vminnm_v:
2884 case NEON::BI__builtin_neon_vminnmq_v:
2885 intrName =
"aarch64.neon.fminnm";
2887 case NEON::BI__builtin_neon_vminnmh_f16:
2888 cgm.errorNYI(
expr->getSourceRange(),
2889 std::string(
"unimplemented AArch64 builtin call: ") +
2890 getContext().BuiltinInfo.getName(builtinID));
2891 return mlir::Value{};
2892 case NEON::BI__builtin_neon_vmaxnm_v:
2893 case NEON::BI__builtin_neon_vmaxnmq_v:
2894 intrName =
"aarch64.neon.fmaxnm";
2896 case NEON::BI__builtin_neon_vmaxnmh_f16:
2897 case NEON::BI__builtin_neon_vrecpss_f32:
2898 case NEON::BI__builtin_neon_vrecpsd_f64:
2899 case NEON::BI__builtin_neon_vrecpsh_f16:
2900 case NEON::BI__builtin_neon_vqshrun_n_v:
2901 cgm.errorNYI(
expr->getSourceRange(),
2902 std::string(
"unimplemented AArch64 builtin call: ") +
2903 getContext().BuiltinInfo.getName(builtinID));
2904 return mlir::Value{};
2905 case NEON::BI__builtin_neon_vqrshrun_n_v: {
2906 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2909 "aarch64.neon.sqrshrun", ty, loc);
2911 case NEON::BI__builtin_neon_vqshrn_n_v:
2912 cgm.errorNYI(
expr->getSourceRange(),
2913 std::string(
"unimplemented AArch64 builtin call: ") +
2914 getContext().BuiltinInfo.getName(builtinID));
2915 return mlir::Value{};
2916 case NEON::BI__builtin_neon_vrshrn_n_v:
2917 cgm.errorNYI(
expr->getSourceRange(),
2918 std::string(
"unimplemented AArch64 builtin call: ") +
2919 getContext().BuiltinInfo.getName(builtinID));
2920 return mlir::Value{};
2921 case NEON::BI__builtin_neon_vqrshrn_n_v: {
2922 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2924 llvm::StringRef intrName =
2925 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
2929 case NEON::BI__builtin_neon_vrndah_f16:
2930 case NEON::BI__builtin_neon_vrnda_v:
2931 case NEON::BI__builtin_neon_vrndaq_v:
2932 case NEON::BI__builtin_neon_vrndih_f16:
2933 case NEON::BI__builtin_neon_vrndmh_f16:
2934 case NEON::BI__builtin_neon_vrndm_v:
2935 case NEON::BI__builtin_neon_vrndmq_v:
2936 case NEON::BI__builtin_neon_vrndnh_f16:
2937 case NEON::BI__builtin_neon_vrndn_v:
2938 case NEON::BI__builtin_neon_vrndnq_v:
2939 case NEON::BI__builtin_neon_vrndns_f32:
2940 case NEON::BI__builtin_neon_vrndph_f16:
2941 case NEON::BI__builtin_neon_vrndp_v:
2942 case NEON::BI__builtin_neon_vrndpq_v:
2943 case NEON::BI__builtin_neon_vrndxh_f16:
2944 case NEON::BI__builtin_neon_vrndx_v:
2945 case NEON::BI__builtin_neon_vrndxq_v:
2946 case NEON::BI__builtin_neon_vrndh_f16:
2947 case NEON::BI__builtin_neon_vrnd32x_f32:
2948 case NEON::BI__builtin_neon_vrnd32xq_f32:
2949 case NEON::BI__builtin_neon_vrnd32x_f64:
2950 case NEON::BI__builtin_neon_vrnd32xq_f64:
2951 case NEON::BI__builtin_neon_vrnd32z_f32:
2952 case NEON::BI__builtin_neon_vrnd32zq_f32:
2953 case NEON::BI__builtin_neon_vrnd32z_f64:
2954 case NEON::BI__builtin_neon_vrnd32zq_f64:
2955 case NEON::BI__builtin_neon_vrnd64x_f32:
2956 case NEON::BI__builtin_neon_vrnd64xq_f32:
2957 case NEON::BI__builtin_neon_vrnd64x_f64:
2958 case NEON::BI__builtin_neon_vrnd64xq_f64:
2959 case NEON::BI__builtin_neon_vrnd64z_f32:
2960 case NEON::BI__builtin_neon_vrnd64zq_f32:
2961 case NEON::BI__builtin_neon_vrnd64z_f64:
2962 case NEON::BI__builtin_neon_vrnd64zq_f64:
2963 case NEON::BI__builtin_neon_vrnd_v:
2964 case NEON::BI__builtin_neon_vrndq_v:
2965 cgm.errorNYI(
expr->getSourceRange(),
2966 std::string(
"unimplemented AArch64 builtin call: ") +
2967 getContext().BuiltinInfo.getName(builtinID));
2968 return mlir::Value{};
2969 case NEON::BI__builtin_neon_vcvt_f64_v:
2970 case NEON::BI__builtin_neon_vcvtq_f64_v:
2971 ops[0] = builder.createBitcast(ops[0], ty);
2974 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
2975 case NEON::BI__builtin_neon_vcvt_f64_f32:
2976 case NEON::BI__builtin_neon_vcvt_f32_f64:
2977 case NEON::BI__builtin_neon_vcvt_s32_v:
2978 case NEON::BI__builtin_neon_vcvt_u32_v:
2979 case NEON::BI__builtin_neon_vcvt_s64_v:
2980 case NEON::BI__builtin_neon_vcvt_u64_v:
2981 case NEON::BI__builtin_neon_vcvt_s16_f16:
2982 case NEON::BI__builtin_neon_vcvt_u16_f16:
2983 case NEON::BI__builtin_neon_vcvtq_s32_v:
2984 case NEON::BI__builtin_neon_vcvtq_u32_v:
2985 case NEON::BI__builtin_neon_vcvtq_s64_v:
2986 case NEON::BI__builtin_neon_vcvtq_u64_v:
2987 case NEON::BI__builtin_neon_vcvtq_s16_f16:
2988 case NEON::BI__builtin_neon_vcvtq_u16_f16:
2989 case NEON::BI__builtin_neon_vcvta_s16_f16:
2990 case NEON::BI__builtin_neon_vcvta_u16_f16:
2991 case NEON::BI__builtin_neon_vcvta_s32_v:
2992 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
2993 case NEON::BI__builtin_neon_vcvtaq_s32_v:
2994 case NEON::BI__builtin_neon_vcvta_u32_v:
2995 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
2996 case NEON::BI__builtin_neon_vcvtaq_u32_v:
2997 case NEON::BI__builtin_neon_vcvta_s64_v:
2998 case NEON::BI__builtin_neon_vcvtaq_s64_v:
2999 case NEON::BI__builtin_neon_vcvta_u64_v:
3000 case NEON::BI__builtin_neon_vcvtaq_u64_v:
3001 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3002 case NEON::BI__builtin_neon_vcvtm_s32_v:
3003 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3004 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3005 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3006 case NEON::BI__builtin_neon_vcvtm_u32_v:
3007 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3008 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3009 case NEON::BI__builtin_neon_vcvtm_s64_v:
3010 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3011 case NEON::BI__builtin_neon_vcvtm_u64_v:
3012 case NEON::BI__builtin_neon_vcvtmq_u64_v:
3013 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3014 case NEON::BI__builtin_neon_vcvtn_s32_v:
3015 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3016 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3017 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3018 case NEON::BI__builtin_neon_vcvtn_u32_v:
3019 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3020 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3021 case NEON::BI__builtin_neon_vcvtn_s64_v:
3022 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3023 case NEON::BI__builtin_neon_vcvtn_u64_v:
3024 case NEON::BI__builtin_neon_vcvtnq_u64_v:
3025 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3026 case NEON::BI__builtin_neon_vcvtp_s32_v:
3027 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3028 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3029 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3030 case NEON::BI__builtin_neon_vcvtp_u32_v:
3031 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3032 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3033 case NEON::BI__builtin_neon_vcvtp_s64_v:
3034 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3035 case NEON::BI__builtin_neon_vcvtp_u64_v:
3036 case NEON::BI__builtin_neon_vcvtpq_u64_v:
3037 case NEON::BI__builtin_neon_vmulx_v:
3038 case NEON::BI__builtin_neon_vmulxq_v:
3039 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3040 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3041 case NEON::BI__builtin_neon_vmul_lane_v:
3042 case NEON::BI__builtin_neon_vmul_laneq_v:
3043 case NEON::BI__builtin_neon_vpmaxnm_v:
3044 case NEON::BI__builtin_neon_vpmaxnmq_v:
3045 cgm.errorNYI(
expr->getSourceRange(),
3046 std::string(
"unimplemented AArch64 builtin call: ") +
3047 getContext().BuiltinInfo.getName(builtinID));
3048 return mlir::Value{};
3049 case NEON::BI__builtin_neon_vpminnm_v:
3050 case NEON::BI__builtin_neon_vpminnmq_v:
3051 intrName =
"aarch64.neon.fminnmp";
3053 case NEON::BI__builtin_neon_vsqrth_f16:
3054 cgm.errorNYI(
expr->getSourceRange(),
3055 std::string(
"unimplemented AArch64 builtin call: ") +
3056 getContext().BuiltinInfo.getName(builtinID));
3057 return mlir::Value{};
3058 case NEON::BI__builtin_neon_vsqrt_v:
3059 case NEON::BI__builtin_neon_vsqrtq_v:
3062 case NEON::BI__builtin_neon_vrbit_v:
3063 case NEON::BI__builtin_neon_vrbitq_v:
3064 case NEON::BI__builtin_neon_vmaxv_f16:
3065 case NEON::BI__builtin_neon_vmaxvq_f16:
3066 case NEON::BI__builtin_neon_vminv_f16:
3067 case NEON::BI__builtin_neon_vminvq_f16:
3068 case NEON::BI__builtin_neon_vmaxnmv_f16:
3069 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3070 case NEON::BI__builtin_neon_vminnmv_f16:
3071 case NEON::BI__builtin_neon_vminnmvq_f16:
3072 case NEON::BI__builtin_neon_vmul_n_f64:
3073 cgm.errorNYI(
expr->getSourceRange(),
3074 std::string(
"unimplemented AArch64 builtin call: ") +
3075 getContext().BuiltinInfo.getName(builtinID));
3076 return mlir::Value{};
3077 case NEON::BI__builtin_neon_vaddlv_u8:
3078 case NEON::BI__builtin_neon_vaddlvq_u8:
3079 case NEON::BI__builtin_neon_vaddlv_u16:
3080 case NEON::BI__builtin_neon_vaddlvq_u16:
3081 case NEON::BI__builtin_neon_vaddlv_s8:
3082 case NEON::BI__builtin_neon_vaddlvq_s8:
3083 case NEON::BI__builtin_neon_vaddlv_s16:
3084 case NEON::BI__builtin_neon_vaddlvq_s16: {
3087 auto eltTy = mlir::cast<cir::IntType>(
3088 mlir::cast<cir::VectorType>(argTy).getElementType());
3093 bool needsTrunc = eltTy.getWidth() == 8;
3094 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3095 mlir::Type intrRetTy = userRetTy;
3097 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3098 mlir::Value result =
3101 result = builder.createIntCast(result, userRetTy);
3104 case NEON::BI__builtin_neon_vsri_n_v:
3105 case NEON::BI__builtin_neon_vsriq_n_v: {
3107 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3108 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3109 "aarch64.neon.vsri", ty, loc);
3111 case NEON::BI__builtin_neon_vsli_n_v:
3112 case NEON::BI__builtin_neon_vsliq_n_v: {
3114 intrName =
"aarch64.neon.vsli";
3122 case NEON::BI__builtin_neon_vsra_n_v:
3123 case NEON::BI__builtin_neon_vsraq_n_v: {
3124 ops[0] = builder.createBitcast(ops[0], ty);
3126 return builder.createAdd(loc, ops[0], ops[1]);
3128 case NEON::BI__builtin_neon_vrsra_n_v:
3129 case NEON::BI__builtin_neon_vrsraq_n_v: {
3130 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3133 cir::VectorType shiftAmtVecTy =
3136 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3140 ops[0] = builder.createBitcast(ops[0], ty);
3141 return builder.createAdd(loc, ops[0], tmp);
3143 case NEON::BI__builtin_neon_vld1_v:
3144 case NEON::BI__builtin_neon_vld1q_v:
3145 case NEON::BI__builtin_neon_vst1_v:
3146 case NEON::BI__builtin_neon_vst1q_v:
3147 case NEON::BI__builtin_neon_vld1_lane_v:
3148 case NEON::BI__builtin_neon_vld1q_lane_v:
3149 case NEON::BI__builtin_neon_vldap1_lane_s64:
3150 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3151 case NEON::BI__builtin_neon_vld1_dup_v:
3152 case NEON::BI__builtin_neon_vld1q_dup_v:
3153 case NEON::BI__builtin_neon_vst1_lane_v:
3154 case NEON::BI__builtin_neon_vst1q_lane_v:
3155 case NEON::BI__builtin_neon_vstl1_lane_s64:
3156 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3157 case NEON::BI__builtin_neon_vld2_v:
3158 case NEON::BI__builtin_neon_vld2q_v:
3159 case NEON::BI__builtin_neon_vld3_v:
3160 case NEON::BI__builtin_neon_vld3q_v:
3161 case NEON::BI__builtin_neon_vld4_v:
3162 case NEON::BI__builtin_neon_vld4q_v:
3163 case NEON::BI__builtin_neon_vld2_dup_v:
3164 case NEON::BI__builtin_neon_vld2q_dup_v:
3165 case NEON::BI__builtin_neon_vld3_dup_v:
3166 case NEON::BI__builtin_neon_vld3q_dup_v:
3167 case NEON::BI__builtin_neon_vld4_dup_v:
3168 case NEON::BI__builtin_neon_vld4q_dup_v:
3169 case NEON::BI__builtin_neon_vld2_lane_v:
3170 case NEON::BI__builtin_neon_vld2q_lane_v:
3171 case NEON::BI__builtin_neon_vld3_lane_v:
3172 case NEON::BI__builtin_neon_vld3q_lane_v:
3173 case NEON::BI__builtin_neon_vld4_lane_v:
3174 case NEON::BI__builtin_neon_vld4q_lane_v:
3175 case NEON::BI__builtin_neon_vst2_v:
3176 case NEON::BI__builtin_neon_vst2q_v:
3177 case NEON::BI__builtin_neon_vst2_lane_v:
3178 case NEON::BI__builtin_neon_vst2q_lane_v:
3179 case NEON::BI__builtin_neon_vst3_v:
3180 case NEON::BI__builtin_neon_vst3q_v:
3181 case NEON::BI__builtin_neon_vst3_lane_v:
3182 case NEON::BI__builtin_neon_vst3q_lane_v:
3183 case NEON::BI__builtin_neon_vst4_v:
3184 case NEON::BI__builtin_neon_vst4q_v:
3185 case NEON::BI__builtin_neon_vst4_lane_v:
3186 case NEON::BI__builtin_neon_vst4q_lane_v:
3187 cgm.errorNYI(
expr->getSourceRange(),
3188 std::string(
"unimplemented AArch64 builtin call: ") +
3189 getContext().BuiltinInfo.getName(builtinID));
3190 return mlir::Value{};
3191 case NEON::BI__builtin_neon_vtrn_v:
3192 case NEON::BI__builtin_neon_vtrnq_v: {
3193 ops[1] = builder.createBitcast(ops[1], ty);
3194 ops[2] = builder.createBitcast(ops[2], ty);
3196 mlir::Value baseAddr =
3197 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3200 for (
unsigned vi = 0; vi != 2; ++vi) {
3202 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3203 indices.push_back(i + vi);
3204 indices.push_back(i + e + vi);
3206 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3207 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3208 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3209 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3213 case NEON::BI__builtin_neon_vuzp_v:
3214 case NEON::BI__builtin_neon_vuzpq_v: {
3215 ops[1] = builder.createBitcast(ops[1], ty);
3216 ops[2] = builder.createBitcast(ops[2], ty);
3218 mlir::Value baseAddr =
3219 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3221 for (
unsigned vi = 0; vi != 2; ++vi) {
3223 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3224 indices.push_back(2 * i + vi);
3226 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3227 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3228 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3229 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3233 case NEON::BI__builtin_neon_vzip_v:
3234 case NEON::BI__builtin_neon_vzipq_v: {
3235 ops[1] = builder.createBitcast(ops[1], ty);
3236 ops[2] = builder.createBitcast(ops[2], ty);
3238 mlir::Value baseAddr =
3239 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3241 for (
unsigned vi = 0; vi != 2; ++vi) {
3243 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3244 indices.push_back((i + vi * e) >> 1);
3245 indices.push_back(((i + vi * e) >> 1) + e);
3247 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3248 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3249 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3250 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3254 case NEON::BI__builtin_neon_vqtbl1q_v:
3255 case NEON::BI__builtin_neon_vqtbl2q_v:
3256 case NEON::BI__builtin_neon_vqtbl3q_v:
3257 case NEON::BI__builtin_neon_vqtbl4q_v:
3258 case NEON::BI__builtin_neon_vqtbx1q_v:
3259 case NEON::BI__builtin_neon_vqtbx2q_v:
3260 case NEON::BI__builtin_neon_vqtbx3q_v:
3261 case NEON::BI__builtin_neon_vqtbx4q_v:
3262 case NEON::BI__builtin_neon_vsqadd_v:
3263 case NEON::BI__builtin_neon_vsqaddq_v:
3264 case NEON::BI__builtin_neon_vuqadd_v:
3265 case NEON::BI__builtin_neon_vuqaddq_v:
3266 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3267 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3268 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3269 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3270 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3271 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3272 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3273 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3274 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3275 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3276 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3277 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3278 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3279 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3280 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3281 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3282 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3283 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3284 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3285 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3286 case NEON::BI__builtin_neon_vluti2_lane_f16:
3287 case NEON::BI__builtin_neon_vluti2_lane_p16:
3288 case NEON::BI__builtin_neon_vluti2_lane_p8:
3289 case NEON::BI__builtin_neon_vluti2_lane_s16:
3290 case NEON::BI__builtin_neon_vluti2_lane_s8:
3291 case NEON::BI__builtin_neon_vluti2_lane_u16:
3292 case NEON::BI__builtin_neon_vluti2_lane_u8:
3293 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3294 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3295 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3296 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3297 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3298 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3299 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3300 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3301 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3302 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3303 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3304 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3305 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3306 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3307 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3308 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3309 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3310 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3311 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3312 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3313 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3314 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3315 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3316 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3317 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3318 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3319 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3320 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3321 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3322 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3323 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3324 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3325 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3326 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3327 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3328 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3329 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3330 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3331 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3332 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3333 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3334 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3335 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3336 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3337 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3338 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3339 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3340 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3341 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3342 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3343 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3344 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
3345 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
3346 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
3347 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
3348 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
3349 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
3350 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
3351 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
3352 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
3353 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
3354 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
3355 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
3356 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
3357 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
3358 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
3359 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
3360 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
3361 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
3362 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
3363 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
3364 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
3365 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
3366 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
3367 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
3368 case NEON::BI__builtin_neon_vamin_f16:
3369 case NEON::BI__builtin_neon_vaminq_f16:
3370 case NEON::BI__builtin_neon_vamin_f32:
3371 case NEON::BI__builtin_neon_vaminq_f32:
3372 case NEON::BI__builtin_neon_vaminq_f64:
3373 case NEON::BI__builtin_neon_vamax_f16:
3374 case NEON::BI__builtin_neon_vamaxq_f16:
3375 case NEON::BI__builtin_neon_vamax_f32:
3376 case NEON::BI__builtin_neon_vamaxq_f32:
3377 case NEON::BI__builtin_neon_vamaxq_f64:
3378 case NEON::BI__builtin_neon_vscale_f16:
3379 case NEON::BI__builtin_neon_vscaleq_f16:
3380 case NEON::BI__builtin_neon_vscale_f32:
3381 case NEON::BI__builtin_neon_vscaleq_f32:
3382 case NEON::BI__builtin_neon_vscaleq_f64:
3383 cgm.errorNYI(
expr->getSourceRange(),
3384 std::string(
"unimplemented AArch64 builtin call: ") +
3385 getContext().BuiltinInfo.getName(builtinID));
3386 return mlir::Value{};