1 /* |
1 /* |
2 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
22 */ |
22 */ |
23 |
23 |
24 |
24 |
25 package org.graalvm.compiler.hotspot.amd64; |
25 package org.graalvm.compiler.hotspot.amd64; |
26 |
26 |
27 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; |
|
28 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; |
|
29 import static jdk.vm.ci.amd64.AMD64.rbp; |
27 import static jdk.vm.ci.amd64.AMD64.rbp; |
30 import static jdk.vm.ci.code.ValueUtil.asRegister; |
28 import static jdk.vm.ci.code.ValueUtil.asRegister; |
31 import static jdk.vm.ci.code.ValueUtil.isStackSlot; |
29 import static jdk.vm.ci.code.ValueUtil.isStackSlot; |
|
30 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; |
|
31 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; |
|
32 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; |
32 |
33 |
33 import org.graalvm.compiler.asm.amd64.AMD64Address; |
34 import org.graalvm.compiler.asm.amd64.AMD64Address; |
34 import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler; |
35 import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler; |
35 import org.graalvm.compiler.lir.LIRInstructionClass; |
36 import org.graalvm.compiler.lir.LIRInstructionClass; |
|
37 import org.graalvm.compiler.lir.amd64.AMD64FrameMap; |
36 import org.graalvm.compiler.lir.amd64.AMD64LIRInstruction; |
38 import org.graalvm.compiler.lir.amd64.AMD64LIRInstruction; |
37 import org.graalvm.compiler.lir.asm.CompilationResultBuilder; |
39 import org.graalvm.compiler.lir.asm.CompilationResultBuilder; |
38 |
40 |
39 import jdk.vm.ci.code.Register; |
41 import jdk.vm.ci.code.Register; |
40 import jdk.vm.ci.meta.AllocatableValue; |
42 import jdk.vm.ci.meta.AllocatableValue; |
|
43 import jdk.vm.ci.meta.Value; |
41 |
44 |
42 /** |
45 /** |
43 * Superclass for operations that use the value of RBP saved in a method's prologue. |
46 * Superclass for operations that use the value of RBP saved in a method's prologue. |
44 */ |
47 */ |
45 abstract class AMD64HotSpotEpilogueOp extends AMD64LIRInstruction implements AMD64HotSpotRestoreRbpOp { |
48 abstract class AMD64HotSpotEpilogueOp extends AMD64LIRInstruction implements AMD64HotSpotRestoreRbpOp { |
46 |
49 |
47 protected AMD64HotSpotEpilogueOp(LIRInstructionClass<? extends AMD64HotSpotEpilogueOp> c) { |
50 protected AMD64HotSpotEpilogueOp(LIRInstructionClass<? extends AMD64HotSpotEpilogueOp> c) { |
48 super(c); |
51 super(c); |
49 } |
52 } |
50 |
53 |
51 @Use({REG, STACK}) private AllocatableValue savedRbp = PLACEHOLDER; |
54 @Use({REG, STACK, ILLEGAL}) private AllocatableValue savedRbp = Value.ILLEGAL; |
52 |
55 |
53 protected void leaveFrameAndRestoreRbp(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
56 protected void leaveFrameAndRestoreRbp(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
54 leaveFrameAndRestoreRbp(savedRbp, crb, masm); |
57 leaveFrameAndRestoreRbp(savedRbp, crb, masm); |
55 } |
58 } |
56 |
59 |
57 static void leaveFrameAndRestoreRbp(AllocatableValue savedRbp, CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
60 static void leaveFrameAndRestoreRbp(AllocatableValue savedRbp, CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
58 if (isStackSlot(savedRbp)) { |
61 if (Value.ILLEGAL.equals(savedRbp)) { |
|
62 // RBP will be restored in FrameContext.leave(..). Nothing to do here. |
|
63 assert ((AMD64FrameMap) crb.frameMap).useStandardFrameProlog() : "savedRbp is not initialized."; |
|
64 } else if (isStackSlot(savedRbp)) { |
59 // Restoring RBP from the stack must be done before the frame is removed |
65 // Restoring RBP from the stack must be done before the frame is removed |
60 masm.movq(rbp, (AMD64Address) crb.asAddress(savedRbp)); |
66 masm.movq(rbp, (AMD64Address) crb.asAddress(savedRbp)); |
61 } else { |
67 } else { |
62 Register framePointer = asRegister(savedRbp); |
68 Register framePointer = asRegister(savedRbp); |
63 if (!framePointer.equals(rbp)) { |
69 if (!framePointer.equals(rbp)) { |