changeset 125:d604152de1eb

Support shifts and binary logical operators in codegen
author Anders Halager <halager@gmail.com>
date Sun, 25 May 2008 21:13:56 +0200
parents aa3bb5d8ba0c
children c3b24e7e8cf8
files ast/Exp.d gen/CodeGen.d
diffstat 2 files changed, 18 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ast/Exp.d	Sun May 25 21:08:10 2008 +0200
+++ b/ast/Exp.d	Sun May 25 21:13:56 2008 +0200
@@ -181,6 +181,8 @@
         Mul, Div, Mod,
 
         LeftShift, RightShift, UnsignedRightShift,
+
+        And, Or, Xor,
     }
 
     char[][] getOp = ["=","==","!=","<","<=",">",">=","+","-","*","/","%","<<",">>",">>>"];
--- a/gen/CodeGen.d	Sun May 25 21:08:10 2008 +0200
+++ b/gen/CodeGen.d	Sun May 25 21:13:56 2008 +0200
@@ -413,6 +413,15 @@
                 case BO.SRem: res = b.buildSRem(left, right, "rem"); break;
                 case BO.URem: res = b.buildURem(left, right, "rem"); break;
                 case BO.FRem: res = b.buildFRem(left, right, "rem"); break;
+
+                case BO.Shl:  res = b.buildShl(left, right, "shl"); break;
+                case BO.LShr: res = b.buildLShr(left, right, "lshr"); break;
+                case BO.AShr: res = b.buildAShr(left, right, "ashr"); break;
+
+                case BO.And: res = b.buildAnd(left, right, "and"); break;
+                case BO.Or:  res = b.buildOr (left, right, "or"); break;
+                case BO.Xor: res = b.buildXor(left, right, "xor"); break;
+
                 default:
                     LLVMPred pred = predFromBI(val);
                     if (t_a.isReal())
@@ -921,6 +930,13 @@
         case O.Sub: res = Operator.Sub; break;
         case O.Mul: res = Operator.Mul; break;
         case O.Div: res = Operator.Div; break;
+        case O.LeftShift: res = Operator.Shl; break;
+        case O.RightShift: res = Operator.AShr; break;
+        case O.UnsignedRightShift: res = Operator.LShr; break;
+
+        case O.And: res = Operator.And; break;
+        case O.Or: res = Operator.Or; break;
+        case O.Xor: res = Operator.Xor; break;
 
         case O.Eq: res = Operator.Eq; break;
         case O.Ne: res = Operator.Ne; break;