src/cpu/x86/vm/templateTable_x86_64.cpp

changeset 548
ba764ed4b6f2
parent 435
a61af66fc99e
child 602
feeb96a45707
child 777
37f87013dfd8
     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  

mercurial