146 Register klass, Label& slow_case) {
147 assert_different_registers(obj, tmp1, tmp2, tmp3, klass, Rtemp);
148 assert(header_size >= 0 && object_size >= header_size, "illegal sizes");
149 const int object_size_in_bytes = object_size * BytesPerWord;
150
151 const Register obj_end = tmp1;
152 const Register len = noreg;
153
154 if (Assembler::is_arith_imm_in_range(object_size_in_bytes)) {
155 try_allocate(obj, obj_end, tmp2, tmp3, object_size_in_bytes, slow_case);
156 } else {
157 // Rtemp should be free at c1 LIR level
158 mov_slow(Rtemp, object_size_in_bytes);
159 try_allocate(obj, obj_end, tmp2, tmp3, Rtemp, slow_case);
160 }
161 initialize_object(obj, obj_end, klass, len, tmp2, tmp3, instanceOopDesc::header_size() * HeapWordSize, object_size_in_bytes, /* is_tlab_allocated */ UseTLAB);
162 }
163
164 void C1_MacroAssembler::allocate_array(Register obj, Register len,
165 Register tmp1, Register tmp2, Register tmp3,
166 int header_size, int element_size,
167 Register klass, Label& slow_case) {
168 assert_different_registers(obj, len, tmp1, tmp2, tmp3, klass, Rtemp);
169 const int header_size_in_bytes = header_size * BytesPerWord;
170 const int scale_shift = exact_log2(element_size);
171 const Register obj_size = Rtemp; // Rtemp should be free at c1 LIR level
172
173 cmp_32(len, max_array_allocation_length);
174 b(slow_case, hs);
175
176 bool align_header = ((header_size_in_bytes | element_size) & MinObjAlignmentInBytesMask) != 0;
177 assert(align_header || ((header_size_in_bytes & MinObjAlignmentInBytesMask) == 0), "must be");
178 assert(align_header || ((element_size & MinObjAlignmentInBytesMask) == 0), "must be");
179
180 mov(obj_size, header_size_in_bytes + (align_header ? (MinObjAlignmentInBytes - 1) : 0));
181 add_ptr_scaled_int32(obj_size, obj_size, len, scale_shift);
182
183 if (align_header) {
184 align_reg(obj_size, obj_size, MinObjAlignmentInBytes);
185 }
186
187 try_allocate(obj, tmp1, tmp2, tmp3, obj_size, slow_case);
188 initialize_object(obj, tmp1, klass, len, tmp2, tmp3, header_size_in_bytes, -1, /* is_tlab_allocated */ UseTLAB);
189 }
|
146 Register klass, Label& slow_case) {
147 assert_different_registers(obj, tmp1, tmp2, tmp3, klass, Rtemp);
148 assert(header_size >= 0 && object_size >= header_size, "illegal sizes");
149 const int object_size_in_bytes = object_size * BytesPerWord;
150
151 const Register obj_end = tmp1;
152 const Register len = noreg;
153
154 if (Assembler::is_arith_imm_in_range(object_size_in_bytes)) {
155 try_allocate(obj, obj_end, tmp2, tmp3, object_size_in_bytes, slow_case);
156 } else {
157 // Rtemp should be free at c1 LIR level
158 mov_slow(Rtemp, object_size_in_bytes);
159 try_allocate(obj, obj_end, tmp2, tmp3, Rtemp, slow_case);
160 }
161 initialize_object(obj, obj_end, klass, len, tmp2, tmp3, instanceOopDesc::header_size() * HeapWordSize, object_size_in_bytes, /* is_tlab_allocated */ UseTLAB);
162 }
163
164 void C1_MacroAssembler::allocate_array(Register obj, Register len,
165 Register tmp1, Register tmp2, Register tmp3,
166 int header_size_in_bytes, int element_size,
167 Register klass, Label& slow_case) {
168 assert_different_registers(obj, len, tmp1, tmp2, tmp3, klass, Rtemp);
169 const int scale_shift = exact_log2(element_size);
170 const Register obj_size = Rtemp; // Rtemp should be free at c1 LIR level
171
172 cmp_32(len, max_array_allocation_length);
173 b(slow_case, hs);
174
175 bool align_header = ((header_size_in_bytes | element_size) & MinObjAlignmentInBytesMask) != 0;
176 assert(align_header || ((header_size_in_bytes & MinObjAlignmentInBytesMask) == 0), "must be");
177 assert(align_header || ((element_size & MinObjAlignmentInBytesMask) == 0), "must be");
178
179 mov(obj_size, header_size_in_bytes + (align_header ? (MinObjAlignmentInBytes - 1) : 0));
180 add_ptr_scaled_int32(obj_size, obj_size, len, scale_shift);
181
182 if (align_header) {
183 align_reg(obj_size, obj_size, MinObjAlignmentInBytes);
184 }
185
186 try_allocate(obj, tmp1, tmp2, tmp3, obj_size, slow_case);
187 initialize_object(obj, tmp1, klass, len, tmp2, tmp3, header_size_in_bytes, -1, /* is_tlab_allocated */ UseTLAB);
188 }
|