< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page




 535     // make sure exception is set
 536     {
 537       Label L;
 538       __ testptr(rax, rax);
 539       __ jcc(Assembler::notEqual, L);
 540       __ stop("StubRoutines::forward exception: no pending exception (2)");
 541       __ bind(L);
 542     }
 543 #endif
 544 
 545     // continue at exception handler (return address removed)
 546     // rax: exception
 547     // rbx: exception handler
 548     // rdx: throwing pc
 549     __ verify_oop(rax);
 550     __ jmp(rbx);
 551 
 552     return start;
 553   }
 554 
 555   // Support for jint atomic::xchg(jint exchange_value, volatile jint* dest)
 556   //
 557   // Arguments :
 558   //    c_rarg0: exchange_value
 559   //    c_rarg0: dest
 560   //
 561   // Result:
 562   //    *dest <- ex, return (orig *dest)
 563   address generate_atomic_xchg() {
 564     StubCodeMark mark(this, "StubRoutines", "atomic_xchg");
 565     address start = __ pc();
 566 
 567     __ movl(rax, c_rarg0); // Copy to eax we need a return value anyhow
 568     __ xchgl(rax, Address(c_rarg1, 0)); // automatic LOCK
 569     __ ret(0);
 570 
 571     return start;
 572   }
 573 
 574   // Support for intptr_t atomic::xchg_long(jlong exchange_value, volatile jlong* dest)
 575   //
 576   // Arguments :
 577   //    c_rarg0: exchange_value
 578   //    c_rarg1: dest
 579   //
 580   // Result:
 581   //    *dest <- ex, return (orig *dest)
 582   address generate_atomic_xchg_long() {
 583     StubCodeMark mark(this, "StubRoutines", "atomic_xchg_long");
 584     address start = __ pc();
 585 
 586     __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow
 587     __ xchgptr(rax, Address(c_rarg1, 0)); // automatic LOCK
 588     __ ret(0);
 589 
 590     return start;
 591   }
 592 
 593   // Support for jint atomic::atomic_cmpxchg(jint exchange_value, volatile jint* dest,
 594   //                                         jint compare_value)




 535     // make sure exception is set
 536     {
 537       Label L;
 538       __ testptr(rax, rax);
 539       __ jcc(Assembler::notEqual, L);
 540       __ stop("StubRoutines::forward exception: no pending exception (2)");
 541       __ bind(L);
 542     }
 543 #endif
 544 
 545     // continue at exception handler (return address removed)
 546     // rax: exception
 547     // rbx: exception handler
 548     // rdx: throwing pc
 549     __ verify_oop(rax);
 550     __ jmp(rbx);
 551 
 552     return start;
 553   }
 554 
 555   // Support for jint atomic::xchg(volatile jint* dest, jint exchange_value)
 556   //
 557   // Arguments :
 558   //    c_rarg0: exchange_value
 559   //    c_rarg0: dest
 560   //
 561   // Result:
 562   //    *dest <- ex, return (orig *dest)
 563   address generate_atomic_xchg() {
 564     StubCodeMark mark(this, "StubRoutines", "atomic_xchg");
 565     address start = __ pc();
 566 
 567     __ movl(rax, c_rarg0); // Copy to eax we need a return value anyhow
 568     __ xchgl(rax, Address(c_rarg1, 0)); // automatic LOCK
 569     __ ret(0);
 570 
 571     return start;
 572   }
 573 
 574   // Support for intptr_t atomic::xchg_long(volatile jlong* dest, jlong exchange_value)
 575   //
 576   // Arguments :
 577   //    c_rarg0: exchange_value
 578   //    c_rarg1: dest
 579   //
 580   // Result:
 581   //    *dest <- ex, return (orig *dest)
 582   address generate_atomic_xchg_long() {
 583     StubCodeMark mark(this, "StubRoutines", "atomic_xchg_long");
 584     address start = __ pc();
 585 
 586     __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow
 587     __ xchgptr(rax, Address(c_rarg1, 0)); // automatic LOCK
 588     __ ret(0);
 589 
 590     return start;
 591   }
 592 
 593   // Support for jint atomic::atomic_cmpxchg(jint exchange_value, volatile jint* dest,
 594   //                                         jint compare_value)


< prev index next >