xref: /llvm-project/llvm/test/CodeGen/RISCV/forced-atomics.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
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
10
11define 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
21;
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
28;
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
35;
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
45;
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
52;
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
61}
62
63define 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
74;
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
80;
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
87;
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
98;
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
104;
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
113}
114
115define 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
126;
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
136;
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
146;
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
157;
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
167;
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
179}
180
181define 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
196;
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
207;
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
218;
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
233;
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
244;
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
258}
259
260define 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
270;
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
277;
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
284;
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
294;
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
301;
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
310}
311
312define 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
323;
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
329;
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
336;
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
347;
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
353;
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
362}
363
364define 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
375;
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
385;
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
395;
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
406;
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
416;
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
428}
429
430define 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
445;
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
456;
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
467;
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
482;
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
493;
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
507}
508
509define 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
519;
520; RV32-ATOMIC-LABEL: load32_unordered:
521; RV32-ATOMIC:       # %bb.0:
522; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
523; RV32-ATOMIC-NEXT:    ret
524;
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
529;
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
539;
540; RV64-ATOMIC-LABEL: load32_unordered:
541; RV64-ATOMIC:       # %bb.0:
542; RV64-ATOMIC-NEXT:    lw a0, 0(a0)
543; RV64-ATOMIC-NEXT:    ret
544;
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
551}
552
553define 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
563;
564; RV32-ATOMIC-LABEL: load32_monotonic:
565; RV32-ATOMIC:       # %bb.0:
566; RV32-ATOMIC-NEXT:    lw a0, 0(a0)
567; RV32-ATOMIC-NEXT:    ret
568;
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
573;
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
583;
584; RV64-ATOMIC-LABEL: load32_monotonic:
585; RV64-ATOMIC:       # %bb.0:
586; RV64-ATOMIC-NEXT:    lw a0, 0(a0)
587; RV64-ATOMIC-NEXT:    ret
588;
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
595}
596
597define 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
607;
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
613;
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
619;
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
629;
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
635;
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
643}
644
645define 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
655;
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
662;
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
669;
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
679;
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
686;
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
695}
696
697define 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
708;
709; RV32-ATOMIC-LABEL: store32_unordered:
710; RV32-ATOMIC:       # %bb.0:
711; RV32-ATOMIC-NEXT:    sw zero, 0(a0)
712; RV32-ATOMIC-NEXT:    ret
713;
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
718;
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
729;
730; RV64-ATOMIC-LABEL: store32_unordered:
731; RV64-ATOMIC:       # %bb.0:
732; RV64-ATOMIC-NEXT:    sw zero, 0(a0)
733; RV64-ATOMIC-NEXT:    ret
734;
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
741}
742
743define 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
754;
755; RV32-ATOMIC-LABEL: store32_monotonic:
756; RV32-ATOMIC:       # %bb.0:
757; RV32-ATOMIC-NEXT:    sw zero, 0(a0)
758; RV32-ATOMIC-NEXT:    ret
759;
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
764;
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
775;
776; RV64-ATOMIC-LABEL: store32_monotonic:
777; RV64-ATOMIC:       # %bb.0:
778; RV64-ATOMIC-NEXT:    sw zero, 0(a0)
779; RV64-ATOMIC-NEXT:    ret
780;
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
787}
788
789define 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
800;
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
806;
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
812;
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
823;
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
829;
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
837}
838
839define 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
850;
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
856;
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
863;
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
874;
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
880;
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
889}
890
891define 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
902;
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
912;
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
922;
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
933;
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
943;
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
955}
956
957define 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
968;
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
978;
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
988;
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
999;
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
1009;
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
1021}
1022
1023define 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
1034;
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
1044;
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
1054;
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
1065;
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
1075;
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
1087}
1088
1089define 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
1100;
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
1110;
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
1120;
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
1131;
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
1141;
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
1153}
1154
1155define 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
1166;
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
1176;
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
1186;
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
1197;
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
1207;
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
1219}
1220
1221define 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
1232;
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
1242;
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
1252;
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
1263;
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
1273;
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
1285}
1286
1287define 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
1298;
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
1308;
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
1318;
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
1329;
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
1339;
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
1351}
1352
1353define 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
1386;
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
1396;
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
1406;
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
1440;
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
1450;
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
1462}
1463
1464define 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
1500;
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
1510;
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
1520;
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
1556;
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
1566;
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
1578}
1579
1580define 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
1606;
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
1616;
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
1626;
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
1660;
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
1670;
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
1682}
1683
1684define 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
1720;
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
1730;
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
1740;
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
1776;
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
1786;
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
1798}
1799
1800define 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
1811;
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
1821;
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
1831;
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
1842;
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
1852;
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
1864}
1865
1866define 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
1896;
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
1921;
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
1946;
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
1976;
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
2006;
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
2038}
2039
2040define 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
2070;
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
2095;
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
2120;
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
2150;
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
2180;
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
2212}
2213
2214define 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
2244;
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
2269;
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
2294;
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
2324;
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
2354;
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
2386}
2387
2388define 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
2418;
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
2443;
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
2468;
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
2498;
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
2528;
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
2560}
2561
2562define 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
2577;
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
2588;
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
2599;
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
2614;
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
2625;
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
2639}
2640
2641define 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
2656;
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
2667;
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
2678;
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
2693;
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
2704;
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
2718}
2719
2720define 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
2730;
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
2740;
2741; RV64-ATOMIC-LABEL: load64_unordered:
2742; RV64-ATOMIC:       # %bb.0:
2743; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
2744; RV64-ATOMIC-NEXT:    ret
2745;
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
2752}
2753
2754define 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
2764;
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
2774;
2775; RV64-ATOMIC-LABEL: load64_monotonic:
2776; RV64-ATOMIC:       # %bb.0:
2777; RV64-ATOMIC-NEXT:    ld a0, 0(a0)
2778; RV64-ATOMIC-NEXT:    ret
2779;
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
2786}
2787
2788define 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
2798;
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
2808;
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
2814;
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
2822}
2823
2824define 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
2834;
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
2844;
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
2851;
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
2860}
2861
2862define 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
2874;
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
2885;
2886; RV64-ATOMIC-LABEL: store64_unordered:
2887; RV64-ATOMIC:       # %bb.0:
2888; RV64-ATOMIC-NEXT:    sd zero, 0(a0)
2889; RV64-ATOMIC-NEXT:    ret
2890;
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
2897}
2898
2899define 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
2911;
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
2922;
2923; RV64-ATOMIC-LABEL: store64_monotonic:
2924; RV64-ATOMIC:       # %bb.0:
2925; RV64-ATOMIC-NEXT:    sd zero, 0(a0)
2926; RV64-ATOMIC-NEXT:    ret
2927;
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
2934}
2935
2936define 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
2948;
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
2959;
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
2965;
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
2973}
2974
2975define 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
2987;
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
2998;
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
3004;
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
3013}
3014
3015define 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
3027;
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
3038;
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
3048;
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
3060}
3061
3062define 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
3074;
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
3085;
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
3095;
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
3107}
3108
3109define 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
3121;
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
3132;
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
3142;
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
3154}
3155
3156define 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
3168;
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
3179;
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
3189;
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
3201}
3202
3203define 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
3215;
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
3226;
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
3236;
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
3248}
3249
3250define 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
3262;
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
3273;
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
3283;
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
3295}
3296
3297define 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
3309;
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
3320;
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
3330;
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
3342}
3343
3344define 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 a4, 0(a0)
3352; RV32-NEXT:    lw a1, 4(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 a4, 0(sp)
3366; RV32-NEXT:    lw a1, 4(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
3392;
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
3425;
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
3435;
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
3447}
3448
3449define 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 a4, 0(a0)
3457; RV32-NEXT:    lw a1, 4(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 a4, 0(sp)
3471; RV32-NEXT:    lw a1, 4(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
3496;
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
3532;
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
3542;
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
3554}
3555
3556define 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 a4, 0(a0)
3564; RV32-NEXT:    lw a1, 4(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 a4, 0(sp)
3578; RV32-NEXT:    lw a1, 4(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
3598;
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
3624;
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
3634;
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
3646}
3647
3648define 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 a4, 0(a0)
3656; RV32-NEXT:    lw a1, 4(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 a4, 0(sp)
3670; RV32-NEXT:    lw a1, 4(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
3689;
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
3725;
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
3735;
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
3747}
3748
3749define 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
3761;
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
3772;
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
3782;
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
3794}
3795
3796define 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, 0(a0)
3806; RV32-NEXT:    lw s2, 4(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, s1
3811; RV32-NEXT:    mv a1, s2
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 s1, 8(sp)
3817; RV32-NEXT:    sw s2, 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, 8(sp)
3824; RV32-NEXT:    lw s2, 12(sp)
3825; RV32-NEXT:    beqz a0, .LBB54_1
3826; RV32-NEXT:  # %bb.2: # %atomicrmw.end
3827; RV32-NEXT:    mv a0, s1
3828; RV32-NEXT:    mv a1, s2
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
3835;
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
3869;
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
3898;
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
3929}
3930
3931define 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, 0(a0)
3941; RV32-NEXT:    lw s2, 4(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, s1
3946; RV32-NEXT:    mv a1, s2
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 s1, 8(sp)
3952; RV32-NEXT:    sw s2, 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, 8(sp)
3959; RV32-NEXT:    lw s2, 12(sp)
3960; RV32-NEXT:    beqz a0, .LBB55_1
3961; RV32-NEXT:  # %bb.2: # %atomicrmw.end
3962; RV32-NEXT:    mv a0, s1
3963; RV32-NEXT:    mv a1, s2
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
3970;
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
4004;
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
4033;
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
4064}
4065
4066define 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, 0(a0)
4076; RV32-NEXT:    lw s2, 4(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, s1
4081; RV32-NEXT:    mv a1, s2
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 s1, 8(sp)
4087; RV32-NEXT:    sw s2, 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, 8(sp)
4094; RV32-NEXT:    lw s2, 12(sp)
4095; RV32-NEXT:    beqz a0, .LBB56_1
4096; RV32-NEXT:  # %bb.2: # %atomicrmw.end
4097; RV32-NEXT:    mv a0, s1
4098; RV32-NEXT:    mv a1, s2
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
4105;
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
4139;
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
4168;
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
4199}
4200
4201define 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, 0(a0)
4211; RV32-NEXT:    lw s2, 4(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, s1
4216; RV32-NEXT:    mv a1, s2
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 s1, 8(sp)
4222; RV32-NEXT:    sw s2, 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, 8(sp)
4229; RV32-NEXT:    lw s2, 12(sp)
4230; RV32-NEXT:    beqz a0, .LBB57_1
4231; RV32-NEXT:  # %bb.2: # %atomicrmw.end
4232; RV32-NEXT:    mv a0, s1
4233; RV32-NEXT:    mv a1, s2
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
4240;
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
4274;
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
4303;
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
4334}
4335
4336define 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, 0(sp)
4342; RV32-NEXT:    sw zero, 4(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 a0, 0(sp)
4350; RV32-NEXT:    lw a1, 4(sp)
4351; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4352; RV32-NEXT:    addi sp, sp, 16
4353; RV32-NEXT:    ret
4354;
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
4369;
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
4380;
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
4394}
4395
4396define 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, 0(sp)
4402; RV32-NEXT:    sw zero, 4(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 a0, 0(sp)
4410; RV32-NEXT:    lw a1, 4(sp)
4411; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4412; RV32-NEXT:    addi sp, sp, 16
4413; RV32-NEXT:    ret
4414;
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
4429;
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
4440;
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
4454}
4455
4456define 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, 8(sp)
4468; RV32-NEXT:    lw a1, 12(sp)
4469; RV32-NEXT:    lw a2, 16(sp)
4470; RV32-NEXT:    lw a3, 20(sp)
4471; RV32-NEXT:    sw a0, 0(s0)
4472; RV32-NEXT:    sw a1, 4(s0)
4473; RV32-NEXT:    sw a2, 8(s0)
4474; RV32-NEXT:    sw a3, 12(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
4479;
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
4491}
4492
4493define 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, 8(sp)
4500; RV32-NEXT:    sw zero, 12(sp)
4501; RV32-NEXT:    sw zero, 16(sp)
4502; RV32-NEXT:    sw zero, 20(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
4510;
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
4524}
4525
4526define 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 a4, 0(a1)
4535; RV32-NEXT:    lw a3, 4(a1)
4536; RV32-NEXT:    lw a1, 8(a1)
4537; RV32-NEXT:    lw a2, 12(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:    sw a4, 16(sp)
4543; RV32-NEXT:    sw a3, 20(sp)
4544; RV32-NEXT:    sw a1, 24(sp)
4545; RV32-NEXT:    sw a2, 28(sp)
4546; RV32-NEXT:    seqz a4, a0
4547; RV32-NEXT:    add a3, a3, a4
4548; RV32-NEXT:    or a4, a0, a3
4549; RV32-NEXT:    seqz a4, a4
4550; RV32-NEXT:    add a4, a1, a4
4551; RV32-NEXT:    sltu a1, a4, a1
4552; RV32-NEXT:    add a1, a2, a1
4553; RV32-NEXT:    sw a0, 0(sp)
4554; RV32-NEXT:    sw a3, 4(sp)
4555; RV32-NEXT:    sw a4, 8(sp)
4556; RV32-NEXT:    sw a1, 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 a4, 16(sp)
4565; RV32-NEXT:    lw a3, 20(sp)
4566; RV32-NEXT:    lw a1, 24(sp)
4567; RV32-NEXT:    lw a2, 28(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 a1, 8(s1)
4573; RV32-NEXT:    sw a2, 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
4579;
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
4593}
4594
4595define 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, 24(sp)
4603; RV32-NEXT:    sw zero, 28(sp)
4604; RV32-NEXT:    sw zero, 32(sp)
4605; RV32-NEXT:    sw zero, 36(sp)
4606; RV32-NEXT:    li a0, 1
4607; RV32-NEXT:    sw a0, 8(sp)
4608; RV32-NEXT:    sw zero, 12(sp)
4609; RV32-NEXT:    sw zero, 16(sp)
4610; RV32-NEXT:    sw zero, 20(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, 24(sp)
4618; RV32-NEXT:    lw a1, 28(sp)
4619; RV32-NEXT:    lw a2, 32(sp)
4620; RV32-NEXT:    lw a3, 36(sp)
4621; RV32-NEXT:    sw a0, 0(s0)
4622; RV32-NEXT:    sw a1, 4(s0)
4623; RV32-NEXT:    sw a2, 8(s0)
4624; RV32-NEXT:    sw a3, 12(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
4629;
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, 0(sp)
4635; RV64-NEXT:    sd zero, 8(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 a0, 0(sp)
4643; RV64-NEXT:    ld a1, 8(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
4650}
4651