# HG changeset patch # User Roland Schatz # Date 1367488384 -7200 # Node ID d48b7a4b93e9a45486fbb36f819875953a4aca12 # Parent 789cfd153265a3d928e6c7846a05ff800ec86671 Backed out changeset: 45a73cd19baa diff -r 789cfd153265 -r d48b7a4b93e9 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 06:08:02 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Thu May 02 11:53:04 2013 +0200 @@ -198,19 +198,13 @@ if (stub.preservesRegisters()) { 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(savingMoves, restoringMoves, savedRegisterLocations); + save = new AMD64SaveRegistersOp(savedRegisters, savedRegisterLocations); append(save); } append(new AMD64HotSpotCRuntimeCallPrologueOp()); diff -r 789cfd153265 -r d48b7a4b93e9 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 06:08:02 2013 +0200 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java Thu May 02 11:53:04 2013 +0200 @@ -52,9 +52,12 @@ @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - for (AMD64LIRInstruction restoringMove : save.restoringMoves) { - if (restoringMove != null) { - restoringMove.emitCode(tasm, 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); } } } diff -r 789cfd153265 -r d48b7a4b93e9 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 06:08:02 2013 +0200 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java Thu May 02 11:53:04 2013 +0200 @@ -30,7 +30,6 @@ 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.*; /** @@ -40,31 +39,29 @@ public final class AMD64SaveRegistersOp extends AMD64RegistersPreservationOp { /** - * The move instructions for saving the registers. + * The registers (potentially) saved by this operation. */ - protected final AMD64LIRInstruction[] savingMoves; - - /** - * The move instructions for restoring the registers. - */ - protected final AMD64LIRInstruction[] restoringMoves; + protected final Register[] savedRegisters; /** * The slots to which the registers are saved. */ @Def(STACK) protected final StackSlot[] slots; - public AMD64SaveRegistersOp(AMD64LIRInstruction[] savingMoves, AMD64LIRInstruction[] restoringMoves, StackSlot[] slots) { - this.savingMoves = savingMoves; - this.restoringMoves = restoringMoves; + public AMD64SaveRegistersOp(Register[] savedRegisters, StackSlot[] slots) { + this.savedRegisters = savedRegisters; this.slots = slots; } @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - for (AMD64LIRInstruction savingMove : savingMoves) { - if (savingMove != null) { - savingMove.emitCode(tasm, 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; } } } @@ -77,12 +74,10 @@ @Override public void update(Set ignored, DebugInfo debugInfo, FrameMap frameMap) { int preserved = 0; - for (int i = 0; i < savingMoves.length; i++) { - if (savingMoves[i] != null) { - Register register = ValueUtil.asRegister(((MoveOp) savingMoves[i]).getInput()); - if (ignored.contains(register)) { - savingMoves[i] = null; - restoringMoves[i] = null; + for (int i = 0; i < savedRegisters.length; i++) { + if (savedRegisters[i] != null) { + if (ignored.contains(savedRegisters[i])) { + savedRegisters[i] = null; } else { preserved++; } @@ -92,9 +87,9 @@ Register[] keys = new Register[preserved]; int[] values = new int[keys.length]; int mapIndex = 0; - for (int i = 0; i < savingMoves.length; i++) { - if (savingMoves[i] != null) { - keys[mapIndex] = ValueUtil.asRegister(((MoveOp) savingMoves[i]).getInput()); + for (int i = 0; i < savedRegisters.length; i++) { + if (savedRegisters[i] != null) { + keys[mapIndex] = savedRegisters[i]; values[mapIndex] = frameMap.indexForStackSlot(slots[i]); mapIndex++; }