xref: /aosp_15_r20/external/llvm/test/CodeGen/NVPTX/atomics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom0
5*9880d681SAndroid Build Coastguard Workerdefine i32 @atom0(i32* %addr, i32 %val) {
6*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u32
7*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw add i32* %addr, i32 %val seq_cst
8*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
9*9880d681SAndroid Build Coastguard Worker}
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom1
12*9880d681SAndroid Build Coastguard Workerdefine i64 @atom1(i64* %addr, i64 %val) {
13*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u64
14*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw add i64* %addr, i64 %val seq_cst
15*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom2
19*9880d681SAndroid Build Coastguard Workerdefine i32 @atom2(i32* %subr, i32 %val) {
20*9880d681SAndroid Build Coastguard Worker; CHECK: neg.s32
21*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u32
22*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw sub i32* %subr, i32 %val seq_cst
23*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom3
27*9880d681SAndroid Build Coastguard Workerdefine i64 @atom3(i64* %subr, i64 %val) {
28*9880d681SAndroid Build Coastguard Worker; CHECK: neg.s64
29*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u64
30*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw sub i64* %subr, i64 %val seq_cst
31*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom4
35*9880d681SAndroid Build Coastguard Workerdefine i32 @atom4(i32* %subr, i32 %val) {
36*9880d681SAndroid Build Coastguard Worker; CHECK: atom.and.b32
37*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw and i32* %subr, i32 %val seq_cst
38*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom5
42*9880d681SAndroid Build Coastguard Workerdefine i64 @atom5(i64* %subr, i64 %val) {
43*9880d681SAndroid Build Coastguard Worker; CHECK: atom.and.b64
44*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw and i64* %subr, i64 %val seq_cst
45*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker;; NAND not yet supported
49*9880d681SAndroid Build Coastguard Worker;define i32 @atom6(i32* %subr, i32 %val) {
50*9880d681SAndroid Build Coastguard Worker;  %ret = atomicrmw nand i32* %subr, i32 %val seq_cst
51*9880d681SAndroid Build Coastguard Worker;  ret i32 %ret
52*9880d681SAndroid Build Coastguard Worker;}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker;define i64 @atom7(i64* %subr, i64 %val) {
55*9880d681SAndroid Build Coastguard Worker;  %ret = atomicrmw nand i64* %subr, i64 %val seq_cst
56*9880d681SAndroid Build Coastguard Worker;  ret i64 %ret
57*9880d681SAndroid Build Coastguard Worker;}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom8
60*9880d681SAndroid Build Coastguard Workerdefine i32 @atom8(i32* %subr, i32 %val) {
61*9880d681SAndroid Build Coastguard Worker; CHECK: atom.or.b32
62*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw or i32* %subr, i32 %val seq_cst
63*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom9
67*9880d681SAndroid Build Coastguard Workerdefine i64 @atom9(i64* %subr, i64 %val) {
68*9880d681SAndroid Build Coastguard Worker; CHECK: atom.or.b64
69*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw or i64* %subr, i64 %val seq_cst
70*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom10
74*9880d681SAndroid Build Coastguard Workerdefine i32 @atom10(i32* %subr, i32 %val) {
75*9880d681SAndroid Build Coastguard Worker; CHECK: atom.xor.b32
76*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw xor i32* %subr, i32 %val seq_cst
77*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom11
81*9880d681SAndroid Build Coastguard Workerdefine i64 @atom11(i64* %subr, i64 %val) {
82*9880d681SAndroid Build Coastguard Worker; CHECK: atom.xor.b64
83*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw xor i64* %subr, i64 %val seq_cst
84*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom12
88*9880d681SAndroid Build Coastguard Workerdefine i32 @atom12(i32* %subr, i32 %val) {
89*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.s32
90*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw max i32* %subr, i32 %val seq_cst
91*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom13
95*9880d681SAndroid Build Coastguard Workerdefine i64 @atom13(i64* %subr, i64 %val) {
96*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.s64
97*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw max i64* %subr, i64 %val seq_cst
98*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom14
102*9880d681SAndroid Build Coastguard Workerdefine i32 @atom14(i32* %subr, i32 %val) {
103*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.s32
104*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw min i32* %subr, i32 %val seq_cst
105*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom15
109*9880d681SAndroid Build Coastguard Workerdefine i64 @atom15(i64* %subr, i64 %val) {
110*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.s64
111*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw min i64* %subr, i64 %val seq_cst
112*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom16
116*9880d681SAndroid Build Coastguard Workerdefine i32 @atom16(i32* %subr, i32 %val) {
117*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.u32
118*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw umax i32* %subr, i32 %val seq_cst
119*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom17
123*9880d681SAndroid Build Coastguard Workerdefine i64 @atom17(i64* %subr, i64 %val) {
124*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.u64
125*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw umax i64* %subr, i64 %val seq_cst
126*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom18
130*9880d681SAndroid Build Coastguard Workerdefine i32 @atom18(i32* %subr, i32 %val) {
131*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.u32
132*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw umin i32* %subr, i32 %val seq_cst
133*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom19
137*9880d681SAndroid Build Coastguard Workerdefine i64 @atom19(i64* %subr, i64 %val) {
138*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.u64
139*9880d681SAndroid Build Coastguard Worker  %ret = atomicrmw umin i64* %subr, i64 %val seq_cst
140*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_add_f32_generic
146*9880d681SAndroid Build Coastguard Workerdefine float @atomic_add_f32_generic(float* %addr, float %val) {
147*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.f32
148*9880d681SAndroid Build Coastguard Worker  %ret = call float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
149*9880d681SAndroid Build Coastguard Worker  ret float %ret
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_add_f32_addrspace1
155*9880d681SAndroid Build Coastguard Workerdefine float @atomic_add_f32_addrspace1(float addrspace(1)* %addr, float %val) {
156*9880d681SAndroid Build Coastguard Worker; CHECK: atom.global.add.f32
157*9880d681SAndroid Build Coastguard Worker  %ret = call float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
158*9880d681SAndroid Build Coastguard Worker  ret float %ret
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_add_f32_addrspace3
164*9880d681SAndroid Build Coastguard Workerdefine float @atomic_add_f32_addrspace3(float addrspace(3)* %addr, float %val) {
165*9880d681SAndroid Build Coastguard Worker; CHECK: atom.shared.add.f32
166*9880d681SAndroid Build Coastguard Worker  %ret = call float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
167*9880d681SAndroid Build Coastguard Worker  ret float %ret
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_cmpxchg_i32
171*9880d681SAndroid Build Coastguard Workerdefine i32 @atomic_cmpxchg_i32(i32* %addr, i32 %cmp, i32 %new) {
172*9880d681SAndroid Build Coastguard Worker; CHECK: atom.cas.b32
173*9880d681SAndroid Build Coastguard Worker  %pairold = cmpxchg i32* %addr, i32 %cmp, i32 %new seq_cst seq_cst
174*9880d681SAndroid Build Coastguard Worker  ret i32 %new
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_cmpxchg_i64
178*9880d681SAndroid Build Coastguard Workerdefine i64 @atomic_cmpxchg_i64(i64* %addr, i64 %cmp, i64 %new) {
179*9880d681SAndroid Build Coastguard Worker; CHECK: atom.cas.b64
180*9880d681SAndroid Build Coastguard Worker  %pairold = cmpxchg i64* %addr, i64 %cmp, i64 %new seq_cst seq_cst
181*9880d681SAndroid Build Coastguard Worker  ret i64 %new
182*9880d681SAndroid Build Coastguard Worker}
183