Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / RISCV / forced-atomics.ll
blob35900f8a0717aa332e07bc414c99c2b17270cc4e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+no-trailing-seq-cst-fence < %s | FileCheck %s --check-prefixes=RV32,RV32-NO-ATOMIC
3 ; RUN: llc -mtriple=riscv32 < %s | FileCheck %s --check-prefixes=RV32,RV32-NO-ATOMIC
4 ; RUN: llc -mtriple=riscv32 -mattr=+forced-atomics,+no-trailing-seq-cst-fence < %s | FileCheck %s --check-prefixes=RV32,RV32-ATOMIC
5 ; RUN: llc -mtriple=riscv32 -mattr=+forced-atomics < %s | FileCheck %s --check-prefixes=RV32,RV32-ATOMIC-TRAILING
6 ; RUN: llc -mtriple=riscv64 -mattr=+no-trailing-seq-cst-fence < %s | FileCheck %s --check-prefixes=RV64,RV64-NO-ATOMIC
7 ; RUN: llc -mtriple=riscv64 < %s | FileCheck %s --check-prefixes=RV64,RV64-NO-ATOMIC
8 ; RUN: llc -mtriple=riscv64 -mattr=+forced-atomics,+no-trailing-seq-cst-fence < %s | FileCheck %s --check-prefixes=RV64,RV64-ATOMIC
9 ; RUN: llc -mtriple=riscv64 -mattr=+forced-atomics < %s | FileCheck %s --check-prefixes=RV64,RV64-ATOMIC-TRAILING
11 define i8 @load8(ptr %p) nounwind {
12 ; RV32-NO-ATOMIC-LABEL: load8:
13 ; RV32-NO-ATOMIC:       # %bb.0:
14 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
15 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
16 ; RV32-NO-ATOMIC-NEXT:    li a1, 5
17 ; RV32-NO-ATOMIC-NEXT:    call __atomic_load_1
18 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
19 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
20 ; RV32-NO-ATOMIC-NEXT:    ret
22 ; RV32-ATOMIC-LABEL: load8:
23 ; RV32-ATOMIC:       # %bb.0:
24 ; RV32-ATOMIC-NEXT:    fence rw, rw
25 ; RV32-ATOMIC-NEXT:    lb a0, 0(a0)
26 ; RV32-ATOMIC-NEXT:    fence r, rw
27 ; RV32-ATOMIC-NEXT:    ret
29 ; RV32-ATOMIC-TRAILING-LABEL: load8:
30 ; RV32-ATOMIC-TRAILING:       # %bb.0:
31 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, rw
32 ; RV32-ATOMIC-TRAILING-NEXT:    lb a0, 0(a0)
33 ; RV32-ATOMIC-TRAILING-NEXT:    fence r, rw
34 ; RV32-ATOMIC-TRAILING-NEXT:    ret
36 ; RV64-NO-ATOMIC-LABEL: load8:
37 ; RV64-NO-ATOMIC:       # %bb.0:
38 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
39 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
40 ; RV64-NO-ATOMIC-NEXT:    li a1, 5
41 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_1
42 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
43 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
44 ; RV64-NO-ATOMIC-NEXT:    ret
46 ; RV64-ATOMIC-LABEL: load8:
47 ; RV64-ATOMIC:       # %bb.0:
48 ; RV64-ATOMIC-NEXT:    fence rw, rw
49 ; RV64-ATOMIC-NEXT:    lb a0, 0(a0)
50 ; RV64-ATOMIC-NEXT:    fence r, rw
51 ; RV64-ATOMIC-NEXT:    ret
53 ; RV64-ATOMIC-TRAILING-LABEL: load8:
54 ; RV64-ATOMIC-TRAILING:       # %bb.0:
55 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
56 ; RV64-ATOMIC-TRAILING-NEXT:    lb a0, 0(a0)
57 ; RV64-ATOMIC-TRAILING-NEXT:    fence r, rw
58 ; RV64-ATOMIC-TRAILING-NEXT:    ret
59   %v = load atomic i8, ptr %p seq_cst, align 1
60   ret i8 %v
63 define void @store8(ptr %p) nounwind {
64 ; RV32-NO-ATOMIC-LABEL: store8:
65 ; RV32-NO-ATOMIC:       # %bb.0:
66 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
67 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
68 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
69 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
70 ; RV32-NO-ATOMIC-NEXT:    call __atomic_store_1
71 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
72 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
73 ; RV32-NO-ATOMIC-NEXT:    ret
75 ; RV32-ATOMIC-LABEL: store8:
76 ; RV32-ATOMIC:       # %bb.0:
77 ; RV32-ATOMIC-NEXT:    fence rw, w
78 ; RV32-ATOMIC-NEXT:    sb zero, 0(a0)
79 ; RV32-ATOMIC-NEXT:    ret
81 ; RV32-ATOMIC-TRAILING-LABEL: store8:
82 ; RV32-ATOMIC-TRAILING:       # %bb.0:
83 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, w
84 ; RV32-ATOMIC-TRAILING-NEXT:    sb zero, 0(a0)
85 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, rw
86 ; RV32-ATOMIC-TRAILING-NEXT:    ret
88 ; RV64-NO-ATOMIC-LABEL: store8:
89 ; RV64-NO-ATOMIC:       # %bb.0:
90 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
91 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
92 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
93 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
94 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_1
95 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
96 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
97 ; RV64-NO-ATOMIC-NEXT:    ret
99 ; RV64-ATOMIC-LABEL: store8:
100 ; RV64-ATOMIC:       # %bb.0:
101 ; RV64-ATOMIC-NEXT:    fence rw, w
102 ; RV64-ATOMIC-NEXT:    sb zero, 0(a0)
103 ; RV64-ATOMIC-NEXT:    ret
105 ; RV64-ATOMIC-TRAILING-LABEL: store8:
106 ; RV64-ATOMIC-TRAILING:       # %bb.0:
107 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, w
108 ; RV64-ATOMIC-TRAILING-NEXT:    sb zero, 0(a0)
109 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
110 ; RV64-ATOMIC-TRAILING-NEXT:    ret
111   store atomic i8 0, ptr %p seq_cst, align 1
112   ret void
115 define i8 @rmw8(ptr %p) nounwind {
116 ; RV32-NO-ATOMIC-LABEL: rmw8:
117 ; RV32-NO-ATOMIC:       # %bb.0:
118 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
119 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
120 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
121 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
122 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_add_1
123 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
124 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
125 ; RV32-NO-ATOMIC-NEXT:    ret
127 ; RV32-ATOMIC-LABEL: rmw8:
128 ; RV32-ATOMIC:       # %bb.0:
129 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
130 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
131 ; RV32-ATOMIC-NEXT:    li a1, 1
132 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_add_1
133 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
134 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
135 ; RV32-ATOMIC-NEXT:    ret
137 ; RV32-ATOMIC-TRAILING-LABEL: rmw8:
138 ; RV32-ATOMIC-TRAILING:       # %bb.0:
139 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
140 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
141 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
142 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_1
143 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
144 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
145 ; RV32-ATOMIC-TRAILING-NEXT:    ret
147 ; RV64-NO-ATOMIC-LABEL: rmw8:
148 ; RV64-NO-ATOMIC:       # %bb.0:
149 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
150 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
151 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
152 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
153 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_add_1
154 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
155 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
156 ; RV64-NO-ATOMIC-NEXT:    ret
158 ; RV64-ATOMIC-LABEL: rmw8:
159 ; RV64-ATOMIC:       # %bb.0:
160 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
161 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
162 ; RV64-ATOMIC-NEXT:    li a1, 1
163 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_add_1
164 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
165 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
166 ; RV64-ATOMIC-NEXT:    ret
168 ; RV64-ATOMIC-TRAILING-LABEL: rmw8:
169 ; RV64-ATOMIC-TRAILING:       # %bb.0:
170 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
171 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
172 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
173 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_1
174 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
175 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
176 ; RV64-ATOMIC-TRAILING-NEXT:    ret
177   %v = atomicrmw add ptr %p, i8 1 seq_cst, align 1
178   ret i8 %v
181 define i8 @cmpxchg8(ptr %p) nounwind {
182 ; RV32-NO-ATOMIC-LABEL: cmpxchg8:
183 ; RV32-NO-ATOMIC:       # %bb.0:
184 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
185 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
186 ; RV32-NO-ATOMIC-NEXT:    sb zero, 11(sp)
187 ; RV32-NO-ATOMIC-NEXT:    addi a1, sp, 11
188 ; RV32-NO-ATOMIC-NEXT:    li a2, 1
189 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
190 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
191 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_1
192 ; RV32-NO-ATOMIC-NEXT:    lbu a0, 11(sp)
193 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
194 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
195 ; RV32-NO-ATOMIC-NEXT:    ret
197 ; RV32-ATOMIC-LABEL: cmpxchg8:
198 ; RV32-ATOMIC:       # %bb.0:
199 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
200 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
201 ; RV32-ATOMIC-NEXT:    li a2, 1
202 ; RV32-ATOMIC-NEXT:    li a1, 0
203 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_1
204 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
205 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
206 ; RV32-ATOMIC-NEXT:    ret
208 ; RV32-ATOMIC-TRAILING-LABEL: cmpxchg8:
209 ; RV32-ATOMIC-TRAILING:       # %bb.0:
210 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
211 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
212 ; RV32-ATOMIC-TRAILING-NEXT:    li a2, 1
213 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 0
214 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_1
215 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
216 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
217 ; RV32-ATOMIC-TRAILING-NEXT:    ret
219 ; RV64-NO-ATOMIC-LABEL: cmpxchg8:
220 ; RV64-NO-ATOMIC:       # %bb.0:
221 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
222 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
223 ; RV64-NO-ATOMIC-NEXT:    sb zero, 7(sp)
224 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 7
225 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
226 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
227 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
228 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_1
229 ; RV64-NO-ATOMIC-NEXT:    lbu a0, 7(sp)
230 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
231 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
232 ; RV64-NO-ATOMIC-NEXT:    ret
234 ; RV64-ATOMIC-LABEL: cmpxchg8:
235 ; RV64-ATOMIC:       # %bb.0:
236 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
237 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
238 ; RV64-ATOMIC-NEXT:    li a2, 1
239 ; RV64-ATOMIC-NEXT:    li a1, 0
240 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_1
241 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
242 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
243 ; RV64-ATOMIC-NEXT:    ret
245 ; RV64-ATOMIC-TRAILING-LABEL: cmpxchg8:
246 ; RV64-ATOMIC-TRAILING:       # %bb.0:
247 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
248 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
249 ; RV64-ATOMIC-TRAILING-NEXT:    li a2, 1
250 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 0
251 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_1
252 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
253 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
254 ; RV64-ATOMIC-TRAILING-NEXT:    ret
255   %res = cmpxchg ptr %p, i8 0, i8 1 seq_cst seq_cst
256   %res.0 = extractvalue { i8, i1 } %res, 0
257   ret i8 %res.0
260 define i16 @load16(ptr %p) nounwind {
261 ; RV32-NO-ATOMIC-LABEL: load16:
262 ; RV32-NO-ATOMIC:       # %bb.0:
263 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
264 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
265 ; RV32-NO-ATOMIC-NEXT:    li a1, 5
266 ; RV32-NO-ATOMIC-NEXT:    call __atomic_load_2
267 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
268 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
269 ; RV32-NO-ATOMIC-NEXT:    ret
271 ; RV32-ATOMIC-LABEL: load16:
272 ; RV32-ATOMIC:       # %bb.0:
273 ; RV32-ATOMIC-NEXT:    fence rw, rw
274 ; RV32-ATOMIC-NEXT:    lh a0, 0(a0)
275 ; RV32-ATOMIC-NEXT:    fence r, rw
276 ; RV32-ATOMIC-NEXT:    ret
278 ; RV32-ATOMIC-TRAILING-LABEL: load16:
279 ; RV32-ATOMIC-TRAILING:       # %bb.0:
280 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, rw
281 ; RV32-ATOMIC-TRAILING-NEXT:    lh a0, 0(a0)
282 ; RV32-ATOMIC-TRAILING-NEXT:    fence r, rw
283 ; RV32-ATOMIC-TRAILING-NEXT:    ret
285 ; RV64-NO-ATOMIC-LABEL: load16:
286 ; RV64-NO-ATOMIC:       # %bb.0:
287 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
288 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
289 ; RV64-NO-ATOMIC-NEXT:    li a1, 5
290 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_2
291 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
292 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
293 ; RV64-NO-ATOMIC-NEXT:    ret
295 ; RV64-ATOMIC-LABEL: load16:
296 ; RV64-ATOMIC:       # %bb.0:
297 ; RV64-ATOMIC-NEXT:    fence rw, rw
298 ; RV64-ATOMIC-NEXT:    lh a0, 0(a0)
299 ; RV64-ATOMIC-NEXT:    fence r, rw
300 ; RV64-ATOMIC-NEXT:    ret
302 ; RV64-ATOMIC-TRAILING-LABEL: load16:
303 ; RV64-ATOMIC-TRAILING:       # %bb.0:
304 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
305 ; RV64-ATOMIC-TRAILING-NEXT:    lh a0, 0(a0)
306 ; RV64-ATOMIC-TRAILING-NEXT:    fence r, rw
307 ; RV64-ATOMIC-TRAILING-NEXT:    ret
308   %v = load atomic i16, ptr %p seq_cst, align 2
309   ret i16 %v
312 define void @store16(ptr %p) nounwind {
313 ; RV32-NO-ATOMIC-LABEL: store16:
314 ; RV32-NO-ATOMIC:       # %bb.0:
315 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
316 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
317 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
318 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
319 ; RV32-NO-ATOMIC-NEXT:    call __atomic_store_2
320 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
321 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
322 ; RV32-NO-ATOMIC-NEXT:    ret
324 ; RV32-ATOMIC-LABEL: store16:
325 ; RV32-ATOMIC:       # %bb.0:
326 ; RV32-ATOMIC-NEXT:    fence rw, w
327 ; RV32-ATOMIC-NEXT:    sh zero, 0(a0)
328 ; RV32-ATOMIC-NEXT:    ret
330 ; RV32-ATOMIC-TRAILING-LABEL: store16:
331 ; RV32-ATOMIC-TRAILING:       # %bb.0:
332 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, w
333 ; RV32-ATOMIC-TRAILING-NEXT:    sh zero, 0(a0)
334 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, rw
335 ; RV32-ATOMIC-TRAILING-NEXT:    ret
337 ; RV64-NO-ATOMIC-LABEL: store16:
338 ; RV64-NO-ATOMIC:       # %bb.0:
339 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
340 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
341 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
342 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
343 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_2
344 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
345 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
346 ; RV64-NO-ATOMIC-NEXT:    ret
348 ; RV64-ATOMIC-LABEL: store16:
349 ; RV64-ATOMIC:       # %bb.0:
350 ; RV64-ATOMIC-NEXT:    fence rw, w
351 ; RV64-ATOMIC-NEXT:    sh zero, 0(a0)
352 ; RV64-ATOMIC-NEXT:    ret
354 ; RV64-ATOMIC-TRAILING-LABEL: store16:
355 ; RV64-ATOMIC-TRAILING:       # %bb.0:
356 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, w
357 ; RV64-ATOMIC-TRAILING-NEXT:    sh zero, 0(a0)
358 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
359 ; RV64-ATOMIC-TRAILING-NEXT:    ret
360   store atomic i16 0, ptr %p seq_cst, align 2
361   ret void
364 define i16 @rmw16(ptr %p) nounwind {
365 ; RV32-NO-ATOMIC-LABEL: rmw16:
366 ; RV32-NO-ATOMIC:       # %bb.0:
367 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
368 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
369 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
370 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
371 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_add_2
372 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
373 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
374 ; RV32-NO-ATOMIC-NEXT:    ret
376 ; RV32-ATOMIC-LABEL: rmw16:
377 ; RV32-ATOMIC:       # %bb.0:
378 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
379 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
380 ; RV32-ATOMIC-NEXT:    li a1, 1
381 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_add_2
382 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
383 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
384 ; RV32-ATOMIC-NEXT:    ret
386 ; RV32-ATOMIC-TRAILING-LABEL: rmw16:
387 ; RV32-ATOMIC-TRAILING:       # %bb.0:
388 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
389 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
390 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
391 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_2
392 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
393 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
394 ; RV32-ATOMIC-TRAILING-NEXT:    ret
396 ; RV64-NO-ATOMIC-LABEL: rmw16:
397 ; RV64-NO-ATOMIC:       # %bb.0:
398 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
399 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
400 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
401 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
402 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_add_2
403 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
404 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
405 ; RV64-NO-ATOMIC-NEXT:    ret
407 ; RV64-ATOMIC-LABEL: rmw16:
408 ; RV64-ATOMIC:       # %bb.0:
409 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
410 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
411 ; RV64-ATOMIC-NEXT:    li a1, 1
412 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_add_2
413 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
414 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
415 ; RV64-ATOMIC-NEXT:    ret
417 ; RV64-ATOMIC-TRAILING-LABEL: rmw16:
418 ; RV64-ATOMIC-TRAILING:       # %bb.0:
419 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
420 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
421 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
422 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_2
423 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
424 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
425 ; RV64-ATOMIC-TRAILING-NEXT:    ret
426   %v = atomicrmw add ptr %p, i16 1 seq_cst, align 2
427   ret i16 %v
430 define i16 @cmpxchg16(ptr %p) nounwind {
431 ; RV32-NO-ATOMIC-LABEL: cmpxchg16:
432 ; RV32-NO-ATOMIC:       # %bb.0:
433 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
434 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
435 ; RV32-NO-ATOMIC-NEXT:    sh zero, 10(sp)
436 ; RV32-NO-ATOMIC-NEXT:    addi a1, sp, 10
437 ; RV32-NO-ATOMIC-NEXT:    li a2, 1
438 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
439 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
440 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_2
441 ; RV32-NO-ATOMIC-NEXT:    lh a0, 10(sp)
442 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
443 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
444 ; RV32-NO-ATOMIC-NEXT:    ret
446 ; RV32-ATOMIC-LABEL: cmpxchg16:
447 ; RV32-ATOMIC:       # %bb.0:
448 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
449 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
450 ; RV32-ATOMIC-NEXT:    li a2, 1
451 ; RV32-ATOMIC-NEXT:    li a1, 0
452 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_2
453 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
454 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
455 ; RV32-ATOMIC-NEXT:    ret
457 ; RV32-ATOMIC-TRAILING-LABEL: cmpxchg16:
458 ; RV32-ATOMIC-TRAILING:       # %bb.0:
459 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
460 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
461 ; RV32-ATOMIC-TRAILING-NEXT:    li a2, 1
462 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 0
463 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_2
464 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
465 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
466 ; RV32-ATOMIC-TRAILING-NEXT:    ret
468 ; RV64-NO-ATOMIC-LABEL: cmpxchg16:
469 ; RV64-NO-ATOMIC:       # %bb.0:
470 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
471 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
472 ; RV64-NO-ATOMIC-NEXT:    sh zero, 6(sp)
473 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 6
474 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
475 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
476 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
477 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_2
478 ; RV64-NO-ATOMIC-NEXT:    lh a0, 6(sp)
479 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
480 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
481 ; RV64-NO-ATOMIC-NEXT:    ret
483 ; RV64-ATOMIC-LABEL: cmpxchg16:
484 ; RV64-ATOMIC:       # %bb.0:
485 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
486 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
487 ; RV64-ATOMIC-NEXT:    li a2, 1
488 ; RV64-ATOMIC-NEXT:    li a1, 0
489 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_2
490 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
491 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
492 ; RV64-ATOMIC-NEXT:    ret
494 ; RV64-ATOMIC-TRAILING-LABEL: cmpxchg16:
495 ; RV64-ATOMIC-TRAILING:       # %bb.0:
496 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
497 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
498 ; RV64-ATOMIC-TRAILING-NEXT:    li a2, 1
499 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 0
500 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_2
501 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
502 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
503 ; RV64-ATOMIC-TRAILING-NEXT:    ret
504   %res = cmpxchg ptr %p, i16 0, i16 1 seq_cst seq_cst
505   %res.0 = extractvalue { i16, i1 } %res, 0
506   ret i16 %res.0
509 define i32 @load32_unordered(ptr %p) nounwind {
510 ; RV32-NO-ATOMIC-LABEL: load32_unordered:
511 ; RV32-NO-ATOMIC:       # %bb.0:
512 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
513 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
514 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
515 ; RV32-NO-ATOMIC-NEXT:    call __atomic_load_4
516 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
517 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
518 ; RV32-NO-ATOMIC-NEXT:    ret
520 ; RV32-ATOMIC-LABEL: load32_unordered:
521 ; RV32-ATOMIC:       # %bb.0:
522 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
523 ; RV32-ATOMIC-NEXT:    ret
525 ; RV32-ATOMIC-TRAILING-LABEL: load32_unordered:
526 ; RV32-ATOMIC-TRAILING:       # %bb.0:
527 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
528 ; RV32-ATOMIC-TRAILING-NEXT:    ret
530 ; RV64-NO-ATOMIC-LABEL: load32_unordered:
531 ; RV64-NO-ATOMIC:       # %bb.0:
532 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
533 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
534 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
535 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_4
536 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
537 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
538 ; RV64-NO-ATOMIC-NEXT:    ret
540 ; RV64-ATOMIC-LABEL: load32_unordered:
541 ; RV64-ATOMIC:       # %bb.0:
542 ; RV64-ATOMIC-NEXT:    lw a0, 0(a0)
543 ; RV64-ATOMIC-NEXT:    ret
545 ; RV64-ATOMIC-TRAILING-LABEL: load32_unordered:
546 ; RV64-ATOMIC-TRAILING:       # %bb.0:
547 ; RV64-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
548 ; RV64-ATOMIC-TRAILING-NEXT:    ret
549   %v = load atomic i32, ptr %p unordered, align 4
550   ret i32 %v
553 define i32 @load32_monotonic(ptr %p) nounwind {
554 ; RV32-NO-ATOMIC-LABEL: load32_monotonic:
555 ; RV32-NO-ATOMIC:       # %bb.0:
556 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
557 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
558 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
559 ; RV32-NO-ATOMIC-NEXT:    call __atomic_load_4
560 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
561 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
562 ; RV32-NO-ATOMIC-NEXT:    ret
564 ; RV32-ATOMIC-LABEL: load32_monotonic:
565 ; RV32-ATOMIC:       # %bb.0:
566 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
567 ; RV32-ATOMIC-NEXT:    ret
569 ; RV32-ATOMIC-TRAILING-LABEL: load32_monotonic:
570 ; RV32-ATOMIC-TRAILING:       # %bb.0:
571 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
572 ; RV32-ATOMIC-TRAILING-NEXT:    ret
574 ; RV64-NO-ATOMIC-LABEL: load32_monotonic:
575 ; RV64-NO-ATOMIC:       # %bb.0:
576 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
577 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
578 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
579 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_4
580 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
581 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
582 ; RV64-NO-ATOMIC-NEXT:    ret
584 ; RV64-ATOMIC-LABEL: load32_monotonic:
585 ; RV64-ATOMIC:       # %bb.0:
586 ; RV64-ATOMIC-NEXT:    lw a0, 0(a0)
587 ; RV64-ATOMIC-NEXT:    ret
589 ; RV64-ATOMIC-TRAILING-LABEL: load32_monotonic:
590 ; RV64-ATOMIC-TRAILING:       # %bb.0:
591 ; RV64-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
592 ; RV64-ATOMIC-TRAILING-NEXT:    ret
593   %v = load atomic i32, ptr %p monotonic, align 4
594   ret i32 %v
597 define i32 @load32_acquire(ptr %p) nounwind {
598 ; RV32-NO-ATOMIC-LABEL: load32_acquire:
599 ; RV32-NO-ATOMIC:       # %bb.0:
600 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
601 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
602 ; RV32-NO-ATOMIC-NEXT:    li a1, 2
603 ; RV32-NO-ATOMIC-NEXT:    call __atomic_load_4
604 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
605 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
606 ; RV32-NO-ATOMIC-NEXT:    ret
608 ; RV32-ATOMIC-LABEL: load32_acquire:
609 ; RV32-ATOMIC:       # %bb.0:
610 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
611 ; RV32-ATOMIC-NEXT:    fence r, rw
612 ; RV32-ATOMIC-NEXT:    ret
614 ; RV32-ATOMIC-TRAILING-LABEL: load32_acquire:
615 ; RV32-ATOMIC-TRAILING:       # %bb.0:
616 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
617 ; RV32-ATOMIC-TRAILING-NEXT:    fence r, rw
618 ; RV32-ATOMIC-TRAILING-NEXT:    ret
620 ; RV64-NO-ATOMIC-LABEL: load32_acquire:
621 ; RV64-NO-ATOMIC:       # %bb.0:
622 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
623 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
624 ; RV64-NO-ATOMIC-NEXT:    li a1, 2
625 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_4
626 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
627 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
628 ; RV64-NO-ATOMIC-NEXT:    ret
630 ; RV64-ATOMIC-LABEL: load32_acquire:
631 ; RV64-ATOMIC:       # %bb.0:
632 ; RV64-ATOMIC-NEXT:    lw a0, 0(a0)
633 ; RV64-ATOMIC-NEXT:    fence r, rw
634 ; RV64-ATOMIC-NEXT:    ret
636 ; RV64-ATOMIC-TRAILING-LABEL: load32_acquire:
637 ; RV64-ATOMIC-TRAILING:       # %bb.0:
638 ; RV64-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
639 ; RV64-ATOMIC-TRAILING-NEXT:    fence r, rw
640 ; RV64-ATOMIC-TRAILING-NEXT:    ret
641   %v = load atomic i32, ptr %p acquire, align 4
642   ret i32 %v
645 define i32 @load32_seq_cst(ptr %p) nounwind {
646 ; RV32-NO-ATOMIC-LABEL: load32_seq_cst:
647 ; RV32-NO-ATOMIC:       # %bb.0:
648 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
649 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
650 ; RV32-NO-ATOMIC-NEXT:    li a1, 5
651 ; RV32-NO-ATOMIC-NEXT:    call __atomic_load_4
652 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
653 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
654 ; RV32-NO-ATOMIC-NEXT:    ret
656 ; RV32-ATOMIC-LABEL: load32_seq_cst:
657 ; RV32-ATOMIC:       # %bb.0:
658 ; RV32-ATOMIC-NEXT:    fence rw, rw
659 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
660 ; RV32-ATOMIC-NEXT:    fence r, rw
661 ; RV32-ATOMIC-NEXT:    ret
663 ; RV32-ATOMIC-TRAILING-LABEL: load32_seq_cst:
664 ; RV32-ATOMIC-TRAILING:       # %bb.0:
665 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, rw
666 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
667 ; RV32-ATOMIC-TRAILING-NEXT:    fence r, rw
668 ; RV32-ATOMIC-TRAILING-NEXT:    ret
670 ; RV64-NO-ATOMIC-LABEL: load32_seq_cst:
671 ; RV64-NO-ATOMIC:       # %bb.0:
672 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
673 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
674 ; RV64-NO-ATOMIC-NEXT:    li a1, 5
675 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_4
676 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
677 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
678 ; RV64-NO-ATOMIC-NEXT:    ret
680 ; RV64-ATOMIC-LABEL: load32_seq_cst:
681 ; RV64-ATOMIC:       # %bb.0:
682 ; RV64-ATOMIC-NEXT:    fence rw, rw
683 ; RV64-ATOMIC-NEXT:    lw a0, 0(a0)
684 ; RV64-ATOMIC-NEXT:    fence r, rw
685 ; RV64-ATOMIC-NEXT:    ret
687 ; RV64-ATOMIC-TRAILING-LABEL: load32_seq_cst:
688 ; RV64-ATOMIC-TRAILING:       # %bb.0:
689 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
690 ; RV64-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
691 ; RV64-ATOMIC-TRAILING-NEXT:    fence r, rw
692 ; RV64-ATOMIC-TRAILING-NEXT:    ret
693   %v = load atomic i32, ptr %p seq_cst, align 4
694   ret i32 %v
697 define void @store32_unordered(ptr %p) nounwind {
698 ; RV32-NO-ATOMIC-LABEL: store32_unordered:
699 ; RV32-NO-ATOMIC:       # %bb.0:
700 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
701 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
702 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
703 ; RV32-NO-ATOMIC-NEXT:    li a2, 0
704 ; RV32-NO-ATOMIC-NEXT:    call __atomic_store_4
705 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
706 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
707 ; RV32-NO-ATOMIC-NEXT:    ret
709 ; RV32-ATOMIC-LABEL: store32_unordered:
710 ; RV32-ATOMIC:       # %bb.0:
711 ; RV32-ATOMIC-NEXT:    sw zero, 0(a0)
712 ; RV32-ATOMIC-NEXT:    ret
714 ; RV32-ATOMIC-TRAILING-LABEL: store32_unordered:
715 ; RV32-ATOMIC-TRAILING:       # %bb.0:
716 ; RV32-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
717 ; RV32-ATOMIC-TRAILING-NEXT:    ret
719 ; RV64-NO-ATOMIC-LABEL: store32_unordered:
720 ; RV64-NO-ATOMIC:       # %bb.0:
721 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
722 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
723 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
724 ; RV64-NO-ATOMIC-NEXT:    li a2, 0
725 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_4
726 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
727 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
728 ; RV64-NO-ATOMIC-NEXT:    ret
730 ; RV64-ATOMIC-LABEL: store32_unordered:
731 ; RV64-ATOMIC:       # %bb.0:
732 ; RV64-ATOMIC-NEXT:    sw zero, 0(a0)
733 ; RV64-ATOMIC-NEXT:    ret
735 ; RV64-ATOMIC-TRAILING-LABEL: store32_unordered:
736 ; RV64-ATOMIC-TRAILING:       # %bb.0:
737 ; RV64-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
738 ; RV64-ATOMIC-TRAILING-NEXT:    ret
739   store atomic i32 0, ptr %p unordered, align 4
740   ret void
743 define void @store32_monotonic(ptr %p) nounwind {
744 ; RV32-NO-ATOMIC-LABEL: store32_monotonic:
745 ; RV32-NO-ATOMIC:       # %bb.0:
746 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
747 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
748 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
749 ; RV32-NO-ATOMIC-NEXT:    li a2, 0
750 ; RV32-NO-ATOMIC-NEXT:    call __atomic_store_4
751 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
752 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
753 ; RV32-NO-ATOMIC-NEXT:    ret
755 ; RV32-ATOMIC-LABEL: store32_monotonic:
756 ; RV32-ATOMIC:       # %bb.0:
757 ; RV32-ATOMIC-NEXT:    sw zero, 0(a0)
758 ; RV32-ATOMIC-NEXT:    ret
760 ; RV32-ATOMIC-TRAILING-LABEL: store32_monotonic:
761 ; RV32-ATOMIC-TRAILING:       # %bb.0:
762 ; RV32-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
763 ; RV32-ATOMIC-TRAILING-NEXT:    ret
765 ; RV64-NO-ATOMIC-LABEL: store32_monotonic:
766 ; RV64-NO-ATOMIC:       # %bb.0:
767 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
768 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
769 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
770 ; RV64-NO-ATOMIC-NEXT:    li a2, 0
771 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_4
772 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
773 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
774 ; RV64-NO-ATOMIC-NEXT:    ret
776 ; RV64-ATOMIC-LABEL: store32_monotonic:
777 ; RV64-ATOMIC:       # %bb.0:
778 ; RV64-ATOMIC-NEXT:    sw zero, 0(a0)
779 ; RV64-ATOMIC-NEXT:    ret
781 ; RV64-ATOMIC-TRAILING-LABEL: store32_monotonic:
782 ; RV64-ATOMIC-TRAILING:       # %bb.0:
783 ; RV64-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
784 ; RV64-ATOMIC-TRAILING-NEXT:    ret
785   store atomic i32 0, ptr %p monotonic, align 4
786   ret void
789 define void @store32_release(ptr %p) nounwind {
790 ; RV32-NO-ATOMIC-LABEL: store32_release:
791 ; RV32-NO-ATOMIC:       # %bb.0:
792 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
793 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
794 ; RV32-NO-ATOMIC-NEXT:    li a2, 3
795 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
796 ; RV32-NO-ATOMIC-NEXT:    call __atomic_store_4
797 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
798 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
799 ; RV32-NO-ATOMIC-NEXT:    ret
801 ; RV32-ATOMIC-LABEL: store32_release:
802 ; RV32-ATOMIC:       # %bb.0:
803 ; RV32-ATOMIC-NEXT:    fence rw, w
804 ; RV32-ATOMIC-NEXT:    sw zero, 0(a0)
805 ; RV32-ATOMIC-NEXT:    ret
807 ; RV32-ATOMIC-TRAILING-LABEL: store32_release:
808 ; RV32-ATOMIC-TRAILING:       # %bb.0:
809 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, w
810 ; RV32-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
811 ; RV32-ATOMIC-TRAILING-NEXT:    ret
813 ; RV64-NO-ATOMIC-LABEL: store32_release:
814 ; RV64-NO-ATOMIC:       # %bb.0:
815 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
816 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
817 ; RV64-NO-ATOMIC-NEXT:    li a2, 3
818 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
819 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_4
820 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
821 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
822 ; RV64-NO-ATOMIC-NEXT:    ret
824 ; RV64-ATOMIC-LABEL: store32_release:
825 ; RV64-ATOMIC:       # %bb.0:
826 ; RV64-ATOMIC-NEXT:    fence rw, w
827 ; RV64-ATOMIC-NEXT:    sw zero, 0(a0)
828 ; RV64-ATOMIC-NEXT:    ret
830 ; RV64-ATOMIC-TRAILING-LABEL: store32_release:
831 ; RV64-ATOMIC-TRAILING:       # %bb.0:
832 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, w
833 ; RV64-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
834 ; RV64-ATOMIC-TRAILING-NEXT:    ret
835   store atomic i32 0, ptr %p release, align 4
836   ret void
839 define void @store32_seq_cst(ptr %p) nounwind {
840 ; RV32-NO-ATOMIC-LABEL: store32_seq_cst:
841 ; RV32-NO-ATOMIC:       # %bb.0:
842 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
843 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
844 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
845 ; RV32-NO-ATOMIC-NEXT:    li a1, 0
846 ; RV32-NO-ATOMIC-NEXT:    call __atomic_store_4
847 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
848 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
849 ; RV32-NO-ATOMIC-NEXT:    ret
851 ; RV32-ATOMIC-LABEL: store32_seq_cst:
852 ; RV32-ATOMIC:       # %bb.0:
853 ; RV32-ATOMIC-NEXT:    fence rw, w
854 ; RV32-ATOMIC-NEXT:    sw zero, 0(a0)
855 ; RV32-ATOMIC-NEXT:    ret
857 ; RV32-ATOMIC-TRAILING-LABEL: store32_seq_cst:
858 ; RV32-ATOMIC-TRAILING:       # %bb.0:
859 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, w
860 ; RV32-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
861 ; RV32-ATOMIC-TRAILING-NEXT:    fence rw, rw
862 ; RV32-ATOMIC-TRAILING-NEXT:    ret
864 ; RV64-NO-ATOMIC-LABEL: store32_seq_cst:
865 ; RV64-NO-ATOMIC:       # %bb.0:
866 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
867 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
868 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
869 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
870 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_4
871 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
872 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
873 ; RV64-NO-ATOMIC-NEXT:    ret
875 ; RV64-ATOMIC-LABEL: store32_seq_cst:
876 ; RV64-ATOMIC:       # %bb.0:
877 ; RV64-ATOMIC-NEXT:    fence rw, w
878 ; RV64-ATOMIC-NEXT:    sw zero, 0(a0)
879 ; RV64-ATOMIC-NEXT:    ret
881 ; RV64-ATOMIC-TRAILING-LABEL: store32_seq_cst:
882 ; RV64-ATOMIC-TRAILING:       # %bb.0:
883 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, w
884 ; RV64-ATOMIC-TRAILING-NEXT:    sw zero, 0(a0)
885 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
886 ; RV64-ATOMIC-TRAILING-NEXT:    ret
887   store atomic i32 0, ptr %p seq_cst, align 4
888   ret void
891 define i32 @rmw32_add_monotonic(ptr %p) nounwind {
892 ; RV32-NO-ATOMIC-LABEL: rmw32_add_monotonic:
893 ; RV32-NO-ATOMIC:       # %bb.0:
894 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
895 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
896 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
897 ; RV32-NO-ATOMIC-NEXT:    li a2, 0
898 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_add_4
899 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
900 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
901 ; RV32-NO-ATOMIC-NEXT:    ret
903 ; RV32-ATOMIC-LABEL: rmw32_add_monotonic:
904 ; RV32-ATOMIC:       # %bb.0:
905 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
906 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
907 ; RV32-ATOMIC-NEXT:    li a1, 1
908 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_add_4
909 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
910 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
911 ; RV32-ATOMIC-NEXT:    ret
913 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_add_monotonic:
914 ; RV32-ATOMIC-TRAILING:       # %bb.0:
915 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
916 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
917 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
918 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_4
919 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
920 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
921 ; RV32-ATOMIC-TRAILING-NEXT:    ret
923 ; RV64-NO-ATOMIC-LABEL: rmw32_add_monotonic:
924 ; RV64-NO-ATOMIC:       # %bb.0:
925 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
926 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
927 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
928 ; RV64-NO-ATOMIC-NEXT:    li a2, 0
929 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_add_4
930 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
931 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
932 ; RV64-NO-ATOMIC-NEXT:    ret
934 ; RV64-ATOMIC-LABEL: rmw32_add_monotonic:
935 ; RV64-ATOMIC:       # %bb.0:
936 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
937 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
938 ; RV64-ATOMIC-NEXT:    li a1, 1
939 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_add_4
940 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
941 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
942 ; RV64-ATOMIC-NEXT:    ret
944 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_add_monotonic:
945 ; RV64-ATOMIC-TRAILING:       # %bb.0:
946 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
947 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
948 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
949 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_4
950 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
951 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
952 ; RV64-ATOMIC-TRAILING-NEXT:    ret
953   %v = atomicrmw add ptr %p, i32 1 monotonic, align 4
954   ret i32 %v
957 define i32 @rmw32_add_seq_cst(ptr %p) nounwind {
958 ; RV32-NO-ATOMIC-LABEL: rmw32_add_seq_cst:
959 ; RV32-NO-ATOMIC:       # %bb.0:
960 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
961 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
962 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
963 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
964 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_add_4
965 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
966 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
967 ; RV32-NO-ATOMIC-NEXT:    ret
969 ; RV32-ATOMIC-LABEL: rmw32_add_seq_cst:
970 ; RV32-ATOMIC:       # %bb.0:
971 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
972 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
973 ; RV32-ATOMIC-NEXT:    li a1, 1
974 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_add_4
975 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
976 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
977 ; RV32-ATOMIC-NEXT:    ret
979 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_add_seq_cst:
980 ; RV32-ATOMIC-TRAILING:       # %bb.0:
981 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
982 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
983 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
984 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_4
985 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
986 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
987 ; RV32-ATOMIC-TRAILING-NEXT:    ret
989 ; RV64-NO-ATOMIC-LABEL: rmw32_add_seq_cst:
990 ; RV64-NO-ATOMIC:       # %bb.0:
991 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
992 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
993 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
994 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
995 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_add_4
996 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
997 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
998 ; RV64-NO-ATOMIC-NEXT:    ret
1000 ; RV64-ATOMIC-LABEL: rmw32_add_seq_cst:
1001 ; RV64-ATOMIC:       # %bb.0:
1002 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1003 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1004 ; RV64-ATOMIC-NEXT:    li a1, 1
1005 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_add_4
1006 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1007 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1008 ; RV64-ATOMIC-NEXT:    ret
1010 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_add_seq_cst:
1011 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1012 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1013 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1014 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1015 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_4
1016 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1017 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1018 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1019   %v = atomicrmw add ptr %p, i32 1 seq_cst, align 4
1020   ret i32 %v
1023 define i32 @rmw32_sub_seq_cst(ptr %p) nounwind {
1024 ; RV32-NO-ATOMIC-LABEL: rmw32_sub_seq_cst:
1025 ; RV32-NO-ATOMIC:       # %bb.0:
1026 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1027 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1028 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
1029 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
1030 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_sub_4
1031 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1032 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1033 ; RV32-NO-ATOMIC-NEXT:    ret
1035 ; RV32-ATOMIC-LABEL: rmw32_sub_seq_cst:
1036 ; RV32-ATOMIC:       # %bb.0:
1037 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1038 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1039 ; RV32-ATOMIC-NEXT:    li a1, 1
1040 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_sub_4
1041 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1042 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1043 ; RV32-ATOMIC-NEXT:    ret
1045 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_sub_seq_cst:
1046 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1047 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1048 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1049 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1050 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_sub_4
1051 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1052 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1053 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1055 ; RV64-NO-ATOMIC-LABEL: rmw32_sub_seq_cst:
1056 ; RV64-NO-ATOMIC:       # %bb.0:
1057 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
1058 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1059 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
1060 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
1061 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_sub_4
1062 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1063 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
1064 ; RV64-NO-ATOMIC-NEXT:    ret
1066 ; RV64-ATOMIC-LABEL: rmw32_sub_seq_cst:
1067 ; RV64-ATOMIC:       # %bb.0:
1068 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1069 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1070 ; RV64-ATOMIC-NEXT:    li a1, 1
1071 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_sub_4
1072 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1073 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1074 ; RV64-ATOMIC-NEXT:    ret
1076 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_sub_seq_cst:
1077 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1078 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1079 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1080 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1081 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_sub_4
1082 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1083 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1084 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1085   %v = atomicrmw sub ptr %p, i32 1 seq_cst, align 4
1086   ret i32 %v
1089 define i32 @rmw32_and_seq_cst(ptr %p) nounwind {
1090 ; RV32-NO-ATOMIC-LABEL: rmw32_and_seq_cst:
1091 ; RV32-NO-ATOMIC:       # %bb.0:
1092 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1093 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1094 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
1095 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
1096 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_and_4
1097 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1098 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1099 ; RV32-NO-ATOMIC-NEXT:    ret
1101 ; RV32-ATOMIC-LABEL: rmw32_and_seq_cst:
1102 ; RV32-ATOMIC:       # %bb.0:
1103 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1104 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1105 ; RV32-ATOMIC-NEXT:    li a1, 1
1106 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_and_4
1107 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1108 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1109 ; RV32-ATOMIC-NEXT:    ret
1111 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_and_seq_cst:
1112 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1113 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1114 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1115 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1116 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_and_4
1117 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1118 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1119 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1121 ; RV64-NO-ATOMIC-LABEL: rmw32_and_seq_cst:
1122 ; RV64-NO-ATOMIC:       # %bb.0:
1123 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
1124 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1125 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
1126 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
1127 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_and_4
1128 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1129 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
1130 ; RV64-NO-ATOMIC-NEXT:    ret
1132 ; RV64-ATOMIC-LABEL: rmw32_and_seq_cst:
1133 ; RV64-ATOMIC:       # %bb.0:
1134 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1135 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1136 ; RV64-ATOMIC-NEXT:    li a1, 1
1137 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_and_4
1138 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1139 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1140 ; RV64-ATOMIC-NEXT:    ret
1142 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_and_seq_cst:
1143 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1144 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1145 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1146 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1147 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_and_4
1148 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1149 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1150 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1151   %v = atomicrmw and ptr %p, i32 1 seq_cst, align 4
1152   ret i32 %v
1155 define i32 @rmw32_nand_seq_cst(ptr %p) nounwind {
1156 ; RV32-NO-ATOMIC-LABEL: rmw32_nand_seq_cst:
1157 ; RV32-NO-ATOMIC:       # %bb.0:
1158 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1159 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1160 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
1161 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
1162 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_nand_4
1163 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1164 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1165 ; RV32-NO-ATOMIC-NEXT:    ret
1167 ; RV32-ATOMIC-LABEL: rmw32_nand_seq_cst:
1168 ; RV32-ATOMIC:       # %bb.0:
1169 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1170 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1171 ; RV32-ATOMIC-NEXT:    li a1, 1
1172 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_nand_4
1173 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1174 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1175 ; RV32-ATOMIC-NEXT:    ret
1177 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_nand_seq_cst:
1178 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1179 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1180 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1181 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1182 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_nand_4
1183 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1184 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1185 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1187 ; RV64-NO-ATOMIC-LABEL: rmw32_nand_seq_cst:
1188 ; RV64-NO-ATOMIC:       # %bb.0:
1189 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
1190 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1191 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
1192 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
1193 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_nand_4
1194 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1195 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
1196 ; RV64-NO-ATOMIC-NEXT:    ret
1198 ; RV64-ATOMIC-LABEL: rmw32_nand_seq_cst:
1199 ; RV64-ATOMIC:       # %bb.0:
1200 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1201 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1202 ; RV64-ATOMIC-NEXT:    li a1, 1
1203 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_nand_4
1204 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1205 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1206 ; RV64-ATOMIC-NEXT:    ret
1208 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_nand_seq_cst:
1209 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1210 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1211 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1212 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1213 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_nand_4
1214 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1215 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1216 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1217   %v = atomicrmw nand ptr %p, i32 1 seq_cst, align 4
1218   ret i32 %v
1221 define i32 @rmw32_or_seq_cst(ptr %p) nounwind {
1222 ; RV32-NO-ATOMIC-LABEL: rmw32_or_seq_cst:
1223 ; RV32-NO-ATOMIC:       # %bb.0:
1224 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1225 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1226 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
1227 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
1228 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_or_4
1229 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1230 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1231 ; RV32-NO-ATOMIC-NEXT:    ret
1233 ; RV32-ATOMIC-LABEL: rmw32_or_seq_cst:
1234 ; RV32-ATOMIC:       # %bb.0:
1235 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1236 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1237 ; RV32-ATOMIC-NEXT:    li a1, 1
1238 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_or_4
1239 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1240 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1241 ; RV32-ATOMIC-NEXT:    ret
1243 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_or_seq_cst:
1244 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1245 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1246 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1247 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1248 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_or_4
1249 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1250 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1251 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1253 ; RV64-NO-ATOMIC-LABEL: rmw32_or_seq_cst:
1254 ; RV64-NO-ATOMIC:       # %bb.0:
1255 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
1256 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1257 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
1258 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
1259 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_or_4
1260 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1261 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
1262 ; RV64-NO-ATOMIC-NEXT:    ret
1264 ; RV64-ATOMIC-LABEL: rmw32_or_seq_cst:
1265 ; RV64-ATOMIC:       # %bb.0:
1266 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1267 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1268 ; RV64-ATOMIC-NEXT:    li a1, 1
1269 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_or_4
1270 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1271 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1272 ; RV64-ATOMIC-NEXT:    ret
1274 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_or_seq_cst:
1275 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1276 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1277 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1278 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1279 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_or_4
1280 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1281 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1282 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1283   %v = atomicrmw or ptr %p, i32 1 seq_cst, align 4
1284   ret i32 %v
1287 define i32 @rmw32_xor_seq_cst(ptr %p) nounwind {
1288 ; RV32-NO-ATOMIC-LABEL: rmw32_xor_seq_cst:
1289 ; RV32-NO-ATOMIC:       # %bb.0:
1290 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1291 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1292 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
1293 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
1294 ; RV32-NO-ATOMIC-NEXT:    call __atomic_fetch_xor_4
1295 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1296 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1297 ; RV32-NO-ATOMIC-NEXT:    ret
1299 ; RV32-ATOMIC-LABEL: rmw32_xor_seq_cst:
1300 ; RV32-ATOMIC:       # %bb.0:
1301 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1302 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1303 ; RV32-ATOMIC-NEXT:    li a1, 1
1304 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_xor_4
1305 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1306 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1307 ; RV32-ATOMIC-NEXT:    ret
1309 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_xor_seq_cst:
1310 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1311 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1312 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1313 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1314 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_xor_4
1315 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1316 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1317 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1319 ; RV64-NO-ATOMIC-LABEL: rmw32_xor_seq_cst:
1320 ; RV64-NO-ATOMIC:       # %bb.0:
1321 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
1322 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1323 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
1324 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
1325 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_xor_4
1326 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1327 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
1328 ; RV64-NO-ATOMIC-NEXT:    ret
1330 ; RV64-ATOMIC-LABEL: rmw32_xor_seq_cst:
1331 ; RV64-ATOMIC:       # %bb.0:
1332 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1333 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1334 ; RV64-ATOMIC-NEXT:    li a1, 1
1335 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_xor_4
1336 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1337 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1338 ; RV64-ATOMIC-NEXT:    ret
1340 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_xor_seq_cst:
1341 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1342 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1343 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1344 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1345 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_xor_4
1346 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1347 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1348 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1349   %v = atomicrmw xor ptr %p, i32 1 seq_cst, align 4
1350   ret i32 %v
1353 define i32 @rmw32_max_seq_cst(ptr %p) nounwind {
1354 ; RV32-NO-ATOMIC-LABEL: rmw32_max_seq_cst:
1355 ; RV32-NO-ATOMIC:       # %bb.0:
1356 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1357 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1358 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1359 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
1360 ; RV32-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1361 ; RV32-NO-ATOMIC-NEXT:    j .LBB23_2
1362 ; RV32-NO-ATOMIC-NEXT:  .LBB23_1: # %atomicrmw.start
1363 ; RV32-NO-ATOMIC-NEXT:    # in Loop: Header=BB23_2 Depth=1
1364 ; RV32-NO-ATOMIC-NEXT:    sw a1, 4(sp)
1365 ; RV32-NO-ATOMIC-NEXT:    addi a1, sp, 4
1366 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
1367 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
1368 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
1369 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1370 ; RV32-NO-ATOMIC-NEXT:    lw a1, 4(sp)
1371 ; RV32-NO-ATOMIC-NEXT:    bnez a0, .LBB23_4
1372 ; RV32-NO-ATOMIC-NEXT:  .LBB23_2: # %atomicrmw.start
1373 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1374 ; RV32-NO-ATOMIC-NEXT:    mv a2, a1
1375 ; RV32-NO-ATOMIC-NEXT:    bgtz a1, .LBB23_1
1376 ; RV32-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
1377 ; RV32-NO-ATOMIC-NEXT:    # in Loop: Header=BB23_2 Depth=1
1378 ; RV32-NO-ATOMIC-NEXT:    li a2, 1
1379 ; RV32-NO-ATOMIC-NEXT:    j .LBB23_1
1380 ; RV32-NO-ATOMIC-NEXT:  .LBB23_4: # %atomicrmw.end
1381 ; RV32-NO-ATOMIC-NEXT:    mv a0, a1
1382 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1383 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1384 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1385 ; RV32-NO-ATOMIC-NEXT:    ret
1387 ; RV32-ATOMIC-LABEL: rmw32_max_seq_cst:
1388 ; RV32-ATOMIC:       # %bb.0:
1389 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1390 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1391 ; RV32-ATOMIC-NEXT:    li a1, 1
1392 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_max_4
1393 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1394 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1395 ; RV32-ATOMIC-NEXT:    ret
1397 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_max_seq_cst:
1398 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1399 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1400 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1401 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1402 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_max_4
1403 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1404 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1405 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1407 ; RV64-NO-ATOMIC-LABEL: rmw32_max_seq_cst:
1408 ; RV64-NO-ATOMIC:       # %bb.0:
1409 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
1410 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1411 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1412 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
1413 ; RV64-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1414 ; RV64-NO-ATOMIC-NEXT:    j .LBB23_2
1415 ; RV64-NO-ATOMIC-NEXT:  .LBB23_1: # %atomicrmw.start
1416 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB23_2 Depth=1
1417 ; RV64-NO-ATOMIC-NEXT:    sw a1, 12(sp)
1418 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 12
1419 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
1420 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
1421 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
1422 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1423 ; RV64-NO-ATOMIC-NEXT:    lw a1, 12(sp)
1424 ; RV64-NO-ATOMIC-NEXT:    bnez a0, .LBB23_4
1425 ; RV64-NO-ATOMIC-NEXT:  .LBB23_2: # %atomicrmw.start
1426 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1427 ; RV64-NO-ATOMIC-NEXT:    li a0, 1
1428 ; RV64-NO-ATOMIC-NEXT:    mv a2, a1
1429 ; RV64-NO-ATOMIC-NEXT:    blt a0, a1, .LBB23_1
1430 ; RV64-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
1431 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB23_2 Depth=1
1432 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
1433 ; RV64-NO-ATOMIC-NEXT:    j .LBB23_1
1434 ; RV64-NO-ATOMIC-NEXT:  .LBB23_4: # %atomicrmw.end
1435 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
1436 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1437 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1438 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
1439 ; RV64-NO-ATOMIC-NEXT:    ret
1441 ; RV64-ATOMIC-LABEL: rmw32_max_seq_cst:
1442 ; RV64-ATOMIC:       # %bb.0:
1443 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1444 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1445 ; RV64-ATOMIC-NEXT:    li a1, 1
1446 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_max_4
1447 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1448 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1449 ; RV64-ATOMIC-NEXT:    ret
1451 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_max_seq_cst:
1452 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1453 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1454 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1455 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1456 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_max_4
1457 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1458 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1459 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1460   %v = atomicrmw max ptr %p, i32 1 seq_cst, align 4
1461   ret i32 %v
1464 define i32 @rmw32_min_seq_cst(ptr %p) nounwind {
1465 ; RV32-NO-ATOMIC-LABEL: rmw32_min_seq_cst:
1466 ; RV32-NO-ATOMIC:       # %bb.0:
1467 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1468 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1469 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1470 ; RV32-NO-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1471 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
1472 ; RV32-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1473 ; RV32-NO-ATOMIC-NEXT:    li s1, 2
1474 ; RV32-NO-ATOMIC-NEXT:    j .LBB24_2
1475 ; RV32-NO-ATOMIC-NEXT:  .LBB24_1: # %atomicrmw.start
1476 ; RV32-NO-ATOMIC-NEXT:    # in Loop: Header=BB24_2 Depth=1
1477 ; RV32-NO-ATOMIC-NEXT:    sw a1, 0(sp)
1478 ; RV32-NO-ATOMIC-NEXT:    mv a1, sp
1479 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
1480 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
1481 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
1482 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1483 ; RV32-NO-ATOMIC-NEXT:    lw a1, 0(sp)
1484 ; RV32-NO-ATOMIC-NEXT:    bnez a0, .LBB24_4
1485 ; RV32-NO-ATOMIC-NEXT:  .LBB24_2: # %atomicrmw.start
1486 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1487 ; RV32-NO-ATOMIC-NEXT:    mv a2, a1
1488 ; RV32-NO-ATOMIC-NEXT:    blt a1, s1, .LBB24_1
1489 ; RV32-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
1490 ; RV32-NO-ATOMIC-NEXT:    # in Loop: Header=BB24_2 Depth=1
1491 ; RV32-NO-ATOMIC-NEXT:    li a2, 1
1492 ; RV32-NO-ATOMIC-NEXT:    j .LBB24_1
1493 ; RV32-NO-ATOMIC-NEXT:  .LBB24_4: # %atomicrmw.end
1494 ; RV32-NO-ATOMIC-NEXT:    mv a0, a1
1495 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1496 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1497 ; RV32-NO-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1498 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1499 ; RV32-NO-ATOMIC-NEXT:    ret
1501 ; RV32-ATOMIC-LABEL: rmw32_min_seq_cst:
1502 ; RV32-ATOMIC:       # %bb.0:
1503 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1504 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1505 ; RV32-ATOMIC-NEXT:    li a1, 1
1506 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_min_4
1507 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1508 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1509 ; RV32-ATOMIC-NEXT:    ret
1511 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_min_seq_cst:
1512 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1513 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1514 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1515 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1516 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_min_4
1517 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1518 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1519 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1521 ; RV64-NO-ATOMIC-LABEL: rmw32_min_seq_cst:
1522 ; RV64-NO-ATOMIC:       # %bb.0:
1523 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
1524 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1525 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1526 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1527 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
1528 ; RV64-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1529 ; RV64-NO-ATOMIC-NEXT:    li s1, 2
1530 ; RV64-NO-ATOMIC-NEXT:    j .LBB24_2
1531 ; RV64-NO-ATOMIC-NEXT:  .LBB24_1: # %atomicrmw.start
1532 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB24_2 Depth=1
1533 ; RV64-NO-ATOMIC-NEXT:    sw a1, 4(sp)
1534 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
1535 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
1536 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
1537 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
1538 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1539 ; RV64-NO-ATOMIC-NEXT:    lw a1, 4(sp)
1540 ; RV64-NO-ATOMIC-NEXT:    bnez a0, .LBB24_4
1541 ; RV64-NO-ATOMIC-NEXT:  .LBB24_2: # %atomicrmw.start
1542 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1543 ; RV64-NO-ATOMIC-NEXT:    mv a2, a1
1544 ; RV64-NO-ATOMIC-NEXT:    blt a1, s1, .LBB24_1
1545 ; RV64-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
1546 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB24_2 Depth=1
1547 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
1548 ; RV64-NO-ATOMIC-NEXT:    j .LBB24_1
1549 ; RV64-NO-ATOMIC-NEXT:  .LBB24_4: # %atomicrmw.end
1550 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
1551 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1552 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1553 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
1554 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
1555 ; RV64-NO-ATOMIC-NEXT:    ret
1557 ; RV64-ATOMIC-LABEL: rmw32_min_seq_cst:
1558 ; RV64-ATOMIC:       # %bb.0:
1559 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1560 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1561 ; RV64-ATOMIC-NEXT:    li a1, 1
1562 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_min_4
1563 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1564 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1565 ; RV64-ATOMIC-NEXT:    ret
1567 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_min_seq_cst:
1568 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1569 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1570 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1571 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1572 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_min_4
1573 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1574 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1575 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1576   %v = atomicrmw min ptr %p, i32 1 seq_cst, align 4
1577   ret i32 %v
1580 define i32 @rmw32_umax_seq_cst(ptr %p) nounwind {
1581 ; RV32-NO-ATOMIC-LABEL: rmw32_umax_seq_cst:
1582 ; RV32-NO-ATOMIC:       # %bb.0:
1583 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1584 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1585 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1586 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
1587 ; RV32-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1588 ; RV32-NO-ATOMIC-NEXT:  .LBB25_1: # %atomicrmw.start
1589 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1590 ; RV32-NO-ATOMIC-NEXT:    seqz a2, a1
1591 ; RV32-NO-ATOMIC-NEXT:    add a2, a1, a2
1592 ; RV32-NO-ATOMIC-NEXT:    sw a1, 4(sp)
1593 ; RV32-NO-ATOMIC-NEXT:    addi a1, sp, 4
1594 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
1595 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
1596 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
1597 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1598 ; RV32-NO-ATOMIC-NEXT:    lw a1, 4(sp)
1599 ; RV32-NO-ATOMIC-NEXT:    beqz a0, .LBB25_1
1600 ; RV32-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
1601 ; RV32-NO-ATOMIC-NEXT:    mv a0, a1
1602 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1603 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1604 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1605 ; RV32-NO-ATOMIC-NEXT:    ret
1607 ; RV32-ATOMIC-LABEL: rmw32_umax_seq_cst:
1608 ; RV32-ATOMIC:       # %bb.0:
1609 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1610 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1611 ; RV32-ATOMIC-NEXT:    li a1, 1
1612 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_umax_4
1613 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1614 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1615 ; RV32-ATOMIC-NEXT:    ret
1617 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_umax_seq_cst:
1618 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1619 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1620 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1621 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1622 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_umax_4
1623 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1624 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1625 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1627 ; RV64-NO-ATOMIC-LABEL: rmw32_umax_seq_cst:
1628 ; RV64-NO-ATOMIC:       # %bb.0:
1629 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
1630 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1631 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1632 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
1633 ; RV64-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1634 ; RV64-NO-ATOMIC-NEXT:    j .LBB25_2
1635 ; RV64-NO-ATOMIC-NEXT:  .LBB25_1: # %atomicrmw.start
1636 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB25_2 Depth=1
1637 ; RV64-NO-ATOMIC-NEXT:    sw a1, 12(sp)
1638 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 12
1639 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
1640 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
1641 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
1642 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1643 ; RV64-NO-ATOMIC-NEXT:    lw a1, 12(sp)
1644 ; RV64-NO-ATOMIC-NEXT:    bnez a0, .LBB25_4
1645 ; RV64-NO-ATOMIC-NEXT:  .LBB25_2: # %atomicrmw.start
1646 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1647 ; RV64-NO-ATOMIC-NEXT:    li a0, 1
1648 ; RV64-NO-ATOMIC-NEXT:    mv a2, a1
1649 ; RV64-NO-ATOMIC-NEXT:    bltu a0, a1, .LBB25_1
1650 ; RV64-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
1651 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB25_2 Depth=1
1652 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
1653 ; RV64-NO-ATOMIC-NEXT:    j .LBB25_1
1654 ; RV64-NO-ATOMIC-NEXT:  .LBB25_4: # %atomicrmw.end
1655 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
1656 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1657 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1658 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
1659 ; RV64-NO-ATOMIC-NEXT:    ret
1661 ; RV64-ATOMIC-LABEL: rmw32_umax_seq_cst:
1662 ; RV64-ATOMIC:       # %bb.0:
1663 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1664 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1665 ; RV64-ATOMIC-NEXT:    li a1, 1
1666 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_umax_4
1667 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1668 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1669 ; RV64-ATOMIC-NEXT:    ret
1671 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_umax_seq_cst:
1672 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1673 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1674 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1675 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1676 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_umax_4
1677 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1678 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1679 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1680   %v = atomicrmw umax ptr %p, i32 1 seq_cst, align 4
1681   ret i32 %v
1684 define i32 @rmw32_umin_seq_cst(ptr %p) nounwind {
1685 ; RV32-NO-ATOMIC-LABEL: rmw32_umin_seq_cst:
1686 ; RV32-NO-ATOMIC:       # %bb.0:
1687 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1688 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1689 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1690 ; RV32-NO-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1691 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
1692 ; RV32-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1693 ; RV32-NO-ATOMIC-NEXT:    li s1, 2
1694 ; RV32-NO-ATOMIC-NEXT:    j .LBB26_2
1695 ; RV32-NO-ATOMIC-NEXT:  .LBB26_1: # %atomicrmw.start
1696 ; RV32-NO-ATOMIC-NEXT:    # in Loop: Header=BB26_2 Depth=1
1697 ; RV32-NO-ATOMIC-NEXT:    sw a1, 0(sp)
1698 ; RV32-NO-ATOMIC-NEXT:    mv a1, sp
1699 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
1700 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
1701 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
1702 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1703 ; RV32-NO-ATOMIC-NEXT:    lw a1, 0(sp)
1704 ; RV32-NO-ATOMIC-NEXT:    bnez a0, .LBB26_4
1705 ; RV32-NO-ATOMIC-NEXT:  .LBB26_2: # %atomicrmw.start
1706 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1707 ; RV32-NO-ATOMIC-NEXT:    mv a2, a1
1708 ; RV32-NO-ATOMIC-NEXT:    bltu a1, s1, .LBB26_1
1709 ; RV32-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
1710 ; RV32-NO-ATOMIC-NEXT:    # in Loop: Header=BB26_2 Depth=1
1711 ; RV32-NO-ATOMIC-NEXT:    li a2, 1
1712 ; RV32-NO-ATOMIC-NEXT:    j .LBB26_1
1713 ; RV32-NO-ATOMIC-NEXT:  .LBB26_4: # %atomicrmw.end
1714 ; RV32-NO-ATOMIC-NEXT:    mv a0, a1
1715 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1716 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1717 ; RV32-NO-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1718 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1719 ; RV32-NO-ATOMIC-NEXT:    ret
1721 ; RV32-ATOMIC-LABEL: rmw32_umin_seq_cst:
1722 ; RV32-ATOMIC:       # %bb.0:
1723 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1724 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1725 ; RV32-ATOMIC-NEXT:    li a1, 1
1726 ; RV32-ATOMIC-NEXT:    call __sync_fetch_and_umin_4
1727 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1728 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1729 ; RV32-ATOMIC-NEXT:    ret
1731 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_umin_seq_cst:
1732 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1733 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1734 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1735 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1736 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_umin_4
1737 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1738 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1739 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1741 ; RV64-NO-ATOMIC-LABEL: rmw32_umin_seq_cst:
1742 ; RV64-NO-ATOMIC:       # %bb.0:
1743 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
1744 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1745 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1746 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1747 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
1748 ; RV64-NO-ATOMIC-NEXT:    lw a1, 0(a0)
1749 ; RV64-NO-ATOMIC-NEXT:    li s1, 2
1750 ; RV64-NO-ATOMIC-NEXT:    j .LBB26_2
1751 ; RV64-NO-ATOMIC-NEXT:  .LBB26_1: # %atomicrmw.start
1752 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB26_2 Depth=1
1753 ; RV64-NO-ATOMIC-NEXT:    sw a1, 4(sp)
1754 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
1755 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
1756 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
1757 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
1758 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1759 ; RV64-NO-ATOMIC-NEXT:    lw a1, 4(sp)
1760 ; RV64-NO-ATOMIC-NEXT:    bnez a0, .LBB26_4
1761 ; RV64-NO-ATOMIC-NEXT:  .LBB26_2: # %atomicrmw.start
1762 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1763 ; RV64-NO-ATOMIC-NEXT:    mv a2, a1
1764 ; RV64-NO-ATOMIC-NEXT:    bltu a1, s1, .LBB26_1
1765 ; RV64-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
1766 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB26_2 Depth=1
1767 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
1768 ; RV64-NO-ATOMIC-NEXT:    j .LBB26_1
1769 ; RV64-NO-ATOMIC-NEXT:  .LBB26_4: # %atomicrmw.end
1770 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
1771 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1772 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1773 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
1774 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
1775 ; RV64-NO-ATOMIC-NEXT:    ret
1777 ; RV64-ATOMIC-LABEL: rmw32_umin_seq_cst:
1778 ; RV64-ATOMIC:       # %bb.0:
1779 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1780 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1781 ; RV64-ATOMIC-NEXT:    li a1, 1
1782 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_umin_4
1783 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1784 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1785 ; RV64-ATOMIC-NEXT:    ret
1787 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_umin_seq_cst:
1788 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1789 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1790 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1791 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1792 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_umin_4
1793 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1794 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1795 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1796   %v = atomicrmw umin ptr %p, i32 1 seq_cst, align 4
1797   ret i32 %v
1800 define i32 @rmw32_xchg_seq_cst(ptr %p) nounwind {
1801 ; RV32-NO-ATOMIC-LABEL: rmw32_xchg_seq_cst:
1802 ; RV32-NO-ATOMIC:       # %bb.0:
1803 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1804 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1805 ; RV32-NO-ATOMIC-NEXT:    li a1, 1
1806 ; RV32-NO-ATOMIC-NEXT:    li a2, 5
1807 ; RV32-NO-ATOMIC-NEXT:    call __atomic_exchange_4
1808 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1809 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1810 ; RV32-NO-ATOMIC-NEXT:    ret
1812 ; RV32-ATOMIC-LABEL: rmw32_xchg_seq_cst:
1813 ; RV32-ATOMIC:       # %bb.0:
1814 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1815 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1816 ; RV32-ATOMIC-NEXT:    li a1, 1
1817 ; RV32-ATOMIC-NEXT:    call __sync_lock_test_and_set_4
1818 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1819 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1820 ; RV32-ATOMIC-NEXT:    ret
1822 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_xchg_seq_cst:
1823 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1824 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1825 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1826 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 1
1827 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_lock_test_and_set_4
1828 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1829 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1830 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1832 ; RV64-NO-ATOMIC-LABEL: rmw32_xchg_seq_cst:
1833 ; RV64-NO-ATOMIC:       # %bb.0:
1834 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
1835 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1836 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
1837 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
1838 ; RV64-NO-ATOMIC-NEXT:    call __atomic_exchange_4
1839 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1840 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
1841 ; RV64-NO-ATOMIC-NEXT:    ret
1843 ; RV64-ATOMIC-LABEL: rmw32_xchg_seq_cst:
1844 ; RV64-ATOMIC:       # %bb.0:
1845 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
1846 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1847 ; RV64-ATOMIC-NEXT:    li a1, 1
1848 ; RV64-ATOMIC-NEXT:    call __sync_lock_test_and_set_4
1849 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1850 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
1851 ; RV64-ATOMIC-NEXT:    ret
1853 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_xchg_seq_cst:
1854 ; RV64-ATOMIC-TRAILING:       # %bb.0:
1855 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1856 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1857 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
1858 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_lock_test_and_set_4
1859 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1860 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1861 ; RV64-ATOMIC-TRAILING-NEXT:    ret
1862   %v = atomicrmw xchg ptr %p, i32 1 seq_cst, align 4
1863   ret i32 %v
1866 define float @rmw32_fadd_seq_cst(ptr %p) nounwind {
1867 ; RV32-NO-ATOMIC-LABEL: rmw32_fadd_seq_cst:
1868 ; RV32-NO-ATOMIC:       # %bb.0:
1869 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
1870 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1871 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1872 ; RV32-NO-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1873 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
1874 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(a0)
1875 ; RV32-NO-ATOMIC-NEXT:  .LBB28_1: # %atomicrmw.start
1876 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1877 ; RV32-NO-ATOMIC-NEXT:    lui a1, 260096
1878 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
1879 ; RV32-NO-ATOMIC-NEXT:    call __addsf3
1880 ; RV32-NO-ATOMIC-NEXT:    mv a2, a0
1881 ; RV32-NO-ATOMIC-NEXT:    sw s1, 0(sp)
1882 ; RV32-NO-ATOMIC-NEXT:    mv a1, sp
1883 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
1884 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
1885 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
1886 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1887 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(sp)
1888 ; RV32-NO-ATOMIC-NEXT:    beqz a0, .LBB28_1
1889 ; RV32-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
1890 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
1891 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1892 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1893 ; RV32-NO-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1894 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
1895 ; RV32-NO-ATOMIC-NEXT:    ret
1897 ; RV32-ATOMIC-LABEL: rmw32_fadd_seq_cst:
1898 ; RV32-ATOMIC:       # %bb.0:
1899 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
1900 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1901 ; RV32-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1902 ; RV32-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1903 ; RV32-ATOMIC-NEXT:    mv s0, a0
1904 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
1905 ; RV32-ATOMIC-NEXT:  .LBB28_1: # %atomicrmw.start
1906 ; RV32-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1907 ; RV32-ATOMIC-NEXT:    mv s1, a0
1908 ; RV32-ATOMIC-NEXT:    lui a1, 260096
1909 ; RV32-ATOMIC-NEXT:    call __addsf3
1910 ; RV32-ATOMIC-NEXT:    mv a2, a0
1911 ; RV32-ATOMIC-NEXT:    mv a0, s0
1912 ; RV32-ATOMIC-NEXT:    mv a1, s1
1913 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
1914 ; RV32-ATOMIC-NEXT:    bne a0, s1, .LBB28_1
1915 ; RV32-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
1916 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1917 ; RV32-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1918 ; RV32-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1919 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
1920 ; RV32-ATOMIC-NEXT:    ret
1922 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_fadd_seq_cst:
1923 ; RV32-ATOMIC-TRAILING:       # %bb.0:
1924 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
1925 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1926 ; RV32-ATOMIC-TRAILING-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1927 ; RV32-ATOMIC-TRAILING-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1928 ; RV32-ATOMIC-TRAILING-NEXT:    mv s0, a0
1929 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
1930 ; RV32-ATOMIC-TRAILING-NEXT:  .LBB28_1: # %atomicrmw.start
1931 ; RV32-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
1932 ; RV32-ATOMIC-TRAILING-NEXT:    mv s1, a0
1933 ; RV32-ATOMIC-TRAILING-NEXT:    lui a1, 260096
1934 ; RV32-ATOMIC-TRAILING-NEXT:    call __addsf3
1935 ; RV32-ATOMIC-TRAILING-NEXT:    mv a2, a0
1936 ; RV32-ATOMIC-TRAILING-NEXT:    mv a0, s0
1937 ; RV32-ATOMIC-TRAILING-NEXT:    mv a1, s1
1938 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
1939 ; RV32-ATOMIC-TRAILING-NEXT:    bne a0, s1, .LBB28_1
1940 ; RV32-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
1941 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1942 ; RV32-ATOMIC-TRAILING-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1943 ; RV32-ATOMIC-TRAILING-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1944 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
1945 ; RV32-ATOMIC-TRAILING-NEXT:    ret
1947 ; RV64-NO-ATOMIC-LABEL: rmw32_fadd_seq_cst:
1948 ; RV64-NO-ATOMIC:       # %bb.0:
1949 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
1950 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1951 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1952 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1953 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
1954 ; RV64-NO-ATOMIC-NEXT:    lw s1, 0(a0)
1955 ; RV64-NO-ATOMIC-NEXT:  .LBB28_1: # %atomicrmw.start
1956 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1957 ; RV64-NO-ATOMIC-NEXT:    lui a1, 260096
1958 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
1959 ; RV64-NO-ATOMIC-NEXT:    call __addsf3
1960 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
1961 ; RV64-NO-ATOMIC-NEXT:    sw s1, 4(sp)
1962 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
1963 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
1964 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
1965 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
1966 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
1967 ; RV64-NO-ATOMIC-NEXT:    lw s1, 4(sp)
1968 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB28_1
1969 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
1970 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
1971 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1972 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1973 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
1974 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
1975 ; RV64-NO-ATOMIC-NEXT:    ret
1977 ; RV64-ATOMIC-LABEL: rmw32_fadd_seq_cst:
1978 ; RV64-ATOMIC:       # %bb.0:
1979 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
1980 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1981 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1982 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
1983 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
1984 ; RV64-ATOMIC-NEXT:    mv s0, a0
1985 ; RV64-ATOMIC-NEXT:    lw s1, 0(a0)
1986 ; RV64-ATOMIC-NEXT:  .LBB28_1: # %atomicrmw.start
1987 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
1988 ; RV64-ATOMIC-NEXT:    lui a1, 260096
1989 ; RV64-ATOMIC-NEXT:    mv a0, s1
1990 ; RV64-ATOMIC-NEXT:    call __addsf3
1991 ; RV64-ATOMIC-NEXT:    mv a2, a0
1992 ; RV64-ATOMIC-NEXT:    sext.w s2, s1
1993 ; RV64-ATOMIC-NEXT:    mv a0, s0
1994 ; RV64-ATOMIC-NEXT:    mv a1, s2
1995 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
1996 ; RV64-ATOMIC-NEXT:    mv s1, a0
1997 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB28_1
1998 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
1999 ; RV64-ATOMIC-NEXT:    mv a0, s1
2000 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2001 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2002 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2003 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2004 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
2005 ; RV64-ATOMIC-NEXT:    ret
2007 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_fadd_seq_cst:
2008 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2009 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
2010 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2011 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2012 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2013 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
2014 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
2015 ; RV64-ATOMIC-TRAILING-NEXT:    lw s1, 0(a0)
2016 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB28_1: # %atomicrmw.start
2017 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
2018 ; RV64-ATOMIC-TRAILING-NEXT:    lui a1, 260096
2019 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2020 ; RV64-ATOMIC-TRAILING-NEXT:    call __addsf3
2021 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
2022 ; RV64-ATOMIC-TRAILING-NEXT:    sext.w s2, s1
2023 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
2024 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
2025 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2026 ; RV64-ATOMIC-TRAILING-NEXT:    mv s1, a0
2027 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB28_1
2028 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
2029 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2030 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2031 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2032 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2033 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2034 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
2035 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2036   %v = atomicrmw fadd ptr %p, float 1.0 seq_cst, align 4
2037   ret float %v
2040 define float @rmw32_fsub_seq_cst(ptr %p) nounwind {
2041 ; RV32-NO-ATOMIC-LABEL: rmw32_fsub_seq_cst:
2042 ; RV32-NO-ATOMIC:       # %bb.0:
2043 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
2044 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2045 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2046 ; RV32-NO-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2047 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
2048 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(a0)
2049 ; RV32-NO-ATOMIC-NEXT:  .LBB29_1: # %atomicrmw.start
2050 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2051 ; RV32-NO-ATOMIC-NEXT:    lui a1, 784384
2052 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
2053 ; RV32-NO-ATOMIC-NEXT:    call __addsf3
2054 ; RV32-NO-ATOMIC-NEXT:    mv a2, a0
2055 ; RV32-NO-ATOMIC-NEXT:    sw s1, 0(sp)
2056 ; RV32-NO-ATOMIC-NEXT:    mv a1, sp
2057 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
2058 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
2059 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
2060 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2061 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(sp)
2062 ; RV32-NO-ATOMIC-NEXT:    beqz a0, .LBB29_1
2063 ; RV32-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2064 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
2065 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2066 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2067 ; RV32-NO-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2068 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
2069 ; RV32-NO-ATOMIC-NEXT:    ret
2071 ; RV32-ATOMIC-LABEL: rmw32_fsub_seq_cst:
2072 ; RV32-ATOMIC:       # %bb.0:
2073 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
2074 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2075 ; RV32-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2076 ; RV32-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2077 ; RV32-ATOMIC-NEXT:    mv s0, a0
2078 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
2079 ; RV32-ATOMIC-NEXT:  .LBB29_1: # %atomicrmw.start
2080 ; RV32-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2081 ; RV32-ATOMIC-NEXT:    mv s1, a0
2082 ; RV32-ATOMIC-NEXT:    lui a1, 784384
2083 ; RV32-ATOMIC-NEXT:    call __addsf3
2084 ; RV32-ATOMIC-NEXT:    mv a2, a0
2085 ; RV32-ATOMIC-NEXT:    mv a0, s0
2086 ; RV32-ATOMIC-NEXT:    mv a1, s1
2087 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2088 ; RV32-ATOMIC-NEXT:    bne a0, s1, .LBB29_1
2089 ; RV32-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2090 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2091 ; RV32-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2092 ; RV32-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2093 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
2094 ; RV32-ATOMIC-NEXT:    ret
2096 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_fsub_seq_cst:
2097 ; RV32-ATOMIC-TRAILING:       # %bb.0:
2098 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
2099 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2100 ; RV32-ATOMIC-TRAILING-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2101 ; RV32-ATOMIC-TRAILING-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2102 ; RV32-ATOMIC-TRAILING-NEXT:    mv s0, a0
2103 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
2104 ; RV32-ATOMIC-TRAILING-NEXT:  .LBB29_1: # %atomicrmw.start
2105 ; RV32-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
2106 ; RV32-ATOMIC-TRAILING-NEXT:    mv s1, a0
2107 ; RV32-ATOMIC-TRAILING-NEXT:    lui a1, 784384
2108 ; RV32-ATOMIC-TRAILING-NEXT:    call __addsf3
2109 ; RV32-ATOMIC-TRAILING-NEXT:    mv a2, a0
2110 ; RV32-ATOMIC-TRAILING-NEXT:    mv a0, s0
2111 ; RV32-ATOMIC-TRAILING-NEXT:    mv a1, s1
2112 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2113 ; RV32-ATOMIC-TRAILING-NEXT:    bne a0, s1, .LBB29_1
2114 ; RV32-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
2115 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2116 ; RV32-ATOMIC-TRAILING-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2117 ; RV32-ATOMIC-TRAILING-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2118 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
2119 ; RV32-ATOMIC-TRAILING-NEXT:    ret
2121 ; RV64-NO-ATOMIC-LABEL: rmw32_fsub_seq_cst:
2122 ; RV64-NO-ATOMIC:       # %bb.0:
2123 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
2124 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2125 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2126 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2127 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
2128 ; RV64-NO-ATOMIC-NEXT:    lw s1, 0(a0)
2129 ; RV64-NO-ATOMIC-NEXT:  .LBB29_1: # %atomicrmw.start
2130 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2131 ; RV64-NO-ATOMIC-NEXT:    lui a1, 784384
2132 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
2133 ; RV64-NO-ATOMIC-NEXT:    call __addsf3
2134 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
2135 ; RV64-NO-ATOMIC-NEXT:    sw s1, 4(sp)
2136 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
2137 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
2138 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
2139 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
2140 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2141 ; RV64-NO-ATOMIC-NEXT:    lw s1, 4(sp)
2142 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB29_1
2143 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2144 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
2145 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2146 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2147 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2148 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
2149 ; RV64-NO-ATOMIC-NEXT:    ret
2151 ; RV64-ATOMIC-LABEL: rmw32_fsub_seq_cst:
2152 ; RV64-ATOMIC:       # %bb.0:
2153 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
2154 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2155 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2156 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2157 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
2158 ; RV64-ATOMIC-NEXT:    mv s0, a0
2159 ; RV64-ATOMIC-NEXT:    lw s1, 0(a0)
2160 ; RV64-ATOMIC-NEXT:  .LBB29_1: # %atomicrmw.start
2161 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2162 ; RV64-ATOMIC-NEXT:    lui a1, 784384
2163 ; RV64-ATOMIC-NEXT:    mv a0, s1
2164 ; RV64-ATOMIC-NEXT:    call __addsf3
2165 ; RV64-ATOMIC-NEXT:    mv a2, a0
2166 ; RV64-ATOMIC-NEXT:    sext.w s2, s1
2167 ; RV64-ATOMIC-NEXT:    mv a0, s0
2168 ; RV64-ATOMIC-NEXT:    mv a1, s2
2169 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2170 ; RV64-ATOMIC-NEXT:    mv s1, a0
2171 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB29_1
2172 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2173 ; RV64-ATOMIC-NEXT:    mv a0, s1
2174 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2175 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2176 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2177 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2178 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
2179 ; RV64-ATOMIC-NEXT:    ret
2181 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_fsub_seq_cst:
2182 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2183 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
2184 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2185 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2186 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2187 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
2188 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
2189 ; RV64-ATOMIC-TRAILING-NEXT:    lw s1, 0(a0)
2190 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB29_1: # %atomicrmw.start
2191 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
2192 ; RV64-ATOMIC-TRAILING-NEXT:    lui a1, 784384
2193 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2194 ; RV64-ATOMIC-TRAILING-NEXT:    call __addsf3
2195 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
2196 ; RV64-ATOMIC-TRAILING-NEXT:    sext.w s2, s1
2197 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
2198 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
2199 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2200 ; RV64-ATOMIC-TRAILING-NEXT:    mv s1, a0
2201 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB29_1
2202 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
2203 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2204 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2205 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2206 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2207 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2208 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
2209 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2210   %v = atomicrmw fsub ptr %p, float 1.0 seq_cst, align 4
2211   ret float %v
2214 define float @rmw32_fmin_seq_cst(ptr %p) nounwind {
2215 ; RV32-NO-ATOMIC-LABEL: rmw32_fmin_seq_cst:
2216 ; RV32-NO-ATOMIC:       # %bb.0:
2217 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
2218 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2219 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2220 ; RV32-NO-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2221 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
2222 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(a0)
2223 ; RV32-NO-ATOMIC-NEXT:  .LBB30_1: # %atomicrmw.start
2224 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2225 ; RV32-NO-ATOMIC-NEXT:    lui a1, 260096
2226 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
2227 ; RV32-NO-ATOMIC-NEXT:    call fminf
2228 ; RV32-NO-ATOMIC-NEXT:    mv a2, a0
2229 ; RV32-NO-ATOMIC-NEXT:    sw s1, 0(sp)
2230 ; RV32-NO-ATOMIC-NEXT:    mv a1, sp
2231 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
2232 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
2233 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
2234 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2235 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(sp)
2236 ; RV32-NO-ATOMIC-NEXT:    beqz a0, .LBB30_1
2237 ; RV32-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2238 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
2239 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2240 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2241 ; RV32-NO-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2242 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
2243 ; RV32-NO-ATOMIC-NEXT:    ret
2245 ; RV32-ATOMIC-LABEL: rmw32_fmin_seq_cst:
2246 ; RV32-ATOMIC:       # %bb.0:
2247 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
2248 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2249 ; RV32-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2250 ; RV32-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2251 ; RV32-ATOMIC-NEXT:    mv s0, a0
2252 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
2253 ; RV32-ATOMIC-NEXT:  .LBB30_1: # %atomicrmw.start
2254 ; RV32-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2255 ; RV32-ATOMIC-NEXT:    mv s1, a0
2256 ; RV32-ATOMIC-NEXT:    lui a1, 260096
2257 ; RV32-ATOMIC-NEXT:    call fminf
2258 ; RV32-ATOMIC-NEXT:    mv a2, a0
2259 ; RV32-ATOMIC-NEXT:    mv a0, s0
2260 ; RV32-ATOMIC-NEXT:    mv a1, s1
2261 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2262 ; RV32-ATOMIC-NEXT:    bne a0, s1, .LBB30_1
2263 ; RV32-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2264 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2265 ; RV32-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2266 ; RV32-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2267 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
2268 ; RV32-ATOMIC-NEXT:    ret
2270 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_fmin_seq_cst:
2271 ; RV32-ATOMIC-TRAILING:       # %bb.0:
2272 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
2273 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2274 ; RV32-ATOMIC-TRAILING-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2275 ; RV32-ATOMIC-TRAILING-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2276 ; RV32-ATOMIC-TRAILING-NEXT:    mv s0, a0
2277 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
2278 ; RV32-ATOMIC-TRAILING-NEXT:  .LBB30_1: # %atomicrmw.start
2279 ; RV32-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
2280 ; RV32-ATOMIC-TRAILING-NEXT:    mv s1, a0
2281 ; RV32-ATOMIC-TRAILING-NEXT:    lui a1, 260096
2282 ; RV32-ATOMIC-TRAILING-NEXT:    call fminf
2283 ; RV32-ATOMIC-TRAILING-NEXT:    mv a2, a0
2284 ; RV32-ATOMIC-TRAILING-NEXT:    mv a0, s0
2285 ; RV32-ATOMIC-TRAILING-NEXT:    mv a1, s1
2286 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2287 ; RV32-ATOMIC-TRAILING-NEXT:    bne a0, s1, .LBB30_1
2288 ; RV32-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
2289 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2290 ; RV32-ATOMIC-TRAILING-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2291 ; RV32-ATOMIC-TRAILING-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2292 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
2293 ; RV32-ATOMIC-TRAILING-NEXT:    ret
2295 ; RV64-NO-ATOMIC-LABEL: rmw32_fmin_seq_cst:
2296 ; RV64-NO-ATOMIC:       # %bb.0:
2297 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
2298 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2299 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2300 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2301 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
2302 ; RV64-NO-ATOMIC-NEXT:    lw s1, 0(a0)
2303 ; RV64-NO-ATOMIC-NEXT:  .LBB30_1: # %atomicrmw.start
2304 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2305 ; RV64-NO-ATOMIC-NEXT:    lui a1, 260096
2306 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
2307 ; RV64-NO-ATOMIC-NEXT:    call fminf
2308 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
2309 ; RV64-NO-ATOMIC-NEXT:    sw s1, 4(sp)
2310 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
2311 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
2312 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
2313 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
2314 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2315 ; RV64-NO-ATOMIC-NEXT:    lw s1, 4(sp)
2316 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB30_1
2317 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2318 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
2319 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2320 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2321 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2322 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
2323 ; RV64-NO-ATOMIC-NEXT:    ret
2325 ; RV64-ATOMIC-LABEL: rmw32_fmin_seq_cst:
2326 ; RV64-ATOMIC:       # %bb.0:
2327 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
2328 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2329 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2330 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2331 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
2332 ; RV64-ATOMIC-NEXT:    mv s0, a0
2333 ; RV64-ATOMIC-NEXT:    lw s1, 0(a0)
2334 ; RV64-ATOMIC-NEXT:  .LBB30_1: # %atomicrmw.start
2335 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2336 ; RV64-ATOMIC-NEXT:    lui a1, 260096
2337 ; RV64-ATOMIC-NEXT:    mv a0, s1
2338 ; RV64-ATOMIC-NEXT:    call fminf
2339 ; RV64-ATOMIC-NEXT:    mv a2, a0
2340 ; RV64-ATOMIC-NEXT:    sext.w s2, s1
2341 ; RV64-ATOMIC-NEXT:    mv a0, s0
2342 ; RV64-ATOMIC-NEXT:    mv a1, s2
2343 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2344 ; RV64-ATOMIC-NEXT:    mv s1, a0
2345 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB30_1
2346 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2347 ; RV64-ATOMIC-NEXT:    mv a0, s1
2348 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2349 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2350 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2351 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2352 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
2353 ; RV64-ATOMIC-NEXT:    ret
2355 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_fmin_seq_cst:
2356 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2357 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
2358 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2359 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2360 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2361 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
2362 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
2363 ; RV64-ATOMIC-TRAILING-NEXT:    lw s1, 0(a0)
2364 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB30_1: # %atomicrmw.start
2365 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
2366 ; RV64-ATOMIC-TRAILING-NEXT:    lui a1, 260096
2367 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2368 ; RV64-ATOMIC-TRAILING-NEXT:    call fminf
2369 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
2370 ; RV64-ATOMIC-TRAILING-NEXT:    sext.w s2, s1
2371 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
2372 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
2373 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2374 ; RV64-ATOMIC-TRAILING-NEXT:    mv s1, a0
2375 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB30_1
2376 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
2377 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2378 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2379 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2380 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2381 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2382 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
2383 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2384   %v = atomicrmw fmin ptr %p, float 1.0 seq_cst, align 4
2385   ret float %v
2388 define float @rmw32_fmax_seq_cst(ptr %p) nounwind {
2389 ; RV32-NO-ATOMIC-LABEL: rmw32_fmax_seq_cst:
2390 ; RV32-NO-ATOMIC:       # %bb.0:
2391 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
2392 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2393 ; RV32-NO-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2394 ; RV32-NO-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2395 ; RV32-NO-ATOMIC-NEXT:    mv s0, a0
2396 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(a0)
2397 ; RV32-NO-ATOMIC-NEXT:  .LBB31_1: # %atomicrmw.start
2398 ; RV32-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2399 ; RV32-NO-ATOMIC-NEXT:    lui a1, 260096
2400 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
2401 ; RV32-NO-ATOMIC-NEXT:    call fmaxf
2402 ; RV32-NO-ATOMIC-NEXT:    mv a2, a0
2403 ; RV32-NO-ATOMIC-NEXT:    sw s1, 0(sp)
2404 ; RV32-NO-ATOMIC-NEXT:    mv a1, sp
2405 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
2406 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
2407 ; RV32-NO-ATOMIC-NEXT:    mv a0, s0
2408 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2409 ; RV32-NO-ATOMIC-NEXT:    lw s1, 0(sp)
2410 ; RV32-NO-ATOMIC-NEXT:    beqz a0, .LBB31_1
2411 ; RV32-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2412 ; RV32-NO-ATOMIC-NEXT:    mv a0, s1
2413 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2414 ; RV32-NO-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2415 ; RV32-NO-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2416 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
2417 ; RV32-NO-ATOMIC-NEXT:    ret
2419 ; RV32-ATOMIC-LABEL: rmw32_fmax_seq_cst:
2420 ; RV32-ATOMIC:       # %bb.0:
2421 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
2422 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2423 ; RV32-ATOMIC-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2424 ; RV32-ATOMIC-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2425 ; RV32-ATOMIC-NEXT:    mv s0, a0
2426 ; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
2427 ; RV32-ATOMIC-NEXT:  .LBB31_1: # %atomicrmw.start
2428 ; RV32-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2429 ; RV32-ATOMIC-NEXT:    mv s1, a0
2430 ; RV32-ATOMIC-NEXT:    lui a1, 260096
2431 ; RV32-ATOMIC-NEXT:    call fmaxf
2432 ; RV32-ATOMIC-NEXT:    mv a2, a0
2433 ; RV32-ATOMIC-NEXT:    mv a0, s0
2434 ; RV32-ATOMIC-NEXT:    mv a1, s1
2435 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2436 ; RV32-ATOMIC-NEXT:    bne a0, s1, .LBB31_1
2437 ; RV32-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2438 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2439 ; RV32-ATOMIC-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2440 ; RV32-ATOMIC-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2441 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
2442 ; RV32-ATOMIC-NEXT:    ret
2444 ; RV32-ATOMIC-TRAILING-LABEL: rmw32_fmax_seq_cst:
2445 ; RV32-ATOMIC-TRAILING:       # %bb.0:
2446 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
2447 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2448 ; RV32-ATOMIC-TRAILING-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2449 ; RV32-ATOMIC-TRAILING-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2450 ; RV32-ATOMIC-TRAILING-NEXT:    mv s0, a0
2451 ; RV32-ATOMIC-TRAILING-NEXT:    lw a0, 0(a0)
2452 ; RV32-ATOMIC-TRAILING-NEXT:  .LBB31_1: # %atomicrmw.start
2453 ; RV32-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
2454 ; RV32-ATOMIC-TRAILING-NEXT:    mv s1, a0
2455 ; RV32-ATOMIC-TRAILING-NEXT:    lui a1, 260096
2456 ; RV32-ATOMIC-TRAILING-NEXT:    call fmaxf
2457 ; RV32-ATOMIC-TRAILING-NEXT:    mv a2, a0
2458 ; RV32-ATOMIC-TRAILING-NEXT:    mv a0, s0
2459 ; RV32-ATOMIC-TRAILING-NEXT:    mv a1, s1
2460 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2461 ; RV32-ATOMIC-TRAILING-NEXT:    bne a0, s1, .LBB31_1
2462 ; RV32-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
2463 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2464 ; RV32-ATOMIC-TRAILING-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2465 ; RV32-ATOMIC-TRAILING-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2466 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
2467 ; RV32-ATOMIC-TRAILING-NEXT:    ret
2469 ; RV64-NO-ATOMIC-LABEL: rmw32_fmax_seq_cst:
2470 ; RV64-NO-ATOMIC:       # %bb.0:
2471 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
2472 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2473 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2474 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2475 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
2476 ; RV64-NO-ATOMIC-NEXT:    lw s1, 0(a0)
2477 ; RV64-NO-ATOMIC-NEXT:  .LBB31_1: # %atomicrmw.start
2478 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2479 ; RV64-NO-ATOMIC-NEXT:    lui a1, 260096
2480 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
2481 ; RV64-NO-ATOMIC-NEXT:    call fmaxf
2482 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
2483 ; RV64-NO-ATOMIC-NEXT:    sw s1, 4(sp)
2484 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
2485 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
2486 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
2487 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
2488 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2489 ; RV64-NO-ATOMIC-NEXT:    lw s1, 4(sp)
2490 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB31_1
2491 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2492 ; RV64-NO-ATOMIC-NEXT:    mv a0, s1
2493 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2494 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2495 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2496 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
2497 ; RV64-NO-ATOMIC-NEXT:    ret
2499 ; RV64-ATOMIC-LABEL: rmw32_fmax_seq_cst:
2500 ; RV64-ATOMIC:       # %bb.0:
2501 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
2502 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2503 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2504 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2505 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
2506 ; RV64-ATOMIC-NEXT:    mv s0, a0
2507 ; RV64-ATOMIC-NEXT:    lw s1, 0(a0)
2508 ; RV64-ATOMIC-NEXT:  .LBB31_1: # %atomicrmw.start
2509 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
2510 ; RV64-ATOMIC-NEXT:    lui a1, 260096
2511 ; RV64-ATOMIC-NEXT:    mv a0, s1
2512 ; RV64-ATOMIC-NEXT:    call fmaxf
2513 ; RV64-ATOMIC-NEXT:    mv a2, a0
2514 ; RV64-ATOMIC-NEXT:    sext.w s2, s1
2515 ; RV64-ATOMIC-NEXT:    mv a0, s0
2516 ; RV64-ATOMIC-NEXT:    mv a1, s2
2517 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2518 ; RV64-ATOMIC-NEXT:    mv s1, a0
2519 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB31_1
2520 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
2521 ; RV64-ATOMIC-NEXT:    mv a0, s1
2522 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2523 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2524 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2525 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2526 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
2527 ; RV64-ATOMIC-NEXT:    ret
2529 ; RV64-ATOMIC-TRAILING-LABEL: rmw32_fmax_seq_cst:
2530 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2531 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
2532 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2533 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2534 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
2535 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
2536 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
2537 ; RV64-ATOMIC-TRAILING-NEXT:    lw s1, 0(a0)
2538 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB31_1: # %atomicrmw.start
2539 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
2540 ; RV64-ATOMIC-TRAILING-NEXT:    lui a1, 260096
2541 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2542 ; RV64-ATOMIC-TRAILING-NEXT:    call fmaxf
2543 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
2544 ; RV64-ATOMIC-TRAILING-NEXT:    sext.w s2, s1
2545 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
2546 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
2547 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2548 ; RV64-ATOMIC-TRAILING-NEXT:    mv s1, a0
2549 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB31_1
2550 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
2551 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s1
2552 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2553 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2554 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
2555 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
2556 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
2557 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2558   %v = atomicrmw fmax ptr %p, float 1.0 seq_cst, align 4
2559   ret float %v
2562 define i32 @cmpxchg32_monotonic(ptr %p) nounwind {
2563 ; RV32-NO-ATOMIC-LABEL: cmpxchg32_monotonic:
2564 ; RV32-NO-ATOMIC:       # %bb.0:
2565 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
2566 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2567 ; RV32-NO-ATOMIC-NEXT:    sw zero, 8(sp)
2568 ; RV32-NO-ATOMIC-NEXT:    addi a1, sp, 8
2569 ; RV32-NO-ATOMIC-NEXT:    li a2, 1
2570 ; RV32-NO-ATOMIC-NEXT:    li a3, 0
2571 ; RV32-NO-ATOMIC-NEXT:    li a4, 0
2572 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2573 ; RV32-NO-ATOMIC-NEXT:    lw a0, 8(sp)
2574 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2575 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
2576 ; RV32-NO-ATOMIC-NEXT:    ret
2578 ; RV32-ATOMIC-LABEL: cmpxchg32_monotonic:
2579 ; RV32-ATOMIC:       # %bb.0:
2580 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
2581 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2582 ; RV32-ATOMIC-NEXT:    li a2, 1
2583 ; RV32-ATOMIC-NEXT:    li a1, 0
2584 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2585 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2586 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
2587 ; RV32-ATOMIC-NEXT:    ret
2589 ; RV32-ATOMIC-TRAILING-LABEL: cmpxchg32_monotonic:
2590 ; RV32-ATOMIC-TRAILING:       # %bb.0:
2591 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
2592 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2593 ; RV32-ATOMIC-TRAILING-NEXT:    li a2, 1
2594 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 0
2595 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2596 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2597 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
2598 ; RV32-ATOMIC-TRAILING-NEXT:    ret
2600 ; RV64-NO-ATOMIC-LABEL: cmpxchg32_monotonic:
2601 ; RV64-NO-ATOMIC:       # %bb.0:
2602 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2603 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2604 ; RV64-NO-ATOMIC-NEXT:    sw zero, 4(sp)
2605 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
2606 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
2607 ; RV64-NO-ATOMIC-NEXT:    li a3, 0
2608 ; RV64-NO-ATOMIC-NEXT:    li a4, 0
2609 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2610 ; RV64-NO-ATOMIC-NEXT:    lw a0, 4(sp)
2611 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2612 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2613 ; RV64-NO-ATOMIC-NEXT:    ret
2615 ; RV64-ATOMIC-LABEL: cmpxchg32_monotonic:
2616 ; RV64-ATOMIC:       # %bb.0:
2617 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
2618 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2619 ; RV64-ATOMIC-NEXT:    li a2, 1
2620 ; RV64-ATOMIC-NEXT:    li a1, 0
2621 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2622 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2623 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
2624 ; RV64-ATOMIC-NEXT:    ret
2626 ; RV64-ATOMIC-TRAILING-LABEL: cmpxchg32_monotonic:
2627 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2628 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
2629 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2630 ; RV64-ATOMIC-TRAILING-NEXT:    li a2, 1
2631 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 0
2632 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2633 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2634 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
2635 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2636   %res = cmpxchg ptr %p, i32 0, i32 1 monotonic monotonic
2637   %res.0 = extractvalue { i32, i1 } %res, 0
2638   ret i32 %res.0
2641 define i32 @cmpxchg32_seq_cst(ptr %p) nounwind {
2642 ; RV32-NO-ATOMIC-LABEL: cmpxchg32_seq_cst:
2643 ; RV32-NO-ATOMIC:       # %bb.0:
2644 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, -16
2645 ; RV32-NO-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2646 ; RV32-NO-ATOMIC-NEXT:    sw zero, 8(sp)
2647 ; RV32-NO-ATOMIC-NEXT:    addi a1, sp, 8
2648 ; RV32-NO-ATOMIC-NEXT:    li a2, 1
2649 ; RV32-NO-ATOMIC-NEXT:    li a3, 5
2650 ; RV32-NO-ATOMIC-NEXT:    li a4, 5
2651 ; RV32-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2652 ; RV32-NO-ATOMIC-NEXT:    lw a0, 8(sp)
2653 ; RV32-NO-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2654 ; RV32-NO-ATOMIC-NEXT:    addi sp, sp, 16
2655 ; RV32-NO-ATOMIC-NEXT:    ret
2657 ; RV32-ATOMIC-LABEL: cmpxchg32_seq_cst:
2658 ; RV32-ATOMIC:       # %bb.0:
2659 ; RV32-ATOMIC-NEXT:    addi sp, sp, -16
2660 ; RV32-ATOMIC-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2661 ; RV32-ATOMIC-NEXT:    li a2, 1
2662 ; RV32-ATOMIC-NEXT:    li a1, 0
2663 ; RV32-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2664 ; RV32-ATOMIC-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2665 ; RV32-ATOMIC-NEXT:    addi sp, sp, 16
2666 ; RV32-ATOMIC-NEXT:    ret
2668 ; RV32-ATOMIC-TRAILING-LABEL: cmpxchg32_seq_cst:
2669 ; RV32-ATOMIC-TRAILING:       # %bb.0:
2670 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
2671 ; RV32-ATOMIC-TRAILING-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2672 ; RV32-ATOMIC-TRAILING-NEXT:    li a2, 1
2673 ; RV32-ATOMIC-TRAILING-NEXT:    li a1, 0
2674 ; RV32-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2675 ; RV32-ATOMIC-TRAILING-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2676 ; RV32-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
2677 ; RV32-ATOMIC-TRAILING-NEXT:    ret
2679 ; RV64-NO-ATOMIC-LABEL: cmpxchg32_seq_cst:
2680 ; RV64-NO-ATOMIC:       # %bb.0:
2681 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2682 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2683 ; RV64-NO-ATOMIC-NEXT:    sw zero, 4(sp)
2684 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 4
2685 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
2686 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
2687 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
2688 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_4
2689 ; RV64-NO-ATOMIC-NEXT:    lw a0, 4(sp)
2690 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2691 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2692 ; RV64-NO-ATOMIC-NEXT:    ret
2694 ; RV64-ATOMIC-LABEL: cmpxchg32_seq_cst:
2695 ; RV64-ATOMIC:       # %bb.0:
2696 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
2697 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2698 ; RV64-ATOMIC-NEXT:    li a2, 1
2699 ; RV64-ATOMIC-NEXT:    li a1, 0
2700 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_4
2701 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2702 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
2703 ; RV64-ATOMIC-NEXT:    ret
2705 ; RV64-ATOMIC-TRAILING-LABEL: cmpxchg32_seq_cst:
2706 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2707 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
2708 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2709 ; RV64-ATOMIC-TRAILING-NEXT:    li a2, 1
2710 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 0
2711 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_4
2712 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2713 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
2714 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2715   %res = cmpxchg ptr %p, i32 0, i32 1 seq_cst seq_cst
2716   %res.0 = extractvalue { i32, i1 } %res, 0
2717   ret i32 %res.0
2720 define i64 @load64_unordered(ptr %p) nounwind {
2721 ; RV32-LABEL: load64_unordered:
2722 ; RV32:       # %bb.0:
2723 ; RV32-NEXT:    addi sp, sp, -16
2724 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2725 ; RV32-NEXT:    li a1, 0
2726 ; RV32-NEXT:    call __atomic_load_8
2727 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2728 ; RV32-NEXT:    addi sp, sp, 16
2729 ; RV32-NEXT:    ret
2731 ; RV64-NO-ATOMIC-LABEL: load64_unordered:
2732 ; RV64-NO-ATOMIC:       # %bb.0:
2733 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2734 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2735 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
2736 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_8
2737 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2738 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2739 ; RV64-NO-ATOMIC-NEXT:    ret
2741 ; RV64-ATOMIC-LABEL: load64_unordered:
2742 ; RV64-ATOMIC:       # %bb.0:
2743 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
2744 ; RV64-ATOMIC-NEXT:    ret
2746 ; RV64-ATOMIC-TRAILING-LABEL: load64_unordered:
2747 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2748 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
2749 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2750   %v = load atomic i64, ptr %p unordered, align 8
2751   ret i64 %v
2754 define i64 @load64_monotonic(ptr %p) nounwind {
2755 ; RV32-LABEL: load64_monotonic:
2756 ; RV32:       # %bb.0:
2757 ; RV32-NEXT:    addi sp, sp, -16
2758 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2759 ; RV32-NEXT:    li a1, 0
2760 ; RV32-NEXT:    call __atomic_load_8
2761 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2762 ; RV32-NEXT:    addi sp, sp, 16
2763 ; RV32-NEXT:    ret
2765 ; RV64-NO-ATOMIC-LABEL: load64_monotonic:
2766 ; RV64-NO-ATOMIC:       # %bb.0:
2767 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2768 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2769 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
2770 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_8
2771 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2772 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2773 ; RV64-NO-ATOMIC-NEXT:    ret
2775 ; RV64-ATOMIC-LABEL: load64_monotonic:
2776 ; RV64-ATOMIC:       # %bb.0:
2777 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
2778 ; RV64-ATOMIC-NEXT:    ret
2780 ; RV64-ATOMIC-TRAILING-LABEL: load64_monotonic:
2781 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2782 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
2783 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2784   %v = load atomic i64, ptr %p monotonic, align 8
2785   ret i64 %v
2788 define i64 @load64_acquire(ptr %p) nounwind {
2789 ; RV32-LABEL: load64_acquire:
2790 ; RV32:       # %bb.0:
2791 ; RV32-NEXT:    addi sp, sp, -16
2792 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2793 ; RV32-NEXT:    li a1, 2
2794 ; RV32-NEXT:    call __atomic_load_8
2795 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2796 ; RV32-NEXT:    addi sp, sp, 16
2797 ; RV32-NEXT:    ret
2799 ; RV64-NO-ATOMIC-LABEL: load64_acquire:
2800 ; RV64-NO-ATOMIC:       # %bb.0:
2801 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2802 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2803 ; RV64-NO-ATOMIC-NEXT:    li a1, 2
2804 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_8
2805 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2806 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2807 ; RV64-NO-ATOMIC-NEXT:    ret
2809 ; RV64-ATOMIC-LABEL: load64_acquire:
2810 ; RV64-ATOMIC:       # %bb.0:
2811 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
2812 ; RV64-ATOMIC-NEXT:    fence r, rw
2813 ; RV64-ATOMIC-NEXT:    ret
2815 ; RV64-ATOMIC-TRAILING-LABEL: load64_acquire:
2816 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2817 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
2818 ; RV64-ATOMIC-TRAILING-NEXT:    fence r, rw
2819 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2820   %v = load atomic i64, ptr %p acquire, align 8
2821   ret i64 %v
2824 define i64 @load64_seq_cst(ptr %p) nounwind {
2825 ; RV32-LABEL: load64_seq_cst:
2826 ; RV32:       # %bb.0:
2827 ; RV32-NEXT:    addi sp, sp, -16
2828 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2829 ; RV32-NEXT:    li a1, 5
2830 ; RV32-NEXT:    call __atomic_load_8
2831 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2832 ; RV32-NEXT:    addi sp, sp, 16
2833 ; RV32-NEXT:    ret
2835 ; RV64-NO-ATOMIC-LABEL: load64_seq_cst:
2836 ; RV64-NO-ATOMIC:       # %bb.0:
2837 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2838 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2839 ; RV64-NO-ATOMIC-NEXT:    li a1, 5
2840 ; RV64-NO-ATOMIC-NEXT:    call __atomic_load_8
2841 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2842 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2843 ; RV64-NO-ATOMIC-NEXT:    ret
2845 ; RV64-ATOMIC-LABEL: load64_seq_cst:
2846 ; RV64-ATOMIC:       # %bb.0:
2847 ; RV64-ATOMIC-NEXT:    fence rw, rw
2848 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
2849 ; RV64-ATOMIC-NEXT:    fence r, rw
2850 ; RV64-ATOMIC-NEXT:    ret
2852 ; RV64-ATOMIC-TRAILING-LABEL: load64_seq_cst:
2853 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2854 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
2855 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
2856 ; RV64-ATOMIC-TRAILING-NEXT:    fence r, rw
2857 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2858   %v = load atomic i64, ptr %p seq_cst, align 8
2859   ret i64 %v
2862 define void @store64_unordered(ptr %p) nounwind {
2863 ; RV32-LABEL: store64_unordered:
2864 ; RV32:       # %bb.0:
2865 ; RV32-NEXT:    addi sp, sp, -16
2866 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2867 ; RV32-NEXT:    li a1, 0
2868 ; RV32-NEXT:    li a2, 0
2869 ; RV32-NEXT:    li a3, 0
2870 ; RV32-NEXT:    call __atomic_store_8
2871 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2872 ; RV32-NEXT:    addi sp, sp, 16
2873 ; RV32-NEXT:    ret
2875 ; RV64-NO-ATOMIC-LABEL: store64_unordered:
2876 ; RV64-NO-ATOMIC:       # %bb.0:
2877 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2878 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2879 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
2880 ; RV64-NO-ATOMIC-NEXT:    li a2, 0
2881 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_8
2882 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2883 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2884 ; RV64-NO-ATOMIC-NEXT:    ret
2886 ; RV64-ATOMIC-LABEL: store64_unordered:
2887 ; RV64-ATOMIC:       # %bb.0:
2888 ; RV64-ATOMIC-NEXT:    sd zero, 0(a0)
2889 ; RV64-ATOMIC-NEXT:    ret
2891 ; RV64-ATOMIC-TRAILING-LABEL: store64_unordered:
2892 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2893 ; RV64-ATOMIC-TRAILING-NEXT:    sd zero, 0(a0)
2894 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2895   store atomic i64 0, ptr %p unordered, align 8
2896   ret void
2899 define void @store64_monotonic(ptr %p) nounwind {
2900 ; RV32-LABEL: store64_monotonic:
2901 ; RV32:       # %bb.0:
2902 ; RV32-NEXT:    addi sp, sp, -16
2903 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2904 ; RV32-NEXT:    li a1, 0
2905 ; RV32-NEXT:    li a2, 0
2906 ; RV32-NEXT:    li a3, 0
2907 ; RV32-NEXT:    call __atomic_store_8
2908 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2909 ; RV32-NEXT:    addi sp, sp, 16
2910 ; RV32-NEXT:    ret
2912 ; RV64-NO-ATOMIC-LABEL: store64_monotonic:
2913 ; RV64-NO-ATOMIC:       # %bb.0:
2914 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2915 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2916 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
2917 ; RV64-NO-ATOMIC-NEXT:    li a2, 0
2918 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_8
2919 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2920 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2921 ; RV64-NO-ATOMIC-NEXT:    ret
2923 ; RV64-ATOMIC-LABEL: store64_monotonic:
2924 ; RV64-ATOMIC:       # %bb.0:
2925 ; RV64-ATOMIC-NEXT:    sd zero, 0(a0)
2926 ; RV64-ATOMIC-NEXT:    ret
2928 ; RV64-ATOMIC-TRAILING-LABEL: store64_monotonic:
2929 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2930 ; RV64-ATOMIC-TRAILING-NEXT:    sd zero, 0(a0)
2931 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2932   store atomic i64 0, ptr %p monotonic, align 8
2933   ret void
2936 define void @store64_release(ptr %p) nounwind {
2937 ; RV32-LABEL: store64_release:
2938 ; RV32:       # %bb.0:
2939 ; RV32-NEXT:    addi sp, sp, -16
2940 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2941 ; RV32-NEXT:    li a3, 3
2942 ; RV32-NEXT:    li a1, 0
2943 ; RV32-NEXT:    li a2, 0
2944 ; RV32-NEXT:    call __atomic_store_8
2945 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2946 ; RV32-NEXT:    addi sp, sp, 16
2947 ; RV32-NEXT:    ret
2949 ; RV64-NO-ATOMIC-LABEL: store64_release:
2950 ; RV64-NO-ATOMIC:       # %bb.0:
2951 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2952 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2953 ; RV64-NO-ATOMIC-NEXT:    li a2, 3
2954 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
2955 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_8
2956 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2957 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2958 ; RV64-NO-ATOMIC-NEXT:    ret
2960 ; RV64-ATOMIC-LABEL: store64_release:
2961 ; RV64-ATOMIC:       # %bb.0:
2962 ; RV64-ATOMIC-NEXT:    fence rw, w
2963 ; RV64-ATOMIC-NEXT:    sd zero, 0(a0)
2964 ; RV64-ATOMIC-NEXT:    ret
2966 ; RV64-ATOMIC-TRAILING-LABEL: store64_release:
2967 ; RV64-ATOMIC-TRAILING:       # %bb.0:
2968 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, w
2969 ; RV64-ATOMIC-TRAILING-NEXT:    sd zero, 0(a0)
2970 ; RV64-ATOMIC-TRAILING-NEXT:    ret
2971   store atomic i64 0, ptr %p release, align 8
2972   ret void
2975 define void @store64(ptr %p) nounwind {
2976 ; RV32-LABEL: store64:
2977 ; RV32:       # %bb.0:
2978 ; RV32-NEXT:    addi sp, sp, -16
2979 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2980 ; RV32-NEXT:    li a3, 5
2981 ; RV32-NEXT:    li a1, 0
2982 ; RV32-NEXT:    li a2, 0
2983 ; RV32-NEXT:    call __atomic_store_8
2984 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2985 ; RV32-NEXT:    addi sp, sp, 16
2986 ; RV32-NEXT:    ret
2988 ; RV64-NO-ATOMIC-LABEL: store64:
2989 ; RV64-NO-ATOMIC:       # %bb.0:
2990 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
2991 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2992 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
2993 ; RV64-NO-ATOMIC-NEXT:    li a1, 0
2994 ; RV64-NO-ATOMIC-NEXT:    call __atomic_store_8
2995 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2996 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
2997 ; RV64-NO-ATOMIC-NEXT:    ret
2999 ; RV64-ATOMIC-LABEL: store64:
3000 ; RV64-ATOMIC:       # %bb.0:
3001 ; RV64-ATOMIC-NEXT:    fence rw, w
3002 ; RV64-ATOMIC-NEXT:    sd zero, 0(a0)
3003 ; RV64-ATOMIC-NEXT:    ret
3005 ; RV64-ATOMIC-TRAILING-LABEL: store64:
3006 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3007 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, w
3008 ; RV64-ATOMIC-TRAILING-NEXT:    sd zero, 0(a0)
3009 ; RV64-ATOMIC-TRAILING-NEXT:    fence rw, rw
3010 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3011   store atomic i64 0, ptr %p seq_cst, align 8
3012   ret void
3015 define i64 @rmw64_monotonic(ptr %p) nounwind {
3016 ; RV32-LABEL: rmw64_monotonic:
3017 ; RV32:       # %bb.0:
3018 ; RV32-NEXT:    addi sp, sp, -16
3019 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3020 ; RV32-NEXT:    li a1, 1
3021 ; RV32-NEXT:    li a2, 0
3022 ; RV32-NEXT:    li a3, 0
3023 ; RV32-NEXT:    call __atomic_fetch_add_8
3024 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3025 ; RV32-NEXT:    addi sp, sp, 16
3026 ; RV32-NEXT:    ret
3028 ; RV64-NO-ATOMIC-LABEL: rmw64_monotonic:
3029 ; RV64-NO-ATOMIC:       # %bb.0:
3030 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3031 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3032 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3033 ; RV64-NO-ATOMIC-NEXT:    li a2, 0
3034 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_add_8
3035 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3036 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3037 ; RV64-NO-ATOMIC-NEXT:    ret
3039 ; RV64-ATOMIC-LABEL: rmw64_monotonic:
3040 ; RV64-ATOMIC:       # %bb.0:
3041 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3042 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3043 ; RV64-ATOMIC-NEXT:    li a1, 1
3044 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_add_8
3045 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3046 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3047 ; RV64-ATOMIC-NEXT:    ret
3049 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_monotonic:
3050 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3051 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3052 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3053 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3054 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_8
3055 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3056 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3057 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3058   %v = atomicrmw add ptr %p, i64 1 monotonic, align 8
3059   ret i64 %v
3062 define i64 @rmw64_add_seq_cst(ptr %p) nounwind {
3063 ; RV32-LABEL: rmw64_add_seq_cst:
3064 ; RV32:       # %bb.0:
3065 ; RV32-NEXT:    addi sp, sp, -16
3066 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3067 ; RV32-NEXT:    li a1, 1
3068 ; RV32-NEXT:    li a3, 5
3069 ; RV32-NEXT:    li a2, 0
3070 ; RV32-NEXT:    call __atomic_fetch_add_8
3071 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3072 ; RV32-NEXT:    addi sp, sp, 16
3073 ; RV32-NEXT:    ret
3075 ; RV64-NO-ATOMIC-LABEL: rmw64_add_seq_cst:
3076 ; RV64-NO-ATOMIC:       # %bb.0:
3077 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3078 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3079 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3080 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
3081 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_add_8
3082 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3083 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3084 ; RV64-NO-ATOMIC-NEXT:    ret
3086 ; RV64-ATOMIC-LABEL: rmw64_add_seq_cst:
3087 ; RV64-ATOMIC:       # %bb.0:
3088 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3089 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3090 ; RV64-ATOMIC-NEXT:    li a1, 1
3091 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_add_8
3092 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3093 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3094 ; RV64-ATOMIC-NEXT:    ret
3096 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_add_seq_cst:
3097 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3098 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3099 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3100 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3101 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_add_8
3102 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3103 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3104 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3105   %v = atomicrmw add ptr %p, i64 1 seq_cst, align 8
3106   ret i64 %v
3109 define i64 @rmw64_sub_seq_cst(ptr %p) nounwind {
3110 ; RV32-LABEL: rmw64_sub_seq_cst:
3111 ; RV32:       # %bb.0:
3112 ; RV32-NEXT:    addi sp, sp, -16
3113 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3114 ; RV32-NEXT:    li a1, 1
3115 ; RV32-NEXT:    li a3, 5
3116 ; RV32-NEXT:    li a2, 0
3117 ; RV32-NEXT:    call __atomic_fetch_sub_8
3118 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3119 ; RV32-NEXT:    addi sp, sp, 16
3120 ; RV32-NEXT:    ret
3122 ; RV64-NO-ATOMIC-LABEL: rmw64_sub_seq_cst:
3123 ; RV64-NO-ATOMIC:       # %bb.0:
3124 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3125 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3126 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3127 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
3128 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_sub_8
3129 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3130 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3131 ; RV64-NO-ATOMIC-NEXT:    ret
3133 ; RV64-ATOMIC-LABEL: rmw64_sub_seq_cst:
3134 ; RV64-ATOMIC:       # %bb.0:
3135 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3136 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3137 ; RV64-ATOMIC-NEXT:    li a1, 1
3138 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_sub_8
3139 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3140 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3141 ; RV64-ATOMIC-NEXT:    ret
3143 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_sub_seq_cst:
3144 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3145 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3146 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3147 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3148 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_sub_8
3149 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3150 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3151 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3152   %v = atomicrmw sub ptr %p, i64 1 seq_cst, align 8
3153   ret i64 %v
3156 define i64 @rmw64_and_seq_cst(ptr %p) nounwind {
3157 ; RV32-LABEL: rmw64_and_seq_cst:
3158 ; RV32:       # %bb.0:
3159 ; RV32-NEXT:    addi sp, sp, -16
3160 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3161 ; RV32-NEXT:    li a1, 1
3162 ; RV32-NEXT:    li a3, 5
3163 ; RV32-NEXT:    li a2, 0
3164 ; RV32-NEXT:    call __atomic_fetch_and_8
3165 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3166 ; RV32-NEXT:    addi sp, sp, 16
3167 ; RV32-NEXT:    ret
3169 ; RV64-NO-ATOMIC-LABEL: rmw64_and_seq_cst:
3170 ; RV64-NO-ATOMIC:       # %bb.0:
3171 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3172 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3173 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3174 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
3175 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_and_8
3176 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3177 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3178 ; RV64-NO-ATOMIC-NEXT:    ret
3180 ; RV64-ATOMIC-LABEL: rmw64_and_seq_cst:
3181 ; RV64-ATOMIC:       # %bb.0:
3182 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3183 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3184 ; RV64-ATOMIC-NEXT:    li a1, 1
3185 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_and_8
3186 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3187 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3188 ; RV64-ATOMIC-NEXT:    ret
3190 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_and_seq_cst:
3191 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3192 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3193 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3194 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3195 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_and_8
3196 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3197 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3198 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3199   %v = atomicrmw and ptr %p, i64 1 seq_cst, align 8
3200   ret i64 %v
3203 define i64 @rmw64_nand_seq_cst(ptr %p) nounwind {
3204 ; RV32-LABEL: rmw64_nand_seq_cst:
3205 ; RV32:       # %bb.0:
3206 ; RV32-NEXT:    addi sp, sp, -16
3207 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3208 ; RV32-NEXT:    li a1, 1
3209 ; RV32-NEXT:    li a3, 5
3210 ; RV32-NEXT:    li a2, 0
3211 ; RV32-NEXT:    call __atomic_fetch_nand_8
3212 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3213 ; RV32-NEXT:    addi sp, sp, 16
3214 ; RV32-NEXT:    ret
3216 ; RV64-NO-ATOMIC-LABEL: rmw64_nand_seq_cst:
3217 ; RV64-NO-ATOMIC:       # %bb.0:
3218 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3219 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3220 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3221 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
3222 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_nand_8
3223 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3224 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3225 ; RV64-NO-ATOMIC-NEXT:    ret
3227 ; RV64-ATOMIC-LABEL: rmw64_nand_seq_cst:
3228 ; RV64-ATOMIC:       # %bb.0:
3229 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3230 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3231 ; RV64-ATOMIC-NEXT:    li a1, 1
3232 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_nand_8
3233 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3234 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3235 ; RV64-ATOMIC-NEXT:    ret
3237 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_nand_seq_cst:
3238 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3239 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3240 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3241 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3242 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_nand_8
3243 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3244 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3245 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3246   %v = atomicrmw nand ptr %p, i64 1 seq_cst, align 8
3247   ret i64 %v
3250 define i64 @rmw64_or_seq_cst(ptr %p) nounwind {
3251 ; RV32-LABEL: rmw64_or_seq_cst:
3252 ; RV32:       # %bb.0:
3253 ; RV32-NEXT:    addi sp, sp, -16
3254 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3255 ; RV32-NEXT:    li a1, 1
3256 ; RV32-NEXT:    li a3, 5
3257 ; RV32-NEXT:    li a2, 0
3258 ; RV32-NEXT:    call __atomic_fetch_or_8
3259 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3260 ; RV32-NEXT:    addi sp, sp, 16
3261 ; RV32-NEXT:    ret
3263 ; RV64-NO-ATOMIC-LABEL: rmw64_or_seq_cst:
3264 ; RV64-NO-ATOMIC:       # %bb.0:
3265 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3266 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3267 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3268 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
3269 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_or_8
3270 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3271 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3272 ; RV64-NO-ATOMIC-NEXT:    ret
3274 ; RV64-ATOMIC-LABEL: rmw64_or_seq_cst:
3275 ; RV64-ATOMIC:       # %bb.0:
3276 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3277 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3278 ; RV64-ATOMIC-NEXT:    li a1, 1
3279 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_or_8
3280 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3281 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3282 ; RV64-ATOMIC-NEXT:    ret
3284 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_or_seq_cst:
3285 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3286 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3287 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3288 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3289 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_or_8
3290 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3291 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3292 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3293   %v = atomicrmw or ptr %p, i64 1 seq_cst, align 8
3294   ret i64 %v
3297 define i64 @rmw64_xor_seq_cst(ptr %p) nounwind {
3298 ; RV32-LABEL: rmw64_xor_seq_cst:
3299 ; RV32:       # %bb.0:
3300 ; RV32-NEXT:    addi sp, sp, -16
3301 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3302 ; RV32-NEXT:    li a1, 1
3303 ; RV32-NEXT:    li a3, 5
3304 ; RV32-NEXT:    li a2, 0
3305 ; RV32-NEXT:    call __atomic_fetch_xor_8
3306 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3307 ; RV32-NEXT:    addi sp, sp, 16
3308 ; RV32-NEXT:    ret
3310 ; RV64-NO-ATOMIC-LABEL: rmw64_xor_seq_cst:
3311 ; RV64-NO-ATOMIC:       # %bb.0:
3312 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3313 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3314 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3315 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
3316 ; RV64-NO-ATOMIC-NEXT:    call __atomic_fetch_xor_8
3317 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3318 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3319 ; RV64-NO-ATOMIC-NEXT:    ret
3321 ; RV64-ATOMIC-LABEL: rmw64_xor_seq_cst:
3322 ; RV64-ATOMIC:       # %bb.0:
3323 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3324 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3325 ; RV64-ATOMIC-NEXT:    li a1, 1
3326 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_xor_8
3327 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3328 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3329 ; RV64-ATOMIC-NEXT:    ret
3331 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_xor_seq_cst:
3332 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3333 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3334 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3335 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3336 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_xor_8
3337 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3338 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3339 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3340   %v = atomicrmw xor ptr %p, i64 1 seq_cst, align 8
3341   ret i64 %v
3344 define i64 @rmw64_max_seq_cst(ptr %p) nounwind {
3345 ; RV32-LABEL: rmw64_max_seq_cst:
3346 ; RV32:       # %bb.0:
3347 ; RV32-NEXT:    addi sp, sp, -16
3348 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3349 ; RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3350 ; RV32-NEXT:    mv s0, a0
3351 ; RV32-NEXT:    lw a1, 4(a0)
3352 ; RV32-NEXT:    lw a4, 0(a0)
3353 ; RV32-NEXT:    j .LBB49_2
3354 ; RV32-NEXT:  .LBB49_1: # %atomicrmw.start
3355 ; RV32-NEXT:    # in Loop: Header=BB49_2 Depth=1
3356 ; RV32-NEXT:    neg a3, a0
3357 ; RV32-NEXT:    and a3, a3, a1
3358 ; RV32-NEXT:    sw a4, 0(sp)
3359 ; RV32-NEXT:    sw a1, 4(sp)
3360 ; RV32-NEXT:    mv a1, sp
3361 ; RV32-NEXT:    li a4, 5
3362 ; RV32-NEXT:    li a5, 5
3363 ; RV32-NEXT:    mv a0, s0
3364 ; RV32-NEXT:    call __atomic_compare_exchange_8
3365 ; RV32-NEXT:    lw a1, 4(sp)
3366 ; RV32-NEXT:    lw a4, 0(sp)
3367 ; RV32-NEXT:    bnez a0, .LBB49_6
3368 ; RV32-NEXT:  .LBB49_2: # %atomicrmw.start
3369 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
3370 ; RV32-NEXT:    beqz a1, .LBB49_4
3371 ; RV32-NEXT:  # %bb.3: # %atomicrmw.start
3372 ; RV32-NEXT:    # in Loop: Header=BB49_2 Depth=1
3373 ; RV32-NEXT:    sgtz a0, a1
3374 ; RV32-NEXT:    mv a2, a4
3375 ; RV32-NEXT:    bnez a0, .LBB49_1
3376 ; RV32-NEXT:    j .LBB49_5
3377 ; RV32-NEXT:  .LBB49_4: # in Loop: Header=BB49_2 Depth=1
3378 ; RV32-NEXT:    sltiu a0, a4, 2
3379 ; RV32-NEXT:    xori a0, a0, 1
3380 ; RV32-NEXT:    mv a2, a4
3381 ; RV32-NEXT:    bnez a0, .LBB49_1
3382 ; RV32-NEXT:  .LBB49_5: # %atomicrmw.start
3383 ; RV32-NEXT:    # in Loop: Header=BB49_2 Depth=1
3384 ; RV32-NEXT:    li a2, 1
3385 ; RV32-NEXT:    j .LBB49_1
3386 ; RV32-NEXT:  .LBB49_6: # %atomicrmw.end
3387 ; RV32-NEXT:    mv a0, a4
3388 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3389 ; RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3390 ; RV32-NEXT:    addi sp, sp, 16
3391 ; RV32-NEXT:    ret
3393 ; RV64-NO-ATOMIC-LABEL: rmw64_max_seq_cst:
3394 ; RV64-NO-ATOMIC:       # %bb.0:
3395 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
3396 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3397 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3398 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
3399 ; RV64-NO-ATOMIC-NEXT:    ld a1, 0(a0)
3400 ; RV64-NO-ATOMIC-NEXT:    j .LBB49_2
3401 ; RV64-NO-ATOMIC-NEXT:  .LBB49_1: # %atomicrmw.start
3402 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB49_2 Depth=1
3403 ; RV64-NO-ATOMIC-NEXT:    sd a1, 8(sp)
3404 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 8
3405 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
3406 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
3407 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
3408 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
3409 ; RV64-NO-ATOMIC-NEXT:    ld a1, 8(sp)
3410 ; RV64-NO-ATOMIC-NEXT:    bnez a0, .LBB49_4
3411 ; RV64-NO-ATOMIC-NEXT:  .LBB49_2: # %atomicrmw.start
3412 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
3413 ; RV64-NO-ATOMIC-NEXT:    mv a2, a1
3414 ; RV64-NO-ATOMIC-NEXT:    bgtz a1, .LBB49_1
3415 ; RV64-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
3416 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB49_2 Depth=1
3417 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
3418 ; RV64-NO-ATOMIC-NEXT:    j .LBB49_1
3419 ; RV64-NO-ATOMIC-NEXT:  .LBB49_4: # %atomicrmw.end
3420 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
3421 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3422 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3423 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
3424 ; RV64-NO-ATOMIC-NEXT:    ret
3426 ; RV64-ATOMIC-LABEL: rmw64_max_seq_cst:
3427 ; RV64-ATOMIC:       # %bb.0:
3428 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3429 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3430 ; RV64-ATOMIC-NEXT:    li a1, 1
3431 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_max_8
3432 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3433 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3434 ; RV64-ATOMIC-NEXT:    ret
3436 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_max_seq_cst:
3437 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3438 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3439 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3440 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3441 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_max_8
3442 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3443 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3444 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3445   %v = atomicrmw max ptr %p, i64 1 seq_cst, align 8
3446   ret i64 %v
3449 define i64 @rmw64_min_seq_cst(ptr %p) nounwind {
3450 ; RV32-LABEL: rmw64_min_seq_cst:
3451 ; RV32:       # %bb.0:
3452 ; RV32-NEXT:    addi sp, sp, -16
3453 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3454 ; RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3455 ; RV32-NEXT:    mv s0, a0
3456 ; RV32-NEXT:    lw a1, 4(a0)
3457 ; RV32-NEXT:    lw a4, 0(a0)
3458 ; RV32-NEXT:    j .LBB50_2
3459 ; RV32-NEXT:  .LBB50_1: # %atomicrmw.start
3460 ; RV32-NEXT:    # in Loop: Header=BB50_2 Depth=1
3461 ; RV32-NEXT:    neg a3, a0
3462 ; RV32-NEXT:    and a3, a3, a1
3463 ; RV32-NEXT:    sw a4, 0(sp)
3464 ; RV32-NEXT:    sw a1, 4(sp)
3465 ; RV32-NEXT:    mv a1, sp
3466 ; RV32-NEXT:    li a4, 5
3467 ; RV32-NEXT:    li a5, 5
3468 ; RV32-NEXT:    mv a0, s0
3469 ; RV32-NEXT:    call __atomic_compare_exchange_8
3470 ; RV32-NEXT:    lw a1, 4(sp)
3471 ; RV32-NEXT:    lw a4, 0(sp)
3472 ; RV32-NEXT:    bnez a0, .LBB50_6
3473 ; RV32-NEXT:  .LBB50_2: # %atomicrmw.start
3474 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
3475 ; RV32-NEXT:    beqz a1, .LBB50_4
3476 ; RV32-NEXT:  # %bb.3: # %atomicrmw.start
3477 ; RV32-NEXT:    # in Loop: Header=BB50_2 Depth=1
3478 ; RV32-NEXT:    slti a0, a1, 0
3479 ; RV32-NEXT:    mv a2, a4
3480 ; RV32-NEXT:    bnez a0, .LBB50_1
3481 ; RV32-NEXT:    j .LBB50_5
3482 ; RV32-NEXT:  .LBB50_4: # in Loop: Header=BB50_2 Depth=1
3483 ; RV32-NEXT:    sltiu a0, a4, 2
3484 ; RV32-NEXT:    mv a2, a4
3485 ; RV32-NEXT:    bnez a0, .LBB50_1
3486 ; RV32-NEXT:  .LBB50_5: # %atomicrmw.start
3487 ; RV32-NEXT:    # in Loop: Header=BB50_2 Depth=1
3488 ; RV32-NEXT:    li a2, 1
3489 ; RV32-NEXT:    j .LBB50_1
3490 ; RV32-NEXT:  .LBB50_6: # %atomicrmw.end
3491 ; RV32-NEXT:    mv a0, a4
3492 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3493 ; RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3494 ; RV32-NEXT:    addi sp, sp, 16
3495 ; RV32-NEXT:    ret
3497 ; RV64-NO-ATOMIC-LABEL: rmw64_min_seq_cst:
3498 ; RV64-NO-ATOMIC:       # %bb.0:
3499 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
3500 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3501 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3502 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3503 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
3504 ; RV64-NO-ATOMIC-NEXT:    ld a1, 0(a0)
3505 ; RV64-NO-ATOMIC-NEXT:    li s1, 2
3506 ; RV64-NO-ATOMIC-NEXT:    j .LBB50_2
3507 ; RV64-NO-ATOMIC-NEXT:  .LBB50_1: # %atomicrmw.start
3508 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB50_2 Depth=1
3509 ; RV64-NO-ATOMIC-NEXT:    sd a1, 0(sp)
3510 ; RV64-NO-ATOMIC-NEXT:    mv a1, sp
3511 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
3512 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
3513 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
3514 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
3515 ; RV64-NO-ATOMIC-NEXT:    ld a1, 0(sp)
3516 ; RV64-NO-ATOMIC-NEXT:    bnez a0, .LBB50_4
3517 ; RV64-NO-ATOMIC-NEXT:  .LBB50_2: # %atomicrmw.start
3518 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
3519 ; RV64-NO-ATOMIC-NEXT:    mv a2, a1
3520 ; RV64-NO-ATOMIC-NEXT:    blt a1, s1, .LBB50_1
3521 ; RV64-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
3522 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB50_2 Depth=1
3523 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
3524 ; RV64-NO-ATOMIC-NEXT:    j .LBB50_1
3525 ; RV64-NO-ATOMIC-NEXT:  .LBB50_4: # %atomicrmw.end
3526 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
3527 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3528 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3529 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3530 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
3531 ; RV64-NO-ATOMIC-NEXT:    ret
3533 ; RV64-ATOMIC-LABEL: rmw64_min_seq_cst:
3534 ; RV64-ATOMIC:       # %bb.0:
3535 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3536 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3537 ; RV64-ATOMIC-NEXT:    li a1, 1
3538 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_min_8
3539 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3540 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3541 ; RV64-ATOMIC-NEXT:    ret
3543 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_min_seq_cst:
3544 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3545 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3546 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3547 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3548 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_min_8
3549 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3550 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3551 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3552   %v = atomicrmw min ptr %p, i64 1 seq_cst, align 8
3553   ret i64 %v
3556 define i64 @rmw64_umax_seq_cst(ptr %p) nounwind {
3557 ; RV32-LABEL: rmw64_umax_seq_cst:
3558 ; RV32:       # %bb.0:
3559 ; RV32-NEXT:    addi sp, sp, -16
3560 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3561 ; RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3562 ; RV32-NEXT:    mv s0, a0
3563 ; RV32-NEXT:    lw a1, 4(a0)
3564 ; RV32-NEXT:    lw a4, 0(a0)
3565 ; RV32-NEXT:    j .LBB51_2
3566 ; RV32-NEXT:  .LBB51_1: # %atomicrmw.start
3567 ; RV32-NEXT:    # in Loop: Header=BB51_2 Depth=1
3568 ; RV32-NEXT:    neg a3, a0
3569 ; RV32-NEXT:    and a3, a3, a1
3570 ; RV32-NEXT:    sw a4, 0(sp)
3571 ; RV32-NEXT:    sw a1, 4(sp)
3572 ; RV32-NEXT:    mv a1, sp
3573 ; RV32-NEXT:    li a4, 5
3574 ; RV32-NEXT:    li a5, 5
3575 ; RV32-NEXT:    mv a0, s0
3576 ; RV32-NEXT:    call __atomic_compare_exchange_8
3577 ; RV32-NEXT:    lw a1, 4(sp)
3578 ; RV32-NEXT:    lw a4, 0(sp)
3579 ; RV32-NEXT:    bnez a0, .LBB51_4
3580 ; RV32-NEXT:  .LBB51_2: # %atomicrmw.start
3581 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
3582 ; RV32-NEXT:    snez a0, a1
3583 ; RV32-NEXT:    sltiu a2, a4, 2
3584 ; RV32-NEXT:    xori a2, a2, 1
3585 ; RV32-NEXT:    or a0, a2, a0
3586 ; RV32-NEXT:    mv a2, a4
3587 ; RV32-NEXT:    bnez a0, .LBB51_1
3588 ; RV32-NEXT:  # %bb.3: # %atomicrmw.start
3589 ; RV32-NEXT:    # in Loop: Header=BB51_2 Depth=1
3590 ; RV32-NEXT:    li a2, 1
3591 ; RV32-NEXT:    j .LBB51_1
3592 ; RV32-NEXT:  .LBB51_4: # %atomicrmw.end
3593 ; RV32-NEXT:    mv a0, a4
3594 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3595 ; RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3596 ; RV32-NEXT:    addi sp, sp, 16
3597 ; RV32-NEXT:    ret
3599 ; RV64-NO-ATOMIC-LABEL: rmw64_umax_seq_cst:
3600 ; RV64-NO-ATOMIC:       # %bb.0:
3601 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
3602 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3603 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3604 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
3605 ; RV64-NO-ATOMIC-NEXT:    ld a1, 0(a0)
3606 ; RV64-NO-ATOMIC-NEXT:  .LBB51_1: # %atomicrmw.start
3607 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
3608 ; RV64-NO-ATOMIC-NEXT:    seqz a2, a1
3609 ; RV64-NO-ATOMIC-NEXT:    add a2, a1, a2
3610 ; RV64-NO-ATOMIC-NEXT:    sd a1, 8(sp)
3611 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 8
3612 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
3613 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
3614 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
3615 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
3616 ; RV64-NO-ATOMIC-NEXT:    ld a1, 8(sp)
3617 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB51_1
3618 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
3619 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
3620 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3621 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3622 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
3623 ; RV64-NO-ATOMIC-NEXT:    ret
3625 ; RV64-ATOMIC-LABEL: rmw64_umax_seq_cst:
3626 ; RV64-ATOMIC:       # %bb.0:
3627 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3628 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3629 ; RV64-ATOMIC-NEXT:    li a1, 1
3630 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_umax_8
3631 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3632 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3633 ; RV64-ATOMIC-NEXT:    ret
3635 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_umax_seq_cst:
3636 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3637 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3638 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3639 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3640 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_umax_8
3641 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3642 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3643 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3644   %v = atomicrmw umax ptr %p, i64 1 seq_cst, align 8
3645   ret i64 %v
3648 define i64 @rmw64_umin_seq_cst(ptr %p) nounwind {
3649 ; RV32-LABEL: rmw64_umin_seq_cst:
3650 ; RV32:       # %bb.0:
3651 ; RV32-NEXT:    addi sp, sp, -16
3652 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3653 ; RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3654 ; RV32-NEXT:    mv s0, a0
3655 ; RV32-NEXT:    lw a1, 4(a0)
3656 ; RV32-NEXT:    lw a4, 0(a0)
3657 ; RV32-NEXT:    j .LBB52_2
3658 ; RV32-NEXT:  .LBB52_1: # %atomicrmw.start
3659 ; RV32-NEXT:    # in Loop: Header=BB52_2 Depth=1
3660 ; RV32-NEXT:    neg a3, a0
3661 ; RV32-NEXT:    and a3, a3, a1
3662 ; RV32-NEXT:    sw a4, 0(sp)
3663 ; RV32-NEXT:    sw a1, 4(sp)
3664 ; RV32-NEXT:    mv a1, sp
3665 ; RV32-NEXT:    li a4, 5
3666 ; RV32-NEXT:    li a5, 5
3667 ; RV32-NEXT:    mv a0, s0
3668 ; RV32-NEXT:    call __atomic_compare_exchange_8
3669 ; RV32-NEXT:    lw a1, 4(sp)
3670 ; RV32-NEXT:    lw a4, 0(sp)
3671 ; RV32-NEXT:    bnez a0, .LBB52_4
3672 ; RV32-NEXT:  .LBB52_2: # %atomicrmw.start
3673 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
3674 ; RV32-NEXT:    sltiu a0, a4, 2
3675 ; RV32-NEXT:    seqz a2, a1
3676 ; RV32-NEXT:    and a0, a2, a0
3677 ; RV32-NEXT:    mv a2, a4
3678 ; RV32-NEXT:    bnez a0, .LBB52_1
3679 ; RV32-NEXT:  # %bb.3: # %atomicrmw.start
3680 ; RV32-NEXT:    # in Loop: Header=BB52_2 Depth=1
3681 ; RV32-NEXT:    li a2, 1
3682 ; RV32-NEXT:    j .LBB52_1
3683 ; RV32-NEXT:  .LBB52_4: # %atomicrmw.end
3684 ; RV32-NEXT:    mv a0, a4
3685 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3686 ; RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3687 ; RV32-NEXT:    addi sp, sp, 16
3688 ; RV32-NEXT:    ret
3690 ; RV64-NO-ATOMIC-LABEL: rmw64_umin_seq_cst:
3691 ; RV64-NO-ATOMIC:       # %bb.0:
3692 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -32
3693 ; RV64-NO-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3694 ; RV64-NO-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3695 ; RV64-NO-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3696 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
3697 ; RV64-NO-ATOMIC-NEXT:    ld a1, 0(a0)
3698 ; RV64-NO-ATOMIC-NEXT:    li s1, 2
3699 ; RV64-NO-ATOMIC-NEXT:    j .LBB52_2
3700 ; RV64-NO-ATOMIC-NEXT:  .LBB52_1: # %atomicrmw.start
3701 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB52_2 Depth=1
3702 ; RV64-NO-ATOMIC-NEXT:    sd a1, 0(sp)
3703 ; RV64-NO-ATOMIC-NEXT:    mv a1, sp
3704 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
3705 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
3706 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
3707 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
3708 ; RV64-NO-ATOMIC-NEXT:    ld a1, 0(sp)
3709 ; RV64-NO-ATOMIC-NEXT:    bnez a0, .LBB52_4
3710 ; RV64-NO-ATOMIC-NEXT:  .LBB52_2: # %atomicrmw.start
3711 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
3712 ; RV64-NO-ATOMIC-NEXT:    mv a2, a1
3713 ; RV64-NO-ATOMIC-NEXT:    bltu a1, s1, .LBB52_1
3714 ; RV64-NO-ATOMIC-NEXT:  # %bb.3: # %atomicrmw.start
3715 ; RV64-NO-ATOMIC-NEXT:    # in Loop: Header=BB52_2 Depth=1
3716 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
3717 ; RV64-NO-ATOMIC-NEXT:    j .LBB52_1
3718 ; RV64-NO-ATOMIC-NEXT:  .LBB52_4: # %atomicrmw.end
3719 ; RV64-NO-ATOMIC-NEXT:    mv a0, a1
3720 ; RV64-NO-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3721 ; RV64-NO-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3722 ; RV64-NO-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3723 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 32
3724 ; RV64-NO-ATOMIC-NEXT:    ret
3726 ; RV64-ATOMIC-LABEL: rmw64_umin_seq_cst:
3727 ; RV64-ATOMIC:       # %bb.0:
3728 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3729 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3730 ; RV64-ATOMIC-NEXT:    li a1, 1
3731 ; RV64-ATOMIC-NEXT:    call __sync_fetch_and_umin_8
3732 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3733 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3734 ; RV64-ATOMIC-NEXT:    ret
3736 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_umin_seq_cst:
3737 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3738 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3739 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3740 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3741 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_fetch_and_umin_8
3742 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3743 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3744 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3745   %v = atomicrmw umin ptr %p, i64 1 seq_cst, align 8
3746   ret i64 %v
3749 define i64 @rmw64_xchg_seq_cst(ptr %p) nounwind {
3750 ; RV32-LABEL: rmw64_xchg_seq_cst:
3751 ; RV32:       # %bb.0:
3752 ; RV32-NEXT:    addi sp, sp, -16
3753 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3754 ; RV32-NEXT:    li a1, 1
3755 ; RV32-NEXT:    li a3, 5
3756 ; RV32-NEXT:    li a2, 0
3757 ; RV32-NEXT:    call __atomic_exchange_8
3758 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3759 ; RV32-NEXT:    addi sp, sp, 16
3760 ; RV32-NEXT:    ret
3762 ; RV64-NO-ATOMIC-LABEL: rmw64_xchg_seq_cst:
3763 ; RV64-NO-ATOMIC:       # %bb.0:
3764 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
3765 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3766 ; RV64-NO-ATOMIC-NEXT:    li a1, 1
3767 ; RV64-NO-ATOMIC-NEXT:    li a2, 5
3768 ; RV64-NO-ATOMIC-NEXT:    call __atomic_exchange_8
3769 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3770 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
3771 ; RV64-NO-ATOMIC-NEXT:    ret
3773 ; RV64-ATOMIC-LABEL: rmw64_xchg_seq_cst:
3774 ; RV64-ATOMIC:       # %bb.0:
3775 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
3776 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3777 ; RV64-ATOMIC-NEXT:    li a1, 1
3778 ; RV64-ATOMIC-NEXT:    call __sync_lock_test_and_set_8
3779 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3780 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
3781 ; RV64-ATOMIC-NEXT:    ret
3783 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_xchg_seq_cst:
3784 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3785 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
3786 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3787 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 1
3788 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_lock_test_and_set_8
3789 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3790 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
3791 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3792   %v = atomicrmw xchg ptr %p, i64 1 seq_cst, align 8
3793   ret i64 %v
3796 define double @rmw64_fadd_seq_cst(ptr %p) nounwind {
3797 ; RV32-LABEL: rmw64_fadd_seq_cst:
3798 ; RV32:       # %bb.0:
3799 ; RV32-NEXT:    addi sp, sp, -32
3800 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3801 ; RV32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3802 ; RV32-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3803 ; RV32-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3804 ; RV32-NEXT:    mv s0, a0
3805 ; RV32-NEXT:    lw s1, 4(a0)
3806 ; RV32-NEXT:    lw s2, 0(a0)
3807 ; RV32-NEXT:  .LBB54_1: # %atomicrmw.start
3808 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
3809 ; RV32-NEXT:    lui a3, 261888
3810 ; RV32-NEXT:    mv a0, s2
3811 ; RV32-NEXT:    mv a1, s1
3812 ; RV32-NEXT:    li a2, 0
3813 ; RV32-NEXT:    call __adddf3
3814 ; RV32-NEXT:    mv a2, a0
3815 ; RV32-NEXT:    mv a3, a1
3816 ; RV32-NEXT:    sw s2, 8(sp)
3817 ; RV32-NEXT:    sw s1, 12(sp)
3818 ; RV32-NEXT:    addi a1, sp, 8
3819 ; RV32-NEXT:    li a4, 5
3820 ; RV32-NEXT:    li a5, 5
3821 ; RV32-NEXT:    mv a0, s0
3822 ; RV32-NEXT:    call __atomic_compare_exchange_8
3823 ; RV32-NEXT:    lw s1, 12(sp)
3824 ; RV32-NEXT:    lw s2, 8(sp)
3825 ; RV32-NEXT:    beqz a0, .LBB54_1
3826 ; RV32-NEXT:  # %bb.2: # %atomicrmw.end
3827 ; RV32-NEXT:    mv a0, s2
3828 ; RV32-NEXT:    mv a1, s1
3829 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3830 ; RV32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3831 ; RV32-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3832 ; RV32-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3833 ; RV32-NEXT:    addi sp, sp, 32
3834 ; RV32-NEXT:    ret
3836 ; RV64-NO-ATOMIC-LABEL: rmw64_fadd_seq_cst:
3837 ; RV64-NO-ATOMIC:       # %bb.0:
3838 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -48
3839 ; RV64-NO-ATOMIC-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3840 ; RV64-NO-ATOMIC-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3841 ; RV64-NO-ATOMIC-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3842 ; RV64-NO-ATOMIC-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3843 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
3844 ; RV64-NO-ATOMIC-NEXT:    ld s2, 0(a0)
3845 ; RV64-NO-ATOMIC-NEXT:    li s1, 1023
3846 ; RV64-NO-ATOMIC-NEXT:    slli s1, s1, 52
3847 ; RV64-NO-ATOMIC-NEXT:  .LBB54_1: # %atomicrmw.start
3848 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
3849 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
3850 ; RV64-NO-ATOMIC-NEXT:    mv a1, s1
3851 ; RV64-NO-ATOMIC-NEXT:    call __adddf3
3852 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
3853 ; RV64-NO-ATOMIC-NEXT:    sd s2, 8(sp)
3854 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 8
3855 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
3856 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
3857 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
3858 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
3859 ; RV64-NO-ATOMIC-NEXT:    ld s2, 8(sp)
3860 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB54_1
3861 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
3862 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
3863 ; RV64-NO-ATOMIC-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3864 ; RV64-NO-ATOMIC-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3865 ; RV64-NO-ATOMIC-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3866 ; RV64-NO-ATOMIC-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3867 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 48
3868 ; RV64-NO-ATOMIC-NEXT:    ret
3870 ; RV64-ATOMIC-LABEL: rmw64_fadd_seq_cst:
3871 ; RV64-ATOMIC:       # %bb.0:
3872 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
3873 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3874 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3875 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3876 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
3877 ; RV64-ATOMIC-NEXT:    mv s0, a0
3878 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
3879 ; RV64-ATOMIC-NEXT:    li s1, 1023
3880 ; RV64-ATOMIC-NEXT:    slli s1, s1, 52
3881 ; RV64-ATOMIC-NEXT:  .LBB54_1: # %atomicrmw.start
3882 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
3883 ; RV64-ATOMIC-NEXT:    mv s2, a0
3884 ; RV64-ATOMIC-NEXT:    mv a1, s1
3885 ; RV64-ATOMIC-NEXT:    call __adddf3
3886 ; RV64-ATOMIC-NEXT:    mv a2, a0
3887 ; RV64-ATOMIC-NEXT:    mv a0, s0
3888 ; RV64-ATOMIC-NEXT:    mv a1, s2
3889 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_8
3890 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB54_1
3891 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
3892 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3893 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3894 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3895 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
3896 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
3897 ; RV64-ATOMIC-NEXT:    ret
3899 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_fadd_seq_cst:
3900 ; RV64-ATOMIC-TRAILING:       # %bb.0:
3901 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
3902 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3903 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3904 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3905 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
3906 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
3907 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
3908 ; RV64-ATOMIC-TRAILING-NEXT:    li s1, 1023
3909 ; RV64-ATOMIC-TRAILING-NEXT:    slli s1, s1, 52
3910 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB54_1: # %atomicrmw.start
3911 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
3912 ; RV64-ATOMIC-TRAILING-NEXT:    mv s2, a0
3913 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s1
3914 ; RV64-ATOMIC-TRAILING-NEXT:    call __adddf3
3915 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
3916 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
3917 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
3918 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_8
3919 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB54_1
3920 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
3921 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3922 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3923 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3924 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
3925 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
3926 ; RV64-ATOMIC-TRAILING-NEXT:    ret
3927   %v = atomicrmw fadd ptr %p, double 1.0 seq_cst, align 8
3928   ret double %v
3931 define double @rmw64_fsub_seq_cst(ptr %p) nounwind {
3932 ; RV32-LABEL: rmw64_fsub_seq_cst:
3933 ; RV32:       # %bb.0:
3934 ; RV32-NEXT:    addi sp, sp, -32
3935 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3936 ; RV32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3937 ; RV32-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3938 ; RV32-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3939 ; RV32-NEXT:    mv s0, a0
3940 ; RV32-NEXT:    lw s1, 4(a0)
3941 ; RV32-NEXT:    lw s2, 0(a0)
3942 ; RV32-NEXT:  .LBB55_1: # %atomicrmw.start
3943 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
3944 ; RV32-NEXT:    lui a3, 786176
3945 ; RV32-NEXT:    mv a0, s2
3946 ; RV32-NEXT:    mv a1, s1
3947 ; RV32-NEXT:    li a2, 0
3948 ; RV32-NEXT:    call __adddf3
3949 ; RV32-NEXT:    mv a2, a0
3950 ; RV32-NEXT:    mv a3, a1
3951 ; RV32-NEXT:    sw s2, 8(sp)
3952 ; RV32-NEXT:    sw s1, 12(sp)
3953 ; RV32-NEXT:    addi a1, sp, 8
3954 ; RV32-NEXT:    li a4, 5
3955 ; RV32-NEXT:    li a5, 5
3956 ; RV32-NEXT:    mv a0, s0
3957 ; RV32-NEXT:    call __atomic_compare_exchange_8
3958 ; RV32-NEXT:    lw s1, 12(sp)
3959 ; RV32-NEXT:    lw s2, 8(sp)
3960 ; RV32-NEXT:    beqz a0, .LBB55_1
3961 ; RV32-NEXT:  # %bb.2: # %atomicrmw.end
3962 ; RV32-NEXT:    mv a0, s2
3963 ; RV32-NEXT:    mv a1, s1
3964 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3965 ; RV32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3966 ; RV32-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3967 ; RV32-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3968 ; RV32-NEXT:    addi sp, sp, 32
3969 ; RV32-NEXT:    ret
3971 ; RV64-NO-ATOMIC-LABEL: rmw64_fsub_seq_cst:
3972 ; RV64-NO-ATOMIC:       # %bb.0:
3973 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -48
3974 ; RV64-NO-ATOMIC-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3975 ; RV64-NO-ATOMIC-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3976 ; RV64-NO-ATOMIC-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3977 ; RV64-NO-ATOMIC-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3978 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
3979 ; RV64-NO-ATOMIC-NEXT:    ld s2, 0(a0)
3980 ; RV64-NO-ATOMIC-NEXT:    li s1, -1025
3981 ; RV64-NO-ATOMIC-NEXT:    slli s1, s1, 52
3982 ; RV64-NO-ATOMIC-NEXT:  .LBB55_1: # %atomicrmw.start
3983 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
3984 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
3985 ; RV64-NO-ATOMIC-NEXT:    mv a1, s1
3986 ; RV64-NO-ATOMIC-NEXT:    call __adddf3
3987 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
3988 ; RV64-NO-ATOMIC-NEXT:    sd s2, 8(sp)
3989 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 8
3990 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
3991 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
3992 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
3993 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
3994 ; RV64-NO-ATOMIC-NEXT:    ld s2, 8(sp)
3995 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB55_1
3996 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
3997 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
3998 ; RV64-NO-ATOMIC-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3999 ; RV64-NO-ATOMIC-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4000 ; RV64-NO-ATOMIC-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4001 ; RV64-NO-ATOMIC-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4002 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 48
4003 ; RV64-NO-ATOMIC-NEXT:    ret
4005 ; RV64-ATOMIC-LABEL: rmw64_fsub_seq_cst:
4006 ; RV64-ATOMIC:       # %bb.0:
4007 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
4008 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4009 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
4010 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
4011 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
4012 ; RV64-ATOMIC-NEXT:    mv s0, a0
4013 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
4014 ; RV64-ATOMIC-NEXT:    li s1, -1025
4015 ; RV64-ATOMIC-NEXT:    slli s1, s1, 52
4016 ; RV64-ATOMIC-NEXT:  .LBB55_1: # %atomicrmw.start
4017 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
4018 ; RV64-ATOMIC-NEXT:    mv s2, a0
4019 ; RV64-ATOMIC-NEXT:    mv a1, s1
4020 ; RV64-ATOMIC-NEXT:    call __adddf3
4021 ; RV64-ATOMIC-NEXT:    mv a2, a0
4022 ; RV64-ATOMIC-NEXT:    mv a0, s0
4023 ; RV64-ATOMIC-NEXT:    mv a1, s2
4024 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_8
4025 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB55_1
4026 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
4027 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4028 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
4029 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
4030 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
4031 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
4032 ; RV64-ATOMIC-NEXT:    ret
4034 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_fsub_seq_cst:
4035 ; RV64-ATOMIC-TRAILING:       # %bb.0:
4036 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
4037 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4038 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
4039 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
4040 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
4041 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
4042 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
4043 ; RV64-ATOMIC-TRAILING-NEXT:    li s1, -1025
4044 ; RV64-ATOMIC-TRAILING-NEXT:    slli s1, s1, 52
4045 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB55_1: # %atomicrmw.start
4046 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
4047 ; RV64-ATOMIC-TRAILING-NEXT:    mv s2, a0
4048 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s1
4049 ; RV64-ATOMIC-TRAILING-NEXT:    call __adddf3
4050 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
4051 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
4052 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
4053 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_8
4054 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB55_1
4055 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
4056 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4057 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
4058 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
4059 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
4060 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
4061 ; RV64-ATOMIC-TRAILING-NEXT:    ret
4062   %v = atomicrmw fsub ptr %p, double 1.0 seq_cst, align 8
4063   ret double %v
4066 define double @rmw64_fmin_seq_cst(ptr %p) nounwind {
4067 ; RV32-LABEL: rmw64_fmin_seq_cst:
4068 ; RV32:       # %bb.0:
4069 ; RV32-NEXT:    addi sp, sp, -32
4070 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4071 ; RV32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4072 ; RV32-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4073 ; RV32-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4074 ; RV32-NEXT:    mv s0, a0
4075 ; RV32-NEXT:    lw s1, 4(a0)
4076 ; RV32-NEXT:    lw s2, 0(a0)
4077 ; RV32-NEXT:  .LBB56_1: # %atomicrmw.start
4078 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
4079 ; RV32-NEXT:    lui a3, 261888
4080 ; RV32-NEXT:    mv a0, s2
4081 ; RV32-NEXT:    mv a1, s1
4082 ; RV32-NEXT:    li a2, 0
4083 ; RV32-NEXT:    call fmin
4084 ; RV32-NEXT:    mv a2, a0
4085 ; RV32-NEXT:    mv a3, a1
4086 ; RV32-NEXT:    sw s2, 8(sp)
4087 ; RV32-NEXT:    sw s1, 12(sp)
4088 ; RV32-NEXT:    addi a1, sp, 8
4089 ; RV32-NEXT:    li a4, 5
4090 ; RV32-NEXT:    li a5, 5
4091 ; RV32-NEXT:    mv a0, s0
4092 ; RV32-NEXT:    call __atomic_compare_exchange_8
4093 ; RV32-NEXT:    lw s1, 12(sp)
4094 ; RV32-NEXT:    lw s2, 8(sp)
4095 ; RV32-NEXT:    beqz a0, .LBB56_1
4096 ; RV32-NEXT:  # %bb.2: # %atomicrmw.end
4097 ; RV32-NEXT:    mv a0, s2
4098 ; RV32-NEXT:    mv a1, s1
4099 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4100 ; RV32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4101 ; RV32-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4102 ; RV32-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4103 ; RV32-NEXT:    addi sp, sp, 32
4104 ; RV32-NEXT:    ret
4106 ; RV64-NO-ATOMIC-LABEL: rmw64_fmin_seq_cst:
4107 ; RV64-NO-ATOMIC:       # %bb.0:
4108 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -48
4109 ; RV64-NO-ATOMIC-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4110 ; RV64-NO-ATOMIC-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4111 ; RV64-NO-ATOMIC-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4112 ; RV64-NO-ATOMIC-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4113 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
4114 ; RV64-NO-ATOMIC-NEXT:    ld s2, 0(a0)
4115 ; RV64-NO-ATOMIC-NEXT:    li s1, 1023
4116 ; RV64-NO-ATOMIC-NEXT:    slli s1, s1, 52
4117 ; RV64-NO-ATOMIC-NEXT:  .LBB56_1: # %atomicrmw.start
4118 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
4119 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
4120 ; RV64-NO-ATOMIC-NEXT:    mv a1, s1
4121 ; RV64-NO-ATOMIC-NEXT:    call fmin
4122 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
4123 ; RV64-NO-ATOMIC-NEXT:    sd s2, 8(sp)
4124 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 8
4125 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
4126 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
4127 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
4128 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
4129 ; RV64-NO-ATOMIC-NEXT:    ld s2, 8(sp)
4130 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB56_1
4131 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
4132 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
4133 ; RV64-NO-ATOMIC-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4134 ; RV64-NO-ATOMIC-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4135 ; RV64-NO-ATOMIC-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4136 ; RV64-NO-ATOMIC-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4137 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 48
4138 ; RV64-NO-ATOMIC-NEXT:    ret
4140 ; RV64-ATOMIC-LABEL: rmw64_fmin_seq_cst:
4141 ; RV64-ATOMIC:       # %bb.0:
4142 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
4143 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4144 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
4145 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
4146 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
4147 ; RV64-ATOMIC-NEXT:    mv s0, a0
4148 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
4149 ; RV64-ATOMIC-NEXT:    li s1, 1023
4150 ; RV64-ATOMIC-NEXT:    slli s1, s1, 52
4151 ; RV64-ATOMIC-NEXT:  .LBB56_1: # %atomicrmw.start
4152 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
4153 ; RV64-ATOMIC-NEXT:    mv s2, a0
4154 ; RV64-ATOMIC-NEXT:    mv a1, s1
4155 ; RV64-ATOMIC-NEXT:    call fmin
4156 ; RV64-ATOMIC-NEXT:    mv a2, a0
4157 ; RV64-ATOMIC-NEXT:    mv a0, s0
4158 ; RV64-ATOMIC-NEXT:    mv a1, s2
4159 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_8
4160 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB56_1
4161 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
4162 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4163 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
4164 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
4165 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
4166 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
4167 ; RV64-ATOMIC-NEXT:    ret
4169 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_fmin_seq_cst:
4170 ; RV64-ATOMIC-TRAILING:       # %bb.0:
4171 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
4172 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4173 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
4174 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
4175 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
4176 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
4177 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
4178 ; RV64-ATOMIC-TRAILING-NEXT:    li s1, 1023
4179 ; RV64-ATOMIC-TRAILING-NEXT:    slli s1, s1, 52
4180 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB56_1: # %atomicrmw.start
4181 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
4182 ; RV64-ATOMIC-TRAILING-NEXT:    mv s2, a0
4183 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s1
4184 ; RV64-ATOMIC-TRAILING-NEXT:    call fmin
4185 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
4186 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
4187 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
4188 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_8
4189 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB56_1
4190 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
4191 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4192 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
4193 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
4194 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
4195 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
4196 ; RV64-ATOMIC-TRAILING-NEXT:    ret
4197   %v = atomicrmw fmin ptr %p, double 1.0 seq_cst, align 8
4198   ret double %v
4201 define double @rmw64_fmax_seq_cst(ptr %p) nounwind {
4202 ; RV32-LABEL: rmw64_fmax_seq_cst:
4203 ; RV32:       # %bb.0:
4204 ; RV32-NEXT:    addi sp, sp, -32
4205 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4206 ; RV32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4207 ; RV32-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4208 ; RV32-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4209 ; RV32-NEXT:    mv s0, a0
4210 ; RV32-NEXT:    lw s1, 4(a0)
4211 ; RV32-NEXT:    lw s2, 0(a0)
4212 ; RV32-NEXT:  .LBB57_1: # %atomicrmw.start
4213 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
4214 ; RV32-NEXT:    lui a3, 261888
4215 ; RV32-NEXT:    mv a0, s2
4216 ; RV32-NEXT:    mv a1, s1
4217 ; RV32-NEXT:    li a2, 0
4218 ; RV32-NEXT:    call fmax
4219 ; RV32-NEXT:    mv a2, a0
4220 ; RV32-NEXT:    mv a3, a1
4221 ; RV32-NEXT:    sw s2, 8(sp)
4222 ; RV32-NEXT:    sw s1, 12(sp)
4223 ; RV32-NEXT:    addi a1, sp, 8
4224 ; RV32-NEXT:    li a4, 5
4225 ; RV32-NEXT:    li a5, 5
4226 ; RV32-NEXT:    mv a0, s0
4227 ; RV32-NEXT:    call __atomic_compare_exchange_8
4228 ; RV32-NEXT:    lw s1, 12(sp)
4229 ; RV32-NEXT:    lw s2, 8(sp)
4230 ; RV32-NEXT:    beqz a0, .LBB57_1
4231 ; RV32-NEXT:  # %bb.2: # %atomicrmw.end
4232 ; RV32-NEXT:    mv a0, s2
4233 ; RV32-NEXT:    mv a1, s1
4234 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4235 ; RV32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4236 ; RV32-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4237 ; RV32-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4238 ; RV32-NEXT:    addi sp, sp, 32
4239 ; RV32-NEXT:    ret
4241 ; RV64-NO-ATOMIC-LABEL: rmw64_fmax_seq_cst:
4242 ; RV64-NO-ATOMIC:       # %bb.0:
4243 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -48
4244 ; RV64-NO-ATOMIC-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4245 ; RV64-NO-ATOMIC-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4246 ; RV64-NO-ATOMIC-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4247 ; RV64-NO-ATOMIC-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4248 ; RV64-NO-ATOMIC-NEXT:    mv s0, a0
4249 ; RV64-NO-ATOMIC-NEXT:    ld s2, 0(a0)
4250 ; RV64-NO-ATOMIC-NEXT:    li s1, 1023
4251 ; RV64-NO-ATOMIC-NEXT:    slli s1, s1, 52
4252 ; RV64-NO-ATOMIC-NEXT:  .LBB57_1: # %atomicrmw.start
4253 ; RV64-NO-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
4254 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
4255 ; RV64-NO-ATOMIC-NEXT:    mv a1, s1
4256 ; RV64-NO-ATOMIC-NEXT:    call fmax
4257 ; RV64-NO-ATOMIC-NEXT:    mv a2, a0
4258 ; RV64-NO-ATOMIC-NEXT:    sd s2, 8(sp)
4259 ; RV64-NO-ATOMIC-NEXT:    addi a1, sp, 8
4260 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
4261 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
4262 ; RV64-NO-ATOMIC-NEXT:    mv a0, s0
4263 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
4264 ; RV64-NO-ATOMIC-NEXT:    ld s2, 8(sp)
4265 ; RV64-NO-ATOMIC-NEXT:    beqz a0, .LBB57_1
4266 ; RV64-NO-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
4267 ; RV64-NO-ATOMIC-NEXT:    mv a0, s2
4268 ; RV64-NO-ATOMIC-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4269 ; RV64-NO-ATOMIC-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4270 ; RV64-NO-ATOMIC-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4271 ; RV64-NO-ATOMIC-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4272 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 48
4273 ; RV64-NO-ATOMIC-NEXT:    ret
4275 ; RV64-ATOMIC-LABEL: rmw64_fmax_seq_cst:
4276 ; RV64-ATOMIC:       # %bb.0:
4277 ; RV64-ATOMIC-NEXT:    addi sp, sp, -32
4278 ; RV64-ATOMIC-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4279 ; RV64-ATOMIC-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
4280 ; RV64-ATOMIC-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
4281 ; RV64-ATOMIC-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
4282 ; RV64-ATOMIC-NEXT:    mv s0, a0
4283 ; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
4284 ; RV64-ATOMIC-NEXT:    li s1, 1023
4285 ; RV64-ATOMIC-NEXT:    slli s1, s1, 52
4286 ; RV64-ATOMIC-NEXT:  .LBB57_1: # %atomicrmw.start
4287 ; RV64-ATOMIC-NEXT:    # =>This Inner Loop Header: Depth=1
4288 ; RV64-ATOMIC-NEXT:    mv s2, a0
4289 ; RV64-ATOMIC-NEXT:    mv a1, s1
4290 ; RV64-ATOMIC-NEXT:    call fmax
4291 ; RV64-ATOMIC-NEXT:    mv a2, a0
4292 ; RV64-ATOMIC-NEXT:    mv a0, s0
4293 ; RV64-ATOMIC-NEXT:    mv a1, s2
4294 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_8
4295 ; RV64-ATOMIC-NEXT:    bne a0, s2, .LBB57_1
4296 ; RV64-ATOMIC-NEXT:  # %bb.2: # %atomicrmw.end
4297 ; RV64-ATOMIC-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4298 ; RV64-ATOMIC-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
4299 ; RV64-ATOMIC-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
4300 ; RV64-ATOMIC-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
4301 ; RV64-ATOMIC-NEXT:    addi sp, sp, 32
4302 ; RV64-ATOMIC-NEXT:    ret
4304 ; RV64-ATOMIC-TRAILING-LABEL: rmw64_fmax_seq_cst:
4305 ; RV64-ATOMIC-TRAILING:       # %bb.0:
4306 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -32
4307 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4308 ; RV64-ATOMIC-TRAILING-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
4309 ; RV64-ATOMIC-TRAILING-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
4310 ; RV64-ATOMIC-TRAILING-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
4311 ; RV64-ATOMIC-TRAILING-NEXT:    mv s0, a0
4312 ; RV64-ATOMIC-TRAILING-NEXT:    ld a0, 0(a0)
4313 ; RV64-ATOMIC-TRAILING-NEXT:    li s1, 1023
4314 ; RV64-ATOMIC-TRAILING-NEXT:    slli s1, s1, 52
4315 ; RV64-ATOMIC-TRAILING-NEXT:  .LBB57_1: # %atomicrmw.start
4316 ; RV64-ATOMIC-TRAILING-NEXT:    # =>This Inner Loop Header: Depth=1
4317 ; RV64-ATOMIC-TRAILING-NEXT:    mv s2, a0
4318 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s1
4319 ; RV64-ATOMIC-TRAILING-NEXT:    call fmax
4320 ; RV64-ATOMIC-TRAILING-NEXT:    mv a2, a0
4321 ; RV64-ATOMIC-TRAILING-NEXT:    mv a0, s0
4322 ; RV64-ATOMIC-TRAILING-NEXT:    mv a1, s2
4323 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_8
4324 ; RV64-ATOMIC-TRAILING-NEXT:    bne a0, s2, .LBB57_1
4325 ; RV64-ATOMIC-TRAILING-NEXT:  # %bb.2: # %atomicrmw.end
4326 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4327 ; RV64-ATOMIC-TRAILING-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
4328 ; RV64-ATOMIC-TRAILING-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
4329 ; RV64-ATOMIC-TRAILING-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
4330 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 32
4331 ; RV64-ATOMIC-TRAILING-NEXT:    ret
4332   %v = atomicrmw fmax ptr %p, double 1.0 seq_cst, align 8
4333   ret double %v
4336 define i64 @cmpxchg64_monotonic(ptr %p) nounwind {
4337 ; RV32-LABEL: cmpxchg64_monotonic:
4338 ; RV32:       # %bb.0:
4339 ; RV32-NEXT:    addi sp, sp, -16
4340 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4341 ; RV32-NEXT:    sw zero, 4(sp)
4342 ; RV32-NEXT:    sw zero, 0(sp)
4343 ; RV32-NEXT:    mv a1, sp
4344 ; RV32-NEXT:    li a2, 1
4345 ; RV32-NEXT:    li a3, 0
4346 ; RV32-NEXT:    li a4, 0
4347 ; RV32-NEXT:    li a5, 0
4348 ; RV32-NEXT:    call __atomic_compare_exchange_8
4349 ; RV32-NEXT:    lw a1, 4(sp)
4350 ; RV32-NEXT:    lw a0, 0(sp)
4351 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4352 ; RV32-NEXT:    addi sp, sp, 16
4353 ; RV32-NEXT:    ret
4355 ; RV64-NO-ATOMIC-LABEL: cmpxchg64_monotonic:
4356 ; RV64-NO-ATOMIC:       # %bb.0:
4357 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
4358 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4359 ; RV64-NO-ATOMIC-NEXT:    sd zero, 0(sp)
4360 ; RV64-NO-ATOMIC-NEXT:    mv a1, sp
4361 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
4362 ; RV64-NO-ATOMIC-NEXT:    li a3, 0
4363 ; RV64-NO-ATOMIC-NEXT:    li a4, 0
4364 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
4365 ; RV64-NO-ATOMIC-NEXT:    ld a0, 0(sp)
4366 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4367 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
4368 ; RV64-NO-ATOMIC-NEXT:    ret
4370 ; RV64-ATOMIC-LABEL: cmpxchg64_monotonic:
4371 ; RV64-ATOMIC:       # %bb.0:
4372 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
4373 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4374 ; RV64-ATOMIC-NEXT:    li a2, 1
4375 ; RV64-ATOMIC-NEXT:    li a1, 0
4376 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_8
4377 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4378 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
4379 ; RV64-ATOMIC-NEXT:    ret
4381 ; RV64-ATOMIC-TRAILING-LABEL: cmpxchg64_monotonic:
4382 ; RV64-ATOMIC-TRAILING:       # %bb.0:
4383 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
4384 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4385 ; RV64-ATOMIC-TRAILING-NEXT:    li a2, 1
4386 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 0
4387 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_8
4388 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4389 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
4390 ; RV64-ATOMIC-TRAILING-NEXT:    ret
4391   %res = cmpxchg ptr %p, i64 0, i64 1 monotonic monotonic
4392   %res.0 = extractvalue { i64, i1 } %res, 0
4393   ret i64 %res.0
4396 define i64 @cmpxchg64_seq_cst(ptr %p) nounwind {
4397 ; RV32-LABEL: cmpxchg64_seq_cst:
4398 ; RV32:       # %bb.0:
4399 ; RV32-NEXT:    addi sp, sp, -16
4400 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4401 ; RV32-NEXT:    sw zero, 4(sp)
4402 ; RV32-NEXT:    sw zero, 0(sp)
4403 ; RV32-NEXT:    mv a1, sp
4404 ; RV32-NEXT:    li a2, 1
4405 ; RV32-NEXT:    li a4, 5
4406 ; RV32-NEXT:    li a5, 5
4407 ; RV32-NEXT:    li a3, 0
4408 ; RV32-NEXT:    call __atomic_compare_exchange_8
4409 ; RV32-NEXT:    lw a1, 4(sp)
4410 ; RV32-NEXT:    lw a0, 0(sp)
4411 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4412 ; RV32-NEXT:    addi sp, sp, 16
4413 ; RV32-NEXT:    ret
4415 ; RV64-NO-ATOMIC-LABEL: cmpxchg64_seq_cst:
4416 ; RV64-NO-ATOMIC:       # %bb.0:
4417 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, -16
4418 ; RV64-NO-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4419 ; RV64-NO-ATOMIC-NEXT:    sd zero, 0(sp)
4420 ; RV64-NO-ATOMIC-NEXT:    mv a1, sp
4421 ; RV64-NO-ATOMIC-NEXT:    li a2, 1
4422 ; RV64-NO-ATOMIC-NEXT:    li a3, 5
4423 ; RV64-NO-ATOMIC-NEXT:    li a4, 5
4424 ; RV64-NO-ATOMIC-NEXT:    call __atomic_compare_exchange_8
4425 ; RV64-NO-ATOMIC-NEXT:    ld a0, 0(sp)
4426 ; RV64-NO-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4427 ; RV64-NO-ATOMIC-NEXT:    addi sp, sp, 16
4428 ; RV64-NO-ATOMIC-NEXT:    ret
4430 ; RV64-ATOMIC-LABEL: cmpxchg64_seq_cst:
4431 ; RV64-ATOMIC:       # %bb.0:
4432 ; RV64-ATOMIC-NEXT:    addi sp, sp, -16
4433 ; RV64-ATOMIC-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4434 ; RV64-ATOMIC-NEXT:    li a2, 1
4435 ; RV64-ATOMIC-NEXT:    li a1, 0
4436 ; RV64-ATOMIC-NEXT:    call __sync_val_compare_and_swap_8
4437 ; RV64-ATOMIC-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4438 ; RV64-ATOMIC-NEXT:    addi sp, sp, 16
4439 ; RV64-ATOMIC-NEXT:    ret
4441 ; RV64-ATOMIC-TRAILING-LABEL: cmpxchg64_seq_cst:
4442 ; RV64-ATOMIC-TRAILING:       # %bb.0:
4443 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, -16
4444 ; RV64-ATOMIC-TRAILING-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4445 ; RV64-ATOMIC-TRAILING-NEXT:    li a2, 1
4446 ; RV64-ATOMIC-TRAILING-NEXT:    li a1, 0
4447 ; RV64-ATOMIC-TRAILING-NEXT:    call __sync_val_compare_and_swap_8
4448 ; RV64-ATOMIC-TRAILING-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4449 ; RV64-ATOMIC-TRAILING-NEXT:    addi sp, sp, 16
4450 ; RV64-ATOMIC-TRAILING-NEXT:    ret
4451   %res = cmpxchg ptr %p, i64 0, i64 1 seq_cst seq_cst
4452   %res.0 = extractvalue { i64, i1 } %res, 0
4453   ret i64 %res.0
4456 define i128 @load128(ptr %p) nounwind {
4457 ; RV32-LABEL: load128:
4458 ; RV32:       # %bb.0:
4459 ; RV32-NEXT:    addi sp, sp, -32
4460 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4461 ; RV32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4462 ; RV32-NEXT:    mv s0, a0
4463 ; RV32-NEXT:    li a0, 16
4464 ; RV32-NEXT:    addi a2, sp, 8
4465 ; RV32-NEXT:    li a3, 5
4466 ; RV32-NEXT:    call __atomic_load
4467 ; RV32-NEXT:    lw a0, 20(sp)
4468 ; RV32-NEXT:    lw a1, 16(sp)
4469 ; RV32-NEXT:    lw a2, 12(sp)
4470 ; RV32-NEXT:    lw a3, 8(sp)
4471 ; RV32-NEXT:    sw a0, 12(s0)
4472 ; RV32-NEXT:    sw a1, 8(s0)
4473 ; RV32-NEXT:    sw a2, 4(s0)
4474 ; RV32-NEXT:    sw a3, 0(s0)
4475 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4476 ; RV32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4477 ; RV32-NEXT:    addi sp, sp, 32
4478 ; RV32-NEXT:    ret
4480 ; RV64-LABEL: load128:
4481 ; RV64:       # %bb.0:
4482 ; RV64-NEXT:    addi sp, sp, -16
4483 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4484 ; RV64-NEXT:    li a1, 5
4485 ; RV64-NEXT:    call __atomic_load_16
4486 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4487 ; RV64-NEXT:    addi sp, sp, 16
4488 ; RV64-NEXT:    ret
4489   %v = load atomic i128, ptr %p seq_cst, align 16
4490   ret i128 %v
4493 define void @store128(ptr %p) nounwind {
4494 ; RV32-LABEL: store128:
4495 ; RV32:       # %bb.0:
4496 ; RV32-NEXT:    addi sp, sp, -32
4497 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4498 ; RV32-NEXT:    mv a1, a0
4499 ; RV32-NEXT:    sw zero, 20(sp)
4500 ; RV32-NEXT:    sw zero, 16(sp)
4501 ; RV32-NEXT:    sw zero, 12(sp)
4502 ; RV32-NEXT:    sw zero, 8(sp)
4503 ; RV32-NEXT:    li a0, 16
4504 ; RV32-NEXT:    addi a2, sp, 8
4505 ; RV32-NEXT:    li a3, 5
4506 ; RV32-NEXT:    call __atomic_store
4507 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4508 ; RV32-NEXT:    addi sp, sp, 32
4509 ; RV32-NEXT:    ret
4511 ; RV64-LABEL: store128:
4512 ; RV64:       # %bb.0:
4513 ; RV64-NEXT:    addi sp, sp, -16
4514 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4515 ; RV64-NEXT:    li a3, 5
4516 ; RV64-NEXT:    li a1, 0
4517 ; RV64-NEXT:    li a2, 0
4518 ; RV64-NEXT:    call __atomic_store_16
4519 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4520 ; RV64-NEXT:    addi sp, sp, 16
4521 ; RV64-NEXT:    ret
4522   store atomic i128 0, ptr %p seq_cst, align 16
4523   ret void
4526 define i128 @rmw128(ptr %p) nounwind {
4527 ; RV32-LABEL: rmw128:
4528 ; RV32:       # %bb.0:
4529 ; RV32-NEXT:    addi sp, sp, -48
4530 ; RV32-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill
4531 ; RV32-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill
4532 ; RV32-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill
4533 ; RV32-NEXT:    mv s0, a1
4534 ; RV32-NEXT:    lw a1, 12(a1)
4535 ; RV32-NEXT:    lw a2, 8(s0)
4536 ; RV32-NEXT:    lw a3, 4(s0)
4537 ; RV32-NEXT:    lw a4, 0(s0)
4538 ; RV32-NEXT:    mv s1, a0
4539 ; RV32-NEXT:  .LBB62_1: # %atomicrmw.start
4540 ; RV32-NEXT:    # =>This Inner Loop Header: Depth=1
4541 ; RV32-NEXT:    addi a0, a4, 1
4542 ; RV32-NEXT:    seqz a5, a0
4543 ; RV32-NEXT:    add a5, a3, a5
4544 ; RV32-NEXT:    or a6, a0, a5
4545 ; RV32-NEXT:    seqz a6, a6
4546 ; RV32-NEXT:    add a6, a2, a6
4547 ; RV32-NEXT:    sltu a7, a6, a2
4548 ; RV32-NEXT:    add a7, a1, a7
4549 ; RV32-NEXT:    sw a4, 16(sp)
4550 ; RV32-NEXT:    sw a3, 20(sp)
4551 ; RV32-NEXT:    sw a2, 24(sp)
4552 ; RV32-NEXT:    sw a1, 28(sp)
4553 ; RV32-NEXT:    sw a5, 4(sp)
4554 ; RV32-NEXT:    sw a0, 0(sp)
4555 ; RV32-NEXT:    sw a6, 8(sp)
4556 ; RV32-NEXT:    sw a7, 12(sp)
4557 ; RV32-NEXT:    li a0, 16
4558 ; RV32-NEXT:    addi a2, sp, 16
4559 ; RV32-NEXT:    mv a3, sp
4560 ; RV32-NEXT:    li a4, 5
4561 ; RV32-NEXT:    li a5, 5
4562 ; RV32-NEXT:    mv a1, s0
4563 ; RV32-NEXT:    call __atomic_compare_exchange
4564 ; RV32-NEXT:    lw a1, 28(sp)
4565 ; RV32-NEXT:    lw a2, 24(sp)
4566 ; RV32-NEXT:    lw a3, 20(sp)
4567 ; RV32-NEXT:    lw a4, 16(sp)
4568 ; RV32-NEXT:    beqz a0, .LBB62_1
4569 ; RV32-NEXT:  # %bb.2: # %atomicrmw.end
4570 ; RV32-NEXT:    sw a4, 0(s1)
4571 ; RV32-NEXT:    sw a3, 4(s1)
4572 ; RV32-NEXT:    sw a2, 8(s1)
4573 ; RV32-NEXT:    sw a1, 12(s1)
4574 ; RV32-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload
4575 ; RV32-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload
4576 ; RV32-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload
4577 ; RV32-NEXT:    addi sp, sp, 48
4578 ; RV32-NEXT:    ret
4580 ; RV64-LABEL: rmw128:
4581 ; RV64:       # %bb.0:
4582 ; RV64-NEXT:    addi sp, sp, -16
4583 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4584 ; RV64-NEXT:    li a1, 1
4585 ; RV64-NEXT:    li a3, 5
4586 ; RV64-NEXT:    li a2, 0
4587 ; RV64-NEXT:    call __atomic_fetch_add_16
4588 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4589 ; RV64-NEXT:    addi sp, sp, 16
4590 ; RV64-NEXT:    ret
4591   %v = atomicrmw add ptr %p, i128 1 seq_cst, align 16
4592   ret i128 %v
4595 define i128 @cmpxchg128(ptr %p) nounwind {
4596 ; RV32-LABEL: cmpxchg128:
4597 ; RV32:       # %bb.0:
4598 ; RV32-NEXT:    addi sp, sp, -48
4599 ; RV32-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill
4600 ; RV32-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill
4601 ; RV32-NEXT:    mv s0, a0
4602 ; RV32-NEXT:    sw zero, 36(sp)
4603 ; RV32-NEXT:    sw zero, 32(sp)
4604 ; RV32-NEXT:    sw zero, 28(sp)
4605 ; RV32-NEXT:    sw zero, 24(sp)
4606 ; RV32-NEXT:    sw zero, 20(sp)
4607 ; RV32-NEXT:    sw zero, 16(sp)
4608 ; RV32-NEXT:    sw zero, 12(sp)
4609 ; RV32-NEXT:    li a0, 1
4610 ; RV32-NEXT:    sw a0, 8(sp)
4611 ; RV32-NEXT:    li a0, 16
4612 ; RV32-NEXT:    addi a2, sp, 24
4613 ; RV32-NEXT:    addi a3, sp, 8
4614 ; RV32-NEXT:    li a4, 5
4615 ; RV32-NEXT:    li a5, 5
4616 ; RV32-NEXT:    call __atomic_compare_exchange
4617 ; RV32-NEXT:    lw a0, 36(sp)
4618 ; RV32-NEXT:    lw a1, 32(sp)
4619 ; RV32-NEXT:    lw a2, 28(sp)
4620 ; RV32-NEXT:    lw a3, 24(sp)
4621 ; RV32-NEXT:    sw a0, 12(s0)
4622 ; RV32-NEXT:    sw a1, 8(s0)
4623 ; RV32-NEXT:    sw a2, 4(s0)
4624 ; RV32-NEXT:    sw a3, 0(s0)
4625 ; RV32-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload
4626 ; RV32-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload
4627 ; RV32-NEXT:    addi sp, sp, 48
4628 ; RV32-NEXT:    ret
4630 ; RV64-LABEL: cmpxchg128:
4631 ; RV64:       # %bb.0:
4632 ; RV64-NEXT:    addi sp, sp, -32
4633 ; RV64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4634 ; RV64-NEXT:    sd zero, 8(sp)
4635 ; RV64-NEXT:    sd zero, 0(sp)
4636 ; RV64-NEXT:    mv a1, sp
4637 ; RV64-NEXT:    li a2, 1
4638 ; RV64-NEXT:    li a4, 5
4639 ; RV64-NEXT:    li a5, 5
4640 ; RV64-NEXT:    li a3, 0
4641 ; RV64-NEXT:    call __atomic_compare_exchange_16
4642 ; RV64-NEXT:    ld a1, 8(sp)
4643 ; RV64-NEXT:    ld a0, 0(sp)
4644 ; RV64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4645 ; RV64-NEXT:    addi sp, sp, 32
4646 ; RV64-NEXT:    ret
4647   %res = cmpxchg ptr %p, i128 0, i128 1 seq_cst seq_cst
4648   %res.0 = extractvalue { i128, i1 } %res, 0
4649   ret i128 %res.0