23 |
23 |
24 |
24 |
25 package org.graalvm.compiler.hotspot.amd64; |
25 package org.graalvm.compiler.hotspot.amd64; |
26 |
26 |
27 import static jdk.vm.ci.common.InitTimer.timer; |
27 import static jdk.vm.ci.common.InitTimer.timer; |
28 import static org.graalvm.compiler.serviceprovider.JavaVersionUtil.JAVA_SPECIFICATION_VERSION; |
|
29 |
28 |
30 import java.util.ArrayList; |
29 import java.util.ArrayList; |
31 import java.util.List; |
30 import java.util.List; |
32 |
31 |
33 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; |
|
34 import org.graalvm.compiler.bytecode.BytecodeProvider; |
32 import org.graalvm.compiler.bytecode.BytecodeProvider; |
35 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider; |
33 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider; |
36 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; |
34 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; |
37 import org.graalvm.compiler.hotspot.HotSpotBackend; |
35 import org.graalvm.compiler.hotspot.HotSpotBackend; |
38 import org.graalvm.compiler.hotspot.HotSpotBackendFactory; |
36 import org.graalvm.compiler.hotspot.HotSpotBackendFactory; |
39 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; |
37 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; |
40 import org.graalvm.compiler.hotspot.HotSpotReplacementsImpl; |
38 import org.graalvm.compiler.hotspot.HotSpotReplacementsImpl; |
41 import org.graalvm.compiler.hotspot.meta.AddressLoweringHotSpotSuitesProvider; |
39 import org.graalvm.compiler.hotspot.meta.AddressLoweringHotSpotSuitesProvider; |
42 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider; |
40 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider; |
|
41 import org.graalvm.compiler.hotspot.meta.HotSpotGCProvider; |
43 import org.graalvm.compiler.hotspot.meta.HotSpotGraalConstantFieldProvider; |
42 import org.graalvm.compiler.hotspot.meta.HotSpotGraalConstantFieldProvider; |
44 import org.graalvm.compiler.hotspot.meta.HotSpotGraphBuilderPlugins; |
43 import org.graalvm.compiler.hotspot.meta.HotSpotGraphBuilderPlugins; |
45 import org.graalvm.compiler.hotspot.meta.HotSpotHostForeignCallsProvider; |
44 import org.graalvm.compiler.hotspot.meta.HotSpotHostForeignCallsProvider; |
46 import org.graalvm.compiler.hotspot.meta.HotSpotLoweringProvider; |
45 import org.graalvm.compiler.hotspot.meta.HotSpotLoweringProvider; |
47 import org.graalvm.compiler.hotspot.meta.HotSpotProviders; |
46 import org.graalvm.compiler.hotspot.meta.HotSpotProviders; |
118 } |
119 } |
119 try (InitTimer rt = timer("create NativeABICallerSaveRegisters")) { |
120 try (InitTimer rt = timer("create NativeABICallerSaveRegisters")) { |
120 nativeABICallerSaveRegisters = createNativeABICallerSaveRegisters(config, codeCache.getRegisterConfig()); |
121 nativeABICallerSaveRegisters = createNativeABICallerSaveRegisters(config, codeCache.getRegisterConfig()); |
121 } |
122 } |
122 try (InitTimer rt = timer("create WordTypes")) { |
123 try (InitTimer rt = timer("create WordTypes")) { |
123 wordTypes = new HotSpotWordTypes(metaAccess, target.wordJavaKind); |
124 wordTypes = createWordTypes(metaAccess, target); |
124 } |
125 } |
125 try (InitTimer rt = timer("create ForeignCalls provider")) { |
126 try (InitTimer rt = timer("create ForeignCalls provider")) { |
126 foreignCalls = createForeignCalls(jvmciRuntime, graalRuntime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters); |
127 foreignCalls = createForeignCalls(jvmciRuntime, graalRuntime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters); |
127 } |
128 } |
128 try (InitTimer rt = timer("create Lowerer provider")) { |
129 try (InitTimer rt = timer("create Lowerer provider")) { |
129 lowerer = createLowerer(graalRuntime, metaAccess, foreignCalls, registers, constantReflection, target); |
130 lowerer = createLowerer(graalRuntime, metaAccess, foreignCalls, registers, constantReflection, target); |
130 } |
131 } |
131 HotSpotStampProvider stampProvider = new HotSpotStampProvider(); |
132 try (InitTimer rt = timer("create stamp provider")) { |
132 Providers p = new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, null, stampProvider); |
133 stampProvider = createStampProvider(); |
|
134 } |
|
135 try (InitTimer rt = timer("create GC provider")) { |
|
136 gc = createGCProvider(config); |
|
137 } |
|
138 |
|
139 Providers p = new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, null, stampProvider, gc); |
133 |
140 |
134 try (InitTimer rt = timer("create SnippetReflection provider")) { |
141 try (InitTimer rt = timer("create SnippetReflection provider")) { |
135 snippetReflection = createSnippetReflection(graalRuntime, constantReflection, wordTypes); |
142 snippetReflection = createSnippetReflection(graalRuntime, constantReflection, wordTypes); |
136 } |
143 } |
137 try (InitTimer rt = timer("create Bytecode provider")) { |
144 try (InitTimer rt = timer("create Bytecode provider")) { |
138 bytecodeProvider = new ClassfileBytecodeProvider(metaAccess, snippetReflection); |
145 bytecodeProvider = createBytecodeProvider(metaAccess, snippetReflection); |
139 } |
146 } |
140 try (InitTimer rt = timer("create Replacements provider")) { |
147 try (InitTimer rt = timer("create Replacements provider")) { |
141 replacements = createReplacements(p, snippetReflection, bytecodeProvider); |
148 replacements = createReplacements(target, p, snippetReflection, bytecodeProvider); |
142 } |
149 } |
143 try (InitTimer rt = timer("create GraphBuilderPhase plugins")) { |
150 try (InitTimer rt = timer("create GraphBuilderPhase plugins")) { |
144 plugins = createGraphBuilderPlugins(compilerConfiguration, config, target, constantReflection, foreignCalls, metaAccess, snippetReflection, replacements, wordTypes, options); |
151 plugins = createGraphBuilderPlugins(graalRuntime, compilerConfiguration, config, target, constantReflection, foreignCalls, metaAccess, snippetReflection, replacements, wordTypes, |
|
152 options); |
145 replacements.setGraphBuilderPlugins(plugins); |
153 replacements.setGraphBuilderPlugins(plugins); |
146 } |
154 } |
147 try (InitTimer rt = timer("create Suites provider")) { |
155 try (InitTimer rt = timer("create Suites provider")) { |
148 suites = createSuites(config, graalRuntime, compilerConfiguration, plugins, registers, replacements, options); |
156 suites = createSuites(config, graalRuntime, compilerConfiguration, plugins, registers, replacements, options); |
149 } |
157 } |
150 providers = new HotSpotProviders(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, suites, registers, |
158 providers = new HotSpotProviders(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, suites, registers, |
151 snippetReflection, wordTypes, |
159 snippetReflection, wordTypes, plugins, gc); |
152 plugins); |
|
153 replacements.setProviders(providers); |
160 replacements.setProviders(providers); |
154 } |
161 } |
155 try (InitTimer rt = timer("instantiate backend")) { |
162 try (InitTimer rt = timer("instantiate backend")) { |
156 return createBackend(config, graalRuntime, providers); |
163 return createBackend(config, graalRuntime, providers); |
157 } |
164 } |
158 } |
165 } |
159 |
166 |
160 protected Plugins createGraphBuilderPlugins(CompilerConfiguration compilerConfiguration, GraalHotSpotVMConfig config, TargetDescription target, |
167 protected Plugins createGraphBuilderPlugins(HotSpotGraalRuntimeProvider graalRuntime, |
161 HotSpotConstantReflectionProvider constantReflection, HotSpotHostForeignCallsProvider foreignCalls, HotSpotMetaAccessProvider metaAccess, |
168 CompilerConfiguration compilerConfiguration, |
162 HotSpotSnippetReflectionProvider snippetReflection, HotSpotReplacementsImpl replacements, HotSpotWordTypes wordTypes, OptionValues options) { |
169 GraalHotSpotVMConfig config, |
163 Plugins plugins = HotSpotGraphBuilderPlugins.create(compilerConfiguration, config, wordTypes, metaAccess, constantReflection, snippetReflection, foreignCalls, replacements, options); |
170 TargetDescription target, |
164 AMD64GraphBuilderPlugins.register(plugins, replacements.getDefaultReplacementBytecodeProvider(), (AMD64) target.arch, false, JAVA_SPECIFICATION_VERSION >= 9, config.useFMAIntrinsics); |
171 HotSpotConstantReflectionProvider constantReflection, |
|
172 HotSpotHostForeignCallsProvider foreignCalls, |
|
173 HotSpotMetaAccessProvider metaAccess, |
|
174 HotSpotSnippetReflectionProvider snippetReflection, |
|
175 HotSpotReplacementsImpl replacements, |
|
176 HotSpotWordTypes wordTypes, |
|
177 OptionValues options) { |
|
178 Plugins plugins = HotSpotGraphBuilderPlugins.create( |
|
179 graalRuntime, |
|
180 compilerConfiguration, |
|
181 config, |
|
182 wordTypes, |
|
183 metaAccess, |
|
184 constantReflection, |
|
185 snippetReflection, |
|
186 foreignCalls, |
|
187 replacements, |
|
188 options); |
|
189 AMD64GraphBuilderPlugins.register(plugins, replacements.getDefaultReplacementBytecodeProvider(), (AMD64) target.arch, false, JavaVersionUtil.JAVA_SPEC >= 9, config.useFMAIntrinsics); |
165 return plugins; |
190 return plugins; |
166 } |
191 } |
167 |
192 |
168 protected AMD64HotSpotBackend createBackend(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, HotSpotProviders providers) { |
193 protected AMD64HotSpotBackend createBackend(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, HotSpotProviders providers) { |
169 return new AMD64HotSpotBackend(config, runtime, providers); |
194 return new AMD64HotSpotBackend(config, runtime, providers); |
170 } |
195 } |
171 |
196 |
172 protected HotSpotRegistersProvider createRegisters() { |
197 protected HotSpotRegistersProvider createRegisters() { |
173 return new HotSpotRegisters(AMD64.r15, AMD64.r12, AMD64.rsp); |
198 return new HotSpotRegisters(AMD64.r15, AMD64.r12, AMD64.rsp); |
174 } |
|
175 |
|
176 protected HotSpotReplacementsImpl createReplacements(Providers p, SnippetReflectionProvider snippetReflection, BytecodeProvider bytecodeProvider) { |
|
177 return new HotSpotReplacementsImpl(p, snippetReflection, bytecodeProvider, p.getCodeCache().getTarget()); |
|
178 } |
199 } |
179 |
200 |
180 protected AMD64HotSpotForeignCallsProvider createForeignCalls(HotSpotJVMCIRuntime jvmciRuntime, HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, |
201 protected AMD64HotSpotForeignCallsProvider createForeignCalls(HotSpotJVMCIRuntime jvmciRuntime, HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, |
181 HotSpotCodeCacheProvider codeCache, WordTypes wordTypes, Value[] nativeABICallerSaveRegisters) { |
202 HotSpotCodeCacheProvider codeCache, WordTypes wordTypes, Value[] nativeABICallerSaveRegisters) { |
182 return new AMD64HotSpotForeignCallsProvider(jvmciRuntime, runtime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters); |
203 return new AMD64HotSpotForeignCallsProvider(jvmciRuntime, runtime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters); |
187 */ |
208 */ |
188 protected HotSpotSuitesProvider createSuites(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, Plugins plugins, |
209 protected HotSpotSuitesProvider createSuites(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, Plugins plugins, |
189 HotSpotRegistersProvider registers, Replacements replacements, OptionValues options) { |
210 HotSpotRegistersProvider registers, Replacements replacements, OptionValues options) { |
190 return new AddressLoweringHotSpotSuitesProvider(new AMD64HotSpotSuitesCreator(compilerConfiguration, plugins), config, runtime, |
211 return new AddressLoweringHotSpotSuitesProvider(new AMD64HotSpotSuitesCreator(compilerConfiguration, plugins), config, runtime, |
191 new AddressLoweringPhase(new AMD64HotSpotAddressLowering(config, registers.getHeapBaseRegister(), options))); |
212 new AddressLoweringPhase(new AMD64HotSpotAddressLowering(config, registers.getHeapBaseRegister(), options))); |
192 } |
|
193 |
|
194 protected HotSpotSnippetReflectionProvider createSnippetReflection(HotSpotGraalRuntimeProvider runtime, HotSpotConstantReflectionProvider constantReflection, WordTypes wordTypes) { |
|
195 return new HotSpotSnippetReflectionProvider(runtime, constantReflection, wordTypes); |
|
196 } |
213 } |
197 |
214 |
198 protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, HotSpotForeignCallsProvider foreignCalls, |
215 protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, HotSpotForeignCallsProvider foreignCalls, |
199 HotSpotRegistersProvider registers, HotSpotConstantReflectionProvider constantReflection, TargetDescription target) { |
216 HotSpotRegistersProvider registers, HotSpotConstantReflectionProvider constantReflection, TargetDescription target) { |
200 return new AMD64HotSpotLoweringProvider(runtime, metaAccess, foreignCalls, registers, constantReflection, target); |
217 return new AMD64HotSpotLoweringProvider(runtime, metaAccess, foreignCalls, registers, constantReflection, target); |