# HG changeset patch # User Josef Eisl # Date 1434716894 -7200 # Node ID e38161633db6f70f121e346834924adff8347193 # Parent 5de4a002d0974c9a20ea040b9f885deb4b6ba3c1 AMD64Move: add AMD64MultiStackMove. diff -r 5de4a002d097 -r e38161633db6 graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java --- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java Sun Jun 21 18:53:42 2015 +0200 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java Fri Jun 19 14:28:14 2015 +0200 @@ -143,6 +143,14 @@ return result; } + public Register getScratchRegister() { + return scratch; + } + + public StackSlotValue getBackupSlot() { + return backupSlot; + } + @Override public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { // backup scratch register @@ -156,6 +164,41 @@ } } + @Opcode("MULTISTACKMOVE") + public static final class AMD64MultiStackMove extends AMD64LIRInstruction { + public static final LIRInstructionClass TYPE = LIRInstructionClass.create(AMD64MultiStackMove.class); + + @Def({STACK}) protected AllocatableValue[] results; + @Use({STACK}) protected Value[] inputs; + @Alive({OperandFlag.STACK, OperandFlag.UNINITIALIZED}) private StackSlotValue backupSlot; + + private Register scratch; + + public AMD64MultiStackMove(AllocatableValue[] results, Value[] inputs, Register scratch, StackSlotValue backupSlot) { + super(TYPE); + this.results = results; + this.inputs = inputs; + this.backupSlot = backupSlot; + this.scratch = scratch; + } + + @Override + public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { + // backup scratch register + move(backupSlot.getKind(), crb, masm, backupSlot, scratch.asValue(backupSlot.getLIRKind())); + for (int i = 0; i < results.length; i++) { + Value input = inputs[i]; + AllocatableValue result = results[i]; + // move stack slot + move(input.getKind(), crb, masm, scratch.asValue(input.getLIRKind()), input); + move(result.getKind(), crb, masm, result, scratch.asValue(result.getLIRKind())); + } + // restore scratch register + move(backupSlot.getKind(), crb, masm, scratch.asValue(backupSlot.getLIRKind()), backupSlot); + + } + } + @Opcode("STACKMOVE") public static final class AMD64PushPopStackMove extends AMD64LIRInstruction implements MoveOp { public static final LIRInstructionClass TYPE = LIRInstructionClass.create(AMD64PushPopStackMove.class);