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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "incls/_precompiled.incl"
26 #include "incls/_c1_MacroAssembler_sparc.cpp.incl"
27
28 void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
29 Label L;
30 const Register temp_reg = G3_scratch;
31 // Note: needs more testing of out-of-line vs. inline slow case
32 verify_oop(receiver);
33 ld_ptr(receiver, oopDesc::klass_offset_in_bytes(), temp_reg);
34 cmp(temp_reg, iCache);
35 brx(Assembler::equal, true, Assembler::pt, L);
36 delayed()->nop();
37 AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub());
38 jump_to(ic_miss, temp_reg);
39 delayed()->nop();
40 align(CodeEntryAlignment);
41 bind(L);
42 }
43
44
45 void C1_MacroAssembler::explicit_null_check(Register base) {
46 Unimplemented();
47 }
48
49
50 void C1_MacroAssembler::build_frame(int frame_size_in_bytes) {
51
52 generate_stack_overflow_check(frame_size_in_bytes);
53 // Create the frame.
158 int con_size_in_bytes, // object size in bytes if known at compile time
159 Register t1, // temp register
160 Register t2, // temp register
161 Label& slow_case // continuation point if fast allocation fails
162 ) {
163 if (UseTLAB) {
164 tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case);
165 } else {
166 eden_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case);
167 }
168 }
169
170
171 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
172 assert_different_registers(obj, klass, len, t1, t2);
173 if (UseBiasedLocking && !len->is_valid()) {
174 ld_ptr(klass, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes(), t1);
175 } else {
176 set((intx)markOopDesc::prototype(), t1);
177 }
178 st_ptr(t1 , obj, oopDesc::mark_offset_in_bytes ());
179 st_ptr(klass, obj, oopDesc::klass_offset_in_bytes ());
180 if (len->is_valid()) st(len , obj, arrayOopDesc::length_offset_in_bytes());
181 }
182
183
184 void C1_MacroAssembler::initialize_body(Register base, Register index) {
185 assert_different_registers(base, index);
186 Label loop;
187 bind(loop);
188 subcc(index, HeapWordSize, index);
189 brx(Assembler::greaterEqual, true, Assembler::pt, loop);
190 delayed()->st_ptr(G0, base, index);
191 }
192
193
194 void C1_MacroAssembler::allocate_object(
195 Register obj, // result: pointer to object after successful allocation
196 Register t1, // temp register
197 Register t2, // temp register
198 Register t3, // temp register
199 int hdr_size, // object header size in words
200 int obj_size, // object size in words
208 if (!is_simm13(obj_size * wordSize)) {
209 // would need to use extra register to load
210 // object size => go the slow case for now
211 br(Assembler::always, false, Assembler::pt, slow_case);
212 delayed()->nop();
213 return;
214 }
215 try_allocate(obj, noreg, obj_size * wordSize, t2, t3, slow_case);
216
217 initialize_object(obj, klass, noreg, obj_size * HeapWordSize, t1, t2);
218 }
219
220 void C1_MacroAssembler::initialize_object(
221 Register obj, // result: pointer to object after successful allocation
222 Register klass, // object klass
223 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
224 int con_size_in_bytes, // object size in bytes if known at compile time
225 Register t1, // temp register
226 Register t2 // temp register
227 ) {
228 const int hdr_size_in_bytes = instanceOopDesc::base_offset_in_bytes();
229
230 initialize_header(obj, klass, noreg, t1, t2);
231
232 #ifdef ASSERT
233 {
234 Label ok;
235 ld(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes(), t1);
236 if (var_size_in_bytes != noreg) {
237 cmp(t1, var_size_in_bytes);
238 } else {
239 cmp(t1, con_size_in_bytes);
240 }
241 brx(Assembler::equal, false, Assembler::pt, ok);
242 delayed()->nop();
243 stop("bad size in initialize_object");
244 should_not_reach_here();
245
246 bind(ok);
247 }
248
|
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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "incls/_precompiled.incl"
26 #include "incls/_c1_MacroAssembler_sparc.cpp.incl"
27
28 void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
29 Label L;
30 const Register temp_reg = G3_scratch;
31 // Note: needs more testing of out-of-line vs. inline slow case
32 verify_oop(receiver);
33 load_klass(receiver, temp_reg);
34 cmp(temp_reg, iCache);
35 brx(Assembler::equal, true, Assembler::pt, L);
36 delayed()->nop();
37 AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub());
38 jump_to(ic_miss, temp_reg);
39 delayed()->nop();
40 align(CodeEntryAlignment);
41 bind(L);
42 }
43
44
45 void C1_MacroAssembler::explicit_null_check(Register base) {
46 Unimplemented();
47 }
48
49
50 void C1_MacroAssembler::build_frame(int frame_size_in_bytes) {
51
52 generate_stack_overflow_check(frame_size_in_bytes);
53 // Create the frame.
158 int con_size_in_bytes, // object size in bytes if known at compile time
159 Register t1, // temp register
160 Register t2, // temp register
161 Label& slow_case // continuation point if fast allocation fails
162 ) {
163 if (UseTLAB) {
164 tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case);
165 } else {
166 eden_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case);
167 }
168 }
169
170
171 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
172 assert_different_registers(obj, klass, len, t1, t2);
173 if (UseBiasedLocking && !len->is_valid()) {
174 ld_ptr(klass, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes(), t1);
175 } else {
176 set((intx)markOopDesc::prototype(), t1);
177 }
178 st_ptr(t1, obj, oopDesc::mark_offset_in_bytes());
179 #ifdef _LP64
180 if (UseCompressedOops) {
181 // Save klass
182 mov(klass, t1);
183 encode_heap_oop(t1);
184 stw(t1, obj, oopDesc::klass_offset_in_bytes());
185 } else
186 #endif
187 st_ptr(klass, obj, oopDesc::klass_offset_in_bytes());
188 if (len->is_valid()) st(len, obj, arrayOopDesc::length_offset_in_bytes());
189 #ifdef _LP64
190 else if (UseCompressedOops) {
191 store_klass_gap(G0, obj);
192 }
193 #endif
194 }
195
196
197 void C1_MacroAssembler::initialize_body(Register base, Register index) {
198 assert_different_registers(base, index);
199 Label loop;
200 bind(loop);
201 subcc(index, HeapWordSize, index);
202 brx(Assembler::greaterEqual, true, Assembler::pt, loop);
203 delayed()->st_ptr(G0, base, index);
204 }
205
206
207 void C1_MacroAssembler::allocate_object(
208 Register obj, // result: pointer to object after successful allocation
209 Register t1, // temp register
210 Register t2, // temp register
211 Register t3, // temp register
212 int hdr_size, // object header size in words
213 int obj_size, // object size in words
221 if (!is_simm13(obj_size * wordSize)) {
222 // would need to use extra register to load
223 // object size => go the slow case for now
224 br(Assembler::always, false, Assembler::pt, slow_case);
225 delayed()->nop();
226 return;
227 }
228 try_allocate(obj, noreg, obj_size * wordSize, t2, t3, slow_case);
229
230 initialize_object(obj, klass, noreg, obj_size * HeapWordSize, t1, t2);
231 }
232
233 void C1_MacroAssembler::initialize_object(
234 Register obj, // result: pointer to object after successful allocation
235 Register klass, // object klass
236 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
237 int con_size_in_bytes, // object size in bytes if known at compile time
238 Register t1, // temp register
239 Register t2 // temp register
240 ) {
241 const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
242
243 initialize_header(obj, klass, noreg, t1, t2);
244
245 #ifdef ASSERT
246 {
247 Label ok;
248 ld(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes(), t1);
249 if (var_size_in_bytes != noreg) {
250 cmp(t1, var_size_in_bytes);
251 } else {
252 cmp(t1, con_size_in_bytes);
253 }
254 brx(Assembler::equal, false, Assembler::pt, ok);
255 delayed()->nop();
256 stop("bad size in initialize_object");
257 should_not_reach_here();
258
259 bind(ok);
260 }
261
|