src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java

Print this page




   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
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.hotspot.amd64;
  24 
  25 import static org.graalvm.compiler.core.common.GraalOptions.CanOmitFrame;
  26 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
  27 import static org.graalvm.compiler.core.common.GraalOptions.ZapStackOnMethodEntry;
  28 import static jdk.vm.ci.amd64.AMD64.r10;
  29 import static jdk.vm.ci.amd64.AMD64.rax;
  30 import static jdk.vm.ci.amd64.AMD64.rsp;
  31 import static jdk.vm.ci.code.ValueUtil.asRegister;



  32 
  33 import org.graalvm.compiler.asm.Assembler;
  34 import org.graalvm.compiler.asm.Label;
  35 import org.graalvm.compiler.asm.amd64.AMD64Address;
  36 import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
  37 import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
  38 import org.graalvm.compiler.code.CompilationResult;
  39 import org.graalvm.compiler.core.amd64.AMD64NodeMatchRules;
  40 import org.graalvm.compiler.core.common.LIRKind;
  41 import org.graalvm.compiler.core.common.CompilationIdentifier;

  42 import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig;
  43 import org.graalvm.compiler.core.target.Backend;

  44 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  45 import org.graalvm.compiler.hotspot.HotSpotDataBuilder;
  46 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
  47 import org.graalvm.compiler.hotspot.HotSpotHostBackend;
  48 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
  49 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
  50 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
  51 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  52 import org.graalvm.compiler.hotspot.stubs.Stub;
  53 import org.graalvm.compiler.lir.LIR;
  54 import org.graalvm.compiler.lir.amd64.AMD64Call;
  55 import org.graalvm.compiler.lir.amd64.AMD64FrameMap;
  56 import org.graalvm.compiler.lir.amd64.AMD64FrameMapBuilder;
  57 import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
  58 import org.graalvm.compiler.lir.asm.CompilationResultBuilderFactory;
  59 import org.graalvm.compiler.lir.asm.DataBuilder;
  60 import org.graalvm.compiler.lir.asm.FrameContext;
  61 import org.graalvm.compiler.lir.framemap.FrameMap;
  62 import org.graalvm.compiler.lir.framemap.FrameMapBuilder;
  63 import org.graalvm.compiler.lir.gen.LIRGenerationResult;


 192         }
 193     }
 194 
 195     @Override
 196     protected Assembler createAssembler(FrameMap frameMap) {
 197         return new AMD64MacroAssembler(getTarget());
 198     }
 199 
 200     @Override
 201     public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRen, FrameMap frameMap, CompilationResult compilationResult, CompilationResultBuilderFactory factory) {
 202         // Omit the frame if the method:
 203         // - has no spill slots or other slots allocated during register allocation
 204         // - has no callee-saved registers
 205         // - has no incoming arguments passed on the stack
 206         // - has no deoptimization points
 207         // - makes no foreign calls (which require an aligned stack)
 208         HotSpotLIRGenerationResult gen = (HotSpotLIRGenerationResult) lirGenRen;
 209         LIR lir = gen.getLIR();
 210         assert gen.getDeoptimizationRescueSlot() == null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame";
 211         OptionValues options = lir.getOptions();

 212         boolean omitFrame = CanOmitFrame.getValue(options) && !frameMap.frameNeedsAllocating() && !lir.hasArgInCallerFrame() && !gen.hasForeignCall();
 213 
 214         Stub stub = gen.getStub();
 215         Assembler masm = createAssembler(frameMap);
 216         HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame);
 217         DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget());
 218         CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, compilationResult);
 219         crb.setTotalFrameSize(frameMap.totalFrameSize());
 220         crb.setMaxInterpreterFrameSize(gen.getMaxInterpreterFrameSize());
 221         StackSlot deoptimizationRescueSlot = gen.getDeoptimizationRescueSlot();
 222         if (deoptimizationRescueSlot != null && stub == null) {
 223             crb.compilationResult.setCustomStackAreaOffset(deoptimizationRescueSlot);
 224         }
 225 
 226         if (stub != null) {
 227             EconomicSet<Register> destroyedCallerRegisters = gatherDestroyedCallerRegisters(lir);
 228             updateStub(stub, destroyedCallerRegisters, gen.getCalleeSaveInfo(), frameMap);
 229         }
 230 
 231         return crb;
 232     }
 233 
 234     @Override
 235     public void emitCode(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod installedCodeOwner) {
 236         AMD64MacroAssembler asm = (AMD64MacroAssembler) crb.asm;
 237         FrameMap frameMap = crb.frameMap;
 238         RegisterConfig regConfig = frameMap.getRegisterConfig();




   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
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.hotspot.amd64;
  24 



  25 import static jdk.vm.ci.amd64.AMD64.r10;
  26 import static jdk.vm.ci.amd64.AMD64.rax;
  27 import static jdk.vm.ci.amd64.AMD64.rsp;
  28 import static jdk.vm.ci.code.ValueUtil.asRegister;
  29 import static org.graalvm.compiler.core.common.GraalOptions.CanOmitFrame;
  30 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
  31 import static org.graalvm.compiler.core.common.GraalOptions.ZapStackOnMethodEntry;
  32 
  33 import org.graalvm.compiler.asm.Assembler;
  34 import org.graalvm.compiler.asm.Label;
  35 import org.graalvm.compiler.asm.amd64.AMD64Address;
  36 import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
  37 import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
  38 import org.graalvm.compiler.code.CompilationResult;
  39 import org.graalvm.compiler.core.amd64.AMD64NodeMatchRules;

  40 import org.graalvm.compiler.core.common.CompilationIdentifier;
  41 import org.graalvm.compiler.core.common.LIRKind;
  42 import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig;
  43 import org.graalvm.compiler.core.target.Backend;
  44 import org.graalvm.compiler.debug.DebugContext;
  45 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  46 import org.graalvm.compiler.hotspot.HotSpotDataBuilder;
  47 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
  48 import org.graalvm.compiler.hotspot.HotSpotHostBackend;
  49 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
  50 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
  51 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
  52 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  53 import org.graalvm.compiler.hotspot.stubs.Stub;
  54 import org.graalvm.compiler.lir.LIR;
  55 import org.graalvm.compiler.lir.amd64.AMD64Call;
  56 import org.graalvm.compiler.lir.amd64.AMD64FrameMap;
  57 import org.graalvm.compiler.lir.amd64.AMD64FrameMapBuilder;
  58 import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
  59 import org.graalvm.compiler.lir.asm.CompilationResultBuilderFactory;
  60 import org.graalvm.compiler.lir.asm.DataBuilder;
  61 import org.graalvm.compiler.lir.asm.FrameContext;
  62 import org.graalvm.compiler.lir.framemap.FrameMap;
  63 import org.graalvm.compiler.lir.framemap.FrameMapBuilder;
  64 import org.graalvm.compiler.lir.gen.LIRGenerationResult;


 193         }
 194     }
 195 
 196     @Override
 197     protected Assembler createAssembler(FrameMap frameMap) {
 198         return new AMD64MacroAssembler(getTarget());
 199     }
 200 
 201     @Override
 202     public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRen, FrameMap frameMap, CompilationResult compilationResult, CompilationResultBuilderFactory factory) {
 203         // Omit the frame if the method:
 204         // - has no spill slots or other slots allocated during register allocation
 205         // - has no callee-saved registers
 206         // - has no incoming arguments passed on the stack
 207         // - has no deoptimization points
 208         // - makes no foreign calls (which require an aligned stack)
 209         HotSpotLIRGenerationResult gen = (HotSpotLIRGenerationResult) lirGenRen;
 210         LIR lir = gen.getLIR();
 211         assert gen.getDeoptimizationRescueSlot() == null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame";
 212         OptionValues options = lir.getOptions();
 213         DebugContext debug = lir.getDebug();
 214         boolean omitFrame = CanOmitFrame.getValue(options) && !frameMap.frameNeedsAllocating() && !lir.hasArgInCallerFrame() && !gen.hasForeignCall();
 215 
 216         Stub stub = gen.getStub();
 217         Assembler masm = createAssembler(frameMap);
 218         HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame);
 219         DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget());
 220         CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, debug, compilationResult);
 221         crb.setTotalFrameSize(frameMap.totalFrameSize());
 222         crb.setMaxInterpreterFrameSize(gen.getMaxInterpreterFrameSize());
 223         StackSlot deoptimizationRescueSlot = gen.getDeoptimizationRescueSlot();
 224         if (deoptimizationRescueSlot != null && stub == null) {
 225             crb.compilationResult.setCustomStackAreaOffset(deoptimizationRescueSlot);
 226         }
 227 
 228         if (stub != null) {
 229             EconomicSet<Register> destroyedCallerRegisters = gatherDestroyedCallerRegisters(lir);
 230             updateStub(stub, destroyedCallerRegisters, gen.getCalleeSaveInfo(), frameMap);
 231         }
 232 
 233         return crb;
 234     }
 235 
 236     @Override
 237     public void emitCode(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod installedCodeOwner) {
 238         AMD64MacroAssembler asm = (AMD64MacroAssembler) crb.asm;
 239         FrameMap frameMap = crb.frameMap;
 240         RegisterConfig regConfig = frameMap.getRegisterConfig();


src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File