diff options
author | Evandro Menezes <e.menezes@samsung.com> | 2017-02-01 02:54:42 +0000 |
---|---|---|
committer | Evandro Menezes <e.menezes@samsung.com> | 2017-02-01 02:54:42 +0000 |
commit | 455382ea220b0d432aec8b7153b6d8384f032000 (patch) | |
tree | 05aeafdd69da2b70844b5abc3d571b0b517424ab /llvm/lib/Target/AArch64/AArch64MacroFusion.cpp | |
parent | b21fb29c26f386be8dd44518d121219db97eda28 (diff) | |
download | bcm5719-llvm-455382ea220b0d432aec8b7153b6d8384f032000.tar.gz bcm5719-llvm-455382ea220b0d432aec8b7153b6d8384f032000.zip |
[AArch64] Add new target feature to fuse literal generation
This feature enables the fusion of such operations on Cortex A57, as
recommended in its Software Optimisation Guide, sections 4.14 and 4.15.
Differential revision: https://reviews.llvm.org/D28698
llvm-svn: 293739
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64MacroFusion.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64MacroFusion.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp b/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp index f6d693262c3..7919b681dcb 100644 --- a/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp +++ b/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp @@ -129,6 +129,31 @@ static bool shouldScheduleAdjacent(const AArch64InstrInfo &TII, SecondOpcode == AArch64::INSTRUCTION_LIST_END; } + if (ST.hasFuseLiterals()) + // Fuse literal generation operations. + switch (FirstOpcode) { + // PC relative address. + case AArch64::ADRP: + return SecondOpcode == AArch64::ADDXri || + SecondOpcode == AArch64::INSTRUCTION_LIST_END; + // 32 bit immediate. + case AArch64::MOVZWi: + return (SecondOpcode == AArch64::MOVKWi && + Second->getOperand(3).getImm() == 16) || + SecondOpcode == AArch64::INSTRUCTION_LIST_END; + // Lower half of 64 bit immediate. + case AArch64::MOVZXi: + return (SecondOpcode == AArch64::MOVKXi && + Second->getOperand(3).getImm() == 16) || + SecondOpcode == AArch64::INSTRUCTION_LIST_END; + // Upper half of 64 bit immediate. + case AArch64::MOVKXi: + return First->getOperand(3).getImm() == 32 && + ((SecondOpcode == AArch64::MOVKXi && + Second->getOperand(3).getImm() == 48) || + SecondOpcode == AArch64::INSTRUCTION_LIST_END); + } + return false; } |