Changeset 479
- Timestamp:
- 01/06/11 07:32:54 (14 years ago)
- Files:
-
- trunk/src/core/atomic.d (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/core/atomic.d
r452 r479 601 600 mov AL, 0; 602 601 mov RCX, val; 603 602 lock; // lock always needed to make this op atomic 604 603 cmpxchg [RCX], DL; 605 604 } 606 605 } 607 606 else 608 607 { 609 608 asm 610 609 { 611 mov AL, [val]; 610 mov RAX, val; 611 mov AL, [RAX]; 612 612 } 613 613 } 614 614 } 615 615 else static if( T.sizeof == short.sizeof ) 616 616 { 617 617 ////////////////////////////////////////////////////////////////// 618 618 // 2 Byte Load 619 619 ////////////////////////////////////////////////////////////////// 620 620 621 621 … … 627 627 mov AX, 0; 628 628 mov RCX, val; 629 629 lock; // lock always needed to make this op atomic 630 630 cmpxchg [RCX], DX; 631 631 } 632 632 } 633 633 else 634 634 { 635 635 asm 636 636 { 637 mov AX, [val]; 637 mov RAX, val; 638 mov AX, [RAX]; 638 639 } 639 640 } 640 641 } 641 642 else static if( T.sizeof == int.sizeof ) 642 643 { 643 644 ////////////////////////////////////////////////////////////////// 644 645 // 4 Byte Load 645 646 ////////////////////////////////////////////////////////////////// 646 647 647 648 … … 653 654 mov EAX, 0; 654 655 mov RCX, val; 655 656 lock; // lock always needed to make this op atomic 656 657 cmpxchg [RCX], EDX; 657 658 } 658 659 } 659 660 else 660 661 { 661 662 asm 662 663 { 663 mov EAX, [val]; 664 mov RAX, val; 665 mov EAX, [RAX]; 664 666 } 665 667 } 666 668 } 667 669 else static if( T.sizeof == long.sizeof ) 668 670 { 669 671 ////////////////////////////////////////////////////////////////// 670 672 // 8 Byte Load 671 673 ////////////////////////////////////////////////////////////////// 672 674 673 675 … … 679 681 mov RAX, 0; 680 682 mov RCX, val; 681 683 lock; // lock always needed to make this op atomic 682 684 cmpxchg [RCX], RDX; 683 685 } 684 686 } 685 687 else 686 688 { 687 689 asm 688 690 { 689 mov RAX, [val]; 691 mov RAX, val; 692 mov RAX, [RAX]; 690 693 } 691 694 } 692 695 } 693 696 else 694 697 { 695 698 static assert( false, "Invalid template type specified." ); 696 699 } 697 700 } 698 701 } 699 702 } … … 742 745 testType!(int)(); 743 746 testType!(uint)(); 744 747 745 748 testType!(int*)(); 746 749 747 750 static if( has64BitCAS ) 748 751 { 749 752 testType!(long)(); 750 753 testType!(ulong)(); 751 754 } 755 756 size_t i; 757 758 atomicOp!"+="(i, cast(size_t)1); 759 assert(i == 1); 760 761 atomicOp!"-="(i, cast(size_t)1); 762 assert(i == 0); 752 763 } 753 764 }
