src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp
changeset 57824 253c817653b6
parent 57777 90ead0febf56
child 58218 0d7877278adf
equal deleted inserted replaced
57823:efb2770e8288 57824:253c817653b6
   932 address ShenandoahBarrierSetAssembler::generate_shenandoah_lrb(StubCodeGenerator* cgen) {
   932 address ShenandoahBarrierSetAssembler::generate_shenandoah_lrb(StubCodeGenerator* cgen) {
   933   __ align(CodeEntryAlignment);
   933   __ align(CodeEntryAlignment);
   934   StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb");
   934   StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb");
   935   address start = __ pc();
   935   address start = __ pc();
   936 
   936 
   937   Label resolve_oop, slow_path, done;
   937   Label resolve_oop, slow_path;
   938 
   938 
   939   // We use RDI, which also serves as argument register for slow call.
   939   // We use RDI, which also serves as argument register for slow call.
   940   // RAX always holds the src object ptr, except after the slow call,
   940   // RAX always holds the src object ptr, except after the slow call,
   941   // then it holds the result. R8/RBX is used as temporary register.
   941   // then it holds the result. R8/RBX is used as temporary register.
   942 
   942 
   969   __ orptr(tmp2, markWord::marked_value);
   969   __ orptr(tmp2, markWord::marked_value);
   970   __ notptr(tmp2);
   970   __ notptr(tmp2);
   971   // At this point, tmp2 contains the decoded forwarding pointer.
   971   // At this point, tmp2 contains the decoded forwarding pointer.
   972   __ mov(rax, tmp2);
   972   __ mov(rax, tmp2);
   973 
   973 
   974   __ bind(done);
       
   975   __ pop(tmp2);
   974   __ pop(tmp2);
   976   __ pop(tmp1);
   975   __ pop(tmp1);
   977   __ ret(0);
   976   __ ret(0);
   978 
   977 
   979   __ bind(slow_path);
   978   __ bind(slow_path);
   990   __ push(r12);
   989   __ push(r12);
   991   __ push(r13);
   990   __ push(r13);
   992   __ push(r14);
   991   __ push(r14);
   993   __ push(r15);
   992   __ push(r15);
   994 #endif
   993 #endif
   995 
   994   __ push(rbp);
       
   995   __ movptr(rbp, rsp);
       
   996   __ andptr(rsp, -StackAlignmentInBytes);
       
   997   __ push_FPU_state();
   996   __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier), rax);
   998   __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier), rax);
   997 
   999   __ pop_FPU_state();
       
  1000   __ movptr(rsp, rbp);
       
  1001   __ pop(rbp);
   998 #ifdef _LP64
  1002 #ifdef _LP64
   999   __ pop(r15);
  1003   __ pop(r15);
  1000   __ pop(r14);
  1004   __ pop(r14);
  1001   __ pop(r13);
  1005   __ pop(r13);
  1002   __ pop(r12);
  1006   __ pop(r12);