summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/CBackend/CBackend.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-03-03 16:33:33 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-03-03 16:33:33 +0000
commit1f87660d2947d757d7608da608b15e7b8f105096 (patch)
tree9f28ea10dea1978f8b03c0fc4f54bc02f580259b /llvm/lib/Target/CBackend/CBackend.cpp
parentec8c51c1b1534b6d2daf20e398542575f1cdb464 (diff)
downloadbcm5719-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.cpp16
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) {
OpenPOWER on IntegriCloud