Mercurial > projects > ldc
view gen/binops.cpp @ 90:16e88334bba7 trunk
[svn r94] started on complex support
calling final class methods was being treated as a virtual call failing an assertion.
author | lindquist |
---|---|
date | Wed, 07 Nov 2007 03:36:07 +0100 |
parents | fd32135dca3e |
children | 4d1e9eb001e0 |
line wrap: on
line source
#include "gen/llvm.h" #include "declaration.h" #include "gen/irstate.h" #include "gen/dvalue.h" DValue* DtoBinAdd(DValue* lhs, DValue* rhs) { llvm::Value* v = gIR->ir->CreateAdd(lhs->getRVal(), rhs->getRVal(), "tmp"); return new DImValue( lhs->getType(), v ); } DValue* DtoBinSub(DValue* lhs, DValue* rhs) { llvm::Value* v = gIR->ir->CreateSub(lhs->getRVal(), rhs->getRVal(), "tmp"); return new DImValue( lhs->getType(), v ); } DValue* DtoBinMul(DValue* lhs, DValue* rhs) { llvm::Value* v = gIR->ir->CreateMul(lhs->getRVal(), rhs->getRVal(), "tmp"); return new DImValue( lhs->getType(), v ); } DValue* DtoBinDiv(DValue* lhs, DValue* rhs) { Type* t = lhs->getType(); llvm::Value *l, *r; l = lhs->getRVal(); r = rhs->getRVal(); llvm::Value* res; if (t->isfloating()) res = gIR->ir->CreateFDiv(l, r, "tmp"); else if (!t->isunsigned()) res = gIR->ir->CreateSDiv(l, r, "tmp"); else res = gIR->ir->CreateUDiv(l, r, "tmp"); return new DImValue( lhs->getType(), res ); } DValue* DtoBinRem(DValue* lhs, DValue* rhs) { Type* t = lhs->getType(); llvm::Value *l, *r; l = lhs->getRVal(); r = rhs->getRVal(); llvm::Value* res; if (t->isfloating()) res = gIR->ir->CreateFRem(l, r, "tmp"); else if (!t->isunsigned()) res = gIR->ir->CreateSRem(l, r, "tmp"); else res = gIR->ir->CreateURem(l, r, "tmp"); return new DImValue( lhs->getType(), res ); }