src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 7118863 Sdiff src/cpu/sparc/vm

src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp

Print this page




 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);


src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File