changeset 15921:6d8c901814eb

Support for compressed constants in HSAIL backend.
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 27 May 2014 12:08:11 +0200
parents 4b835260c746
children 2022366b513c
files graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java
diffstat 1 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java	Tue May 27 10:22:28 2014 +0200
+++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java	Tue May 27 12:08:11 2014 +0200
@@ -94,7 +94,16 @@
 
     @Override
     public boolean canStoreConstant(Constant c, boolean isCompressed) {
-        return true;
+        return !(c instanceof HotSpotObjectConstant);
+    }
+
+    @Override
+    public boolean canInlineConstant(Constant c) {
+        if (c instanceof HotSpotObjectConstant) {
+            return c.isNull();
+        } else {
+            return super.canInlineConstant(c);
+        }
     }
 
     private static Kind getMemoryKind(PlatformKind kind) {
@@ -229,6 +238,15 @@
         if (dst.getPlatformKind() == NarrowOopStamp.NarrowOop) {
             if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(src)) {
                 return new MoveToRegOp(Kind.Int, dst, Constant.INT_0);
+            } else if (src instanceof HotSpotObjectConstant) {
+                if (HotSpotObjectConstant.isCompressed((Constant) src)) {
+                    Variable uncompressed = newVariable(Kind.Object);
+                    append(new MoveToRegOp(Kind.Object, uncompressed, src));
+                    CompressEncoding oopEncoding = config.getOopEncoding();
+                    return new HSAILMove.CompressPointer(dst, newVariable(Kind.Object), uncompressed, oopEncoding.base, oopEncoding.shift, oopEncoding.alignment, true);
+                } else {
+                    return new MoveToRegOp(Kind.Object, dst, src);
+                }
             } else if (isRegister(src) || isStackSlot(dst)) {
                 return new MoveFromRegOp(Kind.Int, dst, src);
             } else {