131 // we do unlocking via runtime call 132 jcc(Assembler::notEqual, slow_case); 133 // done 134 bind(done); 135 } 136 137 138 // Defines obj, preserves var_size_in_bytes 139 void C1_MacroAssembler::try_allocate(Register obj, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, Label& slow_case) { 140 if (UseTLAB) { 141 tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case); 142 } else { 143 eden_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case); 144 incr_allocated_bytes(noreg, var_size_in_bytes, con_size_in_bytes, t1); 145 } 146 } 147 148 149 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) { 150 assert_different_registers(obj, klass, len); 151 if (UseBiasedLocking && !len->is_valid()) { 152 assert_different_registers(obj, klass, len, t1, t2); 153 movptr(t1, Address(klass, Klass::prototype_header_offset())); 154 movptr(Address(obj, oopDesc::mark_offset_in_bytes()), t1); 155 } else { 156 // This assumes that all prototype bits fit in an int32_t 157 movptr(Address(obj, oopDesc::mark_offset_in_bytes ()), (int32_t)(intptr_t)markOopDesc::prototype()); 158 } 159 #ifdef _LP64 160 if (UseCompressedClassPointers) { // Take care not to kill klass 161 movptr(t1, klass); 162 encode_klass_not_null(t1); 163 movl(Address(obj, oopDesc::klass_offset_in_bytes()), t1); 164 } else 165 #endif 166 { 167 movptr(Address(obj, oopDesc::klass_offset_in_bytes()), klass); 168 } 169 170 if (len->is_valid()) { 171 movl(Address(obj, arrayOopDesc::length_offset_in_bytes()), len); 172 } 173 #ifdef _LP64 174 else if (UseCompressedClassPointers) { 175 xorptr(t1, t1); 176 store_klass_gap(obj, t1); 177 } 178 #endif 179 } 180 181 182 // preserves obj, destroys len_in_bytes 183 void C1_MacroAssembler::initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1) { 184 Label done; 185 assert(obj != len_in_bytes && obj != t1 && t1 != len_in_bytes, "registers must be different"); 186 assert((hdr_size_in_bytes & (BytesPerWord - 1)) == 0, "header size is not a multiple of BytesPerWord"); 187 Register index = len_in_bytes; 188 // index is positive and ptr sized 189 subptr(index, hdr_size_in_bytes); 190 jcc(Assembler::zero, done); | 131 // we do unlocking via runtime call 132 jcc(Assembler::notEqual, slow_case); 133 // done 134 bind(done); 135 } 136 137 138 // Defines obj, preserves var_size_in_bytes 139 void C1_MacroAssembler::try_allocate(Register obj, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, Label& slow_case) { 140 if (UseTLAB) { 141 tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case); 142 } else { 143 eden_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case); 144 incr_allocated_bytes(noreg, var_size_in_bytes, con_size_in_bytes, t1); 145 } 146 } 147 148 149 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) { 150 assert_different_registers(obj, klass, len); 151 if (UseBiasedLocking && !len.is_valid()) { 152 assert_different_registers(obj, klass, len, t1, t2); 153 movptr(t1, Address(klass, Klass::prototype_header_offset())); 154 movptr(Address(obj, oopDesc::mark_offset_in_bytes()), t1); 155 } else { 156 // This assumes that all prototype bits fit in an int32_t 157 movptr(Address(obj, oopDesc::mark_offset_in_bytes ()), (int32_t)(intptr_t)markOopDesc::prototype()); 158 } 159 #ifdef _LP64 160 if (UseCompressedClassPointers) { // Take care not to kill klass 161 movptr(t1, klass); 162 encode_klass_not_null(t1); 163 movl(Address(obj, oopDesc::klass_offset_in_bytes()), t1); 164 } else 165 #endif 166 { 167 movptr(Address(obj, oopDesc::klass_offset_in_bytes()), klass); 168 } 169 170 if (len.is_valid()) { 171 movl(Address(obj, arrayOopDesc::length_offset_in_bytes()), len); 172 } 173 #ifdef _LP64 174 else if (UseCompressedClassPointers) { 175 xorptr(t1, t1); 176 store_klass_gap(obj, t1); 177 } 178 #endif 179 } 180 181 182 // preserves obj, destroys len_in_bytes 183 void C1_MacroAssembler::initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1) { 184 Label done; 185 assert(obj != len_in_bytes && obj != t1 && t1 != len_in_bytes, "registers must be different"); 186 assert((hdr_size_in_bytes & (BytesPerWord - 1)) == 0, "header size is not a multiple of BytesPerWord"); 187 Register index = len_in_bytes; 188 // index is positive and ptr sized 189 subptr(index, hdr_size_in_bytes); 190 jcc(Assembler::zero, done); |