diff options
-rw-r--r-- | CodeGen/CGComplexExpr.cpp | 129 | ||||
-rw-r--r-- | CodeGen/CGExpr.cpp | 15 |
2 files changed, 6 insertions, 138 deletions
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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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<CompoundAssignOperator>(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) { |