Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
      2 ; RUN: llc -march=r600 -mcpu=cayman -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
      3 
      4 ; TODO: Add _RTN versions and merge with the GCN test
      5 
      6 ; FUNC-LABEL: {{^}}atomic_add_i32_offset:
      7 ; EG: MEM_RAT ATOMIC_ADD [[REG:T[0-9]+]]
      8 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
      9 define amdgpu_kernel void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
     10 entry:
     11   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
     12   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     13   ret void
     14 }
     15 
     16 ; FUNC-LABEL: {{^}}atomic_add_i32_soffset:
     17 ; EG: MEM_RAT ATOMIC_ADD [[REG:T[0-9]+]]
     18 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     19 define amdgpu_kernel void @atomic_add_i32_soffset(i32 addrspace(1)* %out, i32 %in) {
     20 entry:
     21   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 9000
     22   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     23   ret void
     24 }
     25 
     26 ; FUNC-LABEL: {{^}}atomic_add_i32_huge_offset:
     27 ; FIXME: looks like the offset is wrong
     28 ; EG: MEM_RAT ATOMIC_ADD [[REG:T[0-9]+]]
     29 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     30 define amdgpu_kernel void @atomic_add_i32_huge_offset(i32 addrspace(1)* %out, i32 %in) {
     31 entry:
     32   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 47224239175595
     33 
     34   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     35   ret void
     36 }
     37 
     38 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset:
     39 ; EG: MEM_RAT ATOMIC_ADD [[REG:T[0-9]+]]
     40 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     41 define amdgpu_kernel void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
     42 entry:
     43   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
     44   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
     45   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     46   ret void
     47 }
     48 
     49 ; FUNC-LABEL: {{^}}atomic_add_i32:
     50 ; EG: MEM_RAT ATOMIC_ADD [[REG:T[0-9]+]]
     51 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     52 define amdgpu_kernel void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
     53 entry:
     54   %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
     55   ret void
     56 }
     57 
     58 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64:
     59 ; EG: MEM_RAT ATOMIC_ADD [[REG:T[0-9]+]]
     60 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     61 define amdgpu_kernel void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
     62 entry:
     63   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
     64   %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
     65   ret void
     66 }
     67 
     68 ; FUNC-LABEL: {{^}}atomic_and_i32_offset:
     69 ; EG: MEM_RAT ATOMIC_AND [[REG:T[0-9]+]]
     70 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     71 define amdgpu_kernel void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
     72 entry:
     73   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
     74   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
     75   ret void
     76 }
     77 
     78 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset:
     79 ; EG: MEM_RAT ATOMIC_AND [[REG:T[0-9]+]]
     80 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     81 define amdgpu_kernel void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
     82 entry:
     83   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
     84   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
     85   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
     86   ret void
     87 }
     88 
     89 ; FUNC-LABEL: {{^}}atomic_and_i32:
     90 ; EG: MEM_RAT ATOMIC_AND [[REG:T[0-9]+]]
     91 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
     92 define amdgpu_kernel void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
     93 entry:
     94   %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
     95   ret void
     96 }
     97 
     98 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64:
     99 ; EG: MEM_RAT ATOMIC_AND [[REG:T[0-9]+]]
    100 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    101 define amdgpu_kernel void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    102 entry:
    103   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    104   %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
    105   ret void
    106 }
    107 
    108 ; FUNC-LABEL: {{^}}atomic_sub_i32_offset:
    109 ; EG: MEM_RAT ATOMIC_SUB [[REG:T[0-9]+]]
    110 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    111 define amdgpu_kernel void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    112 entry:
    113   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    114   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
    115   ret void
    116 }
    117 
    118 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset:
    119 ; EG: MEM_RAT ATOMIC_SUB [[REG:T[0-9]+]]
    120 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    121 define amdgpu_kernel void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    122 entry:
    123   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    124   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    125   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
    126   ret void
    127 }
    128 
    129 ; FUNC-LABEL: {{^}}atomic_sub_i32:
    130 ; EG: MEM_RAT ATOMIC_SUB [[REG:T[0-9]+]]
    131 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    132 define amdgpu_kernel void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
    133 entry:
    134   %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
    135   ret void
    136 }
    137 
    138 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64:
    139 ; EG: MEM_RAT ATOMIC_SUB [[REG:T[0-9]+]]
    140 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    141 define amdgpu_kernel void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    142 entry:
    143   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    144   %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
    145   ret void
    146 }
    147 
    148 ; FUNC-LABEL: {{^}}atomic_max_i32_offset:
    149 ; EG: MEM_RAT ATOMIC_MAX_INT [[REG:T[0-9]+]]
    150 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    151 define amdgpu_kernel void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    152 entry:
    153   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    154   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
    155   ret void
    156 }
    157 
    158 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset:
    159 ; EG: MEM_RAT ATOMIC_MAX_INT [[REG:T[0-9]+]]
    160 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    161 define amdgpu_kernel void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    162 entry:
    163   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    164   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    165   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
    166   ret void
    167 }
    168 
    169 ; FUNC-LABEL: {{^}}atomic_max_i32:
    170 ; EG: MEM_RAT ATOMIC_MAX_INT [[REG:T[0-9]+]]
    171 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    172 define amdgpu_kernel void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
    173 entry:
    174   %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
    175   ret void
    176 }
    177 
    178 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64:
    179 ; EG: MEM_RAT ATOMIC_MAX_INT [[REG:T[0-9]+]]
    180 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    181 define amdgpu_kernel void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    182 entry:
    183   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    184   %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
    185   ret void
    186 }
    187 
    188 ; FUNC-LABEL: {{^}}atomic_umax_i32_offset:
    189 ; EG: MEM_RAT ATOMIC_MAX_UINT [[REG:T[0-9]+]]
    190 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    191 define amdgpu_kernel void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    192 entry:
    193   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    194   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
    195   ret void
    196 }
    197 
    198 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset:
    199 ; EG: MEM_RAT ATOMIC_MAX_UINT [[REG:T[0-9]+]]
    200 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    201 define amdgpu_kernel void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    202 entry:
    203   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    204   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    205   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
    206   ret void
    207 }
    208 
    209 ; FUNC-LABEL: {{^}}atomic_umax_i32:
    210 ; EG: MEM_RAT ATOMIC_MAX_UINT [[REG:T[0-9]+]]
    211 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    212 define amdgpu_kernel void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
    213 entry:
    214   %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
    215   ret void
    216 }
    217 
    218 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64:
    219 ; EG: MEM_RAT ATOMIC_MAX_UINT [[REG:T[0-9]+]]
    220 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    221 define amdgpu_kernel void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    222 entry:
    223   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    224   %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
    225   ret void
    226 }
    227 
    228 ; FUNC-LABEL: {{^}}atomic_min_i32_offset:
    229 ; EG: MEM_RAT ATOMIC_MIN_INT [[REG:T[0-9]+]]
    230 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    231 define amdgpu_kernel void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    232 entry:
    233   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    234   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
    235   ret void
    236 }
    237 
    238 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64_offset:
    239 ; EG: MEM_RAT ATOMIC_MIN_INT [[REG:T[0-9]+]]
    240 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    241 define amdgpu_kernel void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    242 entry:
    243   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    244   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    245   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
    246   ret void
    247 }
    248 
    249 ; FUNC-LABEL: {{^}}atomic_min_i32:
    250 ; EG: MEM_RAT ATOMIC_MIN_INT [[REG:T[0-9]+]]
    251 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    252 define amdgpu_kernel void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
    253 entry:
    254   %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
    255   ret void
    256 }
    257 
    258 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64:
    259 ; EG: MEM_RAT ATOMIC_MIN_INT [[REG:T[0-9]+]]
    260 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    261 define amdgpu_kernel void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    262 entry:
    263   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    264   %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
    265   ret void
    266 }
    267 
    268 ; FUNC-LABEL: {{^}}atomic_umin_i32_offset:
    269 ; EG: MEM_RAT ATOMIC_MIN_UINT [[REG:T[0-9]+]]
    270 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    271 define amdgpu_kernel void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    272 entry:
    273   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    274   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
    275   ret void
    276 }
    277 
    278 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64_offset:
    279 ; EG: MEM_RAT ATOMIC_MIN_UINT [[REG:T[0-9]+]]
    280 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    281 define amdgpu_kernel void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    282 entry:
    283   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    284   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    285   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
    286   ret void
    287 }
    288 
    289 ; FUNC-LABEL: {{^}}atomic_umin_i32:
    290 ; EG: MEM_RAT ATOMIC_MIN_UINT [[REG:T[0-9]+]]
    291 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    292 define amdgpu_kernel void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
    293 entry:
    294   %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
    295   ret void
    296 }
    297 
    298 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64:
    299 ; EG: MEM_RAT ATOMIC_MIN_UINT [[REG:T[0-9]+]]
    300 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    301 define amdgpu_kernel void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    302 entry:
    303   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    304   %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
    305   ret void
    306 }
    307 
    308 ; FUNC-LABEL: {{^}}atomic_or_i32_offset:
    309 ; EG: MEM_RAT ATOMIC_OR [[REG:T[0-9]+]]
    310 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    311 define amdgpu_kernel void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    312 entry:
    313   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    314   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
    315   ret void
    316 }
    317 
    318 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64_offset:
    319 ; EG: MEM_RAT ATOMIC_OR [[REG:T[0-9]+]]
    320 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    321 define amdgpu_kernel void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    322 entry:
    323   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    324   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    325   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
    326   ret void
    327 }
    328 
    329 ; FUNC-LABEL: {{^}}atomic_or_i32:
    330 ; EG: MEM_RAT ATOMIC_OR [[REG:T[0-9]+]]
    331 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    332 define amdgpu_kernel void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
    333 entry:
    334   %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
    335   ret void
    336 }
    337 
    338 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64:
    339 ; EG: MEM_RAT ATOMIC_OR [[REG:T[0-9]+]]
    340 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    341 define amdgpu_kernel void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    342 entry:
    343   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    344   %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
    345   ret void
    346 }
    347 
    348 ; FUNC-LABEL: {{^}}atomic_xchg_i32_offset:
    349 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    350 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    351 define amdgpu_kernel void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    352 entry:
    353   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    354   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
    355   ret void
    356 }
    357 
    358 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64_offset:
    359 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    360 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    361 define amdgpu_kernel void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    362 entry:
    363   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    364   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    365   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
    366   ret void
    367 }
    368 
    369 ; FUNC-LABEL: {{^}}atomic_xchg_i32:
    370 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    371 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    372 define amdgpu_kernel void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
    373 entry:
    374   %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
    375   ret void
    376 }
    377 
    378 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64:
    379 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    380 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    381 define amdgpu_kernel void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    382 entry:
    383   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    384   %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
    385   ret void
    386 }
    387 
    388 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_offset:
    389 ; EG: MEM_RAT ATOMIC_CMPXCHG_INT [[REG:T[0-9]+]]
    390 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    391 define amdgpu_kernel void @atomic_cmpxchg_i32_offset(i32 addrspace(1)* %out, i32 %in, i32 %old) {
    392 entry:
    393   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    394   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
    395   ret void
    396 }
    397 
    398 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64_offset:
    399 ; EG: MEM_RAT ATOMIC_CMPXCHG_INT [[REG:T[0-9]+]]
    400 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    401 define amdgpu_kernel void @atomic_cmpxchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
    402 entry:
    403   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    404   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    405   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
    406   ret void
    407 }
    408 
    409 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32:
    410 ; EG: MEM_RAT ATOMIC_CMPXCHG_INT [[REG:T[0-9]+]]
    411 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    412 define amdgpu_kernel void @atomic_cmpxchg_i32(i32 addrspace(1)* %out, i32 %in, i32 %old) {
    413 entry:
    414   %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst
    415   ret void
    416 }
    417 
    418 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64:
    419 ; EG: MEM_RAT ATOMIC_CMPXCHG_INT [[REG:T[0-9]+]]
    420 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    421 define amdgpu_kernel void @atomic_cmpxchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
    422 entry:
    423   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    424   %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst
    425   ret void
    426 }
    427 
    428 ; FUNC-LABEL: {{^}}atomic_xor_i32_offset:
    429 ; EG: MEM_RAT ATOMIC_XOR [[REG:T[0-9]+]]
    430 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    431 define amdgpu_kernel void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    432 entry:
    433   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    434   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
    435   ret void
    436 }
    437 
    438 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64_offset:
    439 ; EG: MEM_RAT ATOMIC_XOR [[REG:T[0-9]+]]
    440 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    441 define amdgpu_kernel void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    442 entry:
    443   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    444   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    445   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
    446   ret void
    447 }
    448 
    449 ; FUNC-LABEL: {{^}}atomic_xor_i32:
    450 ; EG: MEM_RAT ATOMIC_XOR [[REG:T[0-9]+]]
    451 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    452 define amdgpu_kernel void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
    453 entry:
    454   %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
    455   ret void
    456 }
    457 
    458 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64:
    459 ; EG: MEM_RAT ATOMIC_XOR [[REG:T[0-9]+]]
    460 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Z
    461 define amdgpu_kernel void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    462 entry:
    463   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    464   %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
    465   ret void
    466 }
    467 
    468 ; FUNC-LABEL: {{^}}atomic_store_i32_offset:
    469 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    470 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Y
    471 define amdgpu_kernel void @atomic_store_i32_offset(i32 %in, i32 addrspace(1)* %out) {
    472 entry:
    473   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    474   store atomic i32 %in, i32 addrspace(1)* %gep  seq_cst, align 4
    475   ret void
    476 }
    477 
    478 ; FUNC-LABEL: {{^}}atomic_store_i32:
    479 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    480 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Y
    481 define amdgpu_kernel void @atomic_store_i32(i32 %in, i32 addrspace(1)* %out) {
    482 entry:
    483   store atomic i32 %in, i32 addrspace(1)* %out seq_cst, align 4
    484   ret void
    485 }
    486 
    487 ; FUNC-LABEL: {{^}}atomic_store_i32_addr64_offset:
    488 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    489 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Y
    490 define amdgpu_kernel void @atomic_store_i32_addr64_offset(i32 %in, i32 addrspace(1)* %out, i64 %index) {
    491 entry:
    492   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    493   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    494   store atomic i32 %in, i32 addrspace(1)* %gep seq_cst, align 4
    495   ret void
    496 }
    497 
    498 ; FUNC-LABEL: {{^}}atomic_store_i32_addr64:
    499 ; EG: MEM_RAT ATOMIC_XCHG_INT [[REG:T[0-9]+]]
    500 ; EG: MOV{{[ *]*}}[[REG]].X, KC0[2].Y
    501 define amdgpu_kernel void @atomic_store_i32_addr64(i32 %in, i32 addrspace(1)* %out, i64 %index) {
    502 entry:
    503   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    504   store atomic i32 %in, i32 addrspace(1)* %ptr seq_cst, align 4
    505   ret void
    506 }
    507 
    508 ; FUNC-LABEL: {{^}}atomic_inc_add
    509 ; EG: MEM_RAT ATOMIC_INC_UINT
    510 define amdgpu_kernel void @atomic_inc_add(i32 addrspace(1)* %out) {
    511 entry:
    512   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    513   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 1 seq_cst
    514   ret void
    515 }
    516 
    517 ; FUNC-LABEL: {{^}}atomic_dec_add
    518 ; EG: MEM_RAT ATOMIC_DEC_UINT
    519 define amdgpu_kernel void @atomic_dec_add(i32 addrspace(1)* %out) {
    520 entry:
    521   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    522   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 -1 seq_cst
    523   ret void
    524 }
    525 
    526 ; FUNC-LABEL: {{^}}atomic_inc_sub
    527 ; EG: MEM_RAT ATOMIC_INC_UINT
    528 define amdgpu_kernel void @atomic_inc_sub(i32 addrspace(1)* %out) {
    529 entry:
    530   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    531   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 -1 seq_cst
    532   ret void
    533 }
    534 
    535 ; FUNC-LABEL: {{^}}atomic_dec_sub
    536 ; EG: MEM_RAT ATOMIC_DEC_UINT
    537 define amdgpu_kernel void @atomic_dec_sub(i32 addrspace(1)* %out) {
    538 entry:
    539   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    540   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 1 seq_cst
    541   ret void
    542 }
    543