Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java @ 14853:6bde7deb5be1
Adopt HSAILLIRGenerator.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Thu, 27 Mar 2014 15:55:08 +0100 |
parents | f49e2f9cbdc3 |
children | f6630873316b |
rev | line source |
---|---|
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
1 /* |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
4 * |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
8 * |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
14 * |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
18 * |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
21 * questions. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
22 */ |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
23 package com.oracle.graal.hotspot.hsail; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
24 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
25 import static com.oracle.graal.api.code.CallingConvention.Type.*; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
26 import static com.oracle.graal.api.code.CodeUtil.*; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
27 import static com.oracle.graal.api.code.ValueUtil.*; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
28 import static com.oracle.graal.compiler.GraalCompiler.*; |
14853 | 29 import static com.oracle.graal.api.meta.LocationIdentity.*; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
30 |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
31 import java.lang.reflect.*; |
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
32 import java.util.*; |
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
33 |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
34 import com.amd.okra.*; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
35 import com.oracle.graal.api.code.*; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
36 import com.oracle.graal.api.code.Assumptions.Assumption; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
37 import com.oracle.graal.api.code.CallingConvention.Type; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
38 import com.oracle.graal.api.code.CompilationResult.Call; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
39 import com.oracle.graal.api.code.CompilationResult.CodeAnnotation; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
40 import com.oracle.graal.api.code.CompilationResult.DataPatch; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
41 import com.oracle.graal.api.code.CompilationResult.ExceptionHandler; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
42 import com.oracle.graal.api.code.CompilationResult.Infopoint; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
43 import com.oracle.graal.api.code.CompilationResult.Mark; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
44 import com.oracle.graal.api.meta.*; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
45 import com.oracle.graal.asm.*; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
46 import com.oracle.graal.asm.hsail.*; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
47 import com.oracle.graal.compiler.gen.*; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
48 import com.oracle.graal.debug.*; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
49 import com.oracle.graal.debug.Debug.Scope; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
50 import com.oracle.graal.gpu.*; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
51 import com.oracle.graal.graph.*; |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
52 import com.oracle.graal.hotspot.*; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
53 import com.oracle.graal.hotspot.bridge.CompilerToVM.CodeInstallResult; |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
54 import com.oracle.graal.hotspot.meta.*; |
14853 | 55 import com.oracle.graal.hotspot.nodes.*; |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
56 import com.oracle.graal.hsail.*; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
57 import com.oracle.graal.java.*; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
58 import com.oracle.graal.lir.*; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
59 import com.oracle.graal.lir.asm.*; |
10956 | 60 import com.oracle.graal.lir.hsail.*; |
14853 | 61 import com.oracle.graal.lir.hsail.HSAILControlFlow.DeoptimizeOp; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
62 import com.oracle.graal.nodes.*; |
14853 | 63 import com.oracle.graal.nodes.StructuredGraph.GuardsStage; |
64 import com.oracle.graal.nodes.extended.*; | |
65 import com.oracle.graal.nodes.java.*; | |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
66 import com.oracle.graal.nodes.type.*; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
67 import com.oracle.graal.phases.*; |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
68 import com.oracle.graal.phases.tiers.*; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
69 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
70 /** |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
71 * HSAIL specific backend. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
72 */ |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
73 public class HSAILHotSpotBackend extends HotSpotBackend { |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
74 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
75 private Map<String, String> paramTypeMap = new HashMap<>(); |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
76 private final boolean deviceInitialized; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
77 // TODO: get maximum Concurrency from okra |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
78 private int maxDeoptIndex = 8 * 40 * 64; // see gpu_hsail.hpp |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
79 |
12431
7080a96be216
rename: graalRuntime -> runtime, getGraalRuntime -> getRuntime
Doug Simon <doug.simon@oracle.com>
parents:
12429
diff
changeset
|
80 public HSAILHotSpotBackend(HotSpotGraalRuntime runtime, HotSpotProviders providers) { |
7080a96be216
rename: graalRuntime -> runtime, getGraalRuntime -> getRuntime
Doug Simon <doug.simon@oracle.com>
parents:
12429
diff
changeset
|
81 super(runtime, providers); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
82 paramTypeMap.put("HotSpotResolvedPrimitiveType<int>", "s32"); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
83 paramTypeMap.put("HotSpotResolvedPrimitiveType<float>", "f32"); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
84 paramTypeMap.put("HotSpotResolvedPrimitiveType<double>", "f64"); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
85 paramTypeMap.put("HotSpotResolvedPrimitiveType<long>", "s64"); |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
86 |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
87 // The order of the conjunction below is important: the OkraUtil |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
88 // call may provision the native library required by the initialize() call |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
89 deviceInitialized = OkraUtil.okraLibExists() && initialize(); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
90 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
91 |
11775
b04b94b71649
Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents:
11739
diff
changeset
|
92 @Override |
b04b94b71649
Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents:
11739
diff
changeset
|
93 public boolean shouldAllocateRegisters() { |
b04b94b71649
Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents:
11739
diff
changeset
|
94 return true; |
b04b94b71649
Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents:
11739
diff
changeset
|
95 } |
b04b94b71649
Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents:
11739
diff
changeset
|
96 |
13308
d3b3c6e17d40
HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents:
13234
diff
changeset
|
97 /** |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
98 * Initializes the GPU device. |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
99 * |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
100 * @return whether or not initialization was successful |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
101 */ |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
102 private static native boolean initialize(); |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
103 |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
104 /** |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
105 * Control how many threads run on simulator (used only from junit tests). |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
106 */ |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
107 public void setSimulatorSingleThreaded() { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
108 String simThrEnv = System.getenv("SIMTHREADS"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
109 if (simThrEnv == null || !simThrEnv.equals("1")) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
110 setSimulatorSingleThreaded0(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
111 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
112 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
113 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
114 private static native void setSimulatorSingleThreaded0(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
115 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
116 /** |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
117 * Determines if the GPU device (or simulator) is available and initialized. |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
118 */ |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
119 public boolean isDeviceInitialized() { |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
120 return deviceInitialized; |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
121 } |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
122 |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
123 /** |
13308
d3b3c6e17d40
HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents:
13234
diff
changeset
|
124 * Completes the initialization of the HSAIL backend. This includes initializing the providers |
d3b3c6e17d40
HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents:
13234
diff
changeset
|
125 * and registering any method substitutions specified by the HSAIL backend. |
d3b3c6e17d40
HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents:
13234
diff
changeset
|
126 */ |
12797
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
127 @Override |
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
128 public void completeInitialization() { |
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
129 final HotSpotProviders providers = getProviders(); |
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
130 HotSpotVMConfig config = getRuntime().getConfig(); |
13308
d3b3c6e17d40
HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents:
13234
diff
changeset
|
131 // Initialize the lowering provider. |
12797
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
132 final HotSpotLoweringProvider lowerer = (HotSpotLoweringProvider) providers.getLowerer(); |
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
133 lowerer.initialize(providers, config); |
13308
d3b3c6e17d40
HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents:
13234
diff
changeset
|
134 |
d3b3c6e17d40
HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents:
13234
diff
changeset
|
135 // Register the replacements used by the HSAIL backend. |
13902
bdeadcd7101d
HSAIL: disable String.equals() substitutions
Doug Simon <doug.simon@oracle.com>
parents:
13900
diff
changeset
|
136 HSAILHotSpotReplacementsImpl replacements = (HSAILHotSpotReplacementsImpl) providers.getReplacements(); |
bdeadcd7101d
HSAIL: disable String.equals() substitutions
Doug Simon <doug.simon@oracle.com>
parents:
13900
diff
changeset
|
137 replacements.completeInitialization(); |
12797
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
138 } |
5341a7fca039
made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents:
12664
diff
changeset
|
139 |
11739
b8695542d41b
added HSAIL register configuration
Doug Simon <doug.simon@oracle.com>
parents:
10956
diff
changeset
|
140 /** |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
141 * Compiles and installs a given method to a GPU binary. |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
142 */ |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
143 public HotSpotNmethod compileAndInstallKernel(Method method) { |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
144 ResolvedJavaMethod javaMethod = getProviders().getMetaAccess().lookupJavaMethod(method); |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
145 return installKernel(javaMethod, compileKernel(javaMethod, true)); |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
146 } |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
147 |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
148 /** |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
149 * Compiles a given method to HSAIL code. |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
150 * |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
151 * @param makeBinary specifies whether a GPU binary should also be generated for the HSAIL code. |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
152 * If true, the returned value is guaranteed to have a non-zero |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
153 * {@linkplain ExternalCompilationResult#getEntryPoint() entry point}. |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
154 * @return the HSAIL code compiled from {@code method}'s bytecode |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
155 */ |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
156 public ExternalCompilationResult compileKernel(ResolvedJavaMethod method, boolean makeBinary) { |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
157 StructuredGraph graph = new StructuredGraph(method); |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
158 HotSpotProviders providers = getProviders(); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
159 MetaAccessProvider metaAccess = getProviders().getMetaAccess(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
160 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
161 // changed this from default to help us generate deopts when needed |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
162 OptimisticOptimizations optimisticOpts = OptimisticOptimizations.ALL; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
163 optimisticOpts.remove(OptimisticOptimizations.Optimization.UseExceptionProbabilityForOperations); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
164 new GraphBuilderPhase.Instance(metaAccess, GraphBuilderConfiguration.getSnippetDefault(), optimisticOpts).apply(graph); |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
165 PhaseSuite<HighTierContext> graphBuilderSuite = providers.getSuites().getDefaultGraphBuilderSuite(); |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
166 CallingConvention cc = getCallingConvention(providers.getCodeCache(), Type.JavaCallee, graph.method(), false); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
167 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
168 // append special HSAILNonNullParametersPhase |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
169 int numArgs = cc.getArguments().length; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
170 graphBuilderSuite.appendPhase(new HSAILNonNullParametersPhase(numArgs)); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
171 |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
172 Suites suites = providers.getSuites().getDefaultSuites(); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
173 ExternalCompilationResult hsailCode = compileGraph(graph, null, cc, method, providers, this, this.getTarget(), null, graphBuilderSuite, optimisticOpts, getProfilingInfo(graph), null, suites, |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
174 new ExternalCompilationResult(), CompilationResultBuilderFactory.Default); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
175 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
176 // this code added to dump infopoints |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
177 try (Scope s = Debug.scope("CodeGen")) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
178 if (Debug.isLogEnabled()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
179 // show infopoints |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
180 List<Infopoint> infoList = hsailCode.getInfopoints(); |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
181 Debug.log("%d HSAIL infopoints", infoList.size()); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
182 for (Infopoint info : infoList) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
183 Debug.log(info.toString()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
184 Debug.log(info.debugInfo.frame().toString()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
185 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
186 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
187 } catch (Throwable e) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
188 throw Debug.handle(e); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
189 } |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
190 |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
191 if (makeBinary) { |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
192 if (!deviceInitialized) { |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
193 throw new GraalInternalError("Cannot generate GPU kernel if device is not initialized"); |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
194 } |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
195 try (Scope ds = Debug.scope("GeneratingKernelBinary")) { |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
196 long kernel = generateKernel(hsailCode.getTargetCode(), method.getName()); |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
197 if (kernel == 0) { |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
198 throw new GraalInternalError("Failed to compile HSAIL kernel"); |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
199 } |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
200 hsailCode.setEntryPoint(kernel); |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
201 } catch (Throwable e) { |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
202 throw Debug.handle(e); |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
203 } |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
204 } |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
205 return hsailCode; |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
206 } |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
207 |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
208 private static class HSAILNonNullParametersPhase extends Phase { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
209 // we use this to limit the stamping to exclude the final argument in an obj stream method |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
210 private int numArgs; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
211 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
212 public HSAILNonNullParametersPhase(int numArgs) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
213 this.numArgs = numArgs; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
214 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
215 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
216 @Override |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
217 protected void run(StructuredGraph graph) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
218 int argCount = 0; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
219 for (ParameterNode param : graph.getNodes(ParameterNode.class)) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
220 argCount++; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
221 if (argCount < numArgs && param.stamp() instanceof ObjectStamp) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
222 param.setStamp(StampFactory.declaredNonNull(((ObjectStamp) param.stamp()).type())); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
223 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
224 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
225 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
226 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
227 |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
228 /** |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
229 * Generates a GPU binary from HSAIL code. |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
230 */ |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
231 private static native long generateKernel(byte[] hsailCode, String name); |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
232 |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
233 /** |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
234 * Installs the {@linkplain ExternalCompilationResult#getEntryPoint() GPU binary} associated |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
235 * with some given HSAIL code in the code cache and returns a {@link HotSpotNmethod} handle to |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
236 * the installed code. |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
237 * |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
238 * @param hsailCode HSAIL compilation result for which a GPU binary has been generated |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
239 * @return a handle to the binary as installed in the HotSpot code cache |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
240 */ |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
241 public final HotSpotNmethod installKernel(ResolvedJavaMethod method, ExternalCompilationResult hsailCode) { |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
242 assert hsailCode.getEntryPoint() != 0L; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
243 // code below here lifted from HotSpotCodeCacheProviders.addExternalMethod |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
244 // used to be return getProviders().getCodeCache().addExternalMethod(method, hsailCode); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
245 HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) method; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
246 if (hsailCode.getId() == -1) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
247 hsailCode.setId(javaMethod.allocateCompileId(hsailCode.getEntryBCI())); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
248 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
249 CompilationResult compilationResult = hsailCode; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
250 StructuredGraph hostGraph = hsailCode.getHostGraph(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
251 if (hostGraph != null) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
252 // TODO get rid of the unverified entry point in the host code |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
253 try (Scope ds = Debug.scope("GeneratingHostGraph")) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
254 HotSpotBackend hostBackend = getRuntime().getHostBackend(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
255 JavaType[] parameterTypes = new JavaType[hostGraph.getNodes(ParameterNode.class).count()]; |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
256 Debug.log("Param count: %d", parameterTypes.length); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
257 for (int i = 0; i < parameterTypes.length; i++) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
258 ParameterNode parameter = hostGraph.getParameter(i); |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
259 Debug.log("Param [%d]=%d", i, parameter); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
260 parameterTypes[i] = parameter.stamp().javaType(hostBackend.getProviders().getMetaAccess()); |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
261 Debug.log(" %s", parameterTypes[i]); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
262 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
263 CallingConvention cc = hostBackend.getProviders().getCodeCache().getRegisterConfig().getCallingConvention(Type.JavaCallee, method.getSignature().getReturnType(null), parameterTypes, |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
264 hostBackend.getTarget(), false); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
265 CompilationResult hostCode = compileGraph(hostGraph, null, cc, method, hostBackend.getProviders(), hostBackend, this.getTarget(), null, |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
266 hostBackend.getProviders().getSuites().getDefaultGraphBuilderSuite(), OptimisticOptimizations.NONE, null, null, |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
267 hostBackend.getProviders().getSuites().getDefaultSuites(), new CompilationResult(), CompilationResultBuilderFactory.Default); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
268 compilationResult = merge(hostCode, hsailCode); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
269 } catch (Throwable e) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
270 throw Debug.handle(e); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
271 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
272 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
273 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
274 HotSpotNmethod code = new HotSpotNmethod(javaMethod, hsailCode.getName(), false, true); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
275 HotSpotCompiledNmethod compiled = new HotSpotCompiledNmethod(getTarget(), javaMethod, compilationResult); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
276 CodeInstallResult result = getRuntime().getCompilerToVM().installCode(compiled, code, null); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
277 if (result != CodeInstallResult.OK) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
278 return null; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
279 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
280 return code; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
281 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
282 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
283 private static ExternalCompilationResult merge(CompilationResult hostCode, ExternalCompilationResult hsailCode) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
284 ExternalCompilationResult result = new ExternalCompilationResult(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
285 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
286 // from hsail code |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
287 result.setEntryPoint(hsailCode.getEntryPoint()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
288 result.setId(hsailCode.getId()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
289 result.setEntryBCI(hsailCode.getEntryBCI()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
290 assert hsailCode.getMarks().isEmpty(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
291 assert hsailCode.getExceptionHandlers().isEmpty(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
292 assert hsailCode.getDataReferences().isEmpty(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
293 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
294 // from host code |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
295 result.setFrameSize(hostCode.getFrameSize()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
296 result.setCustomStackAreaOffset(hostCode.getCustomStackAreaOffset()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
297 result.setRegisterRestoreEpilogueOffset(hostCode.getRegisterRestoreEpilogueOffset()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
298 result.setTargetCode(hostCode.getTargetCode(), hostCode.getTargetCodeSize()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
299 for (CodeAnnotation annotation : hostCode.getAnnotations()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
300 result.addAnnotation(annotation); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
301 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
302 CompilationResult.Mark[] noMarks = {}; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
303 for (Mark mark : hostCode.getMarks()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
304 result.recordMark(mark.pcOffset, mark.id, noMarks); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
305 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
306 for (ExceptionHandler handler : hostCode.getExceptionHandlers()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
307 result.recordExceptionHandler(handler.pcOffset, handler.handlerPos); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
308 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
309 for (DataPatch patch : hostCode.getDataReferences()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
310 if (patch.data != null) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
311 if (patch.inline) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
312 result.recordInlineData(patch.pcOffset, patch.data); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
313 } else { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
314 result.recordDataReference(patch.pcOffset, patch.data); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
315 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
316 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
317 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
318 for (Infopoint infopoint : hostCode.getInfopoints()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
319 if (infopoint instanceof Call) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
320 Call call = (Call) infopoint; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
321 result.recordCall(call.pcOffset, call.size, call.target, call.debugInfo, call.direct); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
322 } else { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
323 result.recordInfopoint(infopoint.pcOffset, infopoint.debugInfo, infopoint.reason); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
324 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
325 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
326 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
327 // merged |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
328 Assumptions mergedAssumptions = new Assumptions(true); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
329 if (hostCode.getAssumptions() != null) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
330 for (Assumption assumption : hostCode.getAssumptions().getAssumptions()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
331 if (assumption != null) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
332 mergedAssumptions.record(assumption); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
333 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
334 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
335 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
336 if (hsailCode.getAssumptions() != null) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
337 for (Assumption assumption : hsailCode.getAssumptions().getAssumptions()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
338 if (assumption != null) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
339 mergedAssumptions.record(assumption); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
340 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
341 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
342 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
343 if (!mergedAssumptions.isEmpty()) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
344 result.setAssumptions(mergedAssumptions); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
345 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
346 return result; |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
347 } |
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
348 |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
349 public boolean executeKernel(HotSpotInstalledCode kernel, int jobSize, Object[] args) throws InvalidInstalledCodeException { |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
350 if (!deviceInitialized) { |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
351 throw new GraalInternalError("Cannot execute GPU kernel if device is not initialized"); |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
352 } |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
353 Object[] oopsSaveArea = new Object[maxDeoptIndex * 16]; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
354 return executeKernel0(kernel, jobSize, args, oopsSaveArea); |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
355 } |
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
356 |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
357 private static native boolean executeKernel0(HotSpotInstalledCode kernel, int jobSize, Object[] args, Object[] oopsSave) throws InvalidInstalledCodeException; |
13819
49db2c1e3bee
added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents:
13784
diff
changeset
|
358 |
13784
219a84093dda
moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents:
13318
diff
changeset
|
359 /** |
11739
b8695542d41b
added HSAIL register configuration
Doug Simon <doug.simon@oracle.com>
parents:
10956
diff
changeset
|
360 * Use the HSAIL register set when the compilation target is HSAIL. |
b8695542d41b
added HSAIL register configuration
Doug Simon <doug.simon@oracle.com>
parents:
10956
diff
changeset
|
361 */ |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
362 @Override |
10956 | 363 public FrameMap newFrameMap() { |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
364 return new HSAILFrameMap(getCodeCache()); |
10956 | 365 } |
366 | |
367 @Override | |
14846
43cd57700476
Apply LIRGenerator refactoring to HSAIL backend.
Josef Eisl <josef.eisl@jku.at>
parents:
14809
diff
changeset
|
368 public LIRGenerator newLIRGenerator(CallingConvention cc, LIRGenerationResult lirGenRes) { |
43cd57700476
Apply LIRGenerator refactoring to HSAIL backend.
Josef Eisl <josef.eisl@jku.at>
parents:
14809
diff
changeset
|
369 return new HSAILHotSpotLIRGenerator(getProviders(), getRuntime().getConfig(), cc, lirGenRes); |
14809
73774616a6b3
Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents:
14804
diff
changeset
|
370 } |
73774616a6b3
Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents:
14804
diff
changeset
|
371 |
73774616a6b3
Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents:
14804
diff
changeset
|
372 @Override |
73774616a6b3
Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents:
14804
diff
changeset
|
373 public LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) { |
14853 | 374 return new HSAILHotSpotLIRGenerationResult(lir, frameMap); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
375 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
376 |
14846
43cd57700476
Apply LIRGenerator refactoring to HSAIL backend.
Josef Eisl <josef.eisl@jku.at>
parents:
14809
diff
changeset
|
377 @Override |
43cd57700476
Apply LIRGenerator refactoring to HSAIL backend.
Josef Eisl <josef.eisl@jku.at>
parents:
14809
diff
changeset
|
378 public NodeLIRGenerator newNodeLIRGenerator(StructuredGraph graph, LIRGenerationResult lirGenRes, LIRGenerator lirGen) { |
43cd57700476
Apply LIRGenerator refactoring to HSAIL backend.
Josef Eisl <josef.eisl@jku.at>
parents:
14809
diff
changeset
|
379 return new HSAILHotSpotNodeLIRGenerator(graph, lirGenRes, lirGen); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
380 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
381 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
382 class HotSpotFrameContext implements FrameContext { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
383 |
13234
7e237378923d
made the frameContext of a CompilationResultBuilder always non-null and added FrameContext.hasFrame() to determine if a frame is actually generated
Doug Simon <doug.simon@oracle.com>
parents:
13229
diff
changeset
|
384 public boolean hasFrame() { |
7e237378923d
made the frameContext of a CompilationResultBuilder always non-null and added FrameContext.hasFrame() to determine if a frame is actually generated
Doug Simon <doug.simon@oracle.com>
parents:
13229
diff
changeset
|
385 return true; |
7e237378923d
made the frameContext of a CompilationResultBuilder always non-null and added FrameContext.hasFrame() to determine if a frame is actually generated
Doug Simon <doug.simon@oracle.com>
parents:
13229
diff
changeset
|
386 } |
7e237378923d
made the frameContext of a CompilationResultBuilder always non-null and added FrameContext.hasFrame() to determine if a frame is actually generated
Doug Simon <doug.simon@oracle.com>
parents:
13229
diff
changeset
|
387 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
388 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13105
diff
changeset
|
389 public void enter(CompilationResultBuilder crb) { |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
390 Debug.log("Nothing to do here"); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
391 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
392 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
393 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13105
diff
changeset
|
394 public void leave(CompilationResultBuilder crb) { |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
395 Debug.log("Nothing to do here"); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
396 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
397 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
398 |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
399 /** |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
400 * a class to allow us to save lirGen. |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
401 */ |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
402 static class HSAILCompilationResultBuilder extends CompilationResultBuilder { |
14853 | 403 public HSAILHotSpotLIRGenerationResult lirGenRes; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
404 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
405 public HSAILCompilationResultBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, FrameContext frameContext, |
14853 | 406 CompilationResult compilationResult, HSAILHotSpotLIRGenerationResult lirGenRes) { |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
407 super(codeCache, foreignCalls, frameMap, asm, frameContext, compilationResult); |
14853 | 408 this.lirGenRes = lirGenRes; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
409 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
410 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
411 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
412 @Override |
14032
d1c1f103d42c
renamed com.oracle.graal.asm.AbstractAssembler to com.oracle.graal.asm.Assembler
twisti
parents:
14031
diff
changeset
|
413 protected Assembler createAssembler(FrameMap frameMap) { |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
414 return new HSAILAssembler(getTarget()); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
415 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
416 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
417 @Override |
14809
73774616a6b3
Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents:
14804
diff
changeset
|
418 public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRes, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { |
73774616a6b3
Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents:
14804
diff
changeset
|
419 FrameMap frameMap = lirGenRes.getFrameMap(); |
14032
d1c1f103d42c
renamed com.oracle.graal.asm.AbstractAssembler to com.oracle.graal.asm.Assembler
twisti
parents:
14031
diff
changeset
|
420 Assembler masm = createAssembler(frameMap); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
421 HotSpotFrameContext frameContext = new HotSpotFrameContext(); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
422 // save lirGen for later use by setHostGraph |
14853 | 423 CompilationResultBuilder crb = new HSAILCompilationResultBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, frameContext, compilationResult, |
424 (HSAILHotSpotLIRGenerationResult) lirGenRes); | |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13105
diff
changeset
|
425 crb.setFrameSize(frameMap.frameSize()); |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13105
diff
changeset
|
426 return crb; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
427 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
428 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
429 @Override |
14065
5dec26f3d4a4
Use LIR instead of LIRGenerator as parameter in emitCode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
14032
diff
changeset
|
430 public void emitCode(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod method) { |
5dec26f3d4a4
Use LIR instead of LIRGenerator as parameter in emitCode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
14032
diff
changeset
|
431 assert method != null : lir + " is not associated with a method"; |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
432 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
433 boolean usesDeoptInfo = true; // TODO: make this conditional on something? |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
434 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
435 // Emit the prologue. |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
436 HSAILAssembler asm = (HSAILAssembler) crb.asm; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
437 asm.emitString0("version 0:95: $full : $large;\n"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
438 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
439 Signature signature = method.getSignature(); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
440 int sigParamCount = signature.getParameterCount(false); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
441 // We're subtracting 1 because we're not making the final gid as a parameter. |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
442 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
443 int nonConstantParamCount = sigParamCount - 1; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
444 boolean isStatic = (Modifier.isStatic(method.getModifiers())); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
445 // Determine if this is an object lambda. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
446 boolean isObjectLambda = true; |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
447 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
448 if (signature.getParameterType(nonConstantParamCount, null).getKind() == Kind.Int) { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
449 isObjectLambda = false; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
450 } else { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
451 // Add space for gid int reg. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
452 nonConstantParamCount++; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
453 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
454 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
455 // If this is an instance method, include mappings for the "this" parameter |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
456 // as the first parameter. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
457 if (!isStatic) { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
458 nonConstantParamCount++; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
459 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
460 // Add in any "constant" parameters (currently none). |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
461 int totalParamCount = nonConstantParamCount; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
462 JavaType[] paramtypes = new JavaType[totalParamCount]; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
463 String[] paramNames = new String[totalParamCount]; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
464 int pidx = 0; |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
465 MetaAccessProvider metaAccess = getProviders().getMetaAccess(); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
466 for (int i = 0; i < totalParamCount; i++) { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
467 if (i == 0 && !isStatic) { |
12363
78e5badf4b8e
moved lookupForeignCall() from CodeCacheProvider to ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12045
diff
changeset
|
468 paramtypes[i] = metaAccess.lookupJavaType(Object.class); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
469 paramNames[i] = "%_this"; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
470 } else if (i < nonConstantParamCount) { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
471 if (isObjectLambda && (i == (nonConstantParamCount))) { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
472 // Set up the gid register mapping. |
12363
78e5badf4b8e
moved lookupForeignCall() from CodeCacheProvider to ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12045
diff
changeset
|
473 paramtypes[i] = metaAccess.lookupJavaType(int.class); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
474 paramNames[i] = "%_gid"; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
475 } else { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
476 paramtypes[i] = signature.getParameterType(pidx++, null); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
477 paramNames[i] = "%_arg" + i; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
478 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
479 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
480 } |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
481 |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
482 asm.emitString0("// " + (isStatic ? "static" : "instance") + " method " + method + "\n"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
483 asm.emitString0("kernel &run ( \n"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
484 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13105
diff
changeset
|
485 FrameMap frameMap = crb.frameMap; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
486 RegisterConfig regConfig = frameMap.registerConfig; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
487 // Build list of param types which does include the gid (for cc register mapping query). |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
488 JavaType[] ccParamTypes = new JavaType[nonConstantParamCount + 1]; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
489 // Include the gid. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
490 System.arraycopy(paramtypes, 0, ccParamTypes, 0, nonConstantParamCount); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
491 |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
492 // Last entry is always int (its register gets used in the workitemabsid instruction) |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
493 // this is true even for object stream labmdas |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
494 if (sigParamCount > 0) { |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
495 ccParamTypes[ccParamTypes.length - 1] = metaAccess.lookupJavaType(int.class); |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
496 } |
12429
5124eeec1a7b
split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
12363
diff
changeset
|
497 CallingConvention cc = regConfig.getCallingConvention(JavaCallee, null, ccParamTypes, getTarget(), false); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
498 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
499 /** |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
500 * Compute the hsail size mappings up to but not including the last non-constant parameter |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
501 * (which is the gid). |
14774
8594b26fc5d8
fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents:
14768
diff
changeset
|
502 * |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
503 */ |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
504 String[] paramHsailSizes = new String[totalParamCount]; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
505 for (int i = 0; i < totalParamCount; i++) { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
506 String paramtypeStr = paramtypes[i].toString(); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
507 String sizeStr = paramTypeMap.get(paramtypeStr); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
508 // Catch all for any unmapped paramtype that is u64 (address of an object). |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
509 paramHsailSizes[i] = (sizeStr != null ? sizeStr : "u64"); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
510 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
511 // Emit the kernel function parameters. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
512 for (int i = 0; i < totalParamCount; i++) { |
13900
d9aad522d355
HSAIL: fixed bug in kernel argument logic
Doug Simon <doug.simon@oracle.com>
parents:
13839
diff
changeset
|
513 String str = "align 8 kernarg_" + paramHsailSizes[i] + " " + paramNames[i]; |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
514 |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
515 if (usesDeoptInfo || (i != totalParamCount - 1)) { |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
516 str += ","; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
517 } |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
518 asm.emitString(str); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
519 } |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
520 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
521 if (usesDeoptInfo) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
522 // add in the deoptInfo parameter |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
523 asm.emitString("kernarg_u64 " + asm.getDeoptInfoName()); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
524 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
525 |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
526 asm.emitString(") {"); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
527 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
528 /* |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
529 * End of parameters start of prolog code. Emit the load instructions for loading of the |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
530 * kernel non-constant parameters into registers. The constant class parameters will not be |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
531 * loaded up front but will be loaded as needed. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
532 */ |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
533 for (int i = 0; i < nonConstantParamCount; i++) { |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
534 asm.emitString("ld_kernarg_" + paramHsailSizes[i] + " " + HSAIL.mapRegister(cc.getArgument(i)) + ", [" + paramNames[i] + "];"); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
535 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
536 |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
537 /* |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
538 * Emit the workitemaid instruction for loading the hidden gid parameter. This is assigned |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
539 * the register as if it were the last of the nonConstant parameters. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
540 */ |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
541 String workItemReg = "$s" + Integer.toString(asRegister(cc.getArgument(nonConstantParamCount)).encoding()); |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
542 asm.emitString("workitemabsid_u32 " + workItemReg + ", 0;"); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
543 |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
544 final int offsetToDeoptSaveStates = getRuntime().getConfig().hsailSaveStatesOffset0; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
545 final int sizeofKernelDeopt = getRuntime().getConfig().hsailSaveStatesOffset1 - getRuntime().getConfig().hsailSaveStatesOffset0; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
546 final int offsetToDeopt = getRuntime().getConfig().hsailDeoptOffset; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
547 final int offsetToNeverRanArray = getRuntime().getConfig().hsailNeverRanArrayOffset; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
548 final int offsetToDeoptNextIndex = getRuntime().getConfig().hsailDeoptNextIndexOffset; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
549 final String deoptInProgressLabel = "@LHandleDeoptInProgress"; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
550 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
551 if (usesDeoptInfo) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
552 AllocatableValue scratch64 = HSAIL.d16.asValue(Kind.Object); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
553 AllocatableValue scratch32 = HSAIL.s34.asValue(Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
554 HSAILAddress deoptInfoAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeopt).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
555 asm.emitLoadKernelArg(scratch64, asm.getDeoptInfoName(), "u64"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
556 asm.emitComment("// Check if a deopt has occurred and abort if true before doing any work"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
557 asm.emitLoadAcquire(scratch32, deoptInfoAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
558 asm.emitCompare(scratch32, Constant.forInt(0), "ne", false, false); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
559 asm.cbr(deoptInProgressLabel); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
560 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
561 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
562 /* |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
563 * Note the logic used for this spillseg size is to leave space and then go back and patch |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
564 * in the correct size once we have generated all the instructions. This should probably be |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
565 * done in a more robust way by implementing something like asm.insertString. |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
566 */ |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
567 int spillsegDeclarationPosition = asm.position() + 1; |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
568 String spillsegTemplate = "align 4 spill_u8 %spillseg[123456];"; |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
569 asm.emitString(spillsegTemplate); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
570 // Emit object array load prologue here. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
571 if (isObjectLambda) { |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
572 boolean useCompressedOops = getRuntime().getConfig().useCompressedOops; |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
573 final int arrayElementsOffset = HotSpotGraalRuntime.getArrayBaseOffset(Kind.Object); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
574 String iterationObjArgReg = HSAIL.mapRegister(cc.getArgument(nonConstantParamCount - 1)); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
575 // iterationObjArgReg will be the highest $d register in use (it is the last parameter) |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
576 // so tempReg can be the next higher $d register |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
577 String tmpReg = "$d" + (asRegister(cc.getArgument(nonConstantParamCount - 1)).encoding() + 1); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
578 // Convert gid to long. |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
579 asm.emitString("cvt_u64_s32 " + tmpReg + ", " + workItemReg + "; // Convert gid to long"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
580 // Adjust index for sizeof ref. Where to pull this size from? |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
581 asm.emitString("mul_u64 " + tmpReg + ", " + tmpReg + ", " + (useCompressedOops ? 4 : 8) + "; // Adjust index for sizeof ref"); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
582 // Adjust for actual data start. |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
583 asm.emitString("add_u64 " + tmpReg + ", " + tmpReg + ", " + arrayElementsOffset + "; // Adjust for actual elements data start"); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
584 // Add to array ref ptr. |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
585 asm.emitString("add_u64 " + tmpReg + ", " + tmpReg + ", " + iterationObjArgReg + "; // Add to array ref ptr"); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
586 // Load the object into the parameter reg. |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
587 if (useCompressedOops) { |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
588 |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
589 // Load u32 into the d 64 reg since it will become an object address |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
590 asm.emitString("ld_global_u32 " + tmpReg + ", " + "[" + tmpReg + "]" + "; // Load compressed ptr from array"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
591 |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
592 long narrowOopBase = getRuntime().getConfig().narrowOopBase; |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
593 long narrowOopShift = getRuntime().getConfig().narrowOopShift; |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
594 |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
595 if (narrowOopBase == 0 && narrowOopShift == 0) { |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
596 // No more calculation to do, mov to target register |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
597 asm.emitString("mov_b64 " + iterationObjArgReg + ", " + tmpReg + "; // no shift or base addition"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
598 } else { |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
599 if (narrowOopBase == 0) { |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
600 asm.emitString("shl_u64 " + iterationObjArgReg + ", " + tmpReg + ", " + narrowOopShift + "; // do narrowOopShift"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
601 } else if (narrowOopShift == 0) { |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
602 // not sure if we ever get add with 0 shift but just in case |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
603 asm.emitString("cmp_eq_b1_u64 $c0, " + tmpReg + ", 0x0; // avoid add if compressed is null"); |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
604 asm.emitString("add_u64 " + iterationObjArgReg + ", " + tmpReg + ", " + narrowOopBase + "; // add narrowOopBase"); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
605 asm.emitString("cmov_b64 " + iterationObjArgReg + ", $c0, 0x0, " + iterationObjArgReg + "; // avoid add if compressed is null"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
606 } else { |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
607 asm.emitString("cmp_eq_b1_u64 $c0, " + tmpReg + ", 0x0; // avoid shift-add if compressed is null"); |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
608 asm.emitString("mad_u64 " + iterationObjArgReg + ", " + tmpReg + ", " + (1 << narrowOopShift) + ", " + narrowOopBase + "; // shift and add narrowOopBase"); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
609 asm.emitString("cmov_b64 " + iterationObjArgReg + ", $c0, 0x0, " + iterationObjArgReg + "; // avoid shift-add if compressed is null"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
610 } |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
611 } |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
612 |
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
613 } else { |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
614 asm.emitString("ld_global_u64 " + iterationObjArgReg + ", " + "[" + tmpReg + "]" + "; // Load from array element into parameter reg"); |
13105
d3fc35a43376
HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents:
12797
diff
changeset
|
615 } |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
616 } |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
617 // Prologue done, Emit code for the LIR. |
14065
5dec26f3d4a4
Use LIR instead of LIRGenerator as parameter in emitCode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
14032
diff
changeset
|
618 crb.emit(lir); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
619 // Now that code is emitted go back and figure out what the upper Bound stack size was. |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13105
diff
changeset
|
620 long maxStackSize = ((HSAILAssembler) crb.asm).upperBoundStackSize(); |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
621 String spillsegStringFinal; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
622 if (maxStackSize == 0) { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
623 // If no spilling, get rid of spillseg declaration. |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
624 char[] array = new char[spillsegTemplate.length()]; |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
625 Arrays.fill(array, ' '); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
626 spillsegStringFinal = new String(array); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
627 } else { |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
628 spillsegStringFinal = spillsegTemplate.replace("123456", String.format("%6d", maxStackSize)); |
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
629 } |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
630 asm.emitString(spillsegStringFinal, spillsegDeclarationPosition); |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
631 // Emit the epilogue. |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13902
diff
changeset
|
632 |
14768
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
633 final int offsetToDeoptimizationWorkItem = getRuntime().getConfig().hsailDeoptimizationWorkItem; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
634 final int offsetToDeoptimizationReason = getRuntime().getConfig().hsailDeoptimizationReason; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
635 final int offsetToDeoptimizationFrame = getRuntime().getConfig().hsailDeoptimizationFrame; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
636 final int offsetToFramePc = getRuntime().getConfig().hsailFramePcOffset; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
637 final int offsetToNumSaves = getRuntime().getConfig().hsailFrameNumSRegOffset; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
638 final int offsetToSaveArea = getRuntime().getConfig().hsailFrameSaveAreaOffset; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
639 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
640 // TODO: keep track of whether we need it |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
641 if (usesDeoptInfo) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
642 AllocatableValue scratch64 = HSAIL.d16.asValue(Kind.Object); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
643 AllocatableValue cuSaveAreaPtr = HSAIL.d17.asValue(Kind.Object); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
644 AllocatableValue waveMathScratch1 = HSAIL.d18.asValue(Kind.Object); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
645 AllocatableValue waveMathScratch2 = HSAIL.d19.asValue(Kind.Object); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
646 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
647 AllocatableValue actionAndReasonReg = HSAIL.s32.asValue(Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
648 AllocatableValue codeBufferOffsetReg = HSAIL.s33.asValue(Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
649 AllocatableValue scratch32 = HSAIL.s34.asValue(Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
650 AllocatableValue workidreg = HSAIL.s35.asValue(Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
651 AllocatableValue dregOopMapReg = HSAIL.s39.asValue(Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
652 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
653 HSAILAddress deoptNextIndexAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeoptNextIndex).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
654 HSAILAddress neverRanArrayAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToNeverRanArray).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
655 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
656 // The just-started lanes that see the deopt flag will jump here |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
657 asm.emitString0(deoptInProgressLabel + ":\n"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
658 asm.emitLoad(Kind.Object, waveMathScratch1, neverRanArrayAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
659 asm.emitWorkItemAbsId(workidreg); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
660 asm.emitConvert(waveMathScratch2, workidreg, Kind.Object, Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
661 asm.emit("add", waveMathScratch1, waveMathScratch1, waveMathScratch2); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
662 HSAILAddress neverRanStoreAddr = new HSAILAddressValue(Kind.Byte, waveMathScratch1, 0).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
663 asm.emitStore(Kind.Byte, Constant.forInt(1), neverRanStoreAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
664 asm.emitString("ret;"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
665 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
666 // The deoptimizing lanes will jump here |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
667 asm.emitString0(asm.getDeoptLabelName() + ":\n"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
668 String labelExit = asm.getDeoptLabelName() + "_Exit"; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
669 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
670 HSAILAddress deoptInfoAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeopt).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
671 asm.emitLoadKernelArg(scratch64, asm.getDeoptInfoName(), "u64"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
672 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
673 // Set deopt occurred flag |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
674 asm.emitMov(scratch32, Constant.forInt(1)); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
675 asm.emitStoreRelease(scratch32, deoptInfoAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
676 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
677 asm.emitComment("// Determine next deopt save slot"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
678 asm.emitAtomicAdd(scratch32, deoptNextIndexAddr, Constant.forInt(1)); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
679 // scratch32 now holds next index to use |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
680 // set error condition if no room in save area |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
681 asm.emitComment("// assert room to save deopt"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
682 asm.emitCompare(scratch32, Constant.forInt(maxDeoptIndex), "lt", false, false); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
683 asm.cbr("@L_StoreDeopt"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
684 // if assert fails, store a guaranteed negative workitemid in top level deopt occurred |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
685 // flag |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
686 asm.emitWorkItemAbsId(scratch32); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
687 asm.emit("mad", scratch32, scratch32, Constant.forInt(-1), Constant.forInt(-1)); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
688 asm.emitStore(scratch32, deoptInfoAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
689 asm.emitString("ret;"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
690 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
691 asm.emitString0("@L_StoreDeopt" + ":\n"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
692 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
693 // Store deopt for this workitem into its slot in the HSAILComputeUnitSaveStates array |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
694 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
695 asm.emitComment("// Convert id's for ptr math"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
696 asm.emitConvert(cuSaveAreaPtr, scratch32, Kind.Object, Kind.Int); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
697 asm.emitComment("// multiply by sizeof KernelDeoptArea"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
698 asm.emit("mul", cuSaveAreaPtr, cuSaveAreaPtr, Constant.forInt(sizeofKernelDeopt)); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
699 asm.emitComment("// Add computed offset to deoptInfoPtr base"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
700 asm.emit("add", cuSaveAreaPtr, cuSaveAreaPtr, scratch64); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
701 // Add offset to _deopt_save_states[0] |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
702 asm.emit("add", scratch64, cuSaveAreaPtr, Constant.forInt(offsetToDeoptSaveStates)); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
703 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
704 HSAILAddress workItemAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeoptimizationWorkItem).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
705 HSAILAddress actionReasonStoreAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeoptimizationReason).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
706 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
707 asm.emitComment("// Get _deopt_info._first_frame"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
708 asm.emit("add", waveMathScratch1, scratch64, Constant.forInt(offsetToDeoptimizationFrame)); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
709 // Now scratch64 is the _deopt_info._first_frame |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
710 HSAILAddress pcStoreAddr = new HSAILAddressValue(Kind.Int, waveMathScratch1, offsetToFramePc).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
711 HSAILAddress regCountsAddr = new HSAILAddressValue(Kind.Int, waveMathScratch1, offsetToNumSaves).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
712 HSAILAddress dregOopMapAddr = new HSAILAddressValue(Kind.Int, waveMathScratch1, offsetToNumSaves + 2).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
713 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
714 asm.emitComment("// store deopting workitem"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
715 asm.emitWorkItemAbsId(scratch32); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
716 asm.emitStore(Kind.Int, scratch32, workItemAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
717 asm.emitComment("// store actionAndReason"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
718 asm.emitStore(Kind.Int, actionAndReasonReg, actionReasonStoreAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
719 asm.emitComment("// store PC"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
720 asm.emitStore(Kind.Int, codeBufferOffsetReg, pcStoreAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
721 asm.emitComment("// store regCounts"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
722 asm.emitStore(Kind.Short, Constant.forInt(32 + (16 << 8) + (0 << 16)), regCountsAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
723 asm.emitComment("// store dreg ref map bits"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
724 asm.emitStore(Kind.Short, dregOopMapReg, dregOopMapAddr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
725 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
726 // get the union of registers needed to be saved at the infopoints |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
727 // usedRegs array assumes d15 has the highest register number we wish to save |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
728 // and initially has all registers as false |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
729 boolean[] infoUsedRegs = new boolean[HSAIL.d15.number + 1]; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
730 List<Infopoint> infoList = crb.compilationResult.getInfopoints(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
731 for (Infopoint info : infoList) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
732 BytecodeFrame frame = info.debugInfo.frame(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
733 for (int i = 0; i < frame.numLocals + frame.numStack; i++) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
734 Value val = frame.values[i]; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
735 if (isLegal(val) && isRegister(val)) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
736 Register reg = asRegister(val); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
737 infoUsedRegs[reg.number] = true; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
738 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
739 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
740 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
741 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
742 // loop storing each of the 32 s registers that are used by infopoints |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
743 // we always store in a fixed location, even if some registers are not stored |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
744 asm.emitComment("// store used s regs"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
745 int ofst = offsetToSaveArea; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
746 for (Register sreg : HSAIL.sRegisters) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
747 if (infoUsedRegs[sreg.number]) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
748 Kind kind = Kind.Int; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
749 HSAILAddress addr = new HSAILAddressValue(kind, waveMathScratch1, ofst).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
750 AllocatableValue sregValue = sreg.asValue(kind); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
751 asm.emitStore(kind, sregValue, addr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
752 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
753 ofst += 4; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
754 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
755 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
756 // loop storing each of the 16 d registers that are used by infopoints |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
757 asm.emitComment("// store used d regs"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
758 for (Register dreg : HSAIL.dRegisters) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
759 if (infoUsedRegs[dreg.number]) { |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
760 Kind kind = Kind.Long; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
761 HSAILAddress addr = new HSAILAddressValue(kind, waveMathScratch1, ofst).toAddress(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
762 AllocatableValue dregValue = dreg.asValue(kind); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
763 asm.emitStore(kind, dregValue, addr); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
764 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
765 ofst += 8; |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
766 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
767 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
768 // for now, ignore saving the spill variables but that would come here |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
769 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
770 asm.emitString0(labelExit + ":\n"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
771 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
772 // and emit the return |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
773 crb.frameContext.leave(crb); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
774 asm.exit(); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
775 } |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
776 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
777 asm.emitString0("}; \n"); |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
778 |
3e9a960f0da1
HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents:
14143
diff
changeset
|
779 ExternalCompilationResult compilationResult = (ExternalCompilationResult) crb.compilationResult; |
14853 | 780 HSAILHotSpotLIRGenerationResult lirGenRes = ((HSAILCompilationResultBuilder) crb).lirGenRes; |
781 compilationResult.setHostGraph(prepareHostGraph(method, lirGenRes.getDeopts(), getProviders(), getRuntime().getConfig())); | |
782 } | |
783 | |
784 private static StructuredGraph prepareHostGraph(ResolvedJavaMethod method, List<DeoptimizeOp> deopts, HotSpotProviders providers, HotSpotVMConfig config) { | |
785 if (deopts.isEmpty()) { | |
786 return null; | |
787 } | |
788 StructuredGraph hostGraph = new StructuredGraph(method, -2); | |
789 ParameterNode deoptId = hostGraph.unique(new ParameterNode(0, StampFactory.intValue())); | |
790 ParameterNode hsailFrame = hostGraph.unique(new ParameterNode(1, StampFactory.forKind(providers.getCodeCache().getTarget().wordKind))); | |
791 ParameterNode reasonAndAction = hostGraph.unique(new ParameterNode(2, StampFactory.intValue())); | |
792 ParameterNode speculation = hostGraph.unique(new ParameterNode(3, StampFactory.object())); | |
793 AbstractBeginNode[] branches = new AbstractBeginNode[deopts.size() + 1]; | |
794 int[] keys = new int[deopts.size()]; | |
795 int[] keySuccessors = new int[deopts.size() + 1]; | |
796 double[] keyProbabilities = new double[deopts.size() + 1]; | |
797 int i = 0; | |
798 Collections.sort(deopts, new Comparator<DeoptimizeOp>() { | |
799 public int compare(DeoptimizeOp o1, DeoptimizeOp o2) { | |
800 return o1.getCodeBufferPos() - o2.getCodeBufferPos(); | |
801 } | |
802 }); | |
803 for (DeoptimizeOp deopt : deopts) { | |
804 keySuccessors[i] = i; | |
805 keyProbabilities[i] = 1.0 / deopts.size(); | |
806 keys[i] = deopt.getCodeBufferPos(); | |
807 assert keys[i] >= 0; | |
808 branches[i] = createHostDeoptBranch(deopt, hsailFrame, reasonAndAction, speculation, providers, config); | |
809 | |
810 i++; | |
811 } | |
812 keyProbabilities[deopts.size()] = 0; // default | |
813 keySuccessors[deopts.size()] = deopts.size(); | |
814 branches[deopts.size()] = createHostCrashBranch(hostGraph, deoptId); | |
815 IntegerSwitchNode switchNode = hostGraph.add(new IntegerSwitchNode(deoptId, branches, keys, keyProbabilities, keySuccessors)); | |
816 StartNode start = hostGraph.start(); | |
817 start.setNext(switchNode); | |
818 /* | |
819 * printf.setNext(printf2); printf2.setNext(switchNode); | |
820 */ | |
821 hostGraph.setGuardsStage(GuardsStage.AFTER_FSA); | |
822 return hostGraph; | |
823 } | |
824 | |
825 private static AbstractBeginNode createHostCrashBranch(StructuredGraph hostGraph, ValueNode deoptId) { | |
826 VMErrorNode vmError = hostGraph.add(new VMErrorNode("Error in HSAIL deopt. DeoptId=%d", deoptId)); | |
827 // ConvertNode.convert(hostGraph, Kind.Long, deoptId))); | |
828 vmError.setNext(hostGraph.add(new ReturnNode(ConstantNode.defaultForKind(hostGraph.method().getSignature().getReturnKind(), hostGraph)))); | |
829 return BeginNode.begin(vmError); | |
830 } | |
831 | |
832 private static AbstractBeginNode createHostDeoptBranch(DeoptimizeOp deopt, ParameterNode hsailFrame, ValueNode reasonAndAction, ValueNode speculation, HotSpotProviders providers, | |
833 HotSpotVMConfig config) { | |
834 BeginNode branch = hsailFrame.graph().add(new BeginNode()); | |
835 DynamicDeoptimizeNode deoptimization = hsailFrame.graph().add(new DynamicDeoptimizeNode(reasonAndAction, speculation)); | |
836 deoptimization.setStateBefore(createFrameState(deopt.getFrameState().topFrame, hsailFrame, providers, config)); | |
837 branch.setNext(deoptimization); | |
838 return branch; | |
839 } | |
840 | |
841 private static FrameState createFrameState(BytecodeFrame lowLevelFrame, ParameterNode hsailFrame, HotSpotProviders providers, HotSpotVMConfig config) { | |
842 StructuredGraph hostGraph = hsailFrame.graph(); | |
843 ValueNode[] locals = new ValueNode[lowLevelFrame.numLocals]; | |
844 for (int i = 0; i < lowLevelFrame.numLocals; i++) { | |
845 locals[i] = getNodeForValueFromFrame(lowLevelFrame.getLocalValue(i), hsailFrame, hostGraph, providers, config); | |
846 } | |
847 List<ValueNode> stack = new ArrayList<>(lowLevelFrame.numStack); | |
848 for (int i = 0; i < lowLevelFrame.numStack; i++) { | |
849 stack.add(getNodeForValueFromFrame(lowLevelFrame.getStackValue(i), hsailFrame, hostGraph, providers, config)); | |
850 } | |
851 ValueNode[] locks = new ValueNode[lowLevelFrame.numLocks]; | |
852 MonitorIdNode[] monitorIds = new MonitorIdNode[lowLevelFrame.numLocks]; | |
853 for (int i = 0; i < lowLevelFrame.numLocks; i++) { | |
854 HotSpotMonitorValue lockValue = (HotSpotMonitorValue) lowLevelFrame.getLockValue(i); | |
855 locks[i] = getNodeForValueFromFrame(lockValue, hsailFrame, hostGraph, providers, config); | |
856 monitorIds[i] = getMonitorIdForHotSpotMonitorValueFromFrame(lockValue, hsailFrame, hostGraph); | |
857 } | |
858 FrameState frameState = hostGraph.add(new FrameState(lowLevelFrame.getMethod(), lowLevelFrame.getBCI(), locals, stack, locks, monitorIds, lowLevelFrame.rethrowException, false)); | |
859 if (lowLevelFrame.caller() != null) { | |
860 frameState.setOuterFrameState(createFrameState(lowLevelFrame.caller(), hsailFrame, providers, config)); | |
861 } | |
862 return frameState; | |
863 } | |
864 | |
865 @SuppressWarnings({"unused"}) | |
866 private static MonitorIdNode getMonitorIdForHotSpotMonitorValueFromFrame(HotSpotMonitorValue lockValue, ParameterNode hsailFrame, StructuredGraph hsailGraph) { | |
867 if (lockValue.isEliminated()) { | |
868 return null; | |
869 } | |
870 throw GraalInternalError.unimplemented(); | |
871 } | |
872 | |
873 private static ValueNode getNodeForValueFromFrame(Value localValue, ParameterNode hsailFrame, StructuredGraph hostGraph, HotSpotProviders providers, HotSpotVMConfig config) { | |
874 ValueNode valueNode; | |
875 if (localValue instanceof Constant) { | |
876 valueNode = ConstantNode.forConstant((Constant) localValue, providers.getMetaAccess(), hostGraph); | |
877 } else if (localValue instanceof VirtualObject) { | |
878 throw GraalInternalError.unimplemented(); | |
879 } else if (localValue instanceof StackSlot) { | |
880 throw GraalInternalError.unimplemented(); | |
881 } else if (localValue instanceof HotSpotMonitorValue) { | |
882 HotSpotMonitorValue hotSpotMonitorValue = (HotSpotMonitorValue) localValue; | |
883 return getNodeForValueFromFrame(hotSpotMonitorValue.getOwner(), hsailFrame, hostGraph, providers, config); | |
884 } else if (localValue instanceof RegisterValue) { | |
885 RegisterValue registerValue = (RegisterValue) localValue; | |
886 int regNumber = registerValue.getRegister().number; | |
887 valueNode = getNodeForRegisterFromFrame(regNumber, localValue.getKind(), hsailFrame, hostGraph, providers, config); | |
888 } else if (Value.ILLEGAL.equals(localValue)) { | |
889 valueNode = null; | |
890 } else { | |
891 throw GraalInternalError.shouldNotReachHere(); | |
892 } | |
893 return valueNode; | |
894 } | |
895 | |
896 private static ValueNode getNodeForRegisterFromFrame(int regNumber, Kind valueKind, ParameterNode hsailFrame, StructuredGraph hostGraph, HotSpotProviders providers, HotSpotVMConfig config) { | |
897 ValueNode valueNode; | |
898 LocationNode location; | |
899 if (regNumber >= HSAIL.s0.number && regNumber <= HSAIL.s31.number) { | |
900 int intSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Int); | |
901 long offset = config.hsailFrameSaveAreaOffset + intSize * (regNumber - HSAIL.s0.number); | |
902 location = ConstantLocationNode.create(FINAL_LOCATION, valueKind, offset, hostGraph); | |
903 } else if (regNumber >= HSAIL.d0.number && regNumber <= HSAIL.d15.number) { | |
904 int longSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Long); | |
905 long offset = config.hsailFrameSaveAreaOffset + longSize * (regNumber - HSAIL.d0.number); | |
906 LocationNode numSRegsLocation = ConstantLocationNode.create(FINAL_LOCATION, Kind.Byte, config.hsailFrameNumSRegOffset, hostGraph); | |
907 ValueNode numSRegs = hostGraph.unique(new FloatingReadNode(hsailFrame, numSRegsLocation, null, StampFactory.forKind(Kind.Byte))); | |
908 location = IndexedLocationNode.create(FINAL_LOCATION, valueKind, offset, numSRegs, hostGraph, 4); | |
909 } else { | |
910 throw GraalInternalError.shouldNotReachHere("unknown hsail register: " + regNumber); | |
911 } | |
912 valueNode = hostGraph.unique(new FloatingReadNode(hsailFrame, location, null, StampFactory.forKind(valueKind))); | |
913 return valueNode; | |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
914 } |
14809
73774616a6b3
Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents:
14804
diff
changeset
|
915 |
10662
4ef92b67aeae
added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
916 } |