1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3; RUN:   | FileCheck -check-prefix=RV32I %s
4; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \
5; RUN:   | FileCheck -check-prefix=RV32IA %s
6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
7; RUN:   | FileCheck -check-prefix=RV64I %s
8; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \
9; RUN:   | FileCheck -check-prefix=RV64IA %s
10
11define i8 @atomicrmw_xchg_i8_monotonic(i8* %a, i8 %b) nounwind {
12; RV32I-LABEL: atomicrmw_xchg_i8_monotonic:
13; RV32I:       # %bb.0:
14; RV32I-NEXT:    addi sp, sp, -16
15; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
16; RV32I-NEXT:    li a2, 0
17; RV32I-NEXT:    call __atomic_exchange_1@plt
18; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
19; RV32I-NEXT:    addi sp, sp, 16
20; RV32I-NEXT:    ret
21;
22; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic:
23; RV32IA:       # %bb.0:
24; RV32IA-NEXT:    andi a2, a0, -4
25; RV32IA-NEXT:    slli a0, a0, 3
26; RV32IA-NEXT:    li a3, 255
27; RV32IA-NEXT:    sll a3, a3, a0
28; RV32IA-NEXT:    andi a1, a1, 255
29; RV32IA-NEXT:    sll a1, a1, a0
30; RV32IA-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
31; RV32IA-NEXT:    lr.w a4, (a2)
32; RV32IA-NEXT:    mv a5, a1
33; RV32IA-NEXT:    xor a5, a4, a5
34; RV32IA-NEXT:    and a5, a5, a3
35; RV32IA-NEXT:    xor a5, a4, a5
36; RV32IA-NEXT:    sc.w a5, a5, (a2)
37; RV32IA-NEXT:    bnez a5, .LBB0_1
38; RV32IA-NEXT:  # %bb.2:
39; RV32IA-NEXT:    srl a0, a4, a0
40; RV32IA-NEXT:    ret
41;
42; RV64I-LABEL: atomicrmw_xchg_i8_monotonic:
43; RV64I:       # %bb.0:
44; RV64I-NEXT:    addi sp, sp, -16
45; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
46; RV64I-NEXT:    li a2, 0
47; RV64I-NEXT:    call __atomic_exchange_1@plt
48; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
49; RV64I-NEXT:    addi sp, sp, 16
50; RV64I-NEXT:    ret
51;
52; RV64IA-LABEL: atomicrmw_xchg_i8_monotonic:
53; RV64IA:       # %bb.0:
54; RV64IA-NEXT:    andi a2, a0, -4
55; RV64IA-NEXT:    slliw a0, a0, 3
56; RV64IA-NEXT:    li a3, 255
57; RV64IA-NEXT:    sllw a3, a3, a0
58; RV64IA-NEXT:    andi a1, a1, 255
59; RV64IA-NEXT:    sllw a1, a1, a0
60; RV64IA-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
61; RV64IA-NEXT:    lr.w a4, (a2)
62; RV64IA-NEXT:    mv a5, a1
63; RV64IA-NEXT:    xor a5, a4, a5
64; RV64IA-NEXT:    and a5, a5, a3
65; RV64IA-NEXT:    xor a5, a4, a5
66; RV64IA-NEXT:    sc.w a5, a5, (a2)
67; RV64IA-NEXT:    bnez a5, .LBB0_1
68; RV64IA-NEXT:  # %bb.2:
69; RV64IA-NEXT:    srlw a0, a4, a0
70; RV64IA-NEXT:    ret
71  %1 = atomicrmw xchg i8* %a, i8 %b monotonic
72  ret i8 %1
73}
74
75define i8 @atomicrmw_xchg_i8_acquire(i8* %a, i8 %b) nounwind {
76; RV32I-LABEL: atomicrmw_xchg_i8_acquire:
77; RV32I:       # %bb.0:
78; RV32I-NEXT:    addi sp, sp, -16
79; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
80; RV32I-NEXT:    li a2, 2
81; RV32I-NEXT:    call __atomic_exchange_1@plt
82; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
83; RV32I-NEXT:    addi sp, sp, 16
84; RV32I-NEXT:    ret
85;
86; RV32IA-LABEL: atomicrmw_xchg_i8_acquire:
87; RV32IA:       # %bb.0:
88; RV32IA-NEXT:    andi a2, a0, -4
89; RV32IA-NEXT:    slli a0, a0, 3
90; RV32IA-NEXT:    li a3, 255
91; RV32IA-NEXT:    sll a3, a3, a0
92; RV32IA-NEXT:    andi a1, a1, 255
93; RV32IA-NEXT:    sll a1, a1, a0
94; RV32IA-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
95; RV32IA-NEXT:    lr.w.aq a4, (a2)
96; RV32IA-NEXT:    mv a5, a1
97; RV32IA-NEXT:    xor a5, a4, a5
98; RV32IA-NEXT:    and a5, a5, a3
99; RV32IA-NEXT:    xor a5, a4, a5
100; RV32IA-NEXT:    sc.w a5, a5, (a2)
101; RV32IA-NEXT:    bnez a5, .LBB1_1
102; RV32IA-NEXT:  # %bb.2:
103; RV32IA-NEXT:    srl a0, a4, a0
104; RV32IA-NEXT:    ret
105;
106; RV64I-LABEL: atomicrmw_xchg_i8_acquire:
107; RV64I:       # %bb.0:
108; RV64I-NEXT:    addi sp, sp, -16
109; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
110; RV64I-NEXT:    li a2, 2
111; RV64I-NEXT:    call __atomic_exchange_1@plt
112; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
113; RV64I-NEXT:    addi sp, sp, 16
114; RV64I-NEXT:    ret
115;
116; RV64IA-LABEL: atomicrmw_xchg_i8_acquire:
117; RV64IA:       # %bb.0:
118; RV64IA-NEXT:    andi a2, a0, -4
119; RV64IA-NEXT:    slliw a0, a0, 3
120; RV64IA-NEXT:    li a3, 255
121; RV64IA-NEXT:    sllw a3, a3, a0
122; RV64IA-NEXT:    andi a1, a1, 255
123; RV64IA-NEXT:    sllw a1, a1, a0
124; RV64IA-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
125; RV64IA-NEXT:    lr.w.aq a4, (a2)
126; RV64IA-NEXT:    mv a5, a1
127; RV64IA-NEXT:    xor a5, a4, a5
128; RV64IA-NEXT:    and a5, a5, a3
129; RV64IA-NEXT:    xor a5, a4, a5
130; RV64IA-NEXT:    sc.w a5, a5, (a2)
131; RV64IA-NEXT:    bnez a5, .LBB1_1
132; RV64IA-NEXT:  # %bb.2:
133; RV64IA-NEXT:    srlw a0, a4, a0
134; RV64IA-NEXT:    ret
135  %1 = atomicrmw xchg i8* %a, i8 %b acquire
136  ret i8 %1
137}
138
139define i8 @atomicrmw_xchg_i8_release(i8* %a, i8 %b) nounwind {
140; RV32I-LABEL: atomicrmw_xchg_i8_release:
141; RV32I:       # %bb.0:
142; RV32I-NEXT:    addi sp, sp, -16
143; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
144; RV32I-NEXT:    li a2, 3
145; RV32I-NEXT:    call __atomic_exchange_1@plt
146; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
147; RV32I-NEXT:    addi sp, sp, 16
148; RV32I-NEXT:    ret
149;
150; RV32IA-LABEL: atomicrmw_xchg_i8_release:
151; RV32IA:       # %bb.0:
152; RV32IA-NEXT:    andi a2, a0, -4
153; RV32IA-NEXT:    slli a0, a0, 3
154; RV32IA-NEXT:    li a3, 255
155; RV32IA-NEXT:    sll a3, a3, a0
156; RV32IA-NEXT:    andi a1, a1, 255
157; RV32IA-NEXT:    sll a1, a1, a0
158; RV32IA-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
159; RV32IA-NEXT:    lr.w a4, (a2)
160; RV32IA-NEXT:    mv a5, a1
161; RV32IA-NEXT:    xor a5, a4, a5
162; RV32IA-NEXT:    and a5, a5, a3
163; RV32IA-NEXT:    xor a5, a4, a5
164; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
165; RV32IA-NEXT:    bnez a5, .LBB2_1
166; RV32IA-NEXT:  # %bb.2:
167; RV32IA-NEXT:    srl a0, a4, a0
168; RV32IA-NEXT:    ret
169;
170; RV64I-LABEL: atomicrmw_xchg_i8_release:
171; RV64I:       # %bb.0:
172; RV64I-NEXT:    addi sp, sp, -16
173; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
174; RV64I-NEXT:    li a2, 3
175; RV64I-NEXT:    call __atomic_exchange_1@plt
176; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
177; RV64I-NEXT:    addi sp, sp, 16
178; RV64I-NEXT:    ret
179;
180; RV64IA-LABEL: atomicrmw_xchg_i8_release:
181; RV64IA:       # %bb.0:
182; RV64IA-NEXT:    andi a2, a0, -4
183; RV64IA-NEXT:    slliw a0, a0, 3
184; RV64IA-NEXT:    li a3, 255
185; RV64IA-NEXT:    sllw a3, a3, a0
186; RV64IA-NEXT:    andi a1, a1, 255
187; RV64IA-NEXT:    sllw a1, a1, a0
188; RV64IA-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
189; RV64IA-NEXT:    lr.w a4, (a2)
190; RV64IA-NEXT:    mv a5, a1
191; RV64IA-NEXT:    xor a5, a4, a5
192; RV64IA-NEXT:    and a5, a5, a3
193; RV64IA-NEXT:    xor a5, a4, a5
194; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
195; RV64IA-NEXT:    bnez a5, .LBB2_1
196; RV64IA-NEXT:  # %bb.2:
197; RV64IA-NEXT:    srlw a0, a4, a0
198; RV64IA-NEXT:    ret
199  %1 = atomicrmw xchg i8* %a, i8 %b release
200  ret i8 %1
201}
202
203define i8 @atomicrmw_xchg_i8_acq_rel(i8* %a, i8 %b) nounwind {
204; RV32I-LABEL: atomicrmw_xchg_i8_acq_rel:
205; RV32I:       # %bb.0:
206; RV32I-NEXT:    addi sp, sp, -16
207; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
208; RV32I-NEXT:    li a2, 4
209; RV32I-NEXT:    call __atomic_exchange_1@plt
210; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
211; RV32I-NEXT:    addi sp, sp, 16
212; RV32I-NEXT:    ret
213;
214; RV32IA-LABEL: atomicrmw_xchg_i8_acq_rel:
215; RV32IA:       # %bb.0:
216; RV32IA-NEXT:    andi a2, a0, -4
217; RV32IA-NEXT:    slli a0, a0, 3
218; RV32IA-NEXT:    li a3, 255
219; RV32IA-NEXT:    sll a3, a3, a0
220; RV32IA-NEXT:    andi a1, a1, 255
221; RV32IA-NEXT:    sll a1, a1, a0
222; RV32IA-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
223; RV32IA-NEXT:    lr.w.aq a4, (a2)
224; RV32IA-NEXT:    mv a5, a1
225; RV32IA-NEXT:    xor a5, a4, a5
226; RV32IA-NEXT:    and a5, a5, a3
227; RV32IA-NEXT:    xor a5, a4, a5
228; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
229; RV32IA-NEXT:    bnez a5, .LBB3_1
230; RV32IA-NEXT:  # %bb.2:
231; RV32IA-NEXT:    srl a0, a4, a0
232; RV32IA-NEXT:    ret
233;
234; RV64I-LABEL: atomicrmw_xchg_i8_acq_rel:
235; RV64I:       # %bb.0:
236; RV64I-NEXT:    addi sp, sp, -16
237; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
238; RV64I-NEXT:    li a2, 4
239; RV64I-NEXT:    call __atomic_exchange_1@plt
240; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
241; RV64I-NEXT:    addi sp, sp, 16
242; RV64I-NEXT:    ret
243;
244; RV64IA-LABEL: atomicrmw_xchg_i8_acq_rel:
245; RV64IA:       # %bb.0:
246; RV64IA-NEXT:    andi a2, a0, -4
247; RV64IA-NEXT:    slliw a0, a0, 3
248; RV64IA-NEXT:    li a3, 255
249; RV64IA-NEXT:    sllw a3, a3, a0
250; RV64IA-NEXT:    andi a1, a1, 255
251; RV64IA-NEXT:    sllw a1, a1, a0
252; RV64IA-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
253; RV64IA-NEXT:    lr.w.aq a4, (a2)
254; RV64IA-NEXT:    mv a5, a1
255; RV64IA-NEXT:    xor a5, a4, a5
256; RV64IA-NEXT:    and a5, a5, a3
257; RV64IA-NEXT:    xor a5, a4, a5
258; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
259; RV64IA-NEXT:    bnez a5, .LBB3_1
260; RV64IA-NEXT:  # %bb.2:
261; RV64IA-NEXT:    srlw a0, a4, a0
262; RV64IA-NEXT:    ret
263  %1 = atomicrmw xchg i8* %a, i8 %b acq_rel
264  ret i8 %1
265}
266
267define i8 @atomicrmw_xchg_i8_seq_cst(i8* %a, i8 %b) nounwind {
268; RV32I-LABEL: atomicrmw_xchg_i8_seq_cst:
269; RV32I:       # %bb.0:
270; RV32I-NEXT:    addi sp, sp, -16
271; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
272; RV32I-NEXT:    li a2, 5
273; RV32I-NEXT:    call __atomic_exchange_1@plt
274; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
275; RV32I-NEXT:    addi sp, sp, 16
276; RV32I-NEXT:    ret
277;
278; RV32IA-LABEL: atomicrmw_xchg_i8_seq_cst:
279; RV32IA:       # %bb.0:
280; RV32IA-NEXT:    andi a2, a0, -4
281; RV32IA-NEXT:    slli a0, a0, 3
282; RV32IA-NEXT:    li a3, 255
283; RV32IA-NEXT:    sll a3, a3, a0
284; RV32IA-NEXT:    andi a1, a1, 255
285; RV32IA-NEXT:    sll a1, a1, a0
286; RV32IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
287; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
288; RV32IA-NEXT:    mv a5, a1
289; RV32IA-NEXT:    xor a5, a4, a5
290; RV32IA-NEXT:    and a5, a5, a3
291; RV32IA-NEXT:    xor a5, a4, a5
292; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
293; RV32IA-NEXT:    bnez a5, .LBB4_1
294; RV32IA-NEXT:  # %bb.2:
295; RV32IA-NEXT:    srl a0, a4, a0
296; RV32IA-NEXT:    ret
297;
298; RV64I-LABEL: atomicrmw_xchg_i8_seq_cst:
299; RV64I:       # %bb.0:
300; RV64I-NEXT:    addi sp, sp, -16
301; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
302; RV64I-NEXT:    li a2, 5
303; RV64I-NEXT:    call __atomic_exchange_1@plt
304; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
305; RV64I-NEXT:    addi sp, sp, 16
306; RV64I-NEXT:    ret
307;
308; RV64IA-LABEL: atomicrmw_xchg_i8_seq_cst:
309; RV64IA:       # %bb.0:
310; RV64IA-NEXT:    andi a2, a0, -4
311; RV64IA-NEXT:    slliw a0, a0, 3
312; RV64IA-NEXT:    li a3, 255
313; RV64IA-NEXT:    sllw a3, a3, a0
314; RV64IA-NEXT:    andi a1, a1, 255
315; RV64IA-NEXT:    sllw a1, a1, a0
316; RV64IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
317; RV64IA-NEXT:    lr.w.aqrl a4, (a2)
318; RV64IA-NEXT:    mv a5, a1
319; RV64IA-NEXT:    xor a5, a4, a5
320; RV64IA-NEXT:    and a5, a5, a3
321; RV64IA-NEXT:    xor a5, a4, a5
322; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
323; RV64IA-NEXT:    bnez a5, .LBB4_1
324; RV64IA-NEXT:  # %bb.2:
325; RV64IA-NEXT:    srlw a0, a4, a0
326; RV64IA-NEXT:    ret
327  %1 = atomicrmw xchg i8* %a, i8 %b seq_cst
328  ret i8 %1
329}
330
331define i8 @atomicrmw_add_i8_monotonic(i8 *%a, i8 %b) nounwind {
332; RV32I-LABEL: atomicrmw_add_i8_monotonic:
333; RV32I:       # %bb.0:
334; RV32I-NEXT:    addi sp, sp, -16
335; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
336; RV32I-NEXT:    li a2, 0
337; RV32I-NEXT:    call __atomic_fetch_add_1@plt
338; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
339; RV32I-NEXT:    addi sp, sp, 16
340; RV32I-NEXT:    ret
341;
342; RV32IA-LABEL: atomicrmw_add_i8_monotonic:
343; RV32IA:       # %bb.0:
344; RV32IA-NEXT:    andi a2, a0, -4
345; RV32IA-NEXT:    slli a0, a0, 3
346; RV32IA-NEXT:    li a3, 255
347; RV32IA-NEXT:    sll a3, a3, a0
348; RV32IA-NEXT:    andi a1, a1, 255
349; RV32IA-NEXT:    sll a1, a1, a0
350; RV32IA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
351; RV32IA-NEXT:    lr.w a4, (a2)
352; RV32IA-NEXT:    add a5, a4, a1
353; RV32IA-NEXT:    xor a5, a4, a5
354; RV32IA-NEXT:    and a5, a5, a3
355; RV32IA-NEXT:    xor a5, a4, a5
356; RV32IA-NEXT:    sc.w a5, a5, (a2)
357; RV32IA-NEXT:    bnez a5, .LBB5_1
358; RV32IA-NEXT:  # %bb.2:
359; RV32IA-NEXT:    srl a0, a4, a0
360; RV32IA-NEXT:    ret
361;
362; RV64I-LABEL: atomicrmw_add_i8_monotonic:
363; RV64I:       # %bb.0:
364; RV64I-NEXT:    addi sp, sp, -16
365; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
366; RV64I-NEXT:    li a2, 0
367; RV64I-NEXT:    call __atomic_fetch_add_1@plt
368; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
369; RV64I-NEXT:    addi sp, sp, 16
370; RV64I-NEXT:    ret
371;
372; RV64IA-LABEL: atomicrmw_add_i8_monotonic:
373; RV64IA:       # %bb.0:
374; RV64IA-NEXT:    andi a2, a0, -4
375; RV64IA-NEXT:    slliw a0, a0, 3
376; RV64IA-NEXT:    li a3, 255
377; RV64IA-NEXT:    sllw a3, a3, a0
378; RV64IA-NEXT:    andi a1, a1, 255
379; RV64IA-NEXT:    sllw a1, a1, a0
380; RV64IA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
381; RV64IA-NEXT:    lr.w a4, (a2)
382; RV64IA-NEXT:    add a5, a4, a1
383; RV64IA-NEXT:    xor a5, a4, a5
384; RV64IA-NEXT:    and a5, a5, a3
385; RV64IA-NEXT:    xor a5, a4, a5
386; RV64IA-NEXT:    sc.w a5, a5, (a2)
387; RV64IA-NEXT:    bnez a5, .LBB5_1
388; RV64IA-NEXT:  # %bb.2:
389; RV64IA-NEXT:    srlw a0, a4, a0
390; RV64IA-NEXT:    ret
391  %1 = atomicrmw add i8* %a, i8 %b monotonic
392  ret i8 %1
393}
394
395define i8 @atomicrmw_add_i8_acquire(i8 *%a, i8 %b) nounwind {
396; RV32I-LABEL: atomicrmw_add_i8_acquire:
397; RV32I:       # %bb.0:
398; RV32I-NEXT:    addi sp, sp, -16
399; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
400; RV32I-NEXT:    li a2, 2
401; RV32I-NEXT:    call __atomic_fetch_add_1@plt
402; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
403; RV32I-NEXT:    addi sp, sp, 16
404; RV32I-NEXT:    ret
405;
406; RV32IA-LABEL: atomicrmw_add_i8_acquire:
407; RV32IA:       # %bb.0:
408; RV32IA-NEXT:    andi a2, a0, -4
409; RV32IA-NEXT:    slli a0, a0, 3
410; RV32IA-NEXT:    li a3, 255
411; RV32IA-NEXT:    sll a3, a3, a0
412; RV32IA-NEXT:    andi a1, a1, 255
413; RV32IA-NEXT:    sll a1, a1, a0
414; RV32IA-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1
415; RV32IA-NEXT:    lr.w.aq a4, (a2)
416; RV32IA-NEXT:    add a5, a4, a1
417; RV32IA-NEXT:    xor a5, a4, a5
418; RV32IA-NEXT:    and a5, a5, a3
419; RV32IA-NEXT:    xor a5, a4, a5
420; RV32IA-NEXT:    sc.w a5, a5, (a2)
421; RV32IA-NEXT:    bnez a5, .LBB6_1
422; RV32IA-NEXT:  # %bb.2:
423; RV32IA-NEXT:    srl a0, a4, a0
424; RV32IA-NEXT:    ret
425;
426; RV64I-LABEL: atomicrmw_add_i8_acquire:
427; RV64I:       # %bb.0:
428; RV64I-NEXT:    addi sp, sp, -16
429; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
430; RV64I-NEXT:    li a2, 2
431; RV64I-NEXT:    call __atomic_fetch_add_1@plt
432; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
433; RV64I-NEXT:    addi sp, sp, 16
434; RV64I-NEXT:    ret
435;
436; RV64IA-LABEL: atomicrmw_add_i8_acquire:
437; RV64IA:       # %bb.0:
438; RV64IA-NEXT:    andi a2, a0, -4
439; RV64IA-NEXT:    slliw a0, a0, 3
440; RV64IA-NEXT:    li a3, 255
441; RV64IA-NEXT:    sllw a3, a3, a0
442; RV64IA-NEXT:    andi a1, a1, 255
443; RV64IA-NEXT:    sllw a1, a1, a0
444; RV64IA-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1
445; RV64IA-NEXT:    lr.w.aq a4, (a2)
446; RV64IA-NEXT:    add a5, a4, a1
447; RV64IA-NEXT:    xor a5, a4, a5
448; RV64IA-NEXT:    and a5, a5, a3
449; RV64IA-NEXT:    xor a5, a4, a5
450; RV64IA-NEXT:    sc.w a5, a5, (a2)
451; RV64IA-NEXT:    bnez a5, .LBB6_1
452; RV64IA-NEXT:  # %bb.2:
453; RV64IA-NEXT:    srlw a0, a4, a0
454; RV64IA-NEXT:    ret
455  %1 = atomicrmw add i8* %a, i8 %b acquire
456  ret i8 %1
457}
458
459define i8 @atomicrmw_add_i8_release(i8 *%a, i8 %b) nounwind {
460; RV32I-LABEL: atomicrmw_add_i8_release:
461; RV32I:       # %bb.0:
462; RV32I-NEXT:    addi sp, sp, -16
463; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
464; RV32I-NEXT:    li a2, 3
465; RV32I-NEXT:    call __atomic_fetch_add_1@plt
466; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
467; RV32I-NEXT:    addi sp, sp, 16
468; RV32I-NEXT:    ret
469;
470; RV32IA-LABEL: atomicrmw_add_i8_release:
471; RV32IA:       # %bb.0:
472; RV32IA-NEXT:    andi a2, a0, -4
473; RV32IA-NEXT:    slli a0, a0, 3
474; RV32IA-NEXT:    li a3, 255
475; RV32IA-NEXT:    sll a3, a3, a0
476; RV32IA-NEXT:    andi a1, a1, 255
477; RV32IA-NEXT:    sll a1, a1, a0
478; RV32IA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
479; RV32IA-NEXT:    lr.w a4, (a2)
480; RV32IA-NEXT:    add a5, a4, a1
481; RV32IA-NEXT:    xor a5, a4, a5
482; RV32IA-NEXT:    and a5, a5, a3
483; RV32IA-NEXT:    xor a5, a4, a5
484; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
485; RV32IA-NEXT:    bnez a5, .LBB7_1
486; RV32IA-NEXT:  # %bb.2:
487; RV32IA-NEXT:    srl a0, a4, a0
488; RV32IA-NEXT:    ret
489;
490; RV64I-LABEL: atomicrmw_add_i8_release:
491; RV64I:       # %bb.0:
492; RV64I-NEXT:    addi sp, sp, -16
493; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
494; RV64I-NEXT:    li a2, 3
495; RV64I-NEXT:    call __atomic_fetch_add_1@plt
496; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
497; RV64I-NEXT:    addi sp, sp, 16
498; RV64I-NEXT:    ret
499;
500; RV64IA-LABEL: atomicrmw_add_i8_release:
501; RV64IA:       # %bb.0:
502; RV64IA-NEXT:    andi a2, a0, -4
503; RV64IA-NEXT:    slliw a0, a0, 3
504; RV64IA-NEXT:    li a3, 255
505; RV64IA-NEXT:    sllw a3, a3, a0
506; RV64IA-NEXT:    andi a1, a1, 255
507; RV64IA-NEXT:    sllw a1, a1, a0
508; RV64IA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
509; RV64IA-NEXT:    lr.w a4, (a2)
510; RV64IA-NEXT:    add a5, a4, a1
511; RV64IA-NEXT:    xor a5, a4, a5
512; RV64IA-NEXT:    and a5, a5, a3
513; RV64IA-NEXT:    xor a5, a4, a5
514; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
515; RV64IA-NEXT:    bnez a5, .LBB7_1
516; RV64IA-NEXT:  # %bb.2:
517; RV64IA-NEXT:    srlw a0, a4, a0
518; RV64IA-NEXT:    ret
519  %1 = atomicrmw add i8* %a, i8 %b release
520  ret i8 %1
521}
522
523define i8 @atomicrmw_add_i8_acq_rel(i8 *%a, i8 %b) nounwind {
524; RV32I-LABEL: atomicrmw_add_i8_acq_rel:
525; RV32I:       # %bb.0:
526; RV32I-NEXT:    addi sp, sp, -16
527; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
528; RV32I-NEXT:    li a2, 4
529; RV32I-NEXT:    call __atomic_fetch_add_1@plt
530; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
531; RV32I-NEXT:    addi sp, sp, 16
532; RV32I-NEXT:    ret
533;
534; RV32IA-LABEL: atomicrmw_add_i8_acq_rel:
535; RV32IA:       # %bb.0:
536; RV32IA-NEXT:    andi a2, a0, -4
537; RV32IA-NEXT:    slli a0, a0, 3
538; RV32IA-NEXT:    li a3, 255
539; RV32IA-NEXT:    sll a3, a3, a0
540; RV32IA-NEXT:    andi a1, a1, 255
541; RV32IA-NEXT:    sll a1, a1, a0
542; RV32IA-NEXT:  .LBB8_1: # =>This Inner Loop Header: Depth=1
543; RV32IA-NEXT:    lr.w.aq a4, (a2)
544; RV32IA-NEXT:    add a5, a4, a1
545; RV32IA-NEXT:    xor a5, a4, a5
546; RV32IA-NEXT:    and a5, a5, a3
547; RV32IA-NEXT:    xor a5, a4, a5
548; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
549; RV32IA-NEXT:    bnez a5, .LBB8_1
550; RV32IA-NEXT:  # %bb.2:
551; RV32IA-NEXT:    srl a0, a4, a0
552; RV32IA-NEXT:    ret
553;
554; RV64I-LABEL: atomicrmw_add_i8_acq_rel:
555; RV64I:       # %bb.0:
556; RV64I-NEXT:    addi sp, sp, -16
557; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
558; RV64I-NEXT:    li a2, 4
559; RV64I-NEXT:    call __atomic_fetch_add_1@plt
560; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
561; RV64I-NEXT:    addi sp, sp, 16
562; RV64I-NEXT:    ret
563;
564; RV64IA-LABEL: atomicrmw_add_i8_acq_rel:
565; RV64IA:       # %bb.0:
566; RV64IA-NEXT:    andi a2, a0, -4
567; RV64IA-NEXT:    slliw a0, a0, 3
568; RV64IA-NEXT:    li a3, 255
569; RV64IA-NEXT:    sllw a3, a3, a0
570; RV64IA-NEXT:    andi a1, a1, 255
571; RV64IA-NEXT:    sllw a1, a1, a0
572; RV64IA-NEXT:  .LBB8_1: # =>This Inner Loop Header: Depth=1
573; RV64IA-NEXT:    lr.w.aq a4, (a2)
574; RV64IA-NEXT:    add a5, a4, a1
575; RV64IA-NEXT:    xor a5, a4, a5
576; RV64IA-NEXT:    and a5, a5, a3
577; RV64IA-NEXT:    xor a5, a4, a5
578; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
579; RV64IA-NEXT:    bnez a5, .LBB8_1
580; RV64IA-NEXT:  # %bb.2:
581; RV64IA-NEXT:    srlw a0, a4, a0
582; RV64IA-NEXT:    ret
583  %1 = atomicrmw add i8* %a, i8 %b acq_rel
584  ret i8 %1
585}
586
587define i8 @atomicrmw_add_i8_seq_cst(i8 *%a, i8 %b) nounwind {
588; RV32I-LABEL: atomicrmw_add_i8_seq_cst:
589; RV32I:       # %bb.0:
590; RV32I-NEXT:    addi sp, sp, -16
591; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
592; RV32I-NEXT:    li a2, 5
593; RV32I-NEXT:    call __atomic_fetch_add_1@plt
594; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
595; RV32I-NEXT:    addi sp, sp, 16
596; RV32I-NEXT:    ret
597;
598; RV32IA-LABEL: atomicrmw_add_i8_seq_cst:
599; RV32IA:       # %bb.0:
600; RV32IA-NEXT:    andi a2, a0, -4
601; RV32IA-NEXT:    slli a0, a0, 3
602; RV32IA-NEXT:    li a3, 255
603; RV32IA-NEXT:    sll a3, a3, a0
604; RV32IA-NEXT:    andi a1, a1, 255
605; RV32IA-NEXT:    sll a1, a1, a0
606; RV32IA-NEXT:  .LBB9_1: # =>This Inner Loop Header: Depth=1
607; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
608; RV32IA-NEXT:    add a5, a4, a1
609; RV32IA-NEXT:    xor a5, a4, a5
610; RV32IA-NEXT:    and a5, a5, a3
611; RV32IA-NEXT:    xor a5, a4, a5
612; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
613; RV32IA-NEXT:    bnez a5, .LBB9_1
614; RV32IA-NEXT:  # %bb.2:
615; RV32IA-NEXT:    srl a0, a4, a0
616; RV32IA-NEXT:    ret
617;
618; RV64I-LABEL: atomicrmw_add_i8_seq_cst:
619; RV64I:       # %bb.0:
620; RV64I-NEXT:    addi sp, sp, -16
621; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
622; RV64I-NEXT:    li a2, 5
623; RV64I-NEXT:    call __atomic_fetch_add_1@plt
624; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
625; RV64I-NEXT:    addi sp, sp, 16
626; RV64I-NEXT:    ret
627;
628; RV64IA-LABEL: atomicrmw_add_i8_seq_cst:
629; RV64IA:       # %bb.0:
630; RV64IA-NEXT:    andi a2, a0, -4
631; RV64IA-NEXT:    slliw a0, a0, 3
632; RV64IA-NEXT:    li a3, 255
633; RV64IA-NEXT:    sllw a3, a3, a0
634; RV64IA-NEXT:    andi a1, a1, 255
635; RV64IA-NEXT:    sllw a1, a1, a0
636; RV64IA-NEXT:  .LBB9_1: # =>This Inner Loop Header: Depth=1
637; RV64IA-NEXT:    lr.w.aqrl a4, (a2)
638; RV64IA-NEXT:    add a5, a4, a1
639; RV64IA-NEXT:    xor a5, a4, a5
640; RV64IA-NEXT:    and a5, a5, a3
641; RV64IA-NEXT:    xor a5, a4, a5
642; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
643; RV64IA-NEXT:    bnez a5, .LBB9_1
644; RV64IA-NEXT:  # %bb.2:
645; RV64IA-NEXT:    srlw a0, a4, a0
646; RV64IA-NEXT:    ret
647  %1 = atomicrmw add i8* %a, i8 %b seq_cst
648  ret i8 %1
649}
650
651define i8 @atomicrmw_sub_i8_monotonic(i8* %a, i8 %b) nounwind {
652; RV32I-LABEL: atomicrmw_sub_i8_monotonic:
653; RV32I:       # %bb.0:
654; RV32I-NEXT:    addi sp, sp, -16
655; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
656; RV32I-NEXT:    li a2, 0
657; RV32I-NEXT:    call __atomic_fetch_sub_1@plt
658; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
659; RV32I-NEXT:    addi sp, sp, 16
660; RV32I-NEXT:    ret
661;
662; RV32IA-LABEL: atomicrmw_sub_i8_monotonic:
663; RV32IA:       # %bb.0:
664; RV32IA-NEXT:    andi a2, a0, -4
665; RV32IA-NEXT:    slli a0, a0, 3
666; RV32IA-NEXT:    li a3, 255
667; RV32IA-NEXT:    sll a3, a3, a0
668; RV32IA-NEXT:    andi a1, a1, 255
669; RV32IA-NEXT:    sll a1, a1, a0
670; RV32IA-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
671; RV32IA-NEXT:    lr.w a4, (a2)
672; RV32IA-NEXT:    sub a5, a4, a1
673; RV32IA-NEXT:    xor a5, a4, a5
674; RV32IA-NEXT:    and a5, a5, a3
675; RV32IA-NEXT:    xor a5, a4, a5
676; RV32IA-NEXT:    sc.w a5, a5, (a2)
677; RV32IA-NEXT:    bnez a5, .LBB10_1
678; RV32IA-NEXT:  # %bb.2:
679; RV32IA-NEXT:    srl a0, a4, a0
680; RV32IA-NEXT:    ret
681;
682; RV64I-LABEL: atomicrmw_sub_i8_monotonic:
683; RV64I:       # %bb.0:
684; RV64I-NEXT:    addi sp, sp, -16
685; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
686; RV64I-NEXT:    li a2, 0
687; RV64I-NEXT:    call __atomic_fetch_sub_1@plt
688; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
689; RV64I-NEXT:    addi sp, sp, 16
690; RV64I-NEXT:    ret
691;
692; RV64IA-LABEL: atomicrmw_sub_i8_monotonic:
693; RV64IA:       # %bb.0:
694; RV64IA-NEXT:    andi a2, a0, -4
695; RV64IA-NEXT:    slliw a0, a0, 3
696; RV64IA-NEXT:    li a3, 255
697; RV64IA-NEXT:    sllw a3, a3, a0
698; RV64IA-NEXT:    andi a1, a1, 255
699; RV64IA-NEXT:    sllw a1, a1, a0
700; RV64IA-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
701; RV64IA-NEXT:    lr.w a4, (a2)
702; RV64IA-NEXT:    sub a5, a4, a1
703; RV64IA-NEXT:    xor a5, a4, a5
704; RV64IA-NEXT:    and a5, a5, a3
705; RV64IA-NEXT:    xor a5, a4, a5
706; RV64IA-NEXT:    sc.w a5, a5, (a2)
707; RV64IA-NEXT:    bnez a5, .LBB10_1
708; RV64IA-NEXT:  # %bb.2:
709; RV64IA-NEXT:    srlw a0, a4, a0
710; RV64IA-NEXT:    ret
711  %1 = atomicrmw sub i8* %a, i8 %b monotonic
712  ret i8 %1
713}
714
715define i8 @atomicrmw_sub_i8_acquire(i8* %a, i8 %b) nounwind {
716; RV32I-LABEL: atomicrmw_sub_i8_acquire:
717; RV32I:       # %bb.0:
718; RV32I-NEXT:    addi sp, sp, -16
719; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
720; RV32I-NEXT:    li a2, 2
721; RV32I-NEXT:    call __atomic_fetch_sub_1@plt
722; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
723; RV32I-NEXT:    addi sp, sp, 16
724; RV32I-NEXT:    ret
725;
726; RV32IA-LABEL: atomicrmw_sub_i8_acquire:
727; RV32IA:       # %bb.0:
728; RV32IA-NEXT:    andi a2, a0, -4
729; RV32IA-NEXT:    slli a0, a0, 3
730; RV32IA-NEXT:    li a3, 255
731; RV32IA-NEXT:    sll a3, a3, a0
732; RV32IA-NEXT:    andi a1, a1, 255
733; RV32IA-NEXT:    sll a1, a1, a0
734; RV32IA-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
735; RV32IA-NEXT:    lr.w.aq a4, (a2)
736; RV32IA-NEXT:    sub a5, a4, a1
737; RV32IA-NEXT:    xor a5, a4, a5
738; RV32IA-NEXT:    and a5, a5, a3
739; RV32IA-NEXT:    xor a5, a4, a5
740; RV32IA-NEXT:    sc.w a5, a5, (a2)
741; RV32IA-NEXT:    bnez a5, .LBB11_1
742; RV32IA-NEXT:  # %bb.2:
743; RV32IA-NEXT:    srl a0, a4, a0
744; RV32IA-NEXT:    ret
745;
746; RV64I-LABEL: atomicrmw_sub_i8_acquire:
747; RV64I:       # %bb.0:
748; RV64I-NEXT:    addi sp, sp, -16
749; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
750; RV64I-NEXT:    li a2, 2
751; RV64I-NEXT:    call __atomic_fetch_sub_1@plt
752; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
753; RV64I-NEXT:    addi sp, sp, 16
754; RV64I-NEXT:    ret
755;
756; RV64IA-LABEL: atomicrmw_sub_i8_acquire:
757; RV64IA:       # %bb.0:
758; RV64IA-NEXT:    andi a2, a0, -4
759; RV64IA-NEXT:    slliw a0, a0, 3
760; RV64IA-NEXT:    li a3, 255
761; RV64IA-NEXT:    sllw a3, a3, a0
762; RV64IA-NEXT:    andi a1, a1, 255
763; RV64IA-NEXT:    sllw a1, a1, a0
764; RV64IA-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
765; RV64IA-NEXT:    lr.w.aq a4, (a2)
766; RV64IA-NEXT:    sub a5, a4, a1
767; RV64IA-NEXT:    xor a5, a4, a5
768; RV64IA-NEXT:    and a5, a5, a3
769; RV64IA-NEXT:    xor a5, a4, a5
770; RV64IA-NEXT:    sc.w a5, a5, (a2)
771; RV64IA-NEXT:    bnez a5, .LBB11_1
772; RV64IA-NEXT:  # %bb.2:
773; RV64IA-NEXT:    srlw a0, a4, a0
774; RV64IA-NEXT:    ret
775  %1 = atomicrmw sub i8* %a, i8 %b acquire
776  ret i8 %1
777}
778
779define i8 @atomicrmw_sub_i8_release(i8* %a, i8 %b) nounwind {
780; RV32I-LABEL: atomicrmw_sub_i8_release:
781; RV32I:       # %bb.0:
782; RV32I-NEXT:    addi sp, sp, -16
783; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
784; RV32I-NEXT:    li a2, 3
785; RV32I-NEXT:    call __atomic_fetch_sub_1@plt
786; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
787; RV32I-NEXT:    addi sp, sp, 16
788; RV32I-NEXT:    ret
789;
790; RV32IA-LABEL: atomicrmw_sub_i8_release:
791; RV32IA:       # %bb.0:
792; RV32IA-NEXT:    andi a2, a0, -4
793; RV32IA-NEXT:    slli a0, a0, 3
794; RV32IA-NEXT:    li a3, 255
795; RV32IA-NEXT:    sll a3, a3, a0
796; RV32IA-NEXT:    andi a1, a1, 255
797; RV32IA-NEXT:    sll a1, a1, a0
798; RV32IA-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
799; RV32IA-NEXT:    lr.w a4, (a2)
800; RV32IA-NEXT:    sub a5, a4, a1
801; RV32IA-NEXT:    xor a5, a4, a5
802; RV32IA-NEXT:    and a5, a5, a3
803; RV32IA-NEXT:    xor a5, a4, a5
804; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
805; RV32IA-NEXT:    bnez a5, .LBB12_1
806; RV32IA-NEXT:  # %bb.2:
807; RV32IA-NEXT:    srl a0, a4, a0
808; RV32IA-NEXT:    ret
809;
810; RV64I-LABEL: atomicrmw_sub_i8_release:
811; RV64I:       # %bb.0:
812; RV64I-NEXT:    addi sp, sp, -16
813; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
814; RV64I-NEXT:    li a2, 3
815; RV64I-NEXT:    call __atomic_fetch_sub_1@plt
816; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
817; RV64I-NEXT:    addi sp, sp, 16
818; RV64I-NEXT:    ret
819;
820; RV64IA-LABEL: atomicrmw_sub_i8_release:
821; RV64IA:       # %bb.0:
822; RV64IA-NEXT:    andi a2, a0, -4
823; RV64IA-NEXT:    slliw a0, a0, 3
824; RV64IA-NEXT:    li a3, 255
825; RV64IA-NEXT:    sllw a3, a3, a0
826; RV64IA-NEXT:    andi a1, a1, 255
827; RV64IA-NEXT:    sllw a1, a1, a0
828; RV64IA-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
829; RV64IA-NEXT:    lr.w a4, (a2)
830; RV64IA-NEXT:    sub a5, a4, a1
831; RV64IA-NEXT:    xor a5, a4, a5
832; RV64IA-NEXT:    and a5, a5, a3
833; RV64IA-NEXT:    xor a5, a4, a5
834; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
835; RV64IA-NEXT:    bnez a5, .LBB12_1
836; RV64IA-NEXT:  # %bb.2:
837; RV64IA-NEXT:    srlw a0, a4, a0
838; RV64IA-NEXT:    ret
839  %1 = atomicrmw sub i8* %a, i8 %b release
840  ret i8 %1
841}
842
843define i8 @atomicrmw_sub_i8_acq_rel(i8* %a, i8 %b) nounwind {
844; RV32I-LABEL: atomicrmw_sub_i8_acq_rel:
845; RV32I:       # %bb.0:
846; RV32I-NEXT:    addi sp, sp, -16
847; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
848; RV32I-NEXT:    li a2, 4
849; RV32I-NEXT:    call __atomic_fetch_sub_1@plt
850; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
851; RV32I-NEXT:    addi sp, sp, 16
852; RV32I-NEXT:    ret
853;
854; RV32IA-LABEL: atomicrmw_sub_i8_acq_rel:
855; RV32IA:       # %bb.0:
856; RV32IA-NEXT:    andi a2, a0, -4
857; RV32IA-NEXT:    slli a0, a0, 3
858; RV32IA-NEXT:    li a3, 255
859; RV32IA-NEXT:    sll a3, a3, a0
860; RV32IA-NEXT:    andi a1, a1, 255
861; RV32IA-NEXT:    sll a1, a1, a0
862; RV32IA-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
863; RV32IA-NEXT:    lr.w.aq a4, (a2)
864; RV32IA-NEXT:    sub a5, a4, a1
865; RV32IA-NEXT:    xor a5, a4, a5
866; RV32IA-NEXT:    and a5, a5, a3
867; RV32IA-NEXT:    xor a5, a4, a5
868; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
869; RV32IA-NEXT:    bnez a5, .LBB13_1
870; RV32IA-NEXT:  # %bb.2:
871; RV32IA-NEXT:    srl a0, a4, a0
872; RV32IA-NEXT:    ret
873;
874; RV64I-LABEL: atomicrmw_sub_i8_acq_rel:
875; RV64I:       # %bb.0:
876; RV64I-NEXT:    addi sp, sp, -16
877; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
878; RV64I-NEXT:    li a2, 4
879; RV64I-NEXT:    call __atomic_fetch_sub_1@plt
880; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
881; RV64I-NEXT:    addi sp, sp, 16
882; RV64I-NEXT:    ret
883;
884; RV64IA-LABEL: atomicrmw_sub_i8_acq_rel:
885; RV64IA:       # %bb.0:
886; RV64IA-NEXT:    andi a2, a0, -4
887; RV64IA-NEXT:    slliw a0, a0, 3
888; RV64IA-NEXT:    li a3, 255
889; RV64IA-NEXT:    sllw a3, a3, a0
890; RV64IA-NEXT:    andi a1, a1, 255
891; RV64IA-NEXT:    sllw a1, a1, a0
892; RV64IA-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
893; RV64IA-NEXT:    lr.w.aq a4, (a2)
894; RV64IA-NEXT:    sub a5, a4, a1
895; RV64IA-NEXT:    xor a5, a4, a5
896; RV64IA-NEXT:    and a5, a5, a3
897; RV64IA-NEXT:    xor a5, a4, a5
898; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
899; RV64IA-NEXT:    bnez a5, .LBB13_1
900; RV64IA-NEXT:  # %bb.2:
901; RV64IA-NEXT:    srlw a0, a4, a0
902; RV64IA-NEXT:    ret
903  %1 = atomicrmw sub i8* %a, i8 %b acq_rel
904  ret i8 %1
905}
906
907define i8 @atomicrmw_sub_i8_seq_cst(i8* %a, i8 %b) nounwind {
908; RV32I-LABEL: atomicrmw_sub_i8_seq_cst:
909; RV32I:       # %bb.0:
910; RV32I-NEXT:    addi sp, sp, -16
911; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
912; RV32I-NEXT:    li a2, 5
913; RV32I-NEXT:    call __atomic_fetch_sub_1@plt
914; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
915; RV32I-NEXT:    addi sp, sp, 16
916; RV32I-NEXT:    ret
917;
918; RV32IA-LABEL: atomicrmw_sub_i8_seq_cst:
919; RV32IA:       # %bb.0:
920; RV32IA-NEXT:    andi a2, a0, -4
921; RV32IA-NEXT:    slli a0, a0, 3
922; RV32IA-NEXT:    li a3, 255
923; RV32IA-NEXT:    sll a3, a3, a0
924; RV32IA-NEXT:    andi a1, a1, 255
925; RV32IA-NEXT:    sll a1, a1, a0
926; RV32IA-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
927; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
928; RV32IA-NEXT:    sub a5, a4, a1
929; RV32IA-NEXT:    xor a5, a4, a5
930; RV32IA-NEXT:    and a5, a5, a3
931; RV32IA-NEXT:    xor a5, a4, a5
932; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
933; RV32IA-NEXT:    bnez a5, .LBB14_1
934; RV32IA-NEXT:  # %bb.2:
935; RV32IA-NEXT:    srl a0, a4, a0
936; RV32IA-NEXT:    ret
937;
938; RV64I-LABEL: atomicrmw_sub_i8_seq_cst:
939; RV64I:       # %bb.0:
940; RV64I-NEXT:    addi sp, sp, -16
941; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
942; RV64I-NEXT:    li a2, 5
943; RV64I-NEXT:    call __atomic_fetch_sub_1@plt
944; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
945; RV64I-NEXT:    addi sp, sp, 16
946; RV64I-NEXT:    ret
947;
948; RV64IA-LABEL: atomicrmw_sub_i8_seq_cst:
949; RV64IA:       # %bb.0:
950; RV64IA-NEXT:    andi a2, a0, -4
951; RV64IA-NEXT:    slliw a0, a0, 3
952; RV64IA-NEXT:    li a3, 255
953; RV64IA-NEXT:    sllw a3, a3, a0
954; RV64IA-NEXT:    andi a1, a1, 255
955; RV64IA-NEXT:    sllw a1, a1, a0
956; RV64IA-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
957; RV64IA-NEXT:    lr.w.aqrl a4, (a2)
958; RV64IA-NEXT:    sub a5, a4, a1
959; RV64IA-NEXT:    xor a5, a4, a5
960; RV64IA-NEXT:    and a5, a5, a3
961; RV64IA-NEXT:    xor a5, a4, a5
962; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
963; RV64IA-NEXT:    bnez a5, .LBB14_1
964; RV64IA-NEXT:  # %bb.2:
965; RV64IA-NEXT:    srlw a0, a4, a0
966; RV64IA-NEXT:    ret
967  %1 = atomicrmw sub i8* %a, i8 %b seq_cst
968  ret i8 %1
969}
970
971define i8 @atomicrmw_and_i8_monotonic(i8 *%a, i8 %b) nounwind {
972; RV32I-LABEL: atomicrmw_and_i8_monotonic:
973; RV32I:       # %bb.0:
974; RV32I-NEXT:    addi sp, sp, -16
975; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
976; RV32I-NEXT:    li a2, 0
977; RV32I-NEXT:    call __atomic_fetch_and_1@plt
978; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
979; RV32I-NEXT:    addi sp, sp, 16
980; RV32I-NEXT:    ret
981;
982; RV32IA-LABEL: atomicrmw_and_i8_monotonic:
983; RV32IA:       # %bb.0:
984; RV32IA-NEXT:    andi a2, a0, -4
985; RV32IA-NEXT:    slli a0, a0, 3
986; RV32IA-NEXT:    li a3, 255
987; RV32IA-NEXT:    sll a3, a3, a0
988; RV32IA-NEXT:    not a3, a3
989; RV32IA-NEXT:    andi a1, a1, 255
990; RV32IA-NEXT:    sll a1, a1, a0
991; RV32IA-NEXT:    or a1, a3, a1
992; RV32IA-NEXT:    amoand.w a1, a1, (a2)
993; RV32IA-NEXT:    srl a0, a1, a0
994; RV32IA-NEXT:    ret
995;
996; RV64I-LABEL: atomicrmw_and_i8_monotonic:
997; RV64I:       # %bb.0:
998; RV64I-NEXT:    addi sp, sp, -16
999; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1000; RV64I-NEXT:    li a2, 0
1001; RV64I-NEXT:    call __atomic_fetch_and_1@plt
1002; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1003; RV64I-NEXT:    addi sp, sp, 16
1004; RV64I-NEXT:    ret
1005;
1006; RV64IA-LABEL: atomicrmw_and_i8_monotonic:
1007; RV64IA:       # %bb.0:
1008; RV64IA-NEXT:    andi a2, a0, -4
1009; RV64IA-NEXT:    slliw a0, a0, 3
1010; RV64IA-NEXT:    li a3, 255
1011; RV64IA-NEXT:    sllw a3, a3, a0
1012; RV64IA-NEXT:    not a3, a3
1013; RV64IA-NEXT:    andi a1, a1, 255
1014; RV64IA-NEXT:    sllw a1, a1, a0
1015; RV64IA-NEXT:    or a1, a3, a1
1016; RV64IA-NEXT:    amoand.w a1, a1, (a2)
1017; RV64IA-NEXT:    srlw a0, a1, a0
1018; RV64IA-NEXT:    ret
1019  %1 = atomicrmw and i8* %a, i8 %b monotonic
1020  ret i8 %1
1021}
1022
1023define i8 @atomicrmw_and_i8_acquire(i8 *%a, i8 %b) nounwind {
1024; RV32I-LABEL: atomicrmw_and_i8_acquire:
1025; RV32I:       # %bb.0:
1026; RV32I-NEXT:    addi sp, sp, -16
1027; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1028; RV32I-NEXT:    li a2, 2
1029; RV32I-NEXT:    call __atomic_fetch_and_1@plt
1030; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1031; RV32I-NEXT:    addi sp, sp, 16
1032; RV32I-NEXT:    ret
1033;
1034; RV32IA-LABEL: atomicrmw_and_i8_acquire:
1035; RV32IA:       # %bb.0:
1036; RV32IA-NEXT:    andi a2, a0, -4
1037; RV32IA-NEXT:    slli a0, a0, 3
1038; RV32IA-NEXT:    li a3, 255
1039; RV32IA-NEXT:    sll a3, a3, a0
1040; RV32IA-NEXT:    not a3, a3
1041; RV32IA-NEXT:    andi a1, a1, 255
1042; RV32IA-NEXT:    sll a1, a1, a0
1043; RV32IA-NEXT:    or a1, a3, a1
1044; RV32IA-NEXT:    amoand.w.aq a1, a1, (a2)
1045; RV32IA-NEXT:    srl a0, a1, a0
1046; RV32IA-NEXT:    ret
1047;
1048; RV64I-LABEL: atomicrmw_and_i8_acquire:
1049; RV64I:       # %bb.0:
1050; RV64I-NEXT:    addi sp, sp, -16
1051; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1052; RV64I-NEXT:    li a2, 2
1053; RV64I-NEXT:    call __atomic_fetch_and_1@plt
1054; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1055; RV64I-NEXT:    addi sp, sp, 16
1056; RV64I-NEXT:    ret
1057;
1058; RV64IA-LABEL: atomicrmw_and_i8_acquire:
1059; RV64IA:       # %bb.0:
1060; RV64IA-NEXT:    andi a2, a0, -4
1061; RV64IA-NEXT:    slliw a0, a0, 3
1062; RV64IA-NEXT:    li a3, 255
1063; RV64IA-NEXT:    sllw a3, a3, a0
1064; RV64IA-NEXT:    not a3, a3
1065; RV64IA-NEXT:    andi a1, a1, 255
1066; RV64IA-NEXT:    sllw a1, a1, a0
1067; RV64IA-NEXT:    or a1, a3, a1
1068; RV64IA-NEXT:    amoand.w.aq a1, a1, (a2)
1069; RV64IA-NEXT:    srlw a0, a1, a0
1070; RV64IA-NEXT:    ret
1071  %1 = atomicrmw and i8* %a, i8 %b acquire
1072  ret i8 %1
1073}
1074
1075define i8 @atomicrmw_and_i8_release(i8 *%a, i8 %b) nounwind {
1076; RV32I-LABEL: atomicrmw_and_i8_release:
1077; RV32I:       # %bb.0:
1078; RV32I-NEXT:    addi sp, sp, -16
1079; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1080; RV32I-NEXT:    li a2, 3
1081; RV32I-NEXT:    call __atomic_fetch_and_1@plt
1082; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1083; RV32I-NEXT:    addi sp, sp, 16
1084; RV32I-NEXT:    ret
1085;
1086; RV32IA-LABEL: atomicrmw_and_i8_release:
1087; RV32IA:       # %bb.0:
1088; RV32IA-NEXT:    andi a2, a0, -4
1089; RV32IA-NEXT:    slli a0, a0, 3
1090; RV32IA-NEXT:    li a3, 255
1091; RV32IA-NEXT:    sll a3, a3, a0
1092; RV32IA-NEXT:    not a3, a3
1093; RV32IA-NEXT:    andi a1, a1, 255
1094; RV32IA-NEXT:    sll a1, a1, a0
1095; RV32IA-NEXT:    or a1, a3, a1
1096; RV32IA-NEXT:    amoand.w.rl a1, a1, (a2)
1097; RV32IA-NEXT:    srl a0, a1, a0
1098; RV32IA-NEXT:    ret
1099;
1100; RV64I-LABEL: atomicrmw_and_i8_release:
1101; RV64I:       # %bb.0:
1102; RV64I-NEXT:    addi sp, sp, -16
1103; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1104; RV64I-NEXT:    li a2, 3
1105; RV64I-NEXT:    call __atomic_fetch_and_1@plt
1106; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1107; RV64I-NEXT:    addi sp, sp, 16
1108; RV64I-NEXT:    ret
1109;
1110; RV64IA-LABEL: atomicrmw_and_i8_release:
1111; RV64IA:       # %bb.0:
1112; RV64IA-NEXT:    andi a2, a0, -4
1113; RV64IA-NEXT:    slliw a0, a0, 3
1114; RV64IA-NEXT:    li a3, 255
1115; RV64IA-NEXT:    sllw a3, a3, a0
1116; RV64IA-NEXT:    not a3, a3
1117; RV64IA-NEXT:    andi a1, a1, 255
1118; RV64IA-NEXT:    sllw a1, a1, a0
1119; RV64IA-NEXT:    or a1, a3, a1
1120; RV64IA-NEXT:    amoand.w.rl a1, a1, (a2)
1121; RV64IA-NEXT:    srlw a0, a1, a0
1122; RV64IA-NEXT:    ret
1123  %1 = atomicrmw and i8* %a, i8 %b release
1124  ret i8 %1
1125}
1126
1127define i8 @atomicrmw_and_i8_acq_rel(i8 *%a, i8 %b) nounwind {
1128; RV32I-LABEL: atomicrmw_and_i8_acq_rel:
1129; RV32I:       # %bb.0:
1130; RV32I-NEXT:    addi sp, sp, -16
1131; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1132; RV32I-NEXT:    li a2, 4
1133; RV32I-NEXT:    call __atomic_fetch_and_1@plt
1134; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1135; RV32I-NEXT:    addi sp, sp, 16
1136; RV32I-NEXT:    ret
1137;
1138; RV32IA-LABEL: atomicrmw_and_i8_acq_rel:
1139; RV32IA:       # %bb.0:
1140; RV32IA-NEXT:    andi a2, a0, -4
1141; RV32IA-NEXT:    slli a0, a0, 3
1142; RV32IA-NEXT:    li a3, 255
1143; RV32IA-NEXT:    sll a3, a3, a0
1144; RV32IA-NEXT:    not a3, a3
1145; RV32IA-NEXT:    andi a1, a1, 255
1146; RV32IA-NEXT:    sll a1, a1, a0
1147; RV32IA-NEXT:    or a1, a3, a1
1148; RV32IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
1149; RV32IA-NEXT:    srl a0, a1, a0
1150; RV32IA-NEXT:    ret
1151;
1152; RV64I-LABEL: atomicrmw_and_i8_acq_rel:
1153; RV64I:       # %bb.0:
1154; RV64I-NEXT:    addi sp, sp, -16
1155; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1156; RV64I-NEXT:    li a2, 4
1157; RV64I-NEXT:    call __atomic_fetch_and_1@plt
1158; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1159; RV64I-NEXT:    addi sp, sp, 16
1160; RV64I-NEXT:    ret
1161;
1162; RV64IA-LABEL: atomicrmw_and_i8_acq_rel:
1163; RV64IA:       # %bb.0:
1164; RV64IA-NEXT:    andi a2, a0, -4
1165; RV64IA-NEXT:    slliw a0, a0, 3
1166; RV64IA-NEXT:    li a3, 255
1167; RV64IA-NEXT:    sllw a3, a3, a0
1168; RV64IA-NEXT:    not a3, a3
1169; RV64IA-NEXT:    andi a1, a1, 255
1170; RV64IA-NEXT:    sllw a1, a1, a0
1171; RV64IA-NEXT:    or a1, a3, a1
1172; RV64IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
1173; RV64IA-NEXT:    srlw a0, a1, a0
1174; RV64IA-NEXT:    ret
1175  %1 = atomicrmw and i8* %a, i8 %b acq_rel
1176  ret i8 %1
1177}
1178
1179define i8 @atomicrmw_and_i8_seq_cst(i8 *%a, i8 %b) nounwind {
1180; RV32I-LABEL: atomicrmw_and_i8_seq_cst:
1181; RV32I:       # %bb.0:
1182; RV32I-NEXT:    addi sp, sp, -16
1183; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1184; RV32I-NEXT:    li a2, 5
1185; RV32I-NEXT:    call __atomic_fetch_and_1@plt
1186; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1187; RV32I-NEXT:    addi sp, sp, 16
1188; RV32I-NEXT:    ret
1189;
1190; RV32IA-LABEL: atomicrmw_and_i8_seq_cst:
1191; RV32IA:       # %bb.0:
1192; RV32IA-NEXT:    andi a2, a0, -4
1193; RV32IA-NEXT:    slli a0, a0, 3
1194; RV32IA-NEXT:    li a3, 255
1195; RV32IA-NEXT:    sll a3, a3, a0
1196; RV32IA-NEXT:    not a3, a3
1197; RV32IA-NEXT:    andi a1, a1, 255
1198; RV32IA-NEXT:    sll a1, a1, a0
1199; RV32IA-NEXT:    or a1, a3, a1
1200; RV32IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
1201; RV32IA-NEXT:    srl a0, a1, a0
1202; RV32IA-NEXT:    ret
1203;
1204; RV64I-LABEL: atomicrmw_and_i8_seq_cst:
1205; RV64I:       # %bb.0:
1206; RV64I-NEXT:    addi sp, sp, -16
1207; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1208; RV64I-NEXT:    li a2, 5
1209; RV64I-NEXT:    call __atomic_fetch_and_1@plt
1210; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1211; RV64I-NEXT:    addi sp, sp, 16
1212; RV64I-NEXT:    ret
1213;
1214; RV64IA-LABEL: atomicrmw_and_i8_seq_cst:
1215; RV64IA:       # %bb.0:
1216; RV64IA-NEXT:    andi a2, a0, -4
1217; RV64IA-NEXT:    slliw a0, a0, 3
1218; RV64IA-NEXT:    li a3, 255
1219; RV64IA-NEXT:    sllw a3, a3, a0
1220; RV64IA-NEXT:    not a3, a3
1221; RV64IA-NEXT:    andi a1, a1, 255
1222; RV64IA-NEXT:    sllw a1, a1, a0
1223; RV64IA-NEXT:    or a1, a3, a1
1224; RV64IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
1225; RV64IA-NEXT:    srlw a0, a1, a0
1226; RV64IA-NEXT:    ret
1227  %1 = atomicrmw and i8* %a, i8 %b seq_cst
1228  ret i8 %1
1229}
1230
1231define i8 @atomicrmw_nand_i8_monotonic(i8* %a, i8 %b) nounwind {
1232; RV32I-LABEL: atomicrmw_nand_i8_monotonic:
1233; RV32I:       # %bb.0:
1234; RV32I-NEXT:    addi sp, sp, -16
1235; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1236; RV32I-NEXT:    li a2, 0
1237; RV32I-NEXT:    call __atomic_fetch_nand_1@plt
1238; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1239; RV32I-NEXT:    addi sp, sp, 16
1240; RV32I-NEXT:    ret
1241;
1242; RV32IA-LABEL: atomicrmw_nand_i8_monotonic:
1243; RV32IA:       # %bb.0:
1244; RV32IA-NEXT:    andi a2, a0, -4
1245; RV32IA-NEXT:    slli a0, a0, 3
1246; RV32IA-NEXT:    li a3, 255
1247; RV32IA-NEXT:    sll a3, a3, a0
1248; RV32IA-NEXT:    andi a1, a1, 255
1249; RV32IA-NEXT:    sll a1, a1, a0
1250; RV32IA-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
1251; RV32IA-NEXT:    lr.w a4, (a2)
1252; RV32IA-NEXT:    and a5, a4, a1
1253; RV32IA-NEXT:    not a5, a5
1254; RV32IA-NEXT:    xor a5, a4, a5
1255; RV32IA-NEXT:    and a5, a5, a3
1256; RV32IA-NEXT:    xor a5, a4, a5
1257; RV32IA-NEXT:    sc.w a5, a5, (a2)
1258; RV32IA-NEXT:    bnez a5, .LBB20_1
1259; RV32IA-NEXT:  # %bb.2:
1260; RV32IA-NEXT:    srl a0, a4, a0
1261; RV32IA-NEXT:    ret
1262;
1263; RV64I-LABEL: atomicrmw_nand_i8_monotonic:
1264; RV64I:       # %bb.0:
1265; RV64I-NEXT:    addi sp, sp, -16
1266; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1267; RV64I-NEXT:    li a2, 0
1268; RV64I-NEXT:    call __atomic_fetch_nand_1@plt
1269; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1270; RV64I-NEXT:    addi sp, sp, 16
1271; RV64I-NEXT:    ret
1272;
1273; RV64IA-LABEL: atomicrmw_nand_i8_monotonic:
1274; RV64IA:       # %bb.0:
1275; RV64IA-NEXT:    andi a2, a0, -4
1276; RV64IA-NEXT:    slliw a0, a0, 3
1277; RV64IA-NEXT:    li a3, 255
1278; RV64IA-NEXT:    sllw a3, a3, a0
1279; RV64IA-NEXT:    andi a1, a1, 255
1280; RV64IA-NEXT:    sllw a1, a1, a0
1281; RV64IA-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
1282; RV64IA-NEXT:    lr.w a4, (a2)
1283; RV64IA-NEXT:    and a5, a4, a1
1284; RV64IA-NEXT:    not a5, a5
1285; RV64IA-NEXT:    xor a5, a4, a5
1286; RV64IA-NEXT:    and a5, a5, a3
1287; RV64IA-NEXT:    xor a5, a4, a5
1288; RV64IA-NEXT:    sc.w a5, a5, (a2)
1289; RV64IA-NEXT:    bnez a5, .LBB20_1
1290; RV64IA-NEXT:  # %bb.2:
1291; RV64IA-NEXT:    srlw a0, a4, a0
1292; RV64IA-NEXT:    ret
1293  %1 = atomicrmw nand i8* %a, i8 %b monotonic
1294  ret i8 %1
1295}
1296
1297define i8 @atomicrmw_nand_i8_acquire(i8* %a, i8 %b) nounwind {
1298; RV32I-LABEL: atomicrmw_nand_i8_acquire:
1299; RV32I:       # %bb.0:
1300; RV32I-NEXT:    addi sp, sp, -16
1301; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1302; RV32I-NEXT:    li a2, 2
1303; RV32I-NEXT:    call __atomic_fetch_nand_1@plt
1304; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1305; RV32I-NEXT:    addi sp, sp, 16
1306; RV32I-NEXT:    ret
1307;
1308; RV32IA-LABEL: atomicrmw_nand_i8_acquire:
1309; RV32IA:       # %bb.0:
1310; RV32IA-NEXT:    andi a2, a0, -4
1311; RV32IA-NEXT:    slli a0, a0, 3
1312; RV32IA-NEXT:    li a3, 255
1313; RV32IA-NEXT:    sll a3, a3, a0
1314; RV32IA-NEXT:    andi a1, a1, 255
1315; RV32IA-NEXT:    sll a1, a1, a0
1316; RV32IA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
1317; RV32IA-NEXT:    lr.w.aq a4, (a2)
1318; RV32IA-NEXT:    and a5, a4, a1
1319; RV32IA-NEXT:    not a5, a5
1320; RV32IA-NEXT:    xor a5, a4, a5
1321; RV32IA-NEXT:    and a5, a5, a3
1322; RV32IA-NEXT:    xor a5, a4, a5
1323; RV32IA-NEXT:    sc.w a5, a5, (a2)
1324; RV32IA-NEXT:    bnez a5, .LBB21_1
1325; RV32IA-NEXT:  # %bb.2:
1326; RV32IA-NEXT:    srl a0, a4, a0
1327; RV32IA-NEXT:    ret
1328;
1329; RV64I-LABEL: atomicrmw_nand_i8_acquire:
1330; RV64I:       # %bb.0:
1331; RV64I-NEXT:    addi sp, sp, -16
1332; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1333; RV64I-NEXT:    li a2, 2
1334; RV64I-NEXT:    call __atomic_fetch_nand_1@plt
1335; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1336; RV64I-NEXT:    addi sp, sp, 16
1337; RV64I-NEXT:    ret
1338;
1339; RV64IA-LABEL: atomicrmw_nand_i8_acquire:
1340; RV64IA:       # %bb.0:
1341; RV64IA-NEXT:    andi a2, a0, -4
1342; RV64IA-NEXT:    slliw a0, a0, 3
1343; RV64IA-NEXT:    li a3, 255
1344; RV64IA-NEXT:    sllw a3, a3, a0
1345; RV64IA-NEXT:    andi a1, a1, 255
1346; RV64IA-NEXT:    sllw a1, a1, a0
1347; RV64IA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
1348; RV64IA-NEXT:    lr.w.aq a4, (a2)
1349; RV64IA-NEXT:    and a5, a4, a1
1350; RV64IA-NEXT:    not a5, a5
1351; RV64IA-NEXT:    xor a5, a4, a5
1352; RV64IA-NEXT:    and a5, a5, a3
1353; RV64IA-NEXT:    xor a5, a4, a5
1354; RV64IA-NEXT:    sc.w a5, a5, (a2)
1355; RV64IA-NEXT:    bnez a5, .LBB21_1
1356; RV64IA-NEXT:  # %bb.2:
1357; RV64IA-NEXT:    srlw a0, a4, a0
1358; RV64IA-NEXT:    ret
1359  %1 = atomicrmw nand i8* %a, i8 %b acquire
1360  ret i8 %1
1361}
1362
1363define i8 @atomicrmw_nand_i8_release(i8* %a, i8 %b) nounwind {
1364; RV32I-LABEL: atomicrmw_nand_i8_release:
1365; RV32I:       # %bb.0:
1366; RV32I-NEXT:    addi sp, sp, -16
1367; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1368; RV32I-NEXT:    li a2, 3
1369; RV32I-NEXT:    call __atomic_fetch_nand_1@plt
1370; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1371; RV32I-NEXT:    addi sp, sp, 16
1372; RV32I-NEXT:    ret
1373;
1374; RV32IA-LABEL: atomicrmw_nand_i8_release:
1375; RV32IA:       # %bb.0:
1376; RV32IA-NEXT:    andi a2, a0, -4
1377; RV32IA-NEXT:    slli a0, a0, 3
1378; RV32IA-NEXT:    li a3, 255
1379; RV32IA-NEXT:    sll a3, a3, a0
1380; RV32IA-NEXT:    andi a1, a1, 255
1381; RV32IA-NEXT:    sll a1, a1, a0
1382; RV32IA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
1383; RV32IA-NEXT:    lr.w a4, (a2)
1384; RV32IA-NEXT:    and a5, a4, a1
1385; RV32IA-NEXT:    not a5, a5
1386; RV32IA-NEXT:    xor a5, a4, a5
1387; RV32IA-NEXT:    and a5, a5, a3
1388; RV32IA-NEXT:    xor a5, a4, a5
1389; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
1390; RV32IA-NEXT:    bnez a5, .LBB22_1
1391; RV32IA-NEXT:  # %bb.2:
1392; RV32IA-NEXT:    srl a0, a4, a0
1393; RV32IA-NEXT:    ret
1394;
1395; RV64I-LABEL: atomicrmw_nand_i8_release:
1396; RV64I:       # %bb.0:
1397; RV64I-NEXT:    addi sp, sp, -16
1398; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1399; RV64I-NEXT:    li a2, 3
1400; RV64I-NEXT:    call __atomic_fetch_nand_1@plt
1401; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1402; RV64I-NEXT:    addi sp, sp, 16
1403; RV64I-NEXT:    ret
1404;
1405; RV64IA-LABEL: atomicrmw_nand_i8_release:
1406; RV64IA:       # %bb.0:
1407; RV64IA-NEXT:    andi a2, a0, -4
1408; RV64IA-NEXT:    slliw a0, a0, 3
1409; RV64IA-NEXT:    li a3, 255
1410; RV64IA-NEXT:    sllw a3, a3, a0
1411; RV64IA-NEXT:    andi a1, a1, 255
1412; RV64IA-NEXT:    sllw a1, a1, a0
1413; RV64IA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
1414; RV64IA-NEXT:    lr.w a4, (a2)
1415; RV64IA-NEXT:    and a5, a4, a1
1416; RV64IA-NEXT:    not a5, a5
1417; RV64IA-NEXT:    xor a5, a4, a5
1418; RV64IA-NEXT:    and a5, a5, a3
1419; RV64IA-NEXT:    xor a5, a4, a5
1420; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
1421; RV64IA-NEXT:    bnez a5, .LBB22_1
1422; RV64IA-NEXT:  # %bb.2:
1423; RV64IA-NEXT:    srlw a0, a4, a0
1424; RV64IA-NEXT:    ret
1425  %1 = atomicrmw nand i8* %a, i8 %b release
1426  ret i8 %1
1427}
1428
1429define i8 @atomicrmw_nand_i8_acq_rel(i8* %a, i8 %b) nounwind {
1430; RV32I-LABEL: atomicrmw_nand_i8_acq_rel:
1431; RV32I:       # %bb.0:
1432; RV32I-NEXT:    addi sp, sp, -16
1433; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1434; RV32I-NEXT:    li a2, 4
1435; RV32I-NEXT:    call __atomic_fetch_nand_1@plt
1436; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1437; RV32I-NEXT:    addi sp, sp, 16
1438; RV32I-NEXT:    ret
1439;
1440; RV32IA-LABEL: atomicrmw_nand_i8_acq_rel:
1441; RV32IA:       # %bb.0:
1442; RV32IA-NEXT:    andi a2, a0, -4
1443; RV32IA-NEXT:    slli a0, a0, 3
1444; RV32IA-NEXT:    li a3, 255
1445; RV32IA-NEXT:    sll a3, a3, a0
1446; RV32IA-NEXT:    andi a1, a1, 255
1447; RV32IA-NEXT:    sll a1, a1, a0
1448; RV32IA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
1449; RV32IA-NEXT:    lr.w.aq a4, (a2)
1450; RV32IA-NEXT:    and a5, a4, a1
1451; RV32IA-NEXT:    not a5, a5
1452; RV32IA-NEXT:    xor a5, a4, a5
1453; RV32IA-NEXT:    and a5, a5, a3
1454; RV32IA-NEXT:    xor a5, a4, a5
1455; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
1456; RV32IA-NEXT:    bnez a5, .LBB23_1
1457; RV32IA-NEXT:  # %bb.2:
1458; RV32IA-NEXT:    srl a0, a4, a0
1459; RV32IA-NEXT:    ret
1460;
1461; RV64I-LABEL: atomicrmw_nand_i8_acq_rel:
1462; RV64I:       # %bb.0:
1463; RV64I-NEXT:    addi sp, sp, -16
1464; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1465; RV64I-NEXT:    li a2, 4
1466; RV64I-NEXT:    call __atomic_fetch_nand_1@plt
1467; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1468; RV64I-NEXT:    addi sp, sp, 16
1469; RV64I-NEXT:    ret
1470;
1471; RV64IA-LABEL: atomicrmw_nand_i8_acq_rel:
1472; RV64IA:       # %bb.0:
1473; RV64IA-NEXT:    andi a2, a0, -4
1474; RV64IA-NEXT:    slliw a0, a0, 3
1475; RV64IA-NEXT:    li a3, 255
1476; RV64IA-NEXT:    sllw a3, a3, a0
1477; RV64IA-NEXT:    andi a1, a1, 255
1478; RV64IA-NEXT:    sllw a1, a1, a0
1479; RV64IA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
1480; RV64IA-NEXT:    lr.w.aq a4, (a2)
1481; RV64IA-NEXT:    and a5, a4, a1
1482; RV64IA-NEXT:    not a5, a5
1483; RV64IA-NEXT:    xor a5, a4, a5
1484; RV64IA-NEXT:    and a5, a5, a3
1485; RV64IA-NEXT:    xor a5, a4, a5
1486; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
1487; RV64IA-NEXT:    bnez a5, .LBB23_1
1488; RV64IA-NEXT:  # %bb.2:
1489; RV64IA-NEXT:    srlw a0, a4, a0
1490; RV64IA-NEXT:    ret
1491  %1 = atomicrmw nand i8* %a, i8 %b acq_rel
1492  ret i8 %1
1493}
1494
1495define i8 @atomicrmw_nand_i8_seq_cst(i8* %a, i8 %b) nounwind {
1496; RV32I-LABEL: atomicrmw_nand_i8_seq_cst:
1497; RV32I:       # %bb.0:
1498; RV32I-NEXT:    addi sp, sp, -16
1499; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1500; RV32I-NEXT:    li a2, 5
1501; RV32I-NEXT:    call __atomic_fetch_nand_1@plt
1502; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1503; RV32I-NEXT:    addi sp, sp, 16
1504; RV32I-NEXT:    ret
1505;
1506; RV32IA-LABEL: atomicrmw_nand_i8_seq_cst:
1507; RV32IA:       # %bb.0:
1508; RV32IA-NEXT:    andi a2, a0, -4
1509; RV32IA-NEXT:    slli a0, a0, 3
1510; RV32IA-NEXT:    li a3, 255
1511; RV32IA-NEXT:    sll a3, a3, a0
1512; RV32IA-NEXT:    andi a1, a1, 255
1513; RV32IA-NEXT:    sll a1, a1, a0
1514; RV32IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
1515; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
1516; RV32IA-NEXT:    and a5, a4, a1
1517; RV32IA-NEXT:    not a5, a5
1518; RV32IA-NEXT:    xor a5, a4, a5
1519; RV32IA-NEXT:    and a5, a5, a3
1520; RV32IA-NEXT:    xor a5, a4, a5
1521; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
1522; RV32IA-NEXT:    bnez a5, .LBB24_1
1523; RV32IA-NEXT:  # %bb.2:
1524; RV32IA-NEXT:    srl a0, a4, a0
1525; RV32IA-NEXT:    ret
1526;
1527; RV64I-LABEL: atomicrmw_nand_i8_seq_cst:
1528; RV64I:       # %bb.0:
1529; RV64I-NEXT:    addi sp, sp, -16
1530; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1531; RV64I-NEXT:    li a2, 5
1532; RV64I-NEXT:    call __atomic_fetch_nand_1@plt
1533; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1534; RV64I-NEXT:    addi sp, sp, 16
1535; RV64I-NEXT:    ret
1536;
1537; RV64IA-LABEL: atomicrmw_nand_i8_seq_cst:
1538; RV64IA:       # %bb.0:
1539; RV64IA-NEXT:    andi a2, a0, -4
1540; RV64IA-NEXT:    slliw a0, a0, 3
1541; RV64IA-NEXT:    li a3, 255
1542; RV64IA-NEXT:    sllw a3, a3, a0
1543; RV64IA-NEXT:    andi a1, a1, 255
1544; RV64IA-NEXT:    sllw a1, a1, a0
1545; RV64IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
1546; RV64IA-NEXT:    lr.w.aqrl a4, (a2)
1547; RV64IA-NEXT:    and a5, a4, a1
1548; RV64IA-NEXT:    not a5, a5
1549; RV64IA-NEXT:    xor a5, a4, a5
1550; RV64IA-NEXT:    and a5, a5, a3
1551; RV64IA-NEXT:    xor a5, a4, a5
1552; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
1553; RV64IA-NEXT:    bnez a5, .LBB24_1
1554; RV64IA-NEXT:  # %bb.2:
1555; RV64IA-NEXT:    srlw a0, a4, a0
1556; RV64IA-NEXT:    ret
1557  %1 = atomicrmw nand i8* %a, i8 %b seq_cst
1558  ret i8 %1
1559}
1560
1561define i8 @atomicrmw_or_i8_monotonic(i8 *%a, i8 %b) nounwind {
1562; RV32I-LABEL: atomicrmw_or_i8_monotonic:
1563; RV32I:       # %bb.0:
1564; RV32I-NEXT:    addi sp, sp, -16
1565; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1566; RV32I-NEXT:    li a2, 0
1567; RV32I-NEXT:    call __atomic_fetch_or_1@plt
1568; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1569; RV32I-NEXT:    addi sp, sp, 16
1570; RV32I-NEXT:    ret
1571;
1572; RV32IA-LABEL: atomicrmw_or_i8_monotonic:
1573; RV32IA:       # %bb.0:
1574; RV32IA-NEXT:    andi a2, a0, -4
1575; RV32IA-NEXT:    slli a0, a0, 3
1576; RV32IA-NEXT:    andi a1, a1, 255
1577; RV32IA-NEXT:    sll a1, a1, a0
1578; RV32IA-NEXT:    amoor.w a1, a1, (a2)
1579; RV32IA-NEXT:    srl a0, a1, a0
1580; RV32IA-NEXT:    ret
1581;
1582; RV64I-LABEL: atomicrmw_or_i8_monotonic:
1583; RV64I:       # %bb.0:
1584; RV64I-NEXT:    addi sp, sp, -16
1585; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1586; RV64I-NEXT:    li a2, 0
1587; RV64I-NEXT:    call __atomic_fetch_or_1@plt
1588; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1589; RV64I-NEXT:    addi sp, sp, 16
1590; RV64I-NEXT:    ret
1591;
1592; RV64IA-LABEL: atomicrmw_or_i8_monotonic:
1593; RV64IA:       # %bb.0:
1594; RV64IA-NEXT:    andi a2, a0, -4
1595; RV64IA-NEXT:    slliw a0, a0, 3
1596; RV64IA-NEXT:    andi a1, a1, 255
1597; RV64IA-NEXT:    sllw a1, a1, a0
1598; RV64IA-NEXT:    amoor.w a1, a1, (a2)
1599; RV64IA-NEXT:    srlw a0, a1, a0
1600; RV64IA-NEXT:    ret
1601  %1 = atomicrmw or i8* %a, i8 %b monotonic
1602  ret i8 %1
1603}
1604
1605define i8 @atomicrmw_or_i8_acquire(i8 *%a, i8 %b) nounwind {
1606; RV32I-LABEL: atomicrmw_or_i8_acquire:
1607; RV32I:       # %bb.0:
1608; RV32I-NEXT:    addi sp, sp, -16
1609; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1610; RV32I-NEXT:    li a2, 2
1611; RV32I-NEXT:    call __atomic_fetch_or_1@plt
1612; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1613; RV32I-NEXT:    addi sp, sp, 16
1614; RV32I-NEXT:    ret
1615;
1616; RV32IA-LABEL: atomicrmw_or_i8_acquire:
1617; RV32IA:       # %bb.0:
1618; RV32IA-NEXT:    andi a2, a0, -4
1619; RV32IA-NEXT:    slli a0, a0, 3
1620; RV32IA-NEXT:    andi a1, a1, 255
1621; RV32IA-NEXT:    sll a1, a1, a0
1622; RV32IA-NEXT:    amoor.w.aq a1, a1, (a2)
1623; RV32IA-NEXT:    srl a0, a1, a0
1624; RV32IA-NEXT:    ret
1625;
1626; RV64I-LABEL: atomicrmw_or_i8_acquire:
1627; RV64I:       # %bb.0:
1628; RV64I-NEXT:    addi sp, sp, -16
1629; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1630; RV64I-NEXT:    li a2, 2
1631; RV64I-NEXT:    call __atomic_fetch_or_1@plt
1632; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1633; RV64I-NEXT:    addi sp, sp, 16
1634; RV64I-NEXT:    ret
1635;
1636; RV64IA-LABEL: atomicrmw_or_i8_acquire:
1637; RV64IA:       # %bb.0:
1638; RV64IA-NEXT:    andi a2, a0, -4
1639; RV64IA-NEXT:    slliw a0, a0, 3
1640; RV64IA-NEXT:    andi a1, a1, 255
1641; RV64IA-NEXT:    sllw a1, a1, a0
1642; RV64IA-NEXT:    amoor.w.aq a1, a1, (a2)
1643; RV64IA-NEXT:    srlw a0, a1, a0
1644; RV64IA-NEXT:    ret
1645  %1 = atomicrmw or i8* %a, i8 %b acquire
1646  ret i8 %1
1647}
1648
1649define i8 @atomicrmw_or_i8_release(i8 *%a, i8 %b) nounwind {
1650; RV32I-LABEL: atomicrmw_or_i8_release:
1651; RV32I:       # %bb.0:
1652; RV32I-NEXT:    addi sp, sp, -16
1653; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1654; RV32I-NEXT:    li a2, 3
1655; RV32I-NEXT:    call __atomic_fetch_or_1@plt
1656; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1657; RV32I-NEXT:    addi sp, sp, 16
1658; RV32I-NEXT:    ret
1659;
1660; RV32IA-LABEL: atomicrmw_or_i8_release:
1661; RV32IA:       # %bb.0:
1662; RV32IA-NEXT:    andi a2, a0, -4
1663; RV32IA-NEXT:    slli a0, a0, 3
1664; RV32IA-NEXT:    andi a1, a1, 255
1665; RV32IA-NEXT:    sll a1, a1, a0
1666; RV32IA-NEXT:    amoor.w.rl a1, a1, (a2)
1667; RV32IA-NEXT:    srl a0, a1, a0
1668; RV32IA-NEXT:    ret
1669;
1670; RV64I-LABEL: atomicrmw_or_i8_release:
1671; RV64I:       # %bb.0:
1672; RV64I-NEXT:    addi sp, sp, -16
1673; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1674; RV64I-NEXT:    li a2, 3
1675; RV64I-NEXT:    call __atomic_fetch_or_1@plt
1676; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1677; RV64I-NEXT:    addi sp, sp, 16
1678; RV64I-NEXT:    ret
1679;
1680; RV64IA-LABEL: atomicrmw_or_i8_release:
1681; RV64IA:       # %bb.0:
1682; RV64IA-NEXT:    andi a2, a0, -4
1683; RV64IA-NEXT:    slliw a0, a0, 3
1684; RV64IA-NEXT:    andi a1, a1, 255
1685; RV64IA-NEXT:    sllw a1, a1, a0
1686; RV64IA-NEXT:    amoor.w.rl a1, a1, (a2)
1687; RV64IA-NEXT:    srlw a0, a1, a0
1688; RV64IA-NEXT:    ret
1689  %1 = atomicrmw or i8* %a, i8 %b release
1690  ret i8 %1
1691}
1692
1693define i8 @atomicrmw_or_i8_acq_rel(i8 *%a, i8 %b) nounwind {
1694; RV32I-LABEL: atomicrmw_or_i8_acq_rel:
1695; RV32I:       # %bb.0:
1696; RV32I-NEXT:    addi sp, sp, -16
1697; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1698; RV32I-NEXT:    li a2, 4
1699; RV32I-NEXT:    call __atomic_fetch_or_1@plt
1700; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1701; RV32I-NEXT:    addi sp, sp, 16
1702; RV32I-NEXT:    ret
1703;
1704; RV32IA-LABEL: atomicrmw_or_i8_acq_rel:
1705; RV32IA:       # %bb.0:
1706; RV32IA-NEXT:    andi a2, a0, -4
1707; RV32IA-NEXT:    slli a0, a0, 3
1708; RV32IA-NEXT:    andi a1, a1, 255
1709; RV32IA-NEXT:    sll a1, a1, a0
1710; RV32IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
1711; RV32IA-NEXT:    srl a0, a1, a0
1712; RV32IA-NEXT:    ret
1713;
1714; RV64I-LABEL: atomicrmw_or_i8_acq_rel:
1715; RV64I:       # %bb.0:
1716; RV64I-NEXT:    addi sp, sp, -16
1717; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1718; RV64I-NEXT:    li a2, 4
1719; RV64I-NEXT:    call __atomic_fetch_or_1@plt
1720; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1721; RV64I-NEXT:    addi sp, sp, 16
1722; RV64I-NEXT:    ret
1723;
1724; RV64IA-LABEL: atomicrmw_or_i8_acq_rel:
1725; RV64IA:       # %bb.0:
1726; RV64IA-NEXT:    andi a2, a0, -4
1727; RV64IA-NEXT:    slliw a0, a0, 3
1728; RV64IA-NEXT:    andi a1, a1, 255
1729; RV64IA-NEXT:    sllw a1, a1, a0
1730; RV64IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
1731; RV64IA-NEXT:    srlw a0, a1, a0
1732; RV64IA-NEXT:    ret
1733  %1 = atomicrmw or i8* %a, i8 %b acq_rel
1734  ret i8 %1
1735}
1736
1737define i8 @atomicrmw_or_i8_seq_cst(i8 *%a, i8 %b) nounwind {
1738; RV32I-LABEL: atomicrmw_or_i8_seq_cst:
1739; RV32I:       # %bb.0:
1740; RV32I-NEXT:    addi sp, sp, -16
1741; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1742; RV32I-NEXT:    li a2, 5
1743; RV32I-NEXT:    call __atomic_fetch_or_1@plt
1744; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1745; RV32I-NEXT:    addi sp, sp, 16
1746; RV32I-NEXT:    ret
1747;
1748; RV32IA-LABEL: atomicrmw_or_i8_seq_cst:
1749; RV32IA:       # %bb.0:
1750; RV32IA-NEXT:    andi a2, a0, -4
1751; RV32IA-NEXT:    slli a0, a0, 3
1752; RV32IA-NEXT:    andi a1, a1, 255
1753; RV32IA-NEXT:    sll a1, a1, a0
1754; RV32IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
1755; RV32IA-NEXT:    srl a0, a1, a0
1756; RV32IA-NEXT:    ret
1757;
1758; RV64I-LABEL: atomicrmw_or_i8_seq_cst:
1759; RV64I:       # %bb.0:
1760; RV64I-NEXT:    addi sp, sp, -16
1761; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1762; RV64I-NEXT:    li a2, 5
1763; RV64I-NEXT:    call __atomic_fetch_or_1@plt
1764; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1765; RV64I-NEXT:    addi sp, sp, 16
1766; RV64I-NEXT:    ret
1767;
1768; RV64IA-LABEL: atomicrmw_or_i8_seq_cst:
1769; RV64IA:       # %bb.0:
1770; RV64IA-NEXT:    andi a2, a0, -4
1771; RV64IA-NEXT:    slliw a0, a0, 3
1772; RV64IA-NEXT:    andi a1, a1, 255
1773; RV64IA-NEXT:    sllw a1, a1, a0
1774; RV64IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
1775; RV64IA-NEXT:    srlw a0, a1, a0
1776; RV64IA-NEXT:    ret
1777  %1 = atomicrmw or i8* %a, i8 %b seq_cst
1778  ret i8 %1
1779}
1780
1781define i8 @atomicrmw_xor_i8_monotonic(i8 *%a, i8 %b) nounwind {
1782; RV32I-LABEL: atomicrmw_xor_i8_monotonic:
1783; RV32I:       # %bb.0:
1784; RV32I-NEXT:    addi sp, sp, -16
1785; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1786; RV32I-NEXT:    li a2, 0
1787; RV32I-NEXT:    call __atomic_fetch_xor_1@plt
1788; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1789; RV32I-NEXT:    addi sp, sp, 16
1790; RV32I-NEXT:    ret
1791;
1792; RV32IA-LABEL: atomicrmw_xor_i8_monotonic:
1793; RV32IA:       # %bb.0:
1794; RV32IA-NEXT:    andi a2, a0, -4
1795; RV32IA-NEXT:    slli a0, a0, 3
1796; RV32IA-NEXT:    andi a1, a1, 255
1797; RV32IA-NEXT:    sll a1, a1, a0
1798; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
1799; RV32IA-NEXT:    srl a0, a1, a0
1800; RV32IA-NEXT:    ret
1801;
1802; RV64I-LABEL: atomicrmw_xor_i8_monotonic:
1803; RV64I:       # %bb.0:
1804; RV64I-NEXT:    addi sp, sp, -16
1805; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1806; RV64I-NEXT:    li a2, 0
1807; RV64I-NEXT:    call __atomic_fetch_xor_1@plt
1808; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1809; RV64I-NEXT:    addi sp, sp, 16
1810; RV64I-NEXT:    ret
1811;
1812; RV64IA-LABEL: atomicrmw_xor_i8_monotonic:
1813; RV64IA:       # %bb.0:
1814; RV64IA-NEXT:    andi a2, a0, -4
1815; RV64IA-NEXT:    slliw a0, a0, 3
1816; RV64IA-NEXT:    andi a1, a1, 255
1817; RV64IA-NEXT:    sllw a1, a1, a0
1818; RV64IA-NEXT:    amoxor.w a1, a1, (a2)
1819; RV64IA-NEXT:    srlw a0, a1, a0
1820; RV64IA-NEXT:    ret
1821  %1 = atomicrmw xor i8* %a, i8 %b monotonic
1822  ret i8 %1
1823}
1824
1825define i8 @atomicrmw_xor_i8_acquire(i8 *%a, i8 %b) nounwind {
1826; RV32I-LABEL: atomicrmw_xor_i8_acquire:
1827; RV32I:       # %bb.0:
1828; RV32I-NEXT:    addi sp, sp, -16
1829; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1830; RV32I-NEXT:    li a2, 2
1831; RV32I-NEXT:    call __atomic_fetch_xor_1@plt
1832; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1833; RV32I-NEXT:    addi sp, sp, 16
1834; RV32I-NEXT:    ret
1835;
1836; RV32IA-LABEL: atomicrmw_xor_i8_acquire:
1837; RV32IA:       # %bb.0:
1838; RV32IA-NEXT:    andi a2, a0, -4
1839; RV32IA-NEXT:    slli a0, a0, 3
1840; RV32IA-NEXT:    andi a1, a1, 255
1841; RV32IA-NEXT:    sll a1, a1, a0
1842; RV32IA-NEXT:    amoxor.w.aq a1, a1, (a2)
1843; RV32IA-NEXT:    srl a0, a1, a0
1844; RV32IA-NEXT:    ret
1845;
1846; RV64I-LABEL: atomicrmw_xor_i8_acquire:
1847; RV64I:       # %bb.0:
1848; RV64I-NEXT:    addi sp, sp, -16
1849; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1850; RV64I-NEXT:    li a2, 2
1851; RV64I-NEXT:    call __atomic_fetch_xor_1@plt
1852; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1853; RV64I-NEXT:    addi sp, sp, 16
1854; RV64I-NEXT:    ret
1855;
1856; RV64IA-LABEL: atomicrmw_xor_i8_acquire:
1857; RV64IA:       # %bb.0:
1858; RV64IA-NEXT:    andi a2, a0, -4
1859; RV64IA-NEXT:    slliw a0, a0, 3
1860; RV64IA-NEXT:    andi a1, a1, 255
1861; RV64IA-NEXT:    sllw a1, a1, a0
1862; RV64IA-NEXT:    amoxor.w.aq a1, a1, (a2)
1863; RV64IA-NEXT:    srlw a0, a1, a0
1864; RV64IA-NEXT:    ret
1865  %1 = atomicrmw xor i8* %a, i8 %b acquire
1866  ret i8 %1
1867}
1868
1869define i8 @atomicrmw_xor_i8_release(i8 *%a, i8 %b) nounwind {
1870; RV32I-LABEL: atomicrmw_xor_i8_release:
1871; RV32I:       # %bb.0:
1872; RV32I-NEXT:    addi sp, sp, -16
1873; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1874; RV32I-NEXT:    li a2, 3
1875; RV32I-NEXT:    call __atomic_fetch_xor_1@plt
1876; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1877; RV32I-NEXT:    addi sp, sp, 16
1878; RV32I-NEXT:    ret
1879;
1880; RV32IA-LABEL: atomicrmw_xor_i8_release:
1881; RV32IA:       # %bb.0:
1882; RV32IA-NEXT:    andi a2, a0, -4
1883; RV32IA-NEXT:    slli a0, a0, 3
1884; RV32IA-NEXT:    andi a1, a1, 255
1885; RV32IA-NEXT:    sll a1, a1, a0
1886; RV32IA-NEXT:    amoxor.w.rl a1, a1, (a2)
1887; RV32IA-NEXT:    srl a0, a1, a0
1888; RV32IA-NEXT:    ret
1889;
1890; RV64I-LABEL: atomicrmw_xor_i8_release:
1891; RV64I:       # %bb.0:
1892; RV64I-NEXT:    addi sp, sp, -16
1893; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1894; RV64I-NEXT:    li a2, 3
1895; RV64I-NEXT:    call __atomic_fetch_xor_1@plt
1896; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1897; RV64I-NEXT:    addi sp, sp, 16
1898; RV64I-NEXT:    ret
1899;
1900; RV64IA-LABEL: atomicrmw_xor_i8_release:
1901; RV64IA:       # %bb.0:
1902; RV64IA-NEXT:    andi a2, a0, -4
1903; RV64IA-NEXT:    slliw a0, a0, 3
1904; RV64IA-NEXT:    andi a1, a1, 255
1905; RV64IA-NEXT:    sllw a1, a1, a0
1906; RV64IA-NEXT:    amoxor.w.rl a1, a1, (a2)
1907; RV64IA-NEXT:    srlw a0, a1, a0
1908; RV64IA-NEXT:    ret
1909  %1 = atomicrmw xor i8* %a, i8 %b release
1910  ret i8 %1
1911}
1912
1913define i8 @atomicrmw_xor_i8_acq_rel(i8 *%a, i8 %b) nounwind {
1914; RV32I-LABEL: atomicrmw_xor_i8_acq_rel:
1915; RV32I:       # %bb.0:
1916; RV32I-NEXT:    addi sp, sp, -16
1917; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1918; RV32I-NEXT:    li a2, 4
1919; RV32I-NEXT:    call __atomic_fetch_xor_1@plt
1920; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1921; RV32I-NEXT:    addi sp, sp, 16
1922; RV32I-NEXT:    ret
1923;
1924; RV32IA-LABEL: atomicrmw_xor_i8_acq_rel:
1925; RV32IA:       # %bb.0:
1926; RV32IA-NEXT:    andi a2, a0, -4
1927; RV32IA-NEXT:    slli a0, a0, 3
1928; RV32IA-NEXT:    andi a1, a1, 255
1929; RV32IA-NEXT:    sll a1, a1, a0
1930; RV32IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
1931; RV32IA-NEXT:    srl a0, a1, a0
1932; RV32IA-NEXT:    ret
1933;
1934; RV64I-LABEL: atomicrmw_xor_i8_acq_rel:
1935; RV64I:       # %bb.0:
1936; RV64I-NEXT:    addi sp, sp, -16
1937; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1938; RV64I-NEXT:    li a2, 4
1939; RV64I-NEXT:    call __atomic_fetch_xor_1@plt
1940; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1941; RV64I-NEXT:    addi sp, sp, 16
1942; RV64I-NEXT:    ret
1943;
1944; RV64IA-LABEL: atomicrmw_xor_i8_acq_rel:
1945; RV64IA:       # %bb.0:
1946; RV64IA-NEXT:    andi a2, a0, -4
1947; RV64IA-NEXT:    slliw a0, a0, 3
1948; RV64IA-NEXT:    andi a1, a1, 255
1949; RV64IA-NEXT:    sllw a1, a1, a0
1950; RV64IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
1951; RV64IA-NEXT:    srlw a0, a1, a0
1952; RV64IA-NEXT:    ret
1953  %1 = atomicrmw xor i8* %a, i8 %b acq_rel
1954  ret i8 %1
1955}
1956
1957define i8 @atomicrmw_xor_i8_seq_cst(i8 *%a, i8 %b) nounwind {
1958; RV32I-LABEL: atomicrmw_xor_i8_seq_cst:
1959; RV32I:       # %bb.0:
1960; RV32I-NEXT:    addi sp, sp, -16
1961; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1962; RV32I-NEXT:    li a2, 5
1963; RV32I-NEXT:    call __atomic_fetch_xor_1@plt
1964; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1965; RV32I-NEXT:    addi sp, sp, 16
1966; RV32I-NEXT:    ret
1967;
1968; RV32IA-LABEL: atomicrmw_xor_i8_seq_cst:
1969; RV32IA:       # %bb.0:
1970; RV32IA-NEXT:    andi a2, a0, -4
1971; RV32IA-NEXT:    slli a0, a0, 3
1972; RV32IA-NEXT:    andi a1, a1, 255
1973; RV32IA-NEXT:    sll a1, a1, a0
1974; RV32IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
1975; RV32IA-NEXT:    srl a0, a1, a0
1976; RV32IA-NEXT:    ret
1977;
1978; RV64I-LABEL: atomicrmw_xor_i8_seq_cst:
1979; RV64I:       # %bb.0:
1980; RV64I-NEXT:    addi sp, sp, -16
1981; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1982; RV64I-NEXT:    li a2, 5
1983; RV64I-NEXT:    call __atomic_fetch_xor_1@plt
1984; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1985; RV64I-NEXT:    addi sp, sp, 16
1986; RV64I-NEXT:    ret
1987;
1988; RV64IA-LABEL: atomicrmw_xor_i8_seq_cst:
1989; RV64IA:       # %bb.0:
1990; RV64IA-NEXT:    andi a2, a0, -4
1991; RV64IA-NEXT:    slliw a0, a0, 3
1992; RV64IA-NEXT:    andi a1, a1, 255
1993; RV64IA-NEXT:    sllw a1, a1, a0
1994; RV64IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
1995; RV64IA-NEXT:    srlw a0, a1, a0
1996; RV64IA-NEXT:    ret
1997  %1 = atomicrmw xor i8* %a, i8 %b seq_cst
1998  ret i8 %1
1999}
2000
2001define i8 @atomicrmw_max_i8_monotonic(i8 *%a, i8 %b) nounwind {
2002; RV32I-LABEL: atomicrmw_max_i8_monotonic:
2003; RV32I:       # %bb.0:
2004; RV32I-NEXT:    addi sp, sp, -32
2005; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2006; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2007; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2008; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2009; RV32I-NEXT:    mv s0, a0
2010; RV32I-NEXT:    lbu a3, 0(a0)
2011; RV32I-NEXT:    mv s1, a1
2012; RV32I-NEXT:    slli a0, a1, 24
2013; RV32I-NEXT:    srai s2, a0, 24
2014; RV32I-NEXT:    j .LBB35_2
2015; RV32I-NEXT:  .LBB35_1: # %atomicrmw.start
2016; RV32I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2017; RV32I-NEXT:    sb a3, 15(sp)
2018; RV32I-NEXT:    addi a1, sp, 15
2019; RV32I-NEXT:    mv a0, s0
2020; RV32I-NEXT:    li a3, 0
2021; RV32I-NEXT:    li a4, 0
2022; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2023; RV32I-NEXT:    lb a3, 15(sp)
2024; RV32I-NEXT:    bnez a0, .LBB35_4
2025; RV32I-NEXT:  .LBB35_2: # %atomicrmw.start
2026; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2027; RV32I-NEXT:    slli a0, a3, 24
2028; RV32I-NEXT:    srai a0, a0, 24
2029; RV32I-NEXT:    mv a2, a3
2030; RV32I-NEXT:    blt s2, a0, .LBB35_1
2031; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2032; RV32I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2033; RV32I-NEXT:    mv a2, s1
2034; RV32I-NEXT:    j .LBB35_1
2035; RV32I-NEXT:  .LBB35_4: # %atomicrmw.end
2036; RV32I-NEXT:    mv a0, a3
2037; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2038; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2039; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2040; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2041; RV32I-NEXT:    addi sp, sp, 32
2042; RV32I-NEXT:    ret
2043;
2044; RV32IA-LABEL: atomicrmw_max_i8_monotonic:
2045; RV32IA:       # %bb.0:
2046; RV32IA-NEXT:    andi a2, a0, -4
2047; RV32IA-NEXT:    slli a0, a0, 3
2048; RV32IA-NEXT:    andi a3, a0, 24
2049; RV32IA-NEXT:    li a4, 255
2050; RV32IA-NEXT:    sll a4, a4, a0
2051; RV32IA-NEXT:    slli a1, a1, 24
2052; RV32IA-NEXT:    srai a1, a1, 24
2053; RV32IA-NEXT:    sll a1, a1, a0
2054; RV32IA-NEXT:    xori a3, a3, 24
2055; RV32IA-NEXT:  .LBB35_1: # =>This Inner Loop Header: Depth=1
2056; RV32IA-NEXT:    lr.w a5, (a2)
2057; RV32IA-NEXT:    and a7, a5, a4
2058; RV32IA-NEXT:    mv a6, a5
2059; RV32IA-NEXT:    sll a7, a7, a3
2060; RV32IA-NEXT:    sra a7, a7, a3
2061; RV32IA-NEXT:    bge a7, a1, .LBB35_3
2062; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB35_1 Depth=1
2063; RV32IA-NEXT:    xor a6, a5, a1
2064; RV32IA-NEXT:    and a6, a6, a4
2065; RV32IA-NEXT:    xor a6, a5, a6
2066; RV32IA-NEXT:  .LBB35_3: # in Loop: Header=BB35_1 Depth=1
2067; RV32IA-NEXT:    sc.w a6, a6, (a2)
2068; RV32IA-NEXT:    bnez a6, .LBB35_1
2069; RV32IA-NEXT:  # %bb.4:
2070; RV32IA-NEXT:    srl a0, a5, a0
2071; RV32IA-NEXT:    ret
2072;
2073; RV64I-LABEL: atomicrmw_max_i8_monotonic:
2074; RV64I:       # %bb.0:
2075; RV64I-NEXT:    addi sp, sp, -48
2076; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2077; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2078; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2079; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2080; RV64I-NEXT:    mv s0, a0
2081; RV64I-NEXT:    lbu a3, 0(a0)
2082; RV64I-NEXT:    mv s1, a1
2083; RV64I-NEXT:    slli a0, a1, 56
2084; RV64I-NEXT:    srai s2, a0, 56
2085; RV64I-NEXT:    j .LBB35_2
2086; RV64I-NEXT:  .LBB35_1: # %atomicrmw.start
2087; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2088; RV64I-NEXT:    sb a3, 15(sp)
2089; RV64I-NEXT:    addi a1, sp, 15
2090; RV64I-NEXT:    mv a0, s0
2091; RV64I-NEXT:    li a3, 0
2092; RV64I-NEXT:    li a4, 0
2093; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2094; RV64I-NEXT:    lb a3, 15(sp)
2095; RV64I-NEXT:    bnez a0, .LBB35_4
2096; RV64I-NEXT:  .LBB35_2: # %atomicrmw.start
2097; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2098; RV64I-NEXT:    slli a0, a3, 56
2099; RV64I-NEXT:    srai a0, a0, 56
2100; RV64I-NEXT:    mv a2, a3
2101; RV64I-NEXT:    blt s2, a0, .LBB35_1
2102; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2103; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2104; RV64I-NEXT:    mv a2, s1
2105; RV64I-NEXT:    j .LBB35_1
2106; RV64I-NEXT:  .LBB35_4: # %atomicrmw.end
2107; RV64I-NEXT:    mv a0, a3
2108; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2109; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2110; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2111; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2112; RV64I-NEXT:    addi sp, sp, 48
2113; RV64I-NEXT:    ret
2114;
2115; RV64IA-LABEL: atomicrmw_max_i8_monotonic:
2116; RV64IA:       # %bb.0:
2117; RV64IA-NEXT:    andi a2, a0, -4
2118; RV64IA-NEXT:    slliw a0, a0, 3
2119; RV64IA-NEXT:    andi a3, a0, 24
2120; RV64IA-NEXT:    li a4, 255
2121; RV64IA-NEXT:    sllw a4, a4, a0
2122; RV64IA-NEXT:    slli a1, a1, 56
2123; RV64IA-NEXT:    srai a1, a1, 56
2124; RV64IA-NEXT:    sllw a1, a1, a0
2125; RV64IA-NEXT:    xori a3, a3, 56
2126; RV64IA-NEXT:  .LBB35_1: # =>This Inner Loop Header: Depth=1
2127; RV64IA-NEXT:    lr.w a5, (a2)
2128; RV64IA-NEXT:    and a7, a5, a4
2129; RV64IA-NEXT:    mv a6, a5
2130; RV64IA-NEXT:    sll a7, a7, a3
2131; RV64IA-NEXT:    sra a7, a7, a3
2132; RV64IA-NEXT:    bge a7, a1, .LBB35_3
2133; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB35_1 Depth=1
2134; RV64IA-NEXT:    xor a6, a5, a1
2135; RV64IA-NEXT:    and a6, a6, a4
2136; RV64IA-NEXT:    xor a6, a5, a6
2137; RV64IA-NEXT:  .LBB35_3: # in Loop: Header=BB35_1 Depth=1
2138; RV64IA-NEXT:    sc.w a6, a6, (a2)
2139; RV64IA-NEXT:    bnez a6, .LBB35_1
2140; RV64IA-NEXT:  # %bb.4:
2141; RV64IA-NEXT:    srlw a0, a5, a0
2142; RV64IA-NEXT:    ret
2143  %1 = atomicrmw max i8* %a, i8 %b monotonic
2144  ret i8 %1
2145}
2146
2147define i8 @atomicrmw_max_i8_acquire(i8 *%a, i8 %b) nounwind {
2148; RV32I-LABEL: atomicrmw_max_i8_acquire:
2149; RV32I:       # %bb.0:
2150; RV32I-NEXT:    addi sp, sp, -32
2151; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2152; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2153; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2154; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2155; RV32I-NEXT:    mv s0, a0
2156; RV32I-NEXT:    lbu a3, 0(a0)
2157; RV32I-NEXT:    mv s1, a1
2158; RV32I-NEXT:    slli a0, a1, 24
2159; RV32I-NEXT:    srai s2, a0, 24
2160; RV32I-NEXT:    j .LBB36_2
2161; RV32I-NEXT:  .LBB36_1: # %atomicrmw.start
2162; RV32I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2163; RV32I-NEXT:    sb a3, 15(sp)
2164; RV32I-NEXT:    addi a1, sp, 15
2165; RV32I-NEXT:    li a3, 2
2166; RV32I-NEXT:    li a4, 2
2167; RV32I-NEXT:    mv a0, s0
2168; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2169; RV32I-NEXT:    lb a3, 15(sp)
2170; RV32I-NEXT:    bnez a0, .LBB36_4
2171; RV32I-NEXT:  .LBB36_2: # %atomicrmw.start
2172; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2173; RV32I-NEXT:    slli a0, a3, 24
2174; RV32I-NEXT:    srai a0, a0, 24
2175; RV32I-NEXT:    mv a2, a3
2176; RV32I-NEXT:    blt s2, a0, .LBB36_1
2177; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2178; RV32I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2179; RV32I-NEXT:    mv a2, s1
2180; RV32I-NEXT:    j .LBB36_1
2181; RV32I-NEXT:  .LBB36_4: # %atomicrmw.end
2182; RV32I-NEXT:    mv a0, a3
2183; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2184; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2185; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2186; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2187; RV32I-NEXT:    addi sp, sp, 32
2188; RV32I-NEXT:    ret
2189;
2190; RV32IA-LABEL: atomicrmw_max_i8_acquire:
2191; RV32IA:       # %bb.0:
2192; RV32IA-NEXT:    andi a2, a0, -4
2193; RV32IA-NEXT:    slli a0, a0, 3
2194; RV32IA-NEXT:    andi a3, a0, 24
2195; RV32IA-NEXT:    li a4, 255
2196; RV32IA-NEXT:    sll a4, a4, a0
2197; RV32IA-NEXT:    slli a1, a1, 24
2198; RV32IA-NEXT:    srai a1, a1, 24
2199; RV32IA-NEXT:    sll a1, a1, a0
2200; RV32IA-NEXT:    xori a3, a3, 24
2201; RV32IA-NEXT:  .LBB36_1: # =>This Inner Loop Header: Depth=1
2202; RV32IA-NEXT:    lr.w.aq a5, (a2)
2203; RV32IA-NEXT:    and a7, a5, a4
2204; RV32IA-NEXT:    mv a6, a5
2205; RV32IA-NEXT:    sll a7, a7, a3
2206; RV32IA-NEXT:    sra a7, a7, a3
2207; RV32IA-NEXT:    bge a7, a1, .LBB36_3
2208; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB36_1 Depth=1
2209; RV32IA-NEXT:    xor a6, a5, a1
2210; RV32IA-NEXT:    and a6, a6, a4
2211; RV32IA-NEXT:    xor a6, a5, a6
2212; RV32IA-NEXT:  .LBB36_3: # in Loop: Header=BB36_1 Depth=1
2213; RV32IA-NEXT:    sc.w a6, a6, (a2)
2214; RV32IA-NEXT:    bnez a6, .LBB36_1
2215; RV32IA-NEXT:  # %bb.4:
2216; RV32IA-NEXT:    srl a0, a5, a0
2217; RV32IA-NEXT:    ret
2218;
2219; RV64I-LABEL: atomicrmw_max_i8_acquire:
2220; RV64I:       # %bb.0:
2221; RV64I-NEXT:    addi sp, sp, -48
2222; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2223; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2224; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2225; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2226; RV64I-NEXT:    mv s0, a0
2227; RV64I-NEXT:    lbu a3, 0(a0)
2228; RV64I-NEXT:    mv s1, a1
2229; RV64I-NEXT:    slli a0, a1, 56
2230; RV64I-NEXT:    srai s2, a0, 56
2231; RV64I-NEXT:    j .LBB36_2
2232; RV64I-NEXT:  .LBB36_1: # %atomicrmw.start
2233; RV64I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2234; RV64I-NEXT:    sb a3, 15(sp)
2235; RV64I-NEXT:    addi a1, sp, 15
2236; RV64I-NEXT:    li a3, 2
2237; RV64I-NEXT:    li a4, 2
2238; RV64I-NEXT:    mv a0, s0
2239; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2240; RV64I-NEXT:    lb a3, 15(sp)
2241; RV64I-NEXT:    bnez a0, .LBB36_4
2242; RV64I-NEXT:  .LBB36_2: # %atomicrmw.start
2243; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2244; RV64I-NEXT:    slli a0, a3, 56
2245; RV64I-NEXT:    srai a0, a0, 56
2246; RV64I-NEXT:    mv a2, a3
2247; RV64I-NEXT:    blt s2, a0, .LBB36_1
2248; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2249; RV64I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2250; RV64I-NEXT:    mv a2, s1
2251; RV64I-NEXT:    j .LBB36_1
2252; RV64I-NEXT:  .LBB36_4: # %atomicrmw.end
2253; RV64I-NEXT:    mv a0, a3
2254; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2255; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2256; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2257; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2258; RV64I-NEXT:    addi sp, sp, 48
2259; RV64I-NEXT:    ret
2260;
2261; RV64IA-LABEL: atomicrmw_max_i8_acquire:
2262; RV64IA:       # %bb.0:
2263; RV64IA-NEXT:    andi a2, a0, -4
2264; RV64IA-NEXT:    slliw a0, a0, 3
2265; RV64IA-NEXT:    andi a3, a0, 24
2266; RV64IA-NEXT:    li a4, 255
2267; RV64IA-NEXT:    sllw a4, a4, a0
2268; RV64IA-NEXT:    slli a1, a1, 56
2269; RV64IA-NEXT:    srai a1, a1, 56
2270; RV64IA-NEXT:    sllw a1, a1, a0
2271; RV64IA-NEXT:    xori a3, a3, 56
2272; RV64IA-NEXT:  .LBB36_1: # =>This Inner Loop Header: Depth=1
2273; RV64IA-NEXT:    lr.w.aq a5, (a2)
2274; RV64IA-NEXT:    and a7, a5, a4
2275; RV64IA-NEXT:    mv a6, a5
2276; RV64IA-NEXT:    sll a7, a7, a3
2277; RV64IA-NEXT:    sra a7, a7, a3
2278; RV64IA-NEXT:    bge a7, a1, .LBB36_3
2279; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB36_1 Depth=1
2280; RV64IA-NEXT:    xor a6, a5, a1
2281; RV64IA-NEXT:    and a6, a6, a4
2282; RV64IA-NEXT:    xor a6, a5, a6
2283; RV64IA-NEXT:  .LBB36_3: # in Loop: Header=BB36_1 Depth=1
2284; RV64IA-NEXT:    sc.w a6, a6, (a2)
2285; RV64IA-NEXT:    bnez a6, .LBB36_1
2286; RV64IA-NEXT:  # %bb.4:
2287; RV64IA-NEXT:    srlw a0, a5, a0
2288; RV64IA-NEXT:    ret
2289  %1 = atomicrmw max i8* %a, i8 %b acquire
2290  ret i8 %1
2291}
2292
2293define i8 @atomicrmw_max_i8_release(i8 *%a, i8 %b) nounwind {
2294; RV32I-LABEL: atomicrmw_max_i8_release:
2295; RV32I:       # %bb.0:
2296; RV32I-NEXT:    addi sp, sp, -32
2297; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2298; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2299; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2300; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2301; RV32I-NEXT:    mv s0, a0
2302; RV32I-NEXT:    lbu a3, 0(a0)
2303; RV32I-NEXT:    mv s1, a1
2304; RV32I-NEXT:    slli a0, a1, 24
2305; RV32I-NEXT:    srai s2, a0, 24
2306; RV32I-NEXT:    j .LBB37_2
2307; RV32I-NEXT:  .LBB37_1: # %atomicrmw.start
2308; RV32I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2309; RV32I-NEXT:    sb a3, 15(sp)
2310; RV32I-NEXT:    addi a1, sp, 15
2311; RV32I-NEXT:    li a3, 3
2312; RV32I-NEXT:    mv a0, s0
2313; RV32I-NEXT:    li a4, 0
2314; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2315; RV32I-NEXT:    lb a3, 15(sp)
2316; RV32I-NEXT:    bnez a0, .LBB37_4
2317; RV32I-NEXT:  .LBB37_2: # %atomicrmw.start
2318; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2319; RV32I-NEXT:    slli a0, a3, 24
2320; RV32I-NEXT:    srai a0, a0, 24
2321; RV32I-NEXT:    mv a2, a3
2322; RV32I-NEXT:    blt s2, a0, .LBB37_1
2323; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2324; RV32I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2325; RV32I-NEXT:    mv a2, s1
2326; RV32I-NEXT:    j .LBB37_1
2327; RV32I-NEXT:  .LBB37_4: # %atomicrmw.end
2328; RV32I-NEXT:    mv a0, a3
2329; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2330; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2331; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2332; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2333; RV32I-NEXT:    addi sp, sp, 32
2334; RV32I-NEXT:    ret
2335;
2336; RV32IA-LABEL: atomicrmw_max_i8_release:
2337; RV32IA:       # %bb.0:
2338; RV32IA-NEXT:    andi a2, a0, -4
2339; RV32IA-NEXT:    slli a0, a0, 3
2340; RV32IA-NEXT:    andi a3, a0, 24
2341; RV32IA-NEXT:    li a4, 255
2342; RV32IA-NEXT:    sll a4, a4, a0
2343; RV32IA-NEXT:    slli a1, a1, 24
2344; RV32IA-NEXT:    srai a1, a1, 24
2345; RV32IA-NEXT:    sll a1, a1, a0
2346; RV32IA-NEXT:    xori a3, a3, 24
2347; RV32IA-NEXT:  .LBB37_1: # =>This Inner Loop Header: Depth=1
2348; RV32IA-NEXT:    lr.w a5, (a2)
2349; RV32IA-NEXT:    and a7, a5, a4
2350; RV32IA-NEXT:    mv a6, a5
2351; RV32IA-NEXT:    sll a7, a7, a3
2352; RV32IA-NEXT:    sra a7, a7, a3
2353; RV32IA-NEXT:    bge a7, a1, .LBB37_3
2354; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB37_1 Depth=1
2355; RV32IA-NEXT:    xor a6, a5, a1
2356; RV32IA-NEXT:    and a6, a6, a4
2357; RV32IA-NEXT:    xor a6, a5, a6
2358; RV32IA-NEXT:  .LBB37_3: # in Loop: Header=BB37_1 Depth=1
2359; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
2360; RV32IA-NEXT:    bnez a6, .LBB37_1
2361; RV32IA-NEXT:  # %bb.4:
2362; RV32IA-NEXT:    srl a0, a5, a0
2363; RV32IA-NEXT:    ret
2364;
2365; RV64I-LABEL: atomicrmw_max_i8_release:
2366; RV64I:       # %bb.0:
2367; RV64I-NEXT:    addi sp, sp, -48
2368; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2369; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2370; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2371; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2372; RV64I-NEXT:    mv s0, a0
2373; RV64I-NEXT:    lbu a3, 0(a0)
2374; RV64I-NEXT:    mv s1, a1
2375; RV64I-NEXT:    slli a0, a1, 56
2376; RV64I-NEXT:    srai s2, a0, 56
2377; RV64I-NEXT:    j .LBB37_2
2378; RV64I-NEXT:  .LBB37_1: # %atomicrmw.start
2379; RV64I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2380; RV64I-NEXT:    sb a3, 15(sp)
2381; RV64I-NEXT:    addi a1, sp, 15
2382; RV64I-NEXT:    li a3, 3
2383; RV64I-NEXT:    mv a0, s0
2384; RV64I-NEXT:    li a4, 0
2385; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2386; RV64I-NEXT:    lb a3, 15(sp)
2387; RV64I-NEXT:    bnez a0, .LBB37_4
2388; RV64I-NEXT:  .LBB37_2: # %atomicrmw.start
2389; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2390; RV64I-NEXT:    slli a0, a3, 56
2391; RV64I-NEXT:    srai a0, a0, 56
2392; RV64I-NEXT:    mv a2, a3
2393; RV64I-NEXT:    blt s2, a0, .LBB37_1
2394; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2395; RV64I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2396; RV64I-NEXT:    mv a2, s1
2397; RV64I-NEXT:    j .LBB37_1
2398; RV64I-NEXT:  .LBB37_4: # %atomicrmw.end
2399; RV64I-NEXT:    mv a0, a3
2400; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2401; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2402; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2403; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2404; RV64I-NEXT:    addi sp, sp, 48
2405; RV64I-NEXT:    ret
2406;
2407; RV64IA-LABEL: atomicrmw_max_i8_release:
2408; RV64IA:       # %bb.0:
2409; RV64IA-NEXT:    andi a2, a0, -4
2410; RV64IA-NEXT:    slliw a0, a0, 3
2411; RV64IA-NEXT:    andi a3, a0, 24
2412; RV64IA-NEXT:    li a4, 255
2413; RV64IA-NEXT:    sllw a4, a4, a0
2414; RV64IA-NEXT:    slli a1, a1, 56
2415; RV64IA-NEXT:    srai a1, a1, 56
2416; RV64IA-NEXT:    sllw a1, a1, a0
2417; RV64IA-NEXT:    xori a3, a3, 56
2418; RV64IA-NEXT:  .LBB37_1: # =>This Inner Loop Header: Depth=1
2419; RV64IA-NEXT:    lr.w a5, (a2)
2420; RV64IA-NEXT:    and a7, a5, a4
2421; RV64IA-NEXT:    mv a6, a5
2422; RV64IA-NEXT:    sll a7, a7, a3
2423; RV64IA-NEXT:    sra a7, a7, a3
2424; RV64IA-NEXT:    bge a7, a1, .LBB37_3
2425; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB37_1 Depth=1
2426; RV64IA-NEXT:    xor a6, a5, a1
2427; RV64IA-NEXT:    and a6, a6, a4
2428; RV64IA-NEXT:    xor a6, a5, a6
2429; RV64IA-NEXT:  .LBB37_3: # in Loop: Header=BB37_1 Depth=1
2430; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
2431; RV64IA-NEXT:    bnez a6, .LBB37_1
2432; RV64IA-NEXT:  # %bb.4:
2433; RV64IA-NEXT:    srlw a0, a5, a0
2434; RV64IA-NEXT:    ret
2435  %1 = atomicrmw max i8* %a, i8 %b release
2436  ret i8 %1
2437}
2438
2439define i8 @atomicrmw_max_i8_acq_rel(i8 *%a, i8 %b) nounwind {
2440; RV32I-LABEL: atomicrmw_max_i8_acq_rel:
2441; RV32I:       # %bb.0:
2442; RV32I-NEXT:    addi sp, sp, -32
2443; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2444; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2445; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2446; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2447; RV32I-NEXT:    mv s0, a0
2448; RV32I-NEXT:    lbu a3, 0(a0)
2449; RV32I-NEXT:    mv s1, a1
2450; RV32I-NEXT:    slli a0, a1, 24
2451; RV32I-NEXT:    srai s2, a0, 24
2452; RV32I-NEXT:    j .LBB38_2
2453; RV32I-NEXT:  .LBB38_1: # %atomicrmw.start
2454; RV32I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2455; RV32I-NEXT:    sb a3, 15(sp)
2456; RV32I-NEXT:    addi a1, sp, 15
2457; RV32I-NEXT:    li a3, 4
2458; RV32I-NEXT:    li a4, 2
2459; RV32I-NEXT:    mv a0, s0
2460; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2461; RV32I-NEXT:    lb a3, 15(sp)
2462; RV32I-NEXT:    bnez a0, .LBB38_4
2463; RV32I-NEXT:  .LBB38_2: # %atomicrmw.start
2464; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2465; RV32I-NEXT:    slli a0, a3, 24
2466; RV32I-NEXT:    srai a0, a0, 24
2467; RV32I-NEXT:    mv a2, a3
2468; RV32I-NEXT:    blt s2, a0, .LBB38_1
2469; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2470; RV32I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2471; RV32I-NEXT:    mv a2, s1
2472; RV32I-NEXT:    j .LBB38_1
2473; RV32I-NEXT:  .LBB38_4: # %atomicrmw.end
2474; RV32I-NEXT:    mv a0, a3
2475; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2476; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2477; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2478; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2479; RV32I-NEXT:    addi sp, sp, 32
2480; RV32I-NEXT:    ret
2481;
2482; RV32IA-LABEL: atomicrmw_max_i8_acq_rel:
2483; RV32IA:       # %bb.0:
2484; RV32IA-NEXT:    andi a2, a0, -4
2485; RV32IA-NEXT:    slli a0, a0, 3
2486; RV32IA-NEXT:    andi a3, a0, 24
2487; RV32IA-NEXT:    li a4, 255
2488; RV32IA-NEXT:    sll a4, a4, a0
2489; RV32IA-NEXT:    slli a1, a1, 24
2490; RV32IA-NEXT:    srai a1, a1, 24
2491; RV32IA-NEXT:    sll a1, a1, a0
2492; RV32IA-NEXT:    xori a3, a3, 24
2493; RV32IA-NEXT:  .LBB38_1: # =>This Inner Loop Header: Depth=1
2494; RV32IA-NEXT:    lr.w.aq a5, (a2)
2495; RV32IA-NEXT:    and a7, a5, a4
2496; RV32IA-NEXT:    mv a6, a5
2497; RV32IA-NEXT:    sll a7, a7, a3
2498; RV32IA-NEXT:    sra a7, a7, a3
2499; RV32IA-NEXT:    bge a7, a1, .LBB38_3
2500; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB38_1 Depth=1
2501; RV32IA-NEXT:    xor a6, a5, a1
2502; RV32IA-NEXT:    and a6, a6, a4
2503; RV32IA-NEXT:    xor a6, a5, a6
2504; RV32IA-NEXT:  .LBB38_3: # in Loop: Header=BB38_1 Depth=1
2505; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
2506; RV32IA-NEXT:    bnez a6, .LBB38_1
2507; RV32IA-NEXT:  # %bb.4:
2508; RV32IA-NEXT:    srl a0, a5, a0
2509; RV32IA-NEXT:    ret
2510;
2511; RV64I-LABEL: atomicrmw_max_i8_acq_rel:
2512; RV64I:       # %bb.0:
2513; RV64I-NEXT:    addi sp, sp, -48
2514; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2515; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2516; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2517; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2518; RV64I-NEXT:    mv s0, a0
2519; RV64I-NEXT:    lbu a3, 0(a0)
2520; RV64I-NEXT:    mv s1, a1
2521; RV64I-NEXT:    slli a0, a1, 56
2522; RV64I-NEXT:    srai s2, a0, 56
2523; RV64I-NEXT:    j .LBB38_2
2524; RV64I-NEXT:  .LBB38_1: # %atomicrmw.start
2525; RV64I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2526; RV64I-NEXT:    sb a3, 15(sp)
2527; RV64I-NEXT:    addi a1, sp, 15
2528; RV64I-NEXT:    li a3, 4
2529; RV64I-NEXT:    li a4, 2
2530; RV64I-NEXT:    mv a0, s0
2531; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2532; RV64I-NEXT:    lb a3, 15(sp)
2533; RV64I-NEXT:    bnez a0, .LBB38_4
2534; RV64I-NEXT:  .LBB38_2: # %atomicrmw.start
2535; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2536; RV64I-NEXT:    slli a0, a3, 56
2537; RV64I-NEXT:    srai a0, a0, 56
2538; RV64I-NEXT:    mv a2, a3
2539; RV64I-NEXT:    blt s2, a0, .LBB38_1
2540; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2541; RV64I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2542; RV64I-NEXT:    mv a2, s1
2543; RV64I-NEXT:    j .LBB38_1
2544; RV64I-NEXT:  .LBB38_4: # %atomicrmw.end
2545; RV64I-NEXT:    mv a0, a3
2546; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2547; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2548; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2549; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2550; RV64I-NEXT:    addi sp, sp, 48
2551; RV64I-NEXT:    ret
2552;
2553; RV64IA-LABEL: atomicrmw_max_i8_acq_rel:
2554; RV64IA:       # %bb.0:
2555; RV64IA-NEXT:    andi a2, a0, -4
2556; RV64IA-NEXT:    slliw a0, a0, 3
2557; RV64IA-NEXT:    andi a3, a0, 24
2558; RV64IA-NEXT:    li a4, 255
2559; RV64IA-NEXT:    sllw a4, a4, a0
2560; RV64IA-NEXT:    slli a1, a1, 56
2561; RV64IA-NEXT:    srai a1, a1, 56
2562; RV64IA-NEXT:    sllw a1, a1, a0
2563; RV64IA-NEXT:    xori a3, a3, 56
2564; RV64IA-NEXT:  .LBB38_1: # =>This Inner Loop Header: Depth=1
2565; RV64IA-NEXT:    lr.w.aq a5, (a2)
2566; RV64IA-NEXT:    and a7, a5, a4
2567; RV64IA-NEXT:    mv a6, a5
2568; RV64IA-NEXT:    sll a7, a7, a3
2569; RV64IA-NEXT:    sra a7, a7, a3
2570; RV64IA-NEXT:    bge a7, a1, .LBB38_3
2571; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB38_1 Depth=1
2572; RV64IA-NEXT:    xor a6, a5, a1
2573; RV64IA-NEXT:    and a6, a6, a4
2574; RV64IA-NEXT:    xor a6, a5, a6
2575; RV64IA-NEXT:  .LBB38_3: # in Loop: Header=BB38_1 Depth=1
2576; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
2577; RV64IA-NEXT:    bnez a6, .LBB38_1
2578; RV64IA-NEXT:  # %bb.4:
2579; RV64IA-NEXT:    srlw a0, a5, a0
2580; RV64IA-NEXT:    ret
2581  %1 = atomicrmw max i8* %a, i8 %b acq_rel
2582  ret i8 %1
2583}
2584
2585define i8 @atomicrmw_max_i8_seq_cst(i8 *%a, i8 %b) nounwind {
2586; RV32I-LABEL: atomicrmw_max_i8_seq_cst:
2587; RV32I:       # %bb.0:
2588; RV32I-NEXT:    addi sp, sp, -32
2589; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2590; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2591; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2592; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2593; RV32I-NEXT:    mv s0, a0
2594; RV32I-NEXT:    lbu a3, 0(a0)
2595; RV32I-NEXT:    mv s1, a1
2596; RV32I-NEXT:    slli a0, a1, 24
2597; RV32I-NEXT:    srai s2, a0, 24
2598; RV32I-NEXT:    j .LBB39_2
2599; RV32I-NEXT:  .LBB39_1: # %atomicrmw.start
2600; RV32I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2601; RV32I-NEXT:    sb a3, 15(sp)
2602; RV32I-NEXT:    addi a1, sp, 15
2603; RV32I-NEXT:    li a3, 5
2604; RV32I-NEXT:    li a4, 5
2605; RV32I-NEXT:    mv a0, s0
2606; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2607; RV32I-NEXT:    lb a3, 15(sp)
2608; RV32I-NEXT:    bnez a0, .LBB39_4
2609; RV32I-NEXT:  .LBB39_2: # %atomicrmw.start
2610; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2611; RV32I-NEXT:    slli a0, a3, 24
2612; RV32I-NEXT:    srai a0, a0, 24
2613; RV32I-NEXT:    mv a2, a3
2614; RV32I-NEXT:    blt s2, a0, .LBB39_1
2615; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2616; RV32I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2617; RV32I-NEXT:    mv a2, s1
2618; RV32I-NEXT:    j .LBB39_1
2619; RV32I-NEXT:  .LBB39_4: # %atomicrmw.end
2620; RV32I-NEXT:    mv a0, a3
2621; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2622; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2623; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2624; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2625; RV32I-NEXT:    addi sp, sp, 32
2626; RV32I-NEXT:    ret
2627;
2628; RV32IA-LABEL: atomicrmw_max_i8_seq_cst:
2629; RV32IA:       # %bb.0:
2630; RV32IA-NEXT:    andi a2, a0, -4
2631; RV32IA-NEXT:    slli a0, a0, 3
2632; RV32IA-NEXT:    andi a3, a0, 24
2633; RV32IA-NEXT:    li a4, 255
2634; RV32IA-NEXT:    sll a4, a4, a0
2635; RV32IA-NEXT:    slli a1, a1, 24
2636; RV32IA-NEXT:    srai a1, a1, 24
2637; RV32IA-NEXT:    sll a1, a1, a0
2638; RV32IA-NEXT:    xori a3, a3, 24
2639; RV32IA-NEXT:  .LBB39_1: # =>This Inner Loop Header: Depth=1
2640; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
2641; RV32IA-NEXT:    and a7, a5, a4
2642; RV32IA-NEXT:    mv a6, a5
2643; RV32IA-NEXT:    sll a7, a7, a3
2644; RV32IA-NEXT:    sra a7, a7, a3
2645; RV32IA-NEXT:    bge a7, a1, .LBB39_3
2646; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB39_1 Depth=1
2647; RV32IA-NEXT:    xor a6, a5, a1
2648; RV32IA-NEXT:    and a6, a6, a4
2649; RV32IA-NEXT:    xor a6, a5, a6
2650; RV32IA-NEXT:  .LBB39_3: # in Loop: Header=BB39_1 Depth=1
2651; RV32IA-NEXT:    sc.w.aqrl a6, a6, (a2)
2652; RV32IA-NEXT:    bnez a6, .LBB39_1
2653; RV32IA-NEXT:  # %bb.4:
2654; RV32IA-NEXT:    srl a0, a5, a0
2655; RV32IA-NEXT:    ret
2656;
2657; RV64I-LABEL: atomicrmw_max_i8_seq_cst:
2658; RV64I:       # %bb.0:
2659; RV64I-NEXT:    addi sp, sp, -48
2660; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2661; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2662; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2663; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2664; RV64I-NEXT:    mv s0, a0
2665; RV64I-NEXT:    lbu a3, 0(a0)
2666; RV64I-NEXT:    mv s1, a1
2667; RV64I-NEXT:    slli a0, a1, 56
2668; RV64I-NEXT:    srai s2, a0, 56
2669; RV64I-NEXT:    j .LBB39_2
2670; RV64I-NEXT:  .LBB39_1: # %atomicrmw.start
2671; RV64I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2672; RV64I-NEXT:    sb a3, 15(sp)
2673; RV64I-NEXT:    addi a1, sp, 15
2674; RV64I-NEXT:    li a3, 5
2675; RV64I-NEXT:    li a4, 5
2676; RV64I-NEXT:    mv a0, s0
2677; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2678; RV64I-NEXT:    lb a3, 15(sp)
2679; RV64I-NEXT:    bnez a0, .LBB39_4
2680; RV64I-NEXT:  .LBB39_2: # %atomicrmw.start
2681; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2682; RV64I-NEXT:    slli a0, a3, 56
2683; RV64I-NEXT:    srai a0, a0, 56
2684; RV64I-NEXT:    mv a2, a3
2685; RV64I-NEXT:    blt s2, a0, .LBB39_1
2686; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2687; RV64I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2688; RV64I-NEXT:    mv a2, s1
2689; RV64I-NEXT:    j .LBB39_1
2690; RV64I-NEXT:  .LBB39_4: # %atomicrmw.end
2691; RV64I-NEXT:    mv a0, a3
2692; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2693; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2694; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2695; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2696; RV64I-NEXT:    addi sp, sp, 48
2697; RV64I-NEXT:    ret
2698;
2699; RV64IA-LABEL: atomicrmw_max_i8_seq_cst:
2700; RV64IA:       # %bb.0:
2701; RV64IA-NEXT:    andi a2, a0, -4
2702; RV64IA-NEXT:    slliw a0, a0, 3
2703; RV64IA-NEXT:    andi a3, a0, 24
2704; RV64IA-NEXT:    li a4, 255
2705; RV64IA-NEXT:    sllw a4, a4, a0
2706; RV64IA-NEXT:    slli a1, a1, 56
2707; RV64IA-NEXT:    srai a1, a1, 56
2708; RV64IA-NEXT:    sllw a1, a1, a0
2709; RV64IA-NEXT:    xori a3, a3, 56
2710; RV64IA-NEXT:  .LBB39_1: # =>This Inner Loop Header: Depth=1
2711; RV64IA-NEXT:    lr.w.aqrl a5, (a2)
2712; RV64IA-NEXT:    and a7, a5, a4
2713; RV64IA-NEXT:    mv a6, a5
2714; RV64IA-NEXT:    sll a7, a7, a3
2715; RV64IA-NEXT:    sra a7, a7, a3
2716; RV64IA-NEXT:    bge a7, a1, .LBB39_3
2717; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB39_1 Depth=1
2718; RV64IA-NEXT:    xor a6, a5, a1
2719; RV64IA-NEXT:    and a6, a6, a4
2720; RV64IA-NEXT:    xor a6, a5, a6
2721; RV64IA-NEXT:  .LBB39_3: # in Loop: Header=BB39_1 Depth=1
2722; RV64IA-NEXT:    sc.w.aqrl a6, a6, (a2)
2723; RV64IA-NEXT:    bnez a6, .LBB39_1
2724; RV64IA-NEXT:  # %bb.4:
2725; RV64IA-NEXT:    srlw a0, a5, a0
2726; RV64IA-NEXT:    ret
2727  %1 = atomicrmw max i8* %a, i8 %b seq_cst
2728  ret i8 %1
2729}
2730
2731define i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind {
2732; RV32I-LABEL: atomicrmw_min_i8_monotonic:
2733; RV32I:       # %bb.0:
2734; RV32I-NEXT:    addi sp, sp, -32
2735; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2736; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2737; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2738; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2739; RV32I-NEXT:    mv s0, a0
2740; RV32I-NEXT:    lbu a3, 0(a0)
2741; RV32I-NEXT:    mv s1, a1
2742; RV32I-NEXT:    slli a0, a1, 24
2743; RV32I-NEXT:    srai s2, a0, 24
2744; RV32I-NEXT:    j .LBB40_2
2745; RV32I-NEXT:  .LBB40_1: # %atomicrmw.start
2746; RV32I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2747; RV32I-NEXT:    sb a3, 15(sp)
2748; RV32I-NEXT:    addi a1, sp, 15
2749; RV32I-NEXT:    mv a0, s0
2750; RV32I-NEXT:    li a3, 0
2751; RV32I-NEXT:    li a4, 0
2752; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2753; RV32I-NEXT:    lb a3, 15(sp)
2754; RV32I-NEXT:    bnez a0, .LBB40_4
2755; RV32I-NEXT:  .LBB40_2: # %atomicrmw.start
2756; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2757; RV32I-NEXT:    slli a0, a3, 24
2758; RV32I-NEXT:    srai a0, a0, 24
2759; RV32I-NEXT:    mv a2, a3
2760; RV32I-NEXT:    bge s2, a0, .LBB40_1
2761; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2762; RV32I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2763; RV32I-NEXT:    mv a2, s1
2764; RV32I-NEXT:    j .LBB40_1
2765; RV32I-NEXT:  .LBB40_4: # %atomicrmw.end
2766; RV32I-NEXT:    mv a0, a3
2767; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2768; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2769; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2770; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2771; RV32I-NEXT:    addi sp, sp, 32
2772; RV32I-NEXT:    ret
2773;
2774; RV32IA-LABEL: atomicrmw_min_i8_monotonic:
2775; RV32IA:       # %bb.0:
2776; RV32IA-NEXT:    andi a2, a0, -4
2777; RV32IA-NEXT:    slli a0, a0, 3
2778; RV32IA-NEXT:    andi a3, a0, 24
2779; RV32IA-NEXT:    li a4, 255
2780; RV32IA-NEXT:    sll a4, a4, a0
2781; RV32IA-NEXT:    slli a1, a1, 24
2782; RV32IA-NEXT:    srai a1, a1, 24
2783; RV32IA-NEXT:    sll a1, a1, a0
2784; RV32IA-NEXT:    xori a3, a3, 24
2785; RV32IA-NEXT:  .LBB40_1: # =>This Inner Loop Header: Depth=1
2786; RV32IA-NEXT:    lr.w a5, (a2)
2787; RV32IA-NEXT:    and a7, a5, a4
2788; RV32IA-NEXT:    mv a6, a5
2789; RV32IA-NEXT:    sll a7, a7, a3
2790; RV32IA-NEXT:    sra a7, a7, a3
2791; RV32IA-NEXT:    bge a1, a7, .LBB40_3
2792; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB40_1 Depth=1
2793; RV32IA-NEXT:    xor a6, a5, a1
2794; RV32IA-NEXT:    and a6, a6, a4
2795; RV32IA-NEXT:    xor a6, a5, a6
2796; RV32IA-NEXT:  .LBB40_3: # in Loop: Header=BB40_1 Depth=1
2797; RV32IA-NEXT:    sc.w a6, a6, (a2)
2798; RV32IA-NEXT:    bnez a6, .LBB40_1
2799; RV32IA-NEXT:  # %bb.4:
2800; RV32IA-NEXT:    srl a0, a5, a0
2801; RV32IA-NEXT:    ret
2802;
2803; RV64I-LABEL: atomicrmw_min_i8_monotonic:
2804; RV64I:       # %bb.0:
2805; RV64I-NEXT:    addi sp, sp, -48
2806; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2807; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2808; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2809; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2810; RV64I-NEXT:    mv s0, a0
2811; RV64I-NEXT:    lbu a3, 0(a0)
2812; RV64I-NEXT:    mv s1, a1
2813; RV64I-NEXT:    slli a0, a1, 56
2814; RV64I-NEXT:    srai s2, a0, 56
2815; RV64I-NEXT:    j .LBB40_2
2816; RV64I-NEXT:  .LBB40_1: # %atomicrmw.start
2817; RV64I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2818; RV64I-NEXT:    sb a3, 15(sp)
2819; RV64I-NEXT:    addi a1, sp, 15
2820; RV64I-NEXT:    mv a0, s0
2821; RV64I-NEXT:    li a3, 0
2822; RV64I-NEXT:    li a4, 0
2823; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2824; RV64I-NEXT:    lb a3, 15(sp)
2825; RV64I-NEXT:    bnez a0, .LBB40_4
2826; RV64I-NEXT:  .LBB40_2: # %atomicrmw.start
2827; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2828; RV64I-NEXT:    slli a0, a3, 56
2829; RV64I-NEXT:    srai a0, a0, 56
2830; RV64I-NEXT:    mv a2, a3
2831; RV64I-NEXT:    bge s2, a0, .LBB40_1
2832; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2833; RV64I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2834; RV64I-NEXT:    mv a2, s1
2835; RV64I-NEXT:    j .LBB40_1
2836; RV64I-NEXT:  .LBB40_4: # %atomicrmw.end
2837; RV64I-NEXT:    mv a0, a3
2838; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2839; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2840; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2841; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2842; RV64I-NEXT:    addi sp, sp, 48
2843; RV64I-NEXT:    ret
2844;
2845; RV64IA-LABEL: atomicrmw_min_i8_monotonic:
2846; RV64IA:       # %bb.0:
2847; RV64IA-NEXT:    andi a2, a0, -4
2848; RV64IA-NEXT:    slliw a0, a0, 3
2849; RV64IA-NEXT:    andi a3, a0, 24
2850; RV64IA-NEXT:    li a4, 255
2851; RV64IA-NEXT:    sllw a4, a4, a0
2852; RV64IA-NEXT:    slli a1, a1, 56
2853; RV64IA-NEXT:    srai a1, a1, 56
2854; RV64IA-NEXT:    sllw a1, a1, a0
2855; RV64IA-NEXT:    xori a3, a3, 56
2856; RV64IA-NEXT:  .LBB40_1: # =>This Inner Loop Header: Depth=1
2857; RV64IA-NEXT:    lr.w a5, (a2)
2858; RV64IA-NEXT:    and a7, a5, a4
2859; RV64IA-NEXT:    mv a6, a5
2860; RV64IA-NEXT:    sll a7, a7, a3
2861; RV64IA-NEXT:    sra a7, a7, a3
2862; RV64IA-NEXT:    bge a1, a7, .LBB40_3
2863; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB40_1 Depth=1
2864; RV64IA-NEXT:    xor a6, a5, a1
2865; RV64IA-NEXT:    and a6, a6, a4
2866; RV64IA-NEXT:    xor a6, a5, a6
2867; RV64IA-NEXT:  .LBB40_3: # in Loop: Header=BB40_1 Depth=1
2868; RV64IA-NEXT:    sc.w a6, a6, (a2)
2869; RV64IA-NEXT:    bnez a6, .LBB40_1
2870; RV64IA-NEXT:  # %bb.4:
2871; RV64IA-NEXT:    srlw a0, a5, a0
2872; RV64IA-NEXT:    ret
2873  %1 = atomicrmw min i8* %a, i8 %b monotonic
2874  ret i8 %1
2875}
2876
2877define i8 @atomicrmw_min_i8_acquire(i8 *%a, i8 %b) nounwind {
2878; RV32I-LABEL: atomicrmw_min_i8_acquire:
2879; RV32I:       # %bb.0:
2880; RV32I-NEXT:    addi sp, sp, -32
2881; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2882; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2883; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2884; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2885; RV32I-NEXT:    mv s0, a0
2886; RV32I-NEXT:    lbu a3, 0(a0)
2887; RV32I-NEXT:    mv s1, a1
2888; RV32I-NEXT:    slli a0, a1, 24
2889; RV32I-NEXT:    srai s2, a0, 24
2890; RV32I-NEXT:    j .LBB41_2
2891; RV32I-NEXT:  .LBB41_1: # %atomicrmw.start
2892; RV32I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2893; RV32I-NEXT:    sb a3, 15(sp)
2894; RV32I-NEXT:    addi a1, sp, 15
2895; RV32I-NEXT:    li a3, 2
2896; RV32I-NEXT:    li a4, 2
2897; RV32I-NEXT:    mv a0, s0
2898; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2899; RV32I-NEXT:    lb a3, 15(sp)
2900; RV32I-NEXT:    bnez a0, .LBB41_4
2901; RV32I-NEXT:  .LBB41_2: # %atomicrmw.start
2902; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2903; RV32I-NEXT:    slli a0, a3, 24
2904; RV32I-NEXT:    srai a0, a0, 24
2905; RV32I-NEXT:    mv a2, a3
2906; RV32I-NEXT:    bge s2, a0, .LBB41_1
2907; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2908; RV32I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2909; RV32I-NEXT:    mv a2, s1
2910; RV32I-NEXT:    j .LBB41_1
2911; RV32I-NEXT:  .LBB41_4: # %atomicrmw.end
2912; RV32I-NEXT:    mv a0, a3
2913; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2914; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2915; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2916; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2917; RV32I-NEXT:    addi sp, sp, 32
2918; RV32I-NEXT:    ret
2919;
2920; RV32IA-LABEL: atomicrmw_min_i8_acquire:
2921; RV32IA:       # %bb.0:
2922; RV32IA-NEXT:    andi a2, a0, -4
2923; RV32IA-NEXT:    slli a0, a0, 3
2924; RV32IA-NEXT:    andi a3, a0, 24
2925; RV32IA-NEXT:    li a4, 255
2926; RV32IA-NEXT:    sll a4, a4, a0
2927; RV32IA-NEXT:    slli a1, a1, 24
2928; RV32IA-NEXT:    srai a1, a1, 24
2929; RV32IA-NEXT:    sll a1, a1, a0
2930; RV32IA-NEXT:    xori a3, a3, 24
2931; RV32IA-NEXT:  .LBB41_1: # =>This Inner Loop Header: Depth=1
2932; RV32IA-NEXT:    lr.w.aq a5, (a2)
2933; RV32IA-NEXT:    and a7, a5, a4
2934; RV32IA-NEXT:    mv a6, a5
2935; RV32IA-NEXT:    sll a7, a7, a3
2936; RV32IA-NEXT:    sra a7, a7, a3
2937; RV32IA-NEXT:    bge a1, a7, .LBB41_3
2938; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB41_1 Depth=1
2939; RV32IA-NEXT:    xor a6, a5, a1
2940; RV32IA-NEXT:    and a6, a6, a4
2941; RV32IA-NEXT:    xor a6, a5, a6
2942; RV32IA-NEXT:  .LBB41_3: # in Loop: Header=BB41_1 Depth=1
2943; RV32IA-NEXT:    sc.w a6, a6, (a2)
2944; RV32IA-NEXT:    bnez a6, .LBB41_1
2945; RV32IA-NEXT:  # %bb.4:
2946; RV32IA-NEXT:    srl a0, a5, a0
2947; RV32IA-NEXT:    ret
2948;
2949; RV64I-LABEL: atomicrmw_min_i8_acquire:
2950; RV64I:       # %bb.0:
2951; RV64I-NEXT:    addi sp, sp, -48
2952; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2953; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2954; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2955; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2956; RV64I-NEXT:    mv s0, a0
2957; RV64I-NEXT:    lbu a3, 0(a0)
2958; RV64I-NEXT:    mv s1, a1
2959; RV64I-NEXT:    slli a0, a1, 56
2960; RV64I-NEXT:    srai s2, a0, 56
2961; RV64I-NEXT:    j .LBB41_2
2962; RV64I-NEXT:  .LBB41_1: # %atomicrmw.start
2963; RV64I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2964; RV64I-NEXT:    sb a3, 15(sp)
2965; RV64I-NEXT:    addi a1, sp, 15
2966; RV64I-NEXT:    li a3, 2
2967; RV64I-NEXT:    li a4, 2
2968; RV64I-NEXT:    mv a0, s0
2969; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2970; RV64I-NEXT:    lb a3, 15(sp)
2971; RV64I-NEXT:    bnez a0, .LBB41_4
2972; RV64I-NEXT:  .LBB41_2: # %atomicrmw.start
2973; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2974; RV64I-NEXT:    slli a0, a3, 56
2975; RV64I-NEXT:    srai a0, a0, 56
2976; RV64I-NEXT:    mv a2, a3
2977; RV64I-NEXT:    bge s2, a0, .LBB41_1
2978; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2979; RV64I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2980; RV64I-NEXT:    mv a2, s1
2981; RV64I-NEXT:    j .LBB41_1
2982; RV64I-NEXT:  .LBB41_4: # %atomicrmw.end
2983; RV64I-NEXT:    mv a0, a3
2984; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2985; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2986; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2987; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2988; RV64I-NEXT:    addi sp, sp, 48
2989; RV64I-NEXT:    ret
2990;
2991; RV64IA-LABEL: atomicrmw_min_i8_acquire:
2992; RV64IA:       # %bb.0:
2993; RV64IA-NEXT:    andi a2, a0, -4
2994; RV64IA-NEXT:    slliw a0, a0, 3
2995; RV64IA-NEXT:    andi a3, a0, 24
2996; RV64IA-NEXT:    li a4, 255
2997; RV64IA-NEXT:    sllw a4, a4, a0
2998; RV64IA-NEXT:    slli a1, a1, 56
2999; RV64IA-NEXT:    srai a1, a1, 56
3000; RV64IA-NEXT:    sllw a1, a1, a0
3001; RV64IA-NEXT:    xori a3, a3, 56
3002; RV64IA-NEXT:  .LBB41_1: # =>This Inner Loop Header: Depth=1
3003; RV64IA-NEXT:    lr.w.aq a5, (a2)
3004; RV64IA-NEXT:    and a7, a5, a4
3005; RV64IA-NEXT:    mv a6, a5
3006; RV64IA-NEXT:    sll a7, a7, a3
3007; RV64IA-NEXT:    sra a7, a7, a3
3008; RV64IA-NEXT:    bge a1, a7, .LBB41_3
3009; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB41_1 Depth=1
3010; RV64IA-NEXT:    xor a6, a5, a1
3011; RV64IA-NEXT:    and a6, a6, a4
3012; RV64IA-NEXT:    xor a6, a5, a6
3013; RV64IA-NEXT:  .LBB41_3: # in Loop: Header=BB41_1 Depth=1
3014; RV64IA-NEXT:    sc.w a6, a6, (a2)
3015; RV64IA-NEXT:    bnez a6, .LBB41_1
3016; RV64IA-NEXT:  # %bb.4:
3017; RV64IA-NEXT:    srlw a0, a5, a0
3018; RV64IA-NEXT:    ret
3019  %1 = atomicrmw min i8* %a, i8 %b acquire
3020  ret i8 %1
3021}
3022
3023define i8 @atomicrmw_min_i8_release(i8 *%a, i8 %b) nounwind {
3024; RV32I-LABEL: atomicrmw_min_i8_release:
3025; RV32I:       # %bb.0:
3026; RV32I-NEXT:    addi sp, sp, -32
3027; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3028; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3029; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3030; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3031; RV32I-NEXT:    mv s0, a0
3032; RV32I-NEXT:    lbu a3, 0(a0)
3033; RV32I-NEXT:    mv s1, a1
3034; RV32I-NEXT:    slli a0, a1, 24
3035; RV32I-NEXT:    srai s2, a0, 24
3036; RV32I-NEXT:    j .LBB42_2
3037; RV32I-NEXT:  .LBB42_1: # %atomicrmw.start
3038; RV32I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3039; RV32I-NEXT:    sb a3, 15(sp)
3040; RV32I-NEXT:    addi a1, sp, 15
3041; RV32I-NEXT:    li a3, 3
3042; RV32I-NEXT:    mv a0, s0
3043; RV32I-NEXT:    li a4, 0
3044; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3045; RV32I-NEXT:    lb a3, 15(sp)
3046; RV32I-NEXT:    bnez a0, .LBB42_4
3047; RV32I-NEXT:  .LBB42_2: # %atomicrmw.start
3048; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3049; RV32I-NEXT:    slli a0, a3, 24
3050; RV32I-NEXT:    srai a0, a0, 24
3051; RV32I-NEXT:    mv a2, a3
3052; RV32I-NEXT:    bge s2, a0, .LBB42_1
3053; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3054; RV32I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3055; RV32I-NEXT:    mv a2, s1
3056; RV32I-NEXT:    j .LBB42_1
3057; RV32I-NEXT:  .LBB42_4: # %atomicrmw.end
3058; RV32I-NEXT:    mv a0, a3
3059; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3060; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3061; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3062; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3063; RV32I-NEXT:    addi sp, sp, 32
3064; RV32I-NEXT:    ret
3065;
3066; RV32IA-LABEL: atomicrmw_min_i8_release:
3067; RV32IA:       # %bb.0:
3068; RV32IA-NEXT:    andi a2, a0, -4
3069; RV32IA-NEXT:    slli a0, a0, 3
3070; RV32IA-NEXT:    andi a3, a0, 24
3071; RV32IA-NEXT:    li a4, 255
3072; RV32IA-NEXT:    sll a4, a4, a0
3073; RV32IA-NEXT:    slli a1, a1, 24
3074; RV32IA-NEXT:    srai a1, a1, 24
3075; RV32IA-NEXT:    sll a1, a1, a0
3076; RV32IA-NEXT:    xori a3, a3, 24
3077; RV32IA-NEXT:  .LBB42_1: # =>This Inner Loop Header: Depth=1
3078; RV32IA-NEXT:    lr.w a5, (a2)
3079; RV32IA-NEXT:    and a7, a5, a4
3080; RV32IA-NEXT:    mv a6, a5
3081; RV32IA-NEXT:    sll a7, a7, a3
3082; RV32IA-NEXT:    sra a7, a7, a3
3083; RV32IA-NEXT:    bge a1, a7, .LBB42_3
3084; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB42_1 Depth=1
3085; RV32IA-NEXT:    xor a6, a5, a1
3086; RV32IA-NEXT:    and a6, a6, a4
3087; RV32IA-NEXT:    xor a6, a5, a6
3088; RV32IA-NEXT:  .LBB42_3: # in Loop: Header=BB42_1 Depth=1
3089; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
3090; RV32IA-NEXT:    bnez a6, .LBB42_1
3091; RV32IA-NEXT:  # %bb.4:
3092; RV32IA-NEXT:    srl a0, a5, a0
3093; RV32IA-NEXT:    ret
3094;
3095; RV64I-LABEL: atomicrmw_min_i8_release:
3096; RV64I:       # %bb.0:
3097; RV64I-NEXT:    addi sp, sp, -48
3098; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3099; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3100; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3101; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3102; RV64I-NEXT:    mv s0, a0
3103; RV64I-NEXT:    lbu a3, 0(a0)
3104; RV64I-NEXT:    mv s1, a1
3105; RV64I-NEXT:    slli a0, a1, 56
3106; RV64I-NEXT:    srai s2, a0, 56
3107; RV64I-NEXT:    j .LBB42_2
3108; RV64I-NEXT:  .LBB42_1: # %atomicrmw.start
3109; RV64I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3110; RV64I-NEXT:    sb a3, 15(sp)
3111; RV64I-NEXT:    addi a1, sp, 15
3112; RV64I-NEXT:    li a3, 3
3113; RV64I-NEXT:    mv a0, s0
3114; RV64I-NEXT:    li a4, 0
3115; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3116; RV64I-NEXT:    lb a3, 15(sp)
3117; RV64I-NEXT:    bnez a0, .LBB42_4
3118; RV64I-NEXT:  .LBB42_2: # %atomicrmw.start
3119; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3120; RV64I-NEXT:    slli a0, a3, 56
3121; RV64I-NEXT:    srai a0, a0, 56
3122; RV64I-NEXT:    mv a2, a3
3123; RV64I-NEXT:    bge s2, a0, .LBB42_1
3124; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3125; RV64I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3126; RV64I-NEXT:    mv a2, s1
3127; RV64I-NEXT:    j .LBB42_1
3128; RV64I-NEXT:  .LBB42_4: # %atomicrmw.end
3129; RV64I-NEXT:    mv a0, a3
3130; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3131; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3132; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3133; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3134; RV64I-NEXT:    addi sp, sp, 48
3135; RV64I-NEXT:    ret
3136;
3137; RV64IA-LABEL: atomicrmw_min_i8_release:
3138; RV64IA:       # %bb.0:
3139; RV64IA-NEXT:    andi a2, a0, -4
3140; RV64IA-NEXT:    slliw a0, a0, 3
3141; RV64IA-NEXT:    andi a3, a0, 24
3142; RV64IA-NEXT:    li a4, 255
3143; RV64IA-NEXT:    sllw a4, a4, a0
3144; RV64IA-NEXT:    slli a1, a1, 56
3145; RV64IA-NEXT:    srai a1, a1, 56
3146; RV64IA-NEXT:    sllw a1, a1, a0
3147; RV64IA-NEXT:    xori a3, a3, 56
3148; RV64IA-NEXT:  .LBB42_1: # =>This Inner Loop Header: Depth=1
3149; RV64IA-NEXT:    lr.w a5, (a2)
3150; RV64IA-NEXT:    and a7, a5, a4
3151; RV64IA-NEXT:    mv a6, a5
3152; RV64IA-NEXT:    sll a7, a7, a3
3153; RV64IA-NEXT:    sra a7, a7, a3
3154; RV64IA-NEXT:    bge a1, a7, .LBB42_3
3155; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB42_1 Depth=1
3156; RV64IA-NEXT:    xor a6, a5, a1
3157; RV64IA-NEXT:    and a6, a6, a4
3158; RV64IA-NEXT:    xor a6, a5, a6
3159; RV64IA-NEXT:  .LBB42_3: # in Loop: Header=BB42_1 Depth=1
3160; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
3161; RV64IA-NEXT:    bnez a6, .LBB42_1
3162; RV64IA-NEXT:  # %bb.4:
3163; RV64IA-NEXT:    srlw a0, a5, a0
3164; RV64IA-NEXT:    ret
3165  %1 = atomicrmw min i8* %a, i8 %b release
3166  ret i8 %1
3167}
3168
3169define i8 @atomicrmw_min_i8_acq_rel(i8 *%a, i8 %b) nounwind {
3170; RV32I-LABEL: atomicrmw_min_i8_acq_rel:
3171; RV32I:       # %bb.0:
3172; RV32I-NEXT:    addi sp, sp, -32
3173; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3174; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3175; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3176; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3177; RV32I-NEXT:    mv s0, a0
3178; RV32I-NEXT:    lbu a3, 0(a0)
3179; RV32I-NEXT:    mv s1, a1
3180; RV32I-NEXT:    slli a0, a1, 24
3181; RV32I-NEXT:    srai s2, a0, 24
3182; RV32I-NEXT:    j .LBB43_2
3183; RV32I-NEXT:  .LBB43_1: # %atomicrmw.start
3184; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3185; RV32I-NEXT:    sb a3, 15(sp)
3186; RV32I-NEXT:    addi a1, sp, 15
3187; RV32I-NEXT:    li a3, 4
3188; RV32I-NEXT:    li a4, 2
3189; RV32I-NEXT:    mv a0, s0
3190; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3191; RV32I-NEXT:    lb a3, 15(sp)
3192; RV32I-NEXT:    bnez a0, .LBB43_4
3193; RV32I-NEXT:  .LBB43_2: # %atomicrmw.start
3194; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3195; RV32I-NEXT:    slli a0, a3, 24
3196; RV32I-NEXT:    srai a0, a0, 24
3197; RV32I-NEXT:    mv a2, a3
3198; RV32I-NEXT:    bge s2, a0, .LBB43_1
3199; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3200; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3201; RV32I-NEXT:    mv a2, s1
3202; RV32I-NEXT:    j .LBB43_1
3203; RV32I-NEXT:  .LBB43_4: # %atomicrmw.end
3204; RV32I-NEXT:    mv a0, a3
3205; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3206; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3207; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3208; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3209; RV32I-NEXT:    addi sp, sp, 32
3210; RV32I-NEXT:    ret
3211;
3212; RV32IA-LABEL: atomicrmw_min_i8_acq_rel:
3213; RV32IA:       # %bb.0:
3214; RV32IA-NEXT:    andi a2, a0, -4
3215; RV32IA-NEXT:    slli a0, a0, 3
3216; RV32IA-NEXT:    andi a3, a0, 24
3217; RV32IA-NEXT:    li a4, 255
3218; RV32IA-NEXT:    sll a4, a4, a0
3219; RV32IA-NEXT:    slli a1, a1, 24
3220; RV32IA-NEXT:    srai a1, a1, 24
3221; RV32IA-NEXT:    sll a1, a1, a0
3222; RV32IA-NEXT:    xori a3, a3, 24
3223; RV32IA-NEXT:  .LBB43_1: # =>This Inner Loop Header: Depth=1
3224; RV32IA-NEXT:    lr.w.aq a5, (a2)
3225; RV32IA-NEXT:    and a7, a5, a4
3226; RV32IA-NEXT:    mv a6, a5
3227; RV32IA-NEXT:    sll a7, a7, a3
3228; RV32IA-NEXT:    sra a7, a7, a3
3229; RV32IA-NEXT:    bge a1, a7, .LBB43_3
3230; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB43_1 Depth=1
3231; RV32IA-NEXT:    xor a6, a5, a1
3232; RV32IA-NEXT:    and a6, a6, a4
3233; RV32IA-NEXT:    xor a6, a5, a6
3234; RV32IA-NEXT:  .LBB43_3: # in Loop: Header=BB43_1 Depth=1
3235; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
3236; RV32IA-NEXT:    bnez a6, .LBB43_1
3237; RV32IA-NEXT:  # %bb.4:
3238; RV32IA-NEXT:    srl a0, a5, a0
3239; RV32IA-NEXT:    ret
3240;
3241; RV64I-LABEL: atomicrmw_min_i8_acq_rel:
3242; RV64I:       # %bb.0:
3243; RV64I-NEXT:    addi sp, sp, -48
3244; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3245; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3246; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3247; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3248; RV64I-NEXT:    mv s0, a0
3249; RV64I-NEXT:    lbu a3, 0(a0)
3250; RV64I-NEXT:    mv s1, a1
3251; RV64I-NEXT:    slli a0, a1, 56
3252; RV64I-NEXT:    srai s2, a0, 56
3253; RV64I-NEXT:    j .LBB43_2
3254; RV64I-NEXT:  .LBB43_1: # %atomicrmw.start
3255; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3256; RV64I-NEXT:    sb a3, 15(sp)
3257; RV64I-NEXT:    addi a1, sp, 15
3258; RV64I-NEXT:    li a3, 4
3259; RV64I-NEXT:    li a4, 2
3260; RV64I-NEXT:    mv a0, s0
3261; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3262; RV64I-NEXT:    lb a3, 15(sp)
3263; RV64I-NEXT:    bnez a0, .LBB43_4
3264; RV64I-NEXT:  .LBB43_2: # %atomicrmw.start
3265; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3266; RV64I-NEXT:    slli a0, a3, 56
3267; RV64I-NEXT:    srai a0, a0, 56
3268; RV64I-NEXT:    mv a2, a3
3269; RV64I-NEXT:    bge s2, a0, .LBB43_1
3270; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3271; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3272; RV64I-NEXT:    mv a2, s1
3273; RV64I-NEXT:    j .LBB43_1
3274; RV64I-NEXT:  .LBB43_4: # %atomicrmw.end
3275; RV64I-NEXT:    mv a0, a3
3276; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3277; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3278; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3279; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3280; RV64I-NEXT:    addi sp, sp, 48
3281; RV64I-NEXT:    ret
3282;
3283; RV64IA-LABEL: atomicrmw_min_i8_acq_rel:
3284; RV64IA:       # %bb.0:
3285; RV64IA-NEXT:    andi a2, a0, -4
3286; RV64IA-NEXT:    slliw a0, a0, 3
3287; RV64IA-NEXT:    andi a3, a0, 24
3288; RV64IA-NEXT:    li a4, 255
3289; RV64IA-NEXT:    sllw a4, a4, a0
3290; RV64IA-NEXT:    slli a1, a1, 56
3291; RV64IA-NEXT:    srai a1, a1, 56
3292; RV64IA-NEXT:    sllw a1, a1, a0
3293; RV64IA-NEXT:    xori a3, a3, 56
3294; RV64IA-NEXT:  .LBB43_1: # =>This Inner Loop Header: Depth=1
3295; RV64IA-NEXT:    lr.w.aq a5, (a2)
3296; RV64IA-NEXT:    and a7, a5, a4
3297; RV64IA-NEXT:    mv a6, a5
3298; RV64IA-NEXT:    sll a7, a7, a3
3299; RV64IA-NEXT:    sra a7, a7, a3
3300; RV64IA-NEXT:    bge a1, a7, .LBB43_3
3301; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB43_1 Depth=1
3302; RV64IA-NEXT:    xor a6, a5, a1
3303; RV64IA-NEXT:    and a6, a6, a4
3304; RV64IA-NEXT:    xor a6, a5, a6
3305; RV64IA-NEXT:  .LBB43_3: # in Loop: Header=BB43_1 Depth=1
3306; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
3307; RV64IA-NEXT:    bnez a6, .LBB43_1
3308; RV64IA-NEXT:  # %bb.4:
3309; RV64IA-NEXT:    srlw a0, a5, a0
3310; RV64IA-NEXT:    ret
3311  %1 = atomicrmw min i8* %a, i8 %b acq_rel
3312  ret i8 %1
3313}
3314
3315define i8 @atomicrmw_min_i8_seq_cst(i8 *%a, i8 %b) nounwind {
3316; RV32I-LABEL: atomicrmw_min_i8_seq_cst:
3317; RV32I:       # %bb.0:
3318; RV32I-NEXT:    addi sp, sp, -32
3319; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3320; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3321; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3322; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3323; RV32I-NEXT:    mv s0, a0
3324; RV32I-NEXT:    lbu a3, 0(a0)
3325; RV32I-NEXT:    mv s1, a1
3326; RV32I-NEXT:    slli a0, a1, 24
3327; RV32I-NEXT:    srai s2, a0, 24
3328; RV32I-NEXT:    j .LBB44_2
3329; RV32I-NEXT:  .LBB44_1: # %atomicrmw.start
3330; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3331; RV32I-NEXT:    sb a3, 15(sp)
3332; RV32I-NEXT:    addi a1, sp, 15
3333; RV32I-NEXT:    li a3, 5
3334; RV32I-NEXT:    li a4, 5
3335; RV32I-NEXT:    mv a0, s0
3336; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3337; RV32I-NEXT:    lb a3, 15(sp)
3338; RV32I-NEXT:    bnez a0, .LBB44_4
3339; RV32I-NEXT:  .LBB44_2: # %atomicrmw.start
3340; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3341; RV32I-NEXT:    slli a0, a3, 24
3342; RV32I-NEXT:    srai a0, a0, 24
3343; RV32I-NEXT:    mv a2, a3
3344; RV32I-NEXT:    bge s2, a0, .LBB44_1
3345; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3346; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3347; RV32I-NEXT:    mv a2, s1
3348; RV32I-NEXT:    j .LBB44_1
3349; RV32I-NEXT:  .LBB44_4: # %atomicrmw.end
3350; RV32I-NEXT:    mv a0, a3
3351; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3352; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3353; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3354; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3355; RV32I-NEXT:    addi sp, sp, 32
3356; RV32I-NEXT:    ret
3357;
3358; RV32IA-LABEL: atomicrmw_min_i8_seq_cst:
3359; RV32IA:       # %bb.0:
3360; RV32IA-NEXT:    andi a2, a0, -4
3361; RV32IA-NEXT:    slli a0, a0, 3
3362; RV32IA-NEXT:    andi a3, a0, 24
3363; RV32IA-NEXT:    li a4, 255
3364; RV32IA-NEXT:    sll a4, a4, a0
3365; RV32IA-NEXT:    slli a1, a1, 24
3366; RV32IA-NEXT:    srai a1, a1, 24
3367; RV32IA-NEXT:    sll a1, a1, a0
3368; RV32IA-NEXT:    xori a3, a3, 24
3369; RV32IA-NEXT:  .LBB44_1: # =>This Inner Loop Header: Depth=1
3370; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
3371; RV32IA-NEXT:    and a7, a5, a4
3372; RV32IA-NEXT:    mv a6, a5
3373; RV32IA-NEXT:    sll a7, a7, a3
3374; RV32IA-NEXT:    sra a7, a7, a3
3375; RV32IA-NEXT:    bge a1, a7, .LBB44_3
3376; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB44_1 Depth=1
3377; RV32IA-NEXT:    xor a6, a5, a1
3378; RV32IA-NEXT:    and a6, a6, a4
3379; RV32IA-NEXT:    xor a6, a5, a6
3380; RV32IA-NEXT:  .LBB44_3: # in Loop: Header=BB44_1 Depth=1
3381; RV32IA-NEXT:    sc.w.aqrl a6, a6, (a2)
3382; RV32IA-NEXT:    bnez a6, .LBB44_1
3383; RV32IA-NEXT:  # %bb.4:
3384; RV32IA-NEXT:    srl a0, a5, a0
3385; RV32IA-NEXT:    ret
3386;
3387; RV64I-LABEL: atomicrmw_min_i8_seq_cst:
3388; RV64I:       # %bb.0:
3389; RV64I-NEXT:    addi sp, sp, -48
3390; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3391; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3392; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3393; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3394; RV64I-NEXT:    mv s0, a0
3395; RV64I-NEXT:    lbu a3, 0(a0)
3396; RV64I-NEXT:    mv s1, a1
3397; RV64I-NEXT:    slli a0, a1, 56
3398; RV64I-NEXT:    srai s2, a0, 56
3399; RV64I-NEXT:    j .LBB44_2
3400; RV64I-NEXT:  .LBB44_1: # %atomicrmw.start
3401; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3402; RV64I-NEXT:    sb a3, 15(sp)
3403; RV64I-NEXT:    addi a1, sp, 15
3404; RV64I-NEXT:    li a3, 5
3405; RV64I-NEXT:    li a4, 5
3406; RV64I-NEXT:    mv a0, s0
3407; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3408; RV64I-NEXT:    lb a3, 15(sp)
3409; RV64I-NEXT:    bnez a0, .LBB44_4
3410; RV64I-NEXT:  .LBB44_2: # %atomicrmw.start
3411; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3412; RV64I-NEXT:    slli a0, a3, 56
3413; RV64I-NEXT:    srai a0, a0, 56
3414; RV64I-NEXT:    mv a2, a3
3415; RV64I-NEXT:    bge s2, a0, .LBB44_1
3416; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3417; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3418; RV64I-NEXT:    mv a2, s1
3419; RV64I-NEXT:    j .LBB44_1
3420; RV64I-NEXT:  .LBB44_4: # %atomicrmw.end
3421; RV64I-NEXT:    mv a0, a3
3422; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3423; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3424; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3425; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3426; RV64I-NEXT:    addi sp, sp, 48
3427; RV64I-NEXT:    ret
3428;
3429; RV64IA-LABEL: atomicrmw_min_i8_seq_cst:
3430; RV64IA:       # %bb.0:
3431; RV64IA-NEXT:    andi a2, a0, -4
3432; RV64IA-NEXT:    slliw a0, a0, 3
3433; RV64IA-NEXT:    andi a3, a0, 24
3434; RV64IA-NEXT:    li a4, 255
3435; RV64IA-NEXT:    sllw a4, a4, a0
3436; RV64IA-NEXT:    slli a1, a1, 56
3437; RV64IA-NEXT:    srai a1, a1, 56
3438; RV64IA-NEXT:    sllw a1, a1, a0
3439; RV64IA-NEXT:    xori a3, a3, 56
3440; RV64IA-NEXT:  .LBB44_1: # =>This Inner Loop Header: Depth=1
3441; RV64IA-NEXT:    lr.w.aqrl a5, (a2)
3442; RV64IA-NEXT:    and a7, a5, a4
3443; RV64IA-NEXT:    mv a6, a5
3444; RV64IA-NEXT:    sll a7, a7, a3
3445; RV64IA-NEXT:    sra a7, a7, a3
3446; RV64IA-NEXT:    bge a1, a7, .LBB44_3
3447; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB44_1 Depth=1
3448; RV64IA-NEXT:    xor a6, a5, a1
3449; RV64IA-NEXT:    and a6, a6, a4
3450; RV64IA-NEXT:    xor a6, a5, a6
3451; RV64IA-NEXT:  .LBB44_3: # in Loop: Header=BB44_1 Depth=1
3452; RV64IA-NEXT:    sc.w.aqrl a6, a6, (a2)
3453; RV64IA-NEXT:    bnez a6, .LBB44_1
3454; RV64IA-NEXT:  # %bb.4:
3455; RV64IA-NEXT:    srlw a0, a5, a0
3456; RV64IA-NEXT:    ret
3457  %1 = atomicrmw min i8* %a, i8 %b seq_cst
3458  ret i8 %1
3459}
3460
3461define i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind {
3462; RV32I-LABEL: atomicrmw_umax_i8_monotonic:
3463; RV32I:       # %bb.0:
3464; RV32I-NEXT:    addi sp, sp, -32
3465; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3466; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3467; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3468; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3469; RV32I-NEXT:    mv s0, a0
3470; RV32I-NEXT:    lbu a3, 0(a0)
3471; RV32I-NEXT:    mv s1, a1
3472; RV32I-NEXT:    andi s2, a1, 255
3473; RV32I-NEXT:    j .LBB45_2
3474; RV32I-NEXT:  .LBB45_1: # %atomicrmw.start
3475; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3476; RV32I-NEXT:    sb a3, 15(sp)
3477; RV32I-NEXT:    addi a1, sp, 15
3478; RV32I-NEXT:    mv a0, s0
3479; RV32I-NEXT:    li a3, 0
3480; RV32I-NEXT:    li a4, 0
3481; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3482; RV32I-NEXT:    lb a3, 15(sp)
3483; RV32I-NEXT:    bnez a0, .LBB45_4
3484; RV32I-NEXT:  .LBB45_2: # %atomicrmw.start
3485; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3486; RV32I-NEXT:    andi a0, a3, 255
3487; RV32I-NEXT:    mv a2, a3
3488; RV32I-NEXT:    bltu s2, a0, .LBB45_1
3489; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3490; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3491; RV32I-NEXT:    mv a2, s1
3492; RV32I-NEXT:    j .LBB45_1
3493; RV32I-NEXT:  .LBB45_4: # %atomicrmw.end
3494; RV32I-NEXT:    mv a0, a3
3495; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3496; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3497; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3498; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3499; RV32I-NEXT:    addi sp, sp, 32
3500; RV32I-NEXT:    ret
3501;
3502; RV32IA-LABEL: atomicrmw_umax_i8_monotonic:
3503; RV32IA:       # %bb.0:
3504; RV32IA-NEXT:    andi a2, a0, -4
3505; RV32IA-NEXT:    slli a0, a0, 3
3506; RV32IA-NEXT:    li a3, 255
3507; RV32IA-NEXT:    sll a3, a3, a0
3508; RV32IA-NEXT:    andi a1, a1, 255
3509; RV32IA-NEXT:    sll a1, a1, a0
3510; RV32IA-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
3511; RV32IA-NEXT:    lr.w a4, (a2)
3512; RV32IA-NEXT:    and a6, a4, a3
3513; RV32IA-NEXT:    mv a5, a4
3514; RV32IA-NEXT:    bgeu a6, a1, .LBB45_3
3515; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
3516; RV32IA-NEXT:    xor a5, a4, a1
3517; RV32IA-NEXT:    and a5, a5, a3
3518; RV32IA-NEXT:    xor a5, a4, a5
3519; RV32IA-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
3520; RV32IA-NEXT:    sc.w a5, a5, (a2)
3521; RV32IA-NEXT:    bnez a5, .LBB45_1
3522; RV32IA-NEXT:  # %bb.4:
3523; RV32IA-NEXT:    srl a0, a4, a0
3524; RV32IA-NEXT:    ret
3525;
3526; RV64I-LABEL: atomicrmw_umax_i8_monotonic:
3527; RV64I:       # %bb.0:
3528; RV64I-NEXT:    addi sp, sp, -48
3529; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3530; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3531; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3532; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3533; RV64I-NEXT:    mv s0, a0
3534; RV64I-NEXT:    lbu a3, 0(a0)
3535; RV64I-NEXT:    mv s1, a1
3536; RV64I-NEXT:    andi s2, a1, 255
3537; RV64I-NEXT:    j .LBB45_2
3538; RV64I-NEXT:  .LBB45_1: # %atomicrmw.start
3539; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3540; RV64I-NEXT:    sb a3, 15(sp)
3541; RV64I-NEXT:    addi a1, sp, 15
3542; RV64I-NEXT:    mv a0, s0
3543; RV64I-NEXT:    li a3, 0
3544; RV64I-NEXT:    li a4, 0
3545; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3546; RV64I-NEXT:    lb a3, 15(sp)
3547; RV64I-NEXT:    bnez a0, .LBB45_4
3548; RV64I-NEXT:  .LBB45_2: # %atomicrmw.start
3549; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3550; RV64I-NEXT:    andi a0, a3, 255
3551; RV64I-NEXT:    mv a2, a3
3552; RV64I-NEXT:    bltu s2, a0, .LBB45_1
3553; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3554; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3555; RV64I-NEXT:    mv a2, s1
3556; RV64I-NEXT:    j .LBB45_1
3557; RV64I-NEXT:  .LBB45_4: # %atomicrmw.end
3558; RV64I-NEXT:    mv a0, a3
3559; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3560; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3561; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3562; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3563; RV64I-NEXT:    addi sp, sp, 48
3564; RV64I-NEXT:    ret
3565;
3566; RV64IA-LABEL: atomicrmw_umax_i8_monotonic:
3567; RV64IA:       # %bb.0:
3568; RV64IA-NEXT:    andi a2, a0, -4
3569; RV64IA-NEXT:    slliw a0, a0, 3
3570; RV64IA-NEXT:    li a3, 255
3571; RV64IA-NEXT:    sllw a3, a3, a0
3572; RV64IA-NEXT:    andi a1, a1, 255
3573; RV64IA-NEXT:    sllw a1, a1, a0
3574; RV64IA-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
3575; RV64IA-NEXT:    lr.w a4, (a2)
3576; RV64IA-NEXT:    and a6, a4, a3
3577; RV64IA-NEXT:    mv a5, a4
3578; RV64IA-NEXT:    bgeu a6, a1, .LBB45_3
3579; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
3580; RV64IA-NEXT:    xor a5, a4, a1
3581; RV64IA-NEXT:    and a5, a5, a3
3582; RV64IA-NEXT:    xor a5, a4, a5
3583; RV64IA-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
3584; RV64IA-NEXT:    sc.w a5, a5, (a2)
3585; RV64IA-NEXT:    bnez a5, .LBB45_1
3586; RV64IA-NEXT:  # %bb.4:
3587; RV64IA-NEXT:    srlw a0, a4, a0
3588; RV64IA-NEXT:    ret
3589  %1 = atomicrmw umax i8* %a, i8 %b monotonic
3590  ret i8 %1
3591}
3592
3593define i8 @atomicrmw_umax_i8_acquire(i8 *%a, i8 %b) nounwind {
3594; RV32I-LABEL: atomicrmw_umax_i8_acquire:
3595; RV32I:       # %bb.0:
3596; RV32I-NEXT:    addi sp, sp, -32
3597; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3598; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3599; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3600; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3601; RV32I-NEXT:    mv s0, a0
3602; RV32I-NEXT:    lbu a3, 0(a0)
3603; RV32I-NEXT:    mv s1, a1
3604; RV32I-NEXT:    andi s2, a1, 255
3605; RV32I-NEXT:    j .LBB46_2
3606; RV32I-NEXT:  .LBB46_1: # %atomicrmw.start
3607; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3608; RV32I-NEXT:    sb a3, 15(sp)
3609; RV32I-NEXT:    addi a1, sp, 15
3610; RV32I-NEXT:    li a3, 2
3611; RV32I-NEXT:    li a4, 2
3612; RV32I-NEXT:    mv a0, s0
3613; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3614; RV32I-NEXT:    lb a3, 15(sp)
3615; RV32I-NEXT:    bnez a0, .LBB46_4
3616; RV32I-NEXT:  .LBB46_2: # %atomicrmw.start
3617; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3618; RV32I-NEXT:    andi a0, a3, 255
3619; RV32I-NEXT:    mv a2, a3
3620; RV32I-NEXT:    bltu s2, a0, .LBB46_1
3621; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3622; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3623; RV32I-NEXT:    mv a2, s1
3624; RV32I-NEXT:    j .LBB46_1
3625; RV32I-NEXT:  .LBB46_4: # %atomicrmw.end
3626; RV32I-NEXT:    mv a0, a3
3627; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3628; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3629; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3630; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3631; RV32I-NEXT:    addi sp, sp, 32
3632; RV32I-NEXT:    ret
3633;
3634; RV32IA-LABEL: atomicrmw_umax_i8_acquire:
3635; RV32IA:       # %bb.0:
3636; RV32IA-NEXT:    andi a2, a0, -4
3637; RV32IA-NEXT:    slli a0, a0, 3
3638; RV32IA-NEXT:    li a3, 255
3639; RV32IA-NEXT:    sll a3, a3, a0
3640; RV32IA-NEXT:    andi a1, a1, 255
3641; RV32IA-NEXT:    sll a1, a1, a0
3642; RV32IA-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
3643; RV32IA-NEXT:    lr.w.aq a4, (a2)
3644; RV32IA-NEXT:    and a6, a4, a3
3645; RV32IA-NEXT:    mv a5, a4
3646; RV32IA-NEXT:    bgeu a6, a1, .LBB46_3
3647; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
3648; RV32IA-NEXT:    xor a5, a4, a1
3649; RV32IA-NEXT:    and a5, a5, a3
3650; RV32IA-NEXT:    xor a5, a4, a5
3651; RV32IA-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
3652; RV32IA-NEXT:    sc.w a5, a5, (a2)
3653; RV32IA-NEXT:    bnez a5, .LBB46_1
3654; RV32IA-NEXT:  # %bb.4:
3655; RV32IA-NEXT:    srl a0, a4, a0
3656; RV32IA-NEXT:    ret
3657;
3658; RV64I-LABEL: atomicrmw_umax_i8_acquire:
3659; RV64I:       # %bb.0:
3660; RV64I-NEXT:    addi sp, sp, -48
3661; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3662; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3663; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3664; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3665; RV64I-NEXT:    mv s0, a0
3666; RV64I-NEXT:    lbu a3, 0(a0)
3667; RV64I-NEXT:    mv s1, a1
3668; RV64I-NEXT:    andi s2, a1, 255
3669; RV64I-NEXT:    j .LBB46_2
3670; RV64I-NEXT:  .LBB46_1: # %atomicrmw.start
3671; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3672; RV64I-NEXT:    sb a3, 15(sp)
3673; RV64I-NEXT:    addi a1, sp, 15
3674; RV64I-NEXT:    li a3, 2
3675; RV64I-NEXT:    li a4, 2
3676; RV64I-NEXT:    mv a0, s0
3677; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3678; RV64I-NEXT:    lb a3, 15(sp)
3679; RV64I-NEXT:    bnez a0, .LBB46_4
3680; RV64I-NEXT:  .LBB46_2: # %atomicrmw.start
3681; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3682; RV64I-NEXT:    andi a0, a3, 255
3683; RV64I-NEXT:    mv a2, a3
3684; RV64I-NEXT:    bltu s2, a0, .LBB46_1
3685; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3686; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3687; RV64I-NEXT:    mv a2, s1
3688; RV64I-NEXT:    j .LBB46_1
3689; RV64I-NEXT:  .LBB46_4: # %atomicrmw.end
3690; RV64I-NEXT:    mv a0, a3
3691; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3692; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3693; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3694; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3695; RV64I-NEXT:    addi sp, sp, 48
3696; RV64I-NEXT:    ret
3697;
3698; RV64IA-LABEL: atomicrmw_umax_i8_acquire:
3699; RV64IA:       # %bb.0:
3700; RV64IA-NEXT:    andi a2, a0, -4
3701; RV64IA-NEXT:    slliw a0, a0, 3
3702; RV64IA-NEXT:    li a3, 255
3703; RV64IA-NEXT:    sllw a3, a3, a0
3704; RV64IA-NEXT:    andi a1, a1, 255
3705; RV64IA-NEXT:    sllw a1, a1, a0
3706; RV64IA-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
3707; RV64IA-NEXT:    lr.w.aq a4, (a2)
3708; RV64IA-NEXT:    and a6, a4, a3
3709; RV64IA-NEXT:    mv a5, a4
3710; RV64IA-NEXT:    bgeu a6, a1, .LBB46_3
3711; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
3712; RV64IA-NEXT:    xor a5, a4, a1
3713; RV64IA-NEXT:    and a5, a5, a3
3714; RV64IA-NEXT:    xor a5, a4, a5
3715; RV64IA-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
3716; RV64IA-NEXT:    sc.w a5, a5, (a2)
3717; RV64IA-NEXT:    bnez a5, .LBB46_1
3718; RV64IA-NEXT:  # %bb.4:
3719; RV64IA-NEXT:    srlw a0, a4, a0
3720; RV64IA-NEXT:    ret
3721  %1 = atomicrmw umax i8* %a, i8 %b acquire
3722  ret i8 %1
3723}
3724
3725define i8 @atomicrmw_umax_i8_release(i8 *%a, i8 %b) nounwind {
3726; RV32I-LABEL: atomicrmw_umax_i8_release:
3727; RV32I:       # %bb.0:
3728; RV32I-NEXT:    addi sp, sp, -32
3729; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3730; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3731; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3732; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3733; RV32I-NEXT:    mv s0, a0
3734; RV32I-NEXT:    lbu a3, 0(a0)
3735; RV32I-NEXT:    mv s1, a1
3736; RV32I-NEXT:    andi s2, a1, 255
3737; RV32I-NEXT:    j .LBB47_2
3738; RV32I-NEXT:  .LBB47_1: # %atomicrmw.start
3739; RV32I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3740; RV32I-NEXT:    sb a3, 15(sp)
3741; RV32I-NEXT:    addi a1, sp, 15
3742; RV32I-NEXT:    li a3, 3
3743; RV32I-NEXT:    mv a0, s0
3744; RV32I-NEXT:    li a4, 0
3745; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3746; RV32I-NEXT:    lb a3, 15(sp)
3747; RV32I-NEXT:    bnez a0, .LBB47_4
3748; RV32I-NEXT:  .LBB47_2: # %atomicrmw.start
3749; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3750; RV32I-NEXT:    andi a0, a3, 255
3751; RV32I-NEXT:    mv a2, a3
3752; RV32I-NEXT:    bltu s2, a0, .LBB47_1
3753; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3754; RV32I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3755; RV32I-NEXT:    mv a2, s1
3756; RV32I-NEXT:    j .LBB47_1
3757; RV32I-NEXT:  .LBB47_4: # %atomicrmw.end
3758; RV32I-NEXT:    mv a0, a3
3759; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3760; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3761; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3762; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3763; RV32I-NEXT:    addi sp, sp, 32
3764; RV32I-NEXT:    ret
3765;
3766; RV32IA-LABEL: atomicrmw_umax_i8_release:
3767; RV32IA:       # %bb.0:
3768; RV32IA-NEXT:    andi a2, a0, -4
3769; RV32IA-NEXT:    slli a0, a0, 3
3770; RV32IA-NEXT:    li a3, 255
3771; RV32IA-NEXT:    sll a3, a3, a0
3772; RV32IA-NEXT:    andi a1, a1, 255
3773; RV32IA-NEXT:    sll a1, a1, a0
3774; RV32IA-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
3775; RV32IA-NEXT:    lr.w a4, (a2)
3776; RV32IA-NEXT:    and a6, a4, a3
3777; RV32IA-NEXT:    mv a5, a4
3778; RV32IA-NEXT:    bgeu a6, a1, .LBB47_3
3779; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
3780; RV32IA-NEXT:    xor a5, a4, a1
3781; RV32IA-NEXT:    and a5, a5, a3
3782; RV32IA-NEXT:    xor a5, a4, a5
3783; RV32IA-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
3784; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
3785; RV32IA-NEXT:    bnez a5, .LBB47_1
3786; RV32IA-NEXT:  # %bb.4:
3787; RV32IA-NEXT:    srl a0, a4, a0
3788; RV32IA-NEXT:    ret
3789;
3790; RV64I-LABEL: atomicrmw_umax_i8_release:
3791; RV64I:       # %bb.0:
3792; RV64I-NEXT:    addi sp, sp, -48
3793; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3794; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3795; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3796; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3797; RV64I-NEXT:    mv s0, a0
3798; RV64I-NEXT:    lbu a3, 0(a0)
3799; RV64I-NEXT:    mv s1, a1
3800; RV64I-NEXT:    andi s2, a1, 255
3801; RV64I-NEXT:    j .LBB47_2
3802; RV64I-NEXT:  .LBB47_1: # %atomicrmw.start
3803; RV64I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3804; RV64I-NEXT:    sb a3, 15(sp)
3805; RV64I-NEXT:    addi a1, sp, 15
3806; RV64I-NEXT:    li a3, 3
3807; RV64I-NEXT:    mv a0, s0
3808; RV64I-NEXT:    li a4, 0
3809; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3810; RV64I-NEXT:    lb a3, 15(sp)
3811; RV64I-NEXT:    bnez a0, .LBB47_4
3812; RV64I-NEXT:  .LBB47_2: # %atomicrmw.start
3813; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3814; RV64I-NEXT:    andi a0, a3, 255
3815; RV64I-NEXT:    mv a2, a3
3816; RV64I-NEXT:    bltu s2, a0, .LBB47_1
3817; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3818; RV64I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3819; RV64I-NEXT:    mv a2, s1
3820; RV64I-NEXT:    j .LBB47_1
3821; RV64I-NEXT:  .LBB47_4: # %atomicrmw.end
3822; RV64I-NEXT:    mv a0, a3
3823; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3824; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3825; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3826; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3827; RV64I-NEXT:    addi sp, sp, 48
3828; RV64I-NEXT:    ret
3829;
3830; RV64IA-LABEL: atomicrmw_umax_i8_release:
3831; RV64IA:       # %bb.0:
3832; RV64IA-NEXT:    andi a2, a0, -4
3833; RV64IA-NEXT:    slliw a0, a0, 3
3834; RV64IA-NEXT:    li a3, 255
3835; RV64IA-NEXT:    sllw a3, a3, a0
3836; RV64IA-NEXT:    andi a1, a1, 255
3837; RV64IA-NEXT:    sllw a1, a1, a0
3838; RV64IA-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
3839; RV64IA-NEXT:    lr.w a4, (a2)
3840; RV64IA-NEXT:    and a6, a4, a3
3841; RV64IA-NEXT:    mv a5, a4
3842; RV64IA-NEXT:    bgeu a6, a1, .LBB47_3
3843; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
3844; RV64IA-NEXT:    xor a5, a4, a1
3845; RV64IA-NEXT:    and a5, a5, a3
3846; RV64IA-NEXT:    xor a5, a4, a5
3847; RV64IA-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
3848; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
3849; RV64IA-NEXT:    bnez a5, .LBB47_1
3850; RV64IA-NEXT:  # %bb.4:
3851; RV64IA-NEXT:    srlw a0, a4, a0
3852; RV64IA-NEXT:    ret
3853  %1 = atomicrmw umax i8* %a, i8 %b release
3854  ret i8 %1
3855}
3856
3857define i8 @atomicrmw_umax_i8_acq_rel(i8 *%a, i8 %b) nounwind {
3858; RV32I-LABEL: atomicrmw_umax_i8_acq_rel:
3859; RV32I:       # %bb.0:
3860; RV32I-NEXT:    addi sp, sp, -32
3861; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3862; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3863; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3864; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3865; RV32I-NEXT:    mv s0, a0
3866; RV32I-NEXT:    lbu a3, 0(a0)
3867; RV32I-NEXT:    mv s1, a1
3868; RV32I-NEXT:    andi s2, a1, 255
3869; RV32I-NEXT:    j .LBB48_2
3870; RV32I-NEXT:  .LBB48_1: # %atomicrmw.start
3871; RV32I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3872; RV32I-NEXT:    sb a3, 15(sp)
3873; RV32I-NEXT:    addi a1, sp, 15
3874; RV32I-NEXT:    li a3, 4
3875; RV32I-NEXT:    li a4, 2
3876; RV32I-NEXT:    mv a0, s0
3877; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3878; RV32I-NEXT:    lb a3, 15(sp)
3879; RV32I-NEXT:    bnez a0, .LBB48_4
3880; RV32I-NEXT:  .LBB48_2: # %atomicrmw.start
3881; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3882; RV32I-NEXT:    andi a0, a3, 255
3883; RV32I-NEXT:    mv a2, a3
3884; RV32I-NEXT:    bltu s2, a0, .LBB48_1
3885; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3886; RV32I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3887; RV32I-NEXT:    mv a2, s1
3888; RV32I-NEXT:    j .LBB48_1
3889; RV32I-NEXT:  .LBB48_4: # %atomicrmw.end
3890; RV32I-NEXT:    mv a0, a3
3891; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3892; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3893; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3894; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3895; RV32I-NEXT:    addi sp, sp, 32
3896; RV32I-NEXT:    ret
3897;
3898; RV32IA-LABEL: atomicrmw_umax_i8_acq_rel:
3899; RV32IA:       # %bb.0:
3900; RV32IA-NEXT:    andi a2, a0, -4
3901; RV32IA-NEXT:    slli a0, a0, 3
3902; RV32IA-NEXT:    li a3, 255
3903; RV32IA-NEXT:    sll a3, a3, a0
3904; RV32IA-NEXT:    andi a1, a1, 255
3905; RV32IA-NEXT:    sll a1, a1, a0
3906; RV32IA-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
3907; RV32IA-NEXT:    lr.w.aq a4, (a2)
3908; RV32IA-NEXT:    and a6, a4, a3
3909; RV32IA-NEXT:    mv a5, a4
3910; RV32IA-NEXT:    bgeu a6, a1, .LBB48_3
3911; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
3912; RV32IA-NEXT:    xor a5, a4, a1
3913; RV32IA-NEXT:    and a5, a5, a3
3914; RV32IA-NEXT:    xor a5, a4, a5
3915; RV32IA-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
3916; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
3917; RV32IA-NEXT:    bnez a5, .LBB48_1
3918; RV32IA-NEXT:  # %bb.4:
3919; RV32IA-NEXT:    srl a0, a4, a0
3920; RV32IA-NEXT:    ret
3921;
3922; RV64I-LABEL: atomicrmw_umax_i8_acq_rel:
3923; RV64I:       # %bb.0:
3924; RV64I-NEXT:    addi sp, sp, -48
3925; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3926; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3927; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3928; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3929; RV64I-NEXT:    mv s0, a0
3930; RV64I-NEXT:    lbu a3, 0(a0)
3931; RV64I-NEXT:    mv s1, a1
3932; RV64I-NEXT:    andi s2, a1, 255
3933; RV64I-NEXT:    j .LBB48_2
3934; RV64I-NEXT:  .LBB48_1: # %atomicrmw.start
3935; RV64I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3936; RV64I-NEXT:    sb a3, 15(sp)
3937; RV64I-NEXT:    addi a1, sp, 15
3938; RV64I-NEXT:    li a3, 4
3939; RV64I-NEXT:    li a4, 2
3940; RV64I-NEXT:    mv a0, s0
3941; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3942; RV64I-NEXT:    lb a3, 15(sp)
3943; RV64I-NEXT:    bnez a0, .LBB48_4
3944; RV64I-NEXT:  .LBB48_2: # %atomicrmw.start
3945; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3946; RV64I-NEXT:    andi a0, a3, 255
3947; RV64I-NEXT:    mv a2, a3
3948; RV64I-NEXT:    bltu s2, a0, .LBB48_1
3949; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3950; RV64I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3951; RV64I-NEXT:    mv a2, s1
3952; RV64I-NEXT:    j .LBB48_1
3953; RV64I-NEXT:  .LBB48_4: # %atomicrmw.end
3954; RV64I-NEXT:    mv a0, a3
3955; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3956; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3957; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3958; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3959; RV64I-NEXT:    addi sp, sp, 48
3960; RV64I-NEXT:    ret
3961;
3962; RV64IA-LABEL: atomicrmw_umax_i8_acq_rel:
3963; RV64IA:       # %bb.0:
3964; RV64IA-NEXT:    andi a2, a0, -4
3965; RV64IA-NEXT:    slliw a0, a0, 3
3966; RV64IA-NEXT:    li a3, 255
3967; RV64IA-NEXT:    sllw a3, a3, a0
3968; RV64IA-NEXT:    andi a1, a1, 255
3969; RV64IA-NEXT:    sllw a1, a1, a0
3970; RV64IA-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
3971; RV64IA-NEXT:    lr.w.aq a4, (a2)
3972; RV64IA-NEXT:    and a6, a4, a3
3973; RV64IA-NEXT:    mv a5, a4
3974; RV64IA-NEXT:    bgeu a6, a1, .LBB48_3
3975; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
3976; RV64IA-NEXT:    xor a5, a4, a1
3977; RV64IA-NEXT:    and a5, a5, a3
3978; RV64IA-NEXT:    xor a5, a4, a5
3979; RV64IA-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
3980; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
3981; RV64IA-NEXT:    bnez a5, .LBB48_1
3982; RV64IA-NEXT:  # %bb.4:
3983; RV64IA-NEXT:    srlw a0, a4, a0
3984; RV64IA-NEXT:    ret
3985  %1 = atomicrmw umax i8* %a, i8 %b acq_rel
3986  ret i8 %1
3987}
3988
3989define i8 @atomicrmw_umax_i8_seq_cst(i8 *%a, i8 %b) nounwind {
3990; RV32I-LABEL: atomicrmw_umax_i8_seq_cst:
3991; RV32I:       # %bb.0:
3992; RV32I-NEXT:    addi sp, sp, -32
3993; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3994; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3995; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3996; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3997; RV32I-NEXT:    mv s0, a0
3998; RV32I-NEXT:    lbu a3, 0(a0)
3999; RV32I-NEXT:    mv s1, a1
4000; RV32I-NEXT:    andi s2, a1, 255
4001; RV32I-NEXT:    j .LBB49_2
4002; RV32I-NEXT:  .LBB49_1: # %atomicrmw.start
4003; RV32I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4004; RV32I-NEXT:    sb a3, 15(sp)
4005; RV32I-NEXT:    addi a1, sp, 15
4006; RV32I-NEXT:    li a3, 5
4007; RV32I-NEXT:    li a4, 5
4008; RV32I-NEXT:    mv a0, s0
4009; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4010; RV32I-NEXT:    lb a3, 15(sp)
4011; RV32I-NEXT:    bnez a0, .LBB49_4
4012; RV32I-NEXT:  .LBB49_2: # %atomicrmw.start
4013; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4014; RV32I-NEXT:    andi a0, a3, 255
4015; RV32I-NEXT:    mv a2, a3
4016; RV32I-NEXT:    bltu s2, a0, .LBB49_1
4017; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4018; RV32I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4019; RV32I-NEXT:    mv a2, s1
4020; RV32I-NEXT:    j .LBB49_1
4021; RV32I-NEXT:  .LBB49_4: # %atomicrmw.end
4022; RV32I-NEXT:    mv a0, a3
4023; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4024; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4025; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4026; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4027; RV32I-NEXT:    addi sp, sp, 32
4028; RV32I-NEXT:    ret
4029;
4030; RV32IA-LABEL: atomicrmw_umax_i8_seq_cst:
4031; RV32IA:       # %bb.0:
4032; RV32IA-NEXT:    andi a2, a0, -4
4033; RV32IA-NEXT:    slli a0, a0, 3
4034; RV32IA-NEXT:    li a3, 255
4035; RV32IA-NEXT:    sll a3, a3, a0
4036; RV32IA-NEXT:    andi a1, a1, 255
4037; RV32IA-NEXT:    sll a1, a1, a0
4038; RV32IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
4039; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
4040; RV32IA-NEXT:    and a6, a4, a3
4041; RV32IA-NEXT:    mv a5, a4
4042; RV32IA-NEXT:    bgeu a6, a1, .LBB49_3
4043; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
4044; RV32IA-NEXT:    xor a5, a4, a1
4045; RV32IA-NEXT:    and a5, a5, a3
4046; RV32IA-NEXT:    xor a5, a4, a5
4047; RV32IA-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
4048; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
4049; RV32IA-NEXT:    bnez a5, .LBB49_1
4050; RV32IA-NEXT:  # %bb.4:
4051; RV32IA-NEXT:    srl a0, a4, a0
4052; RV32IA-NEXT:    ret
4053;
4054; RV64I-LABEL: atomicrmw_umax_i8_seq_cst:
4055; RV64I:       # %bb.0:
4056; RV64I-NEXT:    addi sp, sp, -48
4057; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4058; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4059; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4060; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4061; RV64I-NEXT:    mv s0, a0
4062; RV64I-NEXT:    lbu a3, 0(a0)
4063; RV64I-NEXT:    mv s1, a1
4064; RV64I-NEXT:    andi s2, a1, 255
4065; RV64I-NEXT:    j .LBB49_2
4066; RV64I-NEXT:  .LBB49_1: # %atomicrmw.start
4067; RV64I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4068; RV64I-NEXT:    sb a3, 15(sp)
4069; RV64I-NEXT:    addi a1, sp, 15
4070; RV64I-NEXT:    li a3, 5
4071; RV64I-NEXT:    li a4, 5
4072; RV64I-NEXT:    mv a0, s0
4073; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4074; RV64I-NEXT:    lb a3, 15(sp)
4075; RV64I-NEXT:    bnez a0, .LBB49_4
4076; RV64I-NEXT:  .LBB49_2: # %atomicrmw.start
4077; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4078; RV64I-NEXT:    andi a0, a3, 255
4079; RV64I-NEXT:    mv a2, a3
4080; RV64I-NEXT:    bltu s2, a0, .LBB49_1
4081; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4082; RV64I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4083; RV64I-NEXT:    mv a2, s1
4084; RV64I-NEXT:    j .LBB49_1
4085; RV64I-NEXT:  .LBB49_4: # %atomicrmw.end
4086; RV64I-NEXT:    mv a0, a3
4087; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4088; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4089; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4090; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4091; RV64I-NEXT:    addi sp, sp, 48
4092; RV64I-NEXT:    ret
4093;
4094; RV64IA-LABEL: atomicrmw_umax_i8_seq_cst:
4095; RV64IA:       # %bb.0:
4096; RV64IA-NEXT:    andi a2, a0, -4
4097; RV64IA-NEXT:    slliw a0, a0, 3
4098; RV64IA-NEXT:    li a3, 255
4099; RV64IA-NEXT:    sllw a3, a3, a0
4100; RV64IA-NEXT:    andi a1, a1, 255
4101; RV64IA-NEXT:    sllw a1, a1, a0
4102; RV64IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
4103; RV64IA-NEXT:    lr.w.aqrl a4, (a2)
4104; RV64IA-NEXT:    and a6, a4, a3
4105; RV64IA-NEXT:    mv a5, a4
4106; RV64IA-NEXT:    bgeu a6, a1, .LBB49_3
4107; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
4108; RV64IA-NEXT:    xor a5, a4, a1
4109; RV64IA-NEXT:    and a5, a5, a3
4110; RV64IA-NEXT:    xor a5, a4, a5
4111; RV64IA-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
4112; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
4113; RV64IA-NEXT:    bnez a5, .LBB49_1
4114; RV64IA-NEXT:  # %bb.4:
4115; RV64IA-NEXT:    srlw a0, a4, a0
4116; RV64IA-NEXT:    ret
4117  %1 = atomicrmw umax i8* %a, i8 %b seq_cst
4118  ret i8 %1
4119}
4120
4121define i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind {
4122; RV32I-LABEL: atomicrmw_umin_i8_monotonic:
4123; RV32I:       # %bb.0:
4124; RV32I-NEXT:    addi sp, sp, -32
4125; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4126; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4127; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4128; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4129; RV32I-NEXT:    mv s0, a0
4130; RV32I-NEXT:    lbu a3, 0(a0)
4131; RV32I-NEXT:    mv s1, a1
4132; RV32I-NEXT:    andi s2, a1, 255
4133; RV32I-NEXT:    j .LBB50_2
4134; RV32I-NEXT:  .LBB50_1: # %atomicrmw.start
4135; RV32I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4136; RV32I-NEXT:    sb a3, 15(sp)
4137; RV32I-NEXT:    addi a1, sp, 15
4138; RV32I-NEXT:    mv a0, s0
4139; RV32I-NEXT:    li a3, 0
4140; RV32I-NEXT:    li a4, 0
4141; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4142; RV32I-NEXT:    lb a3, 15(sp)
4143; RV32I-NEXT:    bnez a0, .LBB50_4
4144; RV32I-NEXT:  .LBB50_2: # %atomicrmw.start
4145; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4146; RV32I-NEXT:    andi a0, a3, 255
4147; RV32I-NEXT:    mv a2, a3
4148; RV32I-NEXT:    bgeu s2, a0, .LBB50_1
4149; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4150; RV32I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4151; RV32I-NEXT:    mv a2, s1
4152; RV32I-NEXT:    j .LBB50_1
4153; RV32I-NEXT:  .LBB50_4: # %atomicrmw.end
4154; RV32I-NEXT:    mv a0, a3
4155; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4156; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4157; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4158; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4159; RV32I-NEXT:    addi sp, sp, 32
4160; RV32I-NEXT:    ret
4161;
4162; RV32IA-LABEL: atomicrmw_umin_i8_monotonic:
4163; RV32IA:       # %bb.0:
4164; RV32IA-NEXT:    andi a2, a0, -4
4165; RV32IA-NEXT:    slli a0, a0, 3
4166; RV32IA-NEXT:    li a3, 255
4167; RV32IA-NEXT:    sll a3, a3, a0
4168; RV32IA-NEXT:    andi a1, a1, 255
4169; RV32IA-NEXT:    sll a1, a1, a0
4170; RV32IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
4171; RV32IA-NEXT:    lr.w a4, (a2)
4172; RV32IA-NEXT:    and a6, a4, a3
4173; RV32IA-NEXT:    mv a5, a4
4174; RV32IA-NEXT:    bgeu a1, a6, .LBB50_3
4175; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
4176; RV32IA-NEXT:    xor a5, a4, a1
4177; RV32IA-NEXT:    and a5, a5, a3
4178; RV32IA-NEXT:    xor a5, a4, a5
4179; RV32IA-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
4180; RV32IA-NEXT:    sc.w a5, a5, (a2)
4181; RV32IA-NEXT:    bnez a5, .LBB50_1
4182; RV32IA-NEXT:  # %bb.4:
4183; RV32IA-NEXT:    srl a0, a4, a0
4184; RV32IA-NEXT:    ret
4185;
4186; RV64I-LABEL: atomicrmw_umin_i8_monotonic:
4187; RV64I:       # %bb.0:
4188; RV64I-NEXT:    addi sp, sp, -48
4189; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4190; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4191; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4192; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4193; RV64I-NEXT:    mv s0, a0
4194; RV64I-NEXT:    lbu a3, 0(a0)
4195; RV64I-NEXT:    mv s1, a1
4196; RV64I-NEXT:    andi s2, a1, 255
4197; RV64I-NEXT:    j .LBB50_2
4198; RV64I-NEXT:  .LBB50_1: # %atomicrmw.start
4199; RV64I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4200; RV64I-NEXT:    sb a3, 15(sp)
4201; RV64I-NEXT:    addi a1, sp, 15
4202; RV64I-NEXT:    mv a0, s0
4203; RV64I-NEXT:    li a3, 0
4204; RV64I-NEXT:    li a4, 0
4205; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4206; RV64I-NEXT:    lb a3, 15(sp)
4207; RV64I-NEXT:    bnez a0, .LBB50_4
4208; RV64I-NEXT:  .LBB50_2: # %atomicrmw.start
4209; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4210; RV64I-NEXT:    andi a0, a3, 255
4211; RV64I-NEXT:    mv a2, a3
4212; RV64I-NEXT:    bgeu s2, a0, .LBB50_1
4213; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4214; RV64I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4215; RV64I-NEXT:    mv a2, s1
4216; RV64I-NEXT:    j .LBB50_1
4217; RV64I-NEXT:  .LBB50_4: # %atomicrmw.end
4218; RV64I-NEXT:    mv a0, a3
4219; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4220; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4221; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4222; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4223; RV64I-NEXT:    addi sp, sp, 48
4224; RV64I-NEXT:    ret
4225;
4226; RV64IA-LABEL: atomicrmw_umin_i8_monotonic:
4227; RV64IA:       # %bb.0:
4228; RV64IA-NEXT:    andi a2, a0, -4
4229; RV64IA-NEXT:    slliw a0, a0, 3
4230; RV64IA-NEXT:    li a3, 255
4231; RV64IA-NEXT:    sllw a3, a3, a0
4232; RV64IA-NEXT:    andi a1, a1, 255
4233; RV64IA-NEXT:    sllw a1, a1, a0
4234; RV64IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
4235; RV64IA-NEXT:    lr.w a4, (a2)
4236; RV64IA-NEXT:    and a6, a4, a3
4237; RV64IA-NEXT:    mv a5, a4
4238; RV64IA-NEXT:    bgeu a1, a6, .LBB50_3
4239; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
4240; RV64IA-NEXT:    xor a5, a4, a1
4241; RV64IA-NEXT:    and a5, a5, a3
4242; RV64IA-NEXT:    xor a5, a4, a5
4243; RV64IA-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
4244; RV64IA-NEXT:    sc.w a5, a5, (a2)
4245; RV64IA-NEXT:    bnez a5, .LBB50_1
4246; RV64IA-NEXT:  # %bb.4:
4247; RV64IA-NEXT:    srlw a0, a4, a0
4248; RV64IA-NEXT:    ret
4249  %1 = atomicrmw umin i8* %a, i8 %b monotonic
4250  ret i8 %1
4251}
4252
4253define i8 @atomicrmw_umin_i8_acquire(i8 *%a, i8 %b) nounwind {
4254; RV32I-LABEL: atomicrmw_umin_i8_acquire:
4255; RV32I:       # %bb.0:
4256; RV32I-NEXT:    addi sp, sp, -32
4257; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4258; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4259; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4260; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4261; RV32I-NEXT:    mv s0, a0
4262; RV32I-NEXT:    lbu a3, 0(a0)
4263; RV32I-NEXT:    mv s1, a1
4264; RV32I-NEXT:    andi s2, a1, 255
4265; RV32I-NEXT:    j .LBB51_2
4266; RV32I-NEXT:  .LBB51_1: # %atomicrmw.start
4267; RV32I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4268; RV32I-NEXT:    sb a3, 15(sp)
4269; RV32I-NEXT:    addi a1, sp, 15
4270; RV32I-NEXT:    li a3, 2
4271; RV32I-NEXT:    li a4, 2
4272; RV32I-NEXT:    mv a0, s0
4273; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4274; RV32I-NEXT:    lb a3, 15(sp)
4275; RV32I-NEXT:    bnez a0, .LBB51_4
4276; RV32I-NEXT:  .LBB51_2: # %atomicrmw.start
4277; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4278; RV32I-NEXT:    andi a0, a3, 255
4279; RV32I-NEXT:    mv a2, a3
4280; RV32I-NEXT:    bgeu s2, a0, .LBB51_1
4281; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4282; RV32I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4283; RV32I-NEXT:    mv a2, s1
4284; RV32I-NEXT:    j .LBB51_1
4285; RV32I-NEXT:  .LBB51_4: # %atomicrmw.end
4286; RV32I-NEXT:    mv a0, a3
4287; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4288; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4289; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4290; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4291; RV32I-NEXT:    addi sp, sp, 32
4292; RV32I-NEXT:    ret
4293;
4294; RV32IA-LABEL: atomicrmw_umin_i8_acquire:
4295; RV32IA:       # %bb.0:
4296; RV32IA-NEXT:    andi a2, a0, -4
4297; RV32IA-NEXT:    slli a0, a0, 3
4298; RV32IA-NEXT:    li a3, 255
4299; RV32IA-NEXT:    sll a3, a3, a0
4300; RV32IA-NEXT:    andi a1, a1, 255
4301; RV32IA-NEXT:    sll a1, a1, a0
4302; RV32IA-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
4303; RV32IA-NEXT:    lr.w.aq a4, (a2)
4304; RV32IA-NEXT:    and a6, a4, a3
4305; RV32IA-NEXT:    mv a5, a4
4306; RV32IA-NEXT:    bgeu a1, a6, .LBB51_3
4307; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
4308; RV32IA-NEXT:    xor a5, a4, a1
4309; RV32IA-NEXT:    and a5, a5, a3
4310; RV32IA-NEXT:    xor a5, a4, a5
4311; RV32IA-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
4312; RV32IA-NEXT:    sc.w a5, a5, (a2)
4313; RV32IA-NEXT:    bnez a5, .LBB51_1
4314; RV32IA-NEXT:  # %bb.4:
4315; RV32IA-NEXT:    srl a0, a4, a0
4316; RV32IA-NEXT:    ret
4317;
4318; RV64I-LABEL: atomicrmw_umin_i8_acquire:
4319; RV64I:       # %bb.0:
4320; RV64I-NEXT:    addi sp, sp, -48
4321; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4322; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4323; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4324; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4325; RV64I-NEXT:    mv s0, a0
4326; RV64I-NEXT:    lbu a3, 0(a0)
4327; RV64I-NEXT:    mv s1, a1
4328; RV64I-NEXT:    andi s2, a1, 255
4329; RV64I-NEXT:    j .LBB51_2
4330; RV64I-NEXT:  .LBB51_1: # %atomicrmw.start
4331; RV64I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4332; RV64I-NEXT:    sb a3, 15(sp)
4333; RV64I-NEXT:    addi a1, sp, 15
4334; RV64I-NEXT:    li a3, 2
4335; RV64I-NEXT:    li a4, 2
4336; RV64I-NEXT:    mv a0, s0
4337; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4338; RV64I-NEXT:    lb a3, 15(sp)
4339; RV64I-NEXT:    bnez a0, .LBB51_4
4340; RV64I-NEXT:  .LBB51_2: # %atomicrmw.start
4341; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4342; RV64I-NEXT:    andi a0, a3, 255
4343; RV64I-NEXT:    mv a2, a3
4344; RV64I-NEXT:    bgeu s2, a0, .LBB51_1
4345; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4346; RV64I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4347; RV64I-NEXT:    mv a2, s1
4348; RV64I-NEXT:    j .LBB51_1
4349; RV64I-NEXT:  .LBB51_4: # %atomicrmw.end
4350; RV64I-NEXT:    mv a0, a3
4351; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4352; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4353; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4354; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4355; RV64I-NEXT:    addi sp, sp, 48
4356; RV64I-NEXT:    ret
4357;
4358; RV64IA-LABEL: atomicrmw_umin_i8_acquire:
4359; RV64IA:       # %bb.0:
4360; RV64IA-NEXT:    andi a2, a0, -4
4361; RV64IA-NEXT:    slliw a0, a0, 3
4362; RV64IA-NEXT:    li a3, 255
4363; RV64IA-NEXT:    sllw a3, a3, a0
4364; RV64IA-NEXT:    andi a1, a1, 255
4365; RV64IA-NEXT:    sllw a1, a1, a0
4366; RV64IA-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
4367; RV64IA-NEXT:    lr.w.aq a4, (a2)
4368; RV64IA-NEXT:    and a6, a4, a3
4369; RV64IA-NEXT:    mv a5, a4
4370; RV64IA-NEXT:    bgeu a1, a6, .LBB51_3
4371; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
4372; RV64IA-NEXT:    xor a5, a4, a1
4373; RV64IA-NEXT:    and a5, a5, a3
4374; RV64IA-NEXT:    xor a5, a4, a5
4375; RV64IA-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
4376; RV64IA-NEXT:    sc.w a5, a5, (a2)
4377; RV64IA-NEXT:    bnez a5, .LBB51_1
4378; RV64IA-NEXT:  # %bb.4:
4379; RV64IA-NEXT:    srlw a0, a4, a0
4380; RV64IA-NEXT:    ret
4381  %1 = atomicrmw umin i8* %a, i8 %b acquire
4382  ret i8 %1
4383}
4384
4385define i8 @atomicrmw_umin_i8_release(i8 *%a, i8 %b) nounwind {
4386; RV32I-LABEL: atomicrmw_umin_i8_release:
4387; RV32I:       # %bb.0:
4388; RV32I-NEXT:    addi sp, sp, -32
4389; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4390; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4391; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4392; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4393; RV32I-NEXT:    mv s0, a0
4394; RV32I-NEXT:    lbu a3, 0(a0)
4395; RV32I-NEXT:    mv s1, a1
4396; RV32I-NEXT:    andi s2, a1, 255
4397; RV32I-NEXT:    j .LBB52_2
4398; RV32I-NEXT:  .LBB52_1: # %atomicrmw.start
4399; RV32I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4400; RV32I-NEXT:    sb a3, 15(sp)
4401; RV32I-NEXT:    addi a1, sp, 15
4402; RV32I-NEXT:    li a3, 3
4403; RV32I-NEXT:    mv a0, s0
4404; RV32I-NEXT:    li a4, 0
4405; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4406; RV32I-NEXT:    lb a3, 15(sp)
4407; RV32I-NEXT:    bnez a0, .LBB52_4
4408; RV32I-NEXT:  .LBB52_2: # %atomicrmw.start
4409; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4410; RV32I-NEXT:    andi a0, a3, 255
4411; RV32I-NEXT:    mv a2, a3
4412; RV32I-NEXT:    bgeu s2, a0, .LBB52_1
4413; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4414; RV32I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4415; RV32I-NEXT:    mv a2, s1
4416; RV32I-NEXT:    j .LBB52_1
4417; RV32I-NEXT:  .LBB52_4: # %atomicrmw.end
4418; RV32I-NEXT:    mv a0, a3
4419; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4420; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4421; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4422; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4423; RV32I-NEXT:    addi sp, sp, 32
4424; RV32I-NEXT:    ret
4425;
4426; RV32IA-LABEL: atomicrmw_umin_i8_release:
4427; RV32IA:       # %bb.0:
4428; RV32IA-NEXT:    andi a2, a0, -4
4429; RV32IA-NEXT:    slli a0, a0, 3
4430; RV32IA-NEXT:    li a3, 255
4431; RV32IA-NEXT:    sll a3, a3, a0
4432; RV32IA-NEXT:    andi a1, a1, 255
4433; RV32IA-NEXT:    sll a1, a1, a0
4434; RV32IA-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
4435; RV32IA-NEXT:    lr.w a4, (a2)
4436; RV32IA-NEXT:    and a6, a4, a3
4437; RV32IA-NEXT:    mv a5, a4
4438; RV32IA-NEXT:    bgeu a1, a6, .LBB52_3
4439; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
4440; RV32IA-NEXT:    xor a5, a4, a1
4441; RV32IA-NEXT:    and a5, a5, a3
4442; RV32IA-NEXT:    xor a5, a4, a5
4443; RV32IA-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
4444; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
4445; RV32IA-NEXT:    bnez a5, .LBB52_1
4446; RV32IA-NEXT:  # %bb.4:
4447; RV32IA-NEXT:    srl a0, a4, a0
4448; RV32IA-NEXT:    ret
4449;
4450; RV64I-LABEL: atomicrmw_umin_i8_release:
4451; RV64I:       # %bb.0:
4452; RV64I-NEXT:    addi sp, sp, -48
4453; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4454; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4455; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4456; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4457; RV64I-NEXT:    mv s0, a0
4458; RV64I-NEXT:    lbu a3, 0(a0)
4459; RV64I-NEXT:    mv s1, a1
4460; RV64I-NEXT:    andi s2, a1, 255
4461; RV64I-NEXT:    j .LBB52_2
4462; RV64I-NEXT:  .LBB52_1: # %atomicrmw.start
4463; RV64I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4464; RV64I-NEXT:    sb a3, 15(sp)
4465; RV64I-NEXT:    addi a1, sp, 15
4466; RV64I-NEXT:    li a3, 3
4467; RV64I-NEXT:    mv a0, s0
4468; RV64I-NEXT:    li a4, 0
4469; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4470; RV64I-NEXT:    lb a3, 15(sp)
4471; RV64I-NEXT:    bnez a0, .LBB52_4
4472; RV64I-NEXT:  .LBB52_2: # %atomicrmw.start
4473; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4474; RV64I-NEXT:    andi a0, a3, 255
4475; RV64I-NEXT:    mv a2, a3
4476; RV64I-NEXT:    bgeu s2, a0, .LBB52_1
4477; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4478; RV64I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4479; RV64I-NEXT:    mv a2, s1
4480; RV64I-NEXT:    j .LBB52_1
4481; RV64I-NEXT:  .LBB52_4: # %atomicrmw.end
4482; RV64I-NEXT:    mv a0, a3
4483; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4484; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4485; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4486; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4487; RV64I-NEXT:    addi sp, sp, 48
4488; RV64I-NEXT:    ret
4489;
4490; RV64IA-LABEL: atomicrmw_umin_i8_release:
4491; RV64IA:       # %bb.0:
4492; RV64IA-NEXT:    andi a2, a0, -4
4493; RV64IA-NEXT:    slliw a0, a0, 3
4494; RV64IA-NEXT:    li a3, 255
4495; RV64IA-NEXT:    sllw a3, a3, a0
4496; RV64IA-NEXT:    andi a1, a1, 255
4497; RV64IA-NEXT:    sllw a1, a1, a0
4498; RV64IA-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
4499; RV64IA-NEXT:    lr.w a4, (a2)
4500; RV64IA-NEXT:    and a6, a4, a3
4501; RV64IA-NEXT:    mv a5, a4
4502; RV64IA-NEXT:    bgeu a1, a6, .LBB52_3
4503; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
4504; RV64IA-NEXT:    xor a5, a4, a1
4505; RV64IA-NEXT:    and a5, a5, a3
4506; RV64IA-NEXT:    xor a5, a4, a5
4507; RV64IA-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
4508; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
4509; RV64IA-NEXT:    bnez a5, .LBB52_1
4510; RV64IA-NEXT:  # %bb.4:
4511; RV64IA-NEXT:    srlw a0, a4, a0
4512; RV64IA-NEXT:    ret
4513  %1 = atomicrmw umin i8* %a, i8 %b release
4514  ret i8 %1
4515}
4516
4517define i8 @atomicrmw_umin_i8_acq_rel(i8 *%a, i8 %b) nounwind {
4518; RV32I-LABEL: atomicrmw_umin_i8_acq_rel:
4519; RV32I:       # %bb.0:
4520; RV32I-NEXT:    addi sp, sp, -32
4521; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4522; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4523; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4524; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4525; RV32I-NEXT:    mv s0, a0
4526; RV32I-NEXT:    lbu a3, 0(a0)
4527; RV32I-NEXT:    mv s1, a1
4528; RV32I-NEXT:    andi s2, a1, 255
4529; RV32I-NEXT:    j .LBB53_2
4530; RV32I-NEXT:  .LBB53_1: # %atomicrmw.start
4531; RV32I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4532; RV32I-NEXT:    sb a3, 15(sp)
4533; RV32I-NEXT:    addi a1, sp, 15
4534; RV32I-NEXT:    li a3, 4
4535; RV32I-NEXT:    li a4, 2
4536; RV32I-NEXT:    mv a0, s0
4537; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4538; RV32I-NEXT:    lb a3, 15(sp)
4539; RV32I-NEXT:    bnez a0, .LBB53_4
4540; RV32I-NEXT:  .LBB53_2: # %atomicrmw.start
4541; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4542; RV32I-NEXT:    andi a0, a3, 255
4543; RV32I-NEXT:    mv a2, a3
4544; RV32I-NEXT:    bgeu s2, a0, .LBB53_1
4545; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4546; RV32I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4547; RV32I-NEXT:    mv a2, s1
4548; RV32I-NEXT:    j .LBB53_1
4549; RV32I-NEXT:  .LBB53_4: # %atomicrmw.end
4550; RV32I-NEXT:    mv a0, a3
4551; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4552; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4553; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4554; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4555; RV32I-NEXT:    addi sp, sp, 32
4556; RV32I-NEXT:    ret
4557;
4558; RV32IA-LABEL: atomicrmw_umin_i8_acq_rel:
4559; RV32IA:       # %bb.0:
4560; RV32IA-NEXT:    andi a2, a0, -4
4561; RV32IA-NEXT:    slli a0, a0, 3
4562; RV32IA-NEXT:    li a3, 255
4563; RV32IA-NEXT:    sll a3, a3, a0
4564; RV32IA-NEXT:    andi a1, a1, 255
4565; RV32IA-NEXT:    sll a1, a1, a0
4566; RV32IA-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
4567; RV32IA-NEXT:    lr.w.aq a4, (a2)
4568; RV32IA-NEXT:    and a6, a4, a3
4569; RV32IA-NEXT:    mv a5, a4
4570; RV32IA-NEXT:    bgeu a1, a6, .LBB53_3
4571; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
4572; RV32IA-NEXT:    xor a5, a4, a1
4573; RV32IA-NEXT:    and a5, a5, a3
4574; RV32IA-NEXT:    xor a5, a4, a5
4575; RV32IA-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
4576; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
4577; RV32IA-NEXT:    bnez a5, .LBB53_1
4578; RV32IA-NEXT:  # %bb.4:
4579; RV32IA-NEXT:    srl a0, a4, a0
4580; RV32IA-NEXT:    ret
4581;
4582; RV64I-LABEL: atomicrmw_umin_i8_acq_rel:
4583; RV64I:       # %bb.0:
4584; RV64I-NEXT:    addi sp, sp, -48
4585; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4586; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4587; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4588; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4589; RV64I-NEXT:    mv s0, a0
4590; RV64I-NEXT:    lbu a3, 0(a0)
4591; RV64I-NEXT:    mv s1, a1
4592; RV64I-NEXT:    andi s2, a1, 255
4593; RV64I-NEXT:    j .LBB53_2
4594; RV64I-NEXT:  .LBB53_1: # %atomicrmw.start
4595; RV64I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4596; RV64I-NEXT:    sb a3, 15(sp)
4597; RV64I-NEXT:    addi a1, sp, 15
4598; RV64I-NEXT:    li a3, 4
4599; RV64I-NEXT:    li a4, 2
4600; RV64I-NEXT:    mv a0, s0
4601; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4602; RV64I-NEXT:    lb a3, 15(sp)
4603; RV64I-NEXT:    bnez a0, .LBB53_4
4604; RV64I-NEXT:  .LBB53_2: # %atomicrmw.start
4605; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4606; RV64I-NEXT:    andi a0, a3, 255
4607; RV64I-NEXT:    mv a2, a3
4608; RV64I-NEXT:    bgeu s2, a0, .LBB53_1
4609; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4610; RV64I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4611; RV64I-NEXT:    mv a2, s1
4612; RV64I-NEXT:    j .LBB53_1
4613; RV64I-NEXT:  .LBB53_4: # %atomicrmw.end
4614; RV64I-NEXT:    mv a0, a3
4615; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4616; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4617; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4618; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4619; RV64I-NEXT:    addi sp, sp, 48
4620; RV64I-NEXT:    ret
4621;
4622; RV64IA-LABEL: atomicrmw_umin_i8_acq_rel:
4623; RV64IA:       # %bb.0:
4624; RV64IA-NEXT:    andi a2, a0, -4
4625; RV64IA-NEXT:    slliw a0, a0, 3
4626; RV64IA-NEXT:    li a3, 255
4627; RV64IA-NEXT:    sllw a3, a3, a0
4628; RV64IA-NEXT:    andi a1, a1, 255
4629; RV64IA-NEXT:    sllw a1, a1, a0
4630; RV64IA-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
4631; RV64IA-NEXT:    lr.w.aq a4, (a2)
4632; RV64IA-NEXT:    and a6, a4, a3
4633; RV64IA-NEXT:    mv a5, a4
4634; RV64IA-NEXT:    bgeu a1, a6, .LBB53_3
4635; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
4636; RV64IA-NEXT:    xor a5, a4, a1
4637; RV64IA-NEXT:    and a5, a5, a3
4638; RV64IA-NEXT:    xor a5, a4, a5
4639; RV64IA-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
4640; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
4641; RV64IA-NEXT:    bnez a5, .LBB53_1
4642; RV64IA-NEXT:  # %bb.4:
4643; RV64IA-NEXT:    srlw a0, a4, a0
4644; RV64IA-NEXT:    ret
4645  %1 = atomicrmw umin i8* %a, i8 %b acq_rel
4646  ret i8 %1
4647}
4648
4649define i8 @atomicrmw_umin_i8_seq_cst(i8 *%a, i8 %b) nounwind {
4650; RV32I-LABEL: atomicrmw_umin_i8_seq_cst:
4651; RV32I:       # %bb.0:
4652; RV32I-NEXT:    addi sp, sp, -32
4653; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4654; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4655; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4656; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4657; RV32I-NEXT:    mv s0, a0
4658; RV32I-NEXT:    lbu a3, 0(a0)
4659; RV32I-NEXT:    mv s1, a1
4660; RV32I-NEXT:    andi s2, a1, 255
4661; RV32I-NEXT:    j .LBB54_2
4662; RV32I-NEXT:  .LBB54_1: # %atomicrmw.start
4663; RV32I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4664; RV32I-NEXT:    sb a3, 15(sp)
4665; RV32I-NEXT:    addi a1, sp, 15
4666; RV32I-NEXT:    li a3, 5
4667; RV32I-NEXT:    li a4, 5
4668; RV32I-NEXT:    mv a0, s0
4669; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4670; RV32I-NEXT:    lb a3, 15(sp)
4671; RV32I-NEXT:    bnez a0, .LBB54_4
4672; RV32I-NEXT:  .LBB54_2: # %atomicrmw.start
4673; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4674; RV32I-NEXT:    andi a0, a3, 255
4675; RV32I-NEXT:    mv a2, a3
4676; RV32I-NEXT:    bgeu s2, a0, .LBB54_1
4677; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4678; RV32I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4679; RV32I-NEXT:    mv a2, s1
4680; RV32I-NEXT:    j .LBB54_1
4681; RV32I-NEXT:  .LBB54_4: # %atomicrmw.end
4682; RV32I-NEXT:    mv a0, a3
4683; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4684; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4685; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4686; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4687; RV32I-NEXT:    addi sp, sp, 32
4688; RV32I-NEXT:    ret
4689;
4690; RV32IA-LABEL: atomicrmw_umin_i8_seq_cst:
4691; RV32IA:       # %bb.0:
4692; RV32IA-NEXT:    andi a2, a0, -4
4693; RV32IA-NEXT:    slli a0, a0, 3
4694; RV32IA-NEXT:    li a3, 255
4695; RV32IA-NEXT:    sll a3, a3, a0
4696; RV32IA-NEXT:    andi a1, a1, 255
4697; RV32IA-NEXT:    sll a1, a1, a0
4698; RV32IA-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
4699; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
4700; RV32IA-NEXT:    and a6, a4, a3
4701; RV32IA-NEXT:    mv a5, a4
4702; RV32IA-NEXT:    bgeu a1, a6, .LBB54_3
4703; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
4704; RV32IA-NEXT:    xor a5, a4, a1
4705; RV32IA-NEXT:    and a5, a5, a3
4706; RV32IA-NEXT:    xor a5, a4, a5
4707; RV32IA-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
4708; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
4709; RV32IA-NEXT:    bnez a5, .LBB54_1
4710; RV32IA-NEXT:  # %bb.4:
4711; RV32IA-NEXT:    srl a0, a4, a0
4712; RV32IA-NEXT:    ret
4713;
4714; RV64I-LABEL: atomicrmw_umin_i8_seq_cst:
4715; RV64I:       # %bb.0:
4716; RV64I-NEXT:    addi sp, sp, -48
4717; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4718; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4719; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4720; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4721; RV64I-NEXT:    mv s0, a0
4722; RV64I-NEXT:    lbu a3, 0(a0)
4723; RV64I-NEXT:    mv s1, a1
4724; RV64I-NEXT:    andi s2, a1, 255
4725; RV64I-NEXT:    j .LBB54_2
4726; RV64I-NEXT:  .LBB54_1: # %atomicrmw.start
4727; RV64I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4728; RV64I-NEXT:    sb a3, 15(sp)
4729; RV64I-NEXT:    addi a1, sp, 15
4730; RV64I-NEXT:    li a3, 5
4731; RV64I-NEXT:    li a4, 5
4732; RV64I-NEXT:    mv a0, s0
4733; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4734; RV64I-NEXT:    lb a3, 15(sp)
4735; RV64I-NEXT:    bnez a0, .LBB54_4
4736; RV64I-NEXT:  .LBB54_2: # %atomicrmw.start
4737; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4738; RV64I-NEXT:    andi a0, a3, 255
4739; RV64I-NEXT:    mv a2, a3
4740; RV64I-NEXT:    bgeu s2, a0, .LBB54_1
4741; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4742; RV64I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4743; RV64I-NEXT:    mv a2, s1
4744; RV64I-NEXT:    j .LBB54_1
4745; RV64I-NEXT:  .LBB54_4: # %atomicrmw.end
4746; RV64I-NEXT:    mv a0, a3
4747; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4748; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4749; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4750; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4751; RV64I-NEXT:    addi sp, sp, 48
4752; RV64I-NEXT:    ret
4753;
4754; RV64IA-LABEL: atomicrmw_umin_i8_seq_cst:
4755; RV64IA:       # %bb.0:
4756; RV64IA-NEXT:    andi a2, a0, -4
4757; RV64IA-NEXT:    slliw a0, a0, 3
4758; RV64IA-NEXT:    li a3, 255
4759; RV64IA-NEXT:    sllw a3, a3, a0
4760; RV64IA-NEXT:    andi a1, a1, 255
4761; RV64IA-NEXT:    sllw a1, a1, a0
4762; RV64IA-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
4763; RV64IA-NEXT:    lr.w.aqrl a4, (a2)
4764; RV64IA-NEXT:    and a6, a4, a3
4765; RV64IA-NEXT:    mv a5, a4
4766; RV64IA-NEXT:    bgeu a1, a6, .LBB54_3
4767; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
4768; RV64IA-NEXT:    xor a5, a4, a1
4769; RV64IA-NEXT:    and a5, a5, a3
4770; RV64IA-NEXT:    xor a5, a4, a5
4771; RV64IA-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
4772; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
4773; RV64IA-NEXT:    bnez a5, .LBB54_1
4774; RV64IA-NEXT:  # %bb.4:
4775; RV64IA-NEXT:    srlw a0, a4, a0
4776; RV64IA-NEXT:    ret
4777  %1 = atomicrmw umin i8* %a, i8 %b seq_cst
4778  ret i8 %1
4779}
4780
4781define i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) nounwind {
4782; RV32I-LABEL: atomicrmw_xchg_i16_monotonic:
4783; RV32I:       # %bb.0:
4784; RV32I-NEXT:    addi sp, sp, -16
4785; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4786; RV32I-NEXT:    li a2, 0
4787; RV32I-NEXT:    call __atomic_exchange_2@plt
4788; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4789; RV32I-NEXT:    addi sp, sp, 16
4790; RV32I-NEXT:    ret
4791;
4792; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic:
4793; RV32IA:       # %bb.0:
4794; RV32IA-NEXT:    andi a2, a0, -4
4795; RV32IA-NEXT:    slli a0, a0, 3
4796; RV32IA-NEXT:    lui a3, 16
4797; RV32IA-NEXT:    addi a3, a3, -1
4798; RV32IA-NEXT:    sll a4, a3, a0
4799; RV32IA-NEXT:    and a1, a1, a3
4800; RV32IA-NEXT:    sll a1, a1, a0
4801; RV32IA-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
4802; RV32IA-NEXT:    lr.w a3, (a2)
4803; RV32IA-NEXT:    mv a5, a1
4804; RV32IA-NEXT:    xor a5, a3, a5
4805; RV32IA-NEXT:    and a5, a5, a4
4806; RV32IA-NEXT:    xor a5, a3, a5
4807; RV32IA-NEXT:    sc.w a5, a5, (a2)
4808; RV32IA-NEXT:    bnez a5, .LBB55_1
4809; RV32IA-NEXT:  # %bb.2:
4810; RV32IA-NEXT:    srl a0, a3, a0
4811; RV32IA-NEXT:    ret
4812;
4813; RV64I-LABEL: atomicrmw_xchg_i16_monotonic:
4814; RV64I:       # %bb.0:
4815; RV64I-NEXT:    addi sp, sp, -16
4816; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4817; RV64I-NEXT:    li a2, 0
4818; RV64I-NEXT:    call __atomic_exchange_2@plt
4819; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4820; RV64I-NEXT:    addi sp, sp, 16
4821; RV64I-NEXT:    ret
4822;
4823; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic:
4824; RV64IA:       # %bb.0:
4825; RV64IA-NEXT:    andi a2, a0, -4
4826; RV64IA-NEXT:    slliw a0, a0, 3
4827; RV64IA-NEXT:    lui a3, 16
4828; RV64IA-NEXT:    addiw a3, a3, -1
4829; RV64IA-NEXT:    sllw a4, a3, a0
4830; RV64IA-NEXT:    and a1, a1, a3
4831; RV64IA-NEXT:    sllw a1, a1, a0
4832; RV64IA-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
4833; RV64IA-NEXT:    lr.w a3, (a2)
4834; RV64IA-NEXT:    mv a5, a1
4835; RV64IA-NEXT:    xor a5, a3, a5
4836; RV64IA-NEXT:    and a5, a5, a4
4837; RV64IA-NEXT:    xor a5, a3, a5
4838; RV64IA-NEXT:    sc.w a5, a5, (a2)
4839; RV64IA-NEXT:    bnez a5, .LBB55_1
4840; RV64IA-NEXT:  # %bb.2:
4841; RV64IA-NEXT:    srlw a0, a3, a0
4842; RV64IA-NEXT:    ret
4843  %1 = atomicrmw xchg i16* %a, i16 %b monotonic
4844  ret i16 %1
4845}
4846
4847define i16 @atomicrmw_xchg_i16_acquire(i16* %a, i16 %b) nounwind {
4848; RV32I-LABEL: atomicrmw_xchg_i16_acquire:
4849; RV32I:       # %bb.0:
4850; RV32I-NEXT:    addi sp, sp, -16
4851; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4852; RV32I-NEXT:    li a2, 2
4853; RV32I-NEXT:    call __atomic_exchange_2@plt
4854; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4855; RV32I-NEXT:    addi sp, sp, 16
4856; RV32I-NEXT:    ret
4857;
4858; RV32IA-LABEL: atomicrmw_xchg_i16_acquire:
4859; RV32IA:       # %bb.0:
4860; RV32IA-NEXT:    andi a2, a0, -4
4861; RV32IA-NEXT:    slli a0, a0, 3
4862; RV32IA-NEXT:    lui a3, 16
4863; RV32IA-NEXT:    addi a3, a3, -1
4864; RV32IA-NEXT:    sll a4, a3, a0
4865; RV32IA-NEXT:    and a1, a1, a3
4866; RV32IA-NEXT:    sll a1, a1, a0
4867; RV32IA-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
4868; RV32IA-NEXT:    lr.w.aq a3, (a2)
4869; RV32IA-NEXT:    mv a5, a1
4870; RV32IA-NEXT:    xor a5, a3, a5
4871; RV32IA-NEXT:    and a5, a5, a4
4872; RV32IA-NEXT:    xor a5, a3, a5
4873; RV32IA-NEXT:    sc.w a5, a5, (a2)
4874; RV32IA-NEXT:    bnez a5, .LBB56_1
4875; RV32IA-NEXT:  # %bb.2:
4876; RV32IA-NEXT:    srl a0, a3, a0
4877; RV32IA-NEXT:    ret
4878;
4879; RV64I-LABEL: atomicrmw_xchg_i16_acquire:
4880; RV64I:       # %bb.0:
4881; RV64I-NEXT:    addi sp, sp, -16
4882; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4883; RV64I-NEXT:    li a2, 2
4884; RV64I-NEXT:    call __atomic_exchange_2@plt
4885; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4886; RV64I-NEXT:    addi sp, sp, 16
4887; RV64I-NEXT:    ret
4888;
4889; RV64IA-LABEL: atomicrmw_xchg_i16_acquire:
4890; RV64IA:       # %bb.0:
4891; RV64IA-NEXT:    andi a2, a0, -4
4892; RV64IA-NEXT:    slliw a0, a0, 3
4893; RV64IA-NEXT:    lui a3, 16
4894; RV64IA-NEXT:    addiw a3, a3, -1
4895; RV64IA-NEXT:    sllw a4, a3, a0
4896; RV64IA-NEXT:    and a1, a1, a3
4897; RV64IA-NEXT:    sllw a1, a1, a0
4898; RV64IA-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
4899; RV64IA-NEXT:    lr.w.aq a3, (a2)
4900; RV64IA-NEXT:    mv a5, a1
4901; RV64IA-NEXT:    xor a5, a3, a5
4902; RV64IA-NEXT:    and a5, a5, a4
4903; RV64IA-NEXT:    xor a5, a3, a5
4904; RV64IA-NEXT:    sc.w a5, a5, (a2)
4905; RV64IA-NEXT:    bnez a5, .LBB56_1
4906; RV64IA-NEXT:  # %bb.2:
4907; RV64IA-NEXT:    srlw a0, a3, a0
4908; RV64IA-NEXT:    ret
4909  %1 = atomicrmw xchg i16* %a, i16 %b acquire
4910  ret i16 %1
4911}
4912
4913define i16 @atomicrmw_xchg_i16_release(i16* %a, i16 %b) nounwind {
4914; RV32I-LABEL: atomicrmw_xchg_i16_release:
4915; RV32I:       # %bb.0:
4916; RV32I-NEXT:    addi sp, sp, -16
4917; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4918; RV32I-NEXT:    li a2, 3
4919; RV32I-NEXT:    call __atomic_exchange_2@plt
4920; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4921; RV32I-NEXT:    addi sp, sp, 16
4922; RV32I-NEXT:    ret
4923;
4924; RV32IA-LABEL: atomicrmw_xchg_i16_release:
4925; RV32IA:       # %bb.0:
4926; RV32IA-NEXT:    andi a2, a0, -4
4927; RV32IA-NEXT:    slli a0, a0, 3
4928; RV32IA-NEXT:    lui a3, 16
4929; RV32IA-NEXT:    addi a3, a3, -1
4930; RV32IA-NEXT:    sll a4, a3, a0
4931; RV32IA-NEXT:    and a1, a1, a3
4932; RV32IA-NEXT:    sll a1, a1, a0
4933; RV32IA-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
4934; RV32IA-NEXT:    lr.w a3, (a2)
4935; RV32IA-NEXT:    mv a5, a1
4936; RV32IA-NEXT:    xor a5, a3, a5
4937; RV32IA-NEXT:    and a5, a5, a4
4938; RV32IA-NEXT:    xor a5, a3, a5
4939; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
4940; RV32IA-NEXT:    bnez a5, .LBB57_1
4941; RV32IA-NEXT:  # %bb.2:
4942; RV32IA-NEXT:    srl a0, a3, a0
4943; RV32IA-NEXT:    ret
4944;
4945; RV64I-LABEL: atomicrmw_xchg_i16_release:
4946; RV64I:       # %bb.0:
4947; RV64I-NEXT:    addi sp, sp, -16
4948; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4949; RV64I-NEXT:    li a2, 3
4950; RV64I-NEXT:    call __atomic_exchange_2@plt
4951; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4952; RV64I-NEXT:    addi sp, sp, 16
4953; RV64I-NEXT:    ret
4954;
4955; RV64IA-LABEL: atomicrmw_xchg_i16_release:
4956; RV64IA:       # %bb.0:
4957; RV64IA-NEXT:    andi a2, a0, -4
4958; RV64IA-NEXT:    slliw a0, a0, 3
4959; RV64IA-NEXT:    lui a3, 16
4960; RV64IA-NEXT:    addiw a3, a3, -1
4961; RV64IA-NEXT:    sllw a4, a3, a0
4962; RV64IA-NEXT:    and a1, a1, a3
4963; RV64IA-NEXT:    sllw a1, a1, a0
4964; RV64IA-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
4965; RV64IA-NEXT:    lr.w a3, (a2)
4966; RV64IA-NEXT:    mv a5, a1
4967; RV64IA-NEXT:    xor a5, a3, a5
4968; RV64IA-NEXT:    and a5, a5, a4
4969; RV64IA-NEXT:    xor a5, a3, a5
4970; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
4971; RV64IA-NEXT:    bnez a5, .LBB57_1
4972; RV64IA-NEXT:  # %bb.2:
4973; RV64IA-NEXT:    srlw a0, a3, a0
4974; RV64IA-NEXT:    ret
4975  %1 = atomicrmw xchg i16* %a, i16 %b release
4976  ret i16 %1
4977}
4978
4979define i16 @atomicrmw_xchg_i16_acq_rel(i16* %a, i16 %b) nounwind {
4980; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel:
4981; RV32I:       # %bb.0:
4982; RV32I-NEXT:    addi sp, sp, -16
4983; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4984; RV32I-NEXT:    li a2, 4
4985; RV32I-NEXT:    call __atomic_exchange_2@plt
4986; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4987; RV32I-NEXT:    addi sp, sp, 16
4988; RV32I-NEXT:    ret
4989;
4990; RV32IA-LABEL: atomicrmw_xchg_i16_acq_rel:
4991; RV32IA:       # %bb.0:
4992; RV32IA-NEXT:    andi a2, a0, -4
4993; RV32IA-NEXT:    slli a0, a0, 3
4994; RV32IA-NEXT:    lui a3, 16
4995; RV32IA-NEXT:    addi a3, a3, -1
4996; RV32IA-NEXT:    sll a4, a3, a0
4997; RV32IA-NEXT:    and a1, a1, a3
4998; RV32IA-NEXT:    sll a1, a1, a0
4999; RV32IA-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
5000; RV32IA-NEXT:    lr.w.aq a3, (a2)
5001; RV32IA-NEXT:    mv a5, a1
5002; RV32IA-NEXT:    xor a5, a3, a5
5003; RV32IA-NEXT:    and a5, a5, a4
5004; RV32IA-NEXT:    xor a5, a3, a5
5005; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5006; RV32IA-NEXT:    bnez a5, .LBB58_1
5007; RV32IA-NEXT:  # %bb.2:
5008; RV32IA-NEXT:    srl a0, a3, a0
5009; RV32IA-NEXT:    ret
5010;
5011; RV64I-LABEL: atomicrmw_xchg_i16_acq_rel:
5012; RV64I:       # %bb.0:
5013; RV64I-NEXT:    addi sp, sp, -16
5014; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5015; RV64I-NEXT:    li a2, 4
5016; RV64I-NEXT:    call __atomic_exchange_2@plt
5017; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5018; RV64I-NEXT:    addi sp, sp, 16
5019; RV64I-NEXT:    ret
5020;
5021; RV64IA-LABEL: atomicrmw_xchg_i16_acq_rel:
5022; RV64IA:       # %bb.0:
5023; RV64IA-NEXT:    andi a2, a0, -4
5024; RV64IA-NEXT:    slliw a0, a0, 3
5025; RV64IA-NEXT:    lui a3, 16
5026; RV64IA-NEXT:    addiw a3, a3, -1
5027; RV64IA-NEXT:    sllw a4, a3, a0
5028; RV64IA-NEXT:    and a1, a1, a3
5029; RV64IA-NEXT:    sllw a1, a1, a0
5030; RV64IA-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
5031; RV64IA-NEXT:    lr.w.aq a3, (a2)
5032; RV64IA-NEXT:    mv a5, a1
5033; RV64IA-NEXT:    xor a5, a3, a5
5034; RV64IA-NEXT:    and a5, a5, a4
5035; RV64IA-NEXT:    xor a5, a3, a5
5036; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5037; RV64IA-NEXT:    bnez a5, .LBB58_1
5038; RV64IA-NEXT:  # %bb.2:
5039; RV64IA-NEXT:    srlw a0, a3, a0
5040; RV64IA-NEXT:    ret
5041  %1 = atomicrmw xchg i16* %a, i16 %b acq_rel
5042  ret i16 %1
5043}
5044
5045define i16 @atomicrmw_xchg_i16_seq_cst(i16* %a, i16 %b) nounwind {
5046; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst:
5047; RV32I:       # %bb.0:
5048; RV32I-NEXT:    addi sp, sp, -16
5049; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5050; RV32I-NEXT:    li a2, 5
5051; RV32I-NEXT:    call __atomic_exchange_2@plt
5052; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5053; RV32I-NEXT:    addi sp, sp, 16
5054; RV32I-NEXT:    ret
5055;
5056; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst:
5057; RV32IA:       # %bb.0:
5058; RV32IA-NEXT:    andi a2, a0, -4
5059; RV32IA-NEXT:    slli a0, a0, 3
5060; RV32IA-NEXT:    lui a3, 16
5061; RV32IA-NEXT:    addi a3, a3, -1
5062; RV32IA-NEXT:    sll a4, a3, a0
5063; RV32IA-NEXT:    and a1, a1, a3
5064; RV32IA-NEXT:    sll a1, a1, a0
5065; RV32IA-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
5066; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
5067; RV32IA-NEXT:    mv a5, a1
5068; RV32IA-NEXT:    xor a5, a3, a5
5069; RV32IA-NEXT:    and a5, a5, a4
5070; RV32IA-NEXT:    xor a5, a3, a5
5071; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5072; RV32IA-NEXT:    bnez a5, .LBB59_1
5073; RV32IA-NEXT:  # %bb.2:
5074; RV32IA-NEXT:    srl a0, a3, a0
5075; RV32IA-NEXT:    ret
5076;
5077; RV64I-LABEL: atomicrmw_xchg_i16_seq_cst:
5078; RV64I:       # %bb.0:
5079; RV64I-NEXT:    addi sp, sp, -16
5080; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5081; RV64I-NEXT:    li a2, 5
5082; RV64I-NEXT:    call __atomic_exchange_2@plt
5083; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5084; RV64I-NEXT:    addi sp, sp, 16
5085; RV64I-NEXT:    ret
5086;
5087; RV64IA-LABEL: atomicrmw_xchg_i16_seq_cst:
5088; RV64IA:       # %bb.0:
5089; RV64IA-NEXT:    andi a2, a0, -4
5090; RV64IA-NEXT:    slliw a0, a0, 3
5091; RV64IA-NEXT:    lui a3, 16
5092; RV64IA-NEXT:    addiw a3, a3, -1
5093; RV64IA-NEXT:    sllw a4, a3, a0
5094; RV64IA-NEXT:    and a1, a1, a3
5095; RV64IA-NEXT:    sllw a1, a1, a0
5096; RV64IA-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
5097; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
5098; RV64IA-NEXT:    mv a5, a1
5099; RV64IA-NEXT:    xor a5, a3, a5
5100; RV64IA-NEXT:    and a5, a5, a4
5101; RV64IA-NEXT:    xor a5, a3, a5
5102; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5103; RV64IA-NEXT:    bnez a5, .LBB59_1
5104; RV64IA-NEXT:  # %bb.2:
5105; RV64IA-NEXT:    srlw a0, a3, a0
5106; RV64IA-NEXT:    ret
5107  %1 = atomicrmw xchg i16* %a, i16 %b seq_cst
5108  ret i16 %1
5109}
5110
5111define i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind {
5112; RV32I-LABEL: atomicrmw_add_i16_monotonic:
5113; RV32I:       # %bb.0:
5114; RV32I-NEXT:    addi sp, sp, -16
5115; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5116; RV32I-NEXT:    li a2, 0
5117; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5118; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5119; RV32I-NEXT:    addi sp, sp, 16
5120; RV32I-NEXT:    ret
5121;
5122; RV32IA-LABEL: atomicrmw_add_i16_monotonic:
5123; RV32IA:       # %bb.0:
5124; RV32IA-NEXT:    andi a2, a0, -4
5125; RV32IA-NEXT:    slli a0, a0, 3
5126; RV32IA-NEXT:    lui a3, 16
5127; RV32IA-NEXT:    addi a3, a3, -1
5128; RV32IA-NEXT:    sll a4, a3, a0
5129; RV32IA-NEXT:    and a1, a1, a3
5130; RV32IA-NEXT:    sll a1, a1, a0
5131; RV32IA-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
5132; RV32IA-NEXT:    lr.w a3, (a2)
5133; RV32IA-NEXT:    add a5, a3, a1
5134; RV32IA-NEXT:    xor a5, a3, a5
5135; RV32IA-NEXT:    and a5, a5, a4
5136; RV32IA-NEXT:    xor a5, a3, a5
5137; RV32IA-NEXT:    sc.w a5, a5, (a2)
5138; RV32IA-NEXT:    bnez a5, .LBB60_1
5139; RV32IA-NEXT:  # %bb.2:
5140; RV32IA-NEXT:    srl a0, a3, a0
5141; RV32IA-NEXT:    ret
5142;
5143; RV64I-LABEL: atomicrmw_add_i16_monotonic:
5144; RV64I:       # %bb.0:
5145; RV64I-NEXT:    addi sp, sp, -16
5146; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5147; RV64I-NEXT:    li a2, 0
5148; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5149; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5150; RV64I-NEXT:    addi sp, sp, 16
5151; RV64I-NEXT:    ret
5152;
5153; RV64IA-LABEL: atomicrmw_add_i16_monotonic:
5154; RV64IA:       # %bb.0:
5155; RV64IA-NEXT:    andi a2, a0, -4
5156; RV64IA-NEXT:    slliw a0, a0, 3
5157; RV64IA-NEXT:    lui a3, 16
5158; RV64IA-NEXT:    addiw a3, a3, -1
5159; RV64IA-NEXT:    sllw a4, a3, a0
5160; RV64IA-NEXT:    and a1, a1, a3
5161; RV64IA-NEXT:    sllw a1, a1, a0
5162; RV64IA-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
5163; RV64IA-NEXT:    lr.w a3, (a2)
5164; RV64IA-NEXT:    add a5, a3, a1
5165; RV64IA-NEXT:    xor a5, a3, a5
5166; RV64IA-NEXT:    and a5, a5, a4
5167; RV64IA-NEXT:    xor a5, a3, a5
5168; RV64IA-NEXT:    sc.w a5, a5, (a2)
5169; RV64IA-NEXT:    bnez a5, .LBB60_1
5170; RV64IA-NEXT:  # %bb.2:
5171; RV64IA-NEXT:    srlw a0, a3, a0
5172; RV64IA-NEXT:    ret
5173  %1 = atomicrmw add i16* %a, i16 %b monotonic
5174  ret i16 %1
5175}
5176
5177define i16 @atomicrmw_add_i16_acquire(i16 *%a, i16 %b) nounwind {
5178; RV32I-LABEL: atomicrmw_add_i16_acquire:
5179; RV32I:       # %bb.0:
5180; RV32I-NEXT:    addi sp, sp, -16
5181; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5182; RV32I-NEXT:    li a2, 2
5183; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5184; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5185; RV32I-NEXT:    addi sp, sp, 16
5186; RV32I-NEXT:    ret
5187;
5188; RV32IA-LABEL: atomicrmw_add_i16_acquire:
5189; RV32IA:       # %bb.0:
5190; RV32IA-NEXT:    andi a2, a0, -4
5191; RV32IA-NEXT:    slli a0, a0, 3
5192; RV32IA-NEXT:    lui a3, 16
5193; RV32IA-NEXT:    addi a3, a3, -1
5194; RV32IA-NEXT:    sll a4, a3, a0
5195; RV32IA-NEXT:    and a1, a1, a3
5196; RV32IA-NEXT:    sll a1, a1, a0
5197; RV32IA-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
5198; RV32IA-NEXT:    lr.w.aq a3, (a2)
5199; RV32IA-NEXT:    add a5, a3, a1
5200; RV32IA-NEXT:    xor a5, a3, a5
5201; RV32IA-NEXT:    and a5, a5, a4
5202; RV32IA-NEXT:    xor a5, a3, a5
5203; RV32IA-NEXT:    sc.w a5, a5, (a2)
5204; RV32IA-NEXT:    bnez a5, .LBB61_1
5205; RV32IA-NEXT:  # %bb.2:
5206; RV32IA-NEXT:    srl a0, a3, a0
5207; RV32IA-NEXT:    ret
5208;
5209; RV64I-LABEL: atomicrmw_add_i16_acquire:
5210; RV64I:       # %bb.0:
5211; RV64I-NEXT:    addi sp, sp, -16
5212; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5213; RV64I-NEXT:    li a2, 2
5214; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5215; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5216; RV64I-NEXT:    addi sp, sp, 16
5217; RV64I-NEXT:    ret
5218;
5219; RV64IA-LABEL: atomicrmw_add_i16_acquire:
5220; RV64IA:       # %bb.0:
5221; RV64IA-NEXT:    andi a2, a0, -4
5222; RV64IA-NEXT:    slliw a0, a0, 3
5223; RV64IA-NEXT:    lui a3, 16
5224; RV64IA-NEXT:    addiw a3, a3, -1
5225; RV64IA-NEXT:    sllw a4, a3, a0
5226; RV64IA-NEXT:    and a1, a1, a3
5227; RV64IA-NEXT:    sllw a1, a1, a0
5228; RV64IA-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
5229; RV64IA-NEXT:    lr.w.aq a3, (a2)
5230; RV64IA-NEXT:    add a5, a3, a1
5231; RV64IA-NEXT:    xor a5, a3, a5
5232; RV64IA-NEXT:    and a5, a5, a4
5233; RV64IA-NEXT:    xor a5, a3, a5
5234; RV64IA-NEXT:    sc.w a5, a5, (a2)
5235; RV64IA-NEXT:    bnez a5, .LBB61_1
5236; RV64IA-NEXT:  # %bb.2:
5237; RV64IA-NEXT:    srlw a0, a3, a0
5238; RV64IA-NEXT:    ret
5239  %1 = atomicrmw add i16* %a, i16 %b acquire
5240  ret i16 %1
5241}
5242
5243define i16 @atomicrmw_add_i16_release(i16 *%a, i16 %b) nounwind {
5244; RV32I-LABEL: atomicrmw_add_i16_release:
5245; RV32I:       # %bb.0:
5246; RV32I-NEXT:    addi sp, sp, -16
5247; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5248; RV32I-NEXT:    li a2, 3
5249; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5250; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5251; RV32I-NEXT:    addi sp, sp, 16
5252; RV32I-NEXT:    ret
5253;
5254; RV32IA-LABEL: atomicrmw_add_i16_release:
5255; RV32IA:       # %bb.0:
5256; RV32IA-NEXT:    andi a2, a0, -4
5257; RV32IA-NEXT:    slli a0, a0, 3
5258; RV32IA-NEXT:    lui a3, 16
5259; RV32IA-NEXT:    addi a3, a3, -1
5260; RV32IA-NEXT:    sll a4, a3, a0
5261; RV32IA-NEXT:    and a1, a1, a3
5262; RV32IA-NEXT:    sll a1, a1, a0
5263; RV32IA-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
5264; RV32IA-NEXT:    lr.w a3, (a2)
5265; RV32IA-NEXT:    add a5, a3, a1
5266; RV32IA-NEXT:    xor a5, a3, a5
5267; RV32IA-NEXT:    and a5, a5, a4
5268; RV32IA-NEXT:    xor a5, a3, a5
5269; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5270; RV32IA-NEXT:    bnez a5, .LBB62_1
5271; RV32IA-NEXT:  # %bb.2:
5272; RV32IA-NEXT:    srl a0, a3, a0
5273; RV32IA-NEXT:    ret
5274;
5275; RV64I-LABEL: atomicrmw_add_i16_release:
5276; RV64I:       # %bb.0:
5277; RV64I-NEXT:    addi sp, sp, -16
5278; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5279; RV64I-NEXT:    li a2, 3
5280; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5281; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5282; RV64I-NEXT:    addi sp, sp, 16
5283; RV64I-NEXT:    ret
5284;
5285; RV64IA-LABEL: atomicrmw_add_i16_release:
5286; RV64IA:       # %bb.0:
5287; RV64IA-NEXT:    andi a2, a0, -4
5288; RV64IA-NEXT:    slliw a0, a0, 3
5289; RV64IA-NEXT:    lui a3, 16
5290; RV64IA-NEXT:    addiw a3, a3, -1
5291; RV64IA-NEXT:    sllw a4, a3, a0
5292; RV64IA-NEXT:    and a1, a1, a3
5293; RV64IA-NEXT:    sllw a1, a1, a0
5294; RV64IA-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
5295; RV64IA-NEXT:    lr.w a3, (a2)
5296; RV64IA-NEXT:    add a5, a3, a1
5297; RV64IA-NEXT:    xor a5, a3, a5
5298; RV64IA-NEXT:    and a5, a5, a4
5299; RV64IA-NEXT:    xor a5, a3, a5
5300; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5301; RV64IA-NEXT:    bnez a5, .LBB62_1
5302; RV64IA-NEXT:  # %bb.2:
5303; RV64IA-NEXT:    srlw a0, a3, a0
5304; RV64IA-NEXT:    ret
5305  %1 = atomicrmw add i16* %a, i16 %b release
5306  ret i16 %1
5307}
5308
5309define i16 @atomicrmw_add_i16_acq_rel(i16 *%a, i16 %b) nounwind {
5310; RV32I-LABEL: atomicrmw_add_i16_acq_rel:
5311; RV32I:       # %bb.0:
5312; RV32I-NEXT:    addi sp, sp, -16
5313; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5314; RV32I-NEXT:    li a2, 4
5315; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5316; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5317; RV32I-NEXT:    addi sp, sp, 16
5318; RV32I-NEXT:    ret
5319;
5320; RV32IA-LABEL: atomicrmw_add_i16_acq_rel:
5321; RV32IA:       # %bb.0:
5322; RV32IA-NEXT:    andi a2, a0, -4
5323; RV32IA-NEXT:    slli a0, a0, 3
5324; RV32IA-NEXT:    lui a3, 16
5325; RV32IA-NEXT:    addi a3, a3, -1
5326; RV32IA-NEXT:    sll a4, a3, a0
5327; RV32IA-NEXT:    and a1, a1, a3
5328; RV32IA-NEXT:    sll a1, a1, a0
5329; RV32IA-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
5330; RV32IA-NEXT:    lr.w.aq a3, (a2)
5331; RV32IA-NEXT:    add a5, a3, a1
5332; RV32IA-NEXT:    xor a5, a3, a5
5333; RV32IA-NEXT:    and a5, a5, a4
5334; RV32IA-NEXT:    xor a5, a3, a5
5335; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5336; RV32IA-NEXT:    bnez a5, .LBB63_1
5337; RV32IA-NEXT:  # %bb.2:
5338; RV32IA-NEXT:    srl a0, a3, a0
5339; RV32IA-NEXT:    ret
5340;
5341; RV64I-LABEL: atomicrmw_add_i16_acq_rel:
5342; RV64I:       # %bb.0:
5343; RV64I-NEXT:    addi sp, sp, -16
5344; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5345; RV64I-NEXT:    li a2, 4
5346; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5347; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5348; RV64I-NEXT:    addi sp, sp, 16
5349; RV64I-NEXT:    ret
5350;
5351; RV64IA-LABEL: atomicrmw_add_i16_acq_rel:
5352; RV64IA:       # %bb.0:
5353; RV64IA-NEXT:    andi a2, a0, -4
5354; RV64IA-NEXT:    slliw a0, a0, 3
5355; RV64IA-NEXT:    lui a3, 16
5356; RV64IA-NEXT:    addiw a3, a3, -1
5357; RV64IA-NEXT:    sllw a4, a3, a0
5358; RV64IA-NEXT:    and a1, a1, a3
5359; RV64IA-NEXT:    sllw a1, a1, a0
5360; RV64IA-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
5361; RV64IA-NEXT:    lr.w.aq a3, (a2)
5362; RV64IA-NEXT:    add a5, a3, a1
5363; RV64IA-NEXT:    xor a5, a3, a5
5364; RV64IA-NEXT:    and a5, a5, a4
5365; RV64IA-NEXT:    xor a5, a3, a5
5366; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5367; RV64IA-NEXT:    bnez a5, .LBB63_1
5368; RV64IA-NEXT:  # %bb.2:
5369; RV64IA-NEXT:    srlw a0, a3, a0
5370; RV64IA-NEXT:    ret
5371  %1 = atomicrmw add i16* %a, i16 %b acq_rel
5372  ret i16 %1
5373}
5374
5375define i16 @atomicrmw_add_i16_seq_cst(i16 *%a, i16 %b) nounwind {
5376; RV32I-LABEL: atomicrmw_add_i16_seq_cst:
5377; RV32I:       # %bb.0:
5378; RV32I-NEXT:    addi sp, sp, -16
5379; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5380; RV32I-NEXT:    li a2, 5
5381; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5382; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5383; RV32I-NEXT:    addi sp, sp, 16
5384; RV32I-NEXT:    ret
5385;
5386; RV32IA-LABEL: atomicrmw_add_i16_seq_cst:
5387; RV32IA:       # %bb.0:
5388; RV32IA-NEXT:    andi a2, a0, -4
5389; RV32IA-NEXT:    slli a0, a0, 3
5390; RV32IA-NEXT:    lui a3, 16
5391; RV32IA-NEXT:    addi a3, a3, -1
5392; RV32IA-NEXT:    sll a4, a3, a0
5393; RV32IA-NEXT:    and a1, a1, a3
5394; RV32IA-NEXT:    sll a1, a1, a0
5395; RV32IA-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
5396; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
5397; RV32IA-NEXT:    add a5, a3, a1
5398; RV32IA-NEXT:    xor a5, a3, a5
5399; RV32IA-NEXT:    and a5, a5, a4
5400; RV32IA-NEXT:    xor a5, a3, a5
5401; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5402; RV32IA-NEXT:    bnez a5, .LBB64_1
5403; RV32IA-NEXT:  # %bb.2:
5404; RV32IA-NEXT:    srl a0, a3, a0
5405; RV32IA-NEXT:    ret
5406;
5407; RV64I-LABEL: atomicrmw_add_i16_seq_cst:
5408; RV64I:       # %bb.0:
5409; RV64I-NEXT:    addi sp, sp, -16
5410; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5411; RV64I-NEXT:    li a2, 5
5412; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5413; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5414; RV64I-NEXT:    addi sp, sp, 16
5415; RV64I-NEXT:    ret
5416;
5417; RV64IA-LABEL: atomicrmw_add_i16_seq_cst:
5418; RV64IA:       # %bb.0:
5419; RV64IA-NEXT:    andi a2, a0, -4
5420; RV64IA-NEXT:    slliw a0, a0, 3
5421; RV64IA-NEXT:    lui a3, 16
5422; RV64IA-NEXT:    addiw a3, a3, -1
5423; RV64IA-NEXT:    sllw a4, a3, a0
5424; RV64IA-NEXT:    and a1, a1, a3
5425; RV64IA-NEXT:    sllw a1, a1, a0
5426; RV64IA-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
5427; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
5428; RV64IA-NEXT:    add a5, a3, a1
5429; RV64IA-NEXT:    xor a5, a3, a5
5430; RV64IA-NEXT:    and a5, a5, a4
5431; RV64IA-NEXT:    xor a5, a3, a5
5432; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5433; RV64IA-NEXT:    bnez a5, .LBB64_1
5434; RV64IA-NEXT:  # %bb.2:
5435; RV64IA-NEXT:    srlw a0, a3, a0
5436; RV64IA-NEXT:    ret
5437  %1 = atomicrmw add i16* %a, i16 %b seq_cst
5438  ret i16 %1
5439}
5440
5441define i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) nounwind {
5442; RV32I-LABEL: atomicrmw_sub_i16_monotonic:
5443; RV32I:       # %bb.0:
5444; RV32I-NEXT:    addi sp, sp, -16
5445; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5446; RV32I-NEXT:    li a2, 0
5447; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5448; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5449; RV32I-NEXT:    addi sp, sp, 16
5450; RV32I-NEXT:    ret
5451;
5452; RV32IA-LABEL: atomicrmw_sub_i16_monotonic:
5453; RV32IA:       # %bb.0:
5454; RV32IA-NEXT:    andi a2, a0, -4
5455; RV32IA-NEXT:    slli a0, a0, 3
5456; RV32IA-NEXT:    lui a3, 16
5457; RV32IA-NEXT:    addi a3, a3, -1
5458; RV32IA-NEXT:    sll a4, a3, a0
5459; RV32IA-NEXT:    and a1, a1, a3
5460; RV32IA-NEXT:    sll a1, a1, a0
5461; RV32IA-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
5462; RV32IA-NEXT:    lr.w a3, (a2)
5463; RV32IA-NEXT:    sub a5, a3, a1
5464; RV32IA-NEXT:    xor a5, a3, a5
5465; RV32IA-NEXT:    and a5, a5, a4
5466; RV32IA-NEXT:    xor a5, a3, a5
5467; RV32IA-NEXT:    sc.w a5, a5, (a2)
5468; RV32IA-NEXT:    bnez a5, .LBB65_1
5469; RV32IA-NEXT:  # %bb.2:
5470; RV32IA-NEXT:    srl a0, a3, a0
5471; RV32IA-NEXT:    ret
5472;
5473; RV64I-LABEL: atomicrmw_sub_i16_monotonic:
5474; RV64I:       # %bb.0:
5475; RV64I-NEXT:    addi sp, sp, -16
5476; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5477; RV64I-NEXT:    li a2, 0
5478; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5479; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5480; RV64I-NEXT:    addi sp, sp, 16
5481; RV64I-NEXT:    ret
5482;
5483; RV64IA-LABEL: atomicrmw_sub_i16_monotonic:
5484; RV64IA:       # %bb.0:
5485; RV64IA-NEXT:    andi a2, a0, -4
5486; RV64IA-NEXT:    slliw a0, a0, 3
5487; RV64IA-NEXT:    lui a3, 16
5488; RV64IA-NEXT:    addiw a3, a3, -1
5489; RV64IA-NEXT:    sllw a4, a3, a0
5490; RV64IA-NEXT:    and a1, a1, a3
5491; RV64IA-NEXT:    sllw a1, a1, a0
5492; RV64IA-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
5493; RV64IA-NEXT:    lr.w a3, (a2)
5494; RV64IA-NEXT:    sub a5, a3, a1
5495; RV64IA-NEXT:    xor a5, a3, a5
5496; RV64IA-NEXT:    and a5, a5, a4
5497; RV64IA-NEXT:    xor a5, a3, a5
5498; RV64IA-NEXT:    sc.w a5, a5, (a2)
5499; RV64IA-NEXT:    bnez a5, .LBB65_1
5500; RV64IA-NEXT:  # %bb.2:
5501; RV64IA-NEXT:    srlw a0, a3, a0
5502; RV64IA-NEXT:    ret
5503  %1 = atomicrmw sub i16* %a, i16 %b monotonic
5504  ret i16 %1
5505}
5506
5507define i16 @atomicrmw_sub_i16_acquire(i16* %a, i16 %b) nounwind {
5508; RV32I-LABEL: atomicrmw_sub_i16_acquire:
5509; RV32I:       # %bb.0:
5510; RV32I-NEXT:    addi sp, sp, -16
5511; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5512; RV32I-NEXT:    li a2, 2
5513; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5514; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5515; RV32I-NEXT:    addi sp, sp, 16
5516; RV32I-NEXT:    ret
5517;
5518; RV32IA-LABEL: atomicrmw_sub_i16_acquire:
5519; RV32IA:       # %bb.0:
5520; RV32IA-NEXT:    andi a2, a0, -4
5521; RV32IA-NEXT:    slli a0, a0, 3
5522; RV32IA-NEXT:    lui a3, 16
5523; RV32IA-NEXT:    addi a3, a3, -1
5524; RV32IA-NEXT:    sll a4, a3, a0
5525; RV32IA-NEXT:    and a1, a1, a3
5526; RV32IA-NEXT:    sll a1, a1, a0
5527; RV32IA-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
5528; RV32IA-NEXT:    lr.w.aq a3, (a2)
5529; RV32IA-NEXT:    sub a5, a3, a1
5530; RV32IA-NEXT:    xor a5, a3, a5
5531; RV32IA-NEXT:    and a5, a5, a4
5532; RV32IA-NEXT:    xor a5, a3, a5
5533; RV32IA-NEXT:    sc.w a5, a5, (a2)
5534; RV32IA-NEXT:    bnez a5, .LBB66_1
5535; RV32IA-NEXT:  # %bb.2:
5536; RV32IA-NEXT:    srl a0, a3, a0
5537; RV32IA-NEXT:    ret
5538;
5539; RV64I-LABEL: atomicrmw_sub_i16_acquire:
5540; RV64I:       # %bb.0:
5541; RV64I-NEXT:    addi sp, sp, -16
5542; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5543; RV64I-NEXT:    li a2, 2
5544; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5545; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5546; RV64I-NEXT:    addi sp, sp, 16
5547; RV64I-NEXT:    ret
5548;
5549; RV64IA-LABEL: atomicrmw_sub_i16_acquire:
5550; RV64IA:       # %bb.0:
5551; RV64IA-NEXT:    andi a2, a0, -4
5552; RV64IA-NEXT:    slliw a0, a0, 3
5553; RV64IA-NEXT:    lui a3, 16
5554; RV64IA-NEXT:    addiw a3, a3, -1
5555; RV64IA-NEXT:    sllw a4, a3, a0
5556; RV64IA-NEXT:    and a1, a1, a3
5557; RV64IA-NEXT:    sllw a1, a1, a0
5558; RV64IA-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
5559; RV64IA-NEXT:    lr.w.aq a3, (a2)
5560; RV64IA-NEXT:    sub a5, a3, a1
5561; RV64IA-NEXT:    xor a5, a3, a5
5562; RV64IA-NEXT:    and a5, a5, a4
5563; RV64IA-NEXT:    xor a5, a3, a5
5564; RV64IA-NEXT:    sc.w a5, a5, (a2)
5565; RV64IA-NEXT:    bnez a5, .LBB66_1
5566; RV64IA-NEXT:  # %bb.2:
5567; RV64IA-NEXT:    srlw a0, a3, a0
5568; RV64IA-NEXT:    ret
5569  %1 = atomicrmw sub i16* %a, i16 %b acquire
5570  ret i16 %1
5571}
5572
5573define i16 @atomicrmw_sub_i16_release(i16* %a, i16 %b) nounwind {
5574; RV32I-LABEL: atomicrmw_sub_i16_release:
5575; RV32I:       # %bb.0:
5576; RV32I-NEXT:    addi sp, sp, -16
5577; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5578; RV32I-NEXT:    li a2, 3
5579; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5580; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5581; RV32I-NEXT:    addi sp, sp, 16
5582; RV32I-NEXT:    ret
5583;
5584; RV32IA-LABEL: atomicrmw_sub_i16_release:
5585; RV32IA:       # %bb.0:
5586; RV32IA-NEXT:    andi a2, a0, -4
5587; RV32IA-NEXT:    slli a0, a0, 3
5588; RV32IA-NEXT:    lui a3, 16
5589; RV32IA-NEXT:    addi a3, a3, -1
5590; RV32IA-NEXT:    sll a4, a3, a0
5591; RV32IA-NEXT:    and a1, a1, a3
5592; RV32IA-NEXT:    sll a1, a1, a0
5593; RV32IA-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
5594; RV32IA-NEXT:    lr.w a3, (a2)
5595; RV32IA-NEXT:    sub a5, a3, a1
5596; RV32IA-NEXT:    xor a5, a3, a5
5597; RV32IA-NEXT:    and a5, a5, a4
5598; RV32IA-NEXT:    xor a5, a3, a5
5599; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5600; RV32IA-NEXT:    bnez a5, .LBB67_1
5601; RV32IA-NEXT:  # %bb.2:
5602; RV32IA-NEXT:    srl a0, a3, a0
5603; RV32IA-NEXT:    ret
5604;
5605; RV64I-LABEL: atomicrmw_sub_i16_release:
5606; RV64I:       # %bb.0:
5607; RV64I-NEXT:    addi sp, sp, -16
5608; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5609; RV64I-NEXT:    li a2, 3
5610; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5611; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5612; RV64I-NEXT:    addi sp, sp, 16
5613; RV64I-NEXT:    ret
5614;
5615; RV64IA-LABEL: atomicrmw_sub_i16_release:
5616; RV64IA:       # %bb.0:
5617; RV64IA-NEXT:    andi a2, a0, -4
5618; RV64IA-NEXT:    slliw a0, a0, 3
5619; RV64IA-NEXT:    lui a3, 16
5620; RV64IA-NEXT:    addiw a3, a3, -1
5621; RV64IA-NEXT:    sllw a4, a3, a0
5622; RV64IA-NEXT:    and a1, a1, a3
5623; RV64IA-NEXT:    sllw a1, a1, a0
5624; RV64IA-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
5625; RV64IA-NEXT:    lr.w a3, (a2)
5626; RV64IA-NEXT:    sub a5, a3, a1
5627; RV64IA-NEXT:    xor a5, a3, a5
5628; RV64IA-NEXT:    and a5, a5, a4
5629; RV64IA-NEXT:    xor a5, a3, a5
5630; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5631; RV64IA-NEXT:    bnez a5, .LBB67_1
5632; RV64IA-NEXT:  # %bb.2:
5633; RV64IA-NEXT:    srlw a0, a3, a0
5634; RV64IA-NEXT:    ret
5635  %1 = atomicrmw sub i16* %a, i16 %b release
5636  ret i16 %1
5637}
5638
5639define i16 @atomicrmw_sub_i16_acq_rel(i16* %a, i16 %b) nounwind {
5640; RV32I-LABEL: atomicrmw_sub_i16_acq_rel:
5641; RV32I:       # %bb.0:
5642; RV32I-NEXT:    addi sp, sp, -16
5643; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5644; RV32I-NEXT:    li a2, 4
5645; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5646; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5647; RV32I-NEXT:    addi sp, sp, 16
5648; RV32I-NEXT:    ret
5649;
5650; RV32IA-LABEL: atomicrmw_sub_i16_acq_rel:
5651; RV32IA:       # %bb.0:
5652; RV32IA-NEXT:    andi a2, a0, -4
5653; RV32IA-NEXT:    slli a0, a0, 3
5654; RV32IA-NEXT:    lui a3, 16
5655; RV32IA-NEXT:    addi a3, a3, -1
5656; RV32IA-NEXT:    sll a4, a3, a0
5657; RV32IA-NEXT:    and a1, a1, a3
5658; RV32IA-NEXT:    sll a1, a1, a0
5659; RV32IA-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
5660; RV32IA-NEXT:    lr.w.aq a3, (a2)
5661; RV32IA-NEXT:    sub a5, a3, a1
5662; RV32IA-NEXT:    xor a5, a3, a5
5663; RV32IA-NEXT:    and a5, a5, a4
5664; RV32IA-NEXT:    xor a5, a3, a5
5665; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5666; RV32IA-NEXT:    bnez a5, .LBB68_1
5667; RV32IA-NEXT:  # %bb.2:
5668; RV32IA-NEXT:    srl a0, a3, a0
5669; RV32IA-NEXT:    ret
5670;
5671; RV64I-LABEL: atomicrmw_sub_i16_acq_rel:
5672; RV64I:       # %bb.0:
5673; RV64I-NEXT:    addi sp, sp, -16
5674; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5675; RV64I-NEXT:    li a2, 4
5676; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5677; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5678; RV64I-NEXT:    addi sp, sp, 16
5679; RV64I-NEXT:    ret
5680;
5681; RV64IA-LABEL: atomicrmw_sub_i16_acq_rel:
5682; RV64IA:       # %bb.0:
5683; RV64IA-NEXT:    andi a2, a0, -4
5684; RV64IA-NEXT:    slliw a0, a0, 3
5685; RV64IA-NEXT:    lui a3, 16
5686; RV64IA-NEXT:    addiw a3, a3, -1
5687; RV64IA-NEXT:    sllw a4, a3, a0
5688; RV64IA-NEXT:    and a1, a1, a3
5689; RV64IA-NEXT:    sllw a1, a1, a0
5690; RV64IA-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
5691; RV64IA-NEXT:    lr.w.aq a3, (a2)
5692; RV64IA-NEXT:    sub a5, a3, a1
5693; RV64IA-NEXT:    xor a5, a3, a5
5694; RV64IA-NEXT:    and a5, a5, a4
5695; RV64IA-NEXT:    xor a5, a3, a5
5696; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5697; RV64IA-NEXT:    bnez a5, .LBB68_1
5698; RV64IA-NEXT:  # %bb.2:
5699; RV64IA-NEXT:    srlw a0, a3, a0
5700; RV64IA-NEXT:    ret
5701  %1 = atomicrmw sub i16* %a, i16 %b acq_rel
5702  ret i16 %1
5703}
5704
5705define i16 @atomicrmw_sub_i16_seq_cst(i16* %a, i16 %b) nounwind {
5706; RV32I-LABEL: atomicrmw_sub_i16_seq_cst:
5707; RV32I:       # %bb.0:
5708; RV32I-NEXT:    addi sp, sp, -16
5709; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5710; RV32I-NEXT:    li a2, 5
5711; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5712; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5713; RV32I-NEXT:    addi sp, sp, 16
5714; RV32I-NEXT:    ret
5715;
5716; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst:
5717; RV32IA:       # %bb.0:
5718; RV32IA-NEXT:    andi a2, a0, -4
5719; RV32IA-NEXT:    slli a0, a0, 3
5720; RV32IA-NEXT:    lui a3, 16
5721; RV32IA-NEXT:    addi a3, a3, -1
5722; RV32IA-NEXT:    sll a4, a3, a0
5723; RV32IA-NEXT:    and a1, a1, a3
5724; RV32IA-NEXT:    sll a1, a1, a0
5725; RV32IA-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
5726; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
5727; RV32IA-NEXT:    sub a5, a3, a1
5728; RV32IA-NEXT:    xor a5, a3, a5
5729; RV32IA-NEXT:    and a5, a5, a4
5730; RV32IA-NEXT:    xor a5, a3, a5
5731; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5732; RV32IA-NEXT:    bnez a5, .LBB69_1
5733; RV32IA-NEXT:  # %bb.2:
5734; RV32IA-NEXT:    srl a0, a3, a0
5735; RV32IA-NEXT:    ret
5736;
5737; RV64I-LABEL: atomicrmw_sub_i16_seq_cst:
5738; RV64I:       # %bb.0:
5739; RV64I-NEXT:    addi sp, sp, -16
5740; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5741; RV64I-NEXT:    li a2, 5
5742; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5743; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5744; RV64I-NEXT:    addi sp, sp, 16
5745; RV64I-NEXT:    ret
5746;
5747; RV64IA-LABEL: atomicrmw_sub_i16_seq_cst:
5748; RV64IA:       # %bb.0:
5749; RV64IA-NEXT:    andi a2, a0, -4
5750; RV64IA-NEXT:    slliw a0, a0, 3
5751; RV64IA-NEXT:    lui a3, 16
5752; RV64IA-NEXT:    addiw a3, a3, -1
5753; RV64IA-NEXT:    sllw a4, a3, a0
5754; RV64IA-NEXT:    and a1, a1, a3
5755; RV64IA-NEXT:    sllw a1, a1, a0
5756; RV64IA-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
5757; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
5758; RV64IA-NEXT:    sub a5, a3, a1
5759; RV64IA-NEXT:    xor a5, a3, a5
5760; RV64IA-NEXT:    and a5, a5, a4
5761; RV64IA-NEXT:    xor a5, a3, a5
5762; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5763; RV64IA-NEXT:    bnez a5, .LBB69_1
5764; RV64IA-NEXT:  # %bb.2:
5765; RV64IA-NEXT:    srlw a0, a3, a0
5766; RV64IA-NEXT:    ret
5767  %1 = atomicrmw sub i16* %a, i16 %b seq_cst
5768  ret i16 %1
5769}
5770
5771define i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind {
5772; RV32I-LABEL: atomicrmw_and_i16_monotonic:
5773; RV32I:       # %bb.0:
5774; RV32I-NEXT:    addi sp, sp, -16
5775; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5776; RV32I-NEXT:    li a2, 0
5777; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5778; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5779; RV32I-NEXT:    addi sp, sp, 16
5780; RV32I-NEXT:    ret
5781;
5782; RV32IA-LABEL: atomicrmw_and_i16_monotonic:
5783; RV32IA:       # %bb.0:
5784; RV32IA-NEXT:    andi a2, a0, -4
5785; RV32IA-NEXT:    slli a0, a0, 3
5786; RV32IA-NEXT:    lui a3, 16
5787; RV32IA-NEXT:    addi a3, a3, -1
5788; RV32IA-NEXT:    sll a4, a3, a0
5789; RV32IA-NEXT:    not a4, a4
5790; RV32IA-NEXT:    and a1, a1, a3
5791; RV32IA-NEXT:    sll a1, a1, a0
5792; RV32IA-NEXT:    or a1, a4, a1
5793; RV32IA-NEXT:    amoand.w a1, a1, (a2)
5794; RV32IA-NEXT:    srl a0, a1, a0
5795; RV32IA-NEXT:    ret
5796;
5797; RV64I-LABEL: atomicrmw_and_i16_monotonic:
5798; RV64I:       # %bb.0:
5799; RV64I-NEXT:    addi sp, sp, -16
5800; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5801; RV64I-NEXT:    li a2, 0
5802; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5803; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5804; RV64I-NEXT:    addi sp, sp, 16
5805; RV64I-NEXT:    ret
5806;
5807; RV64IA-LABEL: atomicrmw_and_i16_monotonic:
5808; RV64IA:       # %bb.0:
5809; RV64IA-NEXT:    andi a2, a0, -4
5810; RV64IA-NEXT:    slliw a0, a0, 3
5811; RV64IA-NEXT:    lui a3, 16
5812; RV64IA-NEXT:    addiw a3, a3, -1
5813; RV64IA-NEXT:    sllw a4, a3, a0
5814; RV64IA-NEXT:    not a4, a4
5815; RV64IA-NEXT:    and a1, a1, a3
5816; RV64IA-NEXT:    sllw a1, a1, a0
5817; RV64IA-NEXT:    or a1, a4, a1
5818; RV64IA-NEXT:    amoand.w a1, a1, (a2)
5819; RV64IA-NEXT:    srlw a0, a1, a0
5820; RV64IA-NEXT:    ret
5821  %1 = atomicrmw and i16* %a, i16 %b monotonic
5822  ret i16 %1
5823}
5824
5825define i16 @atomicrmw_and_i16_acquire(i16 *%a, i16 %b) nounwind {
5826; RV32I-LABEL: atomicrmw_and_i16_acquire:
5827; RV32I:       # %bb.0:
5828; RV32I-NEXT:    addi sp, sp, -16
5829; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5830; RV32I-NEXT:    li a2, 2
5831; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5832; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5833; RV32I-NEXT:    addi sp, sp, 16
5834; RV32I-NEXT:    ret
5835;
5836; RV32IA-LABEL: atomicrmw_and_i16_acquire:
5837; RV32IA:       # %bb.0:
5838; RV32IA-NEXT:    andi a2, a0, -4
5839; RV32IA-NEXT:    slli a0, a0, 3
5840; RV32IA-NEXT:    lui a3, 16
5841; RV32IA-NEXT:    addi a3, a3, -1
5842; RV32IA-NEXT:    sll a4, a3, a0
5843; RV32IA-NEXT:    not a4, a4
5844; RV32IA-NEXT:    and a1, a1, a3
5845; RV32IA-NEXT:    sll a1, a1, a0
5846; RV32IA-NEXT:    or a1, a4, a1
5847; RV32IA-NEXT:    amoand.w.aq a1, a1, (a2)
5848; RV32IA-NEXT:    srl a0, a1, a0
5849; RV32IA-NEXT:    ret
5850;
5851; RV64I-LABEL: atomicrmw_and_i16_acquire:
5852; RV64I:       # %bb.0:
5853; RV64I-NEXT:    addi sp, sp, -16
5854; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5855; RV64I-NEXT:    li a2, 2
5856; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5857; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5858; RV64I-NEXT:    addi sp, sp, 16
5859; RV64I-NEXT:    ret
5860;
5861; RV64IA-LABEL: atomicrmw_and_i16_acquire:
5862; RV64IA:       # %bb.0:
5863; RV64IA-NEXT:    andi a2, a0, -4
5864; RV64IA-NEXT:    slliw a0, a0, 3
5865; RV64IA-NEXT:    lui a3, 16
5866; RV64IA-NEXT:    addiw a3, a3, -1
5867; RV64IA-NEXT:    sllw a4, a3, a0
5868; RV64IA-NEXT:    not a4, a4
5869; RV64IA-NEXT:    and a1, a1, a3
5870; RV64IA-NEXT:    sllw a1, a1, a0
5871; RV64IA-NEXT:    or a1, a4, a1
5872; RV64IA-NEXT:    amoand.w.aq a1, a1, (a2)
5873; RV64IA-NEXT:    srlw a0, a1, a0
5874; RV64IA-NEXT:    ret
5875  %1 = atomicrmw and i16* %a, i16 %b acquire
5876  ret i16 %1
5877}
5878
5879define i16 @atomicrmw_and_i16_release(i16 *%a, i16 %b) nounwind {
5880; RV32I-LABEL: atomicrmw_and_i16_release:
5881; RV32I:       # %bb.0:
5882; RV32I-NEXT:    addi sp, sp, -16
5883; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5884; RV32I-NEXT:    li a2, 3
5885; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5886; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5887; RV32I-NEXT:    addi sp, sp, 16
5888; RV32I-NEXT:    ret
5889;
5890; RV32IA-LABEL: atomicrmw_and_i16_release:
5891; RV32IA:       # %bb.0:
5892; RV32IA-NEXT:    andi a2, a0, -4
5893; RV32IA-NEXT:    slli a0, a0, 3
5894; RV32IA-NEXT:    lui a3, 16
5895; RV32IA-NEXT:    addi a3, a3, -1
5896; RV32IA-NEXT:    sll a4, a3, a0
5897; RV32IA-NEXT:    not a4, a4
5898; RV32IA-NEXT:    and a1, a1, a3
5899; RV32IA-NEXT:    sll a1, a1, a0
5900; RV32IA-NEXT:    or a1, a4, a1
5901; RV32IA-NEXT:    amoand.w.rl a1, a1, (a2)
5902; RV32IA-NEXT:    srl a0, a1, a0
5903; RV32IA-NEXT:    ret
5904;
5905; RV64I-LABEL: atomicrmw_and_i16_release:
5906; RV64I:       # %bb.0:
5907; RV64I-NEXT:    addi sp, sp, -16
5908; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5909; RV64I-NEXT:    li a2, 3
5910; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5911; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5912; RV64I-NEXT:    addi sp, sp, 16
5913; RV64I-NEXT:    ret
5914;
5915; RV64IA-LABEL: atomicrmw_and_i16_release:
5916; RV64IA:       # %bb.0:
5917; RV64IA-NEXT:    andi a2, a0, -4
5918; RV64IA-NEXT:    slliw a0, a0, 3
5919; RV64IA-NEXT:    lui a3, 16
5920; RV64IA-NEXT:    addiw a3, a3, -1
5921; RV64IA-NEXT:    sllw a4, a3, a0
5922; RV64IA-NEXT:    not a4, a4
5923; RV64IA-NEXT:    and a1, a1, a3
5924; RV64IA-NEXT:    sllw a1, a1, a0
5925; RV64IA-NEXT:    or a1, a4, a1
5926; RV64IA-NEXT:    amoand.w.rl a1, a1, (a2)
5927; RV64IA-NEXT:    srlw a0, a1, a0
5928; RV64IA-NEXT:    ret
5929  %1 = atomicrmw and i16* %a, i16 %b release
5930  ret i16 %1
5931}
5932
5933define i16 @atomicrmw_and_i16_acq_rel(i16 *%a, i16 %b) nounwind {
5934; RV32I-LABEL: atomicrmw_and_i16_acq_rel:
5935; RV32I:       # %bb.0:
5936; RV32I-NEXT:    addi sp, sp, -16
5937; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5938; RV32I-NEXT:    li a2, 4
5939; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5940; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5941; RV32I-NEXT:    addi sp, sp, 16
5942; RV32I-NEXT:    ret
5943;
5944; RV32IA-LABEL: atomicrmw_and_i16_acq_rel:
5945; RV32IA:       # %bb.0:
5946; RV32IA-NEXT:    andi a2, a0, -4
5947; RV32IA-NEXT:    slli a0, a0, 3
5948; RV32IA-NEXT:    lui a3, 16
5949; RV32IA-NEXT:    addi a3, a3, -1
5950; RV32IA-NEXT:    sll a4, a3, a0
5951; RV32IA-NEXT:    not a4, a4
5952; RV32IA-NEXT:    and a1, a1, a3
5953; RV32IA-NEXT:    sll a1, a1, a0
5954; RV32IA-NEXT:    or a1, a4, a1
5955; RV32IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
5956; RV32IA-NEXT:    srl a0, a1, a0
5957; RV32IA-NEXT:    ret
5958;
5959; RV64I-LABEL: atomicrmw_and_i16_acq_rel:
5960; RV64I:       # %bb.0:
5961; RV64I-NEXT:    addi sp, sp, -16
5962; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5963; RV64I-NEXT:    li a2, 4
5964; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5965; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5966; RV64I-NEXT:    addi sp, sp, 16
5967; RV64I-NEXT:    ret
5968;
5969; RV64IA-LABEL: atomicrmw_and_i16_acq_rel:
5970; RV64IA:       # %bb.0:
5971; RV64IA-NEXT:    andi a2, a0, -4
5972; RV64IA-NEXT:    slliw a0, a0, 3
5973; RV64IA-NEXT:    lui a3, 16
5974; RV64IA-NEXT:    addiw a3, a3, -1
5975; RV64IA-NEXT:    sllw a4, a3, a0
5976; RV64IA-NEXT:    not a4, a4
5977; RV64IA-NEXT:    and a1, a1, a3
5978; RV64IA-NEXT:    sllw a1, a1, a0
5979; RV64IA-NEXT:    or a1, a4, a1
5980; RV64IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
5981; RV64IA-NEXT:    srlw a0, a1, a0
5982; RV64IA-NEXT:    ret
5983  %1 = atomicrmw and i16* %a, i16 %b acq_rel
5984  ret i16 %1
5985}
5986
5987define i16 @atomicrmw_and_i16_seq_cst(i16 *%a, i16 %b) nounwind {
5988; RV32I-LABEL: atomicrmw_and_i16_seq_cst:
5989; RV32I:       # %bb.0:
5990; RV32I-NEXT:    addi sp, sp, -16
5991; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5992; RV32I-NEXT:    li a2, 5
5993; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5994; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5995; RV32I-NEXT:    addi sp, sp, 16
5996; RV32I-NEXT:    ret
5997;
5998; RV32IA-LABEL: atomicrmw_and_i16_seq_cst:
5999; RV32IA:       # %bb.0:
6000; RV32IA-NEXT:    andi a2, a0, -4
6001; RV32IA-NEXT:    slli a0, a0, 3
6002; RV32IA-NEXT:    lui a3, 16
6003; RV32IA-NEXT:    addi a3, a3, -1
6004; RV32IA-NEXT:    sll a4, a3, a0
6005; RV32IA-NEXT:    not a4, a4
6006; RV32IA-NEXT:    and a1, a1, a3
6007; RV32IA-NEXT:    sll a1, a1, a0
6008; RV32IA-NEXT:    or a1, a4, a1
6009; RV32IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
6010; RV32IA-NEXT:    srl a0, a1, a0
6011; RV32IA-NEXT:    ret
6012;
6013; RV64I-LABEL: atomicrmw_and_i16_seq_cst:
6014; RV64I:       # %bb.0:
6015; RV64I-NEXT:    addi sp, sp, -16
6016; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6017; RV64I-NEXT:    li a2, 5
6018; RV64I-NEXT:    call __atomic_fetch_and_2@plt
6019; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6020; RV64I-NEXT:    addi sp, sp, 16
6021; RV64I-NEXT:    ret
6022;
6023; RV64IA-LABEL: atomicrmw_and_i16_seq_cst:
6024; RV64IA:       # %bb.0:
6025; RV64IA-NEXT:    andi a2, a0, -4
6026; RV64IA-NEXT:    slliw a0, a0, 3
6027; RV64IA-NEXT:    lui a3, 16
6028; RV64IA-NEXT:    addiw a3, a3, -1
6029; RV64IA-NEXT:    sllw a4, a3, a0
6030; RV64IA-NEXT:    not a4, a4
6031; RV64IA-NEXT:    and a1, a1, a3
6032; RV64IA-NEXT:    sllw a1, a1, a0
6033; RV64IA-NEXT:    or a1, a4, a1
6034; RV64IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
6035; RV64IA-NEXT:    srlw a0, a1, a0
6036; RV64IA-NEXT:    ret
6037  %1 = atomicrmw and i16* %a, i16 %b seq_cst
6038  ret i16 %1
6039}
6040
6041define i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) nounwind {
6042; RV32I-LABEL: atomicrmw_nand_i16_monotonic:
6043; RV32I:       # %bb.0:
6044; RV32I-NEXT:    addi sp, sp, -16
6045; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6046; RV32I-NEXT:    li a2, 0
6047; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6048; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6049; RV32I-NEXT:    addi sp, sp, 16
6050; RV32I-NEXT:    ret
6051;
6052; RV32IA-LABEL: atomicrmw_nand_i16_monotonic:
6053; RV32IA:       # %bb.0:
6054; RV32IA-NEXT:    andi a2, a0, -4
6055; RV32IA-NEXT:    slli a0, a0, 3
6056; RV32IA-NEXT:    lui a3, 16
6057; RV32IA-NEXT:    addi a3, a3, -1
6058; RV32IA-NEXT:    sll a4, a3, a0
6059; RV32IA-NEXT:    and a1, a1, a3
6060; RV32IA-NEXT:    sll a1, a1, a0
6061; RV32IA-NEXT:  .LBB75_1: # =>This Inner Loop Header: Depth=1
6062; RV32IA-NEXT:    lr.w a3, (a2)
6063; RV32IA-NEXT:    and a5, a3, a1
6064; RV32IA-NEXT:    not a5, a5
6065; RV32IA-NEXT:    xor a5, a3, a5
6066; RV32IA-NEXT:    and a5, a5, a4
6067; RV32IA-NEXT:    xor a5, a3, a5
6068; RV32IA-NEXT:    sc.w a5, a5, (a2)
6069; RV32IA-NEXT:    bnez a5, .LBB75_1
6070; RV32IA-NEXT:  # %bb.2:
6071; RV32IA-NEXT:    srl a0, a3, a0
6072; RV32IA-NEXT:    ret
6073;
6074; RV64I-LABEL: atomicrmw_nand_i16_monotonic:
6075; RV64I:       # %bb.0:
6076; RV64I-NEXT:    addi sp, sp, -16
6077; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6078; RV64I-NEXT:    li a2, 0
6079; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6080; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6081; RV64I-NEXT:    addi sp, sp, 16
6082; RV64I-NEXT:    ret
6083;
6084; RV64IA-LABEL: atomicrmw_nand_i16_monotonic:
6085; RV64IA:       # %bb.0:
6086; RV64IA-NEXT:    andi a2, a0, -4
6087; RV64IA-NEXT:    slliw a0, a0, 3
6088; RV64IA-NEXT:    lui a3, 16
6089; RV64IA-NEXT:    addiw a3, a3, -1
6090; RV64IA-NEXT:    sllw a4, a3, a0
6091; RV64IA-NEXT:    and a1, a1, a3
6092; RV64IA-NEXT:    sllw a1, a1, a0
6093; RV64IA-NEXT:  .LBB75_1: # =>This Inner Loop Header: Depth=1
6094; RV64IA-NEXT:    lr.w a3, (a2)
6095; RV64IA-NEXT:    and a5, a3, a1
6096; RV64IA-NEXT:    not a5, a5
6097; RV64IA-NEXT:    xor a5, a3, a5
6098; RV64IA-NEXT:    and a5, a5, a4
6099; RV64IA-NEXT:    xor a5, a3, a5
6100; RV64IA-NEXT:    sc.w a5, a5, (a2)
6101; RV64IA-NEXT:    bnez a5, .LBB75_1
6102; RV64IA-NEXT:  # %bb.2:
6103; RV64IA-NEXT:    srlw a0, a3, a0
6104; RV64IA-NEXT:    ret
6105  %1 = atomicrmw nand i16* %a, i16 %b monotonic
6106  ret i16 %1
6107}
6108
6109define i16 @atomicrmw_nand_i16_acquire(i16* %a, i16 %b) nounwind {
6110; RV32I-LABEL: atomicrmw_nand_i16_acquire:
6111; RV32I:       # %bb.0:
6112; RV32I-NEXT:    addi sp, sp, -16
6113; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6114; RV32I-NEXT:    li a2, 2
6115; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6116; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6117; RV32I-NEXT:    addi sp, sp, 16
6118; RV32I-NEXT:    ret
6119;
6120; RV32IA-LABEL: atomicrmw_nand_i16_acquire:
6121; RV32IA:       # %bb.0:
6122; RV32IA-NEXT:    andi a2, a0, -4
6123; RV32IA-NEXT:    slli a0, a0, 3
6124; RV32IA-NEXT:    lui a3, 16
6125; RV32IA-NEXT:    addi a3, a3, -1
6126; RV32IA-NEXT:    sll a4, a3, a0
6127; RV32IA-NEXT:    and a1, a1, a3
6128; RV32IA-NEXT:    sll a1, a1, a0
6129; RV32IA-NEXT:  .LBB76_1: # =>This Inner Loop Header: Depth=1
6130; RV32IA-NEXT:    lr.w.aq a3, (a2)
6131; RV32IA-NEXT:    and a5, a3, a1
6132; RV32IA-NEXT:    not a5, a5
6133; RV32IA-NEXT:    xor a5, a3, a5
6134; RV32IA-NEXT:    and a5, a5, a4
6135; RV32IA-NEXT:    xor a5, a3, a5
6136; RV32IA-NEXT:    sc.w a5, a5, (a2)
6137; RV32IA-NEXT:    bnez a5, .LBB76_1
6138; RV32IA-NEXT:  # %bb.2:
6139; RV32IA-NEXT:    srl a0, a3, a0
6140; RV32IA-NEXT:    ret
6141;
6142; RV64I-LABEL: atomicrmw_nand_i16_acquire:
6143; RV64I:       # %bb.0:
6144; RV64I-NEXT:    addi sp, sp, -16
6145; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6146; RV64I-NEXT:    li a2, 2
6147; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6148; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6149; RV64I-NEXT:    addi sp, sp, 16
6150; RV64I-NEXT:    ret
6151;
6152; RV64IA-LABEL: atomicrmw_nand_i16_acquire:
6153; RV64IA:       # %bb.0:
6154; RV64IA-NEXT:    andi a2, a0, -4
6155; RV64IA-NEXT:    slliw a0, a0, 3
6156; RV64IA-NEXT:    lui a3, 16
6157; RV64IA-NEXT:    addiw a3, a3, -1
6158; RV64IA-NEXT:    sllw a4, a3, a0
6159; RV64IA-NEXT:    and a1, a1, a3
6160; RV64IA-NEXT:    sllw a1, a1, a0
6161; RV64IA-NEXT:  .LBB76_1: # =>This Inner Loop Header: Depth=1
6162; RV64IA-NEXT:    lr.w.aq a3, (a2)
6163; RV64IA-NEXT:    and a5, a3, a1
6164; RV64IA-NEXT:    not a5, a5
6165; RV64IA-NEXT:    xor a5, a3, a5
6166; RV64IA-NEXT:    and a5, a5, a4
6167; RV64IA-NEXT:    xor a5, a3, a5
6168; RV64IA-NEXT:    sc.w a5, a5, (a2)
6169; RV64IA-NEXT:    bnez a5, .LBB76_1
6170; RV64IA-NEXT:  # %bb.2:
6171; RV64IA-NEXT:    srlw a0, a3, a0
6172; RV64IA-NEXT:    ret
6173  %1 = atomicrmw nand i16* %a, i16 %b acquire
6174  ret i16 %1
6175}
6176
6177define i16 @atomicrmw_nand_i16_release(i16* %a, i16 %b) nounwind {
6178; RV32I-LABEL: atomicrmw_nand_i16_release:
6179; RV32I:       # %bb.0:
6180; RV32I-NEXT:    addi sp, sp, -16
6181; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6182; RV32I-NEXT:    li a2, 3
6183; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6184; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6185; RV32I-NEXT:    addi sp, sp, 16
6186; RV32I-NEXT:    ret
6187;
6188; RV32IA-LABEL: atomicrmw_nand_i16_release:
6189; RV32IA:       # %bb.0:
6190; RV32IA-NEXT:    andi a2, a0, -4
6191; RV32IA-NEXT:    slli a0, a0, 3
6192; RV32IA-NEXT:    lui a3, 16
6193; RV32IA-NEXT:    addi a3, a3, -1
6194; RV32IA-NEXT:    sll a4, a3, a0
6195; RV32IA-NEXT:    and a1, a1, a3
6196; RV32IA-NEXT:    sll a1, a1, a0
6197; RV32IA-NEXT:  .LBB77_1: # =>This Inner Loop Header: Depth=1
6198; RV32IA-NEXT:    lr.w a3, (a2)
6199; RV32IA-NEXT:    and a5, a3, a1
6200; RV32IA-NEXT:    not a5, a5
6201; RV32IA-NEXT:    xor a5, a3, a5
6202; RV32IA-NEXT:    and a5, a5, a4
6203; RV32IA-NEXT:    xor a5, a3, a5
6204; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
6205; RV32IA-NEXT:    bnez a5, .LBB77_1
6206; RV32IA-NEXT:  # %bb.2:
6207; RV32IA-NEXT:    srl a0, a3, a0
6208; RV32IA-NEXT:    ret
6209;
6210; RV64I-LABEL: atomicrmw_nand_i16_release:
6211; RV64I:       # %bb.0:
6212; RV64I-NEXT:    addi sp, sp, -16
6213; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6214; RV64I-NEXT:    li a2, 3
6215; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6216; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6217; RV64I-NEXT:    addi sp, sp, 16
6218; RV64I-NEXT:    ret
6219;
6220; RV64IA-LABEL: atomicrmw_nand_i16_release:
6221; RV64IA:       # %bb.0:
6222; RV64IA-NEXT:    andi a2, a0, -4
6223; RV64IA-NEXT:    slliw a0, a0, 3
6224; RV64IA-NEXT:    lui a3, 16
6225; RV64IA-NEXT:    addiw a3, a3, -1
6226; RV64IA-NEXT:    sllw a4, a3, a0
6227; RV64IA-NEXT:    and a1, a1, a3
6228; RV64IA-NEXT:    sllw a1, a1, a0
6229; RV64IA-NEXT:  .LBB77_1: # =>This Inner Loop Header: Depth=1
6230; RV64IA-NEXT:    lr.w a3, (a2)
6231; RV64IA-NEXT:    and a5, a3, a1
6232; RV64IA-NEXT:    not a5, a5
6233; RV64IA-NEXT:    xor a5, a3, a5
6234; RV64IA-NEXT:    and a5, a5, a4
6235; RV64IA-NEXT:    xor a5, a3, a5
6236; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
6237; RV64IA-NEXT:    bnez a5, .LBB77_1
6238; RV64IA-NEXT:  # %bb.2:
6239; RV64IA-NEXT:    srlw a0, a3, a0
6240; RV64IA-NEXT:    ret
6241  %1 = atomicrmw nand i16* %a, i16 %b release
6242  ret i16 %1
6243}
6244
6245define i16 @atomicrmw_nand_i16_acq_rel(i16* %a, i16 %b) nounwind {
6246; RV32I-LABEL: atomicrmw_nand_i16_acq_rel:
6247; RV32I:       # %bb.0:
6248; RV32I-NEXT:    addi sp, sp, -16
6249; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6250; RV32I-NEXT:    li a2, 4
6251; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6252; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6253; RV32I-NEXT:    addi sp, sp, 16
6254; RV32I-NEXT:    ret
6255;
6256; RV32IA-LABEL: atomicrmw_nand_i16_acq_rel:
6257; RV32IA:       # %bb.0:
6258; RV32IA-NEXT:    andi a2, a0, -4
6259; RV32IA-NEXT:    slli a0, a0, 3
6260; RV32IA-NEXT:    lui a3, 16
6261; RV32IA-NEXT:    addi a3, a3, -1
6262; RV32IA-NEXT:    sll a4, a3, a0
6263; RV32IA-NEXT:    and a1, a1, a3
6264; RV32IA-NEXT:    sll a1, a1, a0
6265; RV32IA-NEXT:  .LBB78_1: # =>This Inner Loop Header: Depth=1
6266; RV32IA-NEXT:    lr.w.aq a3, (a2)
6267; RV32IA-NEXT:    and a5, a3, a1
6268; RV32IA-NEXT:    not a5, a5
6269; RV32IA-NEXT:    xor a5, a3, a5
6270; RV32IA-NEXT:    and a5, a5, a4
6271; RV32IA-NEXT:    xor a5, a3, a5
6272; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
6273; RV32IA-NEXT:    bnez a5, .LBB78_1
6274; RV32IA-NEXT:  # %bb.2:
6275; RV32IA-NEXT:    srl a0, a3, a0
6276; RV32IA-NEXT:    ret
6277;
6278; RV64I-LABEL: atomicrmw_nand_i16_acq_rel:
6279; RV64I:       # %bb.0:
6280; RV64I-NEXT:    addi sp, sp, -16
6281; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6282; RV64I-NEXT:    li a2, 4
6283; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6284; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6285; RV64I-NEXT:    addi sp, sp, 16
6286; RV64I-NEXT:    ret
6287;
6288; RV64IA-LABEL: atomicrmw_nand_i16_acq_rel:
6289; RV64IA:       # %bb.0:
6290; RV64IA-NEXT:    andi a2, a0, -4
6291; RV64IA-NEXT:    slliw a0, a0, 3
6292; RV64IA-NEXT:    lui a3, 16
6293; RV64IA-NEXT:    addiw a3, a3, -1
6294; RV64IA-NEXT:    sllw a4, a3, a0
6295; RV64IA-NEXT:    and a1, a1, a3
6296; RV64IA-NEXT:    sllw a1, a1, a0
6297; RV64IA-NEXT:  .LBB78_1: # =>This Inner Loop Header: Depth=1
6298; RV64IA-NEXT:    lr.w.aq a3, (a2)
6299; RV64IA-NEXT:    and a5, a3, a1
6300; RV64IA-NEXT:    not a5, a5
6301; RV64IA-NEXT:    xor a5, a3, a5
6302; RV64IA-NEXT:    and a5, a5, a4
6303; RV64IA-NEXT:    xor a5, a3, a5
6304; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
6305; RV64IA-NEXT:    bnez a5, .LBB78_1
6306; RV64IA-NEXT:  # %bb.2:
6307; RV64IA-NEXT:    srlw a0, a3, a0
6308; RV64IA-NEXT:    ret
6309  %1 = atomicrmw nand i16* %a, i16 %b acq_rel
6310  ret i16 %1
6311}
6312
6313define i16 @atomicrmw_nand_i16_seq_cst(i16* %a, i16 %b) nounwind {
6314; RV32I-LABEL: atomicrmw_nand_i16_seq_cst:
6315; RV32I:       # %bb.0:
6316; RV32I-NEXT:    addi sp, sp, -16
6317; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6318; RV32I-NEXT:    li a2, 5
6319; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6320; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6321; RV32I-NEXT:    addi sp, sp, 16
6322; RV32I-NEXT:    ret
6323;
6324; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst:
6325; RV32IA:       # %bb.0:
6326; RV32IA-NEXT:    andi a2, a0, -4
6327; RV32IA-NEXT:    slli a0, a0, 3
6328; RV32IA-NEXT:    lui a3, 16
6329; RV32IA-NEXT:    addi a3, a3, -1
6330; RV32IA-NEXT:    sll a4, a3, a0
6331; RV32IA-NEXT:    and a1, a1, a3
6332; RV32IA-NEXT:    sll a1, a1, a0
6333; RV32IA-NEXT:  .LBB79_1: # =>This Inner Loop Header: Depth=1
6334; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
6335; RV32IA-NEXT:    and a5, a3, a1
6336; RV32IA-NEXT:    not a5, a5
6337; RV32IA-NEXT:    xor a5, a3, a5
6338; RV32IA-NEXT:    and a5, a5, a4
6339; RV32IA-NEXT:    xor a5, a3, a5
6340; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
6341; RV32IA-NEXT:    bnez a5, .LBB79_1
6342; RV32IA-NEXT:  # %bb.2:
6343; RV32IA-NEXT:    srl a0, a3, a0
6344; RV32IA-NEXT:    ret
6345;
6346; RV64I-LABEL: atomicrmw_nand_i16_seq_cst:
6347; RV64I:       # %bb.0:
6348; RV64I-NEXT:    addi sp, sp, -16
6349; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6350; RV64I-NEXT:    li a2, 5
6351; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6352; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6353; RV64I-NEXT:    addi sp, sp, 16
6354; RV64I-NEXT:    ret
6355;
6356; RV64IA-LABEL: atomicrmw_nand_i16_seq_cst:
6357; RV64IA:       # %bb.0:
6358; RV64IA-NEXT:    andi a2, a0, -4
6359; RV64IA-NEXT:    slliw a0, a0, 3
6360; RV64IA-NEXT:    lui a3, 16
6361; RV64IA-NEXT:    addiw a3, a3, -1
6362; RV64IA-NEXT:    sllw a4, a3, a0
6363; RV64IA-NEXT:    and a1, a1, a3
6364; RV64IA-NEXT:    sllw a1, a1, a0
6365; RV64IA-NEXT:  .LBB79_1: # =>This Inner Loop Header: Depth=1
6366; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
6367; RV64IA-NEXT:    and a5, a3, a1
6368; RV64IA-NEXT:    not a5, a5
6369; RV64IA-NEXT:    xor a5, a3, a5
6370; RV64IA-NEXT:    and a5, a5, a4
6371; RV64IA-NEXT:    xor a5, a3, a5
6372; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
6373; RV64IA-NEXT:    bnez a5, .LBB79_1
6374; RV64IA-NEXT:  # %bb.2:
6375; RV64IA-NEXT:    srlw a0, a3, a0
6376; RV64IA-NEXT:    ret
6377  %1 = atomicrmw nand i16* %a, i16 %b seq_cst
6378  ret i16 %1
6379}
6380
6381define i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind {
6382; RV32I-LABEL: atomicrmw_or_i16_monotonic:
6383; RV32I:       # %bb.0:
6384; RV32I-NEXT:    addi sp, sp, -16
6385; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6386; RV32I-NEXT:    li a2, 0
6387; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6388; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6389; RV32I-NEXT:    addi sp, sp, 16
6390; RV32I-NEXT:    ret
6391;
6392; RV32IA-LABEL: atomicrmw_or_i16_monotonic:
6393; RV32IA:       # %bb.0:
6394; RV32IA-NEXT:    andi a2, a0, -4
6395; RV32IA-NEXT:    slli a0, a0, 3
6396; RV32IA-NEXT:    slli a1, a1, 16
6397; RV32IA-NEXT:    srli a1, a1, 16
6398; RV32IA-NEXT:    sll a1, a1, a0
6399; RV32IA-NEXT:    amoor.w a1, a1, (a2)
6400; RV32IA-NEXT:    srl a0, a1, a0
6401; RV32IA-NEXT:    ret
6402;
6403; RV64I-LABEL: atomicrmw_or_i16_monotonic:
6404; RV64I:       # %bb.0:
6405; RV64I-NEXT:    addi sp, sp, -16
6406; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6407; RV64I-NEXT:    li a2, 0
6408; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6409; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6410; RV64I-NEXT:    addi sp, sp, 16
6411; RV64I-NEXT:    ret
6412;
6413; RV64IA-LABEL: atomicrmw_or_i16_monotonic:
6414; RV64IA:       # %bb.0:
6415; RV64IA-NEXT:    andi a2, a0, -4
6416; RV64IA-NEXT:    slliw a0, a0, 3
6417; RV64IA-NEXT:    slli a1, a1, 48
6418; RV64IA-NEXT:    srli a1, a1, 48
6419; RV64IA-NEXT:    sllw a1, a1, a0
6420; RV64IA-NEXT:    amoor.w a1, a1, (a2)
6421; RV64IA-NEXT:    srlw a0, a1, a0
6422; RV64IA-NEXT:    ret
6423  %1 = atomicrmw or i16* %a, i16 %b monotonic
6424  ret i16 %1
6425}
6426
6427define i16 @atomicrmw_or_i16_acquire(i16 *%a, i16 %b) nounwind {
6428; RV32I-LABEL: atomicrmw_or_i16_acquire:
6429; RV32I:       # %bb.0:
6430; RV32I-NEXT:    addi sp, sp, -16
6431; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6432; RV32I-NEXT:    li a2, 2
6433; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6434; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6435; RV32I-NEXT:    addi sp, sp, 16
6436; RV32I-NEXT:    ret
6437;
6438; RV32IA-LABEL: atomicrmw_or_i16_acquire:
6439; RV32IA:       # %bb.0:
6440; RV32IA-NEXT:    andi a2, a0, -4
6441; RV32IA-NEXT:    slli a0, a0, 3
6442; RV32IA-NEXT:    slli a1, a1, 16
6443; RV32IA-NEXT:    srli a1, a1, 16
6444; RV32IA-NEXT:    sll a1, a1, a0
6445; RV32IA-NEXT:    amoor.w.aq a1, a1, (a2)
6446; RV32IA-NEXT:    srl a0, a1, a0
6447; RV32IA-NEXT:    ret
6448;
6449; RV64I-LABEL: atomicrmw_or_i16_acquire:
6450; RV64I:       # %bb.0:
6451; RV64I-NEXT:    addi sp, sp, -16
6452; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6453; RV64I-NEXT:    li a2, 2
6454; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6455; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6456; RV64I-NEXT:    addi sp, sp, 16
6457; RV64I-NEXT:    ret
6458;
6459; RV64IA-LABEL: atomicrmw_or_i16_acquire:
6460; RV64IA:       # %bb.0:
6461; RV64IA-NEXT:    andi a2, a0, -4
6462; RV64IA-NEXT:    slliw a0, a0, 3
6463; RV64IA-NEXT:    slli a1, a1, 48
6464; RV64IA-NEXT:    srli a1, a1, 48
6465; RV64IA-NEXT:    sllw a1, a1, a0
6466; RV64IA-NEXT:    amoor.w.aq a1, a1, (a2)
6467; RV64IA-NEXT:    srlw a0, a1, a0
6468; RV64IA-NEXT:    ret
6469  %1 = atomicrmw or i16* %a, i16 %b acquire
6470  ret i16 %1
6471}
6472
6473define i16 @atomicrmw_or_i16_release(i16 *%a, i16 %b) nounwind {
6474; RV32I-LABEL: atomicrmw_or_i16_release:
6475; RV32I:       # %bb.0:
6476; RV32I-NEXT:    addi sp, sp, -16
6477; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6478; RV32I-NEXT:    li a2, 3
6479; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6480; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6481; RV32I-NEXT:    addi sp, sp, 16
6482; RV32I-NEXT:    ret
6483;
6484; RV32IA-LABEL: atomicrmw_or_i16_release:
6485; RV32IA:       # %bb.0:
6486; RV32IA-NEXT:    andi a2, a0, -4
6487; RV32IA-NEXT:    slli a0, a0, 3
6488; RV32IA-NEXT:    slli a1, a1, 16
6489; RV32IA-NEXT:    srli a1, a1, 16
6490; RV32IA-NEXT:    sll a1, a1, a0
6491; RV32IA-NEXT:    amoor.w.rl a1, a1, (a2)
6492; RV32IA-NEXT:    srl a0, a1, a0
6493; RV32IA-NEXT:    ret
6494;
6495; RV64I-LABEL: atomicrmw_or_i16_release:
6496; RV64I:       # %bb.0:
6497; RV64I-NEXT:    addi sp, sp, -16
6498; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6499; RV64I-NEXT:    li a2, 3
6500; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6501; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6502; RV64I-NEXT:    addi sp, sp, 16
6503; RV64I-NEXT:    ret
6504;
6505; RV64IA-LABEL: atomicrmw_or_i16_release:
6506; RV64IA:       # %bb.0:
6507; RV64IA-NEXT:    andi a2, a0, -4
6508; RV64IA-NEXT:    slliw a0, a0, 3
6509; RV64IA-NEXT:    slli a1, a1, 48
6510; RV64IA-NEXT:    srli a1, a1, 48
6511; RV64IA-NEXT:    sllw a1, a1, a0
6512; RV64IA-NEXT:    amoor.w.rl a1, a1, (a2)
6513; RV64IA-NEXT:    srlw a0, a1, a0
6514; RV64IA-NEXT:    ret
6515  %1 = atomicrmw or i16* %a, i16 %b release
6516  ret i16 %1
6517}
6518
6519define i16 @atomicrmw_or_i16_acq_rel(i16 *%a, i16 %b) nounwind {
6520; RV32I-LABEL: atomicrmw_or_i16_acq_rel:
6521; RV32I:       # %bb.0:
6522; RV32I-NEXT:    addi sp, sp, -16
6523; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6524; RV32I-NEXT:    li a2, 4
6525; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6526; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6527; RV32I-NEXT:    addi sp, sp, 16
6528; RV32I-NEXT:    ret
6529;
6530; RV32IA-LABEL: atomicrmw_or_i16_acq_rel:
6531; RV32IA:       # %bb.0:
6532; RV32IA-NEXT:    andi a2, a0, -4
6533; RV32IA-NEXT:    slli a0, a0, 3
6534; RV32IA-NEXT:    slli a1, a1, 16
6535; RV32IA-NEXT:    srli a1, a1, 16
6536; RV32IA-NEXT:    sll a1, a1, a0
6537; RV32IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6538; RV32IA-NEXT:    srl a0, a1, a0
6539; RV32IA-NEXT:    ret
6540;
6541; RV64I-LABEL: atomicrmw_or_i16_acq_rel:
6542; RV64I:       # %bb.0:
6543; RV64I-NEXT:    addi sp, sp, -16
6544; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6545; RV64I-NEXT:    li a2, 4
6546; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6547; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6548; RV64I-NEXT:    addi sp, sp, 16
6549; RV64I-NEXT:    ret
6550;
6551; RV64IA-LABEL: atomicrmw_or_i16_acq_rel:
6552; RV64IA:       # %bb.0:
6553; RV64IA-NEXT:    andi a2, a0, -4
6554; RV64IA-NEXT:    slliw a0, a0, 3
6555; RV64IA-NEXT:    slli a1, a1, 48
6556; RV64IA-NEXT:    srli a1, a1, 48
6557; RV64IA-NEXT:    sllw a1, a1, a0
6558; RV64IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6559; RV64IA-NEXT:    srlw a0, a1, a0
6560; RV64IA-NEXT:    ret
6561  %1 = atomicrmw or i16* %a, i16 %b acq_rel
6562  ret i16 %1
6563}
6564
6565define i16 @atomicrmw_or_i16_seq_cst(i16 *%a, i16 %b) nounwind {
6566; RV32I-LABEL: atomicrmw_or_i16_seq_cst:
6567; RV32I:       # %bb.0:
6568; RV32I-NEXT:    addi sp, sp, -16
6569; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6570; RV32I-NEXT:    li a2, 5
6571; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6572; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6573; RV32I-NEXT:    addi sp, sp, 16
6574; RV32I-NEXT:    ret
6575;
6576; RV32IA-LABEL: atomicrmw_or_i16_seq_cst:
6577; RV32IA:       # %bb.0:
6578; RV32IA-NEXT:    andi a2, a0, -4
6579; RV32IA-NEXT:    slli a0, a0, 3
6580; RV32IA-NEXT:    slli a1, a1, 16
6581; RV32IA-NEXT:    srli a1, a1, 16
6582; RV32IA-NEXT:    sll a1, a1, a0
6583; RV32IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6584; RV32IA-NEXT:    srl a0, a1, a0
6585; RV32IA-NEXT:    ret
6586;
6587; RV64I-LABEL: atomicrmw_or_i16_seq_cst:
6588; RV64I:       # %bb.0:
6589; RV64I-NEXT:    addi sp, sp, -16
6590; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6591; RV64I-NEXT:    li a2, 5
6592; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6593; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6594; RV64I-NEXT:    addi sp, sp, 16
6595; RV64I-NEXT:    ret
6596;
6597; RV64IA-LABEL: atomicrmw_or_i16_seq_cst:
6598; RV64IA:       # %bb.0:
6599; RV64IA-NEXT:    andi a2, a0, -4
6600; RV64IA-NEXT:    slliw a0, a0, 3
6601; RV64IA-NEXT:    slli a1, a1, 48
6602; RV64IA-NEXT:    srli a1, a1, 48
6603; RV64IA-NEXT:    sllw a1, a1, a0
6604; RV64IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6605; RV64IA-NEXT:    srlw a0, a1, a0
6606; RV64IA-NEXT:    ret
6607  %1 = atomicrmw or i16* %a, i16 %b seq_cst
6608  ret i16 %1
6609}
6610
6611define i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind {
6612; RV32I-LABEL: atomicrmw_xor_i16_monotonic:
6613; RV32I:       # %bb.0:
6614; RV32I-NEXT:    addi sp, sp, -16
6615; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6616; RV32I-NEXT:    li a2, 0
6617; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6618; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6619; RV32I-NEXT:    addi sp, sp, 16
6620; RV32I-NEXT:    ret
6621;
6622; RV32IA-LABEL: atomicrmw_xor_i16_monotonic:
6623; RV32IA:       # %bb.0:
6624; RV32IA-NEXT:    andi a2, a0, -4
6625; RV32IA-NEXT:    slli a0, a0, 3
6626; RV32IA-NEXT:    slli a1, a1, 16
6627; RV32IA-NEXT:    srli a1, a1, 16
6628; RV32IA-NEXT:    sll a1, a1, a0
6629; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
6630; RV32IA-NEXT:    srl a0, a1, a0
6631; RV32IA-NEXT:    ret
6632;
6633; RV64I-LABEL: atomicrmw_xor_i16_monotonic:
6634; RV64I:       # %bb.0:
6635; RV64I-NEXT:    addi sp, sp, -16
6636; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6637; RV64I-NEXT:    li a2, 0
6638; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6639; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6640; RV64I-NEXT:    addi sp, sp, 16
6641; RV64I-NEXT:    ret
6642;
6643; RV64IA-LABEL: atomicrmw_xor_i16_monotonic:
6644; RV64IA:       # %bb.0:
6645; RV64IA-NEXT:    andi a2, a0, -4
6646; RV64IA-NEXT:    slliw a0, a0, 3
6647; RV64IA-NEXT:    slli a1, a1, 48
6648; RV64IA-NEXT:    srli a1, a1, 48
6649; RV64IA-NEXT:    sllw a1, a1, a0
6650; RV64IA-NEXT:    amoxor.w a1, a1, (a2)
6651; RV64IA-NEXT:    srlw a0, a1, a0
6652; RV64IA-NEXT:    ret
6653  %1 = atomicrmw xor i16* %a, i16 %b monotonic
6654  ret i16 %1
6655}
6656
6657define i16 @atomicrmw_xor_i16_acquire(i16 *%a, i16 %b) nounwind {
6658; RV32I-LABEL: atomicrmw_xor_i16_acquire:
6659; RV32I:       # %bb.0:
6660; RV32I-NEXT:    addi sp, sp, -16
6661; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6662; RV32I-NEXT:    li a2, 2
6663; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6664; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6665; RV32I-NEXT:    addi sp, sp, 16
6666; RV32I-NEXT:    ret
6667;
6668; RV32IA-LABEL: atomicrmw_xor_i16_acquire:
6669; RV32IA:       # %bb.0:
6670; RV32IA-NEXT:    andi a2, a0, -4
6671; RV32IA-NEXT:    slli a0, a0, 3
6672; RV32IA-NEXT:    slli a1, a1, 16
6673; RV32IA-NEXT:    srli a1, a1, 16
6674; RV32IA-NEXT:    sll a1, a1, a0
6675; RV32IA-NEXT:    amoxor.w.aq a1, a1, (a2)
6676; RV32IA-NEXT:    srl a0, a1, a0
6677; RV32IA-NEXT:    ret
6678;
6679; RV64I-LABEL: atomicrmw_xor_i16_acquire:
6680; RV64I:       # %bb.0:
6681; RV64I-NEXT:    addi sp, sp, -16
6682; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6683; RV64I-NEXT:    li a2, 2
6684; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6685; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6686; RV64I-NEXT:    addi sp, sp, 16
6687; RV64I-NEXT:    ret
6688;
6689; RV64IA-LABEL: atomicrmw_xor_i16_acquire:
6690; RV64IA:       # %bb.0:
6691; RV64IA-NEXT:    andi a2, a0, -4
6692; RV64IA-NEXT:    slliw a0, a0, 3
6693; RV64IA-NEXT:    slli a1, a1, 48
6694; RV64IA-NEXT:    srli a1, a1, 48
6695; RV64IA-NEXT:    sllw a1, a1, a0
6696; RV64IA-NEXT:    amoxor.w.aq a1, a1, (a2)
6697; RV64IA-NEXT:    srlw a0, a1, a0
6698; RV64IA-NEXT:    ret
6699  %1 = atomicrmw xor i16* %a, i16 %b acquire
6700  ret i16 %1
6701}
6702
6703define i16 @atomicrmw_xor_i16_release(i16 *%a, i16 %b) nounwind {
6704; RV32I-LABEL: atomicrmw_xor_i16_release:
6705; RV32I:       # %bb.0:
6706; RV32I-NEXT:    addi sp, sp, -16
6707; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6708; RV32I-NEXT:    li a2, 3
6709; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6710; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6711; RV32I-NEXT:    addi sp, sp, 16
6712; RV32I-NEXT:    ret
6713;
6714; RV32IA-LABEL: atomicrmw_xor_i16_release:
6715; RV32IA:       # %bb.0:
6716; RV32IA-NEXT:    andi a2, a0, -4
6717; RV32IA-NEXT:    slli a0, a0, 3
6718; RV32IA-NEXT:    slli a1, a1, 16
6719; RV32IA-NEXT:    srli a1, a1, 16
6720; RV32IA-NEXT:    sll a1, a1, a0
6721; RV32IA-NEXT:    amoxor.w.rl a1, a1, (a2)
6722; RV32IA-NEXT:    srl a0, a1, a0
6723; RV32IA-NEXT:    ret
6724;
6725; RV64I-LABEL: atomicrmw_xor_i16_release:
6726; RV64I:       # %bb.0:
6727; RV64I-NEXT:    addi sp, sp, -16
6728; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6729; RV64I-NEXT:    li a2, 3
6730; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6731; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6732; RV64I-NEXT:    addi sp, sp, 16
6733; RV64I-NEXT:    ret
6734;
6735; RV64IA-LABEL: atomicrmw_xor_i16_release:
6736; RV64IA:       # %bb.0:
6737; RV64IA-NEXT:    andi a2, a0, -4
6738; RV64IA-NEXT:    slliw a0, a0, 3
6739; RV64IA-NEXT:    slli a1, a1, 48
6740; RV64IA-NEXT:    srli a1, a1, 48
6741; RV64IA-NEXT:    sllw a1, a1, a0
6742; RV64IA-NEXT:    amoxor.w.rl a1, a1, (a2)
6743; RV64IA-NEXT:    srlw a0, a1, a0
6744; RV64IA-NEXT:    ret
6745  %1 = atomicrmw xor i16* %a, i16 %b release
6746  ret i16 %1
6747}
6748
6749define i16 @atomicrmw_xor_i16_acq_rel(i16 *%a, i16 %b) nounwind {
6750; RV32I-LABEL: atomicrmw_xor_i16_acq_rel:
6751; RV32I:       # %bb.0:
6752; RV32I-NEXT:    addi sp, sp, -16
6753; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6754; RV32I-NEXT:    li a2, 4
6755; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6756; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6757; RV32I-NEXT:    addi sp, sp, 16
6758; RV32I-NEXT:    ret
6759;
6760; RV32IA-LABEL: atomicrmw_xor_i16_acq_rel:
6761; RV32IA:       # %bb.0:
6762; RV32IA-NEXT:    andi a2, a0, -4
6763; RV32IA-NEXT:    slli a0, a0, 3
6764; RV32IA-NEXT:    slli a1, a1, 16
6765; RV32IA-NEXT:    srli a1, a1, 16
6766; RV32IA-NEXT:    sll a1, a1, a0
6767; RV32IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6768; RV32IA-NEXT:    srl a0, a1, a0
6769; RV32IA-NEXT:    ret
6770;
6771; RV64I-LABEL: atomicrmw_xor_i16_acq_rel:
6772; RV64I:       # %bb.0:
6773; RV64I-NEXT:    addi sp, sp, -16
6774; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6775; RV64I-NEXT:    li a2, 4
6776; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6777; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6778; RV64I-NEXT:    addi sp, sp, 16
6779; RV64I-NEXT:    ret
6780;
6781; RV64IA-LABEL: atomicrmw_xor_i16_acq_rel:
6782; RV64IA:       # %bb.0:
6783; RV64IA-NEXT:    andi a2, a0, -4
6784; RV64IA-NEXT:    slliw a0, a0, 3
6785; RV64IA-NEXT:    slli a1, a1, 48
6786; RV64IA-NEXT:    srli a1, a1, 48
6787; RV64IA-NEXT:    sllw a1, a1, a0
6788; RV64IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6789; RV64IA-NEXT:    srlw a0, a1, a0
6790; RV64IA-NEXT:    ret
6791  %1 = atomicrmw xor i16* %a, i16 %b acq_rel
6792  ret i16 %1
6793}
6794
6795define i16 @atomicrmw_xor_i16_seq_cst(i16 *%a, i16 %b) nounwind {
6796; RV32I-LABEL: atomicrmw_xor_i16_seq_cst:
6797; RV32I:       # %bb.0:
6798; RV32I-NEXT:    addi sp, sp, -16
6799; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6800; RV32I-NEXT:    li a2, 5
6801; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6802; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6803; RV32I-NEXT:    addi sp, sp, 16
6804; RV32I-NEXT:    ret
6805;
6806; RV32IA-LABEL: atomicrmw_xor_i16_seq_cst:
6807; RV32IA:       # %bb.0:
6808; RV32IA-NEXT:    andi a2, a0, -4
6809; RV32IA-NEXT:    slli a0, a0, 3
6810; RV32IA-NEXT:    slli a1, a1, 16
6811; RV32IA-NEXT:    srli a1, a1, 16
6812; RV32IA-NEXT:    sll a1, a1, a0
6813; RV32IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6814; RV32IA-NEXT:    srl a0, a1, a0
6815; RV32IA-NEXT:    ret
6816;
6817; RV64I-LABEL: atomicrmw_xor_i16_seq_cst:
6818; RV64I:       # %bb.0:
6819; RV64I-NEXT:    addi sp, sp, -16
6820; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6821; RV64I-NEXT:    li a2, 5
6822; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6823; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6824; RV64I-NEXT:    addi sp, sp, 16
6825; RV64I-NEXT:    ret
6826;
6827; RV64IA-LABEL: atomicrmw_xor_i16_seq_cst:
6828; RV64IA:       # %bb.0:
6829; RV64IA-NEXT:    andi a2, a0, -4
6830; RV64IA-NEXT:    slliw a0, a0, 3
6831; RV64IA-NEXT:    slli a1, a1, 48
6832; RV64IA-NEXT:    srli a1, a1, 48
6833; RV64IA-NEXT:    sllw a1, a1, a0
6834; RV64IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6835; RV64IA-NEXT:    srlw a0, a1, a0
6836; RV64IA-NEXT:    ret
6837  %1 = atomicrmw xor i16* %a, i16 %b seq_cst
6838  ret i16 %1
6839}
6840
6841define i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind {
6842; RV32I-LABEL: atomicrmw_max_i16_monotonic:
6843; RV32I:       # %bb.0:
6844; RV32I-NEXT:    addi sp, sp, -32
6845; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6846; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6847; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6848; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6849; RV32I-NEXT:    mv s0, a0
6850; RV32I-NEXT:    lhu a3, 0(a0)
6851; RV32I-NEXT:    mv s1, a1
6852; RV32I-NEXT:    slli a0, a1, 16
6853; RV32I-NEXT:    srai s2, a0, 16
6854; RV32I-NEXT:    j .LBB90_2
6855; RV32I-NEXT:  .LBB90_1: # %atomicrmw.start
6856; RV32I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6857; RV32I-NEXT:    sh a3, 14(sp)
6858; RV32I-NEXT:    addi a1, sp, 14
6859; RV32I-NEXT:    mv a0, s0
6860; RV32I-NEXT:    li a3, 0
6861; RV32I-NEXT:    li a4, 0
6862; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
6863; RV32I-NEXT:    lh a3, 14(sp)
6864; RV32I-NEXT:    bnez a0, .LBB90_4
6865; RV32I-NEXT:  .LBB90_2: # %atomicrmw.start
6866; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
6867; RV32I-NEXT:    slli a0, a3, 16
6868; RV32I-NEXT:    srai a0, a0, 16
6869; RV32I-NEXT:    mv a2, a3
6870; RV32I-NEXT:    blt s2, a0, .LBB90_1
6871; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
6872; RV32I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6873; RV32I-NEXT:    mv a2, s1
6874; RV32I-NEXT:    j .LBB90_1
6875; RV32I-NEXT:  .LBB90_4: # %atomicrmw.end
6876; RV32I-NEXT:    mv a0, a3
6877; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
6878; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
6879; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
6880; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
6881; RV32I-NEXT:    addi sp, sp, 32
6882; RV32I-NEXT:    ret
6883;
6884; RV32IA-LABEL: atomicrmw_max_i16_monotonic:
6885; RV32IA:       # %bb.0:
6886; RV32IA-NEXT:    andi a2, a0, -4
6887; RV32IA-NEXT:    slli a0, a0, 3
6888; RV32IA-NEXT:    andi a3, a0, 24
6889; RV32IA-NEXT:    lui a4, 16
6890; RV32IA-NEXT:    addi a4, a4, -1
6891; RV32IA-NEXT:    sll a4, a4, a0
6892; RV32IA-NEXT:    slli a1, a1, 16
6893; RV32IA-NEXT:    srai a1, a1, 16
6894; RV32IA-NEXT:    sll a1, a1, a0
6895; RV32IA-NEXT:    li a5, 16
6896; RV32IA-NEXT:    sub a3, a5, a3
6897; RV32IA-NEXT:  .LBB90_1: # =>This Inner Loop Header: Depth=1
6898; RV32IA-NEXT:    lr.w a5, (a2)
6899; RV32IA-NEXT:    and a7, a5, a4
6900; RV32IA-NEXT:    mv a6, a5
6901; RV32IA-NEXT:    sll a7, a7, a3
6902; RV32IA-NEXT:    sra a7, a7, a3
6903; RV32IA-NEXT:    bge a7, a1, .LBB90_3
6904; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB90_1 Depth=1
6905; RV32IA-NEXT:    xor a6, a5, a1
6906; RV32IA-NEXT:    and a6, a6, a4
6907; RV32IA-NEXT:    xor a6, a5, a6
6908; RV32IA-NEXT:  .LBB90_3: # in Loop: Header=BB90_1 Depth=1
6909; RV32IA-NEXT:    sc.w a6, a6, (a2)
6910; RV32IA-NEXT:    bnez a6, .LBB90_1
6911; RV32IA-NEXT:  # %bb.4:
6912; RV32IA-NEXT:    srl a0, a5, a0
6913; RV32IA-NEXT:    ret
6914;
6915; RV64I-LABEL: atomicrmw_max_i16_monotonic:
6916; RV64I:       # %bb.0:
6917; RV64I-NEXT:    addi sp, sp, -48
6918; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
6919; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
6920; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
6921; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
6922; RV64I-NEXT:    mv s0, a0
6923; RV64I-NEXT:    lhu a3, 0(a0)
6924; RV64I-NEXT:    mv s1, a1
6925; RV64I-NEXT:    slli a0, a1, 48
6926; RV64I-NEXT:    srai s2, a0, 48
6927; RV64I-NEXT:    j .LBB90_2
6928; RV64I-NEXT:  .LBB90_1: # %atomicrmw.start
6929; RV64I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6930; RV64I-NEXT:    sh a3, 14(sp)
6931; RV64I-NEXT:    addi a1, sp, 14
6932; RV64I-NEXT:    mv a0, s0
6933; RV64I-NEXT:    li a3, 0
6934; RV64I-NEXT:    li a4, 0
6935; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
6936; RV64I-NEXT:    lh a3, 14(sp)
6937; RV64I-NEXT:    bnez a0, .LBB90_4
6938; RV64I-NEXT:  .LBB90_2: # %atomicrmw.start
6939; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
6940; RV64I-NEXT:    slli a0, a3, 48
6941; RV64I-NEXT:    srai a0, a0, 48
6942; RV64I-NEXT:    mv a2, a3
6943; RV64I-NEXT:    blt s2, a0, .LBB90_1
6944; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
6945; RV64I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6946; RV64I-NEXT:    mv a2, s1
6947; RV64I-NEXT:    j .LBB90_1
6948; RV64I-NEXT:  .LBB90_4: # %atomicrmw.end
6949; RV64I-NEXT:    mv a0, a3
6950; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
6951; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
6952; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
6953; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
6954; RV64I-NEXT:    addi sp, sp, 48
6955; RV64I-NEXT:    ret
6956;
6957; RV64IA-LABEL: atomicrmw_max_i16_monotonic:
6958; RV64IA:       # %bb.0:
6959; RV64IA-NEXT:    andi a2, a0, -4
6960; RV64IA-NEXT:    slliw a0, a0, 3
6961; RV64IA-NEXT:    andi a3, a0, 24
6962; RV64IA-NEXT:    lui a4, 16
6963; RV64IA-NEXT:    addiw a4, a4, -1
6964; RV64IA-NEXT:    sllw a4, a4, a0
6965; RV64IA-NEXT:    slli a1, a1, 48
6966; RV64IA-NEXT:    srai a1, a1, 48
6967; RV64IA-NEXT:    sllw a1, a1, a0
6968; RV64IA-NEXT:    li a5, 48
6969; RV64IA-NEXT:    sub a3, a5, a3
6970; RV64IA-NEXT:  .LBB90_1: # =>This Inner Loop Header: Depth=1
6971; RV64IA-NEXT:    lr.w a5, (a2)
6972; RV64IA-NEXT:    and a7, a5, a4
6973; RV64IA-NEXT:    mv a6, a5
6974; RV64IA-NEXT:    sll a7, a7, a3
6975; RV64IA-NEXT:    sra a7, a7, a3
6976; RV64IA-NEXT:    bge a7, a1, .LBB90_3
6977; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB90_1 Depth=1
6978; RV64IA-NEXT:    xor a6, a5, a1
6979; RV64IA-NEXT:    and a6, a6, a4
6980; RV64IA-NEXT:    xor a6, a5, a6
6981; RV64IA-NEXT:  .LBB90_3: # in Loop: Header=BB90_1 Depth=1
6982; RV64IA-NEXT:    sc.w a6, a6, (a2)
6983; RV64IA-NEXT:    bnez a6, .LBB90_1
6984; RV64IA-NEXT:  # %bb.4:
6985; RV64IA-NEXT:    srlw a0, a5, a0
6986; RV64IA-NEXT:    ret
6987  %1 = atomicrmw max i16* %a, i16 %b monotonic
6988  ret i16 %1
6989}
6990
6991define i16 @atomicrmw_max_i16_acquire(i16 *%a, i16 %b) nounwind {
6992; RV32I-LABEL: atomicrmw_max_i16_acquire:
6993; RV32I:       # %bb.0:
6994; RV32I-NEXT:    addi sp, sp, -32
6995; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6996; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6997; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6998; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6999; RV32I-NEXT:    mv s0, a0
7000; RV32I-NEXT:    lhu a3, 0(a0)
7001; RV32I-NEXT:    mv s1, a1
7002; RV32I-NEXT:    slli a0, a1, 16
7003; RV32I-NEXT:    srai s2, a0, 16
7004; RV32I-NEXT:    j .LBB91_2
7005; RV32I-NEXT:  .LBB91_1: # %atomicrmw.start
7006; RV32I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7007; RV32I-NEXT:    sh a3, 14(sp)
7008; RV32I-NEXT:    addi a1, sp, 14
7009; RV32I-NEXT:    li a3, 2
7010; RV32I-NEXT:    li a4, 2
7011; RV32I-NEXT:    mv a0, s0
7012; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7013; RV32I-NEXT:    lh a3, 14(sp)
7014; RV32I-NEXT:    bnez a0, .LBB91_4
7015; RV32I-NEXT:  .LBB91_2: # %atomicrmw.start
7016; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7017; RV32I-NEXT:    slli a0, a3, 16
7018; RV32I-NEXT:    srai a0, a0, 16
7019; RV32I-NEXT:    mv a2, a3
7020; RV32I-NEXT:    blt s2, a0, .LBB91_1
7021; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7022; RV32I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7023; RV32I-NEXT:    mv a2, s1
7024; RV32I-NEXT:    j .LBB91_1
7025; RV32I-NEXT:  .LBB91_4: # %atomicrmw.end
7026; RV32I-NEXT:    mv a0, a3
7027; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7028; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7029; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7030; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7031; RV32I-NEXT:    addi sp, sp, 32
7032; RV32I-NEXT:    ret
7033;
7034; RV32IA-LABEL: atomicrmw_max_i16_acquire:
7035; RV32IA:       # %bb.0:
7036; RV32IA-NEXT:    andi a2, a0, -4
7037; RV32IA-NEXT:    slli a0, a0, 3
7038; RV32IA-NEXT:    andi a3, a0, 24
7039; RV32IA-NEXT:    lui a4, 16
7040; RV32IA-NEXT:    addi a4, a4, -1
7041; RV32IA-NEXT:    sll a4, a4, a0
7042; RV32IA-NEXT:    slli a1, a1, 16
7043; RV32IA-NEXT:    srai a1, a1, 16
7044; RV32IA-NEXT:    sll a1, a1, a0
7045; RV32IA-NEXT:    li a5, 16
7046; RV32IA-NEXT:    sub a3, a5, a3
7047; RV32IA-NEXT:  .LBB91_1: # =>This Inner Loop Header: Depth=1
7048; RV32IA-NEXT:    lr.w.aq a5, (a2)
7049; RV32IA-NEXT:    and a7, a5, a4
7050; RV32IA-NEXT:    mv a6, a5
7051; RV32IA-NEXT:    sll a7, a7, a3
7052; RV32IA-NEXT:    sra a7, a7, a3
7053; RV32IA-NEXT:    bge a7, a1, .LBB91_3
7054; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB91_1 Depth=1
7055; RV32IA-NEXT:    xor a6, a5, a1
7056; RV32IA-NEXT:    and a6, a6, a4
7057; RV32IA-NEXT:    xor a6, a5, a6
7058; RV32IA-NEXT:  .LBB91_3: # in Loop: Header=BB91_1 Depth=1
7059; RV32IA-NEXT:    sc.w a6, a6, (a2)
7060; RV32IA-NEXT:    bnez a6, .LBB91_1
7061; RV32IA-NEXT:  # %bb.4:
7062; RV32IA-NEXT:    srl a0, a5, a0
7063; RV32IA-NEXT:    ret
7064;
7065; RV64I-LABEL: atomicrmw_max_i16_acquire:
7066; RV64I:       # %bb.0:
7067; RV64I-NEXT:    addi sp, sp, -48
7068; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7069; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7070; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7071; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7072; RV64I-NEXT:    mv s0, a0
7073; RV64I-NEXT:    lhu a3, 0(a0)
7074; RV64I-NEXT:    mv s1, a1
7075; RV64I-NEXT:    slli a0, a1, 48
7076; RV64I-NEXT:    srai s2, a0, 48
7077; RV64I-NEXT:    j .LBB91_2
7078; RV64I-NEXT:  .LBB91_1: # %atomicrmw.start
7079; RV64I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7080; RV64I-NEXT:    sh a3, 14(sp)
7081; RV64I-NEXT:    addi a1, sp, 14
7082; RV64I-NEXT:    li a3, 2
7083; RV64I-NEXT:    li a4, 2
7084; RV64I-NEXT:    mv a0, s0
7085; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7086; RV64I-NEXT:    lh a3, 14(sp)
7087; RV64I-NEXT:    bnez a0, .LBB91_4
7088; RV64I-NEXT:  .LBB91_2: # %atomicrmw.start
7089; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7090; RV64I-NEXT:    slli a0, a3, 48
7091; RV64I-NEXT:    srai a0, a0, 48
7092; RV64I-NEXT:    mv a2, a3
7093; RV64I-NEXT:    blt s2, a0, .LBB91_1
7094; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7095; RV64I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7096; RV64I-NEXT:    mv a2, s1
7097; RV64I-NEXT:    j .LBB91_1
7098; RV64I-NEXT:  .LBB91_4: # %atomicrmw.end
7099; RV64I-NEXT:    mv a0, a3
7100; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7101; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7102; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7103; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7104; RV64I-NEXT:    addi sp, sp, 48
7105; RV64I-NEXT:    ret
7106;
7107; RV64IA-LABEL: atomicrmw_max_i16_acquire:
7108; RV64IA:       # %bb.0:
7109; RV64IA-NEXT:    andi a2, a0, -4
7110; RV64IA-NEXT:    slliw a0, a0, 3
7111; RV64IA-NEXT:    andi a3, a0, 24
7112; RV64IA-NEXT:    lui a4, 16
7113; RV64IA-NEXT:    addiw a4, a4, -1
7114; RV64IA-NEXT:    sllw a4, a4, a0
7115; RV64IA-NEXT:    slli a1, a1, 48
7116; RV64IA-NEXT:    srai a1, a1, 48
7117; RV64IA-NEXT:    sllw a1, a1, a0
7118; RV64IA-NEXT:    li a5, 48
7119; RV64IA-NEXT:    sub a3, a5, a3
7120; RV64IA-NEXT:  .LBB91_1: # =>This Inner Loop Header: Depth=1
7121; RV64IA-NEXT:    lr.w.aq a5, (a2)
7122; RV64IA-NEXT:    and a7, a5, a4
7123; RV64IA-NEXT:    mv a6, a5
7124; RV64IA-NEXT:    sll a7, a7, a3
7125; RV64IA-NEXT:    sra a7, a7, a3
7126; RV64IA-NEXT:    bge a7, a1, .LBB91_3
7127; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB91_1 Depth=1
7128; RV64IA-NEXT:    xor a6, a5, a1
7129; RV64IA-NEXT:    and a6, a6, a4
7130; RV64IA-NEXT:    xor a6, a5, a6
7131; RV64IA-NEXT:  .LBB91_3: # in Loop: Header=BB91_1 Depth=1
7132; RV64IA-NEXT:    sc.w a6, a6, (a2)
7133; RV64IA-NEXT:    bnez a6, .LBB91_1
7134; RV64IA-NEXT:  # %bb.4:
7135; RV64IA-NEXT:    srlw a0, a5, a0
7136; RV64IA-NEXT:    ret
7137  %1 = atomicrmw max i16* %a, i16 %b acquire
7138  ret i16 %1
7139}
7140
7141define i16 @atomicrmw_max_i16_release(i16 *%a, i16 %b) nounwind {
7142; RV32I-LABEL: atomicrmw_max_i16_release:
7143; RV32I:       # %bb.0:
7144; RV32I-NEXT:    addi sp, sp, -32
7145; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7146; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7147; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7148; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7149; RV32I-NEXT:    mv s0, a0
7150; RV32I-NEXT:    lhu a3, 0(a0)
7151; RV32I-NEXT:    mv s1, a1
7152; RV32I-NEXT:    slli a0, a1, 16
7153; RV32I-NEXT:    srai s2, a0, 16
7154; RV32I-NEXT:    j .LBB92_2
7155; RV32I-NEXT:  .LBB92_1: # %atomicrmw.start
7156; RV32I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7157; RV32I-NEXT:    sh a3, 14(sp)
7158; RV32I-NEXT:    addi a1, sp, 14
7159; RV32I-NEXT:    li a3, 3
7160; RV32I-NEXT:    mv a0, s0
7161; RV32I-NEXT:    li a4, 0
7162; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7163; RV32I-NEXT:    lh a3, 14(sp)
7164; RV32I-NEXT:    bnez a0, .LBB92_4
7165; RV32I-NEXT:  .LBB92_2: # %atomicrmw.start
7166; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7167; RV32I-NEXT:    slli a0, a3, 16
7168; RV32I-NEXT:    srai a0, a0, 16
7169; RV32I-NEXT:    mv a2, a3
7170; RV32I-NEXT:    blt s2, a0, .LBB92_1
7171; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7172; RV32I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7173; RV32I-NEXT:    mv a2, s1
7174; RV32I-NEXT:    j .LBB92_1
7175; RV32I-NEXT:  .LBB92_4: # %atomicrmw.end
7176; RV32I-NEXT:    mv a0, a3
7177; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7178; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7179; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7180; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7181; RV32I-NEXT:    addi sp, sp, 32
7182; RV32I-NEXT:    ret
7183;
7184; RV32IA-LABEL: atomicrmw_max_i16_release:
7185; RV32IA:       # %bb.0:
7186; RV32IA-NEXT:    andi a2, a0, -4
7187; RV32IA-NEXT:    slli a0, a0, 3
7188; RV32IA-NEXT:    andi a3, a0, 24
7189; RV32IA-NEXT:    lui a4, 16
7190; RV32IA-NEXT:    addi a4, a4, -1
7191; RV32IA-NEXT:    sll a4, a4, a0
7192; RV32IA-NEXT:    slli a1, a1, 16
7193; RV32IA-NEXT:    srai a1, a1, 16
7194; RV32IA-NEXT:    sll a1, a1, a0
7195; RV32IA-NEXT:    li a5, 16
7196; RV32IA-NEXT:    sub a3, a5, a3
7197; RV32IA-NEXT:  .LBB92_1: # =>This Inner Loop Header: Depth=1
7198; RV32IA-NEXT:    lr.w a5, (a2)
7199; RV32IA-NEXT:    and a7, a5, a4
7200; RV32IA-NEXT:    mv a6, a5
7201; RV32IA-NEXT:    sll a7, a7, a3
7202; RV32IA-NEXT:    sra a7, a7, a3
7203; RV32IA-NEXT:    bge a7, a1, .LBB92_3
7204; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB92_1 Depth=1
7205; RV32IA-NEXT:    xor a6, a5, a1
7206; RV32IA-NEXT:    and a6, a6, a4
7207; RV32IA-NEXT:    xor a6, a5, a6
7208; RV32IA-NEXT:  .LBB92_3: # in Loop: Header=BB92_1 Depth=1
7209; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
7210; RV32IA-NEXT:    bnez a6, .LBB92_1
7211; RV32IA-NEXT:  # %bb.4:
7212; RV32IA-NEXT:    srl a0, a5, a0
7213; RV32IA-NEXT:    ret
7214;
7215; RV64I-LABEL: atomicrmw_max_i16_release:
7216; RV64I:       # %bb.0:
7217; RV64I-NEXT:    addi sp, sp, -48
7218; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7219; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7220; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7221; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7222; RV64I-NEXT:    mv s0, a0
7223; RV64I-NEXT:    lhu a3, 0(a0)
7224; RV64I-NEXT:    mv s1, a1
7225; RV64I-NEXT:    slli a0, a1, 48
7226; RV64I-NEXT:    srai s2, a0, 48
7227; RV64I-NEXT:    j .LBB92_2
7228; RV64I-NEXT:  .LBB92_1: # %atomicrmw.start
7229; RV64I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7230; RV64I-NEXT:    sh a3, 14(sp)
7231; RV64I-NEXT:    addi a1, sp, 14
7232; RV64I-NEXT:    li a3, 3
7233; RV64I-NEXT:    mv a0, s0
7234; RV64I-NEXT:    li a4, 0
7235; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7236; RV64I-NEXT:    lh a3, 14(sp)
7237; RV64I-NEXT:    bnez a0, .LBB92_4
7238; RV64I-NEXT:  .LBB92_2: # %atomicrmw.start
7239; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7240; RV64I-NEXT:    slli a0, a3, 48
7241; RV64I-NEXT:    srai a0, a0, 48
7242; RV64I-NEXT:    mv a2, a3
7243; RV64I-NEXT:    blt s2, a0, .LBB92_1
7244; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7245; RV64I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7246; RV64I-NEXT:    mv a2, s1
7247; RV64I-NEXT:    j .LBB92_1
7248; RV64I-NEXT:  .LBB92_4: # %atomicrmw.end
7249; RV64I-NEXT:    mv a0, a3
7250; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7251; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7252; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7253; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7254; RV64I-NEXT:    addi sp, sp, 48
7255; RV64I-NEXT:    ret
7256;
7257; RV64IA-LABEL: atomicrmw_max_i16_release:
7258; RV64IA:       # %bb.0:
7259; RV64IA-NEXT:    andi a2, a0, -4
7260; RV64IA-NEXT:    slliw a0, a0, 3
7261; RV64IA-NEXT:    andi a3, a0, 24
7262; RV64IA-NEXT:    lui a4, 16
7263; RV64IA-NEXT:    addiw a4, a4, -1
7264; RV64IA-NEXT:    sllw a4, a4, a0
7265; RV64IA-NEXT:    slli a1, a1, 48
7266; RV64IA-NEXT:    srai a1, a1, 48
7267; RV64IA-NEXT:    sllw a1, a1, a0
7268; RV64IA-NEXT:    li a5, 48
7269; RV64IA-NEXT:    sub a3, a5, a3
7270; RV64IA-NEXT:  .LBB92_1: # =>This Inner Loop Header: Depth=1
7271; RV64IA-NEXT:    lr.w a5, (a2)
7272; RV64IA-NEXT:    and a7, a5, a4
7273; RV64IA-NEXT:    mv a6, a5
7274; RV64IA-NEXT:    sll a7, a7, a3
7275; RV64IA-NEXT:    sra a7, a7, a3
7276; RV64IA-NEXT:    bge a7, a1, .LBB92_3
7277; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB92_1 Depth=1
7278; RV64IA-NEXT:    xor a6, a5, a1
7279; RV64IA-NEXT:    and a6, a6, a4
7280; RV64IA-NEXT:    xor a6, a5, a6
7281; RV64IA-NEXT:  .LBB92_3: # in Loop: Header=BB92_1 Depth=1
7282; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
7283; RV64IA-NEXT:    bnez a6, .LBB92_1
7284; RV64IA-NEXT:  # %bb.4:
7285; RV64IA-NEXT:    srlw a0, a5, a0
7286; RV64IA-NEXT:    ret
7287  %1 = atomicrmw max i16* %a, i16 %b release
7288  ret i16 %1
7289}
7290
7291define i16 @atomicrmw_max_i16_acq_rel(i16 *%a, i16 %b) nounwind {
7292; RV32I-LABEL: atomicrmw_max_i16_acq_rel:
7293; RV32I:       # %bb.0:
7294; RV32I-NEXT:    addi sp, sp, -32
7295; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7296; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7297; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7298; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7299; RV32I-NEXT:    mv s0, a0
7300; RV32I-NEXT:    lhu a3, 0(a0)
7301; RV32I-NEXT:    mv s1, a1
7302; RV32I-NEXT:    slli a0, a1, 16
7303; RV32I-NEXT:    srai s2, a0, 16
7304; RV32I-NEXT:    j .LBB93_2
7305; RV32I-NEXT:  .LBB93_1: # %atomicrmw.start
7306; RV32I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7307; RV32I-NEXT:    sh a3, 14(sp)
7308; RV32I-NEXT:    addi a1, sp, 14
7309; RV32I-NEXT:    li a3, 4
7310; RV32I-NEXT:    li a4, 2
7311; RV32I-NEXT:    mv a0, s0
7312; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7313; RV32I-NEXT:    lh a3, 14(sp)
7314; RV32I-NEXT:    bnez a0, .LBB93_4
7315; RV32I-NEXT:  .LBB93_2: # %atomicrmw.start
7316; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7317; RV32I-NEXT:    slli a0, a3, 16
7318; RV32I-NEXT:    srai a0, a0, 16
7319; RV32I-NEXT:    mv a2, a3
7320; RV32I-NEXT:    blt s2, a0, .LBB93_1
7321; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7322; RV32I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7323; RV32I-NEXT:    mv a2, s1
7324; RV32I-NEXT:    j .LBB93_1
7325; RV32I-NEXT:  .LBB93_4: # %atomicrmw.end
7326; RV32I-NEXT:    mv a0, a3
7327; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7328; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7329; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7330; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7331; RV32I-NEXT:    addi sp, sp, 32
7332; RV32I-NEXT:    ret
7333;
7334; RV32IA-LABEL: atomicrmw_max_i16_acq_rel:
7335; RV32IA:       # %bb.0:
7336; RV32IA-NEXT:    andi a2, a0, -4
7337; RV32IA-NEXT:    slli a0, a0, 3
7338; RV32IA-NEXT:    andi a3, a0, 24
7339; RV32IA-NEXT:    lui a4, 16
7340; RV32IA-NEXT:    addi a4, a4, -1
7341; RV32IA-NEXT:    sll a4, a4, a0
7342; RV32IA-NEXT:    slli a1, a1, 16
7343; RV32IA-NEXT:    srai a1, a1, 16
7344; RV32IA-NEXT:    sll a1, a1, a0
7345; RV32IA-NEXT:    li a5, 16
7346; RV32IA-NEXT:    sub a3, a5, a3
7347; RV32IA-NEXT:  .LBB93_1: # =>This Inner Loop Header: Depth=1
7348; RV32IA-NEXT:    lr.w.aq a5, (a2)
7349; RV32IA-NEXT:    and a7, a5, a4
7350; RV32IA-NEXT:    mv a6, a5
7351; RV32IA-NEXT:    sll a7, a7, a3
7352; RV32IA-NEXT:    sra a7, a7, a3
7353; RV32IA-NEXT:    bge a7, a1, .LBB93_3
7354; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB93_1 Depth=1
7355; RV32IA-NEXT:    xor a6, a5, a1
7356; RV32IA-NEXT:    and a6, a6, a4
7357; RV32IA-NEXT:    xor a6, a5, a6
7358; RV32IA-NEXT:  .LBB93_3: # in Loop: Header=BB93_1 Depth=1
7359; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
7360; RV32IA-NEXT:    bnez a6, .LBB93_1
7361; RV32IA-NEXT:  # %bb.4:
7362; RV32IA-NEXT:    srl a0, a5, a0
7363; RV32IA-NEXT:    ret
7364;
7365; RV64I-LABEL: atomicrmw_max_i16_acq_rel:
7366; RV64I:       # %bb.0:
7367; RV64I-NEXT:    addi sp, sp, -48
7368; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7369; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7370; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7371; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7372; RV64I-NEXT:    mv s0, a0
7373; RV64I-NEXT:    lhu a3, 0(a0)
7374; RV64I-NEXT:    mv s1, a1
7375; RV64I-NEXT:    slli a0, a1, 48
7376; RV64I-NEXT:    srai s2, a0, 48
7377; RV64I-NEXT:    j .LBB93_2
7378; RV64I-NEXT:  .LBB93_1: # %atomicrmw.start
7379; RV64I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7380; RV64I-NEXT:    sh a3, 14(sp)
7381; RV64I-NEXT:    addi a1, sp, 14
7382; RV64I-NEXT:    li a3, 4
7383; RV64I-NEXT:    li a4, 2
7384; RV64I-NEXT:    mv a0, s0
7385; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7386; RV64I-NEXT:    lh a3, 14(sp)
7387; RV64I-NEXT:    bnez a0, .LBB93_4
7388; RV64I-NEXT:  .LBB93_2: # %atomicrmw.start
7389; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7390; RV64I-NEXT:    slli a0, a3, 48
7391; RV64I-NEXT:    srai a0, a0, 48
7392; RV64I-NEXT:    mv a2, a3
7393; RV64I-NEXT:    blt s2, a0, .LBB93_1
7394; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7395; RV64I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7396; RV64I-NEXT:    mv a2, s1
7397; RV64I-NEXT:    j .LBB93_1
7398; RV64I-NEXT:  .LBB93_4: # %atomicrmw.end
7399; RV64I-NEXT:    mv a0, a3
7400; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7401; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7402; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7403; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7404; RV64I-NEXT:    addi sp, sp, 48
7405; RV64I-NEXT:    ret
7406;
7407; RV64IA-LABEL: atomicrmw_max_i16_acq_rel:
7408; RV64IA:       # %bb.0:
7409; RV64IA-NEXT:    andi a2, a0, -4
7410; RV64IA-NEXT:    slliw a0, a0, 3
7411; RV64IA-NEXT:    andi a3, a0, 24
7412; RV64IA-NEXT:    lui a4, 16
7413; RV64IA-NEXT:    addiw a4, a4, -1
7414; RV64IA-NEXT:    sllw a4, a4, a0
7415; RV64IA-NEXT:    slli a1, a1, 48
7416; RV64IA-NEXT:    srai a1, a1, 48
7417; RV64IA-NEXT:    sllw a1, a1, a0
7418; RV64IA-NEXT:    li a5, 48
7419; RV64IA-NEXT:    sub a3, a5, a3
7420; RV64IA-NEXT:  .LBB93_1: # =>This Inner Loop Header: Depth=1
7421; RV64IA-NEXT:    lr.w.aq a5, (a2)
7422; RV64IA-NEXT:    and a7, a5, a4
7423; RV64IA-NEXT:    mv a6, a5
7424; RV64IA-NEXT:    sll a7, a7, a3
7425; RV64IA-NEXT:    sra a7, a7, a3
7426; RV64IA-NEXT:    bge a7, a1, .LBB93_3
7427; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB93_1 Depth=1
7428; RV64IA-NEXT:    xor a6, a5, a1
7429; RV64IA-NEXT:    and a6, a6, a4
7430; RV64IA-NEXT:    xor a6, a5, a6
7431; RV64IA-NEXT:  .LBB93_3: # in Loop: Header=BB93_1 Depth=1
7432; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
7433; RV64IA-NEXT:    bnez a6, .LBB93_1
7434; RV64IA-NEXT:  # %bb.4:
7435; RV64IA-NEXT:    srlw a0, a5, a0
7436; RV64IA-NEXT:    ret
7437  %1 = atomicrmw max i16* %a, i16 %b acq_rel
7438  ret i16 %1
7439}
7440
7441define i16 @atomicrmw_max_i16_seq_cst(i16 *%a, i16 %b) nounwind {
7442; RV32I-LABEL: atomicrmw_max_i16_seq_cst:
7443; RV32I:       # %bb.0:
7444; RV32I-NEXT:    addi sp, sp, -32
7445; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7446; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7447; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7448; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7449; RV32I-NEXT:    mv s0, a0
7450; RV32I-NEXT:    lhu a3, 0(a0)
7451; RV32I-NEXT:    mv s1, a1
7452; RV32I-NEXT:    slli a0, a1, 16
7453; RV32I-NEXT:    srai s2, a0, 16
7454; RV32I-NEXT:    j .LBB94_2
7455; RV32I-NEXT:  .LBB94_1: # %atomicrmw.start
7456; RV32I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7457; RV32I-NEXT:    sh a3, 14(sp)
7458; RV32I-NEXT:    addi a1, sp, 14
7459; RV32I-NEXT:    li a3, 5
7460; RV32I-NEXT:    li a4, 5
7461; RV32I-NEXT:    mv a0, s0
7462; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7463; RV32I-NEXT:    lh a3, 14(sp)
7464; RV32I-NEXT:    bnez a0, .LBB94_4
7465; RV32I-NEXT:  .LBB94_2: # %atomicrmw.start
7466; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7467; RV32I-NEXT:    slli a0, a3, 16
7468; RV32I-NEXT:    srai a0, a0, 16
7469; RV32I-NEXT:    mv a2, a3
7470; RV32I-NEXT:    blt s2, a0, .LBB94_1
7471; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7472; RV32I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7473; RV32I-NEXT:    mv a2, s1
7474; RV32I-NEXT:    j .LBB94_1
7475; RV32I-NEXT:  .LBB94_4: # %atomicrmw.end
7476; RV32I-NEXT:    mv a0, a3
7477; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7478; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7479; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7480; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7481; RV32I-NEXT:    addi sp, sp, 32
7482; RV32I-NEXT:    ret
7483;
7484; RV32IA-LABEL: atomicrmw_max_i16_seq_cst:
7485; RV32IA:       # %bb.0:
7486; RV32IA-NEXT:    andi a2, a0, -4
7487; RV32IA-NEXT:    slli a0, a0, 3
7488; RV32IA-NEXT:    andi a3, a0, 24
7489; RV32IA-NEXT:    lui a4, 16
7490; RV32IA-NEXT:    addi a4, a4, -1
7491; RV32IA-NEXT:    sll a4, a4, a0
7492; RV32IA-NEXT:    slli a1, a1, 16
7493; RV32IA-NEXT:    srai a1, a1, 16
7494; RV32IA-NEXT:    sll a1, a1, a0
7495; RV32IA-NEXT:    li a5, 16
7496; RV32IA-NEXT:    sub a3, a5, a3
7497; RV32IA-NEXT:  .LBB94_1: # =>This Inner Loop Header: Depth=1
7498; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
7499; RV32IA-NEXT:    and a7, a5, a4
7500; RV32IA-NEXT:    mv a6, a5
7501; RV32IA-NEXT:    sll a7, a7, a3
7502; RV32IA-NEXT:    sra a7, a7, a3
7503; RV32IA-NEXT:    bge a7, a1, .LBB94_3
7504; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB94_1 Depth=1
7505; RV32IA-NEXT:    xor a6, a5, a1
7506; RV32IA-NEXT:    and a6, a6, a4
7507; RV32IA-NEXT:    xor a6, a5, a6
7508; RV32IA-NEXT:  .LBB94_3: # in Loop: Header=BB94_1 Depth=1
7509; RV32IA-NEXT:    sc.w.aqrl a6, a6, (a2)
7510; RV32IA-NEXT:    bnez a6, .LBB94_1
7511; RV32IA-NEXT:  # %bb.4:
7512; RV32IA-NEXT:    srl a0, a5, a0
7513; RV32IA-NEXT:    ret
7514;
7515; RV64I-LABEL: atomicrmw_max_i16_seq_cst:
7516; RV64I:       # %bb.0:
7517; RV64I-NEXT:    addi sp, sp, -48
7518; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7519; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7520; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7521; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7522; RV64I-NEXT:    mv s0, a0
7523; RV64I-NEXT:    lhu a3, 0(a0)
7524; RV64I-NEXT:    mv s1, a1
7525; RV64I-NEXT:    slli a0, a1, 48
7526; RV64I-NEXT:    srai s2, a0, 48
7527; RV64I-NEXT:    j .LBB94_2
7528; RV64I-NEXT:  .LBB94_1: # %atomicrmw.start
7529; RV64I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7530; RV64I-NEXT:    sh a3, 14(sp)
7531; RV64I-NEXT:    addi a1, sp, 14
7532; RV64I-NEXT:    li a3, 5
7533; RV64I-NEXT:    li a4, 5
7534; RV64I-NEXT:    mv a0, s0
7535; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7536; RV64I-NEXT:    lh a3, 14(sp)
7537; RV64I-NEXT:    bnez a0, .LBB94_4
7538; RV64I-NEXT:  .LBB94_2: # %atomicrmw.start
7539; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7540; RV64I-NEXT:    slli a0, a3, 48
7541; RV64I-NEXT:    srai a0, a0, 48
7542; RV64I-NEXT:    mv a2, a3
7543; RV64I-NEXT:    blt s2, a0, .LBB94_1
7544; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7545; RV64I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7546; RV64I-NEXT:    mv a2, s1
7547; RV64I-NEXT:    j .LBB94_1
7548; RV64I-NEXT:  .LBB94_4: # %atomicrmw.end
7549; RV64I-NEXT:    mv a0, a3
7550; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7551; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7552; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7553; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7554; RV64I-NEXT:    addi sp, sp, 48
7555; RV64I-NEXT:    ret
7556;
7557; RV64IA-LABEL: atomicrmw_max_i16_seq_cst:
7558; RV64IA:       # %bb.0:
7559; RV64IA-NEXT:    andi a2, a0, -4
7560; RV64IA-NEXT:    slliw a0, a0, 3
7561; RV64IA-NEXT:    andi a3, a0, 24
7562; RV64IA-NEXT:    lui a4, 16
7563; RV64IA-NEXT:    addiw a4, a4, -1
7564; RV64IA-NEXT:    sllw a4, a4, a0
7565; RV64IA-NEXT:    slli a1, a1, 48
7566; RV64IA-NEXT:    srai a1, a1, 48
7567; RV64IA-NEXT:    sllw a1, a1, a0
7568; RV64IA-NEXT:    li a5, 48
7569; RV64IA-NEXT:    sub a3, a5, a3
7570; RV64IA-NEXT:  .LBB94_1: # =>This Inner Loop Header: Depth=1
7571; RV64IA-NEXT:    lr.w.aqrl a5, (a2)
7572; RV64IA-NEXT:    and a7, a5, a4
7573; RV64IA-NEXT:    mv a6, a5
7574; RV64IA-NEXT:    sll a7, a7, a3
7575; RV64IA-NEXT:    sra a7, a7, a3
7576; RV64IA-NEXT:    bge a7, a1, .LBB94_3
7577; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB94_1 Depth=1
7578; RV64IA-NEXT:    xor a6, a5, a1
7579; RV64IA-NEXT:    and a6, a6, a4
7580; RV64IA-NEXT:    xor a6, a5, a6
7581; RV64IA-NEXT:  .LBB94_3: # in Loop: Header=BB94_1 Depth=1
7582; RV64IA-NEXT:    sc.w.aqrl a6, a6, (a2)
7583; RV64IA-NEXT:    bnez a6, .LBB94_1
7584; RV64IA-NEXT:  # %bb.4:
7585; RV64IA-NEXT:    srlw a0, a5, a0
7586; RV64IA-NEXT:    ret
7587  %1 = atomicrmw max i16* %a, i16 %b seq_cst
7588  ret i16 %1
7589}
7590
7591define i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind {
7592; RV32I-LABEL: atomicrmw_min_i16_monotonic:
7593; RV32I:       # %bb.0:
7594; RV32I-NEXT:    addi sp, sp, -32
7595; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7596; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7597; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7598; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7599; RV32I-NEXT:    mv s0, a0
7600; RV32I-NEXT:    lhu a3, 0(a0)
7601; RV32I-NEXT:    mv s1, a1
7602; RV32I-NEXT:    slli a0, a1, 16
7603; RV32I-NEXT:    srai s2, a0, 16
7604; RV32I-NEXT:    j .LBB95_2
7605; RV32I-NEXT:  .LBB95_1: # %atomicrmw.start
7606; RV32I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7607; RV32I-NEXT:    sh a3, 14(sp)
7608; RV32I-NEXT:    addi a1, sp, 14
7609; RV32I-NEXT:    mv a0, s0
7610; RV32I-NEXT:    li a3, 0
7611; RV32I-NEXT:    li a4, 0
7612; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7613; RV32I-NEXT:    lh a3, 14(sp)
7614; RV32I-NEXT:    bnez a0, .LBB95_4
7615; RV32I-NEXT:  .LBB95_2: # %atomicrmw.start
7616; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7617; RV32I-NEXT:    slli a0, a3, 16
7618; RV32I-NEXT:    srai a0, a0, 16
7619; RV32I-NEXT:    mv a2, a3
7620; RV32I-NEXT:    bge s2, a0, .LBB95_1
7621; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7622; RV32I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7623; RV32I-NEXT:    mv a2, s1
7624; RV32I-NEXT:    j .LBB95_1
7625; RV32I-NEXT:  .LBB95_4: # %atomicrmw.end
7626; RV32I-NEXT:    mv a0, a3
7627; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7628; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7629; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7630; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7631; RV32I-NEXT:    addi sp, sp, 32
7632; RV32I-NEXT:    ret
7633;
7634; RV32IA-LABEL: atomicrmw_min_i16_monotonic:
7635; RV32IA:       # %bb.0:
7636; RV32IA-NEXT:    andi a2, a0, -4
7637; RV32IA-NEXT:    slli a0, a0, 3
7638; RV32IA-NEXT:    andi a3, a0, 24
7639; RV32IA-NEXT:    lui a4, 16
7640; RV32IA-NEXT:    addi a4, a4, -1
7641; RV32IA-NEXT:    sll a4, a4, a0
7642; RV32IA-NEXT:    slli a1, a1, 16
7643; RV32IA-NEXT:    srai a1, a1, 16
7644; RV32IA-NEXT:    sll a1, a1, a0
7645; RV32IA-NEXT:    li a5, 16
7646; RV32IA-NEXT:    sub a3, a5, a3
7647; RV32IA-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
7648; RV32IA-NEXT:    lr.w a5, (a2)
7649; RV32IA-NEXT:    and a7, a5, a4
7650; RV32IA-NEXT:    mv a6, a5
7651; RV32IA-NEXT:    sll a7, a7, a3
7652; RV32IA-NEXT:    sra a7, a7, a3
7653; RV32IA-NEXT:    bge a1, a7, .LBB95_3
7654; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB95_1 Depth=1
7655; RV32IA-NEXT:    xor a6, a5, a1
7656; RV32IA-NEXT:    and a6, a6, a4
7657; RV32IA-NEXT:    xor a6, a5, a6
7658; RV32IA-NEXT:  .LBB95_3: # in Loop: Header=BB95_1 Depth=1
7659; RV32IA-NEXT:    sc.w a6, a6, (a2)
7660; RV32IA-NEXT:    bnez a6, .LBB95_1
7661; RV32IA-NEXT:  # %bb.4:
7662; RV32IA-NEXT:    srl a0, a5, a0
7663; RV32IA-NEXT:    ret
7664;
7665; RV64I-LABEL: atomicrmw_min_i16_monotonic:
7666; RV64I:       # %bb.0:
7667; RV64I-NEXT:    addi sp, sp, -48
7668; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7669; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7670; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7671; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7672; RV64I-NEXT:    mv s0, a0
7673; RV64I-NEXT:    lhu a3, 0(a0)
7674; RV64I-NEXT:    mv s1, a1
7675; RV64I-NEXT:    slli a0, a1, 48
7676; RV64I-NEXT:    srai s2, a0, 48
7677; RV64I-NEXT:    j .LBB95_2
7678; RV64I-NEXT:  .LBB95_1: # %atomicrmw.start
7679; RV64I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7680; RV64I-NEXT:    sh a3, 14(sp)
7681; RV64I-NEXT:    addi a1, sp, 14
7682; RV64I-NEXT:    mv a0, s0
7683; RV64I-NEXT:    li a3, 0
7684; RV64I-NEXT:    li a4, 0
7685; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7686; RV64I-NEXT:    lh a3, 14(sp)
7687; RV64I-NEXT:    bnez a0, .LBB95_4
7688; RV64I-NEXT:  .LBB95_2: # %atomicrmw.start
7689; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7690; RV64I-NEXT:    slli a0, a3, 48
7691; RV64I-NEXT:    srai a0, a0, 48
7692; RV64I-NEXT:    mv a2, a3
7693; RV64I-NEXT:    bge s2, a0, .LBB95_1
7694; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7695; RV64I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7696; RV64I-NEXT:    mv a2, s1
7697; RV64I-NEXT:    j .LBB95_1
7698; RV64I-NEXT:  .LBB95_4: # %atomicrmw.end
7699; RV64I-NEXT:    mv a0, a3
7700; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7701; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7702; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7703; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7704; RV64I-NEXT:    addi sp, sp, 48
7705; RV64I-NEXT:    ret
7706;
7707; RV64IA-LABEL: atomicrmw_min_i16_monotonic:
7708; RV64IA:       # %bb.0:
7709; RV64IA-NEXT:    andi a2, a0, -4
7710; RV64IA-NEXT:    slliw a0, a0, 3
7711; RV64IA-NEXT:    andi a3, a0, 24
7712; RV64IA-NEXT:    lui a4, 16
7713; RV64IA-NEXT:    addiw a4, a4, -1
7714; RV64IA-NEXT:    sllw a4, a4, a0
7715; RV64IA-NEXT:    slli a1, a1, 48
7716; RV64IA-NEXT:    srai a1, a1, 48
7717; RV64IA-NEXT:    sllw a1, a1, a0
7718; RV64IA-NEXT:    li a5, 48
7719; RV64IA-NEXT:    sub a3, a5, a3
7720; RV64IA-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
7721; RV64IA-NEXT:    lr.w a5, (a2)
7722; RV64IA-NEXT:    and a7, a5, a4
7723; RV64IA-NEXT:    mv a6, a5
7724; RV64IA-NEXT:    sll a7, a7, a3
7725; RV64IA-NEXT:    sra a7, a7, a3
7726; RV64IA-NEXT:    bge a1, a7, .LBB95_3
7727; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB95_1 Depth=1
7728; RV64IA-NEXT:    xor a6, a5, a1
7729; RV64IA-NEXT:    and a6, a6, a4
7730; RV64IA-NEXT:    xor a6, a5, a6
7731; RV64IA-NEXT:  .LBB95_3: # in Loop: Header=BB95_1 Depth=1
7732; RV64IA-NEXT:    sc.w a6, a6, (a2)
7733; RV64IA-NEXT:    bnez a6, .LBB95_1
7734; RV64IA-NEXT:  # %bb.4:
7735; RV64IA-NEXT:    srlw a0, a5, a0
7736; RV64IA-NEXT:    ret
7737  %1 = atomicrmw min i16* %a, i16 %b monotonic
7738  ret i16 %1
7739}
7740
7741define i16 @atomicrmw_min_i16_acquire(i16 *%a, i16 %b) nounwind {
7742; RV32I-LABEL: atomicrmw_min_i16_acquire:
7743; RV32I:       # %bb.0:
7744; RV32I-NEXT:    addi sp, sp, -32
7745; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7746; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7747; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7748; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7749; RV32I-NEXT:    mv s0, a0
7750; RV32I-NEXT:    lhu a3, 0(a0)
7751; RV32I-NEXT:    mv s1, a1
7752; RV32I-NEXT:    slli a0, a1, 16
7753; RV32I-NEXT:    srai s2, a0, 16
7754; RV32I-NEXT:    j .LBB96_2
7755; RV32I-NEXT:  .LBB96_1: # %atomicrmw.start
7756; RV32I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7757; RV32I-NEXT:    sh a3, 14(sp)
7758; RV32I-NEXT:    addi a1, sp, 14
7759; RV32I-NEXT:    li a3, 2
7760; RV32I-NEXT:    li a4, 2
7761; RV32I-NEXT:    mv a0, s0
7762; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7763; RV32I-NEXT:    lh a3, 14(sp)
7764; RV32I-NEXT:    bnez a0, .LBB96_4
7765; RV32I-NEXT:  .LBB96_2: # %atomicrmw.start
7766; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7767; RV32I-NEXT:    slli a0, a3, 16
7768; RV32I-NEXT:    srai a0, a0, 16
7769; RV32I-NEXT:    mv a2, a3
7770; RV32I-NEXT:    bge s2, a0, .LBB96_1
7771; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7772; RV32I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7773; RV32I-NEXT:    mv a2, s1
7774; RV32I-NEXT:    j .LBB96_1
7775; RV32I-NEXT:  .LBB96_4: # %atomicrmw.end
7776; RV32I-NEXT:    mv a0, a3
7777; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7778; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7779; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7780; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7781; RV32I-NEXT:    addi sp, sp, 32
7782; RV32I-NEXT:    ret
7783;
7784; RV32IA-LABEL: atomicrmw_min_i16_acquire:
7785; RV32IA:       # %bb.0:
7786; RV32IA-NEXT:    andi a2, a0, -4
7787; RV32IA-NEXT:    slli a0, a0, 3
7788; RV32IA-NEXT:    andi a3, a0, 24
7789; RV32IA-NEXT:    lui a4, 16
7790; RV32IA-NEXT:    addi a4, a4, -1
7791; RV32IA-NEXT:    sll a4, a4, a0
7792; RV32IA-NEXT:    slli a1, a1, 16
7793; RV32IA-NEXT:    srai a1, a1, 16
7794; RV32IA-NEXT:    sll a1, a1, a0
7795; RV32IA-NEXT:    li a5, 16
7796; RV32IA-NEXT:    sub a3, a5, a3
7797; RV32IA-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
7798; RV32IA-NEXT:    lr.w.aq a5, (a2)
7799; RV32IA-NEXT:    and a7, a5, a4
7800; RV32IA-NEXT:    mv a6, a5
7801; RV32IA-NEXT:    sll a7, a7, a3
7802; RV32IA-NEXT:    sra a7, a7, a3
7803; RV32IA-NEXT:    bge a1, a7, .LBB96_3
7804; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB96_1 Depth=1
7805; RV32IA-NEXT:    xor a6, a5, a1
7806; RV32IA-NEXT:    and a6, a6, a4
7807; RV32IA-NEXT:    xor a6, a5, a6
7808; RV32IA-NEXT:  .LBB96_3: # in Loop: Header=BB96_1 Depth=1
7809; RV32IA-NEXT:    sc.w a6, a6, (a2)
7810; RV32IA-NEXT:    bnez a6, .LBB96_1
7811; RV32IA-NEXT:  # %bb.4:
7812; RV32IA-NEXT:    srl a0, a5, a0
7813; RV32IA-NEXT:    ret
7814;
7815; RV64I-LABEL: atomicrmw_min_i16_acquire:
7816; RV64I:       # %bb.0:
7817; RV64I-NEXT:    addi sp, sp, -48
7818; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7819; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7820; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7821; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7822; RV64I-NEXT:    mv s0, a0
7823; RV64I-NEXT:    lhu a3, 0(a0)
7824; RV64I-NEXT:    mv s1, a1
7825; RV64I-NEXT:    slli a0, a1, 48
7826; RV64I-NEXT:    srai s2, a0, 48
7827; RV64I-NEXT:    j .LBB96_2
7828; RV64I-NEXT:  .LBB96_1: # %atomicrmw.start
7829; RV64I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7830; RV64I-NEXT:    sh a3, 14(sp)
7831; RV64I-NEXT:    addi a1, sp, 14
7832; RV64I-NEXT:    li a3, 2
7833; RV64I-NEXT:    li a4, 2
7834; RV64I-NEXT:    mv a0, s0
7835; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7836; RV64I-NEXT:    lh a3, 14(sp)
7837; RV64I-NEXT:    bnez a0, .LBB96_4
7838; RV64I-NEXT:  .LBB96_2: # %atomicrmw.start
7839; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7840; RV64I-NEXT:    slli a0, a3, 48
7841; RV64I-NEXT:    srai a0, a0, 48
7842; RV64I-NEXT:    mv a2, a3
7843; RV64I-NEXT:    bge s2, a0, .LBB96_1
7844; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7845; RV64I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7846; RV64I-NEXT:    mv a2, s1
7847; RV64I-NEXT:    j .LBB96_1
7848; RV64I-NEXT:  .LBB96_4: # %atomicrmw.end
7849; RV64I-NEXT:    mv a0, a3
7850; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7851; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7852; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7853; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7854; RV64I-NEXT:    addi sp, sp, 48
7855; RV64I-NEXT:    ret
7856;
7857; RV64IA-LABEL: atomicrmw_min_i16_acquire:
7858; RV64IA:       # %bb.0:
7859; RV64IA-NEXT:    andi a2, a0, -4
7860; RV64IA-NEXT:    slliw a0, a0, 3
7861; RV64IA-NEXT:    andi a3, a0, 24
7862; RV64IA-NEXT:    lui a4, 16
7863; RV64IA-NEXT:    addiw a4, a4, -1
7864; RV64IA-NEXT:    sllw a4, a4, a0
7865; RV64IA-NEXT:    slli a1, a1, 48
7866; RV64IA-NEXT:    srai a1, a1, 48
7867; RV64IA-NEXT:    sllw a1, a1, a0
7868; RV64IA-NEXT:    li a5, 48
7869; RV64IA-NEXT:    sub a3, a5, a3
7870; RV64IA-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
7871; RV64IA-NEXT:    lr.w.aq a5, (a2)
7872; RV64IA-NEXT:    and a7, a5, a4
7873; RV64IA-NEXT:    mv a6, a5
7874; RV64IA-NEXT:    sll a7, a7, a3
7875; RV64IA-NEXT:    sra a7, a7, a3
7876; RV64IA-NEXT:    bge a1, a7, .LBB96_3
7877; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB96_1 Depth=1
7878; RV64IA-NEXT:    xor a6, a5, a1
7879; RV64IA-NEXT:    and a6, a6, a4
7880; RV64IA-NEXT:    xor a6, a5, a6
7881; RV64IA-NEXT:  .LBB96_3: # in Loop: Header=BB96_1 Depth=1
7882; RV64IA-NEXT:    sc.w a6, a6, (a2)
7883; RV64IA-NEXT:    bnez a6, .LBB96_1
7884; RV64IA-NEXT:  # %bb.4:
7885; RV64IA-NEXT:    srlw a0, a5, a0
7886; RV64IA-NEXT:    ret
7887  %1 = atomicrmw min i16* %a, i16 %b acquire
7888  ret i16 %1
7889}
7890
7891define i16 @atomicrmw_min_i16_release(i16 *%a, i16 %b) nounwind {
7892; RV32I-LABEL: atomicrmw_min_i16_release:
7893; RV32I:       # %bb.0:
7894; RV32I-NEXT:    addi sp, sp, -32
7895; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7896; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7897; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7898; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7899; RV32I-NEXT:    mv s0, a0
7900; RV32I-NEXT:    lhu a3, 0(a0)
7901; RV32I-NEXT:    mv s1, a1
7902; RV32I-NEXT:    slli a0, a1, 16
7903; RV32I-NEXT:    srai s2, a0, 16
7904; RV32I-NEXT:    j .LBB97_2
7905; RV32I-NEXT:  .LBB97_1: # %atomicrmw.start
7906; RV32I-NEXT:    # in Loop: Header=BB97_2 Depth=1
7907; RV32I-NEXT:    sh a3, 14(sp)
7908; RV32I-NEXT:    addi a1, sp, 14
7909; RV32I-NEXT:    li a3, 3
7910; RV32I-NEXT:    mv a0, s0
7911; RV32I-NEXT:    li a4, 0
7912; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7913; RV32I-NEXT:    lh a3, 14(sp)
7914; RV32I-NEXT:    bnez a0, .LBB97_4
7915; RV32I-NEXT:  .LBB97_2: # %atomicrmw.start
7916; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7917; RV32I-NEXT:    slli a0, a3, 16
7918; RV32I-NEXT:    srai a0, a0, 16
7919; RV32I-NEXT:    mv a2, a3
7920; RV32I-NEXT:    bge s2, a0, .LBB97_1
7921; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7922; RV32I-NEXT:    # in Loop: Header=BB97_2 Depth=1
7923; RV32I-NEXT:    mv a2, s1
7924; RV32I-NEXT:    j .LBB97_1
7925; RV32I-NEXT:  .LBB97_4: # %atomicrmw.end
7926; RV32I-NEXT:    mv a0, a3
7927; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7928; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7929; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7930; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7931; RV32I-NEXT:    addi sp, sp, 32
7932; RV32I-NEXT:    ret
7933;
7934; RV32IA-LABEL: atomicrmw_min_i16_release:
7935; RV32IA:       # %bb.0:
7936; RV32IA-NEXT:    andi a2, a0, -4
7937; RV32IA-NEXT:    slli a0, a0, 3
7938; RV32IA-NEXT:    andi a3, a0, 24
7939; RV32IA-NEXT:    lui a4, 16
7940; RV32IA-NEXT:    addi a4, a4, -1
7941; RV32IA-NEXT:    sll a4, a4, a0
7942; RV32IA-NEXT:    slli a1, a1, 16
7943; RV32IA-NEXT:    srai a1, a1, 16
7944; RV32IA-NEXT:    sll a1, a1, a0
7945; RV32IA-NEXT:    li a5, 16
7946; RV32IA-NEXT:    sub a3, a5, a3
7947; RV32IA-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
7948; RV32IA-NEXT:    lr.w a5, (a2)
7949; RV32IA-NEXT:    and a7, a5, a4
7950; RV32IA-NEXT:    mv a6, a5
7951; RV32IA-NEXT:    sll a7, a7, a3
7952; RV32IA-NEXT:    sra a7, a7, a3
7953; RV32IA-NEXT:    bge a1, a7, .LBB97_3
7954; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB97_1 Depth=1
7955; RV32IA-NEXT:    xor a6, a5, a1
7956; RV32IA-NEXT:    and a6, a6, a4
7957; RV32IA-NEXT:    xor a6, a5, a6
7958; RV32IA-NEXT:  .LBB97_3: # in Loop: Header=BB97_1 Depth=1
7959; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
7960; RV32IA-NEXT:    bnez a6, .LBB97_1
7961; RV32IA-NEXT:  # %bb.4:
7962; RV32IA-NEXT:    srl a0, a5, a0
7963; RV32IA-NEXT:    ret
7964;
7965; RV64I-LABEL: atomicrmw_min_i16_release:
7966; RV64I:       # %bb.0:
7967; RV64I-NEXT:    addi sp, sp, -48
7968; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7969; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7970; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7971; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7972; RV64I-NEXT:    mv s0, a0
7973; RV64I-NEXT:    lhu a3, 0(a0)
7974; RV64I-NEXT:    mv s1, a1
7975; RV64I-NEXT:    slli a0, a1, 48
7976; RV64I-NEXT:    srai s2, a0, 48
7977; RV64I-NEXT:    j .LBB97_2
7978; RV64I-NEXT:  .LBB97_1: # %atomicrmw.start
7979; RV64I-NEXT:    # in Loop: Header=BB97_2 Depth=1
7980; RV64I-NEXT:    sh a3, 14(sp)
7981; RV64I-NEXT:    addi a1, sp, 14
7982; RV64I-NEXT:    li a3, 3
7983; RV64I-NEXT:    mv a0, s0
7984; RV64I-NEXT:    li a4, 0
7985; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7986; RV64I-NEXT:    lh a3, 14(sp)
7987; RV64I-NEXT:    bnez a0, .LBB97_4
7988; RV64I-NEXT:  .LBB97_2: # %atomicrmw.start
7989; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7990; RV64I-NEXT:    slli a0, a3, 48
7991; RV64I-NEXT:    srai a0, a0, 48
7992; RV64I-NEXT:    mv a2, a3
7993; RV64I-NEXT:    bge s2, a0, .LBB97_1
7994; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7995; RV64I-NEXT:    # in Loop: Header=BB97_2 Depth=1
7996; RV64I-NEXT:    mv a2, s1
7997; RV64I-NEXT:    j .LBB97_1
7998; RV64I-NEXT:  .LBB97_4: # %atomicrmw.end
7999; RV64I-NEXT:    mv a0, a3
8000; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8001; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8002; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8003; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8004; RV64I-NEXT:    addi sp, sp, 48
8005; RV64I-NEXT:    ret
8006;
8007; RV64IA-LABEL: atomicrmw_min_i16_release:
8008; RV64IA:       # %bb.0:
8009; RV64IA-NEXT:    andi a2, a0, -4
8010; RV64IA-NEXT:    slliw a0, a0, 3
8011; RV64IA-NEXT:    andi a3, a0, 24
8012; RV64IA-NEXT:    lui a4, 16
8013; RV64IA-NEXT:    addiw a4, a4, -1
8014; RV64IA-NEXT:    sllw a4, a4, a0
8015; RV64IA-NEXT:    slli a1, a1, 48
8016; RV64IA-NEXT:    srai a1, a1, 48
8017; RV64IA-NEXT:    sllw a1, a1, a0
8018; RV64IA-NEXT:    li a5, 48
8019; RV64IA-NEXT:    sub a3, a5, a3
8020; RV64IA-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
8021; RV64IA-NEXT:    lr.w a5, (a2)
8022; RV64IA-NEXT:    and a7, a5, a4
8023; RV64IA-NEXT:    mv a6, a5
8024; RV64IA-NEXT:    sll a7, a7, a3
8025; RV64IA-NEXT:    sra a7, a7, a3
8026; RV64IA-NEXT:    bge a1, a7, .LBB97_3
8027; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB97_1 Depth=1
8028; RV64IA-NEXT:    xor a6, a5, a1
8029; RV64IA-NEXT:    and a6, a6, a4
8030; RV64IA-NEXT:    xor a6, a5, a6
8031; RV64IA-NEXT:  .LBB97_3: # in Loop: Header=BB97_1 Depth=1
8032; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
8033; RV64IA-NEXT:    bnez a6, .LBB97_1
8034; RV64IA-NEXT:  # %bb.4:
8035; RV64IA-NEXT:    srlw a0, a5, a0
8036; RV64IA-NEXT:    ret
8037  %1 = atomicrmw min i16* %a, i16 %b release
8038  ret i16 %1
8039}
8040
8041define i16 @atomicrmw_min_i16_acq_rel(i16 *%a, i16 %b) nounwind {
8042; RV32I-LABEL: atomicrmw_min_i16_acq_rel:
8043; RV32I:       # %bb.0:
8044; RV32I-NEXT:    addi sp, sp, -32
8045; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8046; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8047; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8048; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8049; RV32I-NEXT:    mv s0, a0
8050; RV32I-NEXT:    lhu a3, 0(a0)
8051; RV32I-NEXT:    mv s1, a1
8052; RV32I-NEXT:    slli a0, a1, 16
8053; RV32I-NEXT:    srai s2, a0, 16
8054; RV32I-NEXT:    j .LBB98_2
8055; RV32I-NEXT:  .LBB98_1: # %atomicrmw.start
8056; RV32I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8057; RV32I-NEXT:    sh a3, 14(sp)
8058; RV32I-NEXT:    addi a1, sp, 14
8059; RV32I-NEXT:    li a3, 4
8060; RV32I-NEXT:    li a4, 2
8061; RV32I-NEXT:    mv a0, s0
8062; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8063; RV32I-NEXT:    lh a3, 14(sp)
8064; RV32I-NEXT:    bnez a0, .LBB98_4
8065; RV32I-NEXT:  .LBB98_2: # %atomicrmw.start
8066; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8067; RV32I-NEXT:    slli a0, a3, 16
8068; RV32I-NEXT:    srai a0, a0, 16
8069; RV32I-NEXT:    mv a2, a3
8070; RV32I-NEXT:    bge s2, a0, .LBB98_1
8071; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8072; RV32I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8073; RV32I-NEXT:    mv a2, s1
8074; RV32I-NEXT:    j .LBB98_1
8075; RV32I-NEXT:  .LBB98_4: # %atomicrmw.end
8076; RV32I-NEXT:    mv a0, a3
8077; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8078; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8079; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8080; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8081; RV32I-NEXT:    addi sp, sp, 32
8082; RV32I-NEXT:    ret
8083;
8084; RV32IA-LABEL: atomicrmw_min_i16_acq_rel:
8085; RV32IA:       # %bb.0:
8086; RV32IA-NEXT:    andi a2, a0, -4
8087; RV32IA-NEXT:    slli a0, a0, 3
8088; RV32IA-NEXT:    andi a3, a0, 24
8089; RV32IA-NEXT:    lui a4, 16
8090; RV32IA-NEXT:    addi a4, a4, -1
8091; RV32IA-NEXT:    sll a4, a4, a0
8092; RV32IA-NEXT:    slli a1, a1, 16
8093; RV32IA-NEXT:    srai a1, a1, 16
8094; RV32IA-NEXT:    sll a1, a1, a0
8095; RV32IA-NEXT:    li a5, 16
8096; RV32IA-NEXT:    sub a3, a5, a3
8097; RV32IA-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
8098; RV32IA-NEXT:    lr.w.aq a5, (a2)
8099; RV32IA-NEXT:    and a7, a5, a4
8100; RV32IA-NEXT:    mv a6, a5
8101; RV32IA-NEXT:    sll a7, a7, a3
8102; RV32IA-NEXT:    sra a7, a7, a3
8103; RV32IA-NEXT:    bge a1, a7, .LBB98_3
8104; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB98_1 Depth=1
8105; RV32IA-NEXT:    xor a6, a5, a1
8106; RV32IA-NEXT:    and a6, a6, a4
8107; RV32IA-NEXT:    xor a6, a5, a6
8108; RV32IA-NEXT:  .LBB98_3: # in Loop: Header=BB98_1 Depth=1
8109; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
8110; RV32IA-NEXT:    bnez a6, .LBB98_1
8111; RV32IA-NEXT:  # %bb.4:
8112; RV32IA-NEXT:    srl a0, a5, a0
8113; RV32IA-NEXT:    ret
8114;
8115; RV64I-LABEL: atomicrmw_min_i16_acq_rel:
8116; RV64I:       # %bb.0:
8117; RV64I-NEXT:    addi sp, sp, -48
8118; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8119; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8120; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8121; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8122; RV64I-NEXT:    mv s0, a0
8123; RV64I-NEXT:    lhu a3, 0(a0)
8124; RV64I-NEXT:    mv s1, a1
8125; RV64I-NEXT:    slli a0, a1, 48
8126; RV64I-NEXT:    srai s2, a0, 48
8127; RV64I-NEXT:    j .LBB98_2
8128; RV64I-NEXT:  .LBB98_1: # %atomicrmw.start
8129; RV64I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8130; RV64I-NEXT:    sh a3, 14(sp)
8131; RV64I-NEXT:    addi a1, sp, 14
8132; RV64I-NEXT:    li a3, 4
8133; RV64I-NEXT:    li a4, 2
8134; RV64I-NEXT:    mv a0, s0
8135; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8136; RV64I-NEXT:    lh a3, 14(sp)
8137; RV64I-NEXT:    bnez a0, .LBB98_4
8138; RV64I-NEXT:  .LBB98_2: # %atomicrmw.start
8139; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8140; RV64I-NEXT:    slli a0, a3, 48
8141; RV64I-NEXT:    srai a0, a0, 48
8142; RV64I-NEXT:    mv a2, a3
8143; RV64I-NEXT:    bge s2, a0, .LBB98_1
8144; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8145; RV64I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8146; RV64I-NEXT:    mv a2, s1
8147; RV64I-NEXT:    j .LBB98_1
8148; RV64I-NEXT:  .LBB98_4: # %atomicrmw.end
8149; RV64I-NEXT:    mv a0, a3
8150; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8151; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8152; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8153; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8154; RV64I-NEXT:    addi sp, sp, 48
8155; RV64I-NEXT:    ret
8156;
8157; RV64IA-LABEL: atomicrmw_min_i16_acq_rel:
8158; RV64IA:       # %bb.0:
8159; RV64IA-NEXT:    andi a2, a0, -4
8160; RV64IA-NEXT:    slliw a0, a0, 3
8161; RV64IA-NEXT:    andi a3, a0, 24
8162; RV64IA-NEXT:    lui a4, 16
8163; RV64IA-NEXT:    addiw a4, a4, -1
8164; RV64IA-NEXT:    sllw a4, a4, a0
8165; RV64IA-NEXT:    slli a1, a1, 48
8166; RV64IA-NEXT:    srai a1, a1, 48
8167; RV64IA-NEXT:    sllw a1, a1, a0
8168; RV64IA-NEXT:    li a5, 48
8169; RV64IA-NEXT:    sub a3, a5, a3
8170; RV64IA-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
8171; RV64IA-NEXT:    lr.w.aq a5, (a2)
8172; RV64IA-NEXT:    and a7, a5, a4
8173; RV64IA-NEXT:    mv a6, a5
8174; RV64IA-NEXT:    sll a7, a7, a3
8175; RV64IA-NEXT:    sra a7, a7, a3
8176; RV64IA-NEXT:    bge a1, a7, .LBB98_3
8177; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB98_1 Depth=1
8178; RV64IA-NEXT:    xor a6, a5, a1
8179; RV64IA-NEXT:    and a6, a6, a4
8180; RV64IA-NEXT:    xor a6, a5, a6
8181; RV64IA-NEXT:  .LBB98_3: # in Loop: Header=BB98_1 Depth=1
8182; RV64IA-NEXT:    sc.w.rl a6, a6, (a2)
8183; RV64IA-NEXT:    bnez a6, .LBB98_1
8184; RV64IA-NEXT:  # %bb.4:
8185; RV64IA-NEXT:    srlw a0, a5, a0
8186; RV64IA-NEXT:    ret
8187  %1 = atomicrmw min i16* %a, i16 %b acq_rel
8188  ret i16 %1
8189}
8190
8191define i16 @atomicrmw_min_i16_seq_cst(i16 *%a, i16 %b) nounwind {
8192; RV32I-LABEL: atomicrmw_min_i16_seq_cst:
8193; RV32I:       # %bb.0:
8194; RV32I-NEXT:    addi sp, sp, -32
8195; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8196; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8197; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8198; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8199; RV32I-NEXT:    mv s0, a0
8200; RV32I-NEXT:    lhu a3, 0(a0)
8201; RV32I-NEXT:    mv s1, a1
8202; RV32I-NEXT:    slli a0, a1, 16
8203; RV32I-NEXT:    srai s2, a0, 16
8204; RV32I-NEXT:    j .LBB99_2
8205; RV32I-NEXT:  .LBB99_1: # %atomicrmw.start
8206; RV32I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8207; RV32I-NEXT:    sh a3, 14(sp)
8208; RV32I-NEXT:    addi a1, sp, 14
8209; RV32I-NEXT:    li a3, 5
8210; RV32I-NEXT:    li a4, 5
8211; RV32I-NEXT:    mv a0, s0
8212; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8213; RV32I-NEXT:    lh a3, 14(sp)
8214; RV32I-NEXT:    bnez a0, .LBB99_4
8215; RV32I-NEXT:  .LBB99_2: # %atomicrmw.start
8216; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8217; RV32I-NEXT:    slli a0, a3, 16
8218; RV32I-NEXT:    srai a0, a0, 16
8219; RV32I-NEXT:    mv a2, a3
8220; RV32I-NEXT:    bge s2, a0, .LBB99_1
8221; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8222; RV32I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8223; RV32I-NEXT:    mv a2, s1
8224; RV32I-NEXT:    j .LBB99_1
8225; RV32I-NEXT:  .LBB99_4: # %atomicrmw.end
8226; RV32I-NEXT:    mv a0, a3
8227; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8228; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8229; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8230; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8231; RV32I-NEXT:    addi sp, sp, 32
8232; RV32I-NEXT:    ret
8233;
8234; RV32IA-LABEL: atomicrmw_min_i16_seq_cst:
8235; RV32IA:       # %bb.0:
8236; RV32IA-NEXT:    andi a2, a0, -4
8237; RV32IA-NEXT:    slli a0, a0, 3
8238; RV32IA-NEXT:    andi a3, a0, 24
8239; RV32IA-NEXT:    lui a4, 16
8240; RV32IA-NEXT:    addi a4, a4, -1
8241; RV32IA-NEXT:    sll a4, a4, a0
8242; RV32IA-NEXT:    slli a1, a1, 16
8243; RV32IA-NEXT:    srai a1, a1, 16
8244; RV32IA-NEXT:    sll a1, a1, a0
8245; RV32IA-NEXT:    li a5, 16
8246; RV32IA-NEXT:    sub a3, a5, a3
8247; RV32IA-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
8248; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
8249; RV32IA-NEXT:    and a7, a5, a4
8250; RV32IA-NEXT:    mv a6, a5
8251; RV32IA-NEXT:    sll a7, a7, a3
8252; RV32IA-NEXT:    sra a7, a7, a3
8253; RV32IA-NEXT:    bge a1, a7, .LBB99_3
8254; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB99_1 Depth=1
8255; RV32IA-NEXT:    xor a6, a5, a1
8256; RV32IA-NEXT:    and a6, a6, a4
8257; RV32IA-NEXT:    xor a6, a5, a6
8258; RV32IA-NEXT:  .LBB99_3: # in Loop: Header=BB99_1 Depth=1
8259; RV32IA-NEXT:    sc.w.aqrl a6, a6, (a2)
8260; RV32IA-NEXT:    bnez a6, .LBB99_1
8261; RV32IA-NEXT:  # %bb.4:
8262; RV32IA-NEXT:    srl a0, a5, a0
8263; RV32IA-NEXT:    ret
8264;
8265; RV64I-LABEL: atomicrmw_min_i16_seq_cst:
8266; RV64I:       # %bb.0:
8267; RV64I-NEXT:    addi sp, sp, -48
8268; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8269; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8270; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8271; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8272; RV64I-NEXT:    mv s0, a0
8273; RV64I-NEXT:    lhu a3, 0(a0)
8274; RV64I-NEXT:    mv s1, a1
8275; RV64I-NEXT:    slli a0, a1, 48
8276; RV64I-NEXT:    srai s2, a0, 48
8277; RV64I-NEXT:    j .LBB99_2
8278; RV64I-NEXT:  .LBB99_1: # %atomicrmw.start
8279; RV64I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8280; RV64I-NEXT:    sh a3, 14(sp)
8281; RV64I-NEXT:    addi a1, sp, 14
8282; RV64I-NEXT:    li a3, 5
8283; RV64I-NEXT:    li a4, 5
8284; RV64I-NEXT:    mv a0, s0
8285; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8286; RV64I-NEXT:    lh a3, 14(sp)
8287; RV64I-NEXT:    bnez a0, .LBB99_4
8288; RV64I-NEXT:  .LBB99_2: # %atomicrmw.start
8289; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8290; RV64I-NEXT:    slli a0, a3, 48
8291; RV64I-NEXT:    srai a0, a0, 48
8292; RV64I-NEXT:    mv a2, a3
8293; RV64I-NEXT:    bge s2, a0, .LBB99_1
8294; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8295; RV64I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8296; RV64I-NEXT:    mv a2, s1
8297; RV64I-NEXT:    j .LBB99_1
8298; RV64I-NEXT:  .LBB99_4: # %atomicrmw.end
8299; RV64I-NEXT:    mv a0, a3
8300; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8301; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8302; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8303; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8304; RV64I-NEXT:    addi sp, sp, 48
8305; RV64I-NEXT:    ret
8306;
8307; RV64IA-LABEL: atomicrmw_min_i16_seq_cst:
8308; RV64IA:       # %bb.0:
8309; RV64IA-NEXT:    andi a2, a0, -4
8310; RV64IA-NEXT:    slliw a0, a0, 3
8311; RV64IA-NEXT:    andi a3, a0, 24
8312; RV64IA-NEXT:    lui a4, 16
8313; RV64IA-NEXT:    addiw a4, a4, -1
8314; RV64IA-NEXT:    sllw a4, a4, a0
8315; RV64IA-NEXT:    slli a1, a1, 48
8316; RV64IA-NEXT:    srai a1, a1, 48
8317; RV64IA-NEXT:    sllw a1, a1, a0
8318; RV64IA-NEXT:    li a5, 48
8319; RV64IA-NEXT:    sub a3, a5, a3
8320; RV64IA-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
8321; RV64IA-NEXT:    lr.w.aqrl a5, (a2)
8322; RV64IA-NEXT:    and a7, a5, a4
8323; RV64IA-NEXT:    mv a6, a5
8324; RV64IA-NEXT:    sll a7, a7, a3
8325; RV64IA-NEXT:    sra a7, a7, a3
8326; RV64IA-NEXT:    bge a1, a7, .LBB99_3
8327; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB99_1 Depth=1
8328; RV64IA-NEXT:    xor a6, a5, a1
8329; RV64IA-NEXT:    and a6, a6, a4
8330; RV64IA-NEXT:    xor a6, a5, a6
8331; RV64IA-NEXT:  .LBB99_3: # in Loop: Header=BB99_1 Depth=1
8332; RV64IA-NEXT:    sc.w.aqrl a6, a6, (a2)
8333; RV64IA-NEXT:    bnez a6, .LBB99_1
8334; RV64IA-NEXT:  # %bb.4:
8335; RV64IA-NEXT:    srlw a0, a5, a0
8336; RV64IA-NEXT:    ret
8337  %1 = atomicrmw min i16* %a, i16 %b seq_cst
8338  ret i16 %1
8339}
8340
8341define i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind {
8342; RV32I-LABEL: atomicrmw_umax_i16_monotonic:
8343; RV32I:       # %bb.0:
8344; RV32I-NEXT:    addi sp, sp, -32
8345; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8346; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8347; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8348; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8349; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8350; RV32I-NEXT:    mv s0, a1
8351; RV32I-NEXT:    mv s1, a0
8352; RV32I-NEXT:    lhu a1, 0(a0)
8353; RV32I-NEXT:    lui a0, 16
8354; RV32I-NEXT:    addi s2, a0, -1
8355; RV32I-NEXT:    and s3, s0, s2
8356; RV32I-NEXT:    j .LBB100_2
8357; RV32I-NEXT:  .LBB100_1: # %atomicrmw.start
8358; RV32I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8359; RV32I-NEXT:    sh a1, 10(sp)
8360; RV32I-NEXT:    addi a1, sp, 10
8361; RV32I-NEXT:    mv a0, s1
8362; RV32I-NEXT:    li a3, 0
8363; RV32I-NEXT:    li a4, 0
8364; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8365; RV32I-NEXT:    lh a1, 10(sp)
8366; RV32I-NEXT:    bnez a0, .LBB100_4
8367; RV32I-NEXT:  .LBB100_2: # %atomicrmw.start
8368; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8369; RV32I-NEXT:    and a0, a1, s2
8370; RV32I-NEXT:    mv a2, a1
8371; RV32I-NEXT:    bltu s3, a0, .LBB100_1
8372; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8373; RV32I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8374; RV32I-NEXT:    mv a2, s0
8375; RV32I-NEXT:    j .LBB100_1
8376; RV32I-NEXT:  .LBB100_4: # %atomicrmw.end
8377; RV32I-NEXT:    mv a0, a1
8378; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8379; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8380; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8381; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8382; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8383; RV32I-NEXT:    addi sp, sp, 32
8384; RV32I-NEXT:    ret
8385;
8386; RV32IA-LABEL: atomicrmw_umax_i16_monotonic:
8387; RV32IA:       # %bb.0:
8388; RV32IA-NEXT:    andi a2, a0, -4
8389; RV32IA-NEXT:    slli a0, a0, 3
8390; RV32IA-NEXT:    lui a3, 16
8391; RV32IA-NEXT:    addi a3, a3, -1
8392; RV32IA-NEXT:    sll a4, a3, a0
8393; RV32IA-NEXT:    and a1, a1, a3
8394; RV32IA-NEXT:    sll a1, a1, a0
8395; RV32IA-NEXT:  .LBB100_1: # =>This Inner Loop Header: Depth=1
8396; RV32IA-NEXT:    lr.w a3, (a2)
8397; RV32IA-NEXT:    and a6, a3, a4
8398; RV32IA-NEXT:    mv a5, a3
8399; RV32IA-NEXT:    bgeu a6, a1, .LBB100_3
8400; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB100_1 Depth=1
8401; RV32IA-NEXT:    xor a5, a3, a1
8402; RV32IA-NEXT:    and a5, a5, a4
8403; RV32IA-NEXT:    xor a5, a3, a5
8404; RV32IA-NEXT:  .LBB100_3: # in Loop: Header=BB100_1 Depth=1
8405; RV32IA-NEXT:    sc.w a5, a5, (a2)
8406; RV32IA-NEXT:    bnez a5, .LBB100_1
8407; RV32IA-NEXT:  # %bb.4:
8408; RV32IA-NEXT:    srl a0, a3, a0
8409; RV32IA-NEXT:    ret
8410;
8411; RV64I-LABEL: atomicrmw_umax_i16_monotonic:
8412; RV64I:       # %bb.0:
8413; RV64I-NEXT:    addi sp, sp, -48
8414; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8415; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8416; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8417; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8418; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8419; RV64I-NEXT:    mv s0, a1
8420; RV64I-NEXT:    mv s1, a0
8421; RV64I-NEXT:    lhu a1, 0(a0)
8422; RV64I-NEXT:    lui a0, 16
8423; RV64I-NEXT:    addiw s2, a0, -1
8424; RV64I-NEXT:    and s3, s0, s2
8425; RV64I-NEXT:    j .LBB100_2
8426; RV64I-NEXT:  .LBB100_1: # %atomicrmw.start
8427; RV64I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8428; RV64I-NEXT:    sh a1, 6(sp)
8429; RV64I-NEXT:    addi a1, sp, 6
8430; RV64I-NEXT:    mv a0, s1
8431; RV64I-NEXT:    li a3, 0
8432; RV64I-NEXT:    li a4, 0
8433; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8434; RV64I-NEXT:    lh a1, 6(sp)
8435; RV64I-NEXT:    bnez a0, .LBB100_4
8436; RV64I-NEXT:  .LBB100_2: # %atomicrmw.start
8437; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8438; RV64I-NEXT:    and a0, a1, s2
8439; RV64I-NEXT:    mv a2, a1
8440; RV64I-NEXT:    bltu s3, a0, .LBB100_1
8441; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8442; RV64I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8443; RV64I-NEXT:    mv a2, s0
8444; RV64I-NEXT:    j .LBB100_1
8445; RV64I-NEXT:  .LBB100_4: # %atomicrmw.end
8446; RV64I-NEXT:    mv a0, a1
8447; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8448; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8449; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8450; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8451; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8452; RV64I-NEXT:    addi sp, sp, 48
8453; RV64I-NEXT:    ret
8454;
8455; RV64IA-LABEL: atomicrmw_umax_i16_monotonic:
8456; RV64IA:       # %bb.0:
8457; RV64IA-NEXT:    andi a2, a0, -4
8458; RV64IA-NEXT:    slliw a0, a0, 3
8459; RV64IA-NEXT:    lui a3, 16
8460; RV64IA-NEXT:    addiw a3, a3, -1
8461; RV64IA-NEXT:    sllw a4, a3, a0
8462; RV64IA-NEXT:    and a1, a1, a3
8463; RV64IA-NEXT:    sllw a1, a1, a0
8464; RV64IA-NEXT:  .LBB100_1: # =>This Inner Loop Header: Depth=1
8465; RV64IA-NEXT:    lr.w a3, (a2)
8466; RV64IA-NEXT:    and a6, a3, a4
8467; RV64IA-NEXT:    mv a5, a3
8468; RV64IA-NEXT:    bgeu a6, a1, .LBB100_3
8469; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB100_1 Depth=1
8470; RV64IA-NEXT:    xor a5, a3, a1
8471; RV64IA-NEXT:    and a5, a5, a4
8472; RV64IA-NEXT:    xor a5, a3, a5
8473; RV64IA-NEXT:  .LBB100_3: # in Loop: Header=BB100_1 Depth=1
8474; RV64IA-NEXT:    sc.w a5, a5, (a2)
8475; RV64IA-NEXT:    bnez a5, .LBB100_1
8476; RV64IA-NEXT:  # %bb.4:
8477; RV64IA-NEXT:    srlw a0, a3, a0
8478; RV64IA-NEXT:    ret
8479  %1 = atomicrmw umax i16* %a, i16 %b monotonic
8480  ret i16 %1
8481}
8482
8483define i16 @atomicrmw_umax_i16_acquire(i16 *%a, i16 %b) nounwind {
8484; RV32I-LABEL: atomicrmw_umax_i16_acquire:
8485; RV32I:       # %bb.0:
8486; RV32I-NEXT:    addi sp, sp, -32
8487; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8488; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8489; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8490; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8491; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8492; RV32I-NEXT:    mv s0, a1
8493; RV32I-NEXT:    mv s1, a0
8494; RV32I-NEXT:    lhu a1, 0(a0)
8495; RV32I-NEXT:    lui a0, 16
8496; RV32I-NEXT:    addi s2, a0, -1
8497; RV32I-NEXT:    and s3, s0, s2
8498; RV32I-NEXT:    j .LBB101_2
8499; RV32I-NEXT:  .LBB101_1: # %atomicrmw.start
8500; RV32I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8501; RV32I-NEXT:    sh a1, 10(sp)
8502; RV32I-NEXT:    addi a1, sp, 10
8503; RV32I-NEXT:    li a3, 2
8504; RV32I-NEXT:    li a4, 2
8505; RV32I-NEXT:    mv a0, s1
8506; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8507; RV32I-NEXT:    lh a1, 10(sp)
8508; RV32I-NEXT:    bnez a0, .LBB101_4
8509; RV32I-NEXT:  .LBB101_2: # %atomicrmw.start
8510; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8511; RV32I-NEXT:    and a0, a1, s2
8512; RV32I-NEXT:    mv a2, a1
8513; RV32I-NEXT:    bltu s3, a0, .LBB101_1
8514; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8515; RV32I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8516; RV32I-NEXT:    mv a2, s0
8517; RV32I-NEXT:    j .LBB101_1
8518; RV32I-NEXT:  .LBB101_4: # %atomicrmw.end
8519; RV32I-NEXT:    mv a0, a1
8520; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8521; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8522; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8523; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8524; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8525; RV32I-NEXT:    addi sp, sp, 32
8526; RV32I-NEXT:    ret
8527;
8528; RV32IA-LABEL: atomicrmw_umax_i16_acquire:
8529; RV32IA:       # %bb.0:
8530; RV32IA-NEXT:    andi a2, a0, -4
8531; RV32IA-NEXT:    slli a0, a0, 3
8532; RV32IA-NEXT:    lui a3, 16
8533; RV32IA-NEXT:    addi a3, a3, -1
8534; RV32IA-NEXT:    sll a4, a3, a0
8535; RV32IA-NEXT:    and a1, a1, a3
8536; RV32IA-NEXT:    sll a1, a1, a0
8537; RV32IA-NEXT:  .LBB101_1: # =>This Inner Loop Header: Depth=1
8538; RV32IA-NEXT:    lr.w.aq a3, (a2)
8539; RV32IA-NEXT:    and a6, a3, a4
8540; RV32IA-NEXT:    mv a5, a3
8541; RV32IA-NEXT:    bgeu a6, a1, .LBB101_3
8542; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB101_1 Depth=1
8543; RV32IA-NEXT:    xor a5, a3, a1
8544; RV32IA-NEXT:    and a5, a5, a4
8545; RV32IA-NEXT:    xor a5, a3, a5
8546; RV32IA-NEXT:  .LBB101_3: # in Loop: Header=BB101_1 Depth=1
8547; RV32IA-NEXT:    sc.w a5, a5, (a2)
8548; RV32IA-NEXT:    bnez a5, .LBB101_1
8549; RV32IA-NEXT:  # %bb.4:
8550; RV32IA-NEXT:    srl a0, a3, a0
8551; RV32IA-NEXT:    ret
8552;
8553; RV64I-LABEL: atomicrmw_umax_i16_acquire:
8554; RV64I:       # %bb.0:
8555; RV64I-NEXT:    addi sp, sp, -48
8556; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8557; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8558; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8559; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8560; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8561; RV64I-NEXT:    mv s0, a1
8562; RV64I-NEXT:    mv s1, a0
8563; RV64I-NEXT:    lhu a1, 0(a0)
8564; RV64I-NEXT:    lui a0, 16
8565; RV64I-NEXT:    addiw s2, a0, -1
8566; RV64I-NEXT:    and s3, s0, s2
8567; RV64I-NEXT:    j .LBB101_2
8568; RV64I-NEXT:  .LBB101_1: # %atomicrmw.start
8569; RV64I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8570; RV64I-NEXT:    sh a1, 6(sp)
8571; RV64I-NEXT:    addi a1, sp, 6
8572; RV64I-NEXT:    li a3, 2
8573; RV64I-NEXT:    li a4, 2
8574; RV64I-NEXT:    mv a0, s1
8575; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8576; RV64I-NEXT:    lh a1, 6(sp)
8577; RV64I-NEXT:    bnez a0, .LBB101_4
8578; RV64I-NEXT:  .LBB101_2: # %atomicrmw.start
8579; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8580; RV64I-NEXT:    and a0, a1, s2
8581; RV64I-NEXT:    mv a2, a1
8582; RV64I-NEXT:    bltu s3, a0, .LBB101_1
8583; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8584; RV64I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8585; RV64I-NEXT:    mv a2, s0
8586; RV64I-NEXT:    j .LBB101_1
8587; RV64I-NEXT:  .LBB101_4: # %atomicrmw.end
8588; RV64I-NEXT:    mv a0, a1
8589; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8590; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8591; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8592; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8593; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8594; RV64I-NEXT:    addi sp, sp, 48
8595; RV64I-NEXT:    ret
8596;
8597; RV64IA-LABEL: atomicrmw_umax_i16_acquire:
8598; RV64IA:       # %bb.0:
8599; RV64IA-NEXT:    andi a2, a0, -4
8600; RV64IA-NEXT:    slliw a0, a0, 3
8601; RV64IA-NEXT:    lui a3, 16
8602; RV64IA-NEXT:    addiw a3, a3, -1
8603; RV64IA-NEXT:    sllw a4, a3, a0
8604; RV64IA-NEXT:    and a1, a1, a3
8605; RV64IA-NEXT:    sllw a1, a1, a0
8606; RV64IA-NEXT:  .LBB101_1: # =>This Inner Loop Header: Depth=1
8607; RV64IA-NEXT:    lr.w.aq a3, (a2)
8608; RV64IA-NEXT:    and a6, a3, a4
8609; RV64IA-NEXT:    mv a5, a3
8610; RV64IA-NEXT:    bgeu a6, a1, .LBB101_3
8611; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB101_1 Depth=1
8612; RV64IA-NEXT:    xor a5, a3, a1
8613; RV64IA-NEXT:    and a5, a5, a4
8614; RV64IA-NEXT:    xor a5, a3, a5
8615; RV64IA-NEXT:  .LBB101_3: # in Loop: Header=BB101_1 Depth=1
8616; RV64IA-NEXT:    sc.w a5, a5, (a2)
8617; RV64IA-NEXT:    bnez a5, .LBB101_1
8618; RV64IA-NEXT:  # %bb.4:
8619; RV64IA-NEXT:    srlw a0, a3, a0
8620; RV64IA-NEXT:    ret
8621  %1 = atomicrmw umax i16* %a, i16 %b acquire
8622  ret i16 %1
8623}
8624
8625define i16 @atomicrmw_umax_i16_release(i16 *%a, i16 %b) nounwind {
8626; RV32I-LABEL: atomicrmw_umax_i16_release:
8627; RV32I:       # %bb.0:
8628; RV32I-NEXT:    addi sp, sp, -32
8629; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8630; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8631; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8632; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8633; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8634; RV32I-NEXT:    mv s0, a1
8635; RV32I-NEXT:    mv s1, a0
8636; RV32I-NEXT:    lhu a1, 0(a0)
8637; RV32I-NEXT:    lui a0, 16
8638; RV32I-NEXT:    addi s2, a0, -1
8639; RV32I-NEXT:    and s3, s0, s2
8640; RV32I-NEXT:    j .LBB102_2
8641; RV32I-NEXT:  .LBB102_1: # %atomicrmw.start
8642; RV32I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8643; RV32I-NEXT:    sh a1, 10(sp)
8644; RV32I-NEXT:    addi a1, sp, 10
8645; RV32I-NEXT:    li a3, 3
8646; RV32I-NEXT:    mv a0, s1
8647; RV32I-NEXT:    li a4, 0
8648; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8649; RV32I-NEXT:    lh a1, 10(sp)
8650; RV32I-NEXT:    bnez a0, .LBB102_4
8651; RV32I-NEXT:  .LBB102_2: # %atomicrmw.start
8652; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8653; RV32I-NEXT:    and a0, a1, s2
8654; RV32I-NEXT:    mv a2, a1
8655; RV32I-NEXT:    bltu s3, a0, .LBB102_1
8656; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8657; RV32I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8658; RV32I-NEXT:    mv a2, s0
8659; RV32I-NEXT:    j .LBB102_1
8660; RV32I-NEXT:  .LBB102_4: # %atomicrmw.end
8661; RV32I-NEXT:    mv a0, a1
8662; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8663; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8664; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8665; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8666; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8667; RV32I-NEXT:    addi sp, sp, 32
8668; RV32I-NEXT:    ret
8669;
8670; RV32IA-LABEL: atomicrmw_umax_i16_release:
8671; RV32IA:       # %bb.0:
8672; RV32IA-NEXT:    andi a2, a0, -4
8673; RV32IA-NEXT:    slli a0, a0, 3
8674; RV32IA-NEXT:    lui a3, 16
8675; RV32IA-NEXT:    addi a3, a3, -1
8676; RV32IA-NEXT:    sll a4, a3, a0
8677; RV32IA-NEXT:    and a1, a1, a3
8678; RV32IA-NEXT:    sll a1, a1, a0
8679; RV32IA-NEXT:  .LBB102_1: # =>This Inner Loop Header: Depth=1
8680; RV32IA-NEXT:    lr.w a3, (a2)
8681; RV32IA-NEXT:    and a6, a3, a4
8682; RV32IA-NEXT:    mv a5, a3
8683; RV32IA-NEXT:    bgeu a6, a1, .LBB102_3
8684; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB102_1 Depth=1
8685; RV32IA-NEXT:    xor a5, a3, a1
8686; RV32IA-NEXT:    and a5, a5, a4
8687; RV32IA-NEXT:    xor a5, a3, a5
8688; RV32IA-NEXT:  .LBB102_3: # in Loop: Header=BB102_1 Depth=1
8689; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
8690; RV32IA-NEXT:    bnez a5, .LBB102_1
8691; RV32IA-NEXT:  # %bb.4:
8692; RV32IA-NEXT:    srl a0, a3, a0
8693; RV32IA-NEXT:    ret
8694;
8695; RV64I-LABEL: atomicrmw_umax_i16_release:
8696; RV64I:       # %bb.0:
8697; RV64I-NEXT:    addi sp, sp, -48
8698; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8699; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8700; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8701; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8702; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8703; RV64I-NEXT:    mv s0, a1
8704; RV64I-NEXT:    mv s1, a0
8705; RV64I-NEXT:    lhu a1, 0(a0)
8706; RV64I-NEXT:    lui a0, 16
8707; RV64I-NEXT:    addiw s2, a0, -1
8708; RV64I-NEXT:    and s3, s0, s2
8709; RV64I-NEXT:    j .LBB102_2
8710; RV64I-NEXT:  .LBB102_1: # %atomicrmw.start
8711; RV64I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8712; RV64I-NEXT:    sh a1, 6(sp)
8713; RV64I-NEXT:    addi a1, sp, 6
8714; RV64I-NEXT:    li a3, 3
8715; RV64I-NEXT:    mv a0, s1
8716; RV64I-NEXT:    li a4, 0
8717; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8718; RV64I-NEXT:    lh a1, 6(sp)
8719; RV64I-NEXT:    bnez a0, .LBB102_4
8720; RV64I-NEXT:  .LBB102_2: # %atomicrmw.start
8721; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8722; RV64I-NEXT:    and a0, a1, s2
8723; RV64I-NEXT:    mv a2, a1
8724; RV64I-NEXT:    bltu s3, a0, .LBB102_1
8725; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8726; RV64I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8727; RV64I-NEXT:    mv a2, s0
8728; RV64I-NEXT:    j .LBB102_1
8729; RV64I-NEXT:  .LBB102_4: # %atomicrmw.end
8730; RV64I-NEXT:    mv a0, a1
8731; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8732; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8733; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8734; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8735; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8736; RV64I-NEXT:    addi sp, sp, 48
8737; RV64I-NEXT:    ret
8738;
8739; RV64IA-LABEL: atomicrmw_umax_i16_release:
8740; RV64IA:       # %bb.0:
8741; RV64IA-NEXT:    andi a2, a0, -4
8742; RV64IA-NEXT:    slliw a0, a0, 3
8743; RV64IA-NEXT:    lui a3, 16
8744; RV64IA-NEXT:    addiw a3, a3, -1
8745; RV64IA-NEXT:    sllw a4, a3, a0
8746; RV64IA-NEXT:    and a1, a1, a3
8747; RV64IA-NEXT:    sllw a1, a1, a0
8748; RV64IA-NEXT:  .LBB102_1: # =>This Inner Loop Header: Depth=1
8749; RV64IA-NEXT:    lr.w a3, (a2)
8750; RV64IA-NEXT:    and a6, a3, a4
8751; RV64IA-NEXT:    mv a5, a3
8752; RV64IA-NEXT:    bgeu a6, a1, .LBB102_3
8753; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB102_1 Depth=1
8754; RV64IA-NEXT:    xor a5, a3, a1
8755; RV64IA-NEXT:    and a5, a5, a4
8756; RV64IA-NEXT:    xor a5, a3, a5
8757; RV64IA-NEXT:  .LBB102_3: # in Loop: Header=BB102_1 Depth=1
8758; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
8759; RV64IA-NEXT:    bnez a5, .LBB102_1
8760; RV64IA-NEXT:  # %bb.4:
8761; RV64IA-NEXT:    srlw a0, a3, a0
8762; RV64IA-NEXT:    ret
8763  %1 = atomicrmw umax i16* %a, i16 %b release
8764  ret i16 %1
8765}
8766
8767define i16 @atomicrmw_umax_i16_acq_rel(i16 *%a, i16 %b) nounwind {
8768; RV32I-LABEL: atomicrmw_umax_i16_acq_rel:
8769; RV32I:       # %bb.0:
8770; RV32I-NEXT:    addi sp, sp, -32
8771; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8772; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8773; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8774; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8775; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8776; RV32I-NEXT:    mv s0, a1
8777; RV32I-NEXT:    mv s1, a0
8778; RV32I-NEXT:    lhu a1, 0(a0)
8779; RV32I-NEXT:    lui a0, 16
8780; RV32I-NEXT:    addi s2, a0, -1
8781; RV32I-NEXT:    and s3, s0, s2
8782; RV32I-NEXT:    j .LBB103_2
8783; RV32I-NEXT:  .LBB103_1: # %atomicrmw.start
8784; RV32I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8785; RV32I-NEXT:    sh a1, 10(sp)
8786; RV32I-NEXT:    addi a1, sp, 10
8787; RV32I-NEXT:    li a3, 4
8788; RV32I-NEXT:    li a4, 2
8789; RV32I-NEXT:    mv a0, s1
8790; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8791; RV32I-NEXT:    lh a1, 10(sp)
8792; RV32I-NEXT:    bnez a0, .LBB103_4
8793; RV32I-NEXT:  .LBB103_2: # %atomicrmw.start
8794; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8795; RV32I-NEXT:    and a0, a1, s2
8796; RV32I-NEXT:    mv a2, a1
8797; RV32I-NEXT:    bltu s3, a0, .LBB103_1
8798; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8799; RV32I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8800; RV32I-NEXT:    mv a2, s0
8801; RV32I-NEXT:    j .LBB103_1
8802; RV32I-NEXT:  .LBB103_4: # %atomicrmw.end
8803; RV32I-NEXT:    mv a0, a1
8804; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8805; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8806; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8807; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8808; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8809; RV32I-NEXT:    addi sp, sp, 32
8810; RV32I-NEXT:    ret
8811;
8812; RV32IA-LABEL: atomicrmw_umax_i16_acq_rel:
8813; RV32IA:       # %bb.0:
8814; RV32IA-NEXT:    andi a2, a0, -4
8815; RV32IA-NEXT:    slli a0, a0, 3
8816; RV32IA-NEXT:    lui a3, 16
8817; RV32IA-NEXT:    addi a3, a3, -1
8818; RV32IA-NEXT:    sll a4, a3, a0
8819; RV32IA-NEXT:    and a1, a1, a3
8820; RV32IA-NEXT:    sll a1, a1, a0
8821; RV32IA-NEXT:  .LBB103_1: # =>This Inner Loop Header: Depth=1
8822; RV32IA-NEXT:    lr.w.aq a3, (a2)
8823; RV32IA-NEXT:    and a6, a3, a4
8824; RV32IA-NEXT:    mv a5, a3
8825; RV32IA-NEXT:    bgeu a6, a1, .LBB103_3
8826; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB103_1 Depth=1
8827; RV32IA-NEXT:    xor a5, a3, a1
8828; RV32IA-NEXT:    and a5, a5, a4
8829; RV32IA-NEXT:    xor a5, a3, a5
8830; RV32IA-NEXT:  .LBB103_3: # in Loop: Header=BB103_1 Depth=1
8831; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
8832; RV32IA-NEXT:    bnez a5, .LBB103_1
8833; RV32IA-NEXT:  # %bb.4:
8834; RV32IA-NEXT:    srl a0, a3, a0
8835; RV32IA-NEXT:    ret
8836;
8837; RV64I-LABEL: atomicrmw_umax_i16_acq_rel:
8838; RV64I:       # %bb.0:
8839; RV64I-NEXT:    addi sp, sp, -48
8840; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8841; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8842; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8843; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8844; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8845; RV64I-NEXT:    mv s0, a1
8846; RV64I-NEXT:    mv s1, a0
8847; RV64I-NEXT:    lhu a1, 0(a0)
8848; RV64I-NEXT:    lui a0, 16
8849; RV64I-NEXT:    addiw s2, a0, -1
8850; RV64I-NEXT:    and s3, s0, s2
8851; RV64I-NEXT:    j .LBB103_2
8852; RV64I-NEXT:  .LBB103_1: # %atomicrmw.start
8853; RV64I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8854; RV64I-NEXT:    sh a1, 6(sp)
8855; RV64I-NEXT:    addi a1, sp, 6
8856; RV64I-NEXT:    li a3, 4
8857; RV64I-NEXT:    li a4, 2
8858; RV64I-NEXT:    mv a0, s1
8859; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8860; RV64I-NEXT:    lh a1, 6(sp)
8861; RV64I-NEXT:    bnez a0, .LBB103_4
8862; RV64I-NEXT:  .LBB103_2: # %atomicrmw.start
8863; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8864; RV64I-NEXT:    and a0, a1, s2
8865; RV64I-NEXT:    mv a2, a1
8866; RV64I-NEXT:    bltu s3, a0, .LBB103_1
8867; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8868; RV64I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8869; RV64I-NEXT:    mv a2, s0
8870; RV64I-NEXT:    j .LBB103_1
8871; RV64I-NEXT:  .LBB103_4: # %atomicrmw.end
8872; RV64I-NEXT:    mv a0, a1
8873; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8874; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8875; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8876; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8877; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8878; RV64I-NEXT:    addi sp, sp, 48
8879; RV64I-NEXT:    ret
8880;
8881; RV64IA-LABEL: atomicrmw_umax_i16_acq_rel:
8882; RV64IA:       # %bb.0:
8883; RV64IA-NEXT:    andi a2, a0, -4
8884; RV64IA-NEXT:    slliw a0, a0, 3
8885; RV64IA-NEXT:    lui a3, 16
8886; RV64IA-NEXT:    addiw a3, a3, -1
8887; RV64IA-NEXT:    sllw a4, a3, a0
8888; RV64IA-NEXT:    and a1, a1, a3
8889; RV64IA-NEXT:    sllw a1, a1, a0
8890; RV64IA-NEXT:  .LBB103_1: # =>This Inner Loop Header: Depth=1
8891; RV64IA-NEXT:    lr.w.aq a3, (a2)
8892; RV64IA-NEXT:    and a6, a3, a4
8893; RV64IA-NEXT:    mv a5, a3
8894; RV64IA-NEXT:    bgeu a6, a1, .LBB103_3
8895; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB103_1 Depth=1
8896; RV64IA-NEXT:    xor a5, a3, a1
8897; RV64IA-NEXT:    and a5, a5, a4
8898; RV64IA-NEXT:    xor a5, a3, a5
8899; RV64IA-NEXT:  .LBB103_3: # in Loop: Header=BB103_1 Depth=1
8900; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
8901; RV64IA-NEXT:    bnez a5, .LBB103_1
8902; RV64IA-NEXT:  # %bb.4:
8903; RV64IA-NEXT:    srlw a0, a3, a0
8904; RV64IA-NEXT:    ret
8905  %1 = atomicrmw umax i16* %a, i16 %b acq_rel
8906  ret i16 %1
8907}
8908
8909define i16 @atomicrmw_umax_i16_seq_cst(i16 *%a, i16 %b) nounwind {
8910; RV32I-LABEL: atomicrmw_umax_i16_seq_cst:
8911; RV32I:       # %bb.0:
8912; RV32I-NEXT:    addi sp, sp, -32
8913; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8914; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8915; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8916; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8917; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8918; RV32I-NEXT:    mv s0, a1
8919; RV32I-NEXT:    mv s1, a0
8920; RV32I-NEXT:    lhu a1, 0(a0)
8921; RV32I-NEXT:    lui a0, 16
8922; RV32I-NEXT:    addi s2, a0, -1
8923; RV32I-NEXT:    and s3, s0, s2
8924; RV32I-NEXT:    j .LBB104_2
8925; RV32I-NEXT:  .LBB104_1: # %atomicrmw.start
8926; RV32I-NEXT:    # in Loop: Header=BB104_2 Depth=1
8927; RV32I-NEXT:    sh a1, 10(sp)
8928; RV32I-NEXT:    addi a1, sp, 10
8929; RV32I-NEXT:    li a3, 5
8930; RV32I-NEXT:    li a4, 5
8931; RV32I-NEXT:    mv a0, s1
8932; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8933; RV32I-NEXT:    lh a1, 10(sp)
8934; RV32I-NEXT:    bnez a0, .LBB104_4
8935; RV32I-NEXT:  .LBB104_2: # %atomicrmw.start
8936; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8937; RV32I-NEXT:    and a0, a1, s2
8938; RV32I-NEXT:    mv a2, a1
8939; RV32I-NEXT:    bltu s3, a0, .LBB104_1
8940; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8941; RV32I-NEXT:    # in Loop: Header=BB104_2 Depth=1
8942; RV32I-NEXT:    mv a2, s0
8943; RV32I-NEXT:    j .LBB104_1
8944; RV32I-NEXT:  .LBB104_4: # %atomicrmw.end
8945; RV32I-NEXT:    mv a0, a1
8946; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8947; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8948; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8949; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8950; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8951; RV32I-NEXT:    addi sp, sp, 32
8952; RV32I-NEXT:    ret
8953;
8954; RV32IA-LABEL: atomicrmw_umax_i16_seq_cst:
8955; RV32IA:       # %bb.0:
8956; RV32IA-NEXT:    andi a2, a0, -4
8957; RV32IA-NEXT:    slli a0, a0, 3
8958; RV32IA-NEXT:    lui a3, 16
8959; RV32IA-NEXT:    addi a3, a3, -1
8960; RV32IA-NEXT:    sll a4, a3, a0
8961; RV32IA-NEXT:    and a1, a1, a3
8962; RV32IA-NEXT:    sll a1, a1, a0
8963; RV32IA-NEXT:  .LBB104_1: # =>This Inner Loop Header: Depth=1
8964; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
8965; RV32IA-NEXT:    and a6, a3, a4
8966; RV32IA-NEXT:    mv a5, a3
8967; RV32IA-NEXT:    bgeu a6, a1, .LBB104_3
8968; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB104_1 Depth=1
8969; RV32IA-NEXT:    xor a5, a3, a1
8970; RV32IA-NEXT:    and a5, a5, a4
8971; RV32IA-NEXT:    xor a5, a3, a5
8972; RV32IA-NEXT:  .LBB104_3: # in Loop: Header=BB104_1 Depth=1
8973; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
8974; RV32IA-NEXT:    bnez a5, .LBB104_1
8975; RV32IA-NEXT:  # %bb.4:
8976; RV32IA-NEXT:    srl a0, a3, a0
8977; RV32IA-NEXT:    ret
8978;
8979; RV64I-LABEL: atomicrmw_umax_i16_seq_cst:
8980; RV64I:       # %bb.0:
8981; RV64I-NEXT:    addi sp, sp, -48
8982; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8983; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8984; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8985; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8986; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8987; RV64I-NEXT:    mv s0, a1
8988; RV64I-NEXT:    mv s1, a0
8989; RV64I-NEXT:    lhu a1, 0(a0)
8990; RV64I-NEXT:    lui a0, 16
8991; RV64I-NEXT:    addiw s2, a0, -1
8992; RV64I-NEXT:    and s3, s0, s2
8993; RV64I-NEXT:    j .LBB104_2
8994; RV64I-NEXT:  .LBB104_1: # %atomicrmw.start
8995; RV64I-NEXT:    # in Loop: Header=BB104_2 Depth=1
8996; RV64I-NEXT:    sh a1, 6(sp)
8997; RV64I-NEXT:    addi a1, sp, 6
8998; RV64I-NEXT:    li a3, 5
8999; RV64I-NEXT:    li a4, 5
9000; RV64I-NEXT:    mv a0, s1
9001; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9002; RV64I-NEXT:    lh a1, 6(sp)
9003; RV64I-NEXT:    bnez a0, .LBB104_4
9004; RV64I-NEXT:  .LBB104_2: # %atomicrmw.start
9005; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9006; RV64I-NEXT:    and a0, a1, s2
9007; RV64I-NEXT:    mv a2, a1
9008; RV64I-NEXT:    bltu s3, a0, .LBB104_1
9009; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9010; RV64I-NEXT:    # in Loop: Header=BB104_2 Depth=1
9011; RV64I-NEXT:    mv a2, s0
9012; RV64I-NEXT:    j .LBB104_1
9013; RV64I-NEXT:  .LBB104_4: # %atomicrmw.end
9014; RV64I-NEXT:    mv a0, a1
9015; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9016; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9017; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9018; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9019; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9020; RV64I-NEXT:    addi sp, sp, 48
9021; RV64I-NEXT:    ret
9022;
9023; RV64IA-LABEL: atomicrmw_umax_i16_seq_cst:
9024; RV64IA:       # %bb.0:
9025; RV64IA-NEXT:    andi a2, a0, -4
9026; RV64IA-NEXT:    slliw a0, a0, 3
9027; RV64IA-NEXT:    lui a3, 16
9028; RV64IA-NEXT:    addiw a3, a3, -1
9029; RV64IA-NEXT:    sllw a4, a3, a0
9030; RV64IA-NEXT:    and a1, a1, a3
9031; RV64IA-NEXT:    sllw a1, a1, a0
9032; RV64IA-NEXT:  .LBB104_1: # =>This Inner Loop Header: Depth=1
9033; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
9034; RV64IA-NEXT:    and a6, a3, a4
9035; RV64IA-NEXT:    mv a5, a3
9036; RV64IA-NEXT:    bgeu a6, a1, .LBB104_3
9037; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB104_1 Depth=1
9038; RV64IA-NEXT:    xor a5, a3, a1
9039; RV64IA-NEXT:    and a5, a5, a4
9040; RV64IA-NEXT:    xor a5, a3, a5
9041; RV64IA-NEXT:  .LBB104_3: # in Loop: Header=BB104_1 Depth=1
9042; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
9043; RV64IA-NEXT:    bnez a5, .LBB104_1
9044; RV64IA-NEXT:  # %bb.4:
9045; RV64IA-NEXT:    srlw a0, a3, a0
9046; RV64IA-NEXT:    ret
9047  %1 = atomicrmw umax i16* %a, i16 %b seq_cst
9048  ret i16 %1
9049}
9050
9051define i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind {
9052; RV32I-LABEL: atomicrmw_umin_i16_monotonic:
9053; RV32I:       # %bb.0:
9054; RV32I-NEXT:    addi sp, sp, -32
9055; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9056; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9057; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9058; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9059; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9060; RV32I-NEXT:    mv s0, a1
9061; RV32I-NEXT:    mv s1, a0
9062; RV32I-NEXT:    lhu a1, 0(a0)
9063; RV32I-NEXT:    lui a0, 16
9064; RV32I-NEXT:    addi s2, a0, -1
9065; RV32I-NEXT:    and s3, s0, s2
9066; RV32I-NEXT:    j .LBB105_2
9067; RV32I-NEXT:  .LBB105_1: # %atomicrmw.start
9068; RV32I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9069; RV32I-NEXT:    sh a1, 10(sp)
9070; RV32I-NEXT:    addi a1, sp, 10
9071; RV32I-NEXT:    mv a0, s1
9072; RV32I-NEXT:    li a3, 0
9073; RV32I-NEXT:    li a4, 0
9074; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9075; RV32I-NEXT:    lh a1, 10(sp)
9076; RV32I-NEXT:    bnez a0, .LBB105_4
9077; RV32I-NEXT:  .LBB105_2: # %atomicrmw.start
9078; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9079; RV32I-NEXT:    and a0, a1, s2
9080; RV32I-NEXT:    mv a2, a1
9081; RV32I-NEXT:    bgeu s3, a0, .LBB105_1
9082; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9083; RV32I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9084; RV32I-NEXT:    mv a2, s0
9085; RV32I-NEXT:    j .LBB105_1
9086; RV32I-NEXT:  .LBB105_4: # %atomicrmw.end
9087; RV32I-NEXT:    mv a0, a1
9088; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9089; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9090; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9091; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9092; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9093; RV32I-NEXT:    addi sp, sp, 32
9094; RV32I-NEXT:    ret
9095;
9096; RV32IA-LABEL: atomicrmw_umin_i16_monotonic:
9097; RV32IA:       # %bb.0:
9098; RV32IA-NEXT:    andi a2, a0, -4
9099; RV32IA-NEXT:    slli a0, a0, 3
9100; RV32IA-NEXT:    lui a3, 16
9101; RV32IA-NEXT:    addi a3, a3, -1
9102; RV32IA-NEXT:    sll a4, a3, a0
9103; RV32IA-NEXT:    and a1, a1, a3
9104; RV32IA-NEXT:    sll a1, a1, a0
9105; RV32IA-NEXT:  .LBB105_1: # =>This Inner Loop Header: Depth=1
9106; RV32IA-NEXT:    lr.w a3, (a2)
9107; RV32IA-NEXT:    and a6, a3, a4
9108; RV32IA-NEXT:    mv a5, a3
9109; RV32IA-NEXT:    bgeu a1, a6, .LBB105_3
9110; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB105_1 Depth=1
9111; RV32IA-NEXT:    xor a5, a3, a1
9112; RV32IA-NEXT:    and a5, a5, a4
9113; RV32IA-NEXT:    xor a5, a3, a5
9114; RV32IA-NEXT:  .LBB105_3: # in Loop: Header=BB105_1 Depth=1
9115; RV32IA-NEXT:    sc.w a5, a5, (a2)
9116; RV32IA-NEXT:    bnez a5, .LBB105_1
9117; RV32IA-NEXT:  # %bb.4:
9118; RV32IA-NEXT:    srl a0, a3, a0
9119; RV32IA-NEXT:    ret
9120;
9121; RV64I-LABEL: atomicrmw_umin_i16_monotonic:
9122; RV64I:       # %bb.0:
9123; RV64I-NEXT:    addi sp, sp, -48
9124; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9125; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9126; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9127; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9128; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9129; RV64I-NEXT:    mv s0, a1
9130; RV64I-NEXT:    mv s1, a0
9131; RV64I-NEXT:    lhu a1, 0(a0)
9132; RV64I-NEXT:    lui a0, 16
9133; RV64I-NEXT:    addiw s2, a0, -1
9134; RV64I-NEXT:    and s3, s0, s2
9135; RV64I-NEXT:    j .LBB105_2
9136; RV64I-NEXT:  .LBB105_1: # %atomicrmw.start
9137; RV64I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9138; RV64I-NEXT:    sh a1, 6(sp)
9139; RV64I-NEXT:    addi a1, sp, 6
9140; RV64I-NEXT:    mv a0, s1
9141; RV64I-NEXT:    li a3, 0
9142; RV64I-NEXT:    li a4, 0
9143; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9144; RV64I-NEXT:    lh a1, 6(sp)
9145; RV64I-NEXT:    bnez a0, .LBB105_4
9146; RV64I-NEXT:  .LBB105_2: # %atomicrmw.start
9147; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9148; RV64I-NEXT:    and a0, a1, s2
9149; RV64I-NEXT:    mv a2, a1
9150; RV64I-NEXT:    bgeu s3, a0, .LBB105_1
9151; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9152; RV64I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9153; RV64I-NEXT:    mv a2, s0
9154; RV64I-NEXT:    j .LBB105_1
9155; RV64I-NEXT:  .LBB105_4: # %atomicrmw.end
9156; RV64I-NEXT:    mv a0, a1
9157; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9158; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9159; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9160; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9161; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9162; RV64I-NEXT:    addi sp, sp, 48
9163; RV64I-NEXT:    ret
9164;
9165; RV64IA-LABEL: atomicrmw_umin_i16_monotonic:
9166; RV64IA:       # %bb.0:
9167; RV64IA-NEXT:    andi a2, a0, -4
9168; RV64IA-NEXT:    slliw a0, a0, 3
9169; RV64IA-NEXT:    lui a3, 16
9170; RV64IA-NEXT:    addiw a3, a3, -1
9171; RV64IA-NEXT:    sllw a4, a3, a0
9172; RV64IA-NEXT:    and a1, a1, a3
9173; RV64IA-NEXT:    sllw a1, a1, a0
9174; RV64IA-NEXT:  .LBB105_1: # =>This Inner Loop Header: Depth=1
9175; RV64IA-NEXT:    lr.w a3, (a2)
9176; RV64IA-NEXT:    and a6, a3, a4
9177; RV64IA-NEXT:    mv a5, a3
9178; RV64IA-NEXT:    bgeu a1, a6, .LBB105_3
9179; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB105_1 Depth=1
9180; RV64IA-NEXT:    xor a5, a3, a1
9181; RV64IA-NEXT:    and a5, a5, a4
9182; RV64IA-NEXT:    xor a5, a3, a5
9183; RV64IA-NEXT:  .LBB105_3: # in Loop: Header=BB105_1 Depth=1
9184; RV64IA-NEXT:    sc.w a5, a5, (a2)
9185; RV64IA-NEXT:    bnez a5, .LBB105_1
9186; RV64IA-NEXT:  # %bb.4:
9187; RV64IA-NEXT:    srlw a0, a3, a0
9188; RV64IA-NEXT:    ret
9189  %1 = atomicrmw umin i16* %a, i16 %b monotonic
9190  ret i16 %1
9191}
9192
9193define i16 @atomicrmw_umin_i16_acquire(i16 *%a, i16 %b) nounwind {
9194; RV32I-LABEL: atomicrmw_umin_i16_acquire:
9195; RV32I:       # %bb.0:
9196; RV32I-NEXT:    addi sp, sp, -32
9197; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9198; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9199; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9200; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9201; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9202; RV32I-NEXT:    mv s0, a1
9203; RV32I-NEXT:    mv s1, a0
9204; RV32I-NEXT:    lhu a1, 0(a0)
9205; RV32I-NEXT:    lui a0, 16
9206; RV32I-NEXT:    addi s2, a0, -1
9207; RV32I-NEXT:    and s3, s0, s2
9208; RV32I-NEXT:    j .LBB106_2
9209; RV32I-NEXT:  .LBB106_1: # %atomicrmw.start
9210; RV32I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9211; RV32I-NEXT:    sh a1, 10(sp)
9212; RV32I-NEXT:    addi a1, sp, 10
9213; RV32I-NEXT:    li a3, 2
9214; RV32I-NEXT:    li a4, 2
9215; RV32I-NEXT:    mv a0, s1
9216; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9217; RV32I-NEXT:    lh a1, 10(sp)
9218; RV32I-NEXT:    bnez a0, .LBB106_4
9219; RV32I-NEXT:  .LBB106_2: # %atomicrmw.start
9220; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9221; RV32I-NEXT:    and a0, a1, s2
9222; RV32I-NEXT:    mv a2, a1
9223; RV32I-NEXT:    bgeu s3, a0, .LBB106_1
9224; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9225; RV32I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9226; RV32I-NEXT:    mv a2, s0
9227; RV32I-NEXT:    j .LBB106_1
9228; RV32I-NEXT:  .LBB106_4: # %atomicrmw.end
9229; RV32I-NEXT:    mv a0, a1
9230; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9231; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9232; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9233; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9234; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9235; RV32I-NEXT:    addi sp, sp, 32
9236; RV32I-NEXT:    ret
9237;
9238; RV32IA-LABEL: atomicrmw_umin_i16_acquire:
9239; RV32IA:       # %bb.0:
9240; RV32IA-NEXT:    andi a2, a0, -4
9241; RV32IA-NEXT:    slli a0, a0, 3
9242; RV32IA-NEXT:    lui a3, 16
9243; RV32IA-NEXT:    addi a3, a3, -1
9244; RV32IA-NEXT:    sll a4, a3, a0
9245; RV32IA-NEXT:    and a1, a1, a3
9246; RV32IA-NEXT:    sll a1, a1, a0
9247; RV32IA-NEXT:  .LBB106_1: # =>This Inner Loop Header: Depth=1
9248; RV32IA-NEXT:    lr.w.aq a3, (a2)
9249; RV32IA-NEXT:    and a6, a3, a4
9250; RV32IA-NEXT:    mv a5, a3
9251; RV32IA-NEXT:    bgeu a1, a6, .LBB106_3
9252; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB106_1 Depth=1
9253; RV32IA-NEXT:    xor a5, a3, a1
9254; RV32IA-NEXT:    and a5, a5, a4
9255; RV32IA-NEXT:    xor a5, a3, a5
9256; RV32IA-NEXT:  .LBB106_3: # in Loop: Header=BB106_1 Depth=1
9257; RV32IA-NEXT:    sc.w a5, a5, (a2)
9258; RV32IA-NEXT:    bnez a5, .LBB106_1
9259; RV32IA-NEXT:  # %bb.4:
9260; RV32IA-NEXT:    srl a0, a3, a0
9261; RV32IA-NEXT:    ret
9262;
9263; RV64I-LABEL: atomicrmw_umin_i16_acquire:
9264; RV64I:       # %bb.0:
9265; RV64I-NEXT:    addi sp, sp, -48
9266; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9267; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9268; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9269; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9270; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9271; RV64I-NEXT:    mv s0, a1
9272; RV64I-NEXT:    mv s1, a0
9273; RV64I-NEXT:    lhu a1, 0(a0)
9274; RV64I-NEXT:    lui a0, 16
9275; RV64I-NEXT:    addiw s2, a0, -1
9276; RV64I-NEXT:    and s3, s0, s2
9277; RV64I-NEXT:    j .LBB106_2
9278; RV64I-NEXT:  .LBB106_1: # %atomicrmw.start
9279; RV64I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9280; RV64I-NEXT:    sh a1, 6(sp)
9281; RV64I-NEXT:    addi a1, sp, 6
9282; RV64I-NEXT:    li a3, 2
9283; RV64I-NEXT:    li a4, 2
9284; RV64I-NEXT:    mv a0, s1
9285; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9286; RV64I-NEXT:    lh a1, 6(sp)
9287; RV64I-NEXT:    bnez a0, .LBB106_4
9288; RV64I-NEXT:  .LBB106_2: # %atomicrmw.start
9289; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9290; RV64I-NEXT:    and a0, a1, s2
9291; RV64I-NEXT:    mv a2, a1
9292; RV64I-NEXT:    bgeu s3, a0, .LBB106_1
9293; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9294; RV64I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9295; RV64I-NEXT:    mv a2, s0
9296; RV64I-NEXT:    j .LBB106_1
9297; RV64I-NEXT:  .LBB106_4: # %atomicrmw.end
9298; RV64I-NEXT:    mv a0, a1
9299; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9300; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9301; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9302; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9303; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9304; RV64I-NEXT:    addi sp, sp, 48
9305; RV64I-NEXT:    ret
9306;
9307; RV64IA-LABEL: atomicrmw_umin_i16_acquire:
9308; RV64IA:       # %bb.0:
9309; RV64IA-NEXT:    andi a2, a0, -4
9310; RV64IA-NEXT:    slliw a0, a0, 3
9311; RV64IA-NEXT:    lui a3, 16
9312; RV64IA-NEXT:    addiw a3, a3, -1
9313; RV64IA-NEXT:    sllw a4, a3, a0
9314; RV64IA-NEXT:    and a1, a1, a3
9315; RV64IA-NEXT:    sllw a1, a1, a0
9316; RV64IA-NEXT:  .LBB106_1: # =>This Inner Loop Header: Depth=1
9317; RV64IA-NEXT:    lr.w.aq a3, (a2)
9318; RV64IA-NEXT:    and a6, a3, a4
9319; RV64IA-NEXT:    mv a5, a3
9320; RV64IA-NEXT:    bgeu a1, a6, .LBB106_3
9321; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB106_1 Depth=1
9322; RV64IA-NEXT:    xor a5, a3, a1
9323; RV64IA-NEXT:    and a5, a5, a4
9324; RV64IA-NEXT:    xor a5, a3, a5
9325; RV64IA-NEXT:  .LBB106_3: # in Loop: Header=BB106_1 Depth=1
9326; RV64IA-NEXT:    sc.w a5, a5, (a2)
9327; RV64IA-NEXT:    bnez a5, .LBB106_1
9328; RV64IA-NEXT:  # %bb.4:
9329; RV64IA-NEXT:    srlw a0, a3, a0
9330; RV64IA-NEXT:    ret
9331  %1 = atomicrmw umin i16* %a, i16 %b acquire
9332  ret i16 %1
9333}
9334
9335define i16 @atomicrmw_umin_i16_release(i16 *%a, i16 %b) nounwind {
9336; RV32I-LABEL: atomicrmw_umin_i16_release:
9337; RV32I:       # %bb.0:
9338; RV32I-NEXT:    addi sp, sp, -32
9339; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9340; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9341; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9342; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9343; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9344; RV32I-NEXT:    mv s0, a1
9345; RV32I-NEXT:    mv s1, a0
9346; RV32I-NEXT:    lhu a1, 0(a0)
9347; RV32I-NEXT:    lui a0, 16
9348; RV32I-NEXT:    addi s2, a0, -1
9349; RV32I-NEXT:    and s3, s0, s2
9350; RV32I-NEXT:    j .LBB107_2
9351; RV32I-NEXT:  .LBB107_1: # %atomicrmw.start
9352; RV32I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9353; RV32I-NEXT:    sh a1, 10(sp)
9354; RV32I-NEXT:    addi a1, sp, 10
9355; RV32I-NEXT:    li a3, 3
9356; RV32I-NEXT:    mv a0, s1
9357; RV32I-NEXT:    li a4, 0
9358; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9359; RV32I-NEXT:    lh a1, 10(sp)
9360; RV32I-NEXT:    bnez a0, .LBB107_4
9361; RV32I-NEXT:  .LBB107_2: # %atomicrmw.start
9362; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9363; RV32I-NEXT:    and a0, a1, s2
9364; RV32I-NEXT:    mv a2, a1
9365; RV32I-NEXT:    bgeu s3, a0, .LBB107_1
9366; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9367; RV32I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9368; RV32I-NEXT:    mv a2, s0
9369; RV32I-NEXT:    j .LBB107_1
9370; RV32I-NEXT:  .LBB107_4: # %atomicrmw.end
9371; RV32I-NEXT:    mv a0, a1
9372; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9373; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9374; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9375; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9376; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9377; RV32I-NEXT:    addi sp, sp, 32
9378; RV32I-NEXT:    ret
9379;
9380; RV32IA-LABEL: atomicrmw_umin_i16_release:
9381; RV32IA:       # %bb.0:
9382; RV32IA-NEXT:    andi a2, a0, -4
9383; RV32IA-NEXT:    slli a0, a0, 3
9384; RV32IA-NEXT:    lui a3, 16
9385; RV32IA-NEXT:    addi a3, a3, -1
9386; RV32IA-NEXT:    sll a4, a3, a0
9387; RV32IA-NEXT:    and a1, a1, a3
9388; RV32IA-NEXT:    sll a1, a1, a0
9389; RV32IA-NEXT:  .LBB107_1: # =>This Inner Loop Header: Depth=1
9390; RV32IA-NEXT:    lr.w a3, (a2)
9391; RV32IA-NEXT:    and a6, a3, a4
9392; RV32IA-NEXT:    mv a5, a3
9393; RV32IA-NEXT:    bgeu a1, a6, .LBB107_3
9394; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB107_1 Depth=1
9395; RV32IA-NEXT:    xor a5, a3, a1
9396; RV32IA-NEXT:    and a5, a5, a4
9397; RV32IA-NEXT:    xor a5, a3, a5
9398; RV32IA-NEXT:  .LBB107_3: # in Loop: Header=BB107_1 Depth=1
9399; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
9400; RV32IA-NEXT:    bnez a5, .LBB107_1
9401; RV32IA-NEXT:  # %bb.4:
9402; RV32IA-NEXT:    srl a0, a3, a0
9403; RV32IA-NEXT:    ret
9404;
9405; RV64I-LABEL: atomicrmw_umin_i16_release:
9406; RV64I:       # %bb.0:
9407; RV64I-NEXT:    addi sp, sp, -48
9408; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9409; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9410; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9411; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9412; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9413; RV64I-NEXT:    mv s0, a1
9414; RV64I-NEXT:    mv s1, a0
9415; RV64I-NEXT:    lhu a1, 0(a0)
9416; RV64I-NEXT:    lui a0, 16
9417; RV64I-NEXT:    addiw s2, a0, -1
9418; RV64I-NEXT:    and s3, s0, s2
9419; RV64I-NEXT:    j .LBB107_2
9420; RV64I-NEXT:  .LBB107_1: # %atomicrmw.start
9421; RV64I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9422; RV64I-NEXT:    sh a1, 6(sp)
9423; RV64I-NEXT:    addi a1, sp, 6
9424; RV64I-NEXT:    li a3, 3
9425; RV64I-NEXT:    mv a0, s1
9426; RV64I-NEXT:    li a4, 0
9427; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9428; RV64I-NEXT:    lh a1, 6(sp)
9429; RV64I-NEXT:    bnez a0, .LBB107_4
9430; RV64I-NEXT:  .LBB107_2: # %atomicrmw.start
9431; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9432; RV64I-NEXT:    and a0, a1, s2
9433; RV64I-NEXT:    mv a2, a1
9434; RV64I-NEXT:    bgeu s3, a0, .LBB107_1
9435; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9436; RV64I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9437; RV64I-NEXT:    mv a2, s0
9438; RV64I-NEXT:    j .LBB107_1
9439; RV64I-NEXT:  .LBB107_4: # %atomicrmw.end
9440; RV64I-NEXT:    mv a0, a1
9441; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9442; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9443; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9444; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9445; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9446; RV64I-NEXT:    addi sp, sp, 48
9447; RV64I-NEXT:    ret
9448;
9449; RV64IA-LABEL: atomicrmw_umin_i16_release:
9450; RV64IA:       # %bb.0:
9451; RV64IA-NEXT:    andi a2, a0, -4
9452; RV64IA-NEXT:    slliw a0, a0, 3
9453; RV64IA-NEXT:    lui a3, 16
9454; RV64IA-NEXT:    addiw a3, a3, -1
9455; RV64IA-NEXT:    sllw a4, a3, a0
9456; RV64IA-NEXT:    and a1, a1, a3
9457; RV64IA-NEXT:    sllw a1, a1, a0
9458; RV64IA-NEXT:  .LBB107_1: # =>This Inner Loop Header: Depth=1
9459; RV64IA-NEXT:    lr.w a3, (a2)
9460; RV64IA-NEXT:    and a6, a3, a4
9461; RV64IA-NEXT:    mv a5, a3
9462; RV64IA-NEXT:    bgeu a1, a6, .LBB107_3
9463; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB107_1 Depth=1
9464; RV64IA-NEXT:    xor a5, a3, a1
9465; RV64IA-NEXT:    and a5, a5, a4
9466; RV64IA-NEXT:    xor a5, a3, a5
9467; RV64IA-NEXT:  .LBB107_3: # in Loop: Header=BB107_1 Depth=1
9468; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
9469; RV64IA-NEXT:    bnez a5, .LBB107_1
9470; RV64IA-NEXT:  # %bb.4:
9471; RV64IA-NEXT:    srlw a0, a3, a0
9472; RV64IA-NEXT:    ret
9473  %1 = atomicrmw umin i16* %a, i16 %b release
9474  ret i16 %1
9475}
9476
9477define i16 @atomicrmw_umin_i16_acq_rel(i16 *%a, i16 %b) nounwind {
9478; RV32I-LABEL: atomicrmw_umin_i16_acq_rel:
9479; RV32I:       # %bb.0:
9480; RV32I-NEXT:    addi sp, sp, -32
9481; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9482; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9483; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9484; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9485; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9486; RV32I-NEXT:    mv s0, a1
9487; RV32I-NEXT:    mv s1, a0
9488; RV32I-NEXT:    lhu a1, 0(a0)
9489; RV32I-NEXT:    lui a0, 16
9490; RV32I-NEXT:    addi s2, a0, -1
9491; RV32I-NEXT:    and s3, s0, s2
9492; RV32I-NEXT:    j .LBB108_2
9493; RV32I-NEXT:  .LBB108_1: # %atomicrmw.start
9494; RV32I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9495; RV32I-NEXT:    sh a1, 10(sp)
9496; RV32I-NEXT:    addi a1, sp, 10
9497; RV32I-NEXT:    li a3, 4
9498; RV32I-NEXT:    li a4, 2
9499; RV32I-NEXT:    mv a0, s1
9500; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9501; RV32I-NEXT:    lh a1, 10(sp)
9502; RV32I-NEXT:    bnez a0, .LBB108_4
9503; RV32I-NEXT:  .LBB108_2: # %atomicrmw.start
9504; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9505; RV32I-NEXT:    and a0, a1, s2
9506; RV32I-NEXT:    mv a2, a1
9507; RV32I-NEXT:    bgeu s3, a0, .LBB108_1
9508; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9509; RV32I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9510; RV32I-NEXT:    mv a2, s0
9511; RV32I-NEXT:    j .LBB108_1
9512; RV32I-NEXT:  .LBB108_4: # %atomicrmw.end
9513; RV32I-NEXT:    mv a0, a1
9514; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9515; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9516; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9517; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9518; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9519; RV32I-NEXT:    addi sp, sp, 32
9520; RV32I-NEXT:    ret
9521;
9522; RV32IA-LABEL: atomicrmw_umin_i16_acq_rel:
9523; RV32IA:       # %bb.0:
9524; RV32IA-NEXT:    andi a2, a0, -4
9525; RV32IA-NEXT:    slli a0, a0, 3
9526; RV32IA-NEXT:    lui a3, 16
9527; RV32IA-NEXT:    addi a3, a3, -1
9528; RV32IA-NEXT:    sll a4, a3, a0
9529; RV32IA-NEXT:    and a1, a1, a3
9530; RV32IA-NEXT:    sll a1, a1, a0
9531; RV32IA-NEXT:  .LBB108_1: # =>This Inner Loop Header: Depth=1
9532; RV32IA-NEXT:    lr.w.aq a3, (a2)
9533; RV32IA-NEXT:    and a6, a3, a4
9534; RV32IA-NEXT:    mv a5, a3
9535; RV32IA-NEXT:    bgeu a1, a6, .LBB108_3
9536; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB108_1 Depth=1
9537; RV32IA-NEXT:    xor a5, a3, a1
9538; RV32IA-NEXT:    and a5, a5, a4
9539; RV32IA-NEXT:    xor a5, a3, a5
9540; RV32IA-NEXT:  .LBB108_3: # in Loop: Header=BB108_1 Depth=1
9541; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
9542; RV32IA-NEXT:    bnez a5, .LBB108_1
9543; RV32IA-NEXT:  # %bb.4:
9544; RV32IA-NEXT:    srl a0, a3, a0
9545; RV32IA-NEXT:    ret
9546;
9547; RV64I-LABEL: atomicrmw_umin_i16_acq_rel:
9548; RV64I:       # %bb.0:
9549; RV64I-NEXT:    addi sp, sp, -48
9550; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9551; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9552; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9553; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9554; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9555; RV64I-NEXT:    mv s0, a1
9556; RV64I-NEXT:    mv s1, a0
9557; RV64I-NEXT:    lhu a1, 0(a0)
9558; RV64I-NEXT:    lui a0, 16
9559; RV64I-NEXT:    addiw s2, a0, -1
9560; RV64I-NEXT:    and s3, s0, s2
9561; RV64I-NEXT:    j .LBB108_2
9562; RV64I-NEXT:  .LBB108_1: # %atomicrmw.start
9563; RV64I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9564; RV64I-NEXT:    sh a1, 6(sp)
9565; RV64I-NEXT:    addi a1, sp, 6
9566; RV64I-NEXT:    li a3, 4
9567; RV64I-NEXT:    li a4, 2
9568; RV64I-NEXT:    mv a0, s1
9569; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9570; RV64I-NEXT:    lh a1, 6(sp)
9571; RV64I-NEXT:    bnez a0, .LBB108_4
9572; RV64I-NEXT:  .LBB108_2: # %atomicrmw.start
9573; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9574; RV64I-NEXT:    and a0, a1, s2
9575; RV64I-NEXT:    mv a2, a1
9576; RV64I-NEXT:    bgeu s3, a0, .LBB108_1
9577; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9578; RV64I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9579; RV64I-NEXT:    mv a2, s0
9580; RV64I-NEXT:    j .LBB108_1
9581; RV64I-NEXT:  .LBB108_4: # %atomicrmw.end
9582; RV64I-NEXT:    mv a0, a1
9583; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9584; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9585; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9586; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9587; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9588; RV64I-NEXT:    addi sp, sp, 48
9589; RV64I-NEXT:    ret
9590;
9591; RV64IA-LABEL: atomicrmw_umin_i16_acq_rel:
9592; RV64IA:       # %bb.0:
9593; RV64IA-NEXT:    andi a2, a0, -4
9594; RV64IA-NEXT:    slliw a0, a0, 3
9595; RV64IA-NEXT:    lui a3, 16
9596; RV64IA-NEXT:    addiw a3, a3, -1
9597; RV64IA-NEXT:    sllw a4, a3, a0
9598; RV64IA-NEXT:    and a1, a1, a3
9599; RV64IA-NEXT:    sllw a1, a1, a0
9600; RV64IA-NEXT:  .LBB108_1: # =>This Inner Loop Header: Depth=1
9601; RV64IA-NEXT:    lr.w.aq a3, (a2)
9602; RV64IA-NEXT:    and a6, a3, a4
9603; RV64IA-NEXT:    mv a5, a3
9604; RV64IA-NEXT:    bgeu a1, a6, .LBB108_3
9605; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB108_1 Depth=1
9606; RV64IA-NEXT:    xor a5, a3, a1
9607; RV64IA-NEXT:    and a5, a5, a4
9608; RV64IA-NEXT:    xor a5, a3, a5
9609; RV64IA-NEXT:  .LBB108_3: # in Loop: Header=BB108_1 Depth=1
9610; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
9611; RV64IA-NEXT:    bnez a5, .LBB108_1
9612; RV64IA-NEXT:  # %bb.4:
9613; RV64IA-NEXT:    srlw a0, a3, a0
9614; RV64IA-NEXT:    ret
9615  %1 = atomicrmw umin i16* %a, i16 %b acq_rel
9616  ret i16 %1
9617}
9618
9619define i16 @atomicrmw_umin_i16_seq_cst(i16 *%a, i16 %b) nounwind {
9620; RV32I-LABEL: atomicrmw_umin_i16_seq_cst:
9621; RV32I:       # %bb.0:
9622; RV32I-NEXT:    addi sp, sp, -32
9623; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9624; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9625; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9626; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9627; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9628; RV32I-NEXT:    mv s0, a1
9629; RV32I-NEXT:    mv s1, a0
9630; RV32I-NEXT:    lhu a1, 0(a0)
9631; RV32I-NEXT:    lui a0, 16
9632; RV32I-NEXT:    addi s2, a0, -1
9633; RV32I-NEXT:    and s3, s0, s2
9634; RV32I-NEXT:    j .LBB109_2
9635; RV32I-NEXT:  .LBB109_1: # %atomicrmw.start
9636; RV32I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9637; RV32I-NEXT:    sh a1, 10(sp)
9638; RV32I-NEXT:    addi a1, sp, 10
9639; RV32I-NEXT:    li a3, 5
9640; RV32I-NEXT:    li a4, 5
9641; RV32I-NEXT:    mv a0, s1
9642; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9643; RV32I-NEXT:    lh a1, 10(sp)
9644; RV32I-NEXT:    bnez a0, .LBB109_4
9645; RV32I-NEXT:  .LBB109_2: # %atomicrmw.start
9646; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9647; RV32I-NEXT:    and a0, a1, s2
9648; RV32I-NEXT:    mv a2, a1
9649; RV32I-NEXT:    bgeu s3, a0, .LBB109_1
9650; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9651; RV32I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9652; RV32I-NEXT:    mv a2, s0
9653; RV32I-NEXT:    j .LBB109_1
9654; RV32I-NEXT:  .LBB109_4: # %atomicrmw.end
9655; RV32I-NEXT:    mv a0, a1
9656; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9657; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9658; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9659; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9660; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9661; RV32I-NEXT:    addi sp, sp, 32
9662; RV32I-NEXT:    ret
9663;
9664; RV32IA-LABEL: atomicrmw_umin_i16_seq_cst:
9665; RV32IA:       # %bb.0:
9666; RV32IA-NEXT:    andi a2, a0, -4
9667; RV32IA-NEXT:    slli a0, a0, 3
9668; RV32IA-NEXT:    lui a3, 16
9669; RV32IA-NEXT:    addi a3, a3, -1
9670; RV32IA-NEXT:    sll a4, a3, a0
9671; RV32IA-NEXT:    and a1, a1, a3
9672; RV32IA-NEXT:    sll a1, a1, a0
9673; RV32IA-NEXT:  .LBB109_1: # =>This Inner Loop Header: Depth=1
9674; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
9675; RV32IA-NEXT:    and a6, a3, a4
9676; RV32IA-NEXT:    mv a5, a3
9677; RV32IA-NEXT:    bgeu a1, a6, .LBB109_3
9678; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB109_1 Depth=1
9679; RV32IA-NEXT:    xor a5, a3, a1
9680; RV32IA-NEXT:    and a5, a5, a4
9681; RV32IA-NEXT:    xor a5, a3, a5
9682; RV32IA-NEXT:  .LBB109_3: # in Loop: Header=BB109_1 Depth=1
9683; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
9684; RV32IA-NEXT:    bnez a5, .LBB109_1
9685; RV32IA-NEXT:  # %bb.4:
9686; RV32IA-NEXT:    srl a0, a3, a0
9687; RV32IA-NEXT:    ret
9688;
9689; RV64I-LABEL: atomicrmw_umin_i16_seq_cst:
9690; RV64I:       # %bb.0:
9691; RV64I-NEXT:    addi sp, sp, -48
9692; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9693; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9694; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9695; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9696; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9697; RV64I-NEXT:    mv s0, a1
9698; RV64I-NEXT:    mv s1, a0
9699; RV64I-NEXT:    lhu a1, 0(a0)
9700; RV64I-NEXT:    lui a0, 16
9701; RV64I-NEXT:    addiw s2, a0, -1
9702; RV64I-NEXT:    and s3, s0, s2
9703; RV64I-NEXT:    j .LBB109_2
9704; RV64I-NEXT:  .LBB109_1: # %atomicrmw.start
9705; RV64I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9706; RV64I-NEXT:    sh a1, 6(sp)
9707; RV64I-NEXT:    addi a1, sp, 6
9708; RV64I-NEXT:    li a3, 5
9709; RV64I-NEXT:    li a4, 5
9710; RV64I-NEXT:    mv a0, s1
9711; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9712; RV64I-NEXT:    lh a1, 6(sp)
9713; RV64I-NEXT:    bnez a0, .LBB109_4
9714; RV64I-NEXT:  .LBB109_2: # %atomicrmw.start
9715; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9716; RV64I-NEXT:    and a0, a1, s2
9717; RV64I-NEXT:    mv a2, a1
9718; RV64I-NEXT:    bgeu s3, a0, .LBB109_1
9719; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9720; RV64I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9721; RV64I-NEXT:    mv a2, s0
9722; RV64I-NEXT:    j .LBB109_1
9723; RV64I-NEXT:  .LBB109_4: # %atomicrmw.end
9724; RV64I-NEXT:    mv a0, a1
9725; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9726; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9727; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9728; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9729; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9730; RV64I-NEXT:    addi sp, sp, 48
9731; RV64I-NEXT:    ret
9732;
9733; RV64IA-LABEL: atomicrmw_umin_i16_seq_cst:
9734; RV64IA:       # %bb.0:
9735; RV64IA-NEXT:    andi a2, a0, -4
9736; RV64IA-NEXT:    slliw a0, a0, 3
9737; RV64IA-NEXT:    lui a3, 16
9738; RV64IA-NEXT:    addiw a3, a3, -1
9739; RV64IA-NEXT:    sllw a4, a3, a0
9740; RV64IA-NEXT:    and a1, a1, a3
9741; RV64IA-NEXT:    sllw a1, a1, a0
9742; RV64IA-NEXT:  .LBB109_1: # =>This Inner Loop Header: Depth=1
9743; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
9744; RV64IA-NEXT:    and a6, a3, a4
9745; RV64IA-NEXT:    mv a5, a3
9746; RV64IA-NEXT:    bgeu a1, a6, .LBB109_3
9747; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB109_1 Depth=1
9748; RV64IA-NEXT:    xor a5, a3, a1
9749; RV64IA-NEXT:    and a5, a5, a4
9750; RV64IA-NEXT:    xor a5, a3, a5
9751; RV64IA-NEXT:  .LBB109_3: # in Loop: Header=BB109_1 Depth=1
9752; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
9753; RV64IA-NEXT:    bnez a5, .LBB109_1
9754; RV64IA-NEXT:  # %bb.4:
9755; RV64IA-NEXT:    srlw a0, a3, a0
9756; RV64IA-NEXT:    ret
9757  %1 = atomicrmw umin i16* %a, i16 %b seq_cst
9758  ret i16 %1
9759}
9760
9761define i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) nounwind {
9762; RV32I-LABEL: atomicrmw_xchg_i32_monotonic:
9763; RV32I:       # %bb.0:
9764; RV32I-NEXT:    addi sp, sp, -16
9765; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9766; RV32I-NEXT:    li a2, 0
9767; RV32I-NEXT:    call __atomic_exchange_4@plt
9768; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9769; RV32I-NEXT:    addi sp, sp, 16
9770; RV32I-NEXT:    ret
9771;
9772; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic:
9773; RV32IA:       # %bb.0:
9774; RV32IA-NEXT:    amoswap.w a0, a1, (a0)
9775; RV32IA-NEXT:    ret
9776;
9777; RV64I-LABEL: atomicrmw_xchg_i32_monotonic:
9778; RV64I:       # %bb.0:
9779; RV64I-NEXT:    addi sp, sp, -16
9780; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9781; RV64I-NEXT:    li a2, 0
9782; RV64I-NEXT:    call __atomic_exchange_4@plt
9783; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9784; RV64I-NEXT:    addi sp, sp, 16
9785; RV64I-NEXT:    ret
9786;
9787; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic:
9788; RV64IA:       # %bb.0:
9789; RV64IA-NEXT:    amoswap.w a0, a1, (a0)
9790; RV64IA-NEXT:    ret
9791  %1 = atomicrmw xchg i32* %a, i32 %b monotonic
9792  ret i32 %1
9793}
9794
9795define i32 @atomicrmw_xchg_i32_acquire(i32* %a, i32 %b) nounwind {
9796; RV32I-LABEL: atomicrmw_xchg_i32_acquire:
9797; RV32I:       # %bb.0:
9798; RV32I-NEXT:    addi sp, sp, -16
9799; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9800; RV32I-NEXT:    li a2, 2
9801; RV32I-NEXT:    call __atomic_exchange_4@plt
9802; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9803; RV32I-NEXT:    addi sp, sp, 16
9804; RV32I-NEXT:    ret
9805;
9806; RV32IA-LABEL: atomicrmw_xchg_i32_acquire:
9807; RV32IA:       # %bb.0:
9808; RV32IA-NEXT:    amoswap.w.aq a0, a1, (a0)
9809; RV32IA-NEXT:    ret
9810;
9811; RV64I-LABEL: atomicrmw_xchg_i32_acquire:
9812; RV64I:       # %bb.0:
9813; RV64I-NEXT:    addi sp, sp, -16
9814; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9815; RV64I-NEXT:    li a2, 2
9816; RV64I-NEXT:    call __atomic_exchange_4@plt
9817; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9818; RV64I-NEXT:    addi sp, sp, 16
9819; RV64I-NEXT:    ret
9820;
9821; RV64IA-LABEL: atomicrmw_xchg_i32_acquire:
9822; RV64IA:       # %bb.0:
9823; RV64IA-NEXT:    amoswap.w.aq a0, a1, (a0)
9824; RV64IA-NEXT:    ret
9825  %1 = atomicrmw xchg i32* %a, i32 %b acquire
9826  ret i32 %1
9827}
9828
9829define i32 @atomicrmw_xchg_i32_release(i32* %a, i32 %b) nounwind {
9830; RV32I-LABEL: atomicrmw_xchg_i32_release:
9831; RV32I:       # %bb.0:
9832; RV32I-NEXT:    addi sp, sp, -16
9833; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9834; RV32I-NEXT:    li a2, 3
9835; RV32I-NEXT:    call __atomic_exchange_4@plt
9836; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9837; RV32I-NEXT:    addi sp, sp, 16
9838; RV32I-NEXT:    ret
9839;
9840; RV32IA-LABEL: atomicrmw_xchg_i32_release:
9841; RV32IA:       # %bb.0:
9842; RV32IA-NEXT:    amoswap.w.rl a0, a1, (a0)
9843; RV32IA-NEXT:    ret
9844;
9845; RV64I-LABEL: atomicrmw_xchg_i32_release:
9846; RV64I:       # %bb.0:
9847; RV64I-NEXT:    addi sp, sp, -16
9848; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9849; RV64I-NEXT:    li a2, 3
9850; RV64I-NEXT:    call __atomic_exchange_4@plt
9851; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9852; RV64I-NEXT:    addi sp, sp, 16
9853; RV64I-NEXT:    ret
9854;
9855; RV64IA-LABEL: atomicrmw_xchg_i32_release:
9856; RV64IA:       # %bb.0:
9857; RV64IA-NEXT:    amoswap.w.rl a0, a1, (a0)
9858; RV64IA-NEXT:    ret
9859  %1 = atomicrmw xchg i32* %a, i32 %b release
9860  ret i32 %1
9861}
9862
9863define i32 @atomicrmw_xchg_i32_acq_rel(i32* %a, i32 %b) nounwind {
9864; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel:
9865; RV32I:       # %bb.0:
9866; RV32I-NEXT:    addi sp, sp, -16
9867; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9868; RV32I-NEXT:    li a2, 4
9869; RV32I-NEXT:    call __atomic_exchange_4@plt
9870; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9871; RV32I-NEXT:    addi sp, sp, 16
9872; RV32I-NEXT:    ret
9873;
9874; RV32IA-LABEL: atomicrmw_xchg_i32_acq_rel:
9875; RV32IA:       # %bb.0:
9876; RV32IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9877; RV32IA-NEXT:    ret
9878;
9879; RV64I-LABEL: atomicrmw_xchg_i32_acq_rel:
9880; RV64I:       # %bb.0:
9881; RV64I-NEXT:    addi sp, sp, -16
9882; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9883; RV64I-NEXT:    li a2, 4
9884; RV64I-NEXT:    call __atomic_exchange_4@plt
9885; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9886; RV64I-NEXT:    addi sp, sp, 16
9887; RV64I-NEXT:    ret
9888;
9889; RV64IA-LABEL: atomicrmw_xchg_i32_acq_rel:
9890; RV64IA:       # %bb.0:
9891; RV64IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9892; RV64IA-NEXT:    ret
9893  %1 = atomicrmw xchg i32* %a, i32 %b acq_rel
9894  ret i32 %1
9895}
9896
9897define i32 @atomicrmw_xchg_i32_seq_cst(i32* %a, i32 %b) nounwind {
9898; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst:
9899; RV32I:       # %bb.0:
9900; RV32I-NEXT:    addi sp, sp, -16
9901; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9902; RV32I-NEXT:    li a2, 5
9903; RV32I-NEXT:    call __atomic_exchange_4@plt
9904; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9905; RV32I-NEXT:    addi sp, sp, 16
9906; RV32I-NEXT:    ret
9907;
9908; RV32IA-LABEL: atomicrmw_xchg_i32_seq_cst:
9909; RV32IA:       # %bb.0:
9910; RV32IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9911; RV32IA-NEXT:    ret
9912;
9913; RV64I-LABEL: atomicrmw_xchg_i32_seq_cst:
9914; RV64I:       # %bb.0:
9915; RV64I-NEXT:    addi sp, sp, -16
9916; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9917; RV64I-NEXT:    li a2, 5
9918; RV64I-NEXT:    call __atomic_exchange_4@plt
9919; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9920; RV64I-NEXT:    addi sp, sp, 16
9921; RV64I-NEXT:    ret
9922;
9923; RV64IA-LABEL: atomicrmw_xchg_i32_seq_cst:
9924; RV64IA:       # %bb.0:
9925; RV64IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9926; RV64IA-NEXT:    ret
9927  %1 = atomicrmw xchg i32* %a, i32 %b seq_cst
9928  ret i32 %1
9929}
9930
9931define i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind {
9932; RV32I-LABEL: atomicrmw_add_i32_monotonic:
9933; RV32I:       # %bb.0:
9934; RV32I-NEXT:    addi sp, sp, -16
9935; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9936; RV32I-NEXT:    li a2, 0
9937; RV32I-NEXT:    call __atomic_fetch_add_4@plt
9938; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9939; RV32I-NEXT:    addi sp, sp, 16
9940; RV32I-NEXT:    ret
9941;
9942; RV32IA-LABEL: atomicrmw_add_i32_monotonic:
9943; RV32IA:       # %bb.0:
9944; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
9945; RV32IA-NEXT:    ret
9946;
9947; RV64I-LABEL: atomicrmw_add_i32_monotonic:
9948; RV64I:       # %bb.0:
9949; RV64I-NEXT:    addi sp, sp, -16
9950; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9951; RV64I-NEXT:    li a2, 0
9952; RV64I-NEXT:    call __atomic_fetch_add_4@plt
9953; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9954; RV64I-NEXT:    addi sp, sp, 16
9955; RV64I-NEXT:    ret
9956;
9957; RV64IA-LABEL: atomicrmw_add_i32_monotonic:
9958; RV64IA:       # %bb.0:
9959; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
9960; RV64IA-NEXT:    ret
9961  %1 = atomicrmw add i32* %a, i32 %b monotonic
9962  ret i32 %1
9963}
9964
9965define i32 @atomicrmw_add_i32_acquire(i32 *%a, i32 %b) nounwind {
9966; RV32I-LABEL: atomicrmw_add_i32_acquire:
9967; RV32I:       # %bb.0:
9968; RV32I-NEXT:    addi sp, sp, -16
9969; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9970; RV32I-NEXT:    li a2, 2
9971; RV32I-NEXT:    call __atomic_fetch_add_4@plt
9972; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9973; RV32I-NEXT:    addi sp, sp, 16
9974; RV32I-NEXT:    ret
9975;
9976; RV32IA-LABEL: atomicrmw_add_i32_acquire:
9977; RV32IA:       # %bb.0:
9978; RV32IA-NEXT:    amoadd.w.aq a0, a1, (a0)
9979; RV32IA-NEXT:    ret
9980;
9981; RV64I-LABEL: atomicrmw_add_i32_acquire:
9982; RV64I:       # %bb.0:
9983; RV64I-NEXT:    addi sp, sp, -16
9984; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9985; RV64I-NEXT:    li a2, 2
9986; RV64I-NEXT:    call __atomic_fetch_add_4@plt
9987; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9988; RV64I-NEXT:    addi sp, sp, 16
9989; RV64I-NEXT:    ret
9990;
9991; RV64IA-LABEL: atomicrmw_add_i32_acquire:
9992; RV64IA:       # %bb.0:
9993; RV64IA-NEXT:    amoadd.w.aq a0, a1, (a0)
9994; RV64IA-NEXT:    ret
9995  %1 = atomicrmw add i32* %a, i32 %b acquire
9996  ret i32 %1
9997}
9998
9999define i32 @atomicrmw_add_i32_release(i32 *%a, i32 %b) nounwind {
10000; RV32I-LABEL: atomicrmw_add_i32_release:
10001; RV32I:       # %bb.0:
10002; RV32I-NEXT:    addi sp, sp, -16
10003; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10004; RV32I-NEXT:    li a2, 3
10005; RV32I-NEXT:    call __atomic_fetch_add_4@plt
10006; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10007; RV32I-NEXT:    addi sp, sp, 16
10008; RV32I-NEXT:    ret
10009;
10010; RV32IA-LABEL: atomicrmw_add_i32_release:
10011; RV32IA:       # %bb.0:
10012; RV32IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10013; RV32IA-NEXT:    ret
10014;
10015; RV64I-LABEL: atomicrmw_add_i32_release:
10016; RV64I:       # %bb.0:
10017; RV64I-NEXT:    addi sp, sp, -16
10018; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10019; RV64I-NEXT:    li a2, 3
10020; RV64I-NEXT:    call __atomic_fetch_add_4@plt
10021; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10022; RV64I-NEXT:    addi sp, sp, 16
10023; RV64I-NEXT:    ret
10024;
10025; RV64IA-LABEL: atomicrmw_add_i32_release:
10026; RV64IA:       # %bb.0:
10027; RV64IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10028; RV64IA-NEXT:    ret
10029  %1 = atomicrmw add i32* %a, i32 %b release
10030  ret i32 %1
10031}
10032
10033define i32 @atomicrmw_add_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10034; RV32I-LABEL: atomicrmw_add_i32_acq_rel:
10035; RV32I:       # %bb.0:
10036; RV32I-NEXT:    addi sp, sp, -16
10037; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10038; RV32I-NEXT:    li a2, 4
10039; RV32I-NEXT:    call __atomic_fetch_add_4@plt
10040; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10041; RV32I-NEXT:    addi sp, sp, 16
10042; RV32I-NEXT:    ret
10043;
10044; RV32IA-LABEL: atomicrmw_add_i32_acq_rel:
10045; RV32IA:       # %bb.0:
10046; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10047; RV32IA-NEXT:    ret
10048;
10049; RV64I-LABEL: atomicrmw_add_i32_acq_rel:
10050; RV64I:       # %bb.0:
10051; RV64I-NEXT:    addi sp, sp, -16
10052; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10053; RV64I-NEXT:    li a2, 4
10054; RV64I-NEXT:    call __atomic_fetch_add_4@plt
10055; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10056; RV64I-NEXT:    addi sp, sp, 16
10057; RV64I-NEXT:    ret
10058;
10059; RV64IA-LABEL: atomicrmw_add_i32_acq_rel:
10060; RV64IA:       # %bb.0:
10061; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10062; RV64IA-NEXT:    ret
10063  %1 = atomicrmw add i32* %a, i32 %b acq_rel
10064  ret i32 %1
10065}
10066
10067define i32 @atomicrmw_add_i32_seq_cst(i32 *%a, i32 %b) nounwind {
10068; RV32I-LABEL: atomicrmw_add_i32_seq_cst:
10069; RV32I:       # %bb.0:
10070; RV32I-NEXT:    addi sp, sp, -16
10071; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10072; RV32I-NEXT:    li a2, 5
10073; RV32I-NEXT:    call __atomic_fetch_add_4@plt
10074; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10075; RV32I-NEXT:    addi sp, sp, 16
10076; RV32I-NEXT:    ret
10077;
10078; RV32IA-LABEL: atomicrmw_add_i32_seq_cst:
10079; RV32IA:       # %bb.0:
10080; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10081; RV32IA-NEXT:    ret
10082;
10083; RV64I-LABEL: atomicrmw_add_i32_seq_cst:
10084; RV64I:       # %bb.0:
10085; RV64I-NEXT:    addi sp, sp, -16
10086; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10087; RV64I-NEXT:    li a2, 5
10088; RV64I-NEXT:    call __atomic_fetch_add_4@plt
10089; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10090; RV64I-NEXT:    addi sp, sp, 16
10091; RV64I-NEXT:    ret
10092;
10093; RV64IA-LABEL: atomicrmw_add_i32_seq_cst:
10094; RV64IA:       # %bb.0:
10095; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10096; RV64IA-NEXT:    ret
10097  %1 = atomicrmw add i32* %a, i32 %b seq_cst
10098  ret i32 %1
10099}
10100
10101define i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) nounwind {
10102; RV32I-LABEL: atomicrmw_sub_i32_monotonic:
10103; RV32I:       # %bb.0:
10104; RV32I-NEXT:    addi sp, sp, -16
10105; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10106; RV32I-NEXT:    li a2, 0
10107; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10108; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10109; RV32I-NEXT:    addi sp, sp, 16
10110; RV32I-NEXT:    ret
10111;
10112; RV32IA-LABEL: atomicrmw_sub_i32_monotonic:
10113; RV32IA:       # %bb.0:
10114; RV32IA-NEXT:    neg a1, a1
10115; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
10116; RV32IA-NEXT:    ret
10117;
10118; RV64I-LABEL: atomicrmw_sub_i32_monotonic:
10119; RV64I:       # %bb.0:
10120; RV64I-NEXT:    addi sp, sp, -16
10121; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10122; RV64I-NEXT:    li a2, 0
10123; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10124; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10125; RV64I-NEXT:    addi sp, sp, 16
10126; RV64I-NEXT:    ret
10127;
10128; RV64IA-LABEL: atomicrmw_sub_i32_monotonic:
10129; RV64IA:       # %bb.0:
10130; RV64IA-NEXT:    neg a1, a1
10131; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
10132; RV64IA-NEXT:    ret
10133  %1 = atomicrmw sub i32* %a, i32 %b monotonic
10134  ret i32 %1
10135}
10136
10137define i32 @atomicrmw_sub_i32_acquire(i32* %a, i32 %b) nounwind {
10138; RV32I-LABEL: atomicrmw_sub_i32_acquire:
10139; RV32I:       # %bb.0:
10140; RV32I-NEXT:    addi sp, sp, -16
10141; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10142; RV32I-NEXT:    li a2, 2
10143; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10144; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10145; RV32I-NEXT:    addi sp, sp, 16
10146; RV32I-NEXT:    ret
10147;
10148; RV32IA-LABEL: atomicrmw_sub_i32_acquire:
10149; RV32IA:       # %bb.0:
10150; RV32IA-NEXT:    neg a1, a1
10151; RV32IA-NEXT:    amoadd.w.aq a0, a1, (a0)
10152; RV32IA-NEXT:    ret
10153;
10154; RV64I-LABEL: atomicrmw_sub_i32_acquire:
10155; RV64I:       # %bb.0:
10156; RV64I-NEXT:    addi sp, sp, -16
10157; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10158; RV64I-NEXT:    li a2, 2
10159; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10160; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10161; RV64I-NEXT:    addi sp, sp, 16
10162; RV64I-NEXT:    ret
10163;
10164; RV64IA-LABEL: atomicrmw_sub_i32_acquire:
10165; RV64IA:       # %bb.0:
10166; RV64IA-NEXT:    neg a1, a1
10167; RV64IA-NEXT:    amoadd.w.aq a0, a1, (a0)
10168; RV64IA-NEXT:    ret
10169  %1 = atomicrmw sub i32* %a, i32 %b acquire
10170  ret i32 %1
10171}
10172
10173define i32 @atomicrmw_sub_i32_release(i32* %a, i32 %b) nounwind {
10174; RV32I-LABEL: atomicrmw_sub_i32_release:
10175; RV32I:       # %bb.0:
10176; RV32I-NEXT:    addi sp, sp, -16
10177; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10178; RV32I-NEXT:    li a2, 3
10179; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10180; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10181; RV32I-NEXT:    addi sp, sp, 16
10182; RV32I-NEXT:    ret
10183;
10184; RV32IA-LABEL: atomicrmw_sub_i32_release:
10185; RV32IA:       # %bb.0:
10186; RV32IA-NEXT:    neg a1, a1
10187; RV32IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10188; RV32IA-NEXT:    ret
10189;
10190; RV64I-LABEL: atomicrmw_sub_i32_release:
10191; RV64I:       # %bb.0:
10192; RV64I-NEXT:    addi sp, sp, -16
10193; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10194; RV64I-NEXT:    li a2, 3
10195; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10196; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10197; RV64I-NEXT:    addi sp, sp, 16
10198; RV64I-NEXT:    ret
10199;
10200; RV64IA-LABEL: atomicrmw_sub_i32_release:
10201; RV64IA:       # %bb.0:
10202; RV64IA-NEXT:    neg a1, a1
10203; RV64IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10204; RV64IA-NEXT:    ret
10205  %1 = atomicrmw sub i32* %a, i32 %b release
10206  ret i32 %1
10207}
10208
10209define i32 @atomicrmw_sub_i32_acq_rel(i32* %a, i32 %b) nounwind {
10210; RV32I-LABEL: atomicrmw_sub_i32_acq_rel:
10211; RV32I:       # %bb.0:
10212; RV32I-NEXT:    addi sp, sp, -16
10213; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10214; RV32I-NEXT:    li a2, 4
10215; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10216; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10217; RV32I-NEXT:    addi sp, sp, 16
10218; RV32I-NEXT:    ret
10219;
10220; RV32IA-LABEL: atomicrmw_sub_i32_acq_rel:
10221; RV32IA:       # %bb.0:
10222; RV32IA-NEXT:    neg a1, a1
10223; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10224; RV32IA-NEXT:    ret
10225;
10226; RV64I-LABEL: atomicrmw_sub_i32_acq_rel:
10227; RV64I:       # %bb.0:
10228; RV64I-NEXT:    addi sp, sp, -16
10229; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10230; RV64I-NEXT:    li a2, 4
10231; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10232; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10233; RV64I-NEXT:    addi sp, sp, 16
10234; RV64I-NEXT:    ret
10235;
10236; RV64IA-LABEL: atomicrmw_sub_i32_acq_rel:
10237; RV64IA:       # %bb.0:
10238; RV64IA-NEXT:    neg a1, a1
10239; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10240; RV64IA-NEXT:    ret
10241  %1 = atomicrmw sub i32* %a, i32 %b acq_rel
10242  ret i32 %1
10243}
10244
10245define i32 @atomicrmw_sub_i32_seq_cst(i32* %a, i32 %b) nounwind {
10246; RV32I-LABEL: atomicrmw_sub_i32_seq_cst:
10247; RV32I:       # %bb.0:
10248; RV32I-NEXT:    addi sp, sp, -16
10249; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10250; RV32I-NEXT:    li a2, 5
10251; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10252; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10253; RV32I-NEXT:    addi sp, sp, 16
10254; RV32I-NEXT:    ret
10255;
10256; RV32IA-LABEL: atomicrmw_sub_i32_seq_cst:
10257; RV32IA:       # %bb.0:
10258; RV32IA-NEXT:    neg a1, a1
10259; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10260; RV32IA-NEXT:    ret
10261;
10262; RV64I-LABEL: atomicrmw_sub_i32_seq_cst:
10263; RV64I:       # %bb.0:
10264; RV64I-NEXT:    addi sp, sp, -16
10265; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10266; RV64I-NEXT:    li a2, 5
10267; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10268; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10269; RV64I-NEXT:    addi sp, sp, 16
10270; RV64I-NEXT:    ret
10271;
10272; RV64IA-LABEL: atomicrmw_sub_i32_seq_cst:
10273; RV64IA:       # %bb.0:
10274; RV64IA-NEXT:    neg a1, a1
10275; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10276; RV64IA-NEXT:    ret
10277  %1 = atomicrmw sub i32* %a, i32 %b seq_cst
10278  ret i32 %1
10279}
10280
10281define i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind {
10282; RV32I-LABEL: atomicrmw_and_i32_monotonic:
10283; RV32I:       # %bb.0:
10284; RV32I-NEXT:    addi sp, sp, -16
10285; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10286; RV32I-NEXT:    li a2, 0
10287; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10288; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10289; RV32I-NEXT:    addi sp, sp, 16
10290; RV32I-NEXT:    ret
10291;
10292; RV32IA-LABEL: atomicrmw_and_i32_monotonic:
10293; RV32IA:       # %bb.0:
10294; RV32IA-NEXT:    amoand.w a0, a1, (a0)
10295; RV32IA-NEXT:    ret
10296;
10297; RV64I-LABEL: atomicrmw_and_i32_monotonic:
10298; RV64I:       # %bb.0:
10299; RV64I-NEXT:    addi sp, sp, -16
10300; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10301; RV64I-NEXT:    li a2, 0
10302; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10303; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10304; RV64I-NEXT:    addi sp, sp, 16
10305; RV64I-NEXT:    ret
10306;
10307; RV64IA-LABEL: atomicrmw_and_i32_monotonic:
10308; RV64IA:       # %bb.0:
10309; RV64IA-NEXT:    amoand.w a0, a1, (a0)
10310; RV64IA-NEXT:    ret
10311  %1 = atomicrmw and i32* %a, i32 %b monotonic
10312  ret i32 %1
10313}
10314
10315define i32 @atomicrmw_and_i32_acquire(i32 *%a, i32 %b) nounwind {
10316; RV32I-LABEL: atomicrmw_and_i32_acquire:
10317; RV32I:       # %bb.0:
10318; RV32I-NEXT:    addi sp, sp, -16
10319; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10320; RV32I-NEXT:    li a2, 2
10321; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10322; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10323; RV32I-NEXT:    addi sp, sp, 16
10324; RV32I-NEXT:    ret
10325;
10326; RV32IA-LABEL: atomicrmw_and_i32_acquire:
10327; RV32IA:       # %bb.0:
10328; RV32IA-NEXT:    amoand.w.aq a0, a1, (a0)
10329; RV32IA-NEXT:    ret
10330;
10331; RV64I-LABEL: atomicrmw_and_i32_acquire:
10332; RV64I:       # %bb.0:
10333; RV64I-NEXT:    addi sp, sp, -16
10334; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10335; RV64I-NEXT:    li a2, 2
10336; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10337; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10338; RV64I-NEXT:    addi sp, sp, 16
10339; RV64I-NEXT:    ret
10340;
10341; RV64IA-LABEL: atomicrmw_and_i32_acquire:
10342; RV64IA:       # %bb.0:
10343; RV64IA-NEXT:    amoand.w.aq a0, a1, (a0)
10344; RV64IA-NEXT:    ret
10345  %1 = atomicrmw and i32* %a, i32 %b acquire
10346  ret i32 %1
10347}
10348
10349define i32 @atomicrmw_and_i32_release(i32 *%a, i32 %b) nounwind {
10350; RV32I-LABEL: atomicrmw_and_i32_release:
10351; RV32I:       # %bb.0:
10352; RV32I-NEXT:    addi sp, sp, -16
10353; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10354; RV32I-NEXT:    li a2, 3
10355; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10356; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10357; RV32I-NEXT:    addi sp, sp, 16
10358; RV32I-NEXT:    ret
10359;
10360; RV32IA-LABEL: atomicrmw_and_i32_release:
10361; RV32IA:       # %bb.0:
10362; RV32IA-NEXT:    amoand.w.rl a0, a1, (a0)
10363; RV32IA-NEXT:    ret
10364;
10365; RV64I-LABEL: atomicrmw_and_i32_release:
10366; RV64I:       # %bb.0:
10367; RV64I-NEXT:    addi sp, sp, -16
10368; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10369; RV64I-NEXT:    li a2, 3
10370; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10371; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10372; RV64I-NEXT:    addi sp, sp, 16
10373; RV64I-NEXT:    ret
10374;
10375; RV64IA-LABEL: atomicrmw_and_i32_release:
10376; RV64IA:       # %bb.0:
10377; RV64IA-NEXT:    amoand.w.rl a0, a1, (a0)
10378; RV64IA-NEXT:    ret
10379  %1 = atomicrmw and i32* %a, i32 %b release
10380  ret i32 %1
10381}
10382
10383define i32 @atomicrmw_and_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10384; RV32I-LABEL: atomicrmw_and_i32_acq_rel:
10385; RV32I:       # %bb.0:
10386; RV32I-NEXT:    addi sp, sp, -16
10387; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10388; RV32I-NEXT:    li a2, 4
10389; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10390; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10391; RV32I-NEXT:    addi sp, sp, 16
10392; RV32I-NEXT:    ret
10393;
10394; RV32IA-LABEL: atomicrmw_and_i32_acq_rel:
10395; RV32IA:       # %bb.0:
10396; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10397; RV32IA-NEXT:    ret
10398;
10399; RV64I-LABEL: atomicrmw_and_i32_acq_rel:
10400; RV64I:       # %bb.0:
10401; RV64I-NEXT:    addi sp, sp, -16
10402; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10403; RV64I-NEXT:    li a2, 4
10404; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10405; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10406; RV64I-NEXT:    addi sp, sp, 16
10407; RV64I-NEXT:    ret
10408;
10409; RV64IA-LABEL: atomicrmw_and_i32_acq_rel:
10410; RV64IA:       # %bb.0:
10411; RV64IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10412; RV64IA-NEXT:    ret
10413  %1 = atomicrmw and i32* %a, i32 %b acq_rel
10414  ret i32 %1
10415}
10416
10417define i32 @atomicrmw_and_i32_seq_cst(i32 *%a, i32 %b) nounwind {
10418; RV32I-LABEL: atomicrmw_and_i32_seq_cst:
10419; RV32I:       # %bb.0:
10420; RV32I-NEXT:    addi sp, sp, -16
10421; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10422; RV32I-NEXT:    li a2, 5
10423; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10424; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10425; RV32I-NEXT:    addi sp, sp, 16
10426; RV32I-NEXT:    ret
10427;
10428; RV32IA-LABEL: atomicrmw_and_i32_seq_cst:
10429; RV32IA:       # %bb.0:
10430; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10431; RV32IA-NEXT:    ret
10432;
10433; RV64I-LABEL: atomicrmw_and_i32_seq_cst:
10434; RV64I:       # %bb.0:
10435; RV64I-NEXT:    addi sp, sp, -16
10436; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10437; RV64I-NEXT:    li a2, 5
10438; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10439; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10440; RV64I-NEXT:    addi sp, sp, 16
10441; RV64I-NEXT:    ret
10442;
10443; RV64IA-LABEL: atomicrmw_and_i32_seq_cst:
10444; RV64IA:       # %bb.0:
10445; RV64IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10446; RV64IA-NEXT:    ret
10447  %1 = atomicrmw and i32* %a, i32 %b seq_cst
10448  ret i32 %1
10449}
10450
10451define i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) nounwind {
10452; RV32I-LABEL: atomicrmw_nand_i32_monotonic:
10453; RV32I:       # %bb.0:
10454; RV32I-NEXT:    addi sp, sp, -16
10455; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10456; RV32I-NEXT:    li a2, 0
10457; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10458; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10459; RV32I-NEXT:    addi sp, sp, 16
10460; RV32I-NEXT:    ret
10461;
10462; RV32IA-LABEL: atomicrmw_nand_i32_monotonic:
10463; RV32IA:       # %bb.0:
10464; RV32IA-NEXT:  .LBB130_1: # =>This Inner Loop Header: Depth=1
10465; RV32IA-NEXT:    lr.w a2, (a0)
10466; RV32IA-NEXT:    and a3, a2, a1
10467; RV32IA-NEXT:    not a3, a3
10468; RV32IA-NEXT:    sc.w a3, a3, (a0)
10469; RV32IA-NEXT:    bnez a3, .LBB130_1
10470; RV32IA-NEXT:  # %bb.2:
10471; RV32IA-NEXT:    mv a0, a2
10472; RV32IA-NEXT:    ret
10473;
10474; RV64I-LABEL: atomicrmw_nand_i32_monotonic:
10475; RV64I:       # %bb.0:
10476; RV64I-NEXT:    addi sp, sp, -16
10477; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10478; RV64I-NEXT:    li a2, 0
10479; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10480; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10481; RV64I-NEXT:    addi sp, sp, 16
10482; RV64I-NEXT:    ret
10483;
10484; RV64IA-LABEL: atomicrmw_nand_i32_monotonic:
10485; RV64IA:       # %bb.0:
10486; RV64IA-NEXT:  .LBB130_1: # =>This Inner Loop Header: Depth=1
10487; RV64IA-NEXT:    lr.w a2, (a0)
10488; RV64IA-NEXT:    and a3, a2, a1
10489; RV64IA-NEXT:    not a3, a3
10490; RV64IA-NEXT:    sc.w a3, a3, (a0)
10491; RV64IA-NEXT:    bnez a3, .LBB130_1
10492; RV64IA-NEXT:  # %bb.2:
10493; RV64IA-NEXT:    mv a0, a2
10494; RV64IA-NEXT:    ret
10495  %1 = atomicrmw nand i32* %a, i32 %b monotonic
10496  ret i32 %1
10497}
10498
10499define i32 @atomicrmw_nand_i32_acquire(i32* %a, i32 %b) nounwind {
10500; RV32I-LABEL: atomicrmw_nand_i32_acquire:
10501; RV32I:       # %bb.0:
10502; RV32I-NEXT:    addi sp, sp, -16
10503; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10504; RV32I-NEXT:    li a2, 2
10505; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10506; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10507; RV32I-NEXT:    addi sp, sp, 16
10508; RV32I-NEXT:    ret
10509;
10510; RV32IA-LABEL: atomicrmw_nand_i32_acquire:
10511; RV32IA:       # %bb.0:
10512; RV32IA-NEXT:  .LBB131_1: # =>This Inner Loop Header: Depth=1
10513; RV32IA-NEXT:    lr.w.aq a2, (a0)
10514; RV32IA-NEXT:    and a3, a2, a1
10515; RV32IA-NEXT:    not a3, a3
10516; RV32IA-NEXT:    sc.w a3, a3, (a0)
10517; RV32IA-NEXT:    bnez a3, .LBB131_1
10518; RV32IA-NEXT:  # %bb.2:
10519; RV32IA-NEXT:    mv a0, a2
10520; RV32IA-NEXT:    ret
10521;
10522; RV64I-LABEL: atomicrmw_nand_i32_acquire:
10523; RV64I:       # %bb.0:
10524; RV64I-NEXT:    addi sp, sp, -16
10525; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10526; RV64I-NEXT:    li a2, 2
10527; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10528; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10529; RV64I-NEXT:    addi sp, sp, 16
10530; RV64I-NEXT:    ret
10531;
10532; RV64IA-LABEL: atomicrmw_nand_i32_acquire:
10533; RV64IA:       # %bb.0:
10534; RV64IA-NEXT:  .LBB131_1: # =>This Inner Loop Header: Depth=1
10535; RV64IA-NEXT:    lr.w.aq a2, (a0)
10536; RV64IA-NEXT:    and a3, a2, a1
10537; RV64IA-NEXT:    not a3, a3
10538; RV64IA-NEXT:    sc.w a3, a3, (a0)
10539; RV64IA-NEXT:    bnez a3, .LBB131_1
10540; RV64IA-NEXT:  # %bb.2:
10541; RV64IA-NEXT:    mv a0, a2
10542; RV64IA-NEXT:    ret
10543  %1 = atomicrmw nand i32* %a, i32 %b acquire
10544  ret i32 %1
10545}
10546
10547define i32 @atomicrmw_nand_i32_release(i32* %a, i32 %b) nounwind {
10548; RV32I-LABEL: atomicrmw_nand_i32_release:
10549; RV32I:       # %bb.0:
10550; RV32I-NEXT:    addi sp, sp, -16
10551; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10552; RV32I-NEXT:    li a2, 3
10553; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10554; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10555; RV32I-NEXT:    addi sp, sp, 16
10556; RV32I-NEXT:    ret
10557;
10558; RV32IA-LABEL: atomicrmw_nand_i32_release:
10559; RV32IA:       # %bb.0:
10560; RV32IA-NEXT:  .LBB132_1: # =>This Inner Loop Header: Depth=1
10561; RV32IA-NEXT:    lr.w a2, (a0)
10562; RV32IA-NEXT:    and a3, a2, a1
10563; RV32IA-NEXT:    not a3, a3
10564; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
10565; RV32IA-NEXT:    bnez a3, .LBB132_1
10566; RV32IA-NEXT:  # %bb.2:
10567; RV32IA-NEXT:    mv a0, a2
10568; RV32IA-NEXT:    ret
10569;
10570; RV64I-LABEL: atomicrmw_nand_i32_release:
10571; RV64I:       # %bb.0:
10572; RV64I-NEXT:    addi sp, sp, -16
10573; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10574; RV64I-NEXT:    li a2, 3
10575; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10576; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10577; RV64I-NEXT:    addi sp, sp, 16
10578; RV64I-NEXT:    ret
10579;
10580; RV64IA-LABEL: atomicrmw_nand_i32_release:
10581; RV64IA:       # %bb.0:
10582; RV64IA-NEXT:  .LBB132_1: # =>This Inner Loop Header: Depth=1
10583; RV64IA-NEXT:    lr.w a2, (a0)
10584; RV64IA-NEXT:    and a3, a2, a1
10585; RV64IA-NEXT:    not a3, a3
10586; RV64IA-NEXT:    sc.w.rl a3, a3, (a0)
10587; RV64IA-NEXT:    bnez a3, .LBB132_1
10588; RV64IA-NEXT:  # %bb.2:
10589; RV64IA-NEXT:    mv a0, a2
10590; RV64IA-NEXT:    ret
10591  %1 = atomicrmw nand i32* %a, i32 %b release
10592  ret i32 %1
10593}
10594
10595define i32 @atomicrmw_nand_i32_acq_rel(i32* %a, i32 %b) nounwind {
10596; RV32I-LABEL: atomicrmw_nand_i32_acq_rel:
10597; RV32I:       # %bb.0:
10598; RV32I-NEXT:    addi sp, sp, -16
10599; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10600; RV32I-NEXT:    li a2, 4
10601; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10602; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10603; RV32I-NEXT:    addi sp, sp, 16
10604; RV32I-NEXT:    ret
10605;
10606; RV32IA-LABEL: atomicrmw_nand_i32_acq_rel:
10607; RV32IA:       # %bb.0:
10608; RV32IA-NEXT:  .LBB133_1: # =>This Inner Loop Header: Depth=1
10609; RV32IA-NEXT:    lr.w.aq a2, (a0)
10610; RV32IA-NEXT:    and a3, a2, a1
10611; RV32IA-NEXT:    not a3, a3
10612; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
10613; RV32IA-NEXT:    bnez a3, .LBB133_1
10614; RV32IA-NEXT:  # %bb.2:
10615; RV32IA-NEXT:    mv a0, a2
10616; RV32IA-NEXT:    ret
10617;
10618; RV64I-LABEL: atomicrmw_nand_i32_acq_rel:
10619; RV64I:       # %bb.0:
10620; RV64I-NEXT:    addi sp, sp, -16
10621; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10622; RV64I-NEXT:    li a2, 4
10623; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10624; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10625; RV64I-NEXT:    addi sp, sp, 16
10626; RV64I-NEXT:    ret
10627;
10628; RV64IA-LABEL: atomicrmw_nand_i32_acq_rel:
10629; RV64IA:       # %bb.0:
10630; RV64IA-NEXT:  .LBB133_1: # =>This Inner Loop Header: Depth=1
10631; RV64IA-NEXT:    lr.w.aq a2, (a0)
10632; RV64IA-NEXT:    and a3, a2, a1
10633; RV64IA-NEXT:    not a3, a3
10634; RV64IA-NEXT:    sc.w.rl a3, a3, (a0)
10635; RV64IA-NEXT:    bnez a3, .LBB133_1
10636; RV64IA-NEXT:  # %bb.2:
10637; RV64IA-NEXT:    mv a0, a2
10638; RV64IA-NEXT:    ret
10639  %1 = atomicrmw nand i32* %a, i32 %b acq_rel
10640  ret i32 %1
10641}
10642
10643define i32 @atomicrmw_nand_i32_seq_cst(i32* %a, i32 %b) nounwind {
10644; RV32I-LABEL: atomicrmw_nand_i32_seq_cst:
10645; RV32I:       # %bb.0:
10646; RV32I-NEXT:    addi sp, sp, -16
10647; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10648; RV32I-NEXT:    li a2, 5
10649; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10650; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10651; RV32I-NEXT:    addi sp, sp, 16
10652; RV32I-NEXT:    ret
10653;
10654; RV32IA-LABEL: atomicrmw_nand_i32_seq_cst:
10655; RV32IA:       # %bb.0:
10656; RV32IA-NEXT:  .LBB134_1: # =>This Inner Loop Header: Depth=1
10657; RV32IA-NEXT:    lr.w.aqrl a2, (a0)
10658; RV32IA-NEXT:    and a3, a2, a1
10659; RV32IA-NEXT:    not a3, a3
10660; RV32IA-NEXT:    sc.w.aqrl a3, a3, (a0)
10661; RV32IA-NEXT:    bnez a3, .LBB134_1
10662; RV32IA-NEXT:  # %bb.2:
10663; RV32IA-NEXT:    mv a0, a2
10664; RV32IA-NEXT:    ret
10665;
10666; RV64I-LABEL: atomicrmw_nand_i32_seq_cst:
10667; RV64I:       # %bb.0:
10668; RV64I-NEXT:    addi sp, sp, -16
10669; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10670; RV64I-NEXT:    li a2, 5
10671; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10672; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10673; RV64I-NEXT:    addi sp, sp, 16
10674; RV64I-NEXT:    ret
10675;
10676; RV64IA-LABEL: atomicrmw_nand_i32_seq_cst:
10677; RV64IA:       # %bb.0:
10678; RV64IA-NEXT:  .LBB134_1: # =>This Inner Loop Header: Depth=1
10679; RV64IA-NEXT:    lr.w.aqrl a2, (a0)
10680; RV64IA-NEXT:    and a3, a2, a1
10681; RV64IA-NEXT:    not a3, a3
10682; RV64IA-NEXT:    sc.w.aqrl a3, a3, (a0)
10683; RV64IA-NEXT:    bnez a3, .LBB134_1
10684; RV64IA-NEXT:  # %bb.2:
10685; RV64IA-NEXT:    mv a0, a2
10686; RV64IA-NEXT:    ret
10687  %1 = atomicrmw nand i32* %a, i32 %b seq_cst
10688  ret i32 %1
10689}
10690
10691define i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind {
10692; RV32I-LABEL: atomicrmw_or_i32_monotonic:
10693; RV32I:       # %bb.0:
10694; RV32I-NEXT:    addi sp, sp, -16
10695; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10696; RV32I-NEXT:    li a2, 0
10697; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10698; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10699; RV32I-NEXT:    addi sp, sp, 16
10700; RV32I-NEXT:    ret
10701;
10702; RV32IA-LABEL: atomicrmw_or_i32_monotonic:
10703; RV32IA:       # %bb.0:
10704; RV32IA-NEXT:    amoor.w a0, a1, (a0)
10705; RV32IA-NEXT:    ret
10706;
10707; RV64I-LABEL: atomicrmw_or_i32_monotonic:
10708; RV64I:       # %bb.0:
10709; RV64I-NEXT:    addi sp, sp, -16
10710; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10711; RV64I-NEXT:    li a2, 0
10712; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10713; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10714; RV64I-NEXT:    addi sp, sp, 16
10715; RV64I-NEXT:    ret
10716;
10717; RV64IA-LABEL: atomicrmw_or_i32_monotonic:
10718; RV64IA:       # %bb.0:
10719; RV64IA-NEXT:    amoor.w a0, a1, (a0)
10720; RV64IA-NEXT:    ret
10721  %1 = atomicrmw or i32* %a, i32 %b monotonic
10722  ret i32 %1
10723}
10724
10725define i32 @atomicrmw_or_i32_acquire(i32 *%a, i32 %b) nounwind {
10726; RV32I-LABEL: atomicrmw_or_i32_acquire:
10727; RV32I:       # %bb.0:
10728; RV32I-NEXT:    addi sp, sp, -16
10729; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10730; RV32I-NEXT:    li a2, 2
10731; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10732; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10733; RV32I-NEXT:    addi sp, sp, 16
10734; RV32I-NEXT:    ret
10735;
10736; RV32IA-LABEL: atomicrmw_or_i32_acquire:
10737; RV32IA:       # %bb.0:
10738; RV32IA-NEXT:    amoor.w.aq a0, a1, (a0)
10739; RV32IA-NEXT:    ret
10740;
10741; RV64I-LABEL: atomicrmw_or_i32_acquire:
10742; RV64I:       # %bb.0:
10743; RV64I-NEXT:    addi sp, sp, -16
10744; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10745; RV64I-NEXT:    li a2, 2
10746; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10747; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10748; RV64I-NEXT:    addi sp, sp, 16
10749; RV64I-NEXT:    ret
10750;
10751; RV64IA-LABEL: atomicrmw_or_i32_acquire:
10752; RV64IA:       # %bb.0:
10753; RV64IA-NEXT:    amoor.w.aq a0, a1, (a0)
10754; RV64IA-NEXT:    ret
10755  %1 = atomicrmw or i32* %a, i32 %b acquire
10756  ret i32 %1
10757}
10758
10759define i32 @atomicrmw_or_i32_release(i32 *%a, i32 %b) nounwind {
10760; RV32I-LABEL: atomicrmw_or_i32_release:
10761; RV32I:       # %bb.0:
10762; RV32I-NEXT:    addi sp, sp, -16
10763; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10764; RV32I-NEXT:    li a2, 3
10765; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10766; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10767; RV32I-NEXT:    addi sp, sp, 16
10768; RV32I-NEXT:    ret
10769;
10770; RV32IA-LABEL: atomicrmw_or_i32_release:
10771; RV32IA:       # %bb.0:
10772; RV32IA-NEXT:    amoor.w.rl a0, a1, (a0)
10773; RV32IA-NEXT:    ret
10774;
10775; RV64I-LABEL: atomicrmw_or_i32_release:
10776; RV64I:       # %bb.0:
10777; RV64I-NEXT:    addi sp, sp, -16
10778; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10779; RV64I-NEXT:    li a2, 3
10780; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10781; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10782; RV64I-NEXT:    addi sp, sp, 16
10783; RV64I-NEXT:    ret
10784;
10785; RV64IA-LABEL: atomicrmw_or_i32_release:
10786; RV64IA:       # %bb.0:
10787; RV64IA-NEXT:    amoor.w.rl a0, a1, (a0)
10788; RV64IA-NEXT:    ret
10789  %1 = atomicrmw or i32* %a, i32 %b release
10790  ret i32 %1
10791}
10792
10793define i32 @atomicrmw_or_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10794; RV32I-LABEL: atomicrmw_or_i32_acq_rel:
10795; RV32I:       # %bb.0:
10796; RV32I-NEXT:    addi sp, sp, -16
10797; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10798; RV32I-NEXT:    li a2, 4
10799; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10800; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10801; RV32I-NEXT:    addi sp, sp, 16
10802; RV32I-NEXT:    ret
10803;
10804; RV32IA-LABEL: atomicrmw_or_i32_acq_rel:
10805; RV32IA:       # %bb.0:
10806; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10807; RV32IA-NEXT:    ret
10808;
10809; RV64I-LABEL: atomicrmw_or_i32_acq_rel:
10810; RV64I:       # %bb.0:
10811; RV64I-NEXT:    addi sp, sp, -16
10812; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10813; RV64I-NEXT:    li a2, 4
10814; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10815; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10816; RV64I-NEXT:    addi sp, sp, 16
10817; RV64I-NEXT:    ret
10818;
10819; RV64IA-LABEL: atomicrmw_or_i32_acq_rel:
10820; RV64IA:       # %bb.0:
10821; RV64IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10822; RV64IA-NEXT:    ret
10823  %1 = atomicrmw or i32* %a, i32 %b acq_rel
10824  ret i32 %1
10825}
10826
10827define i32 @atomicrmw_or_i32_seq_cst(i32 *%a, i32 %b) nounwind {
10828; RV32I-LABEL: atomicrmw_or_i32_seq_cst:
10829; RV32I:       # %bb.0:
10830; RV32I-NEXT:    addi sp, sp, -16
10831; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10832; RV32I-NEXT:    li a2, 5
10833; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10834; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10835; RV32I-NEXT:    addi sp, sp, 16
10836; RV32I-NEXT:    ret
10837;
10838; RV32IA-LABEL: atomicrmw_or_i32_seq_cst:
10839; RV32IA:       # %bb.0:
10840; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10841; RV32IA-NEXT:    ret
10842;
10843; RV64I-LABEL: atomicrmw_or_i32_seq_cst:
10844; RV64I:       # %bb.0:
10845; RV64I-NEXT:    addi sp, sp, -16
10846; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10847; RV64I-NEXT:    li a2, 5
10848; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10849; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10850; RV64I-NEXT:    addi sp, sp, 16
10851; RV64I-NEXT:    ret
10852;
10853; RV64IA-LABEL: atomicrmw_or_i32_seq_cst:
10854; RV64IA:       # %bb.0:
10855; RV64IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10856; RV64IA-NEXT:    ret
10857  %1 = atomicrmw or i32* %a, i32 %b seq_cst
10858  ret i32 %1
10859}
10860
10861define i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind {
10862; RV32I-LABEL: atomicrmw_xor_i32_monotonic:
10863; RV32I:       # %bb.0:
10864; RV32I-NEXT:    addi sp, sp, -16
10865; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10866; RV32I-NEXT:    li a2, 0
10867; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10868; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10869; RV32I-NEXT:    addi sp, sp, 16
10870; RV32I-NEXT:    ret
10871;
10872; RV32IA-LABEL: atomicrmw_xor_i32_monotonic:
10873; RV32IA:       # %bb.0:
10874; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
10875; RV32IA-NEXT:    ret
10876;
10877; RV64I-LABEL: atomicrmw_xor_i32_monotonic:
10878; RV64I:       # %bb.0:
10879; RV64I-NEXT:    addi sp, sp, -16
10880; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10881; RV64I-NEXT:    li a2, 0
10882; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
10883; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10884; RV64I-NEXT:    addi sp, sp, 16
10885; RV64I-NEXT:    ret
10886;
10887; RV64IA-LABEL: atomicrmw_xor_i32_monotonic:
10888; RV64IA:       # %bb.0:
10889; RV64IA-NEXT:    amoxor.w a0, a1, (a0)
10890; RV64IA-NEXT:    ret
10891  %1 = atomicrmw xor i32* %a, i32 %b monotonic
10892  ret i32 %1
10893}
10894
10895define i32 @atomicrmw_xor_i32_acquire(i32 *%a, i32 %b) nounwind {
10896; RV32I-LABEL: atomicrmw_xor_i32_acquire:
10897; RV32I:       # %bb.0:
10898; RV32I-NEXT:    addi sp, sp, -16
10899; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10900; RV32I-NEXT:    li a2, 2
10901; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10902; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10903; RV32I-NEXT:    addi sp, sp, 16
10904; RV32I-NEXT:    ret
10905;
10906; RV32IA-LABEL: atomicrmw_xor_i32_acquire:
10907; RV32IA:       # %bb.0:
10908; RV32IA-NEXT:    amoxor.w.aq a0, a1, (a0)
10909; RV32IA-NEXT:    ret
10910;
10911; RV64I-LABEL: atomicrmw_xor_i32_acquire:
10912; RV64I:       # %bb.0:
10913; RV64I-NEXT:    addi sp, sp, -16
10914; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10915; RV64I-NEXT:    li a2, 2
10916; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
10917; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10918; RV64I-NEXT:    addi sp, sp, 16
10919; RV64I-NEXT:    ret
10920;
10921; RV64IA-LABEL: atomicrmw_xor_i32_acquire:
10922; RV64IA:       # %bb.0:
10923; RV64IA-NEXT:    amoxor.w.aq a0, a1, (a0)
10924; RV64IA-NEXT:    ret
10925  %1 = atomicrmw xor i32* %a, i32 %b acquire
10926  ret i32 %1
10927}
10928
10929define i32 @atomicrmw_xor_i32_release(i32 *%a, i32 %b) nounwind {
10930; RV32I-LABEL: atomicrmw_xor_i32_release:
10931; RV32I:       # %bb.0:
10932; RV32I-NEXT:    addi sp, sp, -16
10933; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10934; RV32I-NEXT:    li a2, 3
10935; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10936; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10937; RV32I-NEXT:    addi sp, sp, 16
10938; RV32I-NEXT:    ret
10939;
10940; RV32IA-LABEL: atomicrmw_xor_i32_release:
10941; RV32IA:       # %bb.0:
10942; RV32IA-NEXT:    amoxor.w.rl a0, a1, (a0)
10943; RV32IA-NEXT:    ret
10944;
10945; RV64I-LABEL: atomicrmw_xor_i32_release:
10946; RV64I:       # %bb.0:
10947; RV64I-NEXT:    addi sp, sp, -16
10948; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10949; RV64I-NEXT:    li a2, 3
10950; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
10951; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10952; RV64I-NEXT:    addi sp, sp, 16
10953; RV64I-NEXT:    ret
10954;
10955; RV64IA-LABEL: atomicrmw_xor_i32_release:
10956; RV64IA:       # %bb.0:
10957; RV64IA-NEXT:    amoxor.w.rl a0, a1, (a0)
10958; RV64IA-NEXT:    ret
10959  %1 = atomicrmw xor i32* %a, i32 %b release
10960  ret i32 %1
10961}
10962
10963define i32 @atomicrmw_xor_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10964; RV32I-LABEL: atomicrmw_xor_i32_acq_rel:
10965; RV32I:       # %bb.0:
10966; RV32I-NEXT:    addi sp, sp, -16
10967; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10968; RV32I-NEXT:    li a2, 4
10969; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10970; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10971; RV32I-NEXT:    addi sp, sp, 16
10972; RV32I-NEXT:    ret
10973;
10974; RV32IA-LABEL: atomicrmw_xor_i32_acq_rel:
10975; RV32IA:       # %bb.0:
10976; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
10977; RV32IA-NEXT:    ret
10978;
10979; RV64I-LABEL: atomicrmw_xor_i32_acq_rel:
10980; RV64I:       # %bb.0:
10981; RV64I-NEXT:    addi sp, sp, -16
10982; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10983; RV64I-NEXT:    li a2, 4
10984; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
10985; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10986; RV64I-NEXT:    addi sp, sp, 16
10987; RV64I-NEXT:    ret
10988;
10989; RV64IA-LABEL: atomicrmw_xor_i32_acq_rel:
10990; RV64IA:       # %bb.0:
10991; RV64IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
10992; RV64IA-NEXT:    ret
10993  %1 = atomicrmw xor i32* %a, i32 %b acq_rel
10994  ret i32 %1
10995}
10996
10997define i32 @atomicrmw_xor_i32_seq_cst(i32 *%a, i32 %b) nounwind {
10998; RV32I-LABEL: atomicrmw_xor_i32_seq_cst:
10999; RV32I:       # %bb.0:
11000; RV32I-NEXT:    addi sp, sp, -16
11001; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11002; RV32I-NEXT:    li a2, 5
11003; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
11004; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11005; RV32I-NEXT:    addi sp, sp, 16
11006; RV32I-NEXT:    ret
11007;
11008; RV32IA-LABEL: atomicrmw_xor_i32_seq_cst:
11009; RV32IA:       # %bb.0:
11010; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
11011; RV32IA-NEXT:    ret
11012;
11013; RV64I-LABEL: atomicrmw_xor_i32_seq_cst:
11014; RV64I:       # %bb.0:
11015; RV64I-NEXT:    addi sp, sp, -16
11016; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11017; RV64I-NEXT:    li a2, 5
11018; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
11019; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11020; RV64I-NEXT:    addi sp, sp, 16
11021; RV64I-NEXT:    ret
11022;
11023; RV64IA-LABEL: atomicrmw_xor_i32_seq_cst:
11024; RV64IA:       # %bb.0:
11025; RV64IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
11026; RV64IA-NEXT:    ret
11027  %1 = atomicrmw xor i32* %a, i32 %b seq_cst
11028  ret i32 %1
11029}
11030
11031define i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind {
11032; RV32I-LABEL: atomicrmw_max_i32_monotonic:
11033; RV32I:       # %bb.0:
11034; RV32I-NEXT:    addi sp, sp, -16
11035; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11036; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11037; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11038; RV32I-NEXT:    mv s0, a0
11039; RV32I-NEXT:    lw a3, 0(a0)
11040; RV32I-NEXT:    mv s1, a1
11041; RV32I-NEXT:    j .LBB145_2
11042; RV32I-NEXT:  .LBB145_1: # %atomicrmw.start
11043; RV32I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11044; RV32I-NEXT:    sw a3, 0(sp)
11045; RV32I-NEXT:    mv a1, sp
11046; RV32I-NEXT:    mv a0, s0
11047; RV32I-NEXT:    li a3, 0
11048; RV32I-NEXT:    li a4, 0
11049; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11050; RV32I-NEXT:    lw a3, 0(sp)
11051; RV32I-NEXT:    bnez a0, .LBB145_4
11052; RV32I-NEXT:  .LBB145_2: # %atomicrmw.start
11053; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11054; RV32I-NEXT:    mv a2, a3
11055; RV32I-NEXT:    blt s1, a3, .LBB145_1
11056; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11057; RV32I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11058; RV32I-NEXT:    mv a2, s1
11059; RV32I-NEXT:    j .LBB145_1
11060; RV32I-NEXT:  .LBB145_4: # %atomicrmw.end
11061; RV32I-NEXT:    mv a0, a3
11062; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11063; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11064; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11065; RV32I-NEXT:    addi sp, sp, 16
11066; RV32I-NEXT:    ret
11067;
11068; RV32IA-LABEL: atomicrmw_max_i32_monotonic:
11069; RV32IA:       # %bb.0:
11070; RV32IA-NEXT:    amomax.w a0, a1, (a0)
11071; RV32IA-NEXT:    ret
11072;
11073; RV64I-LABEL: atomicrmw_max_i32_monotonic:
11074; RV64I:       # %bb.0:
11075; RV64I-NEXT:    addi sp, sp, -48
11076; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11077; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11078; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11079; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11080; RV64I-NEXT:    mv s0, a0
11081; RV64I-NEXT:    lw a3, 0(a0)
11082; RV64I-NEXT:    mv s1, a1
11083; RV64I-NEXT:    sext.w s2, a1
11084; RV64I-NEXT:    j .LBB145_2
11085; RV64I-NEXT:  .LBB145_1: # %atomicrmw.start
11086; RV64I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11087; RV64I-NEXT:    sw a3, 12(sp)
11088; RV64I-NEXT:    addi a1, sp, 12
11089; RV64I-NEXT:    mv a0, s0
11090; RV64I-NEXT:    li a3, 0
11091; RV64I-NEXT:    li a4, 0
11092; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11093; RV64I-NEXT:    lw a3, 12(sp)
11094; RV64I-NEXT:    bnez a0, .LBB145_4
11095; RV64I-NEXT:  .LBB145_2: # %atomicrmw.start
11096; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11097; RV64I-NEXT:    mv a2, a3
11098; RV64I-NEXT:    blt s2, a3, .LBB145_1
11099; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11100; RV64I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11101; RV64I-NEXT:    mv a2, s1
11102; RV64I-NEXT:    j .LBB145_1
11103; RV64I-NEXT:  .LBB145_4: # %atomicrmw.end
11104; RV64I-NEXT:    mv a0, a3
11105; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11106; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11107; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11108; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11109; RV64I-NEXT:    addi sp, sp, 48
11110; RV64I-NEXT:    ret
11111;
11112; RV64IA-LABEL: atomicrmw_max_i32_monotonic:
11113; RV64IA:       # %bb.0:
11114; RV64IA-NEXT:    amomax.w a0, a1, (a0)
11115; RV64IA-NEXT:    ret
11116  %1 = atomicrmw max i32* %a, i32 %b monotonic
11117  ret i32 %1
11118}
11119
11120define i32 @atomicrmw_max_i32_acquire(i32 *%a, i32 %b) nounwind {
11121; RV32I-LABEL: atomicrmw_max_i32_acquire:
11122; RV32I:       # %bb.0:
11123; RV32I-NEXT:    addi sp, sp, -16
11124; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11125; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11126; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11127; RV32I-NEXT:    mv s0, a0
11128; RV32I-NEXT:    lw a3, 0(a0)
11129; RV32I-NEXT:    mv s1, a1
11130; RV32I-NEXT:    j .LBB146_2
11131; RV32I-NEXT:  .LBB146_1: # %atomicrmw.start
11132; RV32I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11133; RV32I-NEXT:    sw a3, 0(sp)
11134; RV32I-NEXT:    mv a1, sp
11135; RV32I-NEXT:    li a3, 2
11136; RV32I-NEXT:    li a4, 2
11137; RV32I-NEXT:    mv a0, s0
11138; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11139; RV32I-NEXT:    lw a3, 0(sp)
11140; RV32I-NEXT:    bnez a0, .LBB146_4
11141; RV32I-NEXT:  .LBB146_2: # %atomicrmw.start
11142; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11143; RV32I-NEXT:    mv a2, a3
11144; RV32I-NEXT:    blt s1, a3, .LBB146_1
11145; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11146; RV32I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11147; RV32I-NEXT:    mv a2, s1
11148; RV32I-NEXT:    j .LBB146_1
11149; RV32I-NEXT:  .LBB146_4: # %atomicrmw.end
11150; RV32I-NEXT:    mv a0, a3
11151; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11152; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11153; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11154; RV32I-NEXT:    addi sp, sp, 16
11155; RV32I-NEXT:    ret
11156;
11157; RV32IA-LABEL: atomicrmw_max_i32_acquire:
11158; RV32IA:       # %bb.0:
11159; RV32IA-NEXT:    amomax.w.aq a0, a1, (a0)
11160; RV32IA-NEXT:    ret
11161;
11162; RV64I-LABEL: atomicrmw_max_i32_acquire:
11163; RV64I:       # %bb.0:
11164; RV64I-NEXT:    addi sp, sp, -48
11165; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11166; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11167; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11168; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11169; RV64I-NEXT:    mv s0, a0
11170; RV64I-NEXT:    lw a3, 0(a0)
11171; RV64I-NEXT:    mv s1, a1
11172; RV64I-NEXT:    sext.w s2, a1
11173; RV64I-NEXT:    j .LBB146_2
11174; RV64I-NEXT:  .LBB146_1: # %atomicrmw.start
11175; RV64I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11176; RV64I-NEXT:    sw a3, 12(sp)
11177; RV64I-NEXT:    addi a1, sp, 12
11178; RV64I-NEXT:    li a3, 2
11179; RV64I-NEXT:    li a4, 2
11180; RV64I-NEXT:    mv a0, s0
11181; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11182; RV64I-NEXT:    lw a3, 12(sp)
11183; RV64I-NEXT:    bnez a0, .LBB146_4
11184; RV64I-NEXT:  .LBB146_2: # %atomicrmw.start
11185; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11186; RV64I-NEXT:    mv a2, a3
11187; RV64I-NEXT:    blt s2, a3, .LBB146_1
11188; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11189; RV64I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11190; RV64I-NEXT:    mv a2, s1
11191; RV64I-NEXT:    j .LBB146_1
11192; RV64I-NEXT:  .LBB146_4: # %atomicrmw.end
11193; RV64I-NEXT:    mv a0, a3
11194; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11195; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11196; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11197; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11198; RV64I-NEXT:    addi sp, sp, 48
11199; RV64I-NEXT:    ret
11200;
11201; RV64IA-LABEL: atomicrmw_max_i32_acquire:
11202; RV64IA:       # %bb.0:
11203; RV64IA-NEXT:    amomax.w.aq a0, a1, (a0)
11204; RV64IA-NEXT:    ret
11205  %1 = atomicrmw max i32* %a, i32 %b acquire
11206  ret i32 %1
11207}
11208
11209define i32 @atomicrmw_max_i32_release(i32 *%a, i32 %b) nounwind {
11210; RV32I-LABEL: atomicrmw_max_i32_release:
11211; RV32I:       # %bb.0:
11212; RV32I-NEXT:    addi sp, sp, -16
11213; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11214; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11215; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11216; RV32I-NEXT:    mv s0, a0
11217; RV32I-NEXT:    lw a3, 0(a0)
11218; RV32I-NEXT:    mv s1, a1
11219; RV32I-NEXT:    j .LBB147_2
11220; RV32I-NEXT:  .LBB147_1: # %atomicrmw.start
11221; RV32I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11222; RV32I-NEXT:    sw a3, 0(sp)
11223; RV32I-NEXT:    mv a1, sp
11224; RV32I-NEXT:    li a3, 3
11225; RV32I-NEXT:    mv a0, s0
11226; RV32I-NEXT:    li a4, 0
11227; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11228; RV32I-NEXT:    lw a3, 0(sp)
11229; RV32I-NEXT:    bnez a0, .LBB147_4
11230; RV32I-NEXT:  .LBB147_2: # %atomicrmw.start
11231; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11232; RV32I-NEXT:    mv a2, a3
11233; RV32I-NEXT:    blt s1, a3, .LBB147_1
11234; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11235; RV32I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11236; RV32I-NEXT:    mv a2, s1
11237; RV32I-NEXT:    j .LBB147_1
11238; RV32I-NEXT:  .LBB147_4: # %atomicrmw.end
11239; RV32I-NEXT:    mv a0, a3
11240; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11241; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11242; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11243; RV32I-NEXT:    addi sp, sp, 16
11244; RV32I-NEXT:    ret
11245;
11246; RV32IA-LABEL: atomicrmw_max_i32_release:
11247; RV32IA:       # %bb.0:
11248; RV32IA-NEXT:    amomax.w.rl a0, a1, (a0)
11249; RV32IA-NEXT:    ret
11250;
11251; RV64I-LABEL: atomicrmw_max_i32_release:
11252; RV64I:       # %bb.0:
11253; RV64I-NEXT:    addi sp, sp, -48
11254; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11255; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11256; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11257; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11258; RV64I-NEXT:    mv s0, a0
11259; RV64I-NEXT:    lw a3, 0(a0)
11260; RV64I-NEXT:    mv s1, a1
11261; RV64I-NEXT:    sext.w s2, a1
11262; RV64I-NEXT:    j .LBB147_2
11263; RV64I-NEXT:  .LBB147_1: # %atomicrmw.start
11264; RV64I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11265; RV64I-NEXT:    sw a3, 12(sp)
11266; RV64I-NEXT:    addi a1, sp, 12
11267; RV64I-NEXT:    li a3, 3
11268; RV64I-NEXT:    mv a0, s0
11269; RV64I-NEXT:    li a4, 0
11270; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11271; RV64I-NEXT:    lw a3, 12(sp)
11272; RV64I-NEXT:    bnez a0, .LBB147_4
11273; RV64I-NEXT:  .LBB147_2: # %atomicrmw.start
11274; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11275; RV64I-NEXT:    mv a2, a3
11276; RV64I-NEXT:    blt s2, a3, .LBB147_1
11277; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11278; RV64I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11279; RV64I-NEXT:    mv a2, s1
11280; RV64I-NEXT:    j .LBB147_1
11281; RV64I-NEXT:  .LBB147_4: # %atomicrmw.end
11282; RV64I-NEXT:    mv a0, a3
11283; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11284; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11285; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11286; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11287; RV64I-NEXT:    addi sp, sp, 48
11288; RV64I-NEXT:    ret
11289;
11290; RV64IA-LABEL: atomicrmw_max_i32_release:
11291; RV64IA:       # %bb.0:
11292; RV64IA-NEXT:    amomax.w.rl a0, a1, (a0)
11293; RV64IA-NEXT:    ret
11294  %1 = atomicrmw max i32* %a, i32 %b release
11295  ret i32 %1
11296}
11297
11298define i32 @atomicrmw_max_i32_acq_rel(i32 *%a, i32 %b) nounwind {
11299; RV32I-LABEL: atomicrmw_max_i32_acq_rel:
11300; RV32I:       # %bb.0:
11301; RV32I-NEXT:    addi sp, sp, -16
11302; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11303; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11304; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11305; RV32I-NEXT:    mv s0, a0
11306; RV32I-NEXT:    lw a3, 0(a0)
11307; RV32I-NEXT:    mv s1, a1
11308; RV32I-NEXT:    j .LBB148_2
11309; RV32I-NEXT:  .LBB148_1: # %atomicrmw.start
11310; RV32I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11311; RV32I-NEXT:    sw a3, 0(sp)
11312; RV32I-NEXT:    mv a1, sp
11313; RV32I-NEXT:    li a3, 4
11314; RV32I-NEXT:    li a4, 2
11315; RV32I-NEXT:    mv a0, s0
11316; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11317; RV32I-NEXT:    lw a3, 0(sp)
11318; RV32I-NEXT:    bnez a0, .LBB148_4
11319; RV32I-NEXT:  .LBB148_2: # %atomicrmw.start
11320; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11321; RV32I-NEXT:    mv a2, a3
11322; RV32I-NEXT:    blt s1, a3, .LBB148_1
11323; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11324; RV32I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11325; RV32I-NEXT:    mv a2, s1
11326; RV32I-NEXT:    j .LBB148_1
11327; RV32I-NEXT:  .LBB148_4: # %atomicrmw.end
11328; RV32I-NEXT:    mv a0, a3
11329; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11330; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11331; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11332; RV32I-NEXT:    addi sp, sp, 16
11333; RV32I-NEXT:    ret
11334;
11335; RV32IA-LABEL: atomicrmw_max_i32_acq_rel:
11336; RV32IA:       # %bb.0:
11337; RV32IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11338; RV32IA-NEXT:    ret
11339;
11340; RV64I-LABEL: atomicrmw_max_i32_acq_rel:
11341; RV64I:       # %bb.0:
11342; RV64I-NEXT:    addi sp, sp, -48
11343; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11344; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11345; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11346; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11347; RV64I-NEXT:    mv s0, a0
11348; RV64I-NEXT:    lw a3, 0(a0)
11349; RV64I-NEXT:    mv s1, a1
11350; RV64I-NEXT:    sext.w s2, a1
11351; RV64I-NEXT:    j .LBB148_2
11352; RV64I-NEXT:  .LBB148_1: # %atomicrmw.start
11353; RV64I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11354; RV64I-NEXT:    sw a3, 12(sp)
11355; RV64I-NEXT:    addi a1, sp, 12
11356; RV64I-NEXT:    li a3, 4
11357; RV64I-NEXT:    li a4, 2
11358; RV64I-NEXT:    mv a0, s0
11359; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11360; RV64I-NEXT:    lw a3, 12(sp)
11361; RV64I-NEXT:    bnez a0, .LBB148_4
11362; RV64I-NEXT:  .LBB148_2: # %atomicrmw.start
11363; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11364; RV64I-NEXT:    mv a2, a3
11365; RV64I-NEXT:    blt s2, a3, .LBB148_1
11366; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11367; RV64I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11368; RV64I-NEXT:    mv a2, s1
11369; RV64I-NEXT:    j .LBB148_1
11370; RV64I-NEXT:  .LBB148_4: # %atomicrmw.end
11371; RV64I-NEXT:    mv a0, a3
11372; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11373; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11374; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11375; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11376; RV64I-NEXT:    addi sp, sp, 48
11377; RV64I-NEXT:    ret
11378;
11379; RV64IA-LABEL: atomicrmw_max_i32_acq_rel:
11380; RV64IA:       # %bb.0:
11381; RV64IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11382; RV64IA-NEXT:    ret
11383  %1 = atomicrmw max i32* %a, i32 %b acq_rel
11384  ret i32 %1
11385}
11386
11387define i32 @atomicrmw_max_i32_seq_cst(i32 *%a, i32 %b) nounwind {
11388; RV32I-LABEL: atomicrmw_max_i32_seq_cst:
11389; RV32I:       # %bb.0:
11390; RV32I-NEXT:    addi sp, sp, -16
11391; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11392; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11393; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11394; RV32I-NEXT:    mv s0, a0
11395; RV32I-NEXT:    lw a3, 0(a0)
11396; RV32I-NEXT:    mv s1, a1
11397; RV32I-NEXT:    j .LBB149_2
11398; RV32I-NEXT:  .LBB149_1: # %atomicrmw.start
11399; RV32I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11400; RV32I-NEXT:    sw a3, 0(sp)
11401; RV32I-NEXT:    mv a1, sp
11402; RV32I-NEXT:    li a3, 5
11403; RV32I-NEXT:    li a4, 5
11404; RV32I-NEXT:    mv a0, s0
11405; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11406; RV32I-NEXT:    lw a3, 0(sp)
11407; RV32I-NEXT:    bnez a0, .LBB149_4
11408; RV32I-NEXT:  .LBB149_2: # %atomicrmw.start
11409; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11410; RV32I-NEXT:    mv a2, a3
11411; RV32I-NEXT:    blt s1, a3, .LBB149_1
11412; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11413; RV32I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11414; RV32I-NEXT:    mv a2, s1
11415; RV32I-NEXT:    j .LBB149_1
11416; RV32I-NEXT:  .LBB149_4: # %atomicrmw.end
11417; RV32I-NEXT:    mv a0, a3
11418; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11419; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11420; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11421; RV32I-NEXT:    addi sp, sp, 16
11422; RV32I-NEXT:    ret
11423;
11424; RV32IA-LABEL: atomicrmw_max_i32_seq_cst:
11425; RV32IA:       # %bb.0:
11426; RV32IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11427; RV32IA-NEXT:    ret
11428;
11429; RV64I-LABEL: atomicrmw_max_i32_seq_cst:
11430; RV64I:       # %bb.0:
11431; RV64I-NEXT:    addi sp, sp, -48
11432; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11433; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11434; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11435; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11436; RV64I-NEXT:    mv s0, a0
11437; RV64I-NEXT:    lw a3, 0(a0)
11438; RV64I-NEXT:    mv s1, a1
11439; RV64I-NEXT:    sext.w s2, a1
11440; RV64I-NEXT:    j .LBB149_2
11441; RV64I-NEXT:  .LBB149_1: # %atomicrmw.start
11442; RV64I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11443; RV64I-NEXT:    sw a3, 12(sp)
11444; RV64I-NEXT:    addi a1, sp, 12
11445; RV64I-NEXT:    li a3, 5
11446; RV64I-NEXT:    li a4, 5
11447; RV64I-NEXT:    mv a0, s0
11448; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11449; RV64I-NEXT:    lw a3, 12(sp)
11450; RV64I-NEXT:    bnez a0, .LBB149_4
11451; RV64I-NEXT:  .LBB149_2: # %atomicrmw.start
11452; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11453; RV64I-NEXT:    mv a2, a3
11454; RV64I-NEXT:    blt s2, a3, .LBB149_1
11455; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11456; RV64I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11457; RV64I-NEXT:    mv a2, s1
11458; RV64I-NEXT:    j .LBB149_1
11459; RV64I-NEXT:  .LBB149_4: # %atomicrmw.end
11460; RV64I-NEXT:    mv a0, a3
11461; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11462; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11463; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11464; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11465; RV64I-NEXT:    addi sp, sp, 48
11466; RV64I-NEXT:    ret
11467;
11468; RV64IA-LABEL: atomicrmw_max_i32_seq_cst:
11469; RV64IA:       # %bb.0:
11470; RV64IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11471; RV64IA-NEXT:    ret
11472  %1 = atomicrmw max i32* %a, i32 %b seq_cst
11473  ret i32 %1
11474}
11475
11476define i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind {
11477; RV32I-LABEL: atomicrmw_min_i32_monotonic:
11478; RV32I:       # %bb.0:
11479; RV32I-NEXT:    addi sp, sp, -16
11480; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11481; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11482; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11483; RV32I-NEXT:    mv s0, a0
11484; RV32I-NEXT:    lw a3, 0(a0)
11485; RV32I-NEXT:    mv s1, a1
11486; RV32I-NEXT:    j .LBB150_2
11487; RV32I-NEXT:  .LBB150_1: # %atomicrmw.start
11488; RV32I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11489; RV32I-NEXT:    sw a3, 0(sp)
11490; RV32I-NEXT:    mv a1, sp
11491; RV32I-NEXT:    mv a0, s0
11492; RV32I-NEXT:    li a3, 0
11493; RV32I-NEXT:    li a4, 0
11494; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11495; RV32I-NEXT:    lw a3, 0(sp)
11496; RV32I-NEXT:    bnez a0, .LBB150_4
11497; RV32I-NEXT:  .LBB150_2: # %atomicrmw.start
11498; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11499; RV32I-NEXT:    mv a2, a3
11500; RV32I-NEXT:    bge s1, a3, .LBB150_1
11501; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11502; RV32I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11503; RV32I-NEXT:    mv a2, s1
11504; RV32I-NEXT:    j .LBB150_1
11505; RV32I-NEXT:  .LBB150_4: # %atomicrmw.end
11506; RV32I-NEXT:    mv a0, a3
11507; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11508; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11509; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11510; RV32I-NEXT:    addi sp, sp, 16
11511; RV32I-NEXT:    ret
11512;
11513; RV32IA-LABEL: atomicrmw_min_i32_monotonic:
11514; RV32IA:       # %bb.0:
11515; RV32IA-NEXT:    amomin.w a0, a1, (a0)
11516; RV32IA-NEXT:    ret
11517;
11518; RV64I-LABEL: atomicrmw_min_i32_monotonic:
11519; RV64I:       # %bb.0:
11520; RV64I-NEXT:    addi sp, sp, -48
11521; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11522; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11523; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11524; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11525; RV64I-NEXT:    mv s0, a0
11526; RV64I-NEXT:    lw a3, 0(a0)
11527; RV64I-NEXT:    mv s1, a1
11528; RV64I-NEXT:    sext.w s2, a1
11529; RV64I-NEXT:    j .LBB150_2
11530; RV64I-NEXT:  .LBB150_1: # %atomicrmw.start
11531; RV64I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11532; RV64I-NEXT:    sw a3, 12(sp)
11533; RV64I-NEXT:    addi a1, sp, 12
11534; RV64I-NEXT:    mv a0, s0
11535; RV64I-NEXT:    li a3, 0
11536; RV64I-NEXT:    li a4, 0
11537; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11538; RV64I-NEXT:    lw a3, 12(sp)
11539; RV64I-NEXT:    bnez a0, .LBB150_4
11540; RV64I-NEXT:  .LBB150_2: # %atomicrmw.start
11541; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11542; RV64I-NEXT:    mv a2, a3
11543; RV64I-NEXT:    bge s2, a3, .LBB150_1
11544; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11545; RV64I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11546; RV64I-NEXT:    mv a2, s1
11547; RV64I-NEXT:    j .LBB150_1
11548; RV64I-NEXT:  .LBB150_4: # %atomicrmw.end
11549; RV64I-NEXT:    mv a0, a3
11550; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11551; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11552; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11553; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11554; RV64I-NEXT:    addi sp, sp, 48
11555; RV64I-NEXT:    ret
11556;
11557; RV64IA-LABEL: atomicrmw_min_i32_monotonic:
11558; RV64IA:       # %bb.0:
11559; RV64IA-NEXT:    amomin.w a0, a1, (a0)
11560; RV64IA-NEXT:    ret
11561  %1 = atomicrmw min i32* %a, i32 %b monotonic
11562  ret i32 %1
11563}
11564
11565define i32 @atomicrmw_min_i32_acquire(i32 *%a, i32 %b) nounwind {
11566; RV32I-LABEL: atomicrmw_min_i32_acquire:
11567; RV32I:       # %bb.0:
11568; RV32I-NEXT:    addi sp, sp, -16
11569; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11570; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11571; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11572; RV32I-NEXT:    mv s0, a0
11573; RV32I-NEXT:    lw a3, 0(a0)
11574; RV32I-NEXT:    mv s1, a1
11575; RV32I-NEXT:    j .LBB151_2
11576; RV32I-NEXT:  .LBB151_1: # %atomicrmw.start
11577; RV32I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11578; RV32I-NEXT:    sw a3, 0(sp)
11579; RV32I-NEXT:    mv a1, sp
11580; RV32I-NEXT:    li a3, 2
11581; RV32I-NEXT:    li a4, 2
11582; RV32I-NEXT:    mv a0, s0
11583; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11584; RV32I-NEXT:    lw a3, 0(sp)
11585; RV32I-NEXT:    bnez a0, .LBB151_4
11586; RV32I-NEXT:  .LBB151_2: # %atomicrmw.start
11587; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11588; RV32I-NEXT:    mv a2, a3
11589; RV32I-NEXT:    bge s1, a3, .LBB151_1
11590; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11591; RV32I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11592; RV32I-NEXT:    mv a2, s1
11593; RV32I-NEXT:    j .LBB151_1
11594; RV32I-NEXT:  .LBB151_4: # %atomicrmw.end
11595; RV32I-NEXT:    mv a0, a3
11596; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11597; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11598; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11599; RV32I-NEXT:    addi sp, sp, 16
11600; RV32I-NEXT:    ret
11601;
11602; RV32IA-LABEL: atomicrmw_min_i32_acquire:
11603; RV32IA:       # %bb.0:
11604; RV32IA-NEXT:    amomin.w.aq a0, a1, (a0)
11605; RV32IA-NEXT:    ret
11606;
11607; RV64I-LABEL: atomicrmw_min_i32_acquire:
11608; RV64I:       # %bb.0:
11609; RV64I-NEXT:    addi sp, sp, -48
11610; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11611; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11612; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11613; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11614; RV64I-NEXT:    mv s0, a0
11615; RV64I-NEXT:    lw a3, 0(a0)
11616; RV64I-NEXT:    mv s1, a1
11617; RV64I-NEXT:    sext.w s2, a1
11618; RV64I-NEXT:    j .LBB151_2
11619; RV64I-NEXT:  .LBB151_1: # %atomicrmw.start
11620; RV64I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11621; RV64I-NEXT:    sw a3, 12(sp)
11622; RV64I-NEXT:    addi a1, sp, 12
11623; RV64I-NEXT:    li a3, 2
11624; RV64I-NEXT:    li a4, 2
11625; RV64I-NEXT:    mv a0, s0
11626; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11627; RV64I-NEXT:    lw a3, 12(sp)
11628; RV64I-NEXT:    bnez a0, .LBB151_4
11629; RV64I-NEXT:  .LBB151_2: # %atomicrmw.start
11630; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11631; RV64I-NEXT:    mv a2, a3
11632; RV64I-NEXT:    bge s2, a3, .LBB151_1
11633; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11634; RV64I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11635; RV64I-NEXT:    mv a2, s1
11636; RV64I-NEXT:    j .LBB151_1
11637; RV64I-NEXT:  .LBB151_4: # %atomicrmw.end
11638; RV64I-NEXT:    mv a0, a3
11639; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11640; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11641; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11642; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11643; RV64I-NEXT:    addi sp, sp, 48
11644; RV64I-NEXT:    ret
11645;
11646; RV64IA-LABEL: atomicrmw_min_i32_acquire:
11647; RV64IA:       # %bb.0:
11648; RV64IA-NEXT:    amomin.w.aq a0, a1, (a0)
11649; RV64IA-NEXT:    ret
11650  %1 = atomicrmw min i32* %a, i32 %b acquire
11651  ret i32 %1
11652}
11653
11654define i32 @atomicrmw_min_i32_release(i32 *%a, i32 %b) nounwind {
11655; RV32I-LABEL: atomicrmw_min_i32_release:
11656; RV32I:       # %bb.0:
11657; RV32I-NEXT:    addi sp, sp, -16
11658; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11659; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11660; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11661; RV32I-NEXT:    mv s0, a0
11662; RV32I-NEXT:    lw a3, 0(a0)
11663; RV32I-NEXT:    mv s1, a1
11664; RV32I-NEXT:    j .LBB152_2
11665; RV32I-NEXT:  .LBB152_1: # %atomicrmw.start
11666; RV32I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11667; RV32I-NEXT:    sw a3, 0(sp)
11668; RV32I-NEXT:    mv a1, sp
11669; RV32I-NEXT:    li a3, 3
11670; RV32I-NEXT:    mv a0, s0
11671; RV32I-NEXT:    li a4, 0
11672; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11673; RV32I-NEXT:    lw a3, 0(sp)
11674; RV32I-NEXT:    bnez a0, .LBB152_4
11675; RV32I-NEXT:  .LBB152_2: # %atomicrmw.start
11676; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11677; RV32I-NEXT:    mv a2, a3
11678; RV32I-NEXT:    bge s1, a3, .LBB152_1
11679; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11680; RV32I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11681; RV32I-NEXT:    mv a2, s1
11682; RV32I-NEXT:    j .LBB152_1
11683; RV32I-NEXT:  .LBB152_4: # %atomicrmw.end
11684; RV32I-NEXT:    mv a0, a3
11685; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11686; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11687; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11688; RV32I-NEXT:    addi sp, sp, 16
11689; RV32I-NEXT:    ret
11690;
11691; RV32IA-LABEL: atomicrmw_min_i32_release:
11692; RV32IA:       # %bb.0:
11693; RV32IA-NEXT:    amomin.w.rl a0, a1, (a0)
11694; RV32IA-NEXT:    ret
11695;
11696; RV64I-LABEL: atomicrmw_min_i32_release:
11697; RV64I:       # %bb.0:
11698; RV64I-NEXT:    addi sp, sp, -48
11699; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11700; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11701; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11702; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11703; RV64I-NEXT:    mv s0, a0
11704; RV64I-NEXT:    lw a3, 0(a0)
11705; RV64I-NEXT:    mv s1, a1
11706; RV64I-NEXT:    sext.w s2, a1
11707; RV64I-NEXT:    j .LBB152_2
11708; RV64I-NEXT:  .LBB152_1: # %atomicrmw.start
11709; RV64I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11710; RV64I-NEXT:    sw a3, 12(sp)
11711; RV64I-NEXT:    addi a1, sp, 12
11712; RV64I-NEXT:    li a3, 3
11713; RV64I-NEXT:    mv a0, s0
11714; RV64I-NEXT:    li a4, 0
11715; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11716; RV64I-NEXT:    lw a3, 12(sp)
11717; RV64I-NEXT:    bnez a0, .LBB152_4
11718; RV64I-NEXT:  .LBB152_2: # %atomicrmw.start
11719; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11720; RV64I-NEXT:    mv a2, a3
11721; RV64I-NEXT:    bge s2, a3, .LBB152_1
11722; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11723; RV64I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11724; RV64I-NEXT:    mv a2, s1
11725; RV64I-NEXT:    j .LBB152_1
11726; RV64I-NEXT:  .LBB152_4: # %atomicrmw.end
11727; RV64I-NEXT:    mv a0, a3
11728; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11729; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11730; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11731; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11732; RV64I-NEXT:    addi sp, sp, 48
11733; RV64I-NEXT:    ret
11734;
11735; RV64IA-LABEL: atomicrmw_min_i32_release:
11736; RV64IA:       # %bb.0:
11737; RV64IA-NEXT:    amomin.w.rl a0, a1, (a0)
11738; RV64IA-NEXT:    ret
11739  %1 = atomicrmw min i32* %a, i32 %b release
11740  ret i32 %1
11741}
11742
11743define i32 @atomicrmw_min_i32_acq_rel(i32 *%a, i32 %b) nounwind {
11744; RV32I-LABEL: atomicrmw_min_i32_acq_rel:
11745; RV32I:       # %bb.0:
11746; RV32I-NEXT:    addi sp, sp, -16
11747; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11748; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11749; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11750; RV32I-NEXT:    mv s0, a0
11751; RV32I-NEXT:    lw a3, 0(a0)
11752; RV32I-NEXT:    mv s1, a1
11753; RV32I-NEXT:    j .LBB153_2
11754; RV32I-NEXT:  .LBB153_1: # %atomicrmw.start
11755; RV32I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11756; RV32I-NEXT:    sw a3, 0(sp)
11757; RV32I-NEXT:    mv a1, sp
11758; RV32I-NEXT:    li a3, 4
11759; RV32I-NEXT:    li a4, 2
11760; RV32I-NEXT:    mv a0, s0
11761; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11762; RV32I-NEXT:    lw a3, 0(sp)
11763; RV32I-NEXT:    bnez a0, .LBB153_4
11764; RV32I-NEXT:  .LBB153_2: # %atomicrmw.start
11765; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11766; RV32I-NEXT:    mv a2, a3
11767; RV32I-NEXT:    bge s1, a3, .LBB153_1
11768; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11769; RV32I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11770; RV32I-NEXT:    mv a2, s1
11771; RV32I-NEXT:    j .LBB153_1
11772; RV32I-NEXT:  .LBB153_4: # %atomicrmw.end
11773; RV32I-NEXT:    mv a0, a3
11774; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11775; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11776; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11777; RV32I-NEXT:    addi sp, sp, 16
11778; RV32I-NEXT:    ret
11779;
11780; RV32IA-LABEL: atomicrmw_min_i32_acq_rel:
11781; RV32IA:       # %bb.0:
11782; RV32IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11783; RV32IA-NEXT:    ret
11784;
11785; RV64I-LABEL: atomicrmw_min_i32_acq_rel:
11786; RV64I:       # %bb.0:
11787; RV64I-NEXT:    addi sp, sp, -48
11788; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11789; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11790; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11791; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11792; RV64I-NEXT:    mv s0, a0
11793; RV64I-NEXT:    lw a3, 0(a0)
11794; RV64I-NEXT:    mv s1, a1
11795; RV64I-NEXT:    sext.w s2, a1
11796; RV64I-NEXT:    j .LBB153_2
11797; RV64I-NEXT:  .LBB153_1: # %atomicrmw.start
11798; RV64I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11799; RV64I-NEXT:    sw a3, 12(sp)
11800; RV64I-NEXT:    addi a1, sp, 12
11801; RV64I-NEXT:    li a3, 4
11802; RV64I-NEXT:    li a4, 2
11803; RV64I-NEXT:    mv a0, s0
11804; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11805; RV64I-NEXT:    lw a3, 12(sp)
11806; RV64I-NEXT:    bnez a0, .LBB153_4
11807; RV64I-NEXT:  .LBB153_2: # %atomicrmw.start
11808; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11809; RV64I-NEXT:    mv a2, a3
11810; RV64I-NEXT:    bge s2, a3, .LBB153_1
11811; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11812; RV64I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11813; RV64I-NEXT:    mv a2, s1
11814; RV64I-NEXT:    j .LBB153_1
11815; RV64I-NEXT:  .LBB153_4: # %atomicrmw.end
11816; RV64I-NEXT:    mv a0, a3
11817; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11818; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11819; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11820; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11821; RV64I-NEXT:    addi sp, sp, 48
11822; RV64I-NEXT:    ret
11823;
11824; RV64IA-LABEL: atomicrmw_min_i32_acq_rel:
11825; RV64IA:       # %bb.0:
11826; RV64IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11827; RV64IA-NEXT:    ret
11828  %1 = atomicrmw min i32* %a, i32 %b acq_rel
11829  ret i32 %1
11830}
11831
11832define i32 @atomicrmw_min_i32_seq_cst(i32 *%a, i32 %b) nounwind {
11833; RV32I-LABEL: atomicrmw_min_i32_seq_cst:
11834; RV32I:       # %bb.0:
11835; RV32I-NEXT:    addi sp, sp, -16
11836; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11837; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11838; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11839; RV32I-NEXT:    mv s0, a0
11840; RV32I-NEXT:    lw a3, 0(a0)
11841; RV32I-NEXT:    mv s1, a1
11842; RV32I-NEXT:    j .LBB154_2
11843; RV32I-NEXT:  .LBB154_1: # %atomicrmw.start
11844; RV32I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11845; RV32I-NEXT:    sw a3, 0(sp)
11846; RV32I-NEXT:    mv a1, sp
11847; RV32I-NEXT:    li a3, 5
11848; RV32I-NEXT:    li a4, 5
11849; RV32I-NEXT:    mv a0, s0
11850; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11851; RV32I-NEXT:    lw a3, 0(sp)
11852; RV32I-NEXT:    bnez a0, .LBB154_4
11853; RV32I-NEXT:  .LBB154_2: # %atomicrmw.start
11854; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11855; RV32I-NEXT:    mv a2, a3
11856; RV32I-NEXT:    bge s1, a3, .LBB154_1
11857; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11858; RV32I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11859; RV32I-NEXT:    mv a2, s1
11860; RV32I-NEXT:    j .LBB154_1
11861; RV32I-NEXT:  .LBB154_4: # %atomicrmw.end
11862; RV32I-NEXT:    mv a0, a3
11863; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11864; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11865; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11866; RV32I-NEXT:    addi sp, sp, 16
11867; RV32I-NEXT:    ret
11868;
11869; RV32IA-LABEL: atomicrmw_min_i32_seq_cst:
11870; RV32IA:       # %bb.0:
11871; RV32IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11872; RV32IA-NEXT:    ret
11873;
11874; RV64I-LABEL: atomicrmw_min_i32_seq_cst:
11875; RV64I:       # %bb.0:
11876; RV64I-NEXT:    addi sp, sp, -48
11877; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11878; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11879; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11880; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11881; RV64I-NEXT:    mv s0, a0
11882; RV64I-NEXT:    lw a3, 0(a0)
11883; RV64I-NEXT:    mv s1, a1
11884; RV64I-NEXT:    sext.w s2, a1
11885; RV64I-NEXT:    j .LBB154_2
11886; RV64I-NEXT:  .LBB154_1: # %atomicrmw.start
11887; RV64I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11888; RV64I-NEXT:    sw a3, 12(sp)
11889; RV64I-NEXT:    addi a1, sp, 12
11890; RV64I-NEXT:    li a3, 5
11891; RV64I-NEXT:    li a4, 5
11892; RV64I-NEXT:    mv a0, s0
11893; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11894; RV64I-NEXT:    lw a3, 12(sp)
11895; RV64I-NEXT:    bnez a0, .LBB154_4
11896; RV64I-NEXT:  .LBB154_2: # %atomicrmw.start
11897; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11898; RV64I-NEXT:    mv a2, a3
11899; RV64I-NEXT:    bge s2, a3, .LBB154_1
11900; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11901; RV64I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11902; RV64I-NEXT:    mv a2, s1
11903; RV64I-NEXT:    j .LBB154_1
11904; RV64I-NEXT:  .LBB154_4: # %atomicrmw.end
11905; RV64I-NEXT:    mv a0, a3
11906; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11907; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11908; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11909; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11910; RV64I-NEXT:    addi sp, sp, 48
11911; RV64I-NEXT:    ret
11912;
11913; RV64IA-LABEL: atomicrmw_min_i32_seq_cst:
11914; RV64IA:       # %bb.0:
11915; RV64IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11916; RV64IA-NEXT:    ret
11917  %1 = atomicrmw min i32* %a, i32 %b seq_cst
11918  ret i32 %1
11919}
11920
11921define i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind {
11922; RV32I-LABEL: atomicrmw_umax_i32_monotonic:
11923; RV32I:       # %bb.0:
11924; RV32I-NEXT:    addi sp, sp, -16
11925; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11926; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11927; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11928; RV32I-NEXT:    mv s0, a0
11929; RV32I-NEXT:    lw a3, 0(a0)
11930; RV32I-NEXT:    mv s1, a1
11931; RV32I-NEXT:    j .LBB155_2
11932; RV32I-NEXT:  .LBB155_1: # %atomicrmw.start
11933; RV32I-NEXT:    # in Loop: Header=BB155_2 Depth=1
11934; RV32I-NEXT:    sw a3, 0(sp)
11935; RV32I-NEXT:    mv a1, sp
11936; RV32I-NEXT:    mv a0, s0
11937; RV32I-NEXT:    li a3, 0
11938; RV32I-NEXT:    li a4, 0
11939; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11940; RV32I-NEXT:    lw a3, 0(sp)
11941; RV32I-NEXT:    bnez a0, .LBB155_4
11942; RV32I-NEXT:  .LBB155_2: # %atomicrmw.start
11943; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11944; RV32I-NEXT:    mv a2, a3
11945; RV32I-NEXT:    bltu s1, a3, .LBB155_1
11946; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11947; RV32I-NEXT:    # in Loop: Header=BB155_2 Depth=1
11948; RV32I-NEXT:    mv a2, s1
11949; RV32I-NEXT:    j .LBB155_1
11950; RV32I-NEXT:  .LBB155_4: # %atomicrmw.end
11951; RV32I-NEXT:    mv a0, a3
11952; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11953; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11954; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11955; RV32I-NEXT:    addi sp, sp, 16
11956; RV32I-NEXT:    ret
11957;
11958; RV32IA-LABEL: atomicrmw_umax_i32_monotonic:
11959; RV32IA:       # %bb.0:
11960; RV32IA-NEXT:    amomaxu.w a0, a1, (a0)
11961; RV32IA-NEXT:    ret
11962;
11963; RV64I-LABEL: atomicrmw_umax_i32_monotonic:
11964; RV64I:       # %bb.0:
11965; RV64I-NEXT:    addi sp, sp, -48
11966; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11967; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11968; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11969; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11970; RV64I-NEXT:    mv s0, a0
11971; RV64I-NEXT:    lw a3, 0(a0)
11972; RV64I-NEXT:    mv s1, a1
11973; RV64I-NEXT:    sext.w s2, a1
11974; RV64I-NEXT:    j .LBB155_2
11975; RV64I-NEXT:  .LBB155_1: # %atomicrmw.start
11976; RV64I-NEXT:    # in Loop: Header=BB155_2 Depth=1
11977; RV64I-NEXT:    sw a3, 12(sp)
11978; RV64I-NEXT:    addi a1, sp, 12
11979; RV64I-NEXT:    mv a0, s0
11980; RV64I-NEXT:    li a3, 0
11981; RV64I-NEXT:    li a4, 0
11982; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11983; RV64I-NEXT:    lw a3, 12(sp)
11984; RV64I-NEXT:    bnez a0, .LBB155_4
11985; RV64I-NEXT:  .LBB155_2: # %atomicrmw.start
11986; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11987; RV64I-NEXT:    mv a2, a3
11988; RV64I-NEXT:    bltu s2, a3, .LBB155_1
11989; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11990; RV64I-NEXT:    # in Loop: Header=BB155_2 Depth=1
11991; RV64I-NEXT:    mv a2, s1
11992; RV64I-NEXT:    j .LBB155_1
11993; RV64I-NEXT:  .LBB155_4: # %atomicrmw.end
11994; RV64I-NEXT:    mv a0, a3
11995; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11996; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11997; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11998; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11999; RV64I-NEXT:    addi sp, sp, 48
12000; RV64I-NEXT:    ret
12001;
12002; RV64IA-LABEL: atomicrmw_umax_i32_monotonic:
12003; RV64IA:       # %bb.0:
12004; RV64IA-NEXT:    amomaxu.w a0, a1, (a0)
12005; RV64IA-NEXT:    ret
12006  %1 = atomicrmw umax i32* %a, i32 %b monotonic
12007  ret i32 %1
12008}
12009
12010define i32 @atomicrmw_umax_i32_acquire(i32 *%a, i32 %b) nounwind {
12011; RV32I-LABEL: atomicrmw_umax_i32_acquire:
12012; RV32I:       # %bb.0:
12013; RV32I-NEXT:    addi sp, sp, -16
12014; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12015; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12016; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12017; RV32I-NEXT:    mv s0, a0
12018; RV32I-NEXT:    lw a3, 0(a0)
12019; RV32I-NEXT:    mv s1, a1
12020; RV32I-NEXT:    j .LBB156_2
12021; RV32I-NEXT:  .LBB156_1: # %atomicrmw.start
12022; RV32I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12023; RV32I-NEXT:    sw a3, 0(sp)
12024; RV32I-NEXT:    mv a1, sp
12025; RV32I-NEXT:    li a3, 2
12026; RV32I-NEXT:    li a4, 2
12027; RV32I-NEXT:    mv a0, s0
12028; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12029; RV32I-NEXT:    lw a3, 0(sp)
12030; RV32I-NEXT:    bnez a0, .LBB156_4
12031; RV32I-NEXT:  .LBB156_2: # %atomicrmw.start
12032; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12033; RV32I-NEXT:    mv a2, a3
12034; RV32I-NEXT:    bltu s1, a3, .LBB156_1
12035; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12036; RV32I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12037; RV32I-NEXT:    mv a2, s1
12038; RV32I-NEXT:    j .LBB156_1
12039; RV32I-NEXT:  .LBB156_4: # %atomicrmw.end
12040; RV32I-NEXT:    mv a0, a3
12041; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12042; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12043; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12044; RV32I-NEXT:    addi sp, sp, 16
12045; RV32I-NEXT:    ret
12046;
12047; RV32IA-LABEL: atomicrmw_umax_i32_acquire:
12048; RV32IA:       # %bb.0:
12049; RV32IA-NEXT:    amomaxu.w.aq a0, a1, (a0)
12050; RV32IA-NEXT:    ret
12051;
12052; RV64I-LABEL: atomicrmw_umax_i32_acquire:
12053; RV64I:       # %bb.0:
12054; RV64I-NEXT:    addi sp, sp, -48
12055; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12056; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12057; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12058; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12059; RV64I-NEXT:    mv s0, a0
12060; RV64I-NEXT:    lw a3, 0(a0)
12061; RV64I-NEXT:    mv s1, a1
12062; RV64I-NEXT:    sext.w s2, a1
12063; RV64I-NEXT:    j .LBB156_2
12064; RV64I-NEXT:  .LBB156_1: # %atomicrmw.start
12065; RV64I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12066; RV64I-NEXT:    sw a3, 12(sp)
12067; RV64I-NEXT:    addi a1, sp, 12
12068; RV64I-NEXT:    li a3, 2
12069; RV64I-NEXT:    li a4, 2
12070; RV64I-NEXT:    mv a0, s0
12071; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12072; RV64I-NEXT:    lw a3, 12(sp)
12073; RV64I-NEXT:    bnez a0, .LBB156_4
12074; RV64I-NEXT:  .LBB156_2: # %atomicrmw.start
12075; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12076; RV64I-NEXT:    mv a2, a3
12077; RV64I-NEXT:    bltu s2, a3, .LBB156_1
12078; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12079; RV64I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12080; RV64I-NEXT:    mv a2, s1
12081; RV64I-NEXT:    j .LBB156_1
12082; RV64I-NEXT:  .LBB156_4: # %atomicrmw.end
12083; RV64I-NEXT:    mv a0, a3
12084; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12085; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12086; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12087; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12088; RV64I-NEXT:    addi sp, sp, 48
12089; RV64I-NEXT:    ret
12090;
12091; RV64IA-LABEL: atomicrmw_umax_i32_acquire:
12092; RV64IA:       # %bb.0:
12093; RV64IA-NEXT:    amomaxu.w.aq a0, a1, (a0)
12094; RV64IA-NEXT:    ret
12095  %1 = atomicrmw umax i32* %a, i32 %b acquire
12096  ret i32 %1
12097}
12098
12099define i32 @atomicrmw_umax_i32_release(i32 *%a, i32 %b) nounwind {
12100; RV32I-LABEL: atomicrmw_umax_i32_release:
12101; RV32I:       # %bb.0:
12102; RV32I-NEXT:    addi sp, sp, -16
12103; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12104; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12105; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12106; RV32I-NEXT:    mv s0, a0
12107; RV32I-NEXT:    lw a3, 0(a0)
12108; RV32I-NEXT:    mv s1, a1
12109; RV32I-NEXT:    j .LBB157_2
12110; RV32I-NEXT:  .LBB157_1: # %atomicrmw.start
12111; RV32I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12112; RV32I-NEXT:    sw a3, 0(sp)
12113; RV32I-NEXT:    mv a1, sp
12114; RV32I-NEXT:    li a3, 3
12115; RV32I-NEXT:    mv a0, s0
12116; RV32I-NEXT:    li a4, 0
12117; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12118; RV32I-NEXT:    lw a3, 0(sp)
12119; RV32I-NEXT:    bnez a0, .LBB157_4
12120; RV32I-NEXT:  .LBB157_2: # %atomicrmw.start
12121; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12122; RV32I-NEXT:    mv a2, a3
12123; RV32I-NEXT:    bltu s1, a3, .LBB157_1
12124; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12125; RV32I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12126; RV32I-NEXT:    mv a2, s1
12127; RV32I-NEXT:    j .LBB157_1
12128; RV32I-NEXT:  .LBB157_4: # %atomicrmw.end
12129; RV32I-NEXT:    mv a0, a3
12130; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12131; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12132; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12133; RV32I-NEXT:    addi sp, sp, 16
12134; RV32I-NEXT:    ret
12135;
12136; RV32IA-LABEL: atomicrmw_umax_i32_release:
12137; RV32IA:       # %bb.0:
12138; RV32IA-NEXT:    amomaxu.w.rl a0, a1, (a0)
12139; RV32IA-NEXT:    ret
12140;
12141; RV64I-LABEL: atomicrmw_umax_i32_release:
12142; RV64I:       # %bb.0:
12143; RV64I-NEXT:    addi sp, sp, -48
12144; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12145; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12146; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12147; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12148; RV64I-NEXT:    mv s0, a0
12149; RV64I-NEXT:    lw a3, 0(a0)
12150; RV64I-NEXT:    mv s1, a1
12151; RV64I-NEXT:    sext.w s2, a1
12152; RV64I-NEXT:    j .LBB157_2
12153; RV64I-NEXT:  .LBB157_1: # %atomicrmw.start
12154; RV64I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12155; RV64I-NEXT:    sw a3, 12(sp)
12156; RV64I-NEXT:    addi a1, sp, 12
12157; RV64I-NEXT:    li a3, 3
12158; RV64I-NEXT:    mv a0, s0
12159; RV64I-NEXT:    li a4, 0
12160; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12161; RV64I-NEXT:    lw a3, 12(sp)
12162; RV64I-NEXT:    bnez a0, .LBB157_4
12163; RV64I-NEXT:  .LBB157_2: # %atomicrmw.start
12164; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12165; RV64I-NEXT:    mv a2, a3
12166; RV64I-NEXT:    bltu s2, a3, .LBB157_1
12167; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12168; RV64I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12169; RV64I-NEXT:    mv a2, s1
12170; RV64I-NEXT:    j .LBB157_1
12171; RV64I-NEXT:  .LBB157_4: # %atomicrmw.end
12172; RV64I-NEXT:    mv a0, a3
12173; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12174; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12175; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12176; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12177; RV64I-NEXT:    addi sp, sp, 48
12178; RV64I-NEXT:    ret
12179;
12180; RV64IA-LABEL: atomicrmw_umax_i32_release:
12181; RV64IA:       # %bb.0:
12182; RV64IA-NEXT:    amomaxu.w.rl a0, a1, (a0)
12183; RV64IA-NEXT:    ret
12184  %1 = atomicrmw umax i32* %a, i32 %b release
12185  ret i32 %1
12186}
12187
12188define i32 @atomicrmw_umax_i32_acq_rel(i32 *%a, i32 %b) nounwind {
12189; RV32I-LABEL: atomicrmw_umax_i32_acq_rel:
12190; RV32I:       # %bb.0:
12191; RV32I-NEXT:    addi sp, sp, -16
12192; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12193; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12194; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12195; RV32I-NEXT:    mv s0, a0
12196; RV32I-NEXT:    lw a3, 0(a0)
12197; RV32I-NEXT:    mv s1, a1
12198; RV32I-NEXT:    j .LBB158_2
12199; RV32I-NEXT:  .LBB158_1: # %atomicrmw.start
12200; RV32I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12201; RV32I-NEXT:    sw a3, 0(sp)
12202; RV32I-NEXT:    mv a1, sp
12203; RV32I-NEXT:    li a3, 4
12204; RV32I-NEXT:    li a4, 2
12205; RV32I-NEXT:    mv a0, s0
12206; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12207; RV32I-NEXT:    lw a3, 0(sp)
12208; RV32I-NEXT:    bnez a0, .LBB158_4
12209; RV32I-NEXT:  .LBB158_2: # %atomicrmw.start
12210; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12211; RV32I-NEXT:    mv a2, a3
12212; RV32I-NEXT:    bltu s1, a3, .LBB158_1
12213; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12214; RV32I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12215; RV32I-NEXT:    mv a2, s1
12216; RV32I-NEXT:    j .LBB158_1
12217; RV32I-NEXT:  .LBB158_4: # %atomicrmw.end
12218; RV32I-NEXT:    mv a0, a3
12219; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12220; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12221; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12222; RV32I-NEXT:    addi sp, sp, 16
12223; RV32I-NEXT:    ret
12224;
12225; RV32IA-LABEL: atomicrmw_umax_i32_acq_rel:
12226; RV32IA:       # %bb.0:
12227; RV32IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12228; RV32IA-NEXT:    ret
12229;
12230; RV64I-LABEL: atomicrmw_umax_i32_acq_rel:
12231; RV64I:       # %bb.0:
12232; RV64I-NEXT:    addi sp, sp, -48
12233; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12234; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12235; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12236; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12237; RV64I-NEXT:    mv s0, a0
12238; RV64I-NEXT:    lw a3, 0(a0)
12239; RV64I-NEXT:    mv s1, a1
12240; RV64I-NEXT:    sext.w s2, a1
12241; RV64I-NEXT:    j .LBB158_2
12242; RV64I-NEXT:  .LBB158_1: # %atomicrmw.start
12243; RV64I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12244; RV64I-NEXT:    sw a3, 12(sp)
12245; RV64I-NEXT:    addi a1, sp, 12
12246; RV64I-NEXT:    li a3, 4
12247; RV64I-NEXT:    li a4, 2
12248; RV64I-NEXT:    mv a0, s0
12249; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12250; RV64I-NEXT:    lw a3, 12(sp)
12251; RV64I-NEXT:    bnez a0, .LBB158_4
12252; RV64I-NEXT:  .LBB158_2: # %atomicrmw.start
12253; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12254; RV64I-NEXT:    mv a2, a3
12255; RV64I-NEXT:    bltu s2, a3, .LBB158_1
12256; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12257; RV64I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12258; RV64I-NEXT:    mv a2, s1
12259; RV64I-NEXT:    j .LBB158_1
12260; RV64I-NEXT:  .LBB158_4: # %atomicrmw.end
12261; RV64I-NEXT:    mv a0, a3
12262; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12263; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12264; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12265; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12266; RV64I-NEXT:    addi sp, sp, 48
12267; RV64I-NEXT:    ret
12268;
12269; RV64IA-LABEL: atomicrmw_umax_i32_acq_rel:
12270; RV64IA:       # %bb.0:
12271; RV64IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12272; RV64IA-NEXT:    ret
12273  %1 = atomicrmw umax i32* %a, i32 %b acq_rel
12274  ret i32 %1
12275}
12276
12277define i32 @atomicrmw_umax_i32_seq_cst(i32 *%a, i32 %b) nounwind {
12278; RV32I-LABEL: atomicrmw_umax_i32_seq_cst:
12279; RV32I:       # %bb.0:
12280; RV32I-NEXT:    addi sp, sp, -16
12281; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12282; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12283; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12284; RV32I-NEXT:    mv s0, a0
12285; RV32I-NEXT:    lw a3, 0(a0)
12286; RV32I-NEXT:    mv s1, a1
12287; RV32I-NEXT:    j .LBB159_2
12288; RV32I-NEXT:  .LBB159_1: # %atomicrmw.start
12289; RV32I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12290; RV32I-NEXT:    sw a3, 0(sp)
12291; RV32I-NEXT:    mv a1, sp
12292; RV32I-NEXT:    li a3, 5
12293; RV32I-NEXT:    li a4, 5
12294; RV32I-NEXT:    mv a0, s0
12295; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12296; RV32I-NEXT:    lw a3, 0(sp)
12297; RV32I-NEXT:    bnez a0, .LBB159_4
12298; RV32I-NEXT:  .LBB159_2: # %atomicrmw.start
12299; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12300; RV32I-NEXT:    mv a2, a3
12301; RV32I-NEXT:    bltu s1, a3, .LBB159_1
12302; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12303; RV32I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12304; RV32I-NEXT:    mv a2, s1
12305; RV32I-NEXT:    j .LBB159_1
12306; RV32I-NEXT:  .LBB159_4: # %atomicrmw.end
12307; RV32I-NEXT:    mv a0, a3
12308; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12309; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12310; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12311; RV32I-NEXT:    addi sp, sp, 16
12312; RV32I-NEXT:    ret
12313;
12314; RV32IA-LABEL: atomicrmw_umax_i32_seq_cst:
12315; RV32IA:       # %bb.0:
12316; RV32IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12317; RV32IA-NEXT:    ret
12318;
12319; RV64I-LABEL: atomicrmw_umax_i32_seq_cst:
12320; RV64I:       # %bb.0:
12321; RV64I-NEXT:    addi sp, sp, -48
12322; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12323; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12324; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12325; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12326; RV64I-NEXT:    mv s0, a0
12327; RV64I-NEXT:    lw a3, 0(a0)
12328; RV64I-NEXT:    mv s1, a1
12329; RV64I-NEXT:    sext.w s2, a1
12330; RV64I-NEXT:    j .LBB159_2
12331; RV64I-NEXT:  .LBB159_1: # %atomicrmw.start
12332; RV64I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12333; RV64I-NEXT:    sw a3, 12(sp)
12334; RV64I-NEXT:    addi a1, sp, 12
12335; RV64I-NEXT:    li a3, 5
12336; RV64I-NEXT:    li a4, 5
12337; RV64I-NEXT:    mv a0, s0
12338; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12339; RV64I-NEXT:    lw a3, 12(sp)
12340; RV64I-NEXT:    bnez a0, .LBB159_4
12341; RV64I-NEXT:  .LBB159_2: # %atomicrmw.start
12342; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12343; RV64I-NEXT:    mv a2, a3
12344; RV64I-NEXT:    bltu s2, a3, .LBB159_1
12345; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12346; RV64I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12347; RV64I-NEXT:    mv a2, s1
12348; RV64I-NEXT:    j .LBB159_1
12349; RV64I-NEXT:  .LBB159_4: # %atomicrmw.end
12350; RV64I-NEXT:    mv a0, a3
12351; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12352; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12353; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12354; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12355; RV64I-NEXT:    addi sp, sp, 48
12356; RV64I-NEXT:    ret
12357;
12358; RV64IA-LABEL: atomicrmw_umax_i32_seq_cst:
12359; RV64IA:       # %bb.0:
12360; RV64IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12361; RV64IA-NEXT:    ret
12362  %1 = atomicrmw umax i32* %a, i32 %b seq_cst
12363  ret i32 %1
12364}
12365
12366define i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind {
12367; RV32I-LABEL: atomicrmw_umin_i32_monotonic:
12368; RV32I:       # %bb.0:
12369; RV32I-NEXT:    addi sp, sp, -16
12370; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12371; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12372; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12373; RV32I-NEXT:    mv s0, a0
12374; RV32I-NEXT:    lw a3, 0(a0)
12375; RV32I-NEXT:    mv s1, a1
12376; RV32I-NEXT:    j .LBB160_2
12377; RV32I-NEXT:  .LBB160_1: # %atomicrmw.start
12378; RV32I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12379; RV32I-NEXT:    sw a3, 0(sp)
12380; RV32I-NEXT:    mv a1, sp
12381; RV32I-NEXT:    mv a0, s0
12382; RV32I-NEXT:    li a3, 0
12383; RV32I-NEXT:    li a4, 0
12384; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12385; RV32I-NEXT:    lw a3, 0(sp)
12386; RV32I-NEXT:    bnez a0, .LBB160_4
12387; RV32I-NEXT:  .LBB160_2: # %atomicrmw.start
12388; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12389; RV32I-NEXT:    mv a2, a3
12390; RV32I-NEXT:    bgeu s1, a3, .LBB160_1
12391; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12392; RV32I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12393; RV32I-NEXT:    mv a2, s1
12394; RV32I-NEXT:    j .LBB160_1
12395; RV32I-NEXT:  .LBB160_4: # %atomicrmw.end
12396; RV32I-NEXT:    mv a0, a3
12397; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12398; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12399; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12400; RV32I-NEXT:    addi sp, sp, 16
12401; RV32I-NEXT:    ret
12402;
12403; RV32IA-LABEL: atomicrmw_umin_i32_monotonic:
12404; RV32IA:       # %bb.0:
12405; RV32IA-NEXT:    amominu.w a0, a1, (a0)
12406; RV32IA-NEXT:    ret
12407;
12408; RV64I-LABEL: atomicrmw_umin_i32_monotonic:
12409; RV64I:       # %bb.0:
12410; RV64I-NEXT:    addi sp, sp, -48
12411; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12412; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12413; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12414; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12415; RV64I-NEXT:    mv s0, a0
12416; RV64I-NEXT:    lw a3, 0(a0)
12417; RV64I-NEXT:    mv s1, a1
12418; RV64I-NEXT:    sext.w s2, a1
12419; RV64I-NEXT:    j .LBB160_2
12420; RV64I-NEXT:  .LBB160_1: # %atomicrmw.start
12421; RV64I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12422; RV64I-NEXT:    sw a3, 12(sp)
12423; RV64I-NEXT:    addi a1, sp, 12
12424; RV64I-NEXT:    mv a0, s0
12425; RV64I-NEXT:    li a3, 0
12426; RV64I-NEXT:    li a4, 0
12427; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12428; RV64I-NEXT:    lw a3, 12(sp)
12429; RV64I-NEXT:    bnez a0, .LBB160_4
12430; RV64I-NEXT:  .LBB160_2: # %atomicrmw.start
12431; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12432; RV64I-NEXT:    mv a2, a3
12433; RV64I-NEXT:    bgeu s2, a3, .LBB160_1
12434; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12435; RV64I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12436; RV64I-NEXT:    mv a2, s1
12437; RV64I-NEXT:    j .LBB160_1
12438; RV64I-NEXT:  .LBB160_4: # %atomicrmw.end
12439; RV64I-NEXT:    mv a0, a3
12440; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12441; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12442; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12443; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12444; RV64I-NEXT:    addi sp, sp, 48
12445; RV64I-NEXT:    ret
12446;
12447; RV64IA-LABEL: atomicrmw_umin_i32_monotonic:
12448; RV64IA:       # %bb.0:
12449; RV64IA-NEXT:    amominu.w a0, a1, (a0)
12450; RV64IA-NEXT:    ret
12451  %1 = atomicrmw umin i32* %a, i32 %b monotonic
12452  ret i32 %1
12453}
12454
12455define i32 @atomicrmw_umin_i32_acquire(i32 *%a, i32 %b) nounwind {
12456; RV32I-LABEL: atomicrmw_umin_i32_acquire:
12457; RV32I:       # %bb.0:
12458; RV32I-NEXT:    addi sp, sp, -16
12459; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12460; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12461; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12462; RV32I-NEXT:    mv s0, a0
12463; RV32I-NEXT:    lw a3, 0(a0)
12464; RV32I-NEXT:    mv s1, a1
12465; RV32I-NEXT:    j .LBB161_2
12466; RV32I-NEXT:  .LBB161_1: # %atomicrmw.start
12467; RV32I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12468; RV32I-NEXT:    sw a3, 0(sp)
12469; RV32I-NEXT:    mv a1, sp
12470; RV32I-NEXT:    li a3, 2
12471; RV32I-NEXT:    li a4, 2
12472; RV32I-NEXT:    mv a0, s0
12473; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12474; RV32I-NEXT:    lw a3, 0(sp)
12475; RV32I-NEXT:    bnez a0, .LBB161_4
12476; RV32I-NEXT:  .LBB161_2: # %atomicrmw.start
12477; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12478; RV32I-NEXT:    mv a2, a3
12479; RV32I-NEXT:    bgeu s1, a3, .LBB161_1
12480; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12481; RV32I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12482; RV32I-NEXT:    mv a2, s1
12483; RV32I-NEXT:    j .LBB161_1
12484; RV32I-NEXT:  .LBB161_4: # %atomicrmw.end
12485; RV32I-NEXT:    mv a0, a3
12486; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12487; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12488; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12489; RV32I-NEXT:    addi sp, sp, 16
12490; RV32I-NEXT:    ret
12491;
12492; RV32IA-LABEL: atomicrmw_umin_i32_acquire:
12493; RV32IA:       # %bb.0:
12494; RV32IA-NEXT:    amominu.w.aq a0, a1, (a0)
12495; RV32IA-NEXT:    ret
12496;
12497; RV64I-LABEL: atomicrmw_umin_i32_acquire:
12498; RV64I:       # %bb.0:
12499; RV64I-NEXT:    addi sp, sp, -48
12500; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12501; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12502; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12503; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12504; RV64I-NEXT:    mv s0, a0
12505; RV64I-NEXT:    lw a3, 0(a0)
12506; RV64I-NEXT:    mv s1, a1
12507; RV64I-NEXT:    sext.w s2, a1
12508; RV64I-NEXT:    j .LBB161_2
12509; RV64I-NEXT:  .LBB161_1: # %atomicrmw.start
12510; RV64I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12511; RV64I-NEXT:    sw a3, 12(sp)
12512; RV64I-NEXT:    addi a1, sp, 12
12513; RV64I-NEXT:    li a3, 2
12514; RV64I-NEXT:    li a4, 2
12515; RV64I-NEXT:    mv a0, s0
12516; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12517; RV64I-NEXT:    lw a3, 12(sp)
12518; RV64I-NEXT:    bnez a0, .LBB161_4
12519; RV64I-NEXT:  .LBB161_2: # %atomicrmw.start
12520; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12521; RV64I-NEXT:    mv a2, a3
12522; RV64I-NEXT:    bgeu s2, a3, .LBB161_1
12523; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12524; RV64I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12525; RV64I-NEXT:    mv a2, s1
12526; RV64I-NEXT:    j .LBB161_1
12527; RV64I-NEXT:  .LBB161_4: # %atomicrmw.end
12528; RV64I-NEXT:    mv a0, a3
12529; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12530; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12531; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12532; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12533; RV64I-NEXT:    addi sp, sp, 48
12534; RV64I-NEXT:    ret
12535;
12536; RV64IA-LABEL: atomicrmw_umin_i32_acquire:
12537; RV64IA:       # %bb.0:
12538; RV64IA-NEXT:    amominu.w.aq a0, a1, (a0)
12539; RV64IA-NEXT:    ret
12540  %1 = atomicrmw umin i32* %a, i32 %b acquire
12541  ret i32 %1
12542}
12543
12544define i32 @atomicrmw_umin_i32_release(i32 *%a, i32 %b) nounwind {
12545; RV32I-LABEL: atomicrmw_umin_i32_release:
12546; RV32I:       # %bb.0:
12547; RV32I-NEXT:    addi sp, sp, -16
12548; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12549; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12550; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12551; RV32I-NEXT:    mv s0, a0
12552; RV32I-NEXT:    lw a3, 0(a0)
12553; RV32I-NEXT:    mv s1, a1
12554; RV32I-NEXT:    j .LBB162_2
12555; RV32I-NEXT:  .LBB162_1: # %atomicrmw.start
12556; RV32I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12557; RV32I-NEXT:    sw a3, 0(sp)
12558; RV32I-NEXT:    mv a1, sp
12559; RV32I-NEXT:    li a3, 3
12560; RV32I-NEXT:    mv a0, s0
12561; RV32I-NEXT:    li a4, 0
12562; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12563; RV32I-NEXT:    lw a3, 0(sp)
12564; RV32I-NEXT:    bnez a0, .LBB162_4
12565; RV32I-NEXT:  .LBB162_2: # %atomicrmw.start
12566; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12567; RV32I-NEXT:    mv a2, a3
12568; RV32I-NEXT:    bgeu s1, a3, .LBB162_1
12569; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12570; RV32I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12571; RV32I-NEXT:    mv a2, s1
12572; RV32I-NEXT:    j .LBB162_1
12573; RV32I-NEXT:  .LBB162_4: # %atomicrmw.end
12574; RV32I-NEXT:    mv a0, a3
12575; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12576; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12577; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12578; RV32I-NEXT:    addi sp, sp, 16
12579; RV32I-NEXT:    ret
12580;
12581; RV32IA-LABEL: atomicrmw_umin_i32_release:
12582; RV32IA:       # %bb.0:
12583; RV32IA-NEXT:    amominu.w.rl a0, a1, (a0)
12584; RV32IA-NEXT:    ret
12585;
12586; RV64I-LABEL: atomicrmw_umin_i32_release:
12587; RV64I:       # %bb.0:
12588; RV64I-NEXT:    addi sp, sp, -48
12589; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12590; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12591; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12592; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12593; RV64I-NEXT:    mv s0, a0
12594; RV64I-NEXT:    lw a3, 0(a0)
12595; RV64I-NEXT:    mv s1, a1
12596; RV64I-NEXT:    sext.w s2, a1
12597; RV64I-NEXT:    j .LBB162_2
12598; RV64I-NEXT:  .LBB162_1: # %atomicrmw.start
12599; RV64I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12600; RV64I-NEXT:    sw a3, 12(sp)
12601; RV64I-NEXT:    addi a1, sp, 12
12602; RV64I-NEXT:    li a3, 3
12603; RV64I-NEXT:    mv a0, s0
12604; RV64I-NEXT:    li a4, 0
12605; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12606; RV64I-NEXT:    lw a3, 12(sp)
12607; RV64I-NEXT:    bnez a0, .LBB162_4
12608; RV64I-NEXT:  .LBB162_2: # %atomicrmw.start
12609; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12610; RV64I-NEXT:    mv a2, a3
12611; RV64I-NEXT:    bgeu s2, a3, .LBB162_1
12612; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12613; RV64I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12614; RV64I-NEXT:    mv a2, s1
12615; RV64I-NEXT:    j .LBB162_1
12616; RV64I-NEXT:  .LBB162_4: # %atomicrmw.end
12617; RV64I-NEXT:    mv a0, a3
12618; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12619; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12620; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12621; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12622; RV64I-NEXT:    addi sp, sp, 48
12623; RV64I-NEXT:    ret
12624;
12625; RV64IA-LABEL: atomicrmw_umin_i32_release:
12626; RV64IA:       # %bb.0:
12627; RV64IA-NEXT:    amominu.w.rl a0, a1, (a0)
12628; RV64IA-NEXT:    ret
12629  %1 = atomicrmw umin i32* %a, i32 %b release
12630  ret i32 %1
12631}
12632
12633define i32 @atomicrmw_umin_i32_acq_rel(i32 *%a, i32 %b) nounwind {
12634; RV32I-LABEL: atomicrmw_umin_i32_acq_rel:
12635; RV32I:       # %bb.0:
12636; RV32I-NEXT:    addi sp, sp, -16
12637; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12638; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12639; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12640; RV32I-NEXT:    mv s0, a0
12641; RV32I-NEXT:    lw a3, 0(a0)
12642; RV32I-NEXT:    mv s1, a1
12643; RV32I-NEXT:    j .LBB163_2
12644; RV32I-NEXT:  .LBB163_1: # %atomicrmw.start
12645; RV32I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12646; RV32I-NEXT:    sw a3, 0(sp)
12647; RV32I-NEXT:    mv a1, sp
12648; RV32I-NEXT:    li a3, 4
12649; RV32I-NEXT:    li a4, 2
12650; RV32I-NEXT:    mv a0, s0
12651; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12652; RV32I-NEXT:    lw a3, 0(sp)
12653; RV32I-NEXT:    bnez a0, .LBB163_4
12654; RV32I-NEXT:  .LBB163_2: # %atomicrmw.start
12655; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12656; RV32I-NEXT:    mv a2, a3
12657; RV32I-NEXT:    bgeu s1, a3, .LBB163_1
12658; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12659; RV32I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12660; RV32I-NEXT:    mv a2, s1
12661; RV32I-NEXT:    j .LBB163_1
12662; RV32I-NEXT:  .LBB163_4: # %atomicrmw.end
12663; RV32I-NEXT:    mv a0, a3
12664; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12665; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12666; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12667; RV32I-NEXT:    addi sp, sp, 16
12668; RV32I-NEXT:    ret
12669;
12670; RV32IA-LABEL: atomicrmw_umin_i32_acq_rel:
12671; RV32IA:       # %bb.0:
12672; RV32IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12673; RV32IA-NEXT:    ret
12674;
12675; RV64I-LABEL: atomicrmw_umin_i32_acq_rel:
12676; RV64I:       # %bb.0:
12677; RV64I-NEXT:    addi sp, sp, -48
12678; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12679; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12680; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12681; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12682; RV64I-NEXT:    mv s0, a0
12683; RV64I-NEXT:    lw a3, 0(a0)
12684; RV64I-NEXT:    mv s1, a1
12685; RV64I-NEXT:    sext.w s2, a1
12686; RV64I-NEXT:    j .LBB163_2
12687; RV64I-NEXT:  .LBB163_1: # %atomicrmw.start
12688; RV64I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12689; RV64I-NEXT:    sw a3, 12(sp)
12690; RV64I-NEXT:    addi a1, sp, 12
12691; RV64I-NEXT:    li a3, 4
12692; RV64I-NEXT:    li a4, 2
12693; RV64I-NEXT:    mv a0, s0
12694; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12695; RV64I-NEXT:    lw a3, 12(sp)
12696; RV64I-NEXT:    bnez a0, .LBB163_4
12697; RV64I-NEXT:  .LBB163_2: # %atomicrmw.start
12698; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12699; RV64I-NEXT:    mv a2, a3
12700; RV64I-NEXT:    bgeu s2, a3, .LBB163_1
12701; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12702; RV64I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12703; RV64I-NEXT:    mv a2, s1
12704; RV64I-NEXT:    j .LBB163_1
12705; RV64I-NEXT:  .LBB163_4: # %atomicrmw.end
12706; RV64I-NEXT:    mv a0, a3
12707; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12708; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12709; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12710; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12711; RV64I-NEXT:    addi sp, sp, 48
12712; RV64I-NEXT:    ret
12713;
12714; RV64IA-LABEL: atomicrmw_umin_i32_acq_rel:
12715; RV64IA:       # %bb.0:
12716; RV64IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12717; RV64IA-NEXT:    ret
12718  %1 = atomicrmw umin i32* %a, i32 %b acq_rel
12719  ret i32 %1
12720}
12721
12722define i32 @atomicrmw_umin_i32_seq_cst(i32 *%a, i32 %b) nounwind {
12723; RV32I-LABEL: atomicrmw_umin_i32_seq_cst:
12724; RV32I:       # %bb.0:
12725; RV32I-NEXT:    addi sp, sp, -16
12726; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12727; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12728; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12729; RV32I-NEXT:    mv s0, a0
12730; RV32I-NEXT:    lw a3, 0(a0)
12731; RV32I-NEXT:    mv s1, a1
12732; RV32I-NEXT:    j .LBB164_2
12733; RV32I-NEXT:  .LBB164_1: # %atomicrmw.start
12734; RV32I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12735; RV32I-NEXT:    sw a3, 0(sp)
12736; RV32I-NEXT:    mv a1, sp
12737; RV32I-NEXT:    li a3, 5
12738; RV32I-NEXT:    li a4, 5
12739; RV32I-NEXT:    mv a0, s0
12740; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12741; RV32I-NEXT:    lw a3, 0(sp)
12742; RV32I-NEXT:    bnez a0, .LBB164_4
12743; RV32I-NEXT:  .LBB164_2: # %atomicrmw.start
12744; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12745; RV32I-NEXT:    mv a2, a3
12746; RV32I-NEXT:    bgeu s1, a3, .LBB164_1
12747; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12748; RV32I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12749; RV32I-NEXT:    mv a2, s1
12750; RV32I-NEXT:    j .LBB164_1
12751; RV32I-NEXT:  .LBB164_4: # %atomicrmw.end
12752; RV32I-NEXT:    mv a0, a3
12753; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12754; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12755; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12756; RV32I-NEXT:    addi sp, sp, 16
12757; RV32I-NEXT:    ret
12758;
12759; RV32IA-LABEL: atomicrmw_umin_i32_seq_cst:
12760; RV32IA:       # %bb.0:
12761; RV32IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12762; RV32IA-NEXT:    ret
12763;
12764; RV64I-LABEL: atomicrmw_umin_i32_seq_cst:
12765; RV64I:       # %bb.0:
12766; RV64I-NEXT:    addi sp, sp, -48
12767; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12768; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12769; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12770; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12771; RV64I-NEXT:    mv s0, a0
12772; RV64I-NEXT:    lw a3, 0(a0)
12773; RV64I-NEXT:    mv s1, a1
12774; RV64I-NEXT:    sext.w s2, a1
12775; RV64I-NEXT:    j .LBB164_2
12776; RV64I-NEXT:  .LBB164_1: # %atomicrmw.start
12777; RV64I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12778; RV64I-NEXT:    sw a3, 12(sp)
12779; RV64I-NEXT:    addi a1, sp, 12
12780; RV64I-NEXT:    li a3, 5
12781; RV64I-NEXT:    li a4, 5
12782; RV64I-NEXT:    mv a0, s0
12783; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12784; RV64I-NEXT:    lw a3, 12(sp)
12785; RV64I-NEXT:    bnez a0, .LBB164_4
12786; RV64I-NEXT:  .LBB164_2: # %atomicrmw.start
12787; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12788; RV64I-NEXT:    mv a2, a3
12789; RV64I-NEXT:    bgeu s2, a3, .LBB164_1
12790; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12791; RV64I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12792; RV64I-NEXT:    mv a2, s1
12793; RV64I-NEXT:    j .LBB164_1
12794; RV64I-NEXT:  .LBB164_4: # %atomicrmw.end
12795; RV64I-NEXT:    mv a0, a3
12796; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12797; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12798; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12799; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12800; RV64I-NEXT:    addi sp, sp, 48
12801; RV64I-NEXT:    ret
12802;
12803; RV64IA-LABEL: atomicrmw_umin_i32_seq_cst:
12804; RV64IA:       # %bb.0:
12805; RV64IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12806; RV64IA-NEXT:    ret
12807  %1 = atomicrmw umin i32* %a, i32 %b seq_cst
12808  ret i32 %1
12809}
12810
12811define i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) nounwind {
12812; RV32I-LABEL: atomicrmw_xchg_i64_monotonic:
12813; RV32I:       # %bb.0:
12814; RV32I-NEXT:    addi sp, sp, -16
12815; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12816; RV32I-NEXT:    li a3, 0
12817; RV32I-NEXT:    call __atomic_exchange_8@plt
12818; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12819; RV32I-NEXT:    addi sp, sp, 16
12820; RV32I-NEXT:    ret
12821;
12822; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic:
12823; RV32IA:       # %bb.0:
12824; RV32IA-NEXT:    addi sp, sp, -16
12825; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12826; RV32IA-NEXT:    li a3, 0
12827; RV32IA-NEXT:    call __atomic_exchange_8@plt
12828; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12829; RV32IA-NEXT:    addi sp, sp, 16
12830; RV32IA-NEXT:    ret
12831;
12832; RV64I-LABEL: atomicrmw_xchg_i64_monotonic:
12833; RV64I:       # %bb.0:
12834; RV64I-NEXT:    addi sp, sp, -16
12835; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12836; RV64I-NEXT:    li a2, 0
12837; RV64I-NEXT:    call __atomic_exchange_8@plt
12838; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12839; RV64I-NEXT:    addi sp, sp, 16
12840; RV64I-NEXT:    ret
12841;
12842; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic:
12843; RV64IA:       # %bb.0:
12844; RV64IA-NEXT:    amoswap.d a0, a1, (a0)
12845; RV64IA-NEXT:    ret
12846  %1 = atomicrmw xchg i64* %a, i64 %b monotonic
12847  ret i64 %1
12848}
12849
12850define i64 @atomicrmw_xchg_i64_acquire(i64* %a, i64 %b) nounwind {
12851; RV32I-LABEL: atomicrmw_xchg_i64_acquire:
12852; RV32I:       # %bb.0:
12853; RV32I-NEXT:    addi sp, sp, -16
12854; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12855; RV32I-NEXT:    li a3, 2
12856; RV32I-NEXT:    call __atomic_exchange_8@plt
12857; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12858; RV32I-NEXT:    addi sp, sp, 16
12859; RV32I-NEXT:    ret
12860;
12861; RV32IA-LABEL: atomicrmw_xchg_i64_acquire:
12862; RV32IA:       # %bb.0:
12863; RV32IA-NEXT:    addi sp, sp, -16
12864; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12865; RV32IA-NEXT:    li a3, 2
12866; RV32IA-NEXT:    call __atomic_exchange_8@plt
12867; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12868; RV32IA-NEXT:    addi sp, sp, 16
12869; RV32IA-NEXT:    ret
12870;
12871; RV64I-LABEL: atomicrmw_xchg_i64_acquire:
12872; RV64I:       # %bb.0:
12873; RV64I-NEXT:    addi sp, sp, -16
12874; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12875; RV64I-NEXT:    li a2, 2
12876; RV64I-NEXT:    call __atomic_exchange_8@plt
12877; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12878; RV64I-NEXT:    addi sp, sp, 16
12879; RV64I-NEXT:    ret
12880;
12881; RV64IA-LABEL: atomicrmw_xchg_i64_acquire:
12882; RV64IA:       # %bb.0:
12883; RV64IA-NEXT:    amoswap.d.aq a0, a1, (a0)
12884; RV64IA-NEXT:    ret
12885  %1 = atomicrmw xchg i64* %a, i64 %b acquire
12886  ret i64 %1
12887}
12888
12889define i64 @atomicrmw_xchg_i64_release(i64* %a, i64 %b) nounwind {
12890; RV32I-LABEL: atomicrmw_xchg_i64_release:
12891; RV32I:       # %bb.0:
12892; RV32I-NEXT:    addi sp, sp, -16
12893; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12894; RV32I-NEXT:    li a3, 3
12895; RV32I-NEXT:    call __atomic_exchange_8@plt
12896; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12897; RV32I-NEXT:    addi sp, sp, 16
12898; RV32I-NEXT:    ret
12899;
12900; RV32IA-LABEL: atomicrmw_xchg_i64_release:
12901; RV32IA:       # %bb.0:
12902; RV32IA-NEXT:    addi sp, sp, -16
12903; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12904; RV32IA-NEXT:    li a3, 3
12905; RV32IA-NEXT:    call __atomic_exchange_8@plt
12906; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12907; RV32IA-NEXT:    addi sp, sp, 16
12908; RV32IA-NEXT:    ret
12909;
12910; RV64I-LABEL: atomicrmw_xchg_i64_release:
12911; RV64I:       # %bb.0:
12912; RV64I-NEXT:    addi sp, sp, -16
12913; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12914; RV64I-NEXT:    li a2, 3
12915; RV64I-NEXT:    call __atomic_exchange_8@plt
12916; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12917; RV64I-NEXT:    addi sp, sp, 16
12918; RV64I-NEXT:    ret
12919;
12920; RV64IA-LABEL: atomicrmw_xchg_i64_release:
12921; RV64IA:       # %bb.0:
12922; RV64IA-NEXT:    amoswap.d.rl a0, a1, (a0)
12923; RV64IA-NEXT:    ret
12924  %1 = atomicrmw xchg i64* %a, i64 %b release
12925  ret i64 %1
12926}
12927
12928define i64 @atomicrmw_xchg_i64_acq_rel(i64* %a, i64 %b) nounwind {
12929; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel:
12930; RV32I:       # %bb.0:
12931; RV32I-NEXT:    addi sp, sp, -16
12932; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12933; RV32I-NEXT:    li a3, 4
12934; RV32I-NEXT:    call __atomic_exchange_8@plt
12935; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12936; RV32I-NEXT:    addi sp, sp, 16
12937; RV32I-NEXT:    ret
12938;
12939; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel:
12940; RV32IA:       # %bb.0:
12941; RV32IA-NEXT:    addi sp, sp, -16
12942; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12943; RV32IA-NEXT:    li a3, 4
12944; RV32IA-NEXT:    call __atomic_exchange_8@plt
12945; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12946; RV32IA-NEXT:    addi sp, sp, 16
12947; RV32IA-NEXT:    ret
12948;
12949; RV64I-LABEL: atomicrmw_xchg_i64_acq_rel:
12950; RV64I:       # %bb.0:
12951; RV64I-NEXT:    addi sp, sp, -16
12952; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12953; RV64I-NEXT:    li a2, 4
12954; RV64I-NEXT:    call __atomic_exchange_8@plt
12955; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12956; RV64I-NEXT:    addi sp, sp, 16
12957; RV64I-NEXT:    ret
12958;
12959; RV64IA-LABEL: atomicrmw_xchg_i64_acq_rel:
12960; RV64IA:       # %bb.0:
12961; RV64IA-NEXT:    amoswap.d.aqrl a0, a1, (a0)
12962; RV64IA-NEXT:    ret
12963  %1 = atomicrmw xchg i64* %a, i64 %b acq_rel
12964  ret i64 %1
12965}
12966
12967define i64 @atomicrmw_xchg_i64_seq_cst(i64* %a, i64 %b) nounwind {
12968; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst:
12969; RV32I:       # %bb.0:
12970; RV32I-NEXT:    addi sp, sp, -16
12971; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12972; RV32I-NEXT:    li a3, 5
12973; RV32I-NEXT:    call __atomic_exchange_8@plt
12974; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12975; RV32I-NEXT:    addi sp, sp, 16
12976; RV32I-NEXT:    ret
12977;
12978; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst:
12979; RV32IA:       # %bb.0:
12980; RV32IA-NEXT:    addi sp, sp, -16
12981; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12982; RV32IA-NEXT:    li a3, 5
12983; RV32IA-NEXT:    call __atomic_exchange_8@plt
12984; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12985; RV32IA-NEXT:    addi sp, sp, 16
12986; RV32IA-NEXT:    ret
12987;
12988; RV64I-LABEL: atomicrmw_xchg_i64_seq_cst:
12989; RV64I:       # %bb.0:
12990; RV64I-NEXT:    addi sp, sp, -16
12991; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12992; RV64I-NEXT:    li a2, 5
12993; RV64I-NEXT:    call __atomic_exchange_8@plt
12994; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12995; RV64I-NEXT:    addi sp, sp, 16
12996; RV64I-NEXT:    ret
12997;
12998; RV64IA-LABEL: atomicrmw_xchg_i64_seq_cst:
12999; RV64IA:       # %bb.0:
13000; RV64IA-NEXT:    amoswap.d.aqrl a0, a1, (a0)
13001; RV64IA-NEXT:    ret
13002  %1 = atomicrmw xchg i64* %a, i64 %b seq_cst
13003  ret i64 %1
13004}
13005
13006define i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind {
13007; RV32I-LABEL: atomicrmw_add_i64_monotonic:
13008; RV32I:       # %bb.0:
13009; RV32I-NEXT:    addi sp, sp, -16
13010; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13011; RV32I-NEXT:    li a3, 0
13012; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13013; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13014; RV32I-NEXT:    addi sp, sp, 16
13015; RV32I-NEXT:    ret
13016;
13017; RV32IA-LABEL: atomicrmw_add_i64_monotonic:
13018; RV32IA:       # %bb.0:
13019; RV32IA-NEXT:    addi sp, sp, -16
13020; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13021; RV32IA-NEXT:    li a3, 0
13022; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13023; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13024; RV32IA-NEXT:    addi sp, sp, 16
13025; RV32IA-NEXT:    ret
13026;
13027; RV64I-LABEL: atomicrmw_add_i64_monotonic:
13028; RV64I:       # %bb.0:
13029; RV64I-NEXT:    addi sp, sp, -16
13030; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13031; RV64I-NEXT:    li a2, 0
13032; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13033; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13034; RV64I-NEXT:    addi sp, sp, 16
13035; RV64I-NEXT:    ret
13036;
13037; RV64IA-LABEL: atomicrmw_add_i64_monotonic:
13038; RV64IA:       # %bb.0:
13039; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
13040; RV64IA-NEXT:    ret
13041  %1 = atomicrmw add i64* %a, i64 %b monotonic
13042  ret i64 %1
13043}
13044
13045define i64 @atomicrmw_add_i64_acquire(i64 *%a, i64 %b) nounwind {
13046; RV32I-LABEL: atomicrmw_add_i64_acquire:
13047; RV32I:       # %bb.0:
13048; RV32I-NEXT:    addi sp, sp, -16
13049; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13050; RV32I-NEXT:    li a3, 2
13051; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13052; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13053; RV32I-NEXT:    addi sp, sp, 16
13054; RV32I-NEXT:    ret
13055;
13056; RV32IA-LABEL: atomicrmw_add_i64_acquire:
13057; RV32IA:       # %bb.0:
13058; RV32IA-NEXT:    addi sp, sp, -16
13059; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13060; RV32IA-NEXT:    li a3, 2
13061; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13062; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13063; RV32IA-NEXT:    addi sp, sp, 16
13064; RV32IA-NEXT:    ret
13065;
13066; RV64I-LABEL: atomicrmw_add_i64_acquire:
13067; RV64I:       # %bb.0:
13068; RV64I-NEXT:    addi sp, sp, -16
13069; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13070; RV64I-NEXT:    li a2, 2
13071; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13072; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13073; RV64I-NEXT:    addi sp, sp, 16
13074; RV64I-NEXT:    ret
13075;
13076; RV64IA-LABEL: atomicrmw_add_i64_acquire:
13077; RV64IA:       # %bb.0:
13078; RV64IA-NEXT:    amoadd.d.aq a0, a1, (a0)
13079; RV64IA-NEXT:    ret
13080  %1 = atomicrmw add i64* %a, i64 %b acquire
13081  ret i64 %1
13082}
13083
13084define i64 @atomicrmw_add_i64_release(i64 *%a, i64 %b) nounwind {
13085; RV32I-LABEL: atomicrmw_add_i64_release:
13086; RV32I:       # %bb.0:
13087; RV32I-NEXT:    addi sp, sp, -16
13088; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13089; RV32I-NEXT:    li a3, 3
13090; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13091; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13092; RV32I-NEXT:    addi sp, sp, 16
13093; RV32I-NEXT:    ret
13094;
13095; RV32IA-LABEL: atomicrmw_add_i64_release:
13096; RV32IA:       # %bb.0:
13097; RV32IA-NEXT:    addi sp, sp, -16
13098; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13099; RV32IA-NEXT:    li a3, 3
13100; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13101; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13102; RV32IA-NEXT:    addi sp, sp, 16
13103; RV32IA-NEXT:    ret
13104;
13105; RV64I-LABEL: atomicrmw_add_i64_release:
13106; RV64I:       # %bb.0:
13107; RV64I-NEXT:    addi sp, sp, -16
13108; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13109; RV64I-NEXT:    li a2, 3
13110; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13111; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13112; RV64I-NEXT:    addi sp, sp, 16
13113; RV64I-NEXT:    ret
13114;
13115; RV64IA-LABEL: atomicrmw_add_i64_release:
13116; RV64IA:       # %bb.0:
13117; RV64IA-NEXT:    amoadd.d.rl a0, a1, (a0)
13118; RV64IA-NEXT:    ret
13119  %1 = atomicrmw add i64* %a, i64 %b release
13120  ret i64 %1
13121}
13122
13123define i64 @atomicrmw_add_i64_acq_rel(i64 *%a, i64 %b) nounwind {
13124; RV32I-LABEL: atomicrmw_add_i64_acq_rel:
13125; RV32I:       # %bb.0:
13126; RV32I-NEXT:    addi sp, sp, -16
13127; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13128; RV32I-NEXT:    li a3, 4
13129; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13130; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13131; RV32I-NEXT:    addi sp, sp, 16
13132; RV32I-NEXT:    ret
13133;
13134; RV32IA-LABEL: atomicrmw_add_i64_acq_rel:
13135; RV32IA:       # %bb.0:
13136; RV32IA-NEXT:    addi sp, sp, -16
13137; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13138; RV32IA-NEXT:    li a3, 4
13139; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13140; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13141; RV32IA-NEXT:    addi sp, sp, 16
13142; RV32IA-NEXT:    ret
13143;
13144; RV64I-LABEL: atomicrmw_add_i64_acq_rel:
13145; RV64I:       # %bb.0:
13146; RV64I-NEXT:    addi sp, sp, -16
13147; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13148; RV64I-NEXT:    li a2, 4
13149; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13150; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13151; RV64I-NEXT:    addi sp, sp, 16
13152; RV64I-NEXT:    ret
13153;
13154; RV64IA-LABEL: atomicrmw_add_i64_acq_rel:
13155; RV64IA:       # %bb.0:
13156; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13157; RV64IA-NEXT:    ret
13158  %1 = atomicrmw add i64* %a, i64 %b acq_rel
13159  ret i64 %1
13160}
13161
13162define i64 @atomicrmw_add_i64_seq_cst(i64 *%a, i64 %b) nounwind {
13163; RV32I-LABEL: atomicrmw_add_i64_seq_cst:
13164; RV32I:       # %bb.0:
13165; RV32I-NEXT:    addi sp, sp, -16
13166; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13167; RV32I-NEXT:    li a3, 5
13168; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13169; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13170; RV32I-NEXT:    addi sp, sp, 16
13171; RV32I-NEXT:    ret
13172;
13173; RV32IA-LABEL: atomicrmw_add_i64_seq_cst:
13174; RV32IA:       # %bb.0:
13175; RV32IA-NEXT:    addi sp, sp, -16
13176; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13177; RV32IA-NEXT:    li a3, 5
13178; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13179; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13180; RV32IA-NEXT:    addi sp, sp, 16
13181; RV32IA-NEXT:    ret
13182;
13183; RV64I-LABEL: atomicrmw_add_i64_seq_cst:
13184; RV64I:       # %bb.0:
13185; RV64I-NEXT:    addi sp, sp, -16
13186; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13187; RV64I-NEXT:    li a2, 5
13188; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13189; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13190; RV64I-NEXT:    addi sp, sp, 16
13191; RV64I-NEXT:    ret
13192;
13193; RV64IA-LABEL: atomicrmw_add_i64_seq_cst:
13194; RV64IA:       # %bb.0:
13195; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13196; RV64IA-NEXT:    ret
13197  %1 = atomicrmw add i64* %a, i64 %b seq_cst
13198  ret i64 %1
13199}
13200
13201define i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) nounwind {
13202; RV32I-LABEL: atomicrmw_sub_i64_monotonic:
13203; RV32I:       # %bb.0:
13204; RV32I-NEXT:    addi sp, sp, -16
13205; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13206; RV32I-NEXT:    li a3, 0
13207; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13208; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13209; RV32I-NEXT:    addi sp, sp, 16
13210; RV32I-NEXT:    ret
13211;
13212; RV32IA-LABEL: atomicrmw_sub_i64_monotonic:
13213; RV32IA:       # %bb.0:
13214; RV32IA-NEXT:    addi sp, sp, -16
13215; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13216; RV32IA-NEXT:    li a3, 0
13217; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13218; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13219; RV32IA-NEXT:    addi sp, sp, 16
13220; RV32IA-NEXT:    ret
13221;
13222; RV64I-LABEL: atomicrmw_sub_i64_monotonic:
13223; RV64I:       # %bb.0:
13224; RV64I-NEXT:    addi sp, sp, -16
13225; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13226; RV64I-NEXT:    li a2, 0
13227; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13228; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13229; RV64I-NEXT:    addi sp, sp, 16
13230; RV64I-NEXT:    ret
13231;
13232; RV64IA-LABEL: atomicrmw_sub_i64_monotonic:
13233; RV64IA:       # %bb.0:
13234; RV64IA-NEXT:    neg a1, a1
13235; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
13236; RV64IA-NEXT:    ret
13237  %1 = atomicrmw sub i64* %a, i64 %b monotonic
13238  ret i64 %1
13239}
13240
13241define i64 @atomicrmw_sub_i64_acquire(i64* %a, i64 %b) nounwind {
13242; RV32I-LABEL: atomicrmw_sub_i64_acquire:
13243; RV32I:       # %bb.0:
13244; RV32I-NEXT:    addi sp, sp, -16
13245; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13246; RV32I-NEXT:    li a3, 2
13247; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13248; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13249; RV32I-NEXT:    addi sp, sp, 16
13250; RV32I-NEXT:    ret
13251;
13252; RV32IA-LABEL: atomicrmw_sub_i64_acquire:
13253; RV32IA:       # %bb.0:
13254; RV32IA-NEXT:    addi sp, sp, -16
13255; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13256; RV32IA-NEXT:    li a3, 2
13257; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13258; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13259; RV32IA-NEXT:    addi sp, sp, 16
13260; RV32IA-NEXT:    ret
13261;
13262; RV64I-LABEL: atomicrmw_sub_i64_acquire:
13263; RV64I:       # %bb.0:
13264; RV64I-NEXT:    addi sp, sp, -16
13265; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13266; RV64I-NEXT:    li a2, 2
13267; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13268; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13269; RV64I-NEXT:    addi sp, sp, 16
13270; RV64I-NEXT:    ret
13271;
13272; RV64IA-LABEL: atomicrmw_sub_i64_acquire:
13273; RV64IA:       # %bb.0:
13274; RV64IA-NEXT:    neg a1, a1
13275; RV64IA-NEXT:    amoadd.d.aq a0, a1, (a0)
13276; RV64IA-NEXT:    ret
13277  %1 = atomicrmw sub i64* %a, i64 %b acquire
13278  ret i64 %1
13279}
13280
13281define i64 @atomicrmw_sub_i64_release(i64* %a, i64 %b) nounwind {
13282; RV32I-LABEL: atomicrmw_sub_i64_release:
13283; RV32I:       # %bb.0:
13284; RV32I-NEXT:    addi sp, sp, -16
13285; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13286; RV32I-NEXT:    li a3, 3
13287; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13288; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13289; RV32I-NEXT:    addi sp, sp, 16
13290; RV32I-NEXT:    ret
13291;
13292; RV32IA-LABEL: atomicrmw_sub_i64_release:
13293; RV32IA:       # %bb.0:
13294; RV32IA-NEXT:    addi sp, sp, -16
13295; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13296; RV32IA-NEXT:    li a3, 3
13297; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13298; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13299; RV32IA-NEXT:    addi sp, sp, 16
13300; RV32IA-NEXT:    ret
13301;
13302; RV64I-LABEL: atomicrmw_sub_i64_release:
13303; RV64I:       # %bb.0:
13304; RV64I-NEXT:    addi sp, sp, -16
13305; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13306; RV64I-NEXT:    li a2, 3
13307; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13308; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13309; RV64I-NEXT:    addi sp, sp, 16
13310; RV64I-NEXT:    ret
13311;
13312; RV64IA-LABEL: atomicrmw_sub_i64_release:
13313; RV64IA:       # %bb.0:
13314; RV64IA-NEXT:    neg a1, a1
13315; RV64IA-NEXT:    amoadd.d.rl a0, a1, (a0)
13316; RV64IA-NEXT:    ret
13317  %1 = atomicrmw sub i64* %a, i64 %b release
13318  ret i64 %1
13319}
13320
13321define i64 @atomicrmw_sub_i64_acq_rel(i64* %a, i64 %b) nounwind {
13322; RV32I-LABEL: atomicrmw_sub_i64_acq_rel:
13323; RV32I:       # %bb.0:
13324; RV32I-NEXT:    addi sp, sp, -16
13325; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13326; RV32I-NEXT:    li a3, 4
13327; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13328; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13329; RV32I-NEXT:    addi sp, sp, 16
13330; RV32I-NEXT:    ret
13331;
13332; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel:
13333; RV32IA:       # %bb.0:
13334; RV32IA-NEXT:    addi sp, sp, -16
13335; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13336; RV32IA-NEXT:    li a3, 4
13337; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13338; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13339; RV32IA-NEXT:    addi sp, sp, 16
13340; RV32IA-NEXT:    ret
13341;
13342; RV64I-LABEL: atomicrmw_sub_i64_acq_rel:
13343; RV64I:       # %bb.0:
13344; RV64I-NEXT:    addi sp, sp, -16
13345; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13346; RV64I-NEXT:    li a2, 4
13347; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13348; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13349; RV64I-NEXT:    addi sp, sp, 16
13350; RV64I-NEXT:    ret
13351;
13352; RV64IA-LABEL: atomicrmw_sub_i64_acq_rel:
13353; RV64IA:       # %bb.0:
13354; RV64IA-NEXT:    neg a1, a1
13355; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13356; RV64IA-NEXT:    ret
13357  %1 = atomicrmw sub i64* %a, i64 %b acq_rel
13358  ret i64 %1
13359}
13360
13361define i64 @atomicrmw_sub_i64_seq_cst(i64* %a, i64 %b) nounwind {
13362; RV32I-LABEL: atomicrmw_sub_i64_seq_cst:
13363; RV32I:       # %bb.0:
13364; RV32I-NEXT:    addi sp, sp, -16
13365; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13366; RV32I-NEXT:    li a3, 5
13367; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13368; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13369; RV32I-NEXT:    addi sp, sp, 16
13370; RV32I-NEXT:    ret
13371;
13372; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst:
13373; RV32IA:       # %bb.0:
13374; RV32IA-NEXT:    addi sp, sp, -16
13375; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13376; RV32IA-NEXT:    li a3, 5
13377; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13378; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13379; RV32IA-NEXT:    addi sp, sp, 16
13380; RV32IA-NEXT:    ret
13381;
13382; RV64I-LABEL: atomicrmw_sub_i64_seq_cst:
13383; RV64I:       # %bb.0:
13384; RV64I-NEXT:    addi sp, sp, -16
13385; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13386; RV64I-NEXT:    li a2, 5
13387; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13388; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13389; RV64I-NEXT:    addi sp, sp, 16
13390; RV64I-NEXT:    ret
13391;
13392; RV64IA-LABEL: atomicrmw_sub_i64_seq_cst:
13393; RV64IA:       # %bb.0:
13394; RV64IA-NEXT:    neg a1, a1
13395; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13396; RV64IA-NEXT:    ret
13397  %1 = atomicrmw sub i64* %a, i64 %b seq_cst
13398  ret i64 %1
13399}
13400
13401define i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind {
13402; RV32I-LABEL: atomicrmw_and_i64_monotonic:
13403; RV32I:       # %bb.0:
13404; RV32I-NEXT:    addi sp, sp, -16
13405; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13406; RV32I-NEXT:    li a3, 0
13407; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13408; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13409; RV32I-NEXT:    addi sp, sp, 16
13410; RV32I-NEXT:    ret
13411;
13412; RV32IA-LABEL: atomicrmw_and_i64_monotonic:
13413; RV32IA:       # %bb.0:
13414; RV32IA-NEXT:    addi sp, sp, -16
13415; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13416; RV32IA-NEXT:    li a3, 0
13417; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13418; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13419; RV32IA-NEXT:    addi sp, sp, 16
13420; RV32IA-NEXT:    ret
13421;
13422; RV64I-LABEL: atomicrmw_and_i64_monotonic:
13423; RV64I:       # %bb.0:
13424; RV64I-NEXT:    addi sp, sp, -16
13425; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13426; RV64I-NEXT:    li a2, 0
13427; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13428; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13429; RV64I-NEXT:    addi sp, sp, 16
13430; RV64I-NEXT:    ret
13431;
13432; RV64IA-LABEL: atomicrmw_and_i64_monotonic:
13433; RV64IA:       # %bb.0:
13434; RV64IA-NEXT:    amoand.d a0, a1, (a0)
13435; RV64IA-NEXT:    ret
13436  %1 = atomicrmw and i64* %a, i64 %b monotonic
13437  ret i64 %1
13438}
13439
13440define i64 @atomicrmw_and_i64_acquire(i64 *%a, i64 %b) nounwind {
13441; RV32I-LABEL: atomicrmw_and_i64_acquire:
13442; RV32I:       # %bb.0:
13443; RV32I-NEXT:    addi sp, sp, -16
13444; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13445; RV32I-NEXT:    li a3, 2
13446; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13447; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13448; RV32I-NEXT:    addi sp, sp, 16
13449; RV32I-NEXT:    ret
13450;
13451; RV32IA-LABEL: atomicrmw_and_i64_acquire:
13452; RV32IA:       # %bb.0:
13453; RV32IA-NEXT:    addi sp, sp, -16
13454; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13455; RV32IA-NEXT:    li a3, 2
13456; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13457; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13458; RV32IA-NEXT:    addi sp, sp, 16
13459; RV32IA-NEXT:    ret
13460;
13461; RV64I-LABEL: atomicrmw_and_i64_acquire:
13462; RV64I:       # %bb.0:
13463; RV64I-NEXT:    addi sp, sp, -16
13464; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13465; RV64I-NEXT:    li a2, 2
13466; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13467; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13468; RV64I-NEXT:    addi sp, sp, 16
13469; RV64I-NEXT:    ret
13470;
13471; RV64IA-LABEL: atomicrmw_and_i64_acquire:
13472; RV64IA:       # %bb.0:
13473; RV64IA-NEXT:    amoand.d.aq a0, a1, (a0)
13474; RV64IA-NEXT:    ret
13475  %1 = atomicrmw and i64* %a, i64 %b acquire
13476  ret i64 %1
13477}
13478
13479define i64 @atomicrmw_and_i64_release(i64 *%a, i64 %b) nounwind {
13480; RV32I-LABEL: atomicrmw_and_i64_release:
13481; RV32I:       # %bb.0:
13482; RV32I-NEXT:    addi sp, sp, -16
13483; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13484; RV32I-NEXT:    li a3, 3
13485; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13486; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13487; RV32I-NEXT:    addi sp, sp, 16
13488; RV32I-NEXT:    ret
13489;
13490; RV32IA-LABEL: atomicrmw_and_i64_release:
13491; RV32IA:       # %bb.0:
13492; RV32IA-NEXT:    addi sp, sp, -16
13493; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13494; RV32IA-NEXT:    li a3, 3
13495; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13496; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13497; RV32IA-NEXT:    addi sp, sp, 16
13498; RV32IA-NEXT:    ret
13499;
13500; RV64I-LABEL: atomicrmw_and_i64_release:
13501; RV64I:       # %bb.0:
13502; RV64I-NEXT:    addi sp, sp, -16
13503; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13504; RV64I-NEXT:    li a2, 3
13505; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13506; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13507; RV64I-NEXT:    addi sp, sp, 16
13508; RV64I-NEXT:    ret
13509;
13510; RV64IA-LABEL: atomicrmw_and_i64_release:
13511; RV64IA:       # %bb.0:
13512; RV64IA-NEXT:    amoand.d.rl a0, a1, (a0)
13513; RV64IA-NEXT:    ret
13514  %1 = atomicrmw and i64* %a, i64 %b release
13515  ret i64 %1
13516}
13517
13518define i64 @atomicrmw_and_i64_acq_rel(i64 *%a, i64 %b) nounwind {
13519; RV32I-LABEL: atomicrmw_and_i64_acq_rel:
13520; RV32I:       # %bb.0:
13521; RV32I-NEXT:    addi sp, sp, -16
13522; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13523; RV32I-NEXT:    li a3, 4
13524; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13525; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13526; RV32I-NEXT:    addi sp, sp, 16
13527; RV32I-NEXT:    ret
13528;
13529; RV32IA-LABEL: atomicrmw_and_i64_acq_rel:
13530; RV32IA:       # %bb.0:
13531; RV32IA-NEXT:    addi sp, sp, -16
13532; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13533; RV32IA-NEXT:    li a3, 4
13534; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13535; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13536; RV32IA-NEXT:    addi sp, sp, 16
13537; RV32IA-NEXT:    ret
13538;
13539; RV64I-LABEL: atomicrmw_and_i64_acq_rel:
13540; RV64I:       # %bb.0:
13541; RV64I-NEXT:    addi sp, sp, -16
13542; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13543; RV64I-NEXT:    li a2, 4
13544; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13545; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13546; RV64I-NEXT:    addi sp, sp, 16
13547; RV64I-NEXT:    ret
13548;
13549; RV64IA-LABEL: atomicrmw_and_i64_acq_rel:
13550; RV64IA:       # %bb.0:
13551; RV64IA-NEXT:    amoand.d.aqrl a0, a1, (a0)
13552; RV64IA-NEXT:    ret
13553  %1 = atomicrmw and i64* %a, i64 %b acq_rel
13554  ret i64 %1
13555}
13556
13557define i64 @atomicrmw_and_i64_seq_cst(i64 *%a, i64 %b) nounwind {
13558; RV32I-LABEL: atomicrmw_and_i64_seq_cst:
13559; RV32I:       # %bb.0:
13560; RV32I-NEXT:    addi sp, sp, -16
13561; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13562; RV32I-NEXT:    li a3, 5
13563; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13564; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13565; RV32I-NEXT:    addi sp, sp, 16
13566; RV32I-NEXT:    ret
13567;
13568; RV32IA-LABEL: atomicrmw_and_i64_seq_cst:
13569; RV32IA:       # %bb.0:
13570; RV32IA-NEXT:    addi sp, sp, -16
13571; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13572; RV32IA-NEXT:    li a3, 5
13573; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13574; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13575; RV32IA-NEXT:    addi sp, sp, 16
13576; RV32IA-NEXT:    ret
13577;
13578; RV64I-LABEL: atomicrmw_and_i64_seq_cst:
13579; RV64I:       # %bb.0:
13580; RV64I-NEXT:    addi sp, sp, -16
13581; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13582; RV64I-NEXT:    li a2, 5
13583; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13584; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13585; RV64I-NEXT:    addi sp, sp, 16
13586; RV64I-NEXT:    ret
13587;
13588; RV64IA-LABEL: atomicrmw_and_i64_seq_cst:
13589; RV64IA:       # %bb.0:
13590; RV64IA-NEXT:    amoand.d.aqrl a0, a1, (a0)
13591; RV64IA-NEXT:    ret
13592  %1 = atomicrmw and i64* %a, i64 %b seq_cst
13593  ret i64 %1
13594}
13595
13596define i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) nounwind {
13597; RV32I-LABEL: atomicrmw_nand_i64_monotonic:
13598; RV32I:       # %bb.0:
13599; RV32I-NEXT:    addi sp, sp, -16
13600; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13601; RV32I-NEXT:    li a3, 0
13602; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13603; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13604; RV32I-NEXT:    addi sp, sp, 16
13605; RV32I-NEXT:    ret
13606;
13607; RV32IA-LABEL: atomicrmw_nand_i64_monotonic:
13608; RV32IA:       # %bb.0:
13609; RV32IA-NEXT:    addi sp, sp, -16
13610; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13611; RV32IA-NEXT:    li a3, 0
13612; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13613; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13614; RV32IA-NEXT:    addi sp, sp, 16
13615; RV32IA-NEXT:    ret
13616;
13617; RV64I-LABEL: atomicrmw_nand_i64_monotonic:
13618; RV64I:       # %bb.0:
13619; RV64I-NEXT:    addi sp, sp, -16
13620; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13621; RV64I-NEXT:    li a2, 0
13622; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13623; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13624; RV64I-NEXT:    addi sp, sp, 16
13625; RV64I-NEXT:    ret
13626;
13627; RV64IA-LABEL: atomicrmw_nand_i64_monotonic:
13628; RV64IA:       # %bb.0:
13629; RV64IA-NEXT:  .LBB185_1: # =>This Inner Loop Header: Depth=1
13630; RV64IA-NEXT:    lr.d a2, (a0)
13631; RV64IA-NEXT:    and a3, a2, a1
13632; RV64IA-NEXT:    not a3, a3
13633; RV64IA-NEXT:    sc.d a3, a3, (a0)
13634; RV64IA-NEXT:    bnez a3, .LBB185_1
13635; RV64IA-NEXT:  # %bb.2:
13636; RV64IA-NEXT:    mv a0, a2
13637; RV64IA-NEXT:    ret
13638  %1 = atomicrmw nand i64* %a, i64 %b monotonic
13639  ret i64 %1
13640}
13641
13642define i64 @atomicrmw_nand_i64_acquire(i64* %a, i64 %b) nounwind {
13643; RV32I-LABEL: atomicrmw_nand_i64_acquire:
13644; RV32I:       # %bb.0:
13645; RV32I-NEXT:    addi sp, sp, -16
13646; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13647; RV32I-NEXT:    li a3, 2
13648; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13649; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13650; RV32I-NEXT:    addi sp, sp, 16
13651; RV32I-NEXT:    ret
13652;
13653; RV32IA-LABEL: atomicrmw_nand_i64_acquire:
13654; RV32IA:       # %bb.0:
13655; RV32IA-NEXT:    addi sp, sp, -16
13656; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13657; RV32IA-NEXT:    li a3, 2
13658; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13659; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13660; RV32IA-NEXT:    addi sp, sp, 16
13661; RV32IA-NEXT:    ret
13662;
13663; RV64I-LABEL: atomicrmw_nand_i64_acquire:
13664; RV64I:       # %bb.0:
13665; RV64I-NEXT:    addi sp, sp, -16
13666; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13667; RV64I-NEXT:    li a2, 2
13668; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13669; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13670; RV64I-NEXT:    addi sp, sp, 16
13671; RV64I-NEXT:    ret
13672;
13673; RV64IA-LABEL: atomicrmw_nand_i64_acquire:
13674; RV64IA:       # %bb.0:
13675; RV64IA-NEXT:  .LBB186_1: # =>This Inner Loop Header: Depth=1
13676; RV64IA-NEXT:    lr.d.aq a2, (a0)
13677; RV64IA-NEXT:    and a3, a2, a1
13678; RV64IA-NEXT:    not a3, a3
13679; RV64IA-NEXT:    sc.d a3, a3, (a0)
13680; RV64IA-NEXT:    bnez a3, .LBB186_1
13681; RV64IA-NEXT:  # %bb.2:
13682; RV64IA-NEXT:    mv a0, a2
13683; RV64IA-NEXT:    ret
13684  %1 = atomicrmw nand i64* %a, i64 %b acquire
13685  ret i64 %1
13686}
13687
13688define i64 @atomicrmw_nand_i64_release(i64* %a, i64 %b) nounwind {
13689; RV32I-LABEL: atomicrmw_nand_i64_release:
13690; RV32I:       # %bb.0:
13691; RV32I-NEXT:    addi sp, sp, -16
13692; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13693; RV32I-NEXT:    li a3, 3
13694; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13695; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13696; RV32I-NEXT:    addi sp, sp, 16
13697; RV32I-NEXT:    ret
13698;
13699; RV32IA-LABEL: atomicrmw_nand_i64_release:
13700; RV32IA:       # %bb.0:
13701; RV32IA-NEXT:    addi sp, sp, -16
13702; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13703; RV32IA-NEXT:    li a3, 3
13704; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13705; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13706; RV32IA-NEXT:    addi sp, sp, 16
13707; RV32IA-NEXT:    ret
13708;
13709; RV64I-LABEL: atomicrmw_nand_i64_release:
13710; RV64I:       # %bb.0:
13711; RV64I-NEXT:    addi sp, sp, -16
13712; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13713; RV64I-NEXT:    li a2, 3
13714; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13715; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13716; RV64I-NEXT:    addi sp, sp, 16
13717; RV64I-NEXT:    ret
13718;
13719; RV64IA-LABEL: atomicrmw_nand_i64_release:
13720; RV64IA:       # %bb.0:
13721; RV64IA-NEXT:  .LBB187_1: # =>This Inner Loop Header: Depth=1
13722; RV64IA-NEXT:    lr.d a2, (a0)
13723; RV64IA-NEXT:    and a3, a2, a1
13724; RV64IA-NEXT:    not a3, a3
13725; RV64IA-NEXT:    sc.d.rl a3, a3, (a0)
13726; RV64IA-NEXT:    bnez a3, .LBB187_1
13727; RV64IA-NEXT:  # %bb.2:
13728; RV64IA-NEXT:    mv a0, a2
13729; RV64IA-NEXT:    ret
13730  %1 = atomicrmw nand i64* %a, i64 %b release
13731  ret i64 %1
13732}
13733
13734define i64 @atomicrmw_nand_i64_acq_rel(i64* %a, i64 %b) nounwind {
13735; RV32I-LABEL: atomicrmw_nand_i64_acq_rel:
13736; RV32I:       # %bb.0:
13737; RV32I-NEXT:    addi sp, sp, -16
13738; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13739; RV32I-NEXT:    li a3, 4
13740; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13741; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13742; RV32I-NEXT:    addi sp, sp, 16
13743; RV32I-NEXT:    ret
13744;
13745; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel:
13746; RV32IA:       # %bb.0:
13747; RV32IA-NEXT:    addi sp, sp, -16
13748; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13749; RV32IA-NEXT:    li a3, 4
13750; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13751; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13752; RV32IA-NEXT:    addi sp, sp, 16
13753; RV32IA-NEXT:    ret
13754;
13755; RV64I-LABEL: atomicrmw_nand_i64_acq_rel:
13756; RV64I:       # %bb.0:
13757; RV64I-NEXT:    addi sp, sp, -16
13758; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13759; RV64I-NEXT:    li a2, 4
13760; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13761; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13762; RV64I-NEXT:    addi sp, sp, 16
13763; RV64I-NEXT:    ret
13764;
13765; RV64IA-LABEL: atomicrmw_nand_i64_acq_rel:
13766; RV64IA:       # %bb.0:
13767; RV64IA-NEXT:  .LBB188_1: # =>This Inner Loop Header: Depth=1
13768; RV64IA-NEXT:    lr.d.aq a2, (a0)
13769; RV64IA-NEXT:    and a3, a2, a1
13770; RV64IA-NEXT:    not a3, a3
13771; RV64IA-NEXT:    sc.d.rl a3, a3, (a0)
13772; RV64IA-NEXT:    bnez a3, .LBB188_1
13773; RV64IA-NEXT:  # %bb.2:
13774; RV64IA-NEXT:    mv a0, a2
13775; RV64IA-NEXT:    ret
13776  %1 = atomicrmw nand i64* %a, i64 %b acq_rel
13777  ret i64 %1
13778}
13779
13780define i64 @atomicrmw_nand_i64_seq_cst(i64* %a, i64 %b) nounwind {
13781; RV32I-LABEL: atomicrmw_nand_i64_seq_cst:
13782; RV32I:       # %bb.0:
13783; RV32I-NEXT:    addi sp, sp, -16
13784; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13785; RV32I-NEXT:    li a3, 5
13786; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13787; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13788; RV32I-NEXT:    addi sp, sp, 16
13789; RV32I-NEXT:    ret
13790;
13791; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst:
13792; RV32IA:       # %bb.0:
13793; RV32IA-NEXT:    addi sp, sp, -16
13794; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13795; RV32IA-NEXT:    li a3, 5
13796; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13797; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13798; RV32IA-NEXT:    addi sp, sp, 16
13799; RV32IA-NEXT:    ret
13800;
13801; RV64I-LABEL: atomicrmw_nand_i64_seq_cst:
13802; RV64I:       # %bb.0:
13803; RV64I-NEXT:    addi sp, sp, -16
13804; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13805; RV64I-NEXT:    li a2, 5
13806; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13807; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13808; RV64I-NEXT:    addi sp, sp, 16
13809; RV64I-NEXT:    ret
13810;
13811; RV64IA-LABEL: atomicrmw_nand_i64_seq_cst:
13812; RV64IA:       # %bb.0:
13813; RV64IA-NEXT:  .LBB189_1: # =>This Inner Loop Header: Depth=1
13814; RV64IA-NEXT:    lr.d.aqrl a2, (a0)
13815; RV64IA-NEXT:    and a3, a2, a1
13816; RV64IA-NEXT:    not a3, a3
13817; RV64IA-NEXT:    sc.d.aqrl a3, a3, (a0)
13818; RV64IA-NEXT:    bnez a3, .LBB189_1
13819; RV64IA-NEXT:  # %bb.2:
13820; RV64IA-NEXT:    mv a0, a2
13821; RV64IA-NEXT:    ret
13822  %1 = atomicrmw nand i64* %a, i64 %b seq_cst
13823  ret i64 %1
13824}
13825
13826define i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind {
13827; RV32I-LABEL: atomicrmw_or_i64_monotonic:
13828; RV32I:       # %bb.0:
13829; RV32I-NEXT:    addi sp, sp, -16
13830; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13831; RV32I-NEXT:    li a3, 0
13832; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13833; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13834; RV32I-NEXT:    addi sp, sp, 16
13835; RV32I-NEXT:    ret
13836;
13837; RV32IA-LABEL: atomicrmw_or_i64_monotonic:
13838; RV32IA:       # %bb.0:
13839; RV32IA-NEXT:    addi sp, sp, -16
13840; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13841; RV32IA-NEXT:    li a3, 0
13842; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13843; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13844; RV32IA-NEXT:    addi sp, sp, 16
13845; RV32IA-NEXT:    ret
13846;
13847; RV64I-LABEL: atomicrmw_or_i64_monotonic:
13848; RV64I:       # %bb.0:
13849; RV64I-NEXT:    addi sp, sp, -16
13850; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13851; RV64I-NEXT:    li a2, 0
13852; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13853; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13854; RV64I-NEXT:    addi sp, sp, 16
13855; RV64I-NEXT:    ret
13856;
13857; RV64IA-LABEL: atomicrmw_or_i64_monotonic:
13858; RV64IA:       # %bb.0:
13859; RV64IA-NEXT:    amoor.d a0, a1, (a0)
13860; RV64IA-NEXT:    ret
13861  %1 = atomicrmw or i64* %a, i64 %b monotonic
13862  ret i64 %1
13863}
13864
13865define i64 @atomicrmw_or_i64_acquire(i64 *%a, i64 %b) nounwind {
13866; RV32I-LABEL: atomicrmw_or_i64_acquire:
13867; RV32I:       # %bb.0:
13868; RV32I-NEXT:    addi sp, sp, -16
13869; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13870; RV32I-NEXT:    li a3, 2
13871; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13872; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13873; RV32I-NEXT:    addi sp, sp, 16
13874; RV32I-NEXT:    ret
13875;
13876; RV32IA-LABEL: atomicrmw_or_i64_acquire:
13877; RV32IA:       # %bb.0:
13878; RV32IA-NEXT:    addi sp, sp, -16
13879; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13880; RV32IA-NEXT:    li a3, 2
13881; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13882; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13883; RV32IA-NEXT:    addi sp, sp, 16
13884; RV32IA-NEXT:    ret
13885;
13886; RV64I-LABEL: atomicrmw_or_i64_acquire:
13887; RV64I:       # %bb.0:
13888; RV64I-NEXT:    addi sp, sp, -16
13889; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13890; RV64I-NEXT:    li a2, 2
13891; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13892; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13893; RV64I-NEXT:    addi sp, sp, 16
13894; RV64I-NEXT:    ret
13895;
13896; RV64IA-LABEL: atomicrmw_or_i64_acquire:
13897; RV64IA:       # %bb.0:
13898; RV64IA-NEXT:    amoor.d.aq a0, a1, (a0)
13899; RV64IA-NEXT:    ret
13900  %1 = atomicrmw or i64* %a, i64 %b acquire
13901  ret i64 %1
13902}
13903
13904define i64 @atomicrmw_or_i64_release(i64 *%a, i64 %b) nounwind {
13905; RV32I-LABEL: atomicrmw_or_i64_release:
13906; RV32I:       # %bb.0:
13907; RV32I-NEXT:    addi sp, sp, -16
13908; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13909; RV32I-NEXT:    li a3, 3
13910; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13911; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13912; RV32I-NEXT:    addi sp, sp, 16
13913; RV32I-NEXT:    ret
13914;
13915; RV32IA-LABEL: atomicrmw_or_i64_release:
13916; RV32IA:       # %bb.0:
13917; RV32IA-NEXT:    addi sp, sp, -16
13918; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13919; RV32IA-NEXT:    li a3, 3
13920; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13921; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13922; RV32IA-NEXT:    addi sp, sp, 16
13923; RV32IA-NEXT:    ret
13924;
13925; RV64I-LABEL: atomicrmw_or_i64_release:
13926; RV64I:       # %bb.0:
13927; RV64I-NEXT:    addi sp, sp, -16
13928; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13929; RV64I-NEXT:    li a2, 3
13930; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13931; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13932; RV64I-NEXT:    addi sp, sp, 16
13933; RV64I-NEXT:    ret
13934;
13935; RV64IA-LABEL: atomicrmw_or_i64_release:
13936; RV64IA:       # %bb.0:
13937; RV64IA-NEXT:    amoor.d.rl a0, a1, (a0)
13938; RV64IA-NEXT:    ret
13939  %1 = atomicrmw or i64* %a, i64 %b release
13940  ret i64 %1
13941}
13942
13943define i64 @atomicrmw_or_i64_acq_rel(i64 *%a, i64 %b) nounwind {
13944; RV32I-LABEL: atomicrmw_or_i64_acq_rel:
13945; RV32I:       # %bb.0:
13946; RV32I-NEXT:    addi sp, sp, -16
13947; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13948; RV32I-NEXT:    li a3, 4
13949; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13950; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13951; RV32I-NEXT:    addi sp, sp, 16
13952; RV32I-NEXT:    ret
13953;
13954; RV32IA-LABEL: atomicrmw_or_i64_acq_rel:
13955; RV32IA:       # %bb.0:
13956; RV32IA-NEXT:    addi sp, sp, -16
13957; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13958; RV32IA-NEXT:    li a3, 4
13959; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13960; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13961; RV32IA-NEXT:    addi sp, sp, 16
13962; RV32IA-NEXT:    ret
13963;
13964; RV64I-LABEL: atomicrmw_or_i64_acq_rel:
13965; RV64I:       # %bb.0:
13966; RV64I-NEXT:    addi sp, sp, -16
13967; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13968; RV64I-NEXT:    li a2, 4
13969; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13970; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13971; RV64I-NEXT:    addi sp, sp, 16
13972; RV64I-NEXT:    ret
13973;
13974; RV64IA-LABEL: atomicrmw_or_i64_acq_rel:
13975; RV64IA:       # %bb.0:
13976; RV64IA-NEXT:    amoor.d.aqrl a0, a1, (a0)
13977; RV64IA-NEXT:    ret
13978  %1 = atomicrmw or i64* %a, i64 %b acq_rel
13979  ret i64 %1
13980}
13981
13982define i64 @atomicrmw_or_i64_seq_cst(i64 *%a, i64 %b) nounwind {
13983; RV32I-LABEL: atomicrmw_or_i64_seq_cst:
13984; RV32I:       # %bb.0:
13985; RV32I-NEXT:    addi sp, sp, -16
13986; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13987; RV32I-NEXT:    li a3, 5
13988; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13989; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13990; RV32I-NEXT:    addi sp, sp, 16
13991; RV32I-NEXT:    ret
13992;
13993; RV32IA-LABEL: atomicrmw_or_i64_seq_cst:
13994; RV32IA:       # %bb.0:
13995; RV32IA-NEXT:    addi sp, sp, -16
13996; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13997; RV32IA-NEXT:    li a3, 5
13998; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13999; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14000; RV32IA-NEXT:    addi sp, sp, 16
14001; RV32IA-NEXT:    ret
14002;
14003; RV64I-LABEL: atomicrmw_or_i64_seq_cst:
14004; RV64I:       # %bb.0:
14005; RV64I-NEXT:    addi sp, sp, -16
14006; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14007; RV64I-NEXT:    li a2, 5
14008; RV64I-NEXT:    call __atomic_fetch_or_8@plt
14009; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14010; RV64I-NEXT:    addi sp, sp, 16
14011; RV64I-NEXT:    ret
14012;
14013; RV64IA-LABEL: atomicrmw_or_i64_seq_cst:
14014; RV64IA:       # %bb.0:
14015; RV64IA-NEXT:    amoor.d.aqrl a0, a1, (a0)
14016; RV64IA-NEXT:    ret
14017  %1 = atomicrmw or i64* %a, i64 %b seq_cst
14018  ret i64 %1
14019}
14020
14021define i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind {
14022; RV32I-LABEL: atomicrmw_xor_i64_monotonic:
14023; RV32I:       # %bb.0:
14024; RV32I-NEXT:    addi sp, sp, -16
14025; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14026; RV32I-NEXT:    li a3, 0
14027; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14028; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14029; RV32I-NEXT:    addi sp, sp, 16
14030; RV32I-NEXT:    ret
14031;
14032; RV32IA-LABEL: atomicrmw_xor_i64_monotonic:
14033; RV32IA:       # %bb.0:
14034; RV32IA-NEXT:    addi sp, sp, -16
14035; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14036; RV32IA-NEXT:    li a3, 0
14037; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14038; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14039; RV32IA-NEXT:    addi sp, sp, 16
14040; RV32IA-NEXT:    ret
14041;
14042; RV64I-LABEL: atomicrmw_xor_i64_monotonic:
14043; RV64I:       # %bb.0:
14044; RV64I-NEXT:    addi sp, sp, -16
14045; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14046; RV64I-NEXT:    li a2, 0
14047; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14048; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14049; RV64I-NEXT:    addi sp, sp, 16
14050; RV64I-NEXT:    ret
14051;
14052; RV64IA-LABEL: atomicrmw_xor_i64_monotonic:
14053; RV64IA:       # %bb.0:
14054; RV64IA-NEXT:    amoxor.d a0, a1, (a0)
14055; RV64IA-NEXT:    ret
14056  %1 = atomicrmw xor i64* %a, i64 %b monotonic
14057  ret i64 %1
14058}
14059
14060define i64 @atomicrmw_xor_i64_acquire(i64 *%a, i64 %b) nounwind {
14061; RV32I-LABEL: atomicrmw_xor_i64_acquire:
14062; RV32I:       # %bb.0:
14063; RV32I-NEXT:    addi sp, sp, -16
14064; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14065; RV32I-NEXT:    li a3, 2
14066; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14067; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14068; RV32I-NEXT:    addi sp, sp, 16
14069; RV32I-NEXT:    ret
14070;
14071; RV32IA-LABEL: atomicrmw_xor_i64_acquire:
14072; RV32IA:       # %bb.0:
14073; RV32IA-NEXT:    addi sp, sp, -16
14074; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14075; RV32IA-NEXT:    li a3, 2
14076; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14077; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14078; RV32IA-NEXT:    addi sp, sp, 16
14079; RV32IA-NEXT:    ret
14080;
14081; RV64I-LABEL: atomicrmw_xor_i64_acquire:
14082; RV64I:       # %bb.0:
14083; RV64I-NEXT:    addi sp, sp, -16
14084; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14085; RV64I-NEXT:    li a2, 2
14086; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14087; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14088; RV64I-NEXT:    addi sp, sp, 16
14089; RV64I-NEXT:    ret
14090;
14091; RV64IA-LABEL: atomicrmw_xor_i64_acquire:
14092; RV64IA:       # %bb.0:
14093; RV64IA-NEXT:    amoxor.d.aq a0, a1, (a0)
14094; RV64IA-NEXT:    ret
14095  %1 = atomicrmw xor i64* %a, i64 %b acquire
14096  ret i64 %1
14097}
14098
14099define i64 @atomicrmw_xor_i64_release(i64 *%a, i64 %b) nounwind {
14100; RV32I-LABEL: atomicrmw_xor_i64_release:
14101; RV32I:       # %bb.0:
14102; RV32I-NEXT:    addi sp, sp, -16
14103; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14104; RV32I-NEXT:    li a3, 3
14105; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14106; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14107; RV32I-NEXT:    addi sp, sp, 16
14108; RV32I-NEXT:    ret
14109;
14110; RV32IA-LABEL: atomicrmw_xor_i64_release:
14111; RV32IA:       # %bb.0:
14112; RV32IA-NEXT:    addi sp, sp, -16
14113; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14114; RV32IA-NEXT:    li a3, 3
14115; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14116; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14117; RV32IA-NEXT:    addi sp, sp, 16
14118; RV32IA-NEXT:    ret
14119;
14120; RV64I-LABEL: atomicrmw_xor_i64_release:
14121; RV64I:       # %bb.0:
14122; RV64I-NEXT:    addi sp, sp, -16
14123; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14124; RV64I-NEXT:    li a2, 3
14125; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14126; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14127; RV64I-NEXT:    addi sp, sp, 16
14128; RV64I-NEXT:    ret
14129;
14130; RV64IA-LABEL: atomicrmw_xor_i64_release:
14131; RV64IA:       # %bb.0:
14132; RV64IA-NEXT:    amoxor.d.rl a0, a1, (a0)
14133; RV64IA-NEXT:    ret
14134  %1 = atomicrmw xor i64* %a, i64 %b release
14135  ret i64 %1
14136}
14137
14138define i64 @atomicrmw_xor_i64_acq_rel(i64 *%a, i64 %b) nounwind {
14139; RV32I-LABEL: atomicrmw_xor_i64_acq_rel:
14140; RV32I:       # %bb.0:
14141; RV32I-NEXT:    addi sp, sp, -16
14142; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14143; RV32I-NEXT:    li a3, 4
14144; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14145; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14146; RV32I-NEXT:    addi sp, sp, 16
14147; RV32I-NEXT:    ret
14148;
14149; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel:
14150; RV32IA:       # %bb.0:
14151; RV32IA-NEXT:    addi sp, sp, -16
14152; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14153; RV32IA-NEXT:    li a3, 4
14154; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14155; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14156; RV32IA-NEXT:    addi sp, sp, 16
14157; RV32IA-NEXT:    ret
14158;
14159; RV64I-LABEL: atomicrmw_xor_i64_acq_rel:
14160; RV64I:       # %bb.0:
14161; RV64I-NEXT:    addi sp, sp, -16
14162; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14163; RV64I-NEXT:    li a2, 4
14164; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14165; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14166; RV64I-NEXT:    addi sp, sp, 16
14167; RV64I-NEXT:    ret
14168;
14169; RV64IA-LABEL: atomicrmw_xor_i64_acq_rel:
14170; RV64IA:       # %bb.0:
14171; RV64IA-NEXT:    amoxor.d.aqrl a0, a1, (a0)
14172; RV64IA-NEXT:    ret
14173  %1 = atomicrmw xor i64* %a, i64 %b acq_rel
14174  ret i64 %1
14175}
14176
14177define i64 @atomicrmw_xor_i64_seq_cst(i64 *%a, i64 %b) nounwind {
14178; RV32I-LABEL: atomicrmw_xor_i64_seq_cst:
14179; RV32I:       # %bb.0:
14180; RV32I-NEXT:    addi sp, sp, -16
14181; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14182; RV32I-NEXT:    li a3, 5
14183; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14184; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14185; RV32I-NEXT:    addi sp, sp, 16
14186; RV32I-NEXT:    ret
14187;
14188; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst:
14189; RV32IA:       # %bb.0:
14190; RV32IA-NEXT:    addi sp, sp, -16
14191; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14192; RV32IA-NEXT:    li a3, 5
14193; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14194; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14195; RV32IA-NEXT:    addi sp, sp, 16
14196; RV32IA-NEXT:    ret
14197;
14198; RV64I-LABEL: atomicrmw_xor_i64_seq_cst:
14199; RV64I:       # %bb.0:
14200; RV64I-NEXT:    addi sp, sp, -16
14201; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14202; RV64I-NEXT:    li a2, 5
14203; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14204; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14205; RV64I-NEXT:    addi sp, sp, 16
14206; RV64I-NEXT:    ret
14207;
14208; RV64IA-LABEL: atomicrmw_xor_i64_seq_cst:
14209; RV64IA:       # %bb.0:
14210; RV64IA-NEXT:    amoxor.d.aqrl a0, a1, (a0)
14211; RV64IA-NEXT:    ret
14212  %1 = atomicrmw xor i64* %a, i64 %b seq_cst
14213  ret i64 %1
14214}
14215
14216define i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind {
14217; RV32I-LABEL: atomicrmw_max_i64_monotonic:
14218; RV32I:       # %bb.0:
14219; RV32I-NEXT:    addi sp, sp, -32
14220; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14221; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14222; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14223; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14224; RV32I-NEXT:    mv s0, a0
14225; RV32I-NEXT:    lw a5, 4(a0)
14226; RV32I-NEXT:    lw a4, 0(a0)
14227; RV32I-NEXT:    mv s1, a2
14228; RV32I-NEXT:    mv s2, a1
14229; RV32I-NEXT:    j .LBB200_2
14230; RV32I-NEXT:  .LBB200_1: # %atomicrmw.start
14231; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14232; RV32I-NEXT:    sw a4, 8(sp)
14233; RV32I-NEXT:    sw a5, 12(sp)
14234; RV32I-NEXT:    addi a1, sp, 8
14235; RV32I-NEXT:    mv a0, s0
14236; RV32I-NEXT:    li a4, 0
14237; RV32I-NEXT:    li a5, 0
14238; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14239; RV32I-NEXT:    lw a5, 12(sp)
14240; RV32I-NEXT:    lw a4, 8(sp)
14241; RV32I-NEXT:    bnez a0, .LBB200_7
14242; RV32I-NEXT:  .LBB200_2: # %atomicrmw.start
14243; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14244; RV32I-NEXT:    beq a5, s1, .LBB200_4
14245; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14246; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14247; RV32I-NEXT:    slt a0, s1, a5
14248; RV32I-NEXT:    j .LBB200_5
14249; RV32I-NEXT:  .LBB200_4: # in Loop: Header=BB200_2 Depth=1
14250; RV32I-NEXT:    sltu a0, s2, a4
14251; RV32I-NEXT:  .LBB200_5: # %atomicrmw.start
14252; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14253; RV32I-NEXT:    mv a2, a4
14254; RV32I-NEXT:    mv a3, a5
14255; RV32I-NEXT:    bnez a0, .LBB200_1
14256; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14257; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14258; RV32I-NEXT:    mv a2, s2
14259; RV32I-NEXT:    mv a3, s1
14260; RV32I-NEXT:    j .LBB200_1
14261; RV32I-NEXT:  .LBB200_7: # %atomicrmw.end
14262; RV32I-NEXT:    mv a0, a4
14263; RV32I-NEXT:    mv a1, a5
14264; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14265; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14266; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14267; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14268; RV32I-NEXT:    addi sp, sp, 32
14269; RV32I-NEXT:    ret
14270;
14271; RV32IA-LABEL: atomicrmw_max_i64_monotonic:
14272; RV32IA:       # %bb.0:
14273; RV32IA-NEXT:    addi sp, sp, -32
14274; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14275; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14276; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14277; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14278; RV32IA-NEXT:    mv s0, a0
14279; RV32IA-NEXT:    lw a5, 4(a0)
14280; RV32IA-NEXT:    lw a4, 0(a0)
14281; RV32IA-NEXT:    mv s1, a2
14282; RV32IA-NEXT:    mv s2, a1
14283; RV32IA-NEXT:    j .LBB200_2
14284; RV32IA-NEXT:  .LBB200_1: # %atomicrmw.start
14285; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14286; RV32IA-NEXT:    sw a4, 8(sp)
14287; RV32IA-NEXT:    sw a5, 12(sp)
14288; RV32IA-NEXT:    addi a1, sp, 8
14289; RV32IA-NEXT:    mv a0, s0
14290; RV32IA-NEXT:    li a4, 0
14291; RV32IA-NEXT:    li a5, 0
14292; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14293; RV32IA-NEXT:    lw a5, 12(sp)
14294; RV32IA-NEXT:    lw a4, 8(sp)
14295; RV32IA-NEXT:    bnez a0, .LBB200_7
14296; RV32IA-NEXT:  .LBB200_2: # %atomicrmw.start
14297; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14298; RV32IA-NEXT:    beq a5, s1, .LBB200_4
14299; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14300; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14301; RV32IA-NEXT:    slt a0, s1, a5
14302; RV32IA-NEXT:    j .LBB200_5
14303; RV32IA-NEXT:  .LBB200_4: # in Loop: Header=BB200_2 Depth=1
14304; RV32IA-NEXT:    sltu a0, s2, a4
14305; RV32IA-NEXT:  .LBB200_5: # %atomicrmw.start
14306; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14307; RV32IA-NEXT:    mv a2, a4
14308; RV32IA-NEXT:    mv a3, a5
14309; RV32IA-NEXT:    bnez a0, .LBB200_1
14310; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14311; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14312; RV32IA-NEXT:    mv a2, s2
14313; RV32IA-NEXT:    mv a3, s1
14314; RV32IA-NEXT:    j .LBB200_1
14315; RV32IA-NEXT:  .LBB200_7: # %atomicrmw.end
14316; RV32IA-NEXT:    mv a0, a4
14317; RV32IA-NEXT:    mv a1, a5
14318; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14319; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14320; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14321; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14322; RV32IA-NEXT:    addi sp, sp, 32
14323; RV32IA-NEXT:    ret
14324;
14325; RV64I-LABEL: atomicrmw_max_i64_monotonic:
14326; RV64I:       # %bb.0:
14327; RV64I-NEXT:    addi sp, sp, -32
14328; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14329; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14330; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14331; RV64I-NEXT:    mv s0, a0
14332; RV64I-NEXT:    ld a3, 0(a0)
14333; RV64I-NEXT:    mv s1, a1
14334; RV64I-NEXT:    j .LBB200_2
14335; RV64I-NEXT:  .LBB200_1: # %atomicrmw.start
14336; RV64I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14337; RV64I-NEXT:    sd a3, 0(sp)
14338; RV64I-NEXT:    mv a1, sp
14339; RV64I-NEXT:    mv a0, s0
14340; RV64I-NEXT:    li a3, 0
14341; RV64I-NEXT:    li a4, 0
14342; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14343; RV64I-NEXT:    ld a3, 0(sp)
14344; RV64I-NEXT:    bnez a0, .LBB200_4
14345; RV64I-NEXT:  .LBB200_2: # %atomicrmw.start
14346; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14347; RV64I-NEXT:    mv a2, a3
14348; RV64I-NEXT:    blt s1, a3, .LBB200_1
14349; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14350; RV64I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14351; RV64I-NEXT:    mv a2, s1
14352; RV64I-NEXT:    j .LBB200_1
14353; RV64I-NEXT:  .LBB200_4: # %atomicrmw.end
14354; RV64I-NEXT:    mv a0, a3
14355; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14356; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14357; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14358; RV64I-NEXT:    addi sp, sp, 32
14359; RV64I-NEXT:    ret
14360;
14361; RV64IA-LABEL: atomicrmw_max_i64_monotonic:
14362; RV64IA:       # %bb.0:
14363; RV64IA-NEXT:    amomax.d a0, a1, (a0)
14364; RV64IA-NEXT:    ret
14365  %1 = atomicrmw max i64* %a, i64 %b monotonic
14366  ret i64 %1
14367}
14368
14369define i64 @atomicrmw_max_i64_acquire(i64 *%a, i64 %b) nounwind {
14370; RV32I-LABEL: atomicrmw_max_i64_acquire:
14371; RV32I:       # %bb.0:
14372; RV32I-NEXT:    addi sp, sp, -32
14373; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14374; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14375; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14376; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14377; RV32I-NEXT:    mv s0, a0
14378; RV32I-NEXT:    lw a5, 4(a0)
14379; RV32I-NEXT:    lw a4, 0(a0)
14380; RV32I-NEXT:    mv s1, a2
14381; RV32I-NEXT:    mv s2, a1
14382; RV32I-NEXT:    j .LBB201_2
14383; RV32I-NEXT:  .LBB201_1: # %atomicrmw.start
14384; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14385; RV32I-NEXT:    sw a4, 8(sp)
14386; RV32I-NEXT:    sw a5, 12(sp)
14387; RV32I-NEXT:    addi a1, sp, 8
14388; RV32I-NEXT:    li a4, 2
14389; RV32I-NEXT:    li a5, 2
14390; RV32I-NEXT:    mv a0, s0
14391; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14392; RV32I-NEXT:    lw a5, 12(sp)
14393; RV32I-NEXT:    lw a4, 8(sp)
14394; RV32I-NEXT:    bnez a0, .LBB201_7
14395; RV32I-NEXT:  .LBB201_2: # %atomicrmw.start
14396; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14397; RV32I-NEXT:    beq a5, s1, .LBB201_4
14398; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14399; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14400; RV32I-NEXT:    slt a0, s1, a5
14401; RV32I-NEXT:    j .LBB201_5
14402; RV32I-NEXT:  .LBB201_4: # in Loop: Header=BB201_2 Depth=1
14403; RV32I-NEXT:    sltu a0, s2, a4
14404; RV32I-NEXT:  .LBB201_5: # %atomicrmw.start
14405; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14406; RV32I-NEXT:    mv a2, a4
14407; RV32I-NEXT:    mv a3, a5
14408; RV32I-NEXT:    bnez a0, .LBB201_1
14409; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14410; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14411; RV32I-NEXT:    mv a2, s2
14412; RV32I-NEXT:    mv a3, s1
14413; RV32I-NEXT:    j .LBB201_1
14414; RV32I-NEXT:  .LBB201_7: # %atomicrmw.end
14415; RV32I-NEXT:    mv a0, a4
14416; RV32I-NEXT:    mv a1, a5
14417; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14418; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14419; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14420; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14421; RV32I-NEXT:    addi sp, sp, 32
14422; RV32I-NEXT:    ret
14423;
14424; RV32IA-LABEL: atomicrmw_max_i64_acquire:
14425; RV32IA:       # %bb.0:
14426; RV32IA-NEXT:    addi sp, sp, -32
14427; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14428; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14429; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14430; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14431; RV32IA-NEXT:    mv s0, a0
14432; RV32IA-NEXT:    lw a5, 4(a0)
14433; RV32IA-NEXT:    lw a4, 0(a0)
14434; RV32IA-NEXT:    mv s1, a2
14435; RV32IA-NEXT:    mv s2, a1
14436; RV32IA-NEXT:    j .LBB201_2
14437; RV32IA-NEXT:  .LBB201_1: # %atomicrmw.start
14438; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14439; RV32IA-NEXT:    sw a4, 8(sp)
14440; RV32IA-NEXT:    sw a5, 12(sp)
14441; RV32IA-NEXT:    addi a1, sp, 8
14442; RV32IA-NEXT:    li a4, 2
14443; RV32IA-NEXT:    li a5, 2
14444; RV32IA-NEXT:    mv a0, s0
14445; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14446; RV32IA-NEXT:    lw a5, 12(sp)
14447; RV32IA-NEXT:    lw a4, 8(sp)
14448; RV32IA-NEXT:    bnez a0, .LBB201_7
14449; RV32IA-NEXT:  .LBB201_2: # %atomicrmw.start
14450; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14451; RV32IA-NEXT:    beq a5, s1, .LBB201_4
14452; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14453; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14454; RV32IA-NEXT:    slt a0, s1, a5
14455; RV32IA-NEXT:    j .LBB201_5
14456; RV32IA-NEXT:  .LBB201_4: # in Loop: Header=BB201_2 Depth=1
14457; RV32IA-NEXT:    sltu a0, s2, a4
14458; RV32IA-NEXT:  .LBB201_5: # %atomicrmw.start
14459; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14460; RV32IA-NEXT:    mv a2, a4
14461; RV32IA-NEXT:    mv a3, a5
14462; RV32IA-NEXT:    bnez a0, .LBB201_1
14463; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14464; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14465; RV32IA-NEXT:    mv a2, s2
14466; RV32IA-NEXT:    mv a3, s1
14467; RV32IA-NEXT:    j .LBB201_1
14468; RV32IA-NEXT:  .LBB201_7: # %atomicrmw.end
14469; RV32IA-NEXT:    mv a0, a4
14470; RV32IA-NEXT:    mv a1, a5
14471; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14472; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14473; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14474; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14475; RV32IA-NEXT:    addi sp, sp, 32
14476; RV32IA-NEXT:    ret
14477;
14478; RV64I-LABEL: atomicrmw_max_i64_acquire:
14479; RV64I:       # %bb.0:
14480; RV64I-NEXT:    addi sp, sp, -32
14481; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14482; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14483; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14484; RV64I-NEXT:    mv s0, a0
14485; RV64I-NEXT:    ld a3, 0(a0)
14486; RV64I-NEXT:    mv s1, a1
14487; RV64I-NEXT:    j .LBB201_2
14488; RV64I-NEXT:  .LBB201_1: # %atomicrmw.start
14489; RV64I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14490; RV64I-NEXT:    sd a3, 0(sp)
14491; RV64I-NEXT:    mv a1, sp
14492; RV64I-NEXT:    li a3, 2
14493; RV64I-NEXT:    li a4, 2
14494; RV64I-NEXT:    mv a0, s0
14495; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14496; RV64I-NEXT:    ld a3, 0(sp)
14497; RV64I-NEXT:    bnez a0, .LBB201_4
14498; RV64I-NEXT:  .LBB201_2: # %atomicrmw.start
14499; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14500; RV64I-NEXT:    mv a2, a3
14501; RV64I-NEXT:    blt s1, a3, .LBB201_1
14502; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14503; RV64I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14504; RV64I-NEXT:    mv a2, s1
14505; RV64I-NEXT:    j .LBB201_1
14506; RV64I-NEXT:  .LBB201_4: # %atomicrmw.end
14507; RV64I-NEXT:    mv a0, a3
14508; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14509; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14510; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14511; RV64I-NEXT:    addi sp, sp, 32
14512; RV64I-NEXT:    ret
14513;
14514; RV64IA-LABEL: atomicrmw_max_i64_acquire:
14515; RV64IA:       # %bb.0:
14516; RV64IA-NEXT:    amomax.d.aq a0, a1, (a0)
14517; RV64IA-NEXT:    ret
14518  %1 = atomicrmw max i64* %a, i64 %b acquire
14519  ret i64 %1
14520}
14521
14522define i64 @atomicrmw_max_i64_release(i64 *%a, i64 %b) nounwind {
14523; RV32I-LABEL: atomicrmw_max_i64_release:
14524; RV32I:       # %bb.0:
14525; RV32I-NEXT:    addi sp, sp, -32
14526; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14527; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14528; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14529; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14530; RV32I-NEXT:    mv s0, a0
14531; RV32I-NEXT:    lw a5, 4(a0)
14532; RV32I-NEXT:    lw a4, 0(a0)
14533; RV32I-NEXT:    mv s1, a2
14534; RV32I-NEXT:    mv s2, a1
14535; RV32I-NEXT:    j .LBB202_2
14536; RV32I-NEXT:  .LBB202_1: # %atomicrmw.start
14537; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14538; RV32I-NEXT:    sw a4, 8(sp)
14539; RV32I-NEXT:    sw a5, 12(sp)
14540; RV32I-NEXT:    addi a1, sp, 8
14541; RV32I-NEXT:    li a4, 3
14542; RV32I-NEXT:    mv a0, s0
14543; RV32I-NEXT:    li a5, 0
14544; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14545; RV32I-NEXT:    lw a5, 12(sp)
14546; RV32I-NEXT:    lw a4, 8(sp)
14547; RV32I-NEXT:    bnez a0, .LBB202_7
14548; RV32I-NEXT:  .LBB202_2: # %atomicrmw.start
14549; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14550; RV32I-NEXT:    beq a5, s1, .LBB202_4
14551; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14552; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14553; RV32I-NEXT:    slt a0, s1, a5
14554; RV32I-NEXT:    j .LBB202_5
14555; RV32I-NEXT:  .LBB202_4: # in Loop: Header=BB202_2 Depth=1
14556; RV32I-NEXT:    sltu a0, s2, a4
14557; RV32I-NEXT:  .LBB202_5: # %atomicrmw.start
14558; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14559; RV32I-NEXT:    mv a2, a4
14560; RV32I-NEXT:    mv a3, a5
14561; RV32I-NEXT:    bnez a0, .LBB202_1
14562; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14563; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14564; RV32I-NEXT:    mv a2, s2
14565; RV32I-NEXT:    mv a3, s1
14566; RV32I-NEXT:    j .LBB202_1
14567; RV32I-NEXT:  .LBB202_7: # %atomicrmw.end
14568; RV32I-NEXT:    mv a0, a4
14569; RV32I-NEXT:    mv a1, a5
14570; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14571; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14572; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14573; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14574; RV32I-NEXT:    addi sp, sp, 32
14575; RV32I-NEXT:    ret
14576;
14577; RV32IA-LABEL: atomicrmw_max_i64_release:
14578; RV32IA:       # %bb.0:
14579; RV32IA-NEXT:    addi sp, sp, -32
14580; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14581; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14582; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14583; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14584; RV32IA-NEXT:    mv s0, a0
14585; RV32IA-NEXT:    lw a5, 4(a0)
14586; RV32IA-NEXT:    lw a4, 0(a0)
14587; RV32IA-NEXT:    mv s1, a2
14588; RV32IA-NEXT:    mv s2, a1
14589; RV32IA-NEXT:    j .LBB202_2
14590; RV32IA-NEXT:  .LBB202_1: # %atomicrmw.start
14591; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14592; RV32IA-NEXT:    sw a4, 8(sp)
14593; RV32IA-NEXT:    sw a5, 12(sp)
14594; RV32IA-NEXT:    addi a1, sp, 8
14595; RV32IA-NEXT:    li a4, 3
14596; RV32IA-NEXT:    mv a0, s0
14597; RV32IA-NEXT:    li a5, 0
14598; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14599; RV32IA-NEXT:    lw a5, 12(sp)
14600; RV32IA-NEXT:    lw a4, 8(sp)
14601; RV32IA-NEXT:    bnez a0, .LBB202_7
14602; RV32IA-NEXT:  .LBB202_2: # %atomicrmw.start
14603; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14604; RV32IA-NEXT:    beq a5, s1, .LBB202_4
14605; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14606; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14607; RV32IA-NEXT:    slt a0, s1, a5
14608; RV32IA-NEXT:    j .LBB202_5
14609; RV32IA-NEXT:  .LBB202_4: # in Loop: Header=BB202_2 Depth=1
14610; RV32IA-NEXT:    sltu a0, s2, a4
14611; RV32IA-NEXT:  .LBB202_5: # %atomicrmw.start
14612; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14613; RV32IA-NEXT:    mv a2, a4
14614; RV32IA-NEXT:    mv a3, a5
14615; RV32IA-NEXT:    bnez a0, .LBB202_1
14616; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14617; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14618; RV32IA-NEXT:    mv a2, s2
14619; RV32IA-NEXT:    mv a3, s1
14620; RV32IA-NEXT:    j .LBB202_1
14621; RV32IA-NEXT:  .LBB202_7: # %atomicrmw.end
14622; RV32IA-NEXT:    mv a0, a4
14623; RV32IA-NEXT:    mv a1, a5
14624; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14625; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14626; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14627; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14628; RV32IA-NEXT:    addi sp, sp, 32
14629; RV32IA-NEXT:    ret
14630;
14631; RV64I-LABEL: atomicrmw_max_i64_release:
14632; RV64I:       # %bb.0:
14633; RV64I-NEXT:    addi sp, sp, -32
14634; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14635; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14636; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14637; RV64I-NEXT:    mv s0, a0
14638; RV64I-NEXT:    ld a3, 0(a0)
14639; RV64I-NEXT:    mv s1, a1
14640; RV64I-NEXT:    j .LBB202_2
14641; RV64I-NEXT:  .LBB202_1: # %atomicrmw.start
14642; RV64I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14643; RV64I-NEXT:    sd a3, 0(sp)
14644; RV64I-NEXT:    mv a1, sp
14645; RV64I-NEXT:    li a3, 3
14646; RV64I-NEXT:    mv a0, s0
14647; RV64I-NEXT:    li a4, 0
14648; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14649; RV64I-NEXT:    ld a3, 0(sp)
14650; RV64I-NEXT:    bnez a0, .LBB202_4
14651; RV64I-NEXT:  .LBB202_2: # %atomicrmw.start
14652; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14653; RV64I-NEXT:    mv a2, a3
14654; RV64I-NEXT:    blt s1, a3, .LBB202_1
14655; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14656; RV64I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14657; RV64I-NEXT:    mv a2, s1
14658; RV64I-NEXT:    j .LBB202_1
14659; RV64I-NEXT:  .LBB202_4: # %atomicrmw.end
14660; RV64I-NEXT:    mv a0, a3
14661; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14662; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14663; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14664; RV64I-NEXT:    addi sp, sp, 32
14665; RV64I-NEXT:    ret
14666;
14667; RV64IA-LABEL: atomicrmw_max_i64_release:
14668; RV64IA:       # %bb.0:
14669; RV64IA-NEXT:    amomax.d.rl a0, a1, (a0)
14670; RV64IA-NEXT:    ret
14671  %1 = atomicrmw max i64* %a, i64 %b release
14672  ret i64 %1
14673}
14674
14675define i64 @atomicrmw_max_i64_acq_rel(i64 *%a, i64 %b) nounwind {
14676; RV32I-LABEL: atomicrmw_max_i64_acq_rel:
14677; RV32I:       # %bb.0:
14678; RV32I-NEXT:    addi sp, sp, -32
14679; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14680; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14681; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14682; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14683; RV32I-NEXT:    mv s0, a0
14684; RV32I-NEXT:    lw a5, 4(a0)
14685; RV32I-NEXT:    lw a4, 0(a0)
14686; RV32I-NEXT:    mv s1, a2
14687; RV32I-NEXT:    mv s2, a1
14688; RV32I-NEXT:    j .LBB203_2
14689; RV32I-NEXT:  .LBB203_1: # %atomicrmw.start
14690; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14691; RV32I-NEXT:    sw a4, 8(sp)
14692; RV32I-NEXT:    sw a5, 12(sp)
14693; RV32I-NEXT:    addi a1, sp, 8
14694; RV32I-NEXT:    li a4, 4
14695; RV32I-NEXT:    li a5, 2
14696; RV32I-NEXT:    mv a0, s0
14697; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14698; RV32I-NEXT:    lw a5, 12(sp)
14699; RV32I-NEXT:    lw a4, 8(sp)
14700; RV32I-NEXT:    bnez a0, .LBB203_7
14701; RV32I-NEXT:  .LBB203_2: # %atomicrmw.start
14702; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14703; RV32I-NEXT:    beq a5, s1, .LBB203_4
14704; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14705; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14706; RV32I-NEXT:    slt a0, s1, a5
14707; RV32I-NEXT:    j .LBB203_5
14708; RV32I-NEXT:  .LBB203_4: # in Loop: Header=BB203_2 Depth=1
14709; RV32I-NEXT:    sltu a0, s2, a4
14710; RV32I-NEXT:  .LBB203_5: # %atomicrmw.start
14711; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14712; RV32I-NEXT:    mv a2, a4
14713; RV32I-NEXT:    mv a3, a5
14714; RV32I-NEXT:    bnez a0, .LBB203_1
14715; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14716; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14717; RV32I-NEXT:    mv a2, s2
14718; RV32I-NEXT:    mv a3, s1
14719; RV32I-NEXT:    j .LBB203_1
14720; RV32I-NEXT:  .LBB203_7: # %atomicrmw.end
14721; RV32I-NEXT:    mv a0, a4
14722; RV32I-NEXT:    mv a1, a5
14723; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14724; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14725; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14726; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14727; RV32I-NEXT:    addi sp, sp, 32
14728; RV32I-NEXT:    ret
14729;
14730; RV32IA-LABEL: atomicrmw_max_i64_acq_rel:
14731; RV32IA:       # %bb.0:
14732; RV32IA-NEXT:    addi sp, sp, -32
14733; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14734; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14735; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14736; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14737; RV32IA-NEXT:    mv s0, a0
14738; RV32IA-NEXT:    lw a5, 4(a0)
14739; RV32IA-NEXT:    lw a4, 0(a0)
14740; RV32IA-NEXT:    mv s1, a2
14741; RV32IA-NEXT:    mv s2, a1
14742; RV32IA-NEXT:    j .LBB203_2
14743; RV32IA-NEXT:  .LBB203_1: # %atomicrmw.start
14744; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14745; RV32IA-NEXT:    sw a4, 8(sp)
14746; RV32IA-NEXT:    sw a5, 12(sp)
14747; RV32IA-NEXT:    addi a1, sp, 8
14748; RV32IA-NEXT:    li a4, 4
14749; RV32IA-NEXT:    li a5, 2
14750; RV32IA-NEXT:    mv a0, s0
14751; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14752; RV32IA-NEXT:    lw a5, 12(sp)
14753; RV32IA-NEXT:    lw a4, 8(sp)
14754; RV32IA-NEXT:    bnez a0, .LBB203_7
14755; RV32IA-NEXT:  .LBB203_2: # %atomicrmw.start
14756; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14757; RV32IA-NEXT:    beq a5, s1, .LBB203_4
14758; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14759; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14760; RV32IA-NEXT:    slt a0, s1, a5
14761; RV32IA-NEXT:    j .LBB203_5
14762; RV32IA-NEXT:  .LBB203_4: # in Loop: Header=BB203_2 Depth=1
14763; RV32IA-NEXT:    sltu a0, s2, a4
14764; RV32IA-NEXT:  .LBB203_5: # %atomicrmw.start
14765; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14766; RV32IA-NEXT:    mv a2, a4
14767; RV32IA-NEXT:    mv a3, a5
14768; RV32IA-NEXT:    bnez a0, .LBB203_1
14769; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14770; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14771; RV32IA-NEXT:    mv a2, s2
14772; RV32IA-NEXT:    mv a3, s1
14773; RV32IA-NEXT:    j .LBB203_1
14774; RV32IA-NEXT:  .LBB203_7: # %atomicrmw.end
14775; RV32IA-NEXT:    mv a0, a4
14776; RV32IA-NEXT:    mv a1, a5
14777; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14778; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14779; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14780; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14781; RV32IA-NEXT:    addi sp, sp, 32
14782; RV32IA-NEXT:    ret
14783;
14784; RV64I-LABEL: atomicrmw_max_i64_acq_rel:
14785; RV64I:       # %bb.0:
14786; RV64I-NEXT:    addi sp, sp, -32
14787; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14788; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14789; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14790; RV64I-NEXT:    mv s0, a0
14791; RV64I-NEXT:    ld a3, 0(a0)
14792; RV64I-NEXT:    mv s1, a1
14793; RV64I-NEXT:    j .LBB203_2
14794; RV64I-NEXT:  .LBB203_1: # %atomicrmw.start
14795; RV64I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14796; RV64I-NEXT:    sd a3, 0(sp)
14797; RV64I-NEXT:    mv a1, sp
14798; RV64I-NEXT:    li a3, 4
14799; RV64I-NEXT:    li a4, 2
14800; RV64I-NEXT:    mv a0, s0
14801; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14802; RV64I-NEXT:    ld a3, 0(sp)
14803; RV64I-NEXT:    bnez a0, .LBB203_4
14804; RV64I-NEXT:  .LBB203_2: # %atomicrmw.start
14805; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14806; RV64I-NEXT:    mv a2, a3
14807; RV64I-NEXT:    blt s1, a3, .LBB203_1
14808; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14809; RV64I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14810; RV64I-NEXT:    mv a2, s1
14811; RV64I-NEXT:    j .LBB203_1
14812; RV64I-NEXT:  .LBB203_4: # %atomicrmw.end
14813; RV64I-NEXT:    mv a0, a3
14814; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14815; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14816; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14817; RV64I-NEXT:    addi sp, sp, 32
14818; RV64I-NEXT:    ret
14819;
14820; RV64IA-LABEL: atomicrmw_max_i64_acq_rel:
14821; RV64IA:       # %bb.0:
14822; RV64IA-NEXT:    amomax.d.aqrl a0, a1, (a0)
14823; RV64IA-NEXT:    ret
14824  %1 = atomicrmw max i64* %a, i64 %b acq_rel
14825  ret i64 %1
14826}
14827
14828define i64 @atomicrmw_max_i64_seq_cst(i64 *%a, i64 %b) nounwind {
14829; RV32I-LABEL: atomicrmw_max_i64_seq_cst:
14830; RV32I:       # %bb.0:
14831; RV32I-NEXT:    addi sp, sp, -32
14832; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14833; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14834; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14835; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14836; RV32I-NEXT:    mv s0, a0
14837; RV32I-NEXT:    lw a5, 4(a0)
14838; RV32I-NEXT:    lw a4, 0(a0)
14839; RV32I-NEXT:    mv s1, a2
14840; RV32I-NEXT:    mv s2, a1
14841; RV32I-NEXT:    j .LBB204_2
14842; RV32I-NEXT:  .LBB204_1: # %atomicrmw.start
14843; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14844; RV32I-NEXT:    sw a4, 8(sp)
14845; RV32I-NEXT:    sw a5, 12(sp)
14846; RV32I-NEXT:    addi a1, sp, 8
14847; RV32I-NEXT:    li a4, 5
14848; RV32I-NEXT:    li a5, 5
14849; RV32I-NEXT:    mv a0, s0
14850; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14851; RV32I-NEXT:    lw a5, 12(sp)
14852; RV32I-NEXT:    lw a4, 8(sp)
14853; RV32I-NEXT:    bnez a0, .LBB204_7
14854; RV32I-NEXT:  .LBB204_2: # %atomicrmw.start
14855; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14856; RV32I-NEXT:    beq a5, s1, .LBB204_4
14857; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14858; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14859; RV32I-NEXT:    slt a0, s1, a5
14860; RV32I-NEXT:    j .LBB204_5
14861; RV32I-NEXT:  .LBB204_4: # in Loop: Header=BB204_2 Depth=1
14862; RV32I-NEXT:    sltu a0, s2, a4
14863; RV32I-NEXT:  .LBB204_5: # %atomicrmw.start
14864; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14865; RV32I-NEXT:    mv a2, a4
14866; RV32I-NEXT:    mv a3, a5
14867; RV32I-NEXT:    bnez a0, .LBB204_1
14868; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14869; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14870; RV32I-NEXT:    mv a2, s2
14871; RV32I-NEXT:    mv a3, s1
14872; RV32I-NEXT:    j .LBB204_1
14873; RV32I-NEXT:  .LBB204_7: # %atomicrmw.end
14874; RV32I-NEXT:    mv a0, a4
14875; RV32I-NEXT:    mv a1, a5
14876; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14877; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14878; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14879; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14880; RV32I-NEXT:    addi sp, sp, 32
14881; RV32I-NEXT:    ret
14882;
14883; RV32IA-LABEL: atomicrmw_max_i64_seq_cst:
14884; RV32IA:       # %bb.0:
14885; RV32IA-NEXT:    addi sp, sp, -32
14886; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14887; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14888; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14889; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14890; RV32IA-NEXT:    mv s0, a0
14891; RV32IA-NEXT:    lw a5, 4(a0)
14892; RV32IA-NEXT:    lw a4, 0(a0)
14893; RV32IA-NEXT:    mv s1, a2
14894; RV32IA-NEXT:    mv s2, a1
14895; RV32IA-NEXT:    j .LBB204_2
14896; RV32IA-NEXT:  .LBB204_1: # %atomicrmw.start
14897; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14898; RV32IA-NEXT:    sw a4, 8(sp)
14899; RV32IA-NEXT:    sw a5, 12(sp)
14900; RV32IA-NEXT:    addi a1, sp, 8
14901; RV32IA-NEXT:    li a4, 5
14902; RV32IA-NEXT:    li a5, 5
14903; RV32IA-NEXT:    mv a0, s0
14904; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14905; RV32IA-NEXT:    lw a5, 12(sp)
14906; RV32IA-NEXT:    lw a4, 8(sp)
14907; RV32IA-NEXT:    bnez a0, .LBB204_7
14908; RV32IA-NEXT:  .LBB204_2: # %atomicrmw.start
14909; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14910; RV32IA-NEXT:    beq a5, s1, .LBB204_4
14911; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14912; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14913; RV32IA-NEXT:    slt a0, s1, a5
14914; RV32IA-NEXT:    j .LBB204_5
14915; RV32IA-NEXT:  .LBB204_4: # in Loop: Header=BB204_2 Depth=1
14916; RV32IA-NEXT:    sltu a0, s2, a4
14917; RV32IA-NEXT:  .LBB204_5: # %atomicrmw.start
14918; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14919; RV32IA-NEXT:    mv a2, a4
14920; RV32IA-NEXT:    mv a3, a5
14921; RV32IA-NEXT:    bnez a0, .LBB204_1
14922; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14923; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14924; RV32IA-NEXT:    mv a2, s2
14925; RV32IA-NEXT:    mv a3, s1
14926; RV32IA-NEXT:    j .LBB204_1
14927; RV32IA-NEXT:  .LBB204_7: # %atomicrmw.end
14928; RV32IA-NEXT:    mv a0, a4
14929; RV32IA-NEXT:    mv a1, a5
14930; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14931; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14932; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14933; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14934; RV32IA-NEXT:    addi sp, sp, 32
14935; RV32IA-NEXT:    ret
14936;
14937; RV64I-LABEL: atomicrmw_max_i64_seq_cst:
14938; RV64I:       # %bb.0:
14939; RV64I-NEXT:    addi sp, sp, -32
14940; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14941; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14942; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14943; RV64I-NEXT:    mv s0, a0
14944; RV64I-NEXT:    ld a3, 0(a0)
14945; RV64I-NEXT:    mv s1, a1
14946; RV64I-NEXT:    j .LBB204_2
14947; RV64I-NEXT:  .LBB204_1: # %atomicrmw.start
14948; RV64I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14949; RV64I-NEXT:    sd a3, 0(sp)
14950; RV64I-NEXT:    mv a1, sp
14951; RV64I-NEXT:    li a3, 5
14952; RV64I-NEXT:    li a4, 5
14953; RV64I-NEXT:    mv a0, s0
14954; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14955; RV64I-NEXT:    ld a3, 0(sp)
14956; RV64I-NEXT:    bnez a0, .LBB204_4
14957; RV64I-NEXT:  .LBB204_2: # %atomicrmw.start
14958; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14959; RV64I-NEXT:    mv a2, a3
14960; RV64I-NEXT:    blt s1, a3, .LBB204_1
14961; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14962; RV64I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14963; RV64I-NEXT:    mv a2, s1
14964; RV64I-NEXT:    j .LBB204_1
14965; RV64I-NEXT:  .LBB204_4: # %atomicrmw.end
14966; RV64I-NEXT:    mv a0, a3
14967; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14968; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14969; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14970; RV64I-NEXT:    addi sp, sp, 32
14971; RV64I-NEXT:    ret
14972;
14973; RV64IA-LABEL: atomicrmw_max_i64_seq_cst:
14974; RV64IA:       # %bb.0:
14975; RV64IA-NEXT:    amomax.d.aqrl a0, a1, (a0)
14976; RV64IA-NEXT:    ret
14977  %1 = atomicrmw max i64* %a, i64 %b seq_cst
14978  ret i64 %1
14979}
14980
14981define i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind {
14982; RV32I-LABEL: atomicrmw_min_i64_monotonic:
14983; RV32I:       # %bb.0:
14984; RV32I-NEXT:    addi sp, sp, -32
14985; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14986; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14987; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14988; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14989; RV32I-NEXT:    mv s0, a0
14990; RV32I-NEXT:    lw a5, 4(a0)
14991; RV32I-NEXT:    lw a4, 0(a0)
14992; RV32I-NEXT:    mv s1, a2
14993; RV32I-NEXT:    mv s2, a1
14994; RV32I-NEXT:    j .LBB205_2
14995; RV32I-NEXT:  .LBB205_1: # %atomicrmw.start
14996; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
14997; RV32I-NEXT:    sw a4, 8(sp)
14998; RV32I-NEXT:    sw a5, 12(sp)
14999; RV32I-NEXT:    addi a1, sp, 8
15000; RV32I-NEXT:    mv a0, s0
15001; RV32I-NEXT:    li a4, 0
15002; RV32I-NEXT:    li a5, 0
15003; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15004; RV32I-NEXT:    lw a5, 12(sp)
15005; RV32I-NEXT:    lw a4, 8(sp)
15006; RV32I-NEXT:    bnez a0, .LBB205_7
15007; RV32I-NEXT:  .LBB205_2: # %atomicrmw.start
15008; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15009; RV32I-NEXT:    beq a5, s1, .LBB205_4
15010; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15011; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15012; RV32I-NEXT:    slt a0, s1, a5
15013; RV32I-NEXT:    j .LBB205_5
15014; RV32I-NEXT:  .LBB205_4: # in Loop: Header=BB205_2 Depth=1
15015; RV32I-NEXT:    sltu a0, s2, a4
15016; RV32I-NEXT:  .LBB205_5: # %atomicrmw.start
15017; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15018; RV32I-NEXT:    xori a0, a0, 1
15019; RV32I-NEXT:    mv a2, a4
15020; RV32I-NEXT:    mv a3, a5
15021; RV32I-NEXT:    bnez a0, .LBB205_1
15022; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15023; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15024; RV32I-NEXT:    mv a2, s2
15025; RV32I-NEXT:    mv a3, s1
15026; RV32I-NEXT:    j .LBB205_1
15027; RV32I-NEXT:  .LBB205_7: # %atomicrmw.end
15028; RV32I-NEXT:    mv a0, a4
15029; RV32I-NEXT:    mv a1, a5
15030; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15031; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15032; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15033; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15034; RV32I-NEXT:    addi sp, sp, 32
15035; RV32I-NEXT:    ret
15036;
15037; RV32IA-LABEL: atomicrmw_min_i64_monotonic:
15038; RV32IA:       # %bb.0:
15039; RV32IA-NEXT:    addi sp, sp, -32
15040; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15041; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15042; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15043; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15044; RV32IA-NEXT:    mv s0, a0
15045; RV32IA-NEXT:    lw a5, 4(a0)
15046; RV32IA-NEXT:    lw a4, 0(a0)
15047; RV32IA-NEXT:    mv s1, a2
15048; RV32IA-NEXT:    mv s2, a1
15049; RV32IA-NEXT:    j .LBB205_2
15050; RV32IA-NEXT:  .LBB205_1: # %atomicrmw.start
15051; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15052; RV32IA-NEXT:    sw a4, 8(sp)
15053; RV32IA-NEXT:    sw a5, 12(sp)
15054; RV32IA-NEXT:    addi a1, sp, 8
15055; RV32IA-NEXT:    mv a0, s0
15056; RV32IA-NEXT:    li a4, 0
15057; RV32IA-NEXT:    li a5, 0
15058; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15059; RV32IA-NEXT:    lw a5, 12(sp)
15060; RV32IA-NEXT:    lw a4, 8(sp)
15061; RV32IA-NEXT:    bnez a0, .LBB205_7
15062; RV32IA-NEXT:  .LBB205_2: # %atomicrmw.start
15063; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15064; RV32IA-NEXT:    beq a5, s1, .LBB205_4
15065; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15066; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15067; RV32IA-NEXT:    slt a0, s1, a5
15068; RV32IA-NEXT:    j .LBB205_5
15069; RV32IA-NEXT:  .LBB205_4: # in Loop: Header=BB205_2 Depth=1
15070; RV32IA-NEXT:    sltu a0, s2, a4
15071; RV32IA-NEXT:  .LBB205_5: # %atomicrmw.start
15072; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15073; RV32IA-NEXT:    xori a0, a0, 1
15074; RV32IA-NEXT:    mv a2, a4
15075; RV32IA-NEXT:    mv a3, a5
15076; RV32IA-NEXT:    bnez a0, .LBB205_1
15077; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15078; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15079; RV32IA-NEXT:    mv a2, s2
15080; RV32IA-NEXT:    mv a3, s1
15081; RV32IA-NEXT:    j .LBB205_1
15082; RV32IA-NEXT:  .LBB205_7: # %atomicrmw.end
15083; RV32IA-NEXT:    mv a0, a4
15084; RV32IA-NEXT:    mv a1, a5
15085; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15086; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15087; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15088; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15089; RV32IA-NEXT:    addi sp, sp, 32
15090; RV32IA-NEXT:    ret
15091;
15092; RV64I-LABEL: atomicrmw_min_i64_monotonic:
15093; RV64I:       # %bb.0:
15094; RV64I-NEXT:    addi sp, sp, -32
15095; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15096; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15097; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15098; RV64I-NEXT:    mv s0, a0
15099; RV64I-NEXT:    ld a3, 0(a0)
15100; RV64I-NEXT:    mv s1, a1
15101; RV64I-NEXT:    j .LBB205_2
15102; RV64I-NEXT:  .LBB205_1: # %atomicrmw.start
15103; RV64I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15104; RV64I-NEXT:    sd a3, 0(sp)
15105; RV64I-NEXT:    mv a1, sp
15106; RV64I-NEXT:    mv a0, s0
15107; RV64I-NEXT:    li a3, 0
15108; RV64I-NEXT:    li a4, 0
15109; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15110; RV64I-NEXT:    ld a3, 0(sp)
15111; RV64I-NEXT:    bnez a0, .LBB205_4
15112; RV64I-NEXT:  .LBB205_2: # %atomicrmw.start
15113; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15114; RV64I-NEXT:    mv a2, a3
15115; RV64I-NEXT:    bge s1, a3, .LBB205_1
15116; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15117; RV64I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15118; RV64I-NEXT:    mv a2, s1
15119; RV64I-NEXT:    j .LBB205_1
15120; RV64I-NEXT:  .LBB205_4: # %atomicrmw.end
15121; RV64I-NEXT:    mv a0, a3
15122; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15123; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15124; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15125; RV64I-NEXT:    addi sp, sp, 32
15126; RV64I-NEXT:    ret
15127;
15128; RV64IA-LABEL: atomicrmw_min_i64_monotonic:
15129; RV64IA:       # %bb.0:
15130; RV64IA-NEXT:    amomin.d a0, a1, (a0)
15131; RV64IA-NEXT:    ret
15132  %1 = atomicrmw min i64* %a, i64 %b monotonic
15133  ret i64 %1
15134}
15135
15136define i64 @atomicrmw_min_i64_acquire(i64 *%a, i64 %b) nounwind {
15137; RV32I-LABEL: atomicrmw_min_i64_acquire:
15138; RV32I:       # %bb.0:
15139; RV32I-NEXT:    addi sp, sp, -32
15140; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15141; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15142; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15143; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15144; RV32I-NEXT:    mv s0, a0
15145; RV32I-NEXT:    lw a5, 4(a0)
15146; RV32I-NEXT:    lw a4, 0(a0)
15147; RV32I-NEXT:    mv s1, a2
15148; RV32I-NEXT:    mv s2, a1
15149; RV32I-NEXT:    j .LBB206_2
15150; RV32I-NEXT:  .LBB206_1: # %atomicrmw.start
15151; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15152; RV32I-NEXT:    sw a4, 8(sp)
15153; RV32I-NEXT:    sw a5, 12(sp)
15154; RV32I-NEXT:    addi a1, sp, 8
15155; RV32I-NEXT:    li a4, 2
15156; RV32I-NEXT:    li a5, 2
15157; RV32I-NEXT:    mv a0, s0
15158; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15159; RV32I-NEXT:    lw a5, 12(sp)
15160; RV32I-NEXT:    lw a4, 8(sp)
15161; RV32I-NEXT:    bnez a0, .LBB206_7
15162; RV32I-NEXT:  .LBB206_2: # %atomicrmw.start
15163; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15164; RV32I-NEXT:    beq a5, s1, .LBB206_4
15165; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15166; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15167; RV32I-NEXT:    slt a0, s1, a5
15168; RV32I-NEXT:    j .LBB206_5
15169; RV32I-NEXT:  .LBB206_4: # in Loop: Header=BB206_2 Depth=1
15170; RV32I-NEXT:    sltu a0, s2, a4
15171; RV32I-NEXT:  .LBB206_5: # %atomicrmw.start
15172; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15173; RV32I-NEXT:    xori a0, a0, 1
15174; RV32I-NEXT:    mv a2, a4
15175; RV32I-NEXT:    mv a3, a5
15176; RV32I-NEXT:    bnez a0, .LBB206_1
15177; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15178; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15179; RV32I-NEXT:    mv a2, s2
15180; RV32I-NEXT:    mv a3, s1
15181; RV32I-NEXT:    j .LBB206_1
15182; RV32I-NEXT:  .LBB206_7: # %atomicrmw.end
15183; RV32I-NEXT:    mv a0, a4
15184; RV32I-NEXT:    mv a1, a5
15185; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15186; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15187; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15188; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15189; RV32I-NEXT:    addi sp, sp, 32
15190; RV32I-NEXT:    ret
15191;
15192; RV32IA-LABEL: atomicrmw_min_i64_acquire:
15193; RV32IA:       # %bb.0:
15194; RV32IA-NEXT:    addi sp, sp, -32
15195; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15196; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15197; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15198; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15199; RV32IA-NEXT:    mv s0, a0
15200; RV32IA-NEXT:    lw a5, 4(a0)
15201; RV32IA-NEXT:    lw a4, 0(a0)
15202; RV32IA-NEXT:    mv s1, a2
15203; RV32IA-NEXT:    mv s2, a1
15204; RV32IA-NEXT:    j .LBB206_2
15205; RV32IA-NEXT:  .LBB206_1: # %atomicrmw.start
15206; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15207; RV32IA-NEXT:    sw a4, 8(sp)
15208; RV32IA-NEXT:    sw a5, 12(sp)
15209; RV32IA-NEXT:    addi a1, sp, 8
15210; RV32IA-NEXT:    li a4, 2
15211; RV32IA-NEXT:    li a5, 2
15212; RV32IA-NEXT:    mv a0, s0
15213; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15214; RV32IA-NEXT:    lw a5, 12(sp)
15215; RV32IA-NEXT:    lw a4, 8(sp)
15216; RV32IA-NEXT:    bnez a0, .LBB206_7
15217; RV32IA-NEXT:  .LBB206_2: # %atomicrmw.start
15218; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15219; RV32IA-NEXT:    beq a5, s1, .LBB206_4
15220; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15221; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15222; RV32IA-NEXT:    slt a0, s1, a5
15223; RV32IA-NEXT:    j .LBB206_5
15224; RV32IA-NEXT:  .LBB206_4: # in Loop: Header=BB206_2 Depth=1
15225; RV32IA-NEXT:    sltu a0, s2, a4
15226; RV32IA-NEXT:  .LBB206_5: # %atomicrmw.start
15227; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15228; RV32IA-NEXT:    xori a0, a0, 1
15229; RV32IA-NEXT:    mv a2, a4
15230; RV32IA-NEXT:    mv a3, a5
15231; RV32IA-NEXT:    bnez a0, .LBB206_1
15232; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15233; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15234; RV32IA-NEXT:    mv a2, s2
15235; RV32IA-NEXT:    mv a3, s1
15236; RV32IA-NEXT:    j .LBB206_1
15237; RV32IA-NEXT:  .LBB206_7: # %atomicrmw.end
15238; RV32IA-NEXT:    mv a0, a4
15239; RV32IA-NEXT:    mv a1, a5
15240; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15241; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15242; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15243; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15244; RV32IA-NEXT:    addi sp, sp, 32
15245; RV32IA-NEXT:    ret
15246;
15247; RV64I-LABEL: atomicrmw_min_i64_acquire:
15248; RV64I:       # %bb.0:
15249; RV64I-NEXT:    addi sp, sp, -32
15250; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15251; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15252; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15253; RV64I-NEXT:    mv s0, a0
15254; RV64I-NEXT:    ld a3, 0(a0)
15255; RV64I-NEXT:    mv s1, a1
15256; RV64I-NEXT:    j .LBB206_2
15257; RV64I-NEXT:  .LBB206_1: # %atomicrmw.start
15258; RV64I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15259; RV64I-NEXT:    sd a3, 0(sp)
15260; RV64I-NEXT:    mv a1, sp
15261; RV64I-NEXT:    li a3, 2
15262; RV64I-NEXT:    li a4, 2
15263; RV64I-NEXT:    mv a0, s0
15264; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15265; RV64I-NEXT:    ld a3, 0(sp)
15266; RV64I-NEXT:    bnez a0, .LBB206_4
15267; RV64I-NEXT:  .LBB206_2: # %atomicrmw.start
15268; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15269; RV64I-NEXT:    mv a2, a3
15270; RV64I-NEXT:    bge s1, a3, .LBB206_1
15271; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15272; RV64I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15273; RV64I-NEXT:    mv a2, s1
15274; RV64I-NEXT:    j .LBB206_1
15275; RV64I-NEXT:  .LBB206_4: # %atomicrmw.end
15276; RV64I-NEXT:    mv a0, a3
15277; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15278; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15279; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15280; RV64I-NEXT:    addi sp, sp, 32
15281; RV64I-NEXT:    ret
15282;
15283; RV64IA-LABEL: atomicrmw_min_i64_acquire:
15284; RV64IA:       # %bb.0:
15285; RV64IA-NEXT:    amomin.d.aq a0, a1, (a0)
15286; RV64IA-NEXT:    ret
15287  %1 = atomicrmw min i64* %a, i64 %b acquire
15288  ret i64 %1
15289}
15290
15291define i64 @atomicrmw_min_i64_release(i64 *%a, i64 %b) nounwind {
15292; RV32I-LABEL: atomicrmw_min_i64_release:
15293; RV32I:       # %bb.0:
15294; RV32I-NEXT:    addi sp, sp, -32
15295; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15296; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15297; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15298; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15299; RV32I-NEXT:    mv s0, a0
15300; RV32I-NEXT:    lw a5, 4(a0)
15301; RV32I-NEXT:    lw a4, 0(a0)
15302; RV32I-NEXT:    mv s1, a2
15303; RV32I-NEXT:    mv s2, a1
15304; RV32I-NEXT:    j .LBB207_2
15305; RV32I-NEXT:  .LBB207_1: # %atomicrmw.start
15306; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15307; RV32I-NEXT:    sw a4, 8(sp)
15308; RV32I-NEXT:    sw a5, 12(sp)
15309; RV32I-NEXT:    addi a1, sp, 8
15310; RV32I-NEXT:    li a4, 3
15311; RV32I-NEXT:    mv a0, s0
15312; RV32I-NEXT:    li a5, 0
15313; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15314; RV32I-NEXT:    lw a5, 12(sp)
15315; RV32I-NEXT:    lw a4, 8(sp)
15316; RV32I-NEXT:    bnez a0, .LBB207_7
15317; RV32I-NEXT:  .LBB207_2: # %atomicrmw.start
15318; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15319; RV32I-NEXT:    beq a5, s1, .LBB207_4
15320; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15321; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15322; RV32I-NEXT:    slt a0, s1, a5
15323; RV32I-NEXT:    j .LBB207_5
15324; RV32I-NEXT:  .LBB207_4: # in Loop: Header=BB207_2 Depth=1
15325; RV32I-NEXT:    sltu a0, s2, a4
15326; RV32I-NEXT:  .LBB207_5: # %atomicrmw.start
15327; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15328; RV32I-NEXT:    xori a0, a0, 1
15329; RV32I-NEXT:    mv a2, a4
15330; RV32I-NEXT:    mv a3, a5
15331; RV32I-NEXT:    bnez a0, .LBB207_1
15332; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15333; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15334; RV32I-NEXT:    mv a2, s2
15335; RV32I-NEXT:    mv a3, s1
15336; RV32I-NEXT:    j .LBB207_1
15337; RV32I-NEXT:  .LBB207_7: # %atomicrmw.end
15338; RV32I-NEXT:    mv a0, a4
15339; RV32I-NEXT:    mv a1, a5
15340; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15341; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15342; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15343; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15344; RV32I-NEXT:    addi sp, sp, 32
15345; RV32I-NEXT:    ret
15346;
15347; RV32IA-LABEL: atomicrmw_min_i64_release:
15348; RV32IA:       # %bb.0:
15349; RV32IA-NEXT:    addi sp, sp, -32
15350; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15351; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15352; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15353; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15354; RV32IA-NEXT:    mv s0, a0
15355; RV32IA-NEXT:    lw a5, 4(a0)
15356; RV32IA-NEXT:    lw a4, 0(a0)
15357; RV32IA-NEXT:    mv s1, a2
15358; RV32IA-NEXT:    mv s2, a1
15359; RV32IA-NEXT:    j .LBB207_2
15360; RV32IA-NEXT:  .LBB207_1: # %atomicrmw.start
15361; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15362; RV32IA-NEXT:    sw a4, 8(sp)
15363; RV32IA-NEXT:    sw a5, 12(sp)
15364; RV32IA-NEXT:    addi a1, sp, 8
15365; RV32IA-NEXT:    li a4, 3
15366; RV32IA-NEXT:    mv a0, s0
15367; RV32IA-NEXT:    li a5, 0
15368; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15369; RV32IA-NEXT:    lw a5, 12(sp)
15370; RV32IA-NEXT:    lw a4, 8(sp)
15371; RV32IA-NEXT:    bnez a0, .LBB207_7
15372; RV32IA-NEXT:  .LBB207_2: # %atomicrmw.start
15373; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15374; RV32IA-NEXT:    beq a5, s1, .LBB207_4
15375; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15376; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15377; RV32IA-NEXT:    slt a0, s1, a5
15378; RV32IA-NEXT:    j .LBB207_5
15379; RV32IA-NEXT:  .LBB207_4: # in Loop: Header=BB207_2 Depth=1
15380; RV32IA-NEXT:    sltu a0, s2, a4
15381; RV32IA-NEXT:  .LBB207_5: # %atomicrmw.start
15382; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15383; RV32IA-NEXT:    xori a0, a0, 1
15384; RV32IA-NEXT:    mv a2, a4
15385; RV32IA-NEXT:    mv a3, a5
15386; RV32IA-NEXT:    bnez a0, .LBB207_1
15387; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15388; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15389; RV32IA-NEXT:    mv a2, s2
15390; RV32IA-NEXT:    mv a3, s1
15391; RV32IA-NEXT:    j .LBB207_1
15392; RV32IA-NEXT:  .LBB207_7: # %atomicrmw.end
15393; RV32IA-NEXT:    mv a0, a4
15394; RV32IA-NEXT:    mv a1, a5
15395; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15396; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15397; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15398; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15399; RV32IA-NEXT:    addi sp, sp, 32
15400; RV32IA-NEXT:    ret
15401;
15402; RV64I-LABEL: atomicrmw_min_i64_release:
15403; RV64I:       # %bb.0:
15404; RV64I-NEXT:    addi sp, sp, -32
15405; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15406; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15407; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15408; RV64I-NEXT:    mv s0, a0
15409; RV64I-NEXT:    ld a3, 0(a0)
15410; RV64I-NEXT:    mv s1, a1
15411; RV64I-NEXT:    j .LBB207_2
15412; RV64I-NEXT:  .LBB207_1: # %atomicrmw.start
15413; RV64I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15414; RV64I-NEXT:    sd a3, 0(sp)
15415; RV64I-NEXT:    mv a1, sp
15416; RV64I-NEXT:    li a3, 3
15417; RV64I-NEXT:    mv a0, s0
15418; RV64I-NEXT:    li a4, 0
15419; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15420; RV64I-NEXT:    ld a3, 0(sp)
15421; RV64I-NEXT:    bnez a0, .LBB207_4
15422; RV64I-NEXT:  .LBB207_2: # %atomicrmw.start
15423; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15424; RV64I-NEXT:    mv a2, a3
15425; RV64I-NEXT:    bge s1, a3, .LBB207_1
15426; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15427; RV64I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15428; RV64I-NEXT:    mv a2, s1
15429; RV64I-NEXT:    j .LBB207_1
15430; RV64I-NEXT:  .LBB207_4: # %atomicrmw.end
15431; RV64I-NEXT:    mv a0, a3
15432; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15433; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15434; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15435; RV64I-NEXT:    addi sp, sp, 32
15436; RV64I-NEXT:    ret
15437;
15438; RV64IA-LABEL: atomicrmw_min_i64_release:
15439; RV64IA:       # %bb.0:
15440; RV64IA-NEXT:    amomin.d.rl a0, a1, (a0)
15441; RV64IA-NEXT:    ret
15442  %1 = atomicrmw min i64* %a, i64 %b release
15443  ret i64 %1
15444}
15445
15446define i64 @atomicrmw_min_i64_acq_rel(i64 *%a, i64 %b) nounwind {
15447; RV32I-LABEL: atomicrmw_min_i64_acq_rel:
15448; RV32I:       # %bb.0:
15449; RV32I-NEXT:    addi sp, sp, -32
15450; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15451; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15452; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15453; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15454; RV32I-NEXT:    mv s0, a0
15455; RV32I-NEXT:    lw a5, 4(a0)
15456; RV32I-NEXT:    lw a4, 0(a0)
15457; RV32I-NEXT:    mv s1, a2
15458; RV32I-NEXT:    mv s2, a1
15459; RV32I-NEXT:    j .LBB208_2
15460; RV32I-NEXT:  .LBB208_1: # %atomicrmw.start
15461; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15462; RV32I-NEXT:    sw a4, 8(sp)
15463; RV32I-NEXT:    sw a5, 12(sp)
15464; RV32I-NEXT:    addi a1, sp, 8
15465; RV32I-NEXT:    li a4, 4
15466; RV32I-NEXT:    li a5, 2
15467; RV32I-NEXT:    mv a0, s0
15468; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15469; RV32I-NEXT:    lw a5, 12(sp)
15470; RV32I-NEXT:    lw a4, 8(sp)
15471; RV32I-NEXT:    bnez a0, .LBB208_7
15472; RV32I-NEXT:  .LBB208_2: # %atomicrmw.start
15473; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15474; RV32I-NEXT:    beq a5, s1, .LBB208_4
15475; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15476; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15477; RV32I-NEXT:    slt a0, s1, a5
15478; RV32I-NEXT:    j .LBB208_5
15479; RV32I-NEXT:  .LBB208_4: # in Loop: Header=BB208_2 Depth=1
15480; RV32I-NEXT:    sltu a0, s2, a4
15481; RV32I-NEXT:  .LBB208_5: # %atomicrmw.start
15482; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15483; RV32I-NEXT:    xori a0, a0, 1
15484; RV32I-NEXT:    mv a2, a4
15485; RV32I-NEXT:    mv a3, a5
15486; RV32I-NEXT:    bnez a0, .LBB208_1
15487; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15488; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15489; RV32I-NEXT:    mv a2, s2
15490; RV32I-NEXT:    mv a3, s1
15491; RV32I-NEXT:    j .LBB208_1
15492; RV32I-NEXT:  .LBB208_7: # %atomicrmw.end
15493; RV32I-NEXT:    mv a0, a4
15494; RV32I-NEXT:    mv a1, a5
15495; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15496; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15497; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15498; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15499; RV32I-NEXT:    addi sp, sp, 32
15500; RV32I-NEXT:    ret
15501;
15502; RV32IA-LABEL: atomicrmw_min_i64_acq_rel:
15503; RV32IA:       # %bb.0:
15504; RV32IA-NEXT:    addi sp, sp, -32
15505; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15506; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15507; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15508; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15509; RV32IA-NEXT:    mv s0, a0
15510; RV32IA-NEXT:    lw a5, 4(a0)
15511; RV32IA-NEXT:    lw a4, 0(a0)
15512; RV32IA-NEXT:    mv s1, a2
15513; RV32IA-NEXT:    mv s2, a1
15514; RV32IA-NEXT:    j .LBB208_2
15515; RV32IA-NEXT:  .LBB208_1: # %atomicrmw.start
15516; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15517; RV32IA-NEXT:    sw a4, 8(sp)
15518; RV32IA-NEXT:    sw a5, 12(sp)
15519; RV32IA-NEXT:    addi a1, sp, 8
15520; RV32IA-NEXT:    li a4, 4
15521; RV32IA-NEXT:    li a5, 2
15522; RV32IA-NEXT:    mv a0, s0
15523; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15524; RV32IA-NEXT:    lw a5, 12(sp)
15525; RV32IA-NEXT:    lw a4, 8(sp)
15526; RV32IA-NEXT:    bnez a0, .LBB208_7
15527; RV32IA-NEXT:  .LBB208_2: # %atomicrmw.start
15528; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15529; RV32IA-NEXT:    beq a5, s1, .LBB208_4
15530; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15531; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15532; RV32IA-NEXT:    slt a0, s1, a5
15533; RV32IA-NEXT:    j .LBB208_5
15534; RV32IA-NEXT:  .LBB208_4: # in Loop: Header=BB208_2 Depth=1
15535; RV32IA-NEXT:    sltu a0, s2, a4
15536; RV32IA-NEXT:  .LBB208_5: # %atomicrmw.start
15537; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15538; RV32IA-NEXT:    xori a0, a0, 1
15539; RV32IA-NEXT:    mv a2, a4
15540; RV32IA-NEXT:    mv a3, a5
15541; RV32IA-NEXT:    bnez a0, .LBB208_1
15542; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15543; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15544; RV32IA-NEXT:    mv a2, s2
15545; RV32IA-NEXT:    mv a3, s1
15546; RV32IA-NEXT:    j .LBB208_1
15547; RV32IA-NEXT:  .LBB208_7: # %atomicrmw.end
15548; RV32IA-NEXT:    mv a0, a4
15549; RV32IA-NEXT:    mv a1, a5
15550; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15551; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15552; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15553; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15554; RV32IA-NEXT:    addi sp, sp, 32
15555; RV32IA-NEXT:    ret
15556;
15557; RV64I-LABEL: atomicrmw_min_i64_acq_rel:
15558; RV64I:       # %bb.0:
15559; RV64I-NEXT:    addi sp, sp, -32
15560; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15561; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15562; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15563; RV64I-NEXT:    mv s0, a0
15564; RV64I-NEXT:    ld a3, 0(a0)
15565; RV64I-NEXT:    mv s1, a1
15566; RV64I-NEXT:    j .LBB208_2
15567; RV64I-NEXT:  .LBB208_1: # %atomicrmw.start
15568; RV64I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15569; RV64I-NEXT:    sd a3, 0(sp)
15570; RV64I-NEXT:    mv a1, sp
15571; RV64I-NEXT:    li a3, 4
15572; RV64I-NEXT:    li a4, 2
15573; RV64I-NEXT:    mv a0, s0
15574; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15575; RV64I-NEXT:    ld a3, 0(sp)
15576; RV64I-NEXT:    bnez a0, .LBB208_4
15577; RV64I-NEXT:  .LBB208_2: # %atomicrmw.start
15578; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15579; RV64I-NEXT:    mv a2, a3
15580; RV64I-NEXT:    bge s1, a3, .LBB208_1
15581; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15582; RV64I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15583; RV64I-NEXT:    mv a2, s1
15584; RV64I-NEXT:    j .LBB208_1
15585; RV64I-NEXT:  .LBB208_4: # %atomicrmw.end
15586; RV64I-NEXT:    mv a0, a3
15587; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15588; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15589; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15590; RV64I-NEXT:    addi sp, sp, 32
15591; RV64I-NEXT:    ret
15592;
15593; RV64IA-LABEL: atomicrmw_min_i64_acq_rel:
15594; RV64IA:       # %bb.0:
15595; RV64IA-NEXT:    amomin.d.aqrl a0, a1, (a0)
15596; RV64IA-NEXT:    ret
15597  %1 = atomicrmw min i64* %a, i64 %b acq_rel
15598  ret i64 %1
15599}
15600
15601define i64 @atomicrmw_min_i64_seq_cst(i64 *%a, i64 %b) nounwind {
15602; RV32I-LABEL: atomicrmw_min_i64_seq_cst:
15603; RV32I:       # %bb.0:
15604; RV32I-NEXT:    addi sp, sp, -32
15605; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15606; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15607; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15608; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15609; RV32I-NEXT:    mv s0, a0
15610; RV32I-NEXT:    lw a5, 4(a0)
15611; RV32I-NEXT:    lw a4, 0(a0)
15612; RV32I-NEXT:    mv s1, a2
15613; RV32I-NEXT:    mv s2, a1
15614; RV32I-NEXT:    j .LBB209_2
15615; RV32I-NEXT:  .LBB209_1: # %atomicrmw.start
15616; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15617; RV32I-NEXT:    sw a4, 8(sp)
15618; RV32I-NEXT:    sw a5, 12(sp)
15619; RV32I-NEXT:    addi a1, sp, 8
15620; RV32I-NEXT:    li a4, 5
15621; RV32I-NEXT:    li a5, 5
15622; RV32I-NEXT:    mv a0, s0
15623; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15624; RV32I-NEXT:    lw a5, 12(sp)
15625; RV32I-NEXT:    lw a4, 8(sp)
15626; RV32I-NEXT:    bnez a0, .LBB209_7
15627; RV32I-NEXT:  .LBB209_2: # %atomicrmw.start
15628; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15629; RV32I-NEXT:    beq a5, s1, .LBB209_4
15630; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15631; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15632; RV32I-NEXT:    slt a0, s1, a5
15633; RV32I-NEXT:    j .LBB209_5
15634; RV32I-NEXT:  .LBB209_4: # in Loop: Header=BB209_2 Depth=1
15635; RV32I-NEXT:    sltu a0, s2, a4
15636; RV32I-NEXT:  .LBB209_5: # %atomicrmw.start
15637; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15638; RV32I-NEXT:    xori a0, a0, 1
15639; RV32I-NEXT:    mv a2, a4
15640; RV32I-NEXT:    mv a3, a5
15641; RV32I-NEXT:    bnez a0, .LBB209_1
15642; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15643; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15644; RV32I-NEXT:    mv a2, s2
15645; RV32I-NEXT:    mv a3, s1
15646; RV32I-NEXT:    j .LBB209_1
15647; RV32I-NEXT:  .LBB209_7: # %atomicrmw.end
15648; RV32I-NEXT:    mv a0, a4
15649; RV32I-NEXT:    mv a1, a5
15650; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15651; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15652; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15653; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15654; RV32I-NEXT:    addi sp, sp, 32
15655; RV32I-NEXT:    ret
15656;
15657; RV32IA-LABEL: atomicrmw_min_i64_seq_cst:
15658; RV32IA:       # %bb.0:
15659; RV32IA-NEXT:    addi sp, sp, -32
15660; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15661; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15662; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15663; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15664; RV32IA-NEXT:    mv s0, a0
15665; RV32IA-NEXT:    lw a5, 4(a0)
15666; RV32IA-NEXT:    lw a4, 0(a0)
15667; RV32IA-NEXT:    mv s1, a2
15668; RV32IA-NEXT:    mv s2, a1
15669; RV32IA-NEXT:    j .LBB209_2
15670; RV32IA-NEXT:  .LBB209_1: # %atomicrmw.start
15671; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15672; RV32IA-NEXT:    sw a4, 8(sp)
15673; RV32IA-NEXT:    sw a5, 12(sp)
15674; RV32IA-NEXT:    addi a1, sp, 8
15675; RV32IA-NEXT:    li a4, 5
15676; RV32IA-NEXT:    li a5, 5
15677; RV32IA-NEXT:    mv a0, s0
15678; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15679; RV32IA-NEXT:    lw a5, 12(sp)
15680; RV32IA-NEXT:    lw a4, 8(sp)
15681; RV32IA-NEXT:    bnez a0, .LBB209_7
15682; RV32IA-NEXT:  .LBB209_2: # %atomicrmw.start
15683; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15684; RV32IA-NEXT:    beq a5, s1, .LBB209_4
15685; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15686; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15687; RV32IA-NEXT:    slt a0, s1, a5
15688; RV32IA-NEXT:    j .LBB209_5
15689; RV32IA-NEXT:  .LBB209_4: # in Loop: Header=BB209_2 Depth=1
15690; RV32IA-NEXT:    sltu a0, s2, a4
15691; RV32IA-NEXT:  .LBB209_5: # %atomicrmw.start
15692; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15693; RV32IA-NEXT:    xori a0, a0, 1
15694; RV32IA-NEXT:    mv a2, a4
15695; RV32IA-NEXT:    mv a3, a5
15696; RV32IA-NEXT:    bnez a0, .LBB209_1
15697; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15698; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15699; RV32IA-NEXT:    mv a2, s2
15700; RV32IA-NEXT:    mv a3, s1
15701; RV32IA-NEXT:    j .LBB209_1
15702; RV32IA-NEXT:  .LBB209_7: # %atomicrmw.end
15703; RV32IA-NEXT:    mv a0, a4
15704; RV32IA-NEXT:    mv a1, a5
15705; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15706; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15707; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15708; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15709; RV32IA-NEXT:    addi sp, sp, 32
15710; RV32IA-NEXT:    ret
15711;
15712; RV64I-LABEL: atomicrmw_min_i64_seq_cst:
15713; RV64I:       # %bb.0:
15714; RV64I-NEXT:    addi sp, sp, -32
15715; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15716; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15717; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15718; RV64I-NEXT:    mv s0, a0
15719; RV64I-NEXT:    ld a3, 0(a0)
15720; RV64I-NEXT:    mv s1, a1
15721; RV64I-NEXT:    j .LBB209_2
15722; RV64I-NEXT:  .LBB209_1: # %atomicrmw.start
15723; RV64I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15724; RV64I-NEXT:    sd a3, 0(sp)
15725; RV64I-NEXT:    mv a1, sp
15726; RV64I-NEXT:    li a3, 5
15727; RV64I-NEXT:    li a4, 5
15728; RV64I-NEXT:    mv a0, s0
15729; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15730; RV64I-NEXT:    ld a3, 0(sp)
15731; RV64I-NEXT:    bnez a0, .LBB209_4
15732; RV64I-NEXT:  .LBB209_2: # %atomicrmw.start
15733; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15734; RV64I-NEXT:    mv a2, a3
15735; RV64I-NEXT:    bge s1, a3, .LBB209_1
15736; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15737; RV64I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15738; RV64I-NEXT:    mv a2, s1
15739; RV64I-NEXT:    j .LBB209_1
15740; RV64I-NEXT:  .LBB209_4: # %atomicrmw.end
15741; RV64I-NEXT:    mv a0, a3
15742; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15743; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15744; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15745; RV64I-NEXT:    addi sp, sp, 32
15746; RV64I-NEXT:    ret
15747;
15748; RV64IA-LABEL: atomicrmw_min_i64_seq_cst:
15749; RV64IA:       # %bb.0:
15750; RV64IA-NEXT:    amomin.d.aqrl a0, a1, (a0)
15751; RV64IA-NEXT:    ret
15752  %1 = atomicrmw min i64* %a, i64 %b seq_cst
15753  ret i64 %1
15754}
15755
15756define i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind {
15757; RV32I-LABEL: atomicrmw_umax_i64_monotonic:
15758; RV32I:       # %bb.0:
15759; RV32I-NEXT:    addi sp, sp, -32
15760; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15761; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15762; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15763; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15764; RV32I-NEXT:    mv s0, a0
15765; RV32I-NEXT:    lw a5, 4(a0)
15766; RV32I-NEXT:    lw a4, 0(a0)
15767; RV32I-NEXT:    mv s1, a2
15768; RV32I-NEXT:    mv s2, a1
15769; RV32I-NEXT:    j .LBB210_2
15770; RV32I-NEXT:  .LBB210_1: # %atomicrmw.start
15771; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15772; RV32I-NEXT:    sw a4, 8(sp)
15773; RV32I-NEXT:    sw a5, 12(sp)
15774; RV32I-NEXT:    addi a1, sp, 8
15775; RV32I-NEXT:    mv a0, s0
15776; RV32I-NEXT:    li a4, 0
15777; RV32I-NEXT:    li a5, 0
15778; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15779; RV32I-NEXT:    lw a5, 12(sp)
15780; RV32I-NEXT:    lw a4, 8(sp)
15781; RV32I-NEXT:    bnez a0, .LBB210_7
15782; RV32I-NEXT:  .LBB210_2: # %atomicrmw.start
15783; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15784; RV32I-NEXT:    beq a5, s1, .LBB210_4
15785; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15786; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15787; RV32I-NEXT:    sltu a0, s1, a5
15788; RV32I-NEXT:    j .LBB210_5
15789; RV32I-NEXT:  .LBB210_4: # in Loop: Header=BB210_2 Depth=1
15790; RV32I-NEXT:    sltu a0, s2, a4
15791; RV32I-NEXT:  .LBB210_5: # %atomicrmw.start
15792; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15793; RV32I-NEXT:    mv a2, a4
15794; RV32I-NEXT:    mv a3, a5
15795; RV32I-NEXT:    bnez a0, .LBB210_1
15796; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15797; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15798; RV32I-NEXT:    mv a2, s2
15799; RV32I-NEXT:    mv a3, s1
15800; RV32I-NEXT:    j .LBB210_1
15801; RV32I-NEXT:  .LBB210_7: # %atomicrmw.end
15802; RV32I-NEXT:    mv a0, a4
15803; RV32I-NEXT:    mv a1, a5
15804; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15805; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15806; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15807; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15808; RV32I-NEXT:    addi sp, sp, 32
15809; RV32I-NEXT:    ret
15810;
15811; RV32IA-LABEL: atomicrmw_umax_i64_monotonic:
15812; RV32IA:       # %bb.0:
15813; RV32IA-NEXT:    addi sp, sp, -32
15814; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15815; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15816; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15817; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15818; RV32IA-NEXT:    mv s0, a0
15819; RV32IA-NEXT:    lw a5, 4(a0)
15820; RV32IA-NEXT:    lw a4, 0(a0)
15821; RV32IA-NEXT:    mv s1, a2
15822; RV32IA-NEXT:    mv s2, a1
15823; RV32IA-NEXT:    j .LBB210_2
15824; RV32IA-NEXT:  .LBB210_1: # %atomicrmw.start
15825; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15826; RV32IA-NEXT:    sw a4, 8(sp)
15827; RV32IA-NEXT:    sw a5, 12(sp)
15828; RV32IA-NEXT:    addi a1, sp, 8
15829; RV32IA-NEXT:    mv a0, s0
15830; RV32IA-NEXT:    li a4, 0
15831; RV32IA-NEXT:    li a5, 0
15832; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15833; RV32IA-NEXT:    lw a5, 12(sp)
15834; RV32IA-NEXT:    lw a4, 8(sp)
15835; RV32IA-NEXT:    bnez a0, .LBB210_7
15836; RV32IA-NEXT:  .LBB210_2: # %atomicrmw.start
15837; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15838; RV32IA-NEXT:    beq a5, s1, .LBB210_4
15839; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15840; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15841; RV32IA-NEXT:    sltu a0, s1, a5
15842; RV32IA-NEXT:    j .LBB210_5
15843; RV32IA-NEXT:  .LBB210_4: # in Loop: Header=BB210_2 Depth=1
15844; RV32IA-NEXT:    sltu a0, s2, a4
15845; RV32IA-NEXT:  .LBB210_5: # %atomicrmw.start
15846; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15847; RV32IA-NEXT:    mv a2, a4
15848; RV32IA-NEXT:    mv a3, a5
15849; RV32IA-NEXT:    bnez a0, .LBB210_1
15850; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15851; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15852; RV32IA-NEXT:    mv a2, s2
15853; RV32IA-NEXT:    mv a3, s1
15854; RV32IA-NEXT:    j .LBB210_1
15855; RV32IA-NEXT:  .LBB210_7: # %atomicrmw.end
15856; RV32IA-NEXT:    mv a0, a4
15857; RV32IA-NEXT:    mv a1, a5
15858; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15859; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15860; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15861; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15862; RV32IA-NEXT:    addi sp, sp, 32
15863; RV32IA-NEXT:    ret
15864;
15865; RV64I-LABEL: atomicrmw_umax_i64_monotonic:
15866; RV64I:       # %bb.0:
15867; RV64I-NEXT:    addi sp, sp, -32
15868; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15869; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15870; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15871; RV64I-NEXT:    mv s0, a0
15872; RV64I-NEXT:    ld a3, 0(a0)
15873; RV64I-NEXT:    mv s1, a1
15874; RV64I-NEXT:    j .LBB210_2
15875; RV64I-NEXT:  .LBB210_1: # %atomicrmw.start
15876; RV64I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15877; RV64I-NEXT:    sd a3, 0(sp)
15878; RV64I-NEXT:    mv a1, sp
15879; RV64I-NEXT:    mv a0, s0
15880; RV64I-NEXT:    li a3, 0
15881; RV64I-NEXT:    li a4, 0
15882; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15883; RV64I-NEXT:    ld a3, 0(sp)
15884; RV64I-NEXT:    bnez a0, .LBB210_4
15885; RV64I-NEXT:  .LBB210_2: # %atomicrmw.start
15886; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15887; RV64I-NEXT:    mv a2, a3
15888; RV64I-NEXT:    bltu s1, a3, .LBB210_1
15889; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15890; RV64I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15891; RV64I-NEXT:    mv a2, s1
15892; RV64I-NEXT:    j .LBB210_1
15893; RV64I-NEXT:  .LBB210_4: # %atomicrmw.end
15894; RV64I-NEXT:    mv a0, a3
15895; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15896; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15897; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15898; RV64I-NEXT:    addi sp, sp, 32
15899; RV64I-NEXT:    ret
15900;
15901; RV64IA-LABEL: atomicrmw_umax_i64_monotonic:
15902; RV64IA:       # %bb.0:
15903; RV64IA-NEXT:    amomaxu.d a0, a1, (a0)
15904; RV64IA-NEXT:    ret
15905  %1 = atomicrmw umax i64* %a, i64 %b monotonic
15906  ret i64 %1
15907}
15908
15909define i64 @atomicrmw_umax_i64_acquire(i64 *%a, i64 %b) nounwind {
15910; RV32I-LABEL: atomicrmw_umax_i64_acquire:
15911; RV32I:       # %bb.0:
15912; RV32I-NEXT:    addi sp, sp, -32
15913; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15914; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15915; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15916; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15917; RV32I-NEXT:    mv s0, a0
15918; RV32I-NEXT:    lw a5, 4(a0)
15919; RV32I-NEXT:    lw a4, 0(a0)
15920; RV32I-NEXT:    mv s1, a2
15921; RV32I-NEXT:    mv s2, a1
15922; RV32I-NEXT:    j .LBB211_2
15923; RV32I-NEXT:  .LBB211_1: # %atomicrmw.start
15924; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15925; RV32I-NEXT:    sw a4, 8(sp)
15926; RV32I-NEXT:    sw a5, 12(sp)
15927; RV32I-NEXT:    addi a1, sp, 8
15928; RV32I-NEXT:    li a4, 2
15929; RV32I-NEXT:    li a5, 2
15930; RV32I-NEXT:    mv a0, s0
15931; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15932; RV32I-NEXT:    lw a5, 12(sp)
15933; RV32I-NEXT:    lw a4, 8(sp)
15934; RV32I-NEXT:    bnez a0, .LBB211_7
15935; RV32I-NEXT:  .LBB211_2: # %atomicrmw.start
15936; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15937; RV32I-NEXT:    beq a5, s1, .LBB211_4
15938; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15939; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15940; RV32I-NEXT:    sltu a0, s1, a5
15941; RV32I-NEXT:    j .LBB211_5
15942; RV32I-NEXT:  .LBB211_4: # in Loop: Header=BB211_2 Depth=1
15943; RV32I-NEXT:    sltu a0, s2, a4
15944; RV32I-NEXT:  .LBB211_5: # %atomicrmw.start
15945; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15946; RV32I-NEXT:    mv a2, a4
15947; RV32I-NEXT:    mv a3, a5
15948; RV32I-NEXT:    bnez a0, .LBB211_1
15949; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15950; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15951; RV32I-NEXT:    mv a2, s2
15952; RV32I-NEXT:    mv a3, s1
15953; RV32I-NEXT:    j .LBB211_1
15954; RV32I-NEXT:  .LBB211_7: # %atomicrmw.end
15955; RV32I-NEXT:    mv a0, a4
15956; RV32I-NEXT:    mv a1, a5
15957; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15958; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15959; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15960; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15961; RV32I-NEXT:    addi sp, sp, 32
15962; RV32I-NEXT:    ret
15963;
15964; RV32IA-LABEL: atomicrmw_umax_i64_acquire:
15965; RV32IA:       # %bb.0:
15966; RV32IA-NEXT:    addi sp, sp, -32
15967; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15968; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15969; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15970; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15971; RV32IA-NEXT:    mv s0, a0
15972; RV32IA-NEXT:    lw a5, 4(a0)
15973; RV32IA-NEXT:    lw a4, 0(a0)
15974; RV32IA-NEXT:    mv s1, a2
15975; RV32IA-NEXT:    mv s2, a1
15976; RV32IA-NEXT:    j .LBB211_2
15977; RV32IA-NEXT:  .LBB211_1: # %atomicrmw.start
15978; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
15979; RV32IA-NEXT:    sw a4, 8(sp)
15980; RV32IA-NEXT:    sw a5, 12(sp)
15981; RV32IA-NEXT:    addi a1, sp, 8
15982; RV32IA-NEXT:    li a4, 2
15983; RV32IA-NEXT:    li a5, 2
15984; RV32IA-NEXT:    mv a0, s0
15985; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15986; RV32IA-NEXT:    lw a5, 12(sp)
15987; RV32IA-NEXT:    lw a4, 8(sp)
15988; RV32IA-NEXT:    bnez a0, .LBB211_7
15989; RV32IA-NEXT:  .LBB211_2: # %atomicrmw.start
15990; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15991; RV32IA-NEXT:    beq a5, s1, .LBB211_4
15992; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15993; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
15994; RV32IA-NEXT:    sltu a0, s1, a5
15995; RV32IA-NEXT:    j .LBB211_5
15996; RV32IA-NEXT:  .LBB211_4: # in Loop: Header=BB211_2 Depth=1
15997; RV32IA-NEXT:    sltu a0, s2, a4
15998; RV32IA-NEXT:  .LBB211_5: # %atomicrmw.start
15999; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
16000; RV32IA-NEXT:    mv a2, a4
16001; RV32IA-NEXT:    mv a3, a5
16002; RV32IA-NEXT:    bnez a0, .LBB211_1
16003; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16004; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
16005; RV32IA-NEXT:    mv a2, s2
16006; RV32IA-NEXT:    mv a3, s1
16007; RV32IA-NEXT:    j .LBB211_1
16008; RV32IA-NEXT:  .LBB211_7: # %atomicrmw.end
16009; RV32IA-NEXT:    mv a0, a4
16010; RV32IA-NEXT:    mv a1, a5
16011; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16012; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16013; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16014; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16015; RV32IA-NEXT:    addi sp, sp, 32
16016; RV32IA-NEXT:    ret
16017;
16018; RV64I-LABEL: atomicrmw_umax_i64_acquire:
16019; RV64I:       # %bb.0:
16020; RV64I-NEXT:    addi sp, sp, -32
16021; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16022; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16023; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16024; RV64I-NEXT:    mv s0, a0
16025; RV64I-NEXT:    ld a3, 0(a0)
16026; RV64I-NEXT:    mv s1, a1
16027; RV64I-NEXT:    j .LBB211_2
16028; RV64I-NEXT:  .LBB211_1: # %atomicrmw.start
16029; RV64I-NEXT:    # in Loop: Header=BB211_2 Depth=1
16030; RV64I-NEXT:    sd a3, 0(sp)
16031; RV64I-NEXT:    mv a1, sp
16032; RV64I-NEXT:    li a3, 2
16033; RV64I-NEXT:    li a4, 2
16034; RV64I-NEXT:    mv a0, s0
16035; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16036; RV64I-NEXT:    ld a3, 0(sp)
16037; RV64I-NEXT:    bnez a0, .LBB211_4
16038; RV64I-NEXT:  .LBB211_2: # %atomicrmw.start
16039; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16040; RV64I-NEXT:    mv a2, a3
16041; RV64I-NEXT:    bltu s1, a3, .LBB211_1
16042; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16043; RV64I-NEXT:    # in Loop: Header=BB211_2 Depth=1
16044; RV64I-NEXT:    mv a2, s1
16045; RV64I-NEXT:    j .LBB211_1
16046; RV64I-NEXT:  .LBB211_4: # %atomicrmw.end
16047; RV64I-NEXT:    mv a0, a3
16048; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16049; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16050; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16051; RV64I-NEXT:    addi sp, sp, 32
16052; RV64I-NEXT:    ret
16053;
16054; RV64IA-LABEL: atomicrmw_umax_i64_acquire:
16055; RV64IA:       # %bb.0:
16056; RV64IA-NEXT:    amomaxu.d.aq a0, a1, (a0)
16057; RV64IA-NEXT:    ret
16058  %1 = atomicrmw umax i64* %a, i64 %b acquire
16059  ret i64 %1
16060}
16061
16062define i64 @atomicrmw_umax_i64_release(i64 *%a, i64 %b) nounwind {
16063; RV32I-LABEL: atomicrmw_umax_i64_release:
16064; RV32I:       # %bb.0:
16065; RV32I-NEXT:    addi sp, sp, -32
16066; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16067; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16068; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16069; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16070; RV32I-NEXT:    mv s0, a0
16071; RV32I-NEXT:    lw a5, 4(a0)
16072; RV32I-NEXT:    lw a4, 0(a0)
16073; RV32I-NEXT:    mv s1, a2
16074; RV32I-NEXT:    mv s2, a1
16075; RV32I-NEXT:    j .LBB212_2
16076; RV32I-NEXT:  .LBB212_1: # %atomicrmw.start
16077; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16078; RV32I-NEXT:    sw a4, 8(sp)
16079; RV32I-NEXT:    sw a5, 12(sp)
16080; RV32I-NEXT:    addi a1, sp, 8
16081; RV32I-NEXT:    li a4, 3
16082; RV32I-NEXT:    mv a0, s0
16083; RV32I-NEXT:    li a5, 0
16084; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16085; RV32I-NEXT:    lw a5, 12(sp)
16086; RV32I-NEXT:    lw a4, 8(sp)
16087; RV32I-NEXT:    bnez a0, .LBB212_7
16088; RV32I-NEXT:  .LBB212_2: # %atomicrmw.start
16089; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16090; RV32I-NEXT:    beq a5, s1, .LBB212_4
16091; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16092; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16093; RV32I-NEXT:    sltu a0, s1, a5
16094; RV32I-NEXT:    j .LBB212_5
16095; RV32I-NEXT:  .LBB212_4: # in Loop: Header=BB212_2 Depth=1
16096; RV32I-NEXT:    sltu a0, s2, a4
16097; RV32I-NEXT:  .LBB212_5: # %atomicrmw.start
16098; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16099; RV32I-NEXT:    mv a2, a4
16100; RV32I-NEXT:    mv a3, a5
16101; RV32I-NEXT:    bnez a0, .LBB212_1
16102; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16103; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16104; RV32I-NEXT:    mv a2, s2
16105; RV32I-NEXT:    mv a3, s1
16106; RV32I-NEXT:    j .LBB212_1
16107; RV32I-NEXT:  .LBB212_7: # %atomicrmw.end
16108; RV32I-NEXT:    mv a0, a4
16109; RV32I-NEXT:    mv a1, a5
16110; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16111; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16112; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16113; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16114; RV32I-NEXT:    addi sp, sp, 32
16115; RV32I-NEXT:    ret
16116;
16117; RV32IA-LABEL: atomicrmw_umax_i64_release:
16118; RV32IA:       # %bb.0:
16119; RV32IA-NEXT:    addi sp, sp, -32
16120; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16121; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16122; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16123; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16124; RV32IA-NEXT:    mv s0, a0
16125; RV32IA-NEXT:    lw a5, 4(a0)
16126; RV32IA-NEXT:    lw a4, 0(a0)
16127; RV32IA-NEXT:    mv s1, a2
16128; RV32IA-NEXT:    mv s2, a1
16129; RV32IA-NEXT:    j .LBB212_2
16130; RV32IA-NEXT:  .LBB212_1: # %atomicrmw.start
16131; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16132; RV32IA-NEXT:    sw a4, 8(sp)
16133; RV32IA-NEXT:    sw a5, 12(sp)
16134; RV32IA-NEXT:    addi a1, sp, 8
16135; RV32IA-NEXT:    li a4, 3
16136; RV32IA-NEXT:    mv a0, s0
16137; RV32IA-NEXT:    li a5, 0
16138; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16139; RV32IA-NEXT:    lw a5, 12(sp)
16140; RV32IA-NEXT:    lw a4, 8(sp)
16141; RV32IA-NEXT:    bnez a0, .LBB212_7
16142; RV32IA-NEXT:  .LBB212_2: # %atomicrmw.start
16143; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16144; RV32IA-NEXT:    beq a5, s1, .LBB212_4
16145; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16146; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16147; RV32IA-NEXT:    sltu a0, s1, a5
16148; RV32IA-NEXT:    j .LBB212_5
16149; RV32IA-NEXT:  .LBB212_4: # in Loop: Header=BB212_2 Depth=1
16150; RV32IA-NEXT:    sltu a0, s2, a4
16151; RV32IA-NEXT:  .LBB212_5: # %atomicrmw.start
16152; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16153; RV32IA-NEXT:    mv a2, a4
16154; RV32IA-NEXT:    mv a3, a5
16155; RV32IA-NEXT:    bnez a0, .LBB212_1
16156; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16157; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16158; RV32IA-NEXT:    mv a2, s2
16159; RV32IA-NEXT:    mv a3, s1
16160; RV32IA-NEXT:    j .LBB212_1
16161; RV32IA-NEXT:  .LBB212_7: # %atomicrmw.end
16162; RV32IA-NEXT:    mv a0, a4
16163; RV32IA-NEXT:    mv a1, a5
16164; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16165; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16166; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16167; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16168; RV32IA-NEXT:    addi sp, sp, 32
16169; RV32IA-NEXT:    ret
16170;
16171; RV64I-LABEL: atomicrmw_umax_i64_release:
16172; RV64I:       # %bb.0:
16173; RV64I-NEXT:    addi sp, sp, -32
16174; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16175; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16176; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16177; RV64I-NEXT:    mv s0, a0
16178; RV64I-NEXT:    ld a3, 0(a0)
16179; RV64I-NEXT:    mv s1, a1
16180; RV64I-NEXT:    j .LBB212_2
16181; RV64I-NEXT:  .LBB212_1: # %atomicrmw.start
16182; RV64I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16183; RV64I-NEXT:    sd a3, 0(sp)
16184; RV64I-NEXT:    mv a1, sp
16185; RV64I-NEXT:    li a3, 3
16186; RV64I-NEXT:    mv a0, s0
16187; RV64I-NEXT:    li a4, 0
16188; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16189; RV64I-NEXT:    ld a3, 0(sp)
16190; RV64I-NEXT:    bnez a0, .LBB212_4
16191; RV64I-NEXT:  .LBB212_2: # %atomicrmw.start
16192; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16193; RV64I-NEXT:    mv a2, a3
16194; RV64I-NEXT:    bltu s1, a3, .LBB212_1
16195; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16196; RV64I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16197; RV64I-NEXT:    mv a2, s1
16198; RV64I-NEXT:    j .LBB212_1
16199; RV64I-NEXT:  .LBB212_4: # %atomicrmw.end
16200; RV64I-NEXT:    mv a0, a3
16201; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16202; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16203; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16204; RV64I-NEXT:    addi sp, sp, 32
16205; RV64I-NEXT:    ret
16206;
16207; RV64IA-LABEL: atomicrmw_umax_i64_release:
16208; RV64IA:       # %bb.0:
16209; RV64IA-NEXT:    amomaxu.d.rl a0, a1, (a0)
16210; RV64IA-NEXT:    ret
16211  %1 = atomicrmw umax i64* %a, i64 %b release
16212  ret i64 %1
16213}
16214
16215define i64 @atomicrmw_umax_i64_acq_rel(i64 *%a, i64 %b) nounwind {
16216; RV32I-LABEL: atomicrmw_umax_i64_acq_rel:
16217; RV32I:       # %bb.0:
16218; RV32I-NEXT:    addi sp, sp, -32
16219; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16220; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16221; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16222; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16223; RV32I-NEXT:    mv s0, a0
16224; RV32I-NEXT:    lw a5, 4(a0)
16225; RV32I-NEXT:    lw a4, 0(a0)
16226; RV32I-NEXT:    mv s1, a2
16227; RV32I-NEXT:    mv s2, a1
16228; RV32I-NEXT:    j .LBB213_2
16229; RV32I-NEXT:  .LBB213_1: # %atomicrmw.start
16230; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16231; RV32I-NEXT:    sw a4, 8(sp)
16232; RV32I-NEXT:    sw a5, 12(sp)
16233; RV32I-NEXT:    addi a1, sp, 8
16234; RV32I-NEXT:    li a4, 4
16235; RV32I-NEXT:    li a5, 2
16236; RV32I-NEXT:    mv a0, s0
16237; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16238; RV32I-NEXT:    lw a5, 12(sp)
16239; RV32I-NEXT:    lw a4, 8(sp)
16240; RV32I-NEXT:    bnez a0, .LBB213_7
16241; RV32I-NEXT:  .LBB213_2: # %atomicrmw.start
16242; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16243; RV32I-NEXT:    beq a5, s1, .LBB213_4
16244; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16245; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16246; RV32I-NEXT:    sltu a0, s1, a5
16247; RV32I-NEXT:    j .LBB213_5
16248; RV32I-NEXT:  .LBB213_4: # in Loop: Header=BB213_2 Depth=1
16249; RV32I-NEXT:    sltu a0, s2, a4
16250; RV32I-NEXT:  .LBB213_5: # %atomicrmw.start
16251; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16252; RV32I-NEXT:    mv a2, a4
16253; RV32I-NEXT:    mv a3, a5
16254; RV32I-NEXT:    bnez a0, .LBB213_1
16255; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16256; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16257; RV32I-NEXT:    mv a2, s2
16258; RV32I-NEXT:    mv a3, s1
16259; RV32I-NEXT:    j .LBB213_1
16260; RV32I-NEXT:  .LBB213_7: # %atomicrmw.end
16261; RV32I-NEXT:    mv a0, a4
16262; RV32I-NEXT:    mv a1, a5
16263; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16264; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16265; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16266; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16267; RV32I-NEXT:    addi sp, sp, 32
16268; RV32I-NEXT:    ret
16269;
16270; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel:
16271; RV32IA:       # %bb.0:
16272; RV32IA-NEXT:    addi sp, sp, -32
16273; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16274; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16275; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16276; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16277; RV32IA-NEXT:    mv s0, a0
16278; RV32IA-NEXT:    lw a5, 4(a0)
16279; RV32IA-NEXT:    lw a4, 0(a0)
16280; RV32IA-NEXT:    mv s1, a2
16281; RV32IA-NEXT:    mv s2, a1
16282; RV32IA-NEXT:    j .LBB213_2
16283; RV32IA-NEXT:  .LBB213_1: # %atomicrmw.start
16284; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16285; RV32IA-NEXT:    sw a4, 8(sp)
16286; RV32IA-NEXT:    sw a5, 12(sp)
16287; RV32IA-NEXT:    addi a1, sp, 8
16288; RV32IA-NEXT:    li a4, 4
16289; RV32IA-NEXT:    li a5, 2
16290; RV32IA-NEXT:    mv a0, s0
16291; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16292; RV32IA-NEXT:    lw a5, 12(sp)
16293; RV32IA-NEXT:    lw a4, 8(sp)
16294; RV32IA-NEXT:    bnez a0, .LBB213_7
16295; RV32IA-NEXT:  .LBB213_2: # %atomicrmw.start
16296; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16297; RV32IA-NEXT:    beq a5, s1, .LBB213_4
16298; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16299; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16300; RV32IA-NEXT:    sltu a0, s1, a5
16301; RV32IA-NEXT:    j .LBB213_5
16302; RV32IA-NEXT:  .LBB213_4: # in Loop: Header=BB213_2 Depth=1
16303; RV32IA-NEXT:    sltu a0, s2, a4
16304; RV32IA-NEXT:  .LBB213_5: # %atomicrmw.start
16305; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16306; RV32IA-NEXT:    mv a2, a4
16307; RV32IA-NEXT:    mv a3, a5
16308; RV32IA-NEXT:    bnez a0, .LBB213_1
16309; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16310; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16311; RV32IA-NEXT:    mv a2, s2
16312; RV32IA-NEXT:    mv a3, s1
16313; RV32IA-NEXT:    j .LBB213_1
16314; RV32IA-NEXT:  .LBB213_7: # %atomicrmw.end
16315; RV32IA-NEXT:    mv a0, a4
16316; RV32IA-NEXT:    mv a1, a5
16317; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16318; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16319; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16320; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16321; RV32IA-NEXT:    addi sp, sp, 32
16322; RV32IA-NEXT:    ret
16323;
16324; RV64I-LABEL: atomicrmw_umax_i64_acq_rel:
16325; RV64I:       # %bb.0:
16326; RV64I-NEXT:    addi sp, sp, -32
16327; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16328; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16329; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16330; RV64I-NEXT:    mv s0, a0
16331; RV64I-NEXT:    ld a3, 0(a0)
16332; RV64I-NEXT:    mv s1, a1
16333; RV64I-NEXT:    j .LBB213_2
16334; RV64I-NEXT:  .LBB213_1: # %atomicrmw.start
16335; RV64I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16336; RV64I-NEXT:    sd a3, 0(sp)
16337; RV64I-NEXT:    mv a1, sp
16338; RV64I-NEXT:    li a3, 4
16339; RV64I-NEXT:    li a4, 2
16340; RV64I-NEXT:    mv a0, s0
16341; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16342; RV64I-NEXT:    ld a3, 0(sp)
16343; RV64I-NEXT:    bnez a0, .LBB213_4
16344; RV64I-NEXT:  .LBB213_2: # %atomicrmw.start
16345; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16346; RV64I-NEXT:    mv a2, a3
16347; RV64I-NEXT:    bltu s1, a3, .LBB213_1
16348; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16349; RV64I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16350; RV64I-NEXT:    mv a2, s1
16351; RV64I-NEXT:    j .LBB213_1
16352; RV64I-NEXT:  .LBB213_4: # %atomicrmw.end
16353; RV64I-NEXT:    mv a0, a3
16354; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16355; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16356; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16357; RV64I-NEXT:    addi sp, sp, 32
16358; RV64I-NEXT:    ret
16359;
16360; RV64IA-LABEL: atomicrmw_umax_i64_acq_rel:
16361; RV64IA:       # %bb.0:
16362; RV64IA-NEXT:    amomaxu.d.aqrl a0, a1, (a0)
16363; RV64IA-NEXT:    ret
16364  %1 = atomicrmw umax i64* %a, i64 %b acq_rel
16365  ret i64 %1
16366}
16367
16368define i64 @atomicrmw_umax_i64_seq_cst(i64 *%a, i64 %b) nounwind {
16369; RV32I-LABEL: atomicrmw_umax_i64_seq_cst:
16370; RV32I:       # %bb.0:
16371; RV32I-NEXT:    addi sp, sp, -32
16372; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16373; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16374; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16375; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16376; RV32I-NEXT:    mv s0, a0
16377; RV32I-NEXT:    lw a5, 4(a0)
16378; RV32I-NEXT:    lw a4, 0(a0)
16379; RV32I-NEXT:    mv s1, a2
16380; RV32I-NEXT:    mv s2, a1
16381; RV32I-NEXT:    j .LBB214_2
16382; RV32I-NEXT:  .LBB214_1: # %atomicrmw.start
16383; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16384; RV32I-NEXT:    sw a4, 8(sp)
16385; RV32I-NEXT:    sw a5, 12(sp)
16386; RV32I-NEXT:    addi a1, sp, 8
16387; RV32I-NEXT:    li a4, 5
16388; RV32I-NEXT:    li a5, 5
16389; RV32I-NEXT:    mv a0, s0
16390; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16391; RV32I-NEXT:    lw a5, 12(sp)
16392; RV32I-NEXT:    lw a4, 8(sp)
16393; RV32I-NEXT:    bnez a0, .LBB214_7
16394; RV32I-NEXT:  .LBB214_2: # %atomicrmw.start
16395; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16396; RV32I-NEXT:    beq a5, s1, .LBB214_4
16397; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16398; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16399; RV32I-NEXT:    sltu a0, s1, a5
16400; RV32I-NEXT:    j .LBB214_5
16401; RV32I-NEXT:  .LBB214_4: # in Loop: Header=BB214_2 Depth=1
16402; RV32I-NEXT:    sltu a0, s2, a4
16403; RV32I-NEXT:  .LBB214_5: # %atomicrmw.start
16404; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16405; RV32I-NEXT:    mv a2, a4
16406; RV32I-NEXT:    mv a3, a5
16407; RV32I-NEXT:    bnez a0, .LBB214_1
16408; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16409; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16410; RV32I-NEXT:    mv a2, s2
16411; RV32I-NEXT:    mv a3, s1
16412; RV32I-NEXT:    j .LBB214_1
16413; RV32I-NEXT:  .LBB214_7: # %atomicrmw.end
16414; RV32I-NEXT:    mv a0, a4
16415; RV32I-NEXT:    mv a1, a5
16416; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16417; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16418; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16419; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16420; RV32I-NEXT:    addi sp, sp, 32
16421; RV32I-NEXT:    ret
16422;
16423; RV32IA-LABEL: atomicrmw_umax_i64_seq_cst:
16424; RV32IA:       # %bb.0:
16425; RV32IA-NEXT:    addi sp, sp, -32
16426; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16427; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16428; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16429; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16430; RV32IA-NEXT:    mv s0, a0
16431; RV32IA-NEXT:    lw a5, 4(a0)
16432; RV32IA-NEXT:    lw a4, 0(a0)
16433; RV32IA-NEXT:    mv s1, a2
16434; RV32IA-NEXT:    mv s2, a1
16435; RV32IA-NEXT:    j .LBB214_2
16436; RV32IA-NEXT:  .LBB214_1: # %atomicrmw.start
16437; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16438; RV32IA-NEXT:    sw a4, 8(sp)
16439; RV32IA-NEXT:    sw a5, 12(sp)
16440; RV32IA-NEXT:    addi a1, sp, 8
16441; RV32IA-NEXT:    li a4, 5
16442; RV32IA-NEXT:    li a5, 5
16443; RV32IA-NEXT:    mv a0, s0
16444; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16445; RV32IA-NEXT:    lw a5, 12(sp)
16446; RV32IA-NEXT:    lw a4, 8(sp)
16447; RV32IA-NEXT:    bnez a0, .LBB214_7
16448; RV32IA-NEXT:  .LBB214_2: # %atomicrmw.start
16449; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16450; RV32IA-NEXT:    beq a5, s1, .LBB214_4
16451; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16452; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16453; RV32IA-NEXT:    sltu a0, s1, a5
16454; RV32IA-NEXT:    j .LBB214_5
16455; RV32IA-NEXT:  .LBB214_4: # in Loop: Header=BB214_2 Depth=1
16456; RV32IA-NEXT:    sltu a0, s2, a4
16457; RV32IA-NEXT:  .LBB214_5: # %atomicrmw.start
16458; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16459; RV32IA-NEXT:    mv a2, a4
16460; RV32IA-NEXT:    mv a3, a5
16461; RV32IA-NEXT:    bnez a0, .LBB214_1
16462; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16463; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16464; RV32IA-NEXT:    mv a2, s2
16465; RV32IA-NEXT:    mv a3, s1
16466; RV32IA-NEXT:    j .LBB214_1
16467; RV32IA-NEXT:  .LBB214_7: # %atomicrmw.end
16468; RV32IA-NEXT:    mv a0, a4
16469; RV32IA-NEXT:    mv a1, a5
16470; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16471; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16472; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16473; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16474; RV32IA-NEXT:    addi sp, sp, 32
16475; RV32IA-NEXT:    ret
16476;
16477; RV64I-LABEL: atomicrmw_umax_i64_seq_cst:
16478; RV64I:       # %bb.0:
16479; RV64I-NEXT:    addi sp, sp, -32
16480; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16481; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16482; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16483; RV64I-NEXT:    mv s0, a0
16484; RV64I-NEXT:    ld a3, 0(a0)
16485; RV64I-NEXT:    mv s1, a1
16486; RV64I-NEXT:    j .LBB214_2
16487; RV64I-NEXT:  .LBB214_1: # %atomicrmw.start
16488; RV64I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16489; RV64I-NEXT:    sd a3, 0(sp)
16490; RV64I-NEXT:    mv a1, sp
16491; RV64I-NEXT:    li a3, 5
16492; RV64I-NEXT:    li a4, 5
16493; RV64I-NEXT:    mv a0, s0
16494; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16495; RV64I-NEXT:    ld a3, 0(sp)
16496; RV64I-NEXT:    bnez a0, .LBB214_4
16497; RV64I-NEXT:  .LBB214_2: # %atomicrmw.start
16498; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16499; RV64I-NEXT:    mv a2, a3
16500; RV64I-NEXT:    bltu s1, a3, .LBB214_1
16501; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16502; RV64I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16503; RV64I-NEXT:    mv a2, s1
16504; RV64I-NEXT:    j .LBB214_1
16505; RV64I-NEXT:  .LBB214_4: # %atomicrmw.end
16506; RV64I-NEXT:    mv a0, a3
16507; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16508; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16509; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16510; RV64I-NEXT:    addi sp, sp, 32
16511; RV64I-NEXT:    ret
16512;
16513; RV64IA-LABEL: atomicrmw_umax_i64_seq_cst:
16514; RV64IA:       # %bb.0:
16515; RV64IA-NEXT:    amomaxu.d.aqrl a0, a1, (a0)
16516; RV64IA-NEXT:    ret
16517  %1 = atomicrmw umax i64* %a, i64 %b seq_cst
16518  ret i64 %1
16519}
16520
16521define i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind {
16522; RV32I-LABEL: atomicrmw_umin_i64_monotonic:
16523; RV32I:       # %bb.0:
16524; RV32I-NEXT:    addi sp, sp, -32
16525; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16526; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16527; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16528; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16529; RV32I-NEXT:    mv s0, a0
16530; RV32I-NEXT:    lw a5, 4(a0)
16531; RV32I-NEXT:    lw a4, 0(a0)
16532; RV32I-NEXT:    mv s1, a2
16533; RV32I-NEXT:    mv s2, a1
16534; RV32I-NEXT:    j .LBB215_2
16535; RV32I-NEXT:  .LBB215_1: # %atomicrmw.start
16536; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16537; RV32I-NEXT:    sw a4, 8(sp)
16538; RV32I-NEXT:    sw a5, 12(sp)
16539; RV32I-NEXT:    addi a1, sp, 8
16540; RV32I-NEXT:    mv a0, s0
16541; RV32I-NEXT:    li a4, 0
16542; RV32I-NEXT:    li a5, 0
16543; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16544; RV32I-NEXT:    lw a5, 12(sp)
16545; RV32I-NEXT:    lw a4, 8(sp)
16546; RV32I-NEXT:    bnez a0, .LBB215_7
16547; RV32I-NEXT:  .LBB215_2: # %atomicrmw.start
16548; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16549; RV32I-NEXT:    beq a5, s1, .LBB215_4
16550; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16551; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16552; RV32I-NEXT:    sltu a0, s1, a5
16553; RV32I-NEXT:    j .LBB215_5
16554; RV32I-NEXT:  .LBB215_4: # in Loop: Header=BB215_2 Depth=1
16555; RV32I-NEXT:    sltu a0, s2, a4
16556; RV32I-NEXT:  .LBB215_5: # %atomicrmw.start
16557; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16558; RV32I-NEXT:    xori a0, a0, 1
16559; RV32I-NEXT:    mv a2, a4
16560; RV32I-NEXT:    mv a3, a5
16561; RV32I-NEXT:    bnez a0, .LBB215_1
16562; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16563; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16564; RV32I-NEXT:    mv a2, s2
16565; RV32I-NEXT:    mv a3, s1
16566; RV32I-NEXT:    j .LBB215_1
16567; RV32I-NEXT:  .LBB215_7: # %atomicrmw.end
16568; RV32I-NEXT:    mv a0, a4
16569; RV32I-NEXT:    mv a1, a5
16570; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16571; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16572; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16573; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16574; RV32I-NEXT:    addi sp, sp, 32
16575; RV32I-NEXT:    ret
16576;
16577; RV32IA-LABEL: atomicrmw_umin_i64_monotonic:
16578; RV32IA:       # %bb.0:
16579; RV32IA-NEXT:    addi sp, sp, -32
16580; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16581; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16582; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16583; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16584; RV32IA-NEXT:    mv s0, a0
16585; RV32IA-NEXT:    lw a5, 4(a0)
16586; RV32IA-NEXT:    lw a4, 0(a0)
16587; RV32IA-NEXT:    mv s1, a2
16588; RV32IA-NEXT:    mv s2, a1
16589; RV32IA-NEXT:    j .LBB215_2
16590; RV32IA-NEXT:  .LBB215_1: # %atomicrmw.start
16591; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16592; RV32IA-NEXT:    sw a4, 8(sp)
16593; RV32IA-NEXT:    sw a5, 12(sp)
16594; RV32IA-NEXT:    addi a1, sp, 8
16595; RV32IA-NEXT:    mv a0, s0
16596; RV32IA-NEXT:    li a4, 0
16597; RV32IA-NEXT:    li a5, 0
16598; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16599; RV32IA-NEXT:    lw a5, 12(sp)
16600; RV32IA-NEXT:    lw a4, 8(sp)
16601; RV32IA-NEXT:    bnez a0, .LBB215_7
16602; RV32IA-NEXT:  .LBB215_2: # %atomicrmw.start
16603; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16604; RV32IA-NEXT:    beq a5, s1, .LBB215_4
16605; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16606; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16607; RV32IA-NEXT:    sltu a0, s1, a5
16608; RV32IA-NEXT:    j .LBB215_5
16609; RV32IA-NEXT:  .LBB215_4: # in Loop: Header=BB215_2 Depth=1
16610; RV32IA-NEXT:    sltu a0, s2, a4
16611; RV32IA-NEXT:  .LBB215_5: # %atomicrmw.start
16612; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16613; RV32IA-NEXT:    xori a0, a0, 1
16614; RV32IA-NEXT:    mv a2, a4
16615; RV32IA-NEXT:    mv a3, a5
16616; RV32IA-NEXT:    bnez a0, .LBB215_1
16617; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16618; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16619; RV32IA-NEXT:    mv a2, s2
16620; RV32IA-NEXT:    mv a3, s1
16621; RV32IA-NEXT:    j .LBB215_1
16622; RV32IA-NEXT:  .LBB215_7: # %atomicrmw.end
16623; RV32IA-NEXT:    mv a0, a4
16624; RV32IA-NEXT:    mv a1, a5
16625; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16626; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16627; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16628; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16629; RV32IA-NEXT:    addi sp, sp, 32
16630; RV32IA-NEXT:    ret
16631;
16632; RV64I-LABEL: atomicrmw_umin_i64_monotonic:
16633; RV64I:       # %bb.0:
16634; RV64I-NEXT:    addi sp, sp, -32
16635; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16636; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16637; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16638; RV64I-NEXT:    mv s0, a0
16639; RV64I-NEXT:    ld a3, 0(a0)
16640; RV64I-NEXT:    mv s1, a1
16641; RV64I-NEXT:    j .LBB215_2
16642; RV64I-NEXT:  .LBB215_1: # %atomicrmw.start
16643; RV64I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16644; RV64I-NEXT:    sd a3, 0(sp)
16645; RV64I-NEXT:    mv a1, sp
16646; RV64I-NEXT:    mv a0, s0
16647; RV64I-NEXT:    li a3, 0
16648; RV64I-NEXT:    li a4, 0
16649; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16650; RV64I-NEXT:    ld a3, 0(sp)
16651; RV64I-NEXT:    bnez a0, .LBB215_4
16652; RV64I-NEXT:  .LBB215_2: # %atomicrmw.start
16653; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16654; RV64I-NEXT:    mv a2, a3
16655; RV64I-NEXT:    bgeu s1, a3, .LBB215_1
16656; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16657; RV64I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16658; RV64I-NEXT:    mv a2, s1
16659; RV64I-NEXT:    j .LBB215_1
16660; RV64I-NEXT:  .LBB215_4: # %atomicrmw.end
16661; RV64I-NEXT:    mv a0, a3
16662; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16663; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16664; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16665; RV64I-NEXT:    addi sp, sp, 32
16666; RV64I-NEXT:    ret
16667;
16668; RV64IA-LABEL: atomicrmw_umin_i64_monotonic:
16669; RV64IA:       # %bb.0:
16670; RV64IA-NEXT:    amominu.d a0, a1, (a0)
16671; RV64IA-NEXT:    ret
16672  %1 = atomicrmw umin i64* %a, i64 %b monotonic
16673  ret i64 %1
16674}
16675
16676define i64 @atomicrmw_umin_i64_acquire(i64 *%a, i64 %b) nounwind {
16677; RV32I-LABEL: atomicrmw_umin_i64_acquire:
16678; RV32I:       # %bb.0:
16679; RV32I-NEXT:    addi sp, sp, -32
16680; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16681; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16682; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16683; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16684; RV32I-NEXT:    mv s0, a0
16685; RV32I-NEXT:    lw a5, 4(a0)
16686; RV32I-NEXT:    lw a4, 0(a0)
16687; RV32I-NEXT:    mv s1, a2
16688; RV32I-NEXT:    mv s2, a1
16689; RV32I-NEXT:    j .LBB216_2
16690; RV32I-NEXT:  .LBB216_1: # %atomicrmw.start
16691; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16692; RV32I-NEXT:    sw a4, 8(sp)
16693; RV32I-NEXT:    sw a5, 12(sp)
16694; RV32I-NEXT:    addi a1, sp, 8
16695; RV32I-NEXT:    li a4, 2
16696; RV32I-NEXT:    li a5, 2
16697; RV32I-NEXT:    mv a0, s0
16698; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16699; RV32I-NEXT:    lw a5, 12(sp)
16700; RV32I-NEXT:    lw a4, 8(sp)
16701; RV32I-NEXT:    bnez a0, .LBB216_7
16702; RV32I-NEXT:  .LBB216_2: # %atomicrmw.start
16703; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16704; RV32I-NEXT:    beq a5, s1, .LBB216_4
16705; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16706; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16707; RV32I-NEXT:    sltu a0, s1, a5
16708; RV32I-NEXT:    j .LBB216_5
16709; RV32I-NEXT:  .LBB216_4: # in Loop: Header=BB216_2 Depth=1
16710; RV32I-NEXT:    sltu a0, s2, a4
16711; RV32I-NEXT:  .LBB216_5: # %atomicrmw.start
16712; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16713; RV32I-NEXT:    xori a0, a0, 1
16714; RV32I-NEXT:    mv a2, a4
16715; RV32I-NEXT:    mv a3, a5
16716; RV32I-NEXT:    bnez a0, .LBB216_1
16717; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16718; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16719; RV32I-NEXT:    mv a2, s2
16720; RV32I-NEXT:    mv a3, s1
16721; RV32I-NEXT:    j .LBB216_1
16722; RV32I-NEXT:  .LBB216_7: # %atomicrmw.end
16723; RV32I-NEXT:    mv a0, a4
16724; RV32I-NEXT:    mv a1, a5
16725; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16726; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16727; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16728; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16729; RV32I-NEXT:    addi sp, sp, 32
16730; RV32I-NEXT:    ret
16731;
16732; RV32IA-LABEL: atomicrmw_umin_i64_acquire:
16733; RV32IA:       # %bb.0:
16734; RV32IA-NEXT:    addi sp, sp, -32
16735; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16736; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16737; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16738; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16739; RV32IA-NEXT:    mv s0, a0
16740; RV32IA-NEXT:    lw a5, 4(a0)
16741; RV32IA-NEXT:    lw a4, 0(a0)
16742; RV32IA-NEXT:    mv s1, a2
16743; RV32IA-NEXT:    mv s2, a1
16744; RV32IA-NEXT:    j .LBB216_2
16745; RV32IA-NEXT:  .LBB216_1: # %atomicrmw.start
16746; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16747; RV32IA-NEXT:    sw a4, 8(sp)
16748; RV32IA-NEXT:    sw a5, 12(sp)
16749; RV32IA-NEXT:    addi a1, sp, 8
16750; RV32IA-NEXT:    li a4, 2
16751; RV32IA-NEXT:    li a5, 2
16752; RV32IA-NEXT:    mv a0, s0
16753; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16754; RV32IA-NEXT:    lw a5, 12(sp)
16755; RV32IA-NEXT:    lw a4, 8(sp)
16756; RV32IA-NEXT:    bnez a0, .LBB216_7
16757; RV32IA-NEXT:  .LBB216_2: # %atomicrmw.start
16758; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16759; RV32IA-NEXT:    beq a5, s1, .LBB216_4
16760; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16761; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16762; RV32IA-NEXT:    sltu a0, s1, a5
16763; RV32IA-NEXT:    j .LBB216_5
16764; RV32IA-NEXT:  .LBB216_4: # in Loop: Header=BB216_2 Depth=1
16765; RV32IA-NEXT:    sltu a0, s2, a4
16766; RV32IA-NEXT:  .LBB216_5: # %atomicrmw.start
16767; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16768; RV32IA-NEXT:    xori a0, a0, 1
16769; RV32IA-NEXT:    mv a2, a4
16770; RV32IA-NEXT:    mv a3, a5
16771; RV32IA-NEXT:    bnez a0, .LBB216_1
16772; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16773; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16774; RV32IA-NEXT:    mv a2, s2
16775; RV32IA-NEXT:    mv a3, s1
16776; RV32IA-NEXT:    j .LBB216_1
16777; RV32IA-NEXT:  .LBB216_7: # %atomicrmw.end
16778; RV32IA-NEXT:    mv a0, a4
16779; RV32IA-NEXT:    mv a1, a5
16780; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16781; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16782; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16783; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16784; RV32IA-NEXT:    addi sp, sp, 32
16785; RV32IA-NEXT:    ret
16786;
16787; RV64I-LABEL: atomicrmw_umin_i64_acquire:
16788; RV64I:       # %bb.0:
16789; RV64I-NEXT:    addi sp, sp, -32
16790; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16791; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16792; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16793; RV64I-NEXT:    mv s0, a0
16794; RV64I-NEXT:    ld a3, 0(a0)
16795; RV64I-NEXT:    mv s1, a1
16796; RV64I-NEXT:    j .LBB216_2
16797; RV64I-NEXT:  .LBB216_1: # %atomicrmw.start
16798; RV64I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16799; RV64I-NEXT:    sd a3, 0(sp)
16800; RV64I-NEXT:    mv a1, sp
16801; RV64I-NEXT:    li a3, 2
16802; RV64I-NEXT:    li a4, 2
16803; RV64I-NEXT:    mv a0, s0
16804; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16805; RV64I-NEXT:    ld a3, 0(sp)
16806; RV64I-NEXT:    bnez a0, .LBB216_4
16807; RV64I-NEXT:  .LBB216_2: # %atomicrmw.start
16808; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16809; RV64I-NEXT:    mv a2, a3
16810; RV64I-NEXT:    bgeu s1, a3, .LBB216_1
16811; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16812; RV64I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16813; RV64I-NEXT:    mv a2, s1
16814; RV64I-NEXT:    j .LBB216_1
16815; RV64I-NEXT:  .LBB216_4: # %atomicrmw.end
16816; RV64I-NEXT:    mv a0, a3
16817; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16818; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16819; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16820; RV64I-NEXT:    addi sp, sp, 32
16821; RV64I-NEXT:    ret
16822;
16823; RV64IA-LABEL: atomicrmw_umin_i64_acquire:
16824; RV64IA:       # %bb.0:
16825; RV64IA-NEXT:    amominu.d.aq a0, a1, (a0)
16826; RV64IA-NEXT:    ret
16827  %1 = atomicrmw umin i64* %a, i64 %b acquire
16828  ret i64 %1
16829}
16830
16831define i64 @atomicrmw_umin_i64_release(i64 *%a, i64 %b) nounwind {
16832; RV32I-LABEL: atomicrmw_umin_i64_release:
16833; RV32I:       # %bb.0:
16834; RV32I-NEXT:    addi sp, sp, -32
16835; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16836; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16837; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16838; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16839; RV32I-NEXT:    mv s0, a0
16840; RV32I-NEXT:    lw a5, 4(a0)
16841; RV32I-NEXT:    lw a4, 0(a0)
16842; RV32I-NEXT:    mv s1, a2
16843; RV32I-NEXT:    mv s2, a1
16844; RV32I-NEXT:    j .LBB217_2
16845; RV32I-NEXT:  .LBB217_1: # %atomicrmw.start
16846; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16847; RV32I-NEXT:    sw a4, 8(sp)
16848; RV32I-NEXT:    sw a5, 12(sp)
16849; RV32I-NEXT:    addi a1, sp, 8
16850; RV32I-NEXT:    li a4, 3
16851; RV32I-NEXT:    mv a0, s0
16852; RV32I-NEXT:    li a5, 0
16853; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16854; RV32I-NEXT:    lw a5, 12(sp)
16855; RV32I-NEXT:    lw a4, 8(sp)
16856; RV32I-NEXT:    bnez a0, .LBB217_7
16857; RV32I-NEXT:  .LBB217_2: # %atomicrmw.start
16858; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16859; RV32I-NEXT:    beq a5, s1, .LBB217_4
16860; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16861; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16862; RV32I-NEXT:    sltu a0, s1, a5
16863; RV32I-NEXT:    j .LBB217_5
16864; RV32I-NEXT:  .LBB217_4: # in Loop: Header=BB217_2 Depth=1
16865; RV32I-NEXT:    sltu a0, s2, a4
16866; RV32I-NEXT:  .LBB217_5: # %atomicrmw.start
16867; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16868; RV32I-NEXT:    xori a0, a0, 1
16869; RV32I-NEXT:    mv a2, a4
16870; RV32I-NEXT:    mv a3, a5
16871; RV32I-NEXT:    bnez a0, .LBB217_1
16872; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16873; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16874; RV32I-NEXT:    mv a2, s2
16875; RV32I-NEXT:    mv a3, s1
16876; RV32I-NEXT:    j .LBB217_1
16877; RV32I-NEXT:  .LBB217_7: # %atomicrmw.end
16878; RV32I-NEXT:    mv a0, a4
16879; RV32I-NEXT:    mv a1, a5
16880; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16881; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16882; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16883; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16884; RV32I-NEXT:    addi sp, sp, 32
16885; RV32I-NEXT:    ret
16886;
16887; RV32IA-LABEL: atomicrmw_umin_i64_release:
16888; RV32IA:       # %bb.0:
16889; RV32IA-NEXT:    addi sp, sp, -32
16890; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16891; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16892; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16893; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16894; RV32IA-NEXT:    mv s0, a0
16895; RV32IA-NEXT:    lw a5, 4(a0)
16896; RV32IA-NEXT:    lw a4, 0(a0)
16897; RV32IA-NEXT:    mv s1, a2
16898; RV32IA-NEXT:    mv s2, a1
16899; RV32IA-NEXT:    j .LBB217_2
16900; RV32IA-NEXT:  .LBB217_1: # %atomicrmw.start
16901; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16902; RV32IA-NEXT:    sw a4, 8(sp)
16903; RV32IA-NEXT:    sw a5, 12(sp)
16904; RV32IA-NEXT:    addi a1, sp, 8
16905; RV32IA-NEXT:    li a4, 3
16906; RV32IA-NEXT:    mv a0, s0
16907; RV32IA-NEXT:    li a5, 0
16908; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16909; RV32IA-NEXT:    lw a5, 12(sp)
16910; RV32IA-NEXT:    lw a4, 8(sp)
16911; RV32IA-NEXT:    bnez a0, .LBB217_7
16912; RV32IA-NEXT:  .LBB217_2: # %atomicrmw.start
16913; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16914; RV32IA-NEXT:    beq a5, s1, .LBB217_4
16915; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16916; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16917; RV32IA-NEXT:    sltu a0, s1, a5
16918; RV32IA-NEXT:    j .LBB217_5
16919; RV32IA-NEXT:  .LBB217_4: # in Loop: Header=BB217_2 Depth=1
16920; RV32IA-NEXT:    sltu a0, s2, a4
16921; RV32IA-NEXT:  .LBB217_5: # %atomicrmw.start
16922; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16923; RV32IA-NEXT:    xori a0, a0, 1
16924; RV32IA-NEXT:    mv a2, a4
16925; RV32IA-NEXT:    mv a3, a5
16926; RV32IA-NEXT:    bnez a0, .LBB217_1
16927; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16928; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16929; RV32IA-NEXT:    mv a2, s2
16930; RV32IA-NEXT:    mv a3, s1
16931; RV32IA-NEXT:    j .LBB217_1
16932; RV32IA-NEXT:  .LBB217_7: # %atomicrmw.end
16933; RV32IA-NEXT:    mv a0, a4
16934; RV32IA-NEXT:    mv a1, a5
16935; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16936; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16937; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16938; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16939; RV32IA-NEXT:    addi sp, sp, 32
16940; RV32IA-NEXT:    ret
16941;
16942; RV64I-LABEL: atomicrmw_umin_i64_release:
16943; RV64I:       # %bb.0:
16944; RV64I-NEXT:    addi sp, sp, -32
16945; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16946; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16947; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16948; RV64I-NEXT:    mv s0, a0
16949; RV64I-NEXT:    ld a3, 0(a0)
16950; RV64I-NEXT:    mv s1, a1
16951; RV64I-NEXT:    j .LBB217_2
16952; RV64I-NEXT:  .LBB217_1: # %atomicrmw.start
16953; RV64I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16954; RV64I-NEXT:    sd a3, 0(sp)
16955; RV64I-NEXT:    mv a1, sp
16956; RV64I-NEXT:    li a3, 3
16957; RV64I-NEXT:    mv a0, s0
16958; RV64I-NEXT:    li a4, 0
16959; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16960; RV64I-NEXT:    ld a3, 0(sp)
16961; RV64I-NEXT:    bnez a0, .LBB217_4
16962; RV64I-NEXT:  .LBB217_2: # %atomicrmw.start
16963; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16964; RV64I-NEXT:    mv a2, a3
16965; RV64I-NEXT:    bgeu s1, a3, .LBB217_1
16966; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16967; RV64I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16968; RV64I-NEXT:    mv a2, s1
16969; RV64I-NEXT:    j .LBB217_1
16970; RV64I-NEXT:  .LBB217_4: # %atomicrmw.end
16971; RV64I-NEXT:    mv a0, a3
16972; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16973; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16974; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16975; RV64I-NEXT:    addi sp, sp, 32
16976; RV64I-NEXT:    ret
16977;
16978; RV64IA-LABEL: atomicrmw_umin_i64_release:
16979; RV64IA:       # %bb.0:
16980; RV64IA-NEXT:    amominu.d.rl a0, a1, (a0)
16981; RV64IA-NEXT:    ret
16982  %1 = atomicrmw umin i64* %a, i64 %b release
16983  ret i64 %1
16984}
16985
16986define i64 @atomicrmw_umin_i64_acq_rel(i64 *%a, i64 %b) nounwind {
16987; RV32I-LABEL: atomicrmw_umin_i64_acq_rel:
16988; RV32I:       # %bb.0:
16989; RV32I-NEXT:    addi sp, sp, -32
16990; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16991; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16992; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16993; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16994; RV32I-NEXT:    mv s0, a0
16995; RV32I-NEXT:    lw a5, 4(a0)
16996; RV32I-NEXT:    lw a4, 0(a0)
16997; RV32I-NEXT:    mv s1, a2
16998; RV32I-NEXT:    mv s2, a1
16999; RV32I-NEXT:    j .LBB218_2
17000; RV32I-NEXT:  .LBB218_1: # %atomicrmw.start
17001; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17002; RV32I-NEXT:    sw a4, 8(sp)
17003; RV32I-NEXT:    sw a5, 12(sp)
17004; RV32I-NEXT:    addi a1, sp, 8
17005; RV32I-NEXT:    li a4, 4
17006; RV32I-NEXT:    li a5, 2
17007; RV32I-NEXT:    mv a0, s0
17008; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
17009; RV32I-NEXT:    lw a5, 12(sp)
17010; RV32I-NEXT:    lw a4, 8(sp)
17011; RV32I-NEXT:    bnez a0, .LBB218_7
17012; RV32I-NEXT:  .LBB218_2: # %atomicrmw.start
17013; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17014; RV32I-NEXT:    beq a5, s1, .LBB218_4
17015; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17016; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17017; RV32I-NEXT:    sltu a0, s1, a5
17018; RV32I-NEXT:    j .LBB218_5
17019; RV32I-NEXT:  .LBB218_4: # in Loop: Header=BB218_2 Depth=1
17020; RV32I-NEXT:    sltu a0, s2, a4
17021; RV32I-NEXT:  .LBB218_5: # %atomicrmw.start
17022; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17023; RV32I-NEXT:    xori a0, a0, 1
17024; RV32I-NEXT:    mv a2, a4
17025; RV32I-NEXT:    mv a3, a5
17026; RV32I-NEXT:    bnez a0, .LBB218_1
17027; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
17028; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17029; RV32I-NEXT:    mv a2, s2
17030; RV32I-NEXT:    mv a3, s1
17031; RV32I-NEXT:    j .LBB218_1
17032; RV32I-NEXT:  .LBB218_7: # %atomicrmw.end
17033; RV32I-NEXT:    mv a0, a4
17034; RV32I-NEXT:    mv a1, a5
17035; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17036; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17037; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17038; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17039; RV32I-NEXT:    addi sp, sp, 32
17040; RV32I-NEXT:    ret
17041;
17042; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel:
17043; RV32IA:       # %bb.0:
17044; RV32IA-NEXT:    addi sp, sp, -32
17045; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17046; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17047; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17048; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17049; RV32IA-NEXT:    mv s0, a0
17050; RV32IA-NEXT:    lw a5, 4(a0)
17051; RV32IA-NEXT:    lw a4, 0(a0)
17052; RV32IA-NEXT:    mv s1, a2
17053; RV32IA-NEXT:    mv s2, a1
17054; RV32IA-NEXT:    j .LBB218_2
17055; RV32IA-NEXT:  .LBB218_1: # %atomicrmw.start
17056; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17057; RV32IA-NEXT:    sw a4, 8(sp)
17058; RV32IA-NEXT:    sw a5, 12(sp)
17059; RV32IA-NEXT:    addi a1, sp, 8
17060; RV32IA-NEXT:    li a4, 4
17061; RV32IA-NEXT:    li a5, 2
17062; RV32IA-NEXT:    mv a0, s0
17063; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
17064; RV32IA-NEXT:    lw a5, 12(sp)
17065; RV32IA-NEXT:    lw a4, 8(sp)
17066; RV32IA-NEXT:    bnez a0, .LBB218_7
17067; RV32IA-NEXT:  .LBB218_2: # %atomicrmw.start
17068; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
17069; RV32IA-NEXT:    beq a5, s1, .LBB218_4
17070; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
17071; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17072; RV32IA-NEXT:    sltu a0, s1, a5
17073; RV32IA-NEXT:    j .LBB218_5
17074; RV32IA-NEXT:  .LBB218_4: # in Loop: Header=BB218_2 Depth=1
17075; RV32IA-NEXT:    sltu a0, s2, a4
17076; RV32IA-NEXT:  .LBB218_5: # %atomicrmw.start
17077; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17078; RV32IA-NEXT:    xori a0, a0, 1
17079; RV32IA-NEXT:    mv a2, a4
17080; RV32IA-NEXT:    mv a3, a5
17081; RV32IA-NEXT:    bnez a0, .LBB218_1
17082; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
17083; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17084; RV32IA-NEXT:    mv a2, s2
17085; RV32IA-NEXT:    mv a3, s1
17086; RV32IA-NEXT:    j .LBB218_1
17087; RV32IA-NEXT:  .LBB218_7: # %atomicrmw.end
17088; RV32IA-NEXT:    mv a0, a4
17089; RV32IA-NEXT:    mv a1, a5
17090; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17091; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17092; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17093; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17094; RV32IA-NEXT:    addi sp, sp, 32
17095; RV32IA-NEXT:    ret
17096;
17097; RV64I-LABEL: atomicrmw_umin_i64_acq_rel:
17098; RV64I:       # %bb.0:
17099; RV64I-NEXT:    addi sp, sp, -32
17100; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
17101; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
17102; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
17103; RV64I-NEXT:    mv s0, a0
17104; RV64I-NEXT:    ld a3, 0(a0)
17105; RV64I-NEXT:    mv s1, a1
17106; RV64I-NEXT:    j .LBB218_2
17107; RV64I-NEXT:  .LBB218_1: # %atomicrmw.start
17108; RV64I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17109; RV64I-NEXT:    sd a3, 0(sp)
17110; RV64I-NEXT:    mv a1, sp
17111; RV64I-NEXT:    li a3, 4
17112; RV64I-NEXT:    li a4, 2
17113; RV64I-NEXT:    mv a0, s0
17114; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
17115; RV64I-NEXT:    ld a3, 0(sp)
17116; RV64I-NEXT:    bnez a0, .LBB218_4
17117; RV64I-NEXT:  .LBB218_2: # %atomicrmw.start
17118; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17119; RV64I-NEXT:    mv a2, a3
17120; RV64I-NEXT:    bgeu s1, a3, .LBB218_1
17121; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17122; RV64I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17123; RV64I-NEXT:    mv a2, s1
17124; RV64I-NEXT:    j .LBB218_1
17125; RV64I-NEXT:  .LBB218_4: # %atomicrmw.end
17126; RV64I-NEXT:    mv a0, a3
17127; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
17128; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
17129; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
17130; RV64I-NEXT:    addi sp, sp, 32
17131; RV64I-NEXT:    ret
17132;
17133; RV64IA-LABEL: atomicrmw_umin_i64_acq_rel:
17134; RV64IA:       # %bb.0:
17135; RV64IA-NEXT:    amominu.d.aqrl a0, a1, (a0)
17136; RV64IA-NEXT:    ret
17137  %1 = atomicrmw umin i64* %a, i64 %b acq_rel
17138  ret i64 %1
17139}
17140
17141define i64 @atomicrmw_umin_i64_seq_cst(i64 *%a, i64 %b) nounwind {
17142; RV32I-LABEL: atomicrmw_umin_i64_seq_cst:
17143; RV32I:       # %bb.0:
17144; RV32I-NEXT:    addi sp, sp, -32
17145; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17146; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17147; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17148; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17149; RV32I-NEXT:    mv s0, a0
17150; RV32I-NEXT:    lw a5, 4(a0)
17151; RV32I-NEXT:    lw a4, 0(a0)
17152; RV32I-NEXT:    mv s1, a2
17153; RV32I-NEXT:    mv s2, a1
17154; RV32I-NEXT:    j .LBB219_2
17155; RV32I-NEXT:  .LBB219_1: # %atomicrmw.start
17156; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17157; RV32I-NEXT:    sw a4, 8(sp)
17158; RV32I-NEXT:    sw a5, 12(sp)
17159; RV32I-NEXT:    addi a1, sp, 8
17160; RV32I-NEXT:    li a4, 5
17161; RV32I-NEXT:    li a5, 5
17162; RV32I-NEXT:    mv a0, s0
17163; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
17164; RV32I-NEXT:    lw a5, 12(sp)
17165; RV32I-NEXT:    lw a4, 8(sp)
17166; RV32I-NEXT:    bnez a0, .LBB219_7
17167; RV32I-NEXT:  .LBB219_2: # %atomicrmw.start
17168; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17169; RV32I-NEXT:    beq a5, s1, .LBB219_4
17170; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17171; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17172; RV32I-NEXT:    sltu a0, s1, a5
17173; RV32I-NEXT:    j .LBB219_5
17174; RV32I-NEXT:  .LBB219_4: # in Loop: Header=BB219_2 Depth=1
17175; RV32I-NEXT:    sltu a0, s2, a4
17176; RV32I-NEXT:  .LBB219_5: # %atomicrmw.start
17177; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17178; RV32I-NEXT:    xori a0, a0, 1
17179; RV32I-NEXT:    mv a2, a4
17180; RV32I-NEXT:    mv a3, a5
17181; RV32I-NEXT:    bnez a0, .LBB219_1
17182; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
17183; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17184; RV32I-NEXT:    mv a2, s2
17185; RV32I-NEXT:    mv a3, s1
17186; RV32I-NEXT:    j .LBB219_1
17187; RV32I-NEXT:  .LBB219_7: # %atomicrmw.end
17188; RV32I-NEXT:    mv a0, a4
17189; RV32I-NEXT:    mv a1, a5
17190; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17191; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17192; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17193; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17194; RV32I-NEXT:    addi sp, sp, 32
17195; RV32I-NEXT:    ret
17196;
17197; RV32IA-LABEL: atomicrmw_umin_i64_seq_cst:
17198; RV32IA:       # %bb.0:
17199; RV32IA-NEXT:    addi sp, sp, -32
17200; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17201; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17202; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17203; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17204; RV32IA-NEXT:    mv s0, a0
17205; RV32IA-NEXT:    lw a5, 4(a0)
17206; RV32IA-NEXT:    lw a4, 0(a0)
17207; RV32IA-NEXT:    mv s1, a2
17208; RV32IA-NEXT:    mv s2, a1
17209; RV32IA-NEXT:    j .LBB219_2
17210; RV32IA-NEXT:  .LBB219_1: # %atomicrmw.start
17211; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17212; RV32IA-NEXT:    sw a4, 8(sp)
17213; RV32IA-NEXT:    sw a5, 12(sp)
17214; RV32IA-NEXT:    addi a1, sp, 8
17215; RV32IA-NEXT:    li a4, 5
17216; RV32IA-NEXT:    li a5, 5
17217; RV32IA-NEXT:    mv a0, s0
17218; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
17219; RV32IA-NEXT:    lw a5, 12(sp)
17220; RV32IA-NEXT:    lw a4, 8(sp)
17221; RV32IA-NEXT:    bnez a0, .LBB219_7
17222; RV32IA-NEXT:  .LBB219_2: # %atomicrmw.start
17223; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
17224; RV32IA-NEXT:    beq a5, s1, .LBB219_4
17225; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
17226; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17227; RV32IA-NEXT:    sltu a0, s1, a5
17228; RV32IA-NEXT:    j .LBB219_5
17229; RV32IA-NEXT:  .LBB219_4: # in Loop: Header=BB219_2 Depth=1
17230; RV32IA-NEXT:    sltu a0, s2, a4
17231; RV32IA-NEXT:  .LBB219_5: # %atomicrmw.start
17232; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17233; RV32IA-NEXT:    xori a0, a0, 1
17234; RV32IA-NEXT:    mv a2, a4
17235; RV32IA-NEXT:    mv a3, a5
17236; RV32IA-NEXT:    bnez a0, .LBB219_1
17237; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
17238; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17239; RV32IA-NEXT:    mv a2, s2
17240; RV32IA-NEXT:    mv a3, s1
17241; RV32IA-NEXT:    j .LBB219_1
17242; RV32IA-NEXT:  .LBB219_7: # %atomicrmw.end
17243; RV32IA-NEXT:    mv a0, a4
17244; RV32IA-NEXT:    mv a1, a5
17245; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17246; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17247; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17248; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17249; RV32IA-NEXT:    addi sp, sp, 32
17250; RV32IA-NEXT:    ret
17251;
17252; RV64I-LABEL: atomicrmw_umin_i64_seq_cst:
17253; RV64I:       # %bb.0:
17254; RV64I-NEXT:    addi sp, sp, -32
17255; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
17256; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
17257; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
17258; RV64I-NEXT:    mv s0, a0
17259; RV64I-NEXT:    ld a3, 0(a0)
17260; RV64I-NEXT:    mv s1, a1
17261; RV64I-NEXT:    j .LBB219_2
17262; RV64I-NEXT:  .LBB219_1: # %atomicrmw.start
17263; RV64I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17264; RV64I-NEXT:    sd a3, 0(sp)
17265; RV64I-NEXT:    mv a1, sp
17266; RV64I-NEXT:    li a3, 5
17267; RV64I-NEXT:    li a4, 5
17268; RV64I-NEXT:    mv a0, s0
17269; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
17270; RV64I-NEXT:    ld a3, 0(sp)
17271; RV64I-NEXT:    bnez a0, .LBB219_4
17272; RV64I-NEXT:  .LBB219_2: # %atomicrmw.start
17273; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17274; RV64I-NEXT:    mv a2, a3
17275; RV64I-NEXT:    bgeu s1, a3, .LBB219_1
17276; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17277; RV64I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17278; RV64I-NEXT:    mv a2, s1
17279; RV64I-NEXT:    j .LBB219_1
17280; RV64I-NEXT:  .LBB219_4: # %atomicrmw.end
17281; RV64I-NEXT:    mv a0, a3
17282; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
17283; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
17284; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
17285; RV64I-NEXT:    addi sp, sp, 32
17286; RV64I-NEXT:    ret
17287;
17288; RV64IA-LABEL: atomicrmw_umin_i64_seq_cst:
17289; RV64IA:       # %bb.0:
17290; RV64IA-NEXT:    amominu.d.aqrl a0, a1, (a0)
17291; RV64IA-NEXT:    ret
17292  %1 = atomicrmw umin i64* %a, i64 %b seq_cst
17293  ret i64 %1
17294}
17295