]> granicus.if.org Git - clang/commitdiff
implement __extension__ and unary~ for complex.
authorChris Lattner <sabre@nondot.org>
Tue, 21 Aug 2007 20:41:44 +0000 (20:41 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 21 Aug 2007 20:41:44 +0000 (20:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41249 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGComplexExpr.cpp

index f20157b3b1e870cadc92f370f4c4e9a2bee395cb..f62a315f3a6eaeee78ecb1bf87f7dace56aca7c5 100644 (file)
@@ -78,6 +78,12 @@ public:
     return Visit(E->getSubExpr());
   }
   ComplexPairTy VisitUnaryMinus    (const UnaryOperator *E);
+  ComplexPairTy VisitUnaryNot      (const UnaryOperator *E);
+  // LNot,SizeOf,AlignOf,Real,Imag never return complex.
+  ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) {
+    return Visit(E->getSubExpr());
+  }
+  
   //  case Expr::ImplicitCastExprClass:
   //  case Expr::CastExprClass: 
   //  case Expr::CallExprClass:
@@ -153,6 +159,12 @@ ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
   return ComplexPairTy(ResR, ResI);
 }
 
+ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
+  // ~(a+ib) = a + i*-b
+  ComplexPairTy Op = Visit(E->getSubExpr());
+  llvm::Value *ResI = Builder.CreateNeg(Op.second, "conj.i");
+  return ComplexPairTy(Op.first, ResI);
+}
 
 ComplexPairTy ComplexExprEmitter::VisitBinAdd(const BinaryOperator *E) {
   ComplexPairTy LHS = Visit(E->getLHS());