Mercurial > hg > truffle
diff graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java @ 21784:f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Mon, 08 Jun 2015 19:19:45 +0200 |
parents | d915361cc3a1 |
children |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Mon Jun 08 18:47:58 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Mon Jun 08 19:19:45 2015 +0200 @@ -22,31 +22,20 @@ */ package com.oracle.graal.hotspot.amd64; -import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.*; import static com.oracle.graal.hotspot.HotSpotBackend.*; import static com.oracle.jvmci.amd64.AMD64.*; import static com.oracle.jvmci.code.ValueUtil.*; -import com.oracle.graal.asm.*; -import com.oracle.graal.asm.amd64.AMD64Assembler.*; import com.oracle.graal.compiler.amd64.*; -import com.oracle.graal.compiler.common.calc.*; -import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.compiler.match.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.lir.*; -import com.oracle.graal.lir.amd64.*; import com.oracle.graal.lir.amd64.AMD64Move.CompareAndSwapOp; import com.oracle.graal.lir.gen.*; import com.oracle.graal.nodes.CallTargetNode.InvokeKind; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.calc.*; -import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.memory.*; import com.oracle.jvmci.amd64.*; import com.oracle.jvmci.code.*; import com.oracle.jvmci.debug.*; @@ -58,35 +47,8 @@ */ public class AMD64HotSpotNodeLIRBuilder extends AMD64NodeLIRBuilder implements HotSpotNodeLIRBuilder { - private static ValueNode filterCompression(ValueNode node) { - ValueNode result = node; - if (result instanceof PiNode) { - result = ((PiNode) result).getOriginalNode(); - } - if (result instanceof CompressionNode) { - result = ((CompressionNode) result).getValue(); - } - return result; - } - private final HotSpotGraalRuntimeProvider runtime; - private void emitCompareCompressedMemory(Kind kind, IfNode ifNode, ValueNode valueNode, CompressionNode compress, ConstantLocationNode location, Access access, CompareNode compare) { - Value value = gen.load(operand(valueNode)); - AMD64AddressValue address = makeCompressedAddress(compress, location); - Condition cond = compare.condition(); - if (access == filterCompression(compare.getX())) { - cond = cond.mirror(); - } else { - assert access == filterCompression(compare.getY()); - } - - LabelRef trueLabel = getLIRBlock(ifNode.trueSuccessor()); - LabelRef falseLabel = getLIRBlock(ifNode.falseSuccessor()); - double trueLabelProbability = ifNode.probability(ifNode.trueSuccessor()); - getGen().emitCompareBranchMemory(kind, value, address, getState(access), cond, compare.unorderedIsTrue(), trueLabel, falseLabel, trueLabelProbability); - } - public AMD64HotSpotNodeLIRBuilder(HotSpotGraalRuntimeProvider runtime, StructuredGraph graph, LIRGeneratorTool gen) { super(graph, gen); this.runtime = runtime; @@ -197,169 +159,16 @@ } } - public void emitPrefetchAllocate(ValueNode address, ValueNode distance) { - AMD64AddressValue addr = getGen().emitAddress(operand(address), 0, gen.loadNonConst(operand(distance)), 1); - append(new AMD64PrefetchOp(addr, getGen().config.allocatePrefetchInstr)); - } - @Override public void visitDirectCompareAndSwap(DirectCompareAndSwapNode x) { Value expected = gen.loadNonConst(operand(x.expectedValue())); Variable newVal = gen.load(operand(x.newValue())); assert expected.getLIRKind().equals(newVal.getLIRKind()); - AMD64AddressValue address = getGen().emitAddress(operand(x.object()), 0, operand(x.offset()), 1); - RegisterValue raxLocal = AMD64.rax.asValue(expected.getLIRKind()); gen.emitMove(raxLocal, expected); - append(new CompareAndSwapOp(expected.getKind(), raxLocal, address, raxLocal, newVal)); + append(new CompareAndSwapOp(expected.getKind(), raxLocal, getGen().asAddressValue(operand(x.getAddress())), raxLocal, newVal)); setResult(x, gen.emitMove(raxLocal)); } - - boolean canFormCompressedMemory(CompressionNode compress, ConstantLocationNode location) { - HotSpotVMConfig config = runtime.getConfig(); - if (config.useCompressedOops && compress.getEncoding().shift <= 3 && NumUtil.isInt(location.getDisplacement())) { - Stamp compressedStamp = compress.getValue().stamp(); - if (compressedStamp instanceof NarrowOopStamp) { - return true; - } else if (compressedStamp instanceof KlassPointerStamp) { - assert ((KlassPointerStamp) compressedStamp).isCompressed(); - return config.narrowKlassBase == config.narrowOopBase; - } - } - return false; - } - - private AMD64AddressValue makeCompressedAddress(CompressionNode compress, ConstantLocationNode location) { - assert canFormCompressedMemory(compress, location); - AMD64AddressValue address = getGen().emitAddress(getGen().getProviders().getRegisters().getHeapBaseRegister().asValue(), location.getDisplacement(), operand(compress.getValue()), - 1 << compress.getEncoding().shift); - return address; - } - - @MatchRule("(If (IntegerEquals=compare value (FloatingRead=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (IntegerLessThan=compare value (FloatingRead=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (IntegerBelow=compare value (FloatingRead=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (FloatEquals=compare value (FloatingRead=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (FloatLessThan=compare value (FloatingRead=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (IntegerEquals=compare value (Read=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (IntegerLessThan=compare value (Read=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (IntegerBelow=compare value (Read=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (FloatEquals=compare value (Read=access (Compression=compress object) ConstantLocation=location)))") - @MatchRule("(If (FloatLessThan=compare value (Read=access (Compression=compress object) ConstantLocation=location)))") - public ComplexMatchResult ifCompareCompressedMemory(IfNode root, CompareNode compare, CompressionNode compress, ValueNode value, ConstantLocationNode location, Access access) { - if (canFormCompressedMemory(compress, location)) { - PlatformKind cmpKind = gen.getLIRKind(compare.getX().stamp()).getPlatformKind(); - if (cmpKind instanceof Kind) { - Kind kind = (Kind) cmpKind; - return builder -> { - emitCompareCompressedMemory(kind, root, value, compress, location, access, compare); - return null; - }; - } - } - return null; - } - - private ComplexMatchResult binaryReadCompressed(AMD64RMOp op, OperandSize size, ValueNode value, Access access, CompressionNode compress, ConstantLocationNode location) { - if (canFormCompressedMemory(compress, location)) { - return builder -> getLIRGeneratorTool().emitBinaryMemory(op, size, getLIRGeneratorTool().asAllocatable(operand(value)), makeCompressedAddress(compress, location), getState(access)); - } else { - return null; - } - } - - @MatchRule("(Add value (Read=access (Compression=compress object) ConstantLocation=location))") - @MatchRule("(Add value (FloatingRead=access (Compression=compress object) ConstantLocation=location))") - public ComplexMatchResult addMemoryCompressed(ValueNode value, Access access, CompressionNode compress, ConstantLocationNode location) { - OperandSize size = getMemorySize(access); - if (size.isXmmType()) { - return binaryReadCompressed(SSEOp.ADD, size, value, access, compress, location); - } else { - return binaryReadCompressed(ADD.getRMOpcode(size), size, value, access, compress, location); - } - } - - @MatchRule("(Sub value (Read=access (Compression=compress object) ConstantLocation=location))") - @MatchRule("(Sub value (FloatingRead=access (Compression=compress object) ConstantLocation=location))") - public ComplexMatchResult subMemoryCompressed(ValueNode value, Access access, CompressionNode compress, ConstantLocationNode location) { - OperandSize size = getMemorySize(access); - if (size.isXmmType()) { - return binaryReadCompressed(SSEOp.SUB, size, value, access, compress, location); - } else { - return binaryReadCompressed(SUB.getRMOpcode(size), size, value, access, compress, location); - } - } - - @MatchRule("(Mul value (Read=access (Compression=compress object) ConstantLocation=location))") - @MatchRule("(Mul value (FloatingRead=access (Compression=compress object) ConstantLocation=location))") - public ComplexMatchResult mulMemoryCompressed(ValueNode value, Access access, CompressionNode compress, ConstantLocationNode location) { - OperandSize size = getMemorySize(access); - if (size.isXmmType()) { - return binaryReadCompressed(SSEOp.MUL, size, value, access, compress, location); - } else { - return binaryReadCompressed(AMD64RMOp.IMUL, size, value, access, compress, location); - } - } - - @MatchRule("(And value (Read=access (Compression=compress object) ConstantLocation=location))") - @MatchRule("(And value (FloatingRead=access (Compression=compress object) ConstantLocation=location))") - public ComplexMatchResult andMemoryCompressed(ValueNode value, Access access, CompressionNode compress, ConstantLocationNode location) { - OperandSize size = getMemorySize(access); - if (size.isXmmType()) { - return null; - } else { - return binaryReadCompressed(AND.getRMOpcode(size), size, value, access, compress, location); - } - } - - @MatchRule("(Or value (Read=access (Compression=compress object) ConstantLocation=location))") - @MatchRule("(Or value (FloatingRead=access (Compression=compress object) ConstantLocation=location))") - public ComplexMatchResult orMemoryCompressed(ValueNode value, Access access, CompressionNode compress, ConstantLocationNode location) { - OperandSize size = getMemorySize(access); - if (size.isXmmType()) { - return null; - } else { - return binaryReadCompressed(OR.getRMOpcode(size), size, value, access, compress, location); - } - } - - @MatchRule("(Xor value (Read=access (Compression=compress object) ConstantLocation=location))") - @MatchRule("(Xor value (FloatingRead=access (Compression=compress object) ConstantLocation=location))") - public ComplexMatchResult xorMemoryCompressed(ValueNode value, Access access, CompressionNode compress, ConstantLocationNode location) { - OperandSize size = getMemorySize(access); - if (size.isXmmType()) { - return null; - } else { - return binaryReadCompressed(XOR.getRMOpcode(size), size, value, access, compress, location); - } - } - - @MatchRule("(Read (Compression=compress object) ConstantLocation=location)") - @MatchRule("(Read (Pi (Compression=compress object)) ConstantLocation=location)") - @MatchRule("(FloatingRead (Compression=compress object) ConstantLocation=location)") - @MatchRule("(FloatingRead (Pi (Compression=compress object)) ConstantLocation=location)") - public ComplexMatchResult readCompressed(Access root, CompressionNode compress, ConstantLocationNode location) { - if (canFormCompressedMemory(compress, location)) { - LIRKind readKind = getGen().getLIRKind(root.asNode().stamp()); - return builder -> { - return getGen().emitLoad(readKind, makeCompressedAddress(compress, location), getState(root)); - }; - } - return null; - } - - @MatchRule("(Write (Compression=compress object) ConstantLocation=location value)") - @MatchRule("(Write (Pi (Compression=compress object)) ConstantLocation=location value)") - public ComplexMatchResult writeCompressed(Access root, CompressionNode compress, ConstantLocationNode location, ValueNode value) { - if (canFormCompressedMemory(compress, location)) { - LIRKind readKind = getGen().getLIRKind(value.asNode().stamp()); - return builder -> { - getGen().emitStore(readKind, makeCompressedAddress(compress, location), operand(value), getState(root)); - return null; - }; - } - return null; - } }