1.1 --- a/src/cpu/x86/vm/templateTable_x86_64.cpp Fri Apr 11 09:56:35 2008 -0400 1.2 +++ b/src/cpu/x86/vm/templateTable_x86_64.cpp Sun Apr 13 17:43:42 2008 -0400 1.3 @@ -557,8 +557,8 @@ 1.4 // eax: index 1.5 // rdx: array 1.6 index_check(rdx, rax); // kills rbx 1.7 - __ movq(rax, Address(rdx, rax, 1.8 - Address::times_8, 1.9 + __ load_heap_oop(rax, Address(rdx, rax, 1.10 + UseCompressedOops ? Address::times_4 : Address::times_8, 1.11 arrayOopDesc::base_offset_in_bytes(T_OBJECT))); 1.12 } 1.13 1.14 @@ -870,15 +870,15 @@ 1.15 __ jcc(Assembler::zero, is_null); 1.16 1.17 // Move subklass into rbx 1.18 - __ movq(rbx, Address(rax, oopDesc::klass_offset_in_bytes())); 1.19 + __ load_klass(rbx, rax); 1.20 // Move superklass into rax 1.21 - __ movq(rax, Address(rdx, oopDesc::klass_offset_in_bytes())); 1.22 + __ load_klass(rax, rdx); 1.23 __ movq(rax, Address(rax, 1.24 sizeof(oopDesc) + 1.25 objArrayKlass::element_klass_offset_in_bytes())); 1.26 - // Compress array + index*8 + 12 into a single register. Frees rcx. 1.27 + // Compress array + index*oopSize + 12 into a single register. Frees rcx. 1.28 __ leaq(rdx, Address(rdx, rcx, 1.29 - Address::times_8, 1.30 + UseCompressedOops ? Address::times_4 : Address::times_8, 1.31 arrayOopDesc::base_offset_in_bytes(T_OBJECT))); 1.32 1.33 // Generate subtype check. Blows rcx, rdi 1.34 @@ -892,17 +892,17 @@ 1.35 // Come here on success 1.36 __ bind(ok_is_subtype); 1.37 __ movq(rax, at_tos()); // Value 1.38 - __ movq(Address(rdx, 0), rax); 1.39 + __ store_heap_oop(Address(rdx, 0), rax); 1.40 __ store_check(rdx); 1.41 __ jmp(done); 1.42 1.43 // Have a NULL in rax, rdx=array, ecx=index. Store NULL at ary[idx] 1.44 __ bind(is_null); 1.45 __ profile_null_seen(rbx); 1.46 - __ movq(Address(rdx, rcx, 1.47 - Address::times_8, 1.48 - arrayOopDesc::base_offset_in_bytes(T_OBJECT)), 1.49 - rax); 1.50 + __ store_heap_oop(Address(rdx, rcx, 1.51 + UseCompressedOops ? Address::times_4 : Address::times_8, 1.52 + arrayOopDesc::base_offset_in_bytes(T_OBJECT)), 1.53 + rax); 1.54 1.55 // Pop stack arguments 1.56 __ bind(done); 1.57 @@ -1934,7 +1934,7 @@ 1.58 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { 1.59 assert(state == vtos, "only valid state"); 1.60 __ movq(c_rarg1, aaddress(0)); 1.61 - __ movq(rdi, Address(c_rarg1, oopDesc::klass_offset_in_bytes())); 1.62 + __ load_klass(rdi, c_rarg1); 1.63 __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc))); 1.64 __ testl(rdi, JVM_ACC_HAS_FINALIZER); 1.65 Label skip_register_finalizer; 1.66 @@ -2184,7 +2184,7 @@ 1.67 __ cmpl(flags, atos); 1.68 __ jcc(Assembler::notEqual, notObj); 1.69 // atos 1.70 - __ movq(rax, field); 1.71 + __ load_heap_oop(rax, field); 1.72 __ push(atos); 1.73 if (!is_static) { 1.74 patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx); 1.75 @@ -2394,7 +2394,7 @@ 1.76 // atos 1.77 __ pop(atos); 1.78 if (!is_static) pop_and_check_object(obj); 1.79 - __ movq(field, rax); 1.80 + __ store_heap_oop(field, rax); 1.81 __ store_check(obj, field); // Need to mark card 1.82 if (!is_static) { 1.83 patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx); 1.84 @@ -2515,7 +2515,7 @@ 1.85 const Address field(c_rarg3, 0); 1.86 1.87 switch (bytecode()) { // load values into the jvalue object 1.88 - case Bytecodes::_fast_aputfield: // fall through 1.89 + case Bytecodes::_fast_aputfield: __ movq(field, rax); break; 1.90 case Bytecodes::_fast_lputfield: __ movq(field, rax); break; 1.91 case Bytecodes::_fast_iputfield: __ movl(field, rax); break; 1.92 case Bytecodes::_fast_bputfield: __ movb(field, rax); break; 1.93 @@ -2582,7 +2582,7 @@ 1.94 // access field 1.95 switch (bytecode()) { 1.96 case Bytecodes::_fast_aputfield: 1.97 - __ movq(field, rax); 1.98 + __ store_heap_oop(field, rax); 1.99 __ store_check(rcx, field); 1.100 break; 1.101 case Bytecodes::_fast_lputfield: 1.102 @@ -2631,8 +2631,8 @@ 1.103 __ jcc(Assembler::zero, L1); 1.104 // access constant pool cache entry 1.105 __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1); 1.106 + __ verify_oop(rax); 1.107 __ movq(r12, rax); // save object pointer before call_VM() clobbers it 1.108 - __ verify_oop(rax); 1.109 __ movq(c_rarg1, rax); 1.110 // c_rarg1: object pointer copied above 1.111 // c_rarg2: cache entry pointer 1.112 @@ -2641,6 +2641,7 @@ 1.113 InterpreterRuntime::post_field_access), 1.114 c_rarg1, c_rarg2); 1.115 __ movq(rax, r12); // restore object pointer 1.116 + __ reinit_heapbase(); 1.117 __ bind(L1); 1.118 } 1.119 1.120 @@ -2667,7 +2668,7 @@ 1.121 // access field 1.122 switch (bytecode()) { 1.123 case Bytecodes::_fast_agetfield: 1.124 - __ movq(rax, field); 1.125 + __ load_heap_oop(rax, field); 1.126 __ verify_oop(rax); 1.127 break; 1.128 case Bytecodes::_fast_lgetfield: 1.129 @@ -2725,7 +2726,7 @@ 1.130 __ movl(rax, Address(rax, rbx, Address::times_1)); 1.131 break; 1.132 case atos: 1.133 - __ movq(rax, Address(rax, rbx, Address::times_1)); 1.134 + __ load_heap_oop(rax, Address(rax, rbx, Address::times_1)); 1.135 __ verify_oop(rax); 1.136 break; 1.137 case ftos: 1.138 @@ -2787,7 +2788,8 @@ 1.139 __ movl(recv, flags); 1.140 __ andl(recv, 0xFF); 1.141 if (TaggedStackInterpreter) __ shll(recv, 1); // index*2 1.142 - __ movq(recv, Address(rsp, recv, Address::times_8, -Interpreter::expr_offset_in_bytes(1))); 1.143 + __ movq(recv, Address(rsp, recv, Address::times_8, 1.144 + -Interpreter::expr_offset_in_bytes(1))); 1.145 __ verify_oop(recv); 1.146 } 1.147 1.148 @@ -2854,7 +2856,7 @@ 1.149 1.150 // get receiver klass 1.151 __ null_check(recv, oopDesc::klass_offset_in_bytes()); 1.152 - __ movq(rax, Address(recv, oopDesc::klass_offset_in_bytes())); 1.153 + __ load_klass(rax, recv); 1.154 1.155 __ verify_oop(rax); 1.156 1.157 @@ -2866,8 +2868,8 @@ 1.158 assert(vtableEntry::size() * wordSize == 8, 1.159 "adjust the scaling in the code below"); 1.160 __ movq(method, Address(rax, index, 1.161 - Address::times_8, 1.162 - base + vtableEntry::method_offset_in_bytes())); 1.163 + Address::times_8, 1.164 + base + vtableEntry::method_offset_in_bytes())); 1.165 __ movq(rdx, Address(method, methodOopDesc::interpreter_entry_offset())); 1.166 __ jump_from_interpreted(method, rdx); 1.167 } 1.168 @@ -2932,7 +2934,7 @@ 1.169 1.170 // Get receiver klass into rdx - also a null check 1.171 __ restore_locals(); // restore r14 1.172 - __ movq(rdx, Address(rcx, oopDesc::klass_offset_in_bytes())); 1.173 + __ load_klass(rdx, rcx); 1.174 __ verify_oop(rdx); 1.175 1.176 // profile this call 1.177 @@ -3161,7 +3163,7 @@ 1.178 __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), 1.179 (intptr_t) markOopDesc::prototype()); // header (address 0x1) 1.180 } 1.181 - __ movq(Address(rax, oopDesc::klass_offset_in_bytes()), rsi); // klass 1.182 + __ store_klass(rax, rsi); // klass 1.183 __ jmp(done); 1.184 } 1.185 1.186 @@ -3223,12 +3225,12 @@ 1.187 typeArrayOopDesc::header_size(T_BYTE) * wordSize), 1.188 JVM_CONSTANT_Class); 1.189 __ jcc(Assembler::equal, quicked); 1.190 - 1.191 + __ push(atos); // save receiver for result, and for GC 1.192 __ movq(r12, rcx); // save rcx XXX 1.193 - __ push(atos); // save receiver for result, and for GC 1.194 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); 1.195 + __ movq(rcx, r12); // restore rcx XXX 1.196 + __ reinit_heapbase(); 1.197 __ pop_ptr(rdx); // restore receiver 1.198 - __ movq(rcx, r12); // restore rcx XXX 1.199 __ jmpb(resolved); 1.200 1.201 // Get superklass in rax and subklass in rbx 1.202 @@ -3238,7 +3240,7 @@ 1.203 Address::times_8, sizeof(constantPoolOopDesc))); 1.204 1.205 __ bind(resolved); 1.206 - __ movq(rbx, Address(rdx, oopDesc::klass_offset_in_bytes())); 1.207 + __ load_klass(rbx, rdx); 1.208 1.209 // Generate subtype check. Blows rcx, rdi. Object in rdx. 1.210 // Superklass in rax. Subklass in rbx. 1.211 @@ -3280,19 +3282,20 @@ 1.212 JVM_CONSTANT_Class); 1.213 __ jcc(Assembler::equal, quicked); 1.214 1.215 + __ push(atos); // save receiver for result, and for GC 1.216 __ movq(r12, rcx); // save rcx 1.217 - __ push(atos); // save receiver for result, and for GC 1.218 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); 1.219 + __ movq(rcx, r12); // restore rcx 1.220 + __ reinit_heapbase(); 1.221 __ pop_ptr(rdx); // restore receiver 1.222 - __ movq(rdx, Address(rdx, oopDesc::klass_offset_in_bytes())); 1.223 - __ movq(rcx, r12); // restore rcx 1.224 + __ load_klass(rdx, rdx); 1.225 __ jmpb(resolved); 1.226 1.227 // Get superklass in rax and subklass in rdx 1.228 __ bind(quicked); 1.229 - __ movq(rdx, Address(rax, oopDesc::klass_offset_in_bytes())); 1.230 + __ load_klass(rdx, rax); 1.231 __ movq(rax, Address(rcx, rbx, 1.232 - Address::times_8, sizeof(constantPoolOopDesc))); 1.233 + Address::times_8, sizeof(constantPoolOopDesc))); 1.234 1.235 __ bind(resolved); 1.236