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 | bdc75089ab4ae9f67d97fa1653a577cb2217036f (patch) | |
tree | 73e975660acd9d05a7b66e10bfd5a5b3ea2d3e48 /lib/Target/CBackend | |
parent | e0929364e8b263f8c090e88e2bf66e2e7bf566e4 (diff) | |
download | external_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.cpp | 16 |
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) { |