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