forked from OSchip/llvm-project
Fix to handle all non-power-of-2 vector sizes in the mask form of _builtin_shuffle_vector.
Previously a 2-bit mask was used to mask each element of a vec6 mask before doing the extracts instead of 3-bit mask necessary to cover 0-5. vec3 was the only non-power-of-2 that worked correctly because a +1 conditionally added before calculating floor(log2(elements)). llvm-svn: 187560
This commit is contained in:
parent
a4f7c7a600
commit
b9b7ea697b
|
@ -922,16 +922,8 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
|
|||
llvm::VectorType *MTy = cast<llvm::VectorType>(Mask->getType());
|
||||
llvm::Constant* EltMask;
|
||||
|
||||
// Treat vec3 like vec4.
|
||||
if ((LHSElts == 6) && (E->getNumSubExprs() == 3))
|
||||
EltMask = llvm::ConstantInt::get(MTy->getElementType(),
|
||||
(1 << llvm::Log2_32(LHSElts+2))-1);
|
||||
else if ((LHSElts == 3) && (E->getNumSubExprs() == 2))
|
||||
EltMask = llvm::ConstantInt::get(MTy->getElementType(),
|
||||
(1 << llvm::Log2_32(LHSElts+1))-1);
|
||||
else
|
||||
EltMask = llvm::ConstantInt::get(MTy->getElementType(),
|
||||
(1 << llvm::Log2_32(LHSElts))-1);
|
||||
EltMask = llvm::ConstantInt::get(MTy->getElementType(),
|
||||
llvm::NextPowerOf2(LHSElts-1)-1);
|
||||
|
||||
// Mask off the high bits of each shuffle index.
|
||||
Value *MaskBits = llvm::ConstantVector::getSplat(MTy->getNumElements(),
|
||||
|
|
Loading…
Reference in New Issue