Mercurial > hg > truffle
annotate src/share/vm/asm/assembler.hpp @ 20543:e7d0505c8a30
8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, brutisso
author | tschatzl |
---|---|
date | Fri, 10 Oct 2014 15:51:58 +0200 |
parents | a9becfeecd1b |
children | 4ca6dc0799b6 |
rev | line source |
---|---|
0 | 1 /* |
17467
55fb97c4c58d
8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents:
8767
diff
changeset
|
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
665
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
665
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:
665
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_ASM_ASSEMBLER_HPP |
26 #define SHARE_VM_ASM_ASSEMBLER_HPP | |
27 | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
28 #include "asm/codeBuffer.hpp" |
1972 | 29 #include "code/oopRecorder.hpp" |
30 #include "code/relocInfo.hpp" | |
31 #include "memory/allocation.hpp" | |
32 #include "utilities/debug.hpp" | |
33 #include "utilities/growableArray.hpp" | |
34 #include "utilities/top.hpp" | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
35 |
1972 | 36 #ifdef TARGET_ARCH_x86 |
37 # include "register_x86.hpp" | |
38 # include "vm_version_x86.hpp" | |
39 #endif | |
40 #ifdef TARGET_ARCH_sparc | |
41 # include "register_sparc.hpp" | |
42 # include "vm_version_sparc.hpp" | |
43 #endif | |
44 #ifdef TARGET_ARCH_zero | |
45 # include "register_zero.hpp" | |
46 # include "vm_version_zero.hpp" | |
47 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
48 #ifdef TARGET_ARCH_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
49 # include "register_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
50 # include "vm_version_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
51 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
52 #ifdef TARGET_ARCH_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
53 # include "register_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
54 # include "vm_version_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
55 #endif |
1972 | 56 |
605 | 57 // This file contains platform-independent assembler declarations. |
0 | 58 |
59 class MacroAssembler; | |
60 class AbstractAssembler; | |
61 class Label; | |
62 | |
63 /** | |
64 * Labels represent destinations for control transfer instructions. Such | |
65 * instructions can accept a Label as their target argument. A Label is | |
66 * bound to the current location in the code stream by calling the | |
67 * MacroAssembler's 'bind' method, which in turn calls the Label's 'bind' | |
68 * method. A Label may be referenced by an instruction before it's bound | |
69 * (i.e., 'forward referenced'). 'bind' stores the current code offset | |
70 * in the Label object. | |
71 * | |
72 * If an instruction references a bound Label, the offset field(s) within | |
73 * the instruction are immediately filled in based on the Label's code | |
74 * offset. If an instruction references an unbound label, that | |
75 * instruction is put on a list of instructions that must be patched | |
76 * (i.e., 'resolved') when the Label is bound. | |
77 * | |
78 * 'bind' will call the platform-specific 'patch_instruction' method to | |
79 * fill in the offset field(s) for each unresolved instruction (if there | |
80 * are any). 'patch_instruction' lives in one of the | |
81 * cpu/<arch>/vm/assembler_<arch>* files. | |
82 * | |
83 * Instead of using a linked list of unresolved instructions, a Label has | |
84 * an array of unresolved instruction code offsets. _patch_index | |
85 * contains the total number of forward references. If the Label's array | |
86 * overflows (i.e., _patch_index grows larger than the array size), a | |
87 * GrowableArray is allocated to hold the remaining offsets. (The cache | |
88 * size is 4 for now, which handles over 99.5% of the cases) | |
89 * | |
90 * Labels may only be used within a single CodeSection. If you need | |
91 * to create references between code sections, use explicit relocations. | |
92 */ | |
93 class Label VALUE_OBJ_CLASS_SPEC { | |
94 private: | |
95 enum { PatchCacheSize = 4 }; | |
96 | |
97 // _loc encodes both the binding state (via its sign) | |
98 // and the binding locator (via its value) of a label. | |
99 // | |
100 // _loc >= 0 bound label, loc() encodes the target (jump) position | |
101 // _loc == -1 unbound label | |
102 int _loc; | |
103 | |
104 // References to instructions that jump to this unresolved label. | |
105 // These instructions need to be patched when the label is bound | |
106 // using the platform-specific patchInstruction() method. | |
107 // | |
108 // To avoid having to allocate from the C-heap each time, we provide | |
109 // a local cache and use the overflow only if we exceed the local cache | |
110 int _patches[PatchCacheSize]; | |
111 int _patch_index; | |
112 GrowableArray<int>* _patch_overflow; | |
113 | |
114 Label(const Label&) { ShouldNotReachHere(); } | |
115 | |
116 public: | |
117 | |
118 /** | |
119 * After binding, be sure 'patch_instructions' is called later to link | |
120 */ | |
121 void bind_loc(int loc) { | |
122 assert(loc >= 0, "illegal locator"); | |
123 assert(_loc == -1, "already bound"); | |
124 _loc = loc; | |
125 } | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
126 void bind_loc(int pos, int sect) { bind_loc(CodeBuffer::locator(pos, sect)); } |
0 | 127 |
128 #ifndef PRODUCT | |
129 // Iterates over all unresolved instructions for printing | |
130 void print_instructions(MacroAssembler* masm) const; | |
131 #endif // PRODUCT | |
132 | |
133 /** | |
134 * Returns the position of the the Label in the code buffer | |
135 * The position is a 'locator', which encodes both offset and section. | |
136 */ | |
137 int loc() const { | |
138 assert(_loc >= 0, "unbound label"); | |
139 return _loc; | |
140 } | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
141 int loc_pos() const { return CodeBuffer::locator_pos(loc()); } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
142 int loc_sect() const { return CodeBuffer::locator_sect(loc()); } |
0 | 143 |
144 bool is_bound() const { return _loc >= 0; } | |
145 bool is_unbound() const { return _loc == -1 && _patch_index > 0; } | |
146 bool is_unused() const { return _loc == -1 && _patch_index == 0; } | |
147 | |
148 /** | |
149 * Adds a reference to an unresolved displacement instruction to | |
150 * this unbound label | |
151 * | |
152 * @param cb the code buffer being patched | |
153 * @param branch_loc the locator of the branch instruction in the code buffer | |
154 */ | |
155 void add_patch_at(CodeBuffer* cb, int branch_loc); | |
156 | |
157 /** | |
158 * Iterate over the list of patches, resolving the instructions | |
159 * Call patch_instruction on each 'branch_loc' value | |
160 */ | |
161 void patch_instructions(MacroAssembler* masm); | |
162 | |
163 void init() { | |
164 _loc = -1; | |
165 _patch_index = 0; | |
166 _patch_overflow = NULL; | |
167 } | |
168 | |
169 Label() { | |
170 init(); | |
171 } | |
172 }; | |
173 | |
622
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
174 // A union type for code which has to assemble both constant and |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
175 // non-constant operands, when the distinction cannot be made |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
176 // statically. |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
622
diff
changeset
|
177 class RegisterOrConstant VALUE_OBJ_CLASS_SPEC { |
622
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
178 private: |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
179 Register _r; |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
180 intptr_t _c; |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
181 |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
182 public: |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
622
diff
changeset
|
183 RegisterOrConstant(): _r(noreg), _c(0) {} |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
622
diff
changeset
|
184 RegisterOrConstant(Register r): _r(r), _c(0) {} |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
622
diff
changeset
|
185 RegisterOrConstant(intptr_t c): _r(noreg), _c(c) {} |
622
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
186 |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
187 Register as_register() const { assert(is_register(),""); return _r; } |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
188 intptr_t as_constant() const { assert(is_constant(),""); return _c; } |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
189 |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
190 Register register_or_noreg() const { return _r; } |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
191 intptr_t constant_or_zero() const { return _c; } |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
192 |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
193 bool is_register() const { return _r != noreg; } |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
194 bool is_constant() const { return _r == noreg; } |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
195 }; |
0 | 196 |
197 // The Abstract Assembler: Pure assembler doing NO optimizations on the | |
198 // instruction level; i.e., what you write is what you get. | |
199 // The Assembler is generating code into a CodeBuffer. | |
200 class AbstractAssembler : public ResourceObj { | |
201 friend class Label; | |
202 | |
203 protected: | |
204 CodeSection* _code_section; // section within the code buffer | |
205 OopRecorder* _oop_recorder; // support for relocInfo::oop_type | |
206 | |
14437
15120a36272d
8028767: PPC64: (part 121): smaller shared changes needed to build C2
goetz
parents:
8767
diff
changeset
|
207 public: |
0 | 208 // Code emission & accessing |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
209 address addr_at(int pos) const { return code_section()->start() + pos; } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
210 |
14437
15120a36272d
8028767: PPC64: (part 121): smaller shared changes needed to build C2
goetz
parents:
8767
diff
changeset
|
211 protected: |
0 | 212 // This routine is called with a label is used for an address. |
213 // Labels and displacements truck in offsets, but target must return a PC. | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
214 address target(Label& L) { return code_section()->target(L, pc()); } |
0 | 215 |
216 bool is8bit(int x) const { return -0x80 <= x && x < 0x80; } | |
217 bool isByte(int x) const { return 0 <= x && x < 0x100; } | |
218 bool isShiftCount(int x) const { return 0 <= x && x < 32; } | |
219 | |
220 // Instruction boundaries (required when emitting relocatable values). | |
221 class InstructionMark: public StackObj { | |
222 private: | |
223 AbstractAssembler* _assm; | |
224 | |
225 public: | |
226 InstructionMark(AbstractAssembler* assm) : _assm(assm) { | |
227 assert(assm->inst_mark() == NULL, "overlapping instructions"); | |
228 _assm->set_inst_mark(); | |
229 } | |
230 ~InstructionMark() { | |
231 _assm->clear_inst_mark(); | |
232 } | |
233 }; | |
234 friend class InstructionMark; | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
235 #ifdef ASSERT |
0 | 236 // Make it return true on platforms which need to verify |
237 // instruction boundaries for some operations. | |
7204
f0c2369fda5a
8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
7199
diff
changeset
|
238 static bool pd_check_instruction_mark(); |
4766
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
239 |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
240 // Add delta to short branch distance to verify that it still fit into imm8. |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
241 int _short_branch_delta; |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
242 |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
243 int short_branch_delta() const { return _short_branch_delta; } |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
244 void set_short_branch_delta() { _short_branch_delta = 32; } |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
245 void clear_short_branch_delta() { _short_branch_delta = 0; } |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
246 |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
247 class ShortBranchVerifier: public StackObj { |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
248 private: |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
249 AbstractAssembler* _assm; |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
250 |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
251 public: |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
252 ShortBranchVerifier(AbstractAssembler* assm) : _assm(assm) { |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
253 assert(assm->short_branch_delta() == 0, "overlapping instructions"); |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
254 _assm->set_short_branch_delta(); |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
255 } |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
256 ~ShortBranchVerifier() { |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
257 _assm->clear_short_branch_delta(); |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
258 } |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
259 }; |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
260 #else |
4766
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
261 // Dummy in product. |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
262 class ShortBranchVerifier: public StackObj { |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
263 public: |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
264 ShortBranchVerifier(AbstractAssembler* assm) {} |
40c2484c09e1
7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents:
4114
diff
changeset
|
265 }; |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
266 #endif |
0 | 267 |
268 public: | |
269 | |
270 // Creation | |
271 AbstractAssembler(CodeBuffer* code); | |
272 | |
273 // ensure buf contains all code (call this before using/copying the code) | |
274 void flush(); | |
275 | |
7430
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
276 void emit_int8( int8_t x) { code_section()->emit_int8( x); } |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
277 void emit_int16( int16_t x) { code_section()->emit_int16( x); } |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
278 void emit_int32( int32_t x) { code_section()->emit_int32( x); } |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
279 void emit_int64( int64_t x) { code_section()->emit_int64( x); } |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
280 |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
281 void emit_float( jfloat x) { code_section()->emit_float( x); } |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
282 void emit_double( jdouble x) { code_section()->emit_double( x); } |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
283 void emit_address(address x) { code_section()->emit_address(x); } |
d02120b7a34f
8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents:
7424
diff
changeset
|
284 |
4114
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
285 // min and max values for signed immediate ranges |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
286 static int min_simm(int nbits) { return -(intptr_t(1) << (nbits - 1)) ; } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
287 static int max_simm(int nbits) { return (intptr_t(1) << (nbits - 1)) - 1; } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
288 |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
289 // Define some: |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
290 static int min_simm10() { return min_simm(10); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
291 static int min_simm13() { return min_simm(13); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
292 static int min_simm16() { return min_simm(16); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
293 |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
294 // Test if x is within signed immediate range for nbits |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
295 static bool is_simm(intptr_t x, int nbits) { return min_simm(nbits) <= x && x <= max_simm(nbits); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
296 |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
297 // Define some: |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
298 static bool is_simm5( intptr_t x) { return is_simm(x, 5 ); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
299 static bool is_simm8( intptr_t x) { return is_simm(x, 8 ); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
300 static bool is_simm10(intptr_t x) { return is_simm(x, 10); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
301 static bool is_simm11(intptr_t x) { return is_simm(x, 11); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
302 static bool is_simm12(intptr_t x) { return is_simm(x, 12); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
303 static bool is_simm13(intptr_t x) { return is_simm(x, 13); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
304 static bool is_simm16(intptr_t x) { return is_simm(x, 16); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
305 static bool is_simm26(intptr_t x) { return is_simm(x, 26); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
306 static bool is_simm32(intptr_t x) { return is_simm(x, 32); } |
6729bbc1fcd6
7003454: order constants in constant table by number of references in code
twisti
parents:
2426
diff
changeset
|
307 |
0 | 308 // Accessors |
309 CodeSection* code_section() const { return _code_section; } | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
310 CodeBuffer* code() const { return code_section()->outer(); } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
311 int sect() const { return code_section()->index(); } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
312 address pc() const { return code_section()->end(); } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
313 int offset() const { return code_section()->size(); } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
314 int locator() const { return CodeBuffer::locator(offset(), sect()); } |
7198
6ab62ad83507
8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents:
7197
diff
changeset
|
315 |
0 | 316 OopRecorder* oop_recorder() const { return _oop_recorder; } |
317 void set_oop_recorder(OopRecorder* r) { _oop_recorder = r; } | |
318 | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
319 address inst_mark() const { return code_section()->mark(); } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
320 void set_inst_mark() { code_section()->set_mark(); } |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
321 void clear_inst_mark() { code_section()->clear_mark(); } |
0 | 322 |
323 // Constants in code | |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
324 void relocate(RelocationHolder const& rspec, int format = 0) { |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
325 assert(!pd_check_instruction_mark() |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
326 || inst_mark() == NULL || inst_mark() == code_section()->end(), |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
327 "call relocate() between instructions"); |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
328 code_section()->relocate(code_section()->end(), rspec, format); |
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
329 } |
0 | 330 void relocate( relocInfo::relocType rtype, int format = 0) { |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
7198
diff
changeset
|
331 code_section()->relocate(code_section()->end(), rtype, format); |
0 | 332 } |
333 | |
334 static int code_fill_byte(); // used to pad out odd-sized code buffers | |
335 | |
336 // Associate a comment with the current offset. It will be printed | |
337 // along with the disassembly when printing nmethods. Currently | |
338 // only supported in the instruction section of the code buffer. | |
339 void block_comment(const char* comment); | |
8767
a5de0cc2f91c
8008555: Debugging code in compiled method sometimes leaks memory
roland
parents:
7476
diff
changeset
|
340 // Copy str to a buffer that has the same lifetime as the CodeBuffer |
a5de0cc2f91c
8008555: Debugging code in compiled method sometimes leaks memory
roland
parents:
7476
diff
changeset
|
341 const char* code_string(const char* str); |
0 | 342 |
343 // Label functions | |
344 void bind(Label& L); // binds an unbound label L to the current code position | |
345 | |
346 // Move to a different section in the same code buffer. | |
347 void set_code_section(CodeSection* cs); | |
348 | |
349 // Inform assembler when generating stub code and relocation info | |
350 address start_a_stub(int required_space); | |
351 void end_a_stub(); | |
352 // Ditto for constants. | |
353 address start_a_const(int required_space, int required_align = sizeof(double)); | |
7197 | 354 void end_a_const(CodeSection* cs); // Pass the codesection to continue in (insts or stubs?). |
0 | 355 |
2008 | 356 // constants support |
7197 | 357 // |
358 // We must remember the code section (insts or stubs) in c1 | |
359 // so we can reset to the proper section in end_a_const(). | |
2008 | 360 address long_constant(jlong c) { |
7197 | 361 CodeSection* c1 = _code_section; |
2008 | 362 address ptr = start_a_const(sizeof(c), sizeof(c)); |
363 if (ptr != NULL) { | |
7198
6ab62ad83507
8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents:
7197
diff
changeset
|
364 emit_int64(c); |
7197 | 365 end_a_const(c1); |
2008 | 366 } |
367 return ptr; | |
368 } | |
0 | 369 address double_constant(jdouble c) { |
7197 | 370 CodeSection* c1 = _code_section; |
0 | 371 address ptr = start_a_const(sizeof(c), sizeof(c)); |
372 if (ptr != NULL) { | |
7198
6ab62ad83507
8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents:
7197
diff
changeset
|
373 emit_double(c); |
7197 | 374 end_a_const(c1); |
0 | 375 } |
376 return ptr; | |
377 } | |
378 address float_constant(jfloat c) { | |
7197 | 379 CodeSection* c1 = _code_section; |
0 | 380 address ptr = start_a_const(sizeof(c), sizeof(c)); |
381 if (ptr != NULL) { | |
7198
6ab62ad83507
8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents:
7197
diff
changeset
|
382 emit_float(c); |
7197 | 383 end_a_const(c1); |
0 | 384 } |
385 return ptr; | |
386 } | |
2008 | 387 address address_constant(address c) { |
7197 | 388 CodeSection* c1 = _code_section; |
2008 | 389 address ptr = start_a_const(sizeof(c), sizeof(c)); |
390 if (ptr != NULL) { | |
7198
6ab62ad83507
8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents:
7197
diff
changeset
|
391 emit_address(c); |
7197 | 392 end_a_const(c1); |
2008 | 393 } |
394 return ptr; | |
395 } | |
0 | 396 address address_constant(address c, RelocationHolder const& rspec) { |
7197 | 397 CodeSection* c1 = _code_section; |
0 | 398 address ptr = start_a_const(sizeof(c), sizeof(c)); |
399 if (ptr != NULL) { | |
400 relocate(rspec); | |
7198
6ab62ad83507
8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents:
7197
diff
changeset
|
401 emit_address(c); |
7197 | 402 end_a_const(c1); |
0 | 403 } |
404 return ptr; | |
405 } | |
406 | |
622
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
407 // Bootstrapping aid to cope with delayed determination of constants. |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
408 // Returns a static address which will eventually contain the constant. |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
409 // The value zero (NULL) stands instead of a constant which is still uncomputed. |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
410 // Thus, the eventual value of the constant must not be zero. |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
411 // This is fine, since this is designed for embedding object field |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
412 // offsets in code which must be generated before the object class is loaded. |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
413 // Field offsets are never zero, since an object's header (mark word) |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
414 // is located at offset zero. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4766
diff
changeset
|
415 RegisterOrConstant delayed_value(int(*value_fn)(), Register tmp, int offset = 0); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4766
diff
changeset
|
416 RegisterOrConstant delayed_value(address(*value_fn)(), Register tmp, int offset = 0); |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
622
diff
changeset
|
417 virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset) = 0; |
622
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
418 // Last overloading is platform-dependent; look in assembler_<arch>.cpp. |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
419 static intptr_t* delayed_value_addr(int(*constant_fn)()); |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
420 static intptr_t* delayed_value_addr(address(*constant_fn)()); |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
421 static void update_delayed_values(); |
56aae7be60d4
6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents:
605
diff
changeset
|
422 |
0 | 423 // Bang stack to trigger StackOverflowError at a safe location |
424 // implementation delegates to machine-specific bang_stack_with_offset | |
425 void generate_stack_overflow_check( int frame_size_in_bytes ); | |
426 virtual void bang_stack_with_offset(int offset) = 0; | |
427 | |
428 | |
429 /** | |
430 * A platform-dependent method to patch a jump instruction that refers | |
431 * to this label. | |
432 * | |
433 * @param branch the location of the instruction to patch | |
434 * @param masm the assembler which generated the branch | |
435 */ | |
436 void pd_patch_instruction(address branch, address target); | |
437 | |
438 }; | |
439 | |
1972 | 440 #ifdef TARGET_ARCH_x86 |
441 # include "assembler_x86.hpp" | |
442 #endif | |
443 #ifdef TARGET_ARCH_sparc | |
444 # include "assembler_sparc.hpp" | |
445 #endif | |
446 #ifdef TARGET_ARCH_zero | |
447 # include "assembler_zero.hpp" | |
448 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
449 #ifdef TARGET_ARCH_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
450 # include "assembler_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
451 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
452 #ifdef TARGET_ARCH_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
453 # include "assembler_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2008
diff
changeset
|
454 #endif |
1972 | 455 |
456 | |
457 #endif // SHARE_VM_ASM_ASSEMBLER_HPP |