CGExprComplex.cpp 30 KB

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