src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueOp.java
changeset 59095 03fbcd06b4c0
parent 52910 583fd71c47d6
equal deleted inserted replaced
59094:5d4c3724e4c7 59095:03fbcd06b4c0
     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)) {