# HG changeset patch # User Roland Schatz # Date 1401185291 -7200 # Node ID 6d8c901814ebafd312eaac04c4945fefa6b40e61 # Parent 4b835260c7460f5a5c2b7e6cd3a2aa7dcfbd79f3 Support for compressed constants in HSAIL backend. diff -r 4b835260c746 -r 6d8c901814eb graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java --- 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 {