clang API Documentation

CGExprComplex.cpp
Go to the documentation of this file.
00001 //===--- CGExprComplex.cpp - Emit LLVM Code for Complex Exprs -------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This contains code to emit Expr nodes with complex types as LLVM code.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "CodeGenFunction.h"
00015 #include "CodeGenModule.h"
00016 #include "clang/AST/ASTContext.h"
00017 #include "clang/AST/StmtVisitor.h"
00018 #include "llvm/Constants.h"
00019 #include "llvm/Function.h"
00020 #include "llvm/ADT/SmallString.h"
00021 using namespace clang;
00022 using namespace CodeGen;
00023 
00024 //===----------------------------------------------------------------------===//
00025 //                        Complex Expression Emitter
00026 //===----------------------------------------------------------------------===//
00027 
00028 typedef CodeGenFunction::ComplexPairTy ComplexPairTy;
00029 
00030 namespace  {
00031 class ComplexExprEmitter
00032   : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
00033   CodeGenFunction &CGF;
00034   CGBuilderTy &Builder;
00035   // True is we should ignore the value of a
00036   bool IgnoreReal;
00037   bool IgnoreImag;
00038 public:
00039   ComplexExprEmitter(CodeGenFunction &cgf, bool ir=false, bool ii=false)
00040     : CGF(cgf), Builder(CGF.Builder), IgnoreReal(ir), IgnoreImag(ii) {
00041   }
00042 
00043 
00044   //===--------------------------------------------------------------------===//
00045   //                               Utilities
00046   //===--------------------------------------------------------------------===//
00047 
00048   bool TestAndClearIgnoreReal() {
00049     bool I = IgnoreReal;
00050     IgnoreReal = false;
00051     return I;
00052   }
00053   bool TestAndClearIgnoreImag() {
00054     bool I = IgnoreImag;
00055     IgnoreImag = false;
00056     return I;
00057   }
00058 
00059   /// EmitLoadOfLValue - Given an expression with complex type that represents a
00060   /// value l-value, this method emits the address of the l-value, then loads
00061   /// and returns the result.
00062   ComplexPairTy EmitLoadOfLValue(const Expr *E) {
00063     return EmitLoadOfLValue(CGF.EmitLValue(E));
00064   }
00065 
00066   ComplexPairTy EmitLoadOfLValue(LValue LV) {
00067     assert(LV.isSimple() && "complex l-value must be simple");
00068     return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified());
00069   }
00070 
00071   /// EmitLoadOfComplex - Given a pointer to a complex value, emit code to load
00072   /// the real and imaginary pieces.
00073   ComplexPairTy EmitLoadOfComplex(llvm::Value *SrcPtr, bool isVolatile);
00074 
00075   /// EmitStoreThroughLValue - Given an l-value of complex type, store
00076   /// a complex number into it.
00077   void EmitStoreThroughLValue(ComplexPairTy Val, LValue LV) {
00078     assert(LV.isSimple() && "complex l-value must be simple");
00079     return EmitStoreOfComplex(Val, LV.getAddress(), LV.isVolatileQualified());
00080   }
00081 
00082   /// EmitStoreOfComplex - Store the specified real/imag parts into the
00083   /// specified value pointer.
00084   void EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *ResPtr, bool isVol);
00085 
00086   /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
00087   ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType,
00088                                          QualType DestType);
00089 
00090   //===--------------------------------------------------------------------===//
00091   //                            Visitor Methods
00092   //===--------------------------------------------------------------------===//
00093 
00094   ComplexPairTy Visit(Expr *E) {
00095     return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::Visit(E);
00096   }
00097     
00098   ComplexPairTy VisitStmt(Stmt *S) {
00099     S->dump(CGF.getContext().getSourceManager());
00100     llvm_unreachable("Stmt can't have complex result type!");
00101   }
00102   ComplexPairTy VisitExpr(Expr *S);
00103   ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());}
00104   ComplexPairTy VisitGenericSelectionExpr(GenericSelectionExpr *GE) {
00105     return Visit(GE->getResultExpr());
00106   }
00107   ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL);
00108   ComplexPairTy
00109   VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) {
00110     return Visit(PE->getReplacement());
00111   }
00112 
00113   // l-values.
00114   ComplexPairTy VisitDeclRefExpr(DeclRefExpr *E) {
00115     if (CodeGenFunction::ConstantEmission result = CGF.tryEmitAsConstant(E)) {
00116       if (result.isReference())
00117         return EmitLoadOfLValue(result.getReferenceLValue(CGF, E));
00118 
00119       llvm::ConstantStruct *pair =
00120         cast<llvm::ConstantStruct>(result.getValue());
00121       return ComplexPairTy(pair->getOperand(0), pair->getOperand(1));
00122     }
00123     return EmitLoadOfLValue(E);
00124   }
00125   ComplexPairTy VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
00126     return EmitLoadOfLValue(E);
00127   }
00128   ComplexPairTy VisitObjCMessageExpr(ObjCMessageExpr *E) {
00129     return CGF.EmitObjCMessageExpr(E).getComplexVal();
00130   }
00131   ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); }
00132   ComplexPairTy VisitMemberExpr(const Expr *E) { return EmitLoadOfLValue(E); }
00133   ComplexPairTy VisitOpaqueValueExpr(OpaqueValueExpr *E) {
00134     if (E->isGLValue())
00135       return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E));
00136     return CGF.getOpaqueRValueMapping(E).getComplexVal();
00137   }
00138 
00139   ComplexPairTy VisitPseudoObjectExpr(PseudoObjectExpr *E) {
00140     return CGF.EmitPseudoObjectRValue(E).getComplexVal();
00141   }
00142 
00143   // FIXME: CompoundLiteralExpr
00144 
00145   ComplexPairTy EmitCast(CastExpr::CastKind CK, Expr *Op, QualType DestTy);
00146   ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) {
00147     // Unlike for scalars, we don't have to worry about function->ptr demotion
00148     // here.
00149     return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
00150   }
00151   ComplexPairTy VisitCastExpr(CastExpr *E) {
00152     return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
00153   }
00154   ComplexPairTy VisitCallExpr(const CallExpr *E);
00155   ComplexPairTy VisitStmtExpr(const StmtExpr *E);
00156 
00157   // Operators.
00158   ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E,
00159                                    bool isInc, bool isPre) {
00160     LValue LV = CGF.EmitLValue(E->getSubExpr());
00161     return CGF.EmitComplexPrePostIncDec(E, LV, isInc, isPre);
00162   }
00163   ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) {
00164     return VisitPrePostIncDec(E, false, false);
00165   }
00166   ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) {
00167     return VisitPrePostIncDec(E, true, false);
00168   }
00169   ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) {
00170     return VisitPrePostIncDec(E, false, true);
00171   }
00172   ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) {
00173     return VisitPrePostIncDec(E, true, true);
00174   }
00175   ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
00176   ComplexPairTy VisitUnaryPlus     (const UnaryOperator *E) {
00177     TestAndClearIgnoreReal();
00178     TestAndClearIgnoreImag();
00179     return Visit(E->getSubExpr());
00180   }
00181   ComplexPairTy VisitUnaryMinus    (const UnaryOperator *E);
00182   ComplexPairTy VisitUnaryNot      (const UnaryOperator *E);
00183   // LNot,Real,Imag never return complex.
00184   ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) {
00185     return Visit(E->getSubExpr());
00186   }
00187   ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
00188     return Visit(DAE->getExpr());
00189   }
00190   ComplexPairTy VisitExprWithCleanups(ExprWithCleanups *E) {
00191     CGF.enterFullExpression(E);
00192     CodeGenFunction::RunCleanupsScope Scope(CGF);
00193     return Visit(E->getSubExpr());
00194   }
00195   ComplexPairTy VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
00196     assert(E->getType()->isAnyComplexType() && "Expected complex type!");
00197     QualType Elem = E->getType()->getAs<ComplexType>()->getElementType();
00198     llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
00199     return ComplexPairTy(Null, Null);
00200   }
00201   ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
00202     assert(E->getType()->isAnyComplexType() && "Expected complex type!");
00203     QualType Elem = E->getType()->getAs<ComplexType>()->getElementType();
00204     llvm::Constant *Null =
00205                        llvm::Constant::getNullValue(CGF.ConvertType(Elem));
00206     return ComplexPairTy(Null, Null);
00207   }
00208 
00209   struct BinOpInfo {
00210     ComplexPairTy LHS;
00211     ComplexPairTy RHS;
00212     QualType Ty;  // Computation Type.
00213   };
00214 
00215   BinOpInfo EmitBinOps(const BinaryOperator *E);
00216   LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E,
00217                                   ComplexPairTy (ComplexExprEmitter::*Func)
00218                                   (const BinOpInfo &),
00219                                   ComplexPairTy &Val);
00220   ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E,
00221                                    ComplexPairTy (ComplexExprEmitter::*Func)
00222                                    (const BinOpInfo &));
00223 
00224   ComplexPairTy EmitBinAdd(const BinOpInfo &Op);
00225   ComplexPairTy EmitBinSub(const BinOpInfo &Op);
00226   ComplexPairTy EmitBinMul(const BinOpInfo &Op);
00227   ComplexPairTy EmitBinDiv(const BinOpInfo &Op);
00228 
00229   ComplexPairTy VisitBinAdd(const BinaryOperator *E) {
00230     return EmitBinAdd(EmitBinOps(E));
00231   }
00232   ComplexPairTy VisitBinSub(const BinaryOperator *E) {
00233     return EmitBinSub(EmitBinOps(E));
00234   }
00235   ComplexPairTy VisitBinMul(const BinaryOperator *E) {
00236     return EmitBinMul(EmitBinOps(E));
00237   }
00238   ComplexPairTy VisitBinDiv(const BinaryOperator *E) {
00239     return EmitBinDiv(EmitBinOps(E));
00240   }
00241 
00242   // Compound assignments.
00243   ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) {
00244     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd);
00245   }
00246   ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) {
00247     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub);
00248   }
00249   ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) {
00250     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul);
00251   }
00252   ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) {
00253     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv);
00254   }
00255 
00256   // GCC rejects rem/and/or/xor for integer complex.
00257   // Logical and/or always return int, never complex.
00258 
00259   // No comparisons produce a complex result.
00260 
00261   LValue EmitBinAssignLValue(const BinaryOperator *E,
00262                              ComplexPairTy &Val);
00263   ComplexPairTy VisitBinAssign     (const BinaryOperator *E);
00264   ComplexPairTy VisitBinComma      (const BinaryOperator *E);
00265 
00266 
00267   ComplexPairTy
00268   VisitAbstractConditionalOperator(const AbstractConditionalOperator *CO);
00269   ComplexPairTy VisitChooseExpr(ChooseExpr *CE);
00270 
00271   ComplexPairTy VisitInitListExpr(InitListExpr *E);
00272 
00273   ComplexPairTy VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
00274     return EmitLoadOfLValue(E);
00275   }
00276 
00277   ComplexPairTy VisitVAArgExpr(VAArgExpr *E);
00278 
00279   ComplexPairTy VisitAtomicExpr(AtomicExpr *E) {
00280     return CGF.EmitAtomicExpr(E).getComplexVal();
00281   }
00282 };
00283 }  // end anonymous namespace.
00284 
00285 //===----------------------------------------------------------------------===//
00286 //                                Utilities
00287 //===----------------------------------------------------------------------===//
00288 
00289 /// EmitLoadOfComplex - Given an RValue reference for a complex, emit code to
00290 /// load the real and imaginary pieces, returning them as Real/Imag.
00291 ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr,
00292                                                     bool isVolatile) {
00293   llvm::Value *Real=0, *Imag=0;
00294 
00295   if (!IgnoreReal || isVolatile) {
00296     llvm::Value *RealP = Builder.CreateStructGEP(SrcPtr, 0,
00297                                                  SrcPtr->getName() + ".realp");
00298     Real = Builder.CreateLoad(RealP, isVolatile, SrcPtr->getName() + ".real");
00299   }
00300 
00301   if (!IgnoreImag || isVolatile) {
00302     llvm::Value *ImagP = Builder.CreateStructGEP(SrcPtr, 1,
00303                                                  SrcPtr->getName() + ".imagp");
00304     Imag = Builder.CreateLoad(ImagP, isVolatile, SrcPtr->getName() + ".imag");
00305   }
00306   return ComplexPairTy(Real, Imag);
00307 }
00308 
00309 /// EmitStoreOfComplex - Store the specified real/imag parts into the
00310 /// specified value pointer.
00311 void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *Ptr,
00312                                             bool isVolatile) {
00313   llvm::Value *RealPtr = Builder.CreateStructGEP(Ptr, 0, "real");
00314   llvm::Value *ImagPtr = Builder.CreateStructGEP(Ptr, 1, "imag");
00315 
00316   Builder.CreateStore(Val.first, RealPtr, isVolatile);
00317   Builder.CreateStore(Val.second, ImagPtr, isVolatile);
00318 }
00319 
00320 
00321 
00322 //===----------------------------------------------------------------------===//
00323 //                            Visitor Methods
00324 //===----------------------------------------------------------------------===//
00325 
00326 ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
00327   CGF.ErrorUnsupported(E, "complex expression");
00328   llvm::Type *EltTy =
00329   CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType());
00330   llvm::Value *U = llvm::UndefValue::get(EltTy);
00331   return ComplexPairTy(U, U);
00332 }
00333 
00334 ComplexPairTy ComplexExprEmitter::
00335 VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
00336   llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
00337   return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag);
00338 }
00339 
00340 
00341 ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) {
00342   if (E->getCallReturnType()->isReferenceType())
00343     return EmitLoadOfLValue(E);
00344 
00345   return CGF.EmitCallExpr(E).getComplexVal();
00346 }
00347 
00348 ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) {
00349   CodeGenFunction::StmtExprEvaluation eval(CGF);
00350   return CGF.EmitCompoundStmt(*E->getSubStmt(), true).getComplexVal();
00351 }
00352 
00353 /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
00354 ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
00355                                                            QualType SrcType,
00356                                                            QualType DestType) {
00357   // Get the src/dest element type.
00358   SrcType = SrcType->getAs<ComplexType>()->getElementType();
00359   DestType = DestType->getAs<ComplexType>()->getElementType();
00360 
00361   // C99 6.3.1.6: When a value of complex type is converted to another
00362   // complex type, both the real and imaginary parts follow the conversion
00363   // rules for the corresponding real types.
00364   Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType);
00365   Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType);
00366   return Val;
00367 }
00368 
00369 ComplexPairTy ComplexExprEmitter::EmitCast(CastExpr::CastKind CK, Expr *Op, 
00370                                            QualType DestTy) {
00371   switch (CK) {
00372   case CK_Dependent: llvm_unreachable("dependent cast kind in IR gen!");
00373 
00374   // Atomic to non-atomic casts may be more than a no-op for some platforms and
00375   // for some types.
00376   case CK_AtomicToNonAtomic:
00377   case CK_NonAtomicToAtomic:
00378   case CK_NoOp:
00379   case CK_LValueToRValue:
00380   case CK_UserDefinedConversion:
00381     return Visit(Op);
00382 
00383   case CK_LValueBitCast: {
00384     llvm::Value *V = CGF.EmitLValue(Op).getAddress();
00385     V = Builder.CreateBitCast(V, 
00386                     CGF.ConvertType(CGF.getContext().getPointerType(DestTy)));
00387     // FIXME: Are the qualifiers correct here?
00388     return EmitLoadOfComplex(V, DestTy.isVolatileQualified());
00389   }
00390 
00391   case CK_BitCast:
00392   case CK_BaseToDerived:
00393   case CK_DerivedToBase:
00394   case CK_UncheckedDerivedToBase:
00395   case CK_Dynamic:
00396   case CK_ToUnion:
00397   case CK_ArrayToPointerDecay:
00398   case CK_FunctionToPointerDecay:
00399   case CK_NullToPointer:
00400   case CK_NullToMemberPointer:
00401   case CK_BaseToDerivedMemberPointer:
00402   case CK_DerivedToBaseMemberPointer:
00403   case CK_MemberPointerToBoolean:
00404   case CK_ReinterpretMemberPointer:
00405   case CK_ConstructorConversion:
00406   case CK_IntegralToPointer:
00407   case CK_PointerToIntegral:
00408   case CK_PointerToBoolean:
00409   case CK_ToVoid:
00410   case CK_VectorSplat:
00411   case CK_IntegralCast:
00412   case CK_IntegralToBoolean:
00413   case CK_IntegralToFloating:
00414   case CK_FloatingToIntegral:
00415   case CK_FloatingToBoolean:
00416   case CK_FloatingCast:
00417   case CK_CPointerToObjCPointerCast:
00418   case CK_BlockPointerToObjCPointerCast:
00419   case CK_AnyPointerToBlockPointerCast:
00420   case CK_ObjCObjectLValueCast:
00421   case CK_FloatingComplexToReal:
00422   case CK_FloatingComplexToBoolean:
00423   case CK_IntegralComplexToReal:
00424   case CK_IntegralComplexToBoolean:
00425   case CK_ARCProduceObject:
00426   case CK_ARCConsumeObject:
00427   case CK_ARCReclaimReturnedObject:
00428   case CK_ARCExtendBlockObject:
00429   case CK_CopyAndAutoreleaseBlockObject:
00430     llvm_unreachable("invalid cast kind for complex value");
00431 
00432   case CK_FloatingRealToComplex:
00433   case CK_IntegralRealToComplex: {
00434     llvm::Value *Elt = CGF.EmitScalarExpr(Op);
00435 
00436     // Convert the input element to the element type of the complex.
00437     DestTy = DestTy->getAs<ComplexType>()->getElementType();
00438     Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
00439 
00440     // Return (realval, 0).
00441     return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType()));
00442   }
00443 
00444   case CK_FloatingComplexCast:
00445   case CK_FloatingComplexToIntegralComplex:
00446   case CK_IntegralComplexCast:
00447   case CK_IntegralComplexToFloatingComplex:
00448     return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy);
00449   }
00450 
00451   llvm_unreachable("unknown cast resulting in complex value");
00452 }
00453 
00454 ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
00455   TestAndClearIgnoreReal();
00456   TestAndClearIgnoreImag();
00457   ComplexPairTy Op = Visit(E->getSubExpr());
00458 
00459   llvm::Value *ResR, *ResI;
00460   if (Op.first->getType()->isFloatingPointTy()) {
00461     ResR = Builder.CreateFNeg(Op.first,  "neg.r");
00462     ResI = Builder.CreateFNeg(Op.second, "neg.i");
00463   } else {
00464     ResR = Builder.CreateNeg(Op.first,  "neg.r");
00465     ResI = Builder.CreateNeg(Op.second, "neg.i");
00466   }
00467   return ComplexPairTy(ResR, ResI);
00468 }
00469 
00470 ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
00471   TestAndClearIgnoreReal();
00472   TestAndClearIgnoreImag();
00473   // ~(a+ib) = a + i*-b
00474   ComplexPairTy Op = Visit(E->getSubExpr());
00475   llvm::Value *ResI;
00476   if (Op.second->getType()->isFloatingPointTy())
00477     ResI = Builder.CreateFNeg(Op.second, "conj.i");
00478   else
00479     ResI = Builder.CreateNeg(Op.second, "conj.i");
00480 
00481   return ComplexPairTy(Op.first, ResI);
00482 }
00483 
00484 ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) {
00485   llvm::Value *ResR, *ResI;
00486 
00487   if (Op.LHS.first->getType()->isFloatingPointTy()) {
00488     ResR = Builder.CreateFAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
00489     ResI = Builder.CreateFAdd(Op.LHS.second, Op.RHS.second, "add.i");
00490   } else {
00491     ResR = Builder.CreateAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
00492     ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i");
00493   }
00494   return ComplexPairTy(ResR, ResI);
00495 }
00496 
00497 ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) {
00498   llvm::Value *ResR, *ResI;
00499   if (Op.LHS.first->getType()->isFloatingPointTy()) {
00500     ResR = Builder.CreateFSub(Op.LHS.first,  Op.RHS.first,  "sub.r");
00501     ResI = Builder.CreateFSub(Op.LHS.second, Op.RHS.second, "sub.i");
00502   } else {
00503     ResR = Builder.CreateSub(Op.LHS.first,  Op.RHS.first,  "sub.r");
00504     ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i");
00505   }
00506   return ComplexPairTy(ResR, ResI);
00507 }
00508 
00509 
00510 ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) {
00511   using llvm::Value;
00512   Value *ResR, *ResI;
00513 
00514   if (Op.LHS.first->getType()->isFloatingPointTy()) {
00515     Value *ResRl = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul.rl");
00516     Value *ResRr = Builder.CreateFMul(Op.LHS.second, Op.RHS.second,"mul.rr");
00517     ResR  = Builder.CreateFSub(ResRl, ResRr, "mul.r");
00518 
00519     Value *ResIl = Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul.il");
00520     Value *ResIr = Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul.ir");
00521     ResI  = Builder.CreateFAdd(ResIl, ResIr, "mul.i");
00522   } else {
00523     Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl");
00524     Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second,"mul.rr");
00525     ResR  = Builder.CreateSub(ResRl, ResRr, "mul.r");
00526 
00527     Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il");
00528     Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir");
00529     ResI  = Builder.CreateAdd(ResIl, ResIr, "mul.i");
00530   }
00531   return ComplexPairTy(ResR, ResI);
00532 }
00533 
00534 ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) {
00535   llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second;
00536   llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second;
00537 
00538 
00539   llvm::Value *DSTr, *DSTi;
00540   if (Op.LHS.first->getType()->isFloatingPointTy()) {
00541     // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
00542     llvm::Value *Tmp1 = Builder.CreateFMul(LHSr, RHSr); // a*c
00543     llvm::Value *Tmp2 = Builder.CreateFMul(LHSi, RHSi); // b*d
00544     llvm::Value *Tmp3 = Builder.CreateFAdd(Tmp1, Tmp2); // ac+bd
00545 
00546     llvm::Value *Tmp4 = Builder.CreateFMul(RHSr, RHSr); // c*c
00547     llvm::Value *Tmp5 = Builder.CreateFMul(RHSi, RHSi); // d*d
00548     llvm::Value *Tmp6 = Builder.CreateFAdd(Tmp4, Tmp5); // cc+dd
00549 
00550     llvm::Value *Tmp7 = Builder.CreateFMul(LHSi, RHSr); // b*c
00551     llvm::Value *Tmp8 = Builder.CreateFMul(LHSr, RHSi); // a*d
00552     llvm::Value *Tmp9 = Builder.CreateFSub(Tmp7, Tmp8); // bc-ad
00553 
00554     DSTr = Builder.CreateFDiv(Tmp3, Tmp6);
00555     DSTi = Builder.CreateFDiv(Tmp9, Tmp6);
00556   } else {
00557     // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
00558     llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr); // a*c
00559     llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi); // b*d
00560     llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2); // ac+bd
00561 
00562     llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr); // c*c
00563     llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi); // d*d
00564     llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5); // cc+dd
00565 
00566     llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr); // b*c
00567     llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi); // a*d
00568     llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8); // bc-ad
00569 
00570     if (Op.Ty->getAs<ComplexType>()->getElementType()->isUnsignedIntegerType()) {
00571       DSTr = Builder.CreateUDiv(Tmp3, Tmp6);
00572       DSTi = Builder.CreateUDiv(Tmp9, Tmp6);
00573     } else {
00574       DSTr = Builder.CreateSDiv(Tmp3, Tmp6);
00575       DSTi = Builder.CreateSDiv(Tmp9, Tmp6);
00576     }
00577   }
00578 
00579   return ComplexPairTy(DSTr, DSTi);
00580 }
00581 
00582 ComplexExprEmitter::BinOpInfo
00583 ComplexExprEmitter::EmitBinOps(const BinaryOperator *E) {
00584   TestAndClearIgnoreReal();
00585   TestAndClearIgnoreImag();
00586   BinOpInfo Ops;
00587   Ops.LHS = Visit(E->getLHS());
00588   Ops.RHS = Visit(E->getRHS());
00589   Ops.Ty = E->getType();
00590   return Ops;
00591 }
00592 
00593 
00594 LValue ComplexExprEmitter::
00595 EmitCompoundAssignLValue(const CompoundAssignOperator *E,
00596           ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&),
00597                          ComplexPairTy &Val) {
00598   TestAndClearIgnoreReal();
00599   TestAndClearIgnoreImag();
00600   QualType LHSTy = E->getLHS()->getType();
00601 
00602   BinOpInfo OpInfo;
00603 
00604   // Load the RHS and LHS operands.
00605   // __block variables need to have the rhs evaluated first, plus this should
00606   // improve codegen a little.
00607   OpInfo.Ty = E->getComputationResultType();
00608 
00609   // The RHS should have been converted to the computation type.
00610   assert(OpInfo.Ty->isAnyComplexType());
00611   assert(CGF.getContext().hasSameUnqualifiedType(OpInfo.Ty,
00612                                                  E->getRHS()->getType()));
00613   OpInfo.RHS = Visit(E->getRHS());
00614   
00615   LValue LHS = CGF.EmitLValue(E->getLHS());
00616 
00617   // Load from the l-value.
00618   ComplexPairTy LHSComplexPair = EmitLoadOfLValue(LHS);
00619   
00620   OpInfo.LHS = EmitComplexToComplexCast(LHSComplexPair, LHSTy, OpInfo.Ty);
00621 
00622   // Expand the binary operator.
00623   ComplexPairTy Result = (this->*Func)(OpInfo);
00624 
00625   // Truncate the result back to the LHS type.
00626   Result = EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy);
00627   Val = Result;
00628 
00629   // Store the result value into the LHS lvalue.
00630   EmitStoreThroughLValue(Result, LHS);
00631 
00632   return LHS;
00633 }
00634 
00635 // Compound assignments.
00636 ComplexPairTy ComplexExprEmitter::
00637 EmitCompoundAssign(const CompoundAssignOperator *E,
00638                    ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){
00639   ComplexPairTy Val;
00640   LValue LV = EmitCompoundAssignLValue(E, Func, Val);
00641 
00642   // The result of an assignment in C is the assigned r-value.
00643   if (!CGF.getContext().getLangOpts().CPlusPlus)
00644     return Val;
00645 
00646   // If the lvalue is non-volatile, return the computed value of the assignment.
00647   if (!LV.isVolatileQualified())
00648     return Val;
00649 
00650   return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified());
00651 }
00652 
00653 LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E,
00654                                                ComplexPairTy &Val) {
00655   assert(CGF.getContext().hasSameUnqualifiedType(E->getLHS()->getType(), 
00656                                                  E->getRHS()->getType()) &&
00657          "Invalid assignment");
00658   TestAndClearIgnoreReal();
00659   TestAndClearIgnoreImag();
00660 
00661   // Emit the RHS.  __block variables need the RHS evaluated first.
00662   Val = Visit(E->getRHS());
00663 
00664   // Compute the address to store into.
00665   LValue LHS = CGF.EmitLValue(E->getLHS());
00666 
00667   // Store the result value into the LHS lvalue.
00668   EmitStoreThroughLValue(Val, LHS);
00669 
00670   return LHS;
00671 }
00672 
00673 ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
00674   ComplexPairTy Val;
00675   LValue LV = EmitBinAssignLValue(E, Val);
00676 
00677   // The result of an assignment in C is the assigned r-value.
00678   if (!CGF.getContext().getLangOpts().CPlusPlus)
00679     return Val;
00680 
00681   // If the lvalue is non-volatile, return the computed value of the assignment.
00682   if (!LV.isVolatileQualified())
00683     return Val;
00684 
00685   return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified());
00686 }
00687 
00688 ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
00689   CGF.EmitIgnoredExpr(E->getLHS());
00690   return Visit(E->getRHS());
00691 }
00692 
00693 ComplexPairTy ComplexExprEmitter::
00694 VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
00695   TestAndClearIgnoreReal();
00696   TestAndClearIgnoreImag();
00697   llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
00698   llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
00699   llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
00700 
00701   // Bind the common expression if necessary.
00702   CodeGenFunction::OpaqueValueMapping binding(CGF, E);
00703 
00704   CodeGenFunction::ConditionalEvaluation eval(CGF);
00705   CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
00706 
00707   eval.begin(CGF);
00708   CGF.EmitBlock(LHSBlock);
00709   ComplexPairTy LHS = Visit(E->getTrueExpr());
00710   LHSBlock = Builder.GetInsertBlock();
00711   CGF.EmitBranch(ContBlock);
00712   eval.end(CGF);
00713 
00714   eval.begin(CGF);
00715   CGF.EmitBlock(RHSBlock);
00716   ComplexPairTy RHS = Visit(E->getFalseExpr());
00717   RHSBlock = Builder.GetInsertBlock();
00718   CGF.EmitBlock(ContBlock);
00719   eval.end(CGF);
00720 
00721   // Create a PHI node for the real part.
00722   llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.r");
00723   RealPN->addIncoming(LHS.first, LHSBlock);
00724   RealPN->addIncoming(RHS.first, RHSBlock);
00725 
00726   // Create a PHI node for the imaginary part.
00727   llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.i");
00728   ImagPN->addIncoming(LHS.second, LHSBlock);
00729   ImagPN->addIncoming(RHS.second, RHSBlock);
00730 
00731   return ComplexPairTy(RealPN, ImagPN);
00732 }
00733 
00734 ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
00735   return Visit(E->getChosenSubExpr(CGF.getContext()));
00736 }
00737 
00738 ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) {
00739     bool Ignore = TestAndClearIgnoreReal();
00740     (void)Ignore;
00741     assert (Ignore == false && "init list ignored");
00742     Ignore = TestAndClearIgnoreImag();
00743     (void)Ignore;
00744     assert (Ignore == false && "init list ignored");
00745 
00746   if (E->getNumInits() == 2) {
00747     llvm::Value *Real = CGF.EmitScalarExpr(E->getInit(0));
00748     llvm::Value *Imag = CGF.EmitScalarExpr(E->getInit(1));
00749     return ComplexPairTy(Real, Imag);
00750   } else if (E->getNumInits() == 1) {
00751     return Visit(E->getInit(0));
00752   }
00753 
00754   // Empty init list intializes to null
00755   assert(E->getNumInits() == 0 && "Unexpected number of inits");
00756   QualType Ty = E->getType()->getAs<ComplexType>()->getElementType();
00757   llvm::Type* LTy = CGF.ConvertType(Ty);
00758   llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy);
00759   return ComplexPairTy(zeroConstant, zeroConstant);
00760 }
00761 
00762 ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
00763   llvm::Value *ArgValue = CGF.EmitVAListRef(E->getSubExpr());
00764   llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, E->getType());
00765 
00766   if (!ArgPtr) {
00767     CGF.ErrorUnsupported(E, "complex va_arg expression");
00768     llvm::Type *EltTy =
00769       CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType());
00770     llvm::Value *U = llvm::UndefValue::get(EltTy);
00771     return ComplexPairTy(U, U);
00772   }
00773 
00774   // FIXME Volatility.
00775   return EmitLoadOfComplex(ArgPtr, false);
00776 }
00777 
00778 //===----------------------------------------------------------------------===//
00779 //                         Entry Point into this File
00780 //===----------------------------------------------------------------------===//
00781 
00782 /// EmitComplexExpr - Emit the computation of the specified expression of
00783 /// complex type, ignoring the result.
00784 ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal,
00785                                                bool IgnoreImag) {
00786   assert(E && E->getType()->isAnyComplexType() &&
00787          "Invalid complex expression to emit");
00788 
00789   return ComplexExprEmitter(*this, IgnoreReal, IgnoreImag)
00790     .Visit(const_cast<Expr*>(E));
00791 }
00792 
00793 /// EmitComplexExprIntoAddr - Emit the computation of the specified expression
00794 /// of complex type, storing into the specified Value*.
00795 void CodeGenFunction::EmitComplexExprIntoAddr(const Expr *E,
00796                                               llvm::Value *DestAddr,
00797                                               bool DestIsVolatile) {
00798   assert(E && E->getType()->isAnyComplexType() &&
00799          "Invalid complex expression to emit");
00800   ComplexExprEmitter Emitter(*this);
00801   ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
00802   Emitter.EmitStoreOfComplex(Val, DestAddr, DestIsVolatile);
00803 }
00804 
00805 /// StoreComplexToAddr - Store a complex number into the specified address.
00806 void CodeGenFunction::StoreComplexToAddr(ComplexPairTy V,
00807                                          llvm::Value *DestAddr,
00808                                          bool DestIsVolatile) {
00809   ComplexExprEmitter(*this).EmitStoreOfComplex(V, DestAddr, DestIsVolatile);
00810 }
00811 
00812 /// LoadComplexFromAddr - Load a complex number from the specified address.
00813 ComplexPairTy CodeGenFunction::LoadComplexFromAddr(llvm::Value *SrcAddr,
00814                                                    bool SrcIsVolatile) {
00815   return ComplexExprEmitter(*this).EmitLoadOfComplex(SrcAddr, SrcIsVolatile);
00816 }
00817 
00818 LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) {
00819   assert(E->getOpcode() == BO_Assign);
00820   ComplexPairTy Val; // ignored
00821   return ComplexExprEmitter(*this).EmitBinAssignLValue(E, Val);
00822 }
00823 
00824 LValue CodeGenFunction::
00825 EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E) {
00826   ComplexPairTy(ComplexExprEmitter::*Op)(const ComplexExprEmitter::BinOpInfo &);
00827   switch (E->getOpcode()) {
00828   case BO_MulAssign: Op = &ComplexExprEmitter::EmitBinMul; break;
00829   case BO_DivAssign: Op = &ComplexExprEmitter::EmitBinDiv; break;
00830   case BO_SubAssign: Op = &ComplexExprEmitter::EmitBinSub; break;
00831   case BO_AddAssign: Op = &ComplexExprEmitter::EmitBinAdd; break;
00832 
00833   default:
00834     llvm_unreachable("unexpected complex compound assignment");
00835   }
00836 
00837   ComplexPairTy Val; // ignored
00838   return ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
00839 }