Changes in directory llvm/lib/VMCore:
ConstantFolding.cpp updated: 1.77 -> 1.78 --- Log message: implement constant folding for the element-wise binary operations --- Diffs of the changes: (+50 -0) ConstantFolding.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 50 insertions(+) Index: llvm/lib/VMCore/ConstantFolding.cpp diff -u llvm/lib/VMCore/ConstantFolding.cpp:1.77 llvm/lib/VMCore/ConstantFolding.cpp:1.78 --- llvm/lib/VMCore/ConstantFolding.cpp:1.77 Tue Jan 3 20:03:29 2006 +++ llvm/lib/VMCore/ConstantFolding.cpp Tue Jan 3 20:15:02 2006 @@ -332,11 +332,61 @@ // ConstantPackedRules Class //===----------------------------------------------------------------------===// +/// DoVectorOp - Given two packed constants and a function pointer, apply the +/// function pointer to each element pair, producing a new ConstantPacked +/// constant. +static Constant *EvalVectorOp(const ConstantPacked *V1, + const ConstantPacked *V2, + Constant *(*FP)(Constant*, Constant*)) { + std::vector<Constant*> Res; + for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i) + Res.push_back(FP(const_cast<Constant*>(V1->getOperand(i)), + const_cast<Constant*>(V2->getOperand(i)))); + return ConstantPacked::get(Res); +} + /// PackedTypeRules provides a concrete base class of ConstRules for /// ConstantPacked operands. /// struct ConstantPackedRules : public TemplateRules<ConstantPacked, ConstantPackedRules> { + + static Constant *Add(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getAdd); + } + static Constant *Sub(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getSub); + } + static Constant *Mul(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getMul); + } + static Constant *Div(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getDiv); + } + static Constant *Rem(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getRem); + } + static Constant *And(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getAnd); + } + static Constant *Or (const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getOr); + } + static Constant *Xor(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getXor); + } + static Constant *Shl(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getShl); + } + static Constant *Shr(const ConstantPacked *V1, const ConstantPacked *V2) { + return EvalVectorOp(V1, V2, ConstantExpr::getShr); + } + static Constant *LessThan(const ConstantPacked *V1, const ConstantPacked *V2){ + return 0; + } + static Constant *EqualTo(const ConstantPacked *V1, const ConstantPacked *V2) { + return 0; + } }; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits