1 //===--- CGExprComplex.cpp - Emit LLVM Code for Complex Exprs -------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This contains code to emit Expr nodes with complex types as LLVM code. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CodeGenFunction.h" 15 #include "CodeGenModule.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/StmtVisitor.h" 18 #include "llvm/Constants.h" 19 #include "llvm/Function.h" 20 #include "llvm/ADT/SmallString.h" 21 using namespace clang; 22 using namespace CodeGen; 23 24 //===----------------------------------------------------------------------===// 25 // Complex Expression Emitter 26 //===----------------------------------------------------------------------===// 27 28 typedef CodeGenFunction::ComplexPairTy ComplexPairTy; 29 30 namespace { 31 class ComplexExprEmitter 32 : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> { 33 CodeGenFunction &CGF; 34 CGBuilderTy &Builder; 35 // True is we should ignore the value of a 36 bool IgnoreReal; 37 bool IgnoreImag; 38 public: 39 ComplexExprEmitter(CodeGenFunction &cgf, bool ir=false, bool ii=false) 40 : CGF(cgf), Builder(CGF.Builder), IgnoreReal(ir), IgnoreImag(ii) { 41 } 42 43 44 //===--------------------------------------------------------------------===// 45 // Utilities 46 //===--------------------------------------------------------------------===// 47 48 bool TestAndClearIgnoreReal() { 49 bool I = IgnoreReal; 50 IgnoreReal = false; 51 return I; 52 } 53 bool TestAndClearIgnoreImag() { 54 bool I = IgnoreImag; 55 IgnoreImag = false; 56 return I; 57 } 58 59 /// EmitLoadOfLValue - Given an expression with complex type that represents a 60 /// value l-value, this method emits the address of the l-value, then loads 61 /// and returns the result. 62 ComplexPairTy EmitLoadOfLValue(const Expr *E) { 63 LValue LV = CGF.EmitLValue(E); 64 if (LV.isSimple()) 65 return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified()); 66 67 assert(LV.isPropertyRef() && "Unknown LValue type!"); 68 return CGF.EmitLoadOfPropertyRefLValue(LV).getComplexVal(); 69 } 70 71 /// EmitLoadOfComplex - Given a pointer to a complex value, emit code to load 72 /// the real and imaginary pieces. 73 ComplexPairTy EmitLoadOfComplex(llvm::Value *SrcPtr, bool isVolatile); 74 75 /// EmitStoreOfComplex - Store the specified real/imag parts into the 76 /// specified value pointer. 77 void EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *ResPtr, bool isVol); 78 79 /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType. 80 ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType, 81 QualType DestType); 82 83 //===--------------------------------------------------------------------===// 84 // Visitor Methods 85 //===--------------------------------------------------------------------===// 86 87 ComplexPairTy Visit(Expr *E) { 88 llvm::DenseMap<const Expr *, ComplexPairTy>::iterator I = 89 CGF.ConditionalSaveComplexExprs.find(E); 90 if (I != CGF.ConditionalSaveComplexExprs.end()) 91 return I->second; 92 93 return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::Visit(E); 94 } 95 96 ComplexPairTy VisitStmt(Stmt *S) { 97 S->dump(CGF.getContext().getSourceManager()); 98 assert(0 && "Stmt can't have complex result type!"); 99 return ComplexPairTy(); 100 } 101 ComplexPairTy VisitExpr(Expr *S); 102 ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());} 103 ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL); 104 105 // l-values. 106 ComplexPairTy VisitDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); } 107 ComplexPairTy VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 108 return EmitLoadOfLValue(E); 109 } 110 ComplexPairTy VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 111 assert(E->getObjectKind() == OK_Ordinary); 112 return EmitLoadOfLValue(E); 113 } 114 ComplexPairTy VisitObjCMessageExpr(ObjCMessageExpr *E) { 115 return CGF.EmitObjCMessageExpr(E).getComplexVal(); 116 } 117 ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); } 118 ComplexPairTy VisitMemberExpr(const Expr *E) { return EmitLoadOfLValue(E); } 119 120 // FIXME: CompoundLiteralExpr 121 122 ComplexPairTy EmitCast(CastExpr::CastKind CK, Expr *Op, QualType DestTy); 123 ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) { 124 // Unlike for scalars, we don't have to worry about function->ptr demotion 125 // here. 126 return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType()); 127 } 128 ComplexPairTy VisitCastExpr(CastExpr *E) { 129 return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType()); 130 } 131 ComplexPairTy VisitCallExpr(const CallExpr *E); 132 ComplexPairTy VisitStmtExpr(const StmtExpr *E); 133 134 // Operators. 135 ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E, 136 bool isInc, bool isPre) { 137 LValue LV = CGF.EmitLValue(E->getSubExpr()); 138 return CGF.EmitComplexPrePostIncDec(E, LV, isInc, isPre); 139 } 140 ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) { 141 return VisitPrePostIncDec(E, false, false); 142 } 143 ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) { 144 return VisitPrePostIncDec(E, true, false); 145 } 146 ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) { 147 return VisitPrePostIncDec(E, false, true); 148 } 149 ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) { 150 return VisitPrePostIncDec(E, true, true); 151 } 152 ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); } 153 ComplexPairTy VisitUnaryPlus (const UnaryOperator *E) { 154 TestAndClearIgnoreReal(); 155 TestAndClearIgnoreImag(); 156 return Visit(E->getSubExpr()); 157 } 158 ComplexPairTy VisitUnaryMinus (const UnaryOperator *E); 159 ComplexPairTy VisitUnaryNot (const UnaryOperator *E); 160 // LNot,Real,Imag never return complex. 161 ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) { 162 return Visit(E->getSubExpr()); 163 } 164 ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { 165 return Visit(DAE->getExpr()); 166 } 167 ComplexPairTy VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) { 168 return CGF.EmitCXXExprWithTemporaries(E).getComplexVal(); 169 } 170 ComplexPairTy VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 171 assert(E->getType()->isAnyComplexType() && "Expected complex type!"); 172 QualType Elem = E->getType()->getAs<ComplexType>()->getElementType(); 173 llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem)); 174 return ComplexPairTy(Null, Null); 175 } 176 ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 177 assert(E->getType()->isAnyComplexType() && "Expected complex type!"); 178 QualType Elem = E->getType()->getAs<ComplexType>()->getElementType(); 179 llvm::Constant *Null = 180 llvm::Constant::getNullValue(CGF.ConvertType(Elem)); 181 return ComplexPairTy(Null, Null); 182 } 183 184 struct BinOpInfo { 185 ComplexPairTy LHS; 186 ComplexPairTy RHS; 187 QualType Ty; // Computation Type. 188 }; 189 190 BinOpInfo EmitBinOps(const BinaryOperator *E); 191 LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E, 192 ComplexPairTy (ComplexExprEmitter::*Func) 193 (const BinOpInfo &), 194 ComplexPairTy &Val); 195 ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E, 196 ComplexPairTy (ComplexExprEmitter::*Func) 197 (const BinOpInfo &)); 198 199 ComplexPairTy EmitBinAdd(const BinOpInfo &Op); 200 ComplexPairTy EmitBinSub(const BinOpInfo &Op); 201 ComplexPairTy EmitBinMul(const BinOpInfo &Op); 202 ComplexPairTy EmitBinDiv(const BinOpInfo &Op); 203 204 ComplexPairTy VisitBinAdd(const BinaryOperator *E) { 205 return EmitBinAdd(EmitBinOps(E)); 206 } 207 ComplexPairTy VisitBinSub(const BinaryOperator *E) { 208 return EmitBinSub(EmitBinOps(E)); 209 } 210 ComplexPairTy VisitBinMul(const BinaryOperator *E) { 211 return EmitBinMul(EmitBinOps(E)); 212 } 213 ComplexPairTy VisitBinDiv(const BinaryOperator *E) { 214 return EmitBinDiv(EmitBinOps(E)); 215 } 216 217 // Compound assignments. 218 ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) { 219 return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd); 220 } 221 ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) { 222 return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub); 223 } 224 ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) { 225 return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul); 226 } 227 ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) { 228 return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv); 229 } 230 231 // GCC rejects rem/and/or/xor for integer complex. 232 // Logical and/or always return int, never complex. 233 234 // No comparisons produce a complex result. 235 236 LValue EmitBinAssignLValue(const BinaryOperator *E, 237 ComplexPairTy &Val); 238 ComplexPairTy VisitBinAssign (const BinaryOperator *E); 239 ComplexPairTy VisitBinComma (const BinaryOperator *E); 240 241 242 ComplexPairTy VisitConditionalOperator(const ConditionalOperator *CO); 243 ComplexPairTy VisitChooseExpr(ChooseExpr *CE); 244 245 ComplexPairTy VisitInitListExpr(InitListExpr *E); 246 247 ComplexPairTy VisitVAArgExpr(VAArgExpr *E); 248 }; 249 } // end anonymous namespace. 250 251 //===----------------------------------------------------------------------===// 252 // Utilities 253 //===----------------------------------------------------------------------===// 254 255 /// EmitLoadOfComplex - Given an RValue reference for a complex, emit code to 256 /// load the real and imaginary pieces, returning them as Real/Imag. 257 ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr, 258 bool isVolatile) { 259 llvm::Value *Real=0, *Imag=0; 260 261 if (!IgnoreReal || isVolatile) { 262 llvm::Value *RealP = Builder.CreateStructGEP(SrcPtr, 0, 263 SrcPtr->getName() + ".realp"); 264 Real = Builder.CreateLoad(RealP, isVolatile, SrcPtr->getName() + ".real"); 265 } 266 267 if (!IgnoreImag || isVolatile) { 268 llvm::Value *ImagP = Builder.CreateStructGEP(SrcPtr, 1, 269 SrcPtr->getName() + ".imagp"); 270 Imag = Builder.CreateLoad(ImagP, isVolatile, SrcPtr->getName() + ".imag"); 271 } 272 return ComplexPairTy(Real, Imag); 273 } 274 275 /// EmitStoreOfComplex - Store the specified real/imag parts into the 276 /// specified value pointer. 277 void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *Ptr, 278 bool isVolatile) { 279 llvm::Value *RealPtr = Builder.CreateStructGEP(Ptr, 0, "real"); 280 llvm::Value *ImagPtr = Builder.CreateStructGEP(Ptr, 1, "imag"); 281 282 Builder.CreateStore(Val.first, RealPtr, isVolatile); 283 Builder.CreateStore(Val.second, ImagPtr, isVolatile); 284 } 285 286 287 288 //===----------------------------------------------------------------------===// 289 // Visitor Methods 290 //===----------------------------------------------------------------------===// 291 292 ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) { 293 CGF.ErrorUnsupported(E, "complex expression"); 294 const llvm::Type *EltTy = 295 CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType()); 296 llvm::Value *U = llvm::UndefValue::get(EltTy); 297 return ComplexPairTy(U, U); 298 } 299 300 ComplexPairTy ComplexExprEmitter:: 301 VisitImaginaryLiteral(const ImaginaryLiteral *IL) { 302 llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr()); 303 return 304 ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag); 305 } 306 307 308 ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) { 309 if (E->getCallReturnType()->isReferenceType()) 310 return EmitLoadOfLValue(E); 311 312 return CGF.EmitCallExpr(E).getComplexVal(); 313 } 314 315 ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) { 316 return CGF.EmitCompoundStmt(*E->getSubStmt(), true).getComplexVal(); 317 } 318 319 /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType. 320 ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val, 321 QualType SrcType, 322 QualType DestType) { 323 // Get the src/dest element type. 324 SrcType = SrcType->getAs<ComplexType>()->getElementType(); 325 DestType = DestType->getAs<ComplexType>()->getElementType(); 326 327 // C99 6.3.1.6: When a value of complex type is converted to another 328 // complex type, both the real and imaginary parts follow the conversion 329 // rules for the corresponding real types. 330 Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType); 331 Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType); 332 return Val; 333 } 334 335 ComplexPairTy ComplexExprEmitter::EmitCast(CastExpr::CastKind CK, Expr *Op, 336 QualType DestTy) { 337 switch (CK) { 338 case CK_GetObjCProperty: { 339 LValue LV = CGF.EmitLValue(Op); 340 assert(LV.isPropertyRef() && "Unknown LValue type!"); 341 return CGF.EmitLoadOfPropertyRefLValue(LV).getComplexVal(); 342 } 343 344 case CK_NoOp: 345 case CK_LValueToRValue: 346 return Visit(Op); 347 348 // TODO: do all of these 349 default: 350 break; 351 } 352 353 // Two cases here: cast from (complex to complex) and (scalar to complex). 354 if (Op->getType()->isAnyComplexType()) 355 return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy); 356 357 // FIXME: We should be looking at all of the cast kinds here, not 358 // cherry-picking the ones we have test cases for. 359 if (CK == CK_LValueBitCast) { 360 llvm::Value *V = CGF.EmitLValue(Op).getAddress(); 361 V = Builder.CreateBitCast(V, 362 CGF.ConvertType(CGF.getContext().getPointerType(DestTy))); 363 // FIXME: Are the qualifiers correct here? 364 return EmitLoadOfComplex(V, DestTy.isVolatileQualified()); 365 } 366 367 // C99 6.3.1.7: When a value of real type is converted to a complex type, the 368 // real part of the complex result value is determined by the rules of 369 // conversion to the corresponding real type and the imaginary part of the 370 // complex result value is a positive zero or an unsigned zero. 371 llvm::Value *Elt = CGF.EmitScalarExpr(Op); 372 373 // Convert the input element to the element type of the complex. 374 DestTy = DestTy->getAs<ComplexType>()->getElementType(); 375 Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy); 376 377 // Return (realval, 0). 378 return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType())); 379 } 380 381 ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) { 382 TestAndClearIgnoreReal(); 383 TestAndClearIgnoreImag(); 384 ComplexPairTy Op = Visit(E->getSubExpr()); 385 386 llvm::Value *ResR, *ResI; 387 if (Op.first->getType()->isFloatingPointTy()) { 388 ResR = Builder.CreateFNeg(Op.first, "neg.r"); 389 ResI = Builder.CreateFNeg(Op.second, "neg.i"); 390 } else { 391 ResR = Builder.CreateNeg(Op.first, "neg.r"); 392 ResI = Builder.CreateNeg(Op.second, "neg.i"); 393 } 394 return ComplexPairTy(ResR, ResI); 395 } 396 397 ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) { 398 TestAndClearIgnoreReal(); 399 TestAndClearIgnoreImag(); 400 // ~(a+ib) = a + i*-b 401 ComplexPairTy Op = Visit(E->getSubExpr()); 402 llvm::Value *ResI; 403 if (Op.second->getType()->isFloatingPointTy()) 404 ResI = Builder.CreateFNeg(Op.second, "conj.i"); 405 else 406 ResI = Builder.CreateNeg(Op.second, "conj.i"); 407 408 return ComplexPairTy(Op.first, ResI); 409 } 410 411 ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) { 412 llvm::Value *ResR, *ResI; 413 414 if (Op.LHS.first->getType()->isFloatingPointTy()) { 415 ResR = Builder.CreateFAdd(Op.LHS.first, Op.RHS.first, "add.r"); 416 ResI = Builder.CreateFAdd(Op.LHS.second, Op.RHS.second, "add.i"); 417 } else { 418 ResR = Builder.CreateAdd(Op.LHS.first, Op.RHS.first, "add.r"); 419 ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i"); 420 } 421 return ComplexPairTy(ResR, ResI); 422 } 423 424 ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) { 425 llvm::Value *ResR, *ResI; 426 if (Op.LHS.first->getType()->isFloatingPointTy()) { 427 ResR = Builder.CreateFSub(Op.LHS.first, Op.RHS.first, "sub.r"); 428 ResI = Builder.CreateFSub(Op.LHS.second, Op.RHS.second, "sub.i"); 429 } else { 430 ResR = Builder.CreateSub(Op.LHS.first, Op.RHS.first, "sub.r"); 431 ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i"); 432 } 433 return ComplexPairTy(ResR, ResI); 434 } 435 436 437 ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) { 438 using llvm::Value; 439 Value *ResR, *ResI; 440 441 if (Op.LHS.first->getType()->isFloatingPointTy()) { 442 Value *ResRl = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul.rl"); 443 Value *ResRr = Builder.CreateFMul(Op.LHS.second, Op.RHS.second,"mul.rr"); 444 ResR = Builder.CreateFSub(ResRl, ResRr, "mul.r"); 445 446 Value *ResIl = Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul.il"); 447 Value *ResIr = Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul.ir"); 448 ResI = Builder.CreateFAdd(ResIl, ResIr, "mul.i"); 449 } else { 450 Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl"); 451 Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second,"mul.rr"); 452 ResR = Builder.CreateSub(ResRl, ResRr, "mul.r"); 453 454 Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il"); 455 Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir"); 456 ResI = Builder.CreateAdd(ResIl, ResIr, "mul.i"); 457 } 458 return ComplexPairTy(ResR, ResI); 459 } 460 461 ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) { 462 llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second; 463 llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second; 464 465 466 llvm::Value *DSTr, *DSTi; 467 if (Op.LHS.first->getType()->isFloatingPointTy()) { 468 // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd)) 469 llvm::Value *Tmp1 = Builder.CreateFMul(LHSr, RHSr, "tmp"); // a*c 470 llvm::Value *Tmp2 = Builder.CreateFMul(LHSi, RHSi, "tmp"); // b*d 471 llvm::Value *Tmp3 = Builder.CreateFAdd(Tmp1, Tmp2, "tmp"); // ac+bd 472 473 llvm::Value *Tmp4 = Builder.CreateFMul(RHSr, RHSr, "tmp"); // c*c 474 llvm::Value *Tmp5 = Builder.CreateFMul(RHSi, RHSi, "tmp"); // d*d 475 llvm::Value *Tmp6 = Builder.CreateFAdd(Tmp4, Tmp5, "tmp"); // cc+dd 476 477 llvm::Value *Tmp7 = Builder.CreateFMul(LHSi, RHSr, "tmp"); // b*c 478 llvm::Value *Tmp8 = Builder.CreateFMul(LHSr, RHSi, "tmp"); // a*d 479 llvm::Value *Tmp9 = Builder.CreateFSub(Tmp7, Tmp8, "tmp"); // bc-ad 480 481 DSTr = Builder.CreateFDiv(Tmp3, Tmp6, "tmp"); 482 DSTi = Builder.CreateFDiv(Tmp9, Tmp6, "tmp"); 483 } else { 484 // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd)) 485 llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr, "tmp"); // a*c 486 llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi, "tmp"); // b*d 487 llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2, "tmp"); // ac+bd 488 489 llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr, "tmp"); // c*c 490 llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi, "tmp"); // d*d 491 llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5, "tmp"); // cc+dd 492 493 llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr, "tmp"); // b*c 494 llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi, "tmp"); // a*d 495 llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8, "tmp"); // bc-ad 496 497 if (Op.Ty->getAs<ComplexType>()->getElementType()->isUnsignedIntegerType()) { 498 DSTr = Builder.CreateUDiv(Tmp3, Tmp6, "tmp"); 499 DSTi = Builder.CreateUDiv(Tmp9, Tmp6, "tmp"); 500 } else { 501 DSTr = Builder.CreateSDiv(Tmp3, Tmp6, "tmp"); 502 DSTi = Builder.CreateSDiv(Tmp9, Tmp6, "tmp"); 503 } 504 } 505 506 return ComplexPairTy(DSTr, DSTi); 507 } 508 509 ComplexExprEmitter::BinOpInfo 510 ComplexExprEmitter::EmitBinOps(const BinaryOperator *E) { 511 TestAndClearIgnoreReal(); 512 TestAndClearIgnoreImag(); 513 BinOpInfo Ops; 514 Ops.LHS = Visit(E->getLHS()); 515 Ops.RHS = Visit(E->getRHS()); 516 Ops.Ty = E->getType(); 517 return Ops; 518 } 519 520 521 LValue ComplexExprEmitter:: 522 EmitCompoundAssignLValue(const CompoundAssignOperator *E, 523 ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&), 524 ComplexPairTy &Val) { 525 TestAndClearIgnoreReal(); 526 TestAndClearIgnoreImag(); 527 QualType LHSTy = E->getLHS()->getType(), RHSTy = E->getRHS()->getType(); 528 529 BinOpInfo OpInfo; 530 531 // Load the RHS and LHS operands. 532 // __block variables need to have the rhs evaluated first, plus this should 533 // improve codegen a little. 534 OpInfo.Ty = E->getComputationResultType(); 535 536 // The RHS should have been converted to the computation type. 537 assert(OpInfo.Ty->isAnyComplexType()); 538 assert(CGF.getContext().hasSameUnqualifiedType(OpInfo.Ty, 539 E->getRHS()->getType())); 540 OpInfo.RHS = Visit(E->getRHS()); 541 542 LValue LHS = CGF.EmitLValue(E->getLHS()); 543 // We know the LHS is a complex lvalue. 544 ComplexPairTy LHSComplexPair; 545 if (LHS.isPropertyRef()) 546 LHSComplexPair = CGF.EmitLoadOfPropertyRefLValue(LHS).getComplexVal(); 547 else 548 LHSComplexPair = EmitLoadOfComplex(LHS.getAddress(), 549 LHS.isVolatileQualified()); 550 551 OpInfo.LHS = EmitComplexToComplexCast(LHSComplexPair, LHSTy, OpInfo.Ty); 552 553 // Expand the binary operator. 554 ComplexPairTy Result = (this->*Func)(OpInfo); 555 556 // Truncate the result back to the LHS type. 557 Result = EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy); 558 Val = Result; 559 560 // Store the result value into the LHS lvalue. 561 if (LHS.isPropertyRef()) 562 CGF.EmitStoreThroughPropertyRefLValue(RValue::getComplex(Result), LHS); 563 else 564 EmitStoreOfComplex(Result, LHS.getAddress(), LHS.isVolatileQualified()); 565 566 return LHS; 567 } 568 569 // Compound assignments. 570 ComplexPairTy ComplexExprEmitter:: 571 EmitCompoundAssign(const CompoundAssignOperator *E, 572 ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){ 573 ComplexPairTy Val; 574 LValue LV = EmitCompoundAssignLValue(E, Func, Val); 575 576 // The result of an assignment in C is the assigned r-value. 577 if (!CGF.getContext().getLangOptions().CPlusPlus) 578 return Val; 579 580 // Objective-C property assignment never reloads the value following a store. 581 if (LV.isPropertyRef()) 582 return Val; 583 584 // If the lvalue is non-volatile, return the computed value of the assignment. 585 if (!LV.isVolatileQualified()) 586 return Val; 587 588 return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified()); 589 } 590 591 LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E, 592 ComplexPairTy &Val) { 593 assert(CGF.getContext().hasSameUnqualifiedType(E->getLHS()->getType(), 594 E->getRHS()->getType()) && 595 "Invalid assignment"); 596 TestAndClearIgnoreReal(); 597 TestAndClearIgnoreImag(); 598 599 // Emit the RHS. 600 Val = Visit(E->getRHS()); 601 602 // Compute the address to store into. 603 LValue LHS = CGF.EmitLValue(E->getLHS()); 604 605 // Store the result value into the LHS lvalue. 606 if (LHS.isPropertyRef()) 607 CGF.EmitStoreThroughPropertyRefLValue(RValue::getComplex(Val), LHS); 608 else 609 EmitStoreOfComplex(Val, LHS.getAddress(), LHS.isVolatileQualified()); 610 611 return LHS; 612 } 613 614 ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) { 615 ComplexPairTy Val; 616 LValue LV = EmitBinAssignLValue(E, Val); 617 618 // The result of an assignment in C is the assigned r-value. 619 if (!CGF.getContext().getLangOptions().CPlusPlus) 620 return Val; 621 622 // Objective-C property assignment never reloads the value following a store. 623 if (LV.isPropertyRef()) 624 return Val; 625 626 // If the lvalue is non-volatile, return the computed value of the assignment. 627 if (!LV.isVolatileQualified()) 628 return Val; 629 630 return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified()); 631 } 632 633 ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) { 634 CGF.EmitStmt(E->getLHS()); 635 CGF.EnsureInsertPoint(); 636 return Visit(E->getRHS()); 637 } 638 639 ComplexPairTy ComplexExprEmitter:: 640 VisitConditionalOperator(const ConditionalOperator *E) { 641 TestAndClearIgnoreReal(); 642 TestAndClearIgnoreImag(); 643 llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true"); 644 llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false"); 645 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end"); 646 647 if (E->getLHS()) 648 CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock); 649 else { 650 Expr *save = E->getSAVE(); 651 assert(save && "VisitConditionalOperator - save is null"); 652 // Intentianlly not doing direct assignment to ConditionalSaveExprs[save] !! 653 ComplexPairTy SaveVal = Visit(save); 654 CGF.ConditionalSaveComplexExprs[save] = SaveVal; 655 CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock); 656 } 657 658 CGF.EmitBlock(LHSBlock); 659 ComplexPairTy LHS = Visit(E->getTrueExpr()); 660 LHSBlock = Builder.GetInsertBlock(); 661 CGF.EmitBranch(ContBlock); 662 663 CGF.EmitBlock(RHSBlock); 664 665 ComplexPairTy RHS = Visit(E->getRHS()); 666 RHSBlock = Builder.GetInsertBlock(); 667 CGF.EmitBranch(ContBlock); 668 669 CGF.EmitBlock(ContBlock); 670 671 // Create a PHI node for the real part. 672 llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), "cond.r"); 673 RealPN->reserveOperandSpace(2); 674 RealPN->addIncoming(LHS.first, LHSBlock); 675 RealPN->addIncoming(RHS.first, RHSBlock); 676 677 // Create a PHI node for the imaginary part. 678 llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), "cond.i"); 679 ImagPN->reserveOperandSpace(2); 680 ImagPN->addIncoming(LHS.second, LHSBlock); 681 ImagPN->addIncoming(RHS.second, RHSBlock); 682 683 return ComplexPairTy(RealPN, ImagPN); 684 } 685 686 ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) { 687 return Visit(E->getChosenSubExpr(CGF.getContext())); 688 } 689 690 ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) { 691 bool Ignore = TestAndClearIgnoreReal(); 692 (void)Ignore; 693 assert (Ignore == false && "init list ignored"); 694 Ignore = TestAndClearIgnoreImag(); 695 (void)Ignore; 696 assert (Ignore == false && "init list ignored"); 697 if (E->getNumInits()) 698 return Visit(E->getInit(0)); 699 700 // Empty init list intializes to null 701 QualType Ty = E->getType()->getAs<ComplexType>()->getElementType(); 702 const llvm::Type* LTy = CGF.ConvertType(Ty); 703 llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy); 704 return ComplexPairTy(zeroConstant, zeroConstant); 705 } 706 707 ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) { 708 llvm::Value *ArgValue = CGF.EmitVAListRef(E->getSubExpr()); 709 llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, E->getType()); 710 711 if (!ArgPtr) { 712 CGF.ErrorUnsupported(E, "complex va_arg expression"); 713 const llvm::Type *EltTy = 714 CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType()); 715 llvm::Value *U = llvm::UndefValue::get(EltTy); 716 return ComplexPairTy(U, U); 717 } 718 719 // FIXME Volatility. 720 return EmitLoadOfComplex(ArgPtr, false); 721 } 722 723 //===----------------------------------------------------------------------===// 724 // Entry Point into this File 725 //===----------------------------------------------------------------------===// 726 727 /// EmitComplexExpr - Emit the computation of the specified expression of 728 /// complex type, ignoring the result. 729 ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal, 730 bool IgnoreImag) { 731 assert(E && E->getType()->isAnyComplexType() && 732 "Invalid complex expression to emit"); 733 734 return ComplexExprEmitter(*this, IgnoreReal, IgnoreImag) 735 .Visit(const_cast<Expr*>(E)); 736 } 737 738 /// EmitComplexExprIntoAddr - Emit the computation of the specified expression 739 /// of complex type, storing into the specified Value*. 740 void CodeGenFunction::EmitComplexExprIntoAddr(const Expr *E, 741 llvm::Value *DestAddr, 742 bool DestIsVolatile) { 743 assert(E && E->getType()->isAnyComplexType() && 744 "Invalid complex expression to emit"); 745 ComplexExprEmitter Emitter(*this); 746 ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E)); 747 Emitter.EmitStoreOfComplex(Val, DestAddr, DestIsVolatile); 748 } 749 750 /// StoreComplexToAddr - Store a complex number into the specified address. 751 void CodeGenFunction::StoreComplexToAddr(ComplexPairTy V, 752 llvm::Value *DestAddr, 753 bool DestIsVolatile) { 754 ComplexExprEmitter(*this).EmitStoreOfComplex(V, DestAddr, DestIsVolatile); 755 } 756 757 /// LoadComplexFromAddr - Load a complex number from the specified address. 758 ComplexPairTy CodeGenFunction::LoadComplexFromAddr(llvm::Value *SrcAddr, 759 bool SrcIsVolatile) { 760 return ComplexExprEmitter(*this).EmitLoadOfComplex(SrcAddr, SrcIsVolatile); 761 } 762 763 LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) { 764 ComplexPairTy Val; // ignored 765 766 ComplexPairTy(ComplexExprEmitter::*Op)(const ComplexExprEmitter::BinOpInfo &); 767 768 switch (E->getOpcode()) { 769 case BO_Assign: 770 return ComplexExprEmitter(*this).EmitBinAssignLValue(E, Val); 771 772 case BO_MulAssign: Op = &ComplexExprEmitter::EmitBinMul; break; 773 case BO_DivAssign: Op = &ComplexExprEmitter::EmitBinDiv; break; 774 case BO_SubAssign: Op = &ComplexExprEmitter::EmitBinSub; break; 775 case BO_AddAssign: Op = &ComplexExprEmitter::EmitBinAdd; break; 776 777 default: 778 llvm_unreachable("unexpected complex compound assignment"); 779 Op = 0; 780 } 781 782 return ComplexExprEmitter(*this).EmitCompoundAssignLValue( 783 cast<CompoundAssignOperator>(E), Op, Val); 784 } 785