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) |