annotate src/share/vm/c1/c1_FrameMap.hpp @ 4710:41406797186b

7113012: G1: rename not-fully-young GCs as "mixed" Summary: Renamed partially-young GCs as mixed and fully-young GCs as young. Change all external output that includes those terms (GC log and GC ergo log) as well as any comments, fields, methods, etc. The changeset also includes very minor code tidying up (added some curly brackets). Reviewed-by: johnc, brutisso
author tonyp
date Fri, 16 Dec 2011 02:14:27 -0500
parents 1d1603768966
children 1d7922586cf6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2192
diff changeset
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
25 #ifndef SHARE_VM_C1_C1_FRAMEMAP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
26 #define SHARE_VM_C1_C1_FRAMEMAP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
28 #include "asm/assembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
29 #include "c1/c1_Defs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
30 #include "c1/c1_LIR.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
31 #include "code/vmreg.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
32 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
33 #include "runtime/frame.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
34 #include "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
35 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
36
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class ciMethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class CallingConvention;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class BasicTypeArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class BasicTypeList;
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // FrameMap
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // This class is responsible of mapping items (locals, monitors, spill
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // slots and registers to their frame location
a61af66fc99e Initial load
duke
parents:
diff changeset
48 //
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // The monitors are specified by a consecutive index, although each monitor entry
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // occupies two words. The monitor_index is 0.._num_monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // The spill index is similar to local index; it is in range 0..(open)
a61af66fc99e Initial load
duke
parents:
diff changeset
52 //
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // The CPU registers are mapped using a fixed table; register with number 0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // is the most used one.
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // stack grow direction --> SP
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // +----------+---+----------+-------+------------------------+-----+
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // |arguments | x | monitors | spill | reserved argument area | ABI |
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // +----------+---+----------+-------+------------------------+-----+
a61af66fc99e Initial load
duke
parents:
diff changeset
61 //
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // x = ABI area (SPARC) or return adress and link (i486)
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // ABI = ABI area (SPARC) or nothing (i486)
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 class LIR_OprDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 typedef LIR_OprDesc* LIR_Opr;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 class FrameMap : public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
72 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 nof_cpu_regs = pd_nof_cpu_regs_frame_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
74 nof_fpu_regs = pd_nof_fpu_regs_frame_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 nof_cpu_regs_reg_alloc = pd_nof_cpu_regs_reg_alloc,
a61af66fc99e Initial load
duke
parents:
diff changeset
77 nof_fpu_regs_reg_alloc = pd_nof_fpu_regs_reg_alloc,
a61af66fc99e Initial load
duke
parents:
diff changeset
78
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
79 max_nof_caller_save_cpu_regs = pd_nof_caller_save_cpu_regs_frame_map,
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
80 nof_caller_save_fpu_regs = pd_nof_caller_save_fpu_regs_frame_map,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 spill_slot_size_in_bytes = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
83 };
a61af66fc99e Initial load
duke
parents:
diff changeset
84
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
85 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
86 # include "c1_FrameMap_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
87 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
88 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
89 # include "c1_FrameMap_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
90 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
91 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
92 # include "c1_FrameMap_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
93 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
94 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
95 # include "c1_FrameMap_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
96 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
97
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 friend class LIR_OprDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
102 static bool _init_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static Register _cpu_rnr2reg [nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static int _cpu_reg2rnr [nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
105
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
106 static LIR_Opr _caller_save_cpu_regs [max_nof_caller_save_cpu_regs];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
107 static LIR_Opr _caller_save_fpu_regs [nof_caller_save_fpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 int _framesize;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 int _argcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 int _num_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 int _num_spills;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 int _reserved_argument_area_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 int _oop_map_arg_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 CallingConvention* _incoming_arguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 intArray* _argument_locations;
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 void check_spill_index (int spill_index) const { assert(spill_index >= 0, "bad index"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void check_monitor_index (int monitor_index) const { assert(monitor_index >= 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
121 monitor_index < _num_monitors, "bad index"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 static Register cpu_rnr2reg (int rnr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 assert(_init_done, "tables not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
125 debug_only(cpu_range_check(rnr);)
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return _cpu_rnr2reg[rnr];
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 static int cpu_reg2rnr (Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 assert(_init_done, "tables not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
131 debug_only(cpu_range_check(reg->encoding());)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return _cpu_reg2rnr[reg->encoding()];
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static void map_register(int rnr, Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 debug_only(cpu_range_check(rnr);)
a61af66fc99e Initial load
duke
parents:
diff changeset
137 debug_only(cpu_range_check(reg->encoding());)
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _cpu_rnr2reg[rnr] = reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 _cpu_reg2rnr[reg->encoding()] = rnr;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void update_reserved_argument_area_size (int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 assert(size >= 0, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
144 _reserved_argument_area_size = MAX2(_reserved_argument_area_size, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
148 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
149 static void cpu_range_check (int rnr) { assert(0 <= rnr && rnr < nof_cpu_regs, "cpu register number is too big"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
150 static void fpu_range_check (int rnr) { assert(0 <= rnr && rnr < nof_fpu_regs, "fpu register number is too big"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 ByteSize sp_offset_for_monitor_base(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 Address make_new_address(ByteSize sp_offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 ByteSize sp_offset_for_slot(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 ByteSize sp_offset_for_double_slot(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 ByteSize sp_offset_for_spill(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 ByteSize sp_offset_for_monitor_lock(int monitor_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 ByteSize sp_offset_for_monitor_object(int monitor_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 VMReg sp_offset2vmreg(ByteSize offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // platform dependent hook used to check that frame is properly
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // addressable on the platform. Used by sparc to verify that all
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // stack addresses are expressable in a simm13.
a61af66fc99e Initial load
duke
parents:
diff changeset
169 bool validate_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 static LIR_Opr map_to_opr(BasicType type, VMRegPair* reg, bool incoming);
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Opr representing the stack_pointer on this platform
a61af66fc99e Initial load
duke
parents:
diff changeset
175 static LIR_Opr stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
176
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
177 // JSR 292
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
178 static LIR_Opr method_handle_invoke_SP_save_opr();
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
179
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180 static BasicTypeArray* signature_type_array_for(const ciMethod* method);
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // for outgoing calls, these also update the reserved area to
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // include space for arguments and any ABI area.
a61af66fc99e Initial load
duke
parents:
diff changeset
184 CallingConvention* c_calling_convention (const BasicTypeArray* signature);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 CallingConvention* java_calling_convention (const BasicTypeArray* signature, bool outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // deopt support
a61af66fc99e Initial load
duke
parents:
diff changeset
188 ByteSize sp_offset_for_orig_pc() { return sp_offset_for_monitor_base(_num_monitors); }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 static LIR_Opr as_opr(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 return LIR_OprFact::single_cpu(cpu_reg2rnr(r));
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 static LIR_Opr as_oop_opr(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 return LIR_OprFact::single_cpu_oop(cpu_reg2rnr(r));
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 FrameMap(ciMethod* method, int monitors, int reserved_argument_area_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 bool finalize_frame(int nof_slots);
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 int reserved_argument_area_size () const { return _reserved_argument_area_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 int framesize () const { assert(_framesize != -1, "hasn't been calculated"); return _framesize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
202 ByteSize framesize_in_bytes () const { return in_ByteSize(framesize() * 4); }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 int num_monitors () const { return _num_monitors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 int num_spills () const { assert(_num_spills >= 0, "not set"); return _num_spills; }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 int argcount () const { assert(_argcount >= 0, "not set"); return _argcount; }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 int oop_map_arg_count() const { return _oop_map_arg_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 CallingConvention* incoming_arguments() const { return _incoming_arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // convenience routines
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Address address_for_slot(int index, int sp_adjust = 0) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return make_new_address(sp_offset_for_slot(index) + in_ByteSize(sp_adjust));
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 Address address_for_double_slot(int index, int sp_adjust = 0) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 return make_new_address(sp_offset_for_double_slot(index) + in_ByteSize(sp_adjust));
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218 Address address_for_monitor_lock(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return make_new_address(sp_offset_for_monitor_lock(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Address address_for_monitor_object(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return make_new_address(sp_offset_for_monitor_object(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 void print_frame_layout() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // Creates Location describing desired slot and returns it via pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // to Location object. Returns true if the stack frame offset was legal
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // (as defined by Location::legal_offset_in_bytes()), false otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Do not use the returned location if this returns false.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 bool location_for_sp_offset(ByteSize byte_offset_from_sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
232 Location::Type loc_type, Location* loc) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 bool location_for_monitor_lock (int monitor_index, Location* loc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 return location_for_sp_offset(sp_offset_for_monitor_lock(monitor_index), Location::normal, loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 bool location_for_monitor_object(int monitor_index, Location* loc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return location_for_sp_offset(sp_offset_for_monitor_object(monitor_index), Location::oop, loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 bool locations_for_slot (int index, Location::Type loc_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
241 Location* loc, Location* second = NULL) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 VMReg slot_regname(int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return sp_offset2vmreg(sp_offset_for_slot(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246 VMReg monitor_object_regname(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 return sp_offset2vmreg(sp_offset_for_monitor_object(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 VMReg regname(LIR_Opr opr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 static LIR_Opr caller_save_cpu_reg_at(int i) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
252 assert(i >= 0 && i < max_nof_caller_save_cpu_regs, "out of bounds");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 return _caller_save_cpu_regs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 static LIR_Opr caller_save_fpu_reg_at(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 assert(i >= 0 && i < nof_caller_save_fpu_regs, "out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return _caller_save_fpu_regs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1579
diff changeset
261 static void initialize();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 };
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // CallingConvention
a61af66fc99e Initial load
duke
parents:
diff changeset
265 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 class CallingConvention: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
269 LIR_OprList* _args;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 int _reserved_stack_slots;
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
273 CallingConvention (LIR_OprList* args, int reserved_stack_slots)
a61af66fc99e Initial load
duke
parents:
diff changeset
274 : _args(args)
a61af66fc99e Initial load
duke
parents:
diff changeset
275 , _reserved_stack_slots(reserved_stack_slots) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 LIR_OprList* args() { return _args; }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 LIR_Opr at(int i) const { return _args->at(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 int length() const { return _args->length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // Indicates number of real frame slots used by arguments passed on stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
283 int reserved_stack_slots() const { return _reserved_stack_slots; }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
286 void print () const {
a61af66fc99e Initial load
duke
parents:
diff changeset
287 for (int i = 0; i < length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 at(i)->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
292 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
293
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
294 #endif // SHARE_VM_C1_C1_FRAMEMAP_HPP