Mercurial > hg > graal-compiler
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++; }