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