Mercurial > hg > truffle
diff graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java @ 15023:652564fe42d5
Use CompressionNode for accessing compressed Klass pointers.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Tue, 08 Apr 2014 15:55:18 +0200 |
parents | db4254246f9a |
children | 2ee777221036 |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Apr 08 15:44:41 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Apr 08 15:55:18 2014 +0200 @@ -455,16 +455,40 @@ @Override public Value emitCompress(Value pointer, CompressEncoding encoding) { - Variable result = newVariable(NarrowOopStamp.NarrowOop); - append(new AMD64HotSpotMove.CompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding)); - return result; + if (pointer.getPlatformKind() == Kind.Object) { + Variable result = newVariable(NarrowOopStamp.NarrowOop); + append(new AMD64HotSpotMove.CompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding)); + return result; + } else { + assert pointer.getPlatformKind() == Kind.Long; + Variable result = newVariable(Kind.Int); + AllocatableValue base = Value.ILLEGAL; + if (encoding.base != 0) { + base = newVariable(Kind.Long); + append(new AMD64Move.MoveToRegOp(Kind.Long, base, Constant.forLong(encoding.base))); + } + append(new AMD64HotSpotMove.CompressPointer(result, asAllocatable(pointer), base, encoding)); + return result; + } } @Override public Value emitUncompress(Value pointer, CompressEncoding encoding) { - Variable result = newVariable(Kind.Object); - append(new AMD64HotSpotMove.UncompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding)); - return result; + if (pointer.getPlatformKind() == NarrowOopStamp.NarrowOop) { + Variable result = newVariable(Kind.Object); + append(new AMD64HotSpotMove.UncompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding)); + return result; + } else { + assert pointer.getPlatformKind() == Kind.Int; + Variable result = newVariable(Kind.Long); + AllocatableValue base = Value.ILLEGAL; + if (encoding.base != 0) { + base = newVariable(Kind.Long); + append(new AMD64Move.MoveToRegOp(Kind.Long, base, Constant.forLong(encoding.base))); + } + append(new AMD64HotSpotMove.UncompressPointer(result, asAllocatable(pointer), base, encoding)); + return result; + } } @Override