diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2007-03-03 16:33:33 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2007-03-03 16:33:33 +0000 |
commit | 1f87660d2947d757d7608da608b15e7b8f105096 (patch) | |
tree | 9f28ea10dea1978f8b03c0fc4f54bc02f580259b /llvm/lib/Target/CBackend/CBackend.cpp | |
parent | ec8c51c1b1534b6d2daf20e398542575f1cdb464 (diff) | |
download | bcm5719-llvm-1f87660d2947d757d7608da608b15e7b8f105096.tar.gz bcm5719-llvm-1f87660d2947d757d7608da608b15e7b8f105096.zip |
Make sure that when we store a value it is masked to its correct bit
width. This helps CBE work with non-standard integer bit widths.
llvm-svn: 34885
Diffstat (limited to 'llvm/lib/Target/CBackend/CBackend.cpp')
-rw-r--r-- | llvm/lib/Target/CBackend/CBackend.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Target/CBackend/CBackend.cpp b/llvm/lib/Target/CBackend/CBackend.cpp index f7e25187dda..eeefaa27e99 100644 --- a/llvm/lib/Target/CBackend/CBackend.cpp +++ b/llvm/lib/Target/CBackend/CBackend.cpp @@ -2815,7 +2815,21 @@ void CWriter::visitStoreInst(StoreInst &I) { writeOperand(I.getPointerOperand()); if (I.isVolatile()) Out << ')'; Out << " = "; - writeOperand(I.getOperand(0)); + Value *Operand = I.getOperand(0); + Constant *BitMask = 0; + if (const IntegerType* ITy = dyn_cast<IntegerType>(Operand->getType())) + if (!ITy->isPowerOf2ByteWidth()) + // We have a bit width that doesn't match an even power-of-2 byte + // size. Consequently we must & the value with the type's bit mask + BitMask = ConstantInt::get(ITy, ITy->getBitMask()); + if (BitMask) + Out << "(("; + writeOperand(Operand); + if (BitMask) { + Out << ") & "; + printConstant(BitMask); + Out << ")"; + } } void CWriter::visitGetElementPtrInst(GetElementPtrInst &I) { |