< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page
*** 4030,11 ***
        __ jmp(initialize_header);
      }
  
      // The object is initialized before the header.  If the object size is
      // zero, go directly to the header initialization.
!     __ decrement(rdx, sizeof(oopDesc));
      __ jcc(Assembler::zero, initialize_header);
  
      // Initialize topmost object field, divide rdx by 8, check if odd and
      // test if zero.
      __ xorl(rcx, rcx);    // use zero reg to clear memory (shorter code)
--- 4030,16 ---
        __ jmp(initialize_header);
      }
  
      // The object is initialized before the header.  If the object size is
      // zero, go directly to the header initialization.
!     if (UseCompactObjectHeaders) {
+       assert(is_aligned(oopDesc::base_offset_in_bytes(), BytesPerLong), "oop base offset must be 8-byte-aligned");
+       __ decrement(rdx, oopDesc::base_offset_in_bytes());
+     } else {
+       __ decrement(rdx, sizeof(oopDesc));
+     }
      __ jcc(Assembler::zero, initialize_header);
  
      // Initialize topmost object field, divide rdx by 8, check if odd and
      // test if zero.
      __ xorl(rcx, rcx);    // use zero reg to clear memory (shorter code)

*** 4052,26 ***
  #endif
  
      // initialize remaining object fields: rdx was a multiple of 8
      { Label loop;
      __ bind(loop);
!     __ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 1*oopSize), rcx);
!     NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 2*oopSize), rcx));
      __ decrement(rdx);
      __ jcc(Assembler::notZero, loop);
      }
  
      // initialize object header only.
      __ bind(initialize_header);
!     __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()),
!               (intptr_t)markWord::prototype().value()); // header
!     __ pop(rcx);   // get saved klass back in the register.
  #ifdef _LP64
!     __ xorl(rsi, rsi); // use zero reg to clear memory (shorter code)
!     __ store_klass_gap(rax, rsi);  // zero klass gap for compressed oops
  #endif
!     __ store_klass(rax, rcx, rscratch1);  // klass
  
      {
        SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0, rscratch1);
        // Trigger dtrace event for fastpath
        __ push(atos);
--- 4057,39 ---
  #endif
  
      // initialize remaining object fields: rdx was a multiple of 8
      { Label loop;
      __ bind(loop);
!     if (UseCompactObjectHeaders) {
!       assert(is_aligned(oopDesc::base_offset_in_bytes(), BytesPerLong), "oop base offset must be 8-byte-aligned");
+       int header_size = oopDesc::base_offset_in_bytes();
+       __ movptr(Address(rax, rdx, Address::times_8, header_size - 1*oopSize), rcx);
+       NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, header_size - 2*oopSize), rcx));
+     } else {
+       __ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 1*oopSize), rcx);
+       NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 2*oopSize), rcx));
+     }
      __ decrement(rdx);
      __ jcc(Assembler::notZero, loop);
      }
  
      // initialize object header only.
      __ bind(initialize_header);
!     if (UseCompactObjectHeaders) {
!       __ pop(rcx);   // get saved klass back in the register.
!       __ movptr(rbx, Address(rcx, Klass::prototype_header_offset()));
+       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), rbx);
+     } else {
+       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()),
+                 (intptr_t)markWord::prototype().value()); // header
+       __ pop(rcx);   // get saved klass back in the register.
  #ifdef _LP64
!       __ xorl(rsi, rsi); // use zero reg to clear memory (shorter code)
!       __ store_klass_gap(rax, rsi);  // zero klass gap for compressed oops
  #endif
!       __ store_klass(rax, rcx, rscratch1);  // klass
+     }
  
      {
        SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0, rscratch1);
        // Trigger dtrace event for fastpath
        __ push(atos);
< prev index next >