changeset 9507:3df71c132731

Make register saving extensible.
author Roland Schatz <roland.schatz@oracle.com>
date Thu, 02 May 2013 14:13:54 +0200
parents 6703dca691d7
children 2b7857aaa1c0
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, 35 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Thu May 02 14:12:10 2013 +0200
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Thu May 02 14:13:54 2013 +0200
@@ -186,6 +186,16 @@
         super.emitCall(callTarget, result, arguments, temps, info);
     }
 
+    protected AMD64SaveRegistersOp emitSaveRegisters(Register[] savedRegisters, StackSlot[] savedRegisterLocations) {
+        AMD64SaveRegistersOp save = new AMD64SaveRegistersOp(savedRegisters, savedRegisterLocations);
+        append(save);
+        return save;
+    }
+
+    protected void emitRestoreRegisters(AMD64SaveRegistersOp save) {
+        append(new AMD64RestoreRegistersOp(save.getSlots().clone(), save));
+    }
+
     @Override
     public Variable emitCall(RuntimeCallTarget callTarget, CallingConvention cc, DeoptimizingNode info, Value... args) {
         Stub stub = runtime().asStub(method);
@@ -204,8 +214,7 @@
                     StackSlot spillSlot = frameMap.allocateSpillSlot(kind);
                     savedRegisterLocations[i] = spillSlot;
                 }
-                save = new AMD64SaveRegistersOp(savedRegisters, savedRegisterLocations);
-                append(save);
+                save = emitSaveRegisters(savedRegisters, savedRegisterLocations);
             }
             append(new AMD64HotSpotCRuntimeCallPrologueOp());
         }
@@ -218,7 +227,7 @@
                 assert !calleeSaveInfo.containsKey(currentRuntimeCallInfo);
                 calleeSaveInfo.put(currentRuntimeCallInfo, save);
 
-                append(new AMD64RestoreRegistersOp(savedRegisterLocations.clone(), save));
+                emitRestoreRegisters(save);
             } else {
                 assert zapRegisters();
             }
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java	Thu May 02 14:12:10 2013 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java	Thu May 02 14:13:54 2013 +0200
@@ -33,7 +33,7 @@
  * Restores registers from stack slots.
  */
 @Opcode("RESTORE_REGISTER")
-public final class AMD64RestoreRegistersOp extends AMD64LIRInstruction {
+public class AMD64RestoreRegistersOp extends AMD64LIRInstruction {
 
     /**
      * The slots from which the registers are restored.
@@ -50,14 +50,21 @@
         this.save = save;
     }
 
+    protected Register[] getSavedRegisters() {
+        return save.savedRegisters;
+    }
+
+    protected void restoreRegister(TargetMethodAssembler tasm, AMD64MacroAssembler masm, Register register, StackSlot input) {
+        RegisterValue result = register.asValue(input.getKind());
+        AMD64Move.move(tasm, masm, result, input);
+    }
+
     @Override
     public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) {
-        Register[] savedRegisters = save.savedRegisters;
+        Register[] savedRegisters = getSavedRegisters();
         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);
+                restoreRegister(tasm, masm, savedRegisters[i], slots[i]);
             }
         }
     }
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java	Thu May 02 14:12:10 2013 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java	Thu May 02 14:13:54 2013 +0200
@@ -36,7 +36,7 @@
  * Saves registers to stack slots.
  */
 @Opcode("SAVE_REGISTER")
-public final class AMD64SaveRegistersOp extends AMD64RegistersPreservationOp {
+public class AMD64SaveRegistersOp extends AMD64RegistersPreservationOp {
 
     /**
      * The registers (potentially) saved by this operation.
@@ -53,19 +53,24 @@
         this.slots = slots;
     }
 
+    protected void saveRegister(TargetMethodAssembler tasm, AMD64MacroAssembler masm, StackSlot result, Register register) {
+        RegisterValue input = register.asValue(result.getKind());
+        AMD64Move.move(tasm, masm, result, input);
+    }
+
     @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;
+                saveRegister(tasm, masm, slots[i], savedRegisters[i]);
             }
         }
     }
 
+    public StackSlot[] getSlots() {
+        return slots;
+    }
+
     /**
      * Prunes the set of registers saved by this operation to exclude those in {@code ignored} and
      * updates {@code debugInfo} with a {@linkplain DebugInfo#getCalleeSaveInfo() description} of