# HG changeset patch # User Doug Simon # Date 1367698703 -7200 # Node ID 08d1414ac62d45851ef00be03fe8597b99556e52 # Parent b4e7de9a13b1f8ba5615a5b5299dcdc8f5adb86b refactored common code in subclasses into AMD64HotSpotEpilogueOp diff -r b4e7de9a13b1 -r 08d1414ac62d graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java Sat May 04 22:15:45 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java Sat May 04 22:18:23 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.hotspot.amd64; -import static com.oracle.graal.amd64.AMD64.*; -import static com.oracle.graal.api.code.ValueUtil.*; import static com.oracle.graal.hotspot.HotSpotBackend.*; import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; @@ -51,18 +49,8 @@ @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - if (isStackSlot(savedRbp)) { - // Restoring RBP from the stack must be done before the frame is removed - masm.movq(rbp, (AMD64Address) tasm.asAddress(savedRbp)); - } else { - Register framePointer = asRegister(savedRbp); - if (framePointer != rbp) { - masm.movq(rbp, framePointer); - } - } - if (tasm.frameContext != null) { - tasm.frameContext.leave(tasm); - } + leaveFrameAndRestoreRbp(tasm, masm); + HotSpotGraalRuntime runtime = graalRuntime(); Register thread = runtime.getRuntime().threadRegister(); masm.movl(new AMD64Address(thread, runtime.getConfig().pendingDeoptimizationOffset), tasm.runtime.encodeDeoptActionAndReason(action, reason)); diff -r b4e7de9a13b1 -r 08d1414ac62d graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java Sat May 04 22:15:45 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java Sat May 04 22:18:23 2013 +0200 @@ -22,11 +22,16 @@ */ package com.oracle.graal.hotspot.amd64; +import static com.oracle.graal.amd64.AMD64.*; +import static com.oracle.graal.api.code.ValueUtil.*; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.asm.amd64.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.amd64.*; +import com.oracle.graal.lir.asm.*; /** * Superclass for operations that use the value of RBP saved in a method's prologue. @@ -41,4 +46,19 @@ private static final Variable PLACEHOLDER = new Variable(Kind.Long, Integer.MAX_VALUE); @Use({REG, STACK}) protected AllocatableValue savedRbp = PLACEHOLDER; + + protected void leaveFrameAndRestoreRbp(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { + if (isStackSlot(savedRbp)) { + // Restoring RBP from the stack must be done before the frame is removed + masm.movq(rbp, (AMD64Address) tasm.asAddress(savedRbp)); + } else { + Register framePointer = asRegister(savedRbp); + if (framePointer != rbp) { + masm.movq(rbp, framePointer); + } + } + if (tasm.frameContext != null) { + tasm.frameContext.leave(tasm); + } + } } diff -r b4e7de9a13b1 -r 08d1414ac62d 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 Sat May 04 22:15:45 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Sat May 04 22:18:23 2013 +0200 @@ -115,6 +115,14 @@ */ List epilogueOps = new ArrayList<>(2); + @Override + public void append(LIRInstruction op) { + super.append(op); + if (op instanceof AMD64HotSpotEpilogueOp) { + epilogueOps.add((AMD64HotSpotEpilogueOp) op); + } + } + @SuppressWarnings("hiding") @Override protected DebugInfoBuilder createDebugInfoBuilder(NodeMap nodeOperands) { @@ -161,9 +169,7 @@ @Override protected void emitReturn(Value input) { - AMD64HotSpotReturnOp op = new AMD64HotSpotReturnOp(input); - epilogueOps.add(op); - append(op); + append(new AMD64HotSpotReturnOp(input)); } @Override @@ -347,16 +353,12 @@ @Override public void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason) { - AMD64HotSpotDeoptimizeCallerOp op = new AMD64HotSpotDeoptimizeCallerOp(action, reason); - epilogueOps.add(op); - append(op); + append(new AMD64HotSpotDeoptimizeCallerOp(action, reason)); } @Override public void emitPatchReturnAddress(ValueNode address) { - load(operand(address)); - AMD64HotSpotPatchReturnAddressOp op = new AMD64HotSpotPatchReturnAddressOp(load(operand(address))); - append(op); + append(new AMD64HotSpotPatchReturnAddressOp(load(operand(address)))); } @Override diff -r b4e7de9a13b1 -r 08d1414ac62d graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java Sat May 04 22:15:45 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java Sat May 04 22:18:23 2013 +0200 @@ -22,11 +22,8 @@ */ package com.oracle.graal.hotspot.amd64; -import static com.oracle.graal.amd64.AMD64.*; -import static com.oracle.graal.api.code.ValueUtil.*; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.amd64.*; import com.oracle.graal.lir.LIRInstruction.Opcode; @@ -46,18 +43,7 @@ @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - if (isStackSlot(savedRbp)) { - // Restoring RBP from the stack must be done before the frame is removed - masm.movq(rbp, (AMD64Address) tasm.asAddress(savedRbp)); - } else { - Register framePointer = asRegister(savedRbp); - if (framePointer != rbp) { - masm.movq(rbp, framePointer); - } - } - if (tasm.frameContext != null) { - tasm.frameContext.leave(tasm); - } + leaveFrameAndRestoreRbp(tasm, masm); masm.ret(0); } }