626 subl $4,%esi 627 subl $1,%ecx 628 jnz 2b 629 addl %esi,%edi 630 jmp 4f 631 3: rep; smovl 632 4: andl $1,%eax 633 je 6f 634 addl $2,%esi 635 addl $2,%edi 636 5: movw (%esi),%dx 637 movw %dx,(%edi) 638 6: cld 639 popl %edi 640 popl %esi 641 ret 642 643 644 / Support for jlong Atomic::cmpxchg(jlong exchange_value, 645 / volatile jlong* dest, 646 / jlong compare_value, 647 / bool is_MP) 648 / Used only for Solaris/gcc builds 649 .align 16 650 _Atomic_cmpxchg_long_gcc: 651 / 8(%esp) : return PC 652 pushl %ebx / 4(%esp) : old %ebx 653 pushl %edi / 0(%esp) : old %edi 654 movl 12(%esp), %ebx / 12(%esp) : exchange_value (low) 655 movl 16(%esp), %ecx / 16(%esp) : exchange_value (high) 656 movl 24(%esp), %eax / 24(%esp) : compare_value (low) 657 movl 28(%esp), %edx / 28(%esp) : compare_value (high) 658 movl 20(%esp), %edi / 20(%esp) : dest 659 cmpl $0, 32(%esp) / 32(%esp) : is_MP 660 je 1f 661 lock 662 1: cmpxchg8b (%edi) 663 popl %edi 664 popl %ebx 665 ret | 626 subl $4,%esi 627 subl $1,%ecx 628 jnz 2b 629 addl %esi,%edi 630 jmp 4f 631 3: rep; smovl 632 4: andl $1,%eax 633 je 6f 634 addl $2,%esi 635 addl $2,%edi 636 5: movw (%esi),%dx 637 movw %dx,(%edi) 638 6: cld 639 popl %edi 640 popl %esi 641 ret 642 643 644 / Support for jlong Atomic::cmpxchg(jlong exchange_value, 645 / volatile jlong* dest, 646 / jlong compare_value) 647 / Used only for Solaris/gcc builds 648 .align 16 649 _Atomic_cmpxchg_long_gcc: 650 / 8(%esp) : return PC 651 pushl %ebx / 4(%esp) : old %ebx 652 pushl %edi / 0(%esp) : old %edi 653 movl 12(%esp), %ebx / 12(%esp) : exchange_value (low) 654 movl 16(%esp), %ecx / 16(%esp) : exchange_value (high) 655 movl 24(%esp), %eax / 24(%esp) : compare_value (low) 656 movl 28(%esp), %edx / 28(%esp) : compare_value (high) 657 movl 20(%esp), %edi / 20(%esp) : dest 658 lock cmpxchg8b (%edi) 659 popl %edi 660 popl %ebx 661 ret |