aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-08-21 17:12:50 +0000
committerChris Lattner <sabre@nondot.org>2007-08-21 17:12:50 +0000
commit4034edbf86c4855c0b104111fa6b6a0d9a1f9ada (patch)
tree611d1896df97e76136504a399a3e80c6918f6b22
parent32e32e77823bbfe81e4737267e0d1f46ab23a3c5 (diff)
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
-rw-r--r--CodeGen/CGComplexExpr.cpp129
-rw-r--r--CodeGen/CGExpr.cpp15
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) {