# HG changeset patch # User Roland Schatz # Date 1367496834 -7200 # Node ID 3df71c132731fac3b92a4f5a2fb4fd2824ad864e # Parent 6703dca691d71ee2d8e7d3b16a91cf070d6d82a0 Make register saving extensible. diff -r 6703dca691d7 -r 3df71c132731 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- 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(); } diff -r 6703dca691d7 -r 3df71c132731 graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java --- 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]); } } } diff -r 6703dca691d7 -r 3df71c132731 graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java --- 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