diff gen/binops.cpp @ 86:fd32135dca3e trunk

[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!! Lots of bugfixes. Added support for special foreach on strings. Added std.array, std.utf, std.ctype and std.uni to phobos. Changed all the .c files in the gen dir to .cpp (it *is* C++ after all)
author lindquist
date Sat, 03 Nov 2007 14:44:58 +0100
parents
children 4d1e9eb001e0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gen/binops.cpp	Sat Nov 03 14:44:58 2007 +0100
@@ -0,0 +1,56 @@
+#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 );
+}