< prev index next >

src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.cpp

Print this page
*** 21,10 ***
--- 21,11 ---
   * questions.
   *
   */
  
  #include "asm/macroAssembler.inline.hpp"
+ #include "code/aotCodeCache.hpp"
  #include "gc/g1/g1BarrierSet.hpp"
  #include "gc/g1/g1BarrierSetAssembler.hpp"
  #include "gc/g1/g1BarrierSetRuntime.hpp"
  #include "gc/g1/g1CardTable.hpp"
  #include "gc/g1/g1HeapRegion.hpp"

*** 266,10 ***
--- 267,18 ---
    __ pop_call_clobbered_registers();
  
    __ bind(done);
  }
  
+ // return a register that differs from reg1, reg2, reg3 and is not rcx
+ 
+ static Register pick_different_reg(Register reg1, Register reg2 = noreg, Register reg3= noreg, Register reg4 = noreg) {
+   RegSet available = (RegSet::of(rscratch1, rscratch2, rax, rbx) + rdx -
+                       RegSet::of(reg1, reg2, reg3, reg4));
+   return *(available.begin());
+ }
+ 
  static void generate_post_barrier_fast_path(MacroAssembler* masm,
                                              const Register store_addr,
                                              const Register new_val,
                                              const Register tmp1,
                                              Label& done,

*** 278,14 ***
    assert_different_registers(store_addr, new_val, tmp1, noreg);
  
    Register thread = r15_thread;
  
    // Does store cross heap regions?
!   __ movptr(tmp1, store_addr);                                    // tmp1 := store address
!   __ xorptr(tmp1, new_val);                                       // tmp1 := store address ^ new value
!   __ shrptr(tmp1, G1HeapRegion::LogOfHRGrainBytes);               // ((store address ^ new value) >> LogOfHRGrainBytes) == 0?
!   __ jcc(Assembler::equal, done);
  
    // Crosses regions, storing null?
    if (new_val_may_be_null) {
      __ cmpptr(new_val, NULL_WORD);                                // new value == null?
      __ jcc(Assembler::equal, done);
--- 287,37 ---
    assert_different_registers(store_addr, new_val, tmp1, noreg);
  
    Register thread = r15_thread;
  
    // Does store cross heap regions?
! #if INCLUDE_CDS
!   // AOT code needs to load the barrier grain shift from the aot
!   // runtime constants area in the code cache otherwise we can compile
!   // it as an immediate operand
+ 
+   if (AOTCodeCache::is_on_for_dump()) {
+     address grain_shift_addr = AOTRuntimeConstants::grain_shift_address();
+     Register save = pick_different_reg(rcx, tmp1, new_val, store_addr);
+     __ push(save);
+     __ movptr(save, store_addr);
+     __ xorptr(save, new_val);
+     __ push(rcx);
+     __ lea(rcx, ExternalAddress(grain_shift_addr));
+     __ movptr(rcx, Address(rcx, 0));
+     __ shrptr(save);
+     __ pop(rcx);
+     __ mov(tmp1, save);
+     __ pop(save);
+     __ jcc(Assembler::equal, done);
+   } else
+ #endif // INCLUDE_CDS
+   {
+     __ movptr(tmp1, store_addr);                                  // tmp1 := store address
+     __ xorptr(tmp1, new_val);                                     // tmp1 := store address ^ new value
+     __ shrptr(tmp1, G1HeapRegion::LogOfHRGrainBytes);             // ((store address ^ new value) >> LogOfHRGrainBytes) == 0?
+     __ jcc(Assembler::equal, done);
+   }
  
    // Crosses regions, storing null?
    if (new_val_may_be_null) {
      __ cmpptr(new_val, NULL_WORD);                                // new value == null?
      __ jcc(Assembler::equal, done);
< prev index next >