Mercurial > projects > ldc
view gen/binops.cpp @ 100:5071469303d4 trunk
[svn r104] TONS OF FIXES.
Split up declaration, constant initializer gen and definition for globals, structs, classes and functions.
Improved ClassInfo support (not complete), not in vtable yet.
Fixed a bunch of forward reference problems.
Much more. Major commit! :)
author | lindquist |
---|---|
date | Fri, 16 Nov 2007 08:21:47 +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 ); }