# HG changeset patch # User Stefan Anzinger # Date 1431452843 -7200 # Node ID 79b036f0cf0bf2319563b6b52c711727c3aa3991 # Parent 5e09292fb01736cb59fc36f9cefd3ca6f948d2f5 [SPARC] Change default to non sign extending load diff -r 5e09292fb017 -r 79b036f0cf0b 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 Thu May 07 05:21:23 2015 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue May 12 19:47:23 2015 +0200 @@ -52,15 +52,7 @@ import com.oracle.graal.lir.sparc.SPARCControlFlow.ReturnOp; import com.oracle.graal.lir.sparc.SPARCControlFlow.StrategySwitchOp; import com.oracle.graal.lir.sparc.SPARCControlFlow.TableSwitchOp; -import com.oracle.graal.lir.sparc.SPARCMove.LoadAddressOp; -import com.oracle.graal.lir.sparc.SPARCMove.LoadDataAddressOp; -import com.oracle.graal.lir.sparc.SPARCMove.MembarOp; -import com.oracle.graal.lir.sparc.SPARCMove.MoveFpGp; -import com.oracle.graal.lir.sparc.SPARCMove.MoveFpGpVIS3; -import com.oracle.graal.lir.sparc.SPARCMove.MoveFromRegOp; -import com.oracle.graal.lir.sparc.SPARCMove.MoveToRegOp; -import com.oracle.graal.lir.sparc.SPARCMove.SPARCStackMove; -import com.oracle.graal.lir.sparc.SPARCMove.StackLoadAddressOp; +import com.oracle.graal.lir.sparc.SPARCMove.*; import com.oracle.graal.phases.util.*; import com.oracle.graal.sparc.*; import com.oracle.graal.sparc.SPARC.CPUFeature; @@ -1070,4 +1062,11 @@ append(new ReturnOp(Value.ILLEGAL)); } + public Value emitSignExtendLoad(LIRKind kind, Value address, LIRFrameState state) { + SPARCAddressValue loadAddress = asAddressValue(address); + Variable result = newVariable(kind); + append(new LoadOp((Kind) kind.getPlatformKind(), result, loadAddress, state, true)); + return result; + } + } diff -r 5e09292fb017 -r 79b036f0cf0b graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCNodeLIRBuilder.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCNodeLIRBuilder.java Thu May 07 05:21:23 2015 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCNodeLIRBuilder.java Tue May 12 19:47:23 2015 +0200 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.match.*; +import com.oracle.graal.debug.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.*; import com.oracle.graal.lir.gen.*; @@ -105,8 +106,9 @@ Kind localFromKind = fromKind; Kind localToKind = toKind; return builder -> { + TTY.println("FromKind: " + localFromKind + " " + localToKind); Value address = access.accessLocation().generateAddress(builder, gen, operand(access.object())); - Value v = getLIRGeneratorTool().emitLoad(LIRKind.value(localFromKind), address, getState(access)); + Value v = getLIRGeneratorTool().emitSignExtendLoad(LIRKind.value(localFromKind), address, getState(access)); return getLIRGeneratorTool().emitReinterpret(LIRKind.value(localToKind), v); }; } @@ -116,4 +118,9 @@ public ComplexMatchResult signExtend(SignExtendNode root, Access access) { return emitSignExtendMemory(access, root.getInputBits(), root.getResultBits()); } + + @Override + public SPARCLIRGenerator getLIRGeneratorTool() { + return (SPARCLIRGenerator) super.getLIRGeneratorTool(); + } } diff -r 5e09292fb017 -r 79b036f0cf0b graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Thu May 07 05:21:23 2015 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Tue May 12 19:47:23 2015 +0200 @@ -343,10 +343,16 @@ public static final LIRInstructionClass TYPE = LIRInstructionClass.create(LoadOp.class); @Def({REG}) protected AllocatableValue result; + protected boolean signExtend; public LoadOp(Kind kind, AllocatableValue result, SPARCAddressValue address, LIRFrameState state) { + this(kind, result, address, state, false); + } + + public LoadOp(Kind kind, AllocatableValue result, SPARCAddressValue address, LIRFrameState state, boolean signExtend) { super(TYPE, kind, address, state); this.result = result; + this.signExtend = signExtend; } @Override @@ -362,16 +368,28 @@ switch ((Kind) kind) { case Boolean: case Byte: - masm.ldsb(addr, dst); + if (signExtend) { + masm.ldsb(addr, dst); + } else { + masm.ldub(addr, dst); + } break; case Short: - masm.ldsh(addr, dst); + if (signExtend) { + masm.ldsh(addr, dst); + } else { + masm.lduh(addr, dst); + } break; case Char: masm.lduh(addr, dst); break; case Int: - masm.ldsw(addr, dst); + if (signExtend) { + masm.ldsw(addr, dst); + } else { + masm.lduw(addr, dst); + } break; case Long: masm.ldx(addr, dst);