src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoweringProvider.java
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 54724 62f373a53296
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    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.core.common.GraalOptions.GeneratePIC;
       
    28 import static org.graalvm.compiler.hotspot.HotSpotBackend.Options.GraalArithmeticStubs;
    27 import static org.graalvm.compiler.hotspot.HotSpotBackend.Options.GraalArithmeticStubs;
    29 
    28 
    30 import org.graalvm.compiler.api.replacements.Snippet;
    29 import org.graalvm.compiler.api.replacements.Snippet;
       
    30 import org.graalvm.compiler.core.amd64.AMD64LoweringProviderMixin;
    31 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
    31 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
    32 import org.graalvm.compiler.debug.DebugHandlersFactory;
    32 import org.graalvm.compiler.debug.DebugHandlersFactory;
    33 import org.graalvm.compiler.graph.Node;
    33 import org.graalvm.compiler.graph.Node;
    34 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
    34 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
    35 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
    35 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
    41 import org.graalvm.compiler.nodes.StructuredGraph;
    41 import org.graalvm.compiler.nodes.StructuredGraph;
    42 import org.graalvm.compiler.nodes.calc.FloatConvertNode;
    42 import org.graalvm.compiler.nodes.calc.FloatConvertNode;
    43 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
    43 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
    44 import org.graalvm.compiler.nodes.spi.LoweringTool;
    44 import org.graalvm.compiler.nodes.spi.LoweringTool;
    45 import org.graalvm.compiler.options.OptionValues;
    45 import org.graalvm.compiler.options.OptionValues;
       
    46 import org.graalvm.compiler.replacements.amd64.AMD64ArrayIndexOfDispatchNode;
    46 import org.graalvm.compiler.replacements.amd64.AMD64ConvertSnippets;
    47 import org.graalvm.compiler.replacements.amd64.AMD64ConvertSnippets;
    47 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode;
    48 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode;
    48 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation;
    49 import org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation;
    49 import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
    50 import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
    50 
    51 
    51 import jdk.vm.ci.code.TargetDescription;
    52 import jdk.vm.ci.code.TargetDescription;
    52 import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
    53 import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
    53 import jdk.vm.ci.meta.MetaAccessProvider;
    54 import jdk.vm.ci.meta.MetaAccessProvider;
    54 import jdk.vm.ci.meta.ResolvedJavaMethod;
    55 import jdk.vm.ci.meta.ResolvedJavaMethod;
    55 
    56 
    56 public class AMD64HotSpotLoweringProvider extends DefaultHotSpotLoweringProvider {
    57 public class AMD64HotSpotLoweringProvider extends DefaultHotSpotLoweringProvider implements AMD64LoweringProviderMixin {
    57 
    58 
    58     private AMD64ConvertSnippets.Templates convertSnippets;
    59     private AMD64ConvertSnippets.Templates convertSnippets;
    59     private ProbabilisticProfileSnippets.Templates profileSnippets;
    60     private ProbabilisticProfileSnippets.Templates profileSnippets;
    60     private AMD64X87MathSnippets.Templates mathSnippets;
    61     private AMD64X87MathSnippets.Templates mathSnippets;
    61 
    62 
    65     }
    66     }
    66 
    67 
    67     @Override
    68     @Override
    68     public void initialize(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, GraalHotSpotVMConfig config) {
    69     public void initialize(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, GraalHotSpotVMConfig config) {
    69         convertSnippets = new AMD64ConvertSnippets.Templates(options, factories, providers, providers.getSnippetReflection(), providers.getCodeCache().getTarget());
    70         convertSnippets = new AMD64ConvertSnippets.Templates(options, factories, providers, providers.getSnippetReflection(), providers.getCodeCache().getTarget());
    70         profileSnippets = ProfileNode.Options.ProbabilisticProfiling.getValue(options) && !JavaVersionUtil.Java8OrEarlier && GeneratePIC.getValue(options)
    71         if (JavaVersionUtil.JAVA_SPEC <= 8) {
    71                         ? new ProbabilisticProfileSnippets.Templates(options, factories, providers, providers.getCodeCache().getTarget())
    72             // AOT only introduced in JDK 9
    72                         : null;
    73             profileSnippets = null;
       
    74         } else {
       
    75             profileSnippets = new ProbabilisticProfileSnippets.Templates(options, factories, providers, providers.getCodeCache().getTarget());
       
    76         }
    73         mathSnippets = new AMD64X87MathSnippets.Templates(options, factories, providers, providers.getSnippetReflection(), providers.getCodeCache().getTarget());
    77         mathSnippets = new AMD64X87MathSnippets.Templates(options, factories, providers, providers.getSnippetReflection(), providers.getCodeCache().getTarget());
    74         super.initialize(options, factories, providers, config);
    78         super.initialize(options, factories, providers, config);
    75     }
    79     }
    76 
    80 
    77     @Override
    81     @Override
    80             convertSnippets.lower((FloatConvertNode) n, tool);
    84             convertSnippets.lower((FloatConvertNode) n, tool);
    81         } else if (profileSnippets != null && n instanceof ProfileNode) {
    85         } else if (profileSnippets != null && n instanceof ProfileNode) {
    82             profileSnippets.lower((ProfileNode) n, tool);
    86             profileSnippets.lower((ProfileNode) n, tool);
    83         } else if (n instanceof UnaryMathIntrinsicNode) {
    87         } else if (n instanceof UnaryMathIntrinsicNode) {
    84             lowerUnaryMath((UnaryMathIntrinsicNode) n, tool);
    88             lowerUnaryMath((UnaryMathIntrinsicNode) n, tool);
       
    89         } else if (n instanceof AMD64ArrayIndexOfDispatchNode) {
       
    90             lowerArrayIndexOf((AMD64ArrayIndexOfDispatchNode) n);
    85         } else {
    91         } else {
    86             super.lower(n, tool);
    92             super.lower(n, tool);
    87         }
    93         }
    88     }
    94     }
    89 
    95 
   123         ForeignCallNode call = graph.add(new ForeignCallNode(foreignCalls, math.getOperation().foreignCallDescriptor, math.getValue()));
   129         ForeignCallNode call = graph.add(new ForeignCallNode(foreignCalls, math.getOperation().foreignCallDescriptor, math.getValue()));
   124         graph.addAfterFixed(tool.lastFixedNode(), call);
   130         graph.addAfterFixed(tool.lastFixedNode(), call);
   125         math.replaceAtUsages(call);
   131         math.replaceAtUsages(call);
   126     }
   132     }
   127 
   133 
   128     @Override
   134     private void lowerArrayIndexOf(AMD64ArrayIndexOfDispatchNode dispatchNode) {
   129     public Integer smallestCompareWidth() {
   135         StructuredGraph graph = dispatchNode.graph();
   130         return 8;
   136         ForeignCallNode call = graph.add(new ForeignCallNode(foreignCalls, dispatchNode.getStubCallDescriptor(), dispatchNode.getStubCallArgs()));
   131     }
   137         graph.replaceFixed(dispatchNode, call);
   132 
       
   133     @Override
       
   134     public boolean supportBulkZeroing() {
       
   135         return true;
       
   136     }
   138     }
   137 }
   139 }