blob: f9a43dd61c8cfbb1676c2dbdad071199d54bdaa6 [file] [log] [blame]
Matt Arsenaultab411932018-10-02 03:50:56 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
3
Nikita Popovbdf2fbb2022-12-19 12:39:01 +01004define i32 @atomic_nand_i32_lds(ptr addrspace(3) %ptr) nounwind {
Matt Arsenaultab411932018-10-02 03:50:56 +00005; GCN-LABEL: atomic_nand_i32_lds:
6; GCN: ; %bb.0:
7; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
Alexander Timofeevc4d256a2019-10-14 12:01:10 +00008; GCN-NEXT: ds_read_b32 v1, v0
Matt Arsenault71dfb7e2019-07-08 19:03:38 +00009; GCN-NEXT: s_mov_b64 s[4:5], 0
RamNalamothu18f935122021-11-20 01:53:38 +053010; GCN-NEXT: .LBB0_1: ; %atomicrmw.start
Matt Arsenaultab411932018-10-02 03:50:56 +000011; GCN-NEXT: ; =>This Inner Loop Header: Depth=1
12; GCN-NEXT: s_waitcnt lgkmcnt(0)
Alexander Timofeevc4d256a2019-10-14 12:01:10 +000013; GCN-NEXT: v_mov_b32_e32 v2, v1
Matt Arsenaultab411932018-10-02 03:50:56 +000014; GCN-NEXT: v_not_b32_e32 v1, v2
15; GCN-NEXT: v_or_b32_e32 v1, -5, v1
Matt Arsenaultab411932018-10-02 03:50:56 +000016; GCN-NEXT: ds_cmpst_rtn_b32 v1, v0, v2, v1
Tony Tye8a91b682021-02-13 08:43:48 +000017; GCN-NEXT: s_waitcnt lgkmcnt(0)
Matt Arsenaultab411932018-10-02 03:50:56 +000018; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v1, v2
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000019; GCN-NEXT: s_or_b64 s[4:5], vcc, s[4:5]
20; GCN-NEXT: s_andn2_b64 exec, exec, s[4:5]
RamNalamothu18f935122021-11-20 01:53:38 +053021; GCN-NEXT: s_cbranch_execnz .LBB0_1
Matt Arsenaultab411932018-10-02 03:50:56 +000022; GCN-NEXT: ; %bb.2: ; %atomicrmw.end
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000023; GCN-NEXT: s_or_b64 exec, exec, s[4:5]
Matt Arsenaultab411932018-10-02 03:50:56 +000024; GCN-NEXT: v_mov_b32_e32 v0, v1
25; GCN-NEXT: s_setpc_b64 s[30:31]
Nikita Popovbdf2fbb2022-12-19 12:39:01 +010026 %result = atomicrmw nand ptr addrspace(3) %ptr, i32 4 seq_cst
Matt Arsenaultab411932018-10-02 03:50:56 +000027 ret i32 %result
28}
29
Nikita Popovbdf2fbb2022-12-19 12:39:01 +010030define i32 @atomic_nand_i32_global(ptr addrspace(1) %ptr) nounwind {
Matt Arsenaultab411932018-10-02 03:50:56 +000031; GCN-LABEL: atomic_nand_i32_global:
32; GCN: ; %bb.0:
33; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
Alexander Timofeevc4d256a2019-10-14 12:01:10 +000034; GCN-NEXT: global_load_dword v2, v[0:1], off
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000035; GCN-NEXT: s_mov_b64 s[4:5], 0
RamNalamothu18f935122021-11-20 01:53:38 +053036; GCN-NEXT: .LBB1_1: ; %atomicrmw.start
Matt Arsenaultab411932018-10-02 03:50:56 +000037; GCN-NEXT: ; =>This Inner Loop Header: Depth=1
Austin Kerbowe501ed82023-05-22 10:32:09 -070038; GCN-NEXT: s_waitcnt vmcnt(0)
Alexander Timofeevc4d256a2019-10-14 12:01:10 +000039; GCN-NEXT: v_mov_b32_e32 v3, v2
Matt Arsenaultab411932018-10-02 03:50:56 +000040; GCN-NEXT: v_not_b32_e32 v2, v3
41; GCN-NEXT: v_or_b32_e32 v2, -5, v2
Matt Arsenaultab411932018-10-02 03:50:56 +000042; GCN-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc
Tony Tyec62b7372021-02-16 03:22:34 +000043; GCN-NEXT: s_waitcnt vmcnt(0)
Matt Arsenaultab411932018-10-02 03:50:56 +000044; GCN-NEXT: buffer_wbinvl1_vol
45; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v2, v3
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000046; GCN-NEXT: s_or_b64 s[4:5], vcc, s[4:5]
47; GCN-NEXT: s_andn2_b64 exec, exec, s[4:5]
RamNalamothu18f935122021-11-20 01:53:38 +053048; GCN-NEXT: s_cbranch_execnz .LBB1_1
Matt Arsenaultab411932018-10-02 03:50:56 +000049; GCN-NEXT: ; %bb.2: ; %atomicrmw.end
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000050; GCN-NEXT: s_or_b64 exec, exec, s[4:5]
Matt Arsenaultab411932018-10-02 03:50:56 +000051; GCN-NEXT: v_mov_b32_e32 v0, v2
52; GCN-NEXT: s_setpc_b64 s[30:31]
Nikita Popovbdf2fbb2022-12-19 12:39:01 +010053 %result = atomicrmw nand ptr addrspace(1) %ptr, i32 4 seq_cst
Matt Arsenaultab411932018-10-02 03:50:56 +000054 ret i32 %result
55}
56
Nikita Popovbdf2fbb2022-12-19 12:39:01 +010057define i32 @atomic_nand_i32_flat(ptr %ptr) nounwind {
Matt Arsenaultab411932018-10-02 03:50:56 +000058; GCN-LABEL: atomic_nand_i32_flat:
59; GCN: ; %bb.0:
60; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
Alexander Timofeevc4d256a2019-10-14 12:01:10 +000061; GCN-NEXT: flat_load_dword v2, v[0:1]
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000062; GCN-NEXT: s_mov_b64 s[4:5], 0
RamNalamothu18f935122021-11-20 01:53:38 +053063; GCN-NEXT: .LBB2_1: ; %atomicrmw.start
Matt Arsenaultab411932018-10-02 03:50:56 +000064; GCN-NEXT: ; =>This Inner Loop Header: Depth=1
Austin Kerbowe501ed82023-05-22 10:32:09 -070065; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
Alexander Timofeevc4d256a2019-10-14 12:01:10 +000066; GCN-NEXT: v_mov_b32_e32 v3, v2
Matt Arsenaultab411932018-10-02 03:50:56 +000067; GCN-NEXT: v_not_b32_e32 v2, v3
68; GCN-NEXT: v_or_b32_e32 v2, -5, v2
Matt Arsenaultab411932018-10-02 03:50:56 +000069; GCN-NEXT: flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000070; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
Matt Arsenaultab411932018-10-02 03:50:56 +000071; GCN-NEXT: buffer_wbinvl1_vol
Matt Arsenaultab411932018-10-02 03:50:56 +000072; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v2, v3
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000073; GCN-NEXT: s_or_b64 s[4:5], vcc, s[4:5]
74; GCN-NEXT: s_andn2_b64 exec, exec, s[4:5]
RamNalamothu18f935122021-11-20 01:53:38 +053075; GCN-NEXT: s_cbranch_execnz .LBB2_1
Matt Arsenaultab411932018-10-02 03:50:56 +000076; GCN-NEXT: ; %bb.2: ; %atomicrmw.end
Matt Arsenault71dfb7e2019-07-08 19:03:38 +000077; GCN-NEXT: s_or_b64 exec, exec, s[4:5]
Matt Arsenaultab411932018-10-02 03:50:56 +000078; GCN-NEXT: v_mov_b32_e32 v0, v2
79; GCN-NEXT: s_setpc_b64 s[30:31]
Nikita Popovbdf2fbb2022-12-19 12:39:01 +010080 %result = atomicrmw nand ptr %ptr, i32 4 seq_cst
Matt Arsenaultab411932018-10-02 03:50:56 +000081 ret i32 %result
82}