changeset 9433:45a73cd19baa

Use the correct move instruction for register saving and restoring.
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 30 Apr 2013 19:25:08 +0200
parents 6680389bd36f
children 3e884486cc8a c021bfc839e6
files graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java
diffstat 3 files changed, 33 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Tue Apr 30 19:24:00 2013 +0200
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Tue Apr 30 19:25:08 2013 +0200
@@ -198,13 +198,19 @@
         if (needsCalleeSave) {
             Register[] savedRegisters = frameMap.registerConfig.getAllocatableRegisters();
             savedRegisterLocations = new StackSlot[savedRegisters.length];
+            AMD64LIRInstruction[] savingMoves = new AMD64LIRInstruction[savedRegisters.length];
+            AMD64LIRInstruction[] restoringMoves = new AMD64LIRInstruction[savedRegisters.length];
             for (int i = 0; i < savedRegisters.length; i++) {
                 PlatformKind kind = target.arch.getLargestStorableKind(savedRegisters[i].getRegisterCategory());
                 assert kind != Kind.Illegal;
                 StackSlot spillSlot = frameMap.allocateSpillSlot(kind);
                 savedRegisterLocations[i] = spillSlot;
+
+                RegisterValue register = savedRegisters[i].asValue(kind);
+                savingMoves[i] = createMove(spillSlot, register);
+                restoringMoves[i] = createMove(register, spillSlot);
             }
-            save = new AMD64SaveRegistersOp(savedRegisters, savedRegisterLocations);
+            save = new AMD64SaveRegistersOp(savingMoves, restoringMoves, savedRegisterLocations);
             append(save);
 
             Value thread = args[0];
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java	Tue Apr 30 19:24:00 2013 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java	Tue Apr 30 19:25:08 2013 +0200
@@ -52,12 +52,9 @@
 
     @Override
     public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) {
-        Register[] savedRegisters = save.savedRegisters;
-        for (int i = 0; i < savedRegisters.length; i++) {
-            if (savedRegisters[i] != null) {
-                StackSlot input = slots[i];
-                RegisterValue result = savedRegisters[i].asValue(input.getKind());
-                AMD64Move.move(tasm, masm, result, input);
+        for (AMD64LIRInstruction restoringMove : save.restoringMoves) {
+            if (restoringMove != null) {
+                restoringMove.emitCode(tasm, masm);
             }
         }
     }
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java	Tue Apr 30 19:24:00 2013 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java	Tue Apr 30 19:25:08 2013 +0200
@@ -30,6 +30,7 @@
 import com.oracle.graal.asm.amd64.*;
 import com.oracle.graal.lir.*;
 import com.oracle.graal.lir.LIRInstruction.Opcode;
+import com.oracle.graal.lir.StandardOp.MoveOp;
 import com.oracle.graal.lir.asm.*;
 
 /**
@@ -39,29 +40,31 @@
 public final class AMD64SaveRegistersOp extends AMD64LIRInstruction {
 
     /**
-     * The registers (potentially) saved by this operation.
+     * The move instructions for saving the registers.
      */
-    protected final Register[] savedRegisters;
+    protected final AMD64LIRInstruction[] savingMoves;
+
+    /**
+     * The move instructions for restoring the registers.
+     */
+    protected final AMD64LIRInstruction[] restoringMoves;
 
     /**
      * The slots to which the registers are saved.
      */
     @Def(STACK) protected final StackSlot[] slots;
 
-    public AMD64SaveRegistersOp(Register[] savedRegisters, StackSlot[] slots) {
-        this.savedRegisters = savedRegisters;
+    public AMD64SaveRegistersOp(AMD64LIRInstruction[] savingMoves, AMD64LIRInstruction[] restoringMoves, StackSlot[] slots) {
+        this.savingMoves = savingMoves;
+        this.restoringMoves = restoringMoves;
         this.slots = slots;
     }
 
     @Override
     public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) {
-        for (int i = 0; i < savedRegisters.length; i++) {
-            if (savedRegisters[i] != null) {
-                StackSlot result = slots[i];
-                RegisterValue input = savedRegisters[i].asValue(result.getKind());
-                AMD64Move.move(tasm, masm, result, input);
-            } else {
-                assert savedRegisters[i] == null;
+        for (AMD64LIRInstruction savingMove : savingMoves) {
+            if (savingMove != null) {
+                savingMove.emitCode(tasm, masm);
             }
         }
     }
@@ -73,10 +76,12 @@
      */
     public void updateAndDescribePreservation(Set<Register> notSaved, DebugInfo debugInfo, FrameMap frameMap) {
         int preserved = 0;
-        for (int i = 0; i < savedRegisters.length; i++) {
-            if (savedRegisters[i] != null) {
-                if (notSaved.contains(savedRegisters[i])) {
-                    savedRegisters[i] = null;
+        for (int i = 0; i < savingMoves.length; i++) {
+            if (savingMoves[i] != null) {
+                Register register = ValueUtil.asRegister(((MoveOp) savingMoves[i]).getInput());
+                if (notSaved.contains(register)) {
+                    savingMoves[i] = null;
+                    restoringMoves[i] = null;
                 } else {
                     preserved++;
                 }
@@ -86,9 +91,9 @@
             Register[] keys = new Register[preserved];
             int[] values = new int[keys.length];
             int mapIndex = 0;
-            for (int i = 0; i < savedRegisters.length; i++) {
-                if (savedRegisters[i] != null) {
-                    keys[mapIndex] = savedRegisters[i];
+            for (int i = 0; i < savingMoves.length; i++) {
+                if (savingMoves[i] != null) {
+                    keys[mapIndex] = ValueUtil.asRegister(((MoveOp) savingMoves[i]).getInput());
                     values[mapIndex] = frameMap.indexForStackSlot(slots[i]);
                     mapIndex++;
                 }