blob: daadb6e9c1a0b7c0a7b7df71a19a9a6066f28462 [file] [log] [blame]
Justin Holewinski7be57de2014-06-27 18:35:30 +00001; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2
3
Eli Benderskyfc427382014-07-18 19:32:09 +00004; CHECK-LABEL: atom0
Justin Holewinski7be57de2014-06-27 18:35:30 +00005define i32 @atom0(i32* %addr, i32 %val) {
6; CHECK: atom.add.u32
7 %ret = atomicrmw add i32* %addr, i32 %val seq_cst
8 ret i32 %ret
9}
10
Eli Benderskyfc427382014-07-18 19:32:09 +000011; CHECK-LABEL: atom1
Justin Holewinski7be57de2014-06-27 18:35:30 +000012define i64 @atom1(i64* %addr, i64 %val) {
13; CHECK: atom.add.u64
14 %ret = atomicrmw add i64* %addr, i64 %val seq_cst
15 ret i64 %ret
16}
17
Eli Benderskyfc427382014-07-18 19:32:09 +000018; CHECK-LABEL: atom2
Justin Holewinski7be57de2014-06-27 18:35:30 +000019define i32 @atom2(i32* %subr, i32 %val) {
20; CHECK: neg.s32
21; CHECK: atom.add.u32
22 %ret = atomicrmw sub i32* %subr, i32 %val seq_cst
23 ret i32 %ret
24}
25
Eli Benderskyfc427382014-07-18 19:32:09 +000026; CHECK-LABEL: atom3
Justin Holewinski7be57de2014-06-27 18:35:30 +000027define i64 @atom3(i64* %subr, i64 %val) {
28; CHECK: neg.s64
29; CHECK: atom.add.u64
30 %ret = atomicrmw sub i64* %subr, i64 %val seq_cst
31 ret i64 %ret
32}
33
Eli Benderskyfc427382014-07-18 19:32:09 +000034; CHECK-LABEL: atom4
Justin Holewinski7be57de2014-06-27 18:35:30 +000035define i32 @atom4(i32* %subr, i32 %val) {
36; CHECK: atom.and.b32
37 %ret = atomicrmw and i32* %subr, i32 %val seq_cst
38 ret i32 %ret
39}
40
Eli Benderskyfc427382014-07-18 19:32:09 +000041; CHECK-LABEL: atom5
Justin Holewinski7be57de2014-06-27 18:35:30 +000042define i64 @atom5(i64* %subr, i64 %val) {
43; CHECK: atom.and.b64
44 %ret = atomicrmw and i64* %subr, i64 %val seq_cst
45 ret i64 %ret
46}
47
48;; NAND not yet supported
49;define i32 @atom6(i32* %subr, i32 %val) {
50; %ret = atomicrmw nand i32* %subr, i32 %val seq_cst
51; ret i32 %ret
52;}
53
54;define i64 @atom7(i64* %subr, i64 %val) {
55; %ret = atomicrmw nand i64* %subr, i64 %val seq_cst
56; ret i64 %ret
57;}
58
Eli Benderskyfc427382014-07-18 19:32:09 +000059; CHECK-LABEL: atom8
Justin Holewinski7be57de2014-06-27 18:35:30 +000060define i32 @atom8(i32* %subr, i32 %val) {
61; CHECK: atom.or.b32
62 %ret = atomicrmw or i32* %subr, i32 %val seq_cst
63 ret i32 %ret
64}
65
Eli Benderskyfc427382014-07-18 19:32:09 +000066; CHECK-LABEL: atom9
Justin Holewinski7be57de2014-06-27 18:35:30 +000067define i64 @atom9(i64* %subr, i64 %val) {
68; CHECK: atom.or.b64
69 %ret = atomicrmw or i64* %subr, i64 %val seq_cst
70 ret i64 %ret
71}
72
Eli Benderskyfc427382014-07-18 19:32:09 +000073; CHECK-LABEL: atom10
Justin Holewinski7be57de2014-06-27 18:35:30 +000074define i32 @atom10(i32* %subr, i32 %val) {
75; CHECK: atom.xor.b32
76 %ret = atomicrmw xor i32* %subr, i32 %val seq_cst
77 ret i32 %ret
78}
79
Eli Benderskyfc427382014-07-18 19:32:09 +000080; CHECK-LABEL: atom11
Justin Holewinski7be57de2014-06-27 18:35:30 +000081define i64 @atom11(i64* %subr, i64 %val) {
82; CHECK: atom.xor.b64
83 %ret = atomicrmw xor i64* %subr, i64 %val seq_cst
84 ret i64 %ret
85}
86
Eli Benderskyfc427382014-07-18 19:32:09 +000087; CHECK-LABEL: atom12
Justin Holewinski7be57de2014-06-27 18:35:30 +000088define i32 @atom12(i32* %subr, i32 %val) {
89; CHECK: atom.max.s32
90 %ret = atomicrmw max i32* %subr, i32 %val seq_cst
91 ret i32 %ret
92}
93
Eli Benderskyfc427382014-07-18 19:32:09 +000094; CHECK-LABEL: atom13
Justin Holewinski7be57de2014-06-27 18:35:30 +000095define i64 @atom13(i64* %subr, i64 %val) {
96; CHECK: atom.max.s64
97 %ret = atomicrmw max i64* %subr, i64 %val seq_cst
98 ret i64 %ret
99}
100
Eli Benderskyfc427382014-07-18 19:32:09 +0000101; CHECK-LABEL: atom14
Justin Holewinski7be57de2014-06-27 18:35:30 +0000102define i32 @atom14(i32* %subr, i32 %val) {
103; CHECK: atom.min.s32
104 %ret = atomicrmw min i32* %subr, i32 %val seq_cst
105 ret i32 %ret
106}
107
Eli Benderskyfc427382014-07-18 19:32:09 +0000108; CHECK-LABEL: atom15
Justin Holewinski7be57de2014-06-27 18:35:30 +0000109define i64 @atom15(i64* %subr, i64 %val) {
110; CHECK: atom.min.s64
111 %ret = atomicrmw min i64* %subr, i64 %val seq_cst
112 ret i64 %ret
113}
114
Eli Benderskyfc427382014-07-18 19:32:09 +0000115; CHECK-LABEL: atom16
Justin Holewinski7be57de2014-06-27 18:35:30 +0000116define i32 @atom16(i32* %subr, i32 %val) {
117; CHECK: atom.max.u32
118 %ret = atomicrmw umax i32* %subr, i32 %val seq_cst
119 ret i32 %ret
120}
121
Eli Benderskyfc427382014-07-18 19:32:09 +0000122; CHECK-LABEL: atom17
Justin Holewinski7be57de2014-06-27 18:35:30 +0000123define i64 @atom17(i64* %subr, i64 %val) {
124; CHECK: atom.max.u64
125 %ret = atomicrmw umax i64* %subr, i64 %val seq_cst
126 ret i64 %ret
127}
128
Eli Benderskyfc427382014-07-18 19:32:09 +0000129; CHECK-LABEL: atom18
Justin Holewinski7be57de2014-06-27 18:35:30 +0000130define i32 @atom18(i32* %subr, i32 %val) {
131; CHECK: atom.min.u32
132 %ret = atomicrmw umin i32* %subr, i32 %val seq_cst
133 ret i32 %ret
134}
135
Eli Benderskyfc427382014-07-18 19:32:09 +0000136; CHECK-LABEL: atom19
Justin Holewinski7be57de2014-06-27 18:35:30 +0000137define i64 @atom19(i64* %subr, i64 %val) {
138; CHECK: atom.min.u64
139 %ret = atomicrmw umin i64* %subr, i64 %val seq_cst
140 ret i64 %ret
141}
Eli Benderskyf4f1cff2014-07-18 20:11:26 +0000142
143declare float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
144
145; CHECK-LABEL: atomic_add_f32_generic
146define float @atomic_add_f32_generic(float* %addr, float %val) {
147; CHECK: atom.add.f32
148 %ret = call float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
149 ret float %ret
150}
151
152declare float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
153
154; CHECK-LABEL: atomic_add_f32_addrspace1
155define float @atomic_add_f32_addrspace1(float addrspace(1)* %addr, float %val) {
156; CHECK: atom.global.add.f32
157 %ret = call float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
158 ret float %ret
159}
160
161declare float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
162
163; CHECK-LABEL: atomic_add_f32_addrspace3
164define float @atomic_add_f32_addrspace3(float addrspace(3)* %addr, float %val) {
165; CHECK: atom.shared.add.f32
166 %ret = call float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
167 ret float %ret
168}
Eli Bendersky24d8aac2014-07-21 22:54:44 +0000169
170; CHECK-LABEL: atomic_cmpxchg_i32
171define i32 @atomic_cmpxchg_i32(i32* %addr, i32 %cmp, i32 %new) {
172; CHECK: atom.cas.b32
173 %pairold = cmpxchg i32* %addr, i32 %cmp, i32 %new seq_cst seq_cst
174 ret i32 %new
175}
176
177; CHECK-LABEL: atomic_cmpxchg_i64
178define i64 @atomic_cmpxchg_i64(i64* %addr, i64 %cmp, i64 %new) {
179; CHECK: atom.cas.b64
180 %pairold = cmpxchg i64* %addr, i64 %cmp, i64 %new seq_cst seq_cst
181 ret i64 %new
182}