From: Chris Lattner Date: Tue, 21 Aug 2007 17:12:50 +0000 (+0000) Subject: and/or/xor are invalid for complex, even integer complex apparently. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4034edbf86c4855c0b104111fa6b6a0d9a1f9ada;p=clang and/or/xor are invalid for complex, even integer complex apparently. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41234 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CGComplexExpr.cpp b/CodeGen/CGComplexExpr.cpp index 12be4f7c96..7f94e26dbd 100644 --- a/CodeGen/CGComplexExpr.cpp +++ b/CodeGen/CGComplexExpr.cpp @@ -70,6 +70,9 @@ public: ComplexPairTy VisitBinaryOperator(const BinaryOperator *BO); ComplexPairTy VisitBinMul (const BinaryOperator *E); ComplexPairTy VisitBinAdd (const BinaryOperator *E); + // FIXME: div/rem + // GCC rejects and/or/xor for integer complex. + // Logical and/or always return int, never complex. // No comparisons produce a complex result. ComplexPairTy VisitBinAssign (const BinaryOperator *E); @@ -105,132 +108,6 @@ ComplexPairTy ComplexExprEmitter::VisitBinaryOperator(const BinaryOperator *E) { fprintf(stderr, "Unimplemented complex binary expr!\n"); E->dump(); return ComplexPairTy(); -#if 0 - switch (E->getOpcode()) { - default: - return; - case BinaryOperator::Mul: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitMul(LHS, RHS, E->getType()); - case BinaryOperator::Div: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitDiv(LHS, RHS, E->getType()); - case BinaryOperator::Rem: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitRem(LHS, RHS, E->getType()); - case BinaryOperator::Add: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - if (!E->getType()->isPointerType()) - return EmitAdd(LHS, RHS, E->getType()); - - return EmitPointerAdd(LHS, E->getLHS()->getType(), - RHS, E->getRHS()->getType(), E->getType()); - case BinaryOperator::Sub: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - - if (!E->getLHS()->getType()->isPointerType()) - return EmitSub(LHS, RHS, E->getType()); - - return EmitPointerSub(LHS, E->getLHS()->getType(), - RHS, E->getRHS()->getType(), E->getType()); - case BinaryOperator::Shl: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitShl(LHS, RHS, E->getType()); - case BinaryOperator::Shr: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitShr(LHS, RHS, E->getType()); - case BinaryOperator::And: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitAnd(LHS, RHS, E->getType()); - case BinaryOperator::Xor: - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitXor(LHS, RHS, E->getType()); - case BinaryOperator::Or : - LHS = EmitExpr(E->getLHS()); - RHS = EmitExpr(E->getRHS()); - return EmitOr(LHS, RHS, E->getType()); - case BinaryOperator::MulAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitMul(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::DivAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitDiv(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::RemAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitRem(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::AddAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitAdd(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::SubAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitSub(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::ShlAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitShl(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::ShrAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitShr(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::AndAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitAnd(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::OrAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitOr(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::XorAssign: { - const CompoundAssignOperator *CAO = cast(E); - LValue LHSLV; - EmitCompoundAssignmentOperands(CAO, LHSLV, LHS, RHS); - LHS = EmitXor(LHS, RHS, CAO->getComputationType()); - return EmitCompoundAssignmentResult(CAO, LHSLV, LHS); - } - case BinaryOperator::Comma: return EmitBinaryComma(E); - } -#endif } ComplexPairTy ComplexExprEmitter::VisitBinAdd(const BinaryOperator *E) { diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp index b36bff0af5..5e60e7b7b9 100644 --- a/CodeGen/CGExpr.cpp +++ b/CodeGen/CGExpr.cpp @@ -1273,24 +1273,15 @@ RValue CodeGenFunction::EmitBinaryCompare(const BinaryOperator *E, } RValue CodeGenFunction::EmitAnd(RValue LHS, RValue RHS, QualType ResTy) { - if (LHS.isScalar()) - return RValue::get(Builder.CreateAnd(LHS.getVal(), RHS.getVal(), "and")); - - assert(0 && "FIXME: This doesn't handle complex integer operands yet (GNU)"); + return RValue::get(Builder.CreateAnd(LHS.getVal(), RHS.getVal(), "and")); } RValue CodeGenFunction::EmitXor(RValue LHS, RValue RHS, QualType ResTy) { - if (LHS.isScalar()) - return RValue::get(Builder.CreateXor(LHS.getVal(), RHS.getVal(), "xor")); - - assert(0 && "FIXME: This doesn't handle complex integer operands yet (GNU)"); + return RValue::get(Builder.CreateXor(LHS.getVal(), RHS.getVal(), "xor")); } RValue CodeGenFunction::EmitOr(RValue LHS, RValue RHS, QualType ResTy) { - if (LHS.isScalar()) - return RValue::get(Builder.CreateOr(LHS.getVal(), RHS.getVal(), "or")); - - assert(0 && "FIXME: This doesn't handle complex integer operands yet (GNU)"); + return RValue::get(Builder.CreateOr(LHS.getVal(), RHS.getVal(), "or")); } RValue CodeGenFunction::EmitBinaryLAnd(const BinaryOperator *E) {