src/hotspot/cpu/aarch64/gc/z/zBarrierSetAssembler_aarch64.cpp
changeset 55504 b7f68ddec66f
parent 55379 865775b86780
child 58273 08a5148e7c4e
equal deleted inserted replaced
55503:688f985f29c3 55504:b7f68ddec66f
    61     // Barrier not needed
    61     // Barrier not needed
    62     BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
    62     BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
    63     return;
    63     return;
    64   }
    64   }
    65 
    65 
    66   // rscratch1 can be passed as src or dst, so don't use it.
    66   assert_different_registers(rscratch1, rscratch2, src.base());
    67   RegSet savedRegs = RegSet::of(rscratch2, rheapbase);
    67   assert_different_registers(rscratch1, rscratch2, dst);
       
    68 
       
    69   RegSet savedRegs = RegSet::range(r0,r28) - RegSet::of(dst, rscratch1, rscratch2);
    68 
    70 
    69   Label done;
    71   Label done;
    70   assert_different_registers(rheapbase, rscratch2, dst);
       
    71   assert_different_registers(rheapbase, rscratch2, src.base());
       
    72 
       
    73   __ push(savedRegs, sp);
       
    74 
    72 
    75   // Load bad mask into scratch register.
    73   // Load bad mask into scratch register.
    76   __ ldr(rheapbase, address_bad_mask_from_thread(rthread));
    74   __ ldr(rscratch1, address_bad_mask_from_thread(rthread));
    77   __ lea(rscratch2, src);
    75   __ lea(rscratch2, src);
    78   __ ldr(dst, src);
    76   __ ldr(dst, src);
    79 
    77 
    80   // Test reference against bad mask. If mask bad, then we need to fix it up.
    78   // Test reference against bad mask. If mask bad, then we need to fix it up.
    81   __ tst(dst, rheapbase);
    79   __ tst(dst, rscratch1);
    82   __ br(Assembler::EQ, done);
    80   __ br(Assembler::EQ, done);
    83 
    81 
    84   __ enter();
    82   __ enter();
    85 
    83 
    86   __ push(RegSet::range(r0,r28) - RegSet::of(dst), sp);
    84   __ push(savedRegs, sp);
    87 
    85 
    88   if (c_rarg0 != dst) {
    86   if (c_rarg0 != dst) {
    89     __ mov(c_rarg0, dst);
    87     __ mov(c_rarg0, dst);
    90   }
    88   }
    91   __ mov(c_rarg1, rscratch2);
    89   __ mov(c_rarg1, rscratch2);
    92 
    90 
    93   int step = 4 * wordSize;
    91   int step = 4 * wordSize;
    94   __ mov(rscratch1, -step);
    92   __ mov(rscratch2, -step);
    95   __ sub(sp, sp, step);
    93   __ sub(sp, sp, step);
    96 
    94 
    97   for (int i = 28; i >= 4; i -= 4) {
    95   for (int i = 28; i >= 4; i -= 4) {
    98     __ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
    96     __ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
    99         as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch1)));
    97         as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch2)));
   100   }
    98   }
       
    99   __ st1(as_FloatRegister(0), as_FloatRegister(1), as_FloatRegister(2),
       
   100       as_FloatRegister(3), __ T1D, Address(sp));
   101 
   101 
   102   __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
   102   __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
   103 
   103 
   104   for (int i = 0; i <= 28; i += 4) {
   104   for (int i = 0; i <= 28; i += 4) {
   105     __ ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
   105     __ ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
   109   // Make sure dst has the return value.
   109   // Make sure dst has the return value.
   110   if (dst != r0) {
   110   if (dst != r0) {
   111     __ mov(dst, r0);
   111     __ mov(dst, r0);
   112   }
   112   }
   113 
   113 
   114   __ pop(RegSet::range(r0,r28) - RegSet::of(dst), sp);
   114   __ pop(savedRegs, sp);
   115   __ leave();
   115   __ leave();
   116 
   116 
   117   __ bind(done);
   117   __ bind(done);
   118 
       
   119   // Restore tmps
       
   120   __ pop(savedRegs, sp);
       
   121 }
   118 }
   122 
   119 
   123 #ifdef ASSERT
   120 #ifdef ASSERT
   124 
   121 
   125 void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
   122 void ZBarrierSetAssembler::store_at(MacroAssembler* masm,