593 594 // Support for jint atomic::atomic_cmpxchg(jint exchange_value, volatile jint* dest, 595 // jint compare_value) 596 // 597 // Arguments : 598 // c_rarg0: exchange_value 599 // c_rarg1: dest 600 // c_rarg2: compare_value 601 // 602 // Result: 603 // if ( compare_value == *dest ) { 604 // *dest = exchange_value 605 // return compare_value; 606 // else 607 // return *dest; 608 address generate_atomic_cmpxchg() { 609 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg"); 610 address start = __ pc(); 611 612 __ movl(rax, c_rarg2); 613 if ( os::is_MP() ) __ lock(); 614 __ cmpxchgl(c_rarg0, Address(c_rarg1, 0)); 615 __ ret(0); 616 617 return start; 618 } 619 620 // Support for int8_t atomic::atomic_cmpxchg(int8_t exchange_value, volatile int8_t* dest, 621 // int8_t compare_value) 622 // 623 // Arguments : 624 // c_rarg0: exchange_value 625 // c_rarg1: dest 626 // c_rarg2: compare_value 627 // 628 // Result: 629 // if ( compare_value == *dest ) { 630 // *dest = exchange_value 631 // return compare_value; 632 // else 633 // return *dest; 634 address generate_atomic_cmpxchg_byte() { 635 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg_byte"); 636 address start = __ pc(); 637 638 __ movsbq(rax, c_rarg2); 639 if ( os::is_MP() ) __ lock(); 640 __ cmpxchgb(c_rarg0, Address(c_rarg1, 0)); 641 __ ret(0); 642 643 return start; 644 } 645 646 // Support for int64_t atomic::atomic_cmpxchg(int64_t exchange_value, 647 // volatile int64_t* dest, 648 // int64_t compare_value) 649 // Arguments : 650 // c_rarg0: exchange_value 651 // c_rarg1: dest 652 // c_rarg2: compare_value 653 // 654 // Result: 655 // if ( compare_value == *dest ) { 656 // *dest = exchange_value 657 // return compare_value; 658 // else 659 // return *dest; 660 address generate_atomic_cmpxchg_long() { 661 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg_long"); 662 address start = __ pc(); 663 664 __ movq(rax, c_rarg2); 665 if ( os::is_MP() ) __ lock(); 666 __ cmpxchgq(c_rarg0, Address(c_rarg1, 0)); 667 __ ret(0); 668 669 return start; 670 } 671 672 // Support for jint atomic::add(jint add_value, volatile jint* dest) 673 // 674 // Arguments : 675 // c_rarg0: add_value 676 // c_rarg1: dest 677 // 678 // Result: 679 // *dest += add_value 680 // return *dest; 681 address generate_atomic_add() { 682 StubCodeMark mark(this, "StubRoutines", "atomic_add"); 683 address start = __ pc(); 684 685 __ movl(rax, c_rarg0); 686 if ( os::is_MP() ) __ lock(); 687 __ xaddl(Address(c_rarg1, 0), c_rarg0); 688 __ addl(rax, c_rarg0); 689 __ ret(0); 690 691 return start; 692 } 693 694 // Support for intptr_t atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) 695 // 696 // Arguments : 697 // c_rarg0: add_value 698 // c_rarg1: dest 699 // 700 // Result: 701 // *dest += add_value 702 // return *dest; 703 address generate_atomic_add_long() { 704 StubCodeMark mark(this, "StubRoutines", "atomic_add_long"); 705 address start = __ pc(); 706 707 __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow 708 if ( os::is_MP() ) __ lock(); 709 __ xaddptr(Address(c_rarg1, 0), c_rarg0); 710 __ addptr(rax, c_rarg0); 711 __ ret(0); 712 713 return start; 714 } 715 716 // Support for intptr_t OrderAccess::fence() 717 // 718 // Arguments : 719 // 720 // Result: 721 address generate_orderaccess_fence() { 722 StubCodeMark mark(this, "StubRoutines", "orderaccess_fence"); 723 address start = __ pc(); 724 __ membar(Assembler::StoreLoad); 725 __ ret(0); 726 727 return start; 728 } | 593 594 // Support for jint atomic::atomic_cmpxchg(jint exchange_value, volatile jint* dest, 595 // jint compare_value) 596 // 597 // Arguments : 598 // c_rarg0: exchange_value 599 // c_rarg1: dest 600 // c_rarg2: compare_value 601 // 602 // Result: 603 // if ( compare_value == *dest ) { 604 // *dest = exchange_value 605 // return compare_value; 606 // else 607 // return *dest; 608 address generate_atomic_cmpxchg() { 609 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg"); 610 address start = __ pc(); 611 612 __ movl(rax, c_rarg2); 613 __ lock(); 614 __ cmpxchgl(c_rarg0, Address(c_rarg1, 0)); 615 __ ret(0); 616 617 return start; 618 } 619 620 // Support for int8_t atomic::atomic_cmpxchg(int8_t exchange_value, volatile int8_t* dest, 621 // int8_t compare_value) 622 // 623 // Arguments : 624 // c_rarg0: exchange_value 625 // c_rarg1: dest 626 // c_rarg2: compare_value 627 // 628 // Result: 629 // if ( compare_value == *dest ) { 630 // *dest = exchange_value 631 // return compare_value; 632 // else 633 // return *dest; 634 address generate_atomic_cmpxchg_byte() { 635 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg_byte"); 636 address start = __ pc(); 637 638 __ movsbq(rax, c_rarg2); 639 __ lock(); 640 __ cmpxchgb(c_rarg0, Address(c_rarg1, 0)); 641 __ ret(0); 642 643 return start; 644 } 645 646 // Support for int64_t atomic::atomic_cmpxchg(int64_t exchange_value, 647 // volatile int64_t* dest, 648 // int64_t compare_value) 649 // Arguments : 650 // c_rarg0: exchange_value 651 // c_rarg1: dest 652 // c_rarg2: compare_value 653 // 654 // Result: 655 // if ( compare_value == *dest ) { 656 // *dest = exchange_value 657 // return compare_value; 658 // else 659 // return *dest; 660 address generate_atomic_cmpxchg_long() { 661 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg_long"); 662 address start = __ pc(); 663 664 __ movq(rax, c_rarg2); 665 __ lock(); 666 __ cmpxchgq(c_rarg0, Address(c_rarg1, 0)); 667 __ ret(0); 668 669 return start; 670 } 671 672 // Support for jint atomic::add(jint add_value, volatile jint* dest) 673 // 674 // Arguments : 675 // c_rarg0: add_value 676 // c_rarg1: dest 677 // 678 // Result: 679 // *dest += add_value 680 // return *dest; 681 address generate_atomic_add() { 682 StubCodeMark mark(this, "StubRoutines", "atomic_add"); 683 address start = __ pc(); 684 685 __ movl(rax, c_rarg0); 686 __ lock(); 687 __ xaddl(Address(c_rarg1, 0), c_rarg0); 688 __ addl(rax, c_rarg0); 689 __ ret(0); 690 691 return start; 692 } 693 694 // Support for intptr_t atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) 695 // 696 // Arguments : 697 // c_rarg0: add_value 698 // c_rarg1: dest 699 // 700 // Result: 701 // *dest += add_value 702 // return *dest; 703 address generate_atomic_add_long() { 704 StubCodeMark mark(this, "StubRoutines", "atomic_add_long"); 705 address start = __ pc(); 706 707 __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow 708 __ lock(); 709 __ xaddptr(Address(c_rarg1, 0), c_rarg0); 710 __ addptr(rax, c_rarg0); 711 __ ret(0); 712 713 return start; 714 } 715 716 // Support for intptr_t OrderAccess::fence() 717 // 718 // Arguments : 719 // 720 // Result: 721 address generate_orderaccess_fence() { 722 StubCodeMark mark(this, "StubRoutines", "orderaccess_fence"); 723 address start = __ pc(); 724 __ membar(Assembler::StoreLoad); 725 __ ret(0); 726 727 return start; 728 } |