diff options
author | Joerg Sonnenberger <joerg@bec.de> | 2014-08-08 20:57:58 +0000 |
---|---|---|
committer | Joerg Sonnenberger <joerg@bec.de> | 2014-08-08 20:57:58 +0000 |
commit | eb9d13fcd11914252a2fd801273ccc002e653e93 (patch) | |
tree | 6e8027cba6ca46f255d5074eead4b16537f79b7a /llvm/lib/Target/PowerPC | |
parent | e7701fee0b9fd3867ee0dee410f58b26a50d1848 (diff) | |
download | bcm5719-llvm-eb9d13fcd11914252a2fd801273ccc002e653e93.tar.gz bcm5719-llvm-eb9d13fcd11914252a2fd801273ccc002e653e93.zip |
Allow large immediates for branch instructions in 32bit mode.
llvm-svn: 215240
Diffstat (limited to 'llvm/lib/Target/PowerPC')
-rw-r--r-- | llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp index f99a3aa6634..ae24c8a88e6 100644 --- a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp +++ b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp @@ -432,9 +432,23 @@ public: bool isS17Imm() const { return Kind == Expression || (Kind == Immediate && isInt<17>(getImm())); } bool isTLSReg() const { return Kind == TLSRegister; } - bool isDirectBr() const { return Kind == Expression || - (Kind == Immediate && isInt<26>(getImm()) && - (getImm() & 3) == 0); } + bool isDirectBr() const { + if (Kind == Expression) + return true; + if (Kind != Immediate) + return false; + // Operand must be 64-bit aligned, signed 27-bit immediate. + if ((getImm() & 3) != 0) + return false; + if (isInt<26>(getImm())) + return true; + if (!IsPPC64) { + // In 32-bit mode, large 32-bit quantities wrap around. + if (isUInt<32>(getImm()) && isInt<26>(static_cast<int32_t>(getImm()))) + return true; + } + return false; + } bool isCondBr() const { return Kind == Expression || (Kind == Immediate && isInt<16>(getImm()) && (getImm() & 3) == 0); } |