Mercurial > hg > truffle
diff graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java @ 16104:4dd2cedc7f57
Revert using LIRKind.reference(Kind.Int) instead of hotspot specific NarrowOop kind (part of c0b8d395368b).
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Mon, 16 Jun 2014 17:18:51 +0200 |
parents | c0b8d395368b |
children | 9e5a323e0a1e |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Fri Jun 13 15:19:12 2014 -0700 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Mon Jun 16 17:18:51 2014 +0200 @@ -39,6 +39,7 @@ import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding; import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.HotSpotStoreConstantOp; import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.stubs.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.NoOp; @@ -49,6 +50,7 @@ import com.oracle.graal.lir.amd64.AMD64Move.LeaDataOp; import com.oracle.graal.lir.amd64.AMD64Move.LoadOp; import com.oracle.graal.lir.amd64.AMD64Move.MoveFromRegOp; +import com.oracle.graal.lir.amd64.AMD64Move.MoveToRegOp; import com.oracle.graal.lir.amd64.AMD64Move.StoreOp; import com.oracle.graal.lir.gen.*; @@ -434,6 +436,14 @@ } } + private static Kind getMemoryKind(LIRKind kind) { + if (kind.getPlatformKind() == NarrowOopStamp.NarrowOop) { + return Kind.Int; + } else { + return (Kind) kind.getPlatformKind(); + } + } + private static LIRKind toStackKind(LIRKind kind) { if (kind.getPlatformKind() instanceof Kind) { Kind stackKind = ((Kind) kind.getPlatformKind()).getStackKind(); @@ -455,7 +465,7 @@ public Variable emitLoad(LIRKind kind, Value address, LIRFrameState state) { AMD64AddressValue loadAddress = asAddressValue(address); Variable result = newVariable(toStackKind(kind)); - append(new LoadOp((Kind) kind.getPlatformKind(), result, loadAddress, state)); + append(new LoadOp(getMemoryKind(kind), result, loadAddress, state)); return result; } @@ -465,12 +475,12 @@ if (isConstant(inputVal)) { Constant c = asConstant(inputVal); if (canStoreConstant(c)) { - append(new HotSpotStoreConstantOp((Kind) kind.getPlatformKind(), storeAddress, c, state)); + append(new HotSpotStoreConstantOp(getMemoryKind(kind), storeAddress, c, state)); return; } } Variable input = load(inputVal); - append(new StoreOp((Kind) kind.getPlatformKind(), storeAddress, input, state)); + append(new StoreOp(getMemoryKind(kind), storeAddress, input, state)); } @Override @@ -479,7 +489,7 @@ assert inputKind.getPlatformKind() == Kind.Long || inputKind.getPlatformKind() == Kind.Object; if (inputKind.isReference(0)) { // oop - Variable result = newVariable(LIRKind.reference(Kind.Int)); + Variable result = newVariable(LIRKind.reference(NarrowOopStamp.NarrowOop)); append(new AMD64HotSpotMove.CompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding, nonNull)); return result; } else { @@ -497,7 +507,7 @@ @Override public Value emitUncompress(Value pointer, CompressEncoding encoding, boolean nonNull) { LIRKind inputKind = pointer.getLIRKind(); - assert inputKind.getPlatformKind() == Kind.Int; + assert inputKind.getPlatformKind() == Kind.Int || inputKind.getPlatformKind() == NarrowOopStamp.NarrowOop; if (inputKind.isReference(0)) { // oop Variable result = newVariable(LIRKind.reference(Kind.Object)); @@ -519,6 +529,12 @@ protected AMD64LIRInstruction createMove(AllocatableValue dst, Value src) { if (src instanceof Constant) { return new AMD64HotSpotMove.HotSpotLoadConstantOp(dst, (Constant) src); + } else if (dst.getPlatformKind() == NarrowOopStamp.NarrowOop) { + if (isRegister(src) || isStackSlot(dst)) { + return new MoveFromRegOp(Kind.Int, dst, src); + } else { + return new MoveToRegOp(Kind.Int, dst, src); + } } else { return super.createMove(dst, src); } @@ -527,7 +543,7 @@ public Value emitCompareAndSwap(Value address, Value expectedValue, Value newValue, Value trueValue, Value falseValue) { LIRKind kind = newValue.getLIRKind(); assert kind.equals(expectedValue.getLIRKind()); - Kind memKind = (Kind) kind.getPlatformKind(); + Kind memKind = getMemoryKind(kind); AMD64AddressValue addressValue = asAddressValue(address); RegisterValue raxRes = AMD64.rax.asValue(kind); @@ -542,7 +558,7 @@ public Value emitAtomicReadAndAdd(Value address, Value delta) { LIRKind kind = delta.getLIRKind(); - Kind memKind = (Kind) kind.getPlatformKind(); + Kind memKind = getMemoryKind(kind); Variable result = newVariable(kind); AMD64AddressValue addressValue = asAddressValue(address); append(new AMD64Move.AtomicReadAndAddOp(memKind, result, addressValue, asAllocatable(delta))); @@ -551,7 +567,7 @@ public Value emitAtomicReadAndWrite(Value address, Value newValue) { LIRKind kind = newValue.getLIRKind(); - Kind memKind = (Kind) kind.getPlatformKind(); + Kind memKind = getMemoryKind(kind); Variable result = newVariable(kind); AMD64AddressValue addressValue = asAddressValue(address); append(new AMD64Move.AtomicReadAndWriteOp(memKind, result, addressValue, asAllocatable(newValue))); @@ -564,9 +580,11 @@ } @Override - protected void emitCompareOp(Kind cmpKind, Variable left, Value right) { + protected void emitCompareOp(PlatformKind cmpKind, Variable left, Value right) { if (right instanceof HotSpotConstant) { append(new AMD64HotSpotCompare.HotSpotCompareConstantOp(left, (Constant) right)); + } else if (cmpKind == NarrowOopStamp.NarrowOop) { + append(new AMD64HotSpotCompare.HotSpotCompareNarrowOp(left, asAllocatable(right))); } else { super.emitCompareOp(cmpKind, left, right); }