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 s2, a1
2012; RV32I-NEXT:    slli a0, a1, 24
2013; RV32I-NEXT:    srai s1, 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 s1, 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, s2
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 a6, 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 a7, 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:    li a5, 24
2055; RV32IA-NEXT:    sub a3, a5, a3
2056; RV32IA-NEXT:  .LBB35_1: # =>This Inner Loop Header: Depth=1
2057; RV32IA-NEXT:    lr.w a5, (a6)
2058; RV32IA-NEXT:    and a4, a5, a7
2059; RV32IA-NEXT:    mv a2, a5
2060; RV32IA-NEXT:    sll a4, a4, a3
2061; RV32IA-NEXT:    sra a4, a4, a3
2062; RV32IA-NEXT:    bge a4, a1, .LBB35_3
2063; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB35_1 Depth=1
2064; RV32IA-NEXT:    xor a2, a5, a1
2065; RV32IA-NEXT:    and a2, a2, a7
2066; RV32IA-NEXT:    xor a2, a5, a2
2067; RV32IA-NEXT:  .LBB35_3: # in Loop: Header=BB35_1 Depth=1
2068; RV32IA-NEXT:    sc.w a2, a2, (a6)
2069; RV32IA-NEXT:    bnez a2, .LBB35_1
2070; RV32IA-NEXT:  # %bb.4:
2071; RV32IA-NEXT:    srl a0, a5, a0
2072; RV32IA-NEXT:    ret
2073;
2074; RV64I-LABEL: atomicrmw_max_i8_monotonic:
2075; RV64I:       # %bb.0:
2076; RV64I-NEXT:    addi sp, sp, -48
2077; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2078; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2079; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2080; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2081; RV64I-NEXT:    mv s0, a0
2082; RV64I-NEXT:    lbu a3, 0(a0)
2083; RV64I-NEXT:    mv s2, a1
2084; RV64I-NEXT:    slli a0, a1, 56
2085; RV64I-NEXT:    srai s1, a0, 56
2086; RV64I-NEXT:    j .LBB35_2
2087; RV64I-NEXT:  .LBB35_1: # %atomicrmw.start
2088; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2089; RV64I-NEXT:    sb a3, 15(sp)
2090; RV64I-NEXT:    addi a1, sp, 15
2091; RV64I-NEXT:    mv a0, s0
2092; RV64I-NEXT:    li a3, 0
2093; RV64I-NEXT:    li a4, 0
2094; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2095; RV64I-NEXT:    lb a3, 15(sp)
2096; RV64I-NEXT:    bnez a0, .LBB35_4
2097; RV64I-NEXT:  .LBB35_2: # %atomicrmw.start
2098; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2099; RV64I-NEXT:    slli a0, a3, 56
2100; RV64I-NEXT:    srai a0, a0, 56
2101; RV64I-NEXT:    mv a2, a3
2102; RV64I-NEXT:    blt s1, a0, .LBB35_1
2103; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2104; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2105; RV64I-NEXT:    mv a2, s2
2106; RV64I-NEXT:    j .LBB35_1
2107; RV64I-NEXT:  .LBB35_4: # %atomicrmw.end
2108; RV64I-NEXT:    mv a0, a3
2109; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2110; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2111; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2112; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2113; RV64I-NEXT:    addi sp, sp, 48
2114; RV64I-NEXT:    ret
2115;
2116; RV64IA-LABEL: atomicrmw_max_i8_monotonic:
2117; RV64IA:       # %bb.0:
2118; RV64IA-NEXT:    andi a6, a0, -4
2119; RV64IA-NEXT:    slliw a0, a0, 3
2120; RV64IA-NEXT:    andi a3, a0, 24
2121; RV64IA-NEXT:    li a4, 255
2122; RV64IA-NEXT:    sllw a7, a4, a0
2123; RV64IA-NEXT:    slli a1, a1, 56
2124; RV64IA-NEXT:    srai a1, a1, 56
2125; RV64IA-NEXT:    sllw a1, a1, a0
2126; RV64IA-NEXT:    li a5, 56
2127; RV64IA-NEXT:    sub a3, a5, a3
2128; RV64IA-NEXT:  .LBB35_1: # =>This Inner Loop Header: Depth=1
2129; RV64IA-NEXT:    lr.w a5, (a6)
2130; RV64IA-NEXT:    and a4, a5, a7
2131; RV64IA-NEXT:    mv a2, a5
2132; RV64IA-NEXT:    sll a4, a4, a3
2133; RV64IA-NEXT:    sra a4, a4, a3
2134; RV64IA-NEXT:    bge a4, a1, .LBB35_3
2135; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB35_1 Depth=1
2136; RV64IA-NEXT:    xor a2, a5, a1
2137; RV64IA-NEXT:    and a2, a2, a7
2138; RV64IA-NEXT:    xor a2, a5, a2
2139; RV64IA-NEXT:  .LBB35_3: # in Loop: Header=BB35_1 Depth=1
2140; RV64IA-NEXT:    sc.w a2, a2, (a6)
2141; RV64IA-NEXT:    bnez a2, .LBB35_1
2142; RV64IA-NEXT:  # %bb.4:
2143; RV64IA-NEXT:    srlw a0, a5, a0
2144; RV64IA-NEXT:    ret
2145  %1 = atomicrmw max i8* %a, i8 %b monotonic
2146  ret i8 %1
2147}
2148
2149define i8 @atomicrmw_max_i8_acquire(i8 *%a, i8 %b) nounwind {
2150; RV32I-LABEL: atomicrmw_max_i8_acquire:
2151; RV32I:       # %bb.0:
2152; RV32I-NEXT:    addi sp, sp, -32
2153; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2154; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2155; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2156; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2157; RV32I-NEXT:    mv s0, a0
2158; RV32I-NEXT:    lbu a3, 0(a0)
2159; RV32I-NEXT:    mv s2, a1
2160; RV32I-NEXT:    slli a0, a1, 24
2161; RV32I-NEXT:    srai s1, a0, 24
2162; RV32I-NEXT:    j .LBB36_2
2163; RV32I-NEXT:  .LBB36_1: # %atomicrmw.start
2164; RV32I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2165; RV32I-NEXT:    sb a3, 15(sp)
2166; RV32I-NEXT:    addi a1, sp, 15
2167; RV32I-NEXT:    li a3, 2
2168; RV32I-NEXT:    li a4, 2
2169; RV32I-NEXT:    mv a0, s0
2170; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2171; RV32I-NEXT:    lb a3, 15(sp)
2172; RV32I-NEXT:    bnez a0, .LBB36_4
2173; RV32I-NEXT:  .LBB36_2: # %atomicrmw.start
2174; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2175; RV32I-NEXT:    slli a0, a3, 24
2176; RV32I-NEXT:    srai a0, a0, 24
2177; RV32I-NEXT:    mv a2, a3
2178; RV32I-NEXT:    blt s1, a0, .LBB36_1
2179; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2180; RV32I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2181; RV32I-NEXT:    mv a2, s2
2182; RV32I-NEXT:    j .LBB36_1
2183; RV32I-NEXT:  .LBB36_4: # %atomicrmw.end
2184; RV32I-NEXT:    mv a0, a3
2185; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2186; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2187; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2188; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2189; RV32I-NEXT:    addi sp, sp, 32
2190; RV32I-NEXT:    ret
2191;
2192; RV32IA-LABEL: atomicrmw_max_i8_acquire:
2193; RV32IA:       # %bb.0:
2194; RV32IA-NEXT:    andi a6, a0, -4
2195; RV32IA-NEXT:    slli a0, a0, 3
2196; RV32IA-NEXT:    andi a3, a0, 24
2197; RV32IA-NEXT:    li a4, 255
2198; RV32IA-NEXT:    sll a7, a4, a0
2199; RV32IA-NEXT:    slli a1, a1, 24
2200; RV32IA-NEXT:    srai a1, a1, 24
2201; RV32IA-NEXT:    sll a1, a1, a0
2202; RV32IA-NEXT:    li a5, 24
2203; RV32IA-NEXT:    sub a3, a5, a3
2204; RV32IA-NEXT:  .LBB36_1: # =>This Inner Loop Header: Depth=1
2205; RV32IA-NEXT:    lr.w.aq a5, (a6)
2206; RV32IA-NEXT:    and a4, a5, a7
2207; RV32IA-NEXT:    mv a2, a5
2208; RV32IA-NEXT:    sll a4, a4, a3
2209; RV32IA-NEXT:    sra a4, a4, a3
2210; RV32IA-NEXT:    bge a4, a1, .LBB36_3
2211; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB36_1 Depth=1
2212; RV32IA-NEXT:    xor a2, a5, a1
2213; RV32IA-NEXT:    and a2, a2, a7
2214; RV32IA-NEXT:    xor a2, a5, a2
2215; RV32IA-NEXT:  .LBB36_3: # in Loop: Header=BB36_1 Depth=1
2216; RV32IA-NEXT:    sc.w a2, a2, (a6)
2217; RV32IA-NEXT:    bnez a2, .LBB36_1
2218; RV32IA-NEXT:  # %bb.4:
2219; RV32IA-NEXT:    srl a0, a5, a0
2220; RV32IA-NEXT:    ret
2221;
2222; RV64I-LABEL: atomicrmw_max_i8_acquire:
2223; RV64I:       # %bb.0:
2224; RV64I-NEXT:    addi sp, sp, -48
2225; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2226; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2227; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2228; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2229; RV64I-NEXT:    mv s0, a0
2230; RV64I-NEXT:    lbu a3, 0(a0)
2231; RV64I-NEXT:    mv s2, a1
2232; RV64I-NEXT:    slli a0, a1, 56
2233; RV64I-NEXT:    srai s1, a0, 56
2234; RV64I-NEXT:    j .LBB36_2
2235; RV64I-NEXT:  .LBB36_1: # %atomicrmw.start
2236; RV64I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2237; RV64I-NEXT:    sb a3, 15(sp)
2238; RV64I-NEXT:    addi a1, sp, 15
2239; RV64I-NEXT:    li a3, 2
2240; RV64I-NEXT:    li a4, 2
2241; RV64I-NEXT:    mv a0, s0
2242; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2243; RV64I-NEXT:    lb a3, 15(sp)
2244; RV64I-NEXT:    bnez a0, .LBB36_4
2245; RV64I-NEXT:  .LBB36_2: # %atomicrmw.start
2246; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2247; RV64I-NEXT:    slli a0, a3, 56
2248; RV64I-NEXT:    srai a0, a0, 56
2249; RV64I-NEXT:    mv a2, a3
2250; RV64I-NEXT:    blt s1, a0, .LBB36_1
2251; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2252; RV64I-NEXT:    # in Loop: Header=BB36_2 Depth=1
2253; RV64I-NEXT:    mv a2, s2
2254; RV64I-NEXT:    j .LBB36_1
2255; RV64I-NEXT:  .LBB36_4: # %atomicrmw.end
2256; RV64I-NEXT:    mv a0, a3
2257; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2258; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2259; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2260; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2261; RV64I-NEXT:    addi sp, sp, 48
2262; RV64I-NEXT:    ret
2263;
2264; RV64IA-LABEL: atomicrmw_max_i8_acquire:
2265; RV64IA:       # %bb.0:
2266; RV64IA-NEXT:    andi a6, a0, -4
2267; RV64IA-NEXT:    slliw a0, a0, 3
2268; RV64IA-NEXT:    andi a3, a0, 24
2269; RV64IA-NEXT:    li a4, 255
2270; RV64IA-NEXT:    sllw a7, a4, a0
2271; RV64IA-NEXT:    slli a1, a1, 56
2272; RV64IA-NEXT:    srai a1, a1, 56
2273; RV64IA-NEXT:    sllw a1, a1, a0
2274; RV64IA-NEXT:    li a5, 56
2275; RV64IA-NEXT:    sub a3, a5, a3
2276; RV64IA-NEXT:  .LBB36_1: # =>This Inner Loop Header: Depth=1
2277; RV64IA-NEXT:    lr.w.aq a5, (a6)
2278; RV64IA-NEXT:    and a4, a5, a7
2279; RV64IA-NEXT:    mv a2, a5
2280; RV64IA-NEXT:    sll a4, a4, a3
2281; RV64IA-NEXT:    sra a4, a4, a3
2282; RV64IA-NEXT:    bge a4, a1, .LBB36_3
2283; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB36_1 Depth=1
2284; RV64IA-NEXT:    xor a2, a5, a1
2285; RV64IA-NEXT:    and a2, a2, a7
2286; RV64IA-NEXT:    xor a2, a5, a2
2287; RV64IA-NEXT:  .LBB36_3: # in Loop: Header=BB36_1 Depth=1
2288; RV64IA-NEXT:    sc.w a2, a2, (a6)
2289; RV64IA-NEXT:    bnez a2, .LBB36_1
2290; RV64IA-NEXT:  # %bb.4:
2291; RV64IA-NEXT:    srlw a0, a5, a0
2292; RV64IA-NEXT:    ret
2293  %1 = atomicrmw max i8* %a, i8 %b acquire
2294  ret i8 %1
2295}
2296
2297define i8 @atomicrmw_max_i8_release(i8 *%a, i8 %b) nounwind {
2298; RV32I-LABEL: atomicrmw_max_i8_release:
2299; RV32I:       # %bb.0:
2300; RV32I-NEXT:    addi sp, sp, -32
2301; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2302; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2303; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2304; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2305; RV32I-NEXT:    mv s0, a0
2306; RV32I-NEXT:    lbu a3, 0(a0)
2307; RV32I-NEXT:    mv s2, a1
2308; RV32I-NEXT:    slli a0, a1, 24
2309; RV32I-NEXT:    srai s1, a0, 24
2310; RV32I-NEXT:    j .LBB37_2
2311; RV32I-NEXT:  .LBB37_1: # %atomicrmw.start
2312; RV32I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2313; RV32I-NEXT:    sb a3, 15(sp)
2314; RV32I-NEXT:    addi a1, sp, 15
2315; RV32I-NEXT:    li a3, 3
2316; RV32I-NEXT:    mv a0, s0
2317; RV32I-NEXT:    li a4, 0
2318; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2319; RV32I-NEXT:    lb a3, 15(sp)
2320; RV32I-NEXT:    bnez a0, .LBB37_4
2321; RV32I-NEXT:  .LBB37_2: # %atomicrmw.start
2322; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2323; RV32I-NEXT:    slli a0, a3, 24
2324; RV32I-NEXT:    srai a0, a0, 24
2325; RV32I-NEXT:    mv a2, a3
2326; RV32I-NEXT:    blt s1, a0, .LBB37_1
2327; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2328; RV32I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2329; RV32I-NEXT:    mv a2, s2
2330; RV32I-NEXT:    j .LBB37_1
2331; RV32I-NEXT:  .LBB37_4: # %atomicrmw.end
2332; RV32I-NEXT:    mv a0, a3
2333; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2334; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2335; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2336; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2337; RV32I-NEXT:    addi sp, sp, 32
2338; RV32I-NEXT:    ret
2339;
2340; RV32IA-LABEL: atomicrmw_max_i8_release:
2341; RV32IA:       # %bb.0:
2342; RV32IA-NEXT:    andi a6, a0, -4
2343; RV32IA-NEXT:    slli a0, a0, 3
2344; RV32IA-NEXT:    andi a3, a0, 24
2345; RV32IA-NEXT:    li a4, 255
2346; RV32IA-NEXT:    sll a7, a4, a0
2347; RV32IA-NEXT:    slli a1, a1, 24
2348; RV32IA-NEXT:    srai a1, a1, 24
2349; RV32IA-NEXT:    sll a1, a1, a0
2350; RV32IA-NEXT:    li a5, 24
2351; RV32IA-NEXT:    sub a3, a5, a3
2352; RV32IA-NEXT:  .LBB37_1: # =>This Inner Loop Header: Depth=1
2353; RV32IA-NEXT:    lr.w a5, (a6)
2354; RV32IA-NEXT:    and a4, a5, a7
2355; RV32IA-NEXT:    mv a2, a5
2356; RV32IA-NEXT:    sll a4, a4, a3
2357; RV32IA-NEXT:    sra a4, a4, a3
2358; RV32IA-NEXT:    bge a4, a1, .LBB37_3
2359; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB37_1 Depth=1
2360; RV32IA-NEXT:    xor a2, a5, a1
2361; RV32IA-NEXT:    and a2, a2, a7
2362; RV32IA-NEXT:    xor a2, a5, a2
2363; RV32IA-NEXT:  .LBB37_3: # in Loop: Header=BB37_1 Depth=1
2364; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
2365; RV32IA-NEXT:    bnez a2, .LBB37_1
2366; RV32IA-NEXT:  # %bb.4:
2367; RV32IA-NEXT:    srl a0, a5, a0
2368; RV32IA-NEXT:    ret
2369;
2370; RV64I-LABEL: atomicrmw_max_i8_release:
2371; RV64I:       # %bb.0:
2372; RV64I-NEXT:    addi sp, sp, -48
2373; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2374; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2375; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2376; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2377; RV64I-NEXT:    mv s0, a0
2378; RV64I-NEXT:    lbu a3, 0(a0)
2379; RV64I-NEXT:    mv s2, a1
2380; RV64I-NEXT:    slli a0, a1, 56
2381; RV64I-NEXT:    srai s1, a0, 56
2382; RV64I-NEXT:    j .LBB37_2
2383; RV64I-NEXT:  .LBB37_1: # %atomicrmw.start
2384; RV64I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2385; RV64I-NEXT:    sb a3, 15(sp)
2386; RV64I-NEXT:    addi a1, sp, 15
2387; RV64I-NEXT:    li a3, 3
2388; RV64I-NEXT:    mv a0, s0
2389; RV64I-NEXT:    li a4, 0
2390; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2391; RV64I-NEXT:    lb a3, 15(sp)
2392; RV64I-NEXT:    bnez a0, .LBB37_4
2393; RV64I-NEXT:  .LBB37_2: # %atomicrmw.start
2394; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2395; RV64I-NEXT:    slli a0, a3, 56
2396; RV64I-NEXT:    srai a0, a0, 56
2397; RV64I-NEXT:    mv a2, a3
2398; RV64I-NEXT:    blt s1, a0, .LBB37_1
2399; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2400; RV64I-NEXT:    # in Loop: Header=BB37_2 Depth=1
2401; RV64I-NEXT:    mv a2, s2
2402; RV64I-NEXT:    j .LBB37_1
2403; RV64I-NEXT:  .LBB37_4: # %atomicrmw.end
2404; RV64I-NEXT:    mv a0, a3
2405; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2406; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2407; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2408; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2409; RV64I-NEXT:    addi sp, sp, 48
2410; RV64I-NEXT:    ret
2411;
2412; RV64IA-LABEL: atomicrmw_max_i8_release:
2413; RV64IA:       # %bb.0:
2414; RV64IA-NEXT:    andi a6, a0, -4
2415; RV64IA-NEXT:    slliw a0, a0, 3
2416; RV64IA-NEXT:    andi a3, a0, 24
2417; RV64IA-NEXT:    li a4, 255
2418; RV64IA-NEXT:    sllw a7, a4, a0
2419; RV64IA-NEXT:    slli a1, a1, 56
2420; RV64IA-NEXT:    srai a1, a1, 56
2421; RV64IA-NEXT:    sllw a1, a1, a0
2422; RV64IA-NEXT:    li a5, 56
2423; RV64IA-NEXT:    sub a3, a5, a3
2424; RV64IA-NEXT:  .LBB37_1: # =>This Inner Loop Header: Depth=1
2425; RV64IA-NEXT:    lr.w a5, (a6)
2426; RV64IA-NEXT:    and a4, a5, a7
2427; RV64IA-NEXT:    mv a2, a5
2428; RV64IA-NEXT:    sll a4, a4, a3
2429; RV64IA-NEXT:    sra a4, a4, a3
2430; RV64IA-NEXT:    bge a4, a1, .LBB37_3
2431; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB37_1 Depth=1
2432; RV64IA-NEXT:    xor a2, a5, a1
2433; RV64IA-NEXT:    and a2, a2, a7
2434; RV64IA-NEXT:    xor a2, a5, a2
2435; RV64IA-NEXT:  .LBB37_3: # in Loop: Header=BB37_1 Depth=1
2436; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
2437; RV64IA-NEXT:    bnez a2, .LBB37_1
2438; RV64IA-NEXT:  # %bb.4:
2439; RV64IA-NEXT:    srlw a0, a5, a0
2440; RV64IA-NEXT:    ret
2441  %1 = atomicrmw max i8* %a, i8 %b release
2442  ret i8 %1
2443}
2444
2445define i8 @atomicrmw_max_i8_acq_rel(i8 *%a, i8 %b) nounwind {
2446; RV32I-LABEL: atomicrmw_max_i8_acq_rel:
2447; RV32I:       # %bb.0:
2448; RV32I-NEXT:    addi sp, sp, -32
2449; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2450; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2451; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2452; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2453; RV32I-NEXT:    mv s0, a0
2454; RV32I-NEXT:    lbu a3, 0(a0)
2455; RV32I-NEXT:    mv s2, a1
2456; RV32I-NEXT:    slli a0, a1, 24
2457; RV32I-NEXT:    srai s1, a0, 24
2458; RV32I-NEXT:    j .LBB38_2
2459; RV32I-NEXT:  .LBB38_1: # %atomicrmw.start
2460; RV32I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2461; RV32I-NEXT:    sb a3, 15(sp)
2462; RV32I-NEXT:    addi a1, sp, 15
2463; RV32I-NEXT:    li a3, 4
2464; RV32I-NEXT:    li a4, 2
2465; RV32I-NEXT:    mv a0, s0
2466; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2467; RV32I-NEXT:    lb a3, 15(sp)
2468; RV32I-NEXT:    bnez a0, .LBB38_4
2469; RV32I-NEXT:  .LBB38_2: # %atomicrmw.start
2470; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2471; RV32I-NEXT:    slli a0, a3, 24
2472; RV32I-NEXT:    srai a0, a0, 24
2473; RV32I-NEXT:    mv a2, a3
2474; RV32I-NEXT:    blt s1, a0, .LBB38_1
2475; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2476; RV32I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2477; RV32I-NEXT:    mv a2, s2
2478; RV32I-NEXT:    j .LBB38_1
2479; RV32I-NEXT:  .LBB38_4: # %atomicrmw.end
2480; RV32I-NEXT:    mv a0, a3
2481; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2482; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2483; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2484; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2485; RV32I-NEXT:    addi sp, sp, 32
2486; RV32I-NEXT:    ret
2487;
2488; RV32IA-LABEL: atomicrmw_max_i8_acq_rel:
2489; RV32IA:       # %bb.0:
2490; RV32IA-NEXT:    andi a6, a0, -4
2491; RV32IA-NEXT:    slli a0, a0, 3
2492; RV32IA-NEXT:    andi a3, a0, 24
2493; RV32IA-NEXT:    li a4, 255
2494; RV32IA-NEXT:    sll a7, a4, a0
2495; RV32IA-NEXT:    slli a1, a1, 24
2496; RV32IA-NEXT:    srai a1, a1, 24
2497; RV32IA-NEXT:    sll a1, a1, a0
2498; RV32IA-NEXT:    li a5, 24
2499; RV32IA-NEXT:    sub a3, a5, a3
2500; RV32IA-NEXT:  .LBB38_1: # =>This Inner Loop Header: Depth=1
2501; RV32IA-NEXT:    lr.w.aq a5, (a6)
2502; RV32IA-NEXT:    and a4, a5, a7
2503; RV32IA-NEXT:    mv a2, a5
2504; RV32IA-NEXT:    sll a4, a4, a3
2505; RV32IA-NEXT:    sra a4, a4, a3
2506; RV32IA-NEXT:    bge a4, a1, .LBB38_3
2507; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB38_1 Depth=1
2508; RV32IA-NEXT:    xor a2, a5, a1
2509; RV32IA-NEXT:    and a2, a2, a7
2510; RV32IA-NEXT:    xor a2, a5, a2
2511; RV32IA-NEXT:  .LBB38_3: # in Loop: Header=BB38_1 Depth=1
2512; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
2513; RV32IA-NEXT:    bnez a2, .LBB38_1
2514; RV32IA-NEXT:  # %bb.4:
2515; RV32IA-NEXT:    srl a0, a5, a0
2516; RV32IA-NEXT:    ret
2517;
2518; RV64I-LABEL: atomicrmw_max_i8_acq_rel:
2519; RV64I:       # %bb.0:
2520; RV64I-NEXT:    addi sp, sp, -48
2521; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2522; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2523; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2524; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2525; RV64I-NEXT:    mv s0, a0
2526; RV64I-NEXT:    lbu a3, 0(a0)
2527; RV64I-NEXT:    mv s2, a1
2528; RV64I-NEXT:    slli a0, a1, 56
2529; RV64I-NEXT:    srai s1, a0, 56
2530; RV64I-NEXT:    j .LBB38_2
2531; RV64I-NEXT:  .LBB38_1: # %atomicrmw.start
2532; RV64I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2533; RV64I-NEXT:    sb a3, 15(sp)
2534; RV64I-NEXT:    addi a1, sp, 15
2535; RV64I-NEXT:    li a3, 4
2536; RV64I-NEXT:    li a4, 2
2537; RV64I-NEXT:    mv a0, s0
2538; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2539; RV64I-NEXT:    lb a3, 15(sp)
2540; RV64I-NEXT:    bnez a0, .LBB38_4
2541; RV64I-NEXT:  .LBB38_2: # %atomicrmw.start
2542; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2543; RV64I-NEXT:    slli a0, a3, 56
2544; RV64I-NEXT:    srai a0, a0, 56
2545; RV64I-NEXT:    mv a2, a3
2546; RV64I-NEXT:    blt s1, a0, .LBB38_1
2547; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2548; RV64I-NEXT:    # in Loop: Header=BB38_2 Depth=1
2549; RV64I-NEXT:    mv a2, s2
2550; RV64I-NEXT:    j .LBB38_1
2551; RV64I-NEXT:  .LBB38_4: # %atomicrmw.end
2552; RV64I-NEXT:    mv a0, a3
2553; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2554; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2555; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2556; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2557; RV64I-NEXT:    addi sp, sp, 48
2558; RV64I-NEXT:    ret
2559;
2560; RV64IA-LABEL: atomicrmw_max_i8_acq_rel:
2561; RV64IA:       # %bb.0:
2562; RV64IA-NEXT:    andi a6, a0, -4
2563; RV64IA-NEXT:    slliw a0, a0, 3
2564; RV64IA-NEXT:    andi a3, a0, 24
2565; RV64IA-NEXT:    li a4, 255
2566; RV64IA-NEXT:    sllw a7, a4, a0
2567; RV64IA-NEXT:    slli a1, a1, 56
2568; RV64IA-NEXT:    srai a1, a1, 56
2569; RV64IA-NEXT:    sllw a1, a1, a0
2570; RV64IA-NEXT:    li a5, 56
2571; RV64IA-NEXT:    sub a3, a5, a3
2572; RV64IA-NEXT:  .LBB38_1: # =>This Inner Loop Header: Depth=1
2573; RV64IA-NEXT:    lr.w.aq a5, (a6)
2574; RV64IA-NEXT:    and a4, a5, a7
2575; RV64IA-NEXT:    mv a2, a5
2576; RV64IA-NEXT:    sll a4, a4, a3
2577; RV64IA-NEXT:    sra a4, a4, a3
2578; RV64IA-NEXT:    bge a4, a1, .LBB38_3
2579; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB38_1 Depth=1
2580; RV64IA-NEXT:    xor a2, a5, a1
2581; RV64IA-NEXT:    and a2, a2, a7
2582; RV64IA-NEXT:    xor a2, a5, a2
2583; RV64IA-NEXT:  .LBB38_3: # in Loop: Header=BB38_1 Depth=1
2584; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
2585; RV64IA-NEXT:    bnez a2, .LBB38_1
2586; RV64IA-NEXT:  # %bb.4:
2587; RV64IA-NEXT:    srlw a0, a5, a0
2588; RV64IA-NEXT:    ret
2589  %1 = atomicrmw max i8* %a, i8 %b acq_rel
2590  ret i8 %1
2591}
2592
2593define i8 @atomicrmw_max_i8_seq_cst(i8 *%a, i8 %b) nounwind {
2594; RV32I-LABEL: atomicrmw_max_i8_seq_cst:
2595; RV32I:       # %bb.0:
2596; RV32I-NEXT:    addi sp, sp, -32
2597; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2598; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2599; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2600; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2601; RV32I-NEXT:    mv s0, a0
2602; RV32I-NEXT:    lbu a3, 0(a0)
2603; RV32I-NEXT:    mv s2, a1
2604; RV32I-NEXT:    slli a0, a1, 24
2605; RV32I-NEXT:    srai s1, a0, 24
2606; RV32I-NEXT:    j .LBB39_2
2607; RV32I-NEXT:  .LBB39_1: # %atomicrmw.start
2608; RV32I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2609; RV32I-NEXT:    sb a3, 15(sp)
2610; RV32I-NEXT:    addi a1, sp, 15
2611; RV32I-NEXT:    li a3, 5
2612; RV32I-NEXT:    li a4, 5
2613; RV32I-NEXT:    mv a0, s0
2614; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2615; RV32I-NEXT:    lb a3, 15(sp)
2616; RV32I-NEXT:    bnez a0, .LBB39_4
2617; RV32I-NEXT:  .LBB39_2: # %atomicrmw.start
2618; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2619; RV32I-NEXT:    slli a0, a3, 24
2620; RV32I-NEXT:    srai a0, a0, 24
2621; RV32I-NEXT:    mv a2, a3
2622; RV32I-NEXT:    blt s1, a0, .LBB39_1
2623; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2624; RV32I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2625; RV32I-NEXT:    mv a2, s2
2626; RV32I-NEXT:    j .LBB39_1
2627; RV32I-NEXT:  .LBB39_4: # %atomicrmw.end
2628; RV32I-NEXT:    mv a0, a3
2629; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2630; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2631; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2632; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2633; RV32I-NEXT:    addi sp, sp, 32
2634; RV32I-NEXT:    ret
2635;
2636; RV32IA-LABEL: atomicrmw_max_i8_seq_cst:
2637; RV32IA:       # %bb.0:
2638; RV32IA-NEXT:    andi a6, a0, -4
2639; RV32IA-NEXT:    slli a0, a0, 3
2640; RV32IA-NEXT:    andi a3, a0, 24
2641; RV32IA-NEXT:    li a4, 255
2642; RV32IA-NEXT:    sll a7, a4, a0
2643; RV32IA-NEXT:    slli a1, a1, 24
2644; RV32IA-NEXT:    srai a1, a1, 24
2645; RV32IA-NEXT:    sll a1, a1, a0
2646; RV32IA-NEXT:    li a5, 24
2647; RV32IA-NEXT:    sub a3, a5, a3
2648; RV32IA-NEXT:  .LBB39_1: # =>This Inner Loop Header: Depth=1
2649; RV32IA-NEXT:    lr.w.aqrl a5, (a6)
2650; RV32IA-NEXT:    and a4, a5, a7
2651; RV32IA-NEXT:    mv a2, a5
2652; RV32IA-NEXT:    sll a4, a4, a3
2653; RV32IA-NEXT:    sra a4, a4, a3
2654; RV32IA-NEXT:    bge a4, a1, .LBB39_3
2655; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB39_1 Depth=1
2656; RV32IA-NEXT:    xor a2, a5, a1
2657; RV32IA-NEXT:    and a2, a2, a7
2658; RV32IA-NEXT:    xor a2, a5, a2
2659; RV32IA-NEXT:  .LBB39_3: # in Loop: Header=BB39_1 Depth=1
2660; RV32IA-NEXT:    sc.w.aqrl a2, a2, (a6)
2661; RV32IA-NEXT:    bnez a2, .LBB39_1
2662; RV32IA-NEXT:  # %bb.4:
2663; RV32IA-NEXT:    srl a0, a5, a0
2664; RV32IA-NEXT:    ret
2665;
2666; RV64I-LABEL: atomicrmw_max_i8_seq_cst:
2667; RV64I:       # %bb.0:
2668; RV64I-NEXT:    addi sp, sp, -48
2669; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2670; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2671; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2672; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2673; RV64I-NEXT:    mv s0, a0
2674; RV64I-NEXT:    lbu a3, 0(a0)
2675; RV64I-NEXT:    mv s2, a1
2676; RV64I-NEXT:    slli a0, a1, 56
2677; RV64I-NEXT:    srai s1, a0, 56
2678; RV64I-NEXT:    j .LBB39_2
2679; RV64I-NEXT:  .LBB39_1: # %atomicrmw.start
2680; RV64I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2681; RV64I-NEXT:    sb a3, 15(sp)
2682; RV64I-NEXT:    addi a1, sp, 15
2683; RV64I-NEXT:    li a3, 5
2684; RV64I-NEXT:    li a4, 5
2685; RV64I-NEXT:    mv a0, s0
2686; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2687; RV64I-NEXT:    lb a3, 15(sp)
2688; RV64I-NEXT:    bnez a0, .LBB39_4
2689; RV64I-NEXT:  .LBB39_2: # %atomicrmw.start
2690; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2691; RV64I-NEXT:    slli a0, a3, 56
2692; RV64I-NEXT:    srai a0, a0, 56
2693; RV64I-NEXT:    mv a2, a3
2694; RV64I-NEXT:    blt s1, a0, .LBB39_1
2695; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2696; RV64I-NEXT:    # in Loop: Header=BB39_2 Depth=1
2697; RV64I-NEXT:    mv a2, s2
2698; RV64I-NEXT:    j .LBB39_1
2699; RV64I-NEXT:  .LBB39_4: # %atomicrmw.end
2700; RV64I-NEXT:    mv a0, a3
2701; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2702; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2703; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2704; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2705; RV64I-NEXT:    addi sp, sp, 48
2706; RV64I-NEXT:    ret
2707;
2708; RV64IA-LABEL: atomicrmw_max_i8_seq_cst:
2709; RV64IA:       # %bb.0:
2710; RV64IA-NEXT:    andi a6, a0, -4
2711; RV64IA-NEXT:    slliw a0, a0, 3
2712; RV64IA-NEXT:    andi a3, a0, 24
2713; RV64IA-NEXT:    li a4, 255
2714; RV64IA-NEXT:    sllw a7, a4, a0
2715; RV64IA-NEXT:    slli a1, a1, 56
2716; RV64IA-NEXT:    srai a1, a1, 56
2717; RV64IA-NEXT:    sllw a1, a1, a0
2718; RV64IA-NEXT:    li a5, 56
2719; RV64IA-NEXT:    sub a3, a5, a3
2720; RV64IA-NEXT:  .LBB39_1: # =>This Inner Loop Header: Depth=1
2721; RV64IA-NEXT:    lr.w.aqrl a5, (a6)
2722; RV64IA-NEXT:    and a4, a5, a7
2723; RV64IA-NEXT:    mv a2, a5
2724; RV64IA-NEXT:    sll a4, a4, a3
2725; RV64IA-NEXT:    sra a4, a4, a3
2726; RV64IA-NEXT:    bge a4, a1, .LBB39_3
2727; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB39_1 Depth=1
2728; RV64IA-NEXT:    xor a2, a5, a1
2729; RV64IA-NEXT:    and a2, a2, a7
2730; RV64IA-NEXT:    xor a2, a5, a2
2731; RV64IA-NEXT:  .LBB39_3: # in Loop: Header=BB39_1 Depth=1
2732; RV64IA-NEXT:    sc.w.aqrl a2, a2, (a6)
2733; RV64IA-NEXT:    bnez a2, .LBB39_1
2734; RV64IA-NEXT:  # %bb.4:
2735; RV64IA-NEXT:    srlw a0, a5, a0
2736; RV64IA-NEXT:    ret
2737  %1 = atomicrmw max i8* %a, i8 %b seq_cst
2738  ret i8 %1
2739}
2740
2741define i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind {
2742; RV32I-LABEL: atomicrmw_min_i8_monotonic:
2743; RV32I:       # %bb.0:
2744; RV32I-NEXT:    addi sp, sp, -32
2745; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2746; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2747; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2748; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2749; RV32I-NEXT:    mv s0, a0
2750; RV32I-NEXT:    lbu a3, 0(a0)
2751; RV32I-NEXT:    mv s2, a1
2752; RV32I-NEXT:    slli a0, a1, 24
2753; RV32I-NEXT:    srai s1, a0, 24
2754; RV32I-NEXT:    j .LBB40_2
2755; RV32I-NEXT:  .LBB40_1: # %atomicrmw.start
2756; RV32I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2757; RV32I-NEXT:    sb a3, 15(sp)
2758; RV32I-NEXT:    addi a1, sp, 15
2759; RV32I-NEXT:    mv a0, s0
2760; RV32I-NEXT:    li a3, 0
2761; RV32I-NEXT:    li a4, 0
2762; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2763; RV32I-NEXT:    lb a3, 15(sp)
2764; RV32I-NEXT:    bnez a0, .LBB40_4
2765; RV32I-NEXT:  .LBB40_2: # %atomicrmw.start
2766; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2767; RV32I-NEXT:    slli a0, a3, 24
2768; RV32I-NEXT:    srai a0, a0, 24
2769; RV32I-NEXT:    mv a2, a3
2770; RV32I-NEXT:    bge s1, a0, .LBB40_1
2771; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2772; RV32I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2773; RV32I-NEXT:    mv a2, s2
2774; RV32I-NEXT:    j .LBB40_1
2775; RV32I-NEXT:  .LBB40_4: # %atomicrmw.end
2776; RV32I-NEXT:    mv a0, a3
2777; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2778; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2779; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2780; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2781; RV32I-NEXT:    addi sp, sp, 32
2782; RV32I-NEXT:    ret
2783;
2784; RV32IA-LABEL: atomicrmw_min_i8_monotonic:
2785; RV32IA:       # %bb.0:
2786; RV32IA-NEXT:    andi a6, a0, -4
2787; RV32IA-NEXT:    slli a0, a0, 3
2788; RV32IA-NEXT:    andi a3, a0, 24
2789; RV32IA-NEXT:    li a4, 255
2790; RV32IA-NEXT:    sll a7, a4, a0
2791; RV32IA-NEXT:    slli a1, a1, 24
2792; RV32IA-NEXT:    srai a1, a1, 24
2793; RV32IA-NEXT:    sll a1, a1, a0
2794; RV32IA-NEXT:    li a5, 24
2795; RV32IA-NEXT:    sub a3, a5, a3
2796; RV32IA-NEXT:  .LBB40_1: # =>This Inner Loop Header: Depth=1
2797; RV32IA-NEXT:    lr.w a5, (a6)
2798; RV32IA-NEXT:    and a4, a5, a7
2799; RV32IA-NEXT:    mv a2, a5
2800; RV32IA-NEXT:    sll a4, a4, a3
2801; RV32IA-NEXT:    sra a4, a4, a3
2802; RV32IA-NEXT:    bge a1, a4, .LBB40_3
2803; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB40_1 Depth=1
2804; RV32IA-NEXT:    xor a2, a5, a1
2805; RV32IA-NEXT:    and a2, a2, a7
2806; RV32IA-NEXT:    xor a2, a5, a2
2807; RV32IA-NEXT:  .LBB40_3: # in Loop: Header=BB40_1 Depth=1
2808; RV32IA-NEXT:    sc.w a2, a2, (a6)
2809; RV32IA-NEXT:    bnez a2, .LBB40_1
2810; RV32IA-NEXT:  # %bb.4:
2811; RV32IA-NEXT:    srl a0, a5, a0
2812; RV32IA-NEXT:    ret
2813;
2814; RV64I-LABEL: atomicrmw_min_i8_monotonic:
2815; RV64I:       # %bb.0:
2816; RV64I-NEXT:    addi sp, sp, -48
2817; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2818; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2819; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2820; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2821; RV64I-NEXT:    mv s0, a0
2822; RV64I-NEXT:    lbu a3, 0(a0)
2823; RV64I-NEXT:    mv s2, a1
2824; RV64I-NEXT:    slli a0, a1, 56
2825; RV64I-NEXT:    srai s1, a0, 56
2826; RV64I-NEXT:    j .LBB40_2
2827; RV64I-NEXT:  .LBB40_1: # %atomicrmw.start
2828; RV64I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2829; RV64I-NEXT:    sb a3, 15(sp)
2830; RV64I-NEXT:    addi a1, sp, 15
2831; RV64I-NEXT:    mv a0, s0
2832; RV64I-NEXT:    li a3, 0
2833; RV64I-NEXT:    li a4, 0
2834; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2835; RV64I-NEXT:    lb a3, 15(sp)
2836; RV64I-NEXT:    bnez a0, .LBB40_4
2837; RV64I-NEXT:  .LBB40_2: # %atomicrmw.start
2838; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2839; RV64I-NEXT:    slli a0, a3, 56
2840; RV64I-NEXT:    srai a0, a0, 56
2841; RV64I-NEXT:    mv a2, a3
2842; RV64I-NEXT:    bge s1, a0, .LBB40_1
2843; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2844; RV64I-NEXT:    # in Loop: Header=BB40_2 Depth=1
2845; RV64I-NEXT:    mv a2, s2
2846; RV64I-NEXT:    j .LBB40_1
2847; RV64I-NEXT:  .LBB40_4: # %atomicrmw.end
2848; RV64I-NEXT:    mv a0, a3
2849; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2850; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2851; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2852; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2853; RV64I-NEXT:    addi sp, sp, 48
2854; RV64I-NEXT:    ret
2855;
2856; RV64IA-LABEL: atomicrmw_min_i8_monotonic:
2857; RV64IA:       # %bb.0:
2858; RV64IA-NEXT:    andi a6, a0, -4
2859; RV64IA-NEXT:    slliw a0, a0, 3
2860; RV64IA-NEXT:    andi a3, a0, 24
2861; RV64IA-NEXT:    li a4, 255
2862; RV64IA-NEXT:    sllw a7, a4, a0
2863; RV64IA-NEXT:    slli a1, a1, 56
2864; RV64IA-NEXT:    srai a1, a1, 56
2865; RV64IA-NEXT:    sllw a1, a1, a0
2866; RV64IA-NEXT:    li a5, 56
2867; RV64IA-NEXT:    sub a3, a5, a3
2868; RV64IA-NEXT:  .LBB40_1: # =>This Inner Loop Header: Depth=1
2869; RV64IA-NEXT:    lr.w a5, (a6)
2870; RV64IA-NEXT:    and a4, a5, a7
2871; RV64IA-NEXT:    mv a2, a5
2872; RV64IA-NEXT:    sll a4, a4, a3
2873; RV64IA-NEXT:    sra a4, a4, a3
2874; RV64IA-NEXT:    bge a1, a4, .LBB40_3
2875; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB40_1 Depth=1
2876; RV64IA-NEXT:    xor a2, a5, a1
2877; RV64IA-NEXT:    and a2, a2, a7
2878; RV64IA-NEXT:    xor a2, a5, a2
2879; RV64IA-NEXT:  .LBB40_3: # in Loop: Header=BB40_1 Depth=1
2880; RV64IA-NEXT:    sc.w a2, a2, (a6)
2881; RV64IA-NEXT:    bnez a2, .LBB40_1
2882; RV64IA-NEXT:  # %bb.4:
2883; RV64IA-NEXT:    srlw a0, a5, a0
2884; RV64IA-NEXT:    ret
2885  %1 = atomicrmw min i8* %a, i8 %b monotonic
2886  ret i8 %1
2887}
2888
2889define i8 @atomicrmw_min_i8_acquire(i8 *%a, i8 %b) nounwind {
2890; RV32I-LABEL: atomicrmw_min_i8_acquire:
2891; RV32I:       # %bb.0:
2892; RV32I-NEXT:    addi sp, sp, -32
2893; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2894; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2895; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2896; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2897; RV32I-NEXT:    mv s0, a0
2898; RV32I-NEXT:    lbu a3, 0(a0)
2899; RV32I-NEXT:    mv s2, a1
2900; RV32I-NEXT:    slli a0, a1, 24
2901; RV32I-NEXT:    srai s1, a0, 24
2902; RV32I-NEXT:    j .LBB41_2
2903; RV32I-NEXT:  .LBB41_1: # %atomicrmw.start
2904; RV32I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2905; RV32I-NEXT:    sb a3, 15(sp)
2906; RV32I-NEXT:    addi a1, sp, 15
2907; RV32I-NEXT:    li a3, 2
2908; RV32I-NEXT:    li a4, 2
2909; RV32I-NEXT:    mv a0, s0
2910; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
2911; RV32I-NEXT:    lb a3, 15(sp)
2912; RV32I-NEXT:    bnez a0, .LBB41_4
2913; RV32I-NEXT:  .LBB41_2: # %atomicrmw.start
2914; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2915; RV32I-NEXT:    slli a0, a3, 24
2916; RV32I-NEXT:    srai a0, a0, 24
2917; RV32I-NEXT:    mv a2, a3
2918; RV32I-NEXT:    bge s1, a0, .LBB41_1
2919; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2920; RV32I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2921; RV32I-NEXT:    mv a2, s2
2922; RV32I-NEXT:    j .LBB41_1
2923; RV32I-NEXT:  .LBB41_4: # %atomicrmw.end
2924; RV32I-NEXT:    mv a0, a3
2925; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2926; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2927; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2928; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2929; RV32I-NEXT:    addi sp, sp, 32
2930; RV32I-NEXT:    ret
2931;
2932; RV32IA-LABEL: atomicrmw_min_i8_acquire:
2933; RV32IA:       # %bb.0:
2934; RV32IA-NEXT:    andi a6, a0, -4
2935; RV32IA-NEXT:    slli a0, a0, 3
2936; RV32IA-NEXT:    andi a3, a0, 24
2937; RV32IA-NEXT:    li a4, 255
2938; RV32IA-NEXT:    sll a7, a4, a0
2939; RV32IA-NEXT:    slli a1, a1, 24
2940; RV32IA-NEXT:    srai a1, a1, 24
2941; RV32IA-NEXT:    sll a1, a1, a0
2942; RV32IA-NEXT:    li a5, 24
2943; RV32IA-NEXT:    sub a3, a5, a3
2944; RV32IA-NEXT:  .LBB41_1: # =>This Inner Loop Header: Depth=1
2945; RV32IA-NEXT:    lr.w.aq a5, (a6)
2946; RV32IA-NEXT:    and a4, a5, a7
2947; RV32IA-NEXT:    mv a2, a5
2948; RV32IA-NEXT:    sll a4, a4, a3
2949; RV32IA-NEXT:    sra a4, a4, a3
2950; RV32IA-NEXT:    bge a1, a4, .LBB41_3
2951; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB41_1 Depth=1
2952; RV32IA-NEXT:    xor a2, a5, a1
2953; RV32IA-NEXT:    and a2, a2, a7
2954; RV32IA-NEXT:    xor a2, a5, a2
2955; RV32IA-NEXT:  .LBB41_3: # in Loop: Header=BB41_1 Depth=1
2956; RV32IA-NEXT:    sc.w a2, a2, (a6)
2957; RV32IA-NEXT:    bnez a2, .LBB41_1
2958; RV32IA-NEXT:  # %bb.4:
2959; RV32IA-NEXT:    srl a0, a5, a0
2960; RV32IA-NEXT:    ret
2961;
2962; RV64I-LABEL: atomicrmw_min_i8_acquire:
2963; RV64I:       # %bb.0:
2964; RV64I-NEXT:    addi sp, sp, -48
2965; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2966; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2967; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2968; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2969; RV64I-NEXT:    mv s0, a0
2970; RV64I-NEXT:    lbu a3, 0(a0)
2971; RV64I-NEXT:    mv s2, a1
2972; RV64I-NEXT:    slli a0, a1, 56
2973; RV64I-NEXT:    srai s1, a0, 56
2974; RV64I-NEXT:    j .LBB41_2
2975; RV64I-NEXT:  .LBB41_1: # %atomicrmw.start
2976; RV64I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2977; RV64I-NEXT:    sb a3, 15(sp)
2978; RV64I-NEXT:    addi a1, sp, 15
2979; RV64I-NEXT:    li a3, 2
2980; RV64I-NEXT:    li a4, 2
2981; RV64I-NEXT:    mv a0, s0
2982; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
2983; RV64I-NEXT:    lb a3, 15(sp)
2984; RV64I-NEXT:    bnez a0, .LBB41_4
2985; RV64I-NEXT:  .LBB41_2: # %atomicrmw.start
2986; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2987; RV64I-NEXT:    slli a0, a3, 56
2988; RV64I-NEXT:    srai a0, a0, 56
2989; RV64I-NEXT:    mv a2, a3
2990; RV64I-NEXT:    bge s1, a0, .LBB41_1
2991; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2992; RV64I-NEXT:    # in Loop: Header=BB41_2 Depth=1
2993; RV64I-NEXT:    mv a2, s2
2994; RV64I-NEXT:    j .LBB41_1
2995; RV64I-NEXT:  .LBB41_4: # %atomicrmw.end
2996; RV64I-NEXT:    mv a0, a3
2997; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2998; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2999; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3000; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3001; RV64I-NEXT:    addi sp, sp, 48
3002; RV64I-NEXT:    ret
3003;
3004; RV64IA-LABEL: atomicrmw_min_i8_acquire:
3005; RV64IA:       # %bb.0:
3006; RV64IA-NEXT:    andi a6, a0, -4
3007; RV64IA-NEXT:    slliw a0, a0, 3
3008; RV64IA-NEXT:    andi a3, a0, 24
3009; RV64IA-NEXT:    li a4, 255
3010; RV64IA-NEXT:    sllw a7, a4, a0
3011; RV64IA-NEXT:    slli a1, a1, 56
3012; RV64IA-NEXT:    srai a1, a1, 56
3013; RV64IA-NEXT:    sllw a1, a1, a0
3014; RV64IA-NEXT:    li a5, 56
3015; RV64IA-NEXT:    sub a3, a5, a3
3016; RV64IA-NEXT:  .LBB41_1: # =>This Inner Loop Header: Depth=1
3017; RV64IA-NEXT:    lr.w.aq a5, (a6)
3018; RV64IA-NEXT:    and a4, a5, a7
3019; RV64IA-NEXT:    mv a2, a5
3020; RV64IA-NEXT:    sll a4, a4, a3
3021; RV64IA-NEXT:    sra a4, a4, a3
3022; RV64IA-NEXT:    bge a1, a4, .LBB41_3
3023; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB41_1 Depth=1
3024; RV64IA-NEXT:    xor a2, a5, a1
3025; RV64IA-NEXT:    and a2, a2, a7
3026; RV64IA-NEXT:    xor a2, a5, a2
3027; RV64IA-NEXT:  .LBB41_3: # in Loop: Header=BB41_1 Depth=1
3028; RV64IA-NEXT:    sc.w a2, a2, (a6)
3029; RV64IA-NEXT:    bnez a2, .LBB41_1
3030; RV64IA-NEXT:  # %bb.4:
3031; RV64IA-NEXT:    srlw a0, a5, a0
3032; RV64IA-NEXT:    ret
3033  %1 = atomicrmw min i8* %a, i8 %b acquire
3034  ret i8 %1
3035}
3036
3037define i8 @atomicrmw_min_i8_release(i8 *%a, i8 %b) nounwind {
3038; RV32I-LABEL: atomicrmw_min_i8_release:
3039; RV32I:       # %bb.0:
3040; RV32I-NEXT:    addi sp, sp, -32
3041; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3042; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3043; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3044; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3045; RV32I-NEXT:    mv s0, a0
3046; RV32I-NEXT:    lbu a3, 0(a0)
3047; RV32I-NEXT:    mv s2, a1
3048; RV32I-NEXT:    slli a0, a1, 24
3049; RV32I-NEXT:    srai s1, a0, 24
3050; RV32I-NEXT:    j .LBB42_2
3051; RV32I-NEXT:  .LBB42_1: # %atomicrmw.start
3052; RV32I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3053; RV32I-NEXT:    sb a3, 15(sp)
3054; RV32I-NEXT:    addi a1, sp, 15
3055; RV32I-NEXT:    li a3, 3
3056; RV32I-NEXT:    mv a0, s0
3057; RV32I-NEXT:    li a4, 0
3058; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3059; RV32I-NEXT:    lb a3, 15(sp)
3060; RV32I-NEXT:    bnez a0, .LBB42_4
3061; RV32I-NEXT:  .LBB42_2: # %atomicrmw.start
3062; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3063; RV32I-NEXT:    slli a0, a3, 24
3064; RV32I-NEXT:    srai a0, a0, 24
3065; RV32I-NEXT:    mv a2, a3
3066; RV32I-NEXT:    bge s1, a0, .LBB42_1
3067; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3068; RV32I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3069; RV32I-NEXT:    mv a2, s2
3070; RV32I-NEXT:    j .LBB42_1
3071; RV32I-NEXT:  .LBB42_4: # %atomicrmw.end
3072; RV32I-NEXT:    mv a0, a3
3073; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3074; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3075; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3076; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3077; RV32I-NEXT:    addi sp, sp, 32
3078; RV32I-NEXT:    ret
3079;
3080; RV32IA-LABEL: atomicrmw_min_i8_release:
3081; RV32IA:       # %bb.0:
3082; RV32IA-NEXT:    andi a6, a0, -4
3083; RV32IA-NEXT:    slli a0, a0, 3
3084; RV32IA-NEXT:    andi a3, a0, 24
3085; RV32IA-NEXT:    li a4, 255
3086; RV32IA-NEXT:    sll a7, a4, a0
3087; RV32IA-NEXT:    slli a1, a1, 24
3088; RV32IA-NEXT:    srai a1, a1, 24
3089; RV32IA-NEXT:    sll a1, a1, a0
3090; RV32IA-NEXT:    li a5, 24
3091; RV32IA-NEXT:    sub a3, a5, a3
3092; RV32IA-NEXT:  .LBB42_1: # =>This Inner Loop Header: Depth=1
3093; RV32IA-NEXT:    lr.w a5, (a6)
3094; RV32IA-NEXT:    and a4, a5, a7
3095; RV32IA-NEXT:    mv a2, a5
3096; RV32IA-NEXT:    sll a4, a4, a3
3097; RV32IA-NEXT:    sra a4, a4, a3
3098; RV32IA-NEXT:    bge a1, a4, .LBB42_3
3099; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB42_1 Depth=1
3100; RV32IA-NEXT:    xor a2, a5, a1
3101; RV32IA-NEXT:    and a2, a2, a7
3102; RV32IA-NEXT:    xor a2, a5, a2
3103; RV32IA-NEXT:  .LBB42_3: # in Loop: Header=BB42_1 Depth=1
3104; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
3105; RV32IA-NEXT:    bnez a2, .LBB42_1
3106; RV32IA-NEXT:  # %bb.4:
3107; RV32IA-NEXT:    srl a0, a5, a0
3108; RV32IA-NEXT:    ret
3109;
3110; RV64I-LABEL: atomicrmw_min_i8_release:
3111; RV64I:       # %bb.0:
3112; RV64I-NEXT:    addi sp, sp, -48
3113; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3114; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3115; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3116; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3117; RV64I-NEXT:    mv s0, a0
3118; RV64I-NEXT:    lbu a3, 0(a0)
3119; RV64I-NEXT:    mv s2, a1
3120; RV64I-NEXT:    slli a0, a1, 56
3121; RV64I-NEXT:    srai s1, a0, 56
3122; RV64I-NEXT:    j .LBB42_2
3123; RV64I-NEXT:  .LBB42_1: # %atomicrmw.start
3124; RV64I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3125; RV64I-NEXT:    sb a3, 15(sp)
3126; RV64I-NEXT:    addi a1, sp, 15
3127; RV64I-NEXT:    li a3, 3
3128; RV64I-NEXT:    mv a0, s0
3129; RV64I-NEXT:    li a4, 0
3130; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3131; RV64I-NEXT:    lb a3, 15(sp)
3132; RV64I-NEXT:    bnez a0, .LBB42_4
3133; RV64I-NEXT:  .LBB42_2: # %atomicrmw.start
3134; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3135; RV64I-NEXT:    slli a0, a3, 56
3136; RV64I-NEXT:    srai a0, a0, 56
3137; RV64I-NEXT:    mv a2, a3
3138; RV64I-NEXT:    bge s1, a0, .LBB42_1
3139; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3140; RV64I-NEXT:    # in Loop: Header=BB42_2 Depth=1
3141; RV64I-NEXT:    mv a2, s2
3142; RV64I-NEXT:    j .LBB42_1
3143; RV64I-NEXT:  .LBB42_4: # %atomicrmw.end
3144; RV64I-NEXT:    mv a0, a3
3145; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3146; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3147; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3148; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3149; RV64I-NEXT:    addi sp, sp, 48
3150; RV64I-NEXT:    ret
3151;
3152; RV64IA-LABEL: atomicrmw_min_i8_release:
3153; RV64IA:       # %bb.0:
3154; RV64IA-NEXT:    andi a6, a0, -4
3155; RV64IA-NEXT:    slliw a0, a0, 3
3156; RV64IA-NEXT:    andi a3, a0, 24
3157; RV64IA-NEXT:    li a4, 255
3158; RV64IA-NEXT:    sllw a7, a4, a0
3159; RV64IA-NEXT:    slli a1, a1, 56
3160; RV64IA-NEXT:    srai a1, a1, 56
3161; RV64IA-NEXT:    sllw a1, a1, a0
3162; RV64IA-NEXT:    li a5, 56
3163; RV64IA-NEXT:    sub a3, a5, a3
3164; RV64IA-NEXT:  .LBB42_1: # =>This Inner Loop Header: Depth=1
3165; RV64IA-NEXT:    lr.w a5, (a6)
3166; RV64IA-NEXT:    and a4, a5, a7
3167; RV64IA-NEXT:    mv a2, a5
3168; RV64IA-NEXT:    sll a4, a4, a3
3169; RV64IA-NEXT:    sra a4, a4, a3
3170; RV64IA-NEXT:    bge a1, a4, .LBB42_3
3171; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB42_1 Depth=1
3172; RV64IA-NEXT:    xor a2, a5, a1
3173; RV64IA-NEXT:    and a2, a2, a7
3174; RV64IA-NEXT:    xor a2, a5, a2
3175; RV64IA-NEXT:  .LBB42_3: # in Loop: Header=BB42_1 Depth=1
3176; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
3177; RV64IA-NEXT:    bnez a2, .LBB42_1
3178; RV64IA-NEXT:  # %bb.4:
3179; RV64IA-NEXT:    srlw a0, a5, a0
3180; RV64IA-NEXT:    ret
3181  %1 = atomicrmw min i8* %a, i8 %b release
3182  ret i8 %1
3183}
3184
3185define i8 @atomicrmw_min_i8_acq_rel(i8 *%a, i8 %b) nounwind {
3186; RV32I-LABEL: atomicrmw_min_i8_acq_rel:
3187; RV32I:       # %bb.0:
3188; RV32I-NEXT:    addi sp, sp, -32
3189; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3190; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3191; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3192; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3193; RV32I-NEXT:    mv s0, a0
3194; RV32I-NEXT:    lbu a3, 0(a0)
3195; RV32I-NEXT:    mv s2, a1
3196; RV32I-NEXT:    slli a0, a1, 24
3197; RV32I-NEXT:    srai s1, a0, 24
3198; RV32I-NEXT:    j .LBB43_2
3199; RV32I-NEXT:  .LBB43_1: # %atomicrmw.start
3200; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3201; RV32I-NEXT:    sb a3, 15(sp)
3202; RV32I-NEXT:    addi a1, sp, 15
3203; RV32I-NEXT:    li a3, 4
3204; RV32I-NEXT:    li a4, 2
3205; RV32I-NEXT:    mv a0, s0
3206; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3207; RV32I-NEXT:    lb a3, 15(sp)
3208; RV32I-NEXT:    bnez a0, .LBB43_4
3209; RV32I-NEXT:  .LBB43_2: # %atomicrmw.start
3210; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3211; RV32I-NEXT:    slli a0, a3, 24
3212; RV32I-NEXT:    srai a0, a0, 24
3213; RV32I-NEXT:    mv a2, a3
3214; RV32I-NEXT:    bge s1, a0, .LBB43_1
3215; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3216; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3217; RV32I-NEXT:    mv a2, s2
3218; RV32I-NEXT:    j .LBB43_1
3219; RV32I-NEXT:  .LBB43_4: # %atomicrmw.end
3220; RV32I-NEXT:    mv a0, a3
3221; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3222; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3223; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3224; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3225; RV32I-NEXT:    addi sp, sp, 32
3226; RV32I-NEXT:    ret
3227;
3228; RV32IA-LABEL: atomicrmw_min_i8_acq_rel:
3229; RV32IA:       # %bb.0:
3230; RV32IA-NEXT:    andi a6, a0, -4
3231; RV32IA-NEXT:    slli a0, a0, 3
3232; RV32IA-NEXT:    andi a3, a0, 24
3233; RV32IA-NEXT:    li a4, 255
3234; RV32IA-NEXT:    sll a7, a4, a0
3235; RV32IA-NEXT:    slli a1, a1, 24
3236; RV32IA-NEXT:    srai a1, a1, 24
3237; RV32IA-NEXT:    sll a1, a1, a0
3238; RV32IA-NEXT:    li a5, 24
3239; RV32IA-NEXT:    sub a3, a5, a3
3240; RV32IA-NEXT:  .LBB43_1: # =>This Inner Loop Header: Depth=1
3241; RV32IA-NEXT:    lr.w.aq a5, (a6)
3242; RV32IA-NEXT:    and a4, a5, a7
3243; RV32IA-NEXT:    mv a2, a5
3244; RV32IA-NEXT:    sll a4, a4, a3
3245; RV32IA-NEXT:    sra a4, a4, a3
3246; RV32IA-NEXT:    bge a1, a4, .LBB43_3
3247; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB43_1 Depth=1
3248; RV32IA-NEXT:    xor a2, a5, a1
3249; RV32IA-NEXT:    and a2, a2, a7
3250; RV32IA-NEXT:    xor a2, a5, a2
3251; RV32IA-NEXT:  .LBB43_3: # in Loop: Header=BB43_1 Depth=1
3252; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
3253; RV32IA-NEXT:    bnez a2, .LBB43_1
3254; RV32IA-NEXT:  # %bb.4:
3255; RV32IA-NEXT:    srl a0, a5, a0
3256; RV32IA-NEXT:    ret
3257;
3258; RV64I-LABEL: atomicrmw_min_i8_acq_rel:
3259; RV64I:       # %bb.0:
3260; RV64I-NEXT:    addi sp, sp, -48
3261; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3262; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3263; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3264; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3265; RV64I-NEXT:    mv s0, a0
3266; RV64I-NEXT:    lbu a3, 0(a0)
3267; RV64I-NEXT:    mv s2, a1
3268; RV64I-NEXT:    slli a0, a1, 56
3269; RV64I-NEXT:    srai s1, a0, 56
3270; RV64I-NEXT:    j .LBB43_2
3271; RV64I-NEXT:  .LBB43_1: # %atomicrmw.start
3272; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3273; RV64I-NEXT:    sb a3, 15(sp)
3274; RV64I-NEXT:    addi a1, sp, 15
3275; RV64I-NEXT:    li a3, 4
3276; RV64I-NEXT:    li a4, 2
3277; RV64I-NEXT:    mv a0, s0
3278; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3279; RV64I-NEXT:    lb a3, 15(sp)
3280; RV64I-NEXT:    bnez a0, .LBB43_4
3281; RV64I-NEXT:  .LBB43_2: # %atomicrmw.start
3282; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3283; RV64I-NEXT:    slli a0, a3, 56
3284; RV64I-NEXT:    srai a0, a0, 56
3285; RV64I-NEXT:    mv a2, a3
3286; RV64I-NEXT:    bge s1, a0, .LBB43_1
3287; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3288; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3289; RV64I-NEXT:    mv a2, s2
3290; RV64I-NEXT:    j .LBB43_1
3291; RV64I-NEXT:  .LBB43_4: # %atomicrmw.end
3292; RV64I-NEXT:    mv a0, a3
3293; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3294; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3295; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3296; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3297; RV64I-NEXT:    addi sp, sp, 48
3298; RV64I-NEXT:    ret
3299;
3300; RV64IA-LABEL: atomicrmw_min_i8_acq_rel:
3301; RV64IA:       # %bb.0:
3302; RV64IA-NEXT:    andi a6, a0, -4
3303; RV64IA-NEXT:    slliw a0, a0, 3
3304; RV64IA-NEXT:    andi a3, a0, 24
3305; RV64IA-NEXT:    li a4, 255
3306; RV64IA-NEXT:    sllw a7, a4, a0
3307; RV64IA-NEXT:    slli a1, a1, 56
3308; RV64IA-NEXT:    srai a1, a1, 56
3309; RV64IA-NEXT:    sllw a1, a1, a0
3310; RV64IA-NEXT:    li a5, 56
3311; RV64IA-NEXT:    sub a3, a5, a3
3312; RV64IA-NEXT:  .LBB43_1: # =>This Inner Loop Header: Depth=1
3313; RV64IA-NEXT:    lr.w.aq a5, (a6)
3314; RV64IA-NEXT:    and a4, a5, a7
3315; RV64IA-NEXT:    mv a2, a5
3316; RV64IA-NEXT:    sll a4, a4, a3
3317; RV64IA-NEXT:    sra a4, a4, a3
3318; RV64IA-NEXT:    bge a1, a4, .LBB43_3
3319; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB43_1 Depth=1
3320; RV64IA-NEXT:    xor a2, a5, a1
3321; RV64IA-NEXT:    and a2, a2, a7
3322; RV64IA-NEXT:    xor a2, a5, a2
3323; RV64IA-NEXT:  .LBB43_3: # in Loop: Header=BB43_1 Depth=1
3324; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
3325; RV64IA-NEXT:    bnez a2, .LBB43_1
3326; RV64IA-NEXT:  # %bb.4:
3327; RV64IA-NEXT:    srlw a0, a5, a0
3328; RV64IA-NEXT:    ret
3329  %1 = atomicrmw min i8* %a, i8 %b acq_rel
3330  ret i8 %1
3331}
3332
3333define i8 @atomicrmw_min_i8_seq_cst(i8 *%a, i8 %b) nounwind {
3334; RV32I-LABEL: atomicrmw_min_i8_seq_cst:
3335; RV32I:       # %bb.0:
3336; RV32I-NEXT:    addi sp, sp, -32
3337; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3338; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3339; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3340; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3341; RV32I-NEXT:    mv s0, a0
3342; RV32I-NEXT:    lbu a3, 0(a0)
3343; RV32I-NEXT:    mv s2, a1
3344; RV32I-NEXT:    slli a0, a1, 24
3345; RV32I-NEXT:    srai s1, a0, 24
3346; RV32I-NEXT:    j .LBB44_2
3347; RV32I-NEXT:  .LBB44_1: # %atomicrmw.start
3348; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3349; RV32I-NEXT:    sb a3, 15(sp)
3350; RV32I-NEXT:    addi a1, sp, 15
3351; RV32I-NEXT:    li a3, 5
3352; RV32I-NEXT:    li a4, 5
3353; RV32I-NEXT:    mv a0, s0
3354; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3355; RV32I-NEXT:    lb a3, 15(sp)
3356; RV32I-NEXT:    bnez a0, .LBB44_4
3357; RV32I-NEXT:  .LBB44_2: # %atomicrmw.start
3358; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3359; RV32I-NEXT:    slli a0, a3, 24
3360; RV32I-NEXT:    srai a0, a0, 24
3361; RV32I-NEXT:    mv a2, a3
3362; RV32I-NEXT:    bge s1, a0, .LBB44_1
3363; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3364; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3365; RV32I-NEXT:    mv a2, s2
3366; RV32I-NEXT:    j .LBB44_1
3367; RV32I-NEXT:  .LBB44_4: # %atomicrmw.end
3368; RV32I-NEXT:    mv a0, a3
3369; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3370; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3371; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3372; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3373; RV32I-NEXT:    addi sp, sp, 32
3374; RV32I-NEXT:    ret
3375;
3376; RV32IA-LABEL: atomicrmw_min_i8_seq_cst:
3377; RV32IA:       # %bb.0:
3378; RV32IA-NEXT:    andi a6, a0, -4
3379; RV32IA-NEXT:    slli a0, a0, 3
3380; RV32IA-NEXT:    andi a3, a0, 24
3381; RV32IA-NEXT:    li a4, 255
3382; RV32IA-NEXT:    sll a7, a4, a0
3383; RV32IA-NEXT:    slli a1, a1, 24
3384; RV32IA-NEXT:    srai a1, a1, 24
3385; RV32IA-NEXT:    sll a1, a1, a0
3386; RV32IA-NEXT:    li a5, 24
3387; RV32IA-NEXT:    sub a3, a5, a3
3388; RV32IA-NEXT:  .LBB44_1: # =>This Inner Loop Header: Depth=1
3389; RV32IA-NEXT:    lr.w.aqrl a5, (a6)
3390; RV32IA-NEXT:    and a4, a5, a7
3391; RV32IA-NEXT:    mv a2, a5
3392; RV32IA-NEXT:    sll a4, a4, a3
3393; RV32IA-NEXT:    sra a4, a4, a3
3394; RV32IA-NEXT:    bge a1, a4, .LBB44_3
3395; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB44_1 Depth=1
3396; RV32IA-NEXT:    xor a2, a5, a1
3397; RV32IA-NEXT:    and a2, a2, a7
3398; RV32IA-NEXT:    xor a2, a5, a2
3399; RV32IA-NEXT:  .LBB44_3: # in Loop: Header=BB44_1 Depth=1
3400; RV32IA-NEXT:    sc.w.aqrl a2, a2, (a6)
3401; RV32IA-NEXT:    bnez a2, .LBB44_1
3402; RV32IA-NEXT:  # %bb.4:
3403; RV32IA-NEXT:    srl a0, a5, a0
3404; RV32IA-NEXT:    ret
3405;
3406; RV64I-LABEL: atomicrmw_min_i8_seq_cst:
3407; RV64I:       # %bb.0:
3408; RV64I-NEXT:    addi sp, sp, -48
3409; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3410; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3411; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3412; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3413; RV64I-NEXT:    mv s0, a0
3414; RV64I-NEXT:    lbu a3, 0(a0)
3415; RV64I-NEXT:    mv s2, a1
3416; RV64I-NEXT:    slli a0, a1, 56
3417; RV64I-NEXT:    srai s1, a0, 56
3418; RV64I-NEXT:    j .LBB44_2
3419; RV64I-NEXT:  .LBB44_1: # %atomicrmw.start
3420; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3421; RV64I-NEXT:    sb a3, 15(sp)
3422; RV64I-NEXT:    addi a1, sp, 15
3423; RV64I-NEXT:    li a3, 5
3424; RV64I-NEXT:    li a4, 5
3425; RV64I-NEXT:    mv a0, s0
3426; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3427; RV64I-NEXT:    lb a3, 15(sp)
3428; RV64I-NEXT:    bnez a0, .LBB44_4
3429; RV64I-NEXT:  .LBB44_2: # %atomicrmw.start
3430; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3431; RV64I-NEXT:    slli a0, a3, 56
3432; RV64I-NEXT:    srai a0, a0, 56
3433; RV64I-NEXT:    mv a2, a3
3434; RV64I-NEXT:    bge s1, a0, .LBB44_1
3435; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3436; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3437; RV64I-NEXT:    mv a2, s2
3438; RV64I-NEXT:    j .LBB44_1
3439; RV64I-NEXT:  .LBB44_4: # %atomicrmw.end
3440; RV64I-NEXT:    mv a0, a3
3441; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3442; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3443; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3444; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3445; RV64I-NEXT:    addi sp, sp, 48
3446; RV64I-NEXT:    ret
3447;
3448; RV64IA-LABEL: atomicrmw_min_i8_seq_cst:
3449; RV64IA:       # %bb.0:
3450; RV64IA-NEXT:    andi a6, a0, -4
3451; RV64IA-NEXT:    slliw a0, a0, 3
3452; RV64IA-NEXT:    andi a3, a0, 24
3453; RV64IA-NEXT:    li a4, 255
3454; RV64IA-NEXT:    sllw a7, a4, a0
3455; RV64IA-NEXT:    slli a1, a1, 56
3456; RV64IA-NEXT:    srai a1, a1, 56
3457; RV64IA-NEXT:    sllw a1, a1, a0
3458; RV64IA-NEXT:    li a5, 56
3459; RV64IA-NEXT:    sub a3, a5, a3
3460; RV64IA-NEXT:  .LBB44_1: # =>This Inner Loop Header: Depth=1
3461; RV64IA-NEXT:    lr.w.aqrl a5, (a6)
3462; RV64IA-NEXT:    and a4, a5, a7
3463; RV64IA-NEXT:    mv a2, a5
3464; RV64IA-NEXT:    sll a4, a4, a3
3465; RV64IA-NEXT:    sra a4, a4, a3
3466; RV64IA-NEXT:    bge a1, a4, .LBB44_3
3467; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB44_1 Depth=1
3468; RV64IA-NEXT:    xor a2, a5, a1
3469; RV64IA-NEXT:    and a2, a2, a7
3470; RV64IA-NEXT:    xor a2, a5, a2
3471; RV64IA-NEXT:  .LBB44_3: # in Loop: Header=BB44_1 Depth=1
3472; RV64IA-NEXT:    sc.w.aqrl a2, a2, (a6)
3473; RV64IA-NEXT:    bnez a2, .LBB44_1
3474; RV64IA-NEXT:  # %bb.4:
3475; RV64IA-NEXT:    srlw a0, a5, a0
3476; RV64IA-NEXT:    ret
3477  %1 = atomicrmw min i8* %a, i8 %b seq_cst
3478  ret i8 %1
3479}
3480
3481define i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind {
3482; RV32I-LABEL: atomicrmw_umax_i8_monotonic:
3483; RV32I:       # %bb.0:
3484; RV32I-NEXT:    addi sp, sp, -32
3485; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3486; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3487; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3488; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3489; RV32I-NEXT:    mv s0, a0
3490; RV32I-NEXT:    lbu a3, 0(a0)
3491; RV32I-NEXT:    mv s2, a1
3492; RV32I-NEXT:    andi s1, a1, 255
3493; RV32I-NEXT:    j .LBB45_2
3494; RV32I-NEXT:  .LBB45_1: # %atomicrmw.start
3495; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3496; RV32I-NEXT:    sb a3, 15(sp)
3497; RV32I-NEXT:    addi a1, sp, 15
3498; RV32I-NEXT:    mv a0, s0
3499; RV32I-NEXT:    li a3, 0
3500; RV32I-NEXT:    li a4, 0
3501; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3502; RV32I-NEXT:    lb a3, 15(sp)
3503; RV32I-NEXT:    bnez a0, .LBB45_4
3504; RV32I-NEXT:  .LBB45_2: # %atomicrmw.start
3505; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3506; RV32I-NEXT:    andi a0, a3, 255
3507; RV32I-NEXT:    mv a2, a3
3508; RV32I-NEXT:    bltu s1, a0, .LBB45_1
3509; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3510; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3511; RV32I-NEXT:    mv a2, s2
3512; RV32I-NEXT:    j .LBB45_1
3513; RV32I-NEXT:  .LBB45_4: # %atomicrmw.end
3514; RV32I-NEXT:    mv a0, a3
3515; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3516; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3517; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3518; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3519; RV32I-NEXT:    addi sp, sp, 32
3520; RV32I-NEXT:    ret
3521;
3522; RV32IA-LABEL: atomicrmw_umax_i8_monotonic:
3523; RV32IA:       # %bb.0:
3524; RV32IA-NEXT:    andi a6, a0, -4
3525; RV32IA-NEXT:    slli a0, a0, 3
3526; RV32IA-NEXT:    li a3, 255
3527; RV32IA-NEXT:    sll a3, a3, a0
3528; RV32IA-NEXT:    andi a1, a1, 255
3529; RV32IA-NEXT:    sll a1, a1, a0
3530; RV32IA-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
3531; RV32IA-NEXT:    lr.w a4, (a6)
3532; RV32IA-NEXT:    and a2, a4, a3
3533; RV32IA-NEXT:    mv a5, a4
3534; RV32IA-NEXT:    bgeu a2, a1, .LBB45_3
3535; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
3536; RV32IA-NEXT:    xor a5, a4, a1
3537; RV32IA-NEXT:    and a5, a5, a3
3538; RV32IA-NEXT:    xor a5, a4, a5
3539; RV32IA-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
3540; RV32IA-NEXT:    sc.w a5, a5, (a6)
3541; RV32IA-NEXT:    bnez a5, .LBB45_1
3542; RV32IA-NEXT:  # %bb.4:
3543; RV32IA-NEXT:    srl a0, a4, a0
3544; RV32IA-NEXT:    ret
3545;
3546; RV64I-LABEL: atomicrmw_umax_i8_monotonic:
3547; RV64I:       # %bb.0:
3548; RV64I-NEXT:    addi sp, sp, -48
3549; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3550; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3551; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3552; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3553; RV64I-NEXT:    mv s0, a0
3554; RV64I-NEXT:    lbu a3, 0(a0)
3555; RV64I-NEXT:    mv s2, a1
3556; RV64I-NEXT:    andi s1, a1, 255
3557; RV64I-NEXT:    j .LBB45_2
3558; RV64I-NEXT:  .LBB45_1: # %atomicrmw.start
3559; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3560; RV64I-NEXT:    sb a3, 15(sp)
3561; RV64I-NEXT:    addi a1, sp, 15
3562; RV64I-NEXT:    mv a0, s0
3563; RV64I-NEXT:    li a3, 0
3564; RV64I-NEXT:    li a4, 0
3565; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3566; RV64I-NEXT:    lb a3, 15(sp)
3567; RV64I-NEXT:    bnez a0, .LBB45_4
3568; RV64I-NEXT:  .LBB45_2: # %atomicrmw.start
3569; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3570; RV64I-NEXT:    andi a0, a3, 255
3571; RV64I-NEXT:    mv a2, a3
3572; RV64I-NEXT:    bltu s1, a0, .LBB45_1
3573; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3574; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3575; RV64I-NEXT:    mv a2, s2
3576; RV64I-NEXT:    j .LBB45_1
3577; RV64I-NEXT:  .LBB45_4: # %atomicrmw.end
3578; RV64I-NEXT:    mv a0, a3
3579; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3580; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3581; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3582; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3583; RV64I-NEXT:    addi sp, sp, 48
3584; RV64I-NEXT:    ret
3585;
3586; RV64IA-LABEL: atomicrmw_umax_i8_monotonic:
3587; RV64IA:       # %bb.0:
3588; RV64IA-NEXT:    andi a6, a0, -4
3589; RV64IA-NEXT:    slliw a0, a0, 3
3590; RV64IA-NEXT:    li a3, 255
3591; RV64IA-NEXT:    sllw a3, a3, a0
3592; RV64IA-NEXT:    andi a1, a1, 255
3593; RV64IA-NEXT:    sllw a1, a1, a0
3594; RV64IA-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
3595; RV64IA-NEXT:    lr.w a4, (a6)
3596; RV64IA-NEXT:    and a2, a4, a3
3597; RV64IA-NEXT:    mv a5, a4
3598; RV64IA-NEXT:    bgeu a2, a1, .LBB45_3
3599; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
3600; RV64IA-NEXT:    xor a5, a4, a1
3601; RV64IA-NEXT:    and a5, a5, a3
3602; RV64IA-NEXT:    xor a5, a4, a5
3603; RV64IA-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
3604; RV64IA-NEXT:    sc.w a5, a5, (a6)
3605; RV64IA-NEXT:    bnez a5, .LBB45_1
3606; RV64IA-NEXT:  # %bb.4:
3607; RV64IA-NEXT:    srlw a0, a4, a0
3608; RV64IA-NEXT:    ret
3609  %1 = atomicrmw umax i8* %a, i8 %b monotonic
3610  ret i8 %1
3611}
3612
3613define i8 @atomicrmw_umax_i8_acquire(i8 *%a, i8 %b) nounwind {
3614; RV32I-LABEL: atomicrmw_umax_i8_acquire:
3615; RV32I:       # %bb.0:
3616; RV32I-NEXT:    addi sp, sp, -32
3617; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3618; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3619; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3620; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3621; RV32I-NEXT:    mv s0, a0
3622; RV32I-NEXT:    lbu a3, 0(a0)
3623; RV32I-NEXT:    mv s2, a1
3624; RV32I-NEXT:    andi s1, a1, 255
3625; RV32I-NEXT:    j .LBB46_2
3626; RV32I-NEXT:  .LBB46_1: # %atomicrmw.start
3627; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3628; RV32I-NEXT:    sb a3, 15(sp)
3629; RV32I-NEXT:    addi a1, sp, 15
3630; RV32I-NEXT:    li a3, 2
3631; RV32I-NEXT:    li a4, 2
3632; RV32I-NEXT:    mv a0, s0
3633; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3634; RV32I-NEXT:    lb a3, 15(sp)
3635; RV32I-NEXT:    bnez a0, .LBB46_4
3636; RV32I-NEXT:  .LBB46_2: # %atomicrmw.start
3637; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3638; RV32I-NEXT:    andi a0, a3, 255
3639; RV32I-NEXT:    mv a2, a3
3640; RV32I-NEXT:    bltu s1, a0, .LBB46_1
3641; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3642; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3643; RV32I-NEXT:    mv a2, s2
3644; RV32I-NEXT:    j .LBB46_1
3645; RV32I-NEXT:  .LBB46_4: # %atomicrmw.end
3646; RV32I-NEXT:    mv a0, a3
3647; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3648; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3649; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3650; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3651; RV32I-NEXT:    addi sp, sp, 32
3652; RV32I-NEXT:    ret
3653;
3654; RV32IA-LABEL: atomicrmw_umax_i8_acquire:
3655; RV32IA:       # %bb.0:
3656; RV32IA-NEXT:    andi a6, a0, -4
3657; RV32IA-NEXT:    slli a0, a0, 3
3658; RV32IA-NEXT:    li a3, 255
3659; RV32IA-NEXT:    sll a3, a3, a0
3660; RV32IA-NEXT:    andi a1, a1, 255
3661; RV32IA-NEXT:    sll a1, a1, a0
3662; RV32IA-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
3663; RV32IA-NEXT:    lr.w.aq a4, (a6)
3664; RV32IA-NEXT:    and a2, a4, a3
3665; RV32IA-NEXT:    mv a5, a4
3666; RV32IA-NEXT:    bgeu a2, a1, .LBB46_3
3667; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
3668; RV32IA-NEXT:    xor a5, a4, a1
3669; RV32IA-NEXT:    and a5, a5, a3
3670; RV32IA-NEXT:    xor a5, a4, a5
3671; RV32IA-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
3672; RV32IA-NEXT:    sc.w a5, a5, (a6)
3673; RV32IA-NEXT:    bnez a5, .LBB46_1
3674; RV32IA-NEXT:  # %bb.4:
3675; RV32IA-NEXT:    srl a0, a4, a0
3676; RV32IA-NEXT:    ret
3677;
3678; RV64I-LABEL: atomicrmw_umax_i8_acquire:
3679; RV64I:       # %bb.0:
3680; RV64I-NEXT:    addi sp, sp, -48
3681; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3682; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3683; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3684; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3685; RV64I-NEXT:    mv s0, a0
3686; RV64I-NEXT:    lbu a3, 0(a0)
3687; RV64I-NEXT:    mv s2, a1
3688; RV64I-NEXT:    andi s1, a1, 255
3689; RV64I-NEXT:    j .LBB46_2
3690; RV64I-NEXT:  .LBB46_1: # %atomicrmw.start
3691; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3692; RV64I-NEXT:    sb a3, 15(sp)
3693; RV64I-NEXT:    addi a1, sp, 15
3694; RV64I-NEXT:    li a3, 2
3695; RV64I-NEXT:    li a4, 2
3696; RV64I-NEXT:    mv a0, s0
3697; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3698; RV64I-NEXT:    lb a3, 15(sp)
3699; RV64I-NEXT:    bnez a0, .LBB46_4
3700; RV64I-NEXT:  .LBB46_2: # %atomicrmw.start
3701; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3702; RV64I-NEXT:    andi a0, a3, 255
3703; RV64I-NEXT:    mv a2, a3
3704; RV64I-NEXT:    bltu s1, a0, .LBB46_1
3705; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3706; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3707; RV64I-NEXT:    mv a2, s2
3708; RV64I-NEXT:    j .LBB46_1
3709; RV64I-NEXT:  .LBB46_4: # %atomicrmw.end
3710; RV64I-NEXT:    mv a0, a3
3711; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3712; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3713; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3714; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3715; RV64I-NEXT:    addi sp, sp, 48
3716; RV64I-NEXT:    ret
3717;
3718; RV64IA-LABEL: atomicrmw_umax_i8_acquire:
3719; RV64IA:       # %bb.0:
3720; RV64IA-NEXT:    andi a6, a0, -4
3721; RV64IA-NEXT:    slliw a0, a0, 3
3722; RV64IA-NEXT:    li a3, 255
3723; RV64IA-NEXT:    sllw a3, a3, a0
3724; RV64IA-NEXT:    andi a1, a1, 255
3725; RV64IA-NEXT:    sllw a1, a1, a0
3726; RV64IA-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
3727; RV64IA-NEXT:    lr.w.aq a4, (a6)
3728; RV64IA-NEXT:    and a2, a4, a3
3729; RV64IA-NEXT:    mv a5, a4
3730; RV64IA-NEXT:    bgeu a2, a1, .LBB46_3
3731; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
3732; RV64IA-NEXT:    xor a5, a4, a1
3733; RV64IA-NEXT:    and a5, a5, a3
3734; RV64IA-NEXT:    xor a5, a4, a5
3735; RV64IA-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
3736; RV64IA-NEXT:    sc.w a5, a5, (a6)
3737; RV64IA-NEXT:    bnez a5, .LBB46_1
3738; RV64IA-NEXT:  # %bb.4:
3739; RV64IA-NEXT:    srlw a0, a4, a0
3740; RV64IA-NEXT:    ret
3741  %1 = atomicrmw umax i8* %a, i8 %b acquire
3742  ret i8 %1
3743}
3744
3745define i8 @atomicrmw_umax_i8_release(i8 *%a, i8 %b) nounwind {
3746; RV32I-LABEL: atomicrmw_umax_i8_release:
3747; RV32I:       # %bb.0:
3748; RV32I-NEXT:    addi sp, sp, -32
3749; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3750; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3751; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3752; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3753; RV32I-NEXT:    mv s0, a0
3754; RV32I-NEXT:    lbu a3, 0(a0)
3755; RV32I-NEXT:    mv s2, a1
3756; RV32I-NEXT:    andi s1, a1, 255
3757; RV32I-NEXT:    j .LBB47_2
3758; RV32I-NEXT:  .LBB47_1: # %atomicrmw.start
3759; RV32I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3760; RV32I-NEXT:    sb a3, 15(sp)
3761; RV32I-NEXT:    addi a1, sp, 15
3762; RV32I-NEXT:    li a3, 3
3763; RV32I-NEXT:    mv a0, s0
3764; RV32I-NEXT:    li a4, 0
3765; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3766; RV32I-NEXT:    lb a3, 15(sp)
3767; RV32I-NEXT:    bnez a0, .LBB47_4
3768; RV32I-NEXT:  .LBB47_2: # %atomicrmw.start
3769; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3770; RV32I-NEXT:    andi a0, a3, 255
3771; RV32I-NEXT:    mv a2, a3
3772; RV32I-NEXT:    bltu s1, a0, .LBB47_1
3773; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3774; RV32I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3775; RV32I-NEXT:    mv a2, s2
3776; RV32I-NEXT:    j .LBB47_1
3777; RV32I-NEXT:  .LBB47_4: # %atomicrmw.end
3778; RV32I-NEXT:    mv a0, a3
3779; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3780; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3781; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3782; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3783; RV32I-NEXT:    addi sp, sp, 32
3784; RV32I-NEXT:    ret
3785;
3786; RV32IA-LABEL: atomicrmw_umax_i8_release:
3787; RV32IA:       # %bb.0:
3788; RV32IA-NEXT:    andi a6, a0, -4
3789; RV32IA-NEXT:    slli a0, a0, 3
3790; RV32IA-NEXT:    li a3, 255
3791; RV32IA-NEXT:    sll a3, a3, a0
3792; RV32IA-NEXT:    andi a1, a1, 255
3793; RV32IA-NEXT:    sll a1, a1, a0
3794; RV32IA-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
3795; RV32IA-NEXT:    lr.w a4, (a6)
3796; RV32IA-NEXT:    and a2, a4, a3
3797; RV32IA-NEXT:    mv a5, a4
3798; RV32IA-NEXT:    bgeu a2, a1, .LBB47_3
3799; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
3800; RV32IA-NEXT:    xor a5, a4, a1
3801; RV32IA-NEXT:    and a5, a5, a3
3802; RV32IA-NEXT:    xor a5, a4, a5
3803; RV32IA-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
3804; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
3805; RV32IA-NEXT:    bnez a5, .LBB47_1
3806; RV32IA-NEXT:  # %bb.4:
3807; RV32IA-NEXT:    srl a0, a4, a0
3808; RV32IA-NEXT:    ret
3809;
3810; RV64I-LABEL: atomicrmw_umax_i8_release:
3811; RV64I:       # %bb.0:
3812; RV64I-NEXT:    addi sp, sp, -48
3813; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3814; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3815; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3816; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3817; RV64I-NEXT:    mv s0, a0
3818; RV64I-NEXT:    lbu a3, 0(a0)
3819; RV64I-NEXT:    mv s2, a1
3820; RV64I-NEXT:    andi s1, a1, 255
3821; RV64I-NEXT:    j .LBB47_2
3822; RV64I-NEXT:  .LBB47_1: # %atomicrmw.start
3823; RV64I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3824; RV64I-NEXT:    sb a3, 15(sp)
3825; RV64I-NEXT:    addi a1, sp, 15
3826; RV64I-NEXT:    li a3, 3
3827; RV64I-NEXT:    mv a0, s0
3828; RV64I-NEXT:    li a4, 0
3829; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3830; RV64I-NEXT:    lb a3, 15(sp)
3831; RV64I-NEXT:    bnez a0, .LBB47_4
3832; RV64I-NEXT:  .LBB47_2: # %atomicrmw.start
3833; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3834; RV64I-NEXT:    andi a0, a3, 255
3835; RV64I-NEXT:    mv a2, a3
3836; RV64I-NEXT:    bltu s1, a0, .LBB47_1
3837; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3838; RV64I-NEXT:    # in Loop: Header=BB47_2 Depth=1
3839; RV64I-NEXT:    mv a2, s2
3840; RV64I-NEXT:    j .LBB47_1
3841; RV64I-NEXT:  .LBB47_4: # %atomicrmw.end
3842; RV64I-NEXT:    mv a0, a3
3843; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3844; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3845; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3846; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3847; RV64I-NEXT:    addi sp, sp, 48
3848; RV64I-NEXT:    ret
3849;
3850; RV64IA-LABEL: atomicrmw_umax_i8_release:
3851; RV64IA:       # %bb.0:
3852; RV64IA-NEXT:    andi a6, a0, -4
3853; RV64IA-NEXT:    slliw a0, a0, 3
3854; RV64IA-NEXT:    li a3, 255
3855; RV64IA-NEXT:    sllw a3, a3, a0
3856; RV64IA-NEXT:    andi a1, a1, 255
3857; RV64IA-NEXT:    sllw a1, a1, a0
3858; RV64IA-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
3859; RV64IA-NEXT:    lr.w a4, (a6)
3860; RV64IA-NEXT:    and a2, a4, a3
3861; RV64IA-NEXT:    mv a5, a4
3862; RV64IA-NEXT:    bgeu a2, a1, .LBB47_3
3863; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
3864; RV64IA-NEXT:    xor a5, a4, a1
3865; RV64IA-NEXT:    and a5, a5, a3
3866; RV64IA-NEXT:    xor a5, a4, a5
3867; RV64IA-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
3868; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
3869; RV64IA-NEXT:    bnez a5, .LBB47_1
3870; RV64IA-NEXT:  # %bb.4:
3871; RV64IA-NEXT:    srlw a0, a4, a0
3872; RV64IA-NEXT:    ret
3873  %1 = atomicrmw umax i8* %a, i8 %b release
3874  ret i8 %1
3875}
3876
3877define i8 @atomicrmw_umax_i8_acq_rel(i8 *%a, i8 %b) nounwind {
3878; RV32I-LABEL: atomicrmw_umax_i8_acq_rel:
3879; RV32I:       # %bb.0:
3880; RV32I-NEXT:    addi sp, sp, -32
3881; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3882; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3883; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3884; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3885; RV32I-NEXT:    mv s0, a0
3886; RV32I-NEXT:    lbu a3, 0(a0)
3887; RV32I-NEXT:    mv s2, a1
3888; RV32I-NEXT:    andi s1, a1, 255
3889; RV32I-NEXT:    j .LBB48_2
3890; RV32I-NEXT:  .LBB48_1: # %atomicrmw.start
3891; RV32I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3892; RV32I-NEXT:    sb a3, 15(sp)
3893; RV32I-NEXT:    addi a1, sp, 15
3894; RV32I-NEXT:    li a3, 4
3895; RV32I-NEXT:    li a4, 2
3896; RV32I-NEXT:    mv a0, s0
3897; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
3898; RV32I-NEXT:    lb a3, 15(sp)
3899; RV32I-NEXT:    bnez a0, .LBB48_4
3900; RV32I-NEXT:  .LBB48_2: # %atomicrmw.start
3901; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3902; RV32I-NEXT:    andi a0, a3, 255
3903; RV32I-NEXT:    mv a2, a3
3904; RV32I-NEXT:    bltu s1, a0, .LBB48_1
3905; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3906; RV32I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3907; RV32I-NEXT:    mv a2, s2
3908; RV32I-NEXT:    j .LBB48_1
3909; RV32I-NEXT:  .LBB48_4: # %atomicrmw.end
3910; RV32I-NEXT:    mv a0, a3
3911; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3912; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3913; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3914; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3915; RV32I-NEXT:    addi sp, sp, 32
3916; RV32I-NEXT:    ret
3917;
3918; RV32IA-LABEL: atomicrmw_umax_i8_acq_rel:
3919; RV32IA:       # %bb.0:
3920; RV32IA-NEXT:    andi a6, a0, -4
3921; RV32IA-NEXT:    slli a0, a0, 3
3922; RV32IA-NEXT:    li a3, 255
3923; RV32IA-NEXT:    sll a3, a3, a0
3924; RV32IA-NEXT:    andi a1, a1, 255
3925; RV32IA-NEXT:    sll a1, a1, a0
3926; RV32IA-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
3927; RV32IA-NEXT:    lr.w.aq a4, (a6)
3928; RV32IA-NEXT:    and a2, a4, a3
3929; RV32IA-NEXT:    mv a5, a4
3930; RV32IA-NEXT:    bgeu a2, a1, .LBB48_3
3931; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
3932; RV32IA-NEXT:    xor a5, a4, a1
3933; RV32IA-NEXT:    and a5, a5, a3
3934; RV32IA-NEXT:    xor a5, a4, a5
3935; RV32IA-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
3936; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
3937; RV32IA-NEXT:    bnez a5, .LBB48_1
3938; RV32IA-NEXT:  # %bb.4:
3939; RV32IA-NEXT:    srl a0, a4, a0
3940; RV32IA-NEXT:    ret
3941;
3942; RV64I-LABEL: atomicrmw_umax_i8_acq_rel:
3943; RV64I:       # %bb.0:
3944; RV64I-NEXT:    addi sp, sp, -48
3945; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
3946; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
3947; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
3948; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
3949; RV64I-NEXT:    mv s0, a0
3950; RV64I-NEXT:    lbu a3, 0(a0)
3951; RV64I-NEXT:    mv s2, a1
3952; RV64I-NEXT:    andi s1, a1, 255
3953; RV64I-NEXT:    j .LBB48_2
3954; RV64I-NEXT:  .LBB48_1: # %atomicrmw.start
3955; RV64I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3956; RV64I-NEXT:    sb a3, 15(sp)
3957; RV64I-NEXT:    addi a1, sp, 15
3958; RV64I-NEXT:    li a3, 4
3959; RV64I-NEXT:    li a4, 2
3960; RV64I-NEXT:    mv a0, s0
3961; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
3962; RV64I-NEXT:    lb a3, 15(sp)
3963; RV64I-NEXT:    bnez a0, .LBB48_4
3964; RV64I-NEXT:  .LBB48_2: # %atomicrmw.start
3965; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3966; RV64I-NEXT:    andi a0, a3, 255
3967; RV64I-NEXT:    mv a2, a3
3968; RV64I-NEXT:    bltu s1, a0, .LBB48_1
3969; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3970; RV64I-NEXT:    # in Loop: Header=BB48_2 Depth=1
3971; RV64I-NEXT:    mv a2, s2
3972; RV64I-NEXT:    j .LBB48_1
3973; RV64I-NEXT:  .LBB48_4: # %atomicrmw.end
3974; RV64I-NEXT:    mv a0, a3
3975; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
3976; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
3977; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
3978; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
3979; RV64I-NEXT:    addi sp, sp, 48
3980; RV64I-NEXT:    ret
3981;
3982; RV64IA-LABEL: atomicrmw_umax_i8_acq_rel:
3983; RV64IA:       # %bb.0:
3984; RV64IA-NEXT:    andi a6, a0, -4
3985; RV64IA-NEXT:    slliw a0, a0, 3
3986; RV64IA-NEXT:    li a3, 255
3987; RV64IA-NEXT:    sllw a3, a3, a0
3988; RV64IA-NEXT:    andi a1, a1, 255
3989; RV64IA-NEXT:    sllw a1, a1, a0
3990; RV64IA-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
3991; RV64IA-NEXT:    lr.w.aq a4, (a6)
3992; RV64IA-NEXT:    and a2, a4, a3
3993; RV64IA-NEXT:    mv a5, a4
3994; RV64IA-NEXT:    bgeu a2, a1, .LBB48_3
3995; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
3996; RV64IA-NEXT:    xor a5, a4, a1
3997; RV64IA-NEXT:    and a5, a5, a3
3998; RV64IA-NEXT:    xor a5, a4, a5
3999; RV64IA-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
4000; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
4001; RV64IA-NEXT:    bnez a5, .LBB48_1
4002; RV64IA-NEXT:  # %bb.4:
4003; RV64IA-NEXT:    srlw a0, a4, a0
4004; RV64IA-NEXT:    ret
4005  %1 = atomicrmw umax i8* %a, i8 %b acq_rel
4006  ret i8 %1
4007}
4008
4009define i8 @atomicrmw_umax_i8_seq_cst(i8 *%a, i8 %b) nounwind {
4010; RV32I-LABEL: atomicrmw_umax_i8_seq_cst:
4011; RV32I:       # %bb.0:
4012; RV32I-NEXT:    addi sp, sp, -32
4013; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4014; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4015; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4016; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4017; RV32I-NEXT:    mv s0, a0
4018; RV32I-NEXT:    lbu a3, 0(a0)
4019; RV32I-NEXT:    mv s2, a1
4020; RV32I-NEXT:    andi s1, a1, 255
4021; RV32I-NEXT:    j .LBB49_2
4022; RV32I-NEXT:  .LBB49_1: # %atomicrmw.start
4023; RV32I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4024; RV32I-NEXT:    sb a3, 15(sp)
4025; RV32I-NEXT:    addi a1, sp, 15
4026; RV32I-NEXT:    li a3, 5
4027; RV32I-NEXT:    li a4, 5
4028; RV32I-NEXT:    mv a0, s0
4029; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4030; RV32I-NEXT:    lb a3, 15(sp)
4031; RV32I-NEXT:    bnez a0, .LBB49_4
4032; RV32I-NEXT:  .LBB49_2: # %atomicrmw.start
4033; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4034; RV32I-NEXT:    andi a0, a3, 255
4035; RV32I-NEXT:    mv a2, a3
4036; RV32I-NEXT:    bltu s1, a0, .LBB49_1
4037; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4038; RV32I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4039; RV32I-NEXT:    mv a2, s2
4040; RV32I-NEXT:    j .LBB49_1
4041; RV32I-NEXT:  .LBB49_4: # %atomicrmw.end
4042; RV32I-NEXT:    mv a0, a3
4043; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4044; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4045; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4046; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4047; RV32I-NEXT:    addi sp, sp, 32
4048; RV32I-NEXT:    ret
4049;
4050; RV32IA-LABEL: atomicrmw_umax_i8_seq_cst:
4051; RV32IA:       # %bb.0:
4052; RV32IA-NEXT:    andi a6, a0, -4
4053; RV32IA-NEXT:    slli a0, a0, 3
4054; RV32IA-NEXT:    li a3, 255
4055; RV32IA-NEXT:    sll a3, a3, a0
4056; RV32IA-NEXT:    andi a1, a1, 255
4057; RV32IA-NEXT:    sll a1, a1, a0
4058; RV32IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
4059; RV32IA-NEXT:    lr.w.aqrl a4, (a6)
4060; RV32IA-NEXT:    and a2, a4, a3
4061; RV32IA-NEXT:    mv a5, a4
4062; RV32IA-NEXT:    bgeu a2, a1, .LBB49_3
4063; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
4064; RV32IA-NEXT:    xor a5, a4, a1
4065; RV32IA-NEXT:    and a5, a5, a3
4066; RV32IA-NEXT:    xor a5, a4, a5
4067; RV32IA-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
4068; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a6)
4069; RV32IA-NEXT:    bnez a5, .LBB49_1
4070; RV32IA-NEXT:  # %bb.4:
4071; RV32IA-NEXT:    srl a0, a4, a0
4072; RV32IA-NEXT:    ret
4073;
4074; RV64I-LABEL: atomicrmw_umax_i8_seq_cst:
4075; RV64I:       # %bb.0:
4076; RV64I-NEXT:    addi sp, sp, -48
4077; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4078; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4079; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4080; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4081; RV64I-NEXT:    mv s0, a0
4082; RV64I-NEXT:    lbu a3, 0(a0)
4083; RV64I-NEXT:    mv s2, a1
4084; RV64I-NEXT:    andi s1, a1, 255
4085; RV64I-NEXT:    j .LBB49_2
4086; RV64I-NEXT:  .LBB49_1: # %atomicrmw.start
4087; RV64I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4088; RV64I-NEXT:    sb a3, 15(sp)
4089; RV64I-NEXT:    addi a1, sp, 15
4090; RV64I-NEXT:    li a3, 5
4091; RV64I-NEXT:    li a4, 5
4092; RV64I-NEXT:    mv a0, s0
4093; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4094; RV64I-NEXT:    lb a3, 15(sp)
4095; RV64I-NEXT:    bnez a0, .LBB49_4
4096; RV64I-NEXT:  .LBB49_2: # %atomicrmw.start
4097; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4098; RV64I-NEXT:    andi a0, a3, 255
4099; RV64I-NEXT:    mv a2, a3
4100; RV64I-NEXT:    bltu s1, a0, .LBB49_1
4101; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4102; RV64I-NEXT:    # in Loop: Header=BB49_2 Depth=1
4103; RV64I-NEXT:    mv a2, s2
4104; RV64I-NEXT:    j .LBB49_1
4105; RV64I-NEXT:  .LBB49_4: # %atomicrmw.end
4106; RV64I-NEXT:    mv a0, a3
4107; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4108; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4109; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4110; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4111; RV64I-NEXT:    addi sp, sp, 48
4112; RV64I-NEXT:    ret
4113;
4114; RV64IA-LABEL: atomicrmw_umax_i8_seq_cst:
4115; RV64IA:       # %bb.0:
4116; RV64IA-NEXT:    andi a6, a0, -4
4117; RV64IA-NEXT:    slliw a0, a0, 3
4118; RV64IA-NEXT:    li a3, 255
4119; RV64IA-NEXT:    sllw a3, a3, a0
4120; RV64IA-NEXT:    andi a1, a1, 255
4121; RV64IA-NEXT:    sllw a1, a1, a0
4122; RV64IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
4123; RV64IA-NEXT:    lr.w.aqrl a4, (a6)
4124; RV64IA-NEXT:    and a2, a4, a3
4125; RV64IA-NEXT:    mv a5, a4
4126; RV64IA-NEXT:    bgeu a2, a1, .LBB49_3
4127; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
4128; RV64IA-NEXT:    xor a5, a4, a1
4129; RV64IA-NEXT:    and a5, a5, a3
4130; RV64IA-NEXT:    xor a5, a4, a5
4131; RV64IA-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
4132; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a6)
4133; RV64IA-NEXT:    bnez a5, .LBB49_1
4134; RV64IA-NEXT:  # %bb.4:
4135; RV64IA-NEXT:    srlw a0, a4, a0
4136; RV64IA-NEXT:    ret
4137  %1 = atomicrmw umax i8* %a, i8 %b seq_cst
4138  ret i8 %1
4139}
4140
4141define i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind {
4142; RV32I-LABEL: atomicrmw_umin_i8_monotonic:
4143; RV32I:       # %bb.0:
4144; RV32I-NEXT:    addi sp, sp, -32
4145; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4146; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4147; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4148; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4149; RV32I-NEXT:    mv s0, a0
4150; RV32I-NEXT:    lbu a3, 0(a0)
4151; RV32I-NEXT:    mv s2, a1
4152; RV32I-NEXT:    andi s1, a1, 255
4153; RV32I-NEXT:    j .LBB50_2
4154; RV32I-NEXT:  .LBB50_1: # %atomicrmw.start
4155; RV32I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4156; RV32I-NEXT:    sb a3, 15(sp)
4157; RV32I-NEXT:    addi a1, sp, 15
4158; RV32I-NEXT:    mv a0, s0
4159; RV32I-NEXT:    li a3, 0
4160; RV32I-NEXT:    li a4, 0
4161; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4162; RV32I-NEXT:    lb a3, 15(sp)
4163; RV32I-NEXT:    bnez a0, .LBB50_4
4164; RV32I-NEXT:  .LBB50_2: # %atomicrmw.start
4165; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4166; RV32I-NEXT:    andi a0, a3, 255
4167; RV32I-NEXT:    mv a2, a3
4168; RV32I-NEXT:    bgeu s1, a0, .LBB50_1
4169; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4170; RV32I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4171; RV32I-NEXT:    mv a2, s2
4172; RV32I-NEXT:    j .LBB50_1
4173; RV32I-NEXT:  .LBB50_4: # %atomicrmw.end
4174; RV32I-NEXT:    mv a0, a3
4175; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4176; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4177; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4178; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4179; RV32I-NEXT:    addi sp, sp, 32
4180; RV32I-NEXT:    ret
4181;
4182; RV32IA-LABEL: atomicrmw_umin_i8_monotonic:
4183; RV32IA:       # %bb.0:
4184; RV32IA-NEXT:    andi a6, a0, -4
4185; RV32IA-NEXT:    slli a0, a0, 3
4186; RV32IA-NEXT:    li a3, 255
4187; RV32IA-NEXT:    sll a3, a3, a0
4188; RV32IA-NEXT:    andi a1, a1, 255
4189; RV32IA-NEXT:    sll a1, a1, a0
4190; RV32IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
4191; RV32IA-NEXT:    lr.w a4, (a6)
4192; RV32IA-NEXT:    and a2, a4, a3
4193; RV32IA-NEXT:    mv a5, a4
4194; RV32IA-NEXT:    bgeu a1, a2, .LBB50_3
4195; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
4196; RV32IA-NEXT:    xor a5, a4, a1
4197; RV32IA-NEXT:    and a5, a5, a3
4198; RV32IA-NEXT:    xor a5, a4, a5
4199; RV32IA-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
4200; RV32IA-NEXT:    sc.w a5, a5, (a6)
4201; RV32IA-NEXT:    bnez a5, .LBB50_1
4202; RV32IA-NEXT:  # %bb.4:
4203; RV32IA-NEXT:    srl a0, a4, a0
4204; RV32IA-NEXT:    ret
4205;
4206; RV64I-LABEL: atomicrmw_umin_i8_monotonic:
4207; RV64I:       # %bb.0:
4208; RV64I-NEXT:    addi sp, sp, -48
4209; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4210; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4211; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4212; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4213; RV64I-NEXT:    mv s0, a0
4214; RV64I-NEXT:    lbu a3, 0(a0)
4215; RV64I-NEXT:    mv s2, a1
4216; RV64I-NEXT:    andi s1, a1, 255
4217; RV64I-NEXT:    j .LBB50_2
4218; RV64I-NEXT:  .LBB50_1: # %atomicrmw.start
4219; RV64I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4220; RV64I-NEXT:    sb a3, 15(sp)
4221; RV64I-NEXT:    addi a1, sp, 15
4222; RV64I-NEXT:    mv a0, s0
4223; RV64I-NEXT:    li a3, 0
4224; RV64I-NEXT:    li a4, 0
4225; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4226; RV64I-NEXT:    lb a3, 15(sp)
4227; RV64I-NEXT:    bnez a0, .LBB50_4
4228; RV64I-NEXT:  .LBB50_2: # %atomicrmw.start
4229; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4230; RV64I-NEXT:    andi a0, a3, 255
4231; RV64I-NEXT:    mv a2, a3
4232; RV64I-NEXT:    bgeu s1, a0, .LBB50_1
4233; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4234; RV64I-NEXT:    # in Loop: Header=BB50_2 Depth=1
4235; RV64I-NEXT:    mv a2, s2
4236; RV64I-NEXT:    j .LBB50_1
4237; RV64I-NEXT:  .LBB50_4: # %atomicrmw.end
4238; RV64I-NEXT:    mv a0, a3
4239; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4240; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4241; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4242; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4243; RV64I-NEXT:    addi sp, sp, 48
4244; RV64I-NEXT:    ret
4245;
4246; RV64IA-LABEL: atomicrmw_umin_i8_monotonic:
4247; RV64IA:       # %bb.0:
4248; RV64IA-NEXT:    andi a6, a0, -4
4249; RV64IA-NEXT:    slliw a0, a0, 3
4250; RV64IA-NEXT:    li a3, 255
4251; RV64IA-NEXT:    sllw a3, a3, a0
4252; RV64IA-NEXT:    andi a1, a1, 255
4253; RV64IA-NEXT:    sllw a1, a1, a0
4254; RV64IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
4255; RV64IA-NEXT:    lr.w a4, (a6)
4256; RV64IA-NEXT:    and a2, a4, a3
4257; RV64IA-NEXT:    mv a5, a4
4258; RV64IA-NEXT:    bgeu a1, a2, .LBB50_3
4259; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
4260; RV64IA-NEXT:    xor a5, a4, a1
4261; RV64IA-NEXT:    and a5, a5, a3
4262; RV64IA-NEXT:    xor a5, a4, a5
4263; RV64IA-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
4264; RV64IA-NEXT:    sc.w a5, a5, (a6)
4265; RV64IA-NEXT:    bnez a5, .LBB50_1
4266; RV64IA-NEXT:  # %bb.4:
4267; RV64IA-NEXT:    srlw a0, a4, a0
4268; RV64IA-NEXT:    ret
4269  %1 = atomicrmw umin i8* %a, i8 %b monotonic
4270  ret i8 %1
4271}
4272
4273define i8 @atomicrmw_umin_i8_acquire(i8 *%a, i8 %b) nounwind {
4274; RV32I-LABEL: atomicrmw_umin_i8_acquire:
4275; RV32I:       # %bb.0:
4276; RV32I-NEXT:    addi sp, sp, -32
4277; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4278; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4279; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4280; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4281; RV32I-NEXT:    mv s0, a0
4282; RV32I-NEXT:    lbu a3, 0(a0)
4283; RV32I-NEXT:    mv s2, a1
4284; RV32I-NEXT:    andi s1, a1, 255
4285; RV32I-NEXT:    j .LBB51_2
4286; RV32I-NEXT:  .LBB51_1: # %atomicrmw.start
4287; RV32I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4288; RV32I-NEXT:    sb a3, 15(sp)
4289; RV32I-NEXT:    addi a1, sp, 15
4290; RV32I-NEXT:    li a3, 2
4291; RV32I-NEXT:    li a4, 2
4292; RV32I-NEXT:    mv a0, s0
4293; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4294; RV32I-NEXT:    lb a3, 15(sp)
4295; RV32I-NEXT:    bnez a0, .LBB51_4
4296; RV32I-NEXT:  .LBB51_2: # %atomicrmw.start
4297; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4298; RV32I-NEXT:    andi a0, a3, 255
4299; RV32I-NEXT:    mv a2, a3
4300; RV32I-NEXT:    bgeu s1, a0, .LBB51_1
4301; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4302; RV32I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4303; RV32I-NEXT:    mv a2, s2
4304; RV32I-NEXT:    j .LBB51_1
4305; RV32I-NEXT:  .LBB51_4: # %atomicrmw.end
4306; RV32I-NEXT:    mv a0, a3
4307; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4308; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4309; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4310; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4311; RV32I-NEXT:    addi sp, sp, 32
4312; RV32I-NEXT:    ret
4313;
4314; RV32IA-LABEL: atomicrmw_umin_i8_acquire:
4315; RV32IA:       # %bb.0:
4316; RV32IA-NEXT:    andi a6, a0, -4
4317; RV32IA-NEXT:    slli a0, a0, 3
4318; RV32IA-NEXT:    li a3, 255
4319; RV32IA-NEXT:    sll a3, a3, a0
4320; RV32IA-NEXT:    andi a1, a1, 255
4321; RV32IA-NEXT:    sll a1, a1, a0
4322; RV32IA-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
4323; RV32IA-NEXT:    lr.w.aq a4, (a6)
4324; RV32IA-NEXT:    and a2, a4, a3
4325; RV32IA-NEXT:    mv a5, a4
4326; RV32IA-NEXT:    bgeu a1, a2, .LBB51_3
4327; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
4328; RV32IA-NEXT:    xor a5, a4, a1
4329; RV32IA-NEXT:    and a5, a5, a3
4330; RV32IA-NEXT:    xor a5, a4, a5
4331; RV32IA-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
4332; RV32IA-NEXT:    sc.w a5, a5, (a6)
4333; RV32IA-NEXT:    bnez a5, .LBB51_1
4334; RV32IA-NEXT:  # %bb.4:
4335; RV32IA-NEXT:    srl a0, a4, a0
4336; RV32IA-NEXT:    ret
4337;
4338; RV64I-LABEL: atomicrmw_umin_i8_acquire:
4339; RV64I:       # %bb.0:
4340; RV64I-NEXT:    addi sp, sp, -48
4341; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4342; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4343; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4344; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4345; RV64I-NEXT:    mv s0, a0
4346; RV64I-NEXT:    lbu a3, 0(a0)
4347; RV64I-NEXT:    mv s2, a1
4348; RV64I-NEXT:    andi s1, a1, 255
4349; RV64I-NEXT:    j .LBB51_2
4350; RV64I-NEXT:  .LBB51_1: # %atomicrmw.start
4351; RV64I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4352; RV64I-NEXT:    sb a3, 15(sp)
4353; RV64I-NEXT:    addi a1, sp, 15
4354; RV64I-NEXT:    li a3, 2
4355; RV64I-NEXT:    li a4, 2
4356; RV64I-NEXT:    mv a0, s0
4357; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4358; RV64I-NEXT:    lb a3, 15(sp)
4359; RV64I-NEXT:    bnez a0, .LBB51_4
4360; RV64I-NEXT:  .LBB51_2: # %atomicrmw.start
4361; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4362; RV64I-NEXT:    andi a0, a3, 255
4363; RV64I-NEXT:    mv a2, a3
4364; RV64I-NEXT:    bgeu s1, a0, .LBB51_1
4365; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4366; RV64I-NEXT:    # in Loop: Header=BB51_2 Depth=1
4367; RV64I-NEXT:    mv a2, s2
4368; RV64I-NEXT:    j .LBB51_1
4369; RV64I-NEXT:  .LBB51_4: # %atomicrmw.end
4370; RV64I-NEXT:    mv a0, a3
4371; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4372; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4373; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4374; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4375; RV64I-NEXT:    addi sp, sp, 48
4376; RV64I-NEXT:    ret
4377;
4378; RV64IA-LABEL: atomicrmw_umin_i8_acquire:
4379; RV64IA:       # %bb.0:
4380; RV64IA-NEXT:    andi a6, a0, -4
4381; RV64IA-NEXT:    slliw a0, a0, 3
4382; RV64IA-NEXT:    li a3, 255
4383; RV64IA-NEXT:    sllw a3, a3, a0
4384; RV64IA-NEXT:    andi a1, a1, 255
4385; RV64IA-NEXT:    sllw a1, a1, a0
4386; RV64IA-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
4387; RV64IA-NEXT:    lr.w.aq a4, (a6)
4388; RV64IA-NEXT:    and a2, a4, a3
4389; RV64IA-NEXT:    mv a5, a4
4390; RV64IA-NEXT:    bgeu a1, a2, .LBB51_3
4391; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
4392; RV64IA-NEXT:    xor a5, a4, a1
4393; RV64IA-NEXT:    and a5, a5, a3
4394; RV64IA-NEXT:    xor a5, a4, a5
4395; RV64IA-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
4396; RV64IA-NEXT:    sc.w a5, a5, (a6)
4397; RV64IA-NEXT:    bnez a5, .LBB51_1
4398; RV64IA-NEXT:  # %bb.4:
4399; RV64IA-NEXT:    srlw a0, a4, a0
4400; RV64IA-NEXT:    ret
4401  %1 = atomicrmw umin i8* %a, i8 %b acquire
4402  ret i8 %1
4403}
4404
4405define i8 @atomicrmw_umin_i8_release(i8 *%a, i8 %b) nounwind {
4406; RV32I-LABEL: atomicrmw_umin_i8_release:
4407; RV32I:       # %bb.0:
4408; RV32I-NEXT:    addi sp, sp, -32
4409; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4410; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4411; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4412; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4413; RV32I-NEXT:    mv s0, a0
4414; RV32I-NEXT:    lbu a3, 0(a0)
4415; RV32I-NEXT:    mv s2, a1
4416; RV32I-NEXT:    andi s1, a1, 255
4417; RV32I-NEXT:    j .LBB52_2
4418; RV32I-NEXT:  .LBB52_1: # %atomicrmw.start
4419; RV32I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4420; RV32I-NEXT:    sb a3, 15(sp)
4421; RV32I-NEXT:    addi a1, sp, 15
4422; RV32I-NEXT:    li a3, 3
4423; RV32I-NEXT:    mv a0, s0
4424; RV32I-NEXT:    li a4, 0
4425; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4426; RV32I-NEXT:    lb a3, 15(sp)
4427; RV32I-NEXT:    bnez a0, .LBB52_4
4428; RV32I-NEXT:  .LBB52_2: # %atomicrmw.start
4429; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4430; RV32I-NEXT:    andi a0, a3, 255
4431; RV32I-NEXT:    mv a2, a3
4432; RV32I-NEXT:    bgeu s1, a0, .LBB52_1
4433; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4434; RV32I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4435; RV32I-NEXT:    mv a2, s2
4436; RV32I-NEXT:    j .LBB52_1
4437; RV32I-NEXT:  .LBB52_4: # %atomicrmw.end
4438; RV32I-NEXT:    mv a0, a3
4439; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4440; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4441; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4442; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4443; RV32I-NEXT:    addi sp, sp, 32
4444; RV32I-NEXT:    ret
4445;
4446; RV32IA-LABEL: atomicrmw_umin_i8_release:
4447; RV32IA:       # %bb.0:
4448; RV32IA-NEXT:    andi a6, a0, -4
4449; RV32IA-NEXT:    slli a0, a0, 3
4450; RV32IA-NEXT:    li a3, 255
4451; RV32IA-NEXT:    sll a3, a3, a0
4452; RV32IA-NEXT:    andi a1, a1, 255
4453; RV32IA-NEXT:    sll a1, a1, a0
4454; RV32IA-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
4455; RV32IA-NEXT:    lr.w a4, (a6)
4456; RV32IA-NEXT:    and a2, a4, a3
4457; RV32IA-NEXT:    mv a5, a4
4458; RV32IA-NEXT:    bgeu a1, a2, .LBB52_3
4459; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
4460; RV32IA-NEXT:    xor a5, a4, a1
4461; RV32IA-NEXT:    and a5, a5, a3
4462; RV32IA-NEXT:    xor a5, a4, a5
4463; RV32IA-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
4464; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
4465; RV32IA-NEXT:    bnez a5, .LBB52_1
4466; RV32IA-NEXT:  # %bb.4:
4467; RV32IA-NEXT:    srl a0, a4, a0
4468; RV32IA-NEXT:    ret
4469;
4470; RV64I-LABEL: atomicrmw_umin_i8_release:
4471; RV64I:       # %bb.0:
4472; RV64I-NEXT:    addi sp, sp, -48
4473; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4474; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4475; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4476; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4477; RV64I-NEXT:    mv s0, a0
4478; RV64I-NEXT:    lbu a3, 0(a0)
4479; RV64I-NEXT:    mv s2, a1
4480; RV64I-NEXT:    andi s1, a1, 255
4481; RV64I-NEXT:    j .LBB52_2
4482; RV64I-NEXT:  .LBB52_1: # %atomicrmw.start
4483; RV64I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4484; RV64I-NEXT:    sb a3, 15(sp)
4485; RV64I-NEXT:    addi a1, sp, 15
4486; RV64I-NEXT:    li a3, 3
4487; RV64I-NEXT:    mv a0, s0
4488; RV64I-NEXT:    li a4, 0
4489; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4490; RV64I-NEXT:    lb a3, 15(sp)
4491; RV64I-NEXT:    bnez a0, .LBB52_4
4492; RV64I-NEXT:  .LBB52_2: # %atomicrmw.start
4493; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4494; RV64I-NEXT:    andi a0, a3, 255
4495; RV64I-NEXT:    mv a2, a3
4496; RV64I-NEXT:    bgeu s1, a0, .LBB52_1
4497; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4498; RV64I-NEXT:    # in Loop: Header=BB52_2 Depth=1
4499; RV64I-NEXT:    mv a2, s2
4500; RV64I-NEXT:    j .LBB52_1
4501; RV64I-NEXT:  .LBB52_4: # %atomicrmw.end
4502; RV64I-NEXT:    mv a0, a3
4503; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4504; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4505; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4506; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4507; RV64I-NEXT:    addi sp, sp, 48
4508; RV64I-NEXT:    ret
4509;
4510; RV64IA-LABEL: atomicrmw_umin_i8_release:
4511; RV64IA:       # %bb.0:
4512; RV64IA-NEXT:    andi a6, a0, -4
4513; RV64IA-NEXT:    slliw a0, a0, 3
4514; RV64IA-NEXT:    li a3, 255
4515; RV64IA-NEXT:    sllw a3, a3, a0
4516; RV64IA-NEXT:    andi a1, a1, 255
4517; RV64IA-NEXT:    sllw a1, a1, a0
4518; RV64IA-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
4519; RV64IA-NEXT:    lr.w a4, (a6)
4520; RV64IA-NEXT:    and a2, a4, a3
4521; RV64IA-NEXT:    mv a5, a4
4522; RV64IA-NEXT:    bgeu a1, a2, .LBB52_3
4523; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
4524; RV64IA-NEXT:    xor a5, a4, a1
4525; RV64IA-NEXT:    and a5, a5, a3
4526; RV64IA-NEXT:    xor a5, a4, a5
4527; RV64IA-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
4528; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
4529; RV64IA-NEXT:    bnez a5, .LBB52_1
4530; RV64IA-NEXT:  # %bb.4:
4531; RV64IA-NEXT:    srlw a0, a4, a0
4532; RV64IA-NEXT:    ret
4533  %1 = atomicrmw umin i8* %a, i8 %b release
4534  ret i8 %1
4535}
4536
4537define i8 @atomicrmw_umin_i8_acq_rel(i8 *%a, i8 %b) nounwind {
4538; RV32I-LABEL: atomicrmw_umin_i8_acq_rel:
4539; RV32I:       # %bb.0:
4540; RV32I-NEXT:    addi sp, sp, -32
4541; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4542; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4543; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4544; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4545; RV32I-NEXT:    mv s0, a0
4546; RV32I-NEXT:    lbu a3, 0(a0)
4547; RV32I-NEXT:    mv s2, a1
4548; RV32I-NEXT:    andi s1, a1, 255
4549; RV32I-NEXT:    j .LBB53_2
4550; RV32I-NEXT:  .LBB53_1: # %atomicrmw.start
4551; RV32I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4552; RV32I-NEXT:    sb a3, 15(sp)
4553; RV32I-NEXT:    addi a1, sp, 15
4554; RV32I-NEXT:    li a3, 4
4555; RV32I-NEXT:    li a4, 2
4556; RV32I-NEXT:    mv a0, s0
4557; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4558; RV32I-NEXT:    lb a3, 15(sp)
4559; RV32I-NEXT:    bnez a0, .LBB53_4
4560; RV32I-NEXT:  .LBB53_2: # %atomicrmw.start
4561; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4562; RV32I-NEXT:    andi a0, a3, 255
4563; RV32I-NEXT:    mv a2, a3
4564; RV32I-NEXT:    bgeu s1, a0, .LBB53_1
4565; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4566; RV32I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4567; RV32I-NEXT:    mv a2, s2
4568; RV32I-NEXT:    j .LBB53_1
4569; RV32I-NEXT:  .LBB53_4: # %atomicrmw.end
4570; RV32I-NEXT:    mv a0, a3
4571; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4572; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4573; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4574; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4575; RV32I-NEXT:    addi sp, sp, 32
4576; RV32I-NEXT:    ret
4577;
4578; RV32IA-LABEL: atomicrmw_umin_i8_acq_rel:
4579; RV32IA:       # %bb.0:
4580; RV32IA-NEXT:    andi a6, a0, -4
4581; RV32IA-NEXT:    slli a0, a0, 3
4582; RV32IA-NEXT:    li a3, 255
4583; RV32IA-NEXT:    sll a3, a3, a0
4584; RV32IA-NEXT:    andi a1, a1, 255
4585; RV32IA-NEXT:    sll a1, a1, a0
4586; RV32IA-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
4587; RV32IA-NEXT:    lr.w.aq a4, (a6)
4588; RV32IA-NEXT:    and a2, a4, a3
4589; RV32IA-NEXT:    mv a5, a4
4590; RV32IA-NEXT:    bgeu a1, a2, .LBB53_3
4591; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
4592; RV32IA-NEXT:    xor a5, a4, a1
4593; RV32IA-NEXT:    and a5, a5, a3
4594; RV32IA-NEXT:    xor a5, a4, a5
4595; RV32IA-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
4596; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
4597; RV32IA-NEXT:    bnez a5, .LBB53_1
4598; RV32IA-NEXT:  # %bb.4:
4599; RV32IA-NEXT:    srl a0, a4, a0
4600; RV32IA-NEXT:    ret
4601;
4602; RV64I-LABEL: atomicrmw_umin_i8_acq_rel:
4603; RV64I:       # %bb.0:
4604; RV64I-NEXT:    addi sp, sp, -48
4605; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4606; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4607; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4608; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4609; RV64I-NEXT:    mv s0, a0
4610; RV64I-NEXT:    lbu a3, 0(a0)
4611; RV64I-NEXT:    mv s2, a1
4612; RV64I-NEXT:    andi s1, a1, 255
4613; RV64I-NEXT:    j .LBB53_2
4614; RV64I-NEXT:  .LBB53_1: # %atomicrmw.start
4615; RV64I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4616; RV64I-NEXT:    sb a3, 15(sp)
4617; RV64I-NEXT:    addi a1, sp, 15
4618; RV64I-NEXT:    li a3, 4
4619; RV64I-NEXT:    li a4, 2
4620; RV64I-NEXT:    mv a0, s0
4621; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4622; RV64I-NEXT:    lb a3, 15(sp)
4623; RV64I-NEXT:    bnez a0, .LBB53_4
4624; RV64I-NEXT:  .LBB53_2: # %atomicrmw.start
4625; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4626; RV64I-NEXT:    andi a0, a3, 255
4627; RV64I-NEXT:    mv a2, a3
4628; RV64I-NEXT:    bgeu s1, a0, .LBB53_1
4629; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4630; RV64I-NEXT:    # in Loop: Header=BB53_2 Depth=1
4631; RV64I-NEXT:    mv a2, s2
4632; RV64I-NEXT:    j .LBB53_1
4633; RV64I-NEXT:  .LBB53_4: # %atomicrmw.end
4634; RV64I-NEXT:    mv a0, a3
4635; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4636; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4637; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4638; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4639; RV64I-NEXT:    addi sp, sp, 48
4640; RV64I-NEXT:    ret
4641;
4642; RV64IA-LABEL: atomicrmw_umin_i8_acq_rel:
4643; RV64IA:       # %bb.0:
4644; RV64IA-NEXT:    andi a6, a0, -4
4645; RV64IA-NEXT:    slliw a0, a0, 3
4646; RV64IA-NEXT:    li a3, 255
4647; RV64IA-NEXT:    sllw a3, a3, a0
4648; RV64IA-NEXT:    andi a1, a1, 255
4649; RV64IA-NEXT:    sllw a1, a1, a0
4650; RV64IA-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
4651; RV64IA-NEXT:    lr.w.aq a4, (a6)
4652; RV64IA-NEXT:    and a2, a4, a3
4653; RV64IA-NEXT:    mv a5, a4
4654; RV64IA-NEXT:    bgeu a1, a2, .LBB53_3
4655; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
4656; RV64IA-NEXT:    xor a5, a4, a1
4657; RV64IA-NEXT:    and a5, a5, a3
4658; RV64IA-NEXT:    xor a5, a4, a5
4659; RV64IA-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
4660; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
4661; RV64IA-NEXT:    bnez a5, .LBB53_1
4662; RV64IA-NEXT:  # %bb.4:
4663; RV64IA-NEXT:    srlw a0, a4, a0
4664; RV64IA-NEXT:    ret
4665  %1 = atomicrmw umin i8* %a, i8 %b acq_rel
4666  ret i8 %1
4667}
4668
4669define i8 @atomicrmw_umin_i8_seq_cst(i8 *%a, i8 %b) nounwind {
4670; RV32I-LABEL: atomicrmw_umin_i8_seq_cst:
4671; RV32I:       # %bb.0:
4672; RV32I-NEXT:    addi sp, sp, -32
4673; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
4674; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
4675; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
4676; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
4677; RV32I-NEXT:    mv s0, a0
4678; RV32I-NEXT:    lbu a3, 0(a0)
4679; RV32I-NEXT:    mv s2, a1
4680; RV32I-NEXT:    andi s1, a1, 255
4681; RV32I-NEXT:    j .LBB54_2
4682; RV32I-NEXT:  .LBB54_1: # %atomicrmw.start
4683; RV32I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4684; RV32I-NEXT:    sb a3, 15(sp)
4685; RV32I-NEXT:    addi a1, sp, 15
4686; RV32I-NEXT:    li a3, 5
4687; RV32I-NEXT:    li a4, 5
4688; RV32I-NEXT:    mv a0, s0
4689; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
4690; RV32I-NEXT:    lb a3, 15(sp)
4691; RV32I-NEXT:    bnez a0, .LBB54_4
4692; RV32I-NEXT:  .LBB54_2: # %atomicrmw.start
4693; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4694; RV32I-NEXT:    andi a0, a3, 255
4695; RV32I-NEXT:    mv a2, a3
4696; RV32I-NEXT:    bgeu s1, a0, .LBB54_1
4697; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
4698; RV32I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4699; RV32I-NEXT:    mv a2, s2
4700; RV32I-NEXT:    j .LBB54_1
4701; RV32I-NEXT:  .LBB54_4: # %atomicrmw.end
4702; RV32I-NEXT:    mv a0, a3
4703; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
4704; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
4705; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
4706; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
4707; RV32I-NEXT:    addi sp, sp, 32
4708; RV32I-NEXT:    ret
4709;
4710; RV32IA-LABEL: atomicrmw_umin_i8_seq_cst:
4711; RV32IA:       # %bb.0:
4712; RV32IA-NEXT:    andi a6, a0, -4
4713; RV32IA-NEXT:    slli a0, a0, 3
4714; RV32IA-NEXT:    li a3, 255
4715; RV32IA-NEXT:    sll a3, a3, a0
4716; RV32IA-NEXT:    andi a1, a1, 255
4717; RV32IA-NEXT:    sll a1, a1, a0
4718; RV32IA-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
4719; RV32IA-NEXT:    lr.w.aqrl a4, (a6)
4720; RV32IA-NEXT:    and a2, a4, a3
4721; RV32IA-NEXT:    mv a5, a4
4722; RV32IA-NEXT:    bgeu a1, a2, .LBB54_3
4723; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
4724; RV32IA-NEXT:    xor a5, a4, a1
4725; RV32IA-NEXT:    and a5, a5, a3
4726; RV32IA-NEXT:    xor a5, a4, a5
4727; RV32IA-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
4728; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a6)
4729; RV32IA-NEXT:    bnez a5, .LBB54_1
4730; RV32IA-NEXT:  # %bb.4:
4731; RV32IA-NEXT:    srl a0, a4, a0
4732; RV32IA-NEXT:    ret
4733;
4734; RV64I-LABEL: atomicrmw_umin_i8_seq_cst:
4735; RV64I:       # %bb.0:
4736; RV64I-NEXT:    addi sp, sp, -48
4737; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
4738; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
4739; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
4740; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
4741; RV64I-NEXT:    mv s0, a0
4742; RV64I-NEXT:    lbu a3, 0(a0)
4743; RV64I-NEXT:    mv s2, a1
4744; RV64I-NEXT:    andi s1, a1, 255
4745; RV64I-NEXT:    j .LBB54_2
4746; RV64I-NEXT:  .LBB54_1: # %atomicrmw.start
4747; RV64I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4748; RV64I-NEXT:    sb a3, 15(sp)
4749; RV64I-NEXT:    addi a1, sp, 15
4750; RV64I-NEXT:    li a3, 5
4751; RV64I-NEXT:    li a4, 5
4752; RV64I-NEXT:    mv a0, s0
4753; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
4754; RV64I-NEXT:    lb a3, 15(sp)
4755; RV64I-NEXT:    bnez a0, .LBB54_4
4756; RV64I-NEXT:  .LBB54_2: # %atomicrmw.start
4757; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
4758; RV64I-NEXT:    andi a0, a3, 255
4759; RV64I-NEXT:    mv a2, a3
4760; RV64I-NEXT:    bgeu s1, a0, .LBB54_1
4761; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
4762; RV64I-NEXT:    # in Loop: Header=BB54_2 Depth=1
4763; RV64I-NEXT:    mv a2, s2
4764; RV64I-NEXT:    j .LBB54_1
4765; RV64I-NEXT:  .LBB54_4: # %atomicrmw.end
4766; RV64I-NEXT:    mv a0, a3
4767; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
4768; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
4769; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
4770; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
4771; RV64I-NEXT:    addi sp, sp, 48
4772; RV64I-NEXT:    ret
4773;
4774; RV64IA-LABEL: atomicrmw_umin_i8_seq_cst:
4775; RV64IA:       # %bb.0:
4776; RV64IA-NEXT:    andi a6, a0, -4
4777; RV64IA-NEXT:    slliw a0, a0, 3
4778; RV64IA-NEXT:    li a3, 255
4779; RV64IA-NEXT:    sllw a3, a3, a0
4780; RV64IA-NEXT:    andi a1, a1, 255
4781; RV64IA-NEXT:    sllw a1, a1, a0
4782; RV64IA-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
4783; RV64IA-NEXT:    lr.w.aqrl a4, (a6)
4784; RV64IA-NEXT:    and a2, a4, a3
4785; RV64IA-NEXT:    mv a5, a4
4786; RV64IA-NEXT:    bgeu a1, a2, .LBB54_3
4787; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
4788; RV64IA-NEXT:    xor a5, a4, a1
4789; RV64IA-NEXT:    and a5, a5, a3
4790; RV64IA-NEXT:    xor a5, a4, a5
4791; RV64IA-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
4792; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a6)
4793; RV64IA-NEXT:    bnez a5, .LBB54_1
4794; RV64IA-NEXT:  # %bb.4:
4795; RV64IA-NEXT:    srlw a0, a4, a0
4796; RV64IA-NEXT:    ret
4797  %1 = atomicrmw umin i8* %a, i8 %b seq_cst
4798  ret i8 %1
4799}
4800
4801define i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) nounwind {
4802; RV32I-LABEL: atomicrmw_xchg_i16_monotonic:
4803; RV32I:       # %bb.0:
4804; RV32I-NEXT:    addi sp, sp, -16
4805; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4806; RV32I-NEXT:    li a2, 0
4807; RV32I-NEXT:    call __atomic_exchange_2@plt
4808; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4809; RV32I-NEXT:    addi sp, sp, 16
4810; RV32I-NEXT:    ret
4811;
4812; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic:
4813; RV32IA:       # %bb.0:
4814; RV32IA-NEXT:    andi a2, a0, -4
4815; RV32IA-NEXT:    slli a0, a0, 3
4816; RV32IA-NEXT:    lui a3, 16
4817; RV32IA-NEXT:    addi a3, a3, -1
4818; RV32IA-NEXT:    sll a4, a3, a0
4819; RV32IA-NEXT:    and a1, a1, a3
4820; RV32IA-NEXT:    sll a1, a1, a0
4821; RV32IA-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
4822; RV32IA-NEXT:    lr.w a3, (a2)
4823; RV32IA-NEXT:    mv a5, a1
4824; RV32IA-NEXT:    xor a5, a3, a5
4825; RV32IA-NEXT:    and a5, a5, a4
4826; RV32IA-NEXT:    xor a5, a3, a5
4827; RV32IA-NEXT:    sc.w a5, a5, (a2)
4828; RV32IA-NEXT:    bnez a5, .LBB55_1
4829; RV32IA-NEXT:  # %bb.2:
4830; RV32IA-NEXT:    srl a0, a3, a0
4831; RV32IA-NEXT:    ret
4832;
4833; RV64I-LABEL: atomicrmw_xchg_i16_monotonic:
4834; RV64I:       # %bb.0:
4835; RV64I-NEXT:    addi sp, sp, -16
4836; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4837; RV64I-NEXT:    li a2, 0
4838; RV64I-NEXT:    call __atomic_exchange_2@plt
4839; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4840; RV64I-NEXT:    addi sp, sp, 16
4841; RV64I-NEXT:    ret
4842;
4843; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic:
4844; RV64IA:       # %bb.0:
4845; RV64IA-NEXT:    andi a2, a0, -4
4846; RV64IA-NEXT:    slliw a0, a0, 3
4847; RV64IA-NEXT:    lui a3, 16
4848; RV64IA-NEXT:    addiw a3, a3, -1
4849; RV64IA-NEXT:    sllw a4, a3, a0
4850; RV64IA-NEXT:    and a1, a1, a3
4851; RV64IA-NEXT:    sllw a1, a1, a0
4852; RV64IA-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
4853; RV64IA-NEXT:    lr.w a3, (a2)
4854; RV64IA-NEXT:    mv a5, a1
4855; RV64IA-NEXT:    xor a5, a3, a5
4856; RV64IA-NEXT:    and a5, a5, a4
4857; RV64IA-NEXT:    xor a5, a3, a5
4858; RV64IA-NEXT:    sc.w a5, a5, (a2)
4859; RV64IA-NEXT:    bnez a5, .LBB55_1
4860; RV64IA-NEXT:  # %bb.2:
4861; RV64IA-NEXT:    srlw a0, a3, a0
4862; RV64IA-NEXT:    ret
4863  %1 = atomicrmw xchg i16* %a, i16 %b monotonic
4864  ret i16 %1
4865}
4866
4867define i16 @atomicrmw_xchg_i16_acquire(i16* %a, i16 %b) nounwind {
4868; RV32I-LABEL: atomicrmw_xchg_i16_acquire:
4869; RV32I:       # %bb.0:
4870; RV32I-NEXT:    addi sp, sp, -16
4871; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4872; RV32I-NEXT:    li a2, 2
4873; RV32I-NEXT:    call __atomic_exchange_2@plt
4874; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4875; RV32I-NEXT:    addi sp, sp, 16
4876; RV32I-NEXT:    ret
4877;
4878; RV32IA-LABEL: atomicrmw_xchg_i16_acquire:
4879; RV32IA:       # %bb.0:
4880; RV32IA-NEXT:    andi a2, a0, -4
4881; RV32IA-NEXT:    slli a0, a0, 3
4882; RV32IA-NEXT:    lui a3, 16
4883; RV32IA-NEXT:    addi a3, a3, -1
4884; RV32IA-NEXT:    sll a4, a3, a0
4885; RV32IA-NEXT:    and a1, a1, a3
4886; RV32IA-NEXT:    sll a1, a1, a0
4887; RV32IA-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
4888; RV32IA-NEXT:    lr.w.aq a3, (a2)
4889; RV32IA-NEXT:    mv a5, a1
4890; RV32IA-NEXT:    xor a5, a3, a5
4891; RV32IA-NEXT:    and a5, a5, a4
4892; RV32IA-NEXT:    xor a5, a3, a5
4893; RV32IA-NEXT:    sc.w a5, a5, (a2)
4894; RV32IA-NEXT:    bnez a5, .LBB56_1
4895; RV32IA-NEXT:  # %bb.2:
4896; RV32IA-NEXT:    srl a0, a3, a0
4897; RV32IA-NEXT:    ret
4898;
4899; RV64I-LABEL: atomicrmw_xchg_i16_acquire:
4900; RV64I:       # %bb.0:
4901; RV64I-NEXT:    addi sp, sp, -16
4902; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4903; RV64I-NEXT:    li a2, 2
4904; RV64I-NEXT:    call __atomic_exchange_2@plt
4905; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4906; RV64I-NEXT:    addi sp, sp, 16
4907; RV64I-NEXT:    ret
4908;
4909; RV64IA-LABEL: atomicrmw_xchg_i16_acquire:
4910; RV64IA:       # %bb.0:
4911; RV64IA-NEXT:    andi a2, a0, -4
4912; RV64IA-NEXT:    slliw a0, a0, 3
4913; RV64IA-NEXT:    lui a3, 16
4914; RV64IA-NEXT:    addiw a3, a3, -1
4915; RV64IA-NEXT:    sllw a4, a3, a0
4916; RV64IA-NEXT:    and a1, a1, a3
4917; RV64IA-NEXT:    sllw a1, a1, a0
4918; RV64IA-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
4919; RV64IA-NEXT:    lr.w.aq a3, (a2)
4920; RV64IA-NEXT:    mv a5, a1
4921; RV64IA-NEXT:    xor a5, a3, a5
4922; RV64IA-NEXT:    and a5, a5, a4
4923; RV64IA-NEXT:    xor a5, a3, a5
4924; RV64IA-NEXT:    sc.w a5, a5, (a2)
4925; RV64IA-NEXT:    bnez a5, .LBB56_1
4926; RV64IA-NEXT:  # %bb.2:
4927; RV64IA-NEXT:    srlw a0, a3, a0
4928; RV64IA-NEXT:    ret
4929  %1 = atomicrmw xchg i16* %a, i16 %b acquire
4930  ret i16 %1
4931}
4932
4933define i16 @atomicrmw_xchg_i16_release(i16* %a, i16 %b) nounwind {
4934; RV32I-LABEL: atomicrmw_xchg_i16_release:
4935; RV32I:       # %bb.0:
4936; RV32I-NEXT:    addi sp, sp, -16
4937; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4938; RV32I-NEXT:    li a2, 3
4939; RV32I-NEXT:    call __atomic_exchange_2@plt
4940; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4941; RV32I-NEXT:    addi sp, sp, 16
4942; RV32I-NEXT:    ret
4943;
4944; RV32IA-LABEL: atomicrmw_xchg_i16_release:
4945; RV32IA:       # %bb.0:
4946; RV32IA-NEXT:    andi a2, a0, -4
4947; RV32IA-NEXT:    slli a0, a0, 3
4948; RV32IA-NEXT:    lui a3, 16
4949; RV32IA-NEXT:    addi a3, a3, -1
4950; RV32IA-NEXT:    sll a4, a3, a0
4951; RV32IA-NEXT:    and a1, a1, a3
4952; RV32IA-NEXT:    sll a1, a1, a0
4953; RV32IA-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
4954; RV32IA-NEXT:    lr.w a3, (a2)
4955; RV32IA-NEXT:    mv a5, a1
4956; RV32IA-NEXT:    xor a5, a3, a5
4957; RV32IA-NEXT:    and a5, a5, a4
4958; RV32IA-NEXT:    xor a5, a3, a5
4959; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
4960; RV32IA-NEXT:    bnez a5, .LBB57_1
4961; RV32IA-NEXT:  # %bb.2:
4962; RV32IA-NEXT:    srl a0, a3, a0
4963; RV32IA-NEXT:    ret
4964;
4965; RV64I-LABEL: atomicrmw_xchg_i16_release:
4966; RV64I:       # %bb.0:
4967; RV64I-NEXT:    addi sp, sp, -16
4968; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4969; RV64I-NEXT:    li a2, 3
4970; RV64I-NEXT:    call __atomic_exchange_2@plt
4971; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4972; RV64I-NEXT:    addi sp, sp, 16
4973; RV64I-NEXT:    ret
4974;
4975; RV64IA-LABEL: atomicrmw_xchg_i16_release:
4976; RV64IA:       # %bb.0:
4977; RV64IA-NEXT:    andi a2, a0, -4
4978; RV64IA-NEXT:    slliw a0, a0, 3
4979; RV64IA-NEXT:    lui a3, 16
4980; RV64IA-NEXT:    addiw a3, a3, -1
4981; RV64IA-NEXT:    sllw a4, a3, a0
4982; RV64IA-NEXT:    and a1, a1, a3
4983; RV64IA-NEXT:    sllw a1, a1, a0
4984; RV64IA-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
4985; RV64IA-NEXT:    lr.w a3, (a2)
4986; RV64IA-NEXT:    mv a5, a1
4987; RV64IA-NEXT:    xor a5, a3, a5
4988; RV64IA-NEXT:    and a5, a5, a4
4989; RV64IA-NEXT:    xor a5, a3, a5
4990; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
4991; RV64IA-NEXT:    bnez a5, .LBB57_1
4992; RV64IA-NEXT:  # %bb.2:
4993; RV64IA-NEXT:    srlw a0, a3, a0
4994; RV64IA-NEXT:    ret
4995  %1 = atomicrmw xchg i16* %a, i16 %b release
4996  ret i16 %1
4997}
4998
4999define i16 @atomicrmw_xchg_i16_acq_rel(i16* %a, i16 %b) nounwind {
5000; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel:
5001; RV32I:       # %bb.0:
5002; RV32I-NEXT:    addi sp, sp, -16
5003; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5004; RV32I-NEXT:    li a2, 4
5005; RV32I-NEXT:    call __atomic_exchange_2@plt
5006; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5007; RV32I-NEXT:    addi sp, sp, 16
5008; RV32I-NEXT:    ret
5009;
5010; RV32IA-LABEL: atomicrmw_xchg_i16_acq_rel:
5011; RV32IA:       # %bb.0:
5012; RV32IA-NEXT:    andi a2, a0, -4
5013; RV32IA-NEXT:    slli a0, a0, 3
5014; RV32IA-NEXT:    lui a3, 16
5015; RV32IA-NEXT:    addi a3, a3, -1
5016; RV32IA-NEXT:    sll a4, a3, a0
5017; RV32IA-NEXT:    and a1, a1, a3
5018; RV32IA-NEXT:    sll a1, a1, a0
5019; RV32IA-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
5020; RV32IA-NEXT:    lr.w.aq a3, (a2)
5021; RV32IA-NEXT:    mv a5, a1
5022; RV32IA-NEXT:    xor a5, a3, a5
5023; RV32IA-NEXT:    and a5, a5, a4
5024; RV32IA-NEXT:    xor a5, a3, a5
5025; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5026; RV32IA-NEXT:    bnez a5, .LBB58_1
5027; RV32IA-NEXT:  # %bb.2:
5028; RV32IA-NEXT:    srl a0, a3, a0
5029; RV32IA-NEXT:    ret
5030;
5031; RV64I-LABEL: atomicrmw_xchg_i16_acq_rel:
5032; RV64I:       # %bb.0:
5033; RV64I-NEXT:    addi sp, sp, -16
5034; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5035; RV64I-NEXT:    li a2, 4
5036; RV64I-NEXT:    call __atomic_exchange_2@plt
5037; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5038; RV64I-NEXT:    addi sp, sp, 16
5039; RV64I-NEXT:    ret
5040;
5041; RV64IA-LABEL: atomicrmw_xchg_i16_acq_rel:
5042; RV64IA:       # %bb.0:
5043; RV64IA-NEXT:    andi a2, a0, -4
5044; RV64IA-NEXT:    slliw a0, a0, 3
5045; RV64IA-NEXT:    lui a3, 16
5046; RV64IA-NEXT:    addiw a3, a3, -1
5047; RV64IA-NEXT:    sllw a4, a3, a0
5048; RV64IA-NEXT:    and a1, a1, a3
5049; RV64IA-NEXT:    sllw a1, a1, a0
5050; RV64IA-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
5051; RV64IA-NEXT:    lr.w.aq a3, (a2)
5052; RV64IA-NEXT:    mv a5, a1
5053; RV64IA-NEXT:    xor a5, a3, a5
5054; RV64IA-NEXT:    and a5, a5, a4
5055; RV64IA-NEXT:    xor a5, a3, a5
5056; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5057; RV64IA-NEXT:    bnez a5, .LBB58_1
5058; RV64IA-NEXT:  # %bb.2:
5059; RV64IA-NEXT:    srlw a0, a3, a0
5060; RV64IA-NEXT:    ret
5061  %1 = atomicrmw xchg i16* %a, i16 %b acq_rel
5062  ret i16 %1
5063}
5064
5065define i16 @atomicrmw_xchg_i16_seq_cst(i16* %a, i16 %b) nounwind {
5066; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst:
5067; RV32I:       # %bb.0:
5068; RV32I-NEXT:    addi sp, sp, -16
5069; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5070; RV32I-NEXT:    li a2, 5
5071; RV32I-NEXT:    call __atomic_exchange_2@plt
5072; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5073; RV32I-NEXT:    addi sp, sp, 16
5074; RV32I-NEXT:    ret
5075;
5076; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst:
5077; RV32IA:       # %bb.0:
5078; RV32IA-NEXT:    andi a2, a0, -4
5079; RV32IA-NEXT:    slli a0, a0, 3
5080; RV32IA-NEXT:    lui a3, 16
5081; RV32IA-NEXT:    addi a3, a3, -1
5082; RV32IA-NEXT:    sll a4, a3, a0
5083; RV32IA-NEXT:    and a1, a1, a3
5084; RV32IA-NEXT:    sll a1, a1, a0
5085; RV32IA-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
5086; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
5087; RV32IA-NEXT:    mv a5, a1
5088; RV32IA-NEXT:    xor a5, a3, a5
5089; RV32IA-NEXT:    and a5, a5, a4
5090; RV32IA-NEXT:    xor a5, a3, a5
5091; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5092; RV32IA-NEXT:    bnez a5, .LBB59_1
5093; RV32IA-NEXT:  # %bb.2:
5094; RV32IA-NEXT:    srl a0, a3, a0
5095; RV32IA-NEXT:    ret
5096;
5097; RV64I-LABEL: atomicrmw_xchg_i16_seq_cst:
5098; RV64I:       # %bb.0:
5099; RV64I-NEXT:    addi sp, sp, -16
5100; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5101; RV64I-NEXT:    li a2, 5
5102; RV64I-NEXT:    call __atomic_exchange_2@plt
5103; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5104; RV64I-NEXT:    addi sp, sp, 16
5105; RV64I-NEXT:    ret
5106;
5107; RV64IA-LABEL: atomicrmw_xchg_i16_seq_cst:
5108; RV64IA:       # %bb.0:
5109; RV64IA-NEXT:    andi a2, a0, -4
5110; RV64IA-NEXT:    slliw a0, a0, 3
5111; RV64IA-NEXT:    lui a3, 16
5112; RV64IA-NEXT:    addiw a3, a3, -1
5113; RV64IA-NEXT:    sllw a4, a3, a0
5114; RV64IA-NEXT:    and a1, a1, a3
5115; RV64IA-NEXT:    sllw a1, a1, a0
5116; RV64IA-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
5117; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
5118; RV64IA-NEXT:    mv a5, a1
5119; RV64IA-NEXT:    xor a5, a3, a5
5120; RV64IA-NEXT:    and a5, a5, a4
5121; RV64IA-NEXT:    xor a5, a3, a5
5122; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5123; RV64IA-NEXT:    bnez a5, .LBB59_1
5124; RV64IA-NEXT:  # %bb.2:
5125; RV64IA-NEXT:    srlw a0, a3, a0
5126; RV64IA-NEXT:    ret
5127  %1 = atomicrmw xchg i16* %a, i16 %b seq_cst
5128  ret i16 %1
5129}
5130
5131define i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind {
5132; RV32I-LABEL: atomicrmw_add_i16_monotonic:
5133; RV32I:       # %bb.0:
5134; RV32I-NEXT:    addi sp, sp, -16
5135; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5136; RV32I-NEXT:    li a2, 0
5137; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5138; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5139; RV32I-NEXT:    addi sp, sp, 16
5140; RV32I-NEXT:    ret
5141;
5142; RV32IA-LABEL: atomicrmw_add_i16_monotonic:
5143; RV32IA:       # %bb.0:
5144; RV32IA-NEXT:    andi a2, a0, -4
5145; RV32IA-NEXT:    slli a0, a0, 3
5146; RV32IA-NEXT:    lui a3, 16
5147; RV32IA-NEXT:    addi a3, a3, -1
5148; RV32IA-NEXT:    sll a4, a3, a0
5149; RV32IA-NEXT:    and a1, a1, a3
5150; RV32IA-NEXT:    sll a1, a1, a0
5151; RV32IA-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
5152; RV32IA-NEXT:    lr.w a3, (a2)
5153; RV32IA-NEXT:    add a5, a3, a1
5154; RV32IA-NEXT:    xor a5, a3, a5
5155; RV32IA-NEXT:    and a5, a5, a4
5156; RV32IA-NEXT:    xor a5, a3, a5
5157; RV32IA-NEXT:    sc.w a5, a5, (a2)
5158; RV32IA-NEXT:    bnez a5, .LBB60_1
5159; RV32IA-NEXT:  # %bb.2:
5160; RV32IA-NEXT:    srl a0, a3, a0
5161; RV32IA-NEXT:    ret
5162;
5163; RV64I-LABEL: atomicrmw_add_i16_monotonic:
5164; RV64I:       # %bb.0:
5165; RV64I-NEXT:    addi sp, sp, -16
5166; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5167; RV64I-NEXT:    li a2, 0
5168; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5169; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5170; RV64I-NEXT:    addi sp, sp, 16
5171; RV64I-NEXT:    ret
5172;
5173; RV64IA-LABEL: atomicrmw_add_i16_monotonic:
5174; RV64IA:       # %bb.0:
5175; RV64IA-NEXT:    andi a2, a0, -4
5176; RV64IA-NEXT:    slliw a0, a0, 3
5177; RV64IA-NEXT:    lui a3, 16
5178; RV64IA-NEXT:    addiw a3, a3, -1
5179; RV64IA-NEXT:    sllw a4, a3, a0
5180; RV64IA-NEXT:    and a1, a1, a3
5181; RV64IA-NEXT:    sllw a1, a1, a0
5182; RV64IA-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
5183; RV64IA-NEXT:    lr.w a3, (a2)
5184; RV64IA-NEXT:    add a5, a3, a1
5185; RV64IA-NEXT:    xor a5, a3, a5
5186; RV64IA-NEXT:    and a5, a5, a4
5187; RV64IA-NEXT:    xor a5, a3, a5
5188; RV64IA-NEXT:    sc.w a5, a5, (a2)
5189; RV64IA-NEXT:    bnez a5, .LBB60_1
5190; RV64IA-NEXT:  # %bb.2:
5191; RV64IA-NEXT:    srlw a0, a3, a0
5192; RV64IA-NEXT:    ret
5193  %1 = atomicrmw add i16* %a, i16 %b monotonic
5194  ret i16 %1
5195}
5196
5197define i16 @atomicrmw_add_i16_acquire(i16 *%a, i16 %b) nounwind {
5198; RV32I-LABEL: atomicrmw_add_i16_acquire:
5199; RV32I:       # %bb.0:
5200; RV32I-NEXT:    addi sp, sp, -16
5201; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5202; RV32I-NEXT:    li a2, 2
5203; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5204; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5205; RV32I-NEXT:    addi sp, sp, 16
5206; RV32I-NEXT:    ret
5207;
5208; RV32IA-LABEL: atomicrmw_add_i16_acquire:
5209; RV32IA:       # %bb.0:
5210; RV32IA-NEXT:    andi a2, a0, -4
5211; RV32IA-NEXT:    slli a0, a0, 3
5212; RV32IA-NEXT:    lui a3, 16
5213; RV32IA-NEXT:    addi a3, a3, -1
5214; RV32IA-NEXT:    sll a4, a3, a0
5215; RV32IA-NEXT:    and a1, a1, a3
5216; RV32IA-NEXT:    sll a1, a1, a0
5217; RV32IA-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
5218; RV32IA-NEXT:    lr.w.aq a3, (a2)
5219; RV32IA-NEXT:    add a5, a3, a1
5220; RV32IA-NEXT:    xor a5, a3, a5
5221; RV32IA-NEXT:    and a5, a5, a4
5222; RV32IA-NEXT:    xor a5, a3, a5
5223; RV32IA-NEXT:    sc.w a5, a5, (a2)
5224; RV32IA-NEXT:    bnez a5, .LBB61_1
5225; RV32IA-NEXT:  # %bb.2:
5226; RV32IA-NEXT:    srl a0, a3, a0
5227; RV32IA-NEXT:    ret
5228;
5229; RV64I-LABEL: atomicrmw_add_i16_acquire:
5230; RV64I:       # %bb.0:
5231; RV64I-NEXT:    addi sp, sp, -16
5232; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5233; RV64I-NEXT:    li a2, 2
5234; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5235; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5236; RV64I-NEXT:    addi sp, sp, 16
5237; RV64I-NEXT:    ret
5238;
5239; RV64IA-LABEL: atomicrmw_add_i16_acquire:
5240; RV64IA:       # %bb.0:
5241; RV64IA-NEXT:    andi a2, a0, -4
5242; RV64IA-NEXT:    slliw a0, a0, 3
5243; RV64IA-NEXT:    lui a3, 16
5244; RV64IA-NEXT:    addiw a3, a3, -1
5245; RV64IA-NEXT:    sllw a4, a3, a0
5246; RV64IA-NEXT:    and a1, a1, a3
5247; RV64IA-NEXT:    sllw a1, a1, a0
5248; RV64IA-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
5249; RV64IA-NEXT:    lr.w.aq a3, (a2)
5250; RV64IA-NEXT:    add a5, a3, a1
5251; RV64IA-NEXT:    xor a5, a3, a5
5252; RV64IA-NEXT:    and a5, a5, a4
5253; RV64IA-NEXT:    xor a5, a3, a5
5254; RV64IA-NEXT:    sc.w a5, a5, (a2)
5255; RV64IA-NEXT:    bnez a5, .LBB61_1
5256; RV64IA-NEXT:  # %bb.2:
5257; RV64IA-NEXT:    srlw a0, a3, a0
5258; RV64IA-NEXT:    ret
5259  %1 = atomicrmw add i16* %a, i16 %b acquire
5260  ret i16 %1
5261}
5262
5263define i16 @atomicrmw_add_i16_release(i16 *%a, i16 %b) nounwind {
5264; RV32I-LABEL: atomicrmw_add_i16_release:
5265; RV32I:       # %bb.0:
5266; RV32I-NEXT:    addi sp, sp, -16
5267; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5268; RV32I-NEXT:    li a2, 3
5269; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5270; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5271; RV32I-NEXT:    addi sp, sp, 16
5272; RV32I-NEXT:    ret
5273;
5274; RV32IA-LABEL: atomicrmw_add_i16_release:
5275; RV32IA:       # %bb.0:
5276; RV32IA-NEXT:    andi a2, a0, -4
5277; RV32IA-NEXT:    slli a0, a0, 3
5278; RV32IA-NEXT:    lui a3, 16
5279; RV32IA-NEXT:    addi a3, a3, -1
5280; RV32IA-NEXT:    sll a4, a3, a0
5281; RV32IA-NEXT:    and a1, a1, a3
5282; RV32IA-NEXT:    sll a1, a1, a0
5283; RV32IA-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
5284; RV32IA-NEXT:    lr.w a3, (a2)
5285; RV32IA-NEXT:    add a5, a3, a1
5286; RV32IA-NEXT:    xor a5, a3, a5
5287; RV32IA-NEXT:    and a5, a5, a4
5288; RV32IA-NEXT:    xor a5, a3, a5
5289; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5290; RV32IA-NEXT:    bnez a5, .LBB62_1
5291; RV32IA-NEXT:  # %bb.2:
5292; RV32IA-NEXT:    srl a0, a3, a0
5293; RV32IA-NEXT:    ret
5294;
5295; RV64I-LABEL: atomicrmw_add_i16_release:
5296; RV64I:       # %bb.0:
5297; RV64I-NEXT:    addi sp, sp, -16
5298; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5299; RV64I-NEXT:    li a2, 3
5300; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5301; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5302; RV64I-NEXT:    addi sp, sp, 16
5303; RV64I-NEXT:    ret
5304;
5305; RV64IA-LABEL: atomicrmw_add_i16_release:
5306; RV64IA:       # %bb.0:
5307; RV64IA-NEXT:    andi a2, a0, -4
5308; RV64IA-NEXT:    slliw a0, a0, 3
5309; RV64IA-NEXT:    lui a3, 16
5310; RV64IA-NEXT:    addiw a3, a3, -1
5311; RV64IA-NEXT:    sllw a4, a3, a0
5312; RV64IA-NEXT:    and a1, a1, a3
5313; RV64IA-NEXT:    sllw a1, a1, a0
5314; RV64IA-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
5315; RV64IA-NEXT:    lr.w a3, (a2)
5316; RV64IA-NEXT:    add a5, a3, a1
5317; RV64IA-NEXT:    xor a5, a3, a5
5318; RV64IA-NEXT:    and a5, a5, a4
5319; RV64IA-NEXT:    xor a5, a3, a5
5320; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5321; RV64IA-NEXT:    bnez a5, .LBB62_1
5322; RV64IA-NEXT:  # %bb.2:
5323; RV64IA-NEXT:    srlw a0, a3, a0
5324; RV64IA-NEXT:    ret
5325  %1 = atomicrmw add i16* %a, i16 %b release
5326  ret i16 %1
5327}
5328
5329define i16 @atomicrmw_add_i16_acq_rel(i16 *%a, i16 %b) nounwind {
5330; RV32I-LABEL: atomicrmw_add_i16_acq_rel:
5331; RV32I:       # %bb.0:
5332; RV32I-NEXT:    addi sp, sp, -16
5333; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5334; RV32I-NEXT:    li a2, 4
5335; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5336; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5337; RV32I-NEXT:    addi sp, sp, 16
5338; RV32I-NEXT:    ret
5339;
5340; RV32IA-LABEL: atomicrmw_add_i16_acq_rel:
5341; RV32IA:       # %bb.0:
5342; RV32IA-NEXT:    andi a2, a0, -4
5343; RV32IA-NEXT:    slli a0, a0, 3
5344; RV32IA-NEXT:    lui a3, 16
5345; RV32IA-NEXT:    addi a3, a3, -1
5346; RV32IA-NEXT:    sll a4, a3, a0
5347; RV32IA-NEXT:    and a1, a1, a3
5348; RV32IA-NEXT:    sll a1, a1, a0
5349; RV32IA-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
5350; RV32IA-NEXT:    lr.w.aq a3, (a2)
5351; RV32IA-NEXT:    add a5, a3, a1
5352; RV32IA-NEXT:    xor a5, a3, a5
5353; RV32IA-NEXT:    and a5, a5, a4
5354; RV32IA-NEXT:    xor a5, a3, a5
5355; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5356; RV32IA-NEXT:    bnez a5, .LBB63_1
5357; RV32IA-NEXT:  # %bb.2:
5358; RV32IA-NEXT:    srl a0, a3, a0
5359; RV32IA-NEXT:    ret
5360;
5361; RV64I-LABEL: atomicrmw_add_i16_acq_rel:
5362; RV64I:       # %bb.0:
5363; RV64I-NEXT:    addi sp, sp, -16
5364; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5365; RV64I-NEXT:    li a2, 4
5366; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5367; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5368; RV64I-NEXT:    addi sp, sp, 16
5369; RV64I-NEXT:    ret
5370;
5371; RV64IA-LABEL: atomicrmw_add_i16_acq_rel:
5372; RV64IA:       # %bb.0:
5373; RV64IA-NEXT:    andi a2, a0, -4
5374; RV64IA-NEXT:    slliw a0, a0, 3
5375; RV64IA-NEXT:    lui a3, 16
5376; RV64IA-NEXT:    addiw a3, a3, -1
5377; RV64IA-NEXT:    sllw a4, a3, a0
5378; RV64IA-NEXT:    and a1, a1, a3
5379; RV64IA-NEXT:    sllw a1, a1, a0
5380; RV64IA-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
5381; RV64IA-NEXT:    lr.w.aq a3, (a2)
5382; RV64IA-NEXT:    add a5, a3, a1
5383; RV64IA-NEXT:    xor a5, a3, a5
5384; RV64IA-NEXT:    and a5, a5, a4
5385; RV64IA-NEXT:    xor a5, a3, a5
5386; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5387; RV64IA-NEXT:    bnez a5, .LBB63_1
5388; RV64IA-NEXT:  # %bb.2:
5389; RV64IA-NEXT:    srlw a0, a3, a0
5390; RV64IA-NEXT:    ret
5391  %1 = atomicrmw add i16* %a, i16 %b acq_rel
5392  ret i16 %1
5393}
5394
5395define i16 @atomicrmw_add_i16_seq_cst(i16 *%a, i16 %b) nounwind {
5396; RV32I-LABEL: atomicrmw_add_i16_seq_cst:
5397; RV32I:       # %bb.0:
5398; RV32I-NEXT:    addi sp, sp, -16
5399; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5400; RV32I-NEXT:    li a2, 5
5401; RV32I-NEXT:    call __atomic_fetch_add_2@plt
5402; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5403; RV32I-NEXT:    addi sp, sp, 16
5404; RV32I-NEXT:    ret
5405;
5406; RV32IA-LABEL: atomicrmw_add_i16_seq_cst:
5407; RV32IA:       # %bb.0:
5408; RV32IA-NEXT:    andi a2, a0, -4
5409; RV32IA-NEXT:    slli a0, a0, 3
5410; RV32IA-NEXT:    lui a3, 16
5411; RV32IA-NEXT:    addi a3, a3, -1
5412; RV32IA-NEXT:    sll a4, a3, a0
5413; RV32IA-NEXT:    and a1, a1, a3
5414; RV32IA-NEXT:    sll a1, a1, a0
5415; RV32IA-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
5416; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
5417; RV32IA-NEXT:    add a5, a3, a1
5418; RV32IA-NEXT:    xor a5, a3, a5
5419; RV32IA-NEXT:    and a5, a5, a4
5420; RV32IA-NEXT:    xor a5, a3, a5
5421; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5422; RV32IA-NEXT:    bnez a5, .LBB64_1
5423; RV32IA-NEXT:  # %bb.2:
5424; RV32IA-NEXT:    srl a0, a3, a0
5425; RV32IA-NEXT:    ret
5426;
5427; RV64I-LABEL: atomicrmw_add_i16_seq_cst:
5428; RV64I:       # %bb.0:
5429; RV64I-NEXT:    addi sp, sp, -16
5430; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5431; RV64I-NEXT:    li a2, 5
5432; RV64I-NEXT:    call __atomic_fetch_add_2@plt
5433; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5434; RV64I-NEXT:    addi sp, sp, 16
5435; RV64I-NEXT:    ret
5436;
5437; RV64IA-LABEL: atomicrmw_add_i16_seq_cst:
5438; RV64IA:       # %bb.0:
5439; RV64IA-NEXT:    andi a2, a0, -4
5440; RV64IA-NEXT:    slliw a0, a0, 3
5441; RV64IA-NEXT:    lui a3, 16
5442; RV64IA-NEXT:    addiw a3, a3, -1
5443; RV64IA-NEXT:    sllw a4, a3, a0
5444; RV64IA-NEXT:    and a1, a1, a3
5445; RV64IA-NEXT:    sllw a1, a1, a0
5446; RV64IA-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
5447; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
5448; RV64IA-NEXT:    add a5, a3, a1
5449; RV64IA-NEXT:    xor a5, a3, a5
5450; RV64IA-NEXT:    and a5, a5, a4
5451; RV64IA-NEXT:    xor a5, a3, a5
5452; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5453; RV64IA-NEXT:    bnez a5, .LBB64_1
5454; RV64IA-NEXT:  # %bb.2:
5455; RV64IA-NEXT:    srlw a0, a3, a0
5456; RV64IA-NEXT:    ret
5457  %1 = atomicrmw add i16* %a, i16 %b seq_cst
5458  ret i16 %1
5459}
5460
5461define i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) nounwind {
5462; RV32I-LABEL: atomicrmw_sub_i16_monotonic:
5463; RV32I:       # %bb.0:
5464; RV32I-NEXT:    addi sp, sp, -16
5465; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5466; RV32I-NEXT:    li a2, 0
5467; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5468; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5469; RV32I-NEXT:    addi sp, sp, 16
5470; RV32I-NEXT:    ret
5471;
5472; RV32IA-LABEL: atomicrmw_sub_i16_monotonic:
5473; RV32IA:       # %bb.0:
5474; RV32IA-NEXT:    andi a2, a0, -4
5475; RV32IA-NEXT:    slli a0, a0, 3
5476; RV32IA-NEXT:    lui a3, 16
5477; RV32IA-NEXT:    addi a3, a3, -1
5478; RV32IA-NEXT:    sll a4, a3, a0
5479; RV32IA-NEXT:    and a1, a1, a3
5480; RV32IA-NEXT:    sll a1, a1, a0
5481; RV32IA-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
5482; RV32IA-NEXT:    lr.w a3, (a2)
5483; RV32IA-NEXT:    sub a5, a3, a1
5484; RV32IA-NEXT:    xor a5, a3, a5
5485; RV32IA-NEXT:    and a5, a5, a4
5486; RV32IA-NEXT:    xor a5, a3, a5
5487; RV32IA-NEXT:    sc.w a5, a5, (a2)
5488; RV32IA-NEXT:    bnez a5, .LBB65_1
5489; RV32IA-NEXT:  # %bb.2:
5490; RV32IA-NEXT:    srl a0, a3, a0
5491; RV32IA-NEXT:    ret
5492;
5493; RV64I-LABEL: atomicrmw_sub_i16_monotonic:
5494; RV64I:       # %bb.0:
5495; RV64I-NEXT:    addi sp, sp, -16
5496; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5497; RV64I-NEXT:    li a2, 0
5498; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5499; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5500; RV64I-NEXT:    addi sp, sp, 16
5501; RV64I-NEXT:    ret
5502;
5503; RV64IA-LABEL: atomicrmw_sub_i16_monotonic:
5504; RV64IA:       # %bb.0:
5505; RV64IA-NEXT:    andi a2, a0, -4
5506; RV64IA-NEXT:    slliw a0, a0, 3
5507; RV64IA-NEXT:    lui a3, 16
5508; RV64IA-NEXT:    addiw a3, a3, -1
5509; RV64IA-NEXT:    sllw a4, a3, a0
5510; RV64IA-NEXT:    and a1, a1, a3
5511; RV64IA-NEXT:    sllw a1, a1, a0
5512; RV64IA-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
5513; RV64IA-NEXT:    lr.w a3, (a2)
5514; RV64IA-NEXT:    sub a5, a3, a1
5515; RV64IA-NEXT:    xor a5, a3, a5
5516; RV64IA-NEXT:    and a5, a5, a4
5517; RV64IA-NEXT:    xor a5, a3, a5
5518; RV64IA-NEXT:    sc.w a5, a5, (a2)
5519; RV64IA-NEXT:    bnez a5, .LBB65_1
5520; RV64IA-NEXT:  # %bb.2:
5521; RV64IA-NEXT:    srlw a0, a3, a0
5522; RV64IA-NEXT:    ret
5523  %1 = atomicrmw sub i16* %a, i16 %b monotonic
5524  ret i16 %1
5525}
5526
5527define i16 @atomicrmw_sub_i16_acquire(i16* %a, i16 %b) nounwind {
5528; RV32I-LABEL: atomicrmw_sub_i16_acquire:
5529; RV32I:       # %bb.0:
5530; RV32I-NEXT:    addi sp, sp, -16
5531; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5532; RV32I-NEXT:    li a2, 2
5533; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5534; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5535; RV32I-NEXT:    addi sp, sp, 16
5536; RV32I-NEXT:    ret
5537;
5538; RV32IA-LABEL: atomicrmw_sub_i16_acquire:
5539; RV32IA:       # %bb.0:
5540; RV32IA-NEXT:    andi a2, a0, -4
5541; RV32IA-NEXT:    slli a0, a0, 3
5542; RV32IA-NEXT:    lui a3, 16
5543; RV32IA-NEXT:    addi a3, a3, -1
5544; RV32IA-NEXT:    sll a4, a3, a0
5545; RV32IA-NEXT:    and a1, a1, a3
5546; RV32IA-NEXT:    sll a1, a1, a0
5547; RV32IA-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
5548; RV32IA-NEXT:    lr.w.aq a3, (a2)
5549; RV32IA-NEXT:    sub a5, a3, a1
5550; RV32IA-NEXT:    xor a5, a3, a5
5551; RV32IA-NEXT:    and a5, a5, a4
5552; RV32IA-NEXT:    xor a5, a3, a5
5553; RV32IA-NEXT:    sc.w a5, a5, (a2)
5554; RV32IA-NEXT:    bnez a5, .LBB66_1
5555; RV32IA-NEXT:  # %bb.2:
5556; RV32IA-NEXT:    srl a0, a3, a0
5557; RV32IA-NEXT:    ret
5558;
5559; RV64I-LABEL: atomicrmw_sub_i16_acquire:
5560; RV64I:       # %bb.0:
5561; RV64I-NEXT:    addi sp, sp, -16
5562; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5563; RV64I-NEXT:    li a2, 2
5564; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5565; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5566; RV64I-NEXT:    addi sp, sp, 16
5567; RV64I-NEXT:    ret
5568;
5569; RV64IA-LABEL: atomicrmw_sub_i16_acquire:
5570; RV64IA:       # %bb.0:
5571; RV64IA-NEXT:    andi a2, a0, -4
5572; RV64IA-NEXT:    slliw a0, a0, 3
5573; RV64IA-NEXT:    lui a3, 16
5574; RV64IA-NEXT:    addiw a3, a3, -1
5575; RV64IA-NEXT:    sllw a4, a3, a0
5576; RV64IA-NEXT:    and a1, a1, a3
5577; RV64IA-NEXT:    sllw a1, a1, a0
5578; RV64IA-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
5579; RV64IA-NEXT:    lr.w.aq a3, (a2)
5580; RV64IA-NEXT:    sub a5, a3, a1
5581; RV64IA-NEXT:    xor a5, a3, a5
5582; RV64IA-NEXT:    and a5, a5, a4
5583; RV64IA-NEXT:    xor a5, a3, a5
5584; RV64IA-NEXT:    sc.w a5, a5, (a2)
5585; RV64IA-NEXT:    bnez a5, .LBB66_1
5586; RV64IA-NEXT:  # %bb.2:
5587; RV64IA-NEXT:    srlw a0, a3, a0
5588; RV64IA-NEXT:    ret
5589  %1 = atomicrmw sub i16* %a, i16 %b acquire
5590  ret i16 %1
5591}
5592
5593define i16 @atomicrmw_sub_i16_release(i16* %a, i16 %b) nounwind {
5594; RV32I-LABEL: atomicrmw_sub_i16_release:
5595; RV32I:       # %bb.0:
5596; RV32I-NEXT:    addi sp, sp, -16
5597; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5598; RV32I-NEXT:    li a2, 3
5599; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5600; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5601; RV32I-NEXT:    addi sp, sp, 16
5602; RV32I-NEXT:    ret
5603;
5604; RV32IA-LABEL: atomicrmw_sub_i16_release:
5605; RV32IA:       # %bb.0:
5606; RV32IA-NEXT:    andi a2, a0, -4
5607; RV32IA-NEXT:    slli a0, a0, 3
5608; RV32IA-NEXT:    lui a3, 16
5609; RV32IA-NEXT:    addi a3, a3, -1
5610; RV32IA-NEXT:    sll a4, a3, a0
5611; RV32IA-NEXT:    and a1, a1, a3
5612; RV32IA-NEXT:    sll a1, a1, a0
5613; RV32IA-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
5614; RV32IA-NEXT:    lr.w a3, (a2)
5615; RV32IA-NEXT:    sub a5, a3, a1
5616; RV32IA-NEXT:    xor a5, a3, a5
5617; RV32IA-NEXT:    and a5, a5, a4
5618; RV32IA-NEXT:    xor a5, a3, a5
5619; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5620; RV32IA-NEXT:    bnez a5, .LBB67_1
5621; RV32IA-NEXT:  # %bb.2:
5622; RV32IA-NEXT:    srl a0, a3, a0
5623; RV32IA-NEXT:    ret
5624;
5625; RV64I-LABEL: atomicrmw_sub_i16_release:
5626; RV64I:       # %bb.0:
5627; RV64I-NEXT:    addi sp, sp, -16
5628; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5629; RV64I-NEXT:    li a2, 3
5630; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5631; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5632; RV64I-NEXT:    addi sp, sp, 16
5633; RV64I-NEXT:    ret
5634;
5635; RV64IA-LABEL: atomicrmw_sub_i16_release:
5636; RV64IA:       # %bb.0:
5637; RV64IA-NEXT:    andi a2, a0, -4
5638; RV64IA-NEXT:    slliw a0, a0, 3
5639; RV64IA-NEXT:    lui a3, 16
5640; RV64IA-NEXT:    addiw a3, a3, -1
5641; RV64IA-NEXT:    sllw a4, a3, a0
5642; RV64IA-NEXT:    and a1, a1, a3
5643; RV64IA-NEXT:    sllw a1, a1, a0
5644; RV64IA-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
5645; RV64IA-NEXT:    lr.w a3, (a2)
5646; RV64IA-NEXT:    sub a5, a3, a1
5647; RV64IA-NEXT:    xor a5, a3, a5
5648; RV64IA-NEXT:    and a5, a5, a4
5649; RV64IA-NEXT:    xor a5, a3, a5
5650; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5651; RV64IA-NEXT:    bnez a5, .LBB67_1
5652; RV64IA-NEXT:  # %bb.2:
5653; RV64IA-NEXT:    srlw a0, a3, a0
5654; RV64IA-NEXT:    ret
5655  %1 = atomicrmw sub i16* %a, i16 %b release
5656  ret i16 %1
5657}
5658
5659define i16 @atomicrmw_sub_i16_acq_rel(i16* %a, i16 %b) nounwind {
5660; RV32I-LABEL: atomicrmw_sub_i16_acq_rel:
5661; RV32I:       # %bb.0:
5662; RV32I-NEXT:    addi sp, sp, -16
5663; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5664; RV32I-NEXT:    li a2, 4
5665; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5666; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5667; RV32I-NEXT:    addi sp, sp, 16
5668; RV32I-NEXT:    ret
5669;
5670; RV32IA-LABEL: atomicrmw_sub_i16_acq_rel:
5671; RV32IA:       # %bb.0:
5672; RV32IA-NEXT:    andi a2, a0, -4
5673; RV32IA-NEXT:    slli a0, a0, 3
5674; RV32IA-NEXT:    lui a3, 16
5675; RV32IA-NEXT:    addi a3, a3, -1
5676; RV32IA-NEXT:    sll a4, a3, a0
5677; RV32IA-NEXT:    and a1, a1, a3
5678; RV32IA-NEXT:    sll a1, a1, a0
5679; RV32IA-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
5680; RV32IA-NEXT:    lr.w.aq a3, (a2)
5681; RV32IA-NEXT:    sub a5, a3, a1
5682; RV32IA-NEXT:    xor a5, a3, a5
5683; RV32IA-NEXT:    and a5, a5, a4
5684; RV32IA-NEXT:    xor a5, a3, a5
5685; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
5686; RV32IA-NEXT:    bnez a5, .LBB68_1
5687; RV32IA-NEXT:  # %bb.2:
5688; RV32IA-NEXT:    srl a0, a3, a0
5689; RV32IA-NEXT:    ret
5690;
5691; RV64I-LABEL: atomicrmw_sub_i16_acq_rel:
5692; RV64I:       # %bb.0:
5693; RV64I-NEXT:    addi sp, sp, -16
5694; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5695; RV64I-NEXT:    li a2, 4
5696; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5697; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5698; RV64I-NEXT:    addi sp, sp, 16
5699; RV64I-NEXT:    ret
5700;
5701; RV64IA-LABEL: atomicrmw_sub_i16_acq_rel:
5702; RV64IA:       # %bb.0:
5703; RV64IA-NEXT:    andi a2, a0, -4
5704; RV64IA-NEXT:    slliw a0, a0, 3
5705; RV64IA-NEXT:    lui a3, 16
5706; RV64IA-NEXT:    addiw a3, a3, -1
5707; RV64IA-NEXT:    sllw a4, a3, a0
5708; RV64IA-NEXT:    and a1, a1, a3
5709; RV64IA-NEXT:    sllw a1, a1, a0
5710; RV64IA-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
5711; RV64IA-NEXT:    lr.w.aq a3, (a2)
5712; RV64IA-NEXT:    sub a5, a3, a1
5713; RV64IA-NEXT:    xor a5, a3, a5
5714; RV64IA-NEXT:    and a5, a5, a4
5715; RV64IA-NEXT:    xor a5, a3, a5
5716; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
5717; RV64IA-NEXT:    bnez a5, .LBB68_1
5718; RV64IA-NEXT:  # %bb.2:
5719; RV64IA-NEXT:    srlw a0, a3, a0
5720; RV64IA-NEXT:    ret
5721  %1 = atomicrmw sub i16* %a, i16 %b acq_rel
5722  ret i16 %1
5723}
5724
5725define i16 @atomicrmw_sub_i16_seq_cst(i16* %a, i16 %b) nounwind {
5726; RV32I-LABEL: atomicrmw_sub_i16_seq_cst:
5727; RV32I:       # %bb.0:
5728; RV32I-NEXT:    addi sp, sp, -16
5729; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5730; RV32I-NEXT:    li a2, 5
5731; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
5732; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5733; RV32I-NEXT:    addi sp, sp, 16
5734; RV32I-NEXT:    ret
5735;
5736; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst:
5737; RV32IA:       # %bb.0:
5738; RV32IA-NEXT:    andi a2, a0, -4
5739; RV32IA-NEXT:    slli a0, a0, 3
5740; RV32IA-NEXT:    lui a3, 16
5741; RV32IA-NEXT:    addi a3, a3, -1
5742; RV32IA-NEXT:    sll a4, a3, a0
5743; RV32IA-NEXT:    and a1, a1, a3
5744; RV32IA-NEXT:    sll a1, a1, a0
5745; RV32IA-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
5746; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
5747; RV32IA-NEXT:    sub a5, a3, a1
5748; RV32IA-NEXT:    xor a5, a3, a5
5749; RV32IA-NEXT:    and a5, a5, a4
5750; RV32IA-NEXT:    xor a5, a3, a5
5751; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5752; RV32IA-NEXT:    bnez a5, .LBB69_1
5753; RV32IA-NEXT:  # %bb.2:
5754; RV32IA-NEXT:    srl a0, a3, a0
5755; RV32IA-NEXT:    ret
5756;
5757; RV64I-LABEL: atomicrmw_sub_i16_seq_cst:
5758; RV64I:       # %bb.0:
5759; RV64I-NEXT:    addi sp, sp, -16
5760; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5761; RV64I-NEXT:    li a2, 5
5762; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
5763; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5764; RV64I-NEXT:    addi sp, sp, 16
5765; RV64I-NEXT:    ret
5766;
5767; RV64IA-LABEL: atomicrmw_sub_i16_seq_cst:
5768; RV64IA:       # %bb.0:
5769; RV64IA-NEXT:    andi a2, a0, -4
5770; RV64IA-NEXT:    slliw a0, a0, 3
5771; RV64IA-NEXT:    lui a3, 16
5772; RV64IA-NEXT:    addiw a3, a3, -1
5773; RV64IA-NEXT:    sllw a4, a3, a0
5774; RV64IA-NEXT:    and a1, a1, a3
5775; RV64IA-NEXT:    sllw a1, a1, a0
5776; RV64IA-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
5777; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
5778; RV64IA-NEXT:    sub a5, a3, a1
5779; RV64IA-NEXT:    xor a5, a3, a5
5780; RV64IA-NEXT:    and a5, a5, a4
5781; RV64IA-NEXT:    xor a5, a3, a5
5782; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
5783; RV64IA-NEXT:    bnez a5, .LBB69_1
5784; RV64IA-NEXT:  # %bb.2:
5785; RV64IA-NEXT:    srlw a0, a3, a0
5786; RV64IA-NEXT:    ret
5787  %1 = atomicrmw sub i16* %a, i16 %b seq_cst
5788  ret i16 %1
5789}
5790
5791define i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind {
5792; RV32I-LABEL: atomicrmw_and_i16_monotonic:
5793; RV32I:       # %bb.0:
5794; RV32I-NEXT:    addi sp, sp, -16
5795; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5796; RV32I-NEXT:    li a2, 0
5797; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5798; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5799; RV32I-NEXT:    addi sp, sp, 16
5800; RV32I-NEXT:    ret
5801;
5802; RV32IA-LABEL: atomicrmw_and_i16_monotonic:
5803; RV32IA:       # %bb.0:
5804; RV32IA-NEXT:    andi a2, a0, -4
5805; RV32IA-NEXT:    slli a0, a0, 3
5806; RV32IA-NEXT:    lui a3, 16
5807; RV32IA-NEXT:    addi a3, a3, -1
5808; RV32IA-NEXT:    sll a4, a3, a0
5809; RV32IA-NEXT:    not a4, a4
5810; RV32IA-NEXT:    and a1, a1, a3
5811; RV32IA-NEXT:    sll a1, a1, a0
5812; RV32IA-NEXT:    or a1, a4, a1
5813; RV32IA-NEXT:    amoand.w a1, a1, (a2)
5814; RV32IA-NEXT:    srl a0, a1, a0
5815; RV32IA-NEXT:    ret
5816;
5817; RV64I-LABEL: atomicrmw_and_i16_monotonic:
5818; RV64I:       # %bb.0:
5819; RV64I-NEXT:    addi sp, sp, -16
5820; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5821; RV64I-NEXT:    li a2, 0
5822; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5823; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5824; RV64I-NEXT:    addi sp, sp, 16
5825; RV64I-NEXT:    ret
5826;
5827; RV64IA-LABEL: atomicrmw_and_i16_monotonic:
5828; RV64IA:       # %bb.0:
5829; RV64IA-NEXT:    andi a2, a0, -4
5830; RV64IA-NEXT:    slliw a0, a0, 3
5831; RV64IA-NEXT:    lui a3, 16
5832; RV64IA-NEXT:    addiw a3, a3, -1
5833; RV64IA-NEXT:    sllw a4, a3, a0
5834; RV64IA-NEXT:    not a4, a4
5835; RV64IA-NEXT:    and a1, a1, a3
5836; RV64IA-NEXT:    sllw a1, a1, a0
5837; RV64IA-NEXT:    or a1, a4, a1
5838; RV64IA-NEXT:    amoand.w a1, a1, (a2)
5839; RV64IA-NEXT:    srlw a0, a1, a0
5840; RV64IA-NEXT:    ret
5841  %1 = atomicrmw and i16* %a, i16 %b monotonic
5842  ret i16 %1
5843}
5844
5845define i16 @atomicrmw_and_i16_acquire(i16 *%a, i16 %b) nounwind {
5846; RV32I-LABEL: atomicrmw_and_i16_acquire:
5847; RV32I:       # %bb.0:
5848; RV32I-NEXT:    addi sp, sp, -16
5849; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5850; RV32I-NEXT:    li a2, 2
5851; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5852; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5853; RV32I-NEXT:    addi sp, sp, 16
5854; RV32I-NEXT:    ret
5855;
5856; RV32IA-LABEL: atomicrmw_and_i16_acquire:
5857; RV32IA:       # %bb.0:
5858; RV32IA-NEXT:    andi a2, a0, -4
5859; RV32IA-NEXT:    slli a0, a0, 3
5860; RV32IA-NEXT:    lui a3, 16
5861; RV32IA-NEXT:    addi a3, a3, -1
5862; RV32IA-NEXT:    sll a4, a3, a0
5863; RV32IA-NEXT:    not a4, a4
5864; RV32IA-NEXT:    and a1, a1, a3
5865; RV32IA-NEXT:    sll a1, a1, a0
5866; RV32IA-NEXT:    or a1, a4, a1
5867; RV32IA-NEXT:    amoand.w.aq a1, a1, (a2)
5868; RV32IA-NEXT:    srl a0, a1, a0
5869; RV32IA-NEXT:    ret
5870;
5871; RV64I-LABEL: atomicrmw_and_i16_acquire:
5872; RV64I:       # %bb.0:
5873; RV64I-NEXT:    addi sp, sp, -16
5874; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5875; RV64I-NEXT:    li a2, 2
5876; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5877; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5878; RV64I-NEXT:    addi sp, sp, 16
5879; RV64I-NEXT:    ret
5880;
5881; RV64IA-LABEL: atomicrmw_and_i16_acquire:
5882; RV64IA:       # %bb.0:
5883; RV64IA-NEXT:    andi a2, a0, -4
5884; RV64IA-NEXT:    slliw a0, a0, 3
5885; RV64IA-NEXT:    lui a3, 16
5886; RV64IA-NEXT:    addiw a3, a3, -1
5887; RV64IA-NEXT:    sllw a4, a3, a0
5888; RV64IA-NEXT:    not a4, a4
5889; RV64IA-NEXT:    and a1, a1, a3
5890; RV64IA-NEXT:    sllw a1, a1, a0
5891; RV64IA-NEXT:    or a1, a4, a1
5892; RV64IA-NEXT:    amoand.w.aq a1, a1, (a2)
5893; RV64IA-NEXT:    srlw a0, a1, a0
5894; RV64IA-NEXT:    ret
5895  %1 = atomicrmw and i16* %a, i16 %b acquire
5896  ret i16 %1
5897}
5898
5899define i16 @atomicrmw_and_i16_release(i16 *%a, i16 %b) nounwind {
5900; RV32I-LABEL: atomicrmw_and_i16_release:
5901; RV32I:       # %bb.0:
5902; RV32I-NEXT:    addi sp, sp, -16
5903; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5904; RV32I-NEXT:    li a2, 3
5905; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5906; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5907; RV32I-NEXT:    addi sp, sp, 16
5908; RV32I-NEXT:    ret
5909;
5910; RV32IA-LABEL: atomicrmw_and_i16_release:
5911; RV32IA:       # %bb.0:
5912; RV32IA-NEXT:    andi a2, a0, -4
5913; RV32IA-NEXT:    slli a0, a0, 3
5914; RV32IA-NEXT:    lui a3, 16
5915; RV32IA-NEXT:    addi a3, a3, -1
5916; RV32IA-NEXT:    sll a4, a3, a0
5917; RV32IA-NEXT:    not a4, a4
5918; RV32IA-NEXT:    and a1, a1, a3
5919; RV32IA-NEXT:    sll a1, a1, a0
5920; RV32IA-NEXT:    or a1, a4, a1
5921; RV32IA-NEXT:    amoand.w.rl a1, a1, (a2)
5922; RV32IA-NEXT:    srl a0, a1, a0
5923; RV32IA-NEXT:    ret
5924;
5925; RV64I-LABEL: atomicrmw_and_i16_release:
5926; RV64I:       # %bb.0:
5927; RV64I-NEXT:    addi sp, sp, -16
5928; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5929; RV64I-NEXT:    li a2, 3
5930; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5931; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5932; RV64I-NEXT:    addi sp, sp, 16
5933; RV64I-NEXT:    ret
5934;
5935; RV64IA-LABEL: atomicrmw_and_i16_release:
5936; RV64IA:       # %bb.0:
5937; RV64IA-NEXT:    andi a2, a0, -4
5938; RV64IA-NEXT:    slliw a0, a0, 3
5939; RV64IA-NEXT:    lui a3, 16
5940; RV64IA-NEXT:    addiw a3, a3, -1
5941; RV64IA-NEXT:    sllw a4, a3, a0
5942; RV64IA-NEXT:    not a4, a4
5943; RV64IA-NEXT:    and a1, a1, a3
5944; RV64IA-NEXT:    sllw a1, a1, a0
5945; RV64IA-NEXT:    or a1, a4, a1
5946; RV64IA-NEXT:    amoand.w.rl a1, a1, (a2)
5947; RV64IA-NEXT:    srlw a0, a1, a0
5948; RV64IA-NEXT:    ret
5949  %1 = atomicrmw and i16* %a, i16 %b release
5950  ret i16 %1
5951}
5952
5953define i16 @atomicrmw_and_i16_acq_rel(i16 *%a, i16 %b) nounwind {
5954; RV32I-LABEL: atomicrmw_and_i16_acq_rel:
5955; RV32I:       # %bb.0:
5956; RV32I-NEXT:    addi sp, sp, -16
5957; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5958; RV32I-NEXT:    li a2, 4
5959; RV32I-NEXT:    call __atomic_fetch_and_2@plt
5960; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5961; RV32I-NEXT:    addi sp, sp, 16
5962; RV32I-NEXT:    ret
5963;
5964; RV32IA-LABEL: atomicrmw_and_i16_acq_rel:
5965; RV32IA:       # %bb.0:
5966; RV32IA-NEXT:    andi a2, a0, -4
5967; RV32IA-NEXT:    slli a0, a0, 3
5968; RV32IA-NEXT:    lui a3, 16
5969; RV32IA-NEXT:    addi a3, a3, -1
5970; RV32IA-NEXT:    sll a4, a3, a0
5971; RV32IA-NEXT:    not a4, a4
5972; RV32IA-NEXT:    and a1, a1, a3
5973; RV32IA-NEXT:    sll a1, a1, a0
5974; RV32IA-NEXT:    or a1, a4, a1
5975; RV32IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
5976; RV32IA-NEXT:    srl a0, a1, a0
5977; RV32IA-NEXT:    ret
5978;
5979; RV64I-LABEL: atomicrmw_and_i16_acq_rel:
5980; RV64I:       # %bb.0:
5981; RV64I-NEXT:    addi sp, sp, -16
5982; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5983; RV64I-NEXT:    li a2, 4
5984; RV64I-NEXT:    call __atomic_fetch_and_2@plt
5985; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5986; RV64I-NEXT:    addi sp, sp, 16
5987; RV64I-NEXT:    ret
5988;
5989; RV64IA-LABEL: atomicrmw_and_i16_acq_rel:
5990; RV64IA:       # %bb.0:
5991; RV64IA-NEXT:    andi a2, a0, -4
5992; RV64IA-NEXT:    slliw a0, a0, 3
5993; RV64IA-NEXT:    lui a3, 16
5994; RV64IA-NEXT:    addiw a3, a3, -1
5995; RV64IA-NEXT:    sllw a4, a3, a0
5996; RV64IA-NEXT:    not a4, a4
5997; RV64IA-NEXT:    and a1, a1, a3
5998; RV64IA-NEXT:    sllw a1, a1, a0
5999; RV64IA-NEXT:    or a1, a4, a1
6000; RV64IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
6001; RV64IA-NEXT:    srlw a0, a1, a0
6002; RV64IA-NEXT:    ret
6003  %1 = atomicrmw and i16* %a, i16 %b acq_rel
6004  ret i16 %1
6005}
6006
6007define i16 @atomicrmw_and_i16_seq_cst(i16 *%a, i16 %b) nounwind {
6008; RV32I-LABEL: atomicrmw_and_i16_seq_cst:
6009; RV32I:       # %bb.0:
6010; RV32I-NEXT:    addi sp, sp, -16
6011; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6012; RV32I-NEXT:    li a2, 5
6013; RV32I-NEXT:    call __atomic_fetch_and_2@plt
6014; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6015; RV32I-NEXT:    addi sp, sp, 16
6016; RV32I-NEXT:    ret
6017;
6018; RV32IA-LABEL: atomicrmw_and_i16_seq_cst:
6019; RV32IA:       # %bb.0:
6020; RV32IA-NEXT:    andi a2, a0, -4
6021; RV32IA-NEXT:    slli a0, a0, 3
6022; RV32IA-NEXT:    lui a3, 16
6023; RV32IA-NEXT:    addi a3, a3, -1
6024; RV32IA-NEXT:    sll a4, a3, a0
6025; RV32IA-NEXT:    not a4, a4
6026; RV32IA-NEXT:    and a1, a1, a3
6027; RV32IA-NEXT:    sll a1, a1, a0
6028; RV32IA-NEXT:    or a1, a4, a1
6029; RV32IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
6030; RV32IA-NEXT:    srl a0, a1, a0
6031; RV32IA-NEXT:    ret
6032;
6033; RV64I-LABEL: atomicrmw_and_i16_seq_cst:
6034; RV64I:       # %bb.0:
6035; RV64I-NEXT:    addi sp, sp, -16
6036; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6037; RV64I-NEXT:    li a2, 5
6038; RV64I-NEXT:    call __atomic_fetch_and_2@plt
6039; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6040; RV64I-NEXT:    addi sp, sp, 16
6041; RV64I-NEXT:    ret
6042;
6043; RV64IA-LABEL: atomicrmw_and_i16_seq_cst:
6044; RV64IA:       # %bb.0:
6045; RV64IA-NEXT:    andi a2, a0, -4
6046; RV64IA-NEXT:    slliw a0, a0, 3
6047; RV64IA-NEXT:    lui a3, 16
6048; RV64IA-NEXT:    addiw a3, a3, -1
6049; RV64IA-NEXT:    sllw a4, a3, a0
6050; RV64IA-NEXT:    not a4, a4
6051; RV64IA-NEXT:    and a1, a1, a3
6052; RV64IA-NEXT:    sllw a1, a1, a0
6053; RV64IA-NEXT:    or a1, a4, a1
6054; RV64IA-NEXT:    amoand.w.aqrl a1, a1, (a2)
6055; RV64IA-NEXT:    srlw a0, a1, a0
6056; RV64IA-NEXT:    ret
6057  %1 = atomicrmw and i16* %a, i16 %b seq_cst
6058  ret i16 %1
6059}
6060
6061define i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) nounwind {
6062; RV32I-LABEL: atomicrmw_nand_i16_monotonic:
6063; RV32I:       # %bb.0:
6064; RV32I-NEXT:    addi sp, sp, -16
6065; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6066; RV32I-NEXT:    li a2, 0
6067; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6068; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6069; RV32I-NEXT:    addi sp, sp, 16
6070; RV32I-NEXT:    ret
6071;
6072; RV32IA-LABEL: atomicrmw_nand_i16_monotonic:
6073; RV32IA:       # %bb.0:
6074; RV32IA-NEXT:    andi a2, a0, -4
6075; RV32IA-NEXT:    slli a0, a0, 3
6076; RV32IA-NEXT:    lui a3, 16
6077; RV32IA-NEXT:    addi a3, a3, -1
6078; RV32IA-NEXT:    sll a4, a3, a0
6079; RV32IA-NEXT:    and a1, a1, a3
6080; RV32IA-NEXT:    sll a1, a1, a0
6081; RV32IA-NEXT:  .LBB75_1: # =>This Inner Loop Header: Depth=1
6082; RV32IA-NEXT:    lr.w a3, (a2)
6083; RV32IA-NEXT:    and a5, a3, a1
6084; RV32IA-NEXT:    not a5, a5
6085; RV32IA-NEXT:    xor a5, a3, a5
6086; RV32IA-NEXT:    and a5, a5, a4
6087; RV32IA-NEXT:    xor a5, a3, a5
6088; RV32IA-NEXT:    sc.w a5, a5, (a2)
6089; RV32IA-NEXT:    bnez a5, .LBB75_1
6090; RV32IA-NEXT:  # %bb.2:
6091; RV32IA-NEXT:    srl a0, a3, a0
6092; RV32IA-NEXT:    ret
6093;
6094; RV64I-LABEL: atomicrmw_nand_i16_monotonic:
6095; RV64I:       # %bb.0:
6096; RV64I-NEXT:    addi sp, sp, -16
6097; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6098; RV64I-NEXT:    li a2, 0
6099; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6100; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6101; RV64I-NEXT:    addi sp, sp, 16
6102; RV64I-NEXT:    ret
6103;
6104; RV64IA-LABEL: atomicrmw_nand_i16_monotonic:
6105; RV64IA:       # %bb.0:
6106; RV64IA-NEXT:    andi a2, a0, -4
6107; RV64IA-NEXT:    slliw a0, a0, 3
6108; RV64IA-NEXT:    lui a3, 16
6109; RV64IA-NEXT:    addiw a3, a3, -1
6110; RV64IA-NEXT:    sllw a4, a3, a0
6111; RV64IA-NEXT:    and a1, a1, a3
6112; RV64IA-NEXT:    sllw a1, a1, a0
6113; RV64IA-NEXT:  .LBB75_1: # =>This Inner Loop Header: Depth=1
6114; RV64IA-NEXT:    lr.w a3, (a2)
6115; RV64IA-NEXT:    and a5, a3, a1
6116; RV64IA-NEXT:    not a5, a5
6117; RV64IA-NEXT:    xor a5, a3, a5
6118; RV64IA-NEXT:    and a5, a5, a4
6119; RV64IA-NEXT:    xor a5, a3, a5
6120; RV64IA-NEXT:    sc.w a5, a5, (a2)
6121; RV64IA-NEXT:    bnez a5, .LBB75_1
6122; RV64IA-NEXT:  # %bb.2:
6123; RV64IA-NEXT:    srlw a0, a3, a0
6124; RV64IA-NEXT:    ret
6125  %1 = atomicrmw nand i16* %a, i16 %b monotonic
6126  ret i16 %1
6127}
6128
6129define i16 @atomicrmw_nand_i16_acquire(i16* %a, i16 %b) nounwind {
6130; RV32I-LABEL: atomicrmw_nand_i16_acquire:
6131; RV32I:       # %bb.0:
6132; RV32I-NEXT:    addi sp, sp, -16
6133; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6134; RV32I-NEXT:    li a2, 2
6135; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6136; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6137; RV32I-NEXT:    addi sp, sp, 16
6138; RV32I-NEXT:    ret
6139;
6140; RV32IA-LABEL: atomicrmw_nand_i16_acquire:
6141; RV32IA:       # %bb.0:
6142; RV32IA-NEXT:    andi a2, a0, -4
6143; RV32IA-NEXT:    slli a0, a0, 3
6144; RV32IA-NEXT:    lui a3, 16
6145; RV32IA-NEXT:    addi a3, a3, -1
6146; RV32IA-NEXT:    sll a4, a3, a0
6147; RV32IA-NEXT:    and a1, a1, a3
6148; RV32IA-NEXT:    sll a1, a1, a0
6149; RV32IA-NEXT:  .LBB76_1: # =>This Inner Loop Header: Depth=1
6150; RV32IA-NEXT:    lr.w.aq a3, (a2)
6151; RV32IA-NEXT:    and a5, a3, a1
6152; RV32IA-NEXT:    not a5, a5
6153; RV32IA-NEXT:    xor a5, a3, a5
6154; RV32IA-NEXT:    and a5, a5, a4
6155; RV32IA-NEXT:    xor a5, a3, a5
6156; RV32IA-NEXT:    sc.w a5, a5, (a2)
6157; RV32IA-NEXT:    bnez a5, .LBB76_1
6158; RV32IA-NEXT:  # %bb.2:
6159; RV32IA-NEXT:    srl a0, a3, a0
6160; RV32IA-NEXT:    ret
6161;
6162; RV64I-LABEL: atomicrmw_nand_i16_acquire:
6163; RV64I:       # %bb.0:
6164; RV64I-NEXT:    addi sp, sp, -16
6165; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6166; RV64I-NEXT:    li a2, 2
6167; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6168; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6169; RV64I-NEXT:    addi sp, sp, 16
6170; RV64I-NEXT:    ret
6171;
6172; RV64IA-LABEL: atomicrmw_nand_i16_acquire:
6173; RV64IA:       # %bb.0:
6174; RV64IA-NEXT:    andi a2, a0, -4
6175; RV64IA-NEXT:    slliw a0, a0, 3
6176; RV64IA-NEXT:    lui a3, 16
6177; RV64IA-NEXT:    addiw a3, a3, -1
6178; RV64IA-NEXT:    sllw a4, a3, a0
6179; RV64IA-NEXT:    and a1, a1, a3
6180; RV64IA-NEXT:    sllw a1, a1, a0
6181; RV64IA-NEXT:  .LBB76_1: # =>This Inner Loop Header: Depth=1
6182; RV64IA-NEXT:    lr.w.aq a3, (a2)
6183; RV64IA-NEXT:    and a5, a3, a1
6184; RV64IA-NEXT:    not a5, a5
6185; RV64IA-NEXT:    xor a5, a3, a5
6186; RV64IA-NEXT:    and a5, a5, a4
6187; RV64IA-NEXT:    xor a5, a3, a5
6188; RV64IA-NEXT:    sc.w a5, a5, (a2)
6189; RV64IA-NEXT:    bnez a5, .LBB76_1
6190; RV64IA-NEXT:  # %bb.2:
6191; RV64IA-NEXT:    srlw a0, a3, a0
6192; RV64IA-NEXT:    ret
6193  %1 = atomicrmw nand i16* %a, i16 %b acquire
6194  ret i16 %1
6195}
6196
6197define i16 @atomicrmw_nand_i16_release(i16* %a, i16 %b) nounwind {
6198; RV32I-LABEL: atomicrmw_nand_i16_release:
6199; RV32I:       # %bb.0:
6200; RV32I-NEXT:    addi sp, sp, -16
6201; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6202; RV32I-NEXT:    li a2, 3
6203; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6204; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6205; RV32I-NEXT:    addi sp, sp, 16
6206; RV32I-NEXT:    ret
6207;
6208; RV32IA-LABEL: atomicrmw_nand_i16_release:
6209; RV32IA:       # %bb.0:
6210; RV32IA-NEXT:    andi a2, a0, -4
6211; RV32IA-NEXT:    slli a0, a0, 3
6212; RV32IA-NEXT:    lui a3, 16
6213; RV32IA-NEXT:    addi a3, a3, -1
6214; RV32IA-NEXT:    sll a4, a3, a0
6215; RV32IA-NEXT:    and a1, a1, a3
6216; RV32IA-NEXT:    sll a1, a1, a0
6217; RV32IA-NEXT:  .LBB77_1: # =>This Inner Loop Header: Depth=1
6218; RV32IA-NEXT:    lr.w a3, (a2)
6219; RV32IA-NEXT:    and a5, a3, a1
6220; RV32IA-NEXT:    not a5, a5
6221; RV32IA-NEXT:    xor a5, a3, a5
6222; RV32IA-NEXT:    and a5, a5, a4
6223; RV32IA-NEXT:    xor a5, a3, a5
6224; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
6225; RV32IA-NEXT:    bnez a5, .LBB77_1
6226; RV32IA-NEXT:  # %bb.2:
6227; RV32IA-NEXT:    srl a0, a3, a0
6228; RV32IA-NEXT:    ret
6229;
6230; RV64I-LABEL: atomicrmw_nand_i16_release:
6231; RV64I:       # %bb.0:
6232; RV64I-NEXT:    addi sp, sp, -16
6233; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6234; RV64I-NEXT:    li a2, 3
6235; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6236; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6237; RV64I-NEXT:    addi sp, sp, 16
6238; RV64I-NEXT:    ret
6239;
6240; RV64IA-LABEL: atomicrmw_nand_i16_release:
6241; RV64IA:       # %bb.0:
6242; RV64IA-NEXT:    andi a2, a0, -4
6243; RV64IA-NEXT:    slliw a0, a0, 3
6244; RV64IA-NEXT:    lui a3, 16
6245; RV64IA-NEXT:    addiw a3, a3, -1
6246; RV64IA-NEXT:    sllw a4, a3, a0
6247; RV64IA-NEXT:    and a1, a1, a3
6248; RV64IA-NEXT:    sllw a1, a1, a0
6249; RV64IA-NEXT:  .LBB77_1: # =>This Inner Loop Header: Depth=1
6250; RV64IA-NEXT:    lr.w a3, (a2)
6251; RV64IA-NEXT:    and a5, a3, a1
6252; RV64IA-NEXT:    not a5, a5
6253; RV64IA-NEXT:    xor a5, a3, a5
6254; RV64IA-NEXT:    and a5, a5, a4
6255; RV64IA-NEXT:    xor a5, a3, a5
6256; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
6257; RV64IA-NEXT:    bnez a5, .LBB77_1
6258; RV64IA-NEXT:  # %bb.2:
6259; RV64IA-NEXT:    srlw a0, a3, a0
6260; RV64IA-NEXT:    ret
6261  %1 = atomicrmw nand i16* %a, i16 %b release
6262  ret i16 %1
6263}
6264
6265define i16 @atomicrmw_nand_i16_acq_rel(i16* %a, i16 %b) nounwind {
6266; RV32I-LABEL: atomicrmw_nand_i16_acq_rel:
6267; RV32I:       # %bb.0:
6268; RV32I-NEXT:    addi sp, sp, -16
6269; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6270; RV32I-NEXT:    li a2, 4
6271; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6272; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6273; RV32I-NEXT:    addi sp, sp, 16
6274; RV32I-NEXT:    ret
6275;
6276; RV32IA-LABEL: atomicrmw_nand_i16_acq_rel:
6277; RV32IA:       # %bb.0:
6278; RV32IA-NEXT:    andi a2, a0, -4
6279; RV32IA-NEXT:    slli a0, a0, 3
6280; RV32IA-NEXT:    lui a3, 16
6281; RV32IA-NEXT:    addi a3, a3, -1
6282; RV32IA-NEXT:    sll a4, a3, a0
6283; RV32IA-NEXT:    and a1, a1, a3
6284; RV32IA-NEXT:    sll a1, a1, a0
6285; RV32IA-NEXT:  .LBB78_1: # =>This Inner Loop Header: Depth=1
6286; RV32IA-NEXT:    lr.w.aq a3, (a2)
6287; RV32IA-NEXT:    and a5, a3, a1
6288; RV32IA-NEXT:    not a5, a5
6289; RV32IA-NEXT:    xor a5, a3, a5
6290; RV32IA-NEXT:    and a5, a5, a4
6291; RV32IA-NEXT:    xor a5, a3, a5
6292; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
6293; RV32IA-NEXT:    bnez a5, .LBB78_1
6294; RV32IA-NEXT:  # %bb.2:
6295; RV32IA-NEXT:    srl a0, a3, a0
6296; RV32IA-NEXT:    ret
6297;
6298; RV64I-LABEL: atomicrmw_nand_i16_acq_rel:
6299; RV64I:       # %bb.0:
6300; RV64I-NEXT:    addi sp, sp, -16
6301; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6302; RV64I-NEXT:    li a2, 4
6303; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6304; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6305; RV64I-NEXT:    addi sp, sp, 16
6306; RV64I-NEXT:    ret
6307;
6308; RV64IA-LABEL: atomicrmw_nand_i16_acq_rel:
6309; RV64IA:       # %bb.0:
6310; RV64IA-NEXT:    andi a2, a0, -4
6311; RV64IA-NEXT:    slliw a0, a0, 3
6312; RV64IA-NEXT:    lui a3, 16
6313; RV64IA-NEXT:    addiw a3, a3, -1
6314; RV64IA-NEXT:    sllw a4, a3, a0
6315; RV64IA-NEXT:    and a1, a1, a3
6316; RV64IA-NEXT:    sllw a1, a1, a0
6317; RV64IA-NEXT:  .LBB78_1: # =>This Inner Loop Header: Depth=1
6318; RV64IA-NEXT:    lr.w.aq a3, (a2)
6319; RV64IA-NEXT:    and a5, a3, a1
6320; RV64IA-NEXT:    not a5, a5
6321; RV64IA-NEXT:    xor a5, a3, a5
6322; RV64IA-NEXT:    and a5, a5, a4
6323; RV64IA-NEXT:    xor a5, a3, a5
6324; RV64IA-NEXT:    sc.w.rl a5, a5, (a2)
6325; RV64IA-NEXT:    bnez a5, .LBB78_1
6326; RV64IA-NEXT:  # %bb.2:
6327; RV64IA-NEXT:    srlw a0, a3, a0
6328; RV64IA-NEXT:    ret
6329  %1 = atomicrmw nand i16* %a, i16 %b acq_rel
6330  ret i16 %1
6331}
6332
6333define i16 @atomicrmw_nand_i16_seq_cst(i16* %a, i16 %b) nounwind {
6334; RV32I-LABEL: atomicrmw_nand_i16_seq_cst:
6335; RV32I:       # %bb.0:
6336; RV32I-NEXT:    addi sp, sp, -16
6337; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6338; RV32I-NEXT:    li a2, 5
6339; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
6340; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6341; RV32I-NEXT:    addi sp, sp, 16
6342; RV32I-NEXT:    ret
6343;
6344; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst:
6345; RV32IA:       # %bb.0:
6346; RV32IA-NEXT:    andi a2, a0, -4
6347; RV32IA-NEXT:    slli a0, a0, 3
6348; RV32IA-NEXT:    lui a3, 16
6349; RV32IA-NEXT:    addi a3, a3, -1
6350; RV32IA-NEXT:    sll a4, a3, a0
6351; RV32IA-NEXT:    and a1, a1, a3
6352; RV32IA-NEXT:    sll a1, a1, a0
6353; RV32IA-NEXT:  .LBB79_1: # =>This Inner Loop Header: Depth=1
6354; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
6355; RV32IA-NEXT:    and a5, a3, a1
6356; RV32IA-NEXT:    not a5, a5
6357; RV32IA-NEXT:    xor a5, a3, a5
6358; RV32IA-NEXT:    and a5, a5, a4
6359; RV32IA-NEXT:    xor a5, a3, a5
6360; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a2)
6361; RV32IA-NEXT:    bnez a5, .LBB79_1
6362; RV32IA-NEXT:  # %bb.2:
6363; RV32IA-NEXT:    srl a0, a3, a0
6364; RV32IA-NEXT:    ret
6365;
6366; RV64I-LABEL: atomicrmw_nand_i16_seq_cst:
6367; RV64I:       # %bb.0:
6368; RV64I-NEXT:    addi sp, sp, -16
6369; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6370; RV64I-NEXT:    li a2, 5
6371; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
6372; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6373; RV64I-NEXT:    addi sp, sp, 16
6374; RV64I-NEXT:    ret
6375;
6376; RV64IA-LABEL: atomicrmw_nand_i16_seq_cst:
6377; RV64IA:       # %bb.0:
6378; RV64IA-NEXT:    andi a2, a0, -4
6379; RV64IA-NEXT:    slliw a0, a0, 3
6380; RV64IA-NEXT:    lui a3, 16
6381; RV64IA-NEXT:    addiw a3, a3, -1
6382; RV64IA-NEXT:    sllw a4, a3, a0
6383; RV64IA-NEXT:    and a1, a1, a3
6384; RV64IA-NEXT:    sllw a1, a1, a0
6385; RV64IA-NEXT:  .LBB79_1: # =>This Inner Loop Header: Depth=1
6386; RV64IA-NEXT:    lr.w.aqrl a3, (a2)
6387; RV64IA-NEXT:    and a5, a3, a1
6388; RV64IA-NEXT:    not a5, a5
6389; RV64IA-NEXT:    xor a5, a3, a5
6390; RV64IA-NEXT:    and a5, a5, a4
6391; RV64IA-NEXT:    xor a5, a3, a5
6392; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a2)
6393; RV64IA-NEXT:    bnez a5, .LBB79_1
6394; RV64IA-NEXT:  # %bb.2:
6395; RV64IA-NEXT:    srlw a0, a3, a0
6396; RV64IA-NEXT:    ret
6397  %1 = atomicrmw nand i16* %a, i16 %b seq_cst
6398  ret i16 %1
6399}
6400
6401define i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind {
6402; RV32I-LABEL: atomicrmw_or_i16_monotonic:
6403; RV32I:       # %bb.0:
6404; RV32I-NEXT:    addi sp, sp, -16
6405; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6406; RV32I-NEXT:    li a2, 0
6407; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6408; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6409; RV32I-NEXT:    addi sp, sp, 16
6410; RV32I-NEXT:    ret
6411;
6412; RV32IA-LABEL: atomicrmw_or_i16_monotonic:
6413; RV32IA:       # %bb.0:
6414; RV32IA-NEXT:    andi a2, a0, -4
6415; RV32IA-NEXT:    slli a0, a0, 3
6416; RV32IA-NEXT:    slli a1, a1, 16
6417; RV32IA-NEXT:    srli a1, a1, 16
6418; RV32IA-NEXT:    sll a1, a1, a0
6419; RV32IA-NEXT:    amoor.w a1, a1, (a2)
6420; RV32IA-NEXT:    srl a0, a1, a0
6421; RV32IA-NEXT:    ret
6422;
6423; RV64I-LABEL: atomicrmw_or_i16_monotonic:
6424; RV64I:       # %bb.0:
6425; RV64I-NEXT:    addi sp, sp, -16
6426; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6427; RV64I-NEXT:    li a2, 0
6428; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6429; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6430; RV64I-NEXT:    addi sp, sp, 16
6431; RV64I-NEXT:    ret
6432;
6433; RV64IA-LABEL: atomicrmw_or_i16_monotonic:
6434; RV64IA:       # %bb.0:
6435; RV64IA-NEXT:    andi a2, a0, -4
6436; RV64IA-NEXT:    slliw a0, a0, 3
6437; RV64IA-NEXT:    slli a1, a1, 48
6438; RV64IA-NEXT:    srli a1, a1, 48
6439; RV64IA-NEXT:    sllw a1, a1, a0
6440; RV64IA-NEXT:    amoor.w a1, a1, (a2)
6441; RV64IA-NEXT:    srlw a0, a1, a0
6442; RV64IA-NEXT:    ret
6443  %1 = atomicrmw or i16* %a, i16 %b monotonic
6444  ret i16 %1
6445}
6446
6447define i16 @atomicrmw_or_i16_acquire(i16 *%a, i16 %b) nounwind {
6448; RV32I-LABEL: atomicrmw_or_i16_acquire:
6449; RV32I:       # %bb.0:
6450; RV32I-NEXT:    addi sp, sp, -16
6451; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6452; RV32I-NEXT:    li a2, 2
6453; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6454; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6455; RV32I-NEXT:    addi sp, sp, 16
6456; RV32I-NEXT:    ret
6457;
6458; RV32IA-LABEL: atomicrmw_or_i16_acquire:
6459; RV32IA:       # %bb.0:
6460; RV32IA-NEXT:    andi a2, a0, -4
6461; RV32IA-NEXT:    slli a0, a0, 3
6462; RV32IA-NEXT:    slli a1, a1, 16
6463; RV32IA-NEXT:    srli a1, a1, 16
6464; RV32IA-NEXT:    sll a1, a1, a0
6465; RV32IA-NEXT:    amoor.w.aq a1, a1, (a2)
6466; RV32IA-NEXT:    srl a0, a1, a0
6467; RV32IA-NEXT:    ret
6468;
6469; RV64I-LABEL: atomicrmw_or_i16_acquire:
6470; RV64I:       # %bb.0:
6471; RV64I-NEXT:    addi sp, sp, -16
6472; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6473; RV64I-NEXT:    li a2, 2
6474; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6475; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6476; RV64I-NEXT:    addi sp, sp, 16
6477; RV64I-NEXT:    ret
6478;
6479; RV64IA-LABEL: atomicrmw_or_i16_acquire:
6480; RV64IA:       # %bb.0:
6481; RV64IA-NEXT:    andi a2, a0, -4
6482; RV64IA-NEXT:    slliw a0, a0, 3
6483; RV64IA-NEXT:    slli a1, a1, 48
6484; RV64IA-NEXT:    srli a1, a1, 48
6485; RV64IA-NEXT:    sllw a1, a1, a0
6486; RV64IA-NEXT:    amoor.w.aq a1, a1, (a2)
6487; RV64IA-NEXT:    srlw a0, a1, a0
6488; RV64IA-NEXT:    ret
6489  %1 = atomicrmw or i16* %a, i16 %b acquire
6490  ret i16 %1
6491}
6492
6493define i16 @atomicrmw_or_i16_release(i16 *%a, i16 %b) nounwind {
6494; RV32I-LABEL: atomicrmw_or_i16_release:
6495; RV32I:       # %bb.0:
6496; RV32I-NEXT:    addi sp, sp, -16
6497; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6498; RV32I-NEXT:    li a2, 3
6499; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6500; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6501; RV32I-NEXT:    addi sp, sp, 16
6502; RV32I-NEXT:    ret
6503;
6504; RV32IA-LABEL: atomicrmw_or_i16_release:
6505; RV32IA:       # %bb.0:
6506; RV32IA-NEXT:    andi a2, a0, -4
6507; RV32IA-NEXT:    slli a0, a0, 3
6508; RV32IA-NEXT:    slli a1, a1, 16
6509; RV32IA-NEXT:    srli a1, a1, 16
6510; RV32IA-NEXT:    sll a1, a1, a0
6511; RV32IA-NEXT:    amoor.w.rl a1, a1, (a2)
6512; RV32IA-NEXT:    srl a0, a1, a0
6513; RV32IA-NEXT:    ret
6514;
6515; RV64I-LABEL: atomicrmw_or_i16_release:
6516; RV64I:       # %bb.0:
6517; RV64I-NEXT:    addi sp, sp, -16
6518; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6519; RV64I-NEXT:    li a2, 3
6520; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6521; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6522; RV64I-NEXT:    addi sp, sp, 16
6523; RV64I-NEXT:    ret
6524;
6525; RV64IA-LABEL: atomicrmw_or_i16_release:
6526; RV64IA:       # %bb.0:
6527; RV64IA-NEXT:    andi a2, a0, -4
6528; RV64IA-NEXT:    slliw a0, a0, 3
6529; RV64IA-NEXT:    slli a1, a1, 48
6530; RV64IA-NEXT:    srli a1, a1, 48
6531; RV64IA-NEXT:    sllw a1, a1, a0
6532; RV64IA-NEXT:    amoor.w.rl a1, a1, (a2)
6533; RV64IA-NEXT:    srlw a0, a1, a0
6534; RV64IA-NEXT:    ret
6535  %1 = atomicrmw or i16* %a, i16 %b release
6536  ret i16 %1
6537}
6538
6539define i16 @atomicrmw_or_i16_acq_rel(i16 *%a, i16 %b) nounwind {
6540; RV32I-LABEL: atomicrmw_or_i16_acq_rel:
6541; RV32I:       # %bb.0:
6542; RV32I-NEXT:    addi sp, sp, -16
6543; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6544; RV32I-NEXT:    li a2, 4
6545; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6546; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6547; RV32I-NEXT:    addi sp, sp, 16
6548; RV32I-NEXT:    ret
6549;
6550; RV32IA-LABEL: atomicrmw_or_i16_acq_rel:
6551; RV32IA:       # %bb.0:
6552; RV32IA-NEXT:    andi a2, a0, -4
6553; RV32IA-NEXT:    slli a0, a0, 3
6554; RV32IA-NEXT:    slli a1, a1, 16
6555; RV32IA-NEXT:    srli a1, a1, 16
6556; RV32IA-NEXT:    sll a1, a1, a0
6557; RV32IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6558; RV32IA-NEXT:    srl a0, a1, a0
6559; RV32IA-NEXT:    ret
6560;
6561; RV64I-LABEL: atomicrmw_or_i16_acq_rel:
6562; RV64I:       # %bb.0:
6563; RV64I-NEXT:    addi sp, sp, -16
6564; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6565; RV64I-NEXT:    li a2, 4
6566; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6567; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6568; RV64I-NEXT:    addi sp, sp, 16
6569; RV64I-NEXT:    ret
6570;
6571; RV64IA-LABEL: atomicrmw_or_i16_acq_rel:
6572; RV64IA:       # %bb.0:
6573; RV64IA-NEXT:    andi a2, a0, -4
6574; RV64IA-NEXT:    slliw a0, a0, 3
6575; RV64IA-NEXT:    slli a1, a1, 48
6576; RV64IA-NEXT:    srli a1, a1, 48
6577; RV64IA-NEXT:    sllw a1, a1, a0
6578; RV64IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6579; RV64IA-NEXT:    srlw a0, a1, a0
6580; RV64IA-NEXT:    ret
6581  %1 = atomicrmw or i16* %a, i16 %b acq_rel
6582  ret i16 %1
6583}
6584
6585define i16 @atomicrmw_or_i16_seq_cst(i16 *%a, i16 %b) nounwind {
6586; RV32I-LABEL: atomicrmw_or_i16_seq_cst:
6587; RV32I:       # %bb.0:
6588; RV32I-NEXT:    addi sp, sp, -16
6589; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6590; RV32I-NEXT:    li a2, 5
6591; RV32I-NEXT:    call __atomic_fetch_or_2@plt
6592; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6593; RV32I-NEXT:    addi sp, sp, 16
6594; RV32I-NEXT:    ret
6595;
6596; RV32IA-LABEL: atomicrmw_or_i16_seq_cst:
6597; RV32IA:       # %bb.0:
6598; RV32IA-NEXT:    andi a2, a0, -4
6599; RV32IA-NEXT:    slli a0, a0, 3
6600; RV32IA-NEXT:    slli a1, a1, 16
6601; RV32IA-NEXT:    srli a1, a1, 16
6602; RV32IA-NEXT:    sll a1, a1, a0
6603; RV32IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6604; RV32IA-NEXT:    srl a0, a1, a0
6605; RV32IA-NEXT:    ret
6606;
6607; RV64I-LABEL: atomicrmw_or_i16_seq_cst:
6608; RV64I:       # %bb.0:
6609; RV64I-NEXT:    addi sp, sp, -16
6610; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6611; RV64I-NEXT:    li a2, 5
6612; RV64I-NEXT:    call __atomic_fetch_or_2@plt
6613; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6614; RV64I-NEXT:    addi sp, sp, 16
6615; RV64I-NEXT:    ret
6616;
6617; RV64IA-LABEL: atomicrmw_or_i16_seq_cst:
6618; RV64IA:       # %bb.0:
6619; RV64IA-NEXT:    andi a2, a0, -4
6620; RV64IA-NEXT:    slliw a0, a0, 3
6621; RV64IA-NEXT:    slli a1, a1, 48
6622; RV64IA-NEXT:    srli a1, a1, 48
6623; RV64IA-NEXT:    sllw a1, a1, a0
6624; RV64IA-NEXT:    amoor.w.aqrl a1, a1, (a2)
6625; RV64IA-NEXT:    srlw a0, a1, a0
6626; RV64IA-NEXT:    ret
6627  %1 = atomicrmw or i16* %a, i16 %b seq_cst
6628  ret i16 %1
6629}
6630
6631define i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind {
6632; RV32I-LABEL: atomicrmw_xor_i16_monotonic:
6633; RV32I:       # %bb.0:
6634; RV32I-NEXT:    addi sp, sp, -16
6635; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6636; RV32I-NEXT:    li a2, 0
6637; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6638; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6639; RV32I-NEXT:    addi sp, sp, 16
6640; RV32I-NEXT:    ret
6641;
6642; RV32IA-LABEL: atomicrmw_xor_i16_monotonic:
6643; RV32IA:       # %bb.0:
6644; RV32IA-NEXT:    andi a2, a0, -4
6645; RV32IA-NEXT:    slli a0, a0, 3
6646; RV32IA-NEXT:    slli a1, a1, 16
6647; RV32IA-NEXT:    srli a1, a1, 16
6648; RV32IA-NEXT:    sll a1, a1, a0
6649; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
6650; RV32IA-NEXT:    srl a0, a1, a0
6651; RV32IA-NEXT:    ret
6652;
6653; RV64I-LABEL: atomicrmw_xor_i16_monotonic:
6654; RV64I:       # %bb.0:
6655; RV64I-NEXT:    addi sp, sp, -16
6656; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6657; RV64I-NEXT:    li a2, 0
6658; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6659; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6660; RV64I-NEXT:    addi sp, sp, 16
6661; RV64I-NEXT:    ret
6662;
6663; RV64IA-LABEL: atomicrmw_xor_i16_monotonic:
6664; RV64IA:       # %bb.0:
6665; RV64IA-NEXT:    andi a2, a0, -4
6666; RV64IA-NEXT:    slliw a0, a0, 3
6667; RV64IA-NEXT:    slli a1, a1, 48
6668; RV64IA-NEXT:    srli a1, a1, 48
6669; RV64IA-NEXT:    sllw a1, a1, a0
6670; RV64IA-NEXT:    amoxor.w a1, a1, (a2)
6671; RV64IA-NEXT:    srlw a0, a1, a0
6672; RV64IA-NEXT:    ret
6673  %1 = atomicrmw xor i16* %a, i16 %b monotonic
6674  ret i16 %1
6675}
6676
6677define i16 @atomicrmw_xor_i16_acquire(i16 *%a, i16 %b) nounwind {
6678; RV32I-LABEL: atomicrmw_xor_i16_acquire:
6679; RV32I:       # %bb.0:
6680; RV32I-NEXT:    addi sp, sp, -16
6681; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6682; RV32I-NEXT:    li a2, 2
6683; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6684; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6685; RV32I-NEXT:    addi sp, sp, 16
6686; RV32I-NEXT:    ret
6687;
6688; RV32IA-LABEL: atomicrmw_xor_i16_acquire:
6689; RV32IA:       # %bb.0:
6690; RV32IA-NEXT:    andi a2, a0, -4
6691; RV32IA-NEXT:    slli a0, a0, 3
6692; RV32IA-NEXT:    slli a1, a1, 16
6693; RV32IA-NEXT:    srli a1, a1, 16
6694; RV32IA-NEXT:    sll a1, a1, a0
6695; RV32IA-NEXT:    amoxor.w.aq a1, a1, (a2)
6696; RV32IA-NEXT:    srl a0, a1, a0
6697; RV32IA-NEXT:    ret
6698;
6699; RV64I-LABEL: atomicrmw_xor_i16_acquire:
6700; RV64I:       # %bb.0:
6701; RV64I-NEXT:    addi sp, sp, -16
6702; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6703; RV64I-NEXT:    li a2, 2
6704; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6705; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6706; RV64I-NEXT:    addi sp, sp, 16
6707; RV64I-NEXT:    ret
6708;
6709; RV64IA-LABEL: atomicrmw_xor_i16_acquire:
6710; RV64IA:       # %bb.0:
6711; RV64IA-NEXT:    andi a2, a0, -4
6712; RV64IA-NEXT:    slliw a0, a0, 3
6713; RV64IA-NEXT:    slli a1, a1, 48
6714; RV64IA-NEXT:    srli a1, a1, 48
6715; RV64IA-NEXT:    sllw a1, a1, a0
6716; RV64IA-NEXT:    amoxor.w.aq a1, a1, (a2)
6717; RV64IA-NEXT:    srlw a0, a1, a0
6718; RV64IA-NEXT:    ret
6719  %1 = atomicrmw xor i16* %a, i16 %b acquire
6720  ret i16 %1
6721}
6722
6723define i16 @atomicrmw_xor_i16_release(i16 *%a, i16 %b) nounwind {
6724; RV32I-LABEL: atomicrmw_xor_i16_release:
6725; RV32I:       # %bb.0:
6726; RV32I-NEXT:    addi sp, sp, -16
6727; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6728; RV32I-NEXT:    li a2, 3
6729; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6730; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6731; RV32I-NEXT:    addi sp, sp, 16
6732; RV32I-NEXT:    ret
6733;
6734; RV32IA-LABEL: atomicrmw_xor_i16_release:
6735; RV32IA:       # %bb.0:
6736; RV32IA-NEXT:    andi a2, a0, -4
6737; RV32IA-NEXT:    slli a0, a0, 3
6738; RV32IA-NEXT:    slli a1, a1, 16
6739; RV32IA-NEXT:    srli a1, a1, 16
6740; RV32IA-NEXT:    sll a1, a1, a0
6741; RV32IA-NEXT:    amoxor.w.rl a1, a1, (a2)
6742; RV32IA-NEXT:    srl a0, a1, a0
6743; RV32IA-NEXT:    ret
6744;
6745; RV64I-LABEL: atomicrmw_xor_i16_release:
6746; RV64I:       # %bb.0:
6747; RV64I-NEXT:    addi sp, sp, -16
6748; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6749; RV64I-NEXT:    li a2, 3
6750; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6751; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6752; RV64I-NEXT:    addi sp, sp, 16
6753; RV64I-NEXT:    ret
6754;
6755; RV64IA-LABEL: atomicrmw_xor_i16_release:
6756; RV64IA:       # %bb.0:
6757; RV64IA-NEXT:    andi a2, a0, -4
6758; RV64IA-NEXT:    slliw a0, a0, 3
6759; RV64IA-NEXT:    slli a1, a1, 48
6760; RV64IA-NEXT:    srli a1, a1, 48
6761; RV64IA-NEXT:    sllw a1, a1, a0
6762; RV64IA-NEXT:    amoxor.w.rl a1, a1, (a2)
6763; RV64IA-NEXT:    srlw a0, a1, a0
6764; RV64IA-NEXT:    ret
6765  %1 = atomicrmw xor i16* %a, i16 %b release
6766  ret i16 %1
6767}
6768
6769define i16 @atomicrmw_xor_i16_acq_rel(i16 *%a, i16 %b) nounwind {
6770; RV32I-LABEL: atomicrmw_xor_i16_acq_rel:
6771; RV32I:       # %bb.0:
6772; RV32I-NEXT:    addi sp, sp, -16
6773; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6774; RV32I-NEXT:    li a2, 4
6775; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6776; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6777; RV32I-NEXT:    addi sp, sp, 16
6778; RV32I-NEXT:    ret
6779;
6780; RV32IA-LABEL: atomicrmw_xor_i16_acq_rel:
6781; RV32IA:       # %bb.0:
6782; RV32IA-NEXT:    andi a2, a0, -4
6783; RV32IA-NEXT:    slli a0, a0, 3
6784; RV32IA-NEXT:    slli a1, a1, 16
6785; RV32IA-NEXT:    srli a1, a1, 16
6786; RV32IA-NEXT:    sll a1, a1, a0
6787; RV32IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6788; RV32IA-NEXT:    srl a0, a1, a0
6789; RV32IA-NEXT:    ret
6790;
6791; RV64I-LABEL: atomicrmw_xor_i16_acq_rel:
6792; RV64I:       # %bb.0:
6793; RV64I-NEXT:    addi sp, sp, -16
6794; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6795; RV64I-NEXT:    li a2, 4
6796; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6797; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6798; RV64I-NEXT:    addi sp, sp, 16
6799; RV64I-NEXT:    ret
6800;
6801; RV64IA-LABEL: atomicrmw_xor_i16_acq_rel:
6802; RV64IA:       # %bb.0:
6803; RV64IA-NEXT:    andi a2, a0, -4
6804; RV64IA-NEXT:    slliw a0, a0, 3
6805; RV64IA-NEXT:    slli a1, a1, 48
6806; RV64IA-NEXT:    srli a1, a1, 48
6807; RV64IA-NEXT:    sllw a1, a1, a0
6808; RV64IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6809; RV64IA-NEXT:    srlw a0, a1, a0
6810; RV64IA-NEXT:    ret
6811  %1 = atomicrmw xor i16* %a, i16 %b acq_rel
6812  ret i16 %1
6813}
6814
6815define i16 @atomicrmw_xor_i16_seq_cst(i16 *%a, i16 %b) nounwind {
6816; RV32I-LABEL: atomicrmw_xor_i16_seq_cst:
6817; RV32I:       # %bb.0:
6818; RV32I-NEXT:    addi sp, sp, -16
6819; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
6820; RV32I-NEXT:    li a2, 5
6821; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
6822; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6823; RV32I-NEXT:    addi sp, sp, 16
6824; RV32I-NEXT:    ret
6825;
6826; RV32IA-LABEL: atomicrmw_xor_i16_seq_cst:
6827; RV32IA:       # %bb.0:
6828; RV32IA-NEXT:    andi a2, a0, -4
6829; RV32IA-NEXT:    slli a0, a0, 3
6830; RV32IA-NEXT:    slli a1, a1, 16
6831; RV32IA-NEXT:    srli a1, a1, 16
6832; RV32IA-NEXT:    sll a1, a1, a0
6833; RV32IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6834; RV32IA-NEXT:    srl a0, a1, a0
6835; RV32IA-NEXT:    ret
6836;
6837; RV64I-LABEL: atomicrmw_xor_i16_seq_cst:
6838; RV64I:       # %bb.0:
6839; RV64I-NEXT:    addi sp, sp, -16
6840; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
6841; RV64I-NEXT:    li a2, 5
6842; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
6843; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
6844; RV64I-NEXT:    addi sp, sp, 16
6845; RV64I-NEXT:    ret
6846;
6847; RV64IA-LABEL: atomicrmw_xor_i16_seq_cst:
6848; RV64IA:       # %bb.0:
6849; RV64IA-NEXT:    andi a2, a0, -4
6850; RV64IA-NEXT:    slliw a0, a0, 3
6851; RV64IA-NEXT:    slli a1, a1, 48
6852; RV64IA-NEXT:    srli a1, a1, 48
6853; RV64IA-NEXT:    sllw a1, a1, a0
6854; RV64IA-NEXT:    amoxor.w.aqrl a1, a1, (a2)
6855; RV64IA-NEXT:    srlw a0, a1, a0
6856; RV64IA-NEXT:    ret
6857  %1 = atomicrmw xor i16* %a, i16 %b seq_cst
6858  ret i16 %1
6859}
6860
6861define i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind {
6862; RV32I-LABEL: atomicrmw_max_i16_monotonic:
6863; RV32I:       # %bb.0:
6864; RV32I-NEXT:    addi sp, sp, -32
6865; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6866; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6867; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6868; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6869; RV32I-NEXT:    mv s0, a0
6870; RV32I-NEXT:    lhu a3, 0(a0)
6871; RV32I-NEXT:    mv s2, a1
6872; RV32I-NEXT:    slli a0, a1, 16
6873; RV32I-NEXT:    srai s1, a0, 16
6874; RV32I-NEXT:    j .LBB90_2
6875; RV32I-NEXT:  .LBB90_1: # %atomicrmw.start
6876; RV32I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6877; RV32I-NEXT:    sh a3, 14(sp)
6878; RV32I-NEXT:    addi a1, sp, 14
6879; RV32I-NEXT:    mv a0, s0
6880; RV32I-NEXT:    li a3, 0
6881; RV32I-NEXT:    li a4, 0
6882; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
6883; RV32I-NEXT:    lh a3, 14(sp)
6884; RV32I-NEXT:    bnez a0, .LBB90_4
6885; RV32I-NEXT:  .LBB90_2: # %atomicrmw.start
6886; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
6887; RV32I-NEXT:    slli a0, a3, 16
6888; RV32I-NEXT:    srai a0, a0, 16
6889; RV32I-NEXT:    mv a2, a3
6890; RV32I-NEXT:    blt s1, a0, .LBB90_1
6891; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
6892; RV32I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6893; RV32I-NEXT:    mv a2, s2
6894; RV32I-NEXT:    j .LBB90_1
6895; RV32I-NEXT:  .LBB90_4: # %atomicrmw.end
6896; RV32I-NEXT:    mv a0, a3
6897; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
6898; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
6899; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
6900; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
6901; RV32I-NEXT:    addi sp, sp, 32
6902; RV32I-NEXT:    ret
6903;
6904; RV32IA-LABEL: atomicrmw_max_i16_monotonic:
6905; RV32IA:       # %bb.0:
6906; RV32IA-NEXT:    andi a6, a0, -4
6907; RV32IA-NEXT:    slli a0, a0, 3
6908; RV32IA-NEXT:    andi a3, a0, 24
6909; RV32IA-NEXT:    lui a4, 16
6910; RV32IA-NEXT:    addi a4, a4, -1
6911; RV32IA-NEXT:    sll a7, a4, a0
6912; RV32IA-NEXT:    slli a1, a1, 16
6913; RV32IA-NEXT:    srai a1, a1, 16
6914; RV32IA-NEXT:    sll a1, a1, a0
6915; RV32IA-NEXT:    li a5, 16
6916; RV32IA-NEXT:    sub a3, a5, a3
6917; RV32IA-NEXT:  .LBB90_1: # =>This Inner Loop Header: Depth=1
6918; RV32IA-NEXT:    lr.w a5, (a6)
6919; RV32IA-NEXT:    and a4, a5, a7
6920; RV32IA-NEXT:    mv a2, a5
6921; RV32IA-NEXT:    sll a4, a4, a3
6922; RV32IA-NEXT:    sra a4, a4, a3
6923; RV32IA-NEXT:    bge a4, a1, .LBB90_3
6924; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB90_1 Depth=1
6925; RV32IA-NEXT:    xor a2, a5, a1
6926; RV32IA-NEXT:    and a2, a2, a7
6927; RV32IA-NEXT:    xor a2, a5, a2
6928; RV32IA-NEXT:  .LBB90_3: # in Loop: Header=BB90_1 Depth=1
6929; RV32IA-NEXT:    sc.w a2, a2, (a6)
6930; RV32IA-NEXT:    bnez a2, .LBB90_1
6931; RV32IA-NEXT:  # %bb.4:
6932; RV32IA-NEXT:    srl a0, a5, a0
6933; RV32IA-NEXT:    ret
6934;
6935; RV64I-LABEL: atomicrmw_max_i16_monotonic:
6936; RV64I:       # %bb.0:
6937; RV64I-NEXT:    addi sp, sp, -48
6938; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
6939; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
6940; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
6941; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
6942; RV64I-NEXT:    mv s0, a0
6943; RV64I-NEXT:    lhu a3, 0(a0)
6944; RV64I-NEXT:    mv s2, a1
6945; RV64I-NEXT:    slli a0, a1, 48
6946; RV64I-NEXT:    srai s1, a0, 48
6947; RV64I-NEXT:    j .LBB90_2
6948; RV64I-NEXT:  .LBB90_1: # %atomicrmw.start
6949; RV64I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6950; RV64I-NEXT:    sh a3, 14(sp)
6951; RV64I-NEXT:    addi a1, sp, 14
6952; RV64I-NEXT:    mv a0, s0
6953; RV64I-NEXT:    li a3, 0
6954; RV64I-NEXT:    li a4, 0
6955; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
6956; RV64I-NEXT:    lh a3, 14(sp)
6957; RV64I-NEXT:    bnez a0, .LBB90_4
6958; RV64I-NEXT:  .LBB90_2: # %atomicrmw.start
6959; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
6960; RV64I-NEXT:    slli a0, a3, 48
6961; RV64I-NEXT:    srai a0, a0, 48
6962; RV64I-NEXT:    mv a2, a3
6963; RV64I-NEXT:    blt s1, a0, .LBB90_1
6964; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
6965; RV64I-NEXT:    # in Loop: Header=BB90_2 Depth=1
6966; RV64I-NEXT:    mv a2, s2
6967; RV64I-NEXT:    j .LBB90_1
6968; RV64I-NEXT:  .LBB90_4: # %atomicrmw.end
6969; RV64I-NEXT:    mv a0, a3
6970; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
6971; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
6972; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
6973; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
6974; RV64I-NEXT:    addi sp, sp, 48
6975; RV64I-NEXT:    ret
6976;
6977; RV64IA-LABEL: atomicrmw_max_i16_monotonic:
6978; RV64IA:       # %bb.0:
6979; RV64IA-NEXT:    andi a6, a0, -4
6980; RV64IA-NEXT:    slliw a0, a0, 3
6981; RV64IA-NEXT:    andi a3, a0, 24
6982; RV64IA-NEXT:    lui a4, 16
6983; RV64IA-NEXT:    addiw a4, a4, -1
6984; RV64IA-NEXT:    sllw a7, a4, a0
6985; RV64IA-NEXT:    slli a1, a1, 48
6986; RV64IA-NEXT:    srai a1, a1, 48
6987; RV64IA-NEXT:    sllw a1, a1, a0
6988; RV64IA-NEXT:    li a5, 48
6989; RV64IA-NEXT:    sub a3, a5, a3
6990; RV64IA-NEXT:  .LBB90_1: # =>This Inner Loop Header: Depth=1
6991; RV64IA-NEXT:    lr.w a5, (a6)
6992; RV64IA-NEXT:    and a4, a5, a7
6993; RV64IA-NEXT:    mv a2, a5
6994; RV64IA-NEXT:    sll a4, a4, a3
6995; RV64IA-NEXT:    sra a4, a4, a3
6996; RV64IA-NEXT:    bge a4, a1, .LBB90_3
6997; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB90_1 Depth=1
6998; RV64IA-NEXT:    xor a2, a5, a1
6999; RV64IA-NEXT:    and a2, a2, a7
7000; RV64IA-NEXT:    xor a2, a5, a2
7001; RV64IA-NEXT:  .LBB90_3: # in Loop: Header=BB90_1 Depth=1
7002; RV64IA-NEXT:    sc.w a2, a2, (a6)
7003; RV64IA-NEXT:    bnez a2, .LBB90_1
7004; RV64IA-NEXT:  # %bb.4:
7005; RV64IA-NEXT:    srlw a0, a5, a0
7006; RV64IA-NEXT:    ret
7007  %1 = atomicrmw max i16* %a, i16 %b monotonic
7008  ret i16 %1
7009}
7010
7011define i16 @atomicrmw_max_i16_acquire(i16 *%a, i16 %b) nounwind {
7012; RV32I-LABEL: atomicrmw_max_i16_acquire:
7013; RV32I:       # %bb.0:
7014; RV32I-NEXT:    addi sp, sp, -32
7015; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7016; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7017; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7018; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7019; RV32I-NEXT:    mv s0, a0
7020; RV32I-NEXT:    lhu a3, 0(a0)
7021; RV32I-NEXT:    mv s2, a1
7022; RV32I-NEXT:    slli a0, a1, 16
7023; RV32I-NEXT:    srai s1, a0, 16
7024; RV32I-NEXT:    j .LBB91_2
7025; RV32I-NEXT:  .LBB91_1: # %atomicrmw.start
7026; RV32I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7027; RV32I-NEXT:    sh a3, 14(sp)
7028; RV32I-NEXT:    addi a1, sp, 14
7029; RV32I-NEXT:    li a3, 2
7030; RV32I-NEXT:    li a4, 2
7031; RV32I-NEXT:    mv a0, s0
7032; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7033; RV32I-NEXT:    lh a3, 14(sp)
7034; RV32I-NEXT:    bnez a0, .LBB91_4
7035; RV32I-NEXT:  .LBB91_2: # %atomicrmw.start
7036; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7037; RV32I-NEXT:    slli a0, a3, 16
7038; RV32I-NEXT:    srai a0, a0, 16
7039; RV32I-NEXT:    mv a2, a3
7040; RV32I-NEXT:    blt s1, a0, .LBB91_1
7041; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7042; RV32I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7043; RV32I-NEXT:    mv a2, s2
7044; RV32I-NEXT:    j .LBB91_1
7045; RV32I-NEXT:  .LBB91_4: # %atomicrmw.end
7046; RV32I-NEXT:    mv a0, a3
7047; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7048; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7049; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7050; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7051; RV32I-NEXT:    addi sp, sp, 32
7052; RV32I-NEXT:    ret
7053;
7054; RV32IA-LABEL: atomicrmw_max_i16_acquire:
7055; RV32IA:       # %bb.0:
7056; RV32IA-NEXT:    andi a6, a0, -4
7057; RV32IA-NEXT:    slli a0, a0, 3
7058; RV32IA-NEXT:    andi a3, a0, 24
7059; RV32IA-NEXT:    lui a4, 16
7060; RV32IA-NEXT:    addi a4, a4, -1
7061; RV32IA-NEXT:    sll a7, a4, a0
7062; RV32IA-NEXT:    slli a1, a1, 16
7063; RV32IA-NEXT:    srai a1, a1, 16
7064; RV32IA-NEXT:    sll a1, a1, a0
7065; RV32IA-NEXT:    li a5, 16
7066; RV32IA-NEXT:    sub a3, a5, a3
7067; RV32IA-NEXT:  .LBB91_1: # =>This Inner Loop Header: Depth=1
7068; RV32IA-NEXT:    lr.w.aq a5, (a6)
7069; RV32IA-NEXT:    and a4, a5, a7
7070; RV32IA-NEXT:    mv a2, a5
7071; RV32IA-NEXT:    sll a4, a4, a3
7072; RV32IA-NEXT:    sra a4, a4, a3
7073; RV32IA-NEXT:    bge a4, a1, .LBB91_3
7074; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB91_1 Depth=1
7075; RV32IA-NEXT:    xor a2, a5, a1
7076; RV32IA-NEXT:    and a2, a2, a7
7077; RV32IA-NEXT:    xor a2, a5, a2
7078; RV32IA-NEXT:  .LBB91_3: # in Loop: Header=BB91_1 Depth=1
7079; RV32IA-NEXT:    sc.w a2, a2, (a6)
7080; RV32IA-NEXT:    bnez a2, .LBB91_1
7081; RV32IA-NEXT:  # %bb.4:
7082; RV32IA-NEXT:    srl a0, a5, a0
7083; RV32IA-NEXT:    ret
7084;
7085; RV64I-LABEL: atomicrmw_max_i16_acquire:
7086; RV64I:       # %bb.0:
7087; RV64I-NEXT:    addi sp, sp, -48
7088; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7089; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7090; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7091; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7092; RV64I-NEXT:    mv s0, a0
7093; RV64I-NEXT:    lhu a3, 0(a0)
7094; RV64I-NEXT:    mv s2, a1
7095; RV64I-NEXT:    slli a0, a1, 48
7096; RV64I-NEXT:    srai s1, a0, 48
7097; RV64I-NEXT:    j .LBB91_2
7098; RV64I-NEXT:  .LBB91_1: # %atomicrmw.start
7099; RV64I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7100; RV64I-NEXT:    sh a3, 14(sp)
7101; RV64I-NEXT:    addi a1, sp, 14
7102; RV64I-NEXT:    li a3, 2
7103; RV64I-NEXT:    li a4, 2
7104; RV64I-NEXT:    mv a0, s0
7105; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7106; RV64I-NEXT:    lh a3, 14(sp)
7107; RV64I-NEXT:    bnez a0, .LBB91_4
7108; RV64I-NEXT:  .LBB91_2: # %atomicrmw.start
7109; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7110; RV64I-NEXT:    slli a0, a3, 48
7111; RV64I-NEXT:    srai a0, a0, 48
7112; RV64I-NEXT:    mv a2, a3
7113; RV64I-NEXT:    blt s1, a0, .LBB91_1
7114; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7115; RV64I-NEXT:    # in Loop: Header=BB91_2 Depth=1
7116; RV64I-NEXT:    mv a2, s2
7117; RV64I-NEXT:    j .LBB91_1
7118; RV64I-NEXT:  .LBB91_4: # %atomicrmw.end
7119; RV64I-NEXT:    mv a0, a3
7120; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7121; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7122; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7123; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7124; RV64I-NEXT:    addi sp, sp, 48
7125; RV64I-NEXT:    ret
7126;
7127; RV64IA-LABEL: atomicrmw_max_i16_acquire:
7128; RV64IA:       # %bb.0:
7129; RV64IA-NEXT:    andi a6, a0, -4
7130; RV64IA-NEXT:    slliw a0, a0, 3
7131; RV64IA-NEXT:    andi a3, a0, 24
7132; RV64IA-NEXT:    lui a4, 16
7133; RV64IA-NEXT:    addiw a4, a4, -1
7134; RV64IA-NEXT:    sllw a7, a4, a0
7135; RV64IA-NEXT:    slli a1, a1, 48
7136; RV64IA-NEXT:    srai a1, a1, 48
7137; RV64IA-NEXT:    sllw a1, a1, a0
7138; RV64IA-NEXT:    li a5, 48
7139; RV64IA-NEXT:    sub a3, a5, a3
7140; RV64IA-NEXT:  .LBB91_1: # =>This Inner Loop Header: Depth=1
7141; RV64IA-NEXT:    lr.w.aq a5, (a6)
7142; RV64IA-NEXT:    and a4, a5, a7
7143; RV64IA-NEXT:    mv a2, a5
7144; RV64IA-NEXT:    sll a4, a4, a3
7145; RV64IA-NEXT:    sra a4, a4, a3
7146; RV64IA-NEXT:    bge a4, a1, .LBB91_3
7147; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB91_1 Depth=1
7148; RV64IA-NEXT:    xor a2, a5, a1
7149; RV64IA-NEXT:    and a2, a2, a7
7150; RV64IA-NEXT:    xor a2, a5, a2
7151; RV64IA-NEXT:  .LBB91_3: # in Loop: Header=BB91_1 Depth=1
7152; RV64IA-NEXT:    sc.w a2, a2, (a6)
7153; RV64IA-NEXT:    bnez a2, .LBB91_1
7154; RV64IA-NEXT:  # %bb.4:
7155; RV64IA-NEXT:    srlw a0, a5, a0
7156; RV64IA-NEXT:    ret
7157  %1 = atomicrmw max i16* %a, i16 %b acquire
7158  ret i16 %1
7159}
7160
7161define i16 @atomicrmw_max_i16_release(i16 *%a, i16 %b) nounwind {
7162; RV32I-LABEL: atomicrmw_max_i16_release:
7163; RV32I:       # %bb.0:
7164; RV32I-NEXT:    addi sp, sp, -32
7165; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7166; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7167; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7168; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7169; RV32I-NEXT:    mv s0, a0
7170; RV32I-NEXT:    lhu a3, 0(a0)
7171; RV32I-NEXT:    mv s2, a1
7172; RV32I-NEXT:    slli a0, a1, 16
7173; RV32I-NEXT:    srai s1, a0, 16
7174; RV32I-NEXT:    j .LBB92_2
7175; RV32I-NEXT:  .LBB92_1: # %atomicrmw.start
7176; RV32I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7177; RV32I-NEXT:    sh a3, 14(sp)
7178; RV32I-NEXT:    addi a1, sp, 14
7179; RV32I-NEXT:    li a3, 3
7180; RV32I-NEXT:    mv a0, s0
7181; RV32I-NEXT:    li a4, 0
7182; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7183; RV32I-NEXT:    lh a3, 14(sp)
7184; RV32I-NEXT:    bnez a0, .LBB92_4
7185; RV32I-NEXT:  .LBB92_2: # %atomicrmw.start
7186; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7187; RV32I-NEXT:    slli a0, a3, 16
7188; RV32I-NEXT:    srai a0, a0, 16
7189; RV32I-NEXT:    mv a2, a3
7190; RV32I-NEXT:    blt s1, a0, .LBB92_1
7191; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7192; RV32I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7193; RV32I-NEXT:    mv a2, s2
7194; RV32I-NEXT:    j .LBB92_1
7195; RV32I-NEXT:  .LBB92_4: # %atomicrmw.end
7196; RV32I-NEXT:    mv a0, a3
7197; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7198; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7199; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7200; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7201; RV32I-NEXT:    addi sp, sp, 32
7202; RV32I-NEXT:    ret
7203;
7204; RV32IA-LABEL: atomicrmw_max_i16_release:
7205; RV32IA:       # %bb.0:
7206; RV32IA-NEXT:    andi a6, a0, -4
7207; RV32IA-NEXT:    slli a0, a0, 3
7208; RV32IA-NEXT:    andi a3, a0, 24
7209; RV32IA-NEXT:    lui a4, 16
7210; RV32IA-NEXT:    addi a4, a4, -1
7211; RV32IA-NEXT:    sll a7, a4, a0
7212; RV32IA-NEXT:    slli a1, a1, 16
7213; RV32IA-NEXT:    srai a1, a1, 16
7214; RV32IA-NEXT:    sll a1, a1, a0
7215; RV32IA-NEXT:    li a5, 16
7216; RV32IA-NEXT:    sub a3, a5, a3
7217; RV32IA-NEXT:  .LBB92_1: # =>This Inner Loop Header: Depth=1
7218; RV32IA-NEXT:    lr.w a5, (a6)
7219; RV32IA-NEXT:    and a4, a5, a7
7220; RV32IA-NEXT:    mv a2, a5
7221; RV32IA-NEXT:    sll a4, a4, a3
7222; RV32IA-NEXT:    sra a4, a4, a3
7223; RV32IA-NEXT:    bge a4, a1, .LBB92_3
7224; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB92_1 Depth=1
7225; RV32IA-NEXT:    xor a2, a5, a1
7226; RV32IA-NEXT:    and a2, a2, a7
7227; RV32IA-NEXT:    xor a2, a5, a2
7228; RV32IA-NEXT:  .LBB92_3: # in Loop: Header=BB92_1 Depth=1
7229; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
7230; RV32IA-NEXT:    bnez a2, .LBB92_1
7231; RV32IA-NEXT:  # %bb.4:
7232; RV32IA-NEXT:    srl a0, a5, a0
7233; RV32IA-NEXT:    ret
7234;
7235; RV64I-LABEL: atomicrmw_max_i16_release:
7236; RV64I:       # %bb.0:
7237; RV64I-NEXT:    addi sp, sp, -48
7238; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7239; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7240; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7241; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7242; RV64I-NEXT:    mv s0, a0
7243; RV64I-NEXT:    lhu a3, 0(a0)
7244; RV64I-NEXT:    mv s2, a1
7245; RV64I-NEXT:    slli a0, a1, 48
7246; RV64I-NEXT:    srai s1, a0, 48
7247; RV64I-NEXT:    j .LBB92_2
7248; RV64I-NEXT:  .LBB92_1: # %atomicrmw.start
7249; RV64I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7250; RV64I-NEXT:    sh a3, 14(sp)
7251; RV64I-NEXT:    addi a1, sp, 14
7252; RV64I-NEXT:    li a3, 3
7253; RV64I-NEXT:    mv a0, s0
7254; RV64I-NEXT:    li a4, 0
7255; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7256; RV64I-NEXT:    lh a3, 14(sp)
7257; RV64I-NEXT:    bnez a0, .LBB92_4
7258; RV64I-NEXT:  .LBB92_2: # %atomicrmw.start
7259; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7260; RV64I-NEXT:    slli a0, a3, 48
7261; RV64I-NEXT:    srai a0, a0, 48
7262; RV64I-NEXT:    mv a2, a3
7263; RV64I-NEXT:    blt s1, a0, .LBB92_1
7264; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7265; RV64I-NEXT:    # in Loop: Header=BB92_2 Depth=1
7266; RV64I-NEXT:    mv a2, s2
7267; RV64I-NEXT:    j .LBB92_1
7268; RV64I-NEXT:  .LBB92_4: # %atomicrmw.end
7269; RV64I-NEXT:    mv a0, a3
7270; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7271; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7272; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7273; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7274; RV64I-NEXT:    addi sp, sp, 48
7275; RV64I-NEXT:    ret
7276;
7277; RV64IA-LABEL: atomicrmw_max_i16_release:
7278; RV64IA:       # %bb.0:
7279; RV64IA-NEXT:    andi a6, a0, -4
7280; RV64IA-NEXT:    slliw a0, a0, 3
7281; RV64IA-NEXT:    andi a3, a0, 24
7282; RV64IA-NEXT:    lui a4, 16
7283; RV64IA-NEXT:    addiw a4, a4, -1
7284; RV64IA-NEXT:    sllw a7, a4, a0
7285; RV64IA-NEXT:    slli a1, a1, 48
7286; RV64IA-NEXT:    srai a1, a1, 48
7287; RV64IA-NEXT:    sllw a1, a1, a0
7288; RV64IA-NEXT:    li a5, 48
7289; RV64IA-NEXT:    sub a3, a5, a3
7290; RV64IA-NEXT:  .LBB92_1: # =>This Inner Loop Header: Depth=1
7291; RV64IA-NEXT:    lr.w a5, (a6)
7292; RV64IA-NEXT:    and a4, a5, a7
7293; RV64IA-NEXT:    mv a2, a5
7294; RV64IA-NEXT:    sll a4, a4, a3
7295; RV64IA-NEXT:    sra a4, a4, a3
7296; RV64IA-NEXT:    bge a4, a1, .LBB92_3
7297; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB92_1 Depth=1
7298; RV64IA-NEXT:    xor a2, a5, a1
7299; RV64IA-NEXT:    and a2, a2, a7
7300; RV64IA-NEXT:    xor a2, a5, a2
7301; RV64IA-NEXT:  .LBB92_3: # in Loop: Header=BB92_1 Depth=1
7302; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
7303; RV64IA-NEXT:    bnez a2, .LBB92_1
7304; RV64IA-NEXT:  # %bb.4:
7305; RV64IA-NEXT:    srlw a0, a5, a0
7306; RV64IA-NEXT:    ret
7307  %1 = atomicrmw max i16* %a, i16 %b release
7308  ret i16 %1
7309}
7310
7311define i16 @atomicrmw_max_i16_acq_rel(i16 *%a, i16 %b) nounwind {
7312; RV32I-LABEL: atomicrmw_max_i16_acq_rel:
7313; RV32I:       # %bb.0:
7314; RV32I-NEXT:    addi sp, sp, -32
7315; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7316; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7317; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7318; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7319; RV32I-NEXT:    mv s0, a0
7320; RV32I-NEXT:    lhu a3, 0(a0)
7321; RV32I-NEXT:    mv s2, a1
7322; RV32I-NEXT:    slli a0, a1, 16
7323; RV32I-NEXT:    srai s1, a0, 16
7324; RV32I-NEXT:    j .LBB93_2
7325; RV32I-NEXT:  .LBB93_1: # %atomicrmw.start
7326; RV32I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7327; RV32I-NEXT:    sh a3, 14(sp)
7328; RV32I-NEXT:    addi a1, sp, 14
7329; RV32I-NEXT:    li a3, 4
7330; RV32I-NEXT:    li a4, 2
7331; RV32I-NEXT:    mv a0, s0
7332; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7333; RV32I-NEXT:    lh a3, 14(sp)
7334; RV32I-NEXT:    bnez a0, .LBB93_4
7335; RV32I-NEXT:  .LBB93_2: # %atomicrmw.start
7336; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7337; RV32I-NEXT:    slli a0, a3, 16
7338; RV32I-NEXT:    srai a0, a0, 16
7339; RV32I-NEXT:    mv a2, a3
7340; RV32I-NEXT:    blt s1, a0, .LBB93_1
7341; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7342; RV32I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7343; RV32I-NEXT:    mv a2, s2
7344; RV32I-NEXT:    j .LBB93_1
7345; RV32I-NEXT:  .LBB93_4: # %atomicrmw.end
7346; RV32I-NEXT:    mv a0, a3
7347; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7348; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7349; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7350; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7351; RV32I-NEXT:    addi sp, sp, 32
7352; RV32I-NEXT:    ret
7353;
7354; RV32IA-LABEL: atomicrmw_max_i16_acq_rel:
7355; RV32IA:       # %bb.0:
7356; RV32IA-NEXT:    andi a6, a0, -4
7357; RV32IA-NEXT:    slli a0, a0, 3
7358; RV32IA-NEXT:    andi a3, a0, 24
7359; RV32IA-NEXT:    lui a4, 16
7360; RV32IA-NEXT:    addi a4, a4, -1
7361; RV32IA-NEXT:    sll a7, a4, a0
7362; RV32IA-NEXT:    slli a1, a1, 16
7363; RV32IA-NEXT:    srai a1, a1, 16
7364; RV32IA-NEXT:    sll a1, a1, a0
7365; RV32IA-NEXT:    li a5, 16
7366; RV32IA-NEXT:    sub a3, a5, a3
7367; RV32IA-NEXT:  .LBB93_1: # =>This Inner Loop Header: Depth=1
7368; RV32IA-NEXT:    lr.w.aq a5, (a6)
7369; RV32IA-NEXT:    and a4, a5, a7
7370; RV32IA-NEXT:    mv a2, a5
7371; RV32IA-NEXT:    sll a4, a4, a3
7372; RV32IA-NEXT:    sra a4, a4, a3
7373; RV32IA-NEXT:    bge a4, a1, .LBB93_3
7374; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB93_1 Depth=1
7375; RV32IA-NEXT:    xor a2, a5, a1
7376; RV32IA-NEXT:    and a2, a2, a7
7377; RV32IA-NEXT:    xor a2, a5, a2
7378; RV32IA-NEXT:  .LBB93_3: # in Loop: Header=BB93_1 Depth=1
7379; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
7380; RV32IA-NEXT:    bnez a2, .LBB93_1
7381; RV32IA-NEXT:  # %bb.4:
7382; RV32IA-NEXT:    srl a0, a5, a0
7383; RV32IA-NEXT:    ret
7384;
7385; RV64I-LABEL: atomicrmw_max_i16_acq_rel:
7386; RV64I:       # %bb.0:
7387; RV64I-NEXT:    addi sp, sp, -48
7388; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7389; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7390; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7391; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7392; RV64I-NEXT:    mv s0, a0
7393; RV64I-NEXT:    lhu a3, 0(a0)
7394; RV64I-NEXT:    mv s2, a1
7395; RV64I-NEXT:    slli a0, a1, 48
7396; RV64I-NEXT:    srai s1, a0, 48
7397; RV64I-NEXT:    j .LBB93_2
7398; RV64I-NEXT:  .LBB93_1: # %atomicrmw.start
7399; RV64I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7400; RV64I-NEXT:    sh a3, 14(sp)
7401; RV64I-NEXT:    addi a1, sp, 14
7402; RV64I-NEXT:    li a3, 4
7403; RV64I-NEXT:    li a4, 2
7404; RV64I-NEXT:    mv a0, s0
7405; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7406; RV64I-NEXT:    lh a3, 14(sp)
7407; RV64I-NEXT:    bnez a0, .LBB93_4
7408; RV64I-NEXT:  .LBB93_2: # %atomicrmw.start
7409; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7410; RV64I-NEXT:    slli a0, a3, 48
7411; RV64I-NEXT:    srai a0, a0, 48
7412; RV64I-NEXT:    mv a2, a3
7413; RV64I-NEXT:    blt s1, a0, .LBB93_1
7414; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7415; RV64I-NEXT:    # in Loop: Header=BB93_2 Depth=1
7416; RV64I-NEXT:    mv a2, s2
7417; RV64I-NEXT:    j .LBB93_1
7418; RV64I-NEXT:  .LBB93_4: # %atomicrmw.end
7419; RV64I-NEXT:    mv a0, a3
7420; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7421; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7422; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7423; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7424; RV64I-NEXT:    addi sp, sp, 48
7425; RV64I-NEXT:    ret
7426;
7427; RV64IA-LABEL: atomicrmw_max_i16_acq_rel:
7428; RV64IA:       # %bb.0:
7429; RV64IA-NEXT:    andi a6, a0, -4
7430; RV64IA-NEXT:    slliw a0, a0, 3
7431; RV64IA-NEXT:    andi a3, a0, 24
7432; RV64IA-NEXT:    lui a4, 16
7433; RV64IA-NEXT:    addiw a4, a4, -1
7434; RV64IA-NEXT:    sllw a7, a4, a0
7435; RV64IA-NEXT:    slli a1, a1, 48
7436; RV64IA-NEXT:    srai a1, a1, 48
7437; RV64IA-NEXT:    sllw a1, a1, a0
7438; RV64IA-NEXT:    li a5, 48
7439; RV64IA-NEXT:    sub a3, a5, a3
7440; RV64IA-NEXT:  .LBB93_1: # =>This Inner Loop Header: Depth=1
7441; RV64IA-NEXT:    lr.w.aq a5, (a6)
7442; RV64IA-NEXT:    and a4, a5, a7
7443; RV64IA-NEXT:    mv a2, a5
7444; RV64IA-NEXT:    sll a4, a4, a3
7445; RV64IA-NEXT:    sra a4, a4, a3
7446; RV64IA-NEXT:    bge a4, a1, .LBB93_3
7447; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB93_1 Depth=1
7448; RV64IA-NEXT:    xor a2, a5, a1
7449; RV64IA-NEXT:    and a2, a2, a7
7450; RV64IA-NEXT:    xor a2, a5, a2
7451; RV64IA-NEXT:  .LBB93_3: # in Loop: Header=BB93_1 Depth=1
7452; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
7453; RV64IA-NEXT:    bnez a2, .LBB93_1
7454; RV64IA-NEXT:  # %bb.4:
7455; RV64IA-NEXT:    srlw a0, a5, a0
7456; RV64IA-NEXT:    ret
7457  %1 = atomicrmw max i16* %a, i16 %b acq_rel
7458  ret i16 %1
7459}
7460
7461define i16 @atomicrmw_max_i16_seq_cst(i16 *%a, i16 %b) nounwind {
7462; RV32I-LABEL: atomicrmw_max_i16_seq_cst:
7463; RV32I:       # %bb.0:
7464; RV32I-NEXT:    addi sp, sp, -32
7465; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7466; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7467; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7468; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7469; RV32I-NEXT:    mv s0, a0
7470; RV32I-NEXT:    lhu a3, 0(a0)
7471; RV32I-NEXT:    mv s2, a1
7472; RV32I-NEXT:    slli a0, a1, 16
7473; RV32I-NEXT:    srai s1, a0, 16
7474; RV32I-NEXT:    j .LBB94_2
7475; RV32I-NEXT:  .LBB94_1: # %atomicrmw.start
7476; RV32I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7477; RV32I-NEXT:    sh a3, 14(sp)
7478; RV32I-NEXT:    addi a1, sp, 14
7479; RV32I-NEXT:    li a3, 5
7480; RV32I-NEXT:    li a4, 5
7481; RV32I-NEXT:    mv a0, s0
7482; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7483; RV32I-NEXT:    lh a3, 14(sp)
7484; RV32I-NEXT:    bnez a0, .LBB94_4
7485; RV32I-NEXT:  .LBB94_2: # %atomicrmw.start
7486; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7487; RV32I-NEXT:    slli a0, a3, 16
7488; RV32I-NEXT:    srai a0, a0, 16
7489; RV32I-NEXT:    mv a2, a3
7490; RV32I-NEXT:    blt s1, a0, .LBB94_1
7491; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7492; RV32I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7493; RV32I-NEXT:    mv a2, s2
7494; RV32I-NEXT:    j .LBB94_1
7495; RV32I-NEXT:  .LBB94_4: # %atomicrmw.end
7496; RV32I-NEXT:    mv a0, a3
7497; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7498; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7499; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7500; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7501; RV32I-NEXT:    addi sp, sp, 32
7502; RV32I-NEXT:    ret
7503;
7504; RV32IA-LABEL: atomicrmw_max_i16_seq_cst:
7505; RV32IA:       # %bb.0:
7506; RV32IA-NEXT:    andi a6, a0, -4
7507; RV32IA-NEXT:    slli a0, a0, 3
7508; RV32IA-NEXT:    andi a3, a0, 24
7509; RV32IA-NEXT:    lui a4, 16
7510; RV32IA-NEXT:    addi a4, a4, -1
7511; RV32IA-NEXT:    sll a7, a4, a0
7512; RV32IA-NEXT:    slli a1, a1, 16
7513; RV32IA-NEXT:    srai a1, a1, 16
7514; RV32IA-NEXT:    sll a1, a1, a0
7515; RV32IA-NEXT:    li a5, 16
7516; RV32IA-NEXT:    sub a3, a5, a3
7517; RV32IA-NEXT:  .LBB94_1: # =>This Inner Loop Header: Depth=1
7518; RV32IA-NEXT:    lr.w.aqrl a5, (a6)
7519; RV32IA-NEXT:    and a4, a5, a7
7520; RV32IA-NEXT:    mv a2, a5
7521; RV32IA-NEXT:    sll a4, a4, a3
7522; RV32IA-NEXT:    sra a4, a4, a3
7523; RV32IA-NEXT:    bge a4, a1, .LBB94_3
7524; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB94_1 Depth=1
7525; RV32IA-NEXT:    xor a2, a5, a1
7526; RV32IA-NEXT:    and a2, a2, a7
7527; RV32IA-NEXT:    xor a2, a5, a2
7528; RV32IA-NEXT:  .LBB94_3: # in Loop: Header=BB94_1 Depth=1
7529; RV32IA-NEXT:    sc.w.aqrl a2, a2, (a6)
7530; RV32IA-NEXT:    bnez a2, .LBB94_1
7531; RV32IA-NEXT:  # %bb.4:
7532; RV32IA-NEXT:    srl a0, a5, a0
7533; RV32IA-NEXT:    ret
7534;
7535; RV64I-LABEL: atomicrmw_max_i16_seq_cst:
7536; RV64I:       # %bb.0:
7537; RV64I-NEXT:    addi sp, sp, -48
7538; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7539; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7540; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7541; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7542; RV64I-NEXT:    mv s0, a0
7543; RV64I-NEXT:    lhu a3, 0(a0)
7544; RV64I-NEXT:    mv s2, a1
7545; RV64I-NEXT:    slli a0, a1, 48
7546; RV64I-NEXT:    srai s1, a0, 48
7547; RV64I-NEXT:    j .LBB94_2
7548; RV64I-NEXT:  .LBB94_1: # %atomicrmw.start
7549; RV64I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7550; RV64I-NEXT:    sh a3, 14(sp)
7551; RV64I-NEXT:    addi a1, sp, 14
7552; RV64I-NEXT:    li a3, 5
7553; RV64I-NEXT:    li a4, 5
7554; RV64I-NEXT:    mv a0, s0
7555; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7556; RV64I-NEXT:    lh a3, 14(sp)
7557; RV64I-NEXT:    bnez a0, .LBB94_4
7558; RV64I-NEXT:  .LBB94_2: # %atomicrmw.start
7559; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7560; RV64I-NEXT:    slli a0, a3, 48
7561; RV64I-NEXT:    srai a0, a0, 48
7562; RV64I-NEXT:    mv a2, a3
7563; RV64I-NEXT:    blt s1, a0, .LBB94_1
7564; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7565; RV64I-NEXT:    # in Loop: Header=BB94_2 Depth=1
7566; RV64I-NEXT:    mv a2, s2
7567; RV64I-NEXT:    j .LBB94_1
7568; RV64I-NEXT:  .LBB94_4: # %atomicrmw.end
7569; RV64I-NEXT:    mv a0, a3
7570; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7571; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7572; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7573; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7574; RV64I-NEXT:    addi sp, sp, 48
7575; RV64I-NEXT:    ret
7576;
7577; RV64IA-LABEL: atomicrmw_max_i16_seq_cst:
7578; RV64IA:       # %bb.0:
7579; RV64IA-NEXT:    andi a6, a0, -4
7580; RV64IA-NEXT:    slliw a0, a0, 3
7581; RV64IA-NEXT:    andi a3, a0, 24
7582; RV64IA-NEXT:    lui a4, 16
7583; RV64IA-NEXT:    addiw a4, a4, -1
7584; RV64IA-NEXT:    sllw a7, a4, a0
7585; RV64IA-NEXT:    slli a1, a1, 48
7586; RV64IA-NEXT:    srai a1, a1, 48
7587; RV64IA-NEXT:    sllw a1, a1, a0
7588; RV64IA-NEXT:    li a5, 48
7589; RV64IA-NEXT:    sub a3, a5, a3
7590; RV64IA-NEXT:  .LBB94_1: # =>This Inner Loop Header: Depth=1
7591; RV64IA-NEXT:    lr.w.aqrl a5, (a6)
7592; RV64IA-NEXT:    and a4, a5, a7
7593; RV64IA-NEXT:    mv a2, a5
7594; RV64IA-NEXT:    sll a4, a4, a3
7595; RV64IA-NEXT:    sra a4, a4, a3
7596; RV64IA-NEXT:    bge a4, a1, .LBB94_3
7597; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB94_1 Depth=1
7598; RV64IA-NEXT:    xor a2, a5, a1
7599; RV64IA-NEXT:    and a2, a2, a7
7600; RV64IA-NEXT:    xor a2, a5, a2
7601; RV64IA-NEXT:  .LBB94_3: # in Loop: Header=BB94_1 Depth=1
7602; RV64IA-NEXT:    sc.w.aqrl a2, a2, (a6)
7603; RV64IA-NEXT:    bnez a2, .LBB94_1
7604; RV64IA-NEXT:  # %bb.4:
7605; RV64IA-NEXT:    srlw a0, a5, a0
7606; RV64IA-NEXT:    ret
7607  %1 = atomicrmw max i16* %a, i16 %b seq_cst
7608  ret i16 %1
7609}
7610
7611define i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind {
7612; RV32I-LABEL: atomicrmw_min_i16_monotonic:
7613; RV32I:       # %bb.0:
7614; RV32I-NEXT:    addi sp, sp, -32
7615; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7616; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7617; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7618; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7619; RV32I-NEXT:    mv s0, a0
7620; RV32I-NEXT:    lhu a3, 0(a0)
7621; RV32I-NEXT:    mv s2, a1
7622; RV32I-NEXT:    slli a0, a1, 16
7623; RV32I-NEXT:    srai s1, a0, 16
7624; RV32I-NEXT:    j .LBB95_2
7625; RV32I-NEXT:  .LBB95_1: # %atomicrmw.start
7626; RV32I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7627; RV32I-NEXT:    sh a3, 14(sp)
7628; RV32I-NEXT:    addi a1, sp, 14
7629; RV32I-NEXT:    mv a0, s0
7630; RV32I-NEXT:    li a3, 0
7631; RV32I-NEXT:    li a4, 0
7632; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7633; RV32I-NEXT:    lh a3, 14(sp)
7634; RV32I-NEXT:    bnez a0, .LBB95_4
7635; RV32I-NEXT:  .LBB95_2: # %atomicrmw.start
7636; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7637; RV32I-NEXT:    slli a0, a3, 16
7638; RV32I-NEXT:    srai a0, a0, 16
7639; RV32I-NEXT:    mv a2, a3
7640; RV32I-NEXT:    bge s1, a0, .LBB95_1
7641; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7642; RV32I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7643; RV32I-NEXT:    mv a2, s2
7644; RV32I-NEXT:    j .LBB95_1
7645; RV32I-NEXT:  .LBB95_4: # %atomicrmw.end
7646; RV32I-NEXT:    mv a0, a3
7647; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7648; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7649; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7650; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7651; RV32I-NEXT:    addi sp, sp, 32
7652; RV32I-NEXT:    ret
7653;
7654; RV32IA-LABEL: atomicrmw_min_i16_monotonic:
7655; RV32IA:       # %bb.0:
7656; RV32IA-NEXT:    andi a6, a0, -4
7657; RV32IA-NEXT:    slli a0, a0, 3
7658; RV32IA-NEXT:    andi a3, a0, 24
7659; RV32IA-NEXT:    lui a4, 16
7660; RV32IA-NEXT:    addi a4, a4, -1
7661; RV32IA-NEXT:    sll a7, a4, a0
7662; RV32IA-NEXT:    slli a1, a1, 16
7663; RV32IA-NEXT:    srai a1, a1, 16
7664; RV32IA-NEXT:    sll a1, a1, a0
7665; RV32IA-NEXT:    li a5, 16
7666; RV32IA-NEXT:    sub a3, a5, a3
7667; RV32IA-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
7668; RV32IA-NEXT:    lr.w a5, (a6)
7669; RV32IA-NEXT:    and a4, a5, a7
7670; RV32IA-NEXT:    mv a2, a5
7671; RV32IA-NEXT:    sll a4, a4, a3
7672; RV32IA-NEXT:    sra a4, a4, a3
7673; RV32IA-NEXT:    bge a1, a4, .LBB95_3
7674; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB95_1 Depth=1
7675; RV32IA-NEXT:    xor a2, a5, a1
7676; RV32IA-NEXT:    and a2, a2, a7
7677; RV32IA-NEXT:    xor a2, a5, a2
7678; RV32IA-NEXT:  .LBB95_3: # in Loop: Header=BB95_1 Depth=1
7679; RV32IA-NEXT:    sc.w a2, a2, (a6)
7680; RV32IA-NEXT:    bnez a2, .LBB95_1
7681; RV32IA-NEXT:  # %bb.4:
7682; RV32IA-NEXT:    srl a0, a5, a0
7683; RV32IA-NEXT:    ret
7684;
7685; RV64I-LABEL: atomicrmw_min_i16_monotonic:
7686; RV64I:       # %bb.0:
7687; RV64I-NEXT:    addi sp, sp, -48
7688; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7689; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7690; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7691; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7692; RV64I-NEXT:    mv s0, a0
7693; RV64I-NEXT:    lhu a3, 0(a0)
7694; RV64I-NEXT:    mv s2, a1
7695; RV64I-NEXT:    slli a0, a1, 48
7696; RV64I-NEXT:    srai s1, a0, 48
7697; RV64I-NEXT:    j .LBB95_2
7698; RV64I-NEXT:  .LBB95_1: # %atomicrmw.start
7699; RV64I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7700; RV64I-NEXT:    sh a3, 14(sp)
7701; RV64I-NEXT:    addi a1, sp, 14
7702; RV64I-NEXT:    mv a0, s0
7703; RV64I-NEXT:    li a3, 0
7704; RV64I-NEXT:    li a4, 0
7705; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7706; RV64I-NEXT:    lh a3, 14(sp)
7707; RV64I-NEXT:    bnez a0, .LBB95_4
7708; RV64I-NEXT:  .LBB95_2: # %atomicrmw.start
7709; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7710; RV64I-NEXT:    slli a0, a3, 48
7711; RV64I-NEXT:    srai a0, a0, 48
7712; RV64I-NEXT:    mv a2, a3
7713; RV64I-NEXT:    bge s1, a0, .LBB95_1
7714; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7715; RV64I-NEXT:    # in Loop: Header=BB95_2 Depth=1
7716; RV64I-NEXT:    mv a2, s2
7717; RV64I-NEXT:    j .LBB95_1
7718; RV64I-NEXT:  .LBB95_4: # %atomicrmw.end
7719; RV64I-NEXT:    mv a0, a3
7720; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7721; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7722; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7723; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7724; RV64I-NEXT:    addi sp, sp, 48
7725; RV64I-NEXT:    ret
7726;
7727; RV64IA-LABEL: atomicrmw_min_i16_monotonic:
7728; RV64IA:       # %bb.0:
7729; RV64IA-NEXT:    andi a6, a0, -4
7730; RV64IA-NEXT:    slliw a0, a0, 3
7731; RV64IA-NEXT:    andi a3, a0, 24
7732; RV64IA-NEXT:    lui a4, 16
7733; RV64IA-NEXT:    addiw a4, a4, -1
7734; RV64IA-NEXT:    sllw a7, a4, a0
7735; RV64IA-NEXT:    slli a1, a1, 48
7736; RV64IA-NEXT:    srai a1, a1, 48
7737; RV64IA-NEXT:    sllw a1, a1, a0
7738; RV64IA-NEXT:    li a5, 48
7739; RV64IA-NEXT:    sub a3, a5, a3
7740; RV64IA-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
7741; RV64IA-NEXT:    lr.w a5, (a6)
7742; RV64IA-NEXT:    and a4, a5, a7
7743; RV64IA-NEXT:    mv a2, a5
7744; RV64IA-NEXT:    sll a4, a4, a3
7745; RV64IA-NEXT:    sra a4, a4, a3
7746; RV64IA-NEXT:    bge a1, a4, .LBB95_3
7747; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB95_1 Depth=1
7748; RV64IA-NEXT:    xor a2, a5, a1
7749; RV64IA-NEXT:    and a2, a2, a7
7750; RV64IA-NEXT:    xor a2, a5, a2
7751; RV64IA-NEXT:  .LBB95_3: # in Loop: Header=BB95_1 Depth=1
7752; RV64IA-NEXT:    sc.w a2, a2, (a6)
7753; RV64IA-NEXT:    bnez a2, .LBB95_1
7754; RV64IA-NEXT:  # %bb.4:
7755; RV64IA-NEXT:    srlw a0, a5, a0
7756; RV64IA-NEXT:    ret
7757  %1 = atomicrmw min i16* %a, i16 %b monotonic
7758  ret i16 %1
7759}
7760
7761define i16 @atomicrmw_min_i16_acquire(i16 *%a, i16 %b) nounwind {
7762; RV32I-LABEL: atomicrmw_min_i16_acquire:
7763; RV32I:       # %bb.0:
7764; RV32I-NEXT:    addi sp, sp, -32
7765; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7766; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7767; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7768; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7769; RV32I-NEXT:    mv s0, a0
7770; RV32I-NEXT:    lhu a3, 0(a0)
7771; RV32I-NEXT:    mv s2, a1
7772; RV32I-NEXT:    slli a0, a1, 16
7773; RV32I-NEXT:    srai s1, a0, 16
7774; RV32I-NEXT:    j .LBB96_2
7775; RV32I-NEXT:  .LBB96_1: # %atomicrmw.start
7776; RV32I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7777; RV32I-NEXT:    sh a3, 14(sp)
7778; RV32I-NEXT:    addi a1, sp, 14
7779; RV32I-NEXT:    li a3, 2
7780; RV32I-NEXT:    li a4, 2
7781; RV32I-NEXT:    mv a0, s0
7782; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7783; RV32I-NEXT:    lh a3, 14(sp)
7784; RV32I-NEXT:    bnez a0, .LBB96_4
7785; RV32I-NEXT:  .LBB96_2: # %atomicrmw.start
7786; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7787; RV32I-NEXT:    slli a0, a3, 16
7788; RV32I-NEXT:    srai a0, a0, 16
7789; RV32I-NEXT:    mv a2, a3
7790; RV32I-NEXT:    bge s1, a0, .LBB96_1
7791; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7792; RV32I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7793; RV32I-NEXT:    mv a2, s2
7794; RV32I-NEXT:    j .LBB96_1
7795; RV32I-NEXT:  .LBB96_4: # %atomicrmw.end
7796; RV32I-NEXT:    mv a0, a3
7797; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7798; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7799; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7800; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7801; RV32I-NEXT:    addi sp, sp, 32
7802; RV32I-NEXT:    ret
7803;
7804; RV32IA-LABEL: atomicrmw_min_i16_acquire:
7805; RV32IA:       # %bb.0:
7806; RV32IA-NEXT:    andi a6, a0, -4
7807; RV32IA-NEXT:    slli a0, a0, 3
7808; RV32IA-NEXT:    andi a3, a0, 24
7809; RV32IA-NEXT:    lui a4, 16
7810; RV32IA-NEXT:    addi a4, a4, -1
7811; RV32IA-NEXT:    sll a7, a4, a0
7812; RV32IA-NEXT:    slli a1, a1, 16
7813; RV32IA-NEXT:    srai a1, a1, 16
7814; RV32IA-NEXT:    sll a1, a1, a0
7815; RV32IA-NEXT:    li a5, 16
7816; RV32IA-NEXT:    sub a3, a5, a3
7817; RV32IA-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
7818; RV32IA-NEXT:    lr.w.aq a5, (a6)
7819; RV32IA-NEXT:    and a4, a5, a7
7820; RV32IA-NEXT:    mv a2, a5
7821; RV32IA-NEXT:    sll a4, a4, a3
7822; RV32IA-NEXT:    sra a4, a4, a3
7823; RV32IA-NEXT:    bge a1, a4, .LBB96_3
7824; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB96_1 Depth=1
7825; RV32IA-NEXT:    xor a2, a5, a1
7826; RV32IA-NEXT:    and a2, a2, a7
7827; RV32IA-NEXT:    xor a2, a5, a2
7828; RV32IA-NEXT:  .LBB96_3: # in Loop: Header=BB96_1 Depth=1
7829; RV32IA-NEXT:    sc.w a2, a2, (a6)
7830; RV32IA-NEXT:    bnez a2, .LBB96_1
7831; RV32IA-NEXT:  # %bb.4:
7832; RV32IA-NEXT:    srl a0, a5, a0
7833; RV32IA-NEXT:    ret
7834;
7835; RV64I-LABEL: atomicrmw_min_i16_acquire:
7836; RV64I:       # %bb.0:
7837; RV64I-NEXT:    addi sp, sp, -48
7838; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7839; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7840; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7841; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7842; RV64I-NEXT:    mv s0, a0
7843; RV64I-NEXT:    lhu a3, 0(a0)
7844; RV64I-NEXT:    mv s2, a1
7845; RV64I-NEXT:    slli a0, a1, 48
7846; RV64I-NEXT:    srai s1, a0, 48
7847; RV64I-NEXT:    j .LBB96_2
7848; RV64I-NEXT:  .LBB96_1: # %atomicrmw.start
7849; RV64I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7850; RV64I-NEXT:    sh a3, 14(sp)
7851; RV64I-NEXT:    addi a1, sp, 14
7852; RV64I-NEXT:    li a3, 2
7853; RV64I-NEXT:    li a4, 2
7854; RV64I-NEXT:    mv a0, s0
7855; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
7856; RV64I-NEXT:    lh a3, 14(sp)
7857; RV64I-NEXT:    bnez a0, .LBB96_4
7858; RV64I-NEXT:  .LBB96_2: # %atomicrmw.start
7859; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7860; RV64I-NEXT:    slli a0, a3, 48
7861; RV64I-NEXT:    srai a0, a0, 48
7862; RV64I-NEXT:    mv a2, a3
7863; RV64I-NEXT:    bge s1, a0, .LBB96_1
7864; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7865; RV64I-NEXT:    # in Loop: Header=BB96_2 Depth=1
7866; RV64I-NEXT:    mv a2, s2
7867; RV64I-NEXT:    j .LBB96_1
7868; RV64I-NEXT:  .LBB96_4: # %atomicrmw.end
7869; RV64I-NEXT:    mv a0, a3
7870; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7871; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7872; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7873; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7874; RV64I-NEXT:    addi sp, sp, 48
7875; RV64I-NEXT:    ret
7876;
7877; RV64IA-LABEL: atomicrmw_min_i16_acquire:
7878; RV64IA:       # %bb.0:
7879; RV64IA-NEXT:    andi a6, a0, -4
7880; RV64IA-NEXT:    slliw a0, a0, 3
7881; RV64IA-NEXT:    andi a3, a0, 24
7882; RV64IA-NEXT:    lui a4, 16
7883; RV64IA-NEXT:    addiw a4, a4, -1
7884; RV64IA-NEXT:    sllw a7, a4, a0
7885; RV64IA-NEXT:    slli a1, a1, 48
7886; RV64IA-NEXT:    srai a1, a1, 48
7887; RV64IA-NEXT:    sllw a1, a1, a0
7888; RV64IA-NEXT:    li a5, 48
7889; RV64IA-NEXT:    sub a3, a5, a3
7890; RV64IA-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
7891; RV64IA-NEXT:    lr.w.aq a5, (a6)
7892; RV64IA-NEXT:    and a4, a5, a7
7893; RV64IA-NEXT:    mv a2, a5
7894; RV64IA-NEXT:    sll a4, a4, a3
7895; RV64IA-NEXT:    sra a4, a4, a3
7896; RV64IA-NEXT:    bge a1, a4, .LBB96_3
7897; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB96_1 Depth=1
7898; RV64IA-NEXT:    xor a2, a5, a1
7899; RV64IA-NEXT:    and a2, a2, a7
7900; RV64IA-NEXT:    xor a2, a5, a2
7901; RV64IA-NEXT:  .LBB96_3: # in Loop: Header=BB96_1 Depth=1
7902; RV64IA-NEXT:    sc.w a2, a2, (a6)
7903; RV64IA-NEXT:    bnez a2, .LBB96_1
7904; RV64IA-NEXT:  # %bb.4:
7905; RV64IA-NEXT:    srlw a0, a5, a0
7906; RV64IA-NEXT:    ret
7907  %1 = atomicrmw min i16* %a, i16 %b acquire
7908  ret i16 %1
7909}
7910
7911define i16 @atomicrmw_min_i16_release(i16 *%a, i16 %b) nounwind {
7912; RV32I-LABEL: atomicrmw_min_i16_release:
7913; RV32I:       # %bb.0:
7914; RV32I-NEXT:    addi sp, sp, -32
7915; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7916; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7917; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7918; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7919; RV32I-NEXT:    mv s0, a0
7920; RV32I-NEXT:    lhu a3, 0(a0)
7921; RV32I-NEXT:    mv s2, a1
7922; RV32I-NEXT:    slli a0, a1, 16
7923; RV32I-NEXT:    srai s1, a0, 16
7924; RV32I-NEXT:    j .LBB97_2
7925; RV32I-NEXT:  .LBB97_1: # %atomicrmw.start
7926; RV32I-NEXT:    # in Loop: Header=BB97_2 Depth=1
7927; RV32I-NEXT:    sh a3, 14(sp)
7928; RV32I-NEXT:    addi a1, sp, 14
7929; RV32I-NEXT:    li a3, 3
7930; RV32I-NEXT:    mv a0, s0
7931; RV32I-NEXT:    li a4, 0
7932; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
7933; RV32I-NEXT:    lh a3, 14(sp)
7934; RV32I-NEXT:    bnez a0, .LBB97_4
7935; RV32I-NEXT:  .LBB97_2: # %atomicrmw.start
7936; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7937; RV32I-NEXT:    slli a0, a3, 16
7938; RV32I-NEXT:    srai a0, a0, 16
7939; RV32I-NEXT:    mv a2, a3
7940; RV32I-NEXT:    bge s1, a0, .LBB97_1
7941; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7942; RV32I-NEXT:    # in Loop: Header=BB97_2 Depth=1
7943; RV32I-NEXT:    mv a2, s2
7944; RV32I-NEXT:    j .LBB97_1
7945; RV32I-NEXT:  .LBB97_4: # %atomicrmw.end
7946; RV32I-NEXT:    mv a0, a3
7947; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7948; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7949; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7950; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7951; RV32I-NEXT:    addi sp, sp, 32
7952; RV32I-NEXT:    ret
7953;
7954; RV32IA-LABEL: atomicrmw_min_i16_release:
7955; RV32IA:       # %bb.0:
7956; RV32IA-NEXT:    andi a6, a0, -4
7957; RV32IA-NEXT:    slli a0, a0, 3
7958; RV32IA-NEXT:    andi a3, a0, 24
7959; RV32IA-NEXT:    lui a4, 16
7960; RV32IA-NEXT:    addi a4, a4, -1
7961; RV32IA-NEXT:    sll a7, a4, a0
7962; RV32IA-NEXT:    slli a1, a1, 16
7963; RV32IA-NEXT:    srai a1, a1, 16
7964; RV32IA-NEXT:    sll a1, a1, a0
7965; RV32IA-NEXT:    li a5, 16
7966; RV32IA-NEXT:    sub a3, a5, a3
7967; RV32IA-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
7968; RV32IA-NEXT:    lr.w a5, (a6)
7969; RV32IA-NEXT:    and a4, a5, a7
7970; RV32IA-NEXT:    mv a2, a5
7971; RV32IA-NEXT:    sll a4, a4, a3
7972; RV32IA-NEXT:    sra a4, a4, a3
7973; RV32IA-NEXT:    bge a1, a4, .LBB97_3
7974; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB97_1 Depth=1
7975; RV32IA-NEXT:    xor a2, a5, a1
7976; RV32IA-NEXT:    and a2, a2, a7
7977; RV32IA-NEXT:    xor a2, a5, a2
7978; RV32IA-NEXT:  .LBB97_3: # in Loop: Header=BB97_1 Depth=1
7979; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
7980; RV32IA-NEXT:    bnez a2, .LBB97_1
7981; RV32IA-NEXT:  # %bb.4:
7982; RV32IA-NEXT:    srl a0, a5, a0
7983; RV32IA-NEXT:    ret
7984;
7985; RV64I-LABEL: atomicrmw_min_i16_release:
7986; RV64I:       # %bb.0:
7987; RV64I-NEXT:    addi sp, sp, -48
7988; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7989; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7990; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7991; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7992; RV64I-NEXT:    mv s0, a0
7993; RV64I-NEXT:    lhu a3, 0(a0)
7994; RV64I-NEXT:    mv s2, a1
7995; RV64I-NEXT:    slli a0, a1, 48
7996; RV64I-NEXT:    srai s1, a0, 48
7997; RV64I-NEXT:    j .LBB97_2
7998; RV64I-NEXT:  .LBB97_1: # %atomicrmw.start
7999; RV64I-NEXT:    # in Loop: Header=BB97_2 Depth=1
8000; RV64I-NEXT:    sh a3, 14(sp)
8001; RV64I-NEXT:    addi a1, sp, 14
8002; RV64I-NEXT:    li a3, 3
8003; RV64I-NEXT:    mv a0, s0
8004; RV64I-NEXT:    li a4, 0
8005; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8006; RV64I-NEXT:    lh a3, 14(sp)
8007; RV64I-NEXT:    bnez a0, .LBB97_4
8008; RV64I-NEXT:  .LBB97_2: # %atomicrmw.start
8009; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8010; RV64I-NEXT:    slli a0, a3, 48
8011; RV64I-NEXT:    srai a0, a0, 48
8012; RV64I-NEXT:    mv a2, a3
8013; RV64I-NEXT:    bge s1, a0, .LBB97_1
8014; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8015; RV64I-NEXT:    # in Loop: Header=BB97_2 Depth=1
8016; RV64I-NEXT:    mv a2, s2
8017; RV64I-NEXT:    j .LBB97_1
8018; RV64I-NEXT:  .LBB97_4: # %atomicrmw.end
8019; RV64I-NEXT:    mv a0, a3
8020; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8021; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8022; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8023; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8024; RV64I-NEXT:    addi sp, sp, 48
8025; RV64I-NEXT:    ret
8026;
8027; RV64IA-LABEL: atomicrmw_min_i16_release:
8028; RV64IA:       # %bb.0:
8029; RV64IA-NEXT:    andi a6, a0, -4
8030; RV64IA-NEXT:    slliw a0, a0, 3
8031; RV64IA-NEXT:    andi a3, a0, 24
8032; RV64IA-NEXT:    lui a4, 16
8033; RV64IA-NEXT:    addiw a4, a4, -1
8034; RV64IA-NEXT:    sllw a7, a4, a0
8035; RV64IA-NEXT:    slli a1, a1, 48
8036; RV64IA-NEXT:    srai a1, a1, 48
8037; RV64IA-NEXT:    sllw a1, a1, a0
8038; RV64IA-NEXT:    li a5, 48
8039; RV64IA-NEXT:    sub a3, a5, a3
8040; RV64IA-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
8041; RV64IA-NEXT:    lr.w a5, (a6)
8042; RV64IA-NEXT:    and a4, a5, a7
8043; RV64IA-NEXT:    mv a2, a5
8044; RV64IA-NEXT:    sll a4, a4, a3
8045; RV64IA-NEXT:    sra a4, a4, a3
8046; RV64IA-NEXT:    bge a1, a4, .LBB97_3
8047; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB97_1 Depth=1
8048; RV64IA-NEXT:    xor a2, a5, a1
8049; RV64IA-NEXT:    and a2, a2, a7
8050; RV64IA-NEXT:    xor a2, a5, a2
8051; RV64IA-NEXT:  .LBB97_3: # in Loop: Header=BB97_1 Depth=1
8052; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
8053; RV64IA-NEXT:    bnez a2, .LBB97_1
8054; RV64IA-NEXT:  # %bb.4:
8055; RV64IA-NEXT:    srlw a0, a5, a0
8056; RV64IA-NEXT:    ret
8057  %1 = atomicrmw min i16* %a, i16 %b release
8058  ret i16 %1
8059}
8060
8061define i16 @atomicrmw_min_i16_acq_rel(i16 *%a, i16 %b) nounwind {
8062; RV32I-LABEL: atomicrmw_min_i16_acq_rel:
8063; RV32I:       # %bb.0:
8064; RV32I-NEXT:    addi sp, sp, -32
8065; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8066; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8067; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8068; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8069; RV32I-NEXT:    mv s0, a0
8070; RV32I-NEXT:    lhu a3, 0(a0)
8071; RV32I-NEXT:    mv s2, a1
8072; RV32I-NEXT:    slli a0, a1, 16
8073; RV32I-NEXT:    srai s1, a0, 16
8074; RV32I-NEXT:    j .LBB98_2
8075; RV32I-NEXT:  .LBB98_1: # %atomicrmw.start
8076; RV32I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8077; RV32I-NEXT:    sh a3, 14(sp)
8078; RV32I-NEXT:    addi a1, sp, 14
8079; RV32I-NEXT:    li a3, 4
8080; RV32I-NEXT:    li a4, 2
8081; RV32I-NEXT:    mv a0, s0
8082; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8083; RV32I-NEXT:    lh a3, 14(sp)
8084; RV32I-NEXT:    bnez a0, .LBB98_4
8085; RV32I-NEXT:  .LBB98_2: # %atomicrmw.start
8086; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8087; RV32I-NEXT:    slli a0, a3, 16
8088; RV32I-NEXT:    srai a0, a0, 16
8089; RV32I-NEXT:    mv a2, a3
8090; RV32I-NEXT:    bge s1, a0, .LBB98_1
8091; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8092; RV32I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8093; RV32I-NEXT:    mv a2, s2
8094; RV32I-NEXT:    j .LBB98_1
8095; RV32I-NEXT:  .LBB98_4: # %atomicrmw.end
8096; RV32I-NEXT:    mv a0, a3
8097; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8098; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8099; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8100; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8101; RV32I-NEXT:    addi sp, sp, 32
8102; RV32I-NEXT:    ret
8103;
8104; RV32IA-LABEL: atomicrmw_min_i16_acq_rel:
8105; RV32IA:       # %bb.0:
8106; RV32IA-NEXT:    andi a6, a0, -4
8107; RV32IA-NEXT:    slli a0, a0, 3
8108; RV32IA-NEXT:    andi a3, a0, 24
8109; RV32IA-NEXT:    lui a4, 16
8110; RV32IA-NEXT:    addi a4, a4, -1
8111; RV32IA-NEXT:    sll a7, a4, a0
8112; RV32IA-NEXT:    slli a1, a1, 16
8113; RV32IA-NEXT:    srai a1, a1, 16
8114; RV32IA-NEXT:    sll a1, a1, a0
8115; RV32IA-NEXT:    li a5, 16
8116; RV32IA-NEXT:    sub a3, a5, a3
8117; RV32IA-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
8118; RV32IA-NEXT:    lr.w.aq a5, (a6)
8119; RV32IA-NEXT:    and a4, a5, a7
8120; RV32IA-NEXT:    mv a2, a5
8121; RV32IA-NEXT:    sll a4, a4, a3
8122; RV32IA-NEXT:    sra a4, a4, a3
8123; RV32IA-NEXT:    bge a1, a4, .LBB98_3
8124; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB98_1 Depth=1
8125; RV32IA-NEXT:    xor a2, a5, a1
8126; RV32IA-NEXT:    and a2, a2, a7
8127; RV32IA-NEXT:    xor a2, a5, a2
8128; RV32IA-NEXT:  .LBB98_3: # in Loop: Header=BB98_1 Depth=1
8129; RV32IA-NEXT:    sc.w.rl a2, a2, (a6)
8130; RV32IA-NEXT:    bnez a2, .LBB98_1
8131; RV32IA-NEXT:  # %bb.4:
8132; RV32IA-NEXT:    srl a0, a5, a0
8133; RV32IA-NEXT:    ret
8134;
8135; RV64I-LABEL: atomicrmw_min_i16_acq_rel:
8136; RV64I:       # %bb.0:
8137; RV64I-NEXT:    addi sp, sp, -48
8138; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8139; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8140; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8141; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8142; RV64I-NEXT:    mv s0, a0
8143; RV64I-NEXT:    lhu a3, 0(a0)
8144; RV64I-NEXT:    mv s2, a1
8145; RV64I-NEXT:    slli a0, a1, 48
8146; RV64I-NEXT:    srai s1, a0, 48
8147; RV64I-NEXT:    j .LBB98_2
8148; RV64I-NEXT:  .LBB98_1: # %atomicrmw.start
8149; RV64I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8150; RV64I-NEXT:    sh a3, 14(sp)
8151; RV64I-NEXT:    addi a1, sp, 14
8152; RV64I-NEXT:    li a3, 4
8153; RV64I-NEXT:    li a4, 2
8154; RV64I-NEXT:    mv a0, s0
8155; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8156; RV64I-NEXT:    lh a3, 14(sp)
8157; RV64I-NEXT:    bnez a0, .LBB98_4
8158; RV64I-NEXT:  .LBB98_2: # %atomicrmw.start
8159; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8160; RV64I-NEXT:    slli a0, a3, 48
8161; RV64I-NEXT:    srai a0, a0, 48
8162; RV64I-NEXT:    mv a2, a3
8163; RV64I-NEXT:    bge s1, a0, .LBB98_1
8164; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8165; RV64I-NEXT:    # in Loop: Header=BB98_2 Depth=1
8166; RV64I-NEXT:    mv a2, s2
8167; RV64I-NEXT:    j .LBB98_1
8168; RV64I-NEXT:  .LBB98_4: # %atomicrmw.end
8169; RV64I-NEXT:    mv a0, a3
8170; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8171; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8172; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8173; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8174; RV64I-NEXT:    addi sp, sp, 48
8175; RV64I-NEXT:    ret
8176;
8177; RV64IA-LABEL: atomicrmw_min_i16_acq_rel:
8178; RV64IA:       # %bb.0:
8179; RV64IA-NEXT:    andi a6, a0, -4
8180; RV64IA-NEXT:    slliw a0, a0, 3
8181; RV64IA-NEXT:    andi a3, a0, 24
8182; RV64IA-NEXT:    lui a4, 16
8183; RV64IA-NEXT:    addiw a4, a4, -1
8184; RV64IA-NEXT:    sllw a7, a4, a0
8185; RV64IA-NEXT:    slli a1, a1, 48
8186; RV64IA-NEXT:    srai a1, a1, 48
8187; RV64IA-NEXT:    sllw a1, a1, a0
8188; RV64IA-NEXT:    li a5, 48
8189; RV64IA-NEXT:    sub a3, a5, a3
8190; RV64IA-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
8191; RV64IA-NEXT:    lr.w.aq a5, (a6)
8192; RV64IA-NEXT:    and a4, a5, a7
8193; RV64IA-NEXT:    mv a2, a5
8194; RV64IA-NEXT:    sll a4, a4, a3
8195; RV64IA-NEXT:    sra a4, a4, a3
8196; RV64IA-NEXT:    bge a1, a4, .LBB98_3
8197; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB98_1 Depth=1
8198; RV64IA-NEXT:    xor a2, a5, a1
8199; RV64IA-NEXT:    and a2, a2, a7
8200; RV64IA-NEXT:    xor a2, a5, a2
8201; RV64IA-NEXT:  .LBB98_3: # in Loop: Header=BB98_1 Depth=1
8202; RV64IA-NEXT:    sc.w.rl a2, a2, (a6)
8203; RV64IA-NEXT:    bnez a2, .LBB98_1
8204; RV64IA-NEXT:  # %bb.4:
8205; RV64IA-NEXT:    srlw a0, a5, a0
8206; RV64IA-NEXT:    ret
8207  %1 = atomicrmw min i16* %a, i16 %b acq_rel
8208  ret i16 %1
8209}
8210
8211define i16 @atomicrmw_min_i16_seq_cst(i16 *%a, i16 %b) nounwind {
8212; RV32I-LABEL: atomicrmw_min_i16_seq_cst:
8213; RV32I:       # %bb.0:
8214; RV32I-NEXT:    addi sp, sp, -32
8215; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8216; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8217; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8218; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8219; RV32I-NEXT:    mv s0, a0
8220; RV32I-NEXT:    lhu a3, 0(a0)
8221; RV32I-NEXT:    mv s2, a1
8222; RV32I-NEXT:    slli a0, a1, 16
8223; RV32I-NEXT:    srai s1, a0, 16
8224; RV32I-NEXT:    j .LBB99_2
8225; RV32I-NEXT:  .LBB99_1: # %atomicrmw.start
8226; RV32I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8227; RV32I-NEXT:    sh a3, 14(sp)
8228; RV32I-NEXT:    addi a1, sp, 14
8229; RV32I-NEXT:    li a3, 5
8230; RV32I-NEXT:    li a4, 5
8231; RV32I-NEXT:    mv a0, s0
8232; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8233; RV32I-NEXT:    lh a3, 14(sp)
8234; RV32I-NEXT:    bnez a0, .LBB99_4
8235; RV32I-NEXT:  .LBB99_2: # %atomicrmw.start
8236; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8237; RV32I-NEXT:    slli a0, a3, 16
8238; RV32I-NEXT:    srai a0, a0, 16
8239; RV32I-NEXT:    mv a2, a3
8240; RV32I-NEXT:    bge s1, a0, .LBB99_1
8241; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8242; RV32I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8243; RV32I-NEXT:    mv a2, s2
8244; RV32I-NEXT:    j .LBB99_1
8245; RV32I-NEXT:  .LBB99_4: # %atomicrmw.end
8246; RV32I-NEXT:    mv a0, a3
8247; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8248; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8249; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8250; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8251; RV32I-NEXT:    addi sp, sp, 32
8252; RV32I-NEXT:    ret
8253;
8254; RV32IA-LABEL: atomicrmw_min_i16_seq_cst:
8255; RV32IA:       # %bb.0:
8256; RV32IA-NEXT:    andi a6, a0, -4
8257; RV32IA-NEXT:    slli a0, a0, 3
8258; RV32IA-NEXT:    andi a3, a0, 24
8259; RV32IA-NEXT:    lui a4, 16
8260; RV32IA-NEXT:    addi a4, a4, -1
8261; RV32IA-NEXT:    sll a7, a4, a0
8262; RV32IA-NEXT:    slli a1, a1, 16
8263; RV32IA-NEXT:    srai a1, a1, 16
8264; RV32IA-NEXT:    sll a1, a1, a0
8265; RV32IA-NEXT:    li a5, 16
8266; RV32IA-NEXT:    sub a3, a5, a3
8267; RV32IA-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
8268; RV32IA-NEXT:    lr.w.aqrl a5, (a6)
8269; RV32IA-NEXT:    and a4, a5, a7
8270; RV32IA-NEXT:    mv a2, a5
8271; RV32IA-NEXT:    sll a4, a4, a3
8272; RV32IA-NEXT:    sra a4, a4, a3
8273; RV32IA-NEXT:    bge a1, a4, .LBB99_3
8274; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB99_1 Depth=1
8275; RV32IA-NEXT:    xor a2, a5, a1
8276; RV32IA-NEXT:    and a2, a2, a7
8277; RV32IA-NEXT:    xor a2, a5, a2
8278; RV32IA-NEXT:  .LBB99_3: # in Loop: Header=BB99_1 Depth=1
8279; RV32IA-NEXT:    sc.w.aqrl a2, a2, (a6)
8280; RV32IA-NEXT:    bnez a2, .LBB99_1
8281; RV32IA-NEXT:  # %bb.4:
8282; RV32IA-NEXT:    srl a0, a5, a0
8283; RV32IA-NEXT:    ret
8284;
8285; RV64I-LABEL: atomicrmw_min_i16_seq_cst:
8286; RV64I:       # %bb.0:
8287; RV64I-NEXT:    addi sp, sp, -48
8288; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8289; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8290; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8291; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8292; RV64I-NEXT:    mv s0, a0
8293; RV64I-NEXT:    lhu a3, 0(a0)
8294; RV64I-NEXT:    mv s2, a1
8295; RV64I-NEXT:    slli a0, a1, 48
8296; RV64I-NEXT:    srai s1, a0, 48
8297; RV64I-NEXT:    j .LBB99_2
8298; RV64I-NEXT:  .LBB99_1: # %atomicrmw.start
8299; RV64I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8300; RV64I-NEXT:    sh a3, 14(sp)
8301; RV64I-NEXT:    addi a1, sp, 14
8302; RV64I-NEXT:    li a3, 5
8303; RV64I-NEXT:    li a4, 5
8304; RV64I-NEXT:    mv a0, s0
8305; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8306; RV64I-NEXT:    lh a3, 14(sp)
8307; RV64I-NEXT:    bnez a0, .LBB99_4
8308; RV64I-NEXT:  .LBB99_2: # %atomicrmw.start
8309; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8310; RV64I-NEXT:    slli a0, a3, 48
8311; RV64I-NEXT:    srai a0, a0, 48
8312; RV64I-NEXT:    mv a2, a3
8313; RV64I-NEXT:    bge s1, a0, .LBB99_1
8314; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8315; RV64I-NEXT:    # in Loop: Header=BB99_2 Depth=1
8316; RV64I-NEXT:    mv a2, s2
8317; RV64I-NEXT:    j .LBB99_1
8318; RV64I-NEXT:  .LBB99_4: # %atomicrmw.end
8319; RV64I-NEXT:    mv a0, a3
8320; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8321; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8322; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8323; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8324; RV64I-NEXT:    addi sp, sp, 48
8325; RV64I-NEXT:    ret
8326;
8327; RV64IA-LABEL: atomicrmw_min_i16_seq_cst:
8328; RV64IA:       # %bb.0:
8329; RV64IA-NEXT:    andi a6, a0, -4
8330; RV64IA-NEXT:    slliw a0, a0, 3
8331; RV64IA-NEXT:    andi a3, a0, 24
8332; RV64IA-NEXT:    lui a4, 16
8333; RV64IA-NEXT:    addiw a4, a4, -1
8334; RV64IA-NEXT:    sllw a7, a4, a0
8335; RV64IA-NEXT:    slli a1, a1, 48
8336; RV64IA-NEXT:    srai a1, a1, 48
8337; RV64IA-NEXT:    sllw a1, a1, a0
8338; RV64IA-NEXT:    li a5, 48
8339; RV64IA-NEXT:    sub a3, a5, a3
8340; RV64IA-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
8341; RV64IA-NEXT:    lr.w.aqrl a5, (a6)
8342; RV64IA-NEXT:    and a4, a5, a7
8343; RV64IA-NEXT:    mv a2, a5
8344; RV64IA-NEXT:    sll a4, a4, a3
8345; RV64IA-NEXT:    sra a4, a4, a3
8346; RV64IA-NEXT:    bge a1, a4, .LBB99_3
8347; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB99_1 Depth=1
8348; RV64IA-NEXT:    xor a2, a5, a1
8349; RV64IA-NEXT:    and a2, a2, a7
8350; RV64IA-NEXT:    xor a2, a5, a2
8351; RV64IA-NEXT:  .LBB99_3: # in Loop: Header=BB99_1 Depth=1
8352; RV64IA-NEXT:    sc.w.aqrl a2, a2, (a6)
8353; RV64IA-NEXT:    bnez a2, .LBB99_1
8354; RV64IA-NEXT:  # %bb.4:
8355; RV64IA-NEXT:    srlw a0, a5, a0
8356; RV64IA-NEXT:    ret
8357  %1 = atomicrmw min i16* %a, i16 %b seq_cst
8358  ret i16 %1
8359}
8360
8361define i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind {
8362; RV32I-LABEL: atomicrmw_umax_i16_monotonic:
8363; RV32I:       # %bb.0:
8364; RV32I-NEXT:    addi sp, sp, -32
8365; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8366; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8367; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8368; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8369; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8370; RV32I-NEXT:    mv s2, a1
8371; RV32I-NEXT:    mv s3, a0
8372; RV32I-NEXT:    lhu a1, 0(a0)
8373; RV32I-NEXT:    lui a0, 16
8374; RV32I-NEXT:    addi s0, a0, -1
8375; RV32I-NEXT:    and s1, s2, s0
8376; RV32I-NEXT:    j .LBB100_2
8377; RV32I-NEXT:  .LBB100_1: # %atomicrmw.start
8378; RV32I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8379; RV32I-NEXT:    sh a1, 10(sp)
8380; RV32I-NEXT:    addi a1, sp, 10
8381; RV32I-NEXT:    mv a0, s3
8382; RV32I-NEXT:    li a3, 0
8383; RV32I-NEXT:    li a4, 0
8384; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8385; RV32I-NEXT:    lh a1, 10(sp)
8386; RV32I-NEXT:    bnez a0, .LBB100_4
8387; RV32I-NEXT:  .LBB100_2: # %atomicrmw.start
8388; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8389; RV32I-NEXT:    and a0, a1, s0
8390; RV32I-NEXT:    mv a2, a1
8391; RV32I-NEXT:    bltu s1, a0, .LBB100_1
8392; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8393; RV32I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8394; RV32I-NEXT:    mv a2, s2
8395; RV32I-NEXT:    j .LBB100_1
8396; RV32I-NEXT:  .LBB100_4: # %atomicrmw.end
8397; RV32I-NEXT:    mv a0, a1
8398; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8399; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8400; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8401; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8402; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8403; RV32I-NEXT:    addi sp, sp, 32
8404; RV32I-NEXT:    ret
8405;
8406; RV32IA-LABEL: atomicrmw_umax_i16_monotonic:
8407; RV32IA:       # %bb.0:
8408; RV32IA-NEXT:    andi a6, a0, -4
8409; RV32IA-NEXT:    slli a0, a0, 3
8410; RV32IA-NEXT:    lui a3, 16
8411; RV32IA-NEXT:    addi a3, a3, -1
8412; RV32IA-NEXT:    sll a4, a3, a0
8413; RV32IA-NEXT:    and a1, a1, a3
8414; RV32IA-NEXT:    sll a1, a1, a0
8415; RV32IA-NEXT:  .LBB100_1: # =>This Inner Loop Header: Depth=1
8416; RV32IA-NEXT:    lr.w a3, (a6)
8417; RV32IA-NEXT:    and a2, a3, a4
8418; RV32IA-NEXT:    mv a5, a3
8419; RV32IA-NEXT:    bgeu a2, a1, .LBB100_3
8420; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB100_1 Depth=1
8421; RV32IA-NEXT:    xor a5, a3, a1
8422; RV32IA-NEXT:    and a5, a5, a4
8423; RV32IA-NEXT:    xor a5, a3, a5
8424; RV32IA-NEXT:  .LBB100_3: # in Loop: Header=BB100_1 Depth=1
8425; RV32IA-NEXT:    sc.w a5, a5, (a6)
8426; RV32IA-NEXT:    bnez a5, .LBB100_1
8427; RV32IA-NEXT:  # %bb.4:
8428; RV32IA-NEXT:    srl a0, a3, a0
8429; RV32IA-NEXT:    ret
8430;
8431; RV64I-LABEL: atomicrmw_umax_i16_monotonic:
8432; RV64I:       # %bb.0:
8433; RV64I-NEXT:    addi sp, sp, -48
8434; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8435; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8436; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8437; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8438; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8439; RV64I-NEXT:    mv s2, a1
8440; RV64I-NEXT:    mv s3, a0
8441; RV64I-NEXT:    lhu a1, 0(a0)
8442; RV64I-NEXT:    lui a0, 16
8443; RV64I-NEXT:    addiw s0, a0, -1
8444; RV64I-NEXT:    and s1, s2, s0
8445; RV64I-NEXT:    j .LBB100_2
8446; RV64I-NEXT:  .LBB100_1: # %atomicrmw.start
8447; RV64I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8448; RV64I-NEXT:    sh a1, 6(sp)
8449; RV64I-NEXT:    addi a1, sp, 6
8450; RV64I-NEXT:    mv a0, s3
8451; RV64I-NEXT:    li a3, 0
8452; RV64I-NEXT:    li a4, 0
8453; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8454; RV64I-NEXT:    lh a1, 6(sp)
8455; RV64I-NEXT:    bnez a0, .LBB100_4
8456; RV64I-NEXT:  .LBB100_2: # %atomicrmw.start
8457; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8458; RV64I-NEXT:    and a0, a1, s0
8459; RV64I-NEXT:    mv a2, a1
8460; RV64I-NEXT:    bltu s1, a0, .LBB100_1
8461; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8462; RV64I-NEXT:    # in Loop: Header=BB100_2 Depth=1
8463; RV64I-NEXT:    mv a2, s2
8464; RV64I-NEXT:    j .LBB100_1
8465; RV64I-NEXT:  .LBB100_4: # %atomicrmw.end
8466; RV64I-NEXT:    mv a0, a1
8467; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8468; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8469; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8470; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8471; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8472; RV64I-NEXT:    addi sp, sp, 48
8473; RV64I-NEXT:    ret
8474;
8475; RV64IA-LABEL: atomicrmw_umax_i16_monotonic:
8476; RV64IA:       # %bb.0:
8477; RV64IA-NEXT:    andi a6, a0, -4
8478; RV64IA-NEXT:    slliw a0, a0, 3
8479; RV64IA-NEXT:    lui a3, 16
8480; RV64IA-NEXT:    addiw a3, a3, -1
8481; RV64IA-NEXT:    sllw a4, a3, a0
8482; RV64IA-NEXT:    and a1, a1, a3
8483; RV64IA-NEXT:    sllw a1, a1, a0
8484; RV64IA-NEXT:  .LBB100_1: # =>This Inner Loop Header: Depth=1
8485; RV64IA-NEXT:    lr.w a3, (a6)
8486; RV64IA-NEXT:    and a2, a3, a4
8487; RV64IA-NEXT:    mv a5, a3
8488; RV64IA-NEXT:    bgeu a2, a1, .LBB100_3
8489; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB100_1 Depth=1
8490; RV64IA-NEXT:    xor a5, a3, a1
8491; RV64IA-NEXT:    and a5, a5, a4
8492; RV64IA-NEXT:    xor a5, a3, a5
8493; RV64IA-NEXT:  .LBB100_3: # in Loop: Header=BB100_1 Depth=1
8494; RV64IA-NEXT:    sc.w a5, a5, (a6)
8495; RV64IA-NEXT:    bnez a5, .LBB100_1
8496; RV64IA-NEXT:  # %bb.4:
8497; RV64IA-NEXT:    srlw a0, a3, a0
8498; RV64IA-NEXT:    ret
8499  %1 = atomicrmw umax i16* %a, i16 %b monotonic
8500  ret i16 %1
8501}
8502
8503define i16 @atomicrmw_umax_i16_acquire(i16 *%a, i16 %b) nounwind {
8504; RV32I-LABEL: atomicrmw_umax_i16_acquire:
8505; RV32I:       # %bb.0:
8506; RV32I-NEXT:    addi sp, sp, -32
8507; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8508; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8509; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8510; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8511; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8512; RV32I-NEXT:    mv s2, a1
8513; RV32I-NEXT:    mv s3, a0
8514; RV32I-NEXT:    lhu a1, 0(a0)
8515; RV32I-NEXT:    lui a0, 16
8516; RV32I-NEXT:    addi s0, a0, -1
8517; RV32I-NEXT:    and s1, s2, s0
8518; RV32I-NEXT:    j .LBB101_2
8519; RV32I-NEXT:  .LBB101_1: # %atomicrmw.start
8520; RV32I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8521; RV32I-NEXT:    sh a1, 10(sp)
8522; RV32I-NEXT:    addi a1, sp, 10
8523; RV32I-NEXT:    li a3, 2
8524; RV32I-NEXT:    li a4, 2
8525; RV32I-NEXT:    mv a0, s3
8526; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8527; RV32I-NEXT:    lh a1, 10(sp)
8528; RV32I-NEXT:    bnez a0, .LBB101_4
8529; RV32I-NEXT:  .LBB101_2: # %atomicrmw.start
8530; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8531; RV32I-NEXT:    and a0, a1, s0
8532; RV32I-NEXT:    mv a2, a1
8533; RV32I-NEXT:    bltu s1, a0, .LBB101_1
8534; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8535; RV32I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8536; RV32I-NEXT:    mv a2, s2
8537; RV32I-NEXT:    j .LBB101_1
8538; RV32I-NEXT:  .LBB101_4: # %atomicrmw.end
8539; RV32I-NEXT:    mv a0, a1
8540; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8541; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8542; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8543; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8544; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8545; RV32I-NEXT:    addi sp, sp, 32
8546; RV32I-NEXT:    ret
8547;
8548; RV32IA-LABEL: atomicrmw_umax_i16_acquire:
8549; RV32IA:       # %bb.0:
8550; RV32IA-NEXT:    andi a6, a0, -4
8551; RV32IA-NEXT:    slli a0, a0, 3
8552; RV32IA-NEXT:    lui a3, 16
8553; RV32IA-NEXT:    addi a3, a3, -1
8554; RV32IA-NEXT:    sll a4, a3, a0
8555; RV32IA-NEXT:    and a1, a1, a3
8556; RV32IA-NEXT:    sll a1, a1, a0
8557; RV32IA-NEXT:  .LBB101_1: # =>This Inner Loop Header: Depth=1
8558; RV32IA-NEXT:    lr.w.aq a3, (a6)
8559; RV32IA-NEXT:    and a2, a3, a4
8560; RV32IA-NEXT:    mv a5, a3
8561; RV32IA-NEXT:    bgeu a2, a1, .LBB101_3
8562; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB101_1 Depth=1
8563; RV32IA-NEXT:    xor a5, a3, a1
8564; RV32IA-NEXT:    and a5, a5, a4
8565; RV32IA-NEXT:    xor a5, a3, a5
8566; RV32IA-NEXT:  .LBB101_3: # in Loop: Header=BB101_1 Depth=1
8567; RV32IA-NEXT:    sc.w a5, a5, (a6)
8568; RV32IA-NEXT:    bnez a5, .LBB101_1
8569; RV32IA-NEXT:  # %bb.4:
8570; RV32IA-NEXT:    srl a0, a3, a0
8571; RV32IA-NEXT:    ret
8572;
8573; RV64I-LABEL: atomicrmw_umax_i16_acquire:
8574; RV64I:       # %bb.0:
8575; RV64I-NEXT:    addi sp, sp, -48
8576; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8577; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8578; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8579; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8580; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8581; RV64I-NEXT:    mv s2, a1
8582; RV64I-NEXT:    mv s3, a0
8583; RV64I-NEXT:    lhu a1, 0(a0)
8584; RV64I-NEXT:    lui a0, 16
8585; RV64I-NEXT:    addiw s0, a0, -1
8586; RV64I-NEXT:    and s1, s2, s0
8587; RV64I-NEXT:    j .LBB101_2
8588; RV64I-NEXT:  .LBB101_1: # %atomicrmw.start
8589; RV64I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8590; RV64I-NEXT:    sh a1, 6(sp)
8591; RV64I-NEXT:    addi a1, sp, 6
8592; RV64I-NEXT:    li a3, 2
8593; RV64I-NEXT:    li a4, 2
8594; RV64I-NEXT:    mv a0, s3
8595; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8596; RV64I-NEXT:    lh a1, 6(sp)
8597; RV64I-NEXT:    bnez a0, .LBB101_4
8598; RV64I-NEXT:  .LBB101_2: # %atomicrmw.start
8599; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8600; RV64I-NEXT:    and a0, a1, s0
8601; RV64I-NEXT:    mv a2, a1
8602; RV64I-NEXT:    bltu s1, a0, .LBB101_1
8603; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8604; RV64I-NEXT:    # in Loop: Header=BB101_2 Depth=1
8605; RV64I-NEXT:    mv a2, s2
8606; RV64I-NEXT:    j .LBB101_1
8607; RV64I-NEXT:  .LBB101_4: # %atomicrmw.end
8608; RV64I-NEXT:    mv a0, a1
8609; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8610; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8611; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8612; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8613; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8614; RV64I-NEXT:    addi sp, sp, 48
8615; RV64I-NEXT:    ret
8616;
8617; RV64IA-LABEL: atomicrmw_umax_i16_acquire:
8618; RV64IA:       # %bb.0:
8619; RV64IA-NEXT:    andi a6, a0, -4
8620; RV64IA-NEXT:    slliw a0, a0, 3
8621; RV64IA-NEXT:    lui a3, 16
8622; RV64IA-NEXT:    addiw a3, a3, -1
8623; RV64IA-NEXT:    sllw a4, a3, a0
8624; RV64IA-NEXT:    and a1, a1, a3
8625; RV64IA-NEXT:    sllw a1, a1, a0
8626; RV64IA-NEXT:  .LBB101_1: # =>This Inner Loop Header: Depth=1
8627; RV64IA-NEXT:    lr.w.aq a3, (a6)
8628; RV64IA-NEXT:    and a2, a3, a4
8629; RV64IA-NEXT:    mv a5, a3
8630; RV64IA-NEXT:    bgeu a2, a1, .LBB101_3
8631; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB101_1 Depth=1
8632; RV64IA-NEXT:    xor a5, a3, a1
8633; RV64IA-NEXT:    and a5, a5, a4
8634; RV64IA-NEXT:    xor a5, a3, a5
8635; RV64IA-NEXT:  .LBB101_3: # in Loop: Header=BB101_1 Depth=1
8636; RV64IA-NEXT:    sc.w a5, a5, (a6)
8637; RV64IA-NEXT:    bnez a5, .LBB101_1
8638; RV64IA-NEXT:  # %bb.4:
8639; RV64IA-NEXT:    srlw a0, a3, a0
8640; RV64IA-NEXT:    ret
8641  %1 = atomicrmw umax i16* %a, i16 %b acquire
8642  ret i16 %1
8643}
8644
8645define i16 @atomicrmw_umax_i16_release(i16 *%a, i16 %b) nounwind {
8646; RV32I-LABEL: atomicrmw_umax_i16_release:
8647; RV32I:       # %bb.0:
8648; RV32I-NEXT:    addi sp, sp, -32
8649; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8650; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8651; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8652; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8653; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8654; RV32I-NEXT:    mv s2, a1
8655; RV32I-NEXT:    mv s3, a0
8656; RV32I-NEXT:    lhu a1, 0(a0)
8657; RV32I-NEXT:    lui a0, 16
8658; RV32I-NEXT:    addi s0, a0, -1
8659; RV32I-NEXT:    and s1, s2, s0
8660; RV32I-NEXT:    j .LBB102_2
8661; RV32I-NEXT:  .LBB102_1: # %atomicrmw.start
8662; RV32I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8663; RV32I-NEXT:    sh a1, 10(sp)
8664; RV32I-NEXT:    addi a1, sp, 10
8665; RV32I-NEXT:    li a3, 3
8666; RV32I-NEXT:    mv a0, s3
8667; RV32I-NEXT:    li a4, 0
8668; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8669; RV32I-NEXT:    lh a1, 10(sp)
8670; RV32I-NEXT:    bnez a0, .LBB102_4
8671; RV32I-NEXT:  .LBB102_2: # %atomicrmw.start
8672; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8673; RV32I-NEXT:    and a0, a1, s0
8674; RV32I-NEXT:    mv a2, a1
8675; RV32I-NEXT:    bltu s1, a0, .LBB102_1
8676; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8677; RV32I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8678; RV32I-NEXT:    mv a2, s2
8679; RV32I-NEXT:    j .LBB102_1
8680; RV32I-NEXT:  .LBB102_4: # %atomicrmw.end
8681; RV32I-NEXT:    mv a0, a1
8682; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8683; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8684; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8685; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8686; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8687; RV32I-NEXT:    addi sp, sp, 32
8688; RV32I-NEXT:    ret
8689;
8690; RV32IA-LABEL: atomicrmw_umax_i16_release:
8691; RV32IA:       # %bb.0:
8692; RV32IA-NEXT:    andi a6, a0, -4
8693; RV32IA-NEXT:    slli a0, a0, 3
8694; RV32IA-NEXT:    lui a3, 16
8695; RV32IA-NEXT:    addi a3, a3, -1
8696; RV32IA-NEXT:    sll a4, a3, a0
8697; RV32IA-NEXT:    and a1, a1, a3
8698; RV32IA-NEXT:    sll a1, a1, a0
8699; RV32IA-NEXT:  .LBB102_1: # =>This Inner Loop Header: Depth=1
8700; RV32IA-NEXT:    lr.w a3, (a6)
8701; RV32IA-NEXT:    and a2, a3, a4
8702; RV32IA-NEXT:    mv a5, a3
8703; RV32IA-NEXT:    bgeu a2, a1, .LBB102_3
8704; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB102_1 Depth=1
8705; RV32IA-NEXT:    xor a5, a3, a1
8706; RV32IA-NEXT:    and a5, a5, a4
8707; RV32IA-NEXT:    xor a5, a3, a5
8708; RV32IA-NEXT:  .LBB102_3: # in Loop: Header=BB102_1 Depth=1
8709; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
8710; RV32IA-NEXT:    bnez a5, .LBB102_1
8711; RV32IA-NEXT:  # %bb.4:
8712; RV32IA-NEXT:    srl a0, a3, a0
8713; RV32IA-NEXT:    ret
8714;
8715; RV64I-LABEL: atomicrmw_umax_i16_release:
8716; RV64I:       # %bb.0:
8717; RV64I-NEXT:    addi sp, sp, -48
8718; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8719; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8720; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8721; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8722; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8723; RV64I-NEXT:    mv s2, a1
8724; RV64I-NEXT:    mv s3, a0
8725; RV64I-NEXT:    lhu a1, 0(a0)
8726; RV64I-NEXT:    lui a0, 16
8727; RV64I-NEXT:    addiw s0, a0, -1
8728; RV64I-NEXT:    and s1, s2, s0
8729; RV64I-NEXT:    j .LBB102_2
8730; RV64I-NEXT:  .LBB102_1: # %atomicrmw.start
8731; RV64I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8732; RV64I-NEXT:    sh a1, 6(sp)
8733; RV64I-NEXT:    addi a1, sp, 6
8734; RV64I-NEXT:    li a3, 3
8735; RV64I-NEXT:    mv a0, s3
8736; RV64I-NEXT:    li a4, 0
8737; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8738; RV64I-NEXT:    lh a1, 6(sp)
8739; RV64I-NEXT:    bnez a0, .LBB102_4
8740; RV64I-NEXT:  .LBB102_2: # %atomicrmw.start
8741; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8742; RV64I-NEXT:    and a0, a1, s0
8743; RV64I-NEXT:    mv a2, a1
8744; RV64I-NEXT:    bltu s1, a0, .LBB102_1
8745; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8746; RV64I-NEXT:    # in Loop: Header=BB102_2 Depth=1
8747; RV64I-NEXT:    mv a2, s2
8748; RV64I-NEXT:    j .LBB102_1
8749; RV64I-NEXT:  .LBB102_4: # %atomicrmw.end
8750; RV64I-NEXT:    mv a0, a1
8751; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8752; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8753; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8754; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8755; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8756; RV64I-NEXT:    addi sp, sp, 48
8757; RV64I-NEXT:    ret
8758;
8759; RV64IA-LABEL: atomicrmw_umax_i16_release:
8760; RV64IA:       # %bb.0:
8761; RV64IA-NEXT:    andi a6, a0, -4
8762; RV64IA-NEXT:    slliw a0, a0, 3
8763; RV64IA-NEXT:    lui a3, 16
8764; RV64IA-NEXT:    addiw a3, a3, -1
8765; RV64IA-NEXT:    sllw a4, a3, a0
8766; RV64IA-NEXT:    and a1, a1, a3
8767; RV64IA-NEXT:    sllw a1, a1, a0
8768; RV64IA-NEXT:  .LBB102_1: # =>This Inner Loop Header: Depth=1
8769; RV64IA-NEXT:    lr.w a3, (a6)
8770; RV64IA-NEXT:    and a2, a3, a4
8771; RV64IA-NEXT:    mv a5, a3
8772; RV64IA-NEXT:    bgeu a2, a1, .LBB102_3
8773; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB102_1 Depth=1
8774; RV64IA-NEXT:    xor a5, a3, a1
8775; RV64IA-NEXT:    and a5, a5, a4
8776; RV64IA-NEXT:    xor a5, a3, a5
8777; RV64IA-NEXT:  .LBB102_3: # in Loop: Header=BB102_1 Depth=1
8778; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
8779; RV64IA-NEXT:    bnez a5, .LBB102_1
8780; RV64IA-NEXT:  # %bb.4:
8781; RV64IA-NEXT:    srlw a0, a3, a0
8782; RV64IA-NEXT:    ret
8783  %1 = atomicrmw umax i16* %a, i16 %b release
8784  ret i16 %1
8785}
8786
8787define i16 @atomicrmw_umax_i16_acq_rel(i16 *%a, i16 %b) nounwind {
8788; RV32I-LABEL: atomicrmw_umax_i16_acq_rel:
8789; RV32I:       # %bb.0:
8790; RV32I-NEXT:    addi sp, sp, -32
8791; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8792; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8793; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8794; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8795; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8796; RV32I-NEXT:    mv s2, a1
8797; RV32I-NEXT:    mv s3, a0
8798; RV32I-NEXT:    lhu a1, 0(a0)
8799; RV32I-NEXT:    lui a0, 16
8800; RV32I-NEXT:    addi s0, a0, -1
8801; RV32I-NEXT:    and s1, s2, s0
8802; RV32I-NEXT:    j .LBB103_2
8803; RV32I-NEXT:  .LBB103_1: # %atomicrmw.start
8804; RV32I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8805; RV32I-NEXT:    sh a1, 10(sp)
8806; RV32I-NEXT:    addi a1, sp, 10
8807; RV32I-NEXT:    li a3, 4
8808; RV32I-NEXT:    li a4, 2
8809; RV32I-NEXT:    mv a0, s3
8810; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8811; RV32I-NEXT:    lh a1, 10(sp)
8812; RV32I-NEXT:    bnez a0, .LBB103_4
8813; RV32I-NEXT:  .LBB103_2: # %atomicrmw.start
8814; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8815; RV32I-NEXT:    and a0, a1, s0
8816; RV32I-NEXT:    mv a2, a1
8817; RV32I-NEXT:    bltu s1, a0, .LBB103_1
8818; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8819; RV32I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8820; RV32I-NEXT:    mv a2, s2
8821; RV32I-NEXT:    j .LBB103_1
8822; RV32I-NEXT:  .LBB103_4: # %atomicrmw.end
8823; RV32I-NEXT:    mv a0, a1
8824; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8825; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8826; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8827; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8828; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8829; RV32I-NEXT:    addi sp, sp, 32
8830; RV32I-NEXT:    ret
8831;
8832; RV32IA-LABEL: atomicrmw_umax_i16_acq_rel:
8833; RV32IA:       # %bb.0:
8834; RV32IA-NEXT:    andi a6, a0, -4
8835; RV32IA-NEXT:    slli a0, a0, 3
8836; RV32IA-NEXT:    lui a3, 16
8837; RV32IA-NEXT:    addi a3, a3, -1
8838; RV32IA-NEXT:    sll a4, a3, a0
8839; RV32IA-NEXT:    and a1, a1, a3
8840; RV32IA-NEXT:    sll a1, a1, a0
8841; RV32IA-NEXT:  .LBB103_1: # =>This Inner Loop Header: Depth=1
8842; RV32IA-NEXT:    lr.w.aq a3, (a6)
8843; RV32IA-NEXT:    and a2, a3, a4
8844; RV32IA-NEXT:    mv a5, a3
8845; RV32IA-NEXT:    bgeu a2, a1, .LBB103_3
8846; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB103_1 Depth=1
8847; RV32IA-NEXT:    xor a5, a3, a1
8848; RV32IA-NEXT:    and a5, a5, a4
8849; RV32IA-NEXT:    xor a5, a3, a5
8850; RV32IA-NEXT:  .LBB103_3: # in Loop: Header=BB103_1 Depth=1
8851; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
8852; RV32IA-NEXT:    bnez a5, .LBB103_1
8853; RV32IA-NEXT:  # %bb.4:
8854; RV32IA-NEXT:    srl a0, a3, a0
8855; RV32IA-NEXT:    ret
8856;
8857; RV64I-LABEL: atomicrmw_umax_i16_acq_rel:
8858; RV64I:       # %bb.0:
8859; RV64I-NEXT:    addi sp, sp, -48
8860; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8861; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8862; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8863; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8864; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
8865; RV64I-NEXT:    mv s2, a1
8866; RV64I-NEXT:    mv s3, a0
8867; RV64I-NEXT:    lhu a1, 0(a0)
8868; RV64I-NEXT:    lui a0, 16
8869; RV64I-NEXT:    addiw s0, a0, -1
8870; RV64I-NEXT:    and s1, s2, s0
8871; RV64I-NEXT:    j .LBB103_2
8872; RV64I-NEXT:  .LBB103_1: # %atomicrmw.start
8873; RV64I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8874; RV64I-NEXT:    sh a1, 6(sp)
8875; RV64I-NEXT:    addi a1, sp, 6
8876; RV64I-NEXT:    li a3, 4
8877; RV64I-NEXT:    li a4, 2
8878; RV64I-NEXT:    mv a0, s3
8879; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
8880; RV64I-NEXT:    lh a1, 6(sp)
8881; RV64I-NEXT:    bnez a0, .LBB103_4
8882; RV64I-NEXT:  .LBB103_2: # %atomicrmw.start
8883; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8884; RV64I-NEXT:    and a0, a1, s0
8885; RV64I-NEXT:    mv a2, a1
8886; RV64I-NEXT:    bltu s1, a0, .LBB103_1
8887; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8888; RV64I-NEXT:    # in Loop: Header=BB103_2 Depth=1
8889; RV64I-NEXT:    mv a2, s2
8890; RV64I-NEXT:    j .LBB103_1
8891; RV64I-NEXT:  .LBB103_4: # %atomicrmw.end
8892; RV64I-NEXT:    mv a0, a1
8893; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8894; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8895; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8896; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8897; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
8898; RV64I-NEXT:    addi sp, sp, 48
8899; RV64I-NEXT:    ret
8900;
8901; RV64IA-LABEL: atomicrmw_umax_i16_acq_rel:
8902; RV64IA:       # %bb.0:
8903; RV64IA-NEXT:    andi a6, a0, -4
8904; RV64IA-NEXT:    slliw a0, a0, 3
8905; RV64IA-NEXT:    lui a3, 16
8906; RV64IA-NEXT:    addiw a3, a3, -1
8907; RV64IA-NEXT:    sllw a4, a3, a0
8908; RV64IA-NEXT:    and a1, a1, a3
8909; RV64IA-NEXT:    sllw a1, a1, a0
8910; RV64IA-NEXT:  .LBB103_1: # =>This Inner Loop Header: Depth=1
8911; RV64IA-NEXT:    lr.w.aq a3, (a6)
8912; RV64IA-NEXT:    and a2, a3, a4
8913; RV64IA-NEXT:    mv a5, a3
8914; RV64IA-NEXT:    bgeu a2, a1, .LBB103_3
8915; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB103_1 Depth=1
8916; RV64IA-NEXT:    xor a5, a3, a1
8917; RV64IA-NEXT:    and a5, a5, a4
8918; RV64IA-NEXT:    xor a5, a3, a5
8919; RV64IA-NEXT:  .LBB103_3: # in Loop: Header=BB103_1 Depth=1
8920; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
8921; RV64IA-NEXT:    bnez a5, .LBB103_1
8922; RV64IA-NEXT:  # %bb.4:
8923; RV64IA-NEXT:    srlw a0, a3, a0
8924; RV64IA-NEXT:    ret
8925  %1 = atomicrmw umax i16* %a, i16 %b acq_rel
8926  ret i16 %1
8927}
8928
8929define i16 @atomicrmw_umax_i16_seq_cst(i16 *%a, i16 %b) nounwind {
8930; RV32I-LABEL: atomicrmw_umax_i16_seq_cst:
8931; RV32I:       # %bb.0:
8932; RV32I-NEXT:    addi sp, sp, -32
8933; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8934; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8935; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8936; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8937; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
8938; RV32I-NEXT:    mv s2, a1
8939; RV32I-NEXT:    mv s3, a0
8940; RV32I-NEXT:    lhu a1, 0(a0)
8941; RV32I-NEXT:    lui a0, 16
8942; RV32I-NEXT:    addi s0, a0, -1
8943; RV32I-NEXT:    and s1, s2, s0
8944; RV32I-NEXT:    j .LBB104_2
8945; RV32I-NEXT:  .LBB104_1: # %atomicrmw.start
8946; RV32I-NEXT:    # in Loop: Header=BB104_2 Depth=1
8947; RV32I-NEXT:    sh a1, 10(sp)
8948; RV32I-NEXT:    addi a1, sp, 10
8949; RV32I-NEXT:    li a3, 5
8950; RV32I-NEXT:    li a4, 5
8951; RV32I-NEXT:    mv a0, s3
8952; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
8953; RV32I-NEXT:    lh a1, 10(sp)
8954; RV32I-NEXT:    bnez a0, .LBB104_4
8955; RV32I-NEXT:  .LBB104_2: # %atomicrmw.start
8956; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8957; RV32I-NEXT:    and a0, a1, s0
8958; RV32I-NEXT:    mv a2, a1
8959; RV32I-NEXT:    bltu s1, a0, .LBB104_1
8960; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8961; RV32I-NEXT:    # in Loop: Header=BB104_2 Depth=1
8962; RV32I-NEXT:    mv a2, s2
8963; RV32I-NEXT:    j .LBB104_1
8964; RV32I-NEXT:  .LBB104_4: # %atomicrmw.end
8965; RV32I-NEXT:    mv a0, a1
8966; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8967; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8968; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8969; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8970; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
8971; RV32I-NEXT:    addi sp, sp, 32
8972; RV32I-NEXT:    ret
8973;
8974; RV32IA-LABEL: atomicrmw_umax_i16_seq_cst:
8975; RV32IA:       # %bb.0:
8976; RV32IA-NEXT:    andi a6, a0, -4
8977; RV32IA-NEXT:    slli a0, a0, 3
8978; RV32IA-NEXT:    lui a3, 16
8979; RV32IA-NEXT:    addi a3, a3, -1
8980; RV32IA-NEXT:    sll a4, a3, a0
8981; RV32IA-NEXT:    and a1, a1, a3
8982; RV32IA-NEXT:    sll a1, a1, a0
8983; RV32IA-NEXT:  .LBB104_1: # =>This Inner Loop Header: Depth=1
8984; RV32IA-NEXT:    lr.w.aqrl a3, (a6)
8985; RV32IA-NEXT:    and a2, a3, a4
8986; RV32IA-NEXT:    mv a5, a3
8987; RV32IA-NEXT:    bgeu a2, a1, .LBB104_3
8988; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB104_1 Depth=1
8989; RV32IA-NEXT:    xor a5, a3, a1
8990; RV32IA-NEXT:    and a5, a5, a4
8991; RV32IA-NEXT:    xor a5, a3, a5
8992; RV32IA-NEXT:  .LBB104_3: # in Loop: Header=BB104_1 Depth=1
8993; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a6)
8994; RV32IA-NEXT:    bnez a5, .LBB104_1
8995; RV32IA-NEXT:  # %bb.4:
8996; RV32IA-NEXT:    srl a0, a3, a0
8997; RV32IA-NEXT:    ret
8998;
8999; RV64I-LABEL: atomicrmw_umax_i16_seq_cst:
9000; RV64I:       # %bb.0:
9001; RV64I-NEXT:    addi sp, sp, -48
9002; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9003; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9004; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9005; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9006; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9007; RV64I-NEXT:    mv s2, a1
9008; RV64I-NEXT:    mv s3, a0
9009; RV64I-NEXT:    lhu a1, 0(a0)
9010; RV64I-NEXT:    lui a0, 16
9011; RV64I-NEXT:    addiw s0, a0, -1
9012; RV64I-NEXT:    and s1, s2, s0
9013; RV64I-NEXT:    j .LBB104_2
9014; RV64I-NEXT:  .LBB104_1: # %atomicrmw.start
9015; RV64I-NEXT:    # in Loop: Header=BB104_2 Depth=1
9016; RV64I-NEXT:    sh a1, 6(sp)
9017; RV64I-NEXT:    addi a1, sp, 6
9018; RV64I-NEXT:    li a3, 5
9019; RV64I-NEXT:    li a4, 5
9020; RV64I-NEXT:    mv a0, s3
9021; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9022; RV64I-NEXT:    lh a1, 6(sp)
9023; RV64I-NEXT:    bnez a0, .LBB104_4
9024; RV64I-NEXT:  .LBB104_2: # %atomicrmw.start
9025; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9026; RV64I-NEXT:    and a0, a1, s0
9027; RV64I-NEXT:    mv a2, a1
9028; RV64I-NEXT:    bltu s1, a0, .LBB104_1
9029; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9030; RV64I-NEXT:    # in Loop: Header=BB104_2 Depth=1
9031; RV64I-NEXT:    mv a2, s2
9032; RV64I-NEXT:    j .LBB104_1
9033; RV64I-NEXT:  .LBB104_4: # %atomicrmw.end
9034; RV64I-NEXT:    mv a0, a1
9035; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9036; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9037; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9038; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9039; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9040; RV64I-NEXT:    addi sp, sp, 48
9041; RV64I-NEXT:    ret
9042;
9043; RV64IA-LABEL: atomicrmw_umax_i16_seq_cst:
9044; RV64IA:       # %bb.0:
9045; RV64IA-NEXT:    andi a6, a0, -4
9046; RV64IA-NEXT:    slliw a0, a0, 3
9047; RV64IA-NEXT:    lui a3, 16
9048; RV64IA-NEXT:    addiw a3, a3, -1
9049; RV64IA-NEXT:    sllw a4, a3, a0
9050; RV64IA-NEXT:    and a1, a1, a3
9051; RV64IA-NEXT:    sllw a1, a1, a0
9052; RV64IA-NEXT:  .LBB104_1: # =>This Inner Loop Header: Depth=1
9053; RV64IA-NEXT:    lr.w.aqrl a3, (a6)
9054; RV64IA-NEXT:    and a2, a3, a4
9055; RV64IA-NEXT:    mv a5, a3
9056; RV64IA-NEXT:    bgeu a2, a1, .LBB104_3
9057; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB104_1 Depth=1
9058; RV64IA-NEXT:    xor a5, a3, a1
9059; RV64IA-NEXT:    and a5, a5, a4
9060; RV64IA-NEXT:    xor a5, a3, a5
9061; RV64IA-NEXT:  .LBB104_3: # in Loop: Header=BB104_1 Depth=1
9062; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a6)
9063; RV64IA-NEXT:    bnez a5, .LBB104_1
9064; RV64IA-NEXT:  # %bb.4:
9065; RV64IA-NEXT:    srlw a0, a3, a0
9066; RV64IA-NEXT:    ret
9067  %1 = atomicrmw umax i16* %a, i16 %b seq_cst
9068  ret i16 %1
9069}
9070
9071define i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind {
9072; RV32I-LABEL: atomicrmw_umin_i16_monotonic:
9073; RV32I:       # %bb.0:
9074; RV32I-NEXT:    addi sp, sp, -32
9075; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9076; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9077; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9078; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9079; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9080; RV32I-NEXT:    mv s2, a1
9081; RV32I-NEXT:    mv s3, a0
9082; RV32I-NEXT:    lhu a1, 0(a0)
9083; RV32I-NEXT:    lui a0, 16
9084; RV32I-NEXT:    addi s0, a0, -1
9085; RV32I-NEXT:    and s1, s2, s0
9086; RV32I-NEXT:    j .LBB105_2
9087; RV32I-NEXT:  .LBB105_1: # %atomicrmw.start
9088; RV32I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9089; RV32I-NEXT:    sh a1, 10(sp)
9090; RV32I-NEXT:    addi a1, sp, 10
9091; RV32I-NEXT:    mv a0, s3
9092; RV32I-NEXT:    li a3, 0
9093; RV32I-NEXT:    li a4, 0
9094; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9095; RV32I-NEXT:    lh a1, 10(sp)
9096; RV32I-NEXT:    bnez a0, .LBB105_4
9097; RV32I-NEXT:  .LBB105_2: # %atomicrmw.start
9098; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9099; RV32I-NEXT:    and a0, a1, s0
9100; RV32I-NEXT:    mv a2, a1
9101; RV32I-NEXT:    bgeu s1, a0, .LBB105_1
9102; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9103; RV32I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9104; RV32I-NEXT:    mv a2, s2
9105; RV32I-NEXT:    j .LBB105_1
9106; RV32I-NEXT:  .LBB105_4: # %atomicrmw.end
9107; RV32I-NEXT:    mv a0, a1
9108; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9109; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9110; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9111; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9112; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9113; RV32I-NEXT:    addi sp, sp, 32
9114; RV32I-NEXT:    ret
9115;
9116; RV32IA-LABEL: atomicrmw_umin_i16_monotonic:
9117; RV32IA:       # %bb.0:
9118; RV32IA-NEXT:    andi a6, a0, -4
9119; RV32IA-NEXT:    slli a0, a0, 3
9120; RV32IA-NEXT:    lui a3, 16
9121; RV32IA-NEXT:    addi a3, a3, -1
9122; RV32IA-NEXT:    sll a4, a3, a0
9123; RV32IA-NEXT:    and a1, a1, a3
9124; RV32IA-NEXT:    sll a1, a1, a0
9125; RV32IA-NEXT:  .LBB105_1: # =>This Inner Loop Header: Depth=1
9126; RV32IA-NEXT:    lr.w a3, (a6)
9127; RV32IA-NEXT:    and a2, a3, a4
9128; RV32IA-NEXT:    mv a5, a3
9129; RV32IA-NEXT:    bgeu a1, a2, .LBB105_3
9130; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB105_1 Depth=1
9131; RV32IA-NEXT:    xor a5, a3, a1
9132; RV32IA-NEXT:    and a5, a5, a4
9133; RV32IA-NEXT:    xor a5, a3, a5
9134; RV32IA-NEXT:  .LBB105_3: # in Loop: Header=BB105_1 Depth=1
9135; RV32IA-NEXT:    sc.w a5, a5, (a6)
9136; RV32IA-NEXT:    bnez a5, .LBB105_1
9137; RV32IA-NEXT:  # %bb.4:
9138; RV32IA-NEXT:    srl a0, a3, a0
9139; RV32IA-NEXT:    ret
9140;
9141; RV64I-LABEL: atomicrmw_umin_i16_monotonic:
9142; RV64I:       # %bb.0:
9143; RV64I-NEXT:    addi sp, sp, -48
9144; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9145; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9146; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9147; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9148; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9149; RV64I-NEXT:    mv s2, a1
9150; RV64I-NEXT:    mv s3, a0
9151; RV64I-NEXT:    lhu a1, 0(a0)
9152; RV64I-NEXT:    lui a0, 16
9153; RV64I-NEXT:    addiw s0, a0, -1
9154; RV64I-NEXT:    and s1, s2, s0
9155; RV64I-NEXT:    j .LBB105_2
9156; RV64I-NEXT:  .LBB105_1: # %atomicrmw.start
9157; RV64I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9158; RV64I-NEXT:    sh a1, 6(sp)
9159; RV64I-NEXT:    addi a1, sp, 6
9160; RV64I-NEXT:    mv a0, s3
9161; RV64I-NEXT:    li a3, 0
9162; RV64I-NEXT:    li a4, 0
9163; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9164; RV64I-NEXT:    lh a1, 6(sp)
9165; RV64I-NEXT:    bnez a0, .LBB105_4
9166; RV64I-NEXT:  .LBB105_2: # %atomicrmw.start
9167; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9168; RV64I-NEXT:    and a0, a1, s0
9169; RV64I-NEXT:    mv a2, a1
9170; RV64I-NEXT:    bgeu s1, a0, .LBB105_1
9171; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9172; RV64I-NEXT:    # in Loop: Header=BB105_2 Depth=1
9173; RV64I-NEXT:    mv a2, s2
9174; RV64I-NEXT:    j .LBB105_1
9175; RV64I-NEXT:  .LBB105_4: # %atomicrmw.end
9176; RV64I-NEXT:    mv a0, a1
9177; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9178; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9179; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9180; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9181; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9182; RV64I-NEXT:    addi sp, sp, 48
9183; RV64I-NEXT:    ret
9184;
9185; RV64IA-LABEL: atomicrmw_umin_i16_monotonic:
9186; RV64IA:       # %bb.0:
9187; RV64IA-NEXT:    andi a6, a0, -4
9188; RV64IA-NEXT:    slliw a0, a0, 3
9189; RV64IA-NEXT:    lui a3, 16
9190; RV64IA-NEXT:    addiw a3, a3, -1
9191; RV64IA-NEXT:    sllw a4, a3, a0
9192; RV64IA-NEXT:    and a1, a1, a3
9193; RV64IA-NEXT:    sllw a1, a1, a0
9194; RV64IA-NEXT:  .LBB105_1: # =>This Inner Loop Header: Depth=1
9195; RV64IA-NEXT:    lr.w a3, (a6)
9196; RV64IA-NEXT:    and a2, a3, a4
9197; RV64IA-NEXT:    mv a5, a3
9198; RV64IA-NEXT:    bgeu a1, a2, .LBB105_3
9199; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB105_1 Depth=1
9200; RV64IA-NEXT:    xor a5, a3, a1
9201; RV64IA-NEXT:    and a5, a5, a4
9202; RV64IA-NEXT:    xor a5, a3, a5
9203; RV64IA-NEXT:  .LBB105_3: # in Loop: Header=BB105_1 Depth=1
9204; RV64IA-NEXT:    sc.w a5, a5, (a6)
9205; RV64IA-NEXT:    bnez a5, .LBB105_1
9206; RV64IA-NEXT:  # %bb.4:
9207; RV64IA-NEXT:    srlw a0, a3, a0
9208; RV64IA-NEXT:    ret
9209  %1 = atomicrmw umin i16* %a, i16 %b monotonic
9210  ret i16 %1
9211}
9212
9213define i16 @atomicrmw_umin_i16_acquire(i16 *%a, i16 %b) nounwind {
9214; RV32I-LABEL: atomicrmw_umin_i16_acquire:
9215; RV32I:       # %bb.0:
9216; RV32I-NEXT:    addi sp, sp, -32
9217; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9218; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9219; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9220; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9221; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9222; RV32I-NEXT:    mv s2, a1
9223; RV32I-NEXT:    mv s3, a0
9224; RV32I-NEXT:    lhu a1, 0(a0)
9225; RV32I-NEXT:    lui a0, 16
9226; RV32I-NEXT:    addi s0, a0, -1
9227; RV32I-NEXT:    and s1, s2, s0
9228; RV32I-NEXT:    j .LBB106_2
9229; RV32I-NEXT:  .LBB106_1: # %atomicrmw.start
9230; RV32I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9231; RV32I-NEXT:    sh a1, 10(sp)
9232; RV32I-NEXT:    addi a1, sp, 10
9233; RV32I-NEXT:    li a3, 2
9234; RV32I-NEXT:    li a4, 2
9235; RV32I-NEXT:    mv a0, s3
9236; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9237; RV32I-NEXT:    lh a1, 10(sp)
9238; RV32I-NEXT:    bnez a0, .LBB106_4
9239; RV32I-NEXT:  .LBB106_2: # %atomicrmw.start
9240; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9241; RV32I-NEXT:    and a0, a1, s0
9242; RV32I-NEXT:    mv a2, a1
9243; RV32I-NEXT:    bgeu s1, a0, .LBB106_1
9244; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9245; RV32I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9246; RV32I-NEXT:    mv a2, s2
9247; RV32I-NEXT:    j .LBB106_1
9248; RV32I-NEXT:  .LBB106_4: # %atomicrmw.end
9249; RV32I-NEXT:    mv a0, a1
9250; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9251; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9252; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9253; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9254; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9255; RV32I-NEXT:    addi sp, sp, 32
9256; RV32I-NEXT:    ret
9257;
9258; RV32IA-LABEL: atomicrmw_umin_i16_acquire:
9259; RV32IA:       # %bb.0:
9260; RV32IA-NEXT:    andi a6, a0, -4
9261; RV32IA-NEXT:    slli a0, a0, 3
9262; RV32IA-NEXT:    lui a3, 16
9263; RV32IA-NEXT:    addi a3, a3, -1
9264; RV32IA-NEXT:    sll a4, a3, a0
9265; RV32IA-NEXT:    and a1, a1, a3
9266; RV32IA-NEXT:    sll a1, a1, a0
9267; RV32IA-NEXT:  .LBB106_1: # =>This Inner Loop Header: Depth=1
9268; RV32IA-NEXT:    lr.w.aq a3, (a6)
9269; RV32IA-NEXT:    and a2, a3, a4
9270; RV32IA-NEXT:    mv a5, a3
9271; RV32IA-NEXT:    bgeu a1, a2, .LBB106_3
9272; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB106_1 Depth=1
9273; RV32IA-NEXT:    xor a5, a3, a1
9274; RV32IA-NEXT:    and a5, a5, a4
9275; RV32IA-NEXT:    xor a5, a3, a5
9276; RV32IA-NEXT:  .LBB106_3: # in Loop: Header=BB106_1 Depth=1
9277; RV32IA-NEXT:    sc.w a5, a5, (a6)
9278; RV32IA-NEXT:    bnez a5, .LBB106_1
9279; RV32IA-NEXT:  # %bb.4:
9280; RV32IA-NEXT:    srl a0, a3, a0
9281; RV32IA-NEXT:    ret
9282;
9283; RV64I-LABEL: atomicrmw_umin_i16_acquire:
9284; RV64I:       # %bb.0:
9285; RV64I-NEXT:    addi sp, sp, -48
9286; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9287; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9288; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9289; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9290; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9291; RV64I-NEXT:    mv s2, a1
9292; RV64I-NEXT:    mv s3, a0
9293; RV64I-NEXT:    lhu a1, 0(a0)
9294; RV64I-NEXT:    lui a0, 16
9295; RV64I-NEXT:    addiw s0, a0, -1
9296; RV64I-NEXT:    and s1, s2, s0
9297; RV64I-NEXT:    j .LBB106_2
9298; RV64I-NEXT:  .LBB106_1: # %atomicrmw.start
9299; RV64I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9300; RV64I-NEXT:    sh a1, 6(sp)
9301; RV64I-NEXT:    addi a1, sp, 6
9302; RV64I-NEXT:    li a3, 2
9303; RV64I-NEXT:    li a4, 2
9304; RV64I-NEXT:    mv a0, s3
9305; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9306; RV64I-NEXT:    lh a1, 6(sp)
9307; RV64I-NEXT:    bnez a0, .LBB106_4
9308; RV64I-NEXT:  .LBB106_2: # %atomicrmw.start
9309; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9310; RV64I-NEXT:    and a0, a1, s0
9311; RV64I-NEXT:    mv a2, a1
9312; RV64I-NEXT:    bgeu s1, a0, .LBB106_1
9313; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9314; RV64I-NEXT:    # in Loop: Header=BB106_2 Depth=1
9315; RV64I-NEXT:    mv a2, s2
9316; RV64I-NEXT:    j .LBB106_1
9317; RV64I-NEXT:  .LBB106_4: # %atomicrmw.end
9318; RV64I-NEXT:    mv a0, a1
9319; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9320; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9321; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9322; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9323; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9324; RV64I-NEXT:    addi sp, sp, 48
9325; RV64I-NEXT:    ret
9326;
9327; RV64IA-LABEL: atomicrmw_umin_i16_acquire:
9328; RV64IA:       # %bb.0:
9329; RV64IA-NEXT:    andi a6, a0, -4
9330; RV64IA-NEXT:    slliw a0, a0, 3
9331; RV64IA-NEXT:    lui a3, 16
9332; RV64IA-NEXT:    addiw a3, a3, -1
9333; RV64IA-NEXT:    sllw a4, a3, a0
9334; RV64IA-NEXT:    and a1, a1, a3
9335; RV64IA-NEXT:    sllw a1, a1, a0
9336; RV64IA-NEXT:  .LBB106_1: # =>This Inner Loop Header: Depth=1
9337; RV64IA-NEXT:    lr.w.aq a3, (a6)
9338; RV64IA-NEXT:    and a2, a3, a4
9339; RV64IA-NEXT:    mv a5, a3
9340; RV64IA-NEXT:    bgeu a1, a2, .LBB106_3
9341; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB106_1 Depth=1
9342; RV64IA-NEXT:    xor a5, a3, a1
9343; RV64IA-NEXT:    and a5, a5, a4
9344; RV64IA-NEXT:    xor a5, a3, a5
9345; RV64IA-NEXT:  .LBB106_3: # in Loop: Header=BB106_1 Depth=1
9346; RV64IA-NEXT:    sc.w a5, a5, (a6)
9347; RV64IA-NEXT:    bnez a5, .LBB106_1
9348; RV64IA-NEXT:  # %bb.4:
9349; RV64IA-NEXT:    srlw a0, a3, a0
9350; RV64IA-NEXT:    ret
9351  %1 = atomicrmw umin i16* %a, i16 %b acquire
9352  ret i16 %1
9353}
9354
9355define i16 @atomicrmw_umin_i16_release(i16 *%a, i16 %b) nounwind {
9356; RV32I-LABEL: atomicrmw_umin_i16_release:
9357; RV32I:       # %bb.0:
9358; RV32I-NEXT:    addi sp, sp, -32
9359; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9360; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9361; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9362; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9363; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9364; RV32I-NEXT:    mv s2, a1
9365; RV32I-NEXT:    mv s3, a0
9366; RV32I-NEXT:    lhu a1, 0(a0)
9367; RV32I-NEXT:    lui a0, 16
9368; RV32I-NEXT:    addi s0, a0, -1
9369; RV32I-NEXT:    and s1, s2, s0
9370; RV32I-NEXT:    j .LBB107_2
9371; RV32I-NEXT:  .LBB107_1: # %atomicrmw.start
9372; RV32I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9373; RV32I-NEXT:    sh a1, 10(sp)
9374; RV32I-NEXT:    addi a1, sp, 10
9375; RV32I-NEXT:    li a3, 3
9376; RV32I-NEXT:    mv a0, s3
9377; RV32I-NEXT:    li a4, 0
9378; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9379; RV32I-NEXT:    lh a1, 10(sp)
9380; RV32I-NEXT:    bnez a0, .LBB107_4
9381; RV32I-NEXT:  .LBB107_2: # %atomicrmw.start
9382; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9383; RV32I-NEXT:    and a0, a1, s0
9384; RV32I-NEXT:    mv a2, a1
9385; RV32I-NEXT:    bgeu s1, a0, .LBB107_1
9386; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9387; RV32I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9388; RV32I-NEXT:    mv a2, s2
9389; RV32I-NEXT:    j .LBB107_1
9390; RV32I-NEXT:  .LBB107_4: # %atomicrmw.end
9391; RV32I-NEXT:    mv a0, a1
9392; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9393; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9394; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9395; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9396; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9397; RV32I-NEXT:    addi sp, sp, 32
9398; RV32I-NEXT:    ret
9399;
9400; RV32IA-LABEL: atomicrmw_umin_i16_release:
9401; RV32IA:       # %bb.0:
9402; RV32IA-NEXT:    andi a6, a0, -4
9403; RV32IA-NEXT:    slli a0, a0, 3
9404; RV32IA-NEXT:    lui a3, 16
9405; RV32IA-NEXT:    addi a3, a3, -1
9406; RV32IA-NEXT:    sll a4, a3, a0
9407; RV32IA-NEXT:    and a1, a1, a3
9408; RV32IA-NEXT:    sll a1, a1, a0
9409; RV32IA-NEXT:  .LBB107_1: # =>This Inner Loop Header: Depth=1
9410; RV32IA-NEXT:    lr.w a3, (a6)
9411; RV32IA-NEXT:    and a2, a3, a4
9412; RV32IA-NEXT:    mv a5, a3
9413; RV32IA-NEXT:    bgeu a1, a2, .LBB107_3
9414; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB107_1 Depth=1
9415; RV32IA-NEXT:    xor a5, a3, a1
9416; RV32IA-NEXT:    and a5, a5, a4
9417; RV32IA-NEXT:    xor a5, a3, a5
9418; RV32IA-NEXT:  .LBB107_3: # in Loop: Header=BB107_1 Depth=1
9419; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
9420; RV32IA-NEXT:    bnez a5, .LBB107_1
9421; RV32IA-NEXT:  # %bb.4:
9422; RV32IA-NEXT:    srl a0, a3, a0
9423; RV32IA-NEXT:    ret
9424;
9425; RV64I-LABEL: atomicrmw_umin_i16_release:
9426; RV64I:       # %bb.0:
9427; RV64I-NEXT:    addi sp, sp, -48
9428; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9429; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9430; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9431; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9432; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9433; RV64I-NEXT:    mv s2, a1
9434; RV64I-NEXT:    mv s3, a0
9435; RV64I-NEXT:    lhu a1, 0(a0)
9436; RV64I-NEXT:    lui a0, 16
9437; RV64I-NEXT:    addiw s0, a0, -1
9438; RV64I-NEXT:    and s1, s2, s0
9439; RV64I-NEXT:    j .LBB107_2
9440; RV64I-NEXT:  .LBB107_1: # %atomicrmw.start
9441; RV64I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9442; RV64I-NEXT:    sh a1, 6(sp)
9443; RV64I-NEXT:    addi a1, sp, 6
9444; RV64I-NEXT:    li a3, 3
9445; RV64I-NEXT:    mv a0, s3
9446; RV64I-NEXT:    li a4, 0
9447; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9448; RV64I-NEXT:    lh a1, 6(sp)
9449; RV64I-NEXT:    bnez a0, .LBB107_4
9450; RV64I-NEXT:  .LBB107_2: # %atomicrmw.start
9451; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9452; RV64I-NEXT:    and a0, a1, s0
9453; RV64I-NEXT:    mv a2, a1
9454; RV64I-NEXT:    bgeu s1, a0, .LBB107_1
9455; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9456; RV64I-NEXT:    # in Loop: Header=BB107_2 Depth=1
9457; RV64I-NEXT:    mv a2, s2
9458; RV64I-NEXT:    j .LBB107_1
9459; RV64I-NEXT:  .LBB107_4: # %atomicrmw.end
9460; RV64I-NEXT:    mv a0, a1
9461; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9462; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9463; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9464; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9465; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9466; RV64I-NEXT:    addi sp, sp, 48
9467; RV64I-NEXT:    ret
9468;
9469; RV64IA-LABEL: atomicrmw_umin_i16_release:
9470; RV64IA:       # %bb.0:
9471; RV64IA-NEXT:    andi a6, a0, -4
9472; RV64IA-NEXT:    slliw a0, a0, 3
9473; RV64IA-NEXT:    lui a3, 16
9474; RV64IA-NEXT:    addiw a3, a3, -1
9475; RV64IA-NEXT:    sllw a4, a3, a0
9476; RV64IA-NEXT:    and a1, a1, a3
9477; RV64IA-NEXT:    sllw a1, a1, a0
9478; RV64IA-NEXT:  .LBB107_1: # =>This Inner Loop Header: Depth=1
9479; RV64IA-NEXT:    lr.w a3, (a6)
9480; RV64IA-NEXT:    and a2, a3, a4
9481; RV64IA-NEXT:    mv a5, a3
9482; RV64IA-NEXT:    bgeu a1, a2, .LBB107_3
9483; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB107_1 Depth=1
9484; RV64IA-NEXT:    xor a5, a3, a1
9485; RV64IA-NEXT:    and a5, a5, a4
9486; RV64IA-NEXT:    xor a5, a3, a5
9487; RV64IA-NEXT:  .LBB107_3: # in Loop: Header=BB107_1 Depth=1
9488; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
9489; RV64IA-NEXT:    bnez a5, .LBB107_1
9490; RV64IA-NEXT:  # %bb.4:
9491; RV64IA-NEXT:    srlw a0, a3, a0
9492; RV64IA-NEXT:    ret
9493  %1 = atomicrmw umin i16* %a, i16 %b release
9494  ret i16 %1
9495}
9496
9497define i16 @atomicrmw_umin_i16_acq_rel(i16 *%a, i16 %b) nounwind {
9498; RV32I-LABEL: atomicrmw_umin_i16_acq_rel:
9499; RV32I:       # %bb.0:
9500; RV32I-NEXT:    addi sp, sp, -32
9501; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9502; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9503; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9504; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9505; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9506; RV32I-NEXT:    mv s2, a1
9507; RV32I-NEXT:    mv s3, a0
9508; RV32I-NEXT:    lhu a1, 0(a0)
9509; RV32I-NEXT:    lui a0, 16
9510; RV32I-NEXT:    addi s0, a0, -1
9511; RV32I-NEXT:    and s1, s2, s0
9512; RV32I-NEXT:    j .LBB108_2
9513; RV32I-NEXT:  .LBB108_1: # %atomicrmw.start
9514; RV32I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9515; RV32I-NEXT:    sh a1, 10(sp)
9516; RV32I-NEXT:    addi a1, sp, 10
9517; RV32I-NEXT:    li a3, 4
9518; RV32I-NEXT:    li a4, 2
9519; RV32I-NEXT:    mv a0, s3
9520; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9521; RV32I-NEXT:    lh a1, 10(sp)
9522; RV32I-NEXT:    bnez a0, .LBB108_4
9523; RV32I-NEXT:  .LBB108_2: # %atomicrmw.start
9524; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9525; RV32I-NEXT:    and a0, a1, s0
9526; RV32I-NEXT:    mv a2, a1
9527; RV32I-NEXT:    bgeu s1, a0, .LBB108_1
9528; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9529; RV32I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9530; RV32I-NEXT:    mv a2, s2
9531; RV32I-NEXT:    j .LBB108_1
9532; RV32I-NEXT:  .LBB108_4: # %atomicrmw.end
9533; RV32I-NEXT:    mv a0, a1
9534; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9535; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9536; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9537; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9538; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9539; RV32I-NEXT:    addi sp, sp, 32
9540; RV32I-NEXT:    ret
9541;
9542; RV32IA-LABEL: atomicrmw_umin_i16_acq_rel:
9543; RV32IA:       # %bb.0:
9544; RV32IA-NEXT:    andi a6, a0, -4
9545; RV32IA-NEXT:    slli a0, a0, 3
9546; RV32IA-NEXT:    lui a3, 16
9547; RV32IA-NEXT:    addi a3, a3, -1
9548; RV32IA-NEXT:    sll a4, a3, a0
9549; RV32IA-NEXT:    and a1, a1, a3
9550; RV32IA-NEXT:    sll a1, a1, a0
9551; RV32IA-NEXT:  .LBB108_1: # =>This Inner Loop Header: Depth=1
9552; RV32IA-NEXT:    lr.w.aq a3, (a6)
9553; RV32IA-NEXT:    and a2, a3, a4
9554; RV32IA-NEXT:    mv a5, a3
9555; RV32IA-NEXT:    bgeu a1, a2, .LBB108_3
9556; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB108_1 Depth=1
9557; RV32IA-NEXT:    xor a5, a3, a1
9558; RV32IA-NEXT:    and a5, a5, a4
9559; RV32IA-NEXT:    xor a5, a3, a5
9560; RV32IA-NEXT:  .LBB108_3: # in Loop: Header=BB108_1 Depth=1
9561; RV32IA-NEXT:    sc.w.rl a5, a5, (a6)
9562; RV32IA-NEXT:    bnez a5, .LBB108_1
9563; RV32IA-NEXT:  # %bb.4:
9564; RV32IA-NEXT:    srl a0, a3, a0
9565; RV32IA-NEXT:    ret
9566;
9567; RV64I-LABEL: atomicrmw_umin_i16_acq_rel:
9568; RV64I:       # %bb.0:
9569; RV64I-NEXT:    addi sp, sp, -48
9570; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9571; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9572; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9573; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9574; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9575; RV64I-NEXT:    mv s2, a1
9576; RV64I-NEXT:    mv s3, a0
9577; RV64I-NEXT:    lhu a1, 0(a0)
9578; RV64I-NEXT:    lui a0, 16
9579; RV64I-NEXT:    addiw s0, a0, -1
9580; RV64I-NEXT:    and s1, s2, s0
9581; RV64I-NEXT:    j .LBB108_2
9582; RV64I-NEXT:  .LBB108_1: # %atomicrmw.start
9583; RV64I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9584; RV64I-NEXT:    sh a1, 6(sp)
9585; RV64I-NEXT:    addi a1, sp, 6
9586; RV64I-NEXT:    li a3, 4
9587; RV64I-NEXT:    li a4, 2
9588; RV64I-NEXT:    mv a0, s3
9589; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9590; RV64I-NEXT:    lh a1, 6(sp)
9591; RV64I-NEXT:    bnez a0, .LBB108_4
9592; RV64I-NEXT:  .LBB108_2: # %atomicrmw.start
9593; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9594; RV64I-NEXT:    and a0, a1, s0
9595; RV64I-NEXT:    mv a2, a1
9596; RV64I-NEXT:    bgeu s1, a0, .LBB108_1
9597; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9598; RV64I-NEXT:    # in Loop: Header=BB108_2 Depth=1
9599; RV64I-NEXT:    mv a2, s2
9600; RV64I-NEXT:    j .LBB108_1
9601; RV64I-NEXT:  .LBB108_4: # %atomicrmw.end
9602; RV64I-NEXT:    mv a0, a1
9603; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9604; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9605; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9606; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9607; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9608; RV64I-NEXT:    addi sp, sp, 48
9609; RV64I-NEXT:    ret
9610;
9611; RV64IA-LABEL: atomicrmw_umin_i16_acq_rel:
9612; RV64IA:       # %bb.0:
9613; RV64IA-NEXT:    andi a6, a0, -4
9614; RV64IA-NEXT:    slliw a0, a0, 3
9615; RV64IA-NEXT:    lui a3, 16
9616; RV64IA-NEXT:    addiw a3, a3, -1
9617; RV64IA-NEXT:    sllw a4, a3, a0
9618; RV64IA-NEXT:    and a1, a1, a3
9619; RV64IA-NEXT:    sllw a1, a1, a0
9620; RV64IA-NEXT:  .LBB108_1: # =>This Inner Loop Header: Depth=1
9621; RV64IA-NEXT:    lr.w.aq a3, (a6)
9622; RV64IA-NEXT:    and a2, a3, a4
9623; RV64IA-NEXT:    mv a5, a3
9624; RV64IA-NEXT:    bgeu a1, a2, .LBB108_3
9625; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB108_1 Depth=1
9626; RV64IA-NEXT:    xor a5, a3, a1
9627; RV64IA-NEXT:    and a5, a5, a4
9628; RV64IA-NEXT:    xor a5, a3, a5
9629; RV64IA-NEXT:  .LBB108_3: # in Loop: Header=BB108_1 Depth=1
9630; RV64IA-NEXT:    sc.w.rl a5, a5, (a6)
9631; RV64IA-NEXT:    bnez a5, .LBB108_1
9632; RV64IA-NEXT:  # %bb.4:
9633; RV64IA-NEXT:    srlw a0, a3, a0
9634; RV64IA-NEXT:    ret
9635  %1 = atomicrmw umin i16* %a, i16 %b acq_rel
9636  ret i16 %1
9637}
9638
9639define i16 @atomicrmw_umin_i16_seq_cst(i16 *%a, i16 %b) nounwind {
9640; RV32I-LABEL: atomicrmw_umin_i16_seq_cst:
9641; RV32I:       # %bb.0:
9642; RV32I-NEXT:    addi sp, sp, -32
9643; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9644; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9645; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9646; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9647; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
9648; RV32I-NEXT:    mv s2, a1
9649; RV32I-NEXT:    mv s3, a0
9650; RV32I-NEXT:    lhu a1, 0(a0)
9651; RV32I-NEXT:    lui a0, 16
9652; RV32I-NEXT:    addi s0, a0, -1
9653; RV32I-NEXT:    and s1, s2, s0
9654; RV32I-NEXT:    j .LBB109_2
9655; RV32I-NEXT:  .LBB109_1: # %atomicrmw.start
9656; RV32I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9657; RV32I-NEXT:    sh a1, 10(sp)
9658; RV32I-NEXT:    addi a1, sp, 10
9659; RV32I-NEXT:    li a3, 5
9660; RV32I-NEXT:    li a4, 5
9661; RV32I-NEXT:    mv a0, s3
9662; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
9663; RV32I-NEXT:    lh a1, 10(sp)
9664; RV32I-NEXT:    bnez a0, .LBB109_4
9665; RV32I-NEXT:  .LBB109_2: # %atomicrmw.start
9666; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9667; RV32I-NEXT:    and a0, a1, s0
9668; RV32I-NEXT:    mv a2, a1
9669; RV32I-NEXT:    bgeu s1, a0, .LBB109_1
9670; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9671; RV32I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9672; RV32I-NEXT:    mv a2, s2
9673; RV32I-NEXT:    j .LBB109_1
9674; RV32I-NEXT:  .LBB109_4: # %atomicrmw.end
9675; RV32I-NEXT:    mv a0, a1
9676; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9677; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9678; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9679; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9680; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
9681; RV32I-NEXT:    addi sp, sp, 32
9682; RV32I-NEXT:    ret
9683;
9684; RV32IA-LABEL: atomicrmw_umin_i16_seq_cst:
9685; RV32IA:       # %bb.0:
9686; RV32IA-NEXT:    andi a6, a0, -4
9687; RV32IA-NEXT:    slli a0, a0, 3
9688; RV32IA-NEXT:    lui a3, 16
9689; RV32IA-NEXT:    addi a3, a3, -1
9690; RV32IA-NEXT:    sll a4, a3, a0
9691; RV32IA-NEXT:    and a1, a1, a3
9692; RV32IA-NEXT:    sll a1, a1, a0
9693; RV32IA-NEXT:  .LBB109_1: # =>This Inner Loop Header: Depth=1
9694; RV32IA-NEXT:    lr.w.aqrl a3, (a6)
9695; RV32IA-NEXT:    and a2, a3, a4
9696; RV32IA-NEXT:    mv a5, a3
9697; RV32IA-NEXT:    bgeu a1, a2, .LBB109_3
9698; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB109_1 Depth=1
9699; RV32IA-NEXT:    xor a5, a3, a1
9700; RV32IA-NEXT:    and a5, a5, a4
9701; RV32IA-NEXT:    xor a5, a3, a5
9702; RV32IA-NEXT:  .LBB109_3: # in Loop: Header=BB109_1 Depth=1
9703; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a6)
9704; RV32IA-NEXT:    bnez a5, .LBB109_1
9705; RV32IA-NEXT:  # %bb.4:
9706; RV32IA-NEXT:    srl a0, a3, a0
9707; RV32IA-NEXT:    ret
9708;
9709; RV64I-LABEL: atomicrmw_umin_i16_seq_cst:
9710; RV64I:       # %bb.0:
9711; RV64I-NEXT:    addi sp, sp, -48
9712; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9713; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9714; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9715; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9716; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
9717; RV64I-NEXT:    mv s2, a1
9718; RV64I-NEXT:    mv s3, a0
9719; RV64I-NEXT:    lhu a1, 0(a0)
9720; RV64I-NEXT:    lui a0, 16
9721; RV64I-NEXT:    addiw s0, a0, -1
9722; RV64I-NEXT:    and s1, s2, s0
9723; RV64I-NEXT:    j .LBB109_2
9724; RV64I-NEXT:  .LBB109_1: # %atomicrmw.start
9725; RV64I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9726; RV64I-NEXT:    sh a1, 6(sp)
9727; RV64I-NEXT:    addi a1, sp, 6
9728; RV64I-NEXT:    li a3, 5
9729; RV64I-NEXT:    li a4, 5
9730; RV64I-NEXT:    mv a0, s3
9731; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
9732; RV64I-NEXT:    lh a1, 6(sp)
9733; RV64I-NEXT:    bnez a0, .LBB109_4
9734; RV64I-NEXT:  .LBB109_2: # %atomicrmw.start
9735; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9736; RV64I-NEXT:    and a0, a1, s0
9737; RV64I-NEXT:    mv a2, a1
9738; RV64I-NEXT:    bgeu s1, a0, .LBB109_1
9739; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9740; RV64I-NEXT:    # in Loop: Header=BB109_2 Depth=1
9741; RV64I-NEXT:    mv a2, s2
9742; RV64I-NEXT:    j .LBB109_1
9743; RV64I-NEXT:  .LBB109_4: # %atomicrmw.end
9744; RV64I-NEXT:    mv a0, a1
9745; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9746; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9747; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9748; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9749; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
9750; RV64I-NEXT:    addi sp, sp, 48
9751; RV64I-NEXT:    ret
9752;
9753; RV64IA-LABEL: atomicrmw_umin_i16_seq_cst:
9754; RV64IA:       # %bb.0:
9755; RV64IA-NEXT:    andi a6, a0, -4
9756; RV64IA-NEXT:    slliw a0, a0, 3
9757; RV64IA-NEXT:    lui a3, 16
9758; RV64IA-NEXT:    addiw a3, a3, -1
9759; RV64IA-NEXT:    sllw a4, a3, a0
9760; RV64IA-NEXT:    and a1, a1, a3
9761; RV64IA-NEXT:    sllw a1, a1, a0
9762; RV64IA-NEXT:  .LBB109_1: # =>This Inner Loop Header: Depth=1
9763; RV64IA-NEXT:    lr.w.aqrl a3, (a6)
9764; RV64IA-NEXT:    and a2, a3, a4
9765; RV64IA-NEXT:    mv a5, a3
9766; RV64IA-NEXT:    bgeu a1, a2, .LBB109_3
9767; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB109_1 Depth=1
9768; RV64IA-NEXT:    xor a5, a3, a1
9769; RV64IA-NEXT:    and a5, a5, a4
9770; RV64IA-NEXT:    xor a5, a3, a5
9771; RV64IA-NEXT:  .LBB109_3: # in Loop: Header=BB109_1 Depth=1
9772; RV64IA-NEXT:    sc.w.aqrl a5, a5, (a6)
9773; RV64IA-NEXT:    bnez a5, .LBB109_1
9774; RV64IA-NEXT:  # %bb.4:
9775; RV64IA-NEXT:    srlw a0, a3, a0
9776; RV64IA-NEXT:    ret
9777  %1 = atomicrmw umin i16* %a, i16 %b seq_cst
9778  ret i16 %1
9779}
9780
9781define i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) nounwind {
9782; RV32I-LABEL: atomicrmw_xchg_i32_monotonic:
9783; RV32I:       # %bb.0:
9784; RV32I-NEXT:    addi sp, sp, -16
9785; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9786; RV32I-NEXT:    li a2, 0
9787; RV32I-NEXT:    call __atomic_exchange_4@plt
9788; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9789; RV32I-NEXT:    addi sp, sp, 16
9790; RV32I-NEXT:    ret
9791;
9792; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic:
9793; RV32IA:       # %bb.0:
9794; RV32IA-NEXT:    amoswap.w a0, a1, (a0)
9795; RV32IA-NEXT:    ret
9796;
9797; RV64I-LABEL: atomicrmw_xchg_i32_monotonic:
9798; RV64I:       # %bb.0:
9799; RV64I-NEXT:    addi sp, sp, -16
9800; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9801; RV64I-NEXT:    li a2, 0
9802; RV64I-NEXT:    call __atomic_exchange_4@plt
9803; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9804; RV64I-NEXT:    addi sp, sp, 16
9805; RV64I-NEXT:    ret
9806;
9807; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic:
9808; RV64IA:       # %bb.0:
9809; RV64IA-NEXT:    amoswap.w a0, a1, (a0)
9810; RV64IA-NEXT:    ret
9811  %1 = atomicrmw xchg i32* %a, i32 %b monotonic
9812  ret i32 %1
9813}
9814
9815define i32 @atomicrmw_xchg_i32_acquire(i32* %a, i32 %b) nounwind {
9816; RV32I-LABEL: atomicrmw_xchg_i32_acquire:
9817; RV32I:       # %bb.0:
9818; RV32I-NEXT:    addi sp, sp, -16
9819; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9820; RV32I-NEXT:    li a2, 2
9821; RV32I-NEXT:    call __atomic_exchange_4@plt
9822; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9823; RV32I-NEXT:    addi sp, sp, 16
9824; RV32I-NEXT:    ret
9825;
9826; RV32IA-LABEL: atomicrmw_xchg_i32_acquire:
9827; RV32IA:       # %bb.0:
9828; RV32IA-NEXT:    amoswap.w.aq a0, a1, (a0)
9829; RV32IA-NEXT:    ret
9830;
9831; RV64I-LABEL: atomicrmw_xchg_i32_acquire:
9832; RV64I:       # %bb.0:
9833; RV64I-NEXT:    addi sp, sp, -16
9834; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9835; RV64I-NEXT:    li a2, 2
9836; RV64I-NEXT:    call __atomic_exchange_4@plt
9837; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9838; RV64I-NEXT:    addi sp, sp, 16
9839; RV64I-NEXT:    ret
9840;
9841; RV64IA-LABEL: atomicrmw_xchg_i32_acquire:
9842; RV64IA:       # %bb.0:
9843; RV64IA-NEXT:    amoswap.w.aq a0, a1, (a0)
9844; RV64IA-NEXT:    ret
9845  %1 = atomicrmw xchg i32* %a, i32 %b acquire
9846  ret i32 %1
9847}
9848
9849define i32 @atomicrmw_xchg_i32_release(i32* %a, i32 %b) nounwind {
9850; RV32I-LABEL: atomicrmw_xchg_i32_release:
9851; RV32I:       # %bb.0:
9852; RV32I-NEXT:    addi sp, sp, -16
9853; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9854; RV32I-NEXT:    li a2, 3
9855; RV32I-NEXT:    call __atomic_exchange_4@plt
9856; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9857; RV32I-NEXT:    addi sp, sp, 16
9858; RV32I-NEXT:    ret
9859;
9860; RV32IA-LABEL: atomicrmw_xchg_i32_release:
9861; RV32IA:       # %bb.0:
9862; RV32IA-NEXT:    amoswap.w.rl a0, a1, (a0)
9863; RV32IA-NEXT:    ret
9864;
9865; RV64I-LABEL: atomicrmw_xchg_i32_release:
9866; RV64I:       # %bb.0:
9867; RV64I-NEXT:    addi sp, sp, -16
9868; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9869; RV64I-NEXT:    li a2, 3
9870; RV64I-NEXT:    call __atomic_exchange_4@plt
9871; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9872; RV64I-NEXT:    addi sp, sp, 16
9873; RV64I-NEXT:    ret
9874;
9875; RV64IA-LABEL: atomicrmw_xchg_i32_release:
9876; RV64IA:       # %bb.0:
9877; RV64IA-NEXT:    amoswap.w.rl a0, a1, (a0)
9878; RV64IA-NEXT:    ret
9879  %1 = atomicrmw xchg i32* %a, i32 %b release
9880  ret i32 %1
9881}
9882
9883define i32 @atomicrmw_xchg_i32_acq_rel(i32* %a, i32 %b) nounwind {
9884; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel:
9885; RV32I:       # %bb.0:
9886; RV32I-NEXT:    addi sp, sp, -16
9887; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9888; RV32I-NEXT:    li a2, 4
9889; RV32I-NEXT:    call __atomic_exchange_4@plt
9890; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9891; RV32I-NEXT:    addi sp, sp, 16
9892; RV32I-NEXT:    ret
9893;
9894; RV32IA-LABEL: atomicrmw_xchg_i32_acq_rel:
9895; RV32IA:       # %bb.0:
9896; RV32IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9897; RV32IA-NEXT:    ret
9898;
9899; RV64I-LABEL: atomicrmw_xchg_i32_acq_rel:
9900; RV64I:       # %bb.0:
9901; RV64I-NEXT:    addi sp, sp, -16
9902; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9903; RV64I-NEXT:    li a2, 4
9904; RV64I-NEXT:    call __atomic_exchange_4@plt
9905; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9906; RV64I-NEXT:    addi sp, sp, 16
9907; RV64I-NEXT:    ret
9908;
9909; RV64IA-LABEL: atomicrmw_xchg_i32_acq_rel:
9910; RV64IA:       # %bb.0:
9911; RV64IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9912; RV64IA-NEXT:    ret
9913  %1 = atomicrmw xchg i32* %a, i32 %b acq_rel
9914  ret i32 %1
9915}
9916
9917define i32 @atomicrmw_xchg_i32_seq_cst(i32* %a, i32 %b) nounwind {
9918; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst:
9919; RV32I:       # %bb.0:
9920; RV32I-NEXT:    addi sp, sp, -16
9921; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9922; RV32I-NEXT:    li a2, 5
9923; RV32I-NEXT:    call __atomic_exchange_4@plt
9924; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9925; RV32I-NEXT:    addi sp, sp, 16
9926; RV32I-NEXT:    ret
9927;
9928; RV32IA-LABEL: atomicrmw_xchg_i32_seq_cst:
9929; RV32IA:       # %bb.0:
9930; RV32IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9931; RV32IA-NEXT:    ret
9932;
9933; RV64I-LABEL: atomicrmw_xchg_i32_seq_cst:
9934; RV64I:       # %bb.0:
9935; RV64I-NEXT:    addi sp, sp, -16
9936; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9937; RV64I-NEXT:    li a2, 5
9938; RV64I-NEXT:    call __atomic_exchange_4@plt
9939; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9940; RV64I-NEXT:    addi sp, sp, 16
9941; RV64I-NEXT:    ret
9942;
9943; RV64IA-LABEL: atomicrmw_xchg_i32_seq_cst:
9944; RV64IA:       # %bb.0:
9945; RV64IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
9946; RV64IA-NEXT:    ret
9947  %1 = atomicrmw xchg i32* %a, i32 %b seq_cst
9948  ret i32 %1
9949}
9950
9951define i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind {
9952; RV32I-LABEL: atomicrmw_add_i32_monotonic:
9953; RV32I:       # %bb.0:
9954; RV32I-NEXT:    addi sp, sp, -16
9955; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9956; RV32I-NEXT:    li a2, 0
9957; RV32I-NEXT:    call __atomic_fetch_add_4@plt
9958; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9959; RV32I-NEXT:    addi sp, sp, 16
9960; RV32I-NEXT:    ret
9961;
9962; RV32IA-LABEL: atomicrmw_add_i32_monotonic:
9963; RV32IA:       # %bb.0:
9964; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
9965; RV32IA-NEXT:    ret
9966;
9967; RV64I-LABEL: atomicrmw_add_i32_monotonic:
9968; RV64I:       # %bb.0:
9969; RV64I-NEXT:    addi sp, sp, -16
9970; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9971; RV64I-NEXT:    li a2, 0
9972; RV64I-NEXT:    call __atomic_fetch_add_4@plt
9973; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9974; RV64I-NEXT:    addi sp, sp, 16
9975; RV64I-NEXT:    ret
9976;
9977; RV64IA-LABEL: atomicrmw_add_i32_monotonic:
9978; RV64IA:       # %bb.0:
9979; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
9980; RV64IA-NEXT:    ret
9981  %1 = atomicrmw add i32* %a, i32 %b monotonic
9982  ret i32 %1
9983}
9984
9985define i32 @atomicrmw_add_i32_acquire(i32 *%a, i32 %b) nounwind {
9986; RV32I-LABEL: atomicrmw_add_i32_acquire:
9987; RV32I:       # %bb.0:
9988; RV32I-NEXT:    addi sp, sp, -16
9989; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9990; RV32I-NEXT:    li a2, 2
9991; RV32I-NEXT:    call __atomic_fetch_add_4@plt
9992; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9993; RV32I-NEXT:    addi sp, sp, 16
9994; RV32I-NEXT:    ret
9995;
9996; RV32IA-LABEL: atomicrmw_add_i32_acquire:
9997; RV32IA:       # %bb.0:
9998; RV32IA-NEXT:    amoadd.w.aq a0, a1, (a0)
9999; RV32IA-NEXT:    ret
10000;
10001; RV64I-LABEL: atomicrmw_add_i32_acquire:
10002; RV64I:       # %bb.0:
10003; RV64I-NEXT:    addi sp, sp, -16
10004; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10005; RV64I-NEXT:    li a2, 2
10006; RV64I-NEXT:    call __atomic_fetch_add_4@plt
10007; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10008; RV64I-NEXT:    addi sp, sp, 16
10009; RV64I-NEXT:    ret
10010;
10011; RV64IA-LABEL: atomicrmw_add_i32_acquire:
10012; RV64IA:       # %bb.0:
10013; RV64IA-NEXT:    amoadd.w.aq a0, a1, (a0)
10014; RV64IA-NEXT:    ret
10015  %1 = atomicrmw add i32* %a, i32 %b acquire
10016  ret i32 %1
10017}
10018
10019define i32 @atomicrmw_add_i32_release(i32 *%a, i32 %b) nounwind {
10020; RV32I-LABEL: atomicrmw_add_i32_release:
10021; RV32I:       # %bb.0:
10022; RV32I-NEXT:    addi sp, sp, -16
10023; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10024; RV32I-NEXT:    li a2, 3
10025; RV32I-NEXT:    call __atomic_fetch_add_4@plt
10026; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10027; RV32I-NEXT:    addi sp, sp, 16
10028; RV32I-NEXT:    ret
10029;
10030; RV32IA-LABEL: atomicrmw_add_i32_release:
10031; RV32IA:       # %bb.0:
10032; RV32IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10033; RV32IA-NEXT:    ret
10034;
10035; RV64I-LABEL: atomicrmw_add_i32_release:
10036; RV64I:       # %bb.0:
10037; RV64I-NEXT:    addi sp, sp, -16
10038; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10039; RV64I-NEXT:    li a2, 3
10040; RV64I-NEXT:    call __atomic_fetch_add_4@plt
10041; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10042; RV64I-NEXT:    addi sp, sp, 16
10043; RV64I-NEXT:    ret
10044;
10045; RV64IA-LABEL: atomicrmw_add_i32_release:
10046; RV64IA:       # %bb.0:
10047; RV64IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10048; RV64IA-NEXT:    ret
10049  %1 = atomicrmw add i32* %a, i32 %b release
10050  ret i32 %1
10051}
10052
10053define i32 @atomicrmw_add_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10054; RV32I-LABEL: atomicrmw_add_i32_acq_rel:
10055; RV32I:       # %bb.0:
10056; RV32I-NEXT:    addi sp, sp, -16
10057; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10058; RV32I-NEXT:    li a2, 4
10059; RV32I-NEXT:    call __atomic_fetch_add_4@plt
10060; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10061; RV32I-NEXT:    addi sp, sp, 16
10062; RV32I-NEXT:    ret
10063;
10064; RV32IA-LABEL: atomicrmw_add_i32_acq_rel:
10065; RV32IA:       # %bb.0:
10066; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10067; RV32IA-NEXT:    ret
10068;
10069; RV64I-LABEL: atomicrmw_add_i32_acq_rel:
10070; RV64I:       # %bb.0:
10071; RV64I-NEXT:    addi sp, sp, -16
10072; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10073; RV64I-NEXT:    li a2, 4
10074; RV64I-NEXT:    call __atomic_fetch_add_4@plt
10075; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10076; RV64I-NEXT:    addi sp, sp, 16
10077; RV64I-NEXT:    ret
10078;
10079; RV64IA-LABEL: atomicrmw_add_i32_acq_rel:
10080; RV64IA:       # %bb.0:
10081; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10082; RV64IA-NEXT:    ret
10083  %1 = atomicrmw add i32* %a, i32 %b acq_rel
10084  ret i32 %1
10085}
10086
10087define i32 @atomicrmw_add_i32_seq_cst(i32 *%a, i32 %b) nounwind {
10088; RV32I-LABEL: atomicrmw_add_i32_seq_cst:
10089; RV32I:       # %bb.0:
10090; RV32I-NEXT:    addi sp, sp, -16
10091; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10092; RV32I-NEXT:    li a2, 5
10093; RV32I-NEXT:    call __atomic_fetch_add_4@plt
10094; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10095; RV32I-NEXT:    addi sp, sp, 16
10096; RV32I-NEXT:    ret
10097;
10098; RV32IA-LABEL: atomicrmw_add_i32_seq_cst:
10099; RV32IA:       # %bb.0:
10100; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10101; RV32IA-NEXT:    ret
10102;
10103; RV64I-LABEL: atomicrmw_add_i32_seq_cst:
10104; RV64I:       # %bb.0:
10105; RV64I-NEXT:    addi sp, sp, -16
10106; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10107; RV64I-NEXT:    li a2, 5
10108; RV64I-NEXT:    call __atomic_fetch_add_4@plt
10109; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10110; RV64I-NEXT:    addi sp, sp, 16
10111; RV64I-NEXT:    ret
10112;
10113; RV64IA-LABEL: atomicrmw_add_i32_seq_cst:
10114; RV64IA:       # %bb.0:
10115; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10116; RV64IA-NEXT:    ret
10117  %1 = atomicrmw add i32* %a, i32 %b seq_cst
10118  ret i32 %1
10119}
10120
10121define i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) nounwind {
10122; RV32I-LABEL: atomicrmw_sub_i32_monotonic:
10123; RV32I:       # %bb.0:
10124; RV32I-NEXT:    addi sp, sp, -16
10125; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10126; RV32I-NEXT:    li a2, 0
10127; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10128; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10129; RV32I-NEXT:    addi sp, sp, 16
10130; RV32I-NEXT:    ret
10131;
10132; RV32IA-LABEL: atomicrmw_sub_i32_monotonic:
10133; RV32IA:       # %bb.0:
10134; RV32IA-NEXT:    neg a1, a1
10135; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
10136; RV32IA-NEXT:    ret
10137;
10138; RV64I-LABEL: atomicrmw_sub_i32_monotonic:
10139; RV64I:       # %bb.0:
10140; RV64I-NEXT:    addi sp, sp, -16
10141; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10142; RV64I-NEXT:    li a2, 0
10143; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10144; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10145; RV64I-NEXT:    addi sp, sp, 16
10146; RV64I-NEXT:    ret
10147;
10148; RV64IA-LABEL: atomicrmw_sub_i32_monotonic:
10149; RV64IA:       # %bb.0:
10150; RV64IA-NEXT:    neg a1, a1
10151; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
10152; RV64IA-NEXT:    ret
10153  %1 = atomicrmw sub i32* %a, i32 %b monotonic
10154  ret i32 %1
10155}
10156
10157define i32 @atomicrmw_sub_i32_acquire(i32* %a, i32 %b) nounwind {
10158; RV32I-LABEL: atomicrmw_sub_i32_acquire:
10159; RV32I:       # %bb.0:
10160; RV32I-NEXT:    addi sp, sp, -16
10161; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10162; RV32I-NEXT:    li a2, 2
10163; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10164; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10165; RV32I-NEXT:    addi sp, sp, 16
10166; RV32I-NEXT:    ret
10167;
10168; RV32IA-LABEL: atomicrmw_sub_i32_acquire:
10169; RV32IA:       # %bb.0:
10170; RV32IA-NEXT:    neg a1, a1
10171; RV32IA-NEXT:    amoadd.w.aq a0, a1, (a0)
10172; RV32IA-NEXT:    ret
10173;
10174; RV64I-LABEL: atomicrmw_sub_i32_acquire:
10175; RV64I:       # %bb.0:
10176; RV64I-NEXT:    addi sp, sp, -16
10177; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10178; RV64I-NEXT:    li a2, 2
10179; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10180; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10181; RV64I-NEXT:    addi sp, sp, 16
10182; RV64I-NEXT:    ret
10183;
10184; RV64IA-LABEL: atomicrmw_sub_i32_acquire:
10185; RV64IA:       # %bb.0:
10186; RV64IA-NEXT:    neg a1, a1
10187; RV64IA-NEXT:    amoadd.w.aq a0, a1, (a0)
10188; RV64IA-NEXT:    ret
10189  %1 = atomicrmw sub i32* %a, i32 %b acquire
10190  ret i32 %1
10191}
10192
10193define i32 @atomicrmw_sub_i32_release(i32* %a, i32 %b) nounwind {
10194; RV32I-LABEL: atomicrmw_sub_i32_release:
10195; RV32I:       # %bb.0:
10196; RV32I-NEXT:    addi sp, sp, -16
10197; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10198; RV32I-NEXT:    li a2, 3
10199; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10200; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10201; RV32I-NEXT:    addi sp, sp, 16
10202; RV32I-NEXT:    ret
10203;
10204; RV32IA-LABEL: atomicrmw_sub_i32_release:
10205; RV32IA:       # %bb.0:
10206; RV32IA-NEXT:    neg a1, a1
10207; RV32IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10208; RV32IA-NEXT:    ret
10209;
10210; RV64I-LABEL: atomicrmw_sub_i32_release:
10211; RV64I:       # %bb.0:
10212; RV64I-NEXT:    addi sp, sp, -16
10213; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10214; RV64I-NEXT:    li a2, 3
10215; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10216; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10217; RV64I-NEXT:    addi sp, sp, 16
10218; RV64I-NEXT:    ret
10219;
10220; RV64IA-LABEL: atomicrmw_sub_i32_release:
10221; RV64IA:       # %bb.0:
10222; RV64IA-NEXT:    neg a1, a1
10223; RV64IA-NEXT:    amoadd.w.rl a0, a1, (a0)
10224; RV64IA-NEXT:    ret
10225  %1 = atomicrmw sub i32* %a, i32 %b release
10226  ret i32 %1
10227}
10228
10229define i32 @atomicrmw_sub_i32_acq_rel(i32* %a, i32 %b) nounwind {
10230; RV32I-LABEL: atomicrmw_sub_i32_acq_rel:
10231; RV32I:       # %bb.0:
10232; RV32I-NEXT:    addi sp, sp, -16
10233; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10234; RV32I-NEXT:    li a2, 4
10235; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10236; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10237; RV32I-NEXT:    addi sp, sp, 16
10238; RV32I-NEXT:    ret
10239;
10240; RV32IA-LABEL: atomicrmw_sub_i32_acq_rel:
10241; RV32IA:       # %bb.0:
10242; RV32IA-NEXT:    neg a1, a1
10243; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10244; RV32IA-NEXT:    ret
10245;
10246; RV64I-LABEL: atomicrmw_sub_i32_acq_rel:
10247; RV64I:       # %bb.0:
10248; RV64I-NEXT:    addi sp, sp, -16
10249; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10250; RV64I-NEXT:    li a2, 4
10251; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10252; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10253; RV64I-NEXT:    addi sp, sp, 16
10254; RV64I-NEXT:    ret
10255;
10256; RV64IA-LABEL: atomicrmw_sub_i32_acq_rel:
10257; RV64IA:       # %bb.0:
10258; RV64IA-NEXT:    neg a1, a1
10259; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10260; RV64IA-NEXT:    ret
10261  %1 = atomicrmw sub i32* %a, i32 %b acq_rel
10262  ret i32 %1
10263}
10264
10265define i32 @atomicrmw_sub_i32_seq_cst(i32* %a, i32 %b) nounwind {
10266; RV32I-LABEL: atomicrmw_sub_i32_seq_cst:
10267; RV32I:       # %bb.0:
10268; RV32I-NEXT:    addi sp, sp, -16
10269; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10270; RV32I-NEXT:    li a2, 5
10271; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
10272; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10273; RV32I-NEXT:    addi sp, sp, 16
10274; RV32I-NEXT:    ret
10275;
10276; RV32IA-LABEL: atomicrmw_sub_i32_seq_cst:
10277; RV32IA:       # %bb.0:
10278; RV32IA-NEXT:    neg a1, a1
10279; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10280; RV32IA-NEXT:    ret
10281;
10282; RV64I-LABEL: atomicrmw_sub_i32_seq_cst:
10283; RV64I:       # %bb.0:
10284; RV64I-NEXT:    addi sp, sp, -16
10285; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10286; RV64I-NEXT:    li a2, 5
10287; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
10288; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10289; RV64I-NEXT:    addi sp, sp, 16
10290; RV64I-NEXT:    ret
10291;
10292; RV64IA-LABEL: atomicrmw_sub_i32_seq_cst:
10293; RV64IA:       # %bb.0:
10294; RV64IA-NEXT:    neg a1, a1
10295; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
10296; RV64IA-NEXT:    ret
10297  %1 = atomicrmw sub i32* %a, i32 %b seq_cst
10298  ret i32 %1
10299}
10300
10301define i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind {
10302; RV32I-LABEL: atomicrmw_and_i32_monotonic:
10303; RV32I:       # %bb.0:
10304; RV32I-NEXT:    addi sp, sp, -16
10305; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10306; RV32I-NEXT:    li a2, 0
10307; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10308; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10309; RV32I-NEXT:    addi sp, sp, 16
10310; RV32I-NEXT:    ret
10311;
10312; RV32IA-LABEL: atomicrmw_and_i32_monotonic:
10313; RV32IA:       # %bb.0:
10314; RV32IA-NEXT:    amoand.w a0, a1, (a0)
10315; RV32IA-NEXT:    ret
10316;
10317; RV64I-LABEL: atomicrmw_and_i32_monotonic:
10318; RV64I:       # %bb.0:
10319; RV64I-NEXT:    addi sp, sp, -16
10320; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10321; RV64I-NEXT:    li a2, 0
10322; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10323; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10324; RV64I-NEXT:    addi sp, sp, 16
10325; RV64I-NEXT:    ret
10326;
10327; RV64IA-LABEL: atomicrmw_and_i32_monotonic:
10328; RV64IA:       # %bb.0:
10329; RV64IA-NEXT:    amoand.w a0, a1, (a0)
10330; RV64IA-NEXT:    ret
10331  %1 = atomicrmw and i32* %a, i32 %b monotonic
10332  ret i32 %1
10333}
10334
10335define i32 @atomicrmw_and_i32_acquire(i32 *%a, i32 %b) nounwind {
10336; RV32I-LABEL: atomicrmw_and_i32_acquire:
10337; RV32I:       # %bb.0:
10338; RV32I-NEXT:    addi sp, sp, -16
10339; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10340; RV32I-NEXT:    li a2, 2
10341; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10342; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10343; RV32I-NEXT:    addi sp, sp, 16
10344; RV32I-NEXT:    ret
10345;
10346; RV32IA-LABEL: atomicrmw_and_i32_acquire:
10347; RV32IA:       # %bb.0:
10348; RV32IA-NEXT:    amoand.w.aq a0, a1, (a0)
10349; RV32IA-NEXT:    ret
10350;
10351; RV64I-LABEL: atomicrmw_and_i32_acquire:
10352; RV64I:       # %bb.0:
10353; RV64I-NEXT:    addi sp, sp, -16
10354; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10355; RV64I-NEXT:    li a2, 2
10356; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10357; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10358; RV64I-NEXT:    addi sp, sp, 16
10359; RV64I-NEXT:    ret
10360;
10361; RV64IA-LABEL: atomicrmw_and_i32_acquire:
10362; RV64IA:       # %bb.0:
10363; RV64IA-NEXT:    amoand.w.aq a0, a1, (a0)
10364; RV64IA-NEXT:    ret
10365  %1 = atomicrmw and i32* %a, i32 %b acquire
10366  ret i32 %1
10367}
10368
10369define i32 @atomicrmw_and_i32_release(i32 *%a, i32 %b) nounwind {
10370; RV32I-LABEL: atomicrmw_and_i32_release:
10371; RV32I:       # %bb.0:
10372; RV32I-NEXT:    addi sp, sp, -16
10373; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10374; RV32I-NEXT:    li a2, 3
10375; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10376; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10377; RV32I-NEXT:    addi sp, sp, 16
10378; RV32I-NEXT:    ret
10379;
10380; RV32IA-LABEL: atomicrmw_and_i32_release:
10381; RV32IA:       # %bb.0:
10382; RV32IA-NEXT:    amoand.w.rl a0, a1, (a0)
10383; RV32IA-NEXT:    ret
10384;
10385; RV64I-LABEL: atomicrmw_and_i32_release:
10386; RV64I:       # %bb.0:
10387; RV64I-NEXT:    addi sp, sp, -16
10388; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10389; RV64I-NEXT:    li a2, 3
10390; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10391; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10392; RV64I-NEXT:    addi sp, sp, 16
10393; RV64I-NEXT:    ret
10394;
10395; RV64IA-LABEL: atomicrmw_and_i32_release:
10396; RV64IA:       # %bb.0:
10397; RV64IA-NEXT:    amoand.w.rl a0, a1, (a0)
10398; RV64IA-NEXT:    ret
10399  %1 = atomicrmw and i32* %a, i32 %b release
10400  ret i32 %1
10401}
10402
10403define i32 @atomicrmw_and_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10404; RV32I-LABEL: atomicrmw_and_i32_acq_rel:
10405; RV32I:       # %bb.0:
10406; RV32I-NEXT:    addi sp, sp, -16
10407; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10408; RV32I-NEXT:    li a2, 4
10409; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10410; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10411; RV32I-NEXT:    addi sp, sp, 16
10412; RV32I-NEXT:    ret
10413;
10414; RV32IA-LABEL: atomicrmw_and_i32_acq_rel:
10415; RV32IA:       # %bb.0:
10416; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10417; RV32IA-NEXT:    ret
10418;
10419; RV64I-LABEL: atomicrmw_and_i32_acq_rel:
10420; RV64I:       # %bb.0:
10421; RV64I-NEXT:    addi sp, sp, -16
10422; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10423; RV64I-NEXT:    li a2, 4
10424; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10425; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10426; RV64I-NEXT:    addi sp, sp, 16
10427; RV64I-NEXT:    ret
10428;
10429; RV64IA-LABEL: atomicrmw_and_i32_acq_rel:
10430; RV64IA:       # %bb.0:
10431; RV64IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10432; RV64IA-NEXT:    ret
10433  %1 = atomicrmw and i32* %a, i32 %b acq_rel
10434  ret i32 %1
10435}
10436
10437define i32 @atomicrmw_and_i32_seq_cst(i32 *%a, i32 %b) nounwind {
10438; RV32I-LABEL: atomicrmw_and_i32_seq_cst:
10439; RV32I:       # %bb.0:
10440; RV32I-NEXT:    addi sp, sp, -16
10441; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10442; RV32I-NEXT:    li a2, 5
10443; RV32I-NEXT:    call __atomic_fetch_and_4@plt
10444; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10445; RV32I-NEXT:    addi sp, sp, 16
10446; RV32I-NEXT:    ret
10447;
10448; RV32IA-LABEL: atomicrmw_and_i32_seq_cst:
10449; RV32IA:       # %bb.0:
10450; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10451; RV32IA-NEXT:    ret
10452;
10453; RV64I-LABEL: atomicrmw_and_i32_seq_cst:
10454; RV64I:       # %bb.0:
10455; RV64I-NEXT:    addi sp, sp, -16
10456; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10457; RV64I-NEXT:    li a2, 5
10458; RV64I-NEXT:    call __atomic_fetch_and_4@plt
10459; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10460; RV64I-NEXT:    addi sp, sp, 16
10461; RV64I-NEXT:    ret
10462;
10463; RV64IA-LABEL: atomicrmw_and_i32_seq_cst:
10464; RV64IA:       # %bb.0:
10465; RV64IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
10466; RV64IA-NEXT:    ret
10467  %1 = atomicrmw and i32* %a, i32 %b seq_cst
10468  ret i32 %1
10469}
10470
10471define i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) nounwind {
10472; RV32I-LABEL: atomicrmw_nand_i32_monotonic:
10473; RV32I:       # %bb.0:
10474; RV32I-NEXT:    addi sp, sp, -16
10475; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10476; RV32I-NEXT:    li a2, 0
10477; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10478; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10479; RV32I-NEXT:    addi sp, sp, 16
10480; RV32I-NEXT:    ret
10481;
10482; RV32IA-LABEL: atomicrmw_nand_i32_monotonic:
10483; RV32IA:       # %bb.0:
10484; RV32IA-NEXT:  .LBB130_1: # =>This Inner Loop Header: Depth=1
10485; RV32IA-NEXT:    lr.w a2, (a0)
10486; RV32IA-NEXT:    and a3, a2, a1
10487; RV32IA-NEXT:    not a3, a3
10488; RV32IA-NEXT:    sc.w a3, a3, (a0)
10489; RV32IA-NEXT:    bnez a3, .LBB130_1
10490; RV32IA-NEXT:  # %bb.2:
10491; RV32IA-NEXT:    mv a0, a2
10492; RV32IA-NEXT:    ret
10493;
10494; RV64I-LABEL: atomicrmw_nand_i32_monotonic:
10495; RV64I:       # %bb.0:
10496; RV64I-NEXT:    addi sp, sp, -16
10497; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10498; RV64I-NEXT:    li a2, 0
10499; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10500; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10501; RV64I-NEXT:    addi sp, sp, 16
10502; RV64I-NEXT:    ret
10503;
10504; RV64IA-LABEL: atomicrmw_nand_i32_monotonic:
10505; RV64IA:       # %bb.0:
10506; RV64IA-NEXT:  .LBB130_1: # =>This Inner Loop Header: Depth=1
10507; RV64IA-NEXT:    lr.w a2, (a0)
10508; RV64IA-NEXT:    and a3, a2, a1
10509; RV64IA-NEXT:    not a3, a3
10510; RV64IA-NEXT:    sc.w a3, a3, (a0)
10511; RV64IA-NEXT:    bnez a3, .LBB130_1
10512; RV64IA-NEXT:  # %bb.2:
10513; RV64IA-NEXT:    mv a0, a2
10514; RV64IA-NEXT:    ret
10515  %1 = atomicrmw nand i32* %a, i32 %b monotonic
10516  ret i32 %1
10517}
10518
10519define i32 @atomicrmw_nand_i32_acquire(i32* %a, i32 %b) nounwind {
10520; RV32I-LABEL: atomicrmw_nand_i32_acquire:
10521; RV32I:       # %bb.0:
10522; RV32I-NEXT:    addi sp, sp, -16
10523; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10524; RV32I-NEXT:    li a2, 2
10525; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10526; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10527; RV32I-NEXT:    addi sp, sp, 16
10528; RV32I-NEXT:    ret
10529;
10530; RV32IA-LABEL: atomicrmw_nand_i32_acquire:
10531; RV32IA:       # %bb.0:
10532; RV32IA-NEXT:  .LBB131_1: # =>This Inner Loop Header: Depth=1
10533; RV32IA-NEXT:    lr.w.aq a2, (a0)
10534; RV32IA-NEXT:    and a3, a2, a1
10535; RV32IA-NEXT:    not a3, a3
10536; RV32IA-NEXT:    sc.w a3, a3, (a0)
10537; RV32IA-NEXT:    bnez a3, .LBB131_1
10538; RV32IA-NEXT:  # %bb.2:
10539; RV32IA-NEXT:    mv a0, a2
10540; RV32IA-NEXT:    ret
10541;
10542; RV64I-LABEL: atomicrmw_nand_i32_acquire:
10543; RV64I:       # %bb.0:
10544; RV64I-NEXT:    addi sp, sp, -16
10545; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10546; RV64I-NEXT:    li a2, 2
10547; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10548; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10549; RV64I-NEXT:    addi sp, sp, 16
10550; RV64I-NEXT:    ret
10551;
10552; RV64IA-LABEL: atomicrmw_nand_i32_acquire:
10553; RV64IA:       # %bb.0:
10554; RV64IA-NEXT:  .LBB131_1: # =>This Inner Loop Header: Depth=1
10555; RV64IA-NEXT:    lr.w.aq a2, (a0)
10556; RV64IA-NEXT:    and a3, a2, a1
10557; RV64IA-NEXT:    not a3, a3
10558; RV64IA-NEXT:    sc.w a3, a3, (a0)
10559; RV64IA-NEXT:    bnez a3, .LBB131_1
10560; RV64IA-NEXT:  # %bb.2:
10561; RV64IA-NEXT:    mv a0, a2
10562; RV64IA-NEXT:    ret
10563  %1 = atomicrmw nand i32* %a, i32 %b acquire
10564  ret i32 %1
10565}
10566
10567define i32 @atomicrmw_nand_i32_release(i32* %a, i32 %b) nounwind {
10568; RV32I-LABEL: atomicrmw_nand_i32_release:
10569; RV32I:       # %bb.0:
10570; RV32I-NEXT:    addi sp, sp, -16
10571; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10572; RV32I-NEXT:    li a2, 3
10573; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10574; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10575; RV32I-NEXT:    addi sp, sp, 16
10576; RV32I-NEXT:    ret
10577;
10578; RV32IA-LABEL: atomicrmw_nand_i32_release:
10579; RV32IA:       # %bb.0:
10580; RV32IA-NEXT:  .LBB132_1: # =>This Inner Loop Header: Depth=1
10581; RV32IA-NEXT:    lr.w a2, (a0)
10582; RV32IA-NEXT:    and a3, a2, a1
10583; RV32IA-NEXT:    not a3, a3
10584; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
10585; RV32IA-NEXT:    bnez a3, .LBB132_1
10586; RV32IA-NEXT:  # %bb.2:
10587; RV32IA-NEXT:    mv a0, a2
10588; RV32IA-NEXT:    ret
10589;
10590; RV64I-LABEL: atomicrmw_nand_i32_release:
10591; RV64I:       # %bb.0:
10592; RV64I-NEXT:    addi sp, sp, -16
10593; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10594; RV64I-NEXT:    li a2, 3
10595; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10596; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10597; RV64I-NEXT:    addi sp, sp, 16
10598; RV64I-NEXT:    ret
10599;
10600; RV64IA-LABEL: atomicrmw_nand_i32_release:
10601; RV64IA:       # %bb.0:
10602; RV64IA-NEXT:  .LBB132_1: # =>This Inner Loop Header: Depth=1
10603; RV64IA-NEXT:    lr.w a2, (a0)
10604; RV64IA-NEXT:    and a3, a2, a1
10605; RV64IA-NEXT:    not a3, a3
10606; RV64IA-NEXT:    sc.w.rl a3, a3, (a0)
10607; RV64IA-NEXT:    bnez a3, .LBB132_1
10608; RV64IA-NEXT:  # %bb.2:
10609; RV64IA-NEXT:    mv a0, a2
10610; RV64IA-NEXT:    ret
10611  %1 = atomicrmw nand i32* %a, i32 %b release
10612  ret i32 %1
10613}
10614
10615define i32 @atomicrmw_nand_i32_acq_rel(i32* %a, i32 %b) nounwind {
10616; RV32I-LABEL: atomicrmw_nand_i32_acq_rel:
10617; RV32I:       # %bb.0:
10618; RV32I-NEXT:    addi sp, sp, -16
10619; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10620; RV32I-NEXT:    li a2, 4
10621; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10622; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10623; RV32I-NEXT:    addi sp, sp, 16
10624; RV32I-NEXT:    ret
10625;
10626; RV32IA-LABEL: atomicrmw_nand_i32_acq_rel:
10627; RV32IA:       # %bb.0:
10628; RV32IA-NEXT:  .LBB133_1: # =>This Inner Loop Header: Depth=1
10629; RV32IA-NEXT:    lr.w.aq a2, (a0)
10630; RV32IA-NEXT:    and a3, a2, a1
10631; RV32IA-NEXT:    not a3, a3
10632; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
10633; RV32IA-NEXT:    bnez a3, .LBB133_1
10634; RV32IA-NEXT:  # %bb.2:
10635; RV32IA-NEXT:    mv a0, a2
10636; RV32IA-NEXT:    ret
10637;
10638; RV64I-LABEL: atomicrmw_nand_i32_acq_rel:
10639; RV64I:       # %bb.0:
10640; RV64I-NEXT:    addi sp, sp, -16
10641; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10642; RV64I-NEXT:    li a2, 4
10643; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10644; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10645; RV64I-NEXT:    addi sp, sp, 16
10646; RV64I-NEXT:    ret
10647;
10648; RV64IA-LABEL: atomicrmw_nand_i32_acq_rel:
10649; RV64IA:       # %bb.0:
10650; RV64IA-NEXT:  .LBB133_1: # =>This Inner Loop Header: Depth=1
10651; RV64IA-NEXT:    lr.w.aq a2, (a0)
10652; RV64IA-NEXT:    and a3, a2, a1
10653; RV64IA-NEXT:    not a3, a3
10654; RV64IA-NEXT:    sc.w.rl a3, a3, (a0)
10655; RV64IA-NEXT:    bnez a3, .LBB133_1
10656; RV64IA-NEXT:  # %bb.2:
10657; RV64IA-NEXT:    mv a0, a2
10658; RV64IA-NEXT:    ret
10659  %1 = atomicrmw nand i32* %a, i32 %b acq_rel
10660  ret i32 %1
10661}
10662
10663define i32 @atomicrmw_nand_i32_seq_cst(i32* %a, i32 %b) nounwind {
10664; RV32I-LABEL: atomicrmw_nand_i32_seq_cst:
10665; RV32I:       # %bb.0:
10666; RV32I-NEXT:    addi sp, sp, -16
10667; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10668; RV32I-NEXT:    li a2, 5
10669; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
10670; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10671; RV32I-NEXT:    addi sp, sp, 16
10672; RV32I-NEXT:    ret
10673;
10674; RV32IA-LABEL: atomicrmw_nand_i32_seq_cst:
10675; RV32IA:       # %bb.0:
10676; RV32IA-NEXT:  .LBB134_1: # =>This Inner Loop Header: Depth=1
10677; RV32IA-NEXT:    lr.w.aqrl a2, (a0)
10678; RV32IA-NEXT:    and a3, a2, a1
10679; RV32IA-NEXT:    not a3, a3
10680; RV32IA-NEXT:    sc.w.aqrl a3, a3, (a0)
10681; RV32IA-NEXT:    bnez a3, .LBB134_1
10682; RV32IA-NEXT:  # %bb.2:
10683; RV32IA-NEXT:    mv a0, a2
10684; RV32IA-NEXT:    ret
10685;
10686; RV64I-LABEL: atomicrmw_nand_i32_seq_cst:
10687; RV64I:       # %bb.0:
10688; RV64I-NEXT:    addi sp, sp, -16
10689; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10690; RV64I-NEXT:    li a2, 5
10691; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
10692; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10693; RV64I-NEXT:    addi sp, sp, 16
10694; RV64I-NEXT:    ret
10695;
10696; RV64IA-LABEL: atomicrmw_nand_i32_seq_cst:
10697; RV64IA:       # %bb.0:
10698; RV64IA-NEXT:  .LBB134_1: # =>This Inner Loop Header: Depth=1
10699; RV64IA-NEXT:    lr.w.aqrl a2, (a0)
10700; RV64IA-NEXT:    and a3, a2, a1
10701; RV64IA-NEXT:    not a3, a3
10702; RV64IA-NEXT:    sc.w.aqrl a3, a3, (a0)
10703; RV64IA-NEXT:    bnez a3, .LBB134_1
10704; RV64IA-NEXT:  # %bb.2:
10705; RV64IA-NEXT:    mv a0, a2
10706; RV64IA-NEXT:    ret
10707  %1 = atomicrmw nand i32* %a, i32 %b seq_cst
10708  ret i32 %1
10709}
10710
10711define i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind {
10712; RV32I-LABEL: atomicrmw_or_i32_monotonic:
10713; RV32I:       # %bb.0:
10714; RV32I-NEXT:    addi sp, sp, -16
10715; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10716; RV32I-NEXT:    li a2, 0
10717; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10718; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10719; RV32I-NEXT:    addi sp, sp, 16
10720; RV32I-NEXT:    ret
10721;
10722; RV32IA-LABEL: atomicrmw_or_i32_monotonic:
10723; RV32IA:       # %bb.0:
10724; RV32IA-NEXT:    amoor.w a0, a1, (a0)
10725; RV32IA-NEXT:    ret
10726;
10727; RV64I-LABEL: atomicrmw_or_i32_monotonic:
10728; RV64I:       # %bb.0:
10729; RV64I-NEXT:    addi sp, sp, -16
10730; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10731; RV64I-NEXT:    li a2, 0
10732; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10733; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10734; RV64I-NEXT:    addi sp, sp, 16
10735; RV64I-NEXT:    ret
10736;
10737; RV64IA-LABEL: atomicrmw_or_i32_monotonic:
10738; RV64IA:       # %bb.0:
10739; RV64IA-NEXT:    amoor.w a0, a1, (a0)
10740; RV64IA-NEXT:    ret
10741  %1 = atomicrmw or i32* %a, i32 %b monotonic
10742  ret i32 %1
10743}
10744
10745define i32 @atomicrmw_or_i32_acquire(i32 *%a, i32 %b) nounwind {
10746; RV32I-LABEL: atomicrmw_or_i32_acquire:
10747; RV32I:       # %bb.0:
10748; RV32I-NEXT:    addi sp, sp, -16
10749; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10750; RV32I-NEXT:    li a2, 2
10751; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10752; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10753; RV32I-NEXT:    addi sp, sp, 16
10754; RV32I-NEXT:    ret
10755;
10756; RV32IA-LABEL: atomicrmw_or_i32_acquire:
10757; RV32IA:       # %bb.0:
10758; RV32IA-NEXT:    amoor.w.aq a0, a1, (a0)
10759; RV32IA-NEXT:    ret
10760;
10761; RV64I-LABEL: atomicrmw_or_i32_acquire:
10762; RV64I:       # %bb.0:
10763; RV64I-NEXT:    addi sp, sp, -16
10764; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10765; RV64I-NEXT:    li a2, 2
10766; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10767; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10768; RV64I-NEXT:    addi sp, sp, 16
10769; RV64I-NEXT:    ret
10770;
10771; RV64IA-LABEL: atomicrmw_or_i32_acquire:
10772; RV64IA:       # %bb.0:
10773; RV64IA-NEXT:    amoor.w.aq a0, a1, (a0)
10774; RV64IA-NEXT:    ret
10775  %1 = atomicrmw or i32* %a, i32 %b acquire
10776  ret i32 %1
10777}
10778
10779define i32 @atomicrmw_or_i32_release(i32 *%a, i32 %b) nounwind {
10780; RV32I-LABEL: atomicrmw_or_i32_release:
10781; RV32I:       # %bb.0:
10782; RV32I-NEXT:    addi sp, sp, -16
10783; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10784; RV32I-NEXT:    li a2, 3
10785; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10786; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10787; RV32I-NEXT:    addi sp, sp, 16
10788; RV32I-NEXT:    ret
10789;
10790; RV32IA-LABEL: atomicrmw_or_i32_release:
10791; RV32IA:       # %bb.0:
10792; RV32IA-NEXT:    amoor.w.rl a0, a1, (a0)
10793; RV32IA-NEXT:    ret
10794;
10795; RV64I-LABEL: atomicrmw_or_i32_release:
10796; RV64I:       # %bb.0:
10797; RV64I-NEXT:    addi sp, sp, -16
10798; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10799; RV64I-NEXT:    li a2, 3
10800; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10801; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10802; RV64I-NEXT:    addi sp, sp, 16
10803; RV64I-NEXT:    ret
10804;
10805; RV64IA-LABEL: atomicrmw_or_i32_release:
10806; RV64IA:       # %bb.0:
10807; RV64IA-NEXT:    amoor.w.rl a0, a1, (a0)
10808; RV64IA-NEXT:    ret
10809  %1 = atomicrmw or i32* %a, i32 %b release
10810  ret i32 %1
10811}
10812
10813define i32 @atomicrmw_or_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10814; RV32I-LABEL: atomicrmw_or_i32_acq_rel:
10815; RV32I:       # %bb.0:
10816; RV32I-NEXT:    addi sp, sp, -16
10817; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10818; RV32I-NEXT:    li a2, 4
10819; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10820; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10821; RV32I-NEXT:    addi sp, sp, 16
10822; RV32I-NEXT:    ret
10823;
10824; RV32IA-LABEL: atomicrmw_or_i32_acq_rel:
10825; RV32IA:       # %bb.0:
10826; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10827; RV32IA-NEXT:    ret
10828;
10829; RV64I-LABEL: atomicrmw_or_i32_acq_rel:
10830; RV64I:       # %bb.0:
10831; RV64I-NEXT:    addi sp, sp, -16
10832; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10833; RV64I-NEXT:    li a2, 4
10834; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10835; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10836; RV64I-NEXT:    addi sp, sp, 16
10837; RV64I-NEXT:    ret
10838;
10839; RV64IA-LABEL: atomicrmw_or_i32_acq_rel:
10840; RV64IA:       # %bb.0:
10841; RV64IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10842; RV64IA-NEXT:    ret
10843  %1 = atomicrmw or i32* %a, i32 %b acq_rel
10844  ret i32 %1
10845}
10846
10847define i32 @atomicrmw_or_i32_seq_cst(i32 *%a, i32 %b) nounwind {
10848; RV32I-LABEL: atomicrmw_or_i32_seq_cst:
10849; RV32I:       # %bb.0:
10850; RV32I-NEXT:    addi sp, sp, -16
10851; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10852; RV32I-NEXT:    li a2, 5
10853; RV32I-NEXT:    call __atomic_fetch_or_4@plt
10854; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10855; RV32I-NEXT:    addi sp, sp, 16
10856; RV32I-NEXT:    ret
10857;
10858; RV32IA-LABEL: atomicrmw_or_i32_seq_cst:
10859; RV32IA:       # %bb.0:
10860; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10861; RV32IA-NEXT:    ret
10862;
10863; RV64I-LABEL: atomicrmw_or_i32_seq_cst:
10864; RV64I:       # %bb.0:
10865; RV64I-NEXT:    addi sp, sp, -16
10866; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10867; RV64I-NEXT:    li a2, 5
10868; RV64I-NEXT:    call __atomic_fetch_or_4@plt
10869; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10870; RV64I-NEXT:    addi sp, sp, 16
10871; RV64I-NEXT:    ret
10872;
10873; RV64IA-LABEL: atomicrmw_or_i32_seq_cst:
10874; RV64IA:       # %bb.0:
10875; RV64IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
10876; RV64IA-NEXT:    ret
10877  %1 = atomicrmw or i32* %a, i32 %b seq_cst
10878  ret i32 %1
10879}
10880
10881define i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind {
10882; RV32I-LABEL: atomicrmw_xor_i32_monotonic:
10883; RV32I:       # %bb.0:
10884; RV32I-NEXT:    addi sp, sp, -16
10885; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10886; RV32I-NEXT:    li a2, 0
10887; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10888; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10889; RV32I-NEXT:    addi sp, sp, 16
10890; RV32I-NEXT:    ret
10891;
10892; RV32IA-LABEL: atomicrmw_xor_i32_monotonic:
10893; RV32IA:       # %bb.0:
10894; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
10895; RV32IA-NEXT:    ret
10896;
10897; RV64I-LABEL: atomicrmw_xor_i32_monotonic:
10898; RV64I:       # %bb.0:
10899; RV64I-NEXT:    addi sp, sp, -16
10900; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10901; RV64I-NEXT:    li a2, 0
10902; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
10903; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10904; RV64I-NEXT:    addi sp, sp, 16
10905; RV64I-NEXT:    ret
10906;
10907; RV64IA-LABEL: atomicrmw_xor_i32_monotonic:
10908; RV64IA:       # %bb.0:
10909; RV64IA-NEXT:    amoxor.w a0, a1, (a0)
10910; RV64IA-NEXT:    ret
10911  %1 = atomicrmw xor i32* %a, i32 %b monotonic
10912  ret i32 %1
10913}
10914
10915define i32 @atomicrmw_xor_i32_acquire(i32 *%a, i32 %b) nounwind {
10916; RV32I-LABEL: atomicrmw_xor_i32_acquire:
10917; RV32I:       # %bb.0:
10918; RV32I-NEXT:    addi sp, sp, -16
10919; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10920; RV32I-NEXT:    li a2, 2
10921; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10922; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10923; RV32I-NEXT:    addi sp, sp, 16
10924; RV32I-NEXT:    ret
10925;
10926; RV32IA-LABEL: atomicrmw_xor_i32_acquire:
10927; RV32IA:       # %bb.0:
10928; RV32IA-NEXT:    amoxor.w.aq a0, a1, (a0)
10929; RV32IA-NEXT:    ret
10930;
10931; RV64I-LABEL: atomicrmw_xor_i32_acquire:
10932; RV64I:       # %bb.0:
10933; RV64I-NEXT:    addi sp, sp, -16
10934; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10935; RV64I-NEXT:    li a2, 2
10936; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
10937; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10938; RV64I-NEXT:    addi sp, sp, 16
10939; RV64I-NEXT:    ret
10940;
10941; RV64IA-LABEL: atomicrmw_xor_i32_acquire:
10942; RV64IA:       # %bb.0:
10943; RV64IA-NEXT:    amoxor.w.aq a0, a1, (a0)
10944; RV64IA-NEXT:    ret
10945  %1 = atomicrmw xor i32* %a, i32 %b acquire
10946  ret i32 %1
10947}
10948
10949define i32 @atomicrmw_xor_i32_release(i32 *%a, i32 %b) nounwind {
10950; RV32I-LABEL: atomicrmw_xor_i32_release:
10951; RV32I:       # %bb.0:
10952; RV32I-NEXT:    addi sp, sp, -16
10953; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10954; RV32I-NEXT:    li a2, 3
10955; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10956; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10957; RV32I-NEXT:    addi sp, sp, 16
10958; RV32I-NEXT:    ret
10959;
10960; RV32IA-LABEL: atomicrmw_xor_i32_release:
10961; RV32IA:       # %bb.0:
10962; RV32IA-NEXT:    amoxor.w.rl a0, a1, (a0)
10963; RV32IA-NEXT:    ret
10964;
10965; RV64I-LABEL: atomicrmw_xor_i32_release:
10966; RV64I:       # %bb.0:
10967; RV64I-NEXT:    addi sp, sp, -16
10968; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10969; RV64I-NEXT:    li a2, 3
10970; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
10971; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10972; RV64I-NEXT:    addi sp, sp, 16
10973; RV64I-NEXT:    ret
10974;
10975; RV64IA-LABEL: atomicrmw_xor_i32_release:
10976; RV64IA:       # %bb.0:
10977; RV64IA-NEXT:    amoxor.w.rl a0, a1, (a0)
10978; RV64IA-NEXT:    ret
10979  %1 = atomicrmw xor i32* %a, i32 %b release
10980  ret i32 %1
10981}
10982
10983define i32 @atomicrmw_xor_i32_acq_rel(i32 *%a, i32 %b) nounwind {
10984; RV32I-LABEL: atomicrmw_xor_i32_acq_rel:
10985; RV32I:       # %bb.0:
10986; RV32I-NEXT:    addi sp, sp, -16
10987; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10988; RV32I-NEXT:    li a2, 4
10989; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
10990; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10991; RV32I-NEXT:    addi sp, sp, 16
10992; RV32I-NEXT:    ret
10993;
10994; RV32IA-LABEL: atomicrmw_xor_i32_acq_rel:
10995; RV32IA:       # %bb.0:
10996; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
10997; RV32IA-NEXT:    ret
10998;
10999; RV64I-LABEL: atomicrmw_xor_i32_acq_rel:
11000; RV64I:       # %bb.0:
11001; RV64I-NEXT:    addi sp, sp, -16
11002; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11003; RV64I-NEXT:    li a2, 4
11004; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
11005; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11006; RV64I-NEXT:    addi sp, sp, 16
11007; RV64I-NEXT:    ret
11008;
11009; RV64IA-LABEL: atomicrmw_xor_i32_acq_rel:
11010; RV64IA:       # %bb.0:
11011; RV64IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
11012; RV64IA-NEXT:    ret
11013  %1 = atomicrmw xor i32* %a, i32 %b acq_rel
11014  ret i32 %1
11015}
11016
11017define i32 @atomicrmw_xor_i32_seq_cst(i32 *%a, i32 %b) nounwind {
11018; RV32I-LABEL: atomicrmw_xor_i32_seq_cst:
11019; RV32I:       # %bb.0:
11020; RV32I-NEXT:    addi sp, sp, -16
11021; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11022; RV32I-NEXT:    li a2, 5
11023; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
11024; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11025; RV32I-NEXT:    addi sp, sp, 16
11026; RV32I-NEXT:    ret
11027;
11028; RV32IA-LABEL: atomicrmw_xor_i32_seq_cst:
11029; RV32IA:       # %bb.0:
11030; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
11031; RV32IA-NEXT:    ret
11032;
11033; RV64I-LABEL: atomicrmw_xor_i32_seq_cst:
11034; RV64I:       # %bb.0:
11035; RV64I-NEXT:    addi sp, sp, -16
11036; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11037; RV64I-NEXT:    li a2, 5
11038; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
11039; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11040; RV64I-NEXT:    addi sp, sp, 16
11041; RV64I-NEXT:    ret
11042;
11043; RV64IA-LABEL: atomicrmw_xor_i32_seq_cst:
11044; RV64IA:       # %bb.0:
11045; RV64IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
11046; RV64IA-NEXT:    ret
11047  %1 = atomicrmw xor i32* %a, i32 %b seq_cst
11048  ret i32 %1
11049}
11050
11051define i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind {
11052; RV32I-LABEL: atomicrmw_max_i32_monotonic:
11053; RV32I:       # %bb.0:
11054; RV32I-NEXT:    addi sp, sp, -16
11055; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11056; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11057; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11058; RV32I-NEXT:    mv s0, a0
11059; RV32I-NEXT:    lw a3, 0(a0)
11060; RV32I-NEXT:    mv s1, a1
11061; RV32I-NEXT:    j .LBB145_2
11062; RV32I-NEXT:  .LBB145_1: # %atomicrmw.start
11063; RV32I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11064; RV32I-NEXT:    sw a3, 0(sp)
11065; RV32I-NEXT:    mv a1, sp
11066; RV32I-NEXT:    mv a0, s0
11067; RV32I-NEXT:    li a3, 0
11068; RV32I-NEXT:    li a4, 0
11069; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11070; RV32I-NEXT:    lw a3, 0(sp)
11071; RV32I-NEXT:    bnez a0, .LBB145_4
11072; RV32I-NEXT:  .LBB145_2: # %atomicrmw.start
11073; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11074; RV32I-NEXT:    mv a2, a3
11075; RV32I-NEXT:    blt s1, a3, .LBB145_1
11076; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11077; RV32I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11078; RV32I-NEXT:    mv a2, s1
11079; RV32I-NEXT:    j .LBB145_1
11080; RV32I-NEXT:  .LBB145_4: # %atomicrmw.end
11081; RV32I-NEXT:    mv a0, a3
11082; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11083; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11084; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11085; RV32I-NEXT:    addi sp, sp, 16
11086; RV32I-NEXT:    ret
11087;
11088; RV32IA-LABEL: atomicrmw_max_i32_monotonic:
11089; RV32IA:       # %bb.0:
11090; RV32IA-NEXT:    amomax.w a0, a1, (a0)
11091; RV32IA-NEXT:    ret
11092;
11093; RV64I-LABEL: atomicrmw_max_i32_monotonic:
11094; RV64I:       # %bb.0:
11095; RV64I-NEXT:    addi sp, sp, -48
11096; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11097; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11098; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11099; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11100; RV64I-NEXT:    mv s0, a0
11101; RV64I-NEXT:    lw a3, 0(a0)
11102; RV64I-NEXT:    mv s2, a1
11103; RV64I-NEXT:    sext.w s1, a1
11104; RV64I-NEXT:    j .LBB145_2
11105; RV64I-NEXT:  .LBB145_1: # %atomicrmw.start
11106; RV64I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11107; RV64I-NEXT:    sw a3, 12(sp)
11108; RV64I-NEXT:    addi a1, sp, 12
11109; RV64I-NEXT:    mv a0, s0
11110; RV64I-NEXT:    li a3, 0
11111; RV64I-NEXT:    li a4, 0
11112; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11113; RV64I-NEXT:    lw a3, 12(sp)
11114; RV64I-NEXT:    bnez a0, .LBB145_4
11115; RV64I-NEXT:  .LBB145_2: # %atomicrmw.start
11116; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11117; RV64I-NEXT:    mv a2, a3
11118; RV64I-NEXT:    blt s1, a3, .LBB145_1
11119; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11120; RV64I-NEXT:    # in Loop: Header=BB145_2 Depth=1
11121; RV64I-NEXT:    mv a2, s2
11122; RV64I-NEXT:    j .LBB145_1
11123; RV64I-NEXT:  .LBB145_4: # %atomicrmw.end
11124; RV64I-NEXT:    mv a0, a3
11125; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11126; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11127; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11128; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11129; RV64I-NEXT:    addi sp, sp, 48
11130; RV64I-NEXT:    ret
11131;
11132; RV64IA-LABEL: atomicrmw_max_i32_monotonic:
11133; RV64IA:       # %bb.0:
11134; RV64IA-NEXT:    amomax.w a0, a1, (a0)
11135; RV64IA-NEXT:    ret
11136  %1 = atomicrmw max i32* %a, i32 %b monotonic
11137  ret i32 %1
11138}
11139
11140define i32 @atomicrmw_max_i32_acquire(i32 *%a, i32 %b) nounwind {
11141; RV32I-LABEL: atomicrmw_max_i32_acquire:
11142; RV32I:       # %bb.0:
11143; RV32I-NEXT:    addi sp, sp, -16
11144; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11145; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11146; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11147; RV32I-NEXT:    mv s0, a0
11148; RV32I-NEXT:    lw a3, 0(a0)
11149; RV32I-NEXT:    mv s1, a1
11150; RV32I-NEXT:    j .LBB146_2
11151; RV32I-NEXT:  .LBB146_1: # %atomicrmw.start
11152; RV32I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11153; RV32I-NEXT:    sw a3, 0(sp)
11154; RV32I-NEXT:    mv a1, sp
11155; RV32I-NEXT:    li a3, 2
11156; RV32I-NEXT:    li a4, 2
11157; RV32I-NEXT:    mv a0, s0
11158; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11159; RV32I-NEXT:    lw a3, 0(sp)
11160; RV32I-NEXT:    bnez a0, .LBB146_4
11161; RV32I-NEXT:  .LBB146_2: # %atomicrmw.start
11162; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11163; RV32I-NEXT:    mv a2, a3
11164; RV32I-NEXT:    blt s1, a3, .LBB146_1
11165; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11166; RV32I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11167; RV32I-NEXT:    mv a2, s1
11168; RV32I-NEXT:    j .LBB146_1
11169; RV32I-NEXT:  .LBB146_4: # %atomicrmw.end
11170; RV32I-NEXT:    mv a0, a3
11171; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11172; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11173; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11174; RV32I-NEXT:    addi sp, sp, 16
11175; RV32I-NEXT:    ret
11176;
11177; RV32IA-LABEL: atomicrmw_max_i32_acquire:
11178; RV32IA:       # %bb.0:
11179; RV32IA-NEXT:    amomax.w.aq a0, a1, (a0)
11180; RV32IA-NEXT:    ret
11181;
11182; RV64I-LABEL: atomicrmw_max_i32_acquire:
11183; RV64I:       # %bb.0:
11184; RV64I-NEXT:    addi sp, sp, -48
11185; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11186; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11187; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11188; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11189; RV64I-NEXT:    mv s0, a0
11190; RV64I-NEXT:    lw a3, 0(a0)
11191; RV64I-NEXT:    mv s2, a1
11192; RV64I-NEXT:    sext.w s1, a1
11193; RV64I-NEXT:    j .LBB146_2
11194; RV64I-NEXT:  .LBB146_1: # %atomicrmw.start
11195; RV64I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11196; RV64I-NEXT:    sw a3, 12(sp)
11197; RV64I-NEXT:    addi a1, sp, 12
11198; RV64I-NEXT:    li a3, 2
11199; RV64I-NEXT:    li a4, 2
11200; RV64I-NEXT:    mv a0, s0
11201; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11202; RV64I-NEXT:    lw a3, 12(sp)
11203; RV64I-NEXT:    bnez a0, .LBB146_4
11204; RV64I-NEXT:  .LBB146_2: # %atomicrmw.start
11205; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11206; RV64I-NEXT:    mv a2, a3
11207; RV64I-NEXT:    blt s1, a3, .LBB146_1
11208; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11209; RV64I-NEXT:    # in Loop: Header=BB146_2 Depth=1
11210; RV64I-NEXT:    mv a2, s2
11211; RV64I-NEXT:    j .LBB146_1
11212; RV64I-NEXT:  .LBB146_4: # %atomicrmw.end
11213; RV64I-NEXT:    mv a0, a3
11214; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11215; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11216; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11217; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11218; RV64I-NEXT:    addi sp, sp, 48
11219; RV64I-NEXT:    ret
11220;
11221; RV64IA-LABEL: atomicrmw_max_i32_acquire:
11222; RV64IA:       # %bb.0:
11223; RV64IA-NEXT:    amomax.w.aq a0, a1, (a0)
11224; RV64IA-NEXT:    ret
11225  %1 = atomicrmw max i32* %a, i32 %b acquire
11226  ret i32 %1
11227}
11228
11229define i32 @atomicrmw_max_i32_release(i32 *%a, i32 %b) nounwind {
11230; RV32I-LABEL: atomicrmw_max_i32_release:
11231; RV32I:       # %bb.0:
11232; RV32I-NEXT:    addi sp, sp, -16
11233; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11234; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11235; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11236; RV32I-NEXT:    mv s0, a0
11237; RV32I-NEXT:    lw a3, 0(a0)
11238; RV32I-NEXT:    mv s1, a1
11239; RV32I-NEXT:    j .LBB147_2
11240; RV32I-NEXT:  .LBB147_1: # %atomicrmw.start
11241; RV32I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11242; RV32I-NEXT:    sw a3, 0(sp)
11243; RV32I-NEXT:    mv a1, sp
11244; RV32I-NEXT:    li a3, 3
11245; RV32I-NEXT:    mv a0, s0
11246; RV32I-NEXT:    li a4, 0
11247; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11248; RV32I-NEXT:    lw a3, 0(sp)
11249; RV32I-NEXT:    bnez a0, .LBB147_4
11250; RV32I-NEXT:  .LBB147_2: # %atomicrmw.start
11251; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11252; RV32I-NEXT:    mv a2, a3
11253; RV32I-NEXT:    blt s1, a3, .LBB147_1
11254; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11255; RV32I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11256; RV32I-NEXT:    mv a2, s1
11257; RV32I-NEXT:    j .LBB147_1
11258; RV32I-NEXT:  .LBB147_4: # %atomicrmw.end
11259; RV32I-NEXT:    mv a0, a3
11260; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11261; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11262; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11263; RV32I-NEXT:    addi sp, sp, 16
11264; RV32I-NEXT:    ret
11265;
11266; RV32IA-LABEL: atomicrmw_max_i32_release:
11267; RV32IA:       # %bb.0:
11268; RV32IA-NEXT:    amomax.w.rl a0, a1, (a0)
11269; RV32IA-NEXT:    ret
11270;
11271; RV64I-LABEL: atomicrmw_max_i32_release:
11272; RV64I:       # %bb.0:
11273; RV64I-NEXT:    addi sp, sp, -48
11274; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11275; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11276; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11277; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11278; RV64I-NEXT:    mv s0, a0
11279; RV64I-NEXT:    lw a3, 0(a0)
11280; RV64I-NEXT:    mv s2, a1
11281; RV64I-NEXT:    sext.w s1, a1
11282; RV64I-NEXT:    j .LBB147_2
11283; RV64I-NEXT:  .LBB147_1: # %atomicrmw.start
11284; RV64I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11285; RV64I-NEXT:    sw a3, 12(sp)
11286; RV64I-NEXT:    addi a1, sp, 12
11287; RV64I-NEXT:    li a3, 3
11288; RV64I-NEXT:    mv a0, s0
11289; RV64I-NEXT:    li a4, 0
11290; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11291; RV64I-NEXT:    lw a3, 12(sp)
11292; RV64I-NEXT:    bnez a0, .LBB147_4
11293; RV64I-NEXT:  .LBB147_2: # %atomicrmw.start
11294; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11295; RV64I-NEXT:    mv a2, a3
11296; RV64I-NEXT:    blt s1, a3, .LBB147_1
11297; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11298; RV64I-NEXT:    # in Loop: Header=BB147_2 Depth=1
11299; RV64I-NEXT:    mv a2, s2
11300; RV64I-NEXT:    j .LBB147_1
11301; RV64I-NEXT:  .LBB147_4: # %atomicrmw.end
11302; RV64I-NEXT:    mv a0, a3
11303; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11304; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11305; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11306; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11307; RV64I-NEXT:    addi sp, sp, 48
11308; RV64I-NEXT:    ret
11309;
11310; RV64IA-LABEL: atomicrmw_max_i32_release:
11311; RV64IA:       # %bb.0:
11312; RV64IA-NEXT:    amomax.w.rl a0, a1, (a0)
11313; RV64IA-NEXT:    ret
11314  %1 = atomicrmw max i32* %a, i32 %b release
11315  ret i32 %1
11316}
11317
11318define i32 @atomicrmw_max_i32_acq_rel(i32 *%a, i32 %b) nounwind {
11319; RV32I-LABEL: atomicrmw_max_i32_acq_rel:
11320; RV32I:       # %bb.0:
11321; RV32I-NEXT:    addi sp, sp, -16
11322; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11323; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11324; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11325; RV32I-NEXT:    mv s0, a0
11326; RV32I-NEXT:    lw a3, 0(a0)
11327; RV32I-NEXT:    mv s1, a1
11328; RV32I-NEXT:    j .LBB148_2
11329; RV32I-NEXT:  .LBB148_1: # %atomicrmw.start
11330; RV32I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11331; RV32I-NEXT:    sw a3, 0(sp)
11332; RV32I-NEXT:    mv a1, sp
11333; RV32I-NEXT:    li a3, 4
11334; RV32I-NEXT:    li a4, 2
11335; RV32I-NEXT:    mv a0, s0
11336; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11337; RV32I-NEXT:    lw a3, 0(sp)
11338; RV32I-NEXT:    bnez a0, .LBB148_4
11339; RV32I-NEXT:  .LBB148_2: # %atomicrmw.start
11340; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11341; RV32I-NEXT:    mv a2, a3
11342; RV32I-NEXT:    blt s1, a3, .LBB148_1
11343; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11344; RV32I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11345; RV32I-NEXT:    mv a2, s1
11346; RV32I-NEXT:    j .LBB148_1
11347; RV32I-NEXT:  .LBB148_4: # %atomicrmw.end
11348; RV32I-NEXT:    mv a0, a3
11349; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11350; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11351; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11352; RV32I-NEXT:    addi sp, sp, 16
11353; RV32I-NEXT:    ret
11354;
11355; RV32IA-LABEL: atomicrmw_max_i32_acq_rel:
11356; RV32IA:       # %bb.0:
11357; RV32IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11358; RV32IA-NEXT:    ret
11359;
11360; RV64I-LABEL: atomicrmw_max_i32_acq_rel:
11361; RV64I:       # %bb.0:
11362; RV64I-NEXT:    addi sp, sp, -48
11363; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11364; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11365; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11366; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11367; RV64I-NEXT:    mv s0, a0
11368; RV64I-NEXT:    lw a3, 0(a0)
11369; RV64I-NEXT:    mv s2, a1
11370; RV64I-NEXT:    sext.w s1, a1
11371; RV64I-NEXT:    j .LBB148_2
11372; RV64I-NEXT:  .LBB148_1: # %atomicrmw.start
11373; RV64I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11374; RV64I-NEXT:    sw a3, 12(sp)
11375; RV64I-NEXT:    addi a1, sp, 12
11376; RV64I-NEXT:    li a3, 4
11377; RV64I-NEXT:    li a4, 2
11378; RV64I-NEXT:    mv a0, s0
11379; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11380; RV64I-NEXT:    lw a3, 12(sp)
11381; RV64I-NEXT:    bnez a0, .LBB148_4
11382; RV64I-NEXT:  .LBB148_2: # %atomicrmw.start
11383; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11384; RV64I-NEXT:    mv a2, a3
11385; RV64I-NEXT:    blt s1, a3, .LBB148_1
11386; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11387; RV64I-NEXT:    # in Loop: Header=BB148_2 Depth=1
11388; RV64I-NEXT:    mv a2, s2
11389; RV64I-NEXT:    j .LBB148_1
11390; RV64I-NEXT:  .LBB148_4: # %atomicrmw.end
11391; RV64I-NEXT:    mv a0, a3
11392; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11393; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11394; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11395; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11396; RV64I-NEXT:    addi sp, sp, 48
11397; RV64I-NEXT:    ret
11398;
11399; RV64IA-LABEL: atomicrmw_max_i32_acq_rel:
11400; RV64IA:       # %bb.0:
11401; RV64IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11402; RV64IA-NEXT:    ret
11403  %1 = atomicrmw max i32* %a, i32 %b acq_rel
11404  ret i32 %1
11405}
11406
11407define i32 @atomicrmw_max_i32_seq_cst(i32 *%a, i32 %b) nounwind {
11408; RV32I-LABEL: atomicrmw_max_i32_seq_cst:
11409; RV32I:       # %bb.0:
11410; RV32I-NEXT:    addi sp, sp, -16
11411; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11412; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11413; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11414; RV32I-NEXT:    mv s0, a0
11415; RV32I-NEXT:    lw a3, 0(a0)
11416; RV32I-NEXT:    mv s1, a1
11417; RV32I-NEXT:    j .LBB149_2
11418; RV32I-NEXT:  .LBB149_1: # %atomicrmw.start
11419; RV32I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11420; RV32I-NEXT:    sw a3, 0(sp)
11421; RV32I-NEXT:    mv a1, sp
11422; RV32I-NEXT:    li a3, 5
11423; RV32I-NEXT:    li a4, 5
11424; RV32I-NEXT:    mv a0, s0
11425; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11426; RV32I-NEXT:    lw a3, 0(sp)
11427; RV32I-NEXT:    bnez a0, .LBB149_4
11428; RV32I-NEXT:  .LBB149_2: # %atomicrmw.start
11429; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11430; RV32I-NEXT:    mv a2, a3
11431; RV32I-NEXT:    blt s1, a3, .LBB149_1
11432; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11433; RV32I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11434; RV32I-NEXT:    mv a2, s1
11435; RV32I-NEXT:    j .LBB149_1
11436; RV32I-NEXT:  .LBB149_4: # %atomicrmw.end
11437; RV32I-NEXT:    mv a0, a3
11438; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11439; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11440; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11441; RV32I-NEXT:    addi sp, sp, 16
11442; RV32I-NEXT:    ret
11443;
11444; RV32IA-LABEL: atomicrmw_max_i32_seq_cst:
11445; RV32IA:       # %bb.0:
11446; RV32IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11447; RV32IA-NEXT:    ret
11448;
11449; RV64I-LABEL: atomicrmw_max_i32_seq_cst:
11450; RV64I:       # %bb.0:
11451; RV64I-NEXT:    addi sp, sp, -48
11452; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11453; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11454; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11455; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11456; RV64I-NEXT:    mv s0, a0
11457; RV64I-NEXT:    lw a3, 0(a0)
11458; RV64I-NEXT:    mv s2, a1
11459; RV64I-NEXT:    sext.w s1, a1
11460; RV64I-NEXT:    j .LBB149_2
11461; RV64I-NEXT:  .LBB149_1: # %atomicrmw.start
11462; RV64I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11463; RV64I-NEXT:    sw a3, 12(sp)
11464; RV64I-NEXT:    addi a1, sp, 12
11465; RV64I-NEXT:    li a3, 5
11466; RV64I-NEXT:    li a4, 5
11467; RV64I-NEXT:    mv a0, s0
11468; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11469; RV64I-NEXT:    lw a3, 12(sp)
11470; RV64I-NEXT:    bnez a0, .LBB149_4
11471; RV64I-NEXT:  .LBB149_2: # %atomicrmw.start
11472; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11473; RV64I-NEXT:    mv a2, a3
11474; RV64I-NEXT:    blt s1, a3, .LBB149_1
11475; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11476; RV64I-NEXT:    # in Loop: Header=BB149_2 Depth=1
11477; RV64I-NEXT:    mv a2, s2
11478; RV64I-NEXT:    j .LBB149_1
11479; RV64I-NEXT:  .LBB149_4: # %atomicrmw.end
11480; RV64I-NEXT:    mv a0, a3
11481; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11482; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11483; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11484; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11485; RV64I-NEXT:    addi sp, sp, 48
11486; RV64I-NEXT:    ret
11487;
11488; RV64IA-LABEL: atomicrmw_max_i32_seq_cst:
11489; RV64IA:       # %bb.0:
11490; RV64IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
11491; RV64IA-NEXT:    ret
11492  %1 = atomicrmw max i32* %a, i32 %b seq_cst
11493  ret i32 %1
11494}
11495
11496define i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind {
11497; RV32I-LABEL: atomicrmw_min_i32_monotonic:
11498; RV32I:       # %bb.0:
11499; RV32I-NEXT:    addi sp, sp, -16
11500; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11501; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11502; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11503; RV32I-NEXT:    mv s0, a0
11504; RV32I-NEXT:    lw a3, 0(a0)
11505; RV32I-NEXT:    mv s1, a1
11506; RV32I-NEXT:    j .LBB150_2
11507; RV32I-NEXT:  .LBB150_1: # %atomicrmw.start
11508; RV32I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11509; RV32I-NEXT:    sw a3, 0(sp)
11510; RV32I-NEXT:    mv a1, sp
11511; RV32I-NEXT:    mv a0, s0
11512; RV32I-NEXT:    li a3, 0
11513; RV32I-NEXT:    li a4, 0
11514; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11515; RV32I-NEXT:    lw a3, 0(sp)
11516; RV32I-NEXT:    bnez a0, .LBB150_4
11517; RV32I-NEXT:  .LBB150_2: # %atomicrmw.start
11518; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11519; RV32I-NEXT:    mv a2, a3
11520; RV32I-NEXT:    bge s1, a3, .LBB150_1
11521; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11522; RV32I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11523; RV32I-NEXT:    mv a2, s1
11524; RV32I-NEXT:    j .LBB150_1
11525; RV32I-NEXT:  .LBB150_4: # %atomicrmw.end
11526; RV32I-NEXT:    mv a0, a3
11527; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11528; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11529; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11530; RV32I-NEXT:    addi sp, sp, 16
11531; RV32I-NEXT:    ret
11532;
11533; RV32IA-LABEL: atomicrmw_min_i32_monotonic:
11534; RV32IA:       # %bb.0:
11535; RV32IA-NEXT:    amomin.w a0, a1, (a0)
11536; RV32IA-NEXT:    ret
11537;
11538; RV64I-LABEL: atomicrmw_min_i32_monotonic:
11539; RV64I:       # %bb.0:
11540; RV64I-NEXT:    addi sp, sp, -48
11541; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11542; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11543; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11544; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11545; RV64I-NEXT:    mv s0, a0
11546; RV64I-NEXT:    lw a3, 0(a0)
11547; RV64I-NEXT:    mv s2, a1
11548; RV64I-NEXT:    sext.w s1, a1
11549; RV64I-NEXT:    j .LBB150_2
11550; RV64I-NEXT:  .LBB150_1: # %atomicrmw.start
11551; RV64I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11552; RV64I-NEXT:    sw a3, 12(sp)
11553; RV64I-NEXT:    addi a1, sp, 12
11554; RV64I-NEXT:    mv a0, s0
11555; RV64I-NEXT:    li a3, 0
11556; RV64I-NEXT:    li a4, 0
11557; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11558; RV64I-NEXT:    lw a3, 12(sp)
11559; RV64I-NEXT:    bnez a0, .LBB150_4
11560; RV64I-NEXT:  .LBB150_2: # %atomicrmw.start
11561; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11562; RV64I-NEXT:    mv a2, a3
11563; RV64I-NEXT:    bge s1, a3, .LBB150_1
11564; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11565; RV64I-NEXT:    # in Loop: Header=BB150_2 Depth=1
11566; RV64I-NEXT:    mv a2, s2
11567; RV64I-NEXT:    j .LBB150_1
11568; RV64I-NEXT:  .LBB150_4: # %atomicrmw.end
11569; RV64I-NEXT:    mv a0, a3
11570; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11571; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11572; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11573; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11574; RV64I-NEXT:    addi sp, sp, 48
11575; RV64I-NEXT:    ret
11576;
11577; RV64IA-LABEL: atomicrmw_min_i32_monotonic:
11578; RV64IA:       # %bb.0:
11579; RV64IA-NEXT:    amomin.w a0, a1, (a0)
11580; RV64IA-NEXT:    ret
11581  %1 = atomicrmw min i32* %a, i32 %b monotonic
11582  ret i32 %1
11583}
11584
11585define i32 @atomicrmw_min_i32_acquire(i32 *%a, i32 %b) nounwind {
11586; RV32I-LABEL: atomicrmw_min_i32_acquire:
11587; RV32I:       # %bb.0:
11588; RV32I-NEXT:    addi sp, sp, -16
11589; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11590; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11591; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11592; RV32I-NEXT:    mv s0, a0
11593; RV32I-NEXT:    lw a3, 0(a0)
11594; RV32I-NEXT:    mv s1, a1
11595; RV32I-NEXT:    j .LBB151_2
11596; RV32I-NEXT:  .LBB151_1: # %atomicrmw.start
11597; RV32I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11598; RV32I-NEXT:    sw a3, 0(sp)
11599; RV32I-NEXT:    mv a1, sp
11600; RV32I-NEXT:    li a3, 2
11601; RV32I-NEXT:    li a4, 2
11602; RV32I-NEXT:    mv a0, s0
11603; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11604; RV32I-NEXT:    lw a3, 0(sp)
11605; RV32I-NEXT:    bnez a0, .LBB151_4
11606; RV32I-NEXT:  .LBB151_2: # %atomicrmw.start
11607; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11608; RV32I-NEXT:    mv a2, a3
11609; RV32I-NEXT:    bge s1, a3, .LBB151_1
11610; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11611; RV32I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11612; RV32I-NEXT:    mv a2, s1
11613; RV32I-NEXT:    j .LBB151_1
11614; RV32I-NEXT:  .LBB151_4: # %atomicrmw.end
11615; RV32I-NEXT:    mv a0, a3
11616; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11617; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11618; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11619; RV32I-NEXT:    addi sp, sp, 16
11620; RV32I-NEXT:    ret
11621;
11622; RV32IA-LABEL: atomicrmw_min_i32_acquire:
11623; RV32IA:       # %bb.0:
11624; RV32IA-NEXT:    amomin.w.aq a0, a1, (a0)
11625; RV32IA-NEXT:    ret
11626;
11627; RV64I-LABEL: atomicrmw_min_i32_acquire:
11628; RV64I:       # %bb.0:
11629; RV64I-NEXT:    addi sp, sp, -48
11630; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11631; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11632; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11633; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11634; RV64I-NEXT:    mv s0, a0
11635; RV64I-NEXT:    lw a3, 0(a0)
11636; RV64I-NEXT:    mv s2, a1
11637; RV64I-NEXT:    sext.w s1, a1
11638; RV64I-NEXT:    j .LBB151_2
11639; RV64I-NEXT:  .LBB151_1: # %atomicrmw.start
11640; RV64I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11641; RV64I-NEXT:    sw a3, 12(sp)
11642; RV64I-NEXT:    addi a1, sp, 12
11643; RV64I-NEXT:    li a3, 2
11644; RV64I-NEXT:    li a4, 2
11645; RV64I-NEXT:    mv a0, s0
11646; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11647; RV64I-NEXT:    lw a3, 12(sp)
11648; RV64I-NEXT:    bnez a0, .LBB151_4
11649; RV64I-NEXT:  .LBB151_2: # %atomicrmw.start
11650; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11651; RV64I-NEXT:    mv a2, a3
11652; RV64I-NEXT:    bge s1, a3, .LBB151_1
11653; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11654; RV64I-NEXT:    # in Loop: Header=BB151_2 Depth=1
11655; RV64I-NEXT:    mv a2, s2
11656; RV64I-NEXT:    j .LBB151_1
11657; RV64I-NEXT:  .LBB151_4: # %atomicrmw.end
11658; RV64I-NEXT:    mv a0, a3
11659; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11660; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11661; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11662; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11663; RV64I-NEXT:    addi sp, sp, 48
11664; RV64I-NEXT:    ret
11665;
11666; RV64IA-LABEL: atomicrmw_min_i32_acquire:
11667; RV64IA:       # %bb.0:
11668; RV64IA-NEXT:    amomin.w.aq a0, a1, (a0)
11669; RV64IA-NEXT:    ret
11670  %1 = atomicrmw min i32* %a, i32 %b acquire
11671  ret i32 %1
11672}
11673
11674define i32 @atomicrmw_min_i32_release(i32 *%a, i32 %b) nounwind {
11675; RV32I-LABEL: atomicrmw_min_i32_release:
11676; RV32I:       # %bb.0:
11677; RV32I-NEXT:    addi sp, sp, -16
11678; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11679; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11680; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11681; RV32I-NEXT:    mv s0, a0
11682; RV32I-NEXT:    lw a3, 0(a0)
11683; RV32I-NEXT:    mv s1, a1
11684; RV32I-NEXT:    j .LBB152_2
11685; RV32I-NEXT:  .LBB152_1: # %atomicrmw.start
11686; RV32I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11687; RV32I-NEXT:    sw a3, 0(sp)
11688; RV32I-NEXT:    mv a1, sp
11689; RV32I-NEXT:    li a3, 3
11690; RV32I-NEXT:    mv a0, s0
11691; RV32I-NEXT:    li a4, 0
11692; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11693; RV32I-NEXT:    lw a3, 0(sp)
11694; RV32I-NEXT:    bnez a0, .LBB152_4
11695; RV32I-NEXT:  .LBB152_2: # %atomicrmw.start
11696; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11697; RV32I-NEXT:    mv a2, a3
11698; RV32I-NEXT:    bge s1, a3, .LBB152_1
11699; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11700; RV32I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11701; RV32I-NEXT:    mv a2, s1
11702; RV32I-NEXT:    j .LBB152_1
11703; RV32I-NEXT:  .LBB152_4: # %atomicrmw.end
11704; RV32I-NEXT:    mv a0, a3
11705; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11706; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11707; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11708; RV32I-NEXT:    addi sp, sp, 16
11709; RV32I-NEXT:    ret
11710;
11711; RV32IA-LABEL: atomicrmw_min_i32_release:
11712; RV32IA:       # %bb.0:
11713; RV32IA-NEXT:    amomin.w.rl a0, a1, (a0)
11714; RV32IA-NEXT:    ret
11715;
11716; RV64I-LABEL: atomicrmw_min_i32_release:
11717; RV64I:       # %bb.0:
11718; RV64I-NEXT:    addi sp, sp, -48
11719; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11720; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11721; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11722; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11723; RV64I-NEXT:    mv s0, a0
11724; RV64I-NEXT:    lw a3, 0(a0)
11725; RV64I-NEXT:    mv s2, a1
11726; RV64I-NEXT:    sext.w s1, a1
11727; RV64I-NEXT:    j .LBB152_2
11728; RV64I-NEXT:  .LBB152_1: # %atomicrmw.start
11729; RV64I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11730; RV64I-NEXT:    sw a3, 12(sp)
11731; RV64I-NEXT:    addi a1, sp, 12
11732; RV64I-NEXT:    li a3, 3
11733; RV64I-NEXT:    mv a0, s0
11734; RV64I-NEXT:    li a4, 0
11735; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11736; RV64I-NEXT:    lw a3, 12(sp)
11737; RV64I-NEXT:    bnez a0, .LBB152_4
11738; RV64I-NEXT:  .LBB152_2: # %atomicrmw.start
11739; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11740; RV64I-NEXT:    mv a2, a3
11741; RV64I-NEXT:    bge s1, a3, .LBB152_1
11742; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11743; RV64I-NEXT:    # in Loop: Header=BB152_2 Depth=1
11744; RV64I-NEXT:    mv a2, s2
11745; RV64I-NEXT:    j .LBB152_1
11746; RV64I-NEXT:  .LBB152_4: # %atomicrmw.end
11747; RV64I-NEXT:    mv a0, a3
11748; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11749; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11750; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11751; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11752; RV64I-NEXT:    addi sp, sp, 48
11753; RV64I-NEXT:    ret
11754;
11755; RV64IA-LABEL: atomicrmw_min_i32_release:
11756; RV64IA:       # %bb.0:
11757; RV64IA-NEXT:    amomin.w.rl a0, a1, (a0)
11758; RV64IA-NEXT:    ret
11759  %1 = atomicrmw min i32* %a, i32 %b release
11760  ret i32 %1
11761}
11762
11763define i32 @atomicrmw_min_i32_acq_rel(i32 *%a, i32 %b) nounwind {
11764; RV32I-LABEL: atomicrmw_min_i32_acq_rel:
11765; RV32I:       # %bb.0:
11766; RV32I-NEXT:    addi sp, sp, -16
11767; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11768; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11769; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11770; RV32I-NEXT:    mv s0, a0
11771; RV32I-NEXT:    lw a3, 0(a0)
11772; RV32I-NEXT:    mv s1, a1
11773; RV32I-NEXT:    j .LBB153_2
11774; RV32I-NEXT:  .LBB153_1: # %atomicrmw.start
11775; RV32I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11776; RV32I-NEXT:    sw a3, 0(sp)
11777; RV32I-NEXT:    mv a1, sp
11778; RV32I-NEXT:    li a3, 4
11779; RV32I-NEXT:    li a4, 2
11780; RV32I-NEXT:    mv a0, s0
11781; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11782; RV32I-NEXT:    lw a3, 0(sp)
11783; RV32I-NEXT:    bnez a0, .LBB153_4
11784; RV32I-NEXT:  .LBB153_2: # %atomicrmw.start
11785; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11786; RV32I-NEXT:    mv a2, a3
11787; RV32I-NEXT:    bge s1, a3, .LBB153_1
11788; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11789; RV32I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11790; RV32I-NEXT:    mv a2, s1
11791; RV32I-NEXT:    j .LBB153_1
11792; RV32I-NEXT:  .LBB153_4: # %atomicrmw.end
11793; RV32I-NEXT:    mv a0, a3
11794; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11795; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11796; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11797; RV32I-NEXT:    addi sp, sp, 16
11798; RV32I-NEXT:    ret
11799;
11800; RV32IA-LABEL: atomicrmw_min_i32_acq_rel:
11801; RV32IA:       # %bb.0:
11802; RV32IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11803; RV32IA-NEXT:    ret
11804;
11805; RV64I-LABEL: atomicrmw_min_i32_acq_rel:
11806; RV64I:       # %bb.0:
11807; RV64I-NEXT:    addi sp, sp, -48
11808; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11809; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11810; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11811; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11812; RV64I-NEXT:    mv s0, a0
11813; RV64I-NEXT:    lw a3, 0(a0)
11814; RV64I-NEXT:    mv s2, a1
11815; RV64I-NEXT:    sext.w s1, a1
11816; RV64I-NEXT:    j .LBB153_2
11817; RV64I-NEXT:  .LBB153_1: # %atomicrmw.start
11818; RV64I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11819; RV64I-NEXT:    sw a3, 12(sp)
11820; RV64I-NEXT:    addi a1, sp, 12
11821; RV64I-NEXT:    li a3, 4
11822; RV64I-NEXT:    li a4, 2
11823; RV64I-NEXT:    mv a0, s0
11824; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11825; RV64I-NEXT:    lw a3, 12(sp)
11826; RV64I-NEXT:    bnez a0, .LBB153_4
11827; RV64I-NEXT:  .LBB153_2: # %atomicrmw.start
11828; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11829; RV64I-NEXT:    mv a2, a3
11830; RV64I-NEXT:    bge s1, a3, .LBB153_1
11831; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11832; RV64I-NEXT:    # in Loop: Header=BB153_2 Depth=1
11833; RV64I-NEXT:    mv a2, s2
11834; RV64I-NEXT:    j .LBB153_1
11835; RV64I-NEXT:  .LBB153_4: # %atomicrmw.end
11836; RV64I-NEXT:    mv a0, a3
11837; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11838; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11839; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11840; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11841; RV64I-NEXT:    addi sp, sp, 48
11842; RV64I-NEXT:    ret
11843;
11844; RV64IA-LABEL: atomicrmw_min_i32_acq_rel:
11845; RV64IA:       # %bb.0:
11846; RV64IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11847; RV64IA-NEXT:    ret
11848  %1 = atomicrmw min i32* %a, i32 %b acq_rel
11849  ret i32 %1
11850}
11851
11852define i32 @atomicrmw_min_i32_seq_cst(i32 *%a, i32 %b) nounwind {
11853; RV32I-LABEL: atomicrmw_min_i32_seq_cst:
11854; RV32I:       # %bb.0:
11855; RV32I-NEXT:    addi sp, sp, -16
11856; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11857; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11858; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11859; RV32I-NEXT:    mv s0, a0
11860; RV32I-NEXT:    lw a3, 0(a0)
11861; RV32I-NEXT:    mv s1, a1
11862; RV32I-NEXT:    j .LBB154_2
11863; RV32I-NEXT:  .LBB154_1: # %atomicrmw.start
11864; RV32I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11865; RV32I-NEXT:    sw a3, 0(sp)
11866; RV32I-NEXT:    mv a1, sp
11867; RV32I-NEXT:    li a3, 5
11868; RV32I-NEXT:    li a4, 5
11869; RV32I-NEXT:    mv a0, s0
11870; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11871; RV32I-NEXT:    lw a3, 0(sp)
11872; RV32I-NEXT:    bnez a0, .LBB154_4
11873; RV32I-NEXT:  .LBB154_2: # %atomicrmw.start
11874; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11875; RV32I-NEXT:    mv a2, a3
11876; RV32I-NEXT:    bge s1, a3, .LBB154_1
11877; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11878; RV32I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11879; RV32I-NEXT:    mv a2, s1
11880; RV32I-NEXT:    j .LBB154_1
11881; RV32I-NEXT:  .LBB154_4: # %atomicrmw.end
11882; RV32I-NEXT:    mv a0, a3
11883; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11884; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11885; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11886; RV32I-NEXT:    addi sp, sp, 16
11887; RV32I-NEXT:    ret
11888;
11889; RV32IA-LABEL: atomicrmw_min_i32_seq_cst:
11890; RV32IA:       # %bb.0:
11891; RV32IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11892; RV32IA-NEXT:    ret
11893;
11894; RV64I-LABEL: atomicrmw_min_i32_seq_cst:
11895; RV64I:       # %bb.0:
11896; RV64I-NEXT:    addi sp, sp, -48
11897; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11898; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11899; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11900; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11901; RV64I-NEXT:    mv s0, a0
11902; RV64I-NEXT:    lw a3, 0(a0)
11903; RV64I-NEXT:    mv s2, a1
11904; RV64I-NEXT:    sext.w s1, a1
11905; RV64I-NEXT:    j .LBB154_2
11906; RV64I-NEXT:  .LBB154_1: # %atomicrmw.start
11907; RV64I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11908; RV64I-NEXT:    sw a3, 12(sp)
11909; RV64I-NEXT:    addi a1, sp, 12
11910; RV64I-NEXT:    li a3, 5
11911; RV64I-NEXT:    li a4, 5
11912; RV64I-NEXT:    mv a0, s0
11913; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
11914; RV64I-NEXT:    lw a3, 12(sp)
11915; RV64I-NEXT:    bnez a0, .LBB154_4
11916; RV64I-NEXT:  .LBB154_2: # %atomicrmw.start
11917; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
11918; RV64I-NEXT:    mv a2, a3
11919; RV64I-NEXT:    bge s1, a3, .LBB154_1
11920; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
11921; RV64I-NEXT:    # in Loop: Header=BB154_2 Depth=1
11922; RV64I-NEXT:    mv a2, s2
11923; RV64I-NEXT:    j .LBB154_1
11924; RV64I-NEXT:  .LBB154_4: # %atomicrmw.end
11925; RV64I-NEXT:    mv a0, a3
11926; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
11927; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
11928; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
11929; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
11930; RV64I-NEXT:    addi sp, sp, 48
11931; RV64I-NEXT:    ret
11932;
11933; RV64IA-LABEL: atomicrmw_min_i32_seq_cst:
11934; RV64IA:       # %bb.0:
11935; RV64IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
11936; RV64IA-NEXT:    ret
11937  %1 = atomicrmw min i32* %a, i32 %b seq_cst
11938  ret i32 %1
11939}
11940
11941define i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind {
11942; RV32I-LABEL: atomicrmw_umax_i32_monotonic:
11943; RV32I:       # %bb.0:
11944; RV32I-NEXT:    addi sp, sp, -16
11945; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11946; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
11947; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
11948; RV32I-NEXT:    mv s0, a0
11949; RV32I-NEXT:    lw a3, 0(a0)
11950; RV32I-NEXT:    mv s1, a1
11951; RV32I-NEXT:    j .LBB155_2
11952; RV32I-NEXT:  .LBB155_1: # %atomicrmw.start
11953; RV32I-NEXT:    # in Loop: Header=BB155_2 Depth=1
11954; RV32I-NEXT:    sw a3, 0(sp)
11955; RV32I-NEXT:    mv a1, sp
11956; RV32I-NEXT:    mv a0, s0
11957; RV32I-NEXT:    li a3, 0
11958; RV32I-NEXT:    li a4, 0
11959; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
11960; RV32I-NEXT:    lw a3, 0(sp)
11961; RV32I-NEXT:    bnez a0, .LBB155_4
11962; RV32I-NEXT:  .LBB155_2: # %atomicrmw.start
11963; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
11964; RV32I-NEXT:    mv a2, a3
11965; RV32I-NEXT:    bltu s1, a3, .LBB155_1
11966; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
11967; RV32I-NEXT:    # in Loop: Header=BB155_2 Depth=1
11968; RV32I-NEXT:    mv a2, s1
11969; RV32I-NEXT:    j .LBB155_1
11970; RV32I-NEXT:  .LBB155_4: # %atomicrmw.end
11971; RV32I-NEXT:    mv a0, a3
11972; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11973; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
11974; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
11975; RV32I-NEXT:    addi sp, sp, 16
11976; RV32I-NEXT:    ret
11977;
11978; RV32IA-LABEL: atomicrmw_umax_i32_monotonic:
11979; RV32IA:       # %bb.0:
11980; RV32IA-NEXT:    amomaxu.w a0, a1, (a0)
11981; RV32IA-NEXT:    ret
11982;
11983; RV64I-LABEL: atomicrmw_umax_i32_monotonic:
11984; RV64I:       # %bb.0:
11985; RV64I-NEXT:    addi sp, sp, -48
11986; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
11987; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
11988; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
11989; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
11990; RV64I-NEXT:    mv s0, a0
11991; RV64I-NEXT:    lw a3, 0(a0)
11992; RV64I-NEXT:    mv s2, a1
11993; RV64I-NEXT:    sext.w s1, a1
11994; RV64I-NEXT:    j .LBB155_2
11995; RV64I-NEXT:  .LBB155_1: # %atomicrmw.start
11996; RV64I-NEXT:    # in Loop: Header=BB155_2 Depth=1
11997; RV64I-NEXT:    sw a3, 12(sp)
11998; RV64I-NEXT:    addi a1, sp, 12
11999; RV64I-NEXT:    mv a0, s0
12000; RV64I-NEXT:    li a3, 0
12001; RV64I-NEXT:    li a4, 0
12002; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12003; RV64I-NEXT:    lw a3, 12(sp)
12004; RV64I-NEXT:    bnez a0, .LBB155_4
12005; RV64I-NEXT:  .LBB155_2: # %atomicrmw.start
12006; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12007; RV64I-NEXT:    mv a2, a3
12008; RV64I-NEXT:    bltu s1, a3, .LBB155_1
12009; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12010; RV64I-NEXT:    # in Loop: Header=BB155_2 Depth=1
12011; RV64I-NEXT:    mv a2, s2
12012; RV64I-NEXT:    j .LBB155_1
12013; RV64I-NEXT:  .LBB155_4: # %atomicrmw.end
12014; RV64I-NEXT:    mv a0, a3
12015; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12016; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12017; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12018; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12019; RV64I-NEXT:    addi sp, sp, 48
12020; RV64I-NEXT:    ret
12021;
12022; RV64IA-LABEL: atomicrmw_umax_i32_monotonic:
12023; RV64IA:       # %bb.0:
12024; RV64IA-NEXT:    amomaxu.w a0, a1, (a0)
12025; RV64IA-NEXT:    ret
12026  %1 = atomicrmw umax i32* %a, i32 %b monotonic
12027  ret i32 %1
12028}
12029
12030define i32 @atomicrmw_umax_i32_acquire(i32 *%a, i32 %b) nounwind {
12031; RV32I-LABEL: atomicrmw_umax_i32_acquire:
12032; RV32I:       # %bb.0:
12033; RV32I-NEXT:    addi sp, sp, -16
12034; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12035; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12036; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12037; RV32I-NEXT:    mv s0, a0
12038; RV32I-NEXT:    lw a3, 0(a0)
12039; RV32I-NEXT:    mv s1, a1
12040; RV32I-NEXT:    j .LBB156_2
12041; RV32I-NEXT:  .LBB156_1: # %atomicrmw.start
12042; RV32I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12043; RV32I-NEXT:    sw a3, 0(sp)
12044; RV32I-NEXT:    mv a1, sp
12045; RV32I-NEXT:    li a3, 2
12046; RV32I-NEXT:    li a4, 2
12047; RV32I-NEXT:    mv a0, s0
12048; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12049; RV32I-NEXT:    lw a3, 0(sp)
12050; RV32I-NEXT:    bnez a0, .LBB156_4
12051; RV32I-NEXT:  .LBB156_2: # %atomicrmw.start
12052; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12053; RV32I-NEXT:    mv a2, a3
12054; RV32I-NEXT:    bltu s1, a3, .LBB156_1
12055; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12056; RV32I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12057; RV32I-NEXT:    mv a2, s1
12058; RV32I-NEXT:    j .LBB156_1
12059; RV32I-NEXT:  .LBB156_4: # %atomicrmw.end
12060; RV32I-NEXT:    mv a0, a3
12061; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12062; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12063; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12064; RV32I-NEXT:    addi sp, sp, 16
12065; RV32I-NEXT:    ret
12066;
12067; RV32IA-LABEL: atomicrmw_umax_i32_acquire:
12068; RV32IA:       # %bb.0:
12069; RV32IA-NEXT:    amomaxu.w.aq a0, a1, (a0)
12070; RV32IA-NEXT:    ret
12071;
12072; RV64I-LABEL: atomicrmw_umax_i32_acquire:
12073; RV64I:       # %bb.0:
12074; RV64I-NEXT:    addi sp, sp, -48
12075; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12076; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12077; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12078; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12079; RV64I-NEXT:    mv s0, a0
12080; RV64I-NEXT:    lw a3, 0(a0)
12081; RV64I-NEXT:    mv s2, a1
12082; RV64I-NEXT:    sext.w s1, a1
12083; RV64I-NEXT:    j .LBB156_2
12084; RV64I-NEXT:  .LBB156_1: # %atomicrmw.start
12085; RV64I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12086; RV64I-NEXT:    sw a3, 12(sp)
12087; RV64I-NEXT:    addi a1, sp, 12
12088; RV64I-NEXT:    li a3, 2
12089; RV64I-NEXT:    li a4, 2
12090; RV64I-NEXT:    mv a0, s0
12091; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12092; RV64I-NEXT:    lw a3, 12(sp)
12093; RV64I-NEXT:    bnez a0, .LBB156_4
12094; RV64I-NEXT:  .LBB156_2: # %atomicrmw.start
12095; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12096; RV64I-NEXT:    mv a2, a3
12097; RV64I-NEXT:    bltu s1, a3, .LBB156_1
12098; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12099; RV64I-NEXT:    # in Loop: Header=BB156_2 Depth=1
12100; RV64I-NEXT:    mv a2, s2
12101; RV64I-NEXT:    j .LBB156_1
12102; RV64I-NEXT:  .LBB156_4: # %atomicrmw.end
12103; RV64I-NEXT:    mv a0, a3
12104; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12105; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12106; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12107; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12108; RV64I-NEXT:    addi sp, sp, 48
12109; RV64I-NEXT:    ret
12110;
12111; RV64IA-LABEL: atomicrmw_umax_i32_acquire:
12112; RV64IA:       # %bb.0:
12113; RV64IA-NEXT:    amomaxu.w.aq a0, a1, (a0)
12114; RV64IA-NEXT:    ret
12115  %1 = atomicrmw umax i32* %a, i32 %b acquire
12116  ret i32 %1
12117}
12118
12119define i32 @atomicrmw_umax_i32_release(i32 *%a, i32 %b) nounwind {
12120; RV32I-LABEL: atomicrmw_umax_i32_release:
12121; RV32I:       # %bb.0:
12122; RV32I-NEXT:    addi sp, sp, -16
12123; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12124; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12125; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12126; RV32I-NEXT:    mv s0, a0
12127; RV32I-NEXT:    lw a3, 0(a0)
12128; RV32I-NEXT:    mv s1, a1
12129; RV32I-NEXT:    j .LBB157_2
12130; RV32I-NEXT:  .LBB157_1: # %atomicrmw.start
12131; RV32I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12132; RV32I-NEXT:    sw a3, 0(sp)
12133; RV32I-NEXT:    mv a1, sp
12134; RV32I-NEXT:    li a3, 3
12135; RV32I-NEXT:    mv a0, s0
12136; RV32I-NEXT:    li a4, 0
12137; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12138; RV32I-NEXT:    lw a3, 0(sp)
12139; RV32I-NEXT:    bnez a0, .LBB157_4
12140; RV32I-NEXT:  .LBB157_2: # %atomicrmw.start
12141; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12142; RV32I-NEXT:    mv a2, a3
12143; RV32I-NEXT:    bltu s1, a3, .LBB157_1
12144; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12145; RV32I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12146; RV32I-NEXT:    mv a2, s1
12147; RV32I-NEXT:    j .LBB157_1
12148; RV32I-NEXT:  .LBB157_4: # %atomicrmw.end
12149; RV32I-NEXT:    mv a0, a3
12150; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12151; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12152; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12153; RV32I-NEXT:    addi sp, sp, 16
12154; RV32I-NEXT:    ret
12155;
12156; RV32IA-LABEL: atomicrmw_umax_i32_release:
12157; RV32IA:       # %bb.0:
12158; RV32IA-NEXT:    amomaxu.w.rl a0, a1, (a0)
12159; RV32IA-NEXT:    ret
12160;
12161; RV64I-LABEL: atomicrmw_umax_i32_release:
12162; RV64I:       # %bb.0:
12163; RV64I-NEXT:    addi sp, sp, -48
12164; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12165; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12166; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12167; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12168; RV64I-NEXT:    mv s0, a0
12169; RV64I-NEXT:    lw a3, 0(a0)
12170; RV64I-NEXT:    mv s2, a1
12171; RV64I-NEXT:    sext.w s1, a1
12172; RV64I-NEXT:    j .LBB157_2
12173; RV64I-NEXT:  .LBB157_1: # %atomicrmw.start
12174; RV64I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12175; RV64I-NEXT:    sw a3, 12(sp)
12176; RV64I-NEXT:    addi a1, sp, 12
12177; RV64I-NEXT:    li a3, 3
12178; RV64I-NEXT:    mv a0, s0
12179; RV64I-NEXT:    li a4, 0
12180; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12181; RV64I-NEXT:    lw a3, 12(sp)
12182; RV64I-NEXT:    bnez a0, .LBB157_4
12183; RV64I-NEXT:  .LBB157_2: # %atomicrmw.start
12184; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12185; RV64I-NEXT:    mv a2, a3
12186; RV64I-NEXT:    bltu s1, a3, .LBB157_1
12187; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12188; RV64I-NEXT:    # in Loop: Header=BB157_2 Depth=1
12189; RV64I-NEXT:    mv a2, s2
12190; RV64I-NEXT:    j .LBB157_1
12191; RV64I-NEXT:  .LBB157_4: # %atomicrmw.end
12192; RV64I-NEXT:    mv a0, a3
12193; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12194; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12195; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12196; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12197; RV64I-NEXT:    addi sp, sp, 48
12198; RV64I-NEXT:    ret
12199;
12200; RV64IA-LABEL: atomicrmw_umax_i32_release:
12201; RV64IA:       # %bb.0:
12202; RV64IA-NEXT:    amomaxu.w.rl a0, a1, (a0)
12203; RV64IA-NEXT:    ret
12204  %1 = atomicrmw umax i32* %a, i32 %b release
12205  ret i32 %1
12206}
12207
12208define i32 @atomicrmw_umax_i32_acq_rel(i32 *%a, i32 %b) nounwind {
12209; RV32I-LABEL: atomicrmw_umax_i32_acq_rel:
12210; RV32I:       # %bb.0:
12211; RV32I-NEXT:    addi sp, sp, -16
12212; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12213; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12214; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12215; RV32I-NEXT:    mv s0, a0
12216; RV32I-NEXT:    lw a3, 0(a0)
12217; RV32I-NEXT:    mv s1, a1
12218; RV32I-NEXT:    j .LBB158_2
12219; RV32I-NEXT:  .LBB158_1: # %atomicrmw.start
12220; RV32I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12221; RV32I-NEXT:    sw a3, 0(sp)
12222; RV32I-NEXT:    mv a1, sp
12223; RV32I-NEXT:    li a3, 4
12224; RV32I-NEXT:    li a4, 2
12225; RV32I-NEXT:    mv a0, s0
12226; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12227; RV32I-NEXT:    lw a3, 0(sp)
12228; RV32I-NEXT:    bnez a0, .LBB158_4
12229; RV32I-NEXT:  .LBB158_2: # %atomicrmw.start
12230; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12231; RV32I-NEXT:    mv a2, a3
12232; RV32I-NEXT:    bltu s1, a3, .LBB158_1
12233; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12234; RV32I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12235; RV32I-NEXT:    mv a2, s1
12236; RV32I-NEXT:    j .LBB158_1
12237; RV32I-NEXT:  .LBB158_4: # %atomicrmw.end
12238; RV32I-NEXT:    mv a0, a3
12239; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12240; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12241; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12242; RV32I-NEXT:    addi sp, sp, 16
12243; RV32I-NEXT:    ret
12244;
12245; RV32IA-LABEL: atomicrmw_umax_i32_acq_rel:
12246; RV32IA:       # %bb.0:
12247; RV32IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12248; RV32IA-NEXT:    ret
12249;
12250; RV64I-LABEL: atomicrmw_umax_i32_acq_rel:
12251; RV64I:       # %bb.0:
12252; RV64I-NEXT:    addi sp, sp, -48
12253; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12254; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12255; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12256; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12257; RV64I-NEXT:    mv s0, a0
12258; RV64I-NEXT:    lw a3, 0(a0)
12259; RV64I-NEXT:    mv s2, a1
12260; RV64I-NEXT:    sext.w s1, a1
12261; RV64I-NEXT:    j .LBB158_2
12262; RV64I-NEXT:  .LBB158_1: # %atomicrmw.start
12263; RV64I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12264; RV64I-NEXT:    sw a3, 12(sp)
12265; RV64I-NEXT:    addi a1, sp, 12
12266; RV64I-NEXT:    li a3, 4
12267; RV64I-NEXT:    li a4, 2
12268; RV64I-NEXT:    mv a0, s0
12269; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12270; RV64I-NEXT:    lw a3, 12(sp)
12271; RV64I-NEXT:    bnez a0, .LBB158_4
12272; RV64I-NEXT:  .LBB158_2: # %atomicrmw.start
12273; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12274; RV64I-NEXT:    mv a2, a3
12275; RV64I-NEXT:    bltu s1, a3, .LBB158_1
12276; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12277; RV64I-NEXT:    # in Loop: Header=BB158_2 Depth=1
12278; RV64I-NEXT:    mv a2, s2
12279; RV64I-NEXT:    j .LBB158_1
12280; RV64I-NEXT:  .LBB158_4: # %atomicrmw.end
12281; RV64I-NEXT:    mv a0, a3
12282; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12283; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12284; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12285; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12286; RV64I-NEXT:    addi sp, sp, 48
12287; RV64I-NEXT:    ret
12288;
12289; RV64IA-LABEL: atomicrmw_umax_i32_acq_rel:
12290; RV64IA:       # %bb.0:
12291; RV64IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12292; RV64IA-NEXT:    ret
12293  %1 = atomicrmw umax i32* %a, i32 %b acq_rel
12294  ret i32 %1
12295}
12296
12297define i32 @atomicrmw_umax_i32_seq_cst(i32 *%a, i32 %b) nounwind {
12298; RV32I-LABEL: atomicrmw_umax_i32_seq_cst:
12299; RV32I:       # %bb.0:
12300; RV32I-NEXT:    addi sp, sp, -16
12301; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12302; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12303; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12304; RV32I-NEXT:    mv s0, a0
12305; RV32I-NEXT:    lw a3, 0(a0)
12306; RV32I-NEXT:    mv s1, a1
12307; RV32I-NEXT:    j .LBB159_2
12308; RV32I-NEXT:  .LBB159_1: # %atomicrmw.start
12309; RV32I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12310; RV32I-NEXT:    sw a3, 0(sp)
12311; RV32I-NEXT:    mv a1, sp
12312; RV32I-NEXT:    li a3, 5
12313; RV32I-NEXT:    li a4, 5
12314; RV32I-NEXT:    mv a0, s0
12315; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12316; RV32I-NEXT:    lw a3, 0(sp)
12317; RV32I-NEXT:    bnez a0, .LBB159_4
12318; RV32I-NEXT:  .LBB159_2: # %atomicrmw.start
12319; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12320; RV32I-NEXT:    mv a2, a3
12321; RV32I-NEXT:    bltu s1, a3, .LBB159_1
12322; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12323; RV32I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12324; RV32I-NEXT:    mv a2, s1
12325; RV32I-NEXT:    j .LBB159_1
12326; RV32I-NEXT:  .LBB159_4: # %atomicrmw.end
12327; RV32I-NEXT:    mv a0, a3
12328; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12329; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12330; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12331; RV32I-NEXT:    addi sp, sp, 16
12332; RV32I-NEXT:    ret
12333;
12334; RV32IA-LABEL: atomicrmw_umax_i32_seq_cst:
12335; RV32IA:       # %bb.0:
12336; RV32IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12337; RV32IA-NEXT:    ret
12338;
12339; RV64I-LABEL: atomicrmw_umax_i32_seq_cst:
12340; RV64I:       # %bb.0:
12341; RV64I-NEXT:    addi sp, sp, -48
12342; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12343; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12344; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12345; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12346; RV64I-NEXT:    mv s0, a0
12347; RV64I-NEXT:    lw a3, 0(a0)
12348; RV64I-NEXT:    mv s2, a1
12349; RV64I-NEXT:    sext.w s1, a1
12350; RV64I-NEXT:    j .LBB159_2
12351; RV64I-NEXT:  .LBB159_1: # %atomicrmw.start
12352; RV64I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12353; RV64I-NEXT:    sw a3, 12(sp)
12354; RV64I-NEXT:    addi a1, sp, 12
12355; RV64I-NEXT:    li a3, 5
12356; RV64I-NEXT:    li a4, 5
12357; RV64I-NEXT:    mv a0, s0
12358; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12359; RV64I-NEXT:    lw a3, 12(sp)
12360; RV64I-NEXT:    bnez a0, .LBB159_4
12361; RV64I-NEXT:  .LBB159_2: # %atomicrmw.start
12362; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12363; RV64I-NEXT:    mv a2, a3
12364; RV64I-NEXT:    bltu s1, a3, .LBB159_1
12365; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12366; RV64I-NEXT:    # in Loop: Header=BB159_2 Depth=1
12367; RV64I-NEXT:    mv a2, s2
12368; RV64I-NEXT:    j .LBB159_1
12369; RV64I-NEXT:  .LBB159_4: # %atomicrmw.end
12370; RV64I-NEXT:    mv a0, a3
12371; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12372; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12373; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12374; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12375; RV64I-NEXT:    addi sp, sp, 48
12376; RV64I-NEXT:    ret
12377;
12378; RV64IA-LABEL: atomicrmw_umax_i32_seq_cst:
12379; RV64IA:       # %bb.0:
12380; RV64IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
12381; RV64IA-NEXT:    ret
12382  %1 = atomicrmw umax i32* %a, i32 %b seq_cst
12383  ret i32 %1
12384}
12385
12386define i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind {
12387; RV32I-LABEL: atomicrmw_umin_i32_monotonic:
12388; RV32I:       # %bb.0:
12389; RV32I-NEXT:    addi sp, sp, -16
12390; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12391; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12392; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12393; RV32I-NEXT:    mv s0, a0
12394; RV32I-NEXT:    lw a3, 0(a0)
12395; RV32I-NEXT:    mv s1, a1
12396; RV32I-NEXT:    j .LBB160_2
12397; RV32I-NEXT:  .LBB160_1: # %atomicrmw.start
12398; RV32I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12399; RV32I-NEXT:    sw a3, 0(sp)
12400; RV32I-NEXT:    mv a1, sp
12401; RV32I-NEXT:    mv a0, s0
12402; RV32I-NEXT:    li a3, 0
12403; RV32I-NEXT:    li a4, 0
12404; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12405; RV32I-NEXT:    lw a3, 0(sp)
12406; RV32I-NEXT:    bnez a0, .LBB160_4
12407; RV32I-NEXT:  .LBB160_2: # %atomicrmw.start
12408; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12409; RV32I-NEXT:    mv a2, a3
12410; RV32I-NEXT:    bgeu s1, a3, .LBB160_1
12411; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12412; RV32I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12413; RV32I-NEXT:    mv a2, s1
12414; RV32I-NEXT:    j .LBB160_1
12415; RV32I-NEXT:  .LBB160_4: # %atomicrmw.end
12416; RV32I-NEXT:    mv a0, a3
12417; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12418; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12419; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12420; RV32I-NEXT:    addi sp, sp, 16
12421; RV32I-NEXT:    ret
12422;
12423; RV32IA-LABEL: atomicrmw_umin_i32_monotonic:
12424; RV32IA:       # %bb.0:
12425; RV32IA-NEXT:    amominu.w a0, a1, (a0)
12426; RV32IA-NEXT:    ret
12427;
12428; RV64I-LABEL: atomicrmw_umin_i32_monotonic:
12429; RV64I:       # %bb.0:
12430; RV64I-NEXT:    addi sp, sp, -48
12431; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12432; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12433; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12434; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12435; RV64I-NEXT:    mv s0, a0
12436; RV64I-NEXT:    lw a3, 0(a0)
12437; RV64I-NEXT:    mv s2, a1
12438; RV64I-NEXT:    sext.w s1, a1
12439; RV64I-NEXT:    j .LBB160_2
12440; RV64I-NEXT:  .LBB160_1: # %atomicrmw.start
12441; RV64I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12442; RV64I-NEXT:    sw a3, 12(sp)
12443; RV64I-NEXT:    addi a1, sp, 12
12444; RV64I-NEXT:    mv a0, s0
12445; RV64I-NEXT:    li a3, 0
12446; RV64I-NEXT:    li a4, 0
12447; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12448; RV64I-NEXT:    lw a3, 12(sp)
12449; RV64I-NEXT:    bnez a0, .LBB160_4
12450; RV64I-NEXT:  .LBB160_2: # %atomicrmw.start
12451; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12452; RV64I-NEXT:    mv a2, a3
12453; RV64I-NEXT:    bgeu s1, a3, .LBB160_1
12454; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12455; RV64I-NEXT:    # in Loop: Header=BB160_2 Depth=1
12456; RV64I-NEXT:    mv a2, s2
12457; RV64I-NEXT:    j .LBB160_1
12458; RV64I-NEXT:  .LBB160_4: # %atomicrmw.end
12459; RV64I-NEXT:    mv a0, a3
12460; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12461; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12462; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12463; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12464; RV64I-NEXT:    addi sp, sp, 48
12465; RV64I-NEXT:    ret
12466;
12467; RV64IA-LABEL: atomicrmw_umin_i32_monotonic:
12468; RV64IA:       # %bb.0:
12469; RV64IA-NEXT:    amominu.w a0, a1, (a0)
12470; RV64IA-NEXT:    ret
12471  %1 = atomicrmw umin i32* %a, i32 %b monotonic
12472  ret i32 %1
12473}
12474
12475define i32 @atomicrmw_umin_i32_acquire(i32 *%a, i32 %b) nounwind {
12476; RV32I-LABEL: atomicrmw_umin_i32_acquire:
12477; RV32I:       # %bb.0:
12478; RV32I-NEXT:    addi sp, sp, -16
12479; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12480; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12481; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12482; RV32I-NEXT:    mv s0, a0
12483; RV32I-NEXT:    lw a3, 0(a0)
12484; RV32I-NEXT:    mv s1, a1
12485; RV32I-NEXT:    j .LBB161_2
12486; RV32I-NEXT:  .LBB161_1: # %atomicrmw.start
12487; RV32I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12488; RV32I-NEXT:    sw a3, 0(sp)
12489; RV32I-NEXT:    mv a1, sp
12490; RV32I-NEXT:    li a3, 2
12491; RV32I-NEXT:    li a4, 2
12492; RV32I-NEXT:    mv a0, s0
12493; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12494; RV32I-NEXT:    lw a3, 0(sp)
12495; RV32I-NEXT:    bnez a0, .LBB161_4
12496; RV32I-NEXT:  .LBB161_2: # %atomicrmw.start
12497; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12498; RV32I-NEXT:    mv a2, a3
12499; RV32I-NEXT:    bgeu s1, a3, .LBB161_1
12500; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12501; RV32I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12502; RV32I-NEXT:    mv a2, s1
12503; RV32I-NEXT:    j .LBB161_1
12504; RV32I-NEXT:  .LBB161_4: # %atomicrmw.end
12505; RV32I-NEXT:    mv a0, a3
12506; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12507; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12508; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12509; RV32I-NEXT:    addi sp, sp, 16
12510; RV32I-NEXT:    ret
12511;
12512; RV32IA-LABEL: atomicrmw_umin_i32_acquire:
12513; RV32IA:       # %bb.0:
12514; RV32IA-NEXT:    amominu.w.aq a0, a1, (a0)
12515; RV32IA-NEXT:    ret
12516;
12517; RV64I-LABEL: atomicrmw_umin_i32_acquire:
12518; RV64I:       # %bb.0:
12519; RV64I-NEXT:    addi sp, sp, -48
12520; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12521; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12522; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12523; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12524; RV64I-NEXT:    mv s0, a0
12525; RV64I-NEXT:    lw a3, 0(a0)
12526; RV64I-NEXT:    mv s2, a1
12527; RV64I-NEXT:    sext.w s1, a1
12528; RV64I-NEXT:    j .LBB161_2
12529; RV64I-NEXT:  .LBB161_1: # %atomicrmw.start
12530; RV64I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12531; RV64I-NEXT:    sw a3, 12(sp)
12532; RV64I-NEXT:    addi a1, sp, 12
12533; RV64I-NEXT:    li a3, 2
12534; RV64I-NEXT:    li a4, 2
12535; RV64I-NEXT:    mv a0, s0
12536; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12537; RV64I-NEXT:    lw a3, 12(sp)
12538; RV64I-NEXT:    bnez a0, .LBB161_4
12539; RV64I-NEXT:  .LBB161_2: # %atomicrmw.start
12540; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12541; RV64I-NEXT:    mv a2, a3
12542; RV64I-NEXT:    bgeu s1, a3, .LBB161_1
12543; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12544; RV64I-NEXT:    # in Loop: Header=BB161_2 Depth=1
12545; RV64I-NEXT:    mv a2, s2
12546; RV64I-NEXT:    j .LBB161_1
12547; RV64I-NEXT:  .LBB161_4: # %atomicrmw.end
12548; RV64I-NEXT:    mv a0, a3
12549; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12550; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12551; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12552; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12553; RV64I-NEXT:    addi sp, sp, 48
12554; RV64I-NEXT:    ret
12555;
12556; RV64IA-LABEL: atomicrmw_umin_i32_acquire:
12557; RV64IA:       # %bb.0:
12558; RV64IA-NEXT:    amominu.w.aq a0, a1, (a0)
12559; RV64IA-NEXT:    ret
12560  %1 = atomicrmw umin i32* %a, i32 %b acquire
12561  ret i32 %1
12562}
12563
12564define i32 @atomicrmw_umin_i32_release(i32 *%a, i32 %b) nounwind {
12565; RV32I-LABEL: atomicrmw_umin_i32_release:
12566; RV32I:       # %bb.0:
12567; RV32I-NEXT:    addi sp, sp, -16
12568; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12569; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12570; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12571; RV32I-NEXT:    mv s0, a0
12572; RV32I-NEXT:    lw a3, 0(a0)
12573; RV32I-NEXT:    mv s1, a1
12574; RV32I-NEXT:    j .LBB162_2
12575; RV32I-NEXT:  .LBB162_1: # %atomicrmw.start
12576; RV32I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12577; RV32I-NEXT:    sw a3, 0(sp)
12578; RV32I-NEXT:    mv a1, sp
12579; RV32I-NEXT:    li a3, 3
12580; RV32I-NEXT:    mv a0, s0
12581; RV32I-NEXT:    li a4, 0
12582; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12583; RV32I-NEXT:    lw a3, 0(sp)
12584; RV32I-NEXT:    bnez a0, .LBB162_4
12585; RV32I-NEXT:  .LBB162_2: # %atomicrmw.start
12586; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12587; RV32I-NEXT:    mv a2, a3
12588; RV32I-NEXT:    bgeu s1, a3, .LBB162_1
12589; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12590; RV32I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12591; RV32I-NEXT:    mv a2, s1
12592; RV32I-NEXT:    j .LBB162_1
12593; RV32I-NEXT:  .LBB162_4: # %atomicrmw.end
12594; RV32I-NEXT:    mv a0, a3
12595; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12596; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12597; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12598; RV32I-NEXT:    addi sp, sp, 16
12599; RV32I-NEXT:    ret
12600;
12601; RV32IA-LABEL: atomicrmw_umin_i32_release:
12602; RV32IA:       # %bb.0:
12603; RV32IA-NEXT:    amominu.w.rl a0, a1, (a0)
12604; RV32IA-NEXT:    ret
12605;
12606; RV64I-LABEL: atomicrmw_umin_i32_release:
12607; RV64I:       # %bb.0:
12608; RV64I-NEXT:    addi sp, sp, -48
12609; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12610; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12611; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12612; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12613; RV64I-NEXT:    mv s0, a0
12614; RV64I-NEXT:    lw a3, 0(a0)
12615; RV64I-NEXT:    mv s2, a1
12616; RV64I-NEXT:    sext.w s1, a1
12617; RV64I-NEXT:    j .LBB162_2
12618; RV64I-NEXT:  .LBB162_1: # %atomicrmw.start
12619; RV64I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12620; RV64I-NEXT:    sw a3, 12(sp)
12621; RV64I-NEXT:    addi a1, sp, 12
12622; RV64I-NEXT:    li a3, 3
12623; RV64I-NEXT:    mv a0, s0
12624; RV64I-NEXT:    li a4, 0
12625; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12626; RV64I-NEXT:    lw a3, 12(sp)
12627; RV64I-NEXT:    bnez a0, .LBB162_4
12628; RV64I-NEXT:  .LBB162_2: # %atomicrmw.start
12629; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12630; RV64I-NEXT:    mv a2, a3
12631; RV64I-NEXT:    bgeu s1, a3, .LBB162_1
12632; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12633; RV64I-NEXT:    # in Loop: Header=BB162_2 Depth=1
12634; RV64I-NEXT:    mv a2, s2
12635; RV64I-NEXT:    j .LBB162_1
12636; RV64I-NEXT:  .LBB162_4: # %atomicrmw.end
12637; RV64I-NEXT:    mv a0, a3
12638; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12639; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12640; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12641; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12642; RV64I-NEXT:    addi sp, sp, 48
12643; RV64I-NEXT:    ret
12644;
12645; RV64IA-LABEL: atomicrmw_umin_i32_release:
12646; RV64IA:       # %bb.0:
12647; RV64IA-NEXT:    amominu.w.rl a0, a1, (a0)
12648; RV64IA-NEXT:    ret
12649  %1 = atomicrmw umin i32* %a, i32 %b release
12650  ret i32 %1
12651}
12652
12653define i32 @atomicrmw_umin_i32_acq_rel(i32 *%a, i32 %b) nounwind {
12654; RV32I-LABEL: atomicrmw_umin_i32_acq_rel:
12655; RV32I:       # %bb.0:
12656; RV32I-NEXT:    addi sp, sp, -16
12657; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12658; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12659; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12660; RV32I-NEXT:    mv s0, a0
12661; RV32I-NEXT:    lw a3, 0(a0)
12662; RV32I-NEXT:    mv s1, a1
12663; RV32I-NEXT:    j .LBB163_2
12664; RV32I-NEXT:  .LBB163_1: # %atomicrmw.start
12665; RV32I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12666; RV32I-NEXT:    sw a3, 0(sp)
12667; RV32I-NEXT:    mv a1, sp
12668; RV32I-NEXT:    li a3, 4
12669; RV32I-NEXT:    li a4, 2
12670; RV32I-NEXT:    mv a0, s0
12671; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12672; RV32I-NEXT:    lw a3, 0(sp)
12673; RV32I-NEXT:    bnez a0, .LBB163_4
12674; RV32I-NEXT:  .LBB163_2: # %atomicrmw.start
12675; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12676; RV32I-NEXT:    mv a2, a3
12677; RV32I-NEXT:    bgeu s1, a3, .LBB163_1
12678; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12679; RV32I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12680; RV32I-NEXT:    mv a2, s1
12681; RV32I-NEXT:    j .LBB163_1
12682; RV32I-NEXT:  .LBB163_4: # %atomicrmw.end
12683; RV32I-NEXT:    mv a0, a3
12684; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12685; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12686; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12687; RV32I-NEXT:    addi sp, sp, 16
12688; RV32I-NEXT:    ret
12689;
12690; RV32IA-LABEL: atomicrmw_umin_i32_acq_rel:
12691; RV32IA:       # %bb.0:
12692; RV32IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12693; RV32IA-NEXT:    ret
12694;
12695; RV64I-LABEL: atomicrmw_umin_i32_acq_rel:
12696; RV64I:       # %bb.0:
12697; RV64I-NEXT:    addi sp, sp, -48
12698; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12699; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12700; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12701; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12702; RV64I-NEXT:    mv s0, a0
12703; RV64I-NEXT:    lw a3, 0(a0)
12704; RV64I-NEXT:    mv s2, a1
12705; RV64I-NEXT:    sext.w s1, a1
12706; RV64I-NEXT:    j .LBB163_2
12707; RV64I-NEXT:  .LBB163_1: # %atomicrmw.start
12708; RV64I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12709; RV64I-NEXT:    sw a3, 12(sp)
12710; RV64I-NEXT:    addi a1, sp, 12
12711; RV64I-NEXT:    li a3, 4
12712; RV64I-NEXT:    li a4, 2
12713; RV64I-NEXT:    mv a0, s0
12714; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12715; RV64I-NEXT:    lw a3, 12(sp)
12716; RV64I-NEXT:    bnez a0, .LBB163_4
12717; RV64I-NEXT:  .LBB163_2: # %atomicrmw.start
12718; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12719; RV64I-NEXT:    mv a2, a3
12720; RV64I-NEXT:    bgeu s1, a3, .LBB163_1
12721; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12722; RV64I-NEXT:    # in Loop: Header=BB163_2 Depth=1
12723; RV64I-NEXT:    mv a2, s2
12724; RV64I-NEXT:    j .LBB163_1
12725; RV64I-NEXT:  .LBB163_4: # %atomicrmw.end
12726; RV64I-NEXT:    mv a0, a3
12727; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12728; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12729; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12730; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12731; RV64I-NEXT:    addi sp, sp, 48
12732; RV64I-NEXT:    ret
12733;
12734; RV64IA-LABEL: atomicrmw_umin_i32_acq_rel:
12735; RV64IA:       # %bb.0:
12736; RV64IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12737; RV64IA-NEXT:    ret
12738  %1 = atomicrmw umin i32* %a, i32 %b acq_rel
12739  ret i32 %1
12740}
12741
12742define i32 @atomicrmw_umin_i32_seq_cst(i32 *%a, i32 %b) nounwind {
12743; RV32I-LABEL: atomicrmw_umin_i32_seq_cst:
12744; RV32I:       # %bb.0:
12745; RV32I-NEXT:    addi sp, sp, -16
12746; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12747; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
12748; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
12749; RV32I-NEXT:    mv s0, a0
12750; RV32I-NEXT:    lw a3, 0(a0)
12751; RV32I-NEXT:    mv s1, a1
12752; RV32I-NEXT:    j .LBB164_2
12753; RV32I-NEXT:  .LBB164_1: # %atomicrmw.start
12754; RV32I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12755; RV32I-NEXT:    sw a3, 0(sp)
12756; RV32I-NEXT:    mv a1, sp
12757; RV32I-NEXT:    li a3, 5
12758; RV32I-NEXT:    li a4, 5
12759; RV32I-NEXT:    mv a0, s0
12760; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
12761; RV32I-NEXT:    lw a3, 0(sp)
12762; RV32I-NEXT:    bnez a0, .LBB164_4
12763; RV32I-NEXT:  .LBB164_2: # %atomicrmw.start
12764; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
12765; RV32I-NEXT:    mv a2, a3
12766; RV32I-NEXT:    bgeu s1, a3, .LBB164_1
12767; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
12768; RV32I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12769; RV32I-NEXT:    mv a2, s1
12770; RV32I-NEXT:    j .LBB164_1
12771; RV32I-NEXT:  .LBB164_4: # %atomicrmw.end
12772; RV32I-NEXT:    mv a0, a3
12773; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12774; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
12775; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
12776; RV32I-NEXT:    addi sp, sp, 16
12777; RV32I-NEXT:    ret
12778;
12779; RV32IA-LABEL: atomicrmw_umin_i32_seq_cst:
12780; RV32IA:       # %bb.0:
12781; RV32IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12782; RV32IA-NEXT:    ret
12783;
12784; RV64I-LABEL: atomicrmw_umin_i32_seq_cst:
12785; RV64I:       # %bb.0:
12786; RV64I-NEXT:    addi sp, sp, -48
12787; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
12788; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
12789; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
12790; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
12791; RV64I-NEXT:    mv s0, a0
12792; RV64I-NEXT:    lw a3, 0(a0)
12793; RV64I-NEXT:    mv s2, a1
12794; RV64I-NEXT:    sext.w s1, a1
12795; RV64I-NEXT:    j .LBB164_2
12796; RV64I-NEXT:  .LBB164_1: # %atomicrmw.start
12797; RV64I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12798; RV64I-NEXT:    sw a3, 12(sp)
12799; RV64I-NEXT:    addi a1, sp, 12
12800; RV64I-NEXT:    li a3, 5
12801; RV64I-NEXT:    li a4, 5
12802; RV64I-NEXT:    mv a0, s0
12803; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
12804; RV64I-NEXT:    lw a3, 12(sp)
12805; RV64I-NEXT:    bnez a0, .LBB164_4
12806; RV64I-NEXT:  .LBB164_2: # %atomicrmw.start
12807; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
12808; RV64I-NEXT:    mv a2, a3
12809; RV64I-NEXT:    bgeu s1, a3, .LBB164_1
12810; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
12811; RV64I-NEXT:    # in Loop: Header=BB164_2 Depth=1
12812; RV64I-NEXT:    mv a2, s2
12813; RV64I-NEXT:    j .LBB164_1
12814; RV64I-NEXT:  .LBB164_4: # %atomicrmw.end
12815; RV64I-NEXT:    mv a0, a3
12816; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
12817; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
12818; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
12819; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
12820; RV64I-NEXT:    addi sp, sp, 48
12821; RV64I-NEXT:    ret
12822;
12823; RV64IA-LABEL: atomicrmw_umin_i32_seq_cst:
12824; RV64IA:       # %bb.0:
12825; RV64IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
12826; RV64IA-NEXT:    ret
12827  %1 = atomicrmw umin i32* %a, i32 %b seq_cst
12828  ret i32 %1
12829}
12830
12831define i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) nounwind {
12832; RV32I-LABEL: atomicrmw_xchg_i64_monotonic:
12833; RV32I:       # %bb.0:
12834; RV32I-NEXT:    addi sp, sp, -16
12835; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12836; RV32I-NEXT:    li a3, 0
12837; RV32I-NEXT:    call __atomic_exchange_8@plt
12838; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12839; RV32I-NEXT:    addi sp, sp, 16
12840; RV32I-NEXT:    ret
12841;
12842; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic:
12843; RV32IA:       # %bb.0:
12844; RV32IA-NEXT:    addi sp, sp, -16
12845; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12846; RV32IA-NEXT:    li a3, 0
12847; RV32IA-NEXT:    call __atomic_exchange_8@plt
12848; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12849; RV32IA-NEXT:    addi sp, sp, 16
12850; RV32IA-NEXT:    ret
12851;
12852; RV64I-LABEL: atomicrmw_xchg_i64_monotonic:
12853; RV64I:       # %bb.0:
12854; RV64I-NEXT:    addi sp, sp, -16
12855; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12856; RV64I-NEXT:    li a2, 0
12857; RV64I-NEXT:    call __atomic_exchange_8@plt
12858; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12859; RV64I-NEXT:    addi sp, sp, 16
12860; RV64I-NEXT:    ret
12861;
12862; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic:
12863; RV64IA:       # %bb.0:
12864; RV64IA-NEXT:    amoswap.d a0, a1, (a0)
12865; RV64IA-NEXT:    ret
12866  %1 = atomicrmw xchg i64* %a, i64 %b monotonic
12867  ret i64 %1
12868}
12869
12870define i64 @atomicrmw_xchg_i64_acquire(i64* %a, i64 %b) nounwind {
12871; RV32I-LABEL: atomicrmw_xchg_i64_acquire:
12872; RV32I:       # %bb.0:
12873; RV32I-NEXT:    addi sp, sp, -16
12874; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12875; RV32I-NEXT:    li a3, 2
12876; RV32I-NEXT:    call __atomic_exchange_8@plt
12877; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12878; RV32I-NEXT:    addi sp, sp, 16
12879; RV32I-NEXT:    ret
12880;
12881; RV32IA-LABEL: atomicrmw_xchg_i64_acquire:
12882; RV32IA:       # %bb.0:
12883; RV32IA-NEXT:    addi sp, sp, -16
12884; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12885; RV32IA-NEXT:    li a3, 2
12886; RV32IA-NEXT:    call __atomic_exchange_8@plt
12887; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12888; RV32IA-NEXT:    addi sp, sp, 16
12889; RV32IA-NEXT:    ret
12890;
12891; RV64I-LABEL: atomicrmw_xchg_i64_acquire:
12892; RV64I:       # %bb.0:
12893; RV64I-NEXT:    addi sp, sp, -16
12894; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12895; RV64I-NEXT:    li a2, 2
12896; RV64I-NEXT:    call __atomic_exchange_8@plt
12897; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12898; RV64I-NEXT:    addi sp, sp, 16
12899; RV64I-NEXT:    ret
12900;
12901; RV64IA-LABEL: atomicrmw_xchg_i64_acquire:
12902; RV64IA:       # %bb.0:
12903; RV64IA-NEXT:    amoswap.d.aq a0, a1, (a0)
12904; RV64IA-NEXT:    ret
12905  %1 = atomicrmw xchg i64* %a, i64 %b acquire
12906  ret i64 %1
12907}
12908
12909define i64 @atomicrmw_xchg_i64_release(i64* %a, i64 %b) nounwind {
12910; RV32I-LABEL: atomicrmw_xchg_i64_release:
12911; RV32I:       # %bb.0:
12912; RV32I-NEXT:    addi sp, sp, -16
12913; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12914; RV32I-NEXT:    li a3, 3
12915; RV32I-NEXT:    call __atomic_exchange_8@plt
12916; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12917; RV32I-NEXT:    addi sp, sp, 16
12918; RV32I-NEXT:    ret
12919;
12920; RV32IA-LABEL: atomicrmw_xchg_i64_release:
12921; RV32IA:       # %bb.0:
12922; RV32IA-NEXT:    addi sp, sp, -16
12923; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12924; RV32IA-NEXT:    li a3, 3
12925; RV32IA-NEXT:    call __atomic_exchange_8@plt
12926; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12927; RV32IA-NEXT:    addi sp, sp, 16
12928; RV32IA-NEXT:    ret
12929;
12930; RV64I-LABEL: atomicrmw_xchg_i64_release:
12931; RV64I:       # %bb.0:
12932; RV64I-NEXT:    addi sp, sp, -16
12933; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12934; RV64I-NEXT:    li a2, 3
12935; RV64I-NEXT:    call __atomic_exchange_8@plt
12936; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12937; RV64I-NEXT:    addi sp, sp, 16
12938; RV64I-NEXT:    ret
12939;
12940; RV64IA-LABEL: atomicrmw_xchg_i64_release:
12941; RV64IA:       # %bb.0:
12942; RV64IA-NEXT:    amoswap.d.rl a0, a1, (a0)
12943; RV64IA-NEXT:    ret
12944  %1 = atomicrmw xchg i64* %a, i64 %b release
12945  ret i64 %1
12946}
12947
12948define i64 @atomicrmw_xchg_i64_acq_rel(i64* %a, i64 %b) nounwind {
12949; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel:
12950; RV32I:       # %bb.0:
12951; RV32I-NEXT:    addi sp, sp, -16
12952; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12953; RV32I-NEXT:    li a3, 4
12954; RV32I-NEXT:    call __atomic_exchange_8@plt
12955; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12956; RV32I-NEXT:    addi sp, sp, 16
12957; RV32I-NEXT:    ret
12958;
12959; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel:
12960; RV32IA:       # %bb.0:
12961; RV32IA-NEXT:    addi sp, sp, -16
12962; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12963; RV32IA-NEXT:    li a3, 4
12964; RV32IA-NEXT:    call __atomic_exchange_8@plt
12965; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12966; RV32IA-NEXT:    addi sp, sp, 16
12967; RV32IA-NEXT:    ret
12968;
12969; RV64I-LABEL: atomicrmw_xchg_i64_acq_rel:
12970; RV64I:       # %bb.0:
12971; RV64I-NEXT:    addi sp, sp, -16
12972; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12973; RV64I-NEXT:    li a2, 4
12974; RV64I-NEXT:    call __atomic_exchange_8@plt
12975; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12976; RV64I-NEXT:    addi sp, sp, 16
12977; RV64I-NEXT:    ret
12978;
12979; RV64IA-LABEL: atomicrmw_xchg_i64_acq_rel:
12980; RV64IA:       # %bb.0:
12981; RV64IA-NEXT:    amoswap.d.aqrl a0, a1, (a0)
12982; RV64IA-NEXT:    ret
12983  %1 = atomicrmw xchg i64* %a, i64 %b acq_rel
12984  ret i64 %1
12985}
12986
12987define i64 @atomicrmw_xchg_i64_seq_cst(i64* %a, i64 %b) nounwind {
12988; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst:
12989; RV32I:       # %bb.0:
12990; RV32I-NEXT:    addi sp, sp, -16
12991; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12992; RV32I-NEXT:    li a3, 5
12993; RV32I-NEXT:    call __atomic_exchange_8@plt
12994; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12995; RV32I-NEXT:    addi sp, sp, 16
12996; RV32I-NEXT:    ret
12997;
12998; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst:
12999; RV32IA:       # %bb.0:
13000; RV32IA-NEXT:    addi sp, sp, -16
13001; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13002; RV32IA-NEXT:    li a3, 5
13003; RV32IA-NEXT:    call __atomic_exchange_8@plt
13004; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13005; RV32IA-NEXT:    addi sp, sp, 16
13006; RV32IA-NEXT:    ret
13007;
13008; RV64I-LABEL: atomicrmw_xchg_i64_seq_cst:
13009; RV64I:       # %bb.0:
13010; RV64I-NEXT:    addi sp, sp, -16
13011; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13012; RV64I-NEXT:    li a2, 5
13013; RV64I-NEXT:    call __atomic_exchange_8@plt
13014; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13015; RV64I-NEXT:    addi sp, sp, 16
13016; RV64I-NEXT:    ret
13017;
13018; RV64IA-LABEL: atomicrmw_xchg_i64_seq_cst:
13019; RV64IA:       # %bb.0:
13020; RV64IA-NEXT:    amoswap.d.aqrl a0, a1, (a0)
13021; RV64IA-NEXT:    ret
13022  %1 = atomicrmw xchg i64* %a, i64 %b seq_cst
13023  ret i64 %1
13024}
13025
13026define i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind {
13027; RV32I-LABEL: atomicrmw_add_i64_monotonic:
13028; RV32I:       # %bb.0:
13029; RV32I-NEXT:    addi sp, sp, -16
13030; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13031; RV32I-NEXT:    li a3, 0
13032; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13033; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13034; RV32I-NEXT:    addi sp, sp, 16
13035; RV32I-NEXT:    ret
13036;
13037; RV32IA-LABEL: atomicrmw_add_i64_monotonic:
13038; RV32IA:       # %bb.0:
13039; RV32IA-NEXT:    addi sp, sp, -16
13040; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13041; RV32IA-NEXT:    li a3, 0
13042; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13043; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13044; RV32IA-NEXT:    addi sp, sp, 16
13045; RV32IA-NEXT:    ret
13046;
13047; RV64I-LABEL: atomicrmw_add_i64_monotonic:
13048; RV64I:       # %bb.0:
13049; RV64I-NEXT:    addi sp, sp, -16
13050; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13051; RV64I-NEXT:    li a2, 0
13052; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13053; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13054; RV64I-NEXT:    addi sp, sp, 16
13055; RV64I-NEXT:    ret
13056;
13057; RV64IA-LABEL: atomicrmw_add_i64_monotonic:
13058; RV64IA:       # %bb.0:
13059; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
13060; RV64IA-NEXT:    ret
13061  %1 = atomicrmw add i64* %a, i64 %b monotonic
13062  ret i64 %1
13063}
13064
13065define i64 @atomicrmw_add_i64_acquire(i64 *%a, i64 %b) nounwind {
13066; RV32I-LABEL: atomicrmw_add_i64_acquire:
13067; RV32I:       # %bb.0:
13068; RV32I-NEXT:    addi sp, sp, -16
13069; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13070; RV32I-NEXT:    li a3, 2
13071; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13072; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13073; RV32I-NEXT:    addi sp, sp, 16
13074; RV32I-NEXT:    ret
13075;
13076; RV32IA-LABEL: atomicrmw_add_i64_acquire:
13077; RV32IA:       # %bb.0:
13078; RV32IA-NEXT:    addi sp, sp, -16
13079; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13080; RV32IA-NEXT:    li a3, 2
13081; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13082; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13083; RV32IA-NEXT:    addi sp, sp, 16
13084; RV32IA-NEXT:    ret
13085;
13086; RV64I-LABEL: atomicrmw_add_i64_acquire:
13087; RV64I:       # %bb.0:
13088; RV64I-NEXT:    addi sp, sp, -16
13089; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13090; RV64I-NEXT:    li a2, 2
13091; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13092; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13093; RV64I-NEXT:    addi sp, sp, 16
13094; RV64I-NEXT:    ret
13095;
13096; RV64IA-LABEL: atomicrmw_add_i64_acquire:
13097; RV64IA:       # %bb.0:
13098; RV64IA-NEXT:    amoadd.d.aq a0, a1, (a0)
13099; RV64IA-NEXT:    ret
13100  %1 = atomicrmw add i64* %a, i64 %b acquire
13101  ret i64 %1
13102}
13103
13104define i64 @atomicrmw_add_i64_release(i64 *%a, i64 %b) nounwind {
13105; RV32I-LABEL: atomicrmw_add_i64_release:
13106; RV32I:       # %bb.0:
13107; RV32I-NEXT:    addi sp, sp, -16
13108; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13109; RV32I-NEXT:    li a3, 3
13110; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13111; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13112; RV32I-NEXT:    addi sp, sp, 16
13113; RV32I-NEXT:    ret
13114;
13115; RV32IA-LABEL: atomicrmw_add_i64_release:
13116; RV32IA:       # %bb.0:
13117; RV32IA-NEXT:    addi sp, sp, -16
13118; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13119; RV32IA-NEXT:    li a3, 3
13120; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13121; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13122; RV32IA-NEXT:    addi sp, sp, 16
13123; RV32IA-NEXT:    ret
13124;
13125; RV64I-LABEL: atomicrmw_add_i64_release:
13126; RV64I:       # %bb.0:
13127; RV64I-NEXT:    addi sp, sp, -16
13128; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13129; RV64I-NEXT:    li a2, 3
13130; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13131; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13132; RV64I-NEXT:    addi sp, sp, 16
13133; RV64I-NEXT:    ret
13134;
13135; RV64IA-LABEL: atomicrmw_add_i64_release:
13136; RV64IA:       # %bb.0:
13137; RV64IA-NEXT:    amoadd.d.rl a0, a1, (a0)
13138; RV64IA-NEXT:    ret
13139  %1 = atomicrmw add i64* %a, i64 %b release
13140  ret i64 %1
13141}
13142
13143define i64 @atomicrmw_add_i64_acq_rel(i64 *%a, i64 %b) nounwind {
13144; RV32I-LABEL: atomicrmw_add_i64_acq_rel:
13145; RV32I:       # %bb.0:
13146; RV32I-NEXT:    addi sp, sp, -16
13147; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13148; RV32I-NEXT:    li a3, 4
13149; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13150; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13151; RV32I-NEXT:    addi sp, sp, 16
13152; RV32I-NEXT:    ret
13153;
13154; RV32IA-LABEL: atomicrmw_add_i64_acq_rel:
13155; RV32IA:       # %bb.0:
13156; RV32IA-NEXT:    addi sp, sp, -16
13157; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13158; RV32IA-NEXT:    li a3, 4
13159; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13160; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13161; RV32IA-NEXT:    addi sp, sp, 16
13162; RV32IA-NEXT:    ret
13163;
13164; RV64I-LABEL: atomicrmw_add_i64_acq_rel:
13165; RV64I:       # %bb.0:
13166; RV64I-NEXT:    addi sp, sp, -16
13167; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13168; RV64I-NEXT:    li a2, 4
13169; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13170; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13171; RV64I-NEXT:    addi sp, sp, 16
13172; RV64I-NEXT:    ret
13173;
13174; RV64IA-LABEL: atomicrmw_add_i64_acq_rel:
13175; RV64IA:       # %bb.0:
13176; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13177; RV64IA-NEXT:    ret
13178  %1 = atomicrmw add i64* %a, i64 %b acq_rel
13179  ret i64 %1
13180}
13181
13182define i64 @atomicrmw_add_i64_seq_cst(i64 *%a, i64 %b) nounwind {
13183; RV32I-LABEL: atomicrmw_add_i64_seq_cst:
13184; RV32I:       # %bb.0:
13185; RV32I-NEXT:    addi sp, sp, -16
13186; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13187; RV32I-NEXT:    li a3, 5
13188; RV32I-NEXT:    call __atomic_fetch_add_8@plt
13189; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13190; RV32I-NEXT:    addi sp, sp, 16
13191; RV32I-NEXT:    ret
13192;
13193; RV32IA-LABEL: atomicrmw_add_i64_seq_cst:
13194; RV32IA:       # %bb.0:
13195; RV32IA-NEXT:    addi sp, sp, -16
13196; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13197; RV32IA-NEXT:    li a3, 5
13198; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
13199; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13200; RV32IA-NEXT:    addi sp, sp, 16
13201; RV32IA-NEXT:    ret
13202;
13203; RV64I-LABEL: atomicrmw_add_i64_seq_cst:
13204; RV64I:       # %bb.0:
13205; RV64I-NEXT:    addi sp, sp, -16
13206; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13207; RV64I-NEXT:    li a2, 5
13208; RV64I-NEXT:    call __atomic_fetch_add_8@plt
13209; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13210; RV64I-NEXT:    addi sp, sp, 16
13211; RV64I-NEXT:    ret
13212;
13213; RV64IA-LABEL: atomicrmw_add_i64_seq_cst:
13214; RV64IA:       # %bb.0:
13215; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13216; RV64IA-NEXT:    ret
13217  %1 = atomicrmw add i64* %a, i64 %b seq_cst
13218  ret i64 %1
13219}
13220
13221define i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) nounwind {
13222; RV32I-LABEL: atomicrmw_sub_i64_monotonic:
13223; RV32I:       # %bb.0:
13224; RV32I-NEXT:    addi sp, sp, -16
13225; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13226; RV32I-NEXT:    li a3, 0
13227; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13228; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13229; RV32I-NEXT:    addi sp, sp, 16
13230; RV32I-NEXT:    ret
13231;
13232; RV32IA-LABEL: atomicrmw_sub_i64_monotonic:
13233; RV32IA:       # %bb.0:
13234; RV32IA-NEXT:    addi sp, sp, -16
13235; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13236; RV32IA-NEXT:    li a3, 0
13237; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13238; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13239; RV32IA-NEXT:    addi sp, sp, 16
13240; RV32IA-NEXT:    ret
13241;
13242; RV64I-LABEL: atomicrmw_sub_i64_monotonic:
13243; RV64I:       # %bb.0:
13244; RV64I-NEXT:    addi sp, sp, -16
13245; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13246; RV64I-NEXT:    li a2, 0
13247; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13248; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13249; RV64I-NEXT:    addi sp, sp, 16
13250; RV64I-NEXT:    ret
13251;
13252; RV64IA-LABEL: atomicrmw_sub_i64_monotonic:
13253; RV64IA:       # %bb.0:
13254; RV64IA-NEXT:    neg a1, a1
13255; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
13256; RV64IA-NEXT:    ret
13257  %1 = atomicrmw sub i64* %a, i64 %b monotonic
13258  ret i64 %1
13259}
13260
13261define i64 @atomicrmw_sub_i64_acquire(i64* %a, i64 %b) nounwind {
13262; RV32I-LABEL: atomicrmw_sub_i64_acquire:
13263; RV32I:       # %bb.0:
13264; RV32I-NEXT:    addi sp, sp, -16
13265; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13266; RV32I-NEXT:    li a3, 2
13267; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13268; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13269; RV32I-NEXT:    addi sp, sp, 16
13270; RV32I-NEXT:    ret
13271;
13272; RV32IA-LABEL: atomicrmw_sub_i64_acquire:
13273; RV32IA:       # %bb.0:
13274; RV32IA-NEXT:    addi sp, sp, -16
13275; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13276; RV32IA-NEXT:    li a3, 2
13277; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13278; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13279; RV32IA-NEXT:    addi sp, sp, 16
13280; RV32IA-NEXT:    ret
13281;
13282; RV64I-LABEL: atomicrmw_sub_i64_acquire:
13283; RV64I:       # %bb.0:
13284; RV64I-NEXT:    addi sp, sp, -16
13285; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13286; RV64I-NEXT:    li a2, 2
13287; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13288; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13289; RV64I-NEXT:    addi sp, sp, 16
13290; RV64I-NEXT:    ret
13291;
13292; RV64IA-LABEL: atomicrmw_sub_i64_acquire:
13293; RV64IA:       # %bb.0:
13294; RV64IA-NEXT:    neg a1, a1
13295; RV64IA-NEXT:    amoadd.d.aq a0, a1, (a0)
13296; RV64IA-NEXT:    ret
13297  %1 = atomicrmw sub i64* %a, i64 %b acquire
13298  ret i64 %1
13299}
13300
13301define i64 @atomicrmw_sub_i64_release(i64* %a, i64 %b) nounwind {
13302; RV32I-LABEL: atomicrmw_sub_i64_release:
13303; RV32I:       # %bb.0:
13304; RV32I-NEXT:    addi sp, sp, -16
13305; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13306; RV32I-NEXT:    li a3, 3
13307; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13308; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13309; RV32I-NEXT:    addi sp, sp, 16
13310; RV32I-NEXT:    ret
13311;
13312; RV32IA-LABEL: atomicrmw_sub_i64_release:
13313; RV32IA:       # %bb.0:
13314; RV32IA-NEXT:    addi sp, sp, -16
13315; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13316; RV32IA-NEXT:    li a3, 3
13317; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13318; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13319; RV32IA-NEXT:    addi sp, sp, 16
13320; RV32IA-NEXT:    ret
13321;
13322; RV64I-LABEL: atomicrmw_sub_i64_release:
13323; RV64I:       # %bb.0:
13324; RV64I-NEXT:    addi sp, sp, -16
13325; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13326; RV64I-NEXT:    li a2, 3
13327; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13328; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13329; RV64I-NEXT:    addi sp, sp, 16
13330; RV64I-NEXT:    ret
13331;
13332; RV64IA-LABEL: atomicrmw_sub_i64_release:
13333; RV64IA:       # %bb.0:
13334; RV64IA-NEXT:    neg a1, a1
13335; RV64IA-NEXT:    amoadd.d.rl a0, a1, (a0)
13336; RV64IA-NEXT:    ret
13337  %1 = atomicrmw sub i64* %a, i64 %b release
13338  ret i64 %1
13339}
13340
13341define i64 @atomicrmw_sub_i64_acq_rel(i64* %a, i64 %b) nounwind {
13342; RV32I-LABEL: atomicrmw_sub_i64_acq_rel:
13343; RV32I:       # %bb.0:
13344; RV32I-NEXT:    addi sp, sp, -16
13345; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13346; RV32I-NEXT:    li a3, 4
13347; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13348; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13349; RV32I-NEXT:    addi sp, sp, 16
13350; RV32I-NEXT:    ret
13351;
13352; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel:
13353; RV32IA:       # %bb.0:
13354; RV32IA-NEXT:    addi sp, sp, -16
13355; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13356; RV32IA-NEXT:    li a3, 4
13357; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13358; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13359; RV32IA-NEXT:    addi sp, sp, 16
13360; RV32IA-NEXT:    ret
13361;
13362; RV64I-LABEL: atomicrmw_sub_i64_acq_rel:
13363; RV64I:       # %bb.0:
13364; RV64I-NEXT:    addi sp, sp, -16
13365; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13366; RV64I-NEXT:    li a2, 4
13367; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13368; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13369; RV64I-NEXT:    addi sp, sp, 16
13370; RV64I-NEXT:    ret
13371;
13372; RV64IA-LABEL: atomicrmw_sub_i64_acq_rel:
13373; RV64IA:       # %bb.0:
13374; RV64IA-NEXT:    neg a1, a1
13375; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13376; RV64IA-NEXT:    ret
13377  %1 = atomicrmw sub i64* %a, i64 %b acq_rel
13378  ret i64 %1
13379}
13380
13381define i64 @atomicrmw_sub_i64_seq_cst(i64* %a, i64 %b) nounwind {
13382; RV32I-LABEL: atomicrmw_sub_i64_seq_cst:
13383; RV32I:       # %bb.0:
13384; RV32I-NEXT:    addi sp, sp, -16
13385; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13386; RV32I-NEXT:    li a3, 5
13387; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
13388; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13389; RV32I-NEXT:    addi sp, sp, 16
13390; RV32I-NEXT:    ret
13391;
13392; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst:
13393; RV32IA:       # %bb.0:
13394; RV32IA-NEXT:    addi sp, sp, -16
13395; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13396; RV32IA-NEXT:    li a3, 5
13397; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
13398; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13399; RV32IA-NEXT:    addi sp, sp, 16
13400; RV32IA-NEXT:    ret
13401;
13402; RV64I-LABEL: atomicrmw_sub_i64_seq_cst:
13403; RV64I:       # %bb.0:
13404; RV64I-NEXT:    addi sp, sp, -16
13405; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13406; RV64I-NEXT:    li a2, 5
13407; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
13408; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13409; RV64I-NEXT:    addi sp, sp, 16
13410; RV64I-NEXT:    ret
13411;
13412; RV64IA-LABEL: atomicrmw_sub_i64_seq_cst:
13413; RV64IA:       # %bb.0:
13414; RV64IA-NEXT:    neg a1, a1
13415; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
13416; RV64IA-NEXT:    ret
13417  %1 = atomicrmw sub i64* %a, i64 %b seq_cst
13418  ret i64 %1
13419}
13420
13421define i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind {
13422; RV32I-LABEL: atomicrmw_and_i64_monotonic:
13423; RV32I:       # %bb.0:
13424; RV32I-NEXT:    addi sp, sp, -16
13425; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13426; RV32I-NEXT:    li a3, 0
13427; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13428; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13429; RV32I-NEXT:    addi sp, sp, 16
13430; RV32I-NEXT:    ret
13431;
13432; RV32IA-LABEL: atomicrmw_and_i64_monotonic:
13433; RV32IA:       # %bb.0:
13434; RV32IA-NEXT:    addi sp, sp, -16
13435; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13436; RV32IA-NEXT:    li a3, 0
13437; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13438; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13439; RV32IA-NEXT:    addi sp, sp, 16
13440; RV32IA-NEXT:    ret
13441;
13442; RV64I-LABEL: atomicrmw_and_i64_monotonic:
13443; RV64I:       # %bb.0:
13444; RV64I-NEXT:    addi sp, sp, -16
13445; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13446; RV64I-NEXT:    li a2, 0
13447; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13448; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13449; RV64I-NEXT:    addi sp, sp, 16
13450; RV64I-NEXT:    ret
13451;
13452; RV64IA-LABEL: atomicrmw_and_i64_monotonic:
13453; RV64IA:       # %bb.0:
13454; RV64IA-NEXT:    amoand.d a0, a1, (a0)
13455; RV64IA-NEXT:    ret
13456  %1 = atomicrmw and i64* %a, i64 %b monotonic
13457  ret i64 %1
13458}
13459
13460define i64 @atomicrmw_and_i64_acquire(i64 *%a, i64 %b) nounwind {
13461; RV32I-LABEL: atomicrmw_and_i64_acquire:
13462; RV32I:       # %bb.0:
13463; RV32I-NEXT:    addi sp, sp, -16
13464; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13465; RV32I-NEXT:    li a3, 2
13466; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13467; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13468; RV32I-NEXT:    addi sp, sp, 16
13469; RV32I-NEXT:    ret
13470;
13471; RV32IA-LABEL: atomicrmw_and_i64_acquire:
13472; RV32IA:       # %bb.0:
13473; RV32IA-NEXT:    addi sp, sp, -16
13474; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13475; RV32IA-NEXT:    li a3, 2
13476; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13477; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13478; RV32IA-NEXT:    addi sp, sp, 16
13479; RV32IA-NEXT:    ret
13480;
13481; RV64I-LABEL: atomicrmw_and_i64_acquire:
13482; RV64I:       # %bb.0:
13483; RV64I-NEXT:    addi sp, sp, -16
13484; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13485; RV64I-NEXT:    li a2, 2
13486; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13487; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13488; RV64I-NEXT:    addi sp, sp, 16
13489; RV64I-NEXT:    ret
13490;
13491; RV64IA-LABEL: atomicrmw_and_i64_acquire:
13492; RV64IA:       # %bb.0:
13493; RV64IA-NEXT:    amoand.d.aq a0, a1, (a0)
13494; RV64IA-NEXT:    ret
13495  %1 = atomicrmw and i64* %a, i64 %b acquire
13496  ret i64 %1
13497}
13498
13499define i64 @atomicrmw_and_i64_release(i64 *%a, i64 %b) nounwind {
13500; RV32I-LABEL: atomicrmw_and_i64_release:
13501; RV32I:       # %bb.0:
13502; RV32I-NEXT:    addi sp, sp, -16
13503; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13504; RV32I-NEXT:    li a3, 3
13505; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13506; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13507; RV32I-NEXT:    addi sp, sp, 16
13508; RV32I-NEXT:    ret
13509;
13510; RV32IA-LABEL: atomicrmw_and_i64_release:
13511; RV32IA:       # %bb.0:
13512; RV32IA-NEXT:    addi sp, sp, -16
13513; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13514; RV32IA-NEXT:    li a3, 3
13515; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13516; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13517; RV32IA-NEXT:    addi sp, sp, 16
13518; RV32IA-NEXT:    ret
13519;
13520; RV64I-LABEL: atomicrmw_and_i64_release:
13521; RV64I:       # %bb.0:
13522; RV64I-NEXT:    addi sp, sp, -16
13523; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13524; RV64I-NEXT:    li a2, 3
13525; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13526; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13527; RV64I-NEXT:    addi sp, sp, 16
13528; RV64I-NEXT:    ret
13529;
13530; RV64IA-LABEL: atomicrmw_and_i64_release:
13531; RV64IA:       # %bb.0:
13532; RV64IA-NEXT:    amoand.d.rl a0, a1, (a0)
13533; RV64IA-NEXT:    ret
13534  %1 = atomicrmw and i64* %a, i64 %b release
13535  ret i64 %1
13536}
13537
13538define i64 @atomicrmw_and_i64_acq_rel(i64 *%a, i64 %b) nounwind {
13539; RV32I-LABEL: atomicrmw_and_i64_acq_rel:
13540; RV32I:       # %bb.0:
13541; RV32I-NEXT:    addi sp, sp, -16
13542; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13543; RV32I-NEXT:    li a3, 4
13544; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13545; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13546; RV32I-NEXT:    addi sp, sp, 16
13547; RV32I-NEXT:    ret
13548;
13549; RV32IA-LABEL: atomicrmw_and_i64_acq_rel:
13550; RV32IA:       # %bb.0:
13551; RV32IA-NEXT:    addi sp, sp, -16
13552; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13553; RV32IA-NEXT:    li a3, 4
13554; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13555; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13556; RV32IA-NEXT:    addi sp, sp, 16
13557; RV32IA-NEXT:    ret
13558;
13559; RV64I-LABEL: atomicrmw_and_i64_acq_rel:
13560; RV64I:       # %bb.0:
13561; RV64I-NEXT:    addi sp, sp, -16
13562; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13563; RV64I-NEXT:    li a2, 4
13564; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13565; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13566; RV64I-NEXT:    addi sp, sp, 16
13567; RV64I-NEXT:    ret
13568;
13569; RV64IA-LABEL: atomicrmw_and_i64_acq_rel:
13570; RV64IA:       # %bb.0:
13571; RV64IA-NEXT:    amoand.d.aqrl a0, a1, (a0)
13572; RV64IA-NEXT:    ret
13573  %1 = atomicrmw and i64* %a, i64 %b acq_rel
13574  ret i64 %1
13575}
13576
13577define i64 @atomicrmw_and_i64_seq_cst(i64 *%a, i64 %b) nounwind {
13578; RV32I-LABEL: atomicrmw_and_i64_seq_cst:
13579; RV32I:       # %bb.0:
13580; RV32I-NEXT:    addi sp, sp, -16
13581; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13582; RV32I-NEXT:    li a3, 5
13583; RV32I-NEXT:    call __atomic_fetch_and_8@plt
13584; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13585; RV32I-NEXT:    addi sp, sp, 16
13586; RV32I-NEXT:    ret
13587;
13588; RV32IA-LABEL: atomicrmw_and_i64_seq_cst:
13589; RV32IA:       # %bb.0:
13590; RV32IA-NEXT:    addi sp, sp, -16
13591; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13592; RV32IA-NEXT:    li a3, 5
13593; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
13594; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13595; RV32IA-NEXT:    addi sp, sp, 16
13596; RV32IA-NEXT:    ret
13597;
13598; RV64I-LABEL: atomicrmw_and_i64_seq_cst:
13599; RV64I:       # %bb.0:
13600; RV64I-NEXT:    addi sp, sp, -16
13601; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13602; RV64I-NEXT:    li a2, 5
13603; RV64I-NEXT:    call __atomic_fetch_and_8@plt
13604; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13605; RV64I-NEXT:    addi sp, sp, 16
13606; RV64I-NEXT:    ret
13607;
13608; RV64IA-LABEL: atomicrmw_and_i64_seq_cst:
13609; RV64IA:       # %bb.0:
13610; RV64IA-NEXT:    amoand.d.aqrl a0, a1, (a0)
13611; RV64IA-NEXT:    ret
13612  %1 = atomicrmw and i64* %a, i64 %b seq_cst
13613  ret i64 %1
13614}
13615
13616define i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) nounwind {
13617; RV32I-LABEL: atomicrmw_nand_i64_monotonic:
13618; RV32I:       # %bb.0:
13619; RV32I-NEXT:    addi sp, sp, -16
13620; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13621; RV32I-NEXT:    li a3, 0
13622; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13623; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13624; RV32I-NEXT:    addi sp, sp, 16
13625; RV32I-NEXT:    ret
13626;
13627; RV32IA-LABEL: atomicrmw_nand_i64_monotonic:
13628; RV32IA:       # %bb.0:
13629; RV32IA-NEXT:    addi sp, sp, -16
13630; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13631; RV32IA-NEXT:    li a3, 0
13632; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13633; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13634; RV32IA-NEXT:    addi sp, sp, 16
13635; RV32IA-NEXT:    ret
13636;
13637; RV64I-LABEL: atomicrmw_nand_i64_monotonic:
13638; RV64I:       # %bb.0:
13639; RV64I-NEXT:    addi sp, sp, -16
13640; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13641; RV64I-NEXT:    li a2, 0
13642; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13643; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13644; RV64I-NEXT:    addi sp, sp, 16
13645; RV64I-NEXT:    ret
13646;
13647; RV64IA-LABEL: atomicrmw_nand_i64_monotonic:
13648; RV64IA:       # %bb.0:
13649; RV64IA-NEXT:  .LBB185_1: # =>This Inner Loop Header: Depth=1
13650; RV64IA-NEXT:    lr.d a2, (a0)
13651; RV64IA-NEXT:    and a3, a2, a1
13652; RV64IA-NEXT:    not a3, a3
13653; RV64IA-NEXT:    sc.d a3, a3, (a0)
13654; RV64IA-NEXT:    bnez a3, .LBB185_1
13655; RV64IA-NEXT:  # %bb.2:
13656; RV64IA-NEXT:    mv a0, a2
13657; RV64IA-NEXT:    ret
13658  %1 = atomicrmw nand i64* %a, i64 %b monotonic
13659  ret i64 %1
13660}
13661
13662define i64 @atomicrmw_nand_i64_acquire(i64* %a, i64 %b) nounwind {
13663; RV32I-LABEL: atomicrmw_nand_i64_acquire:
13664; RV32I:       # %bb.0:
13665; RV32I-NEXT:    addi sp, sp, -16
13666; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13667; RV32I-NEXT:    li a3, 2
13668; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13669; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13670; RV32I-NEXT:    addi sp, sp, 16
13671; RV32I-NEXT:    ret
13672;
13673; RV32IA-LABEL: atomicrmw_nand_i64_acquire:
13674; RV32IA:       # %bb.0:
13675; RV32IA-NEXT:    addi sp, sp, -16
13676; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13677; RV32IA-NEXT:    li a3, 2
13678; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13679; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13680; RV32IA-NEXT:    addi sp, sp, 16
13681; RV32IA-NEXT:    ret
13682;
13683; RV64I-LABEL: atomicrmw_nand_i64_acquire:
13684; RV64I:       # %bb.0:
13685; RV64I-NEXT:    addi sp, sp, -16
13686; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13687; RV64I-NEXT:    li a2, 2
13688; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13689; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13690; RV64I-NEXT:    addi sp, sp, 16
13691; RV64I-NEXT:    ret
13692;
13693; RV64IA-LABEL: atomicrmw_nand_i64_acquire:
13694; RV64IA:       # %bb.0:
13695; RV64IA-NEXT:  .LBB186_1: # =>This Inner Loop Header: Depth=1
13696; RV64IA-NEXT:    lr.d.aq a2, (a0)
13697; RV64IA-NEXT:    and a3, a2, a1
13698; RV64IA-NEXT:    not a3, a3
13699; RV64IA-NEXT:    sc.d a3, a3, (a0)
13700; RV64IA-NEXT:    bnez a3, .LBB186_1
13701; RV64IA-NEXT:  # %bb.2:
13702; RV64IA-NEXT:    mv a0, a2
13703; RV64IA-NEXT:    ret
13704  %1 = atomicrmw nand i64* %a, i64 %b acquire
13705  ret i64 %1
13706}
13707
13708define i64 @atomicrmw_nand_i64_release(i64* %a, i64 %b) nounwind {
13709; RV32I-LABEL: atomicrmw_nand_i64_release:
13710; RV32I:       # %bb.0:
13711; RV32I-NEXT:    addi sp, sp, -16
13712; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13713; RV32I-NEXT:    li a3, 3
13714; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13715; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13716; RV32I-NEXT:    addi sp, sp, 16
13717; RV32I-NEXT:    ret
13718;
13719; RV32IA-LABEL: atomicrmw_nand_i64_release:
13720; RV32IA:       # %bb.0:
13721; RV32IA-NEXT:    addi sp, sp, -16
13722; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13723; RV32IA-NEXT:    li a3, 3
13724; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13725; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13726; RV32IA-NEXT:    addi sp, sp, 16
13727; RV32IA-NEXT:    ret
13728;
13729; RV64I-LABEL: atomicrmw_nand_i64_release:
13730; RV64I:       # %bb.0:
13731; RV64I-NEXT:    addi sp, sp, -16
13732; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13733; RV64I-NEXT:    li a2, 3
13734; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13735; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13736; RV64I-NEXT:    addi sp, sp, 16
13737; RV64I-NEXT:    ret
13738;
13739; RV64IA-LABEL: atomicrmw_nand_i64_release:
13740; RV64IA:       # %bb.0:
13741; RV64IA-NEXT:  .LBB187_1: # =>This Inner Loop Header: Depth=1
13742; RV64IA-NEXT:    lr.d a2, (a0)
13743; RV64IA-NEXT:    and a3, a2, a1
13744; RV64IA-NEXT:    not a3, a3
13745; RV64IA-NEXT:    sc.d.rl a3, a3, (a0)
13746; RV64IA-NEXT:    bnez a3, .LBB187_1
13747; RV64IA-NEXT:  # %bb.2:
13748; RV64IA-NEXT:    mv a0, a2
13749; RV64IA-NEXT:    ret
13750  %1 = atomicrmw nand i64* %a, i64 %b release
13751  ret i64 %1
13752}
13753
13754define i64 @atomicrmw_nand_i64_acq_rel(i64* %a, i64 %b) nounwind {
13755; RV32I-LABEL: atomicrmw_nand_i64_acq_rel:
13756; RV32I:       # %bb.0:
13757; RV32I-NEXT:    addi sp, sp, -16
13758; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13759; RV32I-NEXT:    li a3, 4
13760; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13761; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13762; RV32I-NEXT:    addi sp, sp, 16
13763; RV32I-NEXT:    ret
13764;
13765; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel:
13766; RV32IA:       # %bb.0:
13767; RV32IA-NEXT:    addi sp, sp, -16
13768; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13769; RV32IA-NEXT:    li a3, 4
13770; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13771; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13772; RV32IA-NEXT:    addi sp, sp, 16
13773; RV32IA-NEXT:    ret
13774;
13775; RV64I-LABEL: atomicrmw_nand_i64_acq_rel:
13776; RV64I:       # %bb.0:
13777; RV64I-NEXT:    addi sp, sp, -16
13778; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13779; RV64I-NEXT:    li a2, 4
13780; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13781; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13782; RV64I-NEXT:    addi sp, sp, 16
13783; RV64I-NEXT:    ret
13784;
13785; RV64IA-LABEL: atomicrmw_nand_i64_acq_rel:
13786; RV64IA:       # %bb.0:
13787; RV64IA-NEXT:  .LBB188_1: # =>This Inner Loop Header: Depth=1
13788; RV64IA-NEXT:    lr.d.aq a2, (a0)
13789; RV64IA-NEXT:    and a3, a2, a1
13790; RV64IA-NEXT:    not a3, a3
13791; RV64IA-NEXT:    sc.d.rl a3, a3, (a0)
13792; RV64IA-NEXT:    bnez a3, .LBB188_1
13793; RV64IA-NEXT:  # %bb.2:
13794; RV64IA-NEXT:    mv a0, a2
13795; RV64IA-NEXT:    ret
13796  %1 = atomicrmw nand i64* %a, i64 %b acq_rel
13797  ret i64 %1
13798}
13799
13800define i64 @atomicrmw_nand_i64_seq_cst(i64* %a, i64 %b) nounwind {
13801; RV32I-LABEL: atomicrmw_nand_i64_seq_cst:
13802; RV32I:       # %bb.0:
13803; RV32I-NEXT:    addi sp, sp, -16
13804; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13805; RV32I-NEXT:    li a3, 5
13806; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
13807; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13808; RV32I-NEXT:    addi sp, sp, 16
13809; RV32I-NEXT:    ret
13810;
13811; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst:
13812; RV32IA:       # %bb.0:
13813; RV32IA-NEXT:    addi sp, sp, -16
13814; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13815; RV32IA-NEXT:    li a3, 5
13816; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
13817; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13818; RV32IA-NEXT:    addi sp, sp, 16
13819; RV32IA-NEXT:    ret
13820;
13821; RV64I-LABEL: atomicrmw_nand_i64_seq_cst:
13822; RV64I:       # %bb.0:
13823; RV64I-NEXT:    addi sp, sp, -16
13824; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13825; RV64I-NEXT:    li a2, 5
13826; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
13827; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13828; RV64I-NEXT:    addi sp, sp, 16
13829; RV64I-NEXT:    ret
13830;
13831; RV64IA-LABEL: atomicrmw_nand_i64_seq_cst:
13832; RV64IA:       # %bb.0:
13833; RV64IA-NEXT:  .LBB189_1: # =>This Inner Loop Header: Depth=1
13834; RV64IA-NEXT:    lr.d.aqrl a2, (a0)
13835; RV64IA-NEXT:    and a3, a2, a1
13836; RV64IA-NEXT:    not a3, a3
13837; RV64IA-NEXT:    sc.d.aqrl a3, a3, (a0)
13838; RV64IA-NEXT:    bnez a3, .LBB189_1
13839; RV64IA-NEXT:  # %bb.2:
13840; RV64IA-NEXT:    mv a0, a2
13841; RV64IA-NEXT:    ret
13842  %1 = atomicrmw nand i64* %a, i64 %b seq_cst
13843  ret i64 %1
13844}
13845
13846define i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind {
13847; RV32I-LABEL: atomicrmw_or_i64_monotonic:
13848; RV32I:       # %bb.0:
13849; RV32I-NEXT:    addi sp, sp, -16
13850; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13851; RV32I-NEXT:    li a3, 0
13852; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13853; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13854; RV32I-NEXT:    addi sp, sp, 16
13855; RV32I-NEXT:    ret
13856;
13857; RV32IA-LABEL: atomicrmw_or_i64_monotonic:
13858; RV32IA:       # %bb.0:
13859; RV32IA-NEXT:    addi sp, sp, -16
13860; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13861; RV32IA-NEXT:    li a3, 0
13862; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13863; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13864; RV32IA-NEXT:    addi sp, sp, 16
13865; RV32IA-NEXT:    ret
13866;
13867; RV64I-LABEL: atomicrmw_or_i64_monotonic:
13868; RV64I:       # %bb.0:
13869; RV64I-NEXT:    addi sp, sp, -16
13870; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13871; RV64I-NEXT:    li a2, 0
13872; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13873; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13874; RV64I-NEXT:    addi sp, sp, 16
13875; RV64I-NEXT:    ret
13876;
13877; RV64IA-LABEL: atomicrmw_or_i64_monotonic:
13878; RV64IA:       # %bb.0:
13879; RV64IA-NEXT:    amoor.d a0, a1, (a0)
13880; RV64IA-NEXT:    ret
13881  %1 = atomicrmw or i64* %a, i64 %b monotonic
13882  ret i64 %1
13883}
13884
13885define i64 @atomicrmw_or_i64_acquire(i64 *%a, i64 %b) nounwind {
13886; RV32I-LABEL: atomicrmw_or_i64_acquire:
13887; RV32I:       # %bb.0:
13888; RV32I-NEXT:    addi sp, sp, -16
13889; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13890; RV32I-NEXT:    li a3, 2
13891; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13892; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13893; RV32I-NEXT:    addi sp, sp, 16
13894; RV32I-NEXT:    ret
13895;
13896; RV32IA-LABEL: atomicrmw_or_i64_acquire:
13897; RV32IA:       # %bb.0:
13898; RV32IA-NEXT:    addi sp, sp, -16
13899; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13900; RV32IA-NEXT:    li a3, 2
13901; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13902; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13903; RV32IA-NEXT:    addi sp, sp, 16
13904; RV32IA-NEXT:    ret
13905;
13906; RV64I-LABEL: atomicrmw_or_i64_acquire:
13907; RV64I:       # %bb.0:
13908; RV64I-NEXT:    addi sp, sp, -16
13909; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13910; RV64I-NEXT:    li a2, 2
13911; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13912; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13913; RV64I-NEXT:    addi sp, sp, 16
13914; RV64I-NEXT:    ret
13915;
13916; RV64IA-LABEL: atomicrmw_or_i64_acquire:
13917; RV64IA:       # %bb.0:
13918; RV64IA-NEXT:    amoor.d.aq a0, a1, (a0)
13919; RV64IA-NEXT:    ret
13920  %1 = atomicrmw or i64* %a, i64 %b acquire
13921  ret i64 %1
13922}
13923
13924define i64 @atomicrmw_or_i64_release(i64 *%a, i64 %b) nounwind {
13925; RV32I-LABEL: atomicrmw_or_i64_release:
13926; RV32I:       # %bb.0:
13927; RV32I-NEXT:    addi sp, sp, -16
13928; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13929; RV32I-NEXT:    li a3, 3
13930; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13931; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13932; RV32I-NEXT:    addi sp, sp, 16
13933; RV32I-NEXT:    ret
13934;
13935; RV32IA-LABEL: atomicrmw_or_i64_release:
13936; RV32IA:       # %bb.0:
13937; RV32IA-NEXT:    addi sp, sp, -16
13938; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13939; RV32IA-NEXT:    li a3, 3
13940; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13941; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13942; RV32IA-NEXT:    addi sp, sp, 16
13943; RV32IA-NEXT:    ret
13944;
13945; RV64I-LABEL: atomicrmw_or_i64_release:
13946; RV64I:       # %bb.0:
13947; RV64I-NEXT:    addi sp, sp, -16
13948; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13949; RV64I-NEXT:    li a2, 3
13950; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13951; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13952; RV64I-NEXT:    addi sp, sp, 16
13953; RV64I-NEXT:    ret
13954;
13955; RV64IA-LABEL: atomicrmw_or_i64_release:
13956; RV64IA:       # %bb.0:
13957; RV64IA-NEXT:    amoor.d.rl a0, a1, (a0)
13958; RV64IA-NEXT:    ret
13959  %1 = atomicrmw or i64* %a, i64 %b release
13960  ret i64 %1
13961}
13962
13963define i64 @atomicrmw_or_i64_acq_rel(i64 *%a, i64 %b) nounwind {
13964; RV32I-LABEL: atomicrmw_or_i64_acq_rel:
13965; RV32I:       # %bb.0:
13966; RV32I-NEXT:    addi sp, sp, -16
13967; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13968; RV32I-NEXT:    li a3, 4
13969; RV32I-NEXT:    call __atomic_fetch_or_8@plt
13970; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13971; RV32I-NEXT:    addi sp, sp, 16
13972; RV32I-NEXT:    ret
13973;
13974; RV32IA-LABEL: atomicrmw_or_i64_acq_rel:
13975; RV32IA:       # %bb.0:
13976; RV32IA-NEXT:    addi sp, sp, -16
13977; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13978; RV32IA-NEXT:    li a3, 4
13979; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
13980; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13981; RV32IA-NEXT:    addi sp, sp, 16
13982; RV32IA-NEXT:    ret
13983;
13984; RV64I-LABEL: atomicrmw_or_i64_acq_rel:
13985; RV64I:       # %bb.0:
13986; RV64I-NEXT:    addi sp, sp, -16
13987; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13988; RV64I-NEXT:    li a2, 4
13989; RV64I-NEXT:    call __atomic_fetch_or_8@plt
13990; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13991; RV64I-NEXT:    addi sp, sp, 16
13992; RV64I-NEXT:    ret
13993;
13994; RV64IA-LABEL: atomicrmw_or_i64_acq_rel:
13995; RV64IA:       # %bb.0:
13996; RV64IA-NEXT:    amoor.d.aqrl a0, a1, (a0)
13997; RV64IA-NEXT:    ret
13998  %1 = atomicrmw or i64* %a, i64 %b acq_rel
13999  ret i64 %1
14000}
14001
14002define i64 @atomicrmw_or_i64_seq_cst(i64 *%a, i64 %b) nounwind {
14003; RV32I-LABEL: atomicrmw_or_i64_seq_cst:
14004; RV32I:       # %bb.0:
14005; RV32I-NEXT:    addi sp, sp, -16
14006; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14007; RV32I-NEXT:    li a3, 5
14008; RV32I-NEXT:    call __atomic_fetch_or_8@plt
14009; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14010; RV32I-NEXT:    addi sp, sp, 16
14011; RV32I-NEXT:    ret
14012;
14013; RV32IA-LABEL: atomicrmw_or_i64_seq_cst:
14014; RV32IA:       # %bb.0:
14015; RV32IA-NEXT:    addi sp, sp, -16
14016; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14017; RV32IA-NEXT:    li a3, 5
14018; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
14019; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14020; RV32IA-NEXT:    addi sp, sp, 16
14021; RV32IA-NEXT:    ret
14022;
14023; RV64I-LABEL: atomicrmw_or_i64_seq_cst:
14024; RV64I:       # %bb.0:
14025; RV64I-NEXT:    addi sp, sp, -16
14026; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14027; RV64I-NEXT:    li a2, 5
14028; RV64I-NEXT:    call __atomic_fetch_or_8@plt
14029; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14030; RV64I-NEXT:    addi sp, sp, 16
14031; RV64I-NEXT:    ret
14032;
14033; RV64IA-LABEL: atomicrmw_or_i64_seq_cst:
14034; RV64IA:       # %bb.0:
14035; RV64IA-NEXT:    amoor.d.aqrl a0, a1, (a0)
14036; RV64IA-NEXT:    ret
14037  %1 = atomicrmw or i64* %a, i64 %b seq_cst
14038  ret i64 %1
14039}
14040
14041define i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind {
14042; RV32I-LABEL: atomicrmw_xor_i64_monotonic:
14043; RV32I:       # %bb.0:
14044; RV32I-NEXT:    addi sp, sp, -16
14045; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14046; RV32I-NEXT:    li a3, 0
14047; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14048; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14049; RV32I-NEXT:    addi sp, sp, 16
14050; RV32I-NEXT:    ret
14051;
14052; RV32IA-LABEL: atomicrmw_xor_i64_monotonic:
14053; RV32IA:       # %bb.0:
14054; RV32IA-NEXT:    addi sp, sp, -16
14055; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14056; RV32IA-NEXT:    li a3, 0
14057; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14058; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14059; RV32IA-NEXT:    addi sp, sp, 16
14060; RV32IA-NEXT:    ret
14061;
14062; RV64I-LABEL: atomicrmw_xor_i64_monotonic:
14063; RV64I:       # %bb.0:
14064; RV64I-NEXT:    addi sp, sp, -16
14065; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14066; RV64I-NEXT:    li a2, 0
14067; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14068; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14069; RV64I-NEXT:    addi sp, sp, 16
14070; RV64I-NEXT:    ret
14071;
14072; RV64IA-LABEL: atomicrmw_xor_i64_monotonic:
14073; RV64IA:       # %bb.0:
14074; RV64IA-NEXT:    amoxor.d a0, a1, (a0)
14075; RV64IA-NEXT:    ret
14076  %1 = atomicrmw xor i64* %a, i64 %b monotonic
14077  ret i64 %1
14078}
14079
14080define i64 @atomicrmw_xor_i64_acquire(i64 *%a, i64 %b) nounwind {
14081; RV32I-LABEL: atomicrmw_xor_i64_acquire:
14082; RV32I:       # %bb.0:
14083; RV32I-NEXT:    addi sp, sp, -16
14084; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14085; RV32I-NEXT:    li a3, 2
14086; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14087; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14088; RV32I-NEXT:    addi sp, sp, 16
14089; RV32I-NEXT:    ret
14090;
14091; RV32IA-LABEL: atomicrmw_xor_i64_acquire:
14092; RV32IA:       # %bb.0:
14093; RV32IA-NEXT:    addi sp, sp, -16
14094; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14095; RV32IA-NEXT:    li a3, 2
14096; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14097; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14098; RV32IA-NEXT:    addi sp, sp, 16
14099; RV32IA-NEXT:    ret
14100;
14101; RV64I-LABEL: atomicrmw_xor_i64_acquire:
14102; RV64I:       # %bb.0:
14103; RV64I-NEXT:    addi sp, sp, -16
14104; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14105; RV64I-NEXT:    li a2, 2
14106; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14107; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14108; RV64I-NEXT:    addi sp, sp, 16
14109; RV64I-NEXT:    ret
14110;
14111; RV64IA-LABEL: atomicrmw_xor_i64_acquire:
14112; RV64IA:       # %bb.0:
14113; RV64IA-NEXT:    amoxor.d.aq a0, a1, (a0)
14114; RV64IA-NEXT:    ret
14115  %1 = atomicrmw xor i64* %a, i64 %b acquire
14116  ret i64 %1
14117}
14118
14119define i64 @atomicrmw_xor_i64_release(i64 *%a, i64 %b) nounwind {
14120; RV32I-LABEL: atomicrmw_xor_i64_release:
14121; RV32I:       # %bb.0:
14122; RV32I-NEXT:    addi sp, sp, -16
14123; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14124; RV32I-NEXT:    li a3, 3
14125; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14126; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14127; RV32I-NEXT:    addi sp, sp, 16
14128; RV32I-NEXT:    ret
14129;
14130; RV32IA-LABEL: atomicrmw_xor_i64_release:
14131; RV32IA:       # %bb.0:
14132; RV32IA-NEXT:    addi sp, sp, -16
14133; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14134; RV32IA-NEXT:    li a3, 3
14135; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14136; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14137; RV32IA-NEXT:    addi sp, sp, 16
14138; RV32IA-NEXT:    ret
14139;
14140; RV64I-LABEL: atomicrmw_xor_i64_release:
14141; RV64I:       # %bb.0:
14142; RV64I-NEXT:    addi sp, sp, -16
14143; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14144; RV64I-NEXT:    li a2, 3
14145; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14146; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14147; RV64I-NEXT:    addi sp, sp, 16
14148; RV64I-NEXT:    ret
14149;
14150; RV64IA-LABEL: atomicrmw_xor_i64_release:
14151; RV64IA:       # %bb.0:
14152; RV64IA-NEXT:    amoxor.d.rl a0, a1, (a0)
14153; RV64IA-NEXT:    ret
14154  %1 = atomicrmw xor i64* %a, i64 %b release
14155  ret i64 %1
14156}
14157
14158define i64 @atomicrmw_xor_i64_acq_rel(i64 *%a, i64 %b) nounwind {
14159; RV32I-LABEL: atomicrmw_xor_i64_acq_rel:
14160; RV32I:       # %bb.0:
14161; RV32I-NEXT:    addi sp, sp, -16
14162; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14163; RV32I-NEXT:    li a3, 4
14164; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14165; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14166; RV32I-NEXT:    addi sp, sp, 16
14167; RV32I-NEXT:    ret
14168;
14169; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel:
14170; RV32IA:       # %bb.0:
14171; RV32IA-NEXT:    addi sp, sp, -16
14172; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14173; RV32IA-NEXT:    li a3, 4
14174; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14175; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14176; RV32IA-NEXT:    addi sp, sp, 16
14177; RV32IA-NEXT:    ret
14178;
14179; RV64I-LABEL: atomicrmw_xor_i64_acq_rel:
14180; RV64I:       # %bb.0:
14181; RV64I-NEXT:    addi sp, sp, -16
14182; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14183; RV64I-NEXT:    li a2, 4
14184; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14185; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14186; RV64I-NEXT:    addi sp, sp, 16
14187; RV64I-NEXT:    ret
14188;
14189; RV64IA-LABEL: atomicrmw_xor_i64_acq_rel:
14190; RV64IA:       # %bb.0:
14191; RV64IA-NEXT:    amoxor.d.aqrl a0, a1, (a0)
14192; RV64IA-NEXT:    ret
14193  %1 = atomicrmw xor i64* %a, i64 %b acq_rel
14194  ret i64 %1
14195}
14196
14197define i64 @atomicrmw_xor_i64_seq_cst(i64 *%a, i64 %b) nounwind {
14198; RV32I-LABEL: atomicrmw_xor_i64_seq_cst:
14199; RV32I:       # %bb.0:
14200; RV32I-NEXT:    addi sp, sp, -16
14201; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14202; RV32I-NEXT:    li a3, 5
14203; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
14204; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14205; RV32I-NEXT:    addi sp, sp, 16
14206; RV32I-NEXT:    ret
14207;
14208; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst:
14209; RV32IA:       # %bb.0:
14210; RV32IA-NEXT:    addi sp, sp, -16
14211; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14212; RV32IA-NEXT:    li a3, 5
14213; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
14214; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14215; RV32IA-NEXT:    addi sp, sp, 16
14216; RV32IA-NEXT:    ret
14217;
14218; RV64I-LABEL: atomicrmw_xor_i64_seq_cst:
14219; RV64I:       # %bb.0:
14220; RV64I-NEXT:    addi sp, sp, -16
14221; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14222; RV64I-NEXT:    li a2, 5
14223; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
14224; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14225; RV64I-NEXT:    addi sp, sp, 16
14226; RV64I-NEXT:    ret
14227;
14228; RV64IA-LABEL: atomicrmw_xor_i64_seq_cst:
14229; RV64IA:       # %bb.0:
14230; RV64IA-NEXT:    amoxor.d.aqrl a0, a1, (a0)
14231; RV64IA-NEXT:    ret
14232  %1 = atomicrmw xor i64* %a, i64 %b seq_cst
14233  ret i64 %1
14234}
14235
14236define i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind {
14237; RV32I-LABEL: atomicrmw_max_i64_monotonic:
14238; RV32I:       # %bb.0:
14239; RV32I-NEXT:    addi sp, sp, -32
14240; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14241; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14242; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14243; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14244; RV32I-NEXT:    mv s0, a0
14245; RV32I-NEXT:    lw a5, 4(a0)
14246; RV32I-NEXT:    lw a4, 0(a0)
14247; RV32I-NEXT:    mv s1, a2
14248; RV32I-NEXT:    mv s2, a1
14249; RV32I-NEXT:    j .LBB200_2
14250; RV32I-NEXT:  .LBB200_1: # %atomicrmw.start
14251; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14252; RV32I-NEXT:    sw a4, 8(sp)
14253; RV32I-NEXT:    sw a5, 12(sp)
14254; RV32I-NEXT:    addi a1, sp, 8
14255; RV32I-NEXT:    mv a0, s0
14256; RV32I-NEXT:    li a4, 0
14257; RV32I-NEXT:    li a5, 0
14258; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14259; RV32I-NEXT:    lw a5, 12(sp)
14260; RV32I-NEXT:    lw a4, 8(sp)
14261; RV32I-NEXT:    bnez a0, .LBB200_7
14262; RV32I-NEXT:  .LBB200_2: # %atomicrmw.start
14263; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14264; RV32I-NEXT:    beq a5, s1, .LBB200_4
14265; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14266; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14267; RV32I-NEXT:    slt a0, s1, a5
14268; RV32I-NEXT:    j .LBB200_5
14269; RV32I-NEXT:  .LBB200_4: # in Loop: Header=BB200_2 Depth=1
14270; RV32I-NEXT:    sltu a0, s2, a4
14271; RV32I-NEXT:  .LBB200_5: # %atomicrmw.start
14272; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14273; RV32I-NEXT:    mv a2, a4
14274; RV32I-NEXT:    mv a3, a5
14275; RV32I-NEXT:    bnez a0, .LBB200_1
14276; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14277; RV32I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14278; RV32I-NEXT:    mv a2, s2
14279; RV32I-NEXT:    mv a3, s1
14280; RV32I-NEXT:    j .LBB200_1
14281; RV32I-NEXT:  .LBB200_7: # %atomicrmw.end
14282; RV32I-NEXT:    mv a0, a4
14283; RV32I-NEXT:    mv a1, a5
14284; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14285; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14286; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14287; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14288; RV32I-NEXT:    addi sp, sp, 32
14289; RV32I-NEXT:    ret
14290;
14291; RV32IA-LABEL: atomicrmw_max_i64_monotonic:
14292; RV32IA:       # %bb.0:
14293; RV32IA-NEXT:    addi sp, sp, -32
14294; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14295; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14296; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14297; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14298; RV32IA-NEXT:    mv s0, a0
14299; RV32IA-NEXT:    lw a5, 4(a0)
14300; RV32IA-NEXT:    lw a4, 0(a0)
14301; RV32IA-NEXT:    mv s1, a2
14302; RV32IA-NEXT:    mv s2, a1
14303; RV32IA-NEXT:    j .LBB200_2
14304; RV32IA-NEXT:  .LBB200_1: # %atomicrmw.start
14305; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14306; RV32IA-NEXT:    sw a4, 8(sp)
14307; RV32IA-NEXT:    sw a5, 12(sp)
14308; RV32IA-NEXT:    addi a1, sp, 8
14309; RV32IA-NEXT:    mv a0, s0
14310; RV32IA-NEXT:    li a4, 0
14311; RV32IA-NEXT:    li a5, 0
14312; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14313; RV32IA-NEXT:    lw a5, 12(sp)
14314; RV32IA-NEXT:    lw a4, 8(sp)
14315; RV32IA-NEXT:    bnez a0, .LBB200_7
14316; RV32IA-NEXT:  .LBB200_2: # %atomicrmw.start
14317; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14318; RV32IA-NEXT:    beq a5, s1, .LBB200_4
14319; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14320; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14321; RV32IA-NEXT:    slt a0, s1, a5
14322; RV32IA-NEXT:    j .LBB200_5
14323; RV32IA-NEXT:  .LBB200_4: # in Loop: Header=BB200_2 Depth=1
14324; RV32IA-NEXT:    sltu a0, s2, a4
14325; RV32IA-NEXT:  .LBB200_5: # %atomicrmw.start
14326; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14327; RV32IA-NEXT:    mv a2, a4
14328; RV32IA-NEXT:    mv a3, a5
14329; RV32IA-NEXT:    bnez a0, .LBB200_1
14330; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14331; RV32IA-NEXT:    # in Loop: Header=BB200_2 Depth=1
14332; RV32IA-NEXT:    mv a2, s2
14333; RV32IA-NEXT:    mv a3, s1
14334; RV32IA-NEXT:    j .LBB200_1
14335; RV32IA-NEXT:  .LBB200_7: # %atomicrmw.end
14336; RV32IA-NEXT:    mv a0, a4
14337; RV32IA-NEXT:    mv a1, a5
14338; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14339; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14340; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14341; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14342; RV32IA-NEXT:    addi sp, sp, 32
14343; RV32IA-NEXT:    ret
14344;
14345; RV64I-LABEL: atomicrmw_max_i64_monotonic:
14346; RV64I:       # %bb.0:
14347; RV64I-NEXT:    addi sp, sp, -32
14348; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14349; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14350; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14351; RV64I-NEXT:    mv s0, a0
14352; RV64I-NEXT:    ld a3, 0(a0)
14353; RV64I-NEXT:    mv s1, a1
14354; RV64I-NEXT:    j .LBB200_2
14355; RV64I-NEXT:  .LBB200_1: # %atomicrmw.start
14356; RV64I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14357; RV64I-NEXT:    sd a3, 0(sp)
14358; RV64I-NEXT:    mv a1, sp
14359; RV64I-NEXT:    mv a0, s0
14360; RV64I-NEXT:    li a3, 0
14361; RV64I-NEXT:    li a4, 0
14362; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14363; RV64I-NEXT:    ld a3, 0(sp)
14364; RV64I-NEXT:    bnez a0, .LBB200_4
14365; RV64I-NEXT:  .LBB200_2: # %atomicrmw.start
14366; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14367; RV64I-NEXT:    mv a2, a3
14368; RV64I-NEXT:    blt s1, a3, .LBB200_1
14369; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14370; RV64I-NEXT:    # in Loop: Header=BB200_2 Depth=1
14371; RV64I-NEXT:    mv a2, s1
14372; RV64I-NEXT:    j .LBB200_1
14373; RV64I-NEXT:  .LBB200_4: # %atomicrmw.end
14374; RV64I-NEXT:    mv a0, a3
14375; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14376; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14377; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14378; RV64I-NEXT:    addi sp, sp, 32
14379; RV64I-NEXT:    ret
14380;
14381; RV64IA-LABEL: atomicrmw_max_i64_monotonic:
14382; RV64IA:       # %bb.0:
14383; RV64IA-NEXT:    amomax.d a0, a1, (a0)
14384; RV64IA-NEXT:    ret
14385  %1 = atomicrmw max i64* %a, i64 %b monotonic
14386  ret i64 %1
14387}
14388
14389define i64 @atomicrmw_max_i64_acquire(i64 *%a, i64 %b) nounwind {
14390; RV32I-LABEL: atomicrmw_max_i64_acquire:
14391; RV32I:       # %bb.0:
14392; RV32I-NEXT:    addi sp, sp, -32
14393; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14394; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14395; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14396; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14397; RV32I-NEXT:    mv s0, a0
14398; RV32I-NEXT:    lw a5, 4(a0)
14399; RV32I-NEXT:    lw a4, 0(a0)
14400; RV32I-NEXT:    mv s1, a2
14401; RV32I-NEXT:    mv s2, a1
14402; RV32I-NEXT:    j .LBB201_2
14403; RV32I-NEXT:  .LBB201_1: # %atomicrmw.start
14404; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14405; RV32I-NEXT:    sw a4, 8(sp)
14406; RV32I-NEXT:    sw a5, 12(sp)
14407; RV32I-NEXT:    addi a1, sp, 8
14408; RV32I-NEXT:    li a4, 2
14409; RV32I-NEXT:    li a5, 2
14410; RV32I-NEXT:    mv a0, s0
14411; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14412; RV32I-NEXT:    lw a5, 12(sp)
14413; RV32I-NEXT:    lw a4, 8(sp)
14414; RV32I-NEXT:    bnez a0, .LBB201_7
14415; RV32I-NEXT:  .LBB201_2: # %atomicrmw.start
14416; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14417; RV32I-NEXT:    beq a5, s1, .LBB201_4
14418; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14419; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14420; RV32I-NEXT:    slt a0, s1, a5
14421; RV32I-NEXT:    j .LBB201_5
14422; RV32I-NEXT:  .LBB201_4: # in Loop: Header=BB201_2 Depth=1
14423; RV32I-NEXT:    sltu a0, s2, a4
14424; RV32I-NEXT:  .LBB201_5: # %atomicrmw.start
14425; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14426; RV32I-NEXT:    mv a2, a4
14427; RV32I-NEXT:    mv a3, a5
14428; RV32I-NEXT:    bnez a0, .LBB201_1
14429; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14430; RV32I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14431; RV32I-NEXT:    mv a2, s2
14432; RV32I-NEXT:    mv a3, s1
14433; RV32I-NEXT:    j .LBB201_1
14434; RV32I-NEXT:  .LBB201_7: # %atomicrmw.end
14435; RV32I-NEXT:    mv a0, a4
14436; RV32I-NEXT:    mv a1, a5
14437; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14438; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14439; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14440; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14441; RV32I-NEXT:    addi sp, sp, 32
14442; RV32I-NEXT:    ret
14443;
14444; RV32IA-LABEL: atomicrmw_max_i64_acquire:
14445; RV32IA:       # %bb.0:
14446; RV32IA-NEXT:    addi sp, sp, -32
14447; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14448; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14449; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14450; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14451; RV32IA-NEXT:    mv s0, a0
14452; RV32IA-NEXT:    lw a5, 4(a0)
14453; RV32IA-NEXT:    lw a4, 0(a0)
14454; RV32IA-NEXT:    mv s1, a2
14455; RV32IA-NEXT:    mv s2, a1
14456; RV32IA-NEXT:    j .LBB201_2
14457; RV32IA-NEXT:  .LBB201_1: # %atomicrmw.start
14458; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14459; RV32IA-NEXT:    sw a4, 8(sp)
14460; RV32IA-NEXT:    sw a5, 12(sp)
14461; RV32IA-NEXT:    addi a1, sp, 8
14462; RV32IA-NEXT:    li a4, 2
14463; RV32IA-NEXT:    li a5, 2
14464; RV32IA-NEXT:    mv a0, s0
14465; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14466; RV32IA-NEXT:    lw a5, 12(sp)
14467; RV32IA-NEXT:    lw a4, 8(sp)
14468; RV32IA-NEXT:    bnez a0, .LBB201_7
14469; RV32IA-NEXT:  .LBB201_2: # %atomicrmw.start
14470; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14471; RV32IA-NEXT:    beq a5, s1, .LBB201_4
14472; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14473; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14474; RV32IA-NEXT:    slt a0, s1, a5
14475; RV32IA-NEXT:    j .LBB201_5
14476; RV32IA-NEXT:  .LBB201_4: # in Loop: Header=BB201_2 Depth=1
14477; RV32IA-NEXT:    sltu a0, s2, a4
14478; RV32IA-NEXT:  .LBB201_5: # %atomicrmw.start
14479; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14480; RV32IA-NEXT:    mv a2, a4
14481; RV32IA-NEXT:    mv a3, a5
14482; RV32IA-NEXT:    bnez a0, .LBB201_1
14483; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14484; RV32IA-NEXT:    # in Loop: Header=BB201_2 Depth=1
14485; RV32IA-NEXT:    mv a2, s2
14486; RV32IA-NEXT:    mv a3, s1
14487; RV32IA-NEXT:    j .LBB201_1
14488; RV32IA-NEXT:  .LBB201_7: # %atomicrmw.end
14489; RV32IA-NEXT:    mv a0, a4
14490; RV32IA-NEXT:    mv a1, a5
14491; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14492; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14493; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14494; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14495; RV32IA-NEXT:    addi sp, sp, 32
14496; RV32IA-NEXT:    ret
14497;
14498; RV64I-LABEL: atomicrmw_max_i64_acquire:
14499; RV64I:       # %bb.0:
14500; RV64I-NEXT:    addi sp, sp, -32
14501; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14502; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14503; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14504; RV64I-NEXT:    mv s0, a0
14505; RV64I-NEXT:    ld a3, 0(a0)
14506; RV64I-NEXT:    mv s1, a1
14507; RV64I-NEXT:    j .LBB201_2
14508; RV64I-NEXT:  .LBB201_1: # %atomicrmw.start
14509; RV64I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14510; RV64I-NEXT:    sd a3, 0(sp)
14511; RV64I-NEXT:    mv a1, sp
14512; RV64I-NEXT:    li a3, 2
14513; RV64I-NEXT:    li a4, 2
14514; RV64I-NEXT:    mv a0, s0
14515; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14516; RV64I-NEXT:    ld a3, 0(sp)
14517; RV64I-NEXT:    bnez a0, .LBB201_4
14518; RV64I-NEXT:  .LBB201_2: # %atomicrmw.start
14519; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14520; RV64I-NEXT:    mv a2, a3
14521; RV64I-NEXT:    blt s1, a3, .LBB201_1
14522; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14523; RV64I-NEXT:    # in Loop: Header=BB201_2 Depth=1
14524; RV64I-NEXT:    mv a2, s1
14525; RV64I-NEXT:    j .LBB201_1
14526; RV64I-NEXT:  .LBB201_4: # %atomicrmw.end
14527; RV64I-NEXT:    mv a0, a3
14528; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14529; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14530; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14531; RV64I-NEXT:    addi sp, sp, 32
14532; RV64I-NEXT:    ret
14533;
14534; RV64IA-LABEL: atomicrmw_max_i64_acquire:
14535; RV64IA:       # %bb.0:
14536; RV64IA-NEXT:    amomax.d.aq a0, a1, (a0)
14537; RV64IA-NEXT:    ret
14538  %1 = atomicrmw max i64* %a, i64 %b acquire
14539  ret i64 %1
14540}
14541
14542define i64 @atomicrmw_max_i64_release(i64 *%a, i64 %b) nounwind {
14543; RV32I-LABEL: atomicrmw_max_i64_release:
14544; RV32I:       # %bb.0:
14545; RV32I-NEXT:    addi sp, sp, -32
14546; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14547; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14548; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14549; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14550; RV32I-NEXT:    mv s0, a0
14551; RV32I-NEXT:    lw a5, 4(a0)
14552; RV32I-NEXT:    lw a4, 0(a0)
14553; RV32I-NEXT:    mv s1, a2
14554; RV32I-NEXT:    mv s2, a1
14555; RV32I-NEXT:    j .LBB202_2
14556; RV32I-NEXT:  .LBB202_1: # %atomicrmw.start
14557; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14558; RV32I-NEXT:    sw a4, 8(sp)
14559; RV32I-NEXT:    sw a5, 12(sp)
14560; RV32I-NEXT:    addi a1, sp, 8
14561; RV32I-NEXT:    li a4, 3
14562; RV32I-NEXT:    mv a0, s0
14563; RV32I-NEXT:    li a5, 0
14564; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14565; RV32I-NEXT:    lw a5, 12(sp)
14566; RV32I-NEXT:    lw a4, 8(sp)
14567; RV32I-NEXT:    bnez a0, .LBB202_7
14568; RV32I-NEXT:  .LBB202_2: # %atomicrmw.start
14569; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14570; RV32I-NEXT:    beq a5, s1, .LBB202_4
14571; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14572; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14573; RV32I-NEXT:    slt a0, s1, a5
14574; RV32I-NEXT:    j .LBB202_5
14575; RV32I-NEXT:  .LBB202_4: # in Loop: Header=BB202_2 Depth=1
14576; RV32I-NEXT:    sltu a0, s2, a4
14577; RV32I-NEXT:  .LBB202_5: # %atomicrmw.start
14578; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14579; RV32I-NEXT:    mv a2, a4
14580; RV32I-NEXT:    mv a3, a5
14581; RV32I-NEXT:    bnez a0, .LBB202_1
14582; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14583; RV32I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14584; RV32I-NEXT:    mv a2, s2
14585; RV32I-NEXT:    mv a3, s1
14586; RV32I-NEXT:    j .LBB202_1
14587; RV32I-NEXT:  .LBB202_7: # %atomicrmw.end
14588; RV32I-NEXT:    mv a0, a4
14589; RV32I-NEXT:    mv a1, a5
14590; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14591; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14592; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14593; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14594; RV32I-NEXT:    addi sp, sp, 32
14595; RV32I-NEXT:    ret
14596;
14597; RV32IA-LABEL: atomicrmw_max_i64_release:
14598; RV32IA:       # %bb.0:
14599; RV32IA-NEXT:    addi sp, sp, -32
14600; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14601; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14602; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14603; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14604; RV32IA-NEXT:    mv s0, a0
14605; RV32IA-NEXT:    lw a5, 4(a0)
14606; RV32IA-NEXT:    lw a4, 0(a0)
14607; RV32IA-NEXT:    mv s1, a2
14608; RV32IA-NEXT:    mv s2, a1
14609; RV32IA-NEXT:    j .LBB202_2
14610; RV32IA-NEXT:  .LBB202_1: # %atomicrmw.start
14611; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14612; RV32IA-NEXT:    sw a4, 8(sp)
14613; RV32IA-NEXT:    sw a5, 12(sp)
14614; RV32IA-NEXT:    addi a1, sp, 8
14615; RV32IA-NEXT:    li a4, 3
14616; RV32IA-NEXT:    mv a0, s0
14617; RV32IA-NEXT:    li a5, 0
14618; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14619; RV32IA-NEXT:    lw a5, 12(sp)
14620; RV32IA-NEXT:    lw a4, 8(sp)
14621; RV32IA-NEXT:    bnez a0, .LBB202_7
14622; RV32IA-NEXT:  .LBB202_2: # %atomicrmw.start
14623; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14624; RV32IA-NEXT:    beq a5, s1, .LBB202_4
14625; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14626; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14627; RV32IA-NEXT:    slt a0, s1, a5
14628; RV32IA-NEXT:    j .LBB202_5
14629; RV32IA-NEXT:  .LBB202_4: # in Loop: Header=BB202_2 Depth=1
14630; RV32IA-NEXT:    sltu a0, s2, a4
14631; RV32IA-NEXT:  .LBB202_5: # %atomicrmw.start
14632; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14633; RV32IA-NEXT:    mv a2, a4
14634; RV32IA-NEXT:    mv a3, a5
14635; RV32IA-NEXT:    bnez a0, .LBB202_1
14636; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14637; RV32IA-NEXT:    # in Loop: Header=BB202_2 Depth=1
14638; RV32IA-NEXT:    mv a2, s2
14639; RV32IA-NEXT:    mv a3, s1
14640; RV32IA-NEXT:    j .LBB202_1
14641; RV32IA-NEXT:  .LBB202_7: # %atomicrmw.end
14642; RV32IA-NEXT:    mv a0, a4
14643; RV32IA-NEXT:    mv a1, a5
14644; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14645; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14646; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14647; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14648; RV32IA-NEXT:    addi sp, sp, 32
14649; RV32IA-NEXT:    ret
14650;
14651; RV64I-LABEL: atomicrmw_max_i64_release:
14652; RV64I:       # %bb.0:
14653; RV64I-NEXT:    addi sp, sp, -32
14654; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14655; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14656; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14657; RV64I-NEXT:    mv s0, a0
14658; RV64I-NEXT:    ld a3, 0(a0)
14659; RV64I-NEXT:    mv s1, a1
14660; RV64I-NEXT:    j .LBB202_2
14661; RV64I-NEXT:  .LBB202_1: # %atomicrmw.start
14662; RV64I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14663; RV64I-NEXT:    sd a3, 0(sp)
14664; RV64I-NEXT:    mv a1, sp
14665; RV64I-NEXT:    li a3, 3
14666; RV64I-NEXT:    mv a0, s0
14667; RV64I-NEXT:    li a4, 0
14668; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14669; RV64I-NEXT:    ld a3, 0(sp)
14670; RV64I-NEXT:    bnez a0, .LBB202_4
14671; RV64I-NEXT:  .LBB202_2: # %atomicrmw.start
14672; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14673; RV64I-NEXT:    mv a2, a3
14674; RV64I-NEXT:    blt s1, a3, .LBB202_1
14675; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14676; RV64I-NEXT:    # in Loop: Header=BB202_2 Depth=1
14677; RV64I-NEXT:    mv a2, s1
14678; RV64I-NEXT:    j .LBB202_1
14679; RV64I-NEXT:  .LBB202_4: # %atomicrmw.end
14680; RV64I-NEXT:    mv a0, a3
14681; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14682; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14683; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14684; RV64I-NEXT:    addi sp, sp, 32
14685; RV64I-NEXT:    ret
14686;
14687; RV64IA-LABEL: atomicrmw_max_i64_release:
14688; RV64IA:       # %bb.0:
14689; RV64IA-NEXT:    amomax.d.rl a0, a1, (a0)
14690; RV64IA-NEXT:    ret
14691  %1 = atomicrmw max i64* %a, i64 %b release
14692  ret i64 %1
14693}
14694
14695define i64 @atomicrmw_max_i64_acq_rel(i64 *%a, i64 %b) nounwind {
14696; RV32I-LABEL: atomicrmw_max_i64_acq_rel:
14697; RV32I:       # %bb.0:
14698; RV32I-NEXT:    addi sp, sp, -32
14699; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14700; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14701; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14702; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14703; RV32I-NEXT:    mv s0, a0
14704; RV32I-NEXT:    lw a5, 4(a0)
14705; RV32I-NEXT:    lw a4, 0(a0)
14706; RV32I-NEXT:    mv s1, a2
14707; RV32I-NEXT:    mv s2, a1
14708; RV32I-NEXT:    j .LBB203_2
14709; RV32I-NEXT:  .LBB203_1: # %atomicrmw.start
14710; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14711; RV32I-NEXT:    sw a4, 8(sp)
14712; RV32I-NEXT:    sw a5, 12(sp)
14713; RV32I-NEXT:    addi a1, sp, 8
14714; RV32I-NEXT:    li a4, 4
14715; RV32I-NEXT:    li a5, 2
14716; RV32I-NEXT:    mv a0, s0
14717; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14718; RV32I-NEXT:    lw a5, 12(sp)
14719; RV32I-NEXT:    lw a4, 8(sp)
14720; RV32I-NEXT:    bnez a0, .LBB203_7
14721; RV32I-NEXT:  .LBB203_2: # %atomicrmw.start
14722; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14723; RV32I-NEXT:    beq a5, s1, .LBB203_4
14724; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14725; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14726; RV32I-NEXT:    slt a0, s1, a5
14727; RV32I-NEXT:    j .LBB203_5
14728; RV32I-NEXT:  .LBB203_4: # in Loop: Header=BB203_2 Depth=1
14729; RV32I-NEXT:    sltu a0, s2, a4
14730; RV32I-NEXT:  .LBB203_5: # %atomicrmw.start
14731; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14732; RV32I-NEXT:    mv a2, a4
14733; RV32I-NEXT:    mv a3, a5
14734; RV32I-NEXT:    bnez a0, .LBB203_1
14735; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14736; RV32I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14737; RV32I-NEXT:    mv a2, s2
14738; RV32I-NEXT:    mv a3, s1
14739; RV32I-NEXT:    j .LBB203_1
14740; RV32I-NEXT:  .LBB203_7: # %atomicrmw.end
14741; RV32I-NEXT:    mv a0, a4
14742; RV32I-NEXT:    mv a1, a5
14743; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14744; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14745; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14746; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14747; RV32I-NEXT:    addi sp, sp, 32
14748; RV32I-NEXT:    ret
14749;
14750; RV32IA-LABEL: atomicrmw_max_i64_acq_rel:
14751; RV32IA:       # %bb.0:
14752; RV32IA-NEXT:    addi sp, sp, -32
14753; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14754; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14755; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14756; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14757; RV32IA-NEXT:    mv s0, a0
14758; RV32IA-NEXT:    lw a5, 4(a0)
14759; RV32IA-NEXT:    lw a4, 0(a0)
14760; RV32IA-NEXT:    mv s1, a2
14761; RV32IA-NEXT:    mv s2, a1
14762; RV32IA-NEXT:    j .LBB203_2
14763; RV32IA-NEXT:  .LBB203_1: # %atomicrmw.start
14764; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14765; RV32IA-NEXT:    sw a4, 8(sp)
14766; RV32IA-NEXT:    sw a5, 12(sp)
14767; RV32IA-NEXT:    addi a1, sp, 8
14768; RV32IA-NEXT:    li a4, 4
14769; RV32IA-NEXT:    li a5, 2
14770; RV32IA-NEXT:    mv a0, s0
14771; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14772; RV32IA-NEXT:    lw a5, 12(sp)
14773; RV32IA-NEXT:    lw a4, 8(sp)
14774; RV32IA-NEXT:    bnez a0, .LBB203_7
14775; RV32IA-NEXT:  .LBB203_2: # %atomicrmw.start
14776; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14777; RV32IA-NEXT:    beq a5, s1, .LBB203_4
14778; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14779; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14780; RV32IA-NEXT:    slt a0, s1, a5
14781; RV32IA-NEXT:    j .LBB203_5
14782; RV32IA-NEXT:  .LBB203_4: # in Loop: Header=BB203_2 Depth=1
14783; RV32IA-NEXT:    sltu a0, s2, a4
14784; RV32IA-NEXT:  .LBB203_5: # %atomicrmw.start
14785; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14786; RV32IA-NEXT:    mv a2, a4
14787; RV32IA-NEXT:    mv a3, a5
14788; RV32IA-NEXT:    bnez a0, .LBB203_1
14789; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14790; RV32IA-NEXT:    # in Loop: Header=BB203_2 Depth=1
14791; RV32IA-NEXT:    mv a2, s2
14792; RV32IA-NEXT:    mv a3, s1
14793; RV32IA-NEXT:    j .LBB203_1
14794; RV32IA-NEXT:  .LBB203_7: # %atomicrmw.end
14795; RV32IA-NEXT:    mv a0, a4
14796; RV32IA-NEXT:    mv a1, a5
14797; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14798; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14799; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14800; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14801; RV32IA-NEXT:    addi sp, sp, 32
14802; RV32IA-NEXT:    ret
14803;
14804; RV64I-LABEL: atomicrmw_max_i64_acq_rel:
14805; RV64I:       # %bb.0:
14806; RV64I-NEXT:    addi sp, sp, -32
14807; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14808; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14809; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14810; RV64I-NEXT:    mv s0, a0
14811; RV64I-NEXT:    ld a3, 0(a0)
14812; RV64I-NEXT:    mv s1, a1
14813; RV64I-NEXT:    j .LBB203_2
14814; RV64I-NEXT:  .LBB203_1: # %atomicrmw.start
14815; RV64I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14816; RV64I-NEXT:    sd a3, 0(sp)
14817; RV64I-NEXT:    mv a1, sp
14818; RV64I-NEXT:    li a3, 4
14819; RV64I-NEXT:    li a4, 2
14820; RV64I-NEXT:    mv a0, s0
14821; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14822; RV64I-NEXT:    ld a3, 0(sp)
14823; RV64I-NEXT:    bnez a0, .LBB203_4
14824; RV64I-NEXT:  .LBB203_2: # %atomicrmw.start
14825; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14826; RV64I-NEXT:    mv a2, a3
14827; RV64I-NEXT:    blt s1, a3, .LBB203_1
14828; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14829; RV64I-NEXT:    # in Loop: Header=BB203_2 Depth=1
14830; RV64I-NEXT:    mv a2, s1
14831; RV64I-NEXT:    j .LBB203_1
14832; RV64I-NEXT:  .LBB203_4: # %atomicrmw.end
14833; RV64I-NEXT:    mv a0, a3
14834; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14835; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14836; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14837; RV64I-NEXT:    addi sp, sp, 32
14838; RV64I-NEXT:    ret
14839;
14840; RV64IA-LABEL: atomicrmw_max_i64_acq_rel:
14841; RV64IA:       # %bb.0:
14842; RV64IA-NEXT:    amomax.d.aqrl a0, a1, (a0)
14843; RV64IA-NEXT:    ret
14844  %1 = atomicrmw max i64* %a, i64 %b acq_rel
14845  ret i64 %1
14846}
14847
14848define i64 @atomicrmw_max_i64_seq_cst(i64 *%a, i64 %b) nounwind {
14849; RV32I-LABEL: atomicrmw_max_i64_seq_cst:
14850; RV32I:       # %bb.0:
14851; RV32I-NEXT:    addi sp, sp, -32
14852; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14853; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14854; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14855; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14856; RV32I-NEXT:    mv s0, a0
14857; RV32I-NEXT:    lw a5, 4(a0)
14858; RV32I-NEXT:    lw a4, 0(a0)
14859; RV32I-NEXT:    mv s1, a2
14860; RV32I-NEXT:    mv s2, a1
14861; RV32I-NEXT:    j .LBB204_2
14862; RV32I-NEXT:  .LBB204_1: # %atomicrmw.start
14863; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14864; RV32I-NEXT:    sw a4, 8(sp)
14865; RV32I-NEXT:    sw a5, 12(sp)
14866; RV32I-NEXT:    addi a1, sp, 8
14867; RV32I-NEXT:    li a4, 5
14868; RV32I-NEXT:    li a5, 5
14869; RV32I-NEXT:    mv a0, s0
14870; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
14871; RV32I-NEXT:    lw a5, 12(sp)
14872; RV32I-NEXT:    lw a4, 8(sp)
14873; RV32I-NEXT:    bnez a0, .LBB204_7
14874; RV32I-NEXT:  .LBB204_2: # %atomicrmw.start
14875; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
14876; RV32I-NEXT:    beq a5, s1, .LBB204_4
14877; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
14878; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14879; RV32I-NEXT:    slt a0, s1, a5
14880; RV32I-NEXT:    j .LBB204_5
14881; RV32I-NEXT:  .LBB204_4: # in Loop: Header=BB204_2 Depth=1
14882; RV32I-NEXT:    sltu a0, s2, a4
14883; RV32I-NEXT:  .LBB204_5: # %atomicrmw.start
14884; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14885; RV32I-NEXT:    mv a2, a4
14886; RV32I-NEXT:    mv a3, a5
14887; RV32I-NEXT:    bnez a0, .LBB204_1
14888; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
14889; RV32I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14890; RV32I-NEXT:    mv a2, s2
14891; RV32I-NEXT:    mv a3, s1
14892; RV32I-NEXT:    j .LBB204_1
14893; RV32I-NEXT:  .LBB204_7: # %atomicrmw.end
14894; RV32I-NEXT:    mv a0, a4
14895; RV32I-NEXT:    mv a1, a5
14896; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14897; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14898; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14899; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14900; RV32I-NEXT:    addi sp, sp, 32
14901; RV32I-NEXT:    ret
14902;
14903; RV32IA-LABEL: atomicrmw_max_i64_seq_cst:
14904; RV32IA:       # %bb.0:
14905; RV32IA-NEXT:    addi sp, sp, -32
14906; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
14907; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
14908; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
14909; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
14910; RV32IA-NEXT:    mv s0, a0
14911; RV32IA-NEXT:    lw a5, 4(a0)
14912; RV32IA-NEXT:    lw a4, 0(a0)
14913; RV32IA-NEXT:    mv s1, a2
14914; RV32IA-NEXT:    mv s2, a1
14915; RV32IA-NEXT:    j .LBB204_2
14916; RV32IA-NEXT:  .LBB204_1: # %atomicrmw.start
14917; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14918; RV32IA-NEXT:    sw a4, 8(sp)
14919; RV32IA-NEXT:    sw a5, 12(sp)
14920; RV32IA-NEXT:    addi a1, sp, 8
14921; RV32IA-NEXT:    li a4, 5
14922; RV32IA-NEXT:    li a5, 5
14923; RV32IA-NEXT:    mv a0, s0
14924; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
14925; RV32IA-NEXT:    lw a5, 12(sp)
14926; RV32IA-NEXT:    lw a4, 8(sp)
14927; RV32IA-NEXT:    bnez a0, .LBB204_7
14928; RV32IA-NEXT:  .LBB204_2: # %atomicrmw.start
14929; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
14930; RV32IA-NEXT:    beq a5, s1, .LBB204_4
14931; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
14932; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14933; RV32IA-NEXT:    slt a0, s1, a5
14934; RV32IA-NEXT:    j .LBB204_5
14935; RV32IA-NEXT:  .LBB204_4: # in Loop: Header=BB204_2 Depth=1
14936; RV32IA-NEXT:    sltu a0, s2, a4
14937; RV32IA-NEXT:  .LBB204_5: # %atomicrmw.start
14938; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14939; RV32IA-NEXT:    mv a2, a4
14940; RV32IA-NEXT:    mv a3, a5
14941; RV32IA-NEXT:    bnez a0, .LBB204_1
14942; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
14943; RV32IA-NEXT:    # in Loop: Header=BB204_2 Depth=1
14944; RV32IA-NEXT:    mv a2, s2
14945; RV32IA-NEXT:    mv a3, s1
14946; RV32IA-NEXT:    j .LBB204_1
14947; RV32IA-NEXT:  .LBB204_7: # %atomicrmw.end
14948; RV32IA-NEXT:    mv a0, a4
14949; RV32IA-NEXT:    mv a1, a5
14950; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
14951; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
14952; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
14953; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
14954; RV32IA-NEXT:    addi sp, sp, 32
14955; RV32IA-NEXT:    ret
14956;
14957; RV64I-LABEL: atomicrmw_max_i64_seq_cst:
14958; RV64I:       # %bb.0:
14959; RV64I-NEXT:    addi sp, sp, -32
14960; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
14961; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
14962; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
14963; RV64I-NEXT:    mv s0, a0
14964; RV64I-NEXT:    ld a3, 0(a0)
14965; RV64I-NEXT:    mv s1, a1
14966; RV64I-NEXT:    j .LBB204_2
14967; RV64I-NEXT:  .LBB204_1: # %atomicrmw.start
14968; RV64I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14969; RV64I-NEXT:    sd a3, 0(sp)
14970; RV64I-NEXT:    mv a1, sp
14971; RV64I-NEXT:    li a3, 5
14972; RV64I-NEXT:    li a4, 5
14973; RV64I-NEXT:    mv a0, s0
14974; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
14975; RV64I-NEXT:    ld a3, 0(sp)
14976; RV64I-NEXT:    bnez a0, .LBB204_4
14977; RV64I-NEXT:  .LBB204_2: # %atomicrmw.start
14978; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
14979; RV64I-NEXT:    mv a2, a3
14980; RV64I-NEXT:    blt s1, a3, .LBB204_1
14981; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
14982; RV64I-NEXT:    # in Loop: Header=BB204_2 Depth=1
14983; RV64I-NEXT:    mv a2, s1
14984; RV64I-NEXT:    j .LBB204_1
14985; RV64I-NEXT:  .LBB204_4: # %atomicrmw.end
14986; RV64I-NEXT:    mv a0, a3
14987; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
14988; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
14989; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
14990; RV64I-NEXT:    addi sp, sp, 32
14991; RV64I-NEXT:    ret
14992;
14993; RV64IA-LABEL: atomicrmw_max_i64_seq_cst:
14994; RV64IA:       # %bb.0:
14995; RV64IA-NEXT:    amomax.d.aqrl a0, a1, (a0)
14996; RV64IA-NEXT:    ret
14997  %1 = atomicrmw max i64* %a, i64 %b seq_cst
14998  ret i64 %1
14999}
15000
15001define i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind {
15002; RV32I-LABEL: atomicrmw_min_i64_monotonic:
15003; RV32I:       # %bb.0:
15004; RV32I-NEXT:    addi sp, sp, -32
15005; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15006; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15007; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15008; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15009; RV32I-NEXT:    mv s0, a0
15010; RV32I-NEXT:    lw a5, 4(a0)
15011; RV32I-NEXT:    lw a4, 0(a0)
15012; RV32I-NEXT:    mv s1, a2
15013; RV32I-NEXT:    mv s2, a1
15014; RV32I-NEXT:    j .LBB205_2
15015; RV32I-NEXT:  .LBB205_1: # %atomicrmw.start
15016; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15017; RV32I-NEXT:    sw a4, 8(sp)
15018; RV32I-NEXT:    sw a5, 12(sp)
15019; RV32I-NEXT:    addi a1, sp, 8
15020; RV32I-NEXT:    mv a0, s0
15021; RV32I-NEXT:    li a4, 0
15022; RV32I-NEXT:    li a5, 0
15023; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15024; RV32I-NEXT:    lw a5, 12(sp)
15025; RV32I-NEXT:    lw a4, 8(sp)
15026; RV32I-NEXT:    bnez a0, .LBB205_7
15027; RV32I-NEXT:  .LBB205_2: # %atomicrmw.start
15028; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15029; RV32I-NEXT:    beq a5, s1, .LBB205_4
15030; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15031; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15032; RV32I-NEXT:    slt a0, s1, a5
15033; RV32I-NEXT:    j .LBB205_5
15034; RV32I-NEXT:  .LBB205_4: # in Loop: Header=BB205_2 Depth=1
15035; RV32I-NEXT:    sltu a0, s2, a4
15036; RV32I-NEXT:  .LBB205_5: # %atomicrmw.start
15037; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15038; RV32I-NEXT:    xori a0, a0, 1
15039; RV32I-NEXT:    mv a2, a4
15040; RV32I-NEXT:    mv a3, a5
15041; RV32I-NEXT:    bnez a0, .LBB205_1
15042; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15043; RV32I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15044; RV32I-NEXT:    mv a2, s2
15045; RV32I-NEXT:    mv a3, s1
15046; RV32I-NEXT:    j .LBB205_1
15047; RV32I-NEXT:  .LBB205_7: # %atomicrmw.end
15048; RV32I-NEXT:    mv a0, a4
15049; RV32I-NEXT:    mv a1, a5
15050; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15051; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15052; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15053; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15054; RV32I-NEXT:    addi sp, sp, 32
15055; RV32I-NEXT:    ret
15056;
15057; RV32IA-LABEL: atomicrmw_min_i64_monotonic:
15058; RV32IA:       # %bb.0:
15059; RV32IA-NEXT:    addi sp, sp, -32
15060; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15061; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15062; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15063; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15064; RV32IA-NEXT:    mv s0, a0
15065; RV32IA-NEXT:    lw a5, 4(a0)
15066; RV32IA-NEXT:    lw a4, 0(a0)
15067; RV32IA-NEXT:    mv s1, a2
15068; RV32IA-NEXT:    mv s2, a1
15069; RV32IA-NEXT:    j .LBB205_2
15070; RV32IA-NEXT:  .LBB205_1: # %atomicrmw.start
15071; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15072; RV32IA-NEXT:    sw a4, 8(sp)
15073; RV32IA-NEXT:    sw a5, 12(sp)
15074; RV32IA-NEXT:    addi a1, sp, 8
15075; RV32IA-NEXT:    mv a0, s0
15076; RV32IA-NEXT:    li a4, 0
15077; RV32IA-NEXT:    li a5, 0
15078; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15079; RV32IA-NEXT:    lw a5, 12(sp)
15080; RV32IA-NEXT:    lw a4, 8(sp)
15081; RV32IA-NEXT:    bnez a0, .LBB205_7
15082; RV32IA-NEXT:  .LBB205_2: # %atomicrmw.start
15083; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15084; RV32IA-NEXT:    beq a5, s1, .LBB205_4
15085; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15086; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15087; RV32IA-NEXT:    slt a0, s1, a5
15088; RV32IA-NEXT:    j .LBB205_5
15089; RV32IA-NEXT:  .LBB205_4: # in Loop: Header=BB205_2 Depth=1
15090; RV32IA-NEXT:    sltu a0, s2, a4
15091; RV32IA-NEXT:  .LBB205_5: # %atomicrmw.start
15092; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15093; RV32IA-NEXT:    xori a0, a0, 1
15094; RV32IA-NEXT:    mv a2, a4
15095; RV32IA-NEXT:    mv a3, a5
15096; RV32IA-NEXT:    bnez a0, .LBB205_1
15097; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15098; RV32IA-NEXT:    # in Loop: Header=BB205_2 Depth=1
15099; RV32IA-NEXT:    mv a2, s2
15100; RV32IA-NEXT:    mv a3, s1
15101; RV32IA-NEXT:    j .LBB205_1
15102; RV32IA-NEXT:  .LBB205_7: # %atomicrmw.end
15103; RV32IA-NEXT:    mv a0, a4
15104; RV32IA-NEXT:    mv a1, a5
15105; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15106; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15107; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15108; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15109; RV32IA-NEXT:    addi sp, sp, 32
15110; RV32IA-NEXT:    ret
15111;
15112; RV64I-LABEL: atomicrmw_min_i64_monotonic:
15113; RV64I:       # %bb.0:
15114; RV64I-NEXT:    addi sp, sp, -32
15115; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15116; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15117; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15118; RV64I-NEXT:    mv s0, a0
15119; RV64I-NEXT:    ld a3, 0(a0)
15120; RV64I-NEXT:    mv s1, a1
15121; RV64I-NEXT:    j .LBB205_2
15122; RV64I-NEXT:  .LBB205_1: # %atomicrmw.start
15123; RV64I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15124; RV64I-NEXT:    sd a3, 0(sp)
15125; RV64I-NEXT:    mv a1, sp
15126; RV64I-NEXT:    mv a0, s0
15127; RV64I-NEXT:    li a3, 0
15128; RV64I-NEXT:    li a4, 0
15129; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15130; RV64I-NEXT:    ld a3, 0(sp)
15131; RV64I-NEXT:    bnez a0, .LBB205_4
15132; RV64I-NEXT:  .LBB205_2: # %atomicrmw.start
15133; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15134; RV64I-NEXT:    mv a2, a3
15135; RV64I-NEXT:    bge s1, a3, .LBB205_1
15136; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15137; RV64I-NEXT:    # in Loop: Header=BB205_2 Depth=1
15138; RV64I-NEXT:    mv a2, s1
15139; RV64I-NEXT:    j .LBB205_1
15140; RV64I-NEXT:  .LBB205_4: # %atomicrmw.end
15141; RV64I-NEXT:    mv a0, a3
15142; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15143; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15144; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15145; RV64I-NEXT:    addi sp, sp, 32
15146; RV64I-NEXT:    ret
15147;
15148; RV64IA-LABEL: atomicrmw_min_i64_monotonic:
15149; RV64IA:       # %bb.0:
15150; RV64IA-NEXT:    amomin.d a0, a1, (a0)
15151; RV64IA-NEXT:    ret
15152  %1 = atomicrmw min i64* %a, i64 %b monotonic
15153  ret i64 %1
15154}
15155
15156define i64 @atomicrmw_min_i64_acquire(i64 *%a, i64 %b) nounwind {
15157; RV32I-LABEL: atomicrmw_min_i64_acquire:
15158; RV32I:       # %bb.0:
15159; RV32I-NEXT:    addi sp, sp, -32
15160; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15161; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15162; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15163; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15164; RV32I-NEXT:    mv s0, a0
15165; RV32I-NEXT:    lw a5, 4(a0)
15166; RV32I-NEXT:    lw a4, 0(a0)
15167; RV32I-NEXT:    mv s1, a2
15168; RV32I-NEXT:    mv s2, a1
15169; RV32I-NEXT:    j .LBB206_2
15170; RV32I-NEXT:  .LBB206_1: # %atomicrmw.start
15171; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15172; RV32I-NEXT:    sw a4, 8(sp)
15173; RV32I-NEXT:    sw a5, 12(sp)
15174; RV32I-NEXT:    addi a1, sp, 8
15175; RV32I-NEXT:    li a4, 2
15176; RV32I-NEXT:    li a5, 2
15177; RV32I-NEXT:    mv a0, s0
15178; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15179; RV32I-NEXT:    lw a5, 12(sp)
15180; RV32I-NEXT:    lw a4, 8(sp)
15181; RV32I-NEXT:    bnez a0, .LBB206_7
15182; RV32I-NEXT:  .LBB206_2: # %atomicrmw.start
15183; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15184; RV32I-NEXT:    beq a5, s1, .LBB206_4
15185; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15186; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15187; RV32I-NEXT:    slt a0, s1, a5
15188; RV32I-NEXT:    j .LBB206_5
15189; RV32I-NEXT:  .LBB206_4: # in Loop: Header=BB206_2 Depth=1
15190; RV32I-NEXT:    sltu a0, s2, a4
15191; RV32I-NEXT:  .LBB206_5: # %atomicrmw.start
15192; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15193; RV32I-NEXT:    xori a0, a0, 1
15194; RV32I-NEXT:    mv a2, a4
15195; RV32I-NEXT:    mv a3, a5
15196; RV32I-NEXT:    bnez a0, .LBB206_1
15197; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15198; RV32I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15199; RV32I-NEXT:    mv a2, s2
15200; RV32I-NEXT:    mv a3, s1
15201; RV32I-NEXT:    j .LBB206_1
15202; RV32I-NEXT:  .LBB206_7: # %atomicrmw.end
15203; RV32I-NEXT:    mv a0, a4
15204; RV32I-NEXT:    mv a1, a5
15205; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15206; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15207; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15208; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15209; RV32I-NEXT:    addi sp, sp, 32
15210; RV32I-NEXT:    ret
15211;
15212; RV32IA-LABEL: atomicrmw_min_i64_acquire:
15213; RV32IA:       # %bb.0:
15214; RV32IA-NEXT:    addi sp, sp, -32
15215; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15216; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15217; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15218; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15219; RV32IA-NEXT:    mv s0, a0
15220; RV32IA-NEXT:    lw a5, 4(a0)
15221; RV32IA-NEXT:    lw a4, 0(a0)
15222; RV32IA-NEXT:    mv s1, a2
15223; RV32IA-NEXT:    mv s2, a1
15224; RV32IA-NEXT:    j .LBB206_2
15225; RV32IA-NEXT:  .LBB206_1: # %atomicrmw.start
15226; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15227; RV32IA-NEXT:    sw a4, 8(sp)
15228; RV32IA-NEXT:    sw a5, 12(sp)
15229; RV32IA-NEXT:    addi a1, sp, 8
15230; RV32IA-NEXT:    li a4, 2
15231; RV32IA-NEXT:    li a5, 2
15232; RV32IA-NEXT:    mv a0, s0
15233; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15234; RV32IA-NEXT:    lw a5, 12(sp)
15235; RV32IA-NEXT:    lw a4, 8(sp)
15236; RV32IA-NEXT:    bnez a0, .LBB206_7
15237; RV32IA-NEXT:  .LBB206_2: # %atomicrmw.start
15238; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15239; RV32IA-NEXT:    beq a5, s1, .LBB206_4
15240; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15241; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15242; RV32IA-NEXT:    slt a0, s1, a5
15243; RV32IA-NEXT:    j .LBB206_5
15244; RV32IA-NEXT:  .LBB206_4: # in Loop: Header=BB206_2 Depth=1
15245; RV32IA-NEXT:    sltu a0, s2, a4
15246; RV32IA-NEXT:  .LBB206_5: # %atomicrmw.start
15247; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15248; RV32IA-NEXT:    xori a0, a0, 1
15249; RV32IA-NEXT:    mv a2, a4
15250; RV32IA-NEXT:    mv a3, a5
15251; RV32IA-NEXT:    bnez a0, .LBB206_1
15252; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15253; RV32IA-NEXT:    # in Loop: Header=BB206_2 Depth=1
15254; RV32IA-NEXT:    mv a2, s2
15255; RV32IA-NEXT:    mv a3, s1
15256; RV32IA-NEXT:    j .LBB206_1
15257; RV32IA-NEXT:  .LBB206_7: # %atomicrmw.end
15258; RV32IA-NEXT:    mv a0, a4
15259; RV32IA-NEXT:    mv a1, a5
15260; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15261; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15262; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15263; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15264; RV32IA-NEXT:    addi sp, sp, 32
15265; RV32IA-NEXT:    ret
15266;
15267; RV64I-LABEL: atomicrmw_min_i64_acquire:
15268; RV64I:       # %bb.0:
15269; RV64I-NEXT:    addi sp, sp, -32
15270; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15271; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15272; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15273; RV64I-NEXT:    mv s0, a0
15274; RV64I-NEXT:    ld a3, 0(a0)
15275; RV64I-NEXT:    mv s1, a1
15276; RV64I-NEXT:    j .LBB206_2
15277; RV64I-NEXT:  .LBB206_1: # %atomicrmw.start
15278; RV64I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15279; RV64I-NEXT:    sd a3, 0(sp)
15280; RV64I-NEXT:    mv a1, sp
15281; RV64I-NEXT:    li a3, 2
15282; RV64I-NEXT:    li a4, 2
15283; RV64I-NEXT:    mv a0, s0
15284; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15285; RV64I-NEXT:    ld a3, 0(sp)
15286; RV64I-NEXT:    bnez a0, .LBB206_4
15287; RV64I-NEXT:  .LBB206_2: # %atomicrmw.start
15288; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15289; RV64I-NEXT:    mv a2, a3
15290; RV64I-NEXT:    bge s1, a3, .LBB206_1
15291; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15292; RV64I-NEXT:    # in Loop: Header=BB206_2 Depth=1
15293; RV64I-NEXT:    mv a2, s1
15294; RV64I-NEXT:    j .LBB206_1
15295; RV64I-NEXT:  .LBB206_4: # %atomicrmw.end
15296; RV64I-NEXT:    mv a0, a3
15297; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15298; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15299; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15300; RV64I-NEXT:    addi sp, sp, 32
15301; RV64I-NEXT:    ret
15302;
15303; RV64IA-LABEL: atomicrmw_min_i64_acquire:
15304; RV64IA:       # %bb.0:
15305; RV64IA-NEXT:    amomin.d.aq a0, a1, (a0)
15306; RV64IA-NEXT:    ret
15307  %1 = atomicrmw min i64* %a, i64 %b acquire
15308  ret i64 %1
15309}
15310
15311define i64 @atomicrmw_min_i64_release(i64 *%a, i64 %b) nounwind {
15312; RV32I-LABEL: atomicrmw_min_i64_release:
15313; RV32I:       # %bb.0:
15314; RV32I-NEXT:    addi sp, sp, -32
15315; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15316; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15317; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15318; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15319; RV32I-NEXT:    mv s0, a0
15320; RV32I-NEXT:    lw a5, 4(a0)
15321; RV32I-NEXT:    lw a4, 0(a0)
15322; RV32I-NEXT:    mv s1, a2
15323; RV32I-NEXT:    mv s2, a1
15324; RV32I-NEXT:    j .LBB207_2
15325; RV32I-NEXT:  .LBB207_1: # %atomicrmw.start
15326; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15327; RV32I-NEXT:    sw a4, 8(sp)
15328; RV32I-NEXT:    sw a5, 12(sp)
15329; RV32I-NEXT:    addi a1, sp, 8
15330; RV32I-NEXT:    li a4, 3
15331; RV32I-NEXT:    mv a0, s0
15332; RV32I-NEXT:    li a5, 0
15333; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15334; RV32I-NEXT:    lw a5, 12(sp)
15335; RV32I-NEXT:    lw a4, 8(sp)
15336; RV32I-NEXT:    bnez a0, .LBB207_7
15337; RV32I-NEXT:  .LBB207_2: # %atomicrmw.start
15338; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15339; RV32I-NEXT:    beq a5, s1, .LBB207_4
15340; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15341; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15342; RV32I-NEXT:    slt a0, s1, a5
15343; RV32I-NEXT:    j .LBB207_5
15344; RV32I-NEXT:  .LBB207_4: # in Loop: Header=BB207_2 Depth=1
15345; RV32I-NEXT:    sltu a0, s2, a4
15346; RV32I-NEXT:  .LBB207_5: # %atomicrmw.start
15347; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15348; RV32I-NEXT:    xori a0, a0, 1
15349; RV32I-NEXT:    mv a2, a4
15350; RV32I-NEXT:    mv a3, a5
15351; RV32I-NEXT:    bnez a0, .LBB207_1
15352; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15353; RV32I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15354; RV32I-NEXT:    mv a2, s2
15355; RV32I-NEXT:    mv a3, s1
15356; RV32I-NEXT:    j .LBB207_1
15357; RV32I-NEXT:  .LBB207_7: # %atomicrmw.end
15358; RV32I-NEXT:    mv a0, a4
15359; RV32I-NEXT:    mv a1, a5
15360; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15361; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15362; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15363; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15364; RV32I-NEXT:    addi sp, sp, 32
15365; RV32I-NEXT:    ret
15366;
15367; RV32IA-LABEL: atomicrmw_min_i64_release:
15368; RV32IA:       # %bb.0:
15369; RV32IA-NEXT:    addi sp, sp, -32
15370; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15371; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15372; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15373; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15374; RV32IA-NEXT:    mv s0, a0
15375; RV32IA-NEXT:    lw a5, 4(a0)
15376; RV32IA-NEXT:    lw a4, 0(a0)
15377; RV32IA-NEXT:    mv s1, a2
15378; RV32IA-NEXT:    mv s2, a1
15379; RV32IA-NEXT:    j .LBB207_2
15380; RV32IA-NEXT:  .LBB207_1: # %atomicrmw.start
15381; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15382; RV32IA-NEXT:    sw a4, 8(sp)
15383; RV32IA-NEXT:    sw a5, 12(sp)
15384; RV32IA-NEXT:    addi a1, sp, 8
15385; RV32IA-NEXT:    li a4, 3
15386; RV32IA-NEXT:    mv a0, s0
15387; RV32IA-NEXT:    li a5, 0
15388; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15389; RV32IA-NEXT:    lw a5, 12(sp)
15390; RV32IA-NEXT:    lw a4, 8(sp)
15391; RV32IA-NEXT:    bnez a0, .LBB207_7
15392; RV32IA-NEXT:  .LBB207_2: # %atomicrmw.start
15393; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15394; RV32IA-NEXT:    beq a5, s1, .LBB207_4
15395; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15396; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15397; RV32IA-NEXT:    slt a0, s1, a5
15398; RV32IA-NEXT:    j .LBB207_5
15399; RV32IA-NEXT:  .LBB207_4: # in Loop: Header=BB207_2 Depth=1
15400; RV32IA-NEXT:    sltu a0, s2, a4
15401; RV32IA-NEXT:  .LBB207_5: # %atomicrmw.start
15402; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15403; RV32IA-NEXT:    xori a0, a0, 1
15404; RV32IA-NEXT:    mv a2, a4
15405; RV32IA-NEXT:    mv a3, a5
15406; RV32IA-NEXT:    bnez a0, .LBB207_1
15407; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15408; RV32IA-NEXT:    # in Loop: Header=BB207_2 Depth=1
15409; RV32IA-NEXT:    mv a2, s2
15410; RV32IA-NEXT:    mv a3, s1
15411; RV32IA-NEXT:    j .LBB207_1
15412; RV32IA-NEXT:  .LBB207_7: # %atomicrmw.end
15413; RV32IA-NEXT:    mv a0, a4
15414; RV32IA-NEXT:    mv a1, a5
15415; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15416; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15417; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15418; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15419; RV32IA-NEXT:    addi sp, sp, 32
15420; RV32IA-NEXT:    ret
15421;
15422; RV64I-LABEL: atomicrmw_min_i64_release:
15423; RV64I:       # %bb.0:
15424; RV64I-NEXT:    addi sp, sp, -32
15425; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15426; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15427; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15428; RV64I-NEXT:    mv s0, a0
15429; RV64I-NEXT:    ld a3, 0(a0)
15430; RV64I-NEXT:    mv s1, a1
15431; RV64I-NEXT:    j .LBB207_2
15432; RV64I-NEXT:  .LBB207_1: # %atomicrmw.start
15433; RV64I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15434; RV64I-NEXT:    sd a3, 0(sp)
15435; RV64I-NEXT:    mv a1, sp
15436; RV64I-NEXT:    li a3, 3
15437; RV64I-NEXT:    mv a0, s0
15438; RV64I-NEXT:    li a4, 0
15439; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15440; RV64I-NEXT:    ld a3, 0(sp)
15441; RV64I-NEXT:    bnez a0, .LBB207_4
15442; RV64I-NEXT:  .LBB207_2: # %atomicrmw.start
15443; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15444; RV64I-NEXT:    mv a2, a3
15445; RV64I-NEXT:    bge s1, a3, .LBB207_1
15446; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15447; RV64I-NEXT:    # in Loop: Header=BB207_2 Depth=1
15448; RV64I-NEXT:    mv a2, s1
15449; RV64I-NEXT:    j .LBB207_1
15450; RV64I-NEXT:  .LBB207_4: # %atomicrmw.end
15451; RV64I-NEXT:    mv a0, a3
15452; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15453; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15454; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15455; RV64I-NEXT:    addi sp, sp, 32
15456; RV64I-NEXT:    ret
15457;
15458; RV64IA-LABEL: atomicrmw_min_i64_release:
15459; RV64IA:       # %bb.0:
15460; RV64IA-NEXT:    amomin.d.rl a0, a1, (a0)
15461; RV64IA-NEXT:    ret
15462  %1 = atomicrmw min i64* %a, i64 %b release
15463  ret i64 %1
15464}
15465
15466define i64 @atomicrmw_min_i64_acq_rel(i64 *%a, i64 %b) nounwind {
15467; RV32I-LABEL: atomicrmw_min_i64_acq_rel:
15468; RV32I:       # %bb.0:
15469; RV32I-NEXT:    addi sp, sp, -32
15470; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15471; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15472; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15473; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15474; RV32I-NEXT:    mv s0, a0
15475; RV32I-NEXT:    lw a5, 4(a0)
15476; RV32I-NEXT:    lw a4, 0(a0)
15477; RV32I-NEXT:    mv s1, a2
15478; RV32I-NEXT:    mv s2, a1
15479; RV32I-NEXT:    j .LBB208_2
15480; RV32I-NEXT:  .LBB208_1: # %atomicrmw.start
15481; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15482; RV32I-NEXT:    sw a4, 8(sp)
15483; RV32I-NEXT:    sw a5, 12(sp)
15484; RV32I-NEXT:    addi a1, sp, 8
15485; RV32I-NEXT:    li a4, 4
15486; RV32I-NEXT:    li a5, 2
15487; RV32I-NEXT:    mv a0, s0
15488; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15489; RV32I-NEXT:    lw a5, 12(sp)
15490; RV32I-NEXT:    lw a4, 8(sp)
15491; RV32I-NEXT:    bnez a0, .LBB208_7
15492; RV32I-NEXT:  .LBB208_2: # %atomicrmw.start
15493; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15494; RV32I-NEXT:    beq a5, s1, .LBB208_4
15495; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15496; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15497; RV32I-NEXT:    slt a0, s1, a5
15498; RV32I-NEXT:    j .LBB208_5
15499; RV32I-NEXT:  .LBB208_4: # in Loop: Header=BB208_2 Depth=1
15500; RV32I-NEXT:    sltu a0, s2, a4
15501; RV32I-NEXT:  .LBB208_5: # %atomicrmw.start
15502; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15503; RV32I-NEXT:    xori a0, a0, 1
15504; RV32I-NEXT:    mv a2, a4
15505; RV32I-NEXT:    mv a3, a5
15506; RV32I-NEXT:    bnez a0, .LBB208_1
15507; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15508; RV32I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15509; RV32I-NEXT:    mv a2, s2
15510; RV32I-NEXT:    mv a3, s1
15511; RV32I-NEXT:    j .LBB208_1
15512; RV32I-NEXT:  .LBB208_7: # %atomicrmw.end
15513; RV32I-NEXT:    mv a0, a4
15514; RV32I-NEXT:    mv a1, a5
15515; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15516; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15517; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15518; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15519; RV32I-NEXT:    addi sp, sp, 32
15520; RV32I-NEXT:    ret
15521;
15522; RV32IA-LABEL: atomicrmw_min_i64_acq_rel:
15523; RV32IA:       # %bb.0:
15524; RV32IA-NEXT:    addi sp, sp, -32
15525; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15526; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15527; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15528; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15529; RV32IA-NEXT:    mv s0, a0
15530; RV32IA-NEXT:    lw a5, 4(a0)
15531; RV32IA-NEXT:    lw a4, 0(a0)
15532; RV32IA-NEXT:    mv s1, a2
15533; RV32IA-NEXT:    mv s2, a1
15534; RV32IA-NEXT:    j .LBB208_2
15535; RV32IA-NEXT:  .LBB208_1: # %atomicrmw.start
15536; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15537; RV32IA-NEXT:    sw a4, 8(sp)
15538; RV32IA-NEXT:    sw a5, 12(sp)
15539; RV32IA-NEXT:    addi a1, sp, 8
15540; RV32IA-NEXT:    li a4, 4
15541; RV32IA-NEXT:    li a5, 2
15542; RV32IA-NEXT:    mv a0, s0
15543; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15544; RV32IA-NEXT:    lw a5, 12(sp)
15545; RV32IA-NEXT:    lw a4, 8(sp)
15546; RV32IA-NEXT:    bnez a0, .LBB208_7
15547; RV32IA-NEXT:  .LBB208_2: # %atomicrmw.start
15548; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15549; RV32IA-NEXT:    beq a5, s1, .LBB208_4
15550; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15551; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15552; RV32IA-NEXT:    slt a0, s1, a5
15553; RV32IA-NEXT:    j .LBB208_5
15554; RV32IA-NEXT:  .LBB208_4: # in Loop: Header=BB208_2 Depth=1
15555; RV32IA-NEXT:    sltu a0, s2, a4
15556; RV32IA-NEXT:  .LBB208_5: # %atomicrmw.start
15557; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15558; RV32IA-NEXT:    xori a0, a0, 1
15559; RV32IA-NEXT:    mv a2, a4
15560; RV32IA-NEXT:    mv a3, a5
15561; RV32IA-NEXT:    bnez a0, .LBB208_1
15562; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15563; RV32IA-NEXT:    # in Loop: Header=BB208_2 Depth=1
15564; RV32IA-NEXT:    mv a2, s2
15565; RV32IA-NEXT:    mv a3, s1
15566; RV32IA-NEXT:    j .LBB208_1
15567; RV32IA-NEXT:  .LBB208_7: # %atomicrmw.end
15568; RV32IA-NEXT:    mv a0, a4
15569; RV32IA-NEXT:    mv a1, a5
15570; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15571; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15572; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15573; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15574; RV32IA-NEXT:    addi sp, sp, 32
15575; RV32IA-NEXT:    ret
15576;
15577; RV64I-LABEL: atomicrmw_min_i64_acq_rel:
15578; RV64I:       # %bb.0:
15579; RV64I-NEXT:    addi sp, sp, -32
15580; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15581; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15582; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15583; RV64I-NEXT:    mv s0, a0
15584; RV64I-NEXT:    ld a3, 0(a0)
15585; RV64I-NEXT:    mv s1, a1
15586; RV64I-NEXT:    j .LBB208_2
15587; RV64I-NEXT:  .LBB208_1: # %atomicrmw.start
15588; RV64I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15589; RV64I-NEXT:    sd a3, 0(sp)
15590; RV64I-NEXT:    mv a1, sp
15591; RV64I-NEXT:    li a3, 4
15592; RV64I-NEXT:    li a4, 2
15593; RV64I-NEXT:    mv a0, s0
15594; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15595; RV64I-NEXT:    ld a3, 0(sp)
15596; RV64I-NEXT:    bnez a0, .LBB208_4
15597; RV64I-NEXT:  .LBB208_2: # %atomicrmw.start
15598; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15599; RV64I-NEXT:    mv a2, a3
15600; RV64I-NEXT:    bge s1, a3, .LBB208_1
15601; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15602; RV64I-NEXT:    # in Loop: Header=BB208_2 Depth=1
15603; RV64I-NEXT:    mv a2, s1
15604; RV64I-NEXT:    j .LBB208_1
15605; RV64I-NEXT:  .LBB208_4: # %atomicrmw.end
15606; RV64I-NEXT:    mv a0, a3
15607; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15608; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15609; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15610; RV64I-NEXT:    addi sp, sp, 32
15611; RV64I-NEXT:    ret
15612;
15613; RV64IA-LABEL: atomicrmw_min_i64_acq_rel:
15614; RV64IA:       # %bb.0:
15615; RV64IA-NEXT:    amomin.d.aqrl a0, a1, (a0)
15616; RV64IA-NEXT:    ret
15617  %1 = atomicrmw min i64* %a, i64 %b acq_rel
15618  ret i64 %1
15619}
15620
15621define i64 @atomicrmw_min_i64_seq_cst(i64 *%a, i64 %b) nounwind {
15622; RV32I-LABEL: atomicrmw_min_i64_seq_cst:
15623; RV32I:       # %bb.0:
15624; RV32I-NEXT:    addi sp, sp, -32
15625; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15626; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15627; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15628; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15629; RV32I-NEXT:    mv s0, a0
15630; RV32I-NEXT:    lw a5, 4(a0)
15631; RV32I-NEXT:    lw a4, 0(a0)
15632; RV32I-NEXT:    mv s1, a2
15633; RV32I-NEXT:    mv s2, a1
15634; RV32I-NEXT:    j .LBB209_2
15635; RV32I-NEXT:  .LBB209_1: # %atomicrmw.start
15636; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15637; RV32I-NEXT:    sw a4, 8(sp)
15638; RV32I-NEXT:    sw a5, 12(sp)
15639; RV32I-NEXT:    addi a1, sp, 8
15640; RV32I-NEXT:    li a4, 5
15641; RV32I-NEXT:    li a5, 5
15642; RV32I-NEXT:    mv a0, s0
15643; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15644; RV32I-NEXT:    lw a5, 12(sp)
15645; RV32I-NEXT:    lw a4, 8(sp)
15646; RV32I-NEXT:    bnez a0, .LBB209_7
15647; RV32I-NEXT:  .LBB209_2: # %atomicrmw.start
15648; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15649; RV32I-NEXT:    beq a5, s1, .LBB209_4
15650; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15651; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15652; RV32I-NEXT:    slt a0, s1, a5
15653; RV32I-NEXT:    j .LBB209_5
15654; RV32I-NEXT:  .LBB209_4: # in Loop: Header=BB209_2 Depth=1
15655; RV32I-NEXT:    sltu a0, s2, a4
15656; RV32I-NEXT:  .LBB209_5: # %atomicrmw.start
15657; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15658; RV32I-NEXT:    xori a0, a0, 1
15659; RV32I-NEXT:    mv a2, a4
15660; RV32I-NEXT:    mv a3, a5
15661; RV32I-NEXT:    bnez a0, .LBB209_1
15662; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15663; RV32I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15664; RV32I-NEXT:    mv a2, s2
15665; RV32I-NEXT:    mv a3, s1
15666; RV32I-NEXT:    j .LBB209_1
15667; RV32I-NEXT:  .LBB209_7: # %atomicrmw.end
15668; RV32I-NEXT:    mv a0, a4
15669; RV32I-NEXT:    mv a1, a5
15670; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15671; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15672; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15673; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15674; RV32I-NEXT:    addi sp, sp, 32
15675; RV32I-NEXT:    ret
15676;
15677; RV32IA-LABEL: atomicrmw_min_i64_seq_cst:
15678; RV32IA:       # %bb.0:
15679; RV32IA-NEXT:    addi sp, sp, -32
15680; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15681; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15682; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15683; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15684; RV32IA-NEXT:    mv s0, a0
15685; RV32IA-NEXT:    lw a5, 4(a0)
15686; RV32IA-NEXT:    lw a4, 0(a0)
15687; RV32IA-NEXT:    mv s1, a2
15688; RV32IA-NEXT:    mv s2, a1
15689; RV32IA-NEXT:    j .LBB209_2
15690; RV32IA-NEXT:  .LBB209_1: # %atomicrmw.start
15691; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15692; RV32IA-NEXT:    sw a4, 8(sp)
15693; RV32IA-NEXT:    sw a5, 12(sp)
15694; RV32IA-NEXT:    addi a1, sp, 8
15695; RV32IA-NEXT:    li a4, 5
15696; RV32IA-NEXT:    li a5, 5
15697; RV32IA-NEXT:    mv a0, s0
15698; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15699; RV32IA-NEXT:    lw a5, 12(sp)
15700; RV32IA-NEXT:    lw a4, 8(sp)
15701; RV32IA-NEXT:    bnez a0, .LBB209_7
15702; RV32IA-NEXT:  .LBB209_2: # %atomicrmw.start
15703; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15704; RV32IA-NEXT:    beq a5, s1, .LBB209_4
15705; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15706; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15707; RV32IA-NEXT:    slt a0, s1, a5
15708; RV32IA-NEXT:    j .LBB209_5
15709; RV32IA-NEXT:  .LBB209_4: # in Loop: Header=BB209_2 Depth=1
15710; RV32IA-NEXT:    sltu a0, s2, a4
15711; RV32IA-NEXT:  .LBB209_5: # %atomicrmw.start
15712; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15713; RV32IA-NEXT:    xori a0, a0, 1
15714; RV32IA-NEXT:    mv a2, a4
15715; RV32IA-NEXT:    mv a3, a5
15716; RV32IA-NEXT:    bnez a0, .LBB209_1
15717; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15718; RV32IA-NEXT:    # in Loop: Header=BB209_2 Depth=1
15719; RV32IA-NEXT:    mv a2, s2
15720; RV32IA-NEXT:    mv a3, s1
15721; RV32IA-NEXT:    j .LBB209_1
15722; RV32IA-NEXT:  .LBB209_7: # %atomicrmw.end
15723; RV32IA-NEXT:    mv a0, a4
15724; RV32IA-NEXT:    mv a1, a5
15725; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15726; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15727; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15728; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15729; RV32IA-NEXT:    addi sp, sp, 32
15730; RV32IA-NEXT:    ret
15731;
15732; RV64I-LABEL: atomicrmw_min_i64_seq_cst:
15733; RV64I:       # %bb.0:
15734; RV64I-NEXT:    addi sp, sp, -32
15735; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15736; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15737; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15738; RV64I-NEXT:    mv s0, a0
15739; RV64I-NEXT:    ld a3, 0(a0)
15740; RV64I-NEXT:    mv s1, a1
15741; RV64I-NEXT:    j .LBB209_2
15742; RV64I-NEXT:  .LBB209_1: # %atomicrmw.start
15743; RV64I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15744; RV64I-NEXT:    sd a3, 0(sp)
15745; RV64I-NEXT:    mv a1, sp
15746; RV64I-NEXT:    li a3, 5
15747; RV64I-NEXT:    li a4, 5
15748; RV64I-NEXT:    mv a0, s0
15749; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15750; RV64I-NEXT:    ld a3, 0(sp)
15751; RV64I-NEXT:    bnez a0, .LBB209_4
15752; RV64I-NEXT:  .LBB209_2: # %atomicrmw.start
15753; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15754; RV64I-NEXT:    mv a2, a3
15755; RV64I-NEXT:    bge s1, a3, .LBB209_1
15756; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15757; RV64I-NEXT:    # in Loop: Header=BB209_2 Depth=1
15758; RV64I-NEXT:    mv a2, s1
15759; RV64I-NEXT:    j .LBB209_1
15760; RV64I-NEXT:  .LBB209_4: # %atomicrmw.end
15761; RV64I-NEXT:    mv a0, a3
15762; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15763; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15764; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15765; RV64I-NEXT:    addi sp, sp, 32
15766; RV64I-NEXT:    ret
15767;
15768; RV64IA-LABEL: atomicrmw_min_i64_seq_cst:
15769; RV64IA:       # %bb.0:
15770; RV64IA-NEXT:    amomin.d.aqrl a0, a1, (a0)
15771; RV64IA-NEXT:    ret
15772  %1 = atomicrmw min i64* %a, i64 %b seq_cst
15773  ret i64 %1
15774}
15775
15776define i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind {
15777; RV32I-LABEL: atomicrmw_umax_i64_monotonic:
15778; RV32I:       # %bb.0:
15779; RV32I-NEXT:    addi sp, sp, -32
15780; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15781; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15782; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15783; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15784; RV32I-NEXT:    mv s0, a0
15785; RV32I-NEXT:    lw a5, 4(a0)
15786; RV32I-NEXT:    lw a4, 0(a0)
15787; RV32I-NEXT:    mv s1, a2
15788; RV32I-NEXT:    mv s2, a1
15789; RV32I-NEXT:    j .LBB210_2
15790; RV32I-NEXT:  .LBB210_1: # %atomicrmw.start
15791; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15792; RV32I-NEXT:    sw a4, 8(sp)
15793; RV32I-NEXT:    sw a5, 12(sp)
15794; RV32I-NEXT:    addi a1, sp, 8
15795; RV32I-NEXT:    mv a0, s0
15796; RV32I-NEXT:    li a4, 0
15797; RV32I-NEXT:    li a5, 0
15798; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15799; RV32I-NEXT:    lw a5, 12(sp)
15800; RV32I-NEXT:    lw a4, 8(sp)
15801; RV32I-NEXT:    bnez a0, .LBB210_7
15802; RV32I-NEXT:  .LBB210_2: # %atomicrmw.start
15803; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15804; RV32I-NEXT:    beq a5, s1, .LBB210_4
15805; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15806; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15807; RV32I-NEXT:    sltu a0, s1, a5
15808; RV32I-NEXT:    j .LBB210_5
15809; RV32I-NEXT:  .LBB210_4: # in Loop: Header=BB210_2 Depth=1
15810; RV32I-NEXT:    sltu a0, s2, a4
15811; RV32I-NEXT:  .LBB210_5: # %atomicrmw.start
15812; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15813; RV32I-NEXT:    mv a2, a4
15814; RV32I-NEXT:    mv a3, a5
15815; RV32I-NEXT:    bnez a0, .LBB210_1
15816; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15817; RV32I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15818; RV32I-NEXT:    mv a2, s2
15819; RV32I-NEXT:    mv a3, s1
15820; RV32I-NEXT:    j .LBB210_1
15821; RV32I-NEXT:  .LBB210_7: # %atomicrmw.end
15822; RV32I-NEXT:    mv a0, a4
15823; RV32I-NEXT:    mv a1, a5
15824; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15825; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15826; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15827; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15828; RV32I-NEXT:    addi sp, sp, 32
15829; RV32I-NEXT:    ret
15830;
15831; RV32IA-LABEL: atomicrmw_umax_i64_monotonic:
15832; RV32IA:       # %bb.0:
15833; RV32IA-NEXT:    addi sp, sp, -32
15834; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15835; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15836; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15837; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15838; RV32IA-NEXT:    mv s0, a0
15839; RV32IA-NEXT:    lw a5, 4(a0)
15840; RV32IA-NEXT:    lw a4, 0(a0)
15841; RV32IA-NEXT:    mv s1, a2
15842; RV32IA-NEXT:    mv s2, a1
15843; RV32IA-NEXT:    j .LBB210_2
15844; RV32IA-NEXT:  .LBB210_1: # %atomicrmw.start
15845; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15846; RV32IA-NEXT:    sw a4, 8(sp)
15847; RV32IA-NEXT:    sw a5, 12(sp)
15848; RV32IA-NEXT:    addi a1, sp, 8
15849; RV32IA-NEXT:    mv a0, s0
15850; RV32IA-NEXT:    li a4, 0
15851; RV32IA-NEXT:    li a5, 0
15852; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
15853; RV32IA-NEXT:    lw a5, 12(sp)
15854; RV32IA-NEXT:    lw a4, 8(sp)
15855; RV32IA-NEXT:    bnez a0, .LBB210_7
15856; RV32IA-NEXT:  .LBB210_2: # %atomicrmw.start
15857; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
15858; RV32IA-NEXT:    beq a5, s1, .LBB210_4
15859; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
15860; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15861; RV32IA-NEXT:    sltu a0, s1, a5
15862; RV32IA-NEXT:    j .LBB210_5
15863; RV32IA-NEXT:  .LBB210_4: # in Loop: Header=BB210_2 Depth=1
15864; RV32IA-NEXT:    sltu a0, s2, a4
15865; RV32IA-NEXT:  .LBB210_5: # %atomicrmw.start
15866; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15867; RV32IA-NEXT:    mv a2, a4
15868; RV32IA-NEXT:    mv a3, a5
15869; RV32IA-NEXT:    bnez a0, .LBB210_1
15870; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
15871; RV32IA-NEXT:    # in Loop: Header=BB210_2 Depth=1
15872; RV32IA-NEXT:    mv a2, s2
15873; RV32IA-NEXT:    mv a3, s1
15874; RV32IA-NEXT:    j .LBB210_1
15875; RV32IA-NEXT:  .LBB210_7: # %atomicrmw.end
15876; RV32IA-NEXT:    mv a0, a4
15877; RV32IA-NEXT:    mv a1, a5
15878; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15879; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15880; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15881; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15882; RV32IA-NEXT:    addi sp, sp, 32
15883; RV32IA-NEXT:    ret
15884;
15885; RV64I-LABEL: atomicrmw_umax_i64_monotonic:
15886; RV64I:       # %bb.0:
15887; RV64I-NEXT:    addi sp, sp, -32
15888; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
15889; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
15890; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
15891; RV64I-NEXT:    mv s0, a0
15892; RV64I-NEXT:    ld a3, 0(a0)
15893; RV64I-NEXT:    mv s1, a1
15894; RV64I-NEXT:    j .LBB210_2
15895; RV64I-NEXT:  .LBB210_1: # %atomicrmw.start
15896; RV64I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15897; RV64I-NEXT:    sd a3, 0(sp)
15898; RV64I-NEXT:    mv a1, sp
15899; RV64I-NEXT:    mv a0, s0
15900; RV64I-NEXT:    li a3, 0
15901; RV64I-NEXT:    li a4, 0
15902; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
15903; RV64I-NEXT:    ld a3, 0(sp)
15904; RV64I-NEXT:    bnez a0, .LBB210_4
15905; RV64I-NEXT:  .LBB210_2: # %atomicrmw.start
15906; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15907; RV64I-NEXT:    mv a2, a3
15908; RV64I-NEXT:    bltu s1, a3, .LBB210_1
15909; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15910; RV64I-NEXT:    # in Loop: Header=BB210_2 Depth=1
15911; RV64I-NEXT:    mv a2, s1
15912; RV64I-NEXT:    j .LBB210_1
15913; RV64I-NEXT:  .LBB210_4: # %atomicrmw.end
15914; RV64I-NEXT:    mv a0, a3
15915; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
15916; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
15917; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
15918; RV64I-NEXT:    addi sp, sp, 32
15919; RV64I-NEXT:    ret
15920;
15921; RV64IA-LABEL: atomicrmw_umax_i64_monotonic:
15922; RV64IA:       # %bb.0:
15923; RV64IA-NEXT:    amomaxu.d a0, a1, (a0)
15924; RV64IA-NEXT:    ret
15925  %1 = atomicrmw umax i64* %a, i64 %b monotonic
15926  ret i64 %1
15927}
15928
15929define i64 @atomicrmw_umax_i64_acquire(i64 *%a, i64 %b) nounwind {
15930; RV32I-LABEL: atomicrmw_umax_i64_acquire:
15931; RV32I:       # %bb.0:
15932; RV32I-NEXT:    addi sp, sp, -32
15933; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15934; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15935; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15936; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15937; RV32I-NEXT:    mv s0, a0
15938; RV32I-NEXT:    lw a5, 4(a0)
15939; RV32I-NEXT:    lw a4, 0(a0)
15940; RV32I-NEXT:    mv s1, a2
15941; RV32I-NEXT:    mv s2, a1
15942; RV32I-NEXT:    j .LBB211_2
15943; RV32I-NEXT:  .LBB211_1: # %atomicrmw.start
15944; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15945; RV32I-NEXT:    sw a4, 8(sp)
15946; RV32I-NEXT:    sw a5, 12(sp)
15947; RV32I-NEXT:    addi a1, sp, 8
15948; RV32I-NEXT:    li a4, 2
15949; RV32I-NEXT:    li a5, 2
15950; RV32I-NEXT:    mv a0, s0
15951; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
15952; RV32I-NEXT:    lw a5, 12(sp)
15953; RV32I-NEXT:    lw a4, 8(sp)
15954; RV32I-NEXT:    bnez a0, .LBB211_7
15955; RV32I-NEXT:  .LBB211_2: # %atomicrmw.start
15956; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15957; RV32I-NEXT:    beq a5, s1, .LBB211_4
15958; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15959; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15960; RV32I-NEXT:    sltu a0, s1, a5
15961; RV32I-NEXT:    j .LBB211_5
15962; RV32I-NEXT:  .LBB211_4: # in Loop: Header=BB211_2 Depth=1
15963; RV32I-NEXT:    sltu a0, s2, a4
15964; RV32I-NEXT:  .LBB211_5: # %atomicrmw.start
15965; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15966; RV32I-NEXT:    mv a2, a4
15967; RV32I-NEXT:    mv a3, a5
15968; RV32I-NEXT:    bnez a0, .LBB211_1
15969; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
15970; RV32I-NEXT:    # in Loop: Header=BB211_2 Depth=1
15971; RV32I-NEXT:    mv a2, s2
15972; RV32I-NEXT:    mv a3, s1
15973; RV32I-NEXT:    j .LBB211_1
15974; RV32I-NEXT:  .LBB211_7: # %atomicrmw.end
15975; RV32I-NEXT:    mv a0, a4
15976; RV32I-NEXT:    mv a1, a5
15977; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15978; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15979; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15980; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15981; RV32I-NEXT:    addi sp, sp, 32
15982; RV32I-NEXT:    ret
15983;
15984; RV32IA-LABEL: atomicrmw_umax_i64_acquire:
15985; RV32IA:       # %bb.0:
15986; RV32IA-NEXT:    addi sp, sp, -32
15987; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15988; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15989; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15990; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15991; RV32IA-NEXT:    mv s0, a0
15992; RV32IA-NEXT:    lw a5, 4(a0)
15993; RV32IA-NEXT:    lw a4, 0(a0)
15994; RV32IA-NEXT:    mv s1, a2
15995; RV32IA-NEXT:    mv s2, a1
15996; RV32IA-NEXT:    j .LBB211_2
15997; RV32IA-NEXT:  .LBB211_1: # %atomicrmw.start
15998; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
15999; RV32IA-NEXT:    sw a4, 8(sp)
16000; RV32IA-NEXT:    sw a5, 12(sp)
16001; RV32IA-NEXT:    addi a1, sp, 8
16002; RV32IA-NEXT:    li a4, 2
16003; RV32IA-NEXT:    li a5, 2
16004; RV32IA-NEXT:    mv a0, s0
16005; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16006; RV32IA-NEXT:    lw a5, 12(sp)
16007; RV32IA-NEXT:    lw a4, 8(sp)
16008; RV32IA-NEXT:    bnez a0, .LBB211_7
16009; RV32IA-NEXT:  .LBB211_2: # %atomicrmw.start
16010; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16011; RV32IA-NEXT:    beq a5, s1, .LBB211_4
16012; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16013; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
16014; RV32IA-NEXT:    sltu a0, s1, a5
16015; RV32IA-NEXT:    j .LBB211_5
16016; RV32IA-NEXT:  .LBB211_4: # in Loop: Header=BB211_2 Depth=1
16017; RV32IA-NEXT:    sltu a0, s2, a4
16018; RV32IA-NEXT:  .LBB211_5: # %atomicrmw.start
16019; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
16020; RV32IA-NEXT:    mv a2, a4
16021; RV32IA-NEXT:    mv a3, a5
16022; RV32IA-NEXT:    bnez a0, .LBB211_1
16023; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16024; RV32IA-NEXT:    # in Loop: Header=BB211_2 Depth=1
16025; RV32IA-NEXT:    mv a2, s2
16026; RV32IA-NEXT:    mv a3, s1
16027; RV32IA-NEXT:    j .LBB211_1
16028; RV32IA-NEXT:  .LBB211_7: # %atomicrmw.end
16029; RV32IA-NEXT:    mv a0, a4
16030; RV32IA-NEXT:    mv a1, a5
16031; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16032; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16033; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16034; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16035; RV32IA-NEXT:    addi sp, sp, 32
16036; RV32IA-NEXT:    ret
16037;
16038; RV64I-LABEL: atomicrmw_umax_i64_acquire:
16039; RV64I:       # %bb.0:
16040; RV64I-NEXT:    addi sp, sp, -32
16041; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16042; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16043; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16044; RV64I-NEXT:    mv s0, a0
16045; RV64I-NEXT:    ld a3, 0(a0)
16046; RV64I-NEXT:    mv s1, a1
16047; RV64I-NEXT:    j .LBB211_2
16048; RV64I-NEXT:  .LBB211_1: # %atomicrmw.start
16049; RV64I-NEXT:    # in Loop: Header=BB211_2 Depth=1
16050; RV64I-NEXT:    sd a3, 0(sp)
16051; RV64I-NEXT:    mv a1, sp
16052; RV64I-NEXT:    li a3, 2
16053; RV64I-NEXT:    li a4, 2
16054; RV64I-NEXT:    mv a0, s0
16055; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16056; RV64I-NEXT:    ld a3, 0(sp)
16057; RV64I-NEXT:    bnez a0, .LBB211_4
16058; RV64I-NEXT:  .LBB211_2: # %atomicrmw.start
16059; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16060; RV64I-NEXT:    mv a2, a3
16061; RV64I-NEXT:    bltu s1, a3, .LBB211_1
16062; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16063; RV64I-NEXT:    # in Loop: Header=BB211_2 Depth=1
16064; RV64I-NEXT:    mv a2, s1
16065; RV64I-NEXT:    j .LBB211_1
16066; RV64I-NEXT:  .LBB211_4: # %atomicrmw.end
16067; RV64I-NEXT:    mv a0, a3
16068; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16069; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16070; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16071; RV64I-NEXT:    addi sp, sp, 32
16072; RV64I-NEXT:    ret
16073;
16074; RV64IA-LABEL: atomicrmw_umax_i64_acquire:
16075; RV64IA:       # %bb.0:
16076; RV64IA-NEXT:    amomaxu.d.aq a0, a1, (a0)
16077; RV64IA-NEXT:    ret
16078  %1 = atomicrmw umax i64* %a, i64 %b acquire
16079  ret i64 %1
16080}
16081
16082define i64 @atomicrmw_umax_i64_release(i64 *%a, i64 %b) nounwind {
16083; RV32I-LABEL: atomicrmw_umax_i64_release:
16084; RV32I:       # %bb.0:
16085; RV32I-NEXT:    addi sp, sp, -32
16086; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16087; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16088; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16089; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16090; RV32I-NEXT:    mv s0, a0
16091; RV32I-NEXT:    lw a5, 4(a0)
16092; RV32I-NEXT:    lw a4, 0(a0)
16093; RV32I-NEXT:    mv s1, a2
16094; RV32I-NEXT:    mv s2, a1
16095; RV32I-NEXT:    j .LBB212_2
16096; RV32I-NEXT:  .LBB212_1: # %atomicrmw.start
16097; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16098; RV32I-NEXT:    sw a4, 8(sp)
16099; RV32I-NEXT:    sw a5, 12(sp)
16100; RV32I-NEXT:    addi a1, sp, 8
16101; RV32I-NEXT:    li a4, 3
16102; RV32I-NEXT:    mv a0, s0
16103; RV32I-NEXT:    li a5, 0
16104; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16105; RV32I-NEXT:    lw a5, 12(sp)
16106; RV32I-NEXT:    lw a4, 8(sp)
16107; RV32I-NEXT:    bnez a0, .LBB212_7
16108; RV32I-NEXT:  .LBB212_2: # %atomicrmw.start
16109; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16110; RV32I-NEXT:    beq a5, s1, .LBB212_4
16111; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16112; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16113; RV32I-NEXT:    sltu a0, s1, a5
16114; RV32I-NEXT:    j .LBB212_5
16115; RV32I-NEXT:  .LBB212_4: # in Loop: Header=BB212_2 Depth=1
16116; RV32I-NEXT:    sltu a0, s2, a4
16117; RV32I-NEXT:  .LBB212_5: # %atomicrmw.start
16118; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16119; RV32I-NEXT:    mv a2, a4
16120; RV32I-NEXT:    mv a3, a5
16121; RV32I-NEXT:    bnez a0, .LBB212_1
16122; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16123; RV32I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16124; RV32I-NEXT:    mv a2, s2
16125; RV32I-NEXT:    mv a3, s1
16126; RV32I-NEXT:    j .LBB212_1
16127; RV32I-NEXT:  .LBB212_7: # %atomicrmw.end
16128; RV32I-NEXT:    mv a0, a4
16129; RV32I-NEXT:    mv a1, a5
16130; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16131; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16132; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16133; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16134; RV32I-NEXT:    addi sp, sp, 32
16135; RV32I-NEXT:    ret
16136;
16137; RV32IA-LABEL: atomicrmw_umax_i64_release:
16138; RV32IA:       # %bb.0:
16139; RV32IA-NEXT:    addi sp, sp, -32
16140; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16141; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16142; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16143; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16144; RV32IA-NEXT:    mv s0, a0
16145; RV32IA-NEXT:    lw a5, 4(a0)
16146; RV32IA-NEXT:    lw a4, 0(a0)
16147; RV32IA-NEXT:    mv s1, a2
16148; RV32IA-NEXT:    mv s2, a1
16149; RV32IA-NEXT:    j .LBB212_2
16150; RV32IA-NEXT:  .LBB212_1: # %atomicrmw.start
16151; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16152; RV32IA-NEXT:    sw a4, 8(sp)
16153; RV32IA-NEXT:    sw a5, 12(sp)
16154; RV32IA-NEXT:    addi a1, sp, 8
16155; RV32IA-NEXT:    li a4, 3
16156; RV32IA-NEXT:    mv a0, s0
16157; RV32IA-NEXT:    li a5, 0
16158; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16159; RV32IA-NEXT:    lw a5, 12(sp)
16160; RV32IA-NEXT:    lw a4, 8(sp)
16161; RV32IA-NEXT:    bnez a0, .LBB212_7
16162; RV32IA-NEXT:  .LBB212_2: # %atomicrmw.start
16163; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16164; RV32IA-NEXT:    beq a5, s1, .LBB212_4
16165; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16166; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16167; RV32IA-NEXT:    sltu a0, s1, a5
16168; RV32IA-NEXT:    j .LBB212_5
16169; RV32IA-NEXT:  .LBB212_4: # in Loop: Header=BB212_2 Depth=1
16170; RV32IA-NEXT:    sltu a0, s2, a4
16171; RV32IA-NEXT:  .LBB212_5: # %atomicrmw.start
16172; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16173; RV32IA-NEXT:    mv a2, a4
16174; RV32IA-NEXT:    mv a3, a5
16175; RV32IA-NEXT:    bnez a0, .LBB212_1
16176; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16177; RV32IA-NEXT:    # in Loop: Header=BB212_2 Depth=1
16178; RV32IA-NEXT:    mv a2, s2
16179; RV32IA-NEXT:    mv a3, s1
16180; RV32IA-NEXT:    j .LBB212_1
16181; RV32IA-NEXT:  .LBB212_7: # %atomicrmw.end
16182; RV32IA-NEXT:    mv a0, a4
16183; RV32IA-NEXT:    mv a1, a5
16184; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16185; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16186; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16187; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16188; RV32IA-NEXT:    addi sp, sp, 32
16189; RV32IA-NEXT:    ret
16190;
16191; RV64I-LABEL: atomicrmw_umax_i64_release:
16192; RV64I:       # %bb.0:
16193; RV64I-NEXT:    addi sp, sp, -32
16194; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16195; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16196; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16197; RV64I-NEXT:    mv s0, a0
16198; RV64I-NEXT:    ld a3, 0(a0)
16199; RV64I-NEXT:    mv s1, a1
16200; RV64I-NEXT:    j .LBB212_2
16201; RV64I-NEXT:  .LBB212_1: # %atomicrmw.start
16202; RV64I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16203; RV64I-NEXT:    sd a3, 0(sp)
16204; RV64I-NEXT:    mv a1, sp
16205; RV64I-NEXT:    li a3, 3
16206; RV64I-NEXT:    mv a0, s0
16207; RV64I-NEXT:    li a4, 0
16208; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16209; RV64I-NEXT:    ld a3, 0(sp)
16210; RV64I-NEXT:    bnez a0, .LBB212_4
16211; RV64I-NEXT:  .LBB212_2: # %atomicrmw.start
16212; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16213; RV64I-NEXT:    mv a2, a3
16214; RV64I-NEXT:    bltu s1, a3, .LBB212_1
16215; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16216; RV64I-NEXT:    # in Loop: Header=BB212_2 Depth=1
16217; RV64I-NEXT:    mv a2, s1
16218; RV64I-NEXT:    j .LBB212_1
16219; RV64I-NEXT:  .LBB212_4: # %atomicrmw.end
16220; RV64I-NEXT:    mv a0, a3
16221; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16222; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16223; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16224; RV64I-NEXT:    addi sp, sp, 32
16225; RV64I-NEXT:    ret
16226;
16227; RV64IA-LABEL: atomicrmw_umax_i64_release:
16228; RV64IA:       # %bb.0:
16229; RV64IA-NEXT:    amomaxu.d.rl a0, a1, (a0)
16230; RV64IA-NEXT:    ret
16231  %1 = atomicrmw umax i64* %a, i64 %b release
16232  ret i64 %1
16233}
16234
16235define i64 @atomicrmw_umax_i64_acq_rel(i64 *%a, i64 %b) nounwind {
16236; RV32I-LABEL: atomicrmw_umax_i64_acq_rel:
16237; RV32I:       # %bb.0:
16238; RV32I-NEXT:    addi sp, sp, -32
16239; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16240; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16241; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16242; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16243; RV32I-NEXT:    mv s0, a0
16244; RV32I-NEXT:    lw a5, 4(a0)
16245; RV32I-NEXT:    lw a4, 0(a0)
16246; RV32I-NEXT:    mv s1, a2
16247; RV32I-NEXT:    mv s2, a1
16248; RV32I-NEXT:    j .LBB213_2
16249; RV32I-NEXT:  .LBB213_1: # %atomicrmw.start
16250; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16251; RV32I-NEXT:    sw a4, 8(sp)
16252; RV32I-NEXT:    sw a5, 12(sp)
16253; RV32I-NEXT:    addi a1, sp, 8
16254; RV32I-NEXT:    li a4, 4
16255; RV32I-NEXT:    li a5, 2
16256; RV32I-NEXT:    mv a0, s0
16257; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16258; RV32I-NEXT:    lw a5, 12(sp)
16259; RV32I-NEXT:    lw a4, 8(sp)
16260; RV32I-NEXT:    bnez a0, .LBB213_7
16261; RV32I-NEXT:  .LBB213_2: # %atomicrmw.start
16262; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16263; RV32I-NEXT:    beq a5, s1, .LBB213_4
16264; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16265; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16266; RV32I-NEXT:    sltu a0, s1, a5
16267; RV32I-NEXT:    j .LBB213_5
16268; RV32I-NEXT:  .LBB213_4: # in Loop: Header=BB213_2 Depth=1
16269; RV32I-NEXT:    sltu a0, s2, a4
16270; RV32I-NEXT:  .LBB213_5: # %atomicrmw.start
16271; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16272; RV32I-NEXT:    mv a2, a4
16273; RV32I-NEXT:    mv a3, a5
16274; RV32I-NEXT:    bnez a0, .LBB213_1
16275; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16276; RV32I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16277; RV32I-NEXT:    mv a2, s2
16278; RV32I-NEXT:    mv a3, s1
16279; RV32I-NEXT:    j .LBB213_1
16280; RV32I-NEXT:  .LBB213_7: # %atomicrmw.end
16281; RV32I-NEXT:    mv a0, a4
16282; RV32I-NEXT:    mv a1, a5
16283; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16284; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16285; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16286; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16287; RV32I-NEXT:    addi sp, sp, 32
16288; RV32I-NEXT:    ret
16289;
16290; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel:
16291; RV32IA:       # %bb.0:
16292; RV32IA-NEXT:    addi sp, sp, -32
16293; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16294; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16295; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16296; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16297; RV32IA-NEXT:    mv s0, a0
16298; RV32IA-NEXT:    lw a5, 4(a0)
16299; RV32IA-NEXT:    lw a4, 0(a0)
16300; RV32IA-NEXT:    mv s1, a2
16301; RV32IA-NEXT:    mv s2, a1
16302; RV32IA-NEXT:    j .LBB213_2
16303; RV32IA-NEXT:  .LBB213_1: # %atomicrmw.start
16304; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16305; RV32IA-NEXT:    sw a4, 8(sp)
16306; RV32IA-NEXT:    sw a5, 12(sp)
16307; RV32IA-NEXT:    addi a1, sp, 8
16308; RV32IA-NEXT:    li a4, 4
16309; RV32IA-NEXT:    li a5, 2
16310; RV32IA-NEXT:    mv a0, s0
16311; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16312; RV32IA-NEXT:    lw a5, 12(sp)
16313; RV32IA-NEXT:    lw a4, 8(sp)
16314; RV32IA-NEXT:    bnez a0, .LBB213_7
16315; RV32IA-NEXT:  .LBB213_2: # %atomicrmw.start
16316; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16317; RV32IA-NEXT:    beq a5, s1, .LBB213_4
16318; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16319; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16320; RV32IA-NEXT:    sltu a0, s1, a5
16321; RV32IA-NEXT:    j .LBB213_5
16322; RV32IA-NEXT:  .LBB213_4: # in Loop: Header=BB213_2 Depth=1
16323; RV32IA-NEXT:    sltu a0, s2, a4
16324; RV32IA-NEXT:  .LBB213_5: # %atomicrmw.start
16325; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16326; RV32IA-NEXT:    mv a2, a4
16327; RV32IA-NEXT:    mv a3, a5
16328; RV32IA-NEXT:    bnez a0, .LBB213_1
16329; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16330; RV32IA-NEXT:    # in Loop: Header=BB213_2 Depth=1
16331; RV32IA-NEXT:    mv a2, s2
16332; RV32IA-NEXT:    mv a3, s1
16333; RV32IA-NEXT:    j .LBB213_1
16334; RV32IA-NEXT:  .LBB213_7: # %atomicrmw.end
16335; RV32IA-NEXT:    mv a0, a4
16336; RV32IA-NEXT:    mv a1, a5
16337; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16338; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16339; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16340; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16341; RV32IA-NEXT:    addi sp, sp, 32
16342; RV32IA-NEXT:    ret
16343;
16344; RV64I-LABEL: atomicrmw_umax_i64_acq_rel:
16345; RV64I:       # %bb.0:
16346; RV64I-NEXT:    addi sp, sp, -32
16347; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16348; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16349; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16350; RV64I-NEXT:    mv s0, a0
16351; RV64I-NEXT:    ld a3, 0(a0)
16352; RV64I-NEXT:    mv s1, a1
16353; RV64I-NEXT:    j .LBB213_2
16354; RV64I-NEXT:  .LBB213_1: # %atomicrmw.start
16355; RV64I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16356; RV64I-NEXT:    sd a3, 0(sp)
16357; RV64I-NEXT:    mv a1, sp
16358; RV64I-NEXT:    li a3, 4
16359; RV64I-NEXT:    li a4, 2
16360; RV64I-NEXT:    mv a0, s0
16361; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16362; RV64I-NEXT:    ld a3, 0(sp)
16363; RV64I-NEXT:    bnez a0, .LBB213_4
16364; RV64I-NEXT:  .LBB213_2: # %atomicrmw.start
16365; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16366; RV64I-NEXT:    mv a2, a3
16367; RV64I-NEXT:    bltu s1, a3, .LBB213_1
16368; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16369; RV64I-NEXT:    # in Loop: Header=BB213_2 Depth=1
16370; RV64I-NEXT:    mv a2, s1
16371; RV64I-NEXT:    j .LBB213_1
16372; RV64I-NEXT:  .LBB213_4: # %atomicrmw.end
16373; RV64I-NEXT:    mv a0, a3
16374; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16375; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16376; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16377; RV64I-NEXT:    addi sp, sp, 32
16378; RV64I-NEXT:    ret
16379;
16380; RV64IA-LABEL: atomicrmw_umax_i64_acq_rel:
16381; RV64IA:       # %bb.0:
16382; RV64IA-NEXT:    amomaxu.d.aqrl a0, a1, (a0)
16383; RV64IA-NEXT:    ret
16384  %1 = atomicrmw umax i64* %a, i64 %b acq_rel
16385  ret i64 %1
16386}
16387
16388define i64 @atomicrmw_umax_i64_seq_cst(i64 *%a, i64 %b) nounwind {
16389; RV32I-LABEL: atomicrmw_umax_i64_seq_cst:
16390; RV32I:       # %bb.0:
16391; RV32I-NEXT:    addi sp, sp, -32
16392; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16393; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16394; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16395; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16396; RV32I-NEXT:    mv s0, a0
16397; RV32I-NEXT:    lw a5, 4(a0)
16398; RV32I-NEXT:    lw a4, 0(a0)
16399; RV32I-NEXT:    mv s1, a2
16400; RV32I-NEXT:    mv s2, a1
16401; RV32I-NEXT:    j .LBB214_2
16402; RV32I-NEXT:  .LBB214_1: # %atomicrmw.start
16403; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16404; RV32I-NEXT:    sw a4, 8(sp)
16405; RV32I-NEXT:    sw a5, 12(sp)
16406; RV32I-NEXT:    addi a1, sp, 8
16407; RV32I-NEXT:    li a4, 5
16408; RV32I-NEXT:    li a5, 5
16409; RV32I-NEXT:    mv a0, s0
16410; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16411; RV32I-NEXT:    lw a5, 12(sp)
16412; RV32I-NEXT:    lw a4, 8(sp)
16413; RV32I-NEXT:    bnez a0, .LBB214_7
16414; RV32I-NEXT:  .LBB214_2: # %atomicrmw.start
16415; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16416; RV32I-NEXT:    beq a5, s1, .LBB214_4
16417; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16418; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16419; RV32I-NEXT:    sltu a0, s1, a5
16420; RV32I-NEXT:    j .LBB214_5
16421; RV32I-NEXT:  .LBB214_4: # in Loop: Header=BB214_2 Depth=1
16422; RV32I-NEXT:    sltu a0, s2, a4
16423; RV32I-NEXT:  .LBB214_5: # %atomicrmw.start
16424; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16425; RV32I-NEXT:    mv a2, a4
16426; RV32I-NEXT:    mv a3, a5
16427; RV32I-NEXT:    bnez a0, .LBB214_1
16428; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16429; RV32I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16430; RV32I-NEXT:    mv a2, s2
16431; RV32I-NEXT:    mv a3, s1
16432; RV32I-NEXT:    j .LBB214_1
16433; RV32I-NEXT:  .LBB214_7: # %atomicrmw.end
16434; RV32I-NEXT:    mv a0, a4
16435; RV32I-NEXT:    mv a1, a5
16436; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16437; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16438; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16439; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16440; RV32I-NEXT:    addi sp, sp, 32
16441; RV32I-NEXT:    ret
16442;
16443; RV32IA-LABEL: atomicrmw_umax_i64_seq_cst:
16444; RV32IA:       # %bb.0:
16445; RV32IA-NEXT:    addi sp, sp, -32
16446; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16447; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16448; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16449; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16450; RV32IA-NEXT:    mv s0, a0
16451; RV32IA-NEXT:    lw a5, 4(a0)
16452; RV32IA-NEXT:    lw a4, 0(a0)
16453; RV32IA-NEXT:    mv s1, a2
16454; RV32IA-NEXT:    mv s2, a1
16455; RV32IA-NEXT:    j .LBB214_2
16456; RV32IA-NEXT:  .LBB214_1: # %atomicrmw.start
16457; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16458; RV32IA-NEXT:    sw a4, 8(sp)
16459; RV32IA-NEXT:    sw a5, 12(sp)
16460; RV32IA-NEXT:    addi a1, sp, 8
16461; RV32IA-NEXT:    li a4, 5
16462; RV32IA-NEXT:    li a5, 5
16463; RV32IA-NEXT:    mv a0, s0
16464; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16465; RV32IA-NEXT:    lw a5, 12(sp)
16466; RV32IA-NEXT:    lw a4, 8(sp)
16467; RV32IA-NEXT:    bnez a0, .LBB214_7
16468; RV32IA-NEXT:  .LBB214_2: # %atomicrmw.start
16469; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16470; RV32IA-NEXT:    beq a5, s1, .LBB214_4
16471; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16472; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16473; RV32IA-NEXT:    sltu a0, s1, a5
16474; RV32IA-NEXT:    j .LBB214_5
16475; RV32IA-NEXT:  .LBB214_4: # in Loop: Header=BB214_2 Depth=1
16476; RV32IA-NEXT:    sltu a0, s2, a4
16477; RV32IA-NEXT:  .LBB214_5: # %atomicrmw.start
16478; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16479; RV32IA-NEXT:    mv a2, a4
16480; RV32IA-NEXT:    mv a3, a5
16481; RV32IA-NEXT:    bnez a0, .LBB214_1
16482; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16483; RV32IA-NEXT:    # in Loop: Header=BB214_2 Depth=1
16484; RV32IA-NEXT:    mv a2, s2
16485; RV32IA-NEXT:    mv a3, s1
16486; RV32IA-NEXT:    j .LBB214_1
16487; RV32IA-NEXT:  .LBB214_7: # %atomicrmw.end
16488; RV32IA-NEXT:    mv a0, a4
16489; RV32IA-NEXT:    mv a1, a5
16490; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16491; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16492; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16493; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16494; RV32IA-NEXT:    addi sp, sp, 32
16495; RV32IA-NEXT:    ret
16496;
16497; RV64I-LABEL: atomicrmw_umax_i64_seq_cst:
16498; RV64I:       # %bb.0:
16499; RV64I-NEXT:    addi sp, sp, -32
16500; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16501; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16502; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16503; RV64I-NEXT:    mv s0, a0
16504; RV64I-NEXT:    ld a3, 0(a0)
16505; RV64I-NEXT:    mv s1, a1
16506; RV64I-NEXT:    j .LBB214_2
16507; RV64I-NEXT:  .LBB214_1: # %atomicrmw.start
16508; RV64I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16509; RV64I-NEXT:    sd a3, 0(sp)
16510; RV64I-NEXT:    mv a1, sp
16511; RV64I-NEXT:    li a3, 5
16512; RV64I-NEXT:    li a4, 5
16513; RV64I-NEXT:    mv a0, s0
16514; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16515; RV64I-NEXT:    ld a3, 0(sp)
16516; RV64I-NEXT:    bnez a0, .LBB214_4
16517; RV64I-NEXT:  .LBB214_2: # %atomicrmw.start
16518; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16519; RV64I-NEXT:    mv a2, a3
16520; RV64I-NEXT:    bltu s1, a3, .LBB214_1
16521; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16522; RV64I-NEXT:    # in Loop: Header=BB214_2 Depth=1
16523; RV64I-NEXT:    mv a2, s1
16524; RV64I-NEXT:    j .LBB214_1
16525; RV64I-NEXT:  .LBB214_4: # %atomicrmw.end
16526; RV64I-NEXT:    mv a0, a3
16527; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16528; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16529; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16530; RV64I-NEXT:    addi sp, sp, 32
16531; RV64I-NEXT:    ret
16532;
16533; RV64IA-LABEL: atomicrmw_umax_i64_seq_cst:
16534; RV64IA:       # %bb.0:
16535; RV64IA-NEXT:    amomaxu.d.aqrl a0, a1, (a0)
16536; RV64IA-NEXT:    ret
16537  %1 = atomicrmw umax i64* %a, i64 %b seq_cst
16538  ret i64 %1
16539}
16540
16541define i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind {
16542; RV32I-LABEL: atomicrmw_umin_i64_monotonic:
16543; RV32I:       # %bb.0:
16544; RV32I-NEXT:    addi sp, sp, -32
16545; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16546; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16547; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16548; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16549; RV32I-NEXT:    mv s0, a0
16550; RV32I-NEXT:    lw a5, 4(a0)
16551; RV32I-NEXT:    lw a4, 0(a0)
16552; RV32I-NEXT:    mv s1, a2
16553; RV32I-NEXT:    mv s2, a1
16554; RV32I-NEXT:    j .LBB215_2
16555; RV32I-NEXT:  .LBB215_1: # %atomicrmw.start
16556; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16557; RV32I-NEXT:    sw a4, 8(sp)
16558; RV32I-NEXT:    sw a5, 12(sp)
16559; RV32I-NEXT:    addi a1, sp, 8
16560; RV32I-NEXT:    mv a0, s0
16561; RV32I-NEXT:    li a4, 0
16562; RV32I-NEXT:    li a5, 0
16563; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16564; RV32I-NEXT:    lw a5, 12(sp)
16565; RV32I-NEXT:    lw a4, 8(sp)
16566; RV32I-NEXT:    bnez a0, .LBB215_7
16567; RV32I-NEXT:  .LBB215_2: # %atomicrmw.start
16568; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16569; RV32I-NEXT:    beq a5, s1, .LBB215_4
16570; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16571; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16572; RV32I-NEXT:    sltu a0, s1, a5
16573; RV32I-NEXT:    j .LBB215_5
16574; RV32I-NEXT:  .LBB215_4: # in Loop: Header=BB215_2 Depth=1
16575; RV32I-NEXT:    sltu a0, s2, a4
16576; RV32I-NEXT:  .LBB215_5: # %atomicrmw.start
16577; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16578; RV32I-NEXT:    xori a0, a0, 1
16579; RV32I-NEXT:    mv a2, a4
16580; RV32I-NEXT:    mv a3, a5
16581; RV32I-NEXT:    bnez a0, .LBB215_1
16582; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16583; RV32I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16584; RV32I-NEXT:    mv a2, s2
16585; RV32I-NEXT:    mv a3, s1
16586; RV32I-NEXT:    j .LBB215_1
16587; RV32I-NEXT:  .LBB215_7: # %atomicrmw.end
16588; RV32I-NEXT:    mv a0, a4
16589; RV32I-NEXT:    mv a1, a5
16590; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16591; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16592; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16593; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16594; RV32I-NEXT:    addi sp, sp, 32
16595; RV32I-NEXT:    ret
16596;
16597; RV32IA-LABEL: atomicrmw_umin_i64_monotonic:
16598; RV32IA:       # %bb.0:
16599; RV32IA-NEXT:    addi sp, sp, -32
16600; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16601; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16602; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16603; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16604; RV32IA-NEXT:    mv s0, a0
16605; RV32IA-NEXT:    lw a5, 4(a0)
16606; RV32IA-NEXT:    lw a4, 0(a0)
16607; RV32IA-NEXT:    mv s1, a2
16608; RV32IA-NEXT:    mv s2, a1
16609; RV32IA-NEXT:    j .LBB215_2
16610; RV32IA-NEXT:  .LBB215_1: # %atomicrmw.start
16611; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16612; RV32IA-NEXT:    sw a4, 8(sp)
16613; RV32IA-NEXT:    sw a5, 12(sp)
16614; RV32IA-NEXT:    addi a1, sp, 8
16615; RV32IA-NEXT:    mv a0, s0
16616; RV32IA-NEXT:    li a4, 0
16617; RV32IA-NEXT:    li a5, 0
16618; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16619; RV32IA-NEXT:    lw a5, 12(sp)
16620; RV32IA-NEXT:    lw a4, 8(sp)
16621; RV32IA-NEXT:    bnez a0, .LBB215_7
16622; RV32IA-NEXT:  .LBB215_2: # %atomicrmw.start
16623; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16624; RV32IA-NEXT:    beq a5, s1, .LBB215_4
16625; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16626; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16627; RV32IA-NEXT:    sltu a0, s1, a5
16628; RV32IA-NEXT:    j .LBB215_5
16629; RV32IA-NEXT:  .LBB215_4: # in Loop: Header=BB215_2 Depth=1
16630; RV32IA-NEXT:    sltu a0, s2, a4
16631; RV32IA-NEXT:  .LBB215_5: # %atomicrmw.start
16632; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16633; RV32IA-NEXT:    xori a0, a0, 1
16634; RV32IA-NEXT:    mv a2, a4
16635; RV32IA-NEXT:    mv a3, a5
16636; RV32IA-NEXT:    bnez a0, .LBB215_1
16637; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16638; RV32IA-NEXT:    # in Loop: Header=BB215_2 Depth=1
16639; RV32IA-NEXT:    mv a2, s2
16640; RV32IA-NEXT:    mv a3, s1
16641; RV32IA-NEXT:    j .LBB215_1
16642; RV32IA-NEXT:  .LBB215_7: # %atomicrmw.end
16643; RV32IA-NEXT:    mv a0, a4
16644; RV32IA-NEXT:    mv a1, a5
16645; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16646; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16647; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16648; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16649; RV32IA-NEXT:    addi sp, sp, 32
16650; RV32IA-NEXT:    ret
16651;
16652; RV64I-LABEL: atomicrmw_umin_i64_monotonic:
16653; RV64I:       # %bb.0:
16654; RV64I-NEXT:    addi sp, sp, -32
16655; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16656; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16657; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16658; RV64I-NEXT:    mv s0, a0
16659; RV64I-NEXT:    ld a3, 0(a0)
16660; RV64I-NEXT:    mv s1, a1
16661; RV64I-NEXT:    j .LBB215_2
16662; RV64I-NEXT:  .LBB215_1: # %atomicrmw.start
16663; RV64I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16664; RV64I-NEXT:    sd a3, 0(sp)
16665; RV64I-NEXT:    mv a1, sp
16666; RV64I-NEXT:    mv a0, s0
16667; RV64I-NEXT:    li a3, 0
16668; RV64I-NEXT:    li a4, 0
16669; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16670; RV64I-NEXT:    ld a3, 0(sp)
16671; RV64I-NEXT:    bnez a0, .LBB215_4
16672; RV64I-NEXT:  .LBB215_2: # %atomicrmw.start
16673; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16674; RV64I-NEXT:    mv a2, a3
16675; RV64I-NEXT:    bgeu s1, a3, .LBB215_1
16676; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16677; RV64I-NEXT:    # in Loop: Header=BB215_2 Depth=1
16678; RV64I-NEXT:    mv a2, s1
16679; RV64I-NEXT:    j .LBB215_1
16680; RV64I-NEXT:  .LBB215_4: # %atomicrmw.end
16681; RV64I-NEXT:    mv a0, a3
16682; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16683; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16684; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16685; RV64I-NEXT:    addi sp, sp, 32
16686; RV64I-NEXT:    ret
16687;
16688; RV64IA-LABEL: atomicrmw_umin_i64_monotonic:
16689; RV64IA:       # %bb.0:
16690; RV64IA-NEXT:    amominu.d a0, a1, (a0)
16691; RV64IA-NEXT:    ret
16692  %1 = atomicrmw umin i64* %a, i64 %b monotonic
16693  ret i64 %1
16694}
16695
16696define i64 @atomicrmw_umin_i64_acquire(i64 *%a, i64 %b) nounwind {
16697; RV32I-LABEL: atomicrmw_umin_i64_acquire:
16698; RV32I:       # %bb.0:
16699; RV32I-NEXT:    addi sp, sp, -32
16700; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16701; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16702; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16703; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16704; RV32I-NEXT:    mv s0, a0
16705; RV32I-NEXT:    lw a5, 4(a0)
16706; RV32I-NEXT:    lw a4, 0(a0)
16707; RV32I-NEXT:    mv s1, a2
16708; RV32I-NEXT:    mv s2, a1
16709; RV32I-NEXT:    j .LBB216_2
16710; RV32I-NEXT:  .LBB216_1: # %atomicrmw.start
16711; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16712; RV32I-NEXT:    sw a4, 8(sp)
16713; RV32I-NEXT:    sw a5, 12(sp)
16714; RV32I-NEXT:    addi a1, sp, 8
16715; RV32I-NEXT:    li a4, 2
16716; RV32I-NEXT:    li a5, 2
16717; RV32I-NEXT:    mv a0, s0
16718; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16719; RV32I-NEXT:    lw a5, 12(sp)
16720; RV32I-NEXT:    lw a4, 8(sp)
16721; RV32I-NEXT:    bnez a0, .LBB216_7
16722; RV32I-NEXT:  .LBB216_2: # %atomicrmw.start
16723; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16724; RV32I-NEXT:    beq a5, s1, .LBB216_4
16725; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16726; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16727; RV32I-NEXT:    sltu a0, s1, a5
16728; RV32I-NEXT:    j .LBB216_5
16729; RV32I-NEXT:  .LBB216_4: # in Loop: Header=BB216_2 Depth=1
16730; RV32I-NEXT:    sltu a0, s2, a4
16731; RV32I-NEXT:  .LBB216_5: # %atomicrmw.start
16732; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16733; RV32I-NEXT:    xori a0, a0, 1
16734; RV32I-NEXT:    mv a2, a4
16735; RV32I-NEXT:    mv a3, a5
16736; RV32I-NEXT:    bnez a0, .LBB216_1
16737; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16738; RV32I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16739; RV32I-NEXT:    mv a2, s2
16740; RV32I-NEXT:    mv a3, s1
16741; RV32I-NEXT:    j .LBB216_1
16742; RV32I-NEXT:  .LBB216_7: # %atomicrmw.end
16743; RV32I-NEXT:    mv a0, a4
16744; RV32I-NEXT:    mv a1, a5
16745; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16746; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16747; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16748; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16749; RV32I-NEXT:    addi sp, sp, 32
16750; RV32I-NEXT:    ret
16751;
16752; RV32IA-LABEL: atomicrmw_umin_i64_acquire:
16753; RV32IA:       # %bb.0:
16754; RV32IA-NEXT:    addi sp, sp, -32
16755; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16756; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16757; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16758; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16759; RV32IA-NEXT:    mv s0, a0
16760; RV32IA-NEXT:    lw a5, 4(a0)
16761; RV32IA-NEXT:    lw a4, 0(a0)
16762; RV32IA-NEXT:    mv s1, a2
16763; RV32IA-NEXT:    mv s2, a1
16764; RV32IA-NEXT:    j .LBB216_2
16765; RV32IA-NEXT:  .LBB216_1: # %atomicrmw.start
16766; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16767; RV32IA-NEXT:    sw a4, 8(sp)
16768; RV32IA-NEXT:    sw a5, 12(sp)
16769; RV32IA-NEXT:    addi a1, sp, 8
16770; RV32IA-NEXT:    li a4, 2
16771; RV32IA-NEXT:    li a5, 2
16772; RV32IA-NEXT:    mv a0, s0
16773; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16774; RV32IA-NEXT:    lw a5, 12(sp)
16775; RV32IA-NEXT:    lw a4, 8(sp)
16776; RV32IA-NEXT:    bnez a0, .LBB216_7
16777; RV32IA-NEXT:  .LBB216_2: # %atomicrmw.start
16778; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16779; RV32IA-NEXT:    beq a5, s1, .LBB216_4
16780; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16781; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16782; RV32IA-NEXT:    sltu a0, s1, a5
16783; RV32IA-NEXT:    j .LBB216_5
16784; RV32IA-NEXT:  .LBB216_4: # in Loop: Header=BB216_2 Depth=1
16785; RV32IA-NEXT:    sltu a0, s2, a4
16786; RV32IA-NEXT:  .LBB216_5: # %atomicrmw.start
16787; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16788; RV32IA-NEXT:    xori a0, a0, 1
16789; RV32IA-NEXT:    mv a2, a4
16790; RV32IA-NEXT:    mv a3, a5
16791; RV32IA-NEXT:    bnez a0, .LBB216_1
16792; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16793; RV32IA-NEXT:    # in Loop: Header=BB216_2 Depth=1
16794; RV32IA-NEXT:    mv a2, s2
16795; RV32IA-NEXT:    mv a3, s1
16796; RV32IA-NEXT:    j .LBB216_1
16797; RV32IA-NEXT:  .LBB216_7: # %atomicrmw.end
16798; RV32IA-NEXT:    mv a0, a4
16799; RV32IA-NEXT:    mv a1, a5
16800; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16801; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16802; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16803; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16804; RV32IA-NEXT:    addi sp, sp, 32
16805; RV32IA-NEXT:    ret
16806;
16807; RV64I-LABEL: atomicrmw_umin_i64_acquire:
16808; RV64I:       # %bb.0:
16809; RV64I-NEXT:    addi sp, sp, -32
16810; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16811; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16812; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16813; RV64I-NEXT:    mv s0, a0
16814; RV64I-NEXT:    ld a3, 0(a0)
16815; RV64I-NEXT:    mv s1, a1
16816; RV64I-NEXT:    j .LBB216_2
16817; RV64I-NEXT:  .LBB216_1: # %atomicrmw.start
16818; RV64I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16819; RV64I-NEXT:    sd a3, 0(sp)
16820; RV64I-NEXT:    mv a1, sp
16821; RV64I-NEXT:    li a3, 2
16822; RV64I-NEXT:    li a4, 2
16823; RV64I-NEXT:    mv a0, s0
16824; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16825; RV64I-NEXT:    ld a3, 0(sp)
16826; RV64I-NEXT:    bnez a0, .LBB216_4
16827; RV64I-NEXT:  .LBB216_2: # %atomicrmw.start
16828; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16829; RV64I-NEXT:    mv a2, a3
16830; RV64I-NEXT:    bgeu s1, a3, .LBB216_1
16831; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16832; RV64I-NEXT:    # in Loop: Header=BB216_2 Depth=1
16833; RV64I-NEXT:    mv a2, s1
16834; RV64I-NEXT:    j .LBB216_1
16835; RV64I-NEXT:  .LBB216_4: # %atomicrmw.end
16836; RV64I-NEXT:    mv a0, a3
16837; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16838; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16839; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16840; RV64I-NEXT:    addi sp, sp, 32
16841; RV64I-NEXT:    ret
16842;
16843; RV64IA-LABEL: atomicrmw_umin_i64_acquire:
16844; RV64IA:       # %bb.0:
16845; RV64IA-NEXT:    amominu.d.aq a0, a1, (a0)
16846; RV64IA-NEXT:    ret
16847  %1 = atomicrmw umin i64* %a, i64 %b acquire
16848  ret i64 %1
16849}
16850
16851define i64 @atomicrmw_umin_i64_release(i64 *%a, i64 %b) nounwind {
16852; RV32I-LABEL: atomicrmw_umin_i64_release:
16853; RV32I:       # %bb.0:
16854; RV32I-NEXT:    addi sp, sp, -32
16855; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16856; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16857; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16858; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16859; RV32I-NEXT:    mv s0, a0
16860; RV32I-NEXT:    lw a5, 4(a0)
16861; RV32I-NEXT:    lw a4, 0(a0)
16862; RV32I-NEXT:    mv s1, a2
16863; RV32I-NEXT:    mv s2, a1
16864; RV32I-NEXT:    j .LBB217_2
16865; RV32I-NEXT:  .LBB217_1: # %atomicrmw.start
16866; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16867; RV32I-NEXT:    sw a4, 8(sp)
16868; RV32I-NEXT:    sw a5, 12(sp)
16869; RV32I-NEXT:    addi a1, sp, 8
16870; RV32I-NEXT:    li a4, 3
16871; RV32I-NEXT:    mv a0, s0
16872; RV32I-NEXT:    li a5, 0
16873; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
16874; RV32I-NEXT:    lw a5, 12(sp)
16875; RV32I-NEXT:    lw a4, 8(sp)
16876; RV32I-NEXT:    bnez a0, .LBB217_7
16877; RV32I-NEXT:  .LBB217_2: # %atomicrmw.start
16878; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16879; RV32I-NEXT:    beq a5, s1, .LBB217_4
16880; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16881; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16882; RV32I-NEXT:    sltu a0, s1, a5
16883; RV32I-NEXT:    j .LBB217_5
16884; RV32I-NEXT:  .LBB217_4: # in Loop: Header=BB217_2 Depth=1
16885; RV32I-NEXT:    sltu a0, s2, a4
16886; RV32I-NEXT:  .LBB217_5: # %atomicrmw.start
16887; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16888; RV32I-NEXT:    xori a0, a0, 1
16889; RV32I-NEXT:    mv a2, a4
16890; RV32I-NEXT:    mv a3, a5
16891; RV32I-NEXT:    bnez a0, .LBB217_1
16892; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
16893; RV32I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16894; RV32I-NEXT:    mv a2, s2
16895; RV32I-NEXT:    mv a3, s1
16896; RV32I-NEXT:    j .LBB217_1
16897; RV32I-NEXT:  .LBB217_7: # %atomicrmw.end
16898; RV32I-NEXT:    mv a0, a4
16899; RV32I-NEXT:    mv a1, a5
16900; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16901; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16902; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16903; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16904; RV32I-NEXT:    addi sp, sp, 32
16905; RV32I-NEXT:    ret
16906;
16907; RV32IA-LABEL: atomicrmw_umin_i64_release:
16908; RV32IA:       # %bb.0:
16909; RV32IA-NEXT:    addi sp, sp, -32
16910; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16911; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16912; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16913; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16914; RV32IA-NEXT:    mv s0, a0
16915; RV32IA-NEXT:    lw a5, 4(a0)
16916; RV32IA-NEXT:    lw a4, 0(a0)
16917; RV32IA-NEXT:    mv s1, a2
16918; RV32IA-NEXT:    mv s2, a1
16919; RV32IA-NEXT:    j .LBB217_2
16920; RV32IA-NEXT:  .LBB217_1: # %atomicrmw.start
16921; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16922; RV32IA-NEXT:    sw a4, 8(sp)
16923; RV32IA-NEXT:    sw a5, 12(sp)
16924; RV32IA-NEXT:    addi a1, sp, 8
16925; RV32IA-NEXT:    li a4, 3
16926; RV32IA-NEXT:    mv a0, s0
16927; RV32IA-NEXT:    li a5, 0
16928; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
16929; RV32IA-NEXT:    lw a5, 12(sp)
16930; RV32IA-NEXT:    lw a4, 8(sp)
16931; RV32IA-NEXT:    bnez a0, .LBB217_7
16932; RV32IA-NEXT:  .LBB217_2: # %atomicrmw.start
16933; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
16934; RV32IA-NEXT:    beq a5, s1, .LBB217_4
16935; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
16936; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16937; RV32IA-NEXT:    sltu a0, s1, a5
16938; RV32IA-NEXT:    j .LBB217_5
16939; RV32IA-NEXT:  .LBB217_4: # in Loop: Header=BB217_2 Depth=1
16940; RV32IA-NEXT:    sltu a0, s2, a4
16941; RV32IA-NEXT:  .LBB217_5: # %atomicrmw.start
16942; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16943; RV32IA-NEXT:    xori a0, a0, 1
16944; RV32IA-NEXT:    mv a2, a4
16945; RV32IA-NEXT:    mv a3, a5
16946; RV32IA-NEXT:    bnez a0, .LBB217_1
16947; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
16948; RV32IA-NEXT:    # in Loop: Header=BB217_2 Depth=1
16949; RV32IA-NEXT:    mv a2, s2
16950; RV32IA-NEXT:    mv a3, s1
16951; RV32IA-NEXT:    j .LBB217_1
16952; RV32IA-NEXT:  .LBB217_7: # %atomicrmw.end
16953; RV32IA-NEXT:    mv a0, a4
16954; RV32IA-NEXT:    mv a1, a5
16955; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16956; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16957; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16958; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16959; RV32IA-NEXT:    addi sp, sp, 32
16960; RV32IA-NEXT:    ret
16961;
16962; RV64I-LABEL: atomicrmw_umin_i64_release:
16963; RV64I:       # %bb.0:
16964; RV64I-NEXT:    addi sp, sp, -32
16965; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
16966; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
16967; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
16968; RV64I-NEXT:    mv s0, a0
16969; RV64I-NEXT:    ld a3, 0(a0)
16970; RV64I-NEXT:    mv s1, a1
16971; RV64I-NEXT:    j .LBB217_2
16972; RV64I-NEXT:  .LBB217_1: # %atomicrmw.start
16973; RV64I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16974; RV64I-NEXT:    sd a3, 0(sp)
16975; RV64I-NEXT:    mv a1, sp
16976; RV64I-NEXT:    li a3, 3
16977; RV64I-NEXT:    mv a0, s0
16978; RV64I-NEXT:    li a4, 0
16979; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
16980; RV64I-NEXT:    ld a3, 0(sp)
16981; RV64I-NEXT:    bnez a0, .LBB217_4
16982; RV64I-NEXT:  .LBB217_2: # %atomicrmw.start
16983; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16984; RV64I-NEXT:    mv a2, a3
16985; RV64I-NEXT:    bgeu s1, a3, .LBB217_1
16986; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16987; RV64I-NEXT:    # in Loop: Header=BB217_2 Depth=1
16988; RV64I-NEXT:    mv a2, s1
16989; RV64I-NEXT:    j .LBB217_1
16990; RV64I-NEXT:  .LBB217_4: # %atomicrmw.end
16991; RV64I-NEXT:    mv a0, a3
16992; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
16993; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
16994; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
16995; RV64I-NEXT:    addi sp, sp, 32
16996; RV64I-NEXT:    ret
16997;
16998; RV64IA-LABEL: atomicrmw_umin_i64_release:
16999; RV64IA:       # %bb.0:
17000; RV64IA-NEXT:    amominu.d.rl a0, a1, (a0)
17001; RV64IA-NEXT:    ret
17002  %1 = atomicrmw umin i64* %a, i64 %b release
17003  ret i64 %1
17004}
17005
17006define i64 @atomicrmw_umin_i64_acq_rel(i64 *%a, i64 %b) nounwind {
17007; RV32I-LABEL: atomicrmw_umin_i64_acq_rel:
17008; RV32I:       # %bb.0:
17009; RV32I-NEXT:    addi sp, sp, -32
17010; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17011; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17012; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17013; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17014; RV32I-NEXT:    mv s0, a0
17015; RV32I-NEXT:    lw a5, 4(a0)
17016; RV32I-NEXT:    lw a4, 0(a0)
17017; RV32I-NEXT:    mv s1, a2
17018; RV32I-NEXT:    mv s2, a1
17019; RV32I-NEXT:    j .LBB218_2
17020; RV32I-NEXT:  .LBB218_1: # %atomicrmw.start
17021; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17022; RV32I-NEXT:    sw a4, 8(sp)
17023; RV32I-NEXT:    sw a5, 12(sp)
17024; RV32I-NEXT:    addi a1, sp, 8
17025; RV32I-NEXT:    li a4, 4
17026; RV32I-NEXT:    li a5, 2
17027; RV32I-NEXT:    mv a0, s0
17028; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
17029; RV32I-NEXT:    lw a5, 12(sp)
17030; RV32I-NEXT:    lw a4, 8(sp)
17031; RV32I-NEXT:    bnez a0, .LBB218_7
17032; RV32I-NEXT:  .LBB218_2: # %atomicrmw.start
17033; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17034; RV32I-NEXT:    beq a5, s1, .LBB218_4
17035; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17036; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17037; RV32I-NEXT:    sltu a0, s1, a5
17038; RV32I-NEXT:    j .LBB218_5
17039; RV32I-NEXT:  .LBB218_4: # in Loop: Header=BB218_2 Depth=1
17040; RV32I-NEXT:    sltu a0, s2, a4
17041; RV32I-NEXT:  .LBB218_5: # %atomicrmw.start
17042; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17043; RV32I-NEXT:    xori a0, a0, 1
17044; RV32I-NEXT:    mv a2, a4
17045; RV32I-NEXT:    mv a3, a5
17046; RV32I-NEXT:    bnez a0, .LBB218_1
17047; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
17048; RV32I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17049; RV32I-NEXT:    mv a2, s2
17050; RV32I-NEXT:    mv a3, s1
17051; RV32I-NEXT:    j .LBB218_1
17052; RV32I-NEXT:  .LBB218_7: # %atomicrmw.end
17053; RV32I-NEXT:    mv a0, a4
17054; RV32I-NEXT:    mv a1, a5
17055; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17056; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17057; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17058; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17059; RV32I-NEXT:    addi sp, sp, 32
17060; RV32I-NEXT:    ret
17061;
17062; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel:
17063; RV32IA:       # %bb.0:
17064; RV32IA-NEXT:    addi sp, sp, -32
17065; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17066; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17067; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17068; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17069; RV32IA-NEXT:    mv s0, a0
17070; RV32IA-NEXT:    lw a5, 4(a0)
17071; RV32IA-NEXT:    lw a4, 0(a0)
17072; RV32IA-NEXT:    mv s1, a2
17073; RV32IA-NEXT:    mv s2, a1
17074; RV32IA-NEXT:    j .LBB218_2
17075; RV32IA-NEXT:  .LBB218_1: # %atomicrmw.start
17076; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17077; RV32IA-NEXT:    sw a4, 8(sp)
17078; RV32IA-NEXT:    sw a5, 12(sp)
17079; RV32IA-NEXT:    addi a1, sp, 8
17080; RV32IA-NEXT:    li a4, 4
17081; RV32IA-NEXT:    li a5, 2
17082; RV32IA-NEXT:    mv a0, s0
17083; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
17084; RV32IA-NEXT:    lw a5, 12(sp)
17085; RV32IA-NEXT:    lw a4, 8(sp)
17086; RV32IA-NEXT:    bnez a0, .LBB218_7
17087; RV32IA-NEXT:  .LBB218_2: # %atomicrmw.start
17088; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
17089; RV32IA-NEXT:    beq a5, s1, .LBB218_4
17090; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
17091; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17092; RV32IA-NEXT:    sltu a0, s1, a5
17093; RV32IA-NEXT:    j .LBB218_5
17094; RV32IA-NEXT:  .LBB218_4: # in Loop: Header=BB218_2 Depth=1
17095; RV32IA-NEXT:    sltu a0, s2, a4
17096; RV32IA-NEXT:  .LBB218_5: # %atomicrmw.start
17097; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17098; RV32IA-NEXT:    xori a0, a0, 1
17099; RV32IA-NEXT:    mv a2, a4
17100; RV32IA-NEXT:    mv a3, a5
17101; RV32IA-NEXT:    bnez a0, .LBB218_1
17102; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
17103; RV32IA-NEXT:    # in Loop: Header=BB218_2 Depth=1
17104; RV32IA-NEXT:    mv a2, s2
17105; RV32IA-NEXT:    mv a3, s1
17106; RV32IA-NEXT:    j .LBB218_1
17107; RV32IA-NEXT:  .LBB218_7: # %atomicrmw.end
17108; RV32IA-NEXT:    mv a0, a4
17109; RV32IA-NEXT:    mv a1, a5
17110; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17111; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17112; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17113; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17114; RV32IA-NEXT:    addi sp, sp, 32
17115; RV32IA-NEXT:    ret
17116;
17117; RV64I-LABEL: atomicrmw_umin_i64_acq_rel:
17118; RV64I:       # %bb.0:
17119; RV64I-NEXT:    addi sp, sp, -32
17120; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
17121; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
17122; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
17123; RV64I-NEXT:    mv s0, a0
17124; RV64I-NEXT:    ld a3, 0(a0)
17125; RV64I-NEXT:    mv s1, a1
17126; RV64I-NEXT:    j .LBB218_2
17127; RV64I-NEXT:  .LBB218_1: # %atomicrmw.start
17128; RV64I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17129; RV64I-NEXT:    sd a3, 0(sp)
17130; RV64I-NEXT:    mv a1, sp
17131; RV64I-NEXT:    li a3, 4
17132; RV64I-NEXT:    li a4, 2
17133; RV64I-NEXT:    mv a0, s0
17134; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
17135; RV64I-NEXT:    ld a3, 0(sp)
17136; RV64I-NEXT:    bnez a0, .LBB218_4
17137; RV64I-NEXT:  .LBB218_2: # %atomicrmw.start
17138; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17139; RV64I-NEXT:    mv a2, a3
17140; RV64I-NEXT:    bgeu s1, a3, .LBB218_1
17141; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17142; RV64I-NEXT:    # in Loop: Header=BB218_2 Depth=1
17143; RV64I-NEXT:    mv a2, s1
17144; RV64I-NEXT:    j .LBB218_1
17145; RV64I-NEXT:  .LBB218_4: # %atomicrmw.end
17146; RV64I-NEXT:    mv a0, a3
17147; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
17148; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
17149; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
17150; RV64I-NEXT:    addi sp, sp, 32
17151; RV64I-NEXT:    ret
17152;
17153; RV64IA-LABEL: atomicrmw_umin_i64_acq_rel:
17154; RV64IA:       # %bb.0:
17155; RV64IA-NEXT:    amominu.d.aqrl a0, a1, (a0)
17156; RV64IA-NEXT:    ret
17157  %1 = atomicrmw umin i64* %a, i64 %b acq_rel
17158  ret i64 %1
17159}
17160
17161define i64 @atomicrmw_umin_i64_seq_cst(i64 *%a, i64 %b) nounwind {
17162; RV32I-LABEL: atomicrmw_umin_i64_seq_cst:
17163; RV32I:       # %bb.0:
17164; RV32I-NEXT:    addi sp, sp, -32
17165; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17166; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17167; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17168; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17169; RV32I-NEXT:    mv s0, a0
17170; RV32I-NEXT:    lw a5, 4(a0)
17171; RV32I-NEXT:    lw a4, 0(a0)
17172; RV32I-NEXT:    mv s1, a2
17173; RV32I-NEXT:    mv s2, a1
17174; RV32I-NEXT:    j .LBB219_2
17175; RV32I-NEXT:  .LBB219_1: # %atomicrmw.start
17176; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17177; RV32I-NEXT:    sw a4, 8(sp)
17178; RV32I-NEXT:    sw a5, 12(sp)
17179; RV32I-NEXT:    addi a1, sp, 8
17180; RV32I-NEXT:    li a4, 5
17181; RV32I-NEXT:    li a5, 5
17182; RV32I-NEXT:    mv a0, s0
17183; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
17184; RV32I-NEXT:    lw a5, 12(sp)
17185; RV32I-NEXT:    lw a4, 8(sp)
17186; RV32I-NEXT:    bnez a0, .LBB219_7
17187; RV32I-NEXT:  .LBB219_2: # %atomicrmw.start
17188; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17189; RV32I-NEXT:    beq a5, s1, .LBB219_4
17190; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17191; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17192; RV32I-NEXT:    sltu a0, s1, a5
17193; RV32I-NEXT:    j .LBB219_5
17194; RV32I-NEXT:  .LBB219_4: # in Loop: Header=BB219_2 Depth=1
17195; RV32I-NEXT:    sltu a0, s2, a4
17196; RV32I-NEXT:  .LBB219_5: # %atomicrmw.start
17197; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17198; RV32I-NEXT:    xori a0, a0, 1
17199; RV32I-NEXT:    mv a2, a4
17200; RV32I-NEXT:    mv a3, a5
17201; RV32I-NEXT:    bnez a0, .LBB219_1
17202; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
17203; RV32I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17204; RV32I-NEXT:    mv a2, s2
17205; RV32I-NEXT:    mv a3, s1
17206; RV32I-NEXT:    j .LBB219_1
17207; RV32I-NEXT:  .LBB219_7: # %atomicrmw.end
17208; RV32I-NEXT:    mv a0, a4
17209; RV32I-NEXT:    mv a1, a5
17210; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17211; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17212; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17213; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17214; RV32I-NEXT:    addi sp, sp, 32
17215; RV32I-NEXT:    ret
17216;
17217; RV32IA-LABEL: atomicrmw_umin_i64_seq_cst:
17218; RV32IA:       # %bb.0:
17219; RV32IA-NEXT:    addi sp, sp, -32
17220; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17221; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17222; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17223; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17224; RV32IA-NEXT:    mv s0, a0
17225; RV32IA-NEXT:    lw a5, 4(a0)
17226; RV32IA-NEXT:    lw a4, 0(a0)
17227; RV32IA-NEXT:    mv s1, a2
17228; RV32IA-NEXT:    mv s2, a1
17229; RV32IA-NEXT:    j .LBB219_2
17230; RV32IA-NEXT:  .LBB219_1: # %atomicrmw.start
17231; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17232; RV32IA-NEXT:    sw a4, 8(sp)
17233; RV32IA-NEXT:    sw a5, 12(sp)
17234; RV32IA-NEXT:    addi a1, sp, 8
17235; RV32IA-NEXT:    li a4, 5
17236; RV32IA-NEXT:    li a5, 5
17237; RV32IA-NEXT:    mv a0, s0
17238; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
17239; RV32IA-NEXT:    lw a5, 12(sp)
17240; RV32IA-NEXT:    lw a4, 8(sp)
17241; RV32IA-NEXT:    bnez a0, .LBB219_7
17242; RV32IA-NEXT:  .LBB219_2: # %atomicrmw.start
17243; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
17244; RV32IA-NEXT:    beq a5, s1, .LBB219_4
17245; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
17246; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17247; RV32IA-NEXT:    sltu a0, s1, a5
17248; RV32IA-NEXT:    j .LBB219_5
17249; RV32IA-NEXT:  .LBB219_4: # in Loop: Header=BB219_2 Depth=1
17250; RV32IA-NEXT:    sltu a0, s2, a4
17251; RV32IA-NEXT:  .LBB219_5: # %atomicrmw.start
17252; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17253; RV32IA-NEXT:    xori a0, a0, 1
17254; RV32IA-NEXT:    mv a2, a4
17255; RV32IA-NEXT:    mv a3, a5
17256; RV32IA-NEXT:    bnez a0, .LBB219_1
17257; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
17258; RV32IA-NEXT:    # in Loop: Header=BB219_2 Depth=1
17259; RV32IA-NEXT:    mv a2, s2
17260; RV32IA-NEXT:    mv a3, s1
17261; RV32IA-NEXT:    j .LBB219_1
17262; RV32IA-NEXT:  .LBB219_7: # %atomicrmw.end
17263; RV32IA-NEXT:    mv a0, a4
17264; RV32IA-NEXT:    mv a1, a5
17265; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17266; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17267; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17268; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17269; RV32IA-NEXT:    addi sp, sp, 32
17270; RV32IA-NEXT:    ret
17271;
17272; RV64I-LABEL: atomicrmw_umin_i64_seq_cst:
17273; RV64I:       # %bb.0:
17274; RV64I-NEXT:    addi sp, sp, -32
17275; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
17276; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
17277; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
17278; RV64I-NEXT:    mv s0, a0
17279; RV64I-NEXT:    ld a3, 0(a0)
17280; RV64I-NEXT:    mv s1, a1
17281; RV64I-NEXT:    j .LBB219_2
17282; RV64I-NEXT:  .LBB219_1: # %atomicrmw.start
17283; RV64I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17284; RV64I-NEXT:    sd a3, 0(sp)
17285; RV64I-NEXT:    mv a1, sp
17286; RV64I-NEXT:    li a3, 5
17287; RV64I-NEXT:    li a4, 5
17288; RV64I-NEXT:    mv a0, s0
17289; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
17290; RV64I-NEXT:    ld a3, 0(sp)
17291; RV64I-NEXT:    bnez a0, .LBB219_4
17292; RV64I-NEXT:  .LBB219_2: # %atomicrmw.start
17293; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17294; RV64I-NEXT:    mv a2, a3
17295; RV64I-NEXT:    bgeu s1, a3, .LBB219_1
17296; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17297; RV64I-NEXT:    # in Loop: Header=BB219_2 Depth=1
17298; RV64I-NEXT:    mv a2, s1
17299; RV64I-NEXT:    j .LBB219_1
17300; RV64I-NEXT:  .LBB219_4: # %atomicrmw.end
17301; RV64I-NEXT:    mv a0, a3
17302; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
17303; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
17304; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
17305; RV64I-NEXT:    addi sp, sp, 32
17306; RV64I-NEXT:    ret
17307;
17308; RV64IA-LABEL: atomicrmw_umin_i64_seq_cst:
17309; RV64IA:       # %bb.0:
17310; RV64IA-NEXT:    amominu.d.aqrl a0, a1, (a0)
17311; RV64IA-NEXT:    ret
17312  %1 = atomicrmw umin i64* %a, i64 %b seq_cst
17313  ret i64 %1
17314}
17315