# HG changeset patch # User Roland Schatz # Date 1366619407 -7200 # Node ID 589e140a7f1c86c83f066c53260f7d39775562bf # Parent f78437ffb8d362bfe08ef30710db22c1d9f448d4 Allow locations to have long displacements. diff -r f78437ffb8d3 -r 589e140a7f1c graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Mon Apr 22 10:30:06 2013 +0200 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Mon Apr 22 10:30:07 2013 +0200 @@ -156,23 +156,15 @@ append(createMove(dst, src)); } - private AMD64AddressValue prepareAddress(Kind kind, Value base, int displacement, Value index, int scale) { + private AMD64AddressValue prepareAddress(Kind kind, Value base, long displacement, Value index, int scale) { AllocatableValue baseRegister; - int finalDisp = displacement; + long finalDisp = displacement; if (isConstant(base)) { if (asConstant(base).isNull()) { baseRegister = AllocatableValue.UNUSED; - } else if (asConstant(base).getKind() != Kind.Object) { - long newDisplacement = displacement + asConstant(base).asLong(); - if (NumUtil.isInt(newDisplacement)) { - assert !runtime.needsDataPatch(asConstant(base)); - finalDisp = (int) newDisplacement; - baseRegister = AllocatableValue.UNUSED; - } else { - Variable newBase = newVariable(Kind.Long); - emitMove(newBase, base); - baseRegister = newBase; - } + } else if (asConstant(base).getKind() != Kind.Object && !runtime.needsDataPatch(asConstant(base))) { + finalDisp += asConstant(base).asLong(); + baseRegister = AllocatableValue.UNUSED; } else { baseRegister = load(base); } @@ -187,19 +179,8 @@ if (index != Value.ILLEGAL && scale != 0) { scaleEnum = Scale.fromInt(scale); if (isConstant(index)) { - long newDisplacement = finalDisp + asConstant(index).asLong() * scale; - // only use the constant index if the resulting displacement fits into a 32 bit - // offset - if (NumUtil.isInt(newDisplacement)) { - finalDisp = (int) newDisplacement; - indexRegister = AllocatableValue.UNUSED; - } else { - // create a temporary variable for the index, the pointer load cannot handle a - // constant index - Variable newIndex = newVariable(Kind.Long); - emitMove(newIndex, index); - indexRegister = newIndex; - } + finalDisp += asConstant(index).asLong() * scale; + indexRegister = AllocatableValue.UNUSED; } else { indexRegister = asAllocatable(index); } @@ -208,11 +189,27 @@ scaleEnum = Scale.Times1; } - return new AMD64AddressValue(kind, baseRegister, indexRegister, scaleEnum, finalDisp); + int displacementInt; + if (NumUtil.isInt(finalDisp)) { + displacementInt = (int) finalDisp; + } else { + displacementInt = 0; + AllocatableValue displacementRegister = load(Constant.forLong(finalDisp)); + if (baseRegister == AllocatableValue.UNUSED) { + baseRegister = displacementRegister; + } else if (indexRegister == AllocatableValue.UNUSED) { + indexRegister = displacementRegister; + scaleEnum = Scale.Times1; + } else { + baseRegister = emitAdd(baseRegister, displacementRegister); + } + } + + return new AMD64AddressValue(kind, baseRegister, indexRegister, scaleEnum, displacementInt); } @Override - public Variable emitLoad(Kind kind, Value base, int displacement, Value index, int scale, DeoptimizingNode deopting) { + public Variable emitLoad(Kind kind, Value base, long displacement, Value index, int scale, DeoptimizingNode deopting) { AMD64AddressValue loadAddress = prepareAddress(kind, base, displacement, index, scale); Variable result = newVariable(loadAddress.getKind()); append(new LoadOp(result, loadAddress, deopting != null ? state(deopting) : null)); @@ -220,7 +217,7 @@ } @Override - public void emitStore(Kind kind, Value base, int displacement, Value index, int scale, Value inputVal, DeoptimizingNode deopting) { + public void emitStore(Kind kind, Value base, long displacement, Value index, int scale, Value inputVal, DeoptimizingNode deopting) { AMD64AddressValue storeAddress = prepareAddress(kind, base, displacement, index, scale); LIRFrameState state = deopting != null ? state(deopting) : null; @@ -237,7 +234,7 @@ } @Override - public Variable emitLea(Value base, int displacement, Value index, int scale) { + public Variable emitLea(Value base, long displacement, Value index, int scale) { Variable result = newVariable(target().wordKind); AMD64AddressValue address = prepareAddress(result.getKind(), base, displacement, index, scale); append(new LeaOp(result, address)); diff -r f78437ffb8d3 -r 589e140a7f1c graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Mon Apr 22 10:30:06 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Mon Apr 22 10:30:07 2013 +0200 @@ -137,7 +137,7 @@ } } - private PTXAddressValue prepareAddress(Kind kind, Value base, int displacement, Value index, int scale) { + private PTXAddressValue prepareAddress(Kind kind, Value base, long displacement, Value index, int scale) { AllocatableValue baseRegister; long finalDisp = displacement; if (isConstant(base)) { @@ -181,7 +181,7 @@ } @Override - public Variable emitLoad(Kind kind, Value base, int displacement, Value index, int scale, DeoptimizingNode deopting) { + public Variable emitLoad(Kind kind, Value base, long displacement, Value index, int scale, DeoptimizingNode deopting) { PTXAddressValue loadAddress = prepareAddress(kind, base, displacement, index, scale); Variable result = newVariable(loadAddress.getKind()); append(new LoadOp(result, loadAddress, deopting != null ? state(deopting) : null)); @@ -189,14 +189,14 @@ } @Override - public void emitStore(Kind kind, Value base, int displacement, Value index, int scale, Value inputVal, DeoptimizingNode deopting) { + public void emitStore(Kind kind, Value base, long displacement, Value index, int scale, Value inputVal, DeoptimizingNode deopting) { PTXAddressValue storeAddress = prepareAddress(kind, base, displacement, index, scale); Variable input = load(inputVal); append(new StoreOp(storeAddress, input, deopting != null ? state(deopting) : null)); } @Override - public Variable emitLea(Value base, int displacement, Value index, int scale) { + public Variable emitLea(Value base, long displacement, Value index, int scale) { throw new InternalError("NYI"); } diff -r f78437ffb8d3 -r 589e140a7f1c graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Mon Apr 22 10:30:06 2013 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Mon Apr 22 10:30:07 2013 +0200 @@ -214,19 +214,19 @@ } @Override - public Value emitLoad(Kind kind, Value base, int displacement, Value index, int scale, DeoptimizingNode canTrap) { + public Value emitLoad(Kind kind, Value base, long displacement, Value index, int scale, DeoptimizingNode canTrap) { // SPARC: Auto-generated method stub return null; } @Override - public void emitStore(Kind kind, Value base, int displacement, Value index, int scale, Value input, DeoptimizingNode canTrap) { + public void emitStore(Kind kind, Value base, long displacement, Value index, int scale, Value input, DeoptimizingNode canTrap) { // SPARC: Auto-generated method stub } @Override - public Value emitLea(Value base, int displacement, Value index, int scale) { + public Value emitLea(Value base, long displacement, Value index, int scale) { // SPARC: Auto-generated method stub return null; } diff -r f78437ffb8d3 -r 589e140a7f1c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java Mon Apr 22 10:30:06 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java Mon Apr 22 10:30:07 2013 +0200 @@ -34,17 +34,17 @@ @NodeInfo(nameTemplate = "Loc {p#locationIdentity/s}") public class ConstantLocationNode extends LocationNode { - private final int displacement; + private final long displacement; - public int displacement() { + public long displacement() { return displacement; } - public static ConstantLocationNode create(Object identity, Kind kind, int displacement, Graph graph) { + public static ConstantLocationNode create(Object identity, Kind kind, long displacement, Graph graph) { return graph.unique(new ConstantLocationNode(identity, kind, displacement)); } - protected ConstantLocationNode(Object identity, Kind kind, int displacement) { + protected ConstantLocationNode(Object identity, Kind kind, long displacement) { super(identity, kind); this.displacement = displacement; } diff -r f78437ffb8d3 -r 589e140a7f1c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Mon Apr 22 10:30:06 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Mon Apr 22 10:30:07 2013 +0200 @@ -36,7 +36,7 @@ public final class IndexedLocationNode extends LocationNode implements Canonicalizable { @Input private ValueNode index; - private final int displacement; + private final long displacement; private final int indexScaling; /** @@ -53,11 +53,11 @@ return indexScaling; } - public static IndexedLocationNode create(Object identity, Kind kind, int displacement, ValueNode index, Graph graph, int indexScaling) { + public static IndexedLocationNode create(Object identity, Kind kind, long displacement, ValueNode index, Graph graph, int indexScaling) { return graph.unique(new IndexedLocationNode(identity, kind, index, displacement, indexScaling)); } - private IndexedLocationNode(Object identity, Kind kind, ValueNode index, int displacement, int indexScaling) { + private IndexedLocationNode(Object identity, Kind kind, ValueNode index, long displacement, int indexScaling) { super(identity, kind); this.index = index; this.displacement = displacement; @@ -71,10 +71,7 @@ long constantIndexLong = constantIndex.asLong(); constantIndexLong *= indexScaling; constantIndexLong += displacement; - int constantIndexInt = (int) constantIndexLong; - if (constantIndexLong == constantIndexInt) { - return ConstantLocationNode.create(locationIdentity(), getValueKind(), constantIndexInt, graph()); - } + return ConstantLocationNode.create(locationIdentity(), getValueKind(), constantIndexLong, graph()); } return this; } diff -r f78437ffb8d3 -r 589e140a7f1c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Mon Apr 22 10:30:06 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Mon Apr 22 10:30:07 2013 +0200 @@ -57,11 +57,11 @@ public abstract void emitMove(Value dst, Value src); - public abstract Value emitLoad(Kind kind, Value base, int displacement, Value index, int scale, DeoptimizingNode deopting); + public abstract Value emitLoad(Kind kind, Value base, long displacement, Value index, int scale, DeoptimizingNode deopting); - public abstract void emitStore(Kind kind, Value base, int displacement, Value index, int scale, Value input, DeoptimizingNode deopting); + public abstract void emitStore(Kind kind, Value base, long displacement, Value index, int scale, Value input, DeoptimizingNode deopting); - public abstract Value emitLea(Value base, int displacement, Value index, int scale); + public abstract Value emitLea(Value base, long displacement, Value index, int scale); public abstract Value emitLea(StackSlot slot);