Skip to content

Commit 5a5b78a

Browse files
committed
[AArch64][GlobalISel] Lower aarch64.neon.smull/umull intrinsics.
As with other nodes, we can convert these into G_UMULL and G_SMULL aarch64 instructions.
1 parent 6c6351e commit 5a5b78a

File tree

2 files changed

+258
-101
lines changed

2 files changed

+258
-101
lines changed

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,6 +1536,14 @@ bool AArch64LegalizerInfo::legalizeSmallCMGlobalValue(
15361536

15371537
bool 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

Comments
 (0)