# HG changeset patch # User Thomas Wuerthinger # Date 1361233506 28800 # Node ID 932a4556870680c474089a8d2a4bf287b50bdebc # Parent 58636dc5bf37ccf0fbe17b47d3735c697eb598c8 Move stack banging code to the AMD64-specific code. diff -r 58636dc5bf37 -r 932a45568706 graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java --- a/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Feb 18 16:09:29 2013 -0800 +++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Feb 18 16:25:06 2013 -0800 @@ -3071,9 +3071,4 @@ public void fstp(int i) { emitx87(0xDD, 0xD8, i); } - - @Override - public void bangStack(int disp) { - movq(new Address(target.wordKind, AMD64.RSP, -disp), AMD64.rax); - } } diff -r 58636dc5bf37 -r 932a45568706 graal/com.oracle.graal.asm.ptx/src/com/oracle/graal/asm/ptx/AbstractPTXAssembler.java --- a/graal/com.oracle.graal.asm.ptx/src/com/oracle/graal/asm/ptx/AbstractPTXAssembler.java Mon Feb 18 16:09:29 2013 -0800 +++ b/graal/com.oracle.graal.asm.ptx/src/com/oracle/graal/asm/ptx/AbstractPTXAssembler.java Mon Feb 18 16:25:06 2013 -0800 @@ -60,9 +60,4 @@ codeBuffer.emitString(targetString, branch + offset); } - @Override - public void bangStack(int disp) { - // TODO Auto-generated method stub - } - } diff -r 58636dc5bf37 -r 932a45568706 graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java --- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Mon Feb 18 16:09:29 2013 -0800 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Mon Feb 18 16:25:06 2013 -0800 @@ -52,9 +52,4 @@ protected void patchJumpTarget(int branch, int jumpTarget) { // SPARC: Implement patching of jump target. } - - @Override - public void bangStack(int disp) { - // SPARC: Implement stack banging. - } } diff -r 58636dc5bf37 -r 932a45568706 graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java --- a/graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java Mon Feb 18 16:09:29 2013 -0800 +++ b/graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java Mon Feb 18 16:25:06 2013 -0800 @@ -56,14 +56,6 @@ protected abstract void patchJumpTarget(int branch, int jumpTarget); - /** - * Emits instruction(s) that access an address specified by a given displacement from the stack - * pointer in the direction that the stack grows (which is down on most architectures). - * - * @param disp the displacement from the stack pointer at which the stack should be accessed - */ - public abstract void bangStack(int disp); - protected final void emitByte(int x) { codeBuffer.emitByte(x); } diff -r 58636dc5bf37 -r 932a45568706 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 Mon Feb 18 16:09:29 2013 -0800 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Mon Feb 18 16:25:06 2013 -0800 @@ -28,7 +28,6 @@ import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.phases.*; /** * The {@code Backend} class represents a compiler backend for Graal. @@ -56,30 +55,6 @@ public abstract TargetMethodAssembler newAssembler(FrameMap frameMap, LIR lir); /** - * Emits code to do stack overflow checking. - * - * @param afterFrameInit specifies if the stack pointer has already been adjusted to allocate - * the current frame - */ - protected static void emitStackOverflowCheck(TargetMethodAssembler tasm, boolean afterFrameInit) { - if (GraalOptions.StackShadowPages > 0) { - int frameSize = tasm.frameMap.frameSize(); - if (frameSize > 0) { - int lastFramePage = frameSize / tasm.target.pageSize; - // emit multiple stack bangs for methods with frames larger than a page - for (int i = 0; i <= lastFramePage; i++) { - int disp = (i + GraalOptions.StackShadowPages) * tasm.target.pageSize; - if (afterFrameInit) { - disp -= frameSize; - } - tasm.blockComment("[stack overflow check]"); - tasm.asm.bangStack(disp); - } - } - } - } - - /** * Emits the code for a given method. This includes any architecture/runtime specific * prefix/suffix. A prefix typically contains the code for setting up the frame, spilling * callee-save registers, stack overflow checking, handling multiple entry points etc. A suffix diff -r 58636dc5bf37 -r 932a45568706 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 Mon Feb 18 16:09:29 2013 -0800 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Mon Feb 18 16:25:06 2013 -0800 @@ -162,6 +162,32 @@ } } + /** + * Emits code to do stack overflow checking. + * + * @param afterFrameInit specifies if the stack pointer has already been adjusted to allocate + * the current frame + */ + protected static void emitStackOverflowCheck(TargetMethodAssembler tasm, boolean afterFrameInit) { + if (GraalOptions.StackShadowPages > 0) { + + AMD64MacroAssembler asm = (AMD64MacroAssembler) tasm.asm; + int frameSize = tasm.frameMap.frameSize(); + if (frameSize > 0) { + int lastFramePage = frameSize / tasm.target.pageSize; + // emit multiple stack bangs for methods with frames larger than a page + for (int i = 0; i <= lastFramePage; i++) { + int disp = (i + GraalOptions.StackShadowPages) * tasm.target.pageSize; + if (afterFrameInit) { + disp -= frameSize; + } + tasm.blockComment("[stack overflow check]"); + asm.movq(new Address(asm.target.wordKind, AMD64.RSP, -disp), AMD64.rax); + } + } + } + } + class HotSpotFrameContext implements FrameContext { @Override