changeset 18299:1b1569d182f9

Support bitwise logic on float and double operands.
author Roland Schatz <roland.schatz@oracle.com>
date Fri, 07 Nov 2014 10:58:50 +0100
parents ba5c9055c53a
children 9734f97bddfe
files graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java
diffstat 1 files changed, 142 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java	Fri Nov 07 10:56:51 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java	Fri Nov 07 10:58:50 2014 +0100
@@ -452,7 +452,148 @@
         }
     },
 
-    null, null, null, null,
+    new UnaryOp.Not() {
+
+        @Override
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
+            switch (value.getKind()) {
+                case Float:
+                    int f = Float.floatToRawIntBits(value.asFloat());
+                    return JavaConstant.forFloat(Float.intBitsToFloat(~f));
+                case Double:
+                    long d = Double.doubleToRawLongBits(value.asDouble());
+                    return JavaConstant.forDouble(Double.longBitsToDouble(~d));
+                default:
+                    throw GraalInternalError.shouldNotReachHere();
+            }
+        }
+
+        @Override
+        public Stamp foldStamp(Stamp s) {
+            return s.unrestricted();
+        }
+    },
+
+    new BinaryOp.And(true, true) {
+
+        @Override
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
+            assert a.getKind() == b.getKind();
+            switch (a.getKind()) {
+                case Float:
+                    int fa = Float.floatToRawIntBits(a.asFloat());
+                    int fb = Float.floatToRawIntBits(b.asFloat());
+                    return JavaConstant.forFloat(Float.intBitsToFloat(fa & fb));
+                case Double:
+                    long da = Double.doubleToRawLongBits(a.asDouble());
+                    long db = Double.doubleToRawLongBits(b.asDouble());
+                    return JavaConstant.forDouble(Double.longBitsToDouble(da & db));
+                default:
+                    throw GraalInternalError.shouldNotReachHere();
+            }
+        }
+
+        @Override
+        public Stamp foldStamp(Stamp stamp1, Stamp stamp2) {
+            return stamp1.unrestricted();
+        }
+
+        @Override
+        public boolean isNeutral(Constant n) {
+            PrimitiveConstant value = (PrimitiveConstant) n;
+            switch (value.getKind()) {
+                case Float:
+                    return Float.floatToRawIntBits(value.asFloat()) == 0xFFFFFFFF;
+                case Double:
+                    return Double.doubleToRawLongBits(value.asDouble()) == 0xFFFFFFFFFFFFFFFFL;
+                default:
+                    throw GraalInternalError.shouldNotReachHere();
+            }
+        }
+    },
+
+    new BinaryOp.Or(true, true) {
+
+        @Override
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
+            assert a.getKind() == b.getKind();
+            switch (a.getKind()) {
+                case Float:
+                    int fa = Float.floatToRawIntBits(a.asFloat());
+                    int fb = Float.floatToRawIntBits(b.asFloat());
+                    return JavaConstant.forFloat(Float.intBitsToFloat(fa | fb));
+                case Double:
+                    long da = Double.doubleToRawLongBits(a.asDouble());
+                    long db = Double.doubleToRawLongBits(b.asDouble());
+                    return JavaConstant.forDouble(Double.longBitsToDouble(da | db));
+                default:
+                    throw GraalInternalError.shouldNotReachHere();
+            }
+        }
+
+        @Override
+        public Stamp foldStamp(Stamp stamp1, Stamp stamp2) {
+            return stamp1.unrestricted();
+        }
+
+        @Override
+        public boolean isNeutral(Constant n) {
+            PrimitiveConstant value = (PrimitiveConstant) n;
+            switch (value.getKind()) {
+                case Float:
+                    return Float.floatToRawIntBits(value.asFloat()) == 0;
+                case Double:
+                    return Double.doubleToRawLongBits(value.asDouble()) == 0L;
+                default:
+                    throw GraalInternalError.shouldNotReachHere();
+            }
+        }
+    },
+
+    new BinaryOp.Xor(true, true) {
+
+        @Override
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
+            assert a.getKind() == b.getKind();
+            switch (a.getKind()) {
+                case Float:
+                    int fa = Float.floatToRawIntBits(a.asFloat());
+                    int fb = Float.floatToRawIntBits(b.asFloat());
+                    return JavaConstant.forFloat(Float.intBitsToFloat(fa ^ fb));
+                case Double:
+                    long da = Double.doubleToRawLongBits(a.asDouble());
+                    long db = Double.doubleToRawLongBits(b.asDouble());
+                    return JavaConstant.forDouble(Double.longBitsToDouble(da ^ db));
+                default:
+                    throw GraalInternalError.shouldNotReachHere();
+            }
+        }
+
+        @Override
+        public Stamp foldStamp(Stamp stamp1, Stamp stamp2) {
+            return stamp1.unrestricted();
+        }
+
+        @Override
+        public boolean isNeutral(Constant n) {
+            PrimitiveConstant value = (PrimitiveConstant) n;
+            switch (value.getKind()) {
+                case Float:
+                    return Float.floatToRawIntBits(value.asFloat()) == 0;
+                case Double:
+                    return Double.doubleToRawLongBits(value.asDouble()) == 0L;
+                default:
+                    throw GraalInternalError.shouldNotReachHere();
+            }
+        }
+    },
 
     new UnaryOp.Abs() {