summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/XCore/XCoreInstrInfo.cpp
diff options
context:
space:
mode:
authorRichard Osborne <richard@xmos.com>2014-04-14 12:30:35 +0000
committerRichard Osborne <richard@xmos.com>2014-04-14 12:30:35 +0000
commitda16ff47cd8c73721312a6cafffb88f2dbd48675 (patch)
tree4c664637e0640aa832b18348a9ec6acb67fd24c3 /llvm/lib/Target/XCore/XCoreInstrInfo.cpp
parentdb8804b32b17593e808173abe52f747a8d78ad8d (diff)
downloadbcm5719-llvm-da16ff47cd8c73721312a6cafffb88f2dbd48675.tar.gz
bcm5719-llvm-da16ff47cd8c73721312a6cafffb88f2dbd48675.zip
[XCore] Don't create invalid MKMSK instructions inside loadImmediate().
Summary: Previously loadImmediate() would produce MKMSK instructions with invalid immediate values such as mkmsk r0, 9. Fix this by checking the mask size is valid. Reviewers: robertlytton Reviewed By: robertlytton CC: llvm-commits Differential Revision: http://reviews.llvm.org/D3289 llvm-svn: 206163
Diffstat (limited to 'llvm/lib/Target/XCore/XCoreInstrInfo.cpp')
-rw-r--r--llvm/lib/Target/XCore/XCoreInstrInfo.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Target/XCore/XCoreInstrInfo.cpp b/llvm/lib/Target/XCore/XCoreInstrInfo.cpp
index cea3bbf1750..23f13c9c76f 100644
--- a/llvm/lib/Target/XCore/XCoreInstrInfo.cpp
+++ b/llvm/lib/Target/XCore/XCoreInstrInfo.cpp
@@ -428,13 +428,21 @@ static inline bool isImmU16(unsigned val) {
return val < (1 << 16);
}
+static bool isImmMskBitp(unsigned val) {
+ if (!isMask_32(val)) {
+ return false;
+ }
+ int N = Log2_32(val) + 1;
+ return (N >= 1 && N <= 8) || N == 16 || N == 24 || N == 32;
+}
+
MachineBasicBlock::iterator XCoreInstrInfo::loadImmediate(
MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI,
unsigned Reg, uint64_t Value) const {
DebugLoc dl;
if (MI != MBB.end()) dl = MI->getDebugLoc();
- if (isMask_32(Value)) {
+ if (isImmMskBitp(Value)) {
int N = Log2_32(Value) + 1;
return BuildMI(MBB, MI, dl, get(XCore::MKMSK_rus), Reg).addImm(N);
}
OpenPOWER on IntegriCloud