Mercurial > hg > graal-compiler
changeset 5667:c5c02cd462db
Be abit more carefull about displacements in makeAddress
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Wed, 20 Jun 2012 13:52:03 +0200 |
parents | d71eb56d6bb0 |
children | fa1e6d1cc291 |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java |
diffstat | 1 files changed, 11 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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