| 1106 | <h4>IMAGE_ATOMIC_FCMPSWAP</h4> |
| 1107 | <p>Opcode: 29 (0x1d) for GCN 1.0/1.1<br /> |
| 1108 | Syntax: IMAGE_ATOMIC_FCMPSWAP VDATA(1:4), VADDR(1:4), SRSRC(4,8)<br /> |
| 1109 | Description: Store first single/double floating point value of VDATA into image |
| 1110 | SRSRC to pixel at address VADDR if second single/double FP of VDATA is equal old value |
| 1111 | from image's pixel, otherwise keep old value from that pixel. |
| 1112 | Data type determined by image data format and half number of |
| 1113 | enabled bits in DMASK. Four dword data types are not supported. |
| 1114 | If GLC is set then return old values from image, otherwise keep VDATA value. |
| 1115 | Operation is atomic.<br /> |
| 1116 | Operation:<br /> |
| 1117 | <code>PIXELTYPE* VM = VMIMG(SRSRC, VADDR) |
| 1118 | if (sizeof(PIXELTYPE)==8) |
| 1119 | { |
| 1120 | DOUBLE P = *VM; |
| 1121 | *VM = *VM==ASDOUBLE(VDATA[1]) ? VDATA[0] : *VM // part of atomic |
| 1122 | VDATA[0] = (GLC) ? P : VDATA[0] // last part of atomic |
| 1123 | } |
| 1124 | else |
| 1125 | { |
| 1126 | FLOAT P = *VM; |
| 1127 | *VM = *VM==ASFLOAT(VDATA[1]) ? VDATA[0] : *VM // part of atomic |
| 1128 | VDATA[0] = (GLC) ? P : VDATA[0] // last part of atomic |
| 1129 | }</code></p> |