# HG changeset patch # User Josef Eisl # Date 1430837617 -7200 # Node ID 6a00c121731054f0f134f2ccf470ade723cb392e # Parent b2b3c514a391d89b4584e0ddd249202b4faeb22f Add SPARCStackMove. diff -r b2b3c514a391 -r 6a00c1217310 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 Tue May 05 16:24:39 2015 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue May 05 16:53:37 2015 +0200 @@ -59,6 +59,7 @@ 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.phases.util.*; import com.oracle.graal.sparc.*; @@ -78,6 +79,11 @@ public LIRInstruction createMove(AllocatableValue result, Value input) { return SPARCLIRGenerator.this.createMove(result, input); } + + @Override + public LIRInstruction createStackMove(AllocatableValue result, Value input) { + return new SPARCStackMove(result, input); + } } public SPARCLIRGenerator(LIRKindTool lirKindTool, Providers providers, CallingConvention cc, LIRGenerationResult lirGenRes) { diff -r b2b3c514a391 -r 6a00c1217310 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 Tue May 05 16:24:39 2015 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Tue May 05 16:53:37 2015 +0200 @@ -253,6 +253,41 @@ } } + @Opcode("STACKMOVE") + public static final class SPARCStackMove extends SPARCLIRInstruction implements MoveOp { + public static final LIRInstructionClass TYPE = LIRInstructionClass.create(SPARCStackMove.class); + + @Def({STACK}) protected AllocatableValue result; + @Use({STACK, HINT}) protected Value input; + + public SPARCStackMove(AllocatableValue result, Value input) { + super(TYPE); + this.result = result; + this.input = input; + } + + @Override + public Value getInput() { + return input; + } + + @Override + public AllocatableValue getResult() { + return result; + } + + @Override + public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { + try (ScratchRegister scratchReg = masm.getScratchRegister()) { + Register scratch = scratchReg.getRegister(); + // move stack slot + move(crb, masm, scratch.asValue(getInput().getLIRKind()), getInput(), delayedControlTransfer); + move(crb, masm, getResult(), scratch.asValue(getResult().getLIRKind()), delayedControlTransfer); + } + + } + } + public abstract static class MemOp extends SPARCLIRInstruction implements ImplicitNullCheck { public static final LIRInstructionClass TYPE = LIRInstructionClass.create(MemOp.class);