Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/cpu/aarch32/vm/c1_FrameMap_aarch32.hpp
32285 views
1
/*
2
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
3
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
4
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5
*
6
* This code is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License version 2 only, as
8
* published by the Free Software Foundation.
9
*
10
* This code is distributed in the hope that it will be useful, but WITHOUT
11
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13
* version 2 for more details (a copy is included in the LICENSE file that
14
* accompanied this code).
15
*
16
* You should have received a copy of the GNU General Public License version
17
* 2 along with this work; if not, write to the Free Software Foundation,
18
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19
*
20
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21
* or visit www.oracle.com if you need additional information or have any
22
* questions.
23
*
24
*/
25
// This file is a derivative work resulting from (and including) modifications
26
// made by Azul Systems, Inc. The dates of such changes are 2013-2016.
27
// Copyright 2013-2016 Azul Systems, Inc. All Rights Reserved.
28
//
29
// Please contact Azul Systems, 385 Moffett Park Drive, Suite 115, Sunnyvale,
30
// CA 94089 USA or visit www.azul.com if you need additional information or
31
// have any questions.
32
33
#ifndef CPU_AARCH32_VM_C1_FRAMEMAP_AARCH32_HPP
34
#define CPU_AARCH32_VM_C1_FRAMEMAP_AARCH32_HPP
35
36
// The following schema visualizes how a C1 frame looks like on AArch32.
37
// It corresponds to the case of an unextended frame. Each line of text
38
// represents one 4-byte slot. Every monitor takes two slots. Positions of
39
// incoming arguments are determined by the Java calling convention. Spill
40
// area and monitor area are not required to be 8-byte aligned. The slot
41
// for deoptimization support is used by frame::deoptimize() method to save
42
// the original pc before patching in the new one.
43
//
44
// When LIR_Opr's reference stack slots, they use virtual stack slot indices.
45
// They are mapped to the real stack slots by FrameMap::sp_offset_for_slot()
46
// and FrameMap::sp_offset_for_double_slot() methods. The first _argcount
47
// virtual stack slots correspond to the real stack slots occupied by the
48
// incoming arguments. Their mapping is defined by _argument_locations array
49
// (which is filled in by applying the Java calling convention). All other
50
// virtual stack slots correspond to spill slots.
51
//
52
// Higher addresses
53
// | incoming | virtual stack slots
54
// | | [0 ... _arg_count - 1]
55
// | arguments |
56
// |====================================|----X- 8-byte aligned
57
// | previous lr | /|\ address
58
// rfp ===> |------------------------------------| |
59
// | previous rfp | |
60
// |====================================| |
61
// | alignment slot (if needed) | |
62
// |====================================| |
63
// | slot for deoptimization support | |
64
// |====================================| |
65
// | monitor [_num_monitors - 1] object | |
66
// | | |
67
// | monitor [_num_monitors - 1] lock | |
68
// |------------------------------------| |
69
// | | |
70
// Direction of | ... | | _framesize
71
// stack growth | | | slots
72
// | |------------------------------------| |
73
// V | monitor [0] object | |
74
// | | |
75
// | monitor [0] lock | |
76
// |====================================| |
77
// | spill slot [_num_spills - 1] | | virtual stack slot
78
// |------------------------------------| | [_arg_count + _num_spills - 1]
79
// | ... | | ...
80
// |------------------------------------| |
81
// | spill slot [0] | | virtual stack slot
82
// |====================================| | [_arg_count]
83
// | reserved argument area for | |
84
// | ... | |
85
// | outgoing calls (8-byte aligned) | \|/
86
// sp ===> |====================================|----X- 8-byte aligned
87
// | | address
88
// Lower addresses
89
90
public:
91
enum {
92
first_available_sp_in_frame = 0,
93
frame_pad_in_bytes = 8
94
};
95
96
public:
97
static LIR_Opr r0_opr;
98
static LIR_Opr r1_opr;
99
static LIR_Opr r2_opr;
100
static LIR_Opr r3_opr;
101
static LIR_Opr r4_opr;
102
static LIR_Opr r5_opr;
103
static LIR_Opr r6_opr;
104
static LIR_Opr r7_opr;
105
static LIR_Opr r8_opr;
106
static LIR_Opr r9_opr;
107
static LIR_Opr r10_opr;
108
static LIR_Opr r11_opr;
109
static LIR_Opr r12_opr;
110
static LIR_Opr r13_opr;
111
static LIR_Opr r14_opr;
112
static LIR_Opr r15_opr;
113
114
static LIR_Opr r0_oop_opr;
115
static LIR_Opr r1_oop_opr;
116
static LIR_Opr r2_oop_opr;
117
static LIR_Opr r3_oop_opr;
118
static LIR_Opr r4_oop_opr;
119
static LIR_Opr r5_oop_opr;
120
static LIR_Opr r6_oop_opr;
121
static LIR_Opr r7_oop_opr;
122
static LIR_Opr r8_oop_opr;
123
static LIR_Opr r9_oop_opr;
124
static LIR_Opr r10_oop_opr;
125
static LIR_Opr r11_oop_opr;
126
static LIR_Opr r12_oop_opr;
127
static LIR_Opr r13_oop_opr;
128
static LIR_Opr r14_oop_opr;
129
static LIR_Opr r15_oop_opr;
130
131
static LIR_Opr r0_metadata_opr;
132
static LIR_Opr r1_metadata_opr;
133
static LIR_Opr r2_metadata_opr;
134
static LIR_Opr r3_metadata_opr;
135
static LIR_Opr r4_metadata_opr;
136
static LIR_Opr r5_metadata_opr;
137
138
static LIR_Opr sp_opr;
139
static LIR_Opr receiver_opr;
140
141
static LIR_Opr rscratch1_opr;
142
static LIR_Opr rscratch2_opr;
143
static LIR_Opr rscratch_long_opr;
144
145
static LIR_Opr long0_opr;
146
static LIR_Opr long1_opr;
147
static LIR_Opr long2_opr;
148
static LIR_Opr fpu0_float_opr;
149
static LIR_Opr fpu0_double_opr;
150
151
static LIR_Opr as_long_opr(Register r1, Register r2) {
152
return LIR_OprFact::double_cpu(cpu_reg2rnr(r1), cpu_reg2rnr(r2));
153
}
154
static LIR_Opr as_pointer_opr(Register r) {
155
return LIR_OprFact::single_cpu(cpu_reg2rnr(r));
156
}
157
158
static VMReg fpu_regname(int n);
159
160
static bool is_caller_save_register(LIR_Opr opr) {
161
// On AArch32, unlike on SPARC, we never explicitly request the C1 register
162
// allocator to allocate a callee-saved register. Since the only place this
163
// method is called is the assert in LinearScan::color_lir_opr(), we can
164
// safely just always return true here.
165
return true;
166
}
167
static int nof_caller_save_cpu_regs() {
168
return pd_nof_caller_save_cpu_regs_frame_map;
169
}
170
static int last_cpu_reg() {
171
return pd_last_cpu_reg;
172
}
173
174
#endif // CPU_AARCH32_VM_C1_FRAMEMAP_AARCH32_HPP
175
176