src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp
changeset 58986 66b1db608c12
parent 58985 5606867a5e6e
equal deleted inserted replaced
58985:5606867a5e6e 58986:66b1db608c12
   252   if (dst == r1) {
   252   if (dst == r1) {
   253     __ mov(rscratch1, dst);
   253     __ mov(rscratch1, dst);
   254     dst = rscratch1;
   254     dst = rscratch1;
   255   }
   255   }
   256 
   256 
   257   RegSet to_save_r1 = RegSet::of(r1);
   257   // Save r0 and r1, unless it is an output register
   258   // If outgoing register is r1, we can clobber it
   258   RegSet to_save = RegSet::of(r0, r1) - result_dst;
   259   if (result_dst != r1) {
   259   __ push(to_save, sp);
   260     __ push(to_save_r1, sp);
       
   261   }
       
   262   __ lea(r1, load_addr);
   260   __ lea(r1, load_addr);
   263 
   261   __ mov(r0, dst);
   264   RegSet to_save_r0 = RegSet::of(r0);
       
   265   if (dst != r0) {
       
   266     __ push(to_save_r0, sp);
       
   267     __ mov(r0, dst);
       
   268   }
       
   269 
   262 
   270   __ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb())));
   263   __ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb())));
   271 
   264 
   272   if (result_dst != r0) {
   265   __ mov(result_dst, r0);
   273     __ mov(result_dst, r0);
   266   __ pop(to_save, sp);
   274   }
       
   275 
       
   276   if (dst != r0) {
       
   277     __ pop(to_save_r0, sp);
       
   278   }
       
   279 
       
   280   if (result_dst != r1) {
       
   281     __ pop(to_save_r1, sp);
       
   282   }
       
   283 
   267 
   284   __ bind(done);
   268   __ bind(done);
   285   __ leave();
   269   __ leave();
   286 }
   270 }
   287 
   271