annotate graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java @ 15609:66d31e70bd79

HSAIL: fixed deopt bug; cleaned up C++ code Contributed-by: Tom Deneau <tom.deneau@amd.com>
author Doug Simon <doug.simon@oracle.com>
date Tue, 13 May 2014 14:35:15 +0200
parents 9d456ffc6120
children 2208a130d636
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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.*;
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14969
diff changeset
28 import static com.oracle.graal.api.meta.LocationIdentity.*;
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
29 import static com.oracle.graal.compiler.GraalCompiler.*;
15157
f4e31f06b019 Create com.oracle.graal.cfg project and move CFG related files.
Josef Eisl <josef.eisl@jku.at>
parents: 15152
diff changeset
30 import static com.oracle.graal.hotspot.hsail.HSAILHotSpotBackend.Options.*;
f4e31f06b019 Create com.oracle.graal.cfg project and move CFG related files.
Josef Eisl <josef.eisl@jku.at>
parents: 15152
diff changeset
31 import static com.oracle.graal.hotspot.hsail.replacements.HSAILNewObjectSnippets.Options.*;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
32
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
33 import java.lang.reflect.*;
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
34 import java.util.*;
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
35
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
36 import com.amd.okra.*;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
37 import com.oracle.graal.api.code.*;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
38 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
39 import com.oracle.graal.api.code.CallingConvention.Type;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
40 import com.oracle.graal.api.code.CompilationResult.Call;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
41 import com.oracle.graal.api.code.CompilationResult.CodeAnnotation;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
42 import com.oracle.graal.api.code.CompilationResult.DataPatch;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
43 import com.oracle.graal.api.code.CompilationResult.ExceptionHandler;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
44 import com.oracle.graal.api.code.CompilationResult.Infopoint;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
45 import com.oracle.graal.api.code.CompilationResult.Mark;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
46 import com.oracle.graal.api.meta.*;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
47 import com.oracle.graal.asm.*;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
48 import com.oracle.graal.asm.hsail.*;
15193
96bb07a5d667 Spit up and move GraalInternalError.
Josef Eisl <josef.eisl@jku.at>
parents: 15192
diff changeset
49 import com.oracle.graal.compiler.common.*;
15192
644dfe49c0f4 Move packages com.oracle.graal.cfg to com.oracle.graal.compiler.common.cfg.
Josef Eisl <josef.eisl@jku.at>
parents: 15180
diff changeset
50 import com.oracle.graal.compiler.common.cfg.*;
15261
882f4cb7cfcf Move Stamps to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents: 15251
diff changeset
51 import com.oracle.graal.compiler.common.type.*;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
52 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
53 import com.oracle.graal.debug.Debug.Scope;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
54 import com.oracle.graal.gpu.*;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
55 import com.oracle.graal.hotspot.*;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
56 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
57 import com.oracle.graal.hotspot.meta.*;
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
58 import com.oracle.graal.hotspot.nodes.*;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
59 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
60 import com.oracle.graal.java.*;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
61 import com.oracle.graal.lir.*;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
62 import com.oracle.graal.lir.asm.*;
15292
a38d791982e1 Move LIRGenerationResult* to graal.lir.
Josef Eisl <josef.eisl@jku.at>
parents: 15261
diff changeset
63 import com.oracle.graal.lir.gen.*;
10956
563c6d1994c0 added architecture specific frame maps
twisti
parents: 10662
diff changeset
64 import com.oracle.graal.lir.hsail.*;
15177
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
65 import com.oracle.graal.lir.hsail.HSAILControlFlow.DeoptimizingOp;
15251
de1d50c121cd Unsafe.getAndAdd/Set method substitutions
twisti
parents: 15193
diff changeset
66 import com.oracle.graal.lir.hsail.HSAILMove.AtomicReadAndAddOp;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
67 import com.oracle.graal.nodes.*;
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
68 import com.oracle.graal.nodes.StructuredGraph.GuardsStage;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
69 import com.oracle.graal.nodes.extended.*;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
70 import com.oracle.graal.nodes.java.*;
15337
c4be3c1b2d6d Use NodeLIRBuilderTool instead of NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents: 15333
diff changeset
71 import com.oracle.graal.nodes.spi.*;
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
72 import com.oracle.graal.options.*;
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
73 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
74 import com.oracle.graal.phases.tiers.*;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
75
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
76 /**
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
77 * HSAIL specific backend.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
78 */
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
79 public class HSAILHotSpotBackend extends HotSpotBackend {
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
80
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
81 public static class Options {
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
82
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
83 // @formatter:off
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
84 @Option(help = "Number of donor threads for HSAIL kernel dispatch")
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
85 static public final OptionValue<Integer> HsailDonorThreads = new OptionValue<>(4);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
86 // @formatter:on
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
87 }
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
88
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
89 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
90 private final boolean deviceInitialized;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
91 // TODO: get maximum Concurrency from okra
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
92 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
93
12431
7080a96be216 rename: graalRuntime -> runtime, getGraalRuntime -> getRuntime
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
94 public HSAILHotSpotBackend(HotSpotGraalRuntime runtime, HotSpotProviders providers) {
7080a96be216 rename: graalRuntime -> runtime, getGraalRuntime -> getRuntime
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
95 super(runtime, providers);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
96 paramTypeMap.put("HotSpotResolvedPrimitiveType<int>", "s32");
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
97 paramTypeMap.put("HotSpotResolvedPrimitiveType<float>", "f32");
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
98 paramTypeMap.put("HotSpotResolvedPrimitiveType<double>", "f64");
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
99 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
100
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
101 // 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
102 // 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
103 deviceInitialized = OkraUtil.okraLibExists() && initialize();
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
104 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
105
11775
b04b94b71649 Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents: 11739
diff changeset
106 @Override
b04b94b71649 Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents: 11739
diff changeset
107 public boolean shouldAllocateRegisters() {
b04b94b71649 Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents: 11739
diff changeset
108 return true;
b04b94b71649 Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents: 11739
diff changeset
109 }
b04b94b71649 Finished PTX assembler and Register -> Variable conversion
Morris Meyer <morris.meyer@oracle.com>
parents: 11739
diff changeset
110
13308
d3b3c6e17d40 HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents: 13234
diff changeset
111 /**
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
112 * Initializes the GPU device.
14774
8594b26fc5d8 fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents: 14768
diff changeset
113 *
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
114 * @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
115 */
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
116 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
117
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 * 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
120 */
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
121 public boolean isDeviceInitialized() {
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
122 return deviceInitialized;
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
123 }
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
124
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
125 /**
13308
d3b3c6e17d40 HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents: 13234
diff changeset
126 * 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
127 * 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
128 */
12797
5341a7fca039 made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents: 12664
diff changeset
129 @Override
5341a7fca039 made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents: 12664
diff changeset
130 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
131 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
132 HotSpotVMConfig config = getRuntime().getConfig();
13308
d3b3c6e17d40 HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents: 13234
diff changeset
133 // 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
134 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
135 lowerer.initialize(providers, config);
13308
d3b3c6e17d40 HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents: 13234
diff changeset
136
d3b3c6e17d40 HSAIL: added Math intrinsifications
Doug Simon <doug.simon@oracle.com>
parents: 13234
diff changeset
137 // 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
138 HSAILHotSpotReplacementsImpl replacements = (HSAILHotSpotReplacementsImpl) providers.getReplacements();
bdeadcd7101d HSAIL: disable String.equals() substitutions
Doug Simon <doug.simon@oracle.com>
parents: 13900
diff changeset
139 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
140 }
5341a7fca039 made HSAIL reuse HotSpotLoweringProvider, just with a different set of registers
Doug Simon <doug.simon@oracle.com>
parents: 12664
diff changeset
141
11739
b8695542d41b added HSAIL register configuration
Doug Simon <doug.simon@oracle.com>
parents: 10956
diff changeset
142 /**
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
143 * 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
144 */
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
145 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
146 ResolvedJavaMethod javaMethod = getProviders().getMetaAccess().lookupJavaMethod(method);
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
147 HotSpotNmethod nm = installKernel(javaMethod, compileKernel(javaMethod, true));
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
148 try (Scope s = Debug.scope("HostCodeGen")) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
149 if (Debug.isLogEnabled()) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
150 DisassemblerProvider dis = getRuntime().getHostBackend().getDisassembler();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
151 if (dis != null) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
152 String disasm = dis.disassemble(nm);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
153 Debug.log("host code generated for %s%n%s", javaMethod, disasm);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
154 } else {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
155 Debug.log("host code disassembler is null");
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
156 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
157 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
158 } catch (Throwable e) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
159 throw Debug.handle(e);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
160 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
161 return nm;
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
162 }
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
163
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
164 /**
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
165 * 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
166 *
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
167 * @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
168 * 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
169 * {@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
170 * @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
171 */
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
172 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
173 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
174 HotSpotProviders providers = getProviders();
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
175 MetaAccessProvider metaAccess = getProviders().getMetaAccess();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
176
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
177 // 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
178 OptimisticOptimizations optimisticOpts = OptimisticOptimizations.ALL;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
179 optimisticOpts.remove(OptimisticOptimizations.Optimization.UseExceptionProbabilityForOperations);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
180 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
181 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
182 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
183
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
184 // append special HSAILNonNullParametersPhase
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
185 int numArgs = cc.getArguments().length;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
186 graphBuilderSuite.appendPhase(new HSAILNonNullParametersPhase(numArgs));
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
187
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
188 Suites suites = providers.getSuites().getDefaultSuites();
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
189 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
190 new ExternalCompilationResult(), CompilationResultBuilderFactory.Default);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
191
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
192 // this code added to dump infopoints
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
193 try (Scope s = Debug.scope("CodeGen")) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
194 if (Debug.isLogEnabled()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
195 // show infopoints
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
196 List<Infopoint> infoList = hsailCode.getInfopoints();
14774
8594b26fc5d8 fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents: 14768
diff changeset
197 Debug.log("%d HSAIL infopoints", infoList.size());
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
198 for (Infopoint info : infoList) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
199 Debug.log(info.toString());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
200 Debug.log(info.debugInfo.frame().toString());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
201 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
202 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
203 } catch (Throwable e) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
204 throw Debug.handle(e);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
205 }
13784
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 if (makeBinary) {
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
208 if (!deviceInitialized) {
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
209 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
210 }
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
211 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
212 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
213 if (kernel == 0) {
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
214 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
215 }
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
216 hsailCode.setEntryPoint(kernel);
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
217 } catch (Throwable e) {
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
218 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
219 }
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
220 }
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
221 return hsailCode;
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
222 }
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
223
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
224 private static class HSAILNonNullParametersPhase extends Phase {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
225 // 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
226 private int numArgs;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
227
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
228 public HSAILNonNullParametersPhase(int numArgs) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
229 this.numArgs = numArgs;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
230 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
231
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
232 @Override
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
233 protected void run(StructuredGraph graph) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
234 int argCount = 0;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
235 for (ParameterNode param : graph.getNodes(ParameterNode.class)) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
236 argCount++;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
237 if (argCount < numArgs && param.stamp() instanceof ObjectStamp) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
238 param.setStamp(StampFactory.declaredNonNull(((ObjectStamp) param.stamp()).type()));
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
239 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
240 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
241 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
242 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
243
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
244 /**
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
245 * 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
246 */
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
247 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
248
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
249 /**
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
250 * 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
251 * 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
252 * the installed code.
14774
8594b26fc5d8 fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents: 14768
diff changeset
253 *
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
254 * @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
255 * @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
256 */
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
257 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
258 assert hsailCode.getEntryPoint() != 0L;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
259 // code below here lifted from HotSpotCodeCacheProviders.addExternalMethod
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
260 // used to be return getProviders().getCodeCache().addExternalMethod(method, hsailCode);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
261 HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) method;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
262 if (hsailCode.getId() == -1) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
263 hsailCode.setId(javaMethod.allocateCompileId(hsailCode.getEntryBCI()));
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
264 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
265 CompilationResult compilationResult = hsailCode;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
266 StructuredGraph hostGraph = hsailCode.getHostGraph();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
267 if (hostGraph != null) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
268 // 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
269 try (Scope ds = Debug.scope("GeneratingHostGraph")) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
270 HotSpotBackend hostBackend = getRuntime().getHostBackend();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
271 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
272 Debug.log("Param count: %d", parameterTypes.length);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
273 for (int i = 0; i < parameterTypes.length; i++) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
274 ParameterNode parameter = hostGraph.getParameter(i);
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
275 Debug.log("Param [%d]=%s", i, parameter);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
276 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
277 Debug.log(" %s", parameterTypes[i]);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
278 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
279 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
280 hostBackend.getTarget(), false);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
281 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
282 hostBackend.getProviders().getSuites().getDefaultGraphBuilderSuite(), OptimisticOptimizations.NONE, null, null,
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
283 hostBackend.getProviders().getSuites().getDefaultSuites(), new CompilationResult(), CompilationResultBuilderFactory.Default);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
284 compilationResult = merge(hostCode, hsailCode);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
285 } catch (Throwable e) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
286 throw Debug.handle(e);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
287 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
288 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
289
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
290 HSAILHotSpotNmethod code = new HSAILHotSpotNmethod(javaMethod, hsailCode.getName(), false, true);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
291 code.setOopMapArray(hsailCode.getOopMapArray());
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
292 HotSpotCompiledNmethod compiled = new HotSpotCompiledNmethod(getTarget(), javaMethod, compilationResult);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
293 CodeInstallResult result = getRuntime().getCompilerToVM().installCode(compiled, code, null);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
294 if (result != CodeInstallResult.OK) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
295 return null;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
296 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
297 return code;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
298 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
299
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
300 private static ExternalCompilationResult merge(CompilationResult hostCode, ExternalCompilationResult hsailCode) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
301 ExternalCompilationResult result = new ExternalCompilationResult();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
302
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
303 // from hsail code
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
304 result.setEntryPoint(hsailCode.getEntryPoint());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
305 result.setId(hsailCode.getId());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
306 result.setEntryBCI(hsailCode.getEntryBCI());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
307 assert hsailCode.getMarks().isEmpty();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
308 assert hsailCode.getExceptionHandlers().isEmpty();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
309 assert hsailCode.getDataReferences().isEmpty();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
310
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
311 // from host code
15180
7a9531f50cd8 renamed com.oracle.graal.api.code.CompilationResult.frameSize to totalFrameSize
twisti
parents: 15177
diff changeset
312 result.setTotalFrameSize(hostCode.getTotalFrameSize());
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
313 result.setCustomStackAreaOffset(hostCode.getCustomStackAreaOffset());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
314 result.setRegisterRestoreEpilogueOffset(hostCode.getRegisterRestoreEpilogueOffset());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
315 result.setTargetCode(hostCode.getTargetCode(), hostCode.getTargetCodeSize());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
316 for (CodeAnnotation annotation : hostCode.getAnnotations()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
317 result.addAnnotation(annotation);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
318 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
319 for (Mark mark : hostCode.getMarks()) {
15375
1b82cd9e72e9 Remove CompilationResult.Mark.references
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15338
diff changeset
320 result.recordMark(mark.pcOffset, mark.id);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
321 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
322 for (ExceptionHandler handler : hostCode.getExceptionHandlers()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
323 result.recordExceptionHandler(handler.pcOffset, handler.handlerPos);
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 for (DataPatch patch : hostCode.getDataReferences()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
326 if (patch.data != null) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
327 if (patch.inline) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
328 result.recordInlineData(patch.pcOffset, patch.data);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
329 } else {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
330 result.recordDataReference(patch.pcOffset, patch.data);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
331 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
332 }
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 for (Infopoint infopoint : hostCode.getInfopoints()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
335 if (infopoint instanceof Call) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
336 Call call = (Call) infopoint;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
337 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
338 } else {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
339 result.recordInfopoint(infopoint.pcOffset, infopoint.debugInfo, infopoint.reason);
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 // merged
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
344 Assumptions mergedAssumptions = new Assumptions(true);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
345 if (hostCode.getAssumptions() != null) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
346 for (Assumption assumption : hostCode.getAssumptions().getAssumptions()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
347 if (assumption != null) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
348 mergedAssumptions.record(assumption);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
349 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
350 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
351 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
352 if (hsailCode.getAssumptions() != null) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
353 for (Assumption assumption : hsailCode.getAssumptions().getAssumptions()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
354 if (assumption != null) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
355 mergedAssumptions.record(assumption);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
356 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
357 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
358 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
359 if (!mergedAssumptions.isEmpty()) {
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
360 result.setAssumptions(mergedAssumptions);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
361 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
362 return result;
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
363 }
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
364
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
365 private static final ThreadLocal<DonorThreadPool> donorThreadPool = new ThreadLocal<DonorThreadPool>() {
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
366 @Override
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
367 protected DonorThreadPool initialValue() {
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
368 return new DonorThreadPool();
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
369 }
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
370 };
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
371
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
372 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
373 if (!deviceInitialized) {
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
374 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
375 }
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
376 int[] oopMapArray = ((HSAILHotSpotNmethod) kernel).getOopMapArray();
15609
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
377 Object[] oopsSaveArea;
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
378 if (getRuntime().getConfig().useHSAILDeoptimization) {
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
379 int saveAreaCounts = OopMapArrayBuilder.getSaveAreaCounts(oopMapArray);
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
380 int numDRegs = (saveAreaCounts >> 8) & 0xff;
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
381 int numStackSlots = (saveAreaCounts >> 16);
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
382 // pessimistically assume that any of the DRegs or stackslots could be oops
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
383 oopsSaveArea = new Object[maxDeoptIndex * (numDRegs + numStackSlots)];
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
384 } else {
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
385 oopsSaveArea = null;
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
386 }
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
387 return executeKernel0(kernel, jobSize, args, oopsSaveArea, donorThreadPool.get().getThreads(), HsailAllocBytesPerWorkitem.getValue(), oopMapArray);
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
388 }
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
389
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
390 private static native boolean executeKernel0(HotSpotInstalledCode kernel, int jobSize, Object[] args, Object[] oopsSave, Thread[] donorThreads, int allocBytesPerWorkitem, int[] oopMapArray)
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
391 throws InvalidInstalledCodeException;
13819
49db2c1e3bee added support for co-existing GPU backends (JBS:GRAAL-1)
Doug Simon <doug.simon@oracle.com>
parents: 13784
diff changeset
392
13784
219a84093dda moved HSAIL compilation harness logic into HSAILHotSpotBackend and deleted HSAILCompilationResult
Doug Simon <doug.simon@oracle.com>
parents: 13318
diff changeset
393 /**
11739
b8695542d41b added HSAIL register configuration
Doug Simon <doug.simon@oracle.com>
parents: 10956
diff changeset
394 * 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
395 */
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
396 @Override
15011
c8e575742f36 allow compilation with custom RegisterConfig
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14991
diff changeset
397 public FrameMap newFrameMap(RegisterConfig registerConfig) {
c8e575742f36 allow compilation with custom RegisterConfig
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14991
diff changeset
398 return new HSAILFrameMap(getCodeCache(), registerConfig);
10956
563c6d1994c0 added architecture specific frame maps
twisti
parents: 10662
diff changeset
399 }
563c6d1994c0 added architecture specific frame maps
twisti
parents: 10662
diff changeset
400
563c6d1994c0 added architecture specific frame maps
twisti
parents: 10662
diff changeset
401 @Override
15333
06ecedffb109 Use LIRGeneratorTool in Backend.
Josef Eisl <josef.eisl@jku.at>
parents: 15311
diff changeset
402 public LIRGeneratorTool newLIRGenerator(CallingConvention cc, LIRGenerationResult lirGenRes) {
14846
43cd57700476 Apply LIRGenerator refactoring to HSAIL backend.
Josef Eisl <josef.eisl@jku.at>
parents: 14809
diff changeset
403 return new HSAILHotSpotLIRGenerator(getProviders(), getRuntime().getConfig(), cc, lirGenRes);
14809
73774616a6b3 Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents: 14804
diff changeset
404 }
73774616a6b3 Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents: 14804
diff changeset
405
73774616a6b3 Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents: 14804
diff changeset
406 @Override
73774616a6b3 Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents: 14804
diff changeset
407 public LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
408 return new HSAILHotSpotLIRGenerationResult(lir, frameMap);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
409 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
410
14846
43cd57700476 Apply LIRGenerator refactoring to HSAIL backend.
Josef Eisl <josef.eisl@jku.at>
parents: 14809
diff changeset
411 @Override
15338
5e544920ad9f Rename Backend.newNodeLIRGenerator to Backend.newNodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents: 15337
diff changeset
412 public NodeLIRBuilderTool newNodeLIRBuilder(StructuredGraph graph, LIRGeneratorTool lirGen) {
14921
88dfaf6448e0 Remove LIRGenerationResult from NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents: 14888
diff changeset
413 return new HSAILHotSpotNodeLIRBuilder(graph, lirGen);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
414 }
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 class HotSpotFrameContext implements FrameContext {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
417
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
418 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
419 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
420 }
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
421
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
422 @Override
13227
1a66453f73db renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents: 13105
diff changeset
423 public void enter(CompilationResultBuilder crb) {
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
424 Debug.log("Nothing to do here");
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
425 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
426
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
427 @Override
13227
1a66453f73db renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents: 13105
diff changeset
428 public void leave(CompilationResultBuilder crb) {
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
429 Debug.log("Nothing to do here");
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
430 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
431 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
432
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
433 /**
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
434 * a class to allow us to save lirGen.
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
435 */
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
436 static class HSAILCompilationResultBuilder extends CompilationResultBuilder {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
437 public HSAILHotSpotLIRGenerationResult lirGenRes;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
438
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
439 public HSAILCompilationResultBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, FrameContext frameContext,
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
440 CompilationResult compilationResult, HSAILHotSpotLIRGenerationResult lirGenRes) {
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
441 super(codeCache, foreignCalls, frameMap, asm, frameContext, compilationResult);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
442 this.lirGenRes = lirGenRes;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
443 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
444 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
445
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
446 static class HSAILHotSpotNmethod extends HotSpotNmethod {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
447 private int[] oopMapArray;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
448
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
449 HSAILHotSpotNmethod(HotSpotResolvedJavaMethod method, String name, boolean isDefault, boolean isExternal) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
450 super(method, name, isDefault, isExternal);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
451 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
452
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
453 void setOopMapArray(int[] array) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
454 oopMapArray = array;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
455 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
456
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
457 int[] getOopMapArray() {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
458 return oopMapArray;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
459 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
460 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
461
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
462 @Override
14032
d1c1f103d42c renamed com.oracle.graal.asm.AbstractAssembler to com.oracle.graal.asm.Assembler
twisti
parents: 14031
diff changeset
463 protected Assembler createAssembler(FrameMap frameMap) {
15018
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15011
diff changeset
464 return new HSAILHotSpotAssembler(getTarget());
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
465 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
466
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
467 @Override
14809
73774616a6b3 Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents: 14804
diff changeset
468 public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRes, CompilationResult compilationResult, CompilationResultBuilderFactory factory) {
73774616a6b3 Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents: 14804
diff changeset
469 FrameMap frameMap = lirGenRes.getFrameMap();
14032
d1c1f103d42c renamed com.oracle.graal.asm.AbstractAssembler to com.oracle.graal.asm.Assembler
twisti
parents: 14031
diff changeset
470 Assembler masm = createAssembler(frameMap);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
471 HotSpotFrameContext frameContext = new HotSpotFrameContext();
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
472 // save lirGen for later use by setHostGraph
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
473 CompilationResultBuilder crb = new HSAILCompilationResultBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, frameContext, compilationResult,
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
474 (HSAILHotSpotLIRGenerationResult) lirGenRes);
15180
7a9531f50cd8 renamed com.oracle.graal.api.code.CompilationResult.frameSize to totalFrameSize
twisti
parents: 15177
diff changeset
475 crb.setTotalFrameSize(frameMap.totalFrameSize());
13227
1a66453f73db renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents: 13105
diff changeset
476 return crb;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
477 }
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 @Override
14065
5dec26f3d4a4 Use LIR instead of LIRGenerator as parameter in emitCode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14032
diff changeset
480 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
481 assert method != null : lir + " is not associated with a method";
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
482 Kind wordKind = getProviders().getCodeCache().getTarget().wordKind;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
483
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
484 HotSpotVMConfig config = getRuntime().getConfig();
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
485 boolean useHSAILDeoptimization = config.useHSAILDeoptimization;
15177
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
486 boolean useHSAILSafepoints = config.useHSAILSafepoints;
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
487
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
488 // see what graph nodes we have to see if we are using the thread register
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
489 // if not, we don't have to emit the code that sets that up
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
490 // maybe there is a better way to do this?
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
491 boolean usesThreadRegister = false;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
492 search: for (AbstractBlock<?> b : lir.linearScanOrder()) {
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
493 for (LIRInstruction op : lir.getLIRforBlock(b)) {
15251
de1d50c121cd Unsafe.getAndAdd/Set method substitutions
twisti
parents: 15193
diff changeset
494 if (op instanceof AtomicReadAndAddOp) {
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
495 usesThreadRegister = true;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
496 assert useHSAILDeoptimization : "cannot use thread register if HSAIL deopt support is disabled";
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
497 break search;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
498 }
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
499 }
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
500 }
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
501
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
502 // Emit the prologue.
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
503 HSAILAssembler asm = (HSAILAssembler) crb.asm;
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
504 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
505
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
506 Signature signature = method.getSignature();
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
507 int sigParamCount = signature.getParameterCount(false);
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
508 // 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
509
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
510 int nonConstantParamCount = sigParamCount - 1;
15311
820c6d353358 added ModifiersProvider as superinterface for ResolvedJava[Method|Field|Type] and implemented all checks against modifiers as default methods
Doug Simon <doug.simon@oracle.com>
parents: 15292
diff changeset
511 boolean isStatic = (method.isStatic());
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
512 // Determine if this is an object lambda.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
513 boolean isObjectLambda = true;
13105
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
514
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
515 if (signature.getParameterType(nonConstantParamCount, null).getKind() == Kind.Int) {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
516 isObjectLambda = false;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
517 } else {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
518 // Add space for gid int reg.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
519 nonConstantParamCount++;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
520 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
521
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
522 // 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
523 // as the first parameter.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
524 if (!isStatic) {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
525 nonConstantParamCount++;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
526 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
527 // Add in any "constant" parameters (currently none).
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
528 int totalParamCount = nonConstantParamCount;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
529 JavaType[] paramtypes = new JavaType[totalParamCount];
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
530 String[] paramNames = new String[totalParamCount];
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
531 int pidx = 0;
13105
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
532 MetaAccessProvider metaAccess = getProviders().getMetaAccess();
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
533 for (int i = 0; i < totalParamCount; i++) {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
534 if (i == 0 && !isStatic) {
12363
78e5badf4b8e moved lookupForeignCall() from CodeCacheProvider to ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12045
diff changeset
535 paramtypes[i] = metaAccess.lookupJavaType(Object.class);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
536 paramNames[i] = "%_this";
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
537 } else if (i < nonConstantParamCount) {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
538 if (isObjectLambda && (i == (nonConstantParamCount))) {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
539 // 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
540 paramtypes[i] = metaAccess.lookupJavaType(int.class);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
541 paramNames[i] = "%_gid";
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
542 } else {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
543 paramtypes[i] = signature.getParameterType(pidx++, null);
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
544 paramNames[i] = "%_arg" + i;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
545 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
546 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
547 }
13105
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
548
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
549 asm.emitString0("// " + (isStatic ? "static" : "instance") + " method " + method + "\n");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
550 asm.emitString0("kernel &run ( \n");
13105
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
551
13227
1a66453f73db renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents: 13105
diff changeset
552 FrameMap frameMap = crb.frameMap;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
553 RegisterConfig regConfig = frameMap.registerConfig;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
554 // 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
555 JavaType[] ccParamTypes = new JavaType[nonConstantParamCount + 1];
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
556 // Include the gid.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
557 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
558
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
559 // 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
560 // 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
561 if (sigParamCount > 0) {
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
562 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
563 }
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
564 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
565
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
566 /**
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
567 * 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
568 * (which is the gid).
14774
8594b26fc5d8 fixed incorrect uses of Debug.log API
Doug Simon <doug.simon@oracle.com>
parents: 14768
diff changeset
569 *
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
570 */
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
571 String[] paramHsailSizes = new String[totalParamCount];
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
572 for (int i = 0; i < totalParamCount; i++) {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
573 String paramtypeStr = paramtypes[i].toString();
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
574 String sizeStr = paramTypeMap.get(paramtypeStr);
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
575 // 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
576 paramHsailSizes[i] = (sizeStr != null ? sizeStr : "u64");
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
577 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
578 // Emit the kernel function parameters.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
579 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
580 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
581
14969
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
582 if (useHSAILDeoptimization || (i != totalParamCount - 1)) {
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
583 str += ",";
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
584 }
14031
390c4b742890 made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents: 13902
diff changeset
585 asm.emitString(str);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
586 }
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
587
14969
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
588 if (useHSAILDeoptimization) {
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
589 // add in the deoptInfo parameter
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
590 asm.emitString("kernarg_u64 " + asm.getDeoptInfoName());
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
591 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
592
14031
390c4b742890 made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents: 13902
diff changeset
593 asm.emitString(") {");
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
594
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
595 /*
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
596 * 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
597 * 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
598 * loaded up front but will be loaded as needed.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
599 */
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
600 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
601 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
602 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
603
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
604 /*
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
605 * 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
606 * 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
607 */
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
608 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
609 asm.emitString("workitemabsid_u32 " + workItemReg + ", 0;");
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
610
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
611 final String deoptInProgressLabel = "@LHandleDeoptInProgress";
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
612
14969
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
613 if (useHSAILDeoptimization) {
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
614 // Aliases for d16
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
615 RegisterValue d16_deoptInfo = HSAIL.d16.asValue(wordKind);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
616 RegisterValue d16_donorThreads = d16_deoptInfo;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
617
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
618 // Aliases for d17
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
619 RegisterValue d17_donorThreadIndex = HSAIL.d17.asValue(wordKind);
15177
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
620 RegisterValue d17_safepointFlagAddrIndex = d17_donorThreadIndex;
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
621
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
622 // Aliases for s34
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
623 RegisterValue s34_deoptOccurred = HSAIL.s34.asValue(Kind.Int);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
624 RegisterValue s34_donorThreadIndex = s34_deoptOccurred;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
625
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
626 asm.emitLoadKernelArg(d16_deoptInfo, asm.getDeoptInfoName(), "u64");
15177
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
627 asm.emitComment("// Check if a deopt or safepoint has occurred and abort if true before doing any work");
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
628
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
629 if (useHSAILSafepoints) {
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
630 // Load address of _notice_safepoints field
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
631 asm.emitLoad(wordKind, d17_safepointFlagAddrIndex, new HSAILAddressValue(wordKind, d16_deoptInfo, config.hsailNoticeSafepointsOffset).toAddress());
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
632 // Load int value from that field
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
633 asm.emitLoadAcquire(s34_deoptOccurred, new HSAILAddressValue(Kind.Int, d17_safepointFlagAddrIndex, 0).toAddress());
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
634 asm.emitCompare(Kind.Int, s34_deoptOccurred, Constant.forInt(0), "ne", false, false);
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
635 asm.cbr(deoptInProgressLabel);
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
636 }
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
637 asm.emitLoadAcquire(s34_deoptOccurred, new HSAILAddressValue(Kind.Int, d16_deoptInfo, config.hsailDeoptOccurredOffset).toAddress());
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
638 asm.emitCompare(Kind.Int, s34_deoptOccurred, Constant.forInt(0), "ne", false, false);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
639 asm.cbr(deoptInProgressLabel);
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
640 // load thread register if needed
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
641 if (usesThreadRegister) {
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
642 assert HsailDonorThreads.getValue() > 0;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
643 asm.emitLoad(wordKind, d16_donorThreads, new HSAILAddressValue(wordKind, d16_deoptInfo, config.hsailDonorThreadsOffset).toAddress());
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
644 if (HsailDonorThreads.getValue() != 1) {
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
645 asm.emitComment("// map workitem to a donor thread");
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
646 asm.emitString(String.format("rem_u32 $%s, %s, %d;", s34_donorThreadIndex.getRegister(), workItemReg, HsailDonorThreads.getValue()));
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
647 asm.emitConvert(d17_donorThreadIndex, s34_donorThreadIndex, wordKind, Kind.Int);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
648 asm.emit("mad", d16_donorThreads, d17_donorThreadIndex, Constant.forInt(8), d16_donorThreads);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
649 } else {
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
650 // workitem is already mapped to solitary donor thread
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
651 }
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
652 AllocatableValue threadRegValue = getProviders().getRegisters().getThreadRegister().asValue(wordKind);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
653 asm.emitComment("// $" + getProviders().getRegisters().getThreadRegister() + " will point to a donor thread for this workitem");
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
654 asm.emitLoad(wordKind, threadRegValue, new HSAILAddressValue(wordKind, d16_donorThreads).toAddress());
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
655 }
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
656 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
657
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
658 /*
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
659 * 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
660 * 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
661 * 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
662 */
14031
390c4b742890 made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents: 13902
diff changeset
663 int spillsegDeclarationPosition = asm.position() + 1;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
664 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
665 asm.emitString(spillsegTemplate);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
666 // Emit object array load prologue here.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
667 if (isObjectLambda) {
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
668 boolean useCompressedOops = config.useCompressedOops;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
669 final int arrayElementsOffset = HotSpotGraalRuntime.getArrayBaseOffset(wordKind);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
670 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
671 // 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
672 // 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
673 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
674 // 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
675 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
676 // 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
677 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
678 // 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
679 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
680 // 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
681 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
682 // 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
683 if (useCompressedOops) {
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
684
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
685 // 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
686 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
687
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
688 long narrowOopBase = config.narrowOopBase;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
689 long narrowOopShift = config.narrowOopShift;
13105
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
690
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
691 if (narrowOopBase == 0 && narrowOopShift == 0) {
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
692 // 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
693 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
694 } else {
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
695 if (narrowOopBase == 0) {
14031
390c4b742890 made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents: 13902
diff changeset
696 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
697 } else if (narrowOopShift == 0) {
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
698 // 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
699 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
700 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
701 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
702 } else {
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
703 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
704 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
705 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
706 }
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
707 }
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
708
d3fc35a43376 HSAIL: addressed issues in JUnit tests
Doug Simon <doug.simon@oracle.com>
parents: 12797
diff changeset
709 } else {
14031
390c4b742890 made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents: 13902
diff changeset
710 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
711 }
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
712 }
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
713 // 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
714 crb.emit(lir);
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
715 // 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
716 long maxStackSize = ((HSAILAssembler) crb.asm).upperBoundStackSize();
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
717 String spillsegStringFinal;
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
718 if (maxStackSize == 0) {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
719 // If no spilling, get rid of spillseg declaration.
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
720 char[] array = new char[spillsegTemplate.length()];
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
721 Arrays.fill(array, ' ');
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
722 spillsegStringFinal = new String(array);
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
723 } else {
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
724 spillsegStringFinal = spillsegTemplate.replace("123456", String.format("%6d", maxStackSize));
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
725 }
14031
390c4b742890 made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents: 13902
diff changeset
726 asm.emitString(spillsegStringFinal, spillsegDeclarationPosition);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
727 // Emit the epilogue.
14031
390c4b742890 made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents: 13902
diff changeset
728
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
729 int numSRegs = 0;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
730 int numDRegs = 0;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
731 int numStackSlotBytes = 0;
14969
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
732 if (useHSAILDeoptimization) {
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
733 // get the union of registers and stack slots needed to be saved at the infopoints
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
734 // while doing this compute the highest register in each category
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
735 HSAILHotSpotRegisterConfig hsailRegConfig = (HSAILHotSpotRegisterConfig) regConfig;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
736 Set<Register> infoUsedRegs = new TreeSet<>();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
737 Set<StackSlot> infoUsedStackSlots = new HashSet<>();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
738 List<Infopoint> infoList = crb.compilationResult.getInfopoints();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
739 for (Infopoint info : infoList) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
740 BytecodeFrame frame = info.debugInfo.frame();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
741 while (frame != null) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
742 for (int i = 0; i < frame.numLocals + frame.numStack; i++) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
743 Value val = frame.values[i];
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
744 if (isLegal(val)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
745 if (isRegister(val)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
746 Register reg = asRegister(val);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
747 infoUsedRegs.add(reg);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
748 if (hsailRegConfig.isAllocatableSReg(reg)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
749 numSRegs = Math.max(numSRegs, reg.encoding + 1);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
750 } else if (hsailRegConfig.isAllocatableDReg(reg)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
751 numDRegs = Math.max(numDRegs, reg.encoding + 1);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
752 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
753 } else if (isStackSlot(val)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
754 StackSlot slot = asStackSlot(val);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
755 Kind slotKind = slot.getKind();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
756 int slotSizeBytes = (slotKind.isObject() ? 8 : slotKind.getByteCount());
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
757 int slotOffsetMax = HSAIL.getStackOffsetStart(slot, slotSizeBytes * 8) + slotSizeBytes;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
758 numStackSlotBytes = Math.max(numStackSlotBytes, slotOffsetMax);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
759 infoUsedStackSlots.add(slot);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
760 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
761 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
762 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
763 frame = frame.caller();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
764 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
765 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
766
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
767 // round up numSRegs to even number so dregs start on aligned boundary
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
768 numSRegs += (numSRegs & 1);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
769
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
770 // numStackSlots is the number of 8-byte locations used for stack variables
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
771 int numStackSlots = (numStackSlotBytes + 7) / 8;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
772
15609
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
773 final int offsetToDeoptSaveStates = config.hsailDeoptimizationInfoHeaderSize;
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
774 final int bytesPerSaveArea = 4 * numSRegs + 8 * numDRegs + 8 * numStackSlots;
15545
9d456ffc6120 HSAIL: fixed Windows build
Doug Simon <doug.simon@oracle.com>
parents: 15482
diff changeset
775 final int sizeofKernelDeopt = config.hsailKernelDeoptimizationHeaderSize + config.hsailFrameHeaderSize + bytesPerSaveArea;
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
776 final int offsetToNeverRanArray = config.hsailNeverRanArrayOffset;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
777 final int offsetToDeoptNextIndex = config.hsailDeoptNextIndexOffset;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
778 final int offsetToDeoptimizationWorkItem = config.hsailDeoptimizationWorkItem;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
779 final int offsetToDeoptimizationReason = config.hsailDeoptimizationReason;
15545
9d456ffc6120 HSAIL: fixed Windows build
Doug Simon <doug.simon@oracle.com>
parents: 15482
diff changeset
780 final int offsetToDeoptimizationFrame = config.hsailKernelDeoptimizationHeaderSize;
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
781 final int offsetToFramePc = config.hsailFramePcOffset;
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
782 final int offsetToNumSaves = config.hsailFrameNumSRegOffset;
15545
9d456ffc6120 HSAIL: fixed Windows build
Doug Simon <doug.simon@oracle.com>
parents: 15482
diff changeset
783 final int offsetToSaveArea = config.hsailFrameHeaderSize;
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
784
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
785 AllocatableValue scratch64 = HSAIL.d16.asValue(wordKind);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
786 AllocatableValue cuSaveAreaPtr = HSAIL.d17.asValue(wordKind);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
787 AllocatableValue waveMathScratch1 = HSAIL.d18.asValue(wordKind);
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
788 AllocatableValue waveMathScratch2 = HSAIL.d19.asValue(wordKind);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
789
15177
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
790 AllocatableValue actionAndReasonReg = HSAIL.actionAndReasonReg.asValue(Kind.Int);
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
791 AllocatableValue codeBufferOffsetReg = HSAIL.codeBufferOffsetReg.asValue(Kind.Int);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
792 AllocatableValue scratch32 = HSAIL.s34.asValue(Kind.Int);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
793 AllocatableValue workidreg = HSAIL.s35.asValue(Kind.Int);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
794
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
795 HSAILAddress deoptNextIndexAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeoptNextIndex).toAddress();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
796 HSAILAddress neverRanArrayAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToNeverRanArray).toAddress();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
797
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
798 // 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
799 asm.emitString0(deoptInProgressLabel + ":\n");
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
800 asm.emitLoad(wordKind, waveMathScratch1, neverRanArrayAddr);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
801 asm.emitWorkItemAbsId(workidreg);
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
802 asm.emitConvert(waveMathScratch2, workidreg, wordKind, Kind.Int);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
803 asm.emit("add", waveMathScratch1, waveMathScratch1, waveMathScratch2);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
804 HSAILAddress neverRanStoreAddr = new HSAILAddressValue(Kind.Byte, waveMathScratch1, 0).toAddress();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
805 asm.emitStore(Kind.Byte, Constant.forInt(1), neverRanStoreAddr);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
806 asm.emitString("ret;");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
807
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
808 // The deoptimizing lanes will jump here
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
809 asm.emitString0(asm.getDeoptLabelName() + ":\n");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
810 String labelExit = asm.getDeoptLabelName() + "_Exit";
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
811
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
812 HSAILAddress deoptInfoAddr = new HSAILAddressValue(Kind.Int, scratch64, config.hsailDeoptOccurredOffset).toAddress();
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
813 asm.emitLoadKernelArg(scratch64, asm.getDeoptInfoName(), "u64");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
814
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
815 // Set deopt occurred flag
14945
b14cb2d9253d Make compression and uncompression explicit in the high level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 14921
diff changeset
816 asm.emitMov(Kind.Int, scratch32, Constant.forInt(1));
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
817 asm.emitStoreRelease(scratch32, deoptInfoAddr);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
818
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
819 asm.emitComment("// Determine next deopt save slot");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
820 asm.emitAtomicAdd(scratch32, deoptNextIndexAddr, Constant.forInt(1));
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
821 // scratch32 now holds next index to use
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
822 // set error condition if no room in save area
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
823 asm.emitComment("// assert room to save deopt");
15024
2ee777221036 Use high level CompressionNode in lowering of CompareAndSwapNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
824 asm.emitCompare(Kind.Int, scratch32, Constant.forInt(maxDeoptIndex), "lt", false, false);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
825 asm.cbr("@L_StoreDeopt");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
826 // 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
827 // flag
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
828 asm.emitWorkItemAbsId(scratch32);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
829 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
830 asm.emitStore(scratch32, deoptInfoAddr);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
831 asm.emitString("ret;");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
832
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
833 asm.emitString0("@L_StoreDeopt" + ":\n");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
834
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
835 // 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
836
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
837 asm.emitComment("// Convert id's for ptr math");
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
838 asm.emitConvert(cuSaveAreaPtr, scratch32, wordKind, Kind.Int);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
839 asm.emitComment("// multiply by sizeof KernelDeoptArea");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
840 asm.emit("mul", cuSaveAreaPtr, cuSaveAreaPtr, Constant.forInt(sizeofKernelDeopt));
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
841 asm.emitComment("// Add computed offset to deoptInfoPtr base");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
842 asm.emit("add", cuSaveAreaPtr, cuSaveAreaPtr, scratch64);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
843 // Add offset to _deopt_save_states[0]
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
844 asm.emit("add", scratch64, cuSaveAreaPtr, Constant.forInt(offsetToDeoptSaveStates));
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
845
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
846 HSAILAddress workItemAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeoptimizationWorkItem).toAddress();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
847 HSAILAddress actionReasonStoreAddr = new HSAILAddressValue(Kind.Int, scratch64, offsetToDeoptimizationReason).toAddress();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
848
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
849 asm.emitComment("// Get _deopt_info._first_frame");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
850 asm.emit("add", waveMathScratch1, scratch64, Constant.forInt(offsetToDeoptimizationFrame));
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
851 // Now scratch64 is the _deopt_info._first_frame
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
852 HSAILAddress pcStoreAddr = new HSAILAddressValue(Kind.Int, waveMathScratch1, offsetToFramePc).toAddress();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
853 HSAILAddress regCountsAddr = new HSAILAddressValue(Kind.Int, waveMathScratch1, offsetToNumSaves).toAddress();
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
854 asm.emitComment("// store deopting workitem");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
855 asm.emitWorkItemAbsId(scratch32);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
856 asm.emitStore(Kind.Int, scratch32, workItemAddr);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
857 asm.emitComment("// store actionAndReason");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
858 asm.emitStore(Kind.Int, actionAndReasonReg, actionReasonStoreAddr);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
859 asm.emitComment("// store PC");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
860 asm.emitStore(Kind.Int, codeBufferOffsetReg, pcStoreAddr);
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
861
15609
66d31e70bd79 HSAIL: fixed deopt bug; cleaned up C++ code
Doug Simon <doug.simon@oracle.com>
parents: 15545
diff changeset
862 asm.emitComment("// store regCounts (" + numSRegs + " $s registers, " + numDRegs + " $d registers, " + numStackSlots + " stack slots)");
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
863 asm.emitStore(Kind.Int, Constant.forInt(numSRegs + (numDRegs << 8) + (numStackSlots << 16)), regCountsAddr);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
864
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
865 // loop thru the usedValues storing each of the registers that are used.
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
866 // we always store in a fixed location, even if some registers are skipped
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
867 asm.emitComment("// store used regs");
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
868 for (Register reg : infoUsedRegs) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
869 if (hsailRegConfig.isAllocatableSReg(reg)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
870 // 32 bit registers
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
871 Kind kind = Kind.Int;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
872 int ofst = offsetToSaveArea + reg.encoding * 4;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
873 HSAILAddress addr = new HSAILAddressValue(kind, waveMathScratch1, ofst).toAddress();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
874 AllocatableValue regValue = reg.asValue(kind);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
875 asm.emitStore(kind, regValue, addr);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
876 } else if (hsailRegConfig.isAllocatableDReg(reg)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
877 // 64 bit registers
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
878 Kind kind = Kind.Long;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
879 // d reg ofst starts past the 32 sregs
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
880 int ofst = offsetToSaveArea + (numSRegs * 4) + reg.encoding * 8;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
881 HSAILAddress addr = new HSAILAddressValue(kind, waveMathScratch1, ofst).toAddress();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
882 AllocatableValue regValue = reg.asValue(kind);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
883 asm.emitStore(kind, regValue, addr);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
884 } else {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
885 throw GraalInternalError.unimplemented();
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
886 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
887 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
888
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
889 // loop thru the usedStackSlots creating instructions to save in the save area
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
890 if (numStackSlotBytes > 0) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
891 asm.emitComment("// store stack slots (uses " + numStackSlotBytes + " bytes)");
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
892 for (StackSlot slot : infoUsedStackSlots) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
893 asm.emitComment("// store " + slot);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
894 Kind kind = slot.getKind();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
895 int sizeInBits = (kind.isObject() || kind.getByteCount() == 8 ? 64 : 32);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
896 int ofst = offsetToSaveArea + (numSRegs * 4) + (numDRegs * 8) + HSAIL.getStackOffsetStart(slot, sizeInBits);
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
897 HSAILAddress addr = new HSAILAddressValue(kind, waveMathScratch1, ofst).toAddress();
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
898 if (sizeInBits == 64) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
899 asm.emitSpillLoad(kind, scratch64, slot);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
900 asm.emitStore(kind, scratch64, addr);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
901 } else {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
902 asm.emitSpillLoad(kind, scratch32, slot);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
903 asm.emitStore(kind, scratch32, addr);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
904 }
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
905 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
906 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
907
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
908 asm.emitString0(labelExit + ":\n");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
909
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
910 // and emit the return
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
911 crb.frameContext.leave(crb);
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
912 asm.exit();
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
913 // build the oopMap Array
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
914 int[] oopMapArray = new OopMapArrayBuilder().build(infoList, numSRegs, numDRegs, numStackSlots, hsailRegConfig);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
915 ((ExternalCompilationResult) crb.compilationResult).setOopMapArray(oopMapArray);
14969
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
916 } else {
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
917 // Deoptimization is explicitly off, so emit simple return
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
918 asm.emitString0(asm.getDeoptLabelName() + ":\n");
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
919 asm.emitComment("// No deoptimization");
a6c144380ce7 HSAIL: added UseHSAILDeoptimization VM option for disabling HSAIL deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14945
diff changeset
920 asm.emitString("ret;");
14768
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
921 }
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
922
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
923 asm.emitString0("}; \n");
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
924
3e9a960f0da1 HSAIL: preliminary deopt support
Doug Simon <doug.simon@oracle.com>
parents: 14143
diff changeset
925 ExternalCompilationResult compilationResult = (ExternalCompilationResult) crb.compilationResult;
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
926 HSAILHotSpotLIRGenerationResult lirGenRes = ((HSAILCompilationResultBuilder) crb).lirGenRes;
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
927 compilationResult.setHostGraph(prepareHostGraph(method, lirGenRes.getDeopts(), getProviders(), config, numSRegs, numDRegs));
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
928 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
929
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
930 private static class OopMapArrayBuilder {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
931 // oopMapArray struct
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
932 // int bytesPerSaveArea; (not strictly part of oopsmap but convenient to put here)
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
933 // int intsPerInfopoint;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
934 static final int SAVEAREACOUNTS_OFST = 0;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
935 static final int INTSPERINFOPOINT_OFST = 1;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
936 static final int HEADERSIZE = 2;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
937 // for each infopoint:
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
938 // int deoptId
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
939 // one or more ints of bits for the oopmap
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
940
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
941 private int[] array;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
942 private int intsPerInfopoint;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
943
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
944 int[] build(List<Infopoint> infoList, int numSRegs, int numDRegs, int numStackSlots, HSAILHotSpotRegisterConfig hsailRegConfig) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
945 // we are told that infoList is always sorted
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
946 // each infoPoint can have a different oopMap
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
947
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
948 // since numStackSlots is the number of 8-byte stack slots used, it is an upper limit on
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
949 // the number of oop stack slots
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
950 int bitsPerInfopoint = numDRegs + numStackSlots;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
951 int intsForBits = (bitsPerInfopoint + 31) / 32;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
952 int numInfopoints = infoList.size();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
953 intsPerInfopoint = intsForBits + 1; // +1 for the pcoffset
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
954 int arraySize = HEADERSIZE + (numInfopoints * intsPerInfopoint);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
955 array = new int[arraySize];
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
956 array[INTSPERINFOPOINT_OFST] = intsPerInfopoint;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
957 // compute saveAreaCounts
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
958 int saveAreaCounts = (numSRegs & 0xff) + (numDRegs << 8) + (numStackSlots << 16);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
959 array[SAVEAREACOUNTS_OFST] = saveAreaCounts;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
960
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
961 // loop thru the infoList
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
962 int infoIndex = 0;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
963 for (Infopoint info : infoList) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
964 setOopMapPcOffset(infoIndex, info.pcOffset);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
965 BytecodeFrame frame = info.debugInfo.frame();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
966 while (frame != null) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
967 for (int i = 0; i < frame.numLocals + frame.numStack; i++) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
968 Value val = frame.values[i];
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
969 if (isLegal(val)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
970 if (isRegister(val)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
971 Register reg = asRegister(val);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
972 if (val.getKind().isObject()) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
973 assert (hsailRegConfig.isAllocatableDReg(reg));
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
974 int bitIndex = reg.encoding();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
975 setOopMapBit(infoIndex, bitIndex);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
976 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
977 } else if (isStackSlot(val)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
978 StackSlot slot = asStackSlot(val);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
979 if (val.getKind().isObject()) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
980 assert (HSAIL.getStackOffsetStart(slot, 64) % 8 == 0);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
981 int bitIndex = numDRegs + HSAIL.getStackOffsetStart(slot, 64) / 8;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
982 setOopMapBit(infoIndex, bitIndex);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
983 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
984 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
985 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
986 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
987 frame = frame.caller();
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
988 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
989 infoIndex++;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
990 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
991 try (Scope s = Debug.scope("CodeGen")) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
992 if (Debug.isLogEnabled()) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
993 Debug.log("numSRegs=%d, numDRegs=%d, numStackSlots=%d", numSRegs, numDRegs, numStackSlots);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
994 // show infopoint oopmap details
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
995 for (infoIndex = 0; infoIndex < infoList.size(); infoIndex++) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
996 String infoString = "Infopoint " + infoIndex + ", pcOffset=" + getOopMapPcOffset(infoIndex) + ", oopmap=";
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
997 for (int i = 0; i < intsForBits; i++) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
998 infoString += (i != 0 ? ", " : "") + Integer.toHexString(getOopMapBitsAsInt(infoIndex, i));
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
999 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1000 Debug.log(infoString);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1001 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1002 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1003 } catch (Throwable e) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1004 throw Debug.handle(e);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1005 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1006
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1007 return array;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1008 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1009
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1010 private void setOopMapPcOffset(int infoIndex, int pcOffset) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1011 int arrIndex = HEADERSIZE + infoIndex * intsPerInfopoint;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1012 array[arrIndex] = pcOffset;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1013 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1014
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1015 private int getOopMapPcOffset(int infoIndex) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1016 int arrIndex = HEADERSIZE + infoIndex * intsPerInfopoint;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1017 return array[arrIndex];
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1018 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1019
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1020 private void setOopMapBit(int infoIndex, int bitIndex) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1021 int arrIndex = HEADERSIZE + infoIndex * intsPerInfopoint + 1 + bitIndex / 32;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1022 array[arrIndex] |= (1 << (bitIndex % 32));
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1023 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1024
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1025 private int getOopMapBitsAsInt(int infoIndex, int intIndex) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1026 int arrIndex = HEADERSIZE + infoIndex * intsPerInfopoint + 1 + intIndex;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1027 return array[arrIndex];
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1028 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1029
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1030 public static int getSaveAreaCounts(int[] array) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1031 return array[SAVEAREACOUNTS_OFST];
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1032 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1033 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1034
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1035 private static StructuredGraph prepareHostGraph(ResolvedJavaMethod method, List<DeoptimizingOp> deopts, HotSpotProviders providers, HotSpotVMConfig config, int numSRegs, int numDRegs) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1036 if (deopts.isEmpty()) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1037 return null;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1038 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1039 StructuredGraph hostGraph = new StructuredGraph(method, -2);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1040 ParameterNode deoptId = hostGraph.unique(new ParameterNode(0, StampFactory.intValue()));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1041 ParameterNode hsailFrame = hostGraph.unique(new ParameterNode(1, StampFactory.forKind(providers.getCodeCache().getTarget().wordKind)));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1042 ParameterNode reasonAndAction = hostGraph.unique(new ParameterNode(2, StampFactory.intValue()));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1043 ParameterNode speculation = hostGraph.unique(new ParameterNode(3, StampFactory.object()));
15145
df2ef5204f2b Remove AbstractBeginNode, move the framestate from AbstractBeginNode to BeginStateSplitNode.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15132
diff changeset
1044 BeginNode[] branches = new BeginNode[deopts.size() + 1];
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1045 int[] keys = new int[deopts.size()];
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1046 int[] keySuccessors = new int[deopts.size() + 1];
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1047 double[] keyProbabilities = new double[deopts.size() + 1];
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1048 int i = 0;
15177
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
1049 Collections.sort(deopts, new Comparator<DeoptimizingOp>() {
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
1050 public int compare(DeoptimizingOp o1, DeoptimizingOp o2) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1051 return o1.getCodeBufferPos() - o2.getCodeBufferPos();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1052 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1053 });
15177
66e3af78ea96 HSAIL: added safepoint support
Doug Simon <doug.simon@oracle.com>
parents: 15157
diff changeset
1054 for (DeoptimizingOp deopt : deopts) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1055 keySuccessors[i] = i;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1056 keyProbabilities[i] = 1.0 / deopts.size();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1057 keys[i] = deopt.getCodeBufferPos();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1058 assert keys[i] >= 0;
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1059 branches[i] = createHostDeoptBranch(deopt, hsailFrame, reasonAndAction, speculation, providers, config, numSRegs, numDRegs);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1060
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1061 i++;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1062 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1063 keyProbabilities[deopts.size()] = 0; // default
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1064 keySuccessors[deopts.size()] = deopts.size();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1065 branches[deopts.size()] = createHostCrashBranch(hostGraph, deoptId);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1066 IntegerSwitchNode switchNode = hostGraph.add(new IntegerSwitchNode(deoptId, branches, keys, keyProbabilities, keySuccessors));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1067 StartNode start = hostGraph.start();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1068 start.setNext(switchNode);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1069 /*
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1070 * printf.setNext(printf2); printf2.setNext(switchNode);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1071 */
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1072 hostGraph.setGuardsStage(GuardsStage.AFTER_FSA);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1073 return hostGraph;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1074 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1075
15145
df2ef5204f2b Remove AbstractBeginNode, move the framestate from AbstractBeginNode to BeginStateSplitNode.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15132
diff changeset
1076 private static BeginNode createHostCrashBranch(StructuredGraph hostGraph, ValueNode deoptId) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1077 VMErrorNode vmError = hostGraph.add(new VMErrorNode("Error in HSAIL deopt. DeoptId=%d", deoptId));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1078 // ConvertNode.convert(hostGraph, Kind.Long, deoptId)));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1079 vmError.setNext(hostGraph.add(new ReturnNode(ConstantNode.defaultForKind(hostGraph.method().getSignature().getReturnKind(), hostGraph))));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1080 return BeginNode.begin(vmError);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1081 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1082
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1083 private static BeginNode createHostDeoptBranch(DeoptimizingOp deopt, ParameterNode hsailFrame, ValueNode reasonAndAction, ValueNode speculation, HotSpotProviders providers,
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1084 HotSpotVMConfig config, int numSRegs, int numDRegs) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1085 BeginNode branch = hsailFrame.graph().add(new BeginNode());
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1086 DynamicDeoptimizeNode deoptimization = hsailFrame.graph().add(new DynamicDeoptimizeNode(reasonAndAction, speculation));
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1087 deoptimization.setStateBefore(createFrameState(deopt.getFrameState().topFrame, hsailFrame, providers, config, numSRegs, numDRegs));
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1088 branch.setNext(deoptimization);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1089 return branch;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1090 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1091
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1092 private static FrameState createFrameState(BytecodeFrame lowLevelFrame, ParameterNode hsailFrame, HotSpotProviders providers, HotSpotVMConfig config, int numSRegs, int numDRegs) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1093 StructuredGraph hostGraph = hsailFrame.graph();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1094 ValueNode[] locals = new ValueNode[lowLevelFrame.numLocals];
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1095 for (int i = 0; i < lowLevelFrame.numLocals; i++) {
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1096 locals[i] = getNodeForValueFromFrame(lowLevelFrame.getLocalValue(i), hsailFrame, hostGraph, providers, config, numSRegs, numDRegs);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1097 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1098 List<ValueNode> stack = new ArrayList<>(lowLevelFrame.numStack);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1099 for (int i = 0; i < lowLevelFrame.numStack; i++) {
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1100 stack.add(getNodeForValueFromFrame(lowLevelFrame.getStackValue(i), hsailFrame, hostGraph, providers, config, numSRegs, numDRegs));
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1101 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1102 ValueNode[] locks = new ValueNode[lowLevelFrame.numLocks];
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1103 MonitorIdNode[] monitorIds = new MonitorIdNode[lowLevelFrame.numLocks];
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1104 for (int i = 0; i < lowLevelFrame.numLocks; i++) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1105 HotSpotMonitorValue lockValue = (HotSpotMonitorValue) lowLevelFrame.getLockValue(i);
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1106 locks[i] = getNodeForValueFromFrame(lockValue, hsailFrame, hostGraph, providers, config, numSRegs, numDRegs);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1107 monitorIds[i] = getMonitorIdForHotSpotMonitorValueFromFrame(lockValue, hsailFrame, hostGraph);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1108 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1109 FrameState frameState = hostGraph.add(new FrameState(lowLevelFrame.getMethod(), lowLevelFrame.getBCI(), locals, stack, locks, monitorIds, lowLevelFrame.rethrowException, false));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1110 if (lowLevelFrame.caller() != null) {
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1111 frameState.setOuterFrameState(createFrameState(lowLevelFrame.caller(), hsailFrame, providers, config, numSRegs, numDRegs));
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1112 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1113 return frameState;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1114 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1115
15066
2cae21d9f122 HSAIL: initial support for object allocation in HSAIL kernels
Doug Simon <doug.simon@oracle.com>
parents: 15024
diff changeset
1116 @SuppressWarnings("unused")
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1117 private static MonitorIdNode getMonitorIdForHotSpotMonitorValueFromFrame(HotSpotMonitorValue lockValue, ParameterNode hsailFrame, StructuredGraph hsailGraph) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1118 if (lockValue.isEliminated()) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1119 return null;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1120 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1121 throw GraalInternalError.unimplemented();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1122 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1123
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1124 private static ValueNode getNodeForValueFromFrame(Value localValue, ParameterNode hsailFrame, StructuredGraph hostGraph, HotSpotProviders providers, HotSpotVMConfig config, int numSRegs,
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1125 int numDRegs) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1126 ValueNode valueNode;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1127 if (localValue instanceof Constant) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1128 valueNode = ConstantNode.forConstant((Constant) localValue, providers.getMetaAccess(), hostGraph);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1129 } else if (localValue instanceof VirtualObject) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1130 throw GraalInternalError.unimplemented();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1131 } else if (localValue instanceof StackSlot) {
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1132 StackSlot slot = (StackSlot) localValue;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1133 valueNode = getNodeForStackSlotFromFrame(slot, localValue.getKind(), hsailFrame, hostGraph, providers, config, numSRegs, numDRegs);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1134 } else if (localValue instanceof HotSpotMonitorValue) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1135 HotSpotMonitorValue hotSpotMonitorValue = (HotSpotMonitorValue) localValue;
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1136 return getNodeForValueFromFrame(hotSpotMonitorValue.getOwner(), hsailFrame, hostGraph, providers, config, numSRegs, numDRegs);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1137 } else if (localValue instanceof RegisterValue) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1138 RegisterValue registerValue = (RegisterValue) localValue;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1139 int regNumber = registerValue.getRegister().number;
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1140 valueNode = getNodeForRegisterFromFrame(regNumber, localValue.getKind(), hsailFrame, hostGraph, providers, config, numSRegs);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1141 } else if (Value.ILLEGAL.equals(localValue)) {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1142 valueNode = null;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1143 } else {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1144 throw GraalInternalError.shouldNotReachHere();
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1145 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1146 return valueNode;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1147 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1148
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1149 private static ValueNode getNodeForRegisterFromFrame(int regNumber, Kind valueKind, ParameterNode hsailFrame, StructuredGraph hostGraph, HotSpotProviders providers, HotSpotVMConfig config,
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1150 int numSRegs) {
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1151 ValueNode valueNode;
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1152 LocationNode location;
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1153 int longSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Long);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1154 int intSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Int);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1155 if (regNumber >= HSAIL.s0.number && regNumber <= HSAIL.s31.number) {
15545
9d456ffc6120 HSAIL: fixed Windows build
Doug Simon <doug.simon@oracle.com>
parents: 15482
diff changeset
1156 long offset = config.hsailFrameHeaderSize + intSize * (regNumber - HSAIL.s0.number);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1157 location = ConstantLocationNode.create(FINAL_LOCATION, valueKind, offset, hostGraph);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1158 } else if (regNumber >= HSAIL.d0.number && regNumber <= HSAIL.d15.number) {
15545
9d456ffc6120 HSAIL: fixed Windows build
Doug Simon <doug.simon@oracle.com>
parents: 15482
diff changeset
1159 long offset = config.hsailFrameHeaderSize + intSize * numSRegs + longSize * (regNumber - HSAIL.d0.number);
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1160 location = ConstantLocationNode.create(FINAL_LOCATION, valueKind, offset, hostGraph);
14853
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1161 } else {
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1162 throw GraalInternalError.shouldNotReachHere("unknown hsail register: " + regNumber);
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1163 }
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1164 valueNode = hostGraph.unique(new FloatingReadNode(hsailFrame, location, null, StampFactory.forKind(valueKind)));
6bde7deb5be1 Adopt HSAILLIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 14852
diff changeset
1165 return valueNode;
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1166 }
14809
73774616a6b3 Decoupled LIRGenerator and LIRGenerationResult.
Josef Eisl <josef.eisl@jku.at>
parents: 14804
diff changeset
1167
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1168 private static ValueNode getNodeForStackSlotFromFrame(StackSlot slot, Kind valueKind, ParameterNode hsailFrame, StructuredGraph hostGraph, HotSpotProviders providers, HotSpotVMConfig config,
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1169 int numSRegs, int numDRegs) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1170 int slotSizeInBits = (valueKind == Kind.Object ? 64 : valueKind.getByteCount() * 8);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1171 if ((slotSizeInBits == 32) || (slotSizeInBits == 64)) {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1172 int longSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Long);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1173 int intSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Int);
15545
9d456ffc6120 HSAIL: fixed Windows build
Doug Simon <doug.simon@oracle.com>
parents: 15482
diff changeset
1174 long offset = config.hsailFrameHeaderSize + (intSize * numSRegs) + (longSize * numDRegs) + HSAIL.getStackOffsetStart(slot, slotSizeInBits);
15482
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1175 LocationNode location = ConstantLocationNode.create(FINAL_LOCATION, valueKind, offset, hostGraph);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1176 ValueNode valueNode = hostGraph.unique(new FloatingReadNode(hsailFrame, location, null, StampFactory.forKind(valueKind)));
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1177 return valueNode;
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1178 } else {
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1179 throw GraalInternalError.shouldNotReachHere("unsupported stack slot kind: " + valueKind);
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1180 }
a250a512434d HSAIL: support for object values in stack slots at deoptimization points
Doug Simon <doug.simon@oracle.com>
parents: 15375
diff changeset
1181 }
10662
4ef92b67aeae added HSAIL backend and tests
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1182 }