CGExprComplex.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  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. #include "CodeGenFunction.h"
  14. #include "CodeGenModule.h"
  15. #include "clang/AST/ASTContext.h"
  16. #include "clang/AST/StmtVisitor.h"
  17. #include "llvm/Constants.h"
  18. #include "llvm/Function.h"
  19. #include "llvm/ADT/SmallString.h"
  20. using namespace clang;
  21. using namespace CodeGen;
  22. //===----------------------------------------------------------------------===//
  23. // Complex Expression Emitter
  24. //===----------------------------------------------------------------------===//
  25. typedef CodeGenFunction::ComplexPairTy ComplexPairTy;
  26. namespace {
  27. class ComplexExprEmitter
  28. : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
  29. CodeGenFunction &CGF;
  30. CGBuilderTy &Builder;
  31. // True is we should ignore the value of a
  32. bool IgnoreReal;
  33. bool IgnoreImag;
  34. public:
  35. ComplexExprEmitter(CodeGenFunction &cgf, bool ir=false, bool ii=false)
  36. : CGF(cgf), Builder(CGF.Builder), IgnoreReal(ir), IgnoreImag(ii) {
  37. }
  38. //===--------------------------------------------------------------------===//
  39. // Utilities
  40. //===--------------------------------------------------------------------===//
  41. bool TestAndClearIgnoreReal() {
  42. bool I = IgnoreReal;
  43. IgnoreReal = false;
  44. return I;
  45. }
  46. bool TestAndClearIgnoreImag() {
  47. bool I = IgnoreImag;
  48. IgnoreImag = false;
  49. return I;
  50. }
  51. /// EmitLoadOfLValue - Given an expression with complex type that represents a
  52. /// value l-value, this method emits the address of the l-value, then loads
  53. /// and returns the result.
  54. ComplexPairTy EmitLoadOfLValue(const Expr *E) {
  55. return EmitLoadOfLValue(CGF.EmitLValue(E));
  56. }
  57. ComplexPairTy EmitLoadOfLValue(LValue LV) {
  58. assert(LV.isSimple() && "complex l-value must be simple");
  59. return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified());
  60. }
  61. /// EmitLoadOfComplex - Given a pointer to a complex value, emit code to load
  62. /// the real and imaginary pieces.
  63. ComplexPairTy EmitLoadOfComplex(llvm::Value *SrcPtr, bool isVolatile);
  64. /// EmitStoreThroughLValue - Given an l-value of complex type, store
  65. /// a complex number into it.
  66. void EmitStoreThroughLValue(ComplexPairTy Val, LValue LV) {
  67. assert(LV.isSimple() && "complex l-value must be simple");
  68. return EmitStoreOfComplex(Val, LV.getAddress(), LV.isVolatileQualified());
  69. }
  70. /// EmitStoreOfComplex - Store the specified real/imag parts into the
  71. /// specified value pointer.
  72. void EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *ResPtr, bool isVol);
  73. /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
  74. ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType,
  75. QualType DestType);
  76. //===--------------------------------------------------------------------===//
  77. // Visitor Methods
  78. //===--------------------------------------------------------------------===//
  79. ComplexPairTy Visit(Expr *E) {
  80. return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::Visit(E);
  81. }
  82. ComplexPairTy VisitStmt(Stmt *S) {
  83. S->dump(CGF.getContext().getSourceManager());
  84. llvm_unreachable("Stmt can't have complex result type!");
  85. }
  86. ComplexPairTy VisitExpr(Expr *S);
  87. ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());}
  88. ComplexPairTy VisitGenericSelectionExpr(GenericSelectionExpr *GE) {
  89. return Visit(GE->getResultExpr());
  90. }
  91. ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL);
  92. ComplexPairTy
  93. VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) {
  94. return Visit(PE->getReplacement());
  95. }
  96. // l-values.
  97. ComplexPairTy VisitDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); }
  98. ComplexPairTy VisitBlockDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); }
  99. ComplexPairTy VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
  100. return EmitLoadOfLValue(E);
  101. }
  102. ComplexPairTy VisitObjCMessageExpr(ObjCMessageExpr *E) {
  103. return CGF.EmitObjCMessageExpr(E).getComplexVal();
  104. }
  105. ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); }
  106. ComplexPairTy VisitMemberExpr(const Expr *E) { return EmitLoadOfLValue(E); }
  107. ComplexPairTy VisitOpaqueValueExpr(OpaqueValueExpr *E) {
  108. if (E->isGLValue())
  109. return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E));
  110. return CGF.getOpaqueRValueMapping(E).getComplexVal();
  111. }
  112. ComplexPairTy VisitPseudoObjectExpr(PseudoObjectExpr *E) {
  113. return CGF.EmitPseudoObjectRValue(E).getComplexVal();
  114. }
  115. // FIXME: CompoundLiteralExpr
  116. ComplexPairTy EmitCast(CastExpr::CastKind CK, Expr *Op, QualType DestTy);
  117. ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) {
  118. // Unlike for scalars, we don't have to worry about function->ptr demotion
  119. // here.
  120. return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
  121. }
  122. ComplexPairTy VisitCastExpr(CastExpr *E) {
  123. return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
  124. }
  125. ComplexPairTy VisitCallExpr(const CallExpr *E);
  126. ComplexPairTy VisitStmtExpr(const StmtExpr *E);
  127. // Operators.
  128. ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E,
  129. bool isInc, bool isPre) {
  130. LValue LV = CGF.EmitLValue(E->getSubExpr());
  131. return CGF.EmitComplexPrePostIncDec(E, LV, isInc, isPre);
  132. }
  133. ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) {
  134. return VisitPrePostIncDec(E, false, false);
  135. }
  136. ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) {
  137. return VisitPrePostIncDec(E, true, false);
  138. }
  139. ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) {
  140. return VisitPrePostIncDec(E, false, true);
  141. }
  142. ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) {
  143. return VisitPrePostIncDec(E, true, true);
  144. }
  145. ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
  146. ComplexPairTy VisitUnaryPlus (const UnaryOperator *E) {
  147. TestAndClearIgnoreReal();
  148. TestAndClearIgnoreImag();
  149. return Visit(E->getSubExpr());
  150. }
  151. ComplexPairTy VisitUnaryMinus (const UnaryOperator *E);
  152. ComplexPairTy VisitUnaryNot (const UnaryOperator *E);
  153. // LNot,Real,Imag never return complex.
  154. ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) {
  155. return Visit(E->getSubExpr());
  156. }
  157. ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
  158. return Visit(DAE->getExpr());
  159. }
  160. ComplexPairTy VisitExprWithCleanups(ExprWithCleanups *E) {
  161. CGF.enterFullExpression(E);
  162. CodeGenFunction::RunCleanupsScope Scope(CGF);
  163. return Visit(E->getSubExpr());
  164. }
  165. ComplexPairTy VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
  166. assert(E->getType()->isAnyComplexType() && "Expected complex type!");
  167. QualType Elem = E->getType()->getAs<ComplexType>()->getElementType();
  168. llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
  169. return ComplexPairTy(Null, Null);
  170. }
  171. ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
  172. assert(E->getType()->isAnyComplexType() && "Expected complex type!");
  173. QualType Elem = E->getType()->getAs<ComplexType>()->getElementType();
  174. llvm::Constant *Null =
  175. llvm::Constant::getNullValue(CGF.ConvertType(Elem));
  176. return ComplexPairTy(Null, Null);
  177. }
  178. struct BinOpInfo {
  179. ComplexPairTy LHS;
  180. ComplexPairTy RHS;
  181. QualType Ty; // Computation Type.
  182. };
  183. BinOpInfo EmitBinOps(const BinaryOperator *E);
  184. LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E,
  185. ComplexPairTy (ComplexExprEmitter::*Func)
  186. (const BinOpInfo &),
  187. ComplexPairTy &Val);
  188. ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E,
  189. ComplexPairTy (ComplexExprEmitter::*Func)
  190. (const BinOpInfo &));
  191. ComplexPairTy EmitBinAdd(const BinOpInfo &Op);
  192. ComplexPairTy EmitBinSub(const BinOpInfo &Op);
  193. ComplexPairTy EmitBinMul(const BinOpInfo &Op);
  194. ComplexPairTy EmitBinDiv(const BinOpInfo &Op);
  195. ComplexPairTy VisitBinAdd(const BinaryOperator *E) {
  196. return EmitBinAdd(EmitBinOps(E));
  197. }
  198. ComplexPairTy VisitBinSub(const BinaryOperator *E) {
  199. return EmitBinSub(EmitBinOps(E));
  200. }
  201. ComplexPairTy VisitBinMul(const BinaryOperator *E) {
  202. return EmitBinMul(EmitBinOps(E));
  203. }
  204. ComplexPairTy VisitBinDiv(const BinaryOperator *E) {
  205. return EmitBinDiv(EmitBinOps(E));
  206. }
  207. // Compound assignments.
  208. ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) {
  209. return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd);
  210. }
  211. ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) {
  212. return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub);
  213. }
  214. ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) {
  215. return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul);
  216. }
  217. ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) {
  218. return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv);
  219. }
  220. // GCC rejects rem/and/or/xor for integer complex.
  221. // Logical and/or always return int, never complex.
  222. // No comparisons produce a complex result.
  223. LValue EmitBinAssignLValue(const BinaryOperator *E,
  224. ComplexPairTy &Val);
  225. ComplexPairTy VisitBinAssign (const BinaryOperator *E);
  226. ComplexPairTy VisitBinComma (const BinaryOperator *E);
  227. ComplexPairTy
  228. VisitAbstractConditionalOperator(const AbstractConditionalOperator *CO);
  229. ComplexPairTy VisitChooseExpr(ChooseExpr *CE);
  230. ComplexPairTy VisitInitListExpr(InitListExpr *E);
  231. ComplexPairTy VisitVAArgExpr(VAArgExpr *E);
  232. ComplexPairTy VisitAtomicExpr(AtomicExpr *E) {
  233. return CGF.EmitAtomicExpr(E).getComplexVal();
  234. }
  235. };
  236. } // end anonymous namespace.
  237. //===----------------------------------------------------------------------===//
  238. // Utilities
  239. //===----------------------------------------------------------------------===//
  240. /// EmitLoadOfComplex - Given an RValue reference for a complex, emit code to
  241. /// load the real and imaginary pieces, returning them as Real/Imag.
  242. ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr,
  243. bool isVolatile) {
  244. llvm::Value *Real=0, *Imag=0;
  245. if (!IgnoreReal || isVolatile) {
  246. llvm::Value *RealP = Builder.CreateStructGEP(SrcPtr, 0,
  247. SrcPtr->getName() + ".realp");
  248. Real = Builder.CreateLoad(RealP, isVolatile, SrcPtr->getName() + ".real");
  249. }
  250. if (!IgnoreImag || isVolatile) {
  251. llvm::Value *ImagP = Builder.CreateStructGEP(SrcPtr, 1,
  252. SrcPtr->getName() + ".imagp");
  253. Imag = Builder.CreateLoad(ImagP, isVolatile, SrcPtr->getName() + ".imag");
  254. }
  255. return ComplexPairTy(Real, Imag);
  256. }
  257. /// EmitStoreOfComplex - Store the specified real/imag parts into the
  258. /// specified value pointer.
  259. void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *Ptr,
  260. bool isVolatile) {
  261. llvm::Value *RealPtr = Builder.CreateStructGEP(Ptr, 0, "real");
  262. llvm::Value *ImagPtr = Builder.CreateStructGEP(Ptr, 1, "imag");
  263. Builder.CreateStore(Val.first, RealPtr, isVolatile);
  264. Builder.CreateStore(Val.second, ImagPtr, isVolatile);
  265. }
  266. //===----------------------------------------------------------------------===//
  267. // Visitor Methods
  268. //===----------------------------------------------------------------------===//
  269. ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
  270. CGF.ErrorUnsupported(E, "complex expression");
  271. llvm::Type *EltTy =
  272. CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType());
  273. llvm::Value *U = llvm::UndefValue::get(EltTy);
  274. return ComplexPairTy(U, U);
  275. }
  276. ComplexPairTy ComplexExprEmitter::
  277. VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
  278. llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
  279. return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag);
  280. }
  281. ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) {
  282. if (E->getCallReturnType()->isReferenceType())
  283. return EmitLoadOfLValue(E);
  284. return CGF.EmitCallExpr(E).getComplexVal();
  285. }
  286. ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) {
  287. CodeGenFunction::StmtExprEvaluation eval(CGF);
  288. return CGF.EmitCompoundStmt(*E->getSubStmt(), true).getComplexVal();
  289. }
  290. /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
  291. ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
  292. QualType SrcType,
  293. QualType DestType) {
  294. // Get the src/dest element type.
  295. SrcType = SrcType->getAs<ComplexType>()->getElementType();
  296. DestType = DestType->getAs<ComplexType>()->getElementType();
  297. // C99 6.3.1.6: When a value of complex type is converted to another
  298. // complex type, both the real and imaginary parts follow the conversion
  299. // rules for the corresponding real types.
  300. Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType);
  301. Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType);
  302. return Val;
  303. }
  304. ComplexPairTy ComplexExprEmitter::EmitCast(CastExpr::CastKind CK, Expr *Op,
  305. QualType DestTy) {
  306. switch (CK) {
  307. case CK_Dependent: llvm_unreachable("dependent cast kind in IR gen!");
  308. // Atomic to non-atomic casts may be more than a no-op for some platforms and
  309. // for some types.
  310. case CK_AtomicToNonAtomic:
  311. case CK_NonAtomicToAtomic:
  312. case CK_NoOp:
  313. case CK_LValueToRValue:
  314. case CK_UserDefinedConversion:
  315. return Visit(Op);
  316. case CK_LValueBitCast: {
  317. llvm::Value *V = CGF.EmitLValue(Op).getAddress();
  318. V = Builder.CreateBitCast(V,
  319. CGF.ConvertType(CGF.getContext().getPointerType(DestTy)));
  320. // FIXME: Are the qualifiers correct here?
  321. return EmitLoadOfComplex(V, DestTy.isVolatileQualified());
  322. }
  323. case CK_BitCast:
  324. case CK_BaseToDerived:
  325. case CK_DerivedToBase:
  326. case CK_UncheckedDerivedToBase:
  327. case CK_Dynamic:
  328. case CK_ToUnion:
  329. case CK_ArrayToPointerDecay:
  330. case CK_FunctionToPointerDecay:
  331. case CK_NullToPointer:
  332. case CK_NullToMemberPointer:
  333. case CK_BaseToDerivedMemberPointer:
  334. case CK_DerivedToBaseMemberPointer:
  335. case CK_MemberPointerToBoolean:
  336. case CK_ReinterpretMemberPointer:
  337. case CK_ConstructorConversion:
  338. case CK_IntegralToPointer:
  339. case CK_PointerToIntegral:
  340. case CK_PointerToBoolean:
  341. case CK_ToVoid:
  342. case CK_VectorSplat:
  343. case CK_IntegralCast:
  344. case CK_IntegralToBoolean:
  345. case CK_IntegralToFloating:
  346. case CK_FloatingToIntegral:
  347. case CK_FloatingToBoolean:
  348. case CK_FloatingCast:
  349. case CK_CPointerToObjCPointerCast:
  350. case CK_BlockPointerToObjCPointerCast:
  351. case CK_AnyPointerToBlockPointerCast:
  352. case CK_ObjCObjectLValueCast:
  353. case CK_FloatingComplexToReal:
  354. case CK_FloatingComplexToBoolean:
  355. case CK_IntegralComplexToReal:
  356. case CK_IntegralComplexToBoolean:
  357. case CK_ARCProduceObject:
  358. case CK_ARCConsumeObject:
  359. case CK_ARCReclaimReturnedObject:
  360. case CK_ARCExtendBlockObject:
  361. llvm_unreachable("invalid cast kind for complex value");
  362. case CK_FloatingRealToComplex:
  363. case CK_IntegralRealToComplex: {
  364. llvm::Value *Elt = CGF.EmitScalarExpr(Op);
  365. // Convert the input element to the element type of the complex.
  366. DestTy = DestTy->getAs<ComplexType>()->getElementType();
  367. Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
  368. // Return (realval, 0).
  369. return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType()));
  370. }
  371. case CK_FloatingComplexCast:
  372. case CK_FloatingComplexToIntegralComplex:
  373. case CK_IntegralComplexCast:
  374. case CK_IntegralComplexToFloatingComplex:
  375. return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy);
  376. }
  377. llvm_unreachable("unknown cast resulting in complex value");
  378. }
  379. ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
  380. TestAndClearIgnoreReal();
  381. TestAndClearIgnoreImag();
  382. ComplexPairTy Op = Visit(E->getSubExpr());
  383. llvm::Value *ResR, *ResI;
  384. if (Op.first->getType()->isFloatingPointTy()) {
  385. ResR = Builder.CreateFNeg(Op.first, "neg.r");
  386. ResI = Builder.CreateFNeg(Op.second, "neg.i");
  387. } else {
  388. ResR = Builder.CreateNeg(Op.first, "neg.r");
  389. ResI = Builder.CreateNeg(Op.second, "neg.i");
  390. }
  391. return ComplexPairTy(ResR, ResI);
  392. }
  393. ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
  394. TestAndClearIgnoreReal();
  395. TestAndClearIgnoreImag();
  396. // ~(a+ib) = a + i*-b
  397. ComplexPairTy Op = Visit(E->getSubExpr());
  398. llvm::Value *ResI;
  399. if (Op.second->getType()->isFloatingPointTy())
  400. ResI = Builder.CreateFNeg(Op.second, "conj.i");
  401. else
  402. ResI = Builder.CreateNeg(Op.second, "conj.i");
  403. return ComplexPairTy(Op.first, ResI);
  404. }
  405. ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) {
  406. llvm::Value *ResR, *ResI;
  407. if (Op.LHS.first->getType()->isFloatingPointTy()) {
  408. ResR = Builder.CreateFAdd(Op.LHS.first, Op.RHS.first, "add.r");
  409. ResI = Builder.CreateFAdd(Op.LHS.second, Op.RHS.second, "add.i");
  410. } else {
  411. ResR = Builder.CreateAdd(Op.LHS.first, Op.RHS.first, "add.r");
  412. ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i");
  413. }
  414. return ComplexPairTy(ResR, ResI);
  415. }
  416. ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) {
  417. llvm::Value *ResR, *ResI;
  418. if (Op.LHS.first->getType()->isFloatingPointTy()) {
  419. ResR = Builder.CreateFSub(Op.LHS.first, Op.RHS.first, "sub.r");
  420. ResI = Builder.CreateFSub(Op.LHS.second, Op.RHS.second, "sub.i");
  421. } else {
  422. ResR = Builder.CreateSub(Op.LHS.first, Op.RHS.first, "sub.r");
  423. ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i");
  424. }
  425. return ComplexPairTy(ResR, ResI);
  426. }
  427. ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) {
  428. using llvm::Value;
  429. Value *ResR, *ResI;
  430. if (Op.LHS.first->getType()->isFloatingPointTy()) {
  431. Value *ResRl = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul.rl");
  432. Value *ResRr = Builder.CreateFMul(Op.LHS.second, Op.RHS.second,"mul.rr");
  433. ResR = Builder.CreateFSub(ResRl, ResRr, "mul.r");
  434. Value *ResIl = Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul.il");
  435. Value *ResIr = Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul.ir");
  436. ResI = Builder.CreateFAdd(ResIl, ResIr, "mul.i");
  437. } else {
  438. Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl");
  439. Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second,"mul.rr");
  440. ResR = Builder.CreateSub(ResRl, ResRr, "mul.r");
  441. Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il");
  442. Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir");
  443. ResI = Builder.CreateAdd(ResIl, ResIr, "mul.i");
  444. }
  445. return ComplexPairTy(ResR, ResI);
  446. }
  447. ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) {
  448. llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second;
  449. llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second;
  450. llvm::Value *DSTr, *DSTi;
  451. if (Op.LHS.first->getType()->isFloatingPointTy()) {
  452. // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
  453. llvm::Value *Tmp1 = Builder.CreateFMul(LHSr, RHSr); // a*c
  454. llvm::Value *Tmp2 = Builder.CreateFMul(LHSi, RHSi); // b*d
  455. llvm::Value *Tmp3 = Builder.CreateFAdd(Tmp1, Tmp2); // ac+bd
  456. llvm::Value *Tmp4 = Builder.CreateFMul(RHSr, RHSr); // c*c
  457. llvm::Value *Tmp5 = Builder.CreateFMul(RHSi, RHSi); // d*d
  458. llvm::Value *Tmp6 = Builder.CreateFAdd(Tmp4, Tmp5); // cc+dd
  459. llvm::Value *Tmp7 = Builder.CreateFMul(LHSi, RHSr); // b*c
  460. llvm::Value *Tmp8 = Builder.CreateFMul(LHSr, RHSi); // a*d
  461. llvm::Value *Tmp9 = Builder.CreateFSub(Tmp7, Tmp8); // bc-ad
  462. DSTr = Builder.CreateFDiv(Tmp3, Tmp6);
  463. DSTi = Builder.CreateFDiv(Tmp9, Tmp6);
  464. } else {
  465. // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
  466. llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr); // a*c
  467. llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi); // b*d
  468. llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2); // ac+bd
  469. llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr); // c*c
  470. llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi); // d*d
  471. llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5); // cc+dd
  472. llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr); // b*c
  473. llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi); // a*d
  474. llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8); // bc-ad
  475. if (Op.Ty->getAs<ComplexType>()->getElementType()->isUnsignedIntegerType()) {
  476. DSTr = Builder.CreateUDiv(Tmp3, Tmp6);
  477. DSTi = Builder.CreateUDiv(Tmp9, Tmp6);
  478. } else {
  479. DSTr = Builder.CreateSDiv(Tmp3, Tmp6);
  480. DSTi = Builder.CreateSDiv(Tmp9, Tmp6);
  481. }
  482. }
  483. return ComplexPairTy(DSTr, DSTi);
  484. }
  485. ComplexExprEmitter::BinOpInfo
  486. ComplexExprEmitter::EmitBinOps(const BinaryOperator *E) {
  487. TestAndClearIgnoreReal();
  488. TestAndClearIgnoreImag();
  489. BinOpInfo Ops;
  490. Ops.LHS = Visit(E->getLHS());
  491. Ops.RHS = Visit(E->getRHS());
  492. Ops.Ty = E->getType();
  493. return Ops;
  494. }
  495. LValue ComplexExprEmitter::
  496. EmitCompoundAssignLValue(const CompoundAssignOperator *E,
  497. ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&),
  498. ComplexPairTy &Val) {
  499. TestAndClearIgnoreReal();
  500. TestAndClearIgnoreImag();
  501. QualType LHSTy = E->getLHS()->getType();
  502. BinOpInfo OpInfo;
  503. // Load the RHS and LHS operands.
  504. // __block variables need to have the rhs evaluated first, plus this should
  505. // improve codegen a little.
  506. OpInfo.Ty = E->getComputationResultType();
  507. // The RHS should have been converted to the computation type.
  508. assert(OpInfo.Ty->isAnyComplexType());
  509. assert(CGF.getContext().hasSameUnqualifiedType(OpInfo.Ty,
  510. E->getRHS()->getType()));
  511. OpInfo.RHS = Visit(E->getRHS());
  512. LValue LHS = CGF.EmitLValue(E->getLHS());
  513. // Load from the l-value.
  514. ComplexPairTy LHSComplexPair = EmitLoadOfLValue(LHS);
  515. OpInfo.LHS = EmitComplexToComplexCast(LHSComplexPair, LHSTy, OpInfo.Ty);
  516. // Expand the binary operator.
  517. ComplexPairTy Result = (this->*Func)(OpInfo);
  518. // Truncate the result back to the LHS type.
  519. Result = EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy);
  520. Val = Result;
  521. // Store the result value into the LHS lvalue.
  522. EmitStoreThroughLValue(Result, LHS);
  523. return LHS;
  524. }
  525. // Compound assignments.
  526. ComplexPairTy ComplexExprEmitter::
  527. EmitCompoundAssign(const CompoundAssignOperator *E,
  528. ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){
  529. ComplexPairTy Val;
  530. LValue LV = EmitCompoundAssignLValue(E, Func, Val);
  531. // The result of an assignment in C is the assigned r-value.
  532. if (!CGF.getContext().getLangOptions().CPlusPlus)
  533. return Val;
  534. // If the lvalue is non-volatile, return the computed value of the assignment.
  535. if (!LV.isVolatileQualified())
  536. return Val;
  537. return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified());
  538. }
  539. LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E,
  540. ComplexPairTy &Val) {
  541. assert(CGF.getContext().hasSameUnqualifiedType(E->getLHS()->getType(),
  542. E->getRHS()->getType()) &&
  543. "Invalid assignment");
  544. TestAndClearIgnoreReal();
  545. TestAndClearIgnoreImag();
  546. // Emit the RHS. __block variables need the RHS evaluated first.
  547. Val = Visit(E->getRHS());
  548. // Compute the address to store into.
  549. LValue LHS = CGF.EmitLValue(E->getLHS());
  550. // Store the result value into the LHS lvalue.
  551. EmitStoreThroughLValue(Val, LHS);
  552. return LHS;
  553. }
  554. ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
  555. ComplexPairTy Val;
  556. LValue LV = EmitBinAssignLValue(E, Val);
  557. // The result of an assignment in C is the assigned r-value.
  558. if (!CGF.getContext().getLangOptions().CPlusPlus)
  559. return Val;
  560. // If the lvalue is non-volatile, return the computed value of the assignment.
  561. if (!LV.isVolatileQualified())
  562. return Val;
  563. return EmitLoadOfComplex(LV.getAddress(), LV.isVolatileQualified());
  564. }
  565. ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
  566. CGF.EmitIgnoredExpr(E->getLHS());
  567. return Visit(E->getRHS());
  568. }
  569. ComplexPairTy ComplexExprEmitter::
  570. VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
  571. TestAndClearIgnoreReal();
  572. TestAndClearIgnoreImag();
  573. llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
  574. llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
  575. llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
  576. // Bind the common expression if necessary.
  577. CodeGenFunction::OpaqueValueMapping binding(CGF, E);
  578. CodeGenFunction::ConditionalEvaluation eval(CGF);
  579. CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
  580. eval.begin(CGF);
  581. CGF.EmitBlock(LHSBlock);
  582. ComplexPairTy LHS = Visit(E->getTrueExpr());
  583. LHSBlock = Builder.GetInsertBlock();
  584. CGF.EmitBranch(ContBlock);
  585. eval.end(CGF);
  586. eval.begin(CGF);
  587. CGF.EmitBlock(RHSBlock);
  588. ComplexPairTy RHS = Visit(E->getFalseExpr());
  589. RHSBlock = Builder.GetInsertBlock();
  590. CGF.EmitBlock(ContBlock);
  591. eval.end(CGF);
  592. // Create a PHI node for the real part.
  593. llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.r");
  594. RealPN->addIncoming(LHS.first, LHSBlock);
  595. RealPN->addIncoming(RHS.first, RHSBlock);
  596. // Create a PHI node for the imaginary part.
  597. llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.i");
  598. ImagPN->addIncoming(LHS.second, LHSBlock);
  599. ImagPN->addIncoming(RHS.second, RHSBlock);
  600. return ComplexPairTy(RealPN, ImagPN);
  601. }
  602. ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
  603. return Visit(E->getChosenSubExpr(CGF.getContext()));
  604. }
  605. ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) {
  606. bool Ignore = TestAndClearIgnoreReal();
  607. (void)Ignore;
  608. assert (Ignore == false && "init list ignored");
  609. Ignore = TestAndClearIgnoreImag();
  610. (void)Ignore;
  611. assert (Ignore == false && "init list ignored");
  612. if (E->getNumInits() == 2) {
  613. llvm::Value *Real = CGF.EmitScalarExpr(E->getInit(0));
  614. llvm::Value *Imag = CGF.EmitScalarExpr(E->getInit(1));
  615. return ComplexPairTy(Real, Imag);
  616. } else if (E->getNumInits() == 1) {
  617. return Visit(E->getInit(0));
  618. }
  619. // Empty init list intializes to null
  620. assert(E->getNumInits() == 0 && "Unexpected number of inits");
  621. QualType Ty = E->getType()->getAs<ComplexType>()->getElementType();
  622. llvm::Type* LTy = CGF.ConvertType(Ty);
  623. llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy);
  624. return ComplexPairTy(zeroConstant, zeroConstant);
  625. }
  626. ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
  627. llvm::Value *ArgValue = CGF.EmitVAListRef(E->getSubExpr());
  628. llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, E->getType());
  629. if (!ArgPtr) {
  630. CGF.ErrorUnsupported(E, "complex va_arg expression");
  631. llvm::Type *EltTy =
  632. CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType());
  633. llvm::Value *U = llvm::UndefValue::get(EltTy);
  634. return ComplexPairTy(U, U);
  635. }
  636. // FIXME Volatility.
  637. return EmitLoadOfComplex(ArgPtr, false);
  638. }
  639. //===----------------------------------------------------------------------===//
  640. // Entry Point into this File
  641. //===----------------------------------------------------------------------===//
  642. /// EmitComplexExpr - Emit the computation of the specified expression of
  643. /// complex type, ignoring the result.
  644. ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal,
  645. bool IgnoreImag) {
  646. assert(E && E->getType()->isAnyComplexType() &&
  647. "Invalid complex expression to emit");
  648. return ComplexExprEmitter(*this, IgnoreReal, IgnoreImag)
  649. .Visit(const_cast<Expr*>(E));
  650. }
  651. /// EmitComplexExprIntoAddr - Emit the computation of the specified expression
  652. /// of complex type, storing into the specified Value*.
  653. void CodeGenFunction::EmitComplexExprIntoAddr(const Expr *E,
  654. llvm::Value *DestAddr,
  655. bool DestIsVolatile) {
  656. assert(E && E->getType()->isAnyComplexType() &&
  657. "Invalid complex expression to emit");
  658. ComplexExprEmitter Emitter(*this);
  659. ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
  660. Emitter.EmitStoreOfComplex(Val, DestAddr, DestIsVolatile);
  661. }
  662. /// StoreComplexToAddr - Store a complex number into the specified address.
  663. void CodeGenFunction::StoreComplexToAddr(ComplexPairTy V,
  664. llvm::Value *DestAddr,
  665. bool DestIsVolatile) {
  666. ComplexExprEmitter(*this).EmitStoreOfComplex(V, DestAddr, DestIsVolatile);
  667. }
  668. /// LoadComplexFromAddr - Load a complex number from the specified address.
  669. ComplexPairTy CodeGenFunction::LoadComplexFromAddr(llvm::Value *SrcAddr,
  670. bool SrcIsVolatile) {
  671. return ComplexExprEmitter(*this).EmitLoadOfComplex(SrcAddr, SrcIsVolatile);
  672. }
  673. LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) {
  674. assert(E->getOpcode() == BO_Assign);
  675. ComplexPairTy Val; // ignored
  676. return ComplexExprEmitter(*this).EmitBinAssignLValue(E, Val);
  677. }
  678. LValue CodeGenFunction::
  679. EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E) {
  680. ComplexPairTy(ComplexExprEmitter::*Op)(const ComplexExprEmitter::BinOpInfo &);
  681. switch (E->getOpcode()) {
  682. case BO_MulAssign: Op = &ComplexExprEmitter::EmitBinMul; break;
  683. case BO_DivAssign: Op = &ComplexExprEmitter::EmitBinDiv; break;
  684. case BO_SubAssign: Op = &ComplexExprEmitter::EmitBinSub; break;
  685. case BO_AddAssign: Op = &ComplexExprEmitter::EmitBinAdd; break;
  686. default:
  687. llvm_unreachable("unexpected complex compound assignment");
  688. }
  689. ComplexPairTy Val; // ignored
  690. return ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
  691. }