Home | History | Annotate | Download | only in R600
      1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=SI -check-prefix=GCN %s
      2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=VI -check-prefix=GCN %s
      3 
      4 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64:
      5 ; GCN: ds_wrxchg_rtn_b64
      6 ; GCN: s_endpgm
      7 define void @lds_atomic_xchg_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
      8   %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst
      9   store i64 %result, i64 addrspace(1)* %out, align 8
     10   ret void
     11 }
     12 
     13 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64_offset:
     14 ; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32
     15 ; GCN: s_endpgm
     16 define void @lds_atomic_xchg_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     17   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
     18   %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
     19   store i64 %result, i64 addrspace(1)* %out, align 8
     20   ret void
     21 }
     22 
     23 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64:
     24 ; GCN: ds_add_rtn_u64
     25 ; GCN: s_endpgm
     26 define void @lds_atomic_add_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     27   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst
     28   store i64 %result, i64 addrspace(1)* %out, align 8
     29   ret void
     30 }
     31 
     32 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64_offset:
     33 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9
     34 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0
     35 ; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
     36 ; VI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x2c
     37 ; GCN-DAG: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
     38 ; GCN: ds_add_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32
     39 ; GCN: buffer_store_dwordx2 [[RESULT]],
     40 ; GCN: s_endpgm
     41 define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     42   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4
     43   %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
     44   store i64 %result, i64 addrspace(1)* %out, align 8
     45   ret void
     46 }
     47 
     48 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64:
     49 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
     50 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
     51 ; GCN: ds_inc_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
     52 ; GCN: buffer_store_dwordx2 [[RESULT]],
     53 ; GCN: s_endpgm
     54 define void @lds_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     55   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
     56   store i64 %result, i64 addrspace(1)* %out, align 8
     57   ret void
     58 }
     59 
     60 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64_offset:
     61 ; GCN: ds_inc_rtn_u64 {{.*}} offset:32
     62 ; GCN: s_endpgm
     63 define void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     64   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
     65   %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
     66   store i64 %result, i64 addrspace(1)* %out, align 8
     67   ret void
     68 }
     69 
     70 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64:
     71 ; GCN: ds_sub_rtn_u64
     72 ; GCN: s_endpgm
     73 define void @lds_atomic_sub_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     74   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
     75   store i64 %result, i64 addrspace(1)* %out, align 8
     76   ret void
     77 }
     78 
     79 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64_offset:
     80 ; GCN: ds_sub_rtn_u64 {{.*}} offset:32
     81 ; GCN: s_endpgm
     82 define void @lds_atomic_sub_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     83   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
     84   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
     85   store i64 %result, i64 addrspace(1)* %out, align 8
     86   ret void
     87 }
     88 
     89 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64:
     90 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
     91 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
     92 ; GCN: ds_dec_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
     93 ; GCN: buffer_store_dwordx2 [[RESULT]],
     94 ; GCN: s_endpgm
     95 define void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
     96   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
     97   store i64 %result, i64 addrspace(1)* %out, align 8
     98   ret void
     99 }
    100 
    101 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64_offset:
    102 ; GCN: ds_dec_rtn_u64 {{.*}} offset:32
    103 ; GCN: s_endpgm
    104 define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    105   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    106   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
    107   store i64 %result, i64 addrspace(1)* %out, align 8
    108   ret void
    109 }
    110 
    111 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64:
    112 ; GCN: ds_and_rtn_b64
    113 ; GCN: s_endpgm
    114 define void @lds_atomic_and_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    115   %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
    116   store i64 %result, i64 addrspace(1)* %out, align 8
    117   ret void
    118 }
    119 
    120 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64_offset:
    121 ; GCN: ds_and_rtn_b64 {{.*}} offset:32
    122 ; GCN: s_endpgm
    123 define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    124   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    125   %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
    126   store i64 %result, i64 addrspace(1)* %out, align 8
    127   ret void
    128 }
    129 
    130 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64:
    131 ; GCN: ds_or_rtn_b64
    132 ; GCN: s_endpgm
    133 define void @lds_atomic_or_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    134   %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
    135   store i64 %result, i64 addrspace(1)* %out, align 8
    136   ret void
    137 }
    138 
    139 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64_offset:
    140 ; GCN: ds_or_rtn_b64 {{.*}} offset:32
    141 ; GCN: s_endpgm
    142 define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    143   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    144   %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
    145   store i64 %result, i64 addrspace(1)* %out, align 8
    146   ret void
    147 }
    148 
    149 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64:
    150 ; GCN: ds_xor_rtn_b64
    151 ; GCN: s_endpgm
    152 define void @lds_atomic_xor_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    153   %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
    154   store i64 %result, i64 addrspace(1)* %out, align 8
    155   ret void
    156 }
    157 
    158 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64_offset:
    159 ; GCN: ds_xor_rtn_b64 {{.*}} offset:32
    160 ; GCN: s_endpgm
    161 define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    162   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    163   %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
    164   store i64 %result, i64 addrspace(1)* %out, align 8
    165   ret void
    166 }
    167 
    168 ; FIXME: There is no atomic nand instr
    169 ; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i64:uction, so we somehow need to expand this.
    170 ; define void @lds_atomic_nand_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    171 ;   %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
    172 ;   store i64 %result, i64 addrspace(1)* %out, align 8
    173 ;   ret void
    174 ; }
    175 
    176 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64:
    177 ; GCN: ds_min_rtn_i64
    178 ; GCN: s_endpgm
    179 define void @lds_atomic_min_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    180   %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
    181   store i64 %result, i64 addrspace(1)* %out, align 8
    182   ret void
    183 }
    184 
    185 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64_offset:
    186 ; GCN: ds_min_rtn_i64 {{.*}} offset:32
    187 ; GCN: s_endpgm
    188 define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    189   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    190   %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
    191   store i64 %result, i64 addrspace(1)* %out, align 8
    192   ret void
    193 }
    194 
    195 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64:
    196 ; GCN: ds_max_rtn_i64
    197 ; GCN: s_endpgm
    198 define void @lds_atomic_max_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    199   %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
    200   store i64 %result, i64 addrspace(1)* %out, align 8
    201   ret void
    202 }
    203 
    204 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64_offset:
    205 ; GCN: ds_max_rtn_i64 {{.*}} offset:32
    206 ; GCN: s_endpgm
    207 define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    208   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    209   %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
    210   store i64 %result, i64 addrspace(1)* %out, align 8
    211   ret void
    212 }
    213 
    214 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64:
    215 ; GCN: ds_min_rtn_u64
    216 ; GCN: s_endpgm
    217 define void @lds_atomic_umin_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    218   %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
    219   store i64 %result, i64 addrspace(1)* %out, align 8
    220   ret void
    221 }
    222 
    223 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64_offset:
    224 ; GCN: ds_min_rtn_u64 {{.*}} offset:32
    225 ; GCN: s_endpgm
    226 define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    227   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    228   %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
    229   store i64 %result, i64 addrspace(1)* %out, align 8
    230   ret void
    231 }
    232 
    233 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64:
    234 ; GCN: ds_max_rtn_u64
    235 ; GCN: s_endpgm
    236 define void @lds_atomic_umax_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    237   %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
    238   store i64 %result, i64 addrspace(1)* %out, align 8
    239   ret void
    240 }
    241 
    242 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64_offset:
    243 ; GCN: ds_max_rtn_u64 {{.*}} offset:32
    244 ; GCN: s_endpgm
    245 define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
    246   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    247   %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
    248   store i64 %result, i64 addrspace(1)* %out, align 8
    249   ret void
    250 }
    251 
    252 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64:
    253 ; GCN: ds_wrxchg_rtn_b64
    254 ; GCN: s_endpgm
    255 define void @lds_atomic_xchg_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    256   %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst
    257   ret void
    258 }
    259 
    260 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64_offset:
    261 ; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32
    262 ; GCN: s_endpgm
    263 define void @lds_atomic_xchg_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    264   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    265   %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
    266   ret void
    267 }
    268 
    269 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64:
    270 ; GCN: ds_add_u64
    271 ; GCN: s_endpgm
    272 define void @lds_atomic_add_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    273   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst
    274   ret void
    275 }
    276 
    277 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64_offset:
    278 ; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x9
    279 ; VI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x24
    280 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9
    281 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0
    282 ; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
    283 ; GCN: ds_add_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32
    284 ; GCN: s_endpgm
    285 define void @lds_atomic_add_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    286   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4
    287   %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
    288   ret void
    289 }
    290 
    291 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64:
    292 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
    293 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
    294 ; GCN: ds_inc_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
    295 ; GCN: s_endpgm
    296 define void @lds_atomic_inc_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    297   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
    298   ret void
    299 }
    300 
    301 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64_offset:
    302 ; GCN: ds_inc_u64 {{.*}} offset:32
    303 ; GCN: s_endpgm
    304 define void @lds_atomic_inc_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    305   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    306   %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
    307   ret void
    308 }
    309 
    310 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64:
    311 ; GCN: ds_sub_u64
    312 ; GCN: s_endpgm
    313 define void @lds_atomic_sub_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    314   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
    315   ret void
    316 }
    317 
    318 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64_offset:
    319 ; GCN: ds_sub_u64 {{.*}} offset:32
    320 ; GCN: s_endpgm
    321 define void @lds_atomic_sub_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    322   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    323   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
    324   ret void
    325 }
    326 
    327 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64:
    328 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
    329 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
    330 ; GCN: ds_dec_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
    331 ; GCN: s_endpgm
    332 define void @lds_atomic_dec_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    333   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
    334   ret void
    335 }
    336 
    337 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64_offset:
    338 ; GCN: ds_dec_u64 {{.*}} offset:32
    339 ; GCN: s_endpgm
    340 define void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    341   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    342   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
    343   ret void
    344 }
    345 
    346 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64:
    347 ; GCN: ds_and_b64
    348 ; GCN: s_endpgm
    349 define void @lds_atomic_and_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    350   %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
    351   ret void
    352 }
    353 
    354 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64_offset:
    355 ; GCN: ds_and_b64 {{.*}} offset:32
    356 ; GCN: s_endpgm
    357 define void @lds_atomic_and_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    358   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    359   %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
    360   ret void
    361 }
    362 
    363 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64:
    364 ; GCN: ds_or_b64
    365 ; GCN: s_endpgm
    366 define void @lds_atomic_or_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    367   %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
    368   ret void
    369 }
    370 
    371 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64_offset:
    372 ; GCN: ds_or_b64 {{.*}} offset:32
    373 ; GCN: s_endpgm
    374 define void @lds_atomic_or_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    375   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    376   %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
    377   ret void
    378 }
    379 
    380 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64:
    381 ; GCN: ds_xor_b64
    382 ; GCN: s_endpgm
    383 define void @lds_atomic_xor_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    384   %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
    385   ret void
    386 }
    387 
    388 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64_offset:
    389 ; GCN: ds_xor_b64 {{.*}} offset:32
    390 ; GCN: s_endpgm
    391 define void @lds_atomic_xor_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    392   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    393   %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
    394   ret void
    395 }
    396 
    397 ; FIXME: There is no atomic nand instr
    398 ; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i64:uction, so we somehow need to expand this.
    399 ; define void @lds_atomic_nand_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    400 ;   %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
    401 ;   ret void
    402 ; }
    403 
    404 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64:
    405 ; GCN: ds_min_i64
    406 ; GCN: s_endpgm
    407 define void @lds_atomic_min_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    408   %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
    409   ret void
    410 }
    411 
    412 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64_offset:
    413 ; GCN: ds_min_i64 {{.*}} offset:32
    414 ; GCN: s_endpgm
    415 define void @lds_atomic_min_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    416   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    417   %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
    418   ret void
    419 }
    420 
    421 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64:
    422 ; GCN: ds_max_i64
    423 ; GCN: s_endpgm
    424 define void @lds_atomic_max_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    425   %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
    426   ret void
    427 }
    428 
    429 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64_offset:
    430 ; GCN: ds_max_i64 {{.*}} offset:32
    431 ; GCN: s_endpgm
    432 define void @lds_atomic_max_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    433   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    434   %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
    435   ret void
    436 }
    437 
    438 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64:
    439 ; GCN: ds_min_u64
    440 ; GCN: s_endpgm
    441 define void @lds_atomic_umin_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    442   %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
    443   ret void
    444 }
    445 
    446 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64_offset:
    447 ; GCN: ds_min_u64 {{.*}} offset:32
    448 ; GCN: s_endpgm
    449 define void @lds_atomic_umin_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    450   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    451   %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
    452   ret void
    453 }
    454 
    455 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64:
    456 ; GCN: ds_max_u64
    457 ; GCN: s_endpgm
    458 define void @lds_atomic_umax_noret_i64(i64 addrspace(3)* %ptr) nounwind {
    459   %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
    460   ret void
    461 }
    462 
    463 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64_offset:
    464 ; GCN: ds_max_u64 {{.*}} offset:32
    465 ; GCN: s_endpgm
    466 define void @lds_atomic_umax_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
    467   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
    468   %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
    469   ret void
    470 }
    471