@@ -1536,6 +1536,14 @@ bool AArch64LegalizerInfo::legalizeSmallCMGlobalValue(
15361536
15371537bool AArch64LegalizerInfo::legalizeIntrinsic (LegalizerHelper &Helper,
15381538 MachineInstr &MI) const {
1539+ auto LowerBinOp = [&MI](unsigned Opcode) {
1540+ MachineIRBuilder MIB (MI);
1541+ MIB.buildInstr (Opcode, {MI.getOperand (0 )},
1542+ {MI.getOperand (2 ), MI.getOperand (3 )});
1543+ MI.eraseFromParent ();
1544+ return true ;
1545+ };
1546+
15391547 Intrinsic::ID IntrinsicID = cast<GIntrinsic>(MI).getIntrinsicID ();
15401548 switch (IntrinsicID) {
15411549 case Intrinsic::vacopy: {
@@ -1675,37 +1683,25 @@ bool AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
16751683 return true ;
16761684 }
16771685 case Intrinsic::aarch64_neon_smax:
1686+ return LowerBinOp (TargetOpcode::G_SMAX);
16781687 case Intrinsic::aarch64_neon_smin:
1688+ return LowerBinOp (TargetOpcode::G_SMIN);
16791689 case Intrinsic::aarch64_neon_umax:
1690+ return LowerBinOp (TargetOpcode::G_UMAX);
16801691 case Intrinsic::aarch64_neon_umin:
1692+ return LowerBinOp (TargetOpcode::G_UMIN);
16811693 case Intrinsic::aarch64_neon_fmax:
1694+ return LowerBinOp (TargetOpcode::G_FMAXIMUM);
16821695 case Intrinsic::aarch64_neon_fmin:
1696+ return LowerBinOp (TargetOpcode::G_FMINIMUM);
16831697 case Intrinsic::aarch64_neon_fmaxnm:
1684- case Intrinsic::aarch64_neon_fminnm: {
1685- MachineIRBuilder MIB (MI);
1686- if (IntrinsicID == Intrinsic::aarch64_neon_smax)
1687- MIB.buildSMax (MI.getOperand (0 ), MI.getOperand (2 ), MI.getOperand (3 ));
1688- else if (IntrinsicID == Intrinsic::aarch64_neon_smin)
1689- MIB.buildSMin (MI.getOperand (0 ), MI.getOperand (2 ), MI.getOperand (3 ));
1690- else if (IntrinsicID == Intrinsic::aarch64_neon_umax)
1691- MIB.buildUMax (MI.getOperand (0 ), MI.getOperand (2 ), MI.getOperand (3 ));
1692- else if (IntrinsicID == Intrinsic::aarch64_neon_umin)
1693- MIB.buildUMin (MI.getOperand (0 ), MI.getOperand (2 ), MI.getOperand (3 ));
1694- else if (IntrinsicID == Intrinsic::aarch64_neon_fmax)
1695- MIB.buildInstr (TargetOpcode::G_FMAXIMUM, {MI.getOperand (0 )},
1696- {MI.getOperand (2 ), MI.getOperand (3 )});
1697- else if (IntrinsicID == Intrinsic::aarch64_neon_fmin)
1698- MIB.buildInstr (TargetOpcode::G_FMINIMUM, {MI.getOperand (0 )},
1699- {MI.getOperand (2 ), MI.getOperand (3 )});
1700- else if (IntrinsicID == Intrinsic::aarch64_neon_fmaxnm)
1701- MIB.buildInstr (TargetOpcode::G_FMAXNUM, {MI.getOperand (0 )},
1702- {MI.getOperand (2 ), MI.getOperand (3 )});
1703- else if (IntrinsicID == Intrinsic::aarch64_neon_fminnm)
1704- MIB.buildInstr (TargetOpcode::G_FMINNUM, {MI.getOperand (0 )},
1705- {MI.getOperand (2 ), MI.getOperand (3 )});
1706- MI.eraseFromParent ();
1707- return true ;
1708- }
1698+ return LowerBinOp (TargetOpcode::G_FMAXNUM);
1699+ case Intrinsic::aarch64_neon_fminnm:
1700+ return LowerBinOp (TargetOpcode::G_FMINNUM);
1701+ case Intrinsic::aarch64_neon_smull:
1702+ return LowerBinOp (AArch64::G_UMULL);
1703+ case Intrinsic::aarch64_neon_umull:
1704+ return LowerBinOp (AArch64::G_SMULL);
17091705 case Intrinsic::vector_reverse:
17101706 // TODO: Add support for vector_reverse
17111707 return false ;
0 commit comments