1
1
/*
2
- * Copyright (c) 1999, 2023 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 1999, 2024 , Oracle and/or its affiliates. All rights reserved.
3
3
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
4
4
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
5
5
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -280,7 +280,7 @@ void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register
280
280
verify_oop (obj);
281
281
}
282
282
283
- void C1_MacroAssembler::allocate_array (Register obj, Register len, Register tmp1, Register tmp2, int header_size , int f, Register klass, Label& slow_case) {
283
+ void C1_MacroAssembler::allocate_array (Register obj, Register len, Register tmp1, Register tmp2, int base_offset_in_bytes , int f, Register klass, Label& slow_case) {
284
284
assert_different_registers (obj, len, tmp1, tmp2, klass);
285
285
286
286
// determine alignment mask
@@ -292,17 +292,28 @@ void C1_MacroAssembler::allocate_array(Register obj, Register len, Register tmp1
292
292
293
293
const Register arr_size = tmp2; // okay to be the same
294
294
// align object end
295
- mv (arr_size, (int32_t )header_size * BytesPerWord + MinObjAlignmentInBytesMask);
295
+ mv (arr_size, (int32_t )base_offset_in_bytes + MinObjAlignmentInBytesMask);
296
296
shadd (arr_size, len, arr_size, t0, f);
297
297
andi (arr_size, arr_size, ~(uint )MinObjAlignmentInBytesMask);
298
298
299
299
try_allocate (obj, arr_size, 0 , tmp1, tmp2, slow_case);
300
300
301
301
initialize_header (obj, klass, len, tmp1, tmp2);
302
302
303
+ // Clear leading 4 bytes, if necessary.
304
+ // TODO: This could perhaps go into initialize_body() and also clear the leading 4 bytes
305
+ // for non-array objects, thereby replacing the klass-gap clearing code in initialize_header().
306
+ int base_offset = base_offset_in_bytes;
307
+ if (!is_aligned (base_offset, BytesPerWord)) {
308
+ assert (is_aligned (base_offset, BytesPerInt), " must be 4-byte aligned" );
309
+ sw (zr, Address (obj, base_offset));
310
+ base_offset += BytesPerInt;
311
+ }
312
+ assert (is_aligned (base_offset, BytesPerWord), " must be word-aligned" );
313
+
303
314
// clear rest of allocated space
304
315
const Register len_zero = len;
305
- initialize_body (obj, arr_size, header_size * BytesPerWord , len_zero);
316
+ initialize_body (obj, arr_size, base_offset , len_zero);
306
317
307
318
membar (MacroAssembler::StoreStore);
308
319
0 commit comments