Add a new ShuffleVectorInst::getMaskValue method.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47813 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-03-02 05:28:33 +00:00
parent 0452ed6bd6
commit 8728f1915f
2 changed files with 29 additions and 6 deletions

View File

@ -1228,6 +1228,11 @@ public:
Ops[i] = Val; Ops[i] = Val;
} }
unsigned getNumOperands() const { return 3; } unsigned getNumOperands() const { return 3; }
/// getMaskValue - Return the index from the shuffle mask for the specified
/// output result. This is either -1 if the element is undef or a number less
/// than 2*numelements.
int getMaskValue(unsigned i) const;
// Methods for support type inquiry through isa, cast, and dyn_cast: // Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const ShuffleVectorInst *) { return true; } static inline bool classof(const ShuffleVectorInst *) { return true; }

View File

@ -1350,16 +1350,34 @@ ShuffleVectorInst::ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
bool ShuffleVectorInst::isValidOperands(const Value *V1, const Value *V2, bool ShuffleVectorInst::isValidOperands(const Value *V1, const Value *V2,
const Value *Mask) { const Value *Mask) {
if (!isa<VectorType>(V1->getType())) return false; if (!isa<VectorType>(V1->getType()) ||
if (V1->getType() != V2->getType()) return false; V1->getType() != V2->getType())
if (!isa<VectorType>(Mask->getType()) || return false;
cast<VectorType>(Mask->getType())->getElementType() != Type::Int32Ty ||
cast<VectorType>(Mask->getType())->getNumElements() != const VectorType *MaskTy = dyn_cast<VectorType>(Mask->getType());
cast<VectorType>(V1->getType())->getNumElements()) if (!isa<Constant>(Mask) || MaskTy == 0 ||
MaskTy->getElementType() != Type::Int32Ty ||
MaskTy->getNumElements() !=
cast<VectorType>(V1->getType())->getNumElements())
return false; return false;
return true; return true;
} }
/// getMaskValue - Return the index from the shuffle mask for the specified
/// output result. This is either -1 if the element is undef or a number less
/// than 2*numelements.
int ShuffleVectorInst::getMaskValue(unsigned i) const {
const Constant *Mask = cast<Constant>(getOperand(2));
if (isa<UndefValue>(Mask)) return -1;
if (isa<ConstantAggregateZero>(Mask)) return 0;
const ConstantVector *MaskCV = cast<ConstantVector>(Mask);
assert(i < MaskCV->getNumOperands() && "Index out of range");
if (isa<UndefValue>(MaskCV->getOperand(i)))
return -1;
return cast<ConstantInt>(MaskCV->getOperand(i))->getZExtValue();
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// BinaryOperator Class // BinaryOperator Class