617 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
619 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
626 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
643 cir::VectorType vTy =
getNeonType(&cgf, neonType, loc, hasLegalHalfType,
644 false, allowBFloatArgsAndRet);
645 cir::VectorType ty = vTy;
650 case NEON::BI__builtin_neon_splat_lane_v:
651 case NEON::BI__builtin_neon_splat_laneq_v:
652 case NEON::BI__builtin_neon_splatq_lane_v:
653 case NEON::BI__builtin_neon_splatq_laneq_v: {
654 uint64_t numElements = vTy.getSize();
655 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
657 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
662 case NEON::BI__builtin_neon_vpadd_v:
663 case NEON::BI__builtin_neon_vpaddq_v:
664 case NEON::BI__builtin_neon_vabs_v:
665 case NEON::BI__builtin_neon_vabsq_v:
666 case NEON::BI__builtin_neon_vadd_v:
667 case NEON::BI__builtin_neon_vaddq_v:
668 case NEON::BI__builtin_neon_vaddhn_v:
669 case NEON::BI__builtin_neon_vcale_v:
670 case NEON::BI__builtin_neon_vcaleq_v:
671 case NEON::BI__builtin_neon_vcalt_v:
672 case NEON::BI__builtin_neon_vcaltq_v:
673 case NEON::BI__builtin_neon_vcage_v:
674 case NEON::BI__builtin_neon_vcageq_v:
675 case NEON::BI__builtin_neon_vcagt_v:
676 case NEON::BI__builtin_neon_vcagtq_v:
678 std::string(
"unimplemented AArch64 builtin call: ") +
680 return mlir::Value{};
681 case NEON::BI__builtin_neon_vceqz_v:
682 case NEON::BI__builtin_neon_vceqzq_v:
684 vTy, cir::CmpOpKind::eq);
685 case NEON::BI__builtin_neon_vcgez_v:
686 case NEON::BI__builtin_neon_vcgezq_v:
687 case NEON::BI__builtin_neon_vclez_v:
688 case NEON::BI__builtin_neon_vclezq_v:
689 case NEON::BI__builtin_neon_vcgtz_v:
690 case NEON::BI__builtin_neon_vcgtzq_v:
691 case NEON::BI__builtin_neon_vcltz_v:
692 case NEON::BI__builtin_neon_vcltzq_v:
693 case NEON::BI__builtin_neon_vclz_v:
694 case NEON::BI__builtin_neon_vclzq_v:
695 case NEON::BI__builtin_neon_vcvt_f32_v:
696 case NEON::BI__builtin_neon_vcvtq_f32_v:
697 case NEON::BI__builtin_neon_vcvt_f16_s16:
698 case NEON::BI__builtin_neon_vcvt_f16_u16:
699 case NEON::BI__builtin_neon_vcvtq_f16_s16:
700 case NEON::BI__builtin_neon_vcvtq_f16_u16:
701 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
702 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
703 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
704 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
706 std::string(
"unimplemented AArch64 builtin call: ") +
708 return mlir::Value{};
709 case NEON::BI__builtin_neon_vcvt_n_f32_v:
710 case NEON::BI__builtin_neon_vcvt_n_f64_v:
711 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
712 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
715 llvm::StringRef llvmIntrName =
717 usgn ? llvmIntrinsic : altLLVMIntrinsic));
719 {vTy, cstIntTy}, ops, llvmIntrName,
722 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
723 case NEON::BI__builtin_neon_vcvt_n_s32_v:
724 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
725 case NEON::BI__builtin_neon_vcvt_n_u32_v:
726 case NEON::BI__builtin_neon_vcvt_n_s64_v:
727 case NEON::BI__builtin_neon_vcvt_n_u64_v:
728 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
729 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
730 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
731 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
732 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
733 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
737 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
740 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
744 case NEON::BI__builtin_neon_vcvt_s32_v:
745 case NEON::BI__builtin_neon_vcvt_u32_v:
746 case NEON::BI__builtin_neon_vcvt_s64_v:
747 case NEON::BI__builtin_neon_vcvt_u64_v:
748 case NEON::BI__builtin_neon_vcvt_s16_f16:
749 case NEON::BI__builtin_neon_vcvt_u16_f16:
750 case NEON::BI__builtin_neon_vcvtq_s32_v:
751 case NEON::BI__builtin_neon_vcvtq_u32_v:
752 case NEON::BI__builtin_neon_vcvtq_s64_v:
753 case NEON::BI__builtin_neon_vcvtq_u64_v:
754 case NEON::BI__builtin_neon_vcvtq_s16_f16:
755 case NEON::BI__builtin_neon_vcvtq_u16_f16:
756 case NEON::BI__builtin_neon_vcvta_s16_f16:
757 case NEON::BI__builtin_neon_vcvta_s32_v:
758 case NEON::BI__builtin_neon_vcvta_s64_v:
759 case NEON::BI__builtin_neon_vcvta_u16_f16:
760 case NEON::BI__builtin_neon_vcvta_u32_v:
761 case NEON::BI__builtin_neon_vcvta_u64_v:
762 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
763 case NEON::BI__builtin_neon_vcvtaq_s32_v:
764 case NEON::BI__builtin_neon_vcvtaq_s64_v:
765 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
766 case NEON::BI__builtin_neon_vcvtaq_u32_v:
767 case NEON::BI__builtin_neon_vcvtaq_u64_v:
768 case NEON::BI__builtin_neon_vcvtn_s16_f16:
769 case NEON::BI__builtin_neon_vcvtn_s32_v:
770 case NEON::BI__builtin_neon_vcvtn_s64_v:
771 case NEON::BI__builtin_neon_vcvtn_u16_f16:
772 case NEON::BI__builtin_neon_vcvtn_u32_v:
773 case NEON::BI__builtin_neon_vcvtn_u64_v:
774 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
775 case NEON::BI__builtin_neon_vcvtnq_s32_v:
776 case NEON::BI__builtin_neon_vcvtnq_s64_v:
777 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
778 case NEON::BI__builtin_neon_vcvtnq_u32_v:
779 case NEON::BI__builtin_neon_vcvtnq_u64_v:
780 case NEON::BI__builtin_neon_vcvtp_s16_f16:
781 case NEON::BI__builtin_neon_vcvtp_s32_v:
782 case NEON::BI__builtin_neon_vcvtp_s64_v:
783 case NEON::BI__builtin_neon_vcvtp_u16_f16:
784 case NEON::BI__builtin_neon_vcvtp_u32_v:
785 case NEON::BI__builtin_neon_vcvtp_u64_v:
786 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
787 case NEON::BI__builtin_neon_vcvtpq_s32_v:
788 case NEON::BI__builtin_neon_vcvtpq_s64_v:
789 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
790 case NEON::BI__builtin_neon_vcvtpq_u32_v:
791 case NEON::BI__builtin_neon_vcvtpq_u64_v:
792 case NEON::BI__builtin_neon_vcvtm_s16_f16:
793 case NEON::BI__builtin_neon_vcvtm_s32_v:
794 case NEON::BI__builtin_neon_vcvtm_s64_v:
795 case NEON::BI__builtin_neon_vcvtm_u16_f16:
796 case NEON::BI__builtin_neon_vcvtm_u32_v:
797 case NEON::BI__builtin_neon_vcvtm_u64_v:
798 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
799 case NEON::BI__builtin_neon_vcvtmq_s32_v:
800 case NEON::BI__builtin_neon_vcvtmq_s64_v:
801 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
802 case NEON::BI__builtin_neon_vcvtmq_u32_v:
803 case NEON::BI__builtin_neon_vcvtmq_u64_v:
804 case NEON::BI__builtin_neon_vcvtx_f32_v:
805 case NEON::BI__builtin_neon_vext_v:
806 case NEON::BI__builtin_neon_vextq_v:
807 case NEON::BI__builtin_neon_vfma_v:
809 std::string(
"unimplemented AArch64 builtin call: ") +
811 return mlir::Value{};
812 case NEON::BI__builtin_neon_vfmaq_v: {
823 case NEON::BI__builtin_neon_vld1_v:
824 case NEON::BI__builtin_neon_vld1q_v:
825 case NEON::BI__builtin_neon_vld1_x2_v:
826 case NEON::BI__builtin_neon_vld1q_x2_v:
827 case NEON::BI__builtin_neon_vld1_x3_v:
828 case NEON::BI__builtin_neon_vld1q_x3_v:
829 case NEON::BI__builtin_neon_vld1_x4_v:
830 case NEON::BI__builtin_neon_vld1q_x4_v:
831 case NEON::BI__builtin_neon_vld2_v:
832 case NEON::BI__builtin_neon_vld2q_v:
833 case NEON::BI__builtin_neon_vld3_v:
834 case NEON::BI__builtin_neon_vld3q_v:
835 case NEON::BI__builtin_neon_vld4_v:
836 case NEON::BI__builtin_neon_vld4q_v:
837 case NEON::BI__builtin_neon_vld2_dup_v:
838 case NEON::BI__builtin_neon_vld2q_dup_v:
839 case NEON::BI__builtin_neon_vld3_dup_v:
840 case NEON::BI__builtin_neon_vld3q_dup_v:
841 case NEON::BI__builtin_neon_vld4_dup_v:
842 case NEON::BI__builtin_neon_vld4q_dup_v:
843 case NEON::BI__builtin_neon_vld1_dup_v:
844 case NEON::BI__builtin_neon_vld1q_dup_v:
845 case NEON::BI__builtin_neon_vld2_lane_v:
846 case NEON::BI__builtin_neon_vld2q_lane_v:
847 case NEON::BI__builtin_neon_vld3_lane_v:
848 case NEON::BI__builtin_neon_vld3q_lane_v:
849 case NEON::BI__builtin_neon_vld4_lane_v:
850 case NEON::BI__builtin_neon_vld4q_lane_v:
851 case NEON::BI__builtin_neon_vmovl_v:
852 case NEON::BI__builtin_neon_vmovn_v:
853 case NEON::BI__builtin_neon_vmull_v:
854 case NEON::BI__builtin_neon_vpadal_v:
855 case NEON::BI__builtin_neon_vpadalq_v:
857 std::string(
"Reached code-path for ARM builtin call ") +
859 "(ARM builtins are not supported ATM)");
860 return mlir::Value{};
861 case NEON::BI__builtin_neon_vpaddl_v:
862 case NEON::BI__builtin_neon_vpaddlq_v: {
863 llvm::StringRef llvmIntrName =
865 usgn ? llvmIntrinsic : altLLVMIntrinsic));
867 {getNeonPairwiseWidenInputType(vTy, usgn)},
871 case NEON::BI__builtin_neon_vqdmlal_v:
872 case NEON::BI__builtin_neon_vqdmlsl_v:
873 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
874 case NEON::BI__builtin_neon_vqdmulh_lane_v:
875 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
876 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
877 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
878 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
879 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
880 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
881 case NEON::BI__builtin_neon_vqshl_n_v:
882 case NEON::BI__builtin_neon_vqshlq_n_v:
883 case NEON::BI__builtin_neon_vqshlu_n_v:
884 case NEON::BI__builtin_neon_vqshluq_n_v:
885 case NEON::BI__builtin_neon_vrecpe_v:
886 case NEON::BI__builtin_neon_vrecpeq_v:
887 case NEON::BI__builtin_neon_vrsqrte_v:
888 case NEON::BI__builtin_neon_vrsqrteq_v:
889 case NEON::BI__builtin_neon_vrndi_v:
890 case NEON::BI__builtin_neon_vrndiq_v:
892 std::string(
"unimplemented AArch64 builtin call: ") +
894 return mlir::Value{};
895 case NEON::BI__builtin_neon_vrshr_n_v:
896 case NEON::BI__builtin_neon_vrshrq_n_v: {
897 llvm::StringRef intrName =
898 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
901 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
902 intrName, ty, loc,
false,
906 case NEON::BI__builtin_neon_vsha512hq_u64:
907 case NEON::BI__builtin_neon_vsha512h2q_u64:
908 case NEON::BI__builtin_neon_vsha512su0q_u64:
909 case NEON::BI__builtin_neon_vsha512su1q_u64:
911 std::string(
"unimplemented AArch64 builtin call: ") +
913 return mlir::Value{};
914 case NEON::BI__builtin_neon_vshl_n_v:
915 case NEON::BI__builtin_neon_vshlq_n_v:
918 case NEON::BI__builtin_neon_vshll_n_v:
919 case NEON::BI__builtin_neon_vshrn_n_v:
921 std::string(
"unimplemented AArch64 builtin call: ") +
923 return mlir::Value{};
924 case NEON::BI__builtin_neon_vshr_n_v:
925 case NEON::BI__builtin_neon_vshrq_n_v:
927 case NEON::BI__builtin_neon_vst1_v:
928 case NEON::BI__builtin_neon_vst1q_v:
929 case NEON::BI__builtin_neon_vst2_v:
930 case NEON::BI__builtin_neon_vst2q_v:
931 case NEON::BI__builtin_neon_vst3_v:
932 case NEON::BI__builtin_neon_vst3q_v:
933 case NEON::BI__builtin_neon_vst4_v:
934 case NEON::BI__builtin_neon_vst4q_v:
935 case NEON::BI__builtin_neon_vst2_lane_v:
936 case NEON::BI__builtin_neon_vst2q_lane_v:
937 case NEON::BI__builtin_neon_vst3_lane_v:
938 case NEON::BI__builtin_neon_vst3q_lane_v:
939 case NEON::BI__builtin_neon_vst4_lane_v:
940 case NEON::BI__builtin_neon_vst4q_lane_v:
941 case NEON::BI__builtin_neon_vsm3partw1q_u32:
942 case NEON::BI__builtin_neon_vsm3partw2q_u32:
943 case NEON::BI__builtin_neon_vsm3ss1q_u32:
944 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
945 case NEON::BI__builtin_neon_vsm4eq_u32:
946 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
947 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
948 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
949 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
950 case NEON::BI__builtin_neon_vst1_x2_v:
951 case NEON::BI__builtin_neon_vst1q_x2_v:
952 case NEON::BI__builtin_neon_vst1_x3_v:
953 case NEON::BI__builtin_neon_vst1q_x3_v:
954 case NEON::BI__builtin_neon_vst1_x4_v:
955 case NEON::BI__builtin_neon_vst1q_x4_v:
956 case NEON::BI__builtin_neon_vsubhn_v:
957 case NEON::BI__builtin_neon_vtrn_v:
958 case NEON::BI__builtin_neon_vtrnq_v:
959 case NEON::BI__builtin_neon_vtst_v:
960 case NEON::BI__builtin_neon_vtstq_v:
961 case NEON::BI__builtin_neon_vuzp_v:
962 case NEON::BI__builtin_neon_vuzpq_v:
963 case NEON::BI__builtin_neon_vxarq_u64:
964 case NEON::BI__builtin_neon_vzip_v:
965 case NEON::BI__builtin_neon_vzipq_v:
966 case NEON::BI__builtin_neon_vdot_s32:
967 case NEON::BI__builtin_neon_vdot_u32:
968 case NEON::BI__builtin_neon_vdotq_s32:
969 case NEON::BI__builtin_neon_vdotq_u32:
970 case NEON::BI__builtin_neon_vfmlal_low_f16:
971 case NEON::BI__builtin_neon_vfmlalq_low_f16:
972 case NEON::BI__builtin_neon_vfmlsl_low_f16:
973 case NEON::BI__builtin_neon_vfmlslq_low_f16:
974 case NEON::BI__builtin_neon_vfmlal_high_f16:
975 case NEON::BI__builtin_neon_vfmlalq_high_f16:
976 case NEON::BI__builtin_neon_vfmlsl_high_f16:
977 case NEON::BI__builtin_neon_vfmlslq_high_f16:
978 case NEON::BI__builtin_neon_vmmlaq_s32:
979 case NEON::BI__builtin_neon_vmmlaq_u32:
981 std::string(
"unimplemented AArch64 builtin call: ") +
983 return mlir::Value{};
984 case NEON::BI__builtin_neon_vmul_v:
985 case NEON::BI__builtin_neon_vmulq_v:
988 case NEON::BI__builtin_neon_vusmmlaq_s32:
989 case NEON::BI__builtin_neon_vusdot_s32:
990 case NEON::BI__builtin_neon_vusdotq_s32:
991 case NEON::BI__builtin_neon_vbfdot_f32:
992 case NEON::BI__builtin_neon_vbfdotq_f32:
993 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
995 std::string(
"unimplemented AArch64 builtin call: ") +
997 return mlir::Value{};
1003 switch (builtinID) {
1006 std::string(
"unimplemented AArch64 builtin call: ") +
1009 case NEON::BI__builtin_neon_vshl_v:
1010 case NEON::BI__builtin_neon_vshlq_v: {
1011 llvm::StringRef llvmIntrName =
1013 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1015 mlir::Value result =
1017 {vTy, vTy}, ops, llvmIntrName,
1433 NEON::BI__builtin_neon_splat_lane_bf16,
1434 NEON::BI__builtin_neon_splat_lane_v,
1437 NEON::BI__builtin_neon_splat_laneq_bf16,
1438 NEON::BI__builtin_neon_splat_laneq_v,
1441 NEON::BI__builtin_neon_splatq_lane_bf16,
1442 NEON::BI__builtin_neon_splatq_lane_v,
1445 NEON::BI__builtin_neon_splatq_laneq_bf16,
1446 NEON::BI__builtin_neon_splatq_laneq_v,
1449 NEON::BI__builtin_neon_vabd_f16,
1450 NEON::BI__builtin_neon_vabd_v,
1453 NEON::BI__builtin_neon_vabdq_f16,
1454 NEON::BI__builtin_neon_vabdq_v,
1457 NEON::BI__builtin_neon_vabs_f16,
1458 NEON::BI__builtin_neon_vabs_v,
1461 NEON::BI__builtin_neon_vabsq_f16,
1462 NEON::BI__builtin_neon_vabsq_v,
1465 NEON::BI__builtin_neon_vcage_f16,
1466 NEON::BI__builtin_neon_vcage_v,
1469 NEON::BI__builtin_neon_vcageq_f16,
1470 NEON::BI__builtin_neon_vcageq_v,
1473 NEON::BI__builtin_neon_vcagt_f16,
1474 NEON::BI__builtin_neon_vcagt_v,
1477 NEON::BI__builtin_neon_vcagtq_f16,
1478 NEON::BI__builtin_neon_vcagtq_v,
1481 NEON::BI__builtin_neon_vcale_f16,
1482 NEON::BI__builtin_neon_vcale_v,
1485 NEON::BI__builtin_neon_vcaleq_f16,
1486 NEON::BI__builtin_neon_vcaleq_v,
1489 NEON::BI__builtin_neon_vcalt_f16,
1490 NEON::BI__builtin_neon_vcalt_v,
1493 NEON::BI__builtin_neon_vcaltq_f16,
1494 NEON::BI__builtin_neon_vcaltq_v,
1497 NEON::BI__builtin_neon_vceqz_f16,
1498 NEON::BI__builtin_neon_vceqz_v,
1501 NEON::BI__builtin_neon_vceqzq_f16,
1502 NEON::BI__builtin_neon_vceqzq_v,
1505 NEON::BI__builtin_neon_vcgez_f16,
1506 NEON::BI__builtin_neon_vcgez_v,
1509 NEON::BI__builtin_neon_vcgezq_f16,
1510 NEON::BI__builtin_neon_vcgezq_v,
1513 NEON::BI__builtin_neon_vcgtz_f16,
1514 NEON::BI__builtin_neon_vcgtz_v,
1517 NEON::BI__builtin_neon_vcgtzq_f16,
1518 NEON::BI__builtin_neon_vcgtzq_v,
1521 NEON::BI__builtin_neon_vclez_f16,
1522 NEON::BI__builtin_neon_vclez_v,
1525 NEON::BI__builtin_neon_vclezq_f16,
1526 NEON::BI__builtin_neon_vclezq_v,
1529 NEON::BI__builtin_neon_vcltz_f16,
1530 NEON::BI__builtin_neon_vcltz_v,
1533 NEON::BI__builtin_neon_vcltzq_f16,
1534 NEON::BI__builtin_neon_vcltzq_v,
1537 NEON::BI__builtin_neon_vfma_f16,
1538 NEON::BI__builtin_neon_vfma_v,
1541 NEON::BI__builtin_neon_vfma_lane_f16,
1542 NEON::BI__builtin_neon_vfma_lane_v,
1545 NEON::BI__builtin_neon_vfma_laneq_f16,
1546 NEON::BI__builtin_neon_vfma_laneq_v,
1549 NEON::BI__builtin_neon_vfmaq_f16,
1550 NEON::BI__builtin_neon_vfmaq_v,
1553 NEON::BI__builtin_neon_vfmaq_lane_f16,
1554 NEON::BI__builtin_neon_vfmaq_lane_v,
1557 NEON::BI__builtin_neon_vfmaq_laneq_f16,
1558 NEON::BI__builtin_neon_vfmaq_laneq_v,
1560 {NEON::BI__builtin_neon_vld1_bf16_x2, NEON::BI__builtin_neon_vld1_x2_v},
1561 {NEON::BI__builtin_neon_vld1_bf16_x3, NEON::BI__builtin_neon_vld1_x3_v},
1562 {NEON::BI__builtin_neon_vld1_bf16_x4, NEON::BI__builtin_neon_vld1_x4_v},
1563 {NEON::BI__builtin_neon_vld1_bf16, NEON::BI__builtin_neon_vld1_v},
1564 {NEON::BI__builtin_neon_vld1_dup_bf16, NEON::BI__builtin_neon_vld1_dup_v},
1565 {NEON::BI__builtin_neon_vld1_lane_bf16, NEON::BI__builtin_neon_vld1_lane_v},
1566 {NEON::BI__builtin_neon_vld1q_bf16_x2, NEON::BI__builtin_neon_vld1q_x2_v},
1567 {NEON::BI__builtin_neon_vld1q_bf16_x3, NEON::BI__builtin_neon_vld1q_x3_v},
1568 {NEON::BI__builtin_neon_vld1q_bf16_x4, NEON::BI__builtin_neon_vld1q_x4_v},
1569 {NEON::BI__builtin_neon_vld1q_bf16, NEON::BI__builtin_neon_vld1q_v},
1570 {NEON::BI__builtin_neon_vld1q_dup_bf16, NEON::BI__builtin_neon_vld1q_dup_v},
1571 {NEON::BI__builtin_neon_vld1q_lane_bf16,
1572 NEON::BI__builtin_neon_vld1q_lane_v},
1573 {NEON::BI__builtin_neon_vld2_bf16, NEON::BI__builtin_neon_vld2_v},
1574 {NEON::BI__builtin_neon_vld2_dup_bf16, NEON::BI__builtin_neon_vld2_dup_v},
1575 {NEON::BI__builtin_neon_vld2_lane_bf16, NEON::BI__builtin_neon_vld2_lane_v},
1576 {NEON::BI__builtin_neon_vld2q_bf16, NEON::BI__builtin_neon_vld2q_v},
1577 {NEON::BI__builtin_neon_vld2q_dup_bf16, NEON::BI__builtin_neon_vld2q_dup_v},
1578 {NEON::BI__builtin_neon_vld2q_lane_bf16,
1579 NEON::BI__builtin_neon_vld2q_lane_v},
1580 {NEON::BI__builtin_neon_vld3_bf16, NEON::BI__builtin_neon_vld3_v},
1581 {NEON::BI__builtin_neon_vld3_dup_bf16, NEON::BI__builtin_neon_vld3_dup_v},
1582 {NEON::BI__builtin_neon_vld3_lane_bf16, NEON::BI__builtin_neon_vld3_lane_v},
1583 {NEON::BI__builtin_neon_vld3q_bf16, NEON::BI__builtin_neon_vld3q_v},
1584 {NEON::BI__builtin_neon_vld3q_dup_bf16, NEON::BI__builtin_neon_vld3q_dup_v},
1585 {NEON::BI__builtin_neon_vld3q_lane_bf16,
1586 NEON::BI__builtin_neon_vld3q_lane_v},
1587 {NEON::BI__builtin_neon_vld4_bf16, NEON::BI__builtin_neon_vld4_v},
1588 {NEON::BI__builtin_neon_vld4_dup_bf16, NEON::BI__builtin_neon_vld4_dup_v},
1589 {NEON::BI__builtin_neon_vld4_lane_bf16, NEON::BI__builtin_neon_vld4_lane_v},
1590 {NEON::BI__builtin_neon_vld4q_bf16, NEON::BI__builtin_neon_vld4q_v},
1591 {NEON::BI__builtin_neon_vld4q_dup_bf16, NEON::BI__builtin_neon_vld4q_dup_v},
1592 {NEON::BI__builtin_neon_vld4q_lane_bf16,
1593 NEON::BI__builtin_neon_vld4q_lane_v},
1595 NEON::BI__builtin_neon_vmax_f16,
1596 NEON::BI__builtin_neon_vmax_v,
1599 NEON::BI__builtin_neon_vmaxnm_f16,
1600 NEON::BI__builtin_neon_vmaxnm_v,
1603 NEON::BI__builtin_neon_vmaxnmq_f16,
1604 NEON::BI__builtin_neon_vmaxnmq_v,
1607 NEON::BI__builtin_neon_vmaxq_f16,
1608 NEON::BI__builtin_neon_vmaxq_v,
1611 NEON::BI__builtin_neon_vmin_f16,
1612 NEON::BI__builtin_neon_vmin_v,
1615 NEON::BI__builtin_neon_vminnm_f16,
1616 NEON::BI__builtin_neon_vminnm_v,
1619 NEON::BI__builtin_neon_vminnmq_f16,
1620 NEON::BI__builtin_neon_vminnmq_v,
1623 NEON::BI__builtin_neon_vminq_f16,
1624 NEON::BI__builtin_neon_vminq_v,
1627 NEON::BI__builtin_neon_vmulx_f16,
1628 NEON::BI__builtin_neon_vmulx_v,
1631 NEON::BI__builtin_neon_vmulxq_f16,
1632 NEON::BI__builtin_neon_vmulxq_v,
1635 NEON::BI__builtin_neon_vpadd_f16,
1636 NEON::BI__builtin_neon_vpadd_v,
1639 NEON::BI__builtin_neon_vpaddq_f16,
1640 NEON::BI__builtin_neon_vpaddq_v,
1643 NEON::BI__builtin_neon_vpmax_f16,
1644 NEON::BI__builtin_neon_vpmax_v,
1647 NEON::BI__builtin_neon_vpmaxnm_f16,
1648 NEON::BI__builtin_neon_vpmaxnm_v,
1651 NEON::BI__builtin_neon_vpmaxnmq_f16,
1652 NEON::BI__builtin_neon_vpmaxnmq_v,
1655 NEON::BI__builtin_neon_vpmaxq_f16,
1656 NEON::BI__builtin_neon_vpmaxq_v,
1659 NEON::BI__builtin_neon_vpmin_f16,
1660 NEON::BI__builtin_neon_vpmin_v,
1663 NEON::BI__builtin_neon_vpminnm_f16,
1664 NEON::BI__builtin_neon_vpminnm_v,
1667 NEON::BI__builtin_neon_vpminnmq_f16,
1668 NEON::BI__builtin_neon_vpminnmq_v,
1671 NEON::BI__builtin_neon_vpminq_f16,
1672 NEON::BI__builtin_neon_vpminq_v,
1675 NEON::BI__builtin_neon_vrecpe_f16,
1676 NEON::BI__builtin_neon_vrecpe_v,
1679 NEON::BI__builtin_neon_vrecpeq_f16,
1680 NEON::BI__builtin_neon_vrecpeq_v,
1683 NEON::BI__builtin_neon_vrecps_f16,
1684 NEON::BI__builtin_neon_vrecps_v,
1687 NEON::BI__builtin_neon_vrecpsq_f16,
1688 NEON::BI__builtin_neon_vrecpsq_v,
1691 NEON::BI__builtin_neon_vrnd_f16,
1692 NEON::BI__builtin_neon_vrnd_v,
1695 NEON::BI__builtin_neon_vrnda_f16,
1696 NEON::BI__builtin_neon_vrnda_v,
1699 NEON::BI__builtin_neon_vrndaq_f16,
1700 NEON::BI__builtin_neon_vrndaq_v,
1703 NEON::BI__builtin_neon_vrndi_f16,
1704 NEON::BI__builtin_neon_vrndi_v,
1707 NEON::BI__builtin_neon_vrndiq_f16,
1708 NEON::BI__builtin_neon_vrndiq_v,
1711 NEON::BI__builtin_neon_vrndm_f16,
1712 NEON::BI__builtin_neon_vrndm_v,
1715 NEON::BI__builtin_neon_vrndmq_f16,
1716 NEON::BI__builtin_neon_vrndmq_v,
1719 NEON::BI__builtin_neon_vrndn_f16,
1720 NEON::BI__builtin_neon_vrndn_v,
1723 NEON::BI__builtin_neon_vrndnq_f16,
1724 NEON::BI__builtin_neon_vrndnq_v,
1727 NEON::BI__builtin_neon_vrndp_f16,
1728 NEON::BI__builtin_neon_vrndp_v,
1731 NEON::BI__builtin_neon_vrndpq_f16,
1732 NEON::BI__builtin_neon_vrndpq_v,
1735 NEON::BI__builtin_neon_vrndq_f16,
1736 NEON::BI__builtin_neon_vrndq_v,
1739 NEON::BI__builtin_neon_vrndx_f16,
1740 NEON::BI__builtin_neon_vrndx_v,
1743 NEON::BI__builtin_neon_vrndxq_f16,
1744 NEON::BI__builtin_neon_vrndxq_v,
1747 NEON::BI__builtin_neon_vrsqrte_f16,
1748 NEON::BI__builtin_neon_vrsqrte_v,
1751 NEON::BI__builtin_neon_vrsqrteq_f16,
1752 NEON::BI__builtin_neon_vrsqrteq_v,
1755 NEON::BI__builtin_neon_vrsqrts_f16,
1756 NEON::BI__builtin_neon_vrsqrts_v,
1759 NEON::BI__builtin_neon_vrsqrtsq_f16,
1760 NEON::BI__builtin_neon_vrsqrtsq_v,
1763 NEON::BI__builtin_neon_vsqrt_f16,
1764 NEON::BI__builtin_neon_vsqrt_v,
1767 NEON::BI__builtin_neon_vsqrtq_f16,
1768 NEON::BI__builtin_neon_vsqrtq_v,
1770 {NEON::BI__builtin_neon_vst1_bf16_x2, NEON::BI__builtin_neon_vst1_x2_v},
1771 {NEON::BI__builtin_neon_vst1_bf16_x3, NEON::BI__builtin_neon_vst1_x3_v},
1772 {NEON::BI__builtin_neon_vst1_bf16_x4, NEON::BI__builtin_neon_vst1_x4_v},
1773 {NEON::BI__builtin_neon_vst1_bf16, NEON::BI__builtin_neon_vst1_v},
1774 {NEON::BI__builtin_neon_vst1_lane_bf16, NEON::BI__builtin_neon_vst1_lane_v},
1775 {NEON::BI__builtin_neon_vst1q_bf16_x2, NEON::BI__builtin_neon_vst1q_x2_v},
1776 {NEON::BI__builtin_neon_vst1q_bf16_x3, NEON::BI__builtin_neon_vst1q_x3_v},
1777 {NEON::BI__builtin_neon_vst1q_bf16_x4, NEON::BI__builtin_neon_vst1q_x4_v},
1778 {NEON::BI__builtin_neon_vst1q_bf16, NEON::BI__builtin_neon_vst1q_v},
1779 {NEON::BI__builtin_neon_vst1q_lane_bf16,
1780 NEON::BI__builtin_neon_vst1q_lane_v},
1781 {NEON::BI__builtin_neon_vst2_bf16, NEON::BI__builtin_neon_vst2_v},
1782 {NEON::BI__builtin_neon_vst2_lane_bf16, NEON::BI__builtin_neon_vst2_lane_v},
1783 {NEON::BI__builtin_neon_vst2q_bf16, NEON::BI__builtin_neon_vst2q_v},
1784 {NEON::BI__builtin_neon_vst2q_lane_bf16,
1785 NEON::BI__builtin_neon_vst2q_lane_v},
1786 {NEON::BI__builtin_neon_vst3_bf16, NEON::BI__builtin_neon_vst3_v},
1787 {NEON::BI__builtin_neon_vst3_lane_bf16, NEON::BI__builtin_neon_vst3_lane_v},
1788 {NEON::BI__builtin_neon_vst3q_bf16, NEON::BI__builtin_neon_vst3q_v},
1789 {NEON::BI__builtin_neon_vst3q_lane_bf16,
1790 NEON::BI__builtin_neon_vst3q_lane_v},
1791 {NEON::BI__builtin_neon_vst4_bf16, NEON::BI__builtin_neon_vst4_v},
1792 {NEON::BI__builtin_neon_vst4_lane_bf16, NEON::BI__builtin_neon_vst4_lane_v},
1793 {NEON::BI__builtin_neon_vst4q_bf16, NEON::BI__builtin_neon_vst4q_v},
1794 {NEON::BI__builtin_neon_vst4q_lane_bf16,
1795 NEON::BI__builtin_neon_vst4q_lane_v},
1799 {NEON::BI__builtin_neon_vldap1_lane_u64,
1800 NEON::BI__builtin_neon_vldap1_lane_s64},
1801 {NEON::BI__builtin_neon_vldap1_lane_f64,
1802 NEON::BI__builtin_neon_vldap1_lane_s64},
1803 {NEON::BI__builtin_neon_vldap1_lane_p64,
1804 NEON::BI__builtin_neon_vldap1_lane_s64},
1805 {NEON::BI__builtin_neon_vldap1q_lane_u64,
1806 NEON::BI__builtin_neon_vldap1q_lane_s64},
1807 {NEON::BI__builtin_neon_vldap1q_lane_f64,
1808 NEON::BI__builtin_neon_vldap1q_lane_s64},
1809 {NEON::BI__builtin_neon_vldap1q_lane_p64,
1810 NEON::BI__builtin_neon_vldap1q_lane_s64},
1811 {NEON::BI__builtin_neon_vstl1_lane_u64,
1812 NEON::BI__builtin_neon_vstl1_lane_s64},
1813 {NEON::BI__builtin_neon_vstl1_lane_f64,
1814 NEON::BI__builtin_neon_vstl1_lane_s64},
1815 {NEON::BI__builtin_neon_vstl1_lane_p64,
1816 NEON::BI__builtin_neon_vstl1_lane_s64},
1817 {NEON::BI__builtin_neon_vstl1q_lane_u64,
1818 NEON::BI__builtin_neon_vstl1q_lane_s64},
1819 {NEON::BI__builtin_neon_vstl1q_lane_f64,
1820 NEON::BI__builtin_neon_vstl1q_lane_s64},
1821 {NEON::BI__builtin_neon_vstl1q_lane_p64,
1822 NEON::BI__builtin_neon_vstl1q_lane_s64},
1828 llvm::Triple::ArchType arch) {
1837 if (builtinID == Builtin::BI__builtin_cpu_supports) {
1838 cgm.errorNYI(
expr->getSourceRange(),
1839 std::string(
"unimplemented AArch64 builtin call: ") +
1840 getContext().BuiltinInfo.getName(builtinID));
1841 return mlir::Value{};
1844 switch (builtinID) {
1847 case clang::AArch64::BI__builtin_arm_nop:
1848 case clang::AArch64::BI__builtin_arm_yield:
1849 case clang::AArch64::BI__yield:
1850 case clang::AArch64::BI__builtin_arm_wfe:
1851 case clang::AArch64::BI__wfe:
1852 case clang::AArch64::BI__builtin_arm_wfi:
1853 case clang::AArch64::BI__wfi:
1854 case clang::AArch64::BI__builtin_arm_sev:
1855 case clang::AArch64::BI__sev:
1856 case clang::AArch64::BI__builtin_arm_sevl:
1857 case clang::AArch64::BI__sevl:
1858 cgm.errorNYI(
expr->getSourceRange(),
1859 std::string(
"unimplemented AArch64 builtin call: ") +
1860 getContext().BuiltinInfo.getName(builtinID));
1861 return mlir::Value{};
1864 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
1865 cgm.errorNYI(
expr->getSourceRange(),
1866 std::string(
"unimplemented AArch64 builtin call: ") +
1867 getContext().BuiltinInfo.getName(builtinID));
1868 return mlir::Value{};
1871 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
1872 cgm.errorNYI(
expr->getSourceRange(),
1873 std::string(
"unimplemented AArch64 builtin call: ") +
1874 getContext().BuiltinInfo.getName(builtinID));
1875 return mlir::Value{};
1878 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
1879 cgm.errorNYI(
expr->getSourceRange(),
1880 std::string(
"unimplemented AArch64 builtin call: ") +
1881 getContext().BuiltinInfo.getName(builtinID));
1882 return mlir::Value{};
1884 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
1885 cgm.errorNYI(
expr->getSourceRange(),
1886 std::string(
"unimplemented AArch64 builtin call: ") +
1887 getContext().BuiltinInfo.getName(builtinID));
1888 return mlir::Value{};
1891 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
1892 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
1893 cgm.errorNYI(
expr->getSourceRange(),
1894 std::string(
"unimplemented AArch64 builtin call: ") +
1895 getContext().BuiltinInfo.getName(builtinID));
1896 return mlir::Value{};
1899 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
1900 cgm.errorNYI(
expr->getSourceRange(),
1901 std::string(
"unimplemented AArch64 builtin call: ") +
1902 getContext().BuiltinInfo.getName(builtinID));
1903 return mlir::Value{};
1905 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
1906 cgm.errorNYI(
expr->getSourceRange(),
1907 std::string(
"unimplemented AArch64 builtin call: ") +
1908 getContext().BuiltinInfo.getName(builtinID));
1909 return mlir::Value{};
1912 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
1913 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
1914 cgm.errorNYI(
expr->getSourceRange(),
1915 std::string(
"unimplemented AArch64 builtin call: ") +
1916 getContext().BuiltinInfo.getName(builtinID));
1917 return mlir::Value{};
1920 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
1921 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
1922 cgm.errorNYI(
expr->getSourceRange(),
1923 std::string(
"unimplemented AArch64 builtin call: ") +
1924 getContext().BuiltinInfo.getName(builtinID));
1925 return mlir::Value{};
1928 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
1929 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
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_rint64xf ||
1937 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
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_jcvt) {
1945 cgm.errorNYI(
expr->getSourceRange(),
1946 std::string(
"unimplemented AArch64 builtin call: ") +
1947 getContext().BuiltinInfo.getName(builtinID));
1948 return mlir::Value{};
1951 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
1952 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
1953 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
1954 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
1955 cgm.errorNYI(
expr->getSourceRange(),
1956 std::string(
"unimplemented AArch64 builtin call: ") +
1957 getContext().BuiltinInfo.getName(builtinID));
1958 return mlir::Value{};
1961 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
1962 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
1963 cgm.errorNYI(
expr->getSourceRange(),
1964 std::string(
"unimplemented AArch64 builtin call: ") +
1965 getContext().BuiltinInfo.getName(builtinID));
1966 return mlir::Value{};
1969 if (builtinID == clang::AArch64::BI__clear_cache) {
1970 cgm.errorNYI(
expr->getSourceRange(),
1971 std::string(
"unimplemented AArch64 builtin call: ") +
1972 getContext().BuiltinInfo.getName(builtinID));
1973 return mlir::Value{};
1976 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
1977 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
1979 cgm.errorNYI(
expr->getSourceRange(),
1980 std::string(
"unimplemented AArch64 builtin call: ") +
1981 getContext().BuiltinInfo.getName(builtinID));
1982 return mlir::Value{};
1984 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
1985 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
1986 cgm.errorNYI(
expr->getSourceRange(),
1987 std::string(
"unimplemented AArch64 builtin call: ") +
1988 getContext().BuiltinInfo.getName(builtinID));
1989 return mlir::Value{};
1992 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
1993 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
1995 cgm.errorNYI(
expr->getSourceRange(),
1996 std::string(
"unimplemented AArch64 builtin call: ") +
1997 getContext().BuiltinInfo.getName(builtinID));
1998 return mlir::Value{};
2001 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2002 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
2003 cgm.errorNYI(
expr->getSourceRange(),
2004 std::string(
"unimplemented AArch64 builtin call: ") +
2005 getContext().BuiltinInfo.getName(builtinID));
2006 return mlir::Value{};
2009 if (builtinID == clang::AArch64::BI__getReg) {
2010 cgm.errorNYI(
expr->getSourceRange(),
2011 std::string(
"unimplemented AArch64 builtin call: ") +
2012 getContext().BuiltinInfo.getName(builtinID));
2013 return mlir::Value{};
2016 if (builtinID == clang::AArch64::BI__break) {
2017 cgm.errorNYI(
expr->getSourceRange(),
2018 std::string(
"unimplemented AArch64 builtin call: ") +
2019 getContext().BuiltinInfo.getName(builtinID));
2020 return mlir::Value{};
2023 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2024 cgm.errorNYI(
expr->getSourceRange(),
2025 std::string(
"unimplemented AArch64 builtin call: ") +
2026 getContext().BuiltinInfo.getName(builtinID));
2027 return mlir::Value{};
2030 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2031 cgm.errorNYI(
expr->getSourceRange(),
2032 std::string(
"unimplemented AArch64 builtin call: ") +
2033 getContext().BuiltinInfo.getName(builtinID));
2034 return mlir::Value{};
2038 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2039 switch (builtinID) {
2040 case clang::AArch64::BI__builtin_arm_crc32b:
2041 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2043 case clang::AArch64::BI__builtin_arm_crc32cb:
2044 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2046 case clang::AArch64::BI__builtin_arm_crc32h:
2047 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2049 case clang::AArch64::BI__builtin_arm_crc32ch:
2050 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2052 case clang::AArch64::BI__builtin_arm_crc32w:
2053 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2055 case clang::AArch64::BI__builtin_arm_crc32cw:
2056 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2058 case clang::AArch64::BI__builtin_arm_crc32d:
2059 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2061 case clang::AArch64::BI__builtin_arm_crc32cd:
2062 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2066 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2067 cgm.errorNYI(
expr->getSourceRange(),
2068 std::string(
"unimplemented AArch64 builtin call: ") +
2069 getContext().BuiltinInfo.getName(builtinID));
2070 return mlir::Value{};
2074 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2075 cgm.errorNYI(
expr->getSourceRange(),
2076 std::string(
"unimplemented AArch64 builtin call: ") +
2077 getContext().BuiltinInfo.getName(builtinID));
2078 return mlir::Value{};
2082 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2083 switch (builtinID) {
2084 case clang::AArch64::BI__builtin_arm_irg:
2085 mteIntrinsicID = Intrinsic::aarch64_irg;
2087 case clang::AArch64::BI__builtin_arm_addg:
2088 mteIntrinsicID = Intrinsic::aarch64_addg;
2090 case clang::AArch64::BI__builtin_arm_gmi:
2091 mteIntrinsicID = Intrinsic::aarch64_gmi;
2093 case clang::AArch64::BI__builtin_arm_ldg:
2094 mteIntrinsicID = Intrinsic::aarch64_ldg;
2096 case clang::AArch64::BI__builtin_arm_stg:
2097 mteIntrinsicID = Intrinsic::aarch64_stg;
2099 case clang::AArch64::BI__builtin_arm_subp:
2100 mteIntrinsicID = Intrinsic::aarch64_subp;
2104 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
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_rsr ||
2112 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2113 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2114 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2115 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2116 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2117 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2118 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2119 cgm.errorNYI(
expr->getSourceRange(),
2120 std::string(
"unimplemented AArch64 builtin call: ") +
2121 getContext().BuiltinInfo.getName(builtinID));
2122 return mlir::Value{};
2125 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2126 builtinID == clang::AArch64::BI_WriteStatusReg ||
2127 builtinID == clang::AArch64::BI__sys) {
2128 cgm.errorNYI(
expr->getSourceRange(),
2129 std::string(
"unimplemented AArch64 builtin call: ") +
2130 getContext().BuiltinInfo.getName(builtinID));
2131 return mlir::Value{};
2134 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
2135 cgm.errorNYI(
expr->getSourceRange(),
2136 std::string(
"unimplemented AArch64 builtin call: ") +
2137 getContext().BuiltinInfo.getName(builtinID));
2138 return mlir::Value{};
2141 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2142 cgm.errorNYI(
expr->getSourceRange(),
2143 std::string(
"unimplemented AArch64 builtin call: ") +
2144 getContext().BuiltinInfo.getName(builtinID));
2145 return mlir::Value{};
2148 if (builtinID == clang::AArch64::BI__mulh ||
2149 builtinID == clang::AArch64::BI__umulh) {
2150 cgm.errorNYI(
expr->getSourceRange(),
2151 std::string(
"unimplemented AArch64 builtin call: ") +
2152 getContext().BuiltinInfo.getName(builtinID));
2153 return mlir::Value{};
2156 if (builtinID == AArch64::BI__writex18byte ||
2157 builtinID == AArch64::BI__writex18word ||
2158 builtinID == AArch64::BI__writex18dword ||
2159 builtinID == AArch64::BI__writex18qword) {
2160 cgm.errorNYI(
expr->getSourceRange(),
2161 std::string(
"unimplemented AArch64 builtin call: ") +
2162 getContext().BuiltinInfo.getName(builtinID));
2163 return mlir::Value{};
2166 if (builtinID == AArch64::BI__readx18byte ||
2167 builtinID == AArch64::BI__readx18word ||
2168 builtinID == AArch64::BI__readx18dword ||
2169 builtinID == AArch64::BI__readx18qword) {
2170 cgm.errorNYI(
expr->getSourceRange(),
2171 std::string(
"unimplemented AArch64 builtin call: ") +
2172 getContext().BuiltinInfo.getName(builtinID));
2173 return mlir::Value{};
2176 if (builtinID == AArch64::BI__addx18byte ||
2177 builtinID == AArch64::BI__addx18word ||
2178 builtinID == AArch64::BI__addx18dword ||
2179 builtinID == AArch64::BI__addx18qword ||
2180 builtinID == AArch64::BI__incx18byte ||
2181 builtinID == AArch64::BI__incx18word ||
2182 builtinID == AArch64::BI__incx18dword ||
2183 builtinID == AArch64::BI__incx18qword) {
2184 cgm.errorNYI(
expr->getSourceRange(),
2185 std::string(
"unimplemented AArch64 builtin call: ") +
2186 getContext().BuiltinInfo.getName(builtinID));
2187 return mlir::Value{};
2190 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2191 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2192 builtinID == AArch64::BI_CopyInt32FromFloat ||
2193 builtinID == AArch64::BI_CopyInt64FromDouble) {
2194 cgm.errorNYI(
expr->getSourceRange(),
2195 std::string(
"unimplemented AArch64 builtin call: ") +
2196 getContext().BuiltinInfo.getName(builtinID));
2197 return mlir::Value{};
2200 if (builtinID == AArch64::BI_CountLeadingOnes ||
2201 builtinID == AArch64::BI_CountLeadingOnes64 ||
2202 builtinID == AArch64::BI_CountLeadingZeros ||
2203 builtinID == AArch64::BI_CountLeadingZeros64) {
2204 cgm.errorNYI(
expr->getSourceRange(),
2205 std::string(
"unimplemented AArch64 builtin call: ") +
2206 getContext().BuiltinInfo.getName(builtinID));
2207 return mlir::Value{};
2210 if (builtinID == AArch64::BI_CountLeadingSigns ||
2211 builtinID == AArch64::BI_CountLeadingSigns64) {
2212 cgm.errorNYI(
expr->getSourceRange(),
2213 std::string(
"unimplemented AArch64 builtin call: ") +
2214 getContext().BuiltinInfo.getName(builtinID));
2215 return mlir::Value{};
2218 if (builtinID == AArch64::BI_CountOneBits ||
2219 builtinID == AArch64::BI_CountOneBits64) {
2220 cgm.errorNYI(
expr->getSourceRange(),
2221 std::string(
"unimplemented AArch64 builtin call: ") +
2222 getContext().BuiltinInfo.getName(builtinID));
2223 return mlir::Value{};
2226 if (builtinID == AArch64::BI__prefetch) {
2227 cgm.errorNYI(
expr->getSourceRange(),
2228 std::string(
"unimplemented AArch64 builtin call: ") +
2229 getContext().BuiltinInfo.getName(builtinID));
2230 return mlir::Value{};
2233 if (builtinID == AArch64::BI__hlt) {
2234 cgm.errorNYI(
expr->getSourceRange(),
2235 std::string(
"unimplemented AArch64 builtin call: ") +
2236 getContext().BuiltinInfo.getName(builtinID));
2237 return mlir::Value{};
2240 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2241 cgm.errorNYI(
expr->getSourceRange(),
2242 std::string(
"unimplemented AArch64 builtin call: ") +
2243 getContext().BuiltinInfo.getName(builtinID));
2244 return mlir::Value{};
2253 return p.first == builtinID;
2256 builtinID = it->second;
2261 unsigned iceArguments = 0;
2270 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2271 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2273 switch (builtinID) {
2274 case NEON::BI__builtin_neon_vld1_v:
2275 case NEON::BI__builtin_neon_vld1q_v:
2276 case NEON::BI__builtin_neon_vld1_dup_v:
2277 case NEON::BI__builtin_neon_vld1q_dup_v:
2278 case NEON::BI__builtin_neon_vld1_lane_v:
2279 case NEON::BI__builtin_neon_vld1q_lane_v:
2280 case NEON::BI__builtin_neon_vst1_v:
2281 case NEON::BI__builtin_neon_vst1q_v:
2282 case NEON::BI__builtin_neon_vst1_lane_v:
2283 case NEON::BI__builtin_neon_vst1q_lane_v:
2284 case NEON::BI__builtin_neon_vldap1_lane_s64:
2285 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2286 case NEON::BI__builtin_neon_vstl1_lane_s64:
2287 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2291 expr->getSourceRange(),
2292 std::string(
"unimplemented AArch64 builtin argument handling ") +
2293 getContext().BuiltinInfo.getName(builtinID));
2311 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2315 if (std::optional<llvm::APSInt> result =
2319 bool usgn =
type.isUnsigned();
2321 mlir::Location loc =
getLoc(
expr->getExprLoc());
2334 switch (builtinID) {
2337 case NEON::BI__builtin_neon_vabsh_f16: {
2338 return cir::FAbsOp::create(builder, loc, ops);
2340 case NEON::BI__builtin_neon_vaddq_p128:
2341 case NEON::BI__builtin_neon_vldrq_p128:
2342 case NEON::BI__builtin_neon_vstrq_p128:
2343 case NEON::BI__builtin_neon_vcvts_f32_u32:
2344 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2345 case NEON::BI__builtin_neon_vcvts_f32_s32:
2346 case NEON::BI__builtin_neon_vcvtd_f64_s64:
2347 case NEON::BI__builtin_neon_vcvth_f16_u16:
2348 case NEON::BI__builtin_neon_vcvth_f16_u32:
2349 case NEON::BI__builtin_neon_vcvth_f16_u64:
2350 case NEON::BI__builtin_neon_vcvth_f16_s16:
2351 case NEON::BI__builtin_neon_vcvth_f16_s32:
2352 case NEON::BI__builtin_neon_vcvth_f16_s64:
2353 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2354 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2355 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2356 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2357 case NEON::BI__builtin_neon_vcvth_u16_f16:
2358 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2359 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2360 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2361 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2362 case NEON::BI__builtin_neon_vcvth_s16_f16:
2363 case NEON::BI__builtin_neon_vcaleh_f16:
2364 case NEON::BI__builtin_neon_vcalth_f16:
2365 case NEON::BI__builtin_neon_vcageh_f16:
2366 case NEON::BI__builtin_neon_vcagth_f16:
2367 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2368 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2369 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2370 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2371 case NEON::BI__builtin_neon_vpaddd_s64:
2372 case NEON::BI__builtin_neon_vpaddd_f64:
2373 case NEON::BI__builtin_neon_vpadds_f32:
2374 cgm.errorNYI(
expr->getSourceRange(),
2375 std::string(
"unimplemented AArch64 builtin call: ") +
2376 getContext().BuiltinInfo.getName(builtinID));
2377 return mlir::Value{};
2378 case NEON::BI__builtin_neon_vceqzd_s64:
2379 case NEON::BI__builtin_neon_vceqzd_f64:
2380 case NEON::BI__builtin_neon_vceqzs_f32:
2381 case NEON::BI__builtin_neon_vceqzh_f16:
2383 *
this, builder, loc, ops[0],
2385 case NEON::BI__builtin_neon_vcgezd_s64:
2386 case NEON::BI__builtin_neon_vcgezd_f64:
2387 case NEON::BI__builtin_neon_vcgezs_f32:
2388 case NEON::BI__builtin_neon_vcgezh_f16:
2389 case NEON::BI__builtin_neon_vclezd_s64:
2390 case NEON::BI__builtin_neon_vclezd_f64:
2391 case NEON::BI__builtin_neon_vclezs_f32:
2392 case NEON::BI__builtin_neon_vclezh_f16:
2393 case NEON::BI__builtin_neon_vcgtzd_s64:
2394 case NEON::BI__builtin_neon_vcgtzd_f64:
2395 case NEON::BI__builtin_neon_vcgtzs_f32:
2396 case NEON::BI__builtin_neon_vcgtzh_f16:
2397 case NEON::BI__builtin_neon_vcltzd_s64:
2398 case NEON::BI__builtin_neon_vcltzd_f64:
2399 case NEON::BI__builtin_neon_vcltzs_f32:
2400 case NEON::BI__builtin_neon_vcltzh_f16:
2401 case NEON::BI__builtin_neon_vceqzd_u64: {
2403 *
this, builder, loc, ops[0],
2406 case NEON::BI__builtin_neon_vceqd_f64:
2407 case NEON::BI__builtin_neon_vcled_f64:
2408 case NEON::BI__builtin_neon_vcltd_f64:
2409 case NEON::BI__builtin_neon_vcged_f64:
2410 case NEON::BI__builtin_neon_vcgtd_f64:
2411 case NEON::BI__builtin_neon_vceqs_f32:
2412 case NEON::BI__builtin_neon_vcles_f32:
2413 case NEON::BI__builtin_neon_vclts_f32:
2414 case NEON::BI__builtin_neon_vcges_f32:
2415 case NEON::BI__builtin_neon_vcgts_f32:
2416 case NEON::BI__builtin_neon_vceqh_f16:
2417 case NEON::BI__builtin_neon_vcleh_f16:
2418 case NEON::BI__builtin_neon_vclth_f16:
2419 case NEON::BI__builtin_neon_vcgeh_f16:
2420 case NEON::BI__builtin_neon_vcgth_f16:
2421 case NEON::BI__builtin_neon_vceqd_s64:
2422 case NEON::BI__builtin_neon_vceqd_u64:
2423 case NEON::BI__builtin_neon_vcgtd_s64:
2424 case NEON::BI__builtin_neon_vcgtd_u64:
2425 case NEON::BI__builtin_neon_vcltd_s64:
2426 case NEON::BI__builtin_neon_vcltd_u64:
2427 case NEON::BI__builtin_neon_vcged_u64:
2428 case NEON::BI__builtin_neon_vcged_s64:
2429 case NEON::BI__builtin_neon_vcled_u64:
2430 case NEON::BI__builtin_neon_vcled_s64:
2431 cgm.errorNYI(
expr->getSourceRange(),
2432 std::string(
"unimplemented AArch64 builtin call: ") +
2433 getContext().BuiltinInfo.getName(builtinID));
2434 return mlir::Value{};
2435 case NEON::BI__builtin_neon_vnegd_s64: {
2436 return builder.createNeg(ops[0]);
2438 case NEON::BI__builtin_neon_vnegh_f16: {
2439 return builder.createFNeg(ops[0]);
2441 case NEON::BI__builtin_neon_vtstd_s64:
2442 case NEON::BI__builtin_neon_vtstd_u64:
2443 case NEON::BI__builtin_neon_vset_lane_i8:
2444 case NEON::BI__builtin_neon_vset_lane_i16:
2445 case NEON::BI__builtin_neon_vset_lane_i32:
2446 case NEON::BI__builtin_neon_vset_lane_i64:
2447 case NEON::BI__builtin_neon_vset_lane_bf16:
2448 case NEON::BI__builtin_neon_vset_lane_f32:
2449 case NEON::BI__builtin_neon_vsetq_lane_i8:
2450 case NEON::BI__builtin_neon_vsetq_lane_i16:
2451 case NEON::BI__builtin_neon_vsetq_lane_i32:
2452 case NEON::BI__builtin_neon_vsetq_lane_i64:
2453 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2454 case NEON::BI__builtin_neon_vsetq_lane_f32:
2455 case NEON::BI__builtin_neon_vset_lane_f64:
2456 case NEON::BI__builtin_neon_vset_lane_mf8:
2457 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2458 case NEON::BI__builtin_neon_vsetq_lane_f64:
2459 cgm.errorNYI(
expr->getSourceRange(),
2460 std::string(
"unimplemented AArch64 builtin call: ") +
2461 getContext().BuiltinInfo.getName(builtinID));
2462 return mlir::Value{};
2464 case NEON::BI__builtin_neon_vget_lane_i8:
2465 case NEON::BI__builtin_neon_vdupb_lane_i8:
2466 case NEON::BI__builtin_neon_vgetq_lane_i8:
2467 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2468 case NEON::BI__builtin_neon_vget_lane_mf8:
2469 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2470 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2471 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2472 case NEON::BI__builtin_neon_vget_lane_i16:
2473 case NEON::BI__builtin_neon_vduph_lane_i16:
2474 case NEON::BI__builtin_neon_vgetq_lane_i16:
2475 case NEON::BI__builtin_neon_vduph_laneq_i16:
2476 case NEON::BI__builtin_neon_vget_lane_i32:
2477 case NEON::BI__builtin_neon_vdups_lane_i32:
2478 case NEON::BI__builtin_neon_vdups_lane_f32:
2479 case NEON::BI__builtin_neon_vgetq_lane_i32:
2480 case NEON::BI__builtin_neon_vdups_laneq_i32:
2481 case NEON::BI__builtin_neon_vget_lane_i64:
2482 case NEON::BI__builtin_neon_vdupd_lane_i64:
2483 case NEON::BI__builtin_neon_vdupd_lane_f64:
2484 case NEON::BI__builtin_neon_vgetq_lane_i64:
2485 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2486 case NEON::BI__builtin_neon_vget_lane_f32:
2487 case NEON::BI__builtin_neon_vget_lane_f64:
2488 case NEON::BI__builtin_neon_vgetq_lane_f32:
2489 case NEON::BI__builtin_neon_vdups_laneq_f32:
2490 case NEON::BI__builtin_neon_vgetq_lane_f64:
2491 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2492 return cir::VecExtractOp::create(builder, loc, ops[0],
2494 case NEON::BI__builtin_neon_vaddh_f16:
2495 return builder.createFAdd(loc, ops[0], ops[1]);
2496 case NEON::BI__builtin_neon_vsubh_f16:
2497 return builder.createFSub(loc, ops[0], ops[1]);
2498 case NEON::BI__builtin_neon_vmulh_f16:
2499 return builder.createFMul(loc, ops[0], ops[1]);
2500 case NEON::BI__builtin_neon_vdivh_f16:
2501 return builder.createFDiv(loc, ops[0], ops[1]);
2502 case NEON::BI__builtin_neon_vfmah_f16:
2504 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2508 case NEON::BI__builtin_neon_vfmsh_f16:
2510 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2511 ops[0] = builder.createFNeg(ops[0]);
2514 case NEON::BI__builtin_neon_vaddd_s64:
2515 case NEON::BI__builtin_neon_vaddd_u64:
2516 case NEON::BI__builtin_neon_vsubd_s64:
2517 case NEON::BI__builtin_neon_vsubd_u64:
2518 case NEON::BI__builtin_neon_vqdmlalh_s16:
2519 case NEON::BI__builtin_neon_vqdmlslh_s16:
2520 cgm.errorNYI(
expr->getSourceRange(),
2521 std::string(
"unimplemented AArch64 builtin call: ") +
2522 getContext().BuiltinInfo.getName(builtinID));
2523 return mlir::Value{};
2524 case NEON::BI__builtin_neon_vqshlud_n_s64: {
2525 cir::IntType int64Type = builder.getSInt64Ty();
2531 case NEON::BI__builtin_neon_vqshld_n_u64:
2532 case NEON::BI__builtin_neon_vqshld_n_s64: {
2533 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2534 ? builder.getUInt64Ty()
2535 : builder.getSInt64Ty();
2536 llvm::StringRef intrinsicName =
2537 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
2538 :
"aarch64.neon.sqshl";
2543 case NEON::BI__builtin_neon_vrshrd_n_u64:
2544 case NEON::BI__builtin_neon_vrshrd_n_s64: {
2545 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
2546 ?
"aarch64.neon.srshl"
2547 :
"aarch64.neon.urshl";
2548 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2549 ? builder.getUInt64Ty()
2550 : builder.getSInt64Ty();
2554 ops[1] = builder.getSInt64(sv, loc);
2555 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
2556 intrName, int64Ty, loc);
2558 case NEON::BI__builtin_neon_vrsrad_n_u64:
2559 case NEON::BI__builtin_neon_vrsrad_n_s64: {
2560 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2561 ? builder.getUInt64Ty()
2562 : builder.getSInt64Ty();
2563 ops[2] = builder.createNeg(ops[2]);
2564 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2565 ?
"aarch64.neon.urshl"
2566 :
"aarch64.neon.srshl";
2569 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
2570 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
2571 return builder.createAdd(loc, ops[0],
2572 builder.createBitcast(ops[1], int64Type));
2574 case NEON::BI__builtin_neon_vshld_n_s64:
2575 case NEON::BI__builtin_neon_vshld_n_u64: {
2577 std::optional<llvm::APSInt> amt =
2579 assert(amt &&
"Expected argument to be a constant");
2580 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
2582 case NEON::BI__builtin_neon_vshrd_n_s64: {
2583 std::optional<llvm::APSInt> amt =
2585 assert(amt &&
"Expected argument to be a constant");
2586 return builder.createShiftRight(
2587 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
2589 case NEON::BI__builtin_neon_vshrd_n_u64: {
2590 std::optional<llvm::APSInt> amt =
2592 assert(amt &&
"Expected argument to be a constant");
2593 uint64_t shiftAmt = amt->getZExtValue();
2596 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
2597 return builder.createShiftRight(loc, ops[0], shiftAmt);
2599 case NEON::BI__builtin_neon_vsrad_n_s64:
2600 case NEON::BI__builtin_neon_vsrad_n_u64:
2601 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
2602 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
2603 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
2604 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
2605 case NEON::BI__builtin_neon_vqdmlals_s32:
2606 case NEON::BI__builtin_neon_vqdmlsls_s32:
2607 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
2608 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
2609 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
2610 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
2611 cgm.errorNYI(
expr->getSourceRange(),
2612 std::string(
"unimplemented AArch64 builtin call: ") +
2613 getContext().BuiltinInfo.getName(builtinID));
2614 return mlir::Value{};
2616 case NEON::BI__builtin_neon_vget_lane_bf16:
2617 case NEON::BI__builtin_neon_vduph_lane_bf16:
2618 case NEON::BI__builtin_neon_vduph_lane_f16:
2619 case NEON::BI__builtin_neon_vgetq_lane_bf16:
2620 case NEON::BI__builtin_neon_vduph_laneq_bf16:
2621 case NEON::BI__builtin_neon_vduph_laneq_f16: {
2622 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
2624 case NEON::BI__builtin_neon_vcvt_bf16_f32:
2625 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
2626 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
2627 case clang::AArch64::BI_InterlockedAdd:
2628 case clang::AArch64::BI_InterlockedAdd_acq:
2629 case clang::AArch64::BI_InterlockedAdd_rel:
2630 case clang::AArch64::BI_InterlockedAdd_nf:
2631 case clang::AArch64::BI_InterlockedAdd64:
2632 case clang::AArch64::BI_InterlockedAdd64_acq:
2633 case clang::AArch64::BI_InterlockedAdd64_rel:
2634 case clang::AArch64::BI_InterlockedAdd64_nf:
2635 cgm.errorNYI(
expr->getSourceRange(),
2636 std::string(
"unimplemented AArch64 builtin call: ") +
2637 getContext().BuiltinInfo.getName(builtinID));
2638 return mlir::Value{};
2645 llvm::StringRef intrName;
2647 switch (builtinID) {
2649 return std::nullopt;
2650 case NEON::BI__builtin_neon_vbsl_v:
2651 case NEON::BI__builtin_neon_vbslq_v: {
2654 ops[0] = builder.createBitcast(ops[0], bitTy);
2655 ops[1] = builder.createBitcast(ops[1], bitTy);
2656 ops[2] = builder.createBitcast(ops[2], bitTy);
2658 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
2659 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
2660 ops[0] = builder.createOr(loc, ops[1], ops[2]);
2661 return builder.createBitcast(ops[0], ty);
2663 case NEON::BI__builtin_neon_vfma_lane_v:
2664 case NEON::BI__builtin_neon_vfmaq_lane_v:
2665 case NEON::BI__builtin_neon_vfma_laneq_v:
2666 case NEON::BI__builtin_neon_vfmaq_laneq_v:
2667 case NEON::BI__builtin_neon_vfmah_lane_f16:
2668 case NEON::BI__builtin_neon_vfmas_lane_f32:
2669 case NEON::BI__builtin_neon_vfmah_laneq_f16:
2670 case NEON::BI__builtin_neon_vfmas_laneq_f32:
2671 case NEON::BI__builtin_neon_vfmad_lane_f64:
2672 case NEON::BI__builtin_neon_vfmad_laneq_f64:
2673 cgm.errorNYI(
expr->getSourceRange(),
2674 std::string(
"unimplemented AArch64 builtin call: ") +
2675 getContext().BuiltinInfo.getName(builtinID));
2676 return mlir::Value{};
2677 case NEON::BI__builtin_neon_vmull_v: {
2678 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
2680 intrName =
"aarch64.neon.pmull";
2681 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2683 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
2685 case NEON::BI__builtin_neon_vmax_v:
2686 case NEON::BI__builtin_neon_vmaxq_v:
2687 intrName = usgn ?
"aarch64.neon.umax" :
"aarch64.neon.smax";
2688 if (cir::isFPOrVectorOfFPType(ty))
2689 intrName =
"aarch64.neon.fmax";
2691 case NEON::BI__builtin_neon_vmaxh_f16:
2692 cgm.errorNYI(
expr->getSourceRange(),
2693 std::string(
"unimplemented AArch64 builtin call: ") +
2694 getContext().BuiltinInfo.getName(builtinID));
2695 return mlir::Value{};
2696 case NEON::BI__builtin_neon_vmin_v:
2697 case NEON::BI__builtin_neon_vminq_v:
2698 intrName = usgn ?
"aarch64.neon.umin" :
"aarch64.neon.smin";
2699 if (cir::isFPOrVectorOfFPType(ty))
2700 intrName =
"aarch64.neon.fmin";
2702 case NEON::BI__builtin_neon_vminh_f16:
2703 cgm.errorNYI(
expr->getSourceRange(),
2704 std::string(
"unimplemented AArch64 builtin call: ") +
2705 getContext().BuiltinInfo.getName(builtinID));
2706 return mlir::Value{};
2707 case NEON::BI__builtin_neon_vabd_v:
2708 case NEON::BI__builtin_neon_vabdq_v:
2709 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
2710 if (cir::isFPOrVectorOfFPType(ty))
2711 intrName =
"aarch64.neon.fabd";
2713 case NEON::BI__builtin_neon_vpadal_v:
2714 case NEON::BI__builtin_neon_vpadalq_v: {
2715 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
2717 mlir::Value pairwiseSum =
2719 inputs, intrName, ty, loc);
2720 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
2721 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
2723 case NEON::BI__builtin_neon_vpmin_v:
2724 case NEON::BI__builtin_neon_vpminq_v:
2725 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
2726 if (cir::isFPOrVectorOfFPType(ty))
2727 intrName =
"aarch64.neon.fminp";
2729 case NEON::BI__builtin_neon_vpmax_v:
2730 case NEON::BI__builtin_neon_vpmaxq_v:
2731 cgm.errorNYI(
expr->getSourceRange(),
2732 std::string(
"unimplemented AArch64 builtin call: ") +
2733 getContext().BuiltinInfo.getName(builtinID));
2734 return mlir::Value{};
2735 case NEON::BI__builtin_neon_vminnm_v:
2736 case NEON::BI__builtin_neon_vminnmq_v:
2737 intrName =
"aarch64.neon.fminnm";
2739 case NEON::BI__builtin_neon_vminnmh_f16:
2740 cgm.errorNYI(
expr->getSourceRange(),
2741 std::string(
"unimplemented AArch64 builtin call: ") +
2742 getContext().BuiltinInfo.getName(builtinID));
2743 return mlir::Value{};
2744 case NEON::BI__builtin_neon_vmaxnm_v:
2745 case NEON::BI__builtin_neon_vmaxnmq_v:
2746 intrName =
"aarch64.neon.fmaxnm";
2748 case NEON::BI__builtin_neon_vmaxnmh_f16:
2749 case NEON::BI__builtin_neon_vrecpss_f32:
2750 case NEON::BI__builtin_neon_vrecpsd_f64:
2751 case NEON::BI__builtin_neon_vrecpsh_f16:
2752 case NEON::BI__builtin_neon_vqshrun_n_v:
2753 cgm.errorNYI(
expr->getSourceRange(),
2754 std::string(
"unimplemented AArch64 builtin call: ") +
2755 getContext().BuiltinInfo.getName(builtinID));
2756 return mlir::Value{};
2757 case NEON::BI__builtin_neon_vqrshrun_n_v: {
2758 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2761 "aarch64.neon.sqrshrun", ty, loc);
2763 case NEON::BI__builtin_neon_vqshrn_n_v:
2764 cgm.errorNYI(
expr->getSourceRange(),
2765 std::string(
"unimplemented AArch64 builtin call: ") +
2766 getContext().BuiltinInfo.getName(builtinID));
2767 return mlir::Value{};
2768 case NEON::BI__builtin_neon_vrshrn_n_v:
2769 cgm.errorNYI(
expr->getSourceRange(),
2770 std::string(
"unimplemented AArch64 builtin call: ") +
2771 getContext().BuiltinInfo.getName(builtinID));
2772 return mlir::Value{};
2773 case NEON::BI__builtin_neon_vqrshrn_n_v: {
2774 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
2776 llvm::StringRef intrName =
2777 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
2781 case NEON::BI__builtin_neon_vrndah_f16:
2782 case NEON::BI__builtin_neon_vrnda_v:
2783 case NEON::BI__builtin_neon_vrndaq_v:
2784 case NEON::BI__builtin_neon_vrndih_f16:
2785 case NEON::BI__builtin_neon_vrndmh_f16:
2786 case NEON::BI__builtin_neon_vrndm_v:
2787 case NEON::BI__builtin_neon_vrndmq_v:
2788 case NEON::BI__builtin_neon_vrndnh_f16:
2789 case NEON::BI__builtin_neon_vrndn_v:
2790 case NEON::BI__builtin_neon_vrndnq_v:
2791 case NEON::BI__builtin_neon_vrndns_f32:
2792 case NEON::BI__builtin_neon_vrndph_f16:
2793 case NEON::BI__builtin_neon_vrndp_v:
2794 case NEON::BI__builtin_neon_vrndpq_v:
2795 case NEON::BI__builtin_neon_vrndxh_f16:
2796 case NEON::BI__builtin_neon_vrndx_v:
2797 case NEON::BI__builtin_neon_vrndxq_v:
2798 case NEON::BI__builtin_neon_vrndh_f16:
2799 case NEON::BI__builtin_neon_vrnd32x_f32:
2800 case NEON::BI__builtin_neon_vrnd32xq_f32:
2801 case NEON::BI__builtin_neon_vrnd32x_f64:
2802 case NEON::BI__builtin_neon_vrnd32xq_f64:
2803 case NEON::BI__builtin_neon_vrnd32z_f32:
2804 case NEON::BI__builtin_neon_vrnd32zq_f32:
2805 case NEON::BI__builtin_neon_vrnd32z_f64:
2806 case NEON::BI__builtin_neon_vrnd32zq_f64:
2807 case NEON::BI__builtin_neon_vrnd64x_f32:
2808 case NEON::BI__builtin_neon_vrnd64xq_f32:
2809 case NEON::BI__builtin_neon_vrnd64x_f64:
2810 case NEON::BI__builtin_neon_vrnd64xq_f64:
2811 case NEON::BI__builtin_neon_vrnd64z_f32:
2812 case NEON::BI__builtin_neon_vrnd64zq_f32:
2813 case NEON::BI__builtin_neon_vrnd64z_f64:
2814 case NEON::BI__builtin_neon_vrnd64zq_f64:
2815 case NEON::BI__builtin_neon_vrnd_v:
2816 case NEON::BI__builtin_neon_vrndq_v:
2817 cgm.errorNYI(
expr->getSourceRange(),
2818 std::string(
"unimplemented AArch64 builtin call: ") +
2819 getContext().BuiltinInfo.getName(builtinID));
2820 return mlir::Value{};
2821 case NEON::BI__builtin_neon_vcvt_f64_v:
2822 case NEON::BI__builtin_neon_vcvtq_f64_v:
2823 ops[0] = builder.createBitcast(ops[0], ty);
2826 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
2827 case NEON::BI__builtin_neon_vcvt_f64_f32:
2828 case NEON::BI__builtin_neon_vcvt_f32_f64:
2829 case NEON::BI__builtin_neon_vcvt_s32_v:
2830 case NEON::BI__builtin_neon_vcvt_u32_v:
2831 case NEON::BI__builtin_neon_vcvt_s64_v:
2832 case NEON::BI__builtin_neon_vcvt_u64_v:
2833 case NEON::BI__builtin_neon_vcvt_s16_f16:
2834 case NEON::BI__builtin_neon_vcvt_u16_f16:
2835 case NEON::BI__builtin_neon_vcvtq_s32_v:
2836 case NEON::BI__builtin_neon_vcvtq_u32_v:
2837 case NEON::BI__builtin_neon_vcvtq_s64_v:
2838 case NEON::BI__builtin_neon_vcvtq_u64_v:
2839 case NEON::BI__builtin_neon_vcvtq_s16_f16:
2840 case NEON::BI__builtin_neon_vcvtq_u16_f16:
2841 case NEON::BI__builtin_neon_vcvta_s16_f16:
2842 case NEON::BI__builtin_neon_vcvta_u16_f16:
2843 case NEON::BI__builtin_neon_vcvta_s32_v:
2844 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
2845 case NEON::BI__builtin_neon_vcvtaq_s32_v:
2846 case NEON::BI__builtin_neon_vcvta_u32_v:
2847 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
2848 case NEON::BI__builtin_neon_vcvtaq_u32_v:
2849 case NEON::BI__builtin_neon_vcvta_s64_v:
2850 case NEON::BI__builtin_neon_vcvtaq_s64_v:
2851 case NEON::BI__builtin_neon_vcvta_u64_v:
2852 case NEON::BI__builtin_neon_vcvtaq_u64_v:
2853 case NEON::BI__builtin_neon_vcvtm_s16_f16:
2854 case NEON::BI__builtin_neon_vcvtm_s32_v:
2855 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
2856 case NEON::BI__builtin_neon_vcvtmq_s32_v:
2857 case NEON::BI__builtin_neon_vcvtm_u16_f16:
2858 case NEON::BI__builtin_neon_vcvtm_u32_v:
2859 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
2860 case NEON::BI__builtin_neon_vcvtmq_u32_v:
2861 case NEON::BI__builtin_neon_vcvtm_s64_v:
2862 case NEON::BI__builtin_neon_vcvtmq_s64_v:
2863 case NEON::BI__builtin_neon_vcvtm_u64_v:
2864 case NEON::BI__builtin_neon_vcvtmq_u64_v:
2865 case NEON::BI__builtin_neon_vcvtn_s16_f16:
2866 case NEON::BI__builtin_neon_vcvtn_s32_v:
2867 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
2868 case NEON::BI__builtin_neon_vcvtnq_s32_v:
2869 case NEON::BI__builtin_neon_vcvtn_u16_f16:
2870 case NEON::BI__builtin_neon_vcvtn_u32_v:
2871 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
2872 case NEON::BI__builtin_neon_vcvtnq_u32_v:
2873 case NEON::BI__builtin_neon_vcvtn_s64_v:
2874 case NEON::BI__builtin_neon_vcvtnq_s64_v:
2875 case NEON::BI__builtin_neon_vcvtn_u64_v:
2876 case NEON::BI__builtin_neon_vcvtnq_u64_v:
2877 case NEON::BI__builtin_neon_vcvtp_s16_f16:
2878 case NEON::BI__builtin_neon_vcvtp_s32_v:
2879 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
2880 case NEON::BI__builtin_neon_vcvtpq_s32_v:
2881 case NEON::BI__builtin_neon_vcvtp_u16_f16:
2882 case NEON::BI__builtin_neon_vcvtp_u32_v:
2883 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
2884 case NEON::BI__builtin_neon_vcvtpq_u32_v:
2885 case NEON::BI__builtin_neon_vcvtp_s64_v:
2886 case NEON::BI__builtin_neon_vcvtpq_s64_v:
2887 case NEON::BI__builtin_neon_vcvtp_u64_v:
2888 case NEON::BI__builtin_neon_vcvtpq_u64_v:
2889 case NEON::BI__builtin_neon_vmulx_v:
2890 case NEON::BI__builtin_neon_vmulxq_v:
2891 case NEON::BI__builtin_neon_vmulxh_lane_f16:
2892 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
2893 case NEON::BI__builtin_neon_vmul_lane_v:
2894 case NEON::BI__builtin_neon_vmul_laneq_v:
2895 case NEON::BI__builtin_neon_vpmaxnm_v:
2896 case NEON::BI__builtin_neon_vpmaxnmq_v:
2897 cgm.errorNYI(
expr->getSourceRange(),
2898 std::string(
"unimplemented AArch64 builtin call: ") +
2899 getContext().BuiltinInfo.getName(builtinID));
2900 return mlir::Value{};
2901 case NEON::BI__builtin_neon_vpminnm_v:
2902 case NEON::BI__builtin_neon_vpminnmq_v:
2903 intrName =
"aarch64.neon.fminnmp";
2905 case NEON::BI__builtin_neon_vsqrth_f16:
2906 cgm.errorNYI(
expr->getSourceRange(),
2907 std::string(
"unimplemented AArch64 builtin call: ") +
2908 getContext().BuiltinInfo.getName(builtinID));
2909 return mlir::Value{};
2910 case NEON::BI__builtin_neon_vsqrt_v:
2911 case NEON::BI__builtin_neon_vsqrtq_v:
2914 case NEON::BI__builtin_neon_vrbit_v:
2915 case NEON::BI__builtin_neon_vrbitq_v:
2916 case NEON::BI__builtin_neon_vmaxv_f16:
2917 case NEON::BI__builtin_neon_vmaxvq_f16:
2918 case NEON::BI__builtin_neon_vminv_f16:
2919 case NEON::BI__builtin_neon_vminvq_f16:
2920 case NEON::BI__builtin_neon_vmaxnmv_f16:
2921 case NEON::BI__builtin_neon_vmaxnmvq_f16:
2922 case NEON::BI__builtin_neon_vminnmv_f16:
2923 case NEON::BI__builtin_neon_vminnmvq_f16:
2924 case NEON::BI__builtin_neon_vmul_n_f64:
2925 cgm.errorNYI(
expr->getSourceRange(),
2926 std::string(
"unimplemented AArch64 builtin call: ") +
2927 getContext().BuiltinInfo.getName(builtinID));
2928 return mlir::Value{};
2929 case NEON::BI__builtin_neon_vaddlv_u8:
2930 case NEON::BI__builtin_neon_vaddlvq_u8:
2931 case NEON::BI__builtin_neon_vaddlv_u16:
2932 case NEON::BI__builtin_neon_vaddlvq_u16:
2933 case NEON::BI__builtin_neon_vaddlv_s8:
2934 case NEON::BI__builtin_neon_vaddlvq_s8:
2935 case NEON::BI__builtin_neon_vaddlv_s16:
2936 case NEON::BI__builtin_neon_vaddlvq_s16: {
2939 auto eltTy = mlir::cast<cir::IntType>(
2940 mlir::cast<cir::VectorType>(argTy).getElementType());
2945 bool needsTrunc = eltTy.getWidth() == 8;
2946 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
2947 mlir::Type intrRetTy = userRetTy;
2949 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
2950 mlir::Value result =
2953 result = builder.createIntCast(result, userRetTy);
2956 case NEON::BI__builtin_neon_vsri_n_v:
2957 case NEON::BI__builtin_neon_vsriq_n_v: {
2959 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
2960 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
2961 "aarch64.neon.vsri", ty, loc);
2963 case NEON::BI__builtin_neon_vsli_n_v:
2964 case NEON::BI__builtin_neon_vsliq_n_v: {
2966 intrName =
"aarch64.neon.vsli";
2974 case NEON::BI__builtin_neon_vsra_n_v:
2975 case NEON::BI__builtin_neon_vsraq_n_v:
2976 cgm.errorNYI(
expr->getSourceRange(),
2977 std::string(
"unimplemented AArch64 builtin call: ") +
2978 getContext().BuiltinInfo.getName(builtinID));
2979 return mlir::Value{};
2980 case NEON::BI__builtin_neon_vrsra_n_v:
2981 case NEON::BI__builtin_neon_vrsraq_n_v: {
2982 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
2985 cir::VectorType shiftAmtVecTy =
2988 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
2992 ops[0] = builder.createBitcast(ops[0], ty);
2993 return builder.createAdd(loc, ops[0], tmp);
2995 case NEON::BI__builtin_neon_vld1_v:
2996 case NEON::BI__builtin_neon_vld1q_v:
2997 case NEON::BI__builtin_neon_vst1_v:
2998 case NEON::BI__builtin_neon_vst1q_v:
2999 case NEON::BI__builtin_neon_vld1_lane_v:
3000 case NEON::BI__builtin_neon_vld1q_lane_v:
3001 case NEON::BI__builtin_neon_vldap1_lane_s64:
3002 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3003 case NEON::BI__builtin_neon_vld1_dup_v:
3004 case NEON::BI__builtin_neon_vld1q_dup_v:
3005 case NEON::BI__builtin_neon_vst1_lane_v:
3006 case NEON::BI__builtin_neon_vst1q_lane_v:
3007 case NEON::BI__builtin_neon_vstl1_lane_s64:
3008 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3009 case NEON::BI__builtin_neon_vld2_v:
3010 case NEON::BI__builtin_neon_vld2q_v:
3011 case NEON::BI__builtin_neon_vld3_v:
3012 case NEON::BI__builtin_neon_vld3q_v:
3013 case NEON::BI__builtin_neon_vld4_v:
3014 case NEON::BI__builtin_neon_vld4q_v:
3015 case NEON::BI__builtin_neon_vld2_dup_v:
3016 case NEON::BI__builtin_neon_vld2q_dup_v:
3017 case NEON::BI__builtin_neon_vld3_dup_v:
3018 case NEON::BI__builtin_neon_vld3q_dup_v:
3019 case NEON::BI__builtin_neon_vld4_dup_v:
3020 case NEON::BI__builtin_neon_vld4q_dup_v:
3021 case NEON::BI__builtin_neon_vld2_lane_v:
3022 case NEON::BI__builtin_neon_vld2q_lane_v:
3023 case NEON::BI__builtin_neon_vld3_lane_v:
3024 case NEON::BI__builtin_neon_vld3q_lane_v:
3025 case NEON::BI__builtin_neon_vld4_lane_v:
3026 case NEON::BI__builtin_neon_vld4q_lane_v:
3027 case NEON::BI__builtin_neon_vst2_v:
3028 case NEON::BI__builtin_neon_vst2q_v:
3029 case NEON::BI__builtin_neon_vst2_lane_v:
3030 case NEON::BI__builtin_neon_vst2q_lane_v:
3031 case NEON::BI__builtin_neon_vst3_v:
3032 case NEON::BI__builtin_neon_vst3q_v:
3033 case NEON::BI__builtin_neon_vst3_lane_v:
3034 case NEON::BI__builtin_neon_vst3q_lane_v:
3035 case NEON::BI__builtin_neon_vst4_v:
3036 case NEON::BI__builtin_neon_vst4q_v:
3037 case NEON::BI__builtin_neon_vst4_lane_v:
3038 case NEON::BI__builtin_neon_vst4q_lane_v:
3039 cgm.errorNYI(
expr->getSourceRange(),
3040 std::string(
"unimplemented AArch64 builtin call: ") +
3041 getContext().BuiltinInfo.getName(builtinID));
3042 return mlir::Value{};
3043 case NEON::BI__builtin_neon_vtrn_v:
3044 case NEON::BI__builtin_neon_vtrnq_v: {
3045 ops[1] = builder.createBitcast(ops[1], ty);
3046 ops[2] = builder.createBitcast(ops[2], ty);
3048 mlir::Value baseAddr =
3049 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3052 for (
unsigned vi = 0; vi != 2; ++vi) {
3054 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3055 indices.push_back(i + vi);
3056 indices.push_back(i + e + vi);
3058 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3059 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3060 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3061 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3065 case NEON::BI__builtin_neon_vuzp_v:
3066 case NEON::BI__builtin_neon_vuzpq_v: {
3067 ops[1] = builder.createBitcast(ops[1], ty);
3068 ops[2] = builder.createBitcast(ops[2], ty);
3070 mlir::Value baseAddr =
3071 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3073 for (
unsigned vi = 0; vi != 2; ++vi) {
3075 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3076 indices.push_back(2 * i + vi);
3078 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3079 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3080 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3081 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3085 case NEON::BI__builtin_neon_vzip_v:
3086 case NEON::BI__builtin_neon_vzipq_v: {
3087 ops[1] = builder.createBitcast(ops[1], ty);
3088 ops[2] = builder.createBitcast(ops[2], ty);
3090 mlir::Value baseAddr =
3091 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3093 for (
unsigned vi = 0; vi != 2; ++vi) {
3095 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3096 indices.push_back((i + vi * e) >> 1);
3097 indices.push_back(((i + vi * e) >> 1) + e);
3099 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3100 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3101 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3102 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3106 case NEON::BI__builtin_neon_vqtbl1q_v:
3107 case NEON::BI__builtin_neon_vqtbl2q_v:
3108 case NEON::BI__builtin_neon_vqtbl3q_v:
3109 case NEON::BI__builtin_neon_vqtbl4q_v:
3110 case NEON::BI__builtin_neon_vqtbx1q_v:
3111 case NEON::BI__builtin_neon_vqtbx2q_v:
3112 case NEON::BI__builtin_neon_vqtbx3q_v:
3113 case NEON::BI__builtin_neon_vqtbx4q_v:
3114 case NEON::BI__builtin_neon_vsqadd_v:
3115 case NEON::BI__builtin_neon_vsqaddq_v:
3116 case NEON::BI__builtin_neon_vuqadd_v:
3117 case NEON::BI__builtin_neon_vuqaddq_v:
3118 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3119 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3120 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3121 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3122 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3123 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3124 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3125 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3126 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3127 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3128 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3129 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3130 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3131 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3132 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3133 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3134 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3135 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3136 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3137 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3138 case NEON::BI__builtin_neon_vluti2_lane_f16:
3139 case NEON::BI__builtin_neon_vluti2_lane_p16:
3140 case NEON::BI__builtin_neon_vluti2_lane_p8:
3141 case NEON::BI__builtin_neon_vluti2_lane_s16:
3142 case NEON::BI__builtin_neon_vluti2_lane_s8:
3143 case NEON::BI__builtin_neon_vluti2_lane_u16:
3144 case NEON::BI__builtin_neon_vluti2_lane_u8:
3145 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3146 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3147 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3148 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3149 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3150 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3151 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3152 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3153 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3154 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3155 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3156 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3157 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3158 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3159 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3160 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3161 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3162 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3163 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3164 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3165 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3166 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3167 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3168 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3169 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3170 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3171 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3172 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3173 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3174 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3175 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3176 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3177 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3178 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3179 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3180 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3181 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3182 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3183 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3184 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3185 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3186 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3187 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3188 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3189 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3190 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3191 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3192 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3193 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3194 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3195 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3196 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
3197 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
3198 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
3199 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
3200 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
3201 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
3202 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
3203 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
3204 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
3205 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
3206 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
3207 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
3208 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
3209 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
3210 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
3211 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
3212 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
3213 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
3214 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
3215 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
3216 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
3217 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
3218 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
3219 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
3220 case NEON::BI__builtin_neon_vamin_f16:
3221 case NEON::BI__builtin_neon_vaminq_f16:
3222 case NEON::BI__builtin_neon_vamin_f32:
3223 case NEON::BI__builtin_neon_vaminq_f32:
3224 case NEON::BI__builtin_neon_vaminq_f64:
3225 case NEON::BI__builtin_neon_vamax_f16:
3226 case NEON::BI__builtin_neon_vamaxq_f16:
3227 case NEON::BI__builtin_neon_vamax_f32:
3228 case NEON::BI__builtin_neon_vamaxq_f32:
3229 case NEON::BI__builtin_neon_vamaxq_f64:
3230 case NEON::BI__builtin_neon_vscale_f16:
3231 case NEON::BI__builtin_neon_vscaleq_f16:
3232 case NEON::BI__builtin_neon_vscale_f32:
3233 case NEON::BI__builtin_neon_vscaleq_f32:
3234 case NEON::BI__builtin_neon_vscaleq_f64:
3235 cgm.errorNYI(
expr->getSourceRange(),
3236 std::string(
"unimplemented AArch64 builtin call: ") +
3237 getContext().BuiltinInfo.getName(builtinID));
3238 return mlir::Value{};