| 786 | <h4>BUFFER_ATOMIC_ADD</h4> |
| 787 | <p>Opcode: 50 (0x32) for GCN 1.0/1.1; 66 (0x42) for GCN 1.2<br /> |
| 788 | Syntax: BUFFER_ATOMIC_ADD VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 789 | Description: Add VDATA to value of SRSRC resource, and store result to this resource. |
| 790 | If GLC flag is set then return previous value to VDATA, otherwise keep VDATA value. |
| 791 | Operation is atomic.<br /> |
| 792 | Operation:<br /> |
| 793 | <code>UINT32* VM = (UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 794 | UINT32* P = *VM; *VM = *VM + VDATA; VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 795 | <h4>BUFFER_ATOMIC_CMPSWAP</h4> |
| 796 | <p>Opcode: 49 (0x31) for GCN 1.0/1.1; 65 (0x41) for GCN 1.2<br /> |
| 797 | Syntax: BUFFER_ATOMIC_CMPSWAP VDATA(2), VADDR, SRSRC, SOFFSET<br /> |
| 798 | Description: Store lower VDATA dword into SRSRC resource if previous value |
| 799 | from resources is equal VDATA>>32, otherwise keep old value from resource. |
| 800 | If GLC flag is set then return previous value to VDATA, otherwise keep VDATA value. |
| 801 | Operation is atomic.<br /> |
| 802 | Operation:<br /> |
| 803 | <code>UINT32* VM = (UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 804 | UINT32* P = *VM; *VM = *VM==(VDATA>>32) ? VDATA&0xffffffff : *VM // part of atomic |
| 805 | VDATA = (GLC) ? P : VDATA // last part of atomic</code></p> |
| 806 | <h4>BUFFER_ATOMIC_RSUB</h4> |
| 807 | <p>Opcode: 52 (0x34) for GCN 1.0 |
| 808 | Syntax: BUFFER_ATOMIC_RSUB VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 809 | Description: Subtract value of SRSRC resource from VDATA, and store result to |
| 810 | this resource. If GLC flag is set then return previous value to VDATA, |
| 811 | otherwise keep VDATA value. Operation is atomic.<br /> |
| 812 | Operation:<br /> |
| 813 | <code>UINT32* VM = (UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 814 | UINT32* P = *VM; *VM = VDATA - *VM; VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 815 | <h4>BUFFER_ATOMIC_SMAX</h4> |
| 816 | <p>Opcode: 55 (0x37) for GCN 1.0/1.1; 70 (0x46) for GCN 1.2<br /> |
| 817 | Syntax: BUFFER_ATOMIC_SMAX VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 818 | Description: Choose greatest signed 32-bit value from VDATA and from SRSRC resource, |
| 819 | and store result to this resource. |
| 820 | If GLC flag is set then return previous value to VDATA, otherwise keep VDATA value. |
| 821 | Operation is atomic.<br /> |
| 822 | Operation:<br /> |
| 823 | <code>INT32* VM = (INT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 824 | UINT32* P = *VM; *VM = MAX(*VM, (INT32)VDATA); VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 825 | <h4>BUFFER_ATOMIC_SMIN</h4> |
| 826 | <p>Opcode: 53 (0x35) for GCN 1.0/1.1; 68 (0x44) for GCN 1.2<br /> |
| 827 | Syntax: BUFFER_ATOMIC_SMIN VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 828 | Description: Choose smallest signed 32-bit value from VDATA and from SRSRC resource, |
| 829 | and store result to this resource. |
| 830 | If GLC flag is set then return previous value to VDATA, otherwise keep VDATA value. |
| 831 | Operation is atomic.<br /> |
| 832 | Operation:<br /> |
| 833 | <code>INT32* VM = (INT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 834 | UINT32* P = *VM; *VM = MIN(*VM, (INT32)VDATA); VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 835 | <h4>BUFFER_ATOMIC_SUB</h4> |
| 836 | <p>Opcode: 51 (0x33) for GCN 1.0/1.1; 67 (0x43) for GCN 1.2<br /> |
| 837 | Syntax: BUFFER_ATOMIC_SUB VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 838 | Description: Subtract VDATA from value from SRSRC resource, and store result to |
| 839 | this resource. If GLC flag is set then return previous value to VDATA, |
| 840 | otherwise keep VDATA value. Operation is atomic.<br /> |
| 841 | Operation:<br /> |
| 842 | <code>UINT32* VM = (UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 843 | UINT32* P = *VM; *VM = *VM - VDATA; VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 844 | <h4>BUFFER_ATOMIC_SWAP</h4> |
| 845 | <p>Opcode: 48 (0x30) for GCN 1.0/1.1; 64 (0x40) for GCN 1.2<br /> |
| 846 | Syntax: BUFFER_ATOMIC_SWAP VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 847 | Description: Store VDATA dword into SRSRC resource. If GLC flag is set then |
| 848 | return previous value to VDATA, otherwise keep VDATA value. Operation is atomic.<br /> |
| 849 | Operation:<br /> |
| 850 | <code>UINT32* VM = (UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 851 | UINT32* P = *VM; *VM = VDATA; VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 852 | <h4>BUFFER_ATOMIC_UMAX</h4> |
| 853 | <p>Opcode: 56 (0x38) for GCN 1.0/1.1; 71 (0x47) for GCN 1.2<br /> |
| 854 | Syntax: BUFFER_ATOMIC_UMAX VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 855 | Description: Choose greatest unsigned 32-bit value from VDATA and from SRSRC resource, |
| 856 | and store result to this resource. |
| 857 | If GLC flag is set then return previous value to VDATA, otherwise keep VDATA value. |
| 858 | Operation is atomic.<br /> |
| 859 | Operation:<br /> |
| 860 | <code>UINT32* VM = (UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 861 | UINT32* P = *VM; *VM = MAX(*VM, (INT32)VDATA); VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 862 | <h4>BUFFER_ATOMIC_UMIN</h4> |
| 863 | <p>Opcode: 54 (0x36) for GCN 1.0/1.1; 69 (0x45) for GCN 1.2<br /> |
| 864 | Syntax: BUFFER_ATOMIC_UMIN VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 865 | Description: Choose smallest unsigned 32-bit value from VDATA and from SRSRC resource, |
| 866 | and store result to this resource. |
| 867 | If GLC flag is set then return previous value to VDATA, otherwise keep VDATA value. |
| 868 | Operation is atomic.<br /> |
| 869 | Operation:<br /> |
| 870 | <code>UINT32* VM = (UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 871 | UINT32* P = *VM; *VM = MIN(*VM, (INT32)VDATA); VDATA = (GLC) ? P : VDATA // atomic</code></p> |
| 872 | <h4>BUFFER_LOAD_DWORD</h4> |
| 873 | <p>Opcode: 12 (0xc) for GCN 1.0/1.1; 20 (0x14) for GCN 1.2<br /> |
| 874 | Syntax: BUFFER_LOAD_DWORD VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 875 | Description: Load dword to VDATA from SRSRC resource.<br /> |
| 876 | Operation:<br /> |
| 877 | <code>VDATA = *(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET)</code></p> |
| 878 | <h4>BUFFER_LOAD_DWORDX2</h4> |
| 879 | <p>Opcode: 13 (0xd) for GCN 1.0/1.1; 21 (0x15) for GCN 1.2<br /> |
| 880 | Syntax: BUFFER_LOAD_DWORDX2 VDATA(2), VADDR, SRSRC, SOFFSET<br /> |
| 881 | Description: Load two dwords to VDATA from SRSRC resource.<br /> |
| 882 | Operation:<br /> |
| 883 | <code>UINT32* VM = *(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 884 | VDATA[0] = VM[0] |
| 885 | VDATA[1] = VM[1]</code></p> |
| 886 | <h4>BUFFER_LOAD_DWORDX3</h4> |
| 887 | <p>Opcode: 15 (0xf) for GCN 1.1; 22 (0x16) for GCN 1.2<br /> |
| 888 | Syntax: BUFFER_LOAD_DWORDX3 VDATA(3), VADDR, SRSRC, SOFFSET<br /> |
| 889 | Description: Load three dwords to VDATA from SRSRC resource.<br /> |
| 890 | Operation:<br /> |
| 891 | <code>UINT32* VM = *(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 892 | VDATA[0] = VM[0] |
| 893 | VDATA[1] = VM[1] |
| 894 | VDATA[2] = VM[2]</code></p> |
| 895 | <h4>BUFFER_LOAD_DWORDX4</h4> |
| 896 | <p>Opcode: 14 (0xe) for GCN 1.0/1.1; 23 (0x17) for GCN 1.2<br /> |
| 897 | Syntax: BUFFER_LOAD_DWORDX4 VDATA(4), VADDR, SRSRC, SOFFSET<br /> |
| 898 | Description: Load four dwords to VDATA from SRSRC resource.<br /> |
| 899 | Operation:<br /> |
| 900 | <code>UINT32* VM = *(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 901 | VDATA[0] = VM[0] |
| 902 | VDATA[1] = VM[1] |
| 903 | VDATA[2] = VM[2] |
| 904 | VDATA[3] = VM[3]</code></p> |
| 933 | <h4>BUFFER_LOAD_SBYTE</h4> |
| 934 | <p>Opcode: 9 (0x9) for GCN 1.0/1.1; 17 (0x11) for GCN 1.2<br /> |
| 935 | Syntax: BUFFER_LOAD_SBYTE VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 936 | Description: Load byte to VDATA from SRSRC resource with sign extending.<br /> |
| 937 | Operation:<br /> |
| 938 | <code>VDATA = *(INT8*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET)</code></p> |
| 939 | <h4>BUFFER_LOAD_SSHORT</h4> |
| 940 | <p>Opcode: 11 (0xb) for GCN 1.0/1.1; 19 (0x13) for GCN 1.2<br /> |
| 941 | Syntax: BUFFER_LOAD_SSHORT VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 942 | Description: Load 16-bit word to VDATA from SRSRC resource with sign extending.<br /> |
| 943 | Operation:<br /> |
| 944 | <code>VDATA = *(INT16*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET)</code></p> |
| 945 | <h4>BUFFER_LOAD_UBYTE</h4> |
| 946 | <p>Opcode: 8 (0x8) for GCN 1.0/1.1; 16 (0x10) for GCN 1.2<br /> |
| 947 | Syntax: BUFFER_LOAD_UBYTE VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 948 | Description: Load byte to VDATA from SRSRC resource with zero extending.<br /> |
| 949 | Operation:<br /> |
| 950 | <code>VDATA = *(UINT8*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET)</code></p> |
| 951 | <h4>BUFFER_LOAD_USHORT</h4> |
| 952 | <p>Opcode: 10 (0xa) for GCN 1.0/1.1; 18 (0x12) for GCN 1.2<br /> |
| 953 | Syntax: BUFFER_LOAD_USHORT VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 954 | Description: Load 16-bit word to VDATA from SRSRC resource with zero extending.<br /> |
| 955 | Operation:<br /> |
| 956 | <code>VDATA = *(UINT16*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET)</code></p> |
| 957 | <h4>BUFFER_STORE_BYTE</h4> |
| 958 | <p>Opcode: 24 (0x18)<br /> |
| 959 | Syntax: BUFFER_STORE_BYTE VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 960 | Description: Store byte from VDATA into SRSRC resource.<br /> |
| 961 | Operation:<br /> |
| 962 | <code>*(UINT8*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) = VDATA&0xff</code></p> |
| 963 | <h4>BUFFER_STORE_DWORD</h4> |
| 964 | <p>Opcode: 28 (0x1c)<br /> |
| 965 | Syntax: BUFFER_STORE_DWORD VDATA, VADDR, SRSRC, SOFFSET<br /> |
| 966 | Description: Store dword from VDATA into SRSRC resource.<br /> |
| 967 | Operation:<br /> |
| 968 | <code>*(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) = VDATA</code></p> |
| 969 | <h4>BUFFER_STORE_DWORDX2</h4> |
| 970 | <p>Opcode: 29 (0x1d)<br /> |
| 971 | Syntax: BUFFER_STORE_DWORDX2 VDATA(2), VADDR, SRSRC, SOFFSET<br /> |
| 972 | Description: Store two dwords from VDATA into SRSRC resource.<br /> |
| 973 | Operation:<br /> |
| 974 | <code>UINT32* VM = *(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 975 | VM[0] = VDATA[0] |
| 976 | VM[1] = VDATA[1]</code></p> |
| 977 | <h4>BUFFER_STORE_DWORDX3</h4> |
| 978 | <p>Opcode: 31 (0x1f) for GCN 1.1; 30 (0x1e) for GCN 1.2<br /> |
| 979 | Syntax: BUFFER_STORE_DWORDX2 VDATA(3), VADDR, SRSRC, SOFFSET<br /> |
| 980 | Description: Store three dwords from VDATA into SRSRC resource.<br /> |
| 981 | Operation:<br /> |
| 982 | <code>UINT32* VM = *(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 983 | VM[0] = VDATA[0] |
| 984 | VM[1] = VDATA[1] |
| 985 | VM[2] = VDATA[2]</code></p> |
| 986 | <h4>BUFFER_STORE_DWORDX4</h4> |
| 987 | <p>Opcode: 31 (0x1e) for GCN 1.1; 31 (0x1f) for GCN 1.2<br /> |
| 988 | Syntax: BUFFER_STORE_DWORDX2 VDATA(4), VADDR, SRSRC, SOFFSET<br /> |
| 989 | Description: Store four dwords from VDATA into SRSRC resource.<br /> |
| 990 | Operation:<br /> |
| 991 | <code>UINT32* VM = *(UINT32*)VMEM(SRSRC, VADDR, SOFFSET, OFFSET) |
| 992 | VM[0] = VDATA[0] |
| 993 | VM[1] = VDATA[1] |
| 994 | VM[2] = VDATA[2] |
| 995 | VM[3] = VDATA[3]</code></p> |