6420645: Create a vm that uses compressed oops for up to 32gb heapsizes

Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv

Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
This commit is contained in:
Coleen Phillimore 2008-04-13 17:43:42 -04:00
parent 680ecf1611
commit 4a831d45f0
273 changed files with 6585 additions and 2993 deletions

View file

@ -430,11 +430,11 @@ bool methodOopDesc::can_be_statically_bound() const {
bool methodOopDesc::is_accessor() const {
if (code_size() != 5) return false;
if (size_of_parameters() != 1) return false;
if (Bytecodes::java_code_at(code_base()+0) != Bytecodes::_aload_0 ) return false;
if (Bytecodes::java_code_at(code_base()+1) != Bytecodes::_getfield) return false;
Bytecodes::Code ret_bc = Bytecodes::java_code_at(code_base()+4);
if (Bytecodes::java_code_at(code_base()+4) != Bytecodes::_areturn &&
Bytecodes::java_code_at(code_base()+4) != Bytecodes::_ireturn ) return false;
methodOop m = (methodOop)this; // pass to code_at() to avoid method_from_bcp
if (Bytecodes::java_code_at(code_base()+0, m) != Bytecodes::_aload_0 ) return false;
if (Bytecodes::java_code_at(code_base()+1, m) != Bytecodes::_getfield) return false;
if (Bytecodes::java_code_at(code_base()+4, m) != Bytecodes::_areturn &&
Bytecodes::java_code_at(code_base()+4, m) != Bytecodes::_ireturn ) return false;
return true;
}
@ -955,7 +955,7 @@ extern "C" {
// This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
static void reorder_based_on_method_index(objArrayOop methods,
objArrayOop annotations,
oop* temp_array) {
GrowableArray<oop>* temp_array) {
if (annotations == NULL) {
return;
}
@ -963,12 +963,15 @@ static void reorder_based_on_method_index(objArrayOop methods,
int length = methods->length();
int i;
// Copy to temp array
memcpy(temp_array, annotations->obj_at_addr(0), length * sizeof(oop));
temp_array->clear();
for (i = 0; i < length; i++) {
temp_array->append(annotations->obj_at(i));
}
// Copy back using old method indices
for (i = 0; i < length; i++) {
methodOop m = (methodOop) methods->obj_at(i);
annotations->obj_at_put(i, temp_array[m->method_idnum()]);
annotations->obj_at_put(i, temp_array->at(m->method_idnum()));
}
}
@ -997,7 +1000,7 @@ void methodOopDesc::sort_methods(objArrayOop methods,
// Use a simple bubble sort for small number of methods since
// qsort requires a functional pointer call for each comparison.
if (length < 8) {
if (UseCompressedOops || length < 8) {
bool sorted = true;
for (int i=length-1; i>0; i--) {
for (int j=0; j<i; j++) {
@ -1010,11 +1013,14 @@ void methodOopDesc::sort_methods(objArrayOop methods,
}
}
if (sorted) break;
sorted = true;
sorted = true;
}
} else {
// XXX This doesn't work for UseCompressedOops because the compare fn
// will have to decode the methodOop anyway making it not much faster
// than above.
compareFn compare = (compareFn) (idempotent ? method_compare_idempotent : method_compare);
qsort(methods->obj_at_addr(0), length, oopSize, compare);
qsort(methods->base(), length, heapOopSize, compare);
}
// Sort annotations if necessary
@ -1022,8 +1028,9 @@ void methodOopDesc::sort_methods(objArrayOop methods,
assert(methods_parameter_annotations == NULL || methods_parameter_annotations->length() == methods->length(), "");
assert(methods_default_annotations == NULL || methods_default_annotations->length() == methods->length(), "");
if (do_annotations) {
ResourceMark rm;
// Allocate temporary storage
oop* temp_array = NEW_RESOURCE_ARRAY(oop, length);
GrowableArray<oop>* temp_array = new GrowableArray<oop>(length);
reorder_based_on_method_index(methods, methods_annotations, temp_array);
reorder_based_on_method_index(methods, methods_parameter_annotations, temp_array);
reorder_based_on_method_index(methods, methods_default_annotations, temp_array);