summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMatthias Braun <matze@braunis.de>2018-09-19 20:50:51 +0000
committerMatthias Braun <matze@braunis.de>2018-09-19 20:50:51 +0000
commit28d6a4ac9a91a6f17bfa5e900bd73b829bb00585 (patch)
treea1baea5fa8b592bd8d21408ea2dc59cb0143dae7 /llvm/lib
parent3136e4203920322143dd7b8f423fb8776dcb506b (diff)
downloadbcm5719-llvm-28d6a4ac9a91a6f17bfa5e900bd73b829bb00585.tar.gz
bcm5719-llvm-28d6a4ac9a91a6f17bfa5e900bd73b829bb00585.zip
AArch64: Add FuseCryptoEOR fusion rules
There's some additional rules available on newer apple CPUs. rdar://41235346 llvm-svn: 342590
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/AArch64/AArch64.td5
-rw-r--r--llvm/lib/Target/AArch64/AArch64MacroFusion.cpp20
-rw-r--r--llvm/lib/Target/AArch64/AArch64Subtarget.h2
3 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64.td b/llvm/lib/Target/AArch64/AArch64.td
index f0e6889a04e..3931cd51fe9 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -156,6 +156,10 @@ def FeatureFuseAES : SubtargetFeature<
"fuse-aes", "HasFuseAES", "true",
"CPU fuses AES crypto operations">;
+def FeatureFuseCryptoEOR : SubtargetFeature<
+ "fuse-crypto-eor", "HasFuseCryptoEOR", "true",
+ "CPU fuses AES/PMULL and EOR operations">;
+
def FeatureFuseCCSelect : SubtargetFeature<
"fuse-csel", "HasFuseCCSelect", "true",
"CPU fuses conditional select operations">;
@@ -343,6 +347,7 @@ def ProcCyclone : SubtargetFeature<"cyclone", "ARMProcFamily", "Cyclone",
FeatureDisableLatencySchedHeuristic,
FeatureFPARMv8,
FeatureFuseAES,
+ FeatureFuseCryptoEOR,
FeatureNEON,
FeaturePerfMon,
FeatureZCRegMove,
diff --git a/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp b/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp
index 9ec0ad34e92..43ebcfd9893 100644
--- a/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp
+++ b/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp
@@ -123,6 +123,24 @@ static bool isAESPair(unsigned FirstOpcode, unsigned SecondOpcode) {
return false;
}
+/// AESE/AESD/PMULL + EOR.
+static bool isCryptoEORPair(unsigned FirstOpcode, unsigned SecondOpcode) {
+ if (SecondOpcode != AArch64::EORv16i8)
+ return false;
+
+ switch (FirstOpcode) {
+ case AArch64::INSTRUCTION_LIST_END:
+ case AArch64::AESErr:
+ case AArch64::AESDrr:
+ case AArch64::PMULLv16i8:
+ case AArch64::PMULLv8i8:
+ case AArch64::PMULLv1i64:
+ case AArch64::PMULLv2i64:
+ return true;
+ }
+ return false;
+}
+
/// Literal generation.
static bool isLiteralsPair(unsigned FirstOpcode, unsigned SecondOpcode,
const MachineInstr *FirstMI,
@@ -258,6 +276,8 @@ static bool shouldScheduleAdjacent(const TargetInstrInfo &TII,
return true;
if (ST.hasFuseAES() && isAESPair(FirstOpc, SecondOpc))
return true;
+ if (ST.hasFuseCryptoEOR() && isCryptoEORPair(FirstOpc, SecondOpc))
+ return true;
if (ST.hasFuseLiterals() &&
isLiteralsPair(FirstOpc, SecondOpc, FirstMI, SecondMI))
return true;
diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h
index 8ac6903bce3..6086723858c 100644
--- a/llvm/lib/Target/AArch64/AArch64Subtarget.h
+++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h
@@ -123,6 +123,7 @@ protected:
bool HasArithmeticCbzFusion = false;
bool HasFuseAddress = false;
bool HasFuseAES = false;
+ bool HasFuseCryptoEOR = false;
bool HasFuseCCSelect = false;
bool HasFuseLiterals = false;
bool DisableLatencySchedHeuristic = false;
@@ -256,6 +257,7 @@ public:
bool hasArithmeticCbzFusion() const { return HasArithmeticCbzFusion; }
bool hasFuseAddress() const { return HasFuseAddress; }
bool hasFuseAES() const { return HasFuseAES; }
+ bool hasFuseCryptoEOR() const { return HasFuseCryptoEOR; }
bool hasFuseCCSelect() const { return HasFuseCCSelect; }
bool hasFuseLiterals() const { return HasFuseLiterals; }
OpenPOWER on IntegriCloud