diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-10-06 15:38:09 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-10-06 15:38:09 +0000 |
| commit | 0a3ea89e85c8ccbe4425b97377e5ad67843f4cf2 (patch) | |
| tree | 9e2027221b183dd2794f1e2cd8fa109e9a7c67e6 /llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | |
| parent | ee554e6155d73714b9ee061b1583c396685ed4ba (diff) | |
| download | bcm5719-llvm-0a3ea89e85c8ccbe4425b97377e5ad67843f4cf2.tar.gz bcm5719-llvm-0a3ea89e85c8ccbe4425b97377e5ad67843f4cf2.zip | |
AArch64: Move remaining target specific BranchRelaxation bits to TII
llvm-svn: 283458
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64InstrInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index b26dbce1875..7d264c8369f 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -128,6 +128,8 @@ static unsigned getBranchDisplacementBits(unsigned Opc) { switch (Opc) { default: llvm_unreachable("unexpected opcode!"); + case AArch64::B: + return 64; case AArch64::TBNZW: case AArch64::TBZW: case AArch64::TBNZX: @@ -143,30 +145,33 @@ static unsigned getBranchDisplacementBits(unsigned Opc) { } } -static unsigned getBranchMaxDisplacementBytes(unsigned Opc) { - if (Opc == AArch64::B) - return -1; - - unsigned Bits = getBranchDisplacementBits(Opc); - unsigned MaxOffs = ((1 << (Bits - 1)) - 1) << 2; - - // Verify the displacement bits options have sane values. - // XXX: Is there a better place for this? - assert(MaxOffs >= 8 && - "max branch displacement must be enough to jump" - "over conditional branch expansion"); - - return MaxOffs; +bool AArch64InstrInfo::isBranchOffsetInRange(unsigned BranchOp, + int64_t BrOffset) const { + unsigned Bits = getBranchDisplacementBits(BranchOp); + assert(Bits >= 3 && "max branch displacement must be enough to jump" + "over conditional branch expansion"); + return isIntN(Bits, BrOffset / 4); } -bool AArch64InstrInfo::isBranchInRange(unsigned BranchOp, uint64_t BrOffset, - uint64_t DestOffset) const { - unsigned MaxOffs = getBranchMaxDisplacementBytes(BranchOp); - - // Branch before the Dest. - if (BrOffset <= DestOffset) - return (DestOffset - BrOffset <= MaxOffs); - return (BrOffset - DestOffset <= MaxOffs); +MachineBasicBlock *AArch64InstrInfo::getBranchDestBlock( + const MachineInstr &MI) const { + switch (MI.getOpcode()) { + default: + llvm_unreachable("unexpected opcode!"); + case AArch64::B: + return MI.getOperand(0).getMBB(); + case AArch64::TBZW: + case AArch64::TBNZW: + case AArch64::TBZX: + case AArch64::TBNZX: + return MI.getOperand(2).getMBB(); + case AArch64::CBZW: + case AArch64::CBNZW: + case AArch64::CBZX: + case AArch64::CBNZX: + case AArch64::Bcc: + return MI.getOperand(1).getMBB(); + } } // Branch analysis. |

