hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
changeset 360 21d113ecbf6a
parent 1 489c9b5090e2
child 593 803947e176bd
child 1374 4c24294029a9
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp	Fri Apr 11 09:56:35 2008 -0400
+++ b/hotspot/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);