================ @@ -1222,6 +1224,105 @@ bool Compiler<Emitter>::VisitComplexBinOp(const BinaryOperator *E) { return true; } +template <class Emitter> +bool Compiler<Emitter>::VisitVectorBinOp(const BinaryOperator *E) { + assert(E->getType()->isVectorType()); + assert(E->getLHS()->getType()->isVectorType()); + assert(E->getRHS()->getType()->isVectorType()); + + // FIXME: Current only support comparison binary operator, add support for + // other binary operator. + if (!E->isComparisonOp()) + return this->emitInvalid(E); + // Prepare storage for result. + if (!Initializing) { + unsigned LocalIndex = allocateTemporary(E); + if (!this->emitGetPtrLocal(LocalIndex, E)) + return false; + } + + const Expr *LHS = E->getLHS(); + const Expr *RHS = E->getRHS(); + const auto *VecTy = E->getType()->getAs<VectorType>(); + + // The LHS and RHS of a comparison operator must have the same type. So we + // just use LHS vector element type here. + PrimType ElemT = this->classifyVectorElementType(LHS->getType()); + PrimType ResultElemT = this->classifyVectorElementType(E->getType()); + + // Evaluate LHS and save value to LHSOffset. + unsigned LHSOffset = this->allocateLocalPrimitive(LHS, PT_Ptr, true, false); + if (!this->visit(LHS)) + return false; + if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) + return false; + + // Evaluate RHS and save value to RHSOffset. + unsigned RHSOffset = this->allocateLocalPrimitive(RHS, PT_Ptr, true, false); + if (!this->visit(RHS)) + return false; + if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) + return false; + + auto getElem = [=](unsigned Offset, unsigned Index, PrimType ElemT) -> bool { ---------------- tbaederr wrote:
`ElemT` can be removed since it's always the same anyway https://github.com/llvm/llvm-project/pull/107258 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits