annotate src/share/vm/asm/assembler.hpp @ 1994:6cd6d394f280

7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed()) 7002546: regression on SpecJbb2005 on 7b118 comparing to 7b117 on small heaps Summary: Relaxed assertion checking related to incremental_collection_failed flag to allow for ExplicitGCInvokesConcurrent behaviour where we do not want a failing scavenge to bail to a stop-world collection. Parameterized incremental_collection_will_fail() so we can selectively use, or not use, as appropriate, the statistical prediction at specific use sites. This essentially reverts the scavenge bail-out logic to what it was prior to some recent changes that had inadvertently started using the statistical prediction which can be noisy in the presence of bursty loads. Added some associated verbose non-product debugging messages. Reviewed-by: johnc, tonyp
author ysr
date Tue, 07 Dec 2010 21:55:53 -0800
parents f95d63e2154a
children 2f644f85485d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
2 * Copyright (c) 1997, 2010, 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: 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
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: 1552
diff changeset
25 #ifndef SHARE_VM_ASM_ASSEMBLER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_ASM_ASSEMBLER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "code/oopRecorder.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "code/relocInfo.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "utilities/debug.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 # include "register_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 # include "vm_version_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 # include "register_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 # include "vm_version_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
43 # include "register_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44 # include "vm_version_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
45 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
46
605
98cb887364d3 6810672: Comment typos
twisti
parents: 0
diff changeset
47 // This file contains platform-independent assembler declarations.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class CodeBuffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class MacroAssembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class AbstractAssembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class Label;
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
55 * Labels represent destinations for control transfer instructions. Such
a61af66fc99e Initial load
duke
parents:
diff changeset
56 * instructions can accept a Label as their target argument. A Label is
a61af66fc99e Initial load
duke
parents:
diff changeset
57 * bound to the current location in the code stream by calling the
a61af66fc99e Initial load
duke
parents:
diff changeset
58 * MacroAssembler's 'bind' method, which in turn calls the Label's 'bind'
a61af66fc99e Initial load
duke
parents:
diff changeset
59 * method. A Label may be referenced by an instruction before it's bound
a61af66fc99e Initial load
duke
parents:
diff changeset
60 * (i.e., 'forward referenced'). 'bind' stores the current code offset
a61af66fc99e Initial load
duke
parents:
diff changeset
61 * in the Label object.
a61af66fc99e Initial load
duke
parents:
diff changeset
62 *
a61af66fc99e Initial load
duke
parents:
diff changeset
63 * If an instruction references a bound Label, the offset field(s) within
a61af66fc99e Initial load
duke
parents:
diff changeset
64 * the instruction are immediately filled in based on the Label's code
a61af66fc99e Initial load
duke
parents:
diff changeset
65 * offset. If an instruction references an unbound label, that
a61af66fc99e Initial load
duke
parents:
diff changeset
66 * instruction is put on a list of instructions that must be patched
a61af66fc99e Initial load
duke
parents:
diff changeset
67 * (i.e., 'resolved') when the Label is bound.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 *
a61af66fc99e Initial load
duke
parents:
diff changeset
69 * 'bind' will call the platform-specific 'patch_instruction' method to
a61af66fc99e Initial load
duke
parents:
diff changeset
70 * fill in the offset field(s) for each unresolved instruction (if there
a61af66fc99e Initial load
duke
parents:
diff changeset
71 * are any). 'patch_instruction' lives in one of the
a61af66fc99e Initial load
duke
parents:
diff changeset
72 * cpu/<arch>/vm/assembler_<arch>* files.
a61af66fc99e Initial load
duke
parents:
diff changeset
73 *
a61af66fc99e Initial load
duke
parents:
diff changeset
74 * Instead of using a linked list of unresolved instructions, a Label has
a61af66fc99e Initial load
duke
parents:
diff changeset
75 * an array of unresolved instruction code offsets. _patch_index
a61af66fc99e Initial load
duke
parents:
diff changeset
76 * contains the total number of forward references. If the Label's array
a61af66fc99e Initial load
duke
parents:
diff changeset
77 * overflows (i.e., _patch_index grows larger than the array size), a
a61af66fc99e Initial load
duke
parents:
diff changeset
78 * GrowableArray is allocated to hold the remaining offsets. (The cache
a61af66fc99e Initial load
duke
parents:
diff changeset
79 * size is 4 for now, which handles over 99.5% of the cases)
a61af66fc99e Initial load
duke
parents:
diff changeset
80 *
a61af66fc99e Initial load
duke
parents:
diff changeset
81 * Labels may only be used within a single CodeSection. If you need
a61af66fc99e Initial load
duke
parents:
diff changeset
82 * to create references between code sections, use explicit relocations.
a61af66fc99e Initial load
duke
parents:
diff changeset
83 */
a61af66fc99e Initial load
duke
parents:
diff changeset
84 class Label VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
86 enum { PatchCacheSize = 4 };
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // _loc encodes both the binding state (via its sign)
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // and the binding locator (via its value) of a label.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 //
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // _loc >= 0 bound label, loc() encodes the target (jump) position
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // _loc == -1 unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
93 int _loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // References to instructions that jump to this unresolved label.
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // These instructions need to be patched when the label is bound
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // using the platform-specific patchInstruction() method.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 //
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // To avoid having to allocate from the C-heap each time, we provide
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // a local cache and use the overflow only if we exceed the local cache
a61af66fc99e Initial load
duke
parents:
diff changeset
101 int _patches[PatchCacheSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
102 int _patch_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 GrowableArray<int>* _patch_overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 Label(const Label&) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
110 * After binding, be sure 'patch_instructions' is called later to link
a61af66fc99e Initial load
duke
parents:
diff changeset
111 */
a61af66fc99e Initial load
duke
parents:
diff changeset
112 void bind_loc(int loc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 assert(loc >= 0, "illegal locator");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 assert(_loc == -1, "already bound");
a61af66fc99e Initial load
duke
parents:
diff changeset
115 _loc = loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void bind_loc(int pos, int sect); // = bind_loc(locator(pos, sect))
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // Iterates over all unresolved instructions for printing
a61af66fc99e Initial load
duke
parents:
diff changeset
121 void print_instructions(MacroAssembler* masm) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
125 * Returns the position of the the Label in the code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
126 * The position is a 'locator', which encodes both offset and section.
a61af66fc99e Initial load
duke
parents:
diff changeset
127 */
a61af66fc99e Initial load
duke
parents:
diff changeset
128 int loc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 assert(_loc >= 0, "unbound label");
a61af66fc99e Initial load
duke
parents:
diff changeset
130 return _loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 int loc_pos() const; // == locator_pos(loc())
a61af66fc99e Initial load
duke
parents:
diff changeset
133 int loc_sect() const; // == locator_sect(loc())
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 bool is_bound() const { return _loc >= 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 bool is_unbound() const { return _loc == -1 && _patch_index > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 bool is_unused() const { return _loc == -1 && _patch_index == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
140 * Adds a reference to an unresolved displacement instruction to
a61af66fc99e Initial load
duke
parents:
diff changeset
141 * this unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
142 *
a61af66fc99e Initial load
duke
parents:
diff changeset
143 * @param cb the code buffer being patched
a61af66fc99e Initial load
duke
parents:
diff changeset
144 * @param branch_loc the locator of the branch instruction in the code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
145 */
a61af66fc99e Initial load
duke
parents:
diff changeset
146 void add_patch_at(CodeBuffer* cb, int branch_loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
149 * Iterate over the list of patches, resolving the instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
150 * Call patch_instruction on each 'branch_loc' value
a61af66fc99e Initial load
duke
parents:
diff changeset
151 */
a61af66fc99e Initial load
duke
parents:
diff changeset
152 void patch_instructions(MacroAssembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 _loc = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 _patch_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 _patch_overflow = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 Label() {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 init();
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 };
a61af66fc99e Initial load
duke
parents:
diff changeset
164
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
165 // 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
166 // 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
167 // statically.
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
168 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
169 private:
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
170 Register _r;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
171 intptr_t _c;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
172
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
173 public:
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
174 RegisterOrConstant(): _r(noreg), _c(0) {}
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
175 RegisterOrConstant(Register r): _r(r), _c(0) {}
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
176 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
177
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
178 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
179 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
180
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
181 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
182 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
183
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
184 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
185 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
186 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // The Abstract Assembler: Pure assembler doing NO optimizations on the
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // instruction level; i.e., what you write is what you get.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // The Assembler is generating code into a CodeBuffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
191 class AbstractAssembler : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 friend class Label;
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
195 CodeSection* _code_section; // section within the code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
196 address _code_begin; // first byte of code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
197 address _code_limit; // first byte after code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
198 address _code_pos; // current code generation position
a61af66fc99e Initial load
duke
parents:
diff changeset
199 OopRecorder* _oop_recorder; // support for relocInfo::oop_type
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // Code emission & accessing
a61af66fc99e Initial load
duke
parents:
diff changeset
202 address addr_at(int pos) const { return _code_begin + pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // This routine is called with a label is used for an address.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Labels and displacements truck in offsets, but target must return a PC.
a61af66fc99e Initial load
duke
parents:
diff changeset
206 address target(Label& L); // return _code_section->target(L)
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 bool is8bit(int x) const { return -0x80 <= x && x < 0x80; }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 bool isByte(int x) const { return 0 <= x && x < 0x100; }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 bool isShiftCount(int x) const { return 0 <= x && x < 32; }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void emit_byte(int x); // emit a single byte
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void emit_word(int x); // emit a 16-bit word (not a wordSize word!)
a61af66fc99e Initial load
duke
parents:
diff changeset
214 void emit_long(jint x); // emit a 32-bit word (not a longSize word!)
a61af66fc99e Initial load
duke
parents:
diff changeset
215 void emit_address(address x); // emit an address (not a longSize word!)
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Instruction boundaries (required when emitting relocatable values).
a61af66fc99e Initial load
duke
parents:
diff changeset
218 class InstructionMark: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
220 AbstractAssembler* _assm;
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
223 InstructionMark(AbstractAssembler* assm) : _assm(assm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 assert(assm->inst_mark() == NULL, "overlapping instructions");
a61af66fc99e Initial load
duke
parents:
diff changeset
225 _assm->set_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 ~InstructionMark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 _assm->clear_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 };
a61af66fc99e Initial load
duke
parents:
diff changeset
231 friend class InstructionMark;
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Make it return true on platforms which need to verify
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // instruction boundaries for some operations.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 inline static bool pd_check_instruction_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // Label functions
a61af66fc99e Initial load
duke
parents:
diff changeset
239 void print(Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Creation
a61af66fc99e Initial load
duke
parents:
diff changeset
244 AbstractAssembler(CodeBuffer* code);
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // save end pointer back to code buf.
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void sync();
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // ensure buf contains all code (call this before using/copying the code)
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
253 CodeBuffer* code() const; // _code_section->outer()
a61af66fc99e Initial load
duke
parents:
diff changeset
254 CodeSection* code_section() const { return _code_section; }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 int sect() const; // return _code_section->index()
a61af66fc99e Initial load
duke
parents:
diff changeset
256 address pc() const { return _code_pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 int offset() const { return _code_pos - _code_begin; }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 int locator() const; // CodeBuffer::locator(offset(), sect())
a61af66fc99e Initial load
duke
parents:
diff changeset
259 OopRecorder* oop_recorder() const { return _oop_recorder; }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void set_oop_recorder(OopRecorder* r) { _oop_recorder = r; }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 address inst_mark() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 void set_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 void clear_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Constants in code
a61af66fc99e Initial load
duke
parents:
diff changeset
267 void a_byte(int x);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 void a_long(jint x);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void relocate(RelocationHolder const& rspec, int format = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 void relocate( relocInfo::relocType rtype, int format = 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 if (rtype != relocInfo::none)
a61af66fc99e Initial load
duke
parents:
diff changeset
272 relocate(Relocation::spec_simple(rtype), format);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 static int code_fill_byte(); // used to pad out odd-sized code buffers
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Associate a comment with the current offset. It will be printed
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // along with the disassembly when printing nmethods. Currently
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // only supported in the instruction section of the code buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void block_comment(const char* comment);
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // Label functions
a61af66fc99e Initial load
duke
parents:
diff changeset
283 void bind(Label& L); // binds an unbound label L to the current code position
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Move to a different section in the same code buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 void set_code_section(CodeSection* cs);
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // Inform assembler when generating stub code and relocation info
a61af66fc99e Initial load
duke
parents:
diff changeset
289 address start_a_stub(int required_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 void end_a_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Ditto for constants.
a61af66fc99e Initial load
duke
parents:
diff changeset
292 address start_a_const(int required_space, int required_align = sizeof(double));
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // fp constants support
a61af66fc99e Initial load
duke
parents:
diff changeset
296 address double_constant(jdouble c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 address ptr = start_a_const(sizeof(c), sizeof(c));
a61af66fc99e Initial load
duke
parents:
diff changeset
298 if (ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 *(jdouble*)ptr = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 _code_pos = ptr + sizeof(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 return ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 address float_constant(jfloat c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 address ptr = start_a_const(sizeof(c), sizeof(c));
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if (ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 *(jfloat*)ptr = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 _code_pos = ptr + sizeof(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 return ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 address address_constant(address c, RelocationHolder const& rspec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 address ptr = start_a_const(sizeof(c), sizeof(c));
a61af66fc99e Initial load
duke
parents:
diff changeset
316 if (ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 relocate(rspec);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 *(address*)ptr = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 _code_pos = ptr + sizeof(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324 inline address address_constant(Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 inline address address_table_constant(GrowableArray<Label*> label);
a61af66fc99e Initial load
duke
parents:
diff changeset
326
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
327 // 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
328 // 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
329 // 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
330 // 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
331 // 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
332 // 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
333 // 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
334 // is located at offset zero.
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
335 RegisterOrConstant delayed_value(int(*value_fn)(), Register tmp, int offset = 0) {
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
336 return delayed_value_impl(delayed_value_addr(value_fn), tmp, offset);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
337 }
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
338 RegisterOrConstant delayed_value(address(*value_fn)(), Register tmp, int offset = 0) {
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
339 return delayed_value_impl(delayed_value_addr(value_fn), tmp, offset);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
340 }
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 622
diff changeset
341 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
342 // 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
343 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
344 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
345 static void update_delayed_values();
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
346
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Bang stack to trigger StackOverflowError at a safe location
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // implementation delegates to machine-specific bang_stack_with_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
349 void generate_stack_overflow_check( int frame_size_in_bytes );
a61af66fc99e Initial load
duke
parents:
diff changeset
350 virtual void bang_stack_with_offset(int offset) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
354 * A platform-dependent method to patch a jump instruction that refers
a61af66fc99e Initial load
duke
parents:
diff changeset
355 * to this label.
a61af66fc99e Initial load
duke
parents:
diff changeset
356 *
a61af66fc99e Initial load
duke
parents:
diff changeset
357 * @param branch the location of the instruction to patch
a61af66fc99e Initial load
duke
parents:
diff changeset
358 * @param masm the assembler which generated the branch
a61af66fc99e Initial load
duke
parents:
diff changeset
359 */
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void pd_patch_instruction(address branch, address target);
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
363 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
364 * Platform-dependent method of printing an instruction that needs to be
a61af66fc99e Initial load
duke
parents:
diff changeset
365 * patched.
a61af66fc99e Initial load
duke
parents:
diff changeset
366 *
a61af66fc99e Initial load
duke
parents:
diff changeset
367 * @param branch the instruction to be patched in the buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
368 */
a61af66fc99e Initial load
duke
parents:
diff changeset
369 static void pd_print_patched_instruction(address branch);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
371 };
a61af66fc99e Initial load
duke
parents:
diff changeset
372
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
373 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
374 # include "assembler_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
375 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
376 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
377 # include "assembler_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
378 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
379 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
380 # include "assembler_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
381 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
382
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
383
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
384 #endif // SHARE_VM_ASM_ASSEMBLER_HPP