diff options
| author | Dale Johannesen <dalej@apple.com> | 2009-11-13 01:45:18 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2009-11-13 01:45:18 +0000 |
| commit | 5f4eecf9612fd885b10a16fabc363e72cece3b24 (patch) | |
| tree | 6bcb586dbc66b44c8c4b4a7672d714e740e94977 /llvm/lib/CodeGen | |
| parent | 41e7648e09e3a4ebf97b3a48222f02f4a63f8afd (diff) | |
| download | bcm5719-llvm-5f4eecf9612fd885b10a16fabc363e72cece3b24.tar.gz bcm5719-llvm-5f4eecf9612fd885b10a16fabc363e72cece3b24.zip | |
Adjust isConstantSplat to allow for big-endian targets.
PPC is such a target; make it work.
llvm-svn: 87060
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index d9c273d266a..4530ffc4a2d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5916,7 +5916,8 @@ bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, - unsigned MinSplatBits) { + unsigned MinSplatBits, + bool isBigEndian) { EVT VT = getValueType(0); assert(VT.isVector() && "Expected a vector type"); unsigned sz = VT.getSizeInBits(); @@ -5933,12 +5934,14 @@ bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, unsigned int nOps = getNumOperands(); assert(nOps > 0 && "isConstantSplat has 0-size build vector"); unsigned EltBitSize = VT.getVectorElementType().getSizeInBits(); - for (unsigned i = 0; i < nOps; ++i) { + + for (unsigned j = 0; j < nOps; ++j) { + unsigned i = isBigEndian ? nOps-1-j : j; SDValue OpVal = getOperand(i); - unsigned BitPos = i * EltBitSize; + unsigned BitPos = j * EltBitSize; if (OpVal.getOpcode() == ISD::UNDEF) - SplatUndef |= APInt::getBitsSet(sz, BitPos, BitPos +EltBitSize); + SplatUndef |= APInt::getBitsSet(sz, BitPos, BitPos + EltBitSize); else if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(OpVal)) SplatValue |= (APInt(CN->getAPIntValue()).zextOrTrunc(EltBitSize). zextOrTrunc(sz) << BitPos); |

