# HG changeset patch # User Doug Simon # Date 1367348203 -7200 # Node ID c021bfc839e6bc10c253b5790e6c4e257859cf4f # Parent 75eb896f053a43502b18909efec48e1b1a3505a3# Parent 45a73cd19baab68d467d877a73b197fe155cb01b Merge. diff -r 75eb896f053a -r c021bfc839e6 graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue Apr 30 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue Apr 30 20:56:43 2013 +0200 @@ -87,11 +87,11 @@ private static final RegisterValue RDX_L = AMD64.rdx.asValue(Kind.Long); private static final RegisterValue RCX_I = AMD64.rcx.asValue(Kind.Int); - public static class AMD64SpillMoveFactory implements LIR.SpillMoveFactory { + private class AMD64SpillMoveFactory implements LIR.SpillMoveFactory { @Override public LIRInstruction createMove(AllocatableValue result, Value input) { - return AMD64LIRGenerator.createMove(result, input); + return AMD64LIRGenerator.this.createMove(result, input); } } @@ -143,7 +143,7 @@ return result; } - private static AMD64LIRInstruction createMove(AllocatableValue dst, Value src) { + protected AMD64LIRInstruction createMove(AllocatableValue dst, Value src) { if (src instanceof AMD64AddressValue) { return new LeaOp(dst, (AMD64AddressValue) src); } else if (isRegister(src) || isStackSlot(dst)) { diff -r 75eb896f053a -r c021bfc839e6 graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXBackend.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXBackend.java Tue Apr 30 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXBackend.java Tue Apr 30 20:56:43 2013 +0200 @@ -59,6 +59,11 @@ } @Override + protected AbstractAssembler createAssembler(FrameMap frameMap) { + return new PTXAssembler(target, frameMap.registerConfig); + } + + @Override public TargetMethodAssembler newAssembler(LIRGenerator lirGen, CompilationResult compilationResult) { // Omit the frame if the method: // - has no spill slots or other slots allocated during register allocation @@ -66,7 +71,7 @@ // - has no incoming arguments passed on the stack // - has no instructions with debug info FrameMap frameMap = lirGen.frameMap; - AbstractAssembler masm = new PTXAssembler(target, frameMap.registerConfig); + AbstractAssembler masm = createAssembler(frameMap); HotSpotFrameContext frameContext = new HotSpotFrameContext(); TargetMethodAssembler tasm = new PTXTargetMethodAssembler(target, runtime(), frameMap, masm, frameContext, compilationResult); tasm.setFrameSize(frameMap.frameSize()); diff -r 75eb896f053a -r c021bfc839e6 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Tue Apr 30 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Tue Apr 30 20:56:43 2013 +0200 @@ -24,6 +24,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.asm.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; @@ -52,6 +53,8 @@ public abstract LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, LIR lir); + protected abstract AbstractAssembler createAssembler(FrameMap frameMap); + public abstract TargetMethodAssembler newAssembler(LIRGenerator lirGen, CompilationResult compilationResult); /** diff -r 75eb896f053a -r c021bfc839e6 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Tue Apr 30 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Tue Apr 30 20:56:43 2013 +0200 @@ -144,6 +144,11 @@ } @Override + protected AbstractAssembler createAssembler(FrameMap frameMap) { + return new AMD64MacroAssembler(target, frameMap.registerConfig); + } + + @Override public TargetMethodAssembler newAssembler(LIRGenerator lirGen, CompilationResult compilationResult) { // Omit the frame if the method: // - has no spill slots or other slots allocated during register allocation @@ -156,7 +161,7 @@ boolean omitFrame = CanOmitFrame && !frameMap.frameNeedsAllocating() && !lir.hasArgInCallerFrame(); Stub stub = runtime().asStub(lirGen.method()); - AbstractAssembler masm = new AMD64MacroAssembler(target, frameMap.registerConfig); + AbstractAssembler masm = createAssembler(frameMap); HotSpotFrameContext frameContext = omitFrame ? null : new HotSpotFrameContext(stub != null); TargetMethodAssembler tasm = new TargetMethodAssembler(target, runtime(), frameMap, masm, frameContext, compilationResult); tasm.setFrameSize(frameMap.frameSize()); diff -r 75eb896f053a -r c021bfc839e6 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 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Apr 30 20:56:43 2013 +0200 @@ -54,13 +54,13 @@ /** * LIR generator specialized for AMD64 HotSpot. */ -final class AMD64HotSpotLIRGenerator extends AMD64LIRGenerator implements HotSpotLIRGenerator { +public class AMD64HotSpotLIRGenerator extends AMD64LIRGenerator implements HotSpotLIRGenerator { private HotSpotRuntime runtime() { return (HotSpotRuntime) runtime; } - AMD64HotSpotLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { + protected AMD64HotSpotLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { super(graph, runtime, target, frameMap, method, lir); } @@ -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 75eb896f053a -r c021bfc839e6 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Tue Apr 30 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Tue Apr 30 20:56:43 2013 +0200 @@ -24,6 +24,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.asm.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.sparc.*; import com.oracle.graal.hotspot.*; @@ -47,6 +48,12 @@ } @Override + protected AbstractAssembler createAssembler(FrameMap frameMap) { + // SPARC: Create assembler. + return null; + } + + @Override public TargetMethodAssembler newAssembler(LIRGenerator lirGen, CompilationResult compilationResult) { // SPARC: Create assembler. return null; diff -r 75eb896f053a -r c021bfc839e6 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 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64RestoreRegistersOp.java Tue Apr 30 20:56:43 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 75eb896f053a -r c021bfc839e6 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 20:50:30 2013 +0200 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64SaveRegistersOp.java Tue Apr 30 20:56:43 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++; }