diff options
author | Kalle Raiskila <kalle.raiskila@nokia.com> | 2010-09-08 11:53:38 +0000 |
---|---|---|
committer | Kalle Raiskila <kalle.raiskila@nokia.com> | 2010-09-08 11:53:38 +0000 |
commit | e542972828ce89018a6bf3fbb06a9dc91815b243 (patch) | |
tree | 9aafbe052149976a0c0320e6ba202a93c7220eb6 /llvm/lib/Target/CellSPU/SPUISelLowering.cpp | |
parent | 4ad4b58639472b729d8b67b7315abf8f258fa315 (diff) | |
download | bcm5719-llvm-e542972828ce89018a6bf3fbb06a9dc91815b243.tar.gz bcm5719-llvm-e542972828ce89018a6bf3fbb06a9dc91815b243.zip |
Fix CellSPU vector shuffles, again.
Some cases of lowering to rotate were miscompiled.
llvm-svn: 113355
Diffstat (limited to 'llvm/lib/Target/CellSPU/SPUISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/CellSPU/SPUISelLowering.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/llvm/lib/Target/CellSPU/SPUISelLowering.cpp b/llvm/lib/Target/CellSPU/SPUISelLowering.cpp index 46f31899be0..7bac3f5552a 100644 --- a/llvm/lib/Target/CellSPU/SPUISelLowering.cpp +++ b/llvm/lib/Target/CellSPU/SPUISelLowering.cpp @@ -1735,9 +1735,9 @@ static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) { unsigned CurrElt = 0; unsigned MaxElts = VecVT.getVectorNumElements(); unsigned PrevElt = 0; - unsigned V0Elt = 0; bool monotonic = true; bool rotate = true; + int rotamt; EVT maskVT; // which of the c?d instructions to use if (EltVT == MVT::i8) { @@ -1781,14 +1781,13 @@ static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) { if (PrevElt > 0 && SrcElt < MaxElts) { if ((PrevElt == SrcElt - 1) || (PrevElt == MaxElts - 1 && SrcElt == 0)) { + rotamt = SrcElt-i; PrevElt = SrcElt; - if (SrcElt == 0) - V0Elt = i; } else { rotate = false; } - } else if (i == 0) { - // First time through, need to keep track of previous element + } else if (i == 0 || (PrevElt==0 && SrcElt==1)) { + // First time or after a "wrap around" PrevElt = SrcElt; } else { // This isn't a rotation, takes elements from vector 2 @@ -1813,8 +1812,9 @@ static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) { return DAG.getNode(SPUISD::SHUFB, dl, V1.getValueType(), V2, V1, ShufMaskOp); } else if (rotate) { - int rotamt = (MaxElts - V0Elt) * EltVT.getSizeInBits()/8; - + if (rotamt < 0) + rotamt +=MaxElts; + rotamt *= EltVT.getSizeInBits()/8; return DAG.getNode(SPUISD::ROTBYTES_LEFT, dl, V1.getValueType(), V1, DAG.getConstant(rotamt, MVT::i16)); } else { |