< prev index next >

src/hotspot/cpu/arm/c1_MacroAssembler_arm.cpp

Print this page

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 }
< prev index next >