# HG changeset patch # User Roland Schatz # Date 1367342708 -7200 # Node ID 45a73cd19baab68d467d877a73b197fe155cb01b # Parent 6680389bd36f5a1e1bb90c581001e13a4d575a00 Use the correct move instruction for register saving and restoring. diff -r 6680389bd36f -r 45a73cd19baa 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 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]; diff -r 6680389bd36f -r 45a73cd19baa 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 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); } } } diff -r 6680389bd36f -r 45a73cd19baa 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 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 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++; }