[liuqi at icedtea.classpath.org: /hg/openjdk6-mips: Fix a bug in computing the size of an array.]
LIU Qi
liuqi at loongson.cn
Mon Oct 25 01:22:08 PDT 2010
----- Forwarded message from liuqi at icedtea.classpath.org -----
Date: Mon, 25 Oct 2010 08:19:37 +0000
From: liuqi at icedtea.classpath.org
To: distro-pkg-dev at openjdk.java.net
Subject: /hg/openjdk6-mips: Fix a bug in computing the size of an array.
changeset d1c481f44844 in /hg/openjdk6-mips
details: http://icedtea.classpath.org/hg/openjdk6-mips?cmd=changeset;node=d1c481f44844
author: YANG Yongqiang <yangyongqiang at loongson.cn>
date: Mon Oct 25 15:43:04 2010 +0800
Fix a bug in computing the size of an array.
The size of an array is computed with error in the stub (either
new_type_array_id or new_object_array_id) which allocates space for
arrays.
diffstat:
1 file changed, 17 insertions(+), 18 deletions(-)
hotspot/src/cpu/mips/vm/c1_Runtime1_mips.cpp | 35 ++++++++++++--------------
diffs (74 lines):
diff -r 71f3d14ed0eb -r d1c481f44844 hotspot/src/cpu/mips/vm/c1_Runtime1_mips.cpp
--- a/hotspot/src/cpu/mips/vm/c1_Runtime1_mips.cpp Sun Oct 24 21:58:11 2010 +0800
+++ b/hotspot/src/cpu/mips/vm/c1_Runtime1_mips.cpp Mon Oct 25 15:43:04 2010 +0800
@@ -894,26 +894,26 @@ OopMapSet* Runtime1::generate_code_for(S
__ slt(AT, AT, length);
__ bne(AT, ZERO, slow_path);
__ delayed()->nop();
-
+
// if we got here then the TLAB allocation failed, so try
// refilling the TLAB or allocating directly from eden.
Label retry_tlab, try_eden;
//T0,T1,T5,T8 have changed!
- __ tlab_refill(retry_tlab, try_eden, slow_path); // preserves ebx & edx
+ __ tlab_refill(retry_tlab, try_eden, slow_path); // preserves T2 & T4
__ bind(retry_tlab);
// get the allocation size: (length << (layout_helper & 0x1F)) + header_size
__ lw(t1, klass, klassOopDesc::header_size() * HeapWordSize
+ Klass::layout_helper_offset_in_bytes());
- __ srl(AT, t1, Klass::_lh_log2_element_size_shift);
- __ andi(AT, AT, Klass::_lh_log2_element_size_mask);
+ __ andi(AT, t1, 0x1f);
__ sllv(arr_size, length, AT);
- __ srl(AT, t1, Klass::_lh_header_size_shift);
- __ andi(AT, AT, Klass::_lh_header_size_mask);
- __ add(arr_size, AT, arr_size);
+ __ srl(t1, t1, Klass::_lh_header_size_shift);
+ __ andi(t1, t1, Klass::_lh_header_size_mask);
+ __ add(arr_size, t1, arr_size);
__ addi(arr_size, arr_size, MinObjAlignmentInBytesMask); // align up
- __ andi(arr_size, arr_size, ~MinObjAlignmentInBytesMask);
+ __ move(AT, ~MinObjAlignmentInBytesMask);
+ __ andr(arr_size, arr_size, AT);
__ tlab_allocate(obj, arr_size, 0, t1, t2, slow_path); // preserves arr_size
@@ -921,6 +921,8 @@ OopMapSet* Runtime1::generate_code_for(S
__ lbu(t1, Address(klass, klassOopDesc::header_size() * HeapWordSize
+ Klass::layout_helper_offset_in_bytes()
+ (Klass::_lh_header_size_shift / BitsPerByte)));
+ assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise");
+ assert(Klass::_lh_header_size_mask <= 0xFF, "bytewise");
__ andi(t1, t1, Klass::_lh_header_size_mask);
__ sub(arr_size, arr_size, t1); // body length
__ add(t1, t1, obj); // body start
@@ -932,19 +934,16 @@ OopMapSet* Runtime1::generate_code_for(S
__ bind(try_eden);
// get the allocation size: (length << (layout_helper & 0x1F)) + header_size
__ lw(t1, klass, klassOopDesc::header_size() * HeapWordSize
- + Klass::layout_helper_offset_in_bytes());
- __ srl(AT, t1, Klass::_lh_log2_element_size_shift);
- __ andi(AT, AT, Klass::_lh_log2_element_size_mask);
+ + Klass::layout_helper_offset_in_bytes());
+ __ andi(AT, t1, 0x1f);
__ sllv(arr_size, length, AT);
- __ srl(AT, t1, Klass::_lh_header_size_shift);
- __ andi(AT, AT, Klass::_lh_header_size_mask);
- __ add(arr_size, AT, arr_size);
+ __ srl(t1, t1, Klass::_lh_header_size_shift);
+ __ andi(t1, t1, Klass::_lh_header_size_mask);
+ __ add(arr_size, t1, arr_size);
__ addi(arr_size, arr_size, MinObjAlignmentInBytesMask); // align up
- __ andi(arr_size, arr_size, ~MinObjAlignmentInBytesMask);
-
-
+ __ move(AT, ~MinObjAlignmentInBytesMask);
+ __ andr(arr_size, arr_size, AT);
__ eden_allocate(obj, arr_size, 0, t1, t2, slow_path); // preserves arr_size
-
__ initialize_header(obj, klass, length,t1,t2);
__ lbu(t1, Address(klass, klassOopDesc::header_size() * HeapWordSize
+ Klass::layout_helper_offset_in_bytes()
----- End forwarded message -----
--
LIU Qi
liuqi at loongson.cn
liuqi82 at gmail.com
Loongson Technology Co. Ltd.
PGP Key fingerprint:
3D29 FDFD AFB3 225D B744
7FAB 51C7 4820 63BA 272F
More information about the mips-port
mailing list