# HG changeset patch # User Gilles Duboscq # Date 1340193123 -7200 # Node ID c5c02cd462db0e4d3f3e97518d954af1cbec58ab # Parent d71eb56d6bb039a66cf482afc3d12d9a46949ebd Be abit more carefull about displacements in makeAddress diff -r d71eb56d6bb0 -r c5c02cd462db graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java Tue Jun 19 20:03:06 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java Wed Jun 20 13:52:03 2012 +0200 @@ -137,13 +137,18 @@ Value base = operand(object); Value index = Value.IllegalValue; int scale = 1; - long displacement = location.displacement(); + int displacement = location.displacement(); if (isConstant(base)) { - if (!asConstant(base).isNull()) { - displacement += asConstant(base).asLong(); + if (asConstant(base).isNull()) { + base = Value.IllegalValue; + } else if (asConstant(base).kind != Kind.Object) { + long newDisplacement = displacement + asConstant(base).asLong(); + if (NumUtil.isInt(newDisplacement)) { + displacement = (int) newDisplacement; + base = Value.IllegalValue; + } } - base = Value.IllegalValue; } if (location instanceof IndexedLocationNode) { @@ -157,7 +162,7 @@ long newDisplacement = displacement + asConstant(index).asLong() * scale; // only use the constant index if the resulting displacement fits into a 32 bit offset if (NumUtil.isInt(newDisplacement)) { - displacement = newDisplacement; + displacement = (int) newDisplacement; index = Value.IllegalValue; } else { // create a temporary variable for the index, the pointer load cannot handle a constant index @@ -168,7 +173,7 @@ } } - return new Address(location.getValueKind(), base, index, Address.Scale.fromInt(scale), (int) displacement); + return new Address(location.getValueKind(), base, index, Address.Scale.fromInt(scale), displacement); } @Override