summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Sonnenberger <joerg@bec.de>2014-08-08 20:57:58 +0000
committerJoerg Sonnenberger <joerg@bec.de>2014-08-08 20:57:58 +0000
commiteb9d13fcd11914252a2fd801273ccc002e653e93 (patch)
tree6e8027cba6ca46f255d5074eead4b16537f79b7a
parente7701fee0b9fd3867ee0dee410f58b26a50d1848 (diff)
downloadbcm5719-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.cpp20
-rw-r--r--llvm/test/MC/PowerPC/ppc32-ba.s6
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
OpenPOWER on IntegriCloud