changeset 21247:6a00c1217310

Add SPARCStackMove.
author Josef Eisl <josef.eisl@jku.at>
date Tue, 05 May 2015 16:53:37 +0200
parents b2b3c514a391
children 2d8bb973e710
files graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java
diffstat 2 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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<SPARCStackMove> 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<MemOp> TYPE = LIRInstructionClass.create(MemOp.class);