164 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
165 int con_size_in_bytes, // object size in bytes if known at compile time
166 Register t1, // temp register, must be global register for incr_allocated_bytes
167 Register t2, // temp register
168 Label& slow_case // continuation point if fast allocation fails
169 ) {
170 RegisterOrConstant size_in_bytes = var_size_in_bytes->is_valid()
171 ? RegisterOrConstant(var_size_in_bytes) : RegisterOrConstant(con_size_in_bytes);
172 if (UseTLAB) {
173 tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case);
174 } else {
175 eden_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case);
176 incr_allocated_bytes(size_in_bytes, t1, t2);
177 }
178 }
179
180
181 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
182 assert_different_registers(obj, klass, len, t1, t2);
183 if (UseBiasedLocking && !len->is_valid()) {
184 ld_ptr(klass, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes(), t1);
185 } else {
186 set((intx)markOopDesc::prototype(), t1);
187 }
188 st_ptr(t1, obj, oopDesc::mark_offset_in_bytes());
189 if (UseCompressedOops) {
190 // Save klass
191 mov(klass, t1);
192 encode_heap_oop_not_null(t1);
193 stw(t1, obj, oopDesc::klass_offset_in_bytes());
194 } else {
195 st_ptr(klass, obj, oopDesc::klass_offset_in_bytes());
196 }
197 if (len->is_valid()) st(len, obj, arrayOopDesc::length_offset_in_bytes());
198 else if (UseCompressedOops) {
199 store_klass_gap(G0, obj);
200 }
201 }
202
203
204 void C1_MacroAssembler::initialize_body(Register base, Register index) {
235 try_allocate(obj, noreg, obj_size * wordSize, t2, t3, slow_case);
236
237 initialize_object(obj, klass, noreg, obj_size * HeapWordSize, t1, t2);
238 }
239
240 void C1_MacroAssembler::initialize_object(
241 Register obj, // result: pointer to object after successful allocation
242 Register klass, // object klass
243 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
244 int con_size_in_bytes, // object size in bytes if known at compile time
245 Register t1, // temp register
246 Register t2 // temp register
247 ) {
248 const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
249
250 initialize_header(obj, klass, noreg, t1, t2);
251
252 #ifdef ASSERT
253 {
254 Label ok;
255 ld(klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes(), t1);
256 if (var_size_in_bytes != noreg) {
257 cmp_and_brx_short(t1, var_size_in_bytes, Assembler::equal, Assembler::pt, ok);
258 } else {
259 cmp_and_brx_short(t1, con_size_in_bytes, Assembler::equal, Assembler::pt, ok);
260 }
261 stop("bad size in initialize_object");
262 should_not_reach_here();
263
264 bind(ok);
265 }
266
267 #endif
268
269 // initialize body
270 const int threshold = 5 * HeapWordSize; // approximate break even point for code size
271 if (var_size_in_bytes != noreg) {
272 // use a loop
273 add(obj, hdr_size_in_bytes, t1); // compute address of first element
274 sub(var_size_in_bytes, hdr_size_in_bytes, t2); // compute size of body
275 initialize_body(t1, t2);
|
164 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
165 int con_size_in_bytes, // object size in bytes if known at compile time
166 Register t1, // temp register, must be global register for incr_allocated_bytes
167 Register t2, // temp register
168 Label& slow_case // continuation point if fast allocation fails
169 ) {
170 RegisterOrConstant size_in_bytes = var_size_in_bytes->is_valid()
171 ? RegisterOrConstant(var_size_in_bytes) : RegisterOrConstant(con_size_in_bytes);
172 if (UseTLAB) {
173 tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case);
174 } else {
175 eden_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case);
176 incr_allocated_bytes(size_in_bytes, t1, t2);
177 }
178 }
179
180
181 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
182 assert_different_registers(obj, klass, len, t1, t2);
183 if (UseBiasedLocking && !len->is_valid()) {
184 ld_ptr(klass, Klass::prototype_header_offset_in_bytes(), t1);
185 } else {
186 set((intx)markOopDesc::prototype(), t1);
187 }
188 st_ptr(t1, obj, oopDesc::mark_offset_in_bytes());
189 if (UseCompressedOops) {
190 // Save klass
191 mov(klass, t1);
192 encode_heap_oop_not_null(t1);
193 stw(t1, obj, oopDesc::klass_offset_in_bytes());
194 } else {
195 st_ptr(klass, obj, oopDesc::klass_offset_in_bytes());
196 }
197 if (len->is_valid()) st(len, obj, arrayOopDesc::length_offset_in_bytes());
198 else if (UseCompressedOops) {
199 store_klass_gap(G0, obj);
200 }
201 }
202
203
204 void C1_MacroAssembler::initialize_body(Register base, Register index) {
235 try_allocate(obj, noreg, obj_size * wordSize, t2, t3, slow_case);
236
237 initialize_object(obj, klass, noreg, obj_size * HeapWordSize, t1, t2);
238 }
239
240 void C1_MacroAssembler::initialize_object(
241 Register obj, // result: pointer to object after successful allocation
242 Register klass, // object klass
243 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
244 int con_size_in_bytes, // object size in bytes if known at compile time
245 Register t1, // temp register
246 Register t2 // temp register
247 ) {
248 const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
249
250 initialize_header(obj, klass, noreg, t1, t2);
251
252 #ifdef ASSERT
253 {
254 Label ok;
255 ld(klass, Klass::layout_helper_offset_in_bytes(), t1);
256 if (var_size_in_bytes != noreg) {
257 cmp_and_brx_short(t1, var_size_in_bytes, Assembler::equal, Assembler::pt, ok);
258 } else {
259 cmp_and_brx_short(t1, con_size_in_bytes, Assembler::equal, Assembler::pt, ok);
260 }
261 stop("bad size in initialize_object");
262 should_not_reach_here();
263
264 bind(ok);
265 }
266
267 #endif
268
269 // initialize body
270 const int threshold = 5 * HeapWordSize; // approximate break even point for code size
271 if (var_size_in_bytes != noreg) {
272 // use a loop
273 add(obj, hdr_size_in_bytes, t1); // compute address of first element
274 sub(var_size_in_bytes, hdr_size_in_bytes, t2); // compute size of body
275 initialize_body(t1, t2);
|