Mercurial > hg > graal-jvmci-8
diff src/cpu/x86/vm/templateTable_x86_64.cpp @ 113:ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv
Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author | coleenp |
---|---|
date | Sun, 13 Apr 2008 17:43:42 -0400 |
parents | a61af66fc99e |
children | feeb96a45707 37f87013dfd8 |
line wrap: on
line diff
--- a/src/cpu/x86/vm/templateTable_x86_64.cpp Fri Apr 11 09:56:35 2008 -0400 +++ b/src/cpu/x86/vm/templateTable_x86_64.cpp Sun Apr 13 17:43:42 2008 -0400 @@ -557,8 +557,8 @@ // eax: index // rdx: array index_check(rdx, rax); // kills rbx - __ movq(rax, Address(rdx, rax, - Address::times_8, + __ load_heap_oop(rax, Address(rdx, rax, + UseCompressedOops ? Address::times_4 : Address::times_8, arrayOopDesc::base_offset_in_bytes(T_OBJECT))); } @@ -870,15 +870,15 @@ __ jcc(Assembler::zero, is_null); // Move subklass into rbx - __ movq(rbx, Address(rax, oopDesc::klass_offset_in_bytes())); + __ load_klass(rbx, rax); // Move superklass into rax - __ movq(rax, Address(rdx, oopDesc::klass_offset_in_bytes())); + __ load_klass(rax, rdx); __ movq(rax, Address(rax, sizeof(oopDesc) + objArrayKlass::element_klass_offset_in_bytes())); - // Compress array + index*8 + 12 into a single register. Frees rcx. + // Compress array + index*oopSize + 12 into a single register. Frees rcx. __ leaq(rdx, Address(rdx, rcx, - Address::times_8, + UseCompressedOops ? Address::times_4 : Address::times_8, arrayOopDesc::base_offset_in_bytes(T_OBJECT))); // Generate subtype check. Blows rcx, rdi @@ -892,17 +892,17 @@ // Come here on success __ bind(ok_is_subtype); __ movq(rax, at_tos()); // Value - __ movq(Address(rdx, 0), rax); + __ store_heap_oop(Address(rdx, 0), rax); __ store_check(rdx); __ jmp(done); // Have a NULL in rax, rdx=array, ecx=index. Store NULL at ary[idx] __ bind(is_null); __ profile_null_seen(rbx); - __ movq(Address(rdx, rcx, - Address::times_8, - arrayOopDesc::base_offset_in_bytes(T_OBJECT)), - rax); + __ store_heap_oop(Address(rdx, rcx, + UseCompressedOops ? Address::times_4 : Address::times_8, + arrayOopDesc::base_offset_in_bytes(T_OBJECT)), + rax); // Pop stack arguments __ bind(done); @@ -1934,7 +1934,7 @@ if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { assert(state == vtos, "only valid state"); __ movq(c_rarg1, aaddress(0)); - __ movq(rdi, Address(c_rarg1, oopDesc::klass_offset_in_bytes())); + __ load_klass(rdi, c_rarg1); __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc))); __ testl(rdi, JVM_ACC_HAS_FINALIZER); Label skip_register_finalizer; @@ -2184,7 +2184,7 @@ __ cmpl(flags, atos); __ jcc(Assembler::notEqual, notObj); // atos - __ movq(rax, field); + __ load_heap_oop(rax, field); __ push(atos); if (!is_static) { patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx); @@ -2394,7 +2394,7 @@ // atos __ pop(atos); if (!is_static) pop_and_check_object(obj); - __ movq(field, rax); + __ store_heap_oop(field, rax); __ store_check(obj, field); // Need to mark card if (!is_static) { patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx); @@ -2515,7 +2515,7 @@ const Address field(c_rarg3, 0); switch (bytecode()) { // load values into the jvalue object - case Bytecodes::_fast_aputfield: // fall through + case Bytecodes::_fast_aputfield: __ movq(field, rax); break; case Bytecodes::_fast_lputfield: __ movq(field, rax); break; case Bytecodes::_fast_iputfield: __ movl(field, rax); break; case Bytecodes::_fast_bputfield: __ movb(field, rax); break; @@ -2582,7 +2582,7 @@ // access field switch (bytecode()) { case Bytecodes::_fast_aputfield: - __ movq(field, rax); + __ store_heap_oop(field, rax); __ store_check(rcx, field); break; case Bytecodes::_fast_lputfield: @@ -2631,8 +2631,8 @@ __ jcc(Assembler::zero, L1); // access constant pool cache entry __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1); + __ verify_oop(rax); __ movq(r12, rax); // save object pointer before call_VM() clobbers it - __ verify_oop(rax); __ movq(c_rarg1, rax); // c_rarg1: object pointer copied above // c_rarg2: cache entry pointer @@ -2641,6 +2641,7 @@ InterpreterRuntime::post_field_access), c_rarg1, c_rarg2); __ movq(rax, r12); // restore object pointer + __ reinit_heapbase(); __ bind(L1); } @@ -2667,7 +2668,7 @@ // access field switch (bytecode()) { case Bytecodes::_fast_agetfield: - __ movq(rax, field); + __ load_heap_oop(rax, field); __ verify_oop(rax); break; case Bytecodes::_fast_lgetfield: @@ -2725,7 +2726,7 @@ __ movl(rax, Address(rax, rbx, Address::times_1)); break; case atos: - __ movq(rax, Address(rax, rbx, Address::times_1)); + __ load_heap_oop(rax, Address(rax, rbx, Address::times_1)); __ verify_oop(rax); break; case ftos: @@ -2787,7 +2788,8 @@ __ movl(recv, flags); __ andl(recv, 0xFF); if (TaggedStackInterpreter) __ shll(recv, 1); // index*2 - __ movq(recv, Address(rsp, recv, Address::times_8, -Interpreter::expr_offset_in_bytes(1))); + __ movq(recv, Address(rsp, recv, Address::times_8, + -Interpreter::expr_offset_in_bytes(1))); __ verify_oop(recv); } @@ -2854,7 +2856,7 @@ // get receiver klass __ null_check(recv, oopDesc::klass_offset_in_bytes()); - __ movq(rax, Address(recv, oopDesc::klass_offset_in_bytes())); + __ load_klass(rax, recv); __ verify_oop(rax); @@ -2866,8 +2868,8 @@ assert(vtableEntry::size() * wordSize == 8, "adjust the scaling in the code below"); __ movq(method, Address(rax, index, - Address::times_8, - base + vtableEntry::method_offset_in_bytes())); + Address::times_8, + base + vtableEntry::method_offset_in_bytes())); __ movq(rdx, Address(method, methodOopDesc::interpreter_entry_offset())); __ jump_from_interpreted(method, rdx); } @@ -2932,7 +2934,7 @@ // Get receiver klass into rdx - also a null check __ restore_locals(); // restore r14 - __ movq(rdx, Address(rcx, oopDesc::klass_offset_in_bytes())); + __ load_klass(rdx, rcx); __ verify_oop(rdx); // profile this call @@ -3161,7 +3163,7 @@ __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), (intptr_t) markOopDesc::prototype()); // header (address 0x1) } - __ movq(Address(rax, oopDesc::klass_offset_in_bytes()), rsi); // klass + __ store_klass(rax, rsi); // klass __ jmp(done); } @@ -3223,12 +3225,12 @@ typeArrayOopDesc::header_size(T_BYTE) * wordSize), JVM_CONSTANT_Class); __ jcc(Assembler::equal, quicked); - + __ push(atos); // save receiver for result, and for GC __ movq(r12, rcx); // save rcx XXX - __ push(atos); // save receiver for result, and for GC call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); + __ movq(rcx, r12); // restore rcx XXX + __ reinit_heapbase(); __ pop_ptr(rdx); // restore receiver - __ movq(rcx, r12); // restore rcx XXX __ jmpb(resolved); // Get superklass in rax and subklass in rbx @@ -3238,7 +3240,7 @@ Address::times_8, sizeof(constantPoolOopDesc))); __ bind(resolved); - __ movq(rbx, Address(rdx, oopDesc::klass_offset_in_bytes())); + __ load_klass(rbx, rdx); // Generate subtype check. Blows rcx, rdi. Object in rdx. // Superklass in rax. Subklass in rbx. @@ -3280,19 +3282,20 @@ JVM_CONSTANT_Class); __ jcc(Assembler::equal, quicked); + __ push(atos); // save receiver for result, and for GC __ movq(r12, rcx); // save rcx - __ push(atos); // save receiver for result, and for GC call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); + __ movq(rcx, r12); // restore rcx + __ reinit_heapbase(); __ pop_ptr(rdx); // restore receiver - __ movq(rdx, Address(rdx, oopDesc::klass_offset_in_bytes())); - __ movq(rcx, r12); // restore rcx + __ load_klass(rdx, rdx); __ jmpb(resolved); // Get superklass in rax and subklass in rdx __ bind(quicked); - __ movq(rdx, Address(rax, oopDesc::klass_offset_in_bytes())); + __ load_klass(rdx, rax); __ movq(rax, Address(rcx, rbx, - Address::times_8, sizeof(constantPoolOopDesc))); + Address::times_8, sizeof(constantPoolOopDesc))); __ bind(resolved);