diff options
author | Chad Rosier <mcrosier@codeaurora.org> | 2015-09-29 18:26:15 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@codeaurora.org> | 2015-09-29 18:26:15 +0000 |
commit | dabe2534ed596548a505f5d5dee22bfc225ec652 (patch) | |
tree | 1398265547597a9ac7c9d883565a030f246cac10 /llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp | |
parent | 0c3a5767d940a37b82ff33184f1999340c5a9f58 (diff) | |
download | bcm5719-llvm-dabe2534ed596548a505f5d5dee22bfc225ec652.tar.gz bcm5719-llvm-dabe2534ed596548a505f5d5dee22bfc225ec652.zip |
[AArch64] Add integer pre- and post-index halfword/byte loads and stores.
llvm-svn: 248817
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp index d767c9ec805..b3ff11d86c1 100644 --- a/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp +++ b/llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp @@ -168,7 +168,13 @@ static bool isUnscaledLdSt(MachineInstr *MI) { static int getMemScale(MachineInstr *MI) { switch (MI->getOpcode()) { default: - llvm_unreachable("Opcode has unknown size!"); + llvm_unreachable("Opcode has unknown scale!"); + case AArch64::LDRBBui: + case AArch64::STRBBui: + return 1; + case AArch64::LDRHHui: + case AArch64::STRHHui: + return 2; case AArch64::LDRSui: case AArch64::LDURSi: case AArch64::LDRSWui: @@ -294,6 +300,10 @@ static unsigned getPreIndexedOpcode(unsigned Opc) { return AArch64::STRDpre; case AArch64::STRQui: return AArch64::STRQpre; + case AArch64::STRBBui: + return AArch64::STRBBpre; + case AArch64::STRHHui: + return AArch64::STRHHpre; case AArch64::STRWui: return AArch64::STRWpre; case AArch64::STRXui: @@ -304,6 +314,10 @@ static unsigned getPreIndexedOpcode(unsigned Opc) { return AArch64::LDRDpre; case AArch64::LDRQui: return AArch64::LDRQpre; + case AArch64::LDRBBui: + return AArch64::LDRBBpre; + case AArch64::LDRHHui: + return AArch64::LDRHHpre; case AArch64::LDRWui: return AArch64::LDRWpre; case AArch64::LDRXui: @@ -343,6 +357,10 @@ static unsigned getPostIndexedOpcode(unsigned Opc) { return AArch64::STRDpost; case AArch64::STRQui: return AArch64::STRQpost; + case AArch64::STRBBui: + return AArch64::STRBBpost; + case AArch64::STRHHui: + return AArch64::STRHHpost; case AArch64::STRWui: return AArch64::STRWpost; case AArch64::STRXui: @@ -353,6 +371,10 @@ static unsigned getPostIndexedOpcode(unsigned Opc) { return AArch64::LDRDpost; case AArch64::LDRQui: return AArch64::LDRQpost; + case AArch64::LDRBBui: + return AArch64::LDRBBpost; + case AArch64::LDRHHui: + return AArch64::LDRHHpost; case AArch64::LDRWui: return AArch64::LDRWpost; case AArch64::LDRXui: @@ -1083,11 +1105,15 @@ bool AArch64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) { case AArch64::STRQui: case AArch64::STRXui: case AArch64::STRWui: + case AArch64::STRHHui: + case AArch64::STRBBui: case AArch64::LDRSui: case AArch64::LDRDui: case AArch64::LDRQui: case AArch64::LDRXui: case AArch64::LDRWui: + case AArch64::LDRHHui: + case AArch64::LDRBBui: // Unscaled instructions. case AArch64::STURSi: case AArch64::STURDi: |