1*7a51313dSChris Lattner //===--- CGExprComplex.cpp - Emit LLVM Code for Complex Exprs -------------===//
2*7a51313dSChris Lattner //
3*7a51313dSChris Lattner //                     The LLVM Compiler Infrastructure
4*7a51313dSChris Lattner //
5*7a51313dSChris Lattner // This file is distributed under the University of Illinois Open Source
6*7a51313dSChris Lattner // License. See LICENSE.TXT for details.
7*7a51313dSChris Lattner //
8*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
9*7a51313dSChris Lattner //
10*7a51313dSChris Lattner // This contains code to emit Expr nodes with complex types as LLVM code.
11*7a51313dSChris Lattner //
12*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
13*7a51313dSChris Lattner 
14*7a51313dSChris Lattner #include "CodeGenFunction.h"
15*7a51313dSChris Lattner #include "CodeGenModule.h"
16*7a51313dSChris Lattner #include "clang/AST/AST.h"
17*7a51313dSChris Lattner #include "llvm/Constants.h"
18*7a51313dSChris Lattner #include "llvm/Function.h"
19*7a51313dSChris Lattner #include "llvm/ADT/SmallString.h"
20*7a51313dSChris Lattner #include "llvm/Support/Compiler.h"
21*7a51313dSChris Lattner using namespace clang;
22*7a51313dSChris Lattner using namespace CodeGen;
23*7a51313dSChris Lattner 
24*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
25*7a51313dSChris Lattner //                        Complex Expression Emitter
26*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
27*7a51313dSChris Lattner 
28*7a51313dSChris Lattner typedef CodeGenFunction::ComplexPairTy ComplexPairTy;
29*7a51313dSChris Lattner 
30*7a51313dSChris Lattner namespace  {
31*7a51313dSChris Lattner class VISIBILITY_HIDDEN ComplexExprEmitter
32*7a51313dSChris Lattner   : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
33*7a51313dSChris Lattner   CodeGenFunction &CGF;
34*7a51313dSChris Lattner   llvm::LLVMFoldingBuilder &Builder;
35*7a51313dSChris Lattner public:
36*7a51313dSChris Lattner   ComplexExprEmitter(CodeGenFunction &cgf) : CGF(cgf), Builder(CGF.Builder) {
37*7a51313dSChris Lattner   }
38*7a51313dSChris Lattner 
39*7a51313dSChris Lattner 
40*7a51313dSChris Lattner   //===--------------------------------------------------------------------===//
41*7a51313dSChris Lattner   //                               Utilities
42*7a51313dSChris Lattner   //===--------------------------------------------------------------------===//
43*7a51313dSChris Lattner 
44*7a51313dSChris Lattner   /// EmitLoadOfLValue - Given an expression with complex type that represents a
45*7a51313dSChris Lattner   /// value l-value, this method emits the address of the l-value, then loads
46*7a51313dSChris Lattner   /// and returns the result.
47*7a51313dSChris Lattner   ComplexPairTy EmitLoadOfLValue(const Expr *E) {
48*7a51313dSChris Lattner     LValue LV = CGF.EmitLValue(E);
49*7a51313dSChris Lattner     // FIXME: Volatile
50*7a51313dSChris Lattner     return EmitLoadOfComplex(LV.getAddress(), false);
51*7a51313dSChris Lattner   }
52*7a51313dSChris Lattner 
53*7a51313dSChris Lattner   /// EmitLoadOfComplex - Given a pointer to a complex value, emit code to load
54*7a51313dSChris Lattner   /// the real and imaginary pieces.
55*7a51313dSChris Lattner   ComplexPairTy EmitLoadOfComplex(llvm::Value *SrcPtr, bool isVolatile);
56*7a51313dSChris Lattner 
57*7a51313dSChris Lattner   /// EmitStoreOfComplex - Store the specified real/imag parts into the
58*7a51313dSChris Lattner   /// specified value pointer.
59*7a51313dSChris Lattner   void EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *ResPtr, bool isVol);
60*7a51313dSChris Lattner 
61*7a51313dSChris Lattner   /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
62*7a51313dSChris Lattner   ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType,
63*7a51313dSChris Lattner                                          QualType DestType);
64*7a51313dSChris Lattner 
65*7a51313dSChris Lattner   //===--------------------------------------------------------------------===//
66*7a51313dSChris Lattner   //                            Visitor Methods
67*7a51313dSChris Lattner   //===--------------------------------------------------------------------===//
68*7a51313dSChris Lattner 
69*7a51313dSChris Lattner   ComplexPairTy VisitStmt(Stmt *S) {
70*7a51313dSChris Lattner     S->dump(CGF.getContext().getSourceManager());
71*7a51313dSChris Lattner     assert(0 && "Stmt can't have complex result type!");
72*7a51313dSChris Lattner     return ComplexPairTy();
73*7a51313dSChris Lattner   }
74*7a51313dSChris Lattner   ComplexPairTy VisitExpr(Expr *S);
75*7a51313dSChris Lattner   ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());}
76*7a51313dSChris Lattner   ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL);
77*7a51313dSChris Lattner 
78*7a51313dSChris Lattner   // l-values.
79*7a51313dSChris Lattner   ComplexPairTy VisitDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); }
80*7a51313dSChris Lattner   ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); }
81*7a51313dSChris Lattner   ComplexPairTy VisitMemberExpr(const Expr *E) { return EmitLoadOfLValue(E); }
82*7a51313dSChris Lattner 
83*7a51313dSChris Lattner   // FIXME: CompoundLiteralExpr
84*7a51313dSChris Lattner 
85*7a51313dSChris Lattner   ComplexPairTy EmitCast(Expr *Op, QualType DestTy);
86*7a51313dSChris Lattner   ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) {
87*7a51313dSChris Lattner     // Unlike for scalars, we don't have to worry about function->ptr demotion
88*7a51313dSChris Lattner     // here.
89*7a51313dSChris Lattner     return EmitCast(E->getSubExpr(), E->getType());
90*7a51313dSChris Lattner   }
91*7a51313dSChris Lattner   ComplexPairTy VisitCastExpr(CastExpr *E) {
92*7a51313dSChris Lattner     return EmitCast(E->getSubExpr(), E->getType());
93*7a51313dSChris Lattner   }
94*7a51313dSChris Lattner   ComplexPairTy VisitCallExpr(const CallExpr *E);
95*7a51313dSChris Lattner   ComplexPairTy VisitStmtExpr(const StmtExpr *E);
96*7a51313dSChris Lattner   ComplexPairTy VisitOverloadExpr(const OverloadExpr *OE);
97*7a51313dSChris Lattner 
98*7a51313dSChris Lattner   // Operators.
99*7a51313dSChris Lattner   ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E,
100*7a51313dSChris Lattner                                    bool isInc, bool isPre);
101*7a51313dSChris Lattner   ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) {
102*7a51313dSChris Lattner     return VisitPrePostIncDec(E, false, false);
103*7a51313dSChris Lattner   }
104*7a51313dSChris Lattner   ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) {
105*7a51313dSChris Lattner     return VisitPrePostIncDec(E, true, false);
106*7a51313dSChris Lattner   }
107*7a51313dSChris Lattner   ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) {
108*7a51313dSChris Lattner     return VisitPrePostIncDec(E, false, true);
109*7a51313dSChris Lattner   }
110*7a51313dSChris Lattner   ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) {
111*7a51313dSChris Lattner     return VisitPrePostIncDec(E, true, true);
112*7a51313dSChris Lattner   }
113*7a51313dSChris Lattner   ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
114*7a51313dSChris Lattner   ComplexPairTy VisitUnaryPlus     (const UnaryOperator *E) {
115*7a51313dSChris Lattner     return Visit(E->getSubExpr());
116*7a51313dSChris Lattner   }
117*7a51313dSChris Lattner   ComplexPairTy VisitUnaryMinus    (const UnaryOperator *E);
118*7a51313dSChris Lattner   ComplexPairTy VisitUnaryNot      (const UnaryOperator *E);
119*7a51313dSChris Lattner   // LNot,SizeOf,AlignOf,Real,Imag never return complex.
120*7a51313dSChris Lattner   ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) {
121*7a51313dSChris Lattner     return Visit(E->getSubExpr());
122*7a51313dSChris Lattner   }
123*7a51313dSChris Lattner 
124*7a51313dSChris Lattner   struct BinOpInfo {
125*7a51313dSChris Lattner     ComplexPairTy LHS;
126*7a51313dSChris Lattner     ComplexPairTy RHS;
127*7a51313dSChris Lattner     QualType Ty;  // Computation Type.
128*7a51313dSChris Lattner   };
129*7a51313dSChris Lattner 
130*7a51313dSChris Lattner   BinOpInfo EmitBinOps(const BinaryOperator *E);
131*7a51313dSChris Lattner   ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E,
132*7a51313dSChris Lattner                                    ComplexPairTy (ComplexExprEmitter::*Func)
133*7a51313dSChris Lattner                                    (const BinOpInfo &));
134*7a51313dSChris Lattner 
135*7a51313dSChris Lattner   ComplexPairTy EmitBinAdd(const BinOpInfo &Op);
136*7a51313dSChris Lattner   ComplexPairTy EmitBinSub(const BinOpInfo &Op);
137*7a51313dSChris Lattner   ComplexPairTy EmitBinMul(const BinOpInfo &Op);
138*7a51313dSChris Lattner   ComplexPairTy EmitBinDiv(const BinOpInfo &Op);
139*7a51313dSChris Lattner 
140*7a51313dSChris Lattner   ComplexPairTy VisitBinMul(const BinaryOperator *E) {
141*7a51313dSChris Lattner     return EmitBinMul(EmitBinOps(E));
142*7a51313dSChris Lattner   }
143*7a51313dSChris Lattner   ComplexPairTy VisitBinAdd(const BinaryOperator *E) {
144*7a51313dSChris Lattner     return EmitBinAdd(EmitBinOps(E));
145*7a51313dSChris Lattner   }
146*7a51313dSChris Lattner   ComplexPairTy VisitBinSub(const BinaryOperator *E) {
147*7a51313dSChris Lattner     return EmitBinSub(EmitBinOps(E));
148*7a51313dSChris Lattner   }
149*7a51313dSChris Lattner   ComplexPairTy VisitBinDiv(const BinaryOperator *E) {
150*7a51313dSChris Lattner     return EmitBinDiv(EmitBinOps(E));
151*7a51313dSChris Lattner   }
152*7a51313dSChris Lattner 
153*7a51313dSChris Lattner   // Compound assignments.
154*7a51313dSChris Lattner   ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) {
155*7a51313dSChris Lattner     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd);
156*7a51313dSChris Lattner   }
157*7a51313dSChris Lattner   ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) {
158*7a51313dSChris Lattner     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub);
159*7a51313dSChris Lattner   }
160*7a51313dSChris Lattner   ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) {
161*7a51313dSChris Lattner     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul);
162*7a51313dSChris Lattner   }
163*7a51313dSChris Lattner   ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) {
164*7a51313dSChris Lattner     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv);
165*7a51313dSChris Lattner   }
166*7a51313dSChris Lattner 
167*7a51313dSChris Lattner   // GCC rejects rem/and/or/xor for integer complex.
168*7a51313dSChris Lattner   // Logical and/or always return int, never complex.
169*7a51313dSChris Lattner 
170*7a51313dSChris Lattner   // No comparisons produce a complex result.
171*7a51313dSChris Lattner   ComplexPairTy VisitBinAssign     (const BinaryOperator *E);
172*7a51313dSChris Lattner   ComplexPairTy VisitBinComma      (const BinaryOperator *E);
173*7a51313dSChris Lattner 
174*7a51313dSChris Lattner 
175*7a51313dSChris Lattner   ComplexPairTy VisitConditionalOperator(const ConditionalOperator *CO);
176*7a51313dSChris Lattner   ComplexPairTy VisitChooseExpr(ChooseExpr *CE);
177*7a51313dSChris Lattner };
178*7a51313dSChris Lattner }  // end anonymous namespace.
179*7a51313dSChris Lattner 
180*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
181*7a51313dSChris Lattner //                                Utilities
182*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
183*7a51313dSChris Lattner 
184*7a51313dSChris Lattner /// EmitLoadOfComplex - Given an RValue reference for a complex, emit code to
185*7a51313dSChris Lattner /// load the real and imaginary pieces, returning them as Real/Imag.
186*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr,
187*7a51313dSChris Lattner                                                     bool isVolatile) {
188*7a51313dSChris Lattner   llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
189*7a51313dSChris Lattner   llvm::Constant *One  = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
190*7a51313dSChris Lattner 
191*7a51313dSChris Lattner   llvm::SmallString<64> Name(SrcPtr->getNameStart(),
192*7a51313dSChris Lattner                              SrcPtr->getNameStart()+SrcPtr->getNameLen());
193*7a51313dSChris Lattner 
194*7a51313dSChris Lattner   Name += ".realp";
195*7a51313dSChris Lattner   llvm::Value *Ops[] = {Zero, Zero};
196*7a51313dSChris Lattner   llvm::Value *RealPtr = Builder.CreateGEP(SrcPtr, Ops, Ops+2, Name.c_str());
197*7a51313dSChris Lattner 
198*7a51313dSChris Lattner   Name.pop_back();  // .realp -> .real
199*7a51313dSChris Lattner   llvm::Value *Real = Builder.CreateLoad(RealPtr, isVolatile, Name.c_str());
200*7a51313dSChris Lattner 
201*7a51313dSChris Lattner   Name.resize(Name.size()-4); // .real -> .imagp
202*7a51313dSChris Lattner   Name += "imagp";
203*7a51313dSChris Lattner 
204*7a51313dSChris Lattner   Ops[1] = One; // { Ops = { Zero, One }
205*7a51313dSChris Lattner   llvm::Value *ImagPtr = Builder.CreateGEP(SrcPtr, Ops, Ops+2, Name.c_str());
206*7a51313dSChris Lattner 
207*7a51313dSChris Lattner   Name.pop_back();  // .imagp -> .imag
208*7a51313dSChris Lattner   llvm::Value *Imag = Builder.CreateLoad(ImagPtr, isVolatile, Name.c_str());
209*7a51313dSChris Lattner   return ComplexPairTy(Real, Imag);
210*7a51313dSChris Lattner }
211*7a51313dSChris Lattner 
212*7a51313dSChris Lattner /// EmitStoreOfComplex - Store the specified real/imag parts into the
213*7a51313dSChris Lattner /// specified value pointer.
214*7a51313dSChris Lattner void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *Ptr,
215*7a51313dSChris Lattner                                             bool isVolatile) {
216*7a51313dSChris Lattner   llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
217*7a51313dSChris Lattner   llvm::Constant *One  = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
218*7a51313dSChris Lattner 
219*7a51313dSChris Lattner   llvm::Value *Ops[] = {Zero, Zero};
220*7a51313dSChris Lattner   llvm::Value *RealPtr = Builder.CreateGEP(Ptr, Ops, Ops+2, "real");
221*7a51313dSChris Lattner 
222*7a51313dSChris Lattner   Ops[1] = One; // { Ops = { Zero, One }
223*7a51313dSChris Lattner   llvm::Value *ImagPtr = Builder.CreateGEP(Ptr, Ops, Ops+2, "imag");
224*7a51313dSChris Lattner 
225*7a51313dSChris Lattner   Builder.CreateStore(Val.first, RealPtr, isVolatile);
226*7a51313dSChris Lattner   Builder.CreateStore(Val.second, ImagPtr, isVolatile);
227*7a51313dSChris Lattner }
228*7a51313dSChris Lattner 
229*7a51313dSChris Lattner 
230*7a51313dSChris Lattner 
231*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
232*7a51313dSChris Lattner //                            Visitor Methods
233*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
234*7a51313dSChris Lattner 
235*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
236*7a51313dSChris Lattner   CGF.WarnUnsupported(E, "complex expression");
237*7a51313dSChris Lattner   const llvm::Type *EltTy =
238*7a51313dSChris Lattner     CGF.ConvertType(E->getType()->getAsComplexType()->getElementType());
239*7a51313dSChris Lattner   llvm::Value *U = llvm::UndefValue::get(EltTy);
240*7a51313dSChris Lattner   return ComplexPairTy(U, U);
241*7a51313dSChris Lattner }
242*7a51313dSChris Lattner 
243*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::
244*7a51313dSChris Lattner VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
245*7a51313dSChris Lattner   llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
246*7a51313dSChris Lattner   return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag);
247*7a51313dSChris Lattner }
248*7a51313dSChris Lattner 
249*7a51313dSChris Lattner 
250*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) {
251*7a51313dSChris Lattner   return CGF.EmitCallExpr(E).getComplexVal();
252*7a51313dSChris Lattner }
253*7a51313dSChris Lattner 
254*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitOverloadExpr(const OverloadExpr *E) {
255*7a51313dSChris Lattner   return CGF.EmitCallExpr(E->getFn(), E->arg_begin(),
256*7a51313dSChris Lattner                           E->getNumArgs(CGF.getContext())).getComplexVal();
257*7a51313dSChris Lattner }
258*7a51313dSChris Lattner 
259*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) {
260*7a51313dSChris Lattner   return CGF.EmitCompoundStmt(*E->getSubStmt(), true).getComplexVal();
261*7a51313dSChris Lattner }
262*7a51313dSChris Lattner 
263*7a51313dSChris Lattner /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
264*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
265*7a51313dSChris Lattner                                                            QualType SrcType,
266*7a51313dSChris Lattner                                                            QualType DestType) {
267*7a51313dSChris Lattner   // Get the src/dest element type.
268*7a51313dSChris Lattner   SrcType = cast<ComplexType>(SrcType.getCanonicalType())->getElementType();
269*7a51313dSChris Lattner   DestType = cast<ComplexType>(DestType.getCanonicalType())->getElementType();
270*7a51313dSChris Lattner 
271*7a51313dSChris Lattner   // C99 6.3.1.6: When a value of complextype is converted to another
272*7a51313dSChris Lattner   // complex type, both the real and imaginary parts followthe conversion
273*7a51313dSChris Lattner   // rules for the corresponding real types.
274*7a51313dSChris Lattner   Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType);
275*7a51313dSChris Lattner   Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType);
276*7a51313dSChris Lattner   return Val;
277*7a51313dSChris Lattner }
278*7a51313dSChris Lattner 
279*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::EmitCast(Expr *Op, QualType DestTy) {
280*7a51313dSChris Lattner   // Two cases here: cast from (complex to complex) and (scalar to complex).
281*7a51313dSChris Lattner   if (Op->getType()->isComplexType())
282*7a51313dSChris Lattner     return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy);
283*7a51313dSChris Lattner 
284*7a51313dSChris Lattner   // C99 6.3.1.7: When a value of real type is converted to a complex type, the
285*7a51313dSChris Lattner   // real part of the complex  result value is determined by the rules of
286*7a51313dSChris Lattner   // conversion to the corresponding real type and the imaginary part of the
287*7a51313dSChris Lattner   // complex result value is a positive zero or an unsigned zero.
288*7a51313dSChris Lattner   llvm::Value *Elt = CGF.EmitScalarExpr(Op);
289*7a51313dSChris Lattner 
290*7a51313dSChris Lattner   // Convert the input element to the element type of the complex.
291*7a51313dSChris Lattner   DestTy = cast<ComplexType>(DestTy.getCanonicalType())->getElementType();
292*7a51313dSChris Lattner   Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
293*7a51313dSChris Lattner 
294*7a51313dSChris Lattner   // Return (realval, 0).
295*7a51313dSChris Lattner   return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType()));
296*7a51313dSChris Lattner }
297*7a51313dSChris Lattner 
298*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
299*7a51313dSChris Lattner                                                      bool isInc, bool isPre) {
300*7a51313dSChris Lattner   LValue LV = CGF.EmitLValue(E->getSubExpr());
301*7a51313dSChris Lattner   // FIXME: Handle volatile!
302*7a51313dSChris Lattner   ComplexPairTy InVal = EmitLoadOfComplex(LV.getAddress(), false);
303*7a51313dSChris Lattner 
304*7a51313dSChris Lattner   uint64_t AmountVal = isInc ? 1 : -1;
305*7a51313dSChris Lattner 
306*7a51313dSChris Lattner   llvm::Value *NextVal;
307*7a51313dSChris Lattner   if (isa<llvm::IntegerType>(InVal.first->getType()))
308*7a51313dSChris Lattner     NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal);
309*7a51313dSChris Lattner   else if (InVal.first->getType() == llvm::Type::FloatTy)
310*7a51313dSChris Lattner     // FIXME: Handle long double.
311*7a51313dSChris Lattner     NextVal =
312*7a51313dSChris Lattner       llvm::ConstantFP::get(InVal.first->getType(),
313*7a51313dSChris Lattner                             llvm::APFloat(static_cast<float>(AmountVal)));
314*7a51313dSChris Lattner   else {
315*7a51313dSChris Lattner     // FIXME: Handle long double.
316*7a51313dSChris Lattner     assert(InVal.first->getType() == llvm::Type::DoubleTy);
317*7a51313dSChris Lattner     NextVal =
318*7a51313dSChris Lattner       llvm::ConstantFP::get(InVal.first->getType(),
319*7a51313dSChris Lattner                             llvm::APFloat(static_cast<double>(AmountVal)));
320*7a51313dSChris Lattner   }
321*7a51313dSChris Lattner 
322*7a51313dSChris Lattner   // Add the inc/dec to the real part.
323*7a51313dSChris Lattner   NextVal = Builder.CreateAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
324*7a51313dSChris Lattner 
325*7a51313dSChris Lattner   ComplexPairTy IncVal(NextVal, InVal.second);
326*7a51313dSChris Lattner 
327*7a51313dSChris Lattner   // Store the updated result through the lvalue.
328*7a51313dSChris Lattner   EmitStoreOfComplex(IncVal, LV.getAddress(), false);  /* FIXME: Volatile */
329*7a51313dSChris Lattner 
330*7a51313dSChris Lattner   // If this is a postinc, return the value read from memory, otherwise use the
331*7a51313dSChris Lattner   // updated value.
332*7a51313dSChris Lattner   return isPre ? IncVal : InVal;
333*7a51313dSChris Lattner }
334*7a51313dSChris Lattner 
335*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
336*7a51313dSChris Lattner   ComplexPairTy Op = Visit(E->getSubExpr());
337*7a51313dSChris Lattner   llvm::Value *ResR = Builder.CreateNeg(Op.first,  "neg.r");
338*7a51313dSChris Lattner   llvm::Value *ResI = Builder.CreateNeg(Op.second, "neg.i");
339*7a51313dSChris Lattner   return ComplexPairTy(ResR, ResI);
340*7a51313dSChris Lattner }
341*7a51313dSChris Lattner 
342*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
343*7a51313dSChris Lattner   // ~(a+ib) = a + i*-b
344*7a51313dSChris Lattner   ComplexPairTy Op = Visit(E->getSubExpr());
345*7a51313dSChris Lattner   llvm::Value *ResI = Builder.CreateNeg(Op.second, "conj.i");
346*7a51313dSChris Lattner   return ComplexPairTy(Op.first, ResI);
347*7a51313dSChris Lattner }
348*7a51313dSChris Lattner 
349*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) {
350*7a51313dSChris Lattner   llvm::Value *ResR = Builder.CreateAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
351*7a51313dSChris Lattner   llvm::Value *ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i");
352*7a51313dSChris Lattner   return ComplexPairTy(ResR, ResI);
353*7a51313dSChris Lattner }
354*7a51313dSChris Lattner 
355*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) {
356*7a51313dSChris Lattner   llvm::Value *ResR = Builder.CreateSub(Op.LHS.first,  Op.RHS.first,  "sub.r");
357*7a51313dSChris Lattner   llvm::Value *ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i");
358*7a51313dSChris Lattner   return ComplexPairTy(ResR, ResI);
359*7a51313dSChris Lattner }
360*7a51313dSChris Lattner 
361*7a51313dSChris Lattner 
362*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) {
363*7a51313dSChris Lattner   llvm::Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl");
364*7a51313dSChris Lattner   llvm::Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second,"mul.rr");
365*7a51313dSChris Lattner   llvm::Value *ResR  = Builder.CreateSub(ResRl, ResRr, "mul.r");
366*7a51313dSChris Lattner 
367*7a51313dSChris Lattner   llvm::Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il");
368*7a51313dSChris Lattner   llvm::Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir");
369*7a51313dSChris Lattner   llvm::Value *ResI  = Builder.CreateAdd(ResIl, ResIr, "mul.i");
370*7a51313dSChris Lattner   return ComplexPairTy(ResR, ResI);
371*7a51313dSChris Lattner }
372*7a51313dSChris Lattner 
373*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) {
374*7a51313dSChris Lattner   llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second;
375*7a51313dSChris Lattner   llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second;
376*7a51313dSChris Lattner 
377*7a51313dSChris Lattner   // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
378*7a51313dSChris Lattner   llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr, "tmp"); // a*c
379*7a51313dSChris Lattner   llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi, "tmp"); // b*d
380*7a51313dSChris Lattner   llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2, "tmp"); // ac+bd
381*7a51313dSChris Lattner 
382*7a51313dSChris Lattner   llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr, "tmp"); // c*c
383*7a51313dSChris Lattner   llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi, "tmp"); // d*d
384*7a51313dSChris Lattner   llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5, "tmp"); // cc+dd
385*7a51313dSChris Lattner 
386*7a51313dSChris Lattner   llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr, "tmp"); // b*c
387*7a51313dSChris Lattner   llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi, "tmp"); // a*d
388*7a51313dSChris Lattner   llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8, "tmp"); // bc-ad
389*7a51313dSChris Lattner 
390*7a51313dSChris Lattner   llvm::Value *DSTr, *DSTi;
391*7a51313dSChris Lattner   if (Tmp3->getType()->isFloatingPoint()) {
392*7a51313dSChris Lattner     DSTr = Builder.CreateFDiv(Tmp3, Tmp6, "tmp");
393*7a51313dSChris Lattner     DSTi = Builder.CreateFDiv(Tmp9, Tmp6, "tmp");
394*7a51313dSChris Lattner   } else {
395*7a51313dSChris Lattner     if (Op.Ty->getAsComplexType()->getElementType()->isUnsignedIntegerType()) {
396*7a51313dSChris Lattner       DSTr = Builder.CreateUDiv(Tmp3, Tmp6, "tmp");
397*7a51313dSChris Lattner       DSTi = Builder.CreateUDiv(Tmp9, Tmp6, "tmp");
398*7a51313dSChris Lattner     } else {
399*7a51313dSChris Lattner       DSTr = Builder.CreateSDiv(Tmp3, Tmp6, "tmp");
400*7a51313dSChris Lattner       DSTi = Builder.CreateSDiv(Tmp9, Tmp6, "tmp");
401*7a51313dSChris Lattner     }
402*7a51313dSChris Lattner   }
403*7a51313dSChris Lattner 
404*7a51313dSChris Lattner   return ComplexPairTy(DSTr, DSTi);
405*7a51313dSChris Lattner }
406*7a51313dSChris Lattner 
407*7a51313dSChris Lattner ComplexExprEmitter::BinOpInfo
408*7a51313dSChris Lattner ComplexExprEmitter::EmitBinOps(const BinaryOperator *E) {
409*7a51313dSChris Lattner   BinOpInfo Ops;
410*7a51313dSChris Lattner   Ops.LHS = Visit(E->getLHS());
411*7a51313dSChris Lattner   Ops.RHS = Visit(E->getRHS());
412*7a51313dSChris Lattner   Ops.Ty = E->getType();
413*7a51313dSChris Lattner   return Ops;
414*7a51313dSChris Lattner }
415*7a51313dSChris Lattner 
416*7a51313dSChris Lattner 
417*7a51313dSChris Lattner // Compound assignments.
418*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::
419*7a51313dSChris Lattner EmitCompoundAssign(const CompoundAssignOperator *E,
420*7a51313dSChris Lattner                    ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){
421*7a51313dSChris Lattner   QualType LHSTy = E->getLHS()->getType(), RHSTy = E->getRHS()->getType();
422*7a51313dSChris Lattner 
423*7a51313dSChris Lattner   // Load the LHS and RHS operands.
424*7a51313dSChris Lattner   LValue LHSLV = CGF.EmitLValue(E->getLHS());
425*7a51313dSChris Lattner 
426*7a51313dSChris Lattner   BinOpInfo OpInfo;
427*7a51313dSChris Lattner   OpInfo.Ty = E->getComputationType();
428*7a51313dSChris Lattner 
429*7a51313dSChris Lattner   // We know the LHS is a complex lvalue.
430*7a51313dSChris Lattner   OpInfo.LHS = EmitLoadOfComplex(LHSLV.getAddress(), false);// FIXME: Volatile.
431*7a51313dSChris Lattner   OpInfo.LHS = EmitComplexToComplexCast(OpInfo.LHS, LHSTy, OpInfo.Ty);
432*7a51313dSChris Lattner 
433*7a51313dSChris Lattner   // It is possible for the RHS to be complex or scalar.
434*7a51313dSChris Lattner   OpInfo.RHS = EmitCast(E->getRHS(), OpInfo.Ty);
435*7a51313dSChris Lattner 
436*7a51313dSChris Lattner   // Expand the binary operator.
437*7a51313dSChris Lattner   ComplexPairTy Result = (this->*Func)(OpInfo);
438*7a51313dSChris Lattner 
439*7a51313dSChris Lattner   // Truncate the result back to the LHS type.
440*7a51313dSChris Lattner   Result = EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy);
441*7a51313dSChris Lattner 
442*7a51313dSChris Lattner   // Store the result value into the LHS lvalue.
443*7a51313dSChris Lattner   EmitStoreOfComplex(Result, LHSLV.getAddress(), false); // FIXME: VOLATILE
444*7a51313dSChris Lattner   return Result;
445*7a51313dSChris Lattner }
446*7a51313dSChris Lattner 
447*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
448*7a51313dSChris Lattner   assert(E->getLHS()->getType().getCanonicalType() ==
449*7a51313dSChris Lattner          E->getRHS()->getType().getCanonicalType() && "Invalid assignment");
450*7a51313dSChris Lattner   // Emit the RHS.
451*7a51313dSChris Lattner   ComplexPairTy Val = Visit(E->getRHS());
452*7a51313dSChris Lattner 
453*7a51313dSChris Lattner   // Compute the address to store into.
454*7a51313dSChris Lattner   LValue LHS = CGF.EmitLValue(E->getLHS());
455*7a51313dSChris Lattner 
456*7a51313dSChris Lattner   // Store into it.
457*7a51313dSChris Lattner   // FIXME: Volatility!
458*7a51313dSChris Lattner   EmitStoreOfComplex(Val, LHS.getAddress(), false);
459*7a51313dSChris Lattner   return Val;
460*7a51313dSChris Lattner }
461*7a51313dSChris Lattner 
462*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
463*7a51313dSChris Lattner   CGF.EmitStmt(E->getLHS());
464*7a51313dSChris Lattner   return Visit(E->getRHS());
465*7a51313dSChris Lattner }
466*7a51313dSChris Lattner 
467*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::
468*7a51313dSChris Lattner VisitConditionalOperator(const ConditionalOperator *E) {
469*7a51313dSChris Lattner   llvm::BasicBlock *LHSBlock = new llvm::BasicBlock("cond.?");
470*7a51313dSChris Lattner   llvm::BasicBlock *RHSBlock = new llvm::BasicBlock("cond.:");
471*7a51313dSChris Lattner   llvm::BasicBlock *ContBlock = new llvm::BasicBlock("cond.cont");
472*7a51313dSChris Lattner 
473*7a51313dSChris Lattner   llvm::Value *Cond = CGF.EvaluateExprAsBool(E->getCond());
474*7a51313dSChris Lattner   Builder.CreateCondBr(Cond, LHSBlock, RHSBlock);
475*7a51313dSChris Lattner 
476*7a51313dSChris Lattner   CGF.EmitBlock(LHSBlock);
477*7a51313dSChris Lattner 
478*7a51313dSChris Lattner   // Handle the GNU extension for missing LHS.
479*7a51313dSChris Lattner   assert(E->getLHS() && "Must have LHS for complex value");
480*7a51313dSChris Lattner 
481*7a51313dSChris Lattner   ComplexPairTy LHS = Visit(E->getLHS());
482*7a51313dSChris Lattner   Builder.CreateBr(ContBlock);
483*7a51313dSChris Lattner   LHSBlock = Builder.GetInsertBlock();
484*7a51313dSChris Lattner 
485*7a51313dSChris Lattner   CGF.EmitBlock(RHSBlock);
486*7a51313dSChris Lattner 
487*7a51313dSChris Lattner   ComplexPairTy RHS = Visit(E->getRHS());
488*7a51313dSChris Lattner   Builder.CreateBr(ContBlock);
489*7a51313dSChris Lattner   RHSBlock = Builder.GetInsertBlock();
490*7a51313dSChris Lattner 
491*7a51313dSChris Lattner   CGF.EmitBlock(ContBlock);
492*7a51313dSChris Lattner 
493*7a51313dSChris Lattner   // Create a PHI node for the real part.
494*7a51313dSChris Lattner   llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), "cond.r");
495*7a51313dSChris Lattner   RealPN->reserveOperandSpace(2);
496*7a51313dSChris Lattner   RealPN->addIncoming(LHS.first, LHSBlock);
497*7a51313dSChris Lattner   RealPN->addIncoming(RHS.first, RHSBlock);
498*7a51313dSChris Lattner 
499*7a51313dSChris Lattner   // Create a PHI node for the imaginary part.
500*7a51313dSChris Lattner   llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), "cond.i");
501*7a51313dSChris Lattner   ImagPN->reserveOperandSpace(2);
502*7a51313dSChris Lattner   ImagPN->addIncoming(LHS.second, LHSBlock);
503*7a51313dSChris Lattner   ImagPN->addIncoming(RHS.second, RHSBlock);
504*7a51313dSChris Lattner 
505*7a51313dSChris Lattner   return ComplexPairTy(RealPN, ImagPN);
506*7a51313dSChris Lattner }
507*7a51313dSChris Lattner 
508*7a51313dSChris Lattner ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
509*7a51313dSChris Lattner   // Emit the LHS or RHS as appropriate.
510*7a51313dSChris Lattner   return Visit(E->isConditionTrue(CGF.getContext()) ? E->getLHS() :E->getRHS());
511*7a51313dSChris Lattner }
512*7a51313dSChris Lattner 
513*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
514*7a51313dSChris Lattner //                         Entry Point into this File
515*7a51313dSChris Lattner //===----------------------------------------------------------------------===//
516*7a51313dSChris Lattner 
517*7a51313dSChris Lattner /// EmitComplexExpr - Emit the computation of the specified expression of
518*7a51313dSChris Lattner /// complex type, ignoring the result.
519*7a51313dSChris Lattner ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E) {
520*7a51313dSChris Lattner   assert(E && E->getType()->isComplexType() &&
521*7a51313dSChris Lattner          "Invalid complex expression to emit");
522*7a51313dSChris Lattner 
523*7a51313dSChris Lattner   return ComplexExprEmitter(*this).Visit(const_cast<Expr*>(E));
524*7a51313dSChris Lattner }
525*7a51313dSChris Lattner 
526*7a51313dSChris Lattner /// EmitComplexExprIntoAddr - Emit the computation of the specified expression
527*7a51313dSChris Lattner /// of complex type, storing into the specified Value*.
528*7a51313dSChris Lattner void CodeGenFunction::EmitComplexExprIntoAddr(const Expr *E,
529*7a51313dSChris Lattner                                               llvm::Value *DestAddr,
530*7a51313dSChris Lattner                                               bool DestIsVolatile) {
531*7a51313dSChris Lattner   assert(E && E->getType()->isComplexType() &&
532*7a51313dSChris Lattner          "Invalid complex expression to emit");
533*7a51313dSChris Lattner   ComplexExprEmitter Emitter(*this);
534*7a51313dSChris Lattner   ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
535*7a51313dSChris Lattner   Emitter.EmitStoreOfComplex(Val, DestAddr, DestIsVolatile);
536*7a51313dSChris Lattner }
537*7a51313dSChris Lattner 
538*7a51313dSChris Lattner /// LoadComplexFromAddr - Load a complex number from the specified address.
539*7a51313dSChris Lattner ComplexPairTy CodeGenFunction::LoadComplexFromAddr(llvm::Value *SrcAddr,
540*7a51313dSChris Lattner                                                    bool SrcIsVolatile) {
541*7a51313dSChris Lattner   return ComplexExprEmitter(*this).EmitLoadOfComplex(SrcAddr, SrcIsVolatile);
542*7a51313dSChris Lattner }
543