aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/CBackend
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
commitbdc75089ab4ae9f67d97fa1653a577cb2217036f (patch)
tree73e975660acd9d05a7b66e10bfd5a5b3ea2d3e48 /lib/Target/CBackend
parente0929364e8b263f8c090e88e2bf66e2e7bf566e4 (diff)
downloadexternal_llvm-bdc75089ab4ae9f67d97fa1653a577cb2217036f.zip
external_llvm-bdc75089ab4ae9f67d97fa1653a577cb2217036f.tar.gz
external_llvm-bdc75089ab4ae9f67d97fa1653a577cb2217036f.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34885 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/CBackend')
-rw-r--r--lib/Target/CBackend/CBackend.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp
index f7e2518..eeefaa2 100644
--- a/lib/Target/CBackend/CBackend.cpp
+++ b/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) {