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 | |
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
-rw-r--r-- | llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp | 20 | ||||
-rw-r--r-- | llvm/test/MC/PowerPC/ppc32-ba.s | 6 |
2 files changed, 23 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); } diff --git a/llvm/test/MC/PowerPC/ppc32-ba.s b/llvm/test/MC/PowerPC/ppc32-ba.s new file mode 100644 index 00000000000..133423b4e8c --- /dev/null +++ b/llvm/test/MC/PowerPC/ppc32-ba.s @@ -0,0 +1,6 @@ +# RUN: llvm-mc -triple powerpc-unknown-unknown --show-encoding %s | FileCheck %s + +# Check that large immediates in 32bit mode are accepted. + +# CHECK: ba -33554432 # encoding: [0x4a,0x00,0x00,0x02] + ba 0xfe000000 |