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 } |