clang API Documentation
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 }