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 signext i8 @atomic_load_i8_unordered(i8 *%a) nounwind {
12; RV32I-LABEL: atomic_load_i8_unordered:
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 a1, 0
17; RV32I-NEXT:    call __atomic_load_1@plt
18; RV32I-NEXT:    slli a0, a0, 24
19; RV32I-NEXT:    srai a0, a0, 24
20; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21; RV32I-NEXT:    addi sp, sp, 16
22; RV32I-NEXT:    ret
23;
24; RV32IA-LABEL: atomic_load_i8_unordered:
25; RV32IA:       # %bb.0:
26; RV32IA-NEXT:    lb a0, 0(a0)
27; RV32IA-NEXT:    ret
28;
29; RV64I-LABEL: atomic_load_i8_unordered:
30; RV64I:       # %bb.0:
31; RV64I-NEXT:    addi sp, sp, -16
32; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
33; RV64I-NEXT:    li a1, 0
34; RV64I-NEXT:    call __atomic_load_1@plt
35; RV64I-NEXT:    slli a0, a0, 56
36; RV64I-NEXT:    srai a0, a0, 56
37; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
38; RV64I-NEXT:    addi sp, sp, 16
39; RV64I-NEXT:    ret
40;
41; RV64IA-LABEL: atomic_load_i8_unordered:
42; RV64IA:       # %bb.0:
43; RV64IA-NEXT:    lb a0, 0(a0)
44; RV64IA-NEXT:    ret
45  %1 = load atomic i8, i8* %a unordered, align 1
46  ret i8 %1
47}
48
49define signext i16 @atomic_load_i16_unordered(i16 *%a) nounwind {
50; RV32I-LABEL: atomic_load_i16_unordered:
51; RV32I:       # %bb.0:
52; RV32I-NEXT:    addi sp, sp, -16
53; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
54; RV32I-NEXT:    li a1, 0
55; RV32I-NEXT:    call __atomic_load_2@plt
56; RV32I-NEXT:    slli a0, a0, 16
57; RV32I-NEXT:    srai a0, a0, 16
58; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
59; RV32I-NEXT:    addi sp, sp, 16
60; RV32I-NEXT:    ret
61;
62; RV32IA-LABEL: atomic_load_i16_unordered:
63; RV32IA:       # %bb.0:
64; RV32IA-NEXT:    lh a0, 0(a0)
65; RV32IA-NEXT:    ret
66;
67; RV64I-LABEL: atomic_load_i16_unordered:
68; RV64I:       # %bb.0:
69; RV64I-NEXT:    addi sp, sp, -16
70; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
71; RV64I-NEXT:    li a1, 0
72; RV64I-NEXT:    call __atomic_load_2@plt
73; RV64I-NEXT:    slli a0, a0, 48
74; RV64I-NEXT:    srai a0, a0, 48
75; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
76; RV64I-NEXT:    addi sp, sp, 16
77; RV64I-NEXT:    ret
78;
79; RV64IA-LABEL: atomic_load_i16_unordered:
80; RV64IA:       # %bb.0:
81; RV64IA-NEXT:    lh a0, 0(a0)
82; RV64IA-NEXT:    ret
83  %1 = load atomic i16, i16* %a unordered, align 2
84  ret i16 %1
85}
86
87define signext i32 @atomic_load_i32_unordered(i32 *%a) nounwind {
88; RV32I-LABEL: atomic_load_i32_unordered:
89; RV32I:       # %bb.0:
90; RV32I-NEXT:    addi sp, sp, -16
91; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
92; RV32I-NEXT:    li a1, 0
93; RV32I-NEXT:    call __atomic_load_4@plt
94; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
95; RV32I-NEXT:    addi sp, sp, 16
96; RV32I-NEXT:    ret
97;
98; RV32IA-LABEL: atomic_load_i32_unordered:
99; RV32IA:       # %bb.0:
100; RV32IA-NEXT:    lw a0, 0(a0)
101; RV32IA-NEXT:    ret
102;
103; RV64I-LABEL: atomic_load_i32_unordered:
104; RV64I:       # %bb.0:
105; RV64I-NEXT:    addi sp, sp, -16
106; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
107; RV64I-NEXT:    li a1, 0
108; RV64I-NEXT:    call __atomic_load_4@plt
109; RV64I-NEXT:    sext.w a0, a0
110; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
111; RV64I-NEXT:    addi sp, sp, 16
112; RV64I-NEXT:    ret
113;
114; RV64IA-LABEL: atomic_load_i32_unordered:
115; RV64IA:       # %bb.0:
116; RV64IA-NEXT:    lw a0, 0(a0)
117; RV64IA-NEXT:    ret
118  %1 = load atomic i32, i32* %a unordered, align 4
119  ret i32 %1
120}
121
122
123define signext i8 @atomicrmw_xchg_i8_monotonic(i8* %a, i8 %b) nounwind {
124; RV32I-LABEL: atomicrmw_xchg_i8_monotonic:
125; RV32I:       # %bb.0:
126; RV32I-NEXT:    addi sp, sp, -16
127; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
128; RV32I-NEXT:    li a2, 0
129; RV32I-NEXT:    call __atomic_exchange_1@plt
130; RV32I-NEXT:    slli a0, a0, 24
131; RV32I-NEXT:    srai a0, a0, 24
132; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
133; RV32I-NEXT:    addi sp, sp, 16
134; RV32I-NEXT:    ret
135;
136; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic:
137; RV32IA:       # %bb.0:
138; RV32IA-NEXT:    andi a2, a0, -4
139; RV32IA-NEXT:    slli a0, a0, 3
140; RV32IA-NEXT:    li a3, 255
141; RV32IA-NEXT:    sll a3, a3, a0
142; RV32IA-NEXT:    andi a1, a1, 255
143; RV32IA-NEXT:    sll a1, a1, a0
144; RV32IA-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
145; RV32IA-NEXT:    lr.w a4, (a2)
146; RV32IA-NEXT:    mv a5, a1
147; RV32IA-NEXT:    xor a5, a4, a5
148; RV32IA-NEXT:    and a5, a5, a3
149; RV32IA-NEXT:    xor a5, a4, a5
150; RV32IA-NEXT:    sc.w a5, a5, (a2)
151; RV32IA-NEXT:    bnez a5, .LBB3_1
152; RV32IA-NEXT:  # %bb.2:
153; RV32IA-NEXT:    srl a0, a4, a0
154; RV32IA-NEXT:    slli a0, a0, 24
155; RV32IA-NEXT:    srai a0, a0, 24
156; RV32IA-NEXT:    ret
157;
158; RV64I-LABEL: atomicrmw_xchg_i8_monotonic:
159; RV64I:       # %bb.0:
160; RV64I-NEXT:    addi sp, sp, -16
161; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
162; RV64I-NEXT:    li a2, 0
163; RV64I-NEXT:    call __atomic_exchange_1@plt
164; RV64I-NEXT:    slli a0, a0, 56
165; RV64I-NEXT:    srai a0, a0, 56
166; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
167; RV64I-NEXT:    addi sp, sp, 16
168; RV64I-NEXT:    ret
169;
170; RV64IA-LABEL: atomicrmw_xchg_i8_monotonic:
171; RV64IA:       # %bb.0:
172; RV64IA-NEXT:    andi a2, a0, -4
173; RV64IA-NEXT:    slliw a0, a0, 3
174; RV64IA-NEXT:    li a3, 255
175; RV64IA-NEXT:    sllw a3, a3, a0
176; RV64IA-NEXT:    andi a1, a1, 255
177; RV64IA-NEXT:    sllw a1, a1, a0
178; RV64IA-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
179; RV64IA-NEXT:    lr.w a4, (a2)
180; RV64IA-NEXT:    mv a5, a1
181; RV64IA-NEXT:    xor a5, a4, a5
182; RV64IA-NEXT:    and a5, a5, a3
183; RV64IA-NEXT:    xor a5, a4, a5
184; RV64IA-NEXT:    sc.w a5, a5, (a2)
185; RV64IA-NEXT:    bnez a5, .LBB3_1
186; RV64IA-NEXT:  # %bb.2:
187; RV64IA-NEXT:    srlw a0, a4, a0
188; RV64IA-NEXT:    slli a0, a0, 56
189; RV64IA-NEXT:    srai a0, a0, 56
190; RV64IA-NEXT:    ret
191  %1 = atomicrmw xchg i8* %a, i8 %b monotonic
192  ret i8 %1
193}
194
195define signext i8 @atomicrmw_add_i8_monotonic(i8 *%a, i8 %b) nounwind {
196; RV32I-LABEL: atomicrmw_add_i8_monotonic:
197; RV32I:       # %bb.0:
198; RV32I-NEXT:    addi sp, sp, -16
199; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
200; RV32I-NEXT:    li a2, 0
201; RV32I-NEXT:    call __atomic_fetch_add_1@plt
202; RV32I-NEXT:    slli a0, a0, 24
203; RV32I-NEXT:    srai a0, a0, 24
204; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
205; RV32I-NEXT:    addi sp, sp, 16
206; RV32I-NEXT:    ret
207;
208; RV32IA-LABEL: atomicrmw_add_i8_monotonic:
209; RV32IA:       # %bb.0:
210; RV32IA-NEXT:    andi a2, a0, -4
211; RV32IA-NEXT:    slli a0, a0, 3
212; RV32IA-NEXT:    li a3, 255
213; RV32IA-NEXT:    sll a3, a3, a0
214; RV32IA-NEXT:    andi a1, a1, 255
215; RV32IA-NEXT:    sll a1, a1, a0
216; RV32IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
217; RV32IA-NEXT:    lr.w a4, (a2)
218; RV32IA-NEXT:    add a5, a4, a1
219; RV32IA-NEXT:    xor a5, a4, a5
220; RV32IA-NEXT:    and a5, a5, a3
221; RV32IA-NEXT:    xor a5, a4, a5
222; RV32IA-NEXT:    sc.w a5, a5, (a2)
223; RV32IA-NEXT:    bnez a5, .LBB4_1
224; RV32IA-NEXT:  # %bb.2:
225; RV32IA-NEXT:    srl a0, a4, a0
226; RV32IA-NEXT:    slli a0, a0, 24
227; RV32IA-NEXT:    srai a0, a0, 24
228; RV32IA-NEXT:    ret
229;
230; RV64I-LABEL: atomicrmw_add_i8_monotonic:
231; RV64I:       # %bb.0:
232; RV64I-NEXT:    addi sp, sp, -16
233; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
234; RV64I-NEXT:    li a2, 0
235; RV64I-NEXT:    call __atomic_fetch_add_1@plt
236; RV64I-NEXT:    slli a0, a0, 56
237; RV64I-NEXT:    srai a0, a0, 56
238; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
239; RV64I-NEXT:    addi sp, sp, 16
240; RV64I-NEXT:    ret
241;
242; RV64IA-LABEL: atomicrmw_add_i8_monotonic:
243; RV64IA:       # %bb.0:
244; RV64IA-NEXT:    andi a2, a0, -4
245; RV64IA-NEXT:    slliw a0, a0, 3
246; RV64IA-NEXT:    li a3, 255
247; RV64IA-NEXT:    sllw a3, a3, a0
248; RV64IA-NEXT:    andi a1, a1, 255
249; RV64IA-NEXT:    sllw a1, a1, a0
250; RV64IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
251; RV64IA-NEXT:    lr.w a4, (a2)
252; RV64IA-NEXT:    add a5, a4, a1
253; RV64IA-NEXT:    xor a5, a4, a5
254; RV64IA-NEXT:    and a5, a5, a3
255; RV64IA-NEXT:    xor a5, a4, a5
256; RV64IA-NEXT:    sc.w a5, a5, (a2)
257; RV64IA-NEXT:    bnez a5, .LBB4_1
258; RV64IA-NEXT:  # %bb.2:
259; RV64IA-NEXT:    srlw a0, a4, a0
260; RV64IA-NEXT:    slli a0, a0, 56
261; RV64IA-NEXT:    srai a0, a0, 56
262; RV64IA-NEXT:    ret
263  %1 = atomicrmw add i8* %a, i8 %b monotonic
264  ret i8 %1
265}
266
267define signext i8 @atomicrmw_sub_i8_monotonic(i8* %a, i8 %b) nounwind {
268; RV32I-LABEL: atomicrmw_sub_i8_monotonic:
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, 0
273; RV32I-NEXT:    call __atomic_fetch_sub_1@plt
274; RV32I-NEXT:    slli a0, a0, 24
275; RV32I-NEXT:    srai a0, a0, 24
276; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
277; RV32I-NEXT:    addi sp, sp, 16
278; RV32I-NEXT:    ret
279;
280; RV32IA-LABEL: atomicrmw_sub_i8_monotonic:
281; RV32IA:       # %bb.0:
282; RV32IA-NEXT:    andi a2, a0, -4
283; RV32IA-NEXT:    slli a0, a0, 3
284; RV32IA-NEXT:    li a3, 255
285; RV32IA-NEXT:    sll a3, a3, a0
286; RV32IA-NEXT:    andi a1, a1, 255
287; RV32IA-NEXT:    sll a1, a1, a0
288; RV32IA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
289; RV32IA-NEXT:    lr.w a4, (a2)
290; RV32IA-NEXT:    sub a5, a4, a1
291; RV32IA-NEXT:    xor a5, a4, a5
292; RV32IA-NEXT:    and a5, a5, a3
293; RV32IA-NEXT:    xor a5, a4, a5
294; RV32IA-NEXT:    sc.w a5, a5, (a2)
295; RV32IA-NEXT:    bnez a5, .LBB5_1
296; RV32IA-NEXT:  # %bb.2:
297; RV32IA-NEXT:    srl a0, a4, a0
298; RV32IA-NEXT:    slli a0, a0, 24
299; RV32IA-NEXT:    srai a0, a0, 24
300; RV32IA-NEXT:    ret
301;
302; RV64I-LABEL: atomicrmw_sub_i8_monotonic:
303; RV64I:       # %bb.0:
304; RV64I-NEXT:    addi sp, sp, -16
305; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
306; RV64I-NEXT:    li a2, 0
307; RV64I-NEXT:    call __atomic_fetch_sub_1@plt
308; RV64I-NEXT:    slli a0, a0, 56
309; RV64I-NEXT:    srai a0, a0, 56
310; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
311; RV64I-NEXT:    addi sp, sp, 16
312; RV64I-NEXT:    ret
313;
314; RV64IA-LABEL: atomicrmw_sub_i8_monotonic:
315; RV64IA:       # %bb.0:
316; RV64IA-NEXT:    andi a2, a0, -4
317; RV64IA-NEXT:    slliw a0, a0, 3
318; RV64IA-NEXT:    li a3, 255
319; RV64IA-NEXT:    sllw a3, a3, a0
320; RV64IA-NEXT:    andi a1, a1, 255
321; RV64IA-NEXT:    sllw a1, a1, a0
322; RV64IA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
323; RV64IA-NEXT:    lr.w a4, (a2)
324; RV64IA-NEXT:    sub a5, a4, a1
325; RV64IA-NEXT:    xor a5, a4, a5
326; RV64IA-NEXT:    and a5, a5, a3
327; RV64IA-NEXT:    xor a5, a4, a5
328; RV64IA-NEXT:    sc.w a5, a5, (a2)
329; RV64IA-NEXT:    bnez a5, .LBB5_1
330; RV64IA-NEXT:  # %bb.2:
331; RV64IA-NEXT:    srlw a0, a4, a0
332; RV64IA-NEXT:    slli a0, a0, 56
333; RV64IA-NEXT:    srai a0, a0, 56
334; RV64IA-NEXT:    ret
335  %1 = atomicrmw sub i8* %a, i8 %b monotonic
336  ret i8 %1
337}
338
339define signext i8 @atomicrmw_and_i8_monotonic(i8 *%a, i8 %b) nounwind {
340; RV32I-LABEL: atomicrmw_and_i8_monotonic:
341; RV32I:       # %bb.0:
342; RV32I-NEXT:    addi sp, sp, -16
343; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
344; RV32I-NEXT:    li a2, 0
345; RV32I-NEXT:    call __atomic_fetch_and_1@plt
346; RV32I-NEXT:    slli a0, a0, 24
347; RV32I-NEXT:    srai a0, a0, 24
348; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
349; RV32I-NEXT:    addi sp, sp, 16
350; RV32I-NEXT:    ret
351;
352; RV32IA-LABEL: atomicrmw_and_i8_monotonic:
353; RV32IA:       # %bb.0:
354; RV32IA-NEXT:    andi a2, a0, -4
355; RV32IA-NEXT:    slli a0, a0, 3
356; RV32IA-NEXT:    li a3, 255
357; RV32IA-NEXT:    sll a3, a3, a0
358; RV32IA-NEXT:    not a3, a3
359; RV32IA-NEXT:    andi a1, a1, 255
360; RV32IA-NEXT:    sll a1, a1, a0
361; RV32IA-NEXT:    or a1, a3, a1
362; RV32IA-NEXT:    amoand.w a1, a1, (a2)
363; RV32IA-NEXT:    srl a0, a1, a0
364; RV32IA-NEXT:    slli a0, a0, 24
365; RV32IA-NEXT:    srai a0, a0, 24
366; RV32IA-NEXT:    ret
367;
368; RV64I-LABEL: atomicrmw_and_i8_monotonic:
369; RV64I:       # %bb.0:
370; RV64I-NEXT:    addi sp, sp, -16
371; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
372; RV64I-NEXT:    li a2, 0
373; RV64I-NEXT:    call __atomic_fetch_and_1@plt
374; RV64I-NEXT:    slli a0, a0, 56
375; RV64I-NEXT:    srai a0, a0, 56
376; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
377; RV64I-NEXT:    addi sp, sp, 16
378; RV64I-NEXT:    ret
379;
380; RV64IA-LABEL: atomicrmw_and_i8_monotonic:
381; RV64IA:       # %bb.0:
382; RV64IA-NEXT:    andi a2, a0, -4
383; RV64IA-NEXT:    slliw a0, a0, 3
384; RV64IA-NEXT:    li a3, 255
385; RV64IA-NEXT:    sllw a3, a3, a0
386; RV64IA-NEXT:    not a3, a3
387; RV64IA-NEXT:    andi a1, a1, 255
388; RV64IA-NEXT:    sllw a1, a1, a0
389; RV64IA-NEXT:    or a1, a3, a1
390; RV64IA-NEXT:    amoand.w a1, a1, (a2)
391; RV64IA-NEXT:    srlw a0, a1, a0
392; RV64IA-NEXT:    slli a0, a0, 56
393; RV64IA-NEXT:    srai a0, a0, 56
394; RV64IA-NEXT:    ret
395  %1 = atomicrmw and i8* %a, i8 %b monotonic
396  ret i8 %1
397}
398
399define signext i8 @atomicrmw_nand_i8_monotonic(i8* %a, i8 %b) nounwind {
400; RV32I-LABEL: atomicrmw_nand_i8_monotonic:
401; RV32I:       # %bb.0:
402; RV32I-NEXT:    addi sp, sp, -16
403; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
404; RV32I-NEXT:    li a2, 0
405; RV32I-NEXT:    call __atomic_fetch_nand_1@plt
406; RV32I-NEXT:    slli a0, a0, 24
407; RV32I-NEXT:    srai a0, a0, 24
408; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
409; RV32I-NEXT:    addi sp, sp, 16
410; RV32I-NEXT:    ret
411;
412; RV32IA-LABEL: atomicrmw_nand_i8_monotonic:
413; RV32IA:       # %bb.0:
414; RV32IA-NEXT:    andi a2, a0, -4
415; RV32IA-NEXT:    slli a0, a0, 3
416; RV32IA-NEXT:    li a3, 255
417; RV32IA-NEXT:    sll a3, a3, a0
418; RV32IA-NEXT:    andi a1, a1, 255
419; RV32IA-NEXT:    sll a1, a1, a0
420; RV32IA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
421; RV32IA-NEXT:    lr.w a4, (a2)
422; RV32IA-NEXT:    and a5, a4, a1
423; RV32IA-NEXT:    not a5, a5
424; RV32IA-NEXT:    xor a5, a4, a5
425; RV32IA-NEXT:    and a5, a5, a3
426; RV32IA-NEXT:    xor a5, a4, a5
427; RV32IA-NEXT:    sc.w a5, a5, (a2)
428; RV32IA-NEXT:    bnez a5, .LBB7_1
429; RV32IA-NEXT:  # %bb.2:
430; RV32IA-NEXT:    srl a0, a4, a0
431; RV32IA-NEXT:    slli a0, a0, 24
432; RV32IA-NEXT:    srai a0, a0, 24
433; RV32IA-NEXT:    ret
434;
435; RV64I-LABEL: atomicrmw_nand_i8_monotonic:
436; RV64I:       # %bb.0:
437; RV64I-NEXT:    addi sp, sp, -16
438; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
439; RV64I-NEXT:    li a2, 0
440; RV64I-NEXT:    call __atomic_fetch_nand_1@plt
441; RV64I-NEXT:    slli a0, a0, 56
442; RV64I-NEXT:    srai a0, a0, 56
443; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
444; RV64I-NEXT:    addi sp, sp, 16
445; RV64I-NEXT:    ret
446;
447; RV64IA-LABEL: atomicrmw_nand_i8_monotonic:
448; RV64IA:       # %bb.0:
449; RV64IA-NEXT:    andi a2, a0, -4
450; RV64IA-NEXT:    slliw a0, a0, 3
451; RV64IA-NEXT:    li a3, 255
452; RV64IA-NEXT:    sllw a3, a3, a0
453; RV64IA-NEXT:    andi a1, a1, 255
454; RV64IA-NEXT:    sllw a1, a1, a0
455; RV64IA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
456; RV64IA-NEXT:    lr.w a4, (a2)
457; RV64IA-NEXT:    and a5, a4, a1
458; RV64IA-NEXT:    not a5, a5
459; RV64IA-NEXT:    xor a5, a4, a5
460; RV64IA-NEXT:    and a5, a5, a3
461; RV64IA-NEXT:    xor a5, a4, a5
462; RV64IA-NEXT:    sc.w a5, a5, (a2)
463; RV64IA-NEXT:    bnez a5, .LBB7_1
464; RV64IA-NEXT:  # %bb.2:
465; RV64IA-NEXT:    srlw a0, a4, a0
466; RV64IA-NEXT:    slli a0, a0, 56
467; RV64IA-NEXT:    srai a0, a0, 56
468; RV64IA-NEXT:    ret
469  %1 = atomicrmw nand i8* %a, i8 %b monotonic
470  ret i8 %1
471}
472
473define signext i8 @atomicrmw_or_i8_monotonic(i8 *%a, i8 %b) nounwind {
474; RV32I-LABEL: atomicrmw_or_i8_monotonic:
475; RV32I:       # %bb.0:
476; RV32I-NEXT:    addi sp, sp, -16
477; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
478; RV32I-NEXT:    li a2, 0
479; RV32I-NEXT:    call __atomic_fetch_or_1@plt
480; RV32I-NEXT:    slli a0, a0, 24
481; RV32I-NEXT:    srai a0, a0, 24
482; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
483; RV32I-NEXT:    addi sp, sp, 16
484; RV32I-NEXT:    ret
485;
486; RV32IA-LABEL: atomicrmw_or_i8_monotonic:
487; RV32IA:       # %bb.0:
488; RV32IA-NEXT:    andi a2, a0, -4
489; RV32IA-NEXT:    slli a0, a0, 3
490; RV32IA-NEXT:    andi a1, a1, 255
491; RV32IA-NEXT:    sll a1, a1, a0
492; RV32IA-NEXT:    amoor.w a1, a1, (a2)
493; RV32IA-NEXT:    srl a0, a1, a0
494; RV32IA-NEXT:    slli a0, a0, 24
495; RV32IA-NEXT:    srai a0, a0, 24
496; RV32IA-NEXT:    ret
497;
498; RV64I-LABEL: atomicrmw_or_i8_monotonic:
499; RV64I:       # %bb.0:
500; RV64I-NEXT:    addi sp, sp, -16
501; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
502; RV64I-NEXT:    li a2, 0
503; RV64I-NEXT:    call __atomic_fetch_or_1@plt
504; RV64I-NEXT:    slli a0, a0, 56
505; RV64I-NEXT:    srai a0, a0, 56
506; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
507; RV64I-NEXT:    addi sp, sp, 16
508; RV64I-NEXT:    ret
509;
510; RV64IA-LABEL: atomicrmw_or_i8_monotonic:
511; RV64IA:       # %bb.0:
512; RV64IA-NEXT:    andi a2, a0, -4
513; RV64IA-NEXT:    slliw a0, a0, 3
514; RV64IA-NEXT:    andi a1, a1, 255
515; RV64IA-NEXT:    sllw a1, a1, a0
516; RV64IA-NEXT:    amoor.w a1, a1, (a2)
517; RV64IA-NEXT:    srlw a0, a1, a0
518; RV64IA-NEXT:    slli a0, a0, 56
519; RV64IA-NEXT:    srai a0, a0, 56
520; RV64IA-NEXT:    ret
521  %1 = atomicrmw or i8* %a, i8 %b monotonic
522  ret i8 %1
523}
524
525define signext i8 @atomicrmw_xor_i8_monotonic(i8 *%a, i8 %b) nounwind {
526; RV32I-LABEL: atomicrmw_xor_i8_monotonic:
527; RV32I:       # %bb.0:
528; RV32I-NEXT:    addi sp, sp, -16
529; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
530; RV32I-NEXT:    li a2, 0
531; RV32I-NEXT:    call __atomic_fetch_xor_1@plt
532; RV32I-NEXT:    slli a0, a0, 24
533; RV32I-NEXT:    srai a0, a0, 24
534; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
535; RV32I-NEXT:    addi sp, sp, 16
536; RV32I-NEXT:    ret
537;
538; RV32IA-LABEL: atomicrmw_xor_i8_monotonic:
539; RV32IA:       # %bb.0:
540; RV32IA-NEXT:    andi a2, a0, -4
541; RV32IA-NEXT:    slli a0, a0, 3
542; RV32IA-NEXT:    andi a1, a1, 255
543; RV32IA-NEXT:    sll a1, a1, a0
544; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
545; RV32IA-NEXT:    srl a0, a1, a0
546; RV32IA-NEXT:    slli a0, a0, 24
547; RV32IA-NEXT:    srai a0, a0, 24
548; RV32IA-NEXT:    ret
549;
550; RV64I-LABEL: atomicrmw_xor_i8_monotonic:
551; RV64I:       # %bb.0:
552; RV64I-NEXT:    addi sp, sp, -16
553; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
554; RV64I-NEXT:    li a2, 0
555; RV64I-NEXT:    call __atomic_fetch_xor_1@plt
556; RV64I-NEXT:    slli a0, a0, 56
557; RV64I-NEXT:    srai a0, a0, 56
558; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
559; RV64I-NEXT:    addi sp, sp, 16
560; RV64I-NEXT:    ret
561;
562; RV64IA-LABEL: atomicrmw_xor_i8_monotonic:
563; RV64IA:       # %bb.0:
564; RV64IA-NEXT:    andi a2, a0, -4
565; RV64IA-NEXT:    slliw a0, a0, 3
566; RV64IA-NEXT:    andi a1, a1, 255
567; RV64IA-NEXT:    sllw a1, a1, a0
568; RV64IA-NEXT:    amoxor.w a1, a1, (a2)
569; RV64IA-NEXT:    srlw a0, a1, a0
570; RV64IA-NEXT:    slli a0, a0, 56
571; RV64IA-NEXT:    srai a0, a0, 56
572; RV64IA-NEXT:    ret
573  %1 = atomicrmw xor i8* %a, i8 %b monotonic
574  ret i8 %1
575}
576
577define signext i8 @atomicrmw_max_i8_monotonic(i8 *%a, i8 %b) nounwind {
578; RV32I-LABEL: atomicrmw_max_i8_monotonic:
579; RV32I:       # %bb.0:
580; RV32I-NEXT:    addi sp, sp, -32
581; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
582; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
583; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
584; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
585; RV32I-NEXT:    mv s0, a0
586; RV32I-NEXT:    lbu a3, 0(a0)
587; RV32I-NEXT:    mv s2, a1
588; RV32I-NEXT:    slli a0, a1, 24
589; RV32I-NEXT:    srai s1, a0, 24
590; RV32I-NEXT:    j .LBB10_2
591; RV32I-NEXT:  .LBB10_1: # %atomicrmw.start
592; RV32I-NEXT:    # in Loop: Header=BB10_2 Depth=1
593; RV32I-NEXT:    sb a3, 15(sp)
594; RV32I-NEXT:    addi a1, sp, 15
595; RV32I-NEXT:    mv a0, s0
596; RV32I-NEXT:    li a3, 0
597; RV32I-NEXT:    li a4, 0
598; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
599; RV32I-NEXT:    lb a3, 15(sp)
600; RV32I-NEXT:    bnez a0, .LBB10_4
601; RV32I-NEXT:  .LBB10_2: # %atomicrmw.start
602; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
603; RV32I-NEXT:    slli a0, a3, 24
604; RV32I-NEXT:    srai a0, a0, 24
605; RV32I-NEXT:    mv a2, a3
606; RV32I-NEXT:    blt s1, a0, .LBB10_1
607; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
608; RV32I-NEXT:    # in Loop: Header=BB10_2 Depth=1
609; RV32I-NEXT:    mv a2, s2
610; RV32I-NEXT:    j .LBB10_1
611; RV32I-NEXT:  .LBB10_4: # %atomicrmw.end
612; RV32I-NEXT:    slli a0, a3, 24
613; RV32I-NEXT:    srai a0, a0, 24
614; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
615; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
616; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
617; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
618; RV32I-NEXT:    addi sp, sp, 32
619; RV32I-NEXT:    ret
620;
621; RV32IA-LABEL: atomicrmw_max_i8_monotonic:
622; RV32IA:       # %bb.0:
623; RV32IA-NEXT:    andi a6, a0, -4
624; RV32IA-NEXT:    slli a0, a0, 3
625; RV32IA-NEXT:    andi a3, a0, 24
626; RV32IA-NEXT:    li a4, 255
627; RV32IA-NEXT:    sll a7, a4, a0
628; RV32IA-NEXT:    slli a1, a1, 24
629; RV32IA-NEXT:    srai a1, a1, 24
630; RV32IA-NEXT:    sll a1, a1, a0
631; RV32IA-NEXT:    li a5, 24
632; RV32IA-NEXT:    sub a3, a5, a3
633; RV32IA-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
634; RV32IA-NEXT:    lr.w a5, (a6)
635; RV32IA-NEXT:    and a4, a5, a7
636; RV32IA-NEXT:    mv a2, a5
637; RV32IA-NEXT:    sll a4, a4, a3
638; RV32IA-NEXT:    sra a4, a4, a3
639; RV32IA-NEXT:    bge a4, a1, .LBB10_3
640; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB10_1 Depth=1
641; RV32IA-NEXT:    xor a2, a5, a1
642; RV32IA-NEXT:    and a2, a2, a7
643; RV32IA-NEXT:    xor a2, a5, a2
644; RV32IA-NEXT:  .LBB10_3: # in Loop: Header=BB10_1 Depth=1
645; RV32IA-NEXT:    sc.w a2, a2, (a6)
646; RV32IA-NEXT:    bnez a2, .LBB10_1
647; RV32IA-NEXT:  # %bb.4:
648; RV32IA-NEXT:    srl a0, a5, a0
649; RV32IA-NEXT:    slli a0, a0, 24
650; RV32IA-NEXT:    srai a0, a0, 24
651; RV32IA-NEXT:    ret
652;
653; RV64I-LABEL: atomicrmw_max_i8_monotonic:
654; RV64I:       # %bb.0:
655; RV64I-NEXT:    addi sp, sp, -48
656; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
657; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
658; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
659; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
660; RV64I-NEXT:    mv s0, a0
661; RV64I-NEXT:    lbu a3, 0(a0)
662; RV64I-NEXT:    mv s2, a1
663; RV64I-NEXT:    slli a0, a1, 56
664; RV64I-NEXT:    srai s1, a0, 56
665; RV64I-NEXT:    j .LBB10_2
666; RV64I-NEXT:  .LBB10_1: # %atomicrmw.start
667; RV64I-NEXT:    # in Loop: Header=BB10_2 Depth=1
668; RV64I-NEXT:    sb a3, 15(sp)
669; RV64I-NEXT:    addi a1, sp, 15
670; RV64I-NEXT:    mv a0, s0
671; RV64I-NEXT:    li a3, 0
672; RV64I-NEXT:    li a4, 0
673; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
674; RV64I-NEXT:    lb a3, 15(sp)
675; RV64I-NEXT:    bnez a0, .LBB10_4
676; RV64I-NEXT:  .LBB10_2: # %atomicrmw.start
677; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
678; RV64I-NEXT:    slli a0, a3, 56
679; RV64I-NEXT:    srai a0, a0, 56
680; RV64I-NEXT:    mv a2, a3
681; RV64I-NEXT:    blt s1, a0, .LBB10_1
682; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
683; RV64I-NEXT:    # in Loop: Header=BB10_2 Depth=1
684; RV64I-NEXT:    mv a2, s2
685; RV64I-NEXT:    j .LBB10_1
686; RV64I-NEXT:  .LBB10_4: # %atomicrmw.end
687; RV64I-NEXT:    slli a0, a3, 56
688; RV64I-NEXT:    srai a0, a0, 56
689; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
690; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
691; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
692; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
693; RV64I-NEXT:    addi sp, sp, 48
694; RV64I-NEXT:    ret
695;
696; RV64IA-LABEL: atomicrmw_max_i8_monotonic:
697; RV64IA:       # %bb.0:
698; RV64IA-NEXT:    andi a6, a0, -4
699; RV64IA-NEXT:    slliw a0, a0, 3
700; RV64IA-NEXT:    andi a3, a0, 24
701; RV64IA-NEXT:    li a4, 255
702; RV64IA-NEXT:    sllw a7, a4, a0
703; RV64IA-NEXT:    slli a1, a1, 56
704; RV64IA-NEXT:    srai a1, a1, 56
705; RV64IA-NEXT:    sllw a1, a1, a0
706; RV64IA-NEXT:    li a5, 56
707; RV64IA-NEXT:    sub a3, a5, a3
708; RV64IA-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
709; RV64IA-NEXT:    lr.w a5, (a6)
710; RV64IA-NEXT:    and a4, a5, a7
711; RV64IA-NEXT:    mv a2, a5
712; RV64IA-NEXT:    sll a4, a4, a3
713; RV64IA-NEXT:    sra a4, a4, a3
714; RV64IA-NEXT:    bge a4, a1, .LBB10_3
715; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB10_1 Depth=1
716; RV64IA-NEXT:    xor a2, a5, a1
717; RV64IA-NEXT:    and a2, a2, a7
718; RV64IA-NEXT:    xor a2, a5, a2
719; RV64IA-NEXT:  .LBB10_3: # in Loop: Header=BB10_1 Depth=1
720; RV64IA-NEXT:    sc.w a2, a2, (a6)
721; RV64IA-NEXT:    bnez a2, .LBB10_1
722; RV64IA-NEXT:  # %bb.4:
723; RV64IA-NEXT:    srlw a0, a5, a0
724; RV64IA-NEXT:    slli a0, a0, 56
725; RV64IA-NEXT:    srai a0, a0, 56
726; RV64IA-NEXT:    ret
727  %1 = atomicrmw max i8* %a, i8 %b monotonic
728  ret i8 %1
729}
730
731define signext i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind {
732; RV32I-LABEL: atomicrmw_min_i8_monotonic:
733; RV32I:       # %bb.0:
734; RV32I-NEXT:    addi sp, sp, -32
735; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
736; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
737; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
738; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
739; RV32I-NEXT:    mv s0, a0
740; RV32I-NEXT:    lbu a3, 0(a0)
741; RV32I-NEXT:    mv s2, a1
742; RV32I-NEXT:    slli a0, a1, 24
743; RV32I-NEXT:    srai s1, a0, 24
744; RV32I-NEXT:    j .LBB11_2
745; RV32I-NEXT:  .LBB11_1: # %atomicrmw.start
746; RV32I-NEXT:    # in Loop: Header=BB11_2 Depth=1
747; RV32I-NEXT:    sb a3, 15(sp)
748; RV32I-NEXT:    addi a1, sp, 15
749; RV32I-NEXT:    mv a0, s0
750; RV32I-NEXT:    li a3, 0
751; RV32I-NEXT:    li a4, 0
752; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
753; RV32I-NEXT:    lb a3, 15(sp)
754; RV32I-NEXT:    bnez a0, .LBB11_4
755; RV32I-NEXT:  .LBB11_2: # %atomicrmw.start
756; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
757; RV32I-NEXT:    slli a0, a3, 24
758; RV32I-NEXT:    srai a0, a0, 24
759; RV32I-NEXT:    mv a2, a3
760; RV32I-NEXT:    bge s1, a0, .LBB11_1
761; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
762; RV32I-NEXT:    # in Loop: Header=BB11_2 Depth=1
763; RV32I-NEXT:    mv a2, s2
764; RV32I-NEXT:    j .LBB11_1
765; RV32I-NEXT:  .LBB11_4: # %atomicrmw.end
766; RV32I-NEXT:    slli a0, a3, 24
767; RV32I-NEXT:    srai a0, a0, 24
768; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
769; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
770; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
771; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
772; RV32I-NEXT:    addi sp, sp, 32
773; RV32I-NEXT:    ret
774;
775; RV32IA-LABEL: atomicrmw_min_i8_monotonic:
776; RV32IA:       # %bb.0:
777; RV32IA-NEXT:    andi a6, a0, -4
778; RV32IA-NEXT:    slli a0, a0, 3
779; RV32IA-NEXT:    andi a3, a0, 24
780; RV32IA-NEXT:    li a4, 255
781; RV32IA-NEXT:    sll a7, a4, a0
782; RV32IA-NEXT:    slli a1, a1, 24
783; RV32IA-NEXT:    srai a1, a1, 24
784; RV32IA-NEXT:    sll a1, a1, a0
785; RV32IA-NEXT:    li a5, 24
786; RV32IA-NEXT:    sub a3, a5, a3
787; RV32IA-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
788; RV32IA-NEXT:    lr.w a5, (a6)
789; RV32IA-NEXT:    and a4, a5, a7
790; RV32IA-NEXT:    mv a2, a5
791; RV32IA-NEXT:    sll a4, a4, a3
792; RV32IA-NEXT:    sra a4, a4, a3
793; RV32IA-NEXT:    bge a1, a4, .LBB11_3
794; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB11_1 Depth=1
795; RV32IA-NEXT:    xor a2, a5, a1
796; RV32IA-NEXT:    and a2, a2, a7
797; RV32IA-NEXT:    xor a2, a5, a2
798; RV32IA-NEXT:  .LBB11_3: # in Loop: Header=BB11_1 Depth=1
799; RV32IA-NEXT:    sc.w a2, a2, (a6)
800; RV32IA-NEXT:    bnez a2, .LBB11_1
801; RV32IA-NEXT:  # %bb.4:
802; RV32IA-NEXT:    srl a0, a5, a0
803; RV32IA-NEXT:    slli a0, a0, 24
804; RV32IA-NEXT:    srai a0, a0, 24
805; RV32IA-NEXT:    ret
806;
807; RV64I-LABEL: atomicrmw_min_i8_monotonic:
808; RV64I:       # %bb.0:
809; RV64I-NEXT:    addi sp, sp, -48
810; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
811; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
812; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
813; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
814; RV64I-NEXT:    mv s0, a0
815; RV64I-NEXT:    lbu a3, 0(a0)
816; RV64I-NEXT:    mv s2, a1
817; RV64I-NEXT:    slli a0, a1, 56
818; RV64I-NEXT:    srai s1, a0, 56
819; RV64I-NEXT:    j .LBB11_2
820; RV64I-NEXT:  .LBB11_1: # %atomicrmw.start
821; RV64I-NEXT:    # in Loop: Header=BB11_2 Depth=1
822; RV64I-NEXT:    sb a3, 15(sp)
823; RV64I-NEXT:    addi a1, sp, 15
824; RV64I-NEXT:    mv a0, s0
825; RV64I-NEXT:    li a3, 0
826; RV64I-NEXT:    li a4, 0
827; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
828; RV64I-NEXT:    lb a3, 15(sp)
829; RV64I-NEXT:    bnez a0, .LBB11_4
830; RV64I-NEXT:  .LBB11_2: # %atomicrmw.start
831; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
832; RV64I-NEXT:    slli a0, a3, 56
833; RV64I-NEXT:    srai a0, a0, 56
834; RV64I-NEXT:    mv a2, a3
835; RV64I-NEXT:    bge s1, a0, .LBB11_1
836; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
837; RV64I-NEXT:    # in Loop: Header=BB11_2 Depth=1
838; RV64I-NEXT:    mv a2, s2
839; RV64I-NEXT:    j .LBB11_1
840; RV64I-NEXT:  .LBB11_4: # %atomicrmw.end
841; RV64I-NEXT:    slli a0, a3, 56
842; RV64I-NEXT:    srai a0, a0, 56
843; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
844; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
845; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
846; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
847; RV64I-NEXT:    addi sp, sp, 48
848; RV64I-NEXT:    ret
849;
850; RV64IA-LABEL: atomicrmw_min_i8_monotonic:
851; RV64IA:       # %bb.0:
852; RV64IA-NEXT:    andi a6, a0, -4
853; RV64IA-NEXT:    slliw a0, a0, 3
854; RV64IA-NEXT:    andi a3, a0, 24
855; RV64IA-NEXT:    li a4, 255
856; RV64IA-NEXT:    sllw a7, a4, a0
857; RV64IA-NEXT:    slli a1, a1, 56
858; RV64IA-NEXT:    srai a1, a1, 56
859; RV64IA-NEXT:    sllw a1, a1, a0
860; RV64IA-NEXT:    li a5, 56
861; RV64IA-NEXT:    sub a3, a5, a3
862; RV64IA-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
863; RV64IA-NEXT:    lr.w a5, (a6)
864; RV64IA-NEXT:    and a4, a5, a7
865; RV64IA-NEXT:    mv a2, a5
866; RV64IA-NEXT:    sll a4, a4, a3
867; RV64IA-NEXT:    sra a4, a4, a3
868; RV64IA-NEXT:    bge a1, a4, .LBB11_3
869; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB11_1 Depth=1
870; RV64IA-NEXT:    xor a2, a5, a1
871; RV64IA-NEXT:    and a2, a2, a7
872; RV64IA-NEXT:    xor a2, a5, a2
873; RV64IA-NEXT:  .LBB11_3: # in Loop: Header=BB11_1 Depth=1
874; RV64IA-NEXT:    sc.w a2, a2, (a6)
875; RV64IA-NEXT:    bnez a2, .LBB11_1
876; RV64IA-NEXT:  # %bb.4:
877; RV64IA-NEXT:    srlw a0, a5, a0
878; RV64IA-NEXT:    slli a0, a0, 56
879; RV64IA-NEXT:    srai a0, a0, 56
880; RV64IA-NEXT:    ret
881  %1 = atomicrmw min i8* %a, i8 %b monotonic
882  ret i8 %1
883}
884
885define signext i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind {
886; RV32I-LABEL: atomicrmw_umax_i8_monotonic:
887; RV32I:       # %bb.0:
888; RV32I-NEXT:    addi sp, sp, -32
889; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
890; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
891; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
892; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
893; RV32I-NEXT:    mv s0, a0
894; RV32I-NEXT:    lbu a3, 0(a0)
895; RV32I-NEXT:    mv s2, a1
896; RV32I-NEXT:    andi s1, a1, 255
897; RV32I-NEXT:    j .LBB12_2
898; RV32I-NEXT:  .LBB12_1: # %atomicrmw.start
899; RV32I-NEXT:    # in Loop: Header=BB12_2 Depth=1
900; RV32I-NEXT:    sb a3, 15(sp)
901; RV32I-NEXT:    addi a1, sp, 15
902; RV32I-NEXT:    mv a0, s0
903; RV32I-NEXT:    li a3, 0
904; RV32I-NEXT:    li a4, 0
905; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
906; RV32I-NEXT:    lb a3, 15(sp)
907; RV32I-NEXT:    bnez a0, .LBB12_4
908; RV32I-NEXT:  .LBB12_2: # %atomicrmw.start
909; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
910; RV32I-NEXT:    andi a0, a3, 255
911; RV32I-NEXT:    mv a2, a3
912; RV32I-NEXT:    bltu s1, a0, .LBB12_1
913; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
914; RV32I-NEXT:    # in Loop: Header=BB12_2 Depth=1
915; RV32I-NEXT:    mv a2, s2
916; RV32I-NEXT:    j .LBB12_1
917; RV32I-NEXT:  .LBB12_4: # %atomicrmw.end
918; RV32I-NEXT:    slli a0, a3, 24
919; RV32I-NEXT:    srai a0, a0, 24
920; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
921; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
922; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
923; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
924; RV32I-NEXT:    addi sp, sp, 32
925; RV32I-NEXT:    ret
926;
927; RV32IA-LABEL: atomicrmw_umax_i8_monotonic:
928; RV32IA:       # %bb.0:
929; RV32IA-NEXT:    andi a6, a0, -4
930; RV32IA-NEXT:    slli a0, a0, 3
931; RV32IA-NEXT:    li a3, 255
932; RV32IA-NEXT:    sll a3, a3, a0
933; RV32IA-NEXT:    andi a1, a1, 255
934; RV32IA-NEXT:    sll a1, a1, a0
935; RV32IA-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
936; RV32IA-NEXT:    lr.w a4, (a6)
937; RV32IA-NEXT:    and a2, a4, a3
938; RV32IA-NEXT:    mv a5, a4
939; RV32IA-NEXT:    bgeu a2, a1, .LBB12_3
940; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB12_1 Depth=1
941; RV32IA-NEXT:    xor a5, a4, a1
942; RV32IA-NEXT:    and a5, a5, a3
943; RV32IA-NEXT:    xor a5, a4, a5
944; RV32IA-NEXT:  .LBB12_3: # in Loop: Header=BB12_1 Depth=1
945; RV32IA-NEXT:    sc.w a5, a5, (a6)
946; RV32IA-NEXT:    bnez a5, .LBB12_1
947; RV32IA-NEXT:  # %bb.4:
948; RV32IA-NEXT:    srl a0, a4, a0
949; RV32IA-NEXT:    slli a0, a0, 24
950; RV32IA-NEXT:    srai a0, a0, 24
951; RV32IA-NEXT:    ret
952;
953; RV64I-LABEL: atomicrmw_umax_i8_monotonic:
954; RV64I:       # %bb.0:
955; RV64I-NEXT:    addi sp, sp, -48
956; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
957; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
958; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
959; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
960; RV64I-NEXT:    mv s0, a0
961; RV64I-NEXT:    lbu a3, 0(a0)
962; RV64I-NEXT:    mv s2, a1
963; RV64I-NEXT:    andi s1, a1, 255
964; RV64I-NEXT:    j .LBB12_2
965; RV64I-NEXT:  .LBB12_1: # %atomicrmw.start
966; RV64I-NEXT:    # in Loop: Header=BB12_2 Depth=1
967; RV64I-NEXT:    sb a3, 15(sp)
968; RV64I-NEXT:    addi a1, sp, 15
969; RV64I-NEXT:    mv a0, s0
970; RV64I-NEXT:    li a3, 0
971; RV64I-NEXT:    li a4, 0
972; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
973; RV64I-NEXT:    lb a3, 15(sp)
974; RV64I-NEXT:    bnez a0, .LBB12_4
975; RV64I-NEXT:  .LBB12_2: # %atomicrmw.start
976; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
977; RV64I-NEXT:    andi a0, a3, 255
978; RV64I-NEXT:    mv a2, a3
979; RV64I-NEXT:    bltu s1, a0, .LBB12_1
980; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
981; RV64I-NEXT:    # in Loop: Header=BB12_2 Depth=1
982; RV64I-NEXT:    mv a2, s2
983; RV64I-NEXT:    j .LBB12_1
984; RV64I-NEXT:  .LBB12_4: # %atomicrmw.end
985; RV64I-NEXT:    slli a0, a3, 56
986; RV64I-NEXT:    srai a0, a0, 56
987; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
988; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
989; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
990; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
991; RV64I-NEXT:    addi sp, sp, 48
992; RV64I-NEXT:    ret
993;
994; RV64IA-LABEL: atomicrmw_umax_i8_monotonic:
995; RV64IA:       # %bb.0:
996; RV64IA-NEXT:    andi a6, a0, -4
997; RV64IA-NEXT:    slliw a0, a0, 3
998; RV64IA-NEXT:    li a3, 255
999; RV64IA-NEXT:    sllw a3, a3, a0
1000; RV64IA-NEXT:    andi a1, a1, 255
1001; RV64IA-NEXT:    sllw a1, a1, a0
1002; RV64IA-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
1003; RV64IA-NEXT:    lr.w a4, (a6)
1004; RV64IA-NEXT:    and a2, a4, a3
1005; RV64IA-NEXT:    mv a5, a4
1006; RV64IA-NEXT:    bgeu a2, a1, .LBB12_3
1007; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB12_1 Depth=1
1008; RV64IA-NEXT:    xor a5, a4, a1
1009; RV64IA-NEXT:    and a5, a5, a3
1010; RV64IA-NEXT:    xor a5, a4, a5
1011; RV64IA-NEXT:  .LBB12_3: # in Loop: Header=BB12_1 Depth=1
1012; RV64IA-NEXT:    sc.w a5, a5, (a6)
1013; RV64IA-NEXT:    bnez a5, .LBB12_1
1014; RV64IA-NEXT:  # %bb.4:
1015; RV64IA-NEXT:    srlw a0, a4, a0
1016; RV64IA-NEXT:    slli a0, a0, 56
1017; RV64IA-NEXT:    srai a0, a0, 56
1018; RV64IA-NEXT:    ret
1019  %1 = atomicrmw umax i8* %a, i8 %b monotonic
1020  ret i8 %1
1021}
1022
1023define signext i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind {
1024; RV32I-LABEL: atomicrmw_umin_i8_monotonic:
1025; RV32I:       # %bb.0:
1026; RV32I-NEXT:    addi sp, sp, -32
1027; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1028; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1029; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1030; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1031; RV32I-NEXT:    mv s0, a0
1032; RV32I-NEXT:    lbu a3, 0(a0)
1033; RV32I-NEXT:    mv s2, a1
1034; RV32I-NEXT:    andi s1, a1, 255
1035; RV32I-NEXT:    j .LBB13_2
1036; RV32I-NEXT:  .LBB13_1: # %atomicrmw.start
1037; RV32I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1038; RV32I-NEXT:    sb a3, 15(sp)
1039; RV32I-NEXT:    addi a1, sp, 15
1040; RV32I-NEXT:    mv a0, s0
1041; RV32I-NEXT:    li a3, 0
1042; RV32I-NEXT:    li a4, 0
1043; RV32I-NEXT:    call __atomic_compare_exchange_1@plt
1044; RV32I-NEXT:    lb a3, 15(sp)
1045; RV32I-NEXT:    bnez a0, .LBB13_4
1046; RV32I-NEXT:  .LBB13_2: # %atomicrmw.start
1047; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1048; RV32I-NEXT:    andi a0, a3, 255
1049; RV32I-NEXT:    mv a2, a3
1050; RV32I-NEXT:    bgeu s1, a0, .LBB13_1
1051; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1052; RV32I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1053; RV32I-NEXT:    mv a2, s2
1054; RV32I-NEXT:    j .LBB13_1
1055; RV32I-NEXT:  .LBB13_4: # %atomicrmw.end
1056; RV32I-NEXT:    slli a0, a3, 24
1057; RV32I-NEXT:    srai a0, a0, 24
1058; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1059; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1060; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1061; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1062; RV32I-NEXT:    addi sp, sp, 32
1063; RV32I-NEXT:    ret
1064;
1065; RV32IA-LABEL: atomicrmw_umin_i8_monotonic:
1066; RV32IA:       # %bb.0:
1067; RV32IA-NEXT:    andi a6, a0, -4
1068; RV32IA-NEXT:    slli a0, a0, 3
1069; RV32IA-NEXT:    li a3, 255
1070; RV32IA-NEXT:    sll a3, a3, a0
1071; RV32IA-NEXT:    andi a1, a1, 255
1072; RV32IA-NEXT:    sll a1, a1, a0
1073; RV32IA-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
1074; RV32IA-NEXT:    lr.w a4, (a6)
1075; RV32IA-NEXT:    and a2, a4, a3
1076; RV32IA-NEXT:    mv a5, a4
1077; RV32IA-NEXT:    bgeu a1, a2, .LBB13_3
1078; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB13_1 Depth=1
1079; RV32IA-NEXT:    xor a5, a4, a1
1080; RV32IA-NEXT:    and a5, a5, a3
1081; RV32IA-NEXT:    xor a5, a4, a5
1082; RV32IA-NEXT:  .LBB13_3: # in Loop: Header=BB13_1 Depth=1
1083; RV32IA-NEXT:    sc.w a5, a5, (a6)
1084; RV32IA-NEXT:    bnez a5, .LBB13_1
1085; RV32IA-NEXT:  # %bb.4:
1086; RV32IA-NEXT:    srl a0, a4, a0
1087; RV32IA-NEXT:    slli a0, a0, 24
1088; RV32IA-NEXT:    srai a0, a0, 24
1089; RV32IA-NEXT:    ret
1090;
1091; RV64I-LABEL: atomicrmw_umin_i8_monotonic:
1092; RV64I:       # %bb.0:
1093; RV64I-NEXT:    addi sp, sp, -48
1094; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1095; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1096; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1097; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1098; RV64I-NEXT:    mv s0, a0
1099; RV64I-NEXT:    lbu a3, 0(a0)
1100; RV64I-NEXT:    mv s2, a1
1101; RV64I-NEXT:    andi s1, a1, 255
1102; RV64I-NEXT:    j .LBB13_2
1103; RV64I-NEXT:  .LBB13_1: # %atomicrmw.start
1104; RV64I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1105; RV64I-NEXT:    sb a3, 15(sp)
1106; RV64I-NEXT:    addi a1, sp, 15
1107; RV64I-NEXT:    mv a0, s0
1108; RV64I-NEXT:    li a3, 0
1109; RV64I-NEXT:    li a4, 0
1110; RV64I-NEXT:    call __atomic_compare_exchange_1@plt
1111; RV64I-NEXT:    lb a3, 15(sp)
1112; RV64I-NEXT:    bnez a0, .LBB13_4
1113; RV64I-NEXT:  .LBB13_2: # %atomicrmw.start
1114; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
1115; RV64I-NEXT:    andi a0, a3, 255
1116; RV64I-NEXT:    mv a2, a3
1117; RV64I-NEXT:    bgeu s1, a0, .LBB13_1
1118; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
1119; RV64I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1120; RV64I-NEXT:    mv a2, s2
1121; RV64I-NEXT:    j .LBB13_1
1122; RV64I-NEXT:  .LBB13_4: # %atomicrmw.end
1123; RV64I-NEXT:    slli a0, a3, 56
1124; RV64I-NEXT:    srai a0, a0, 56
1125; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1126; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1127; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1128; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1129; RV64I-NEXT:    addi sp, sp, 48
1130; RV64I-NEXT:    ret
1131;
1132; RV64IA-LABEL: atomicrmw_umin_i8_monotonic:
1133; RV64IA:       # %bb.0:
1134; RV64IA-NEXT:    andi a6, a0, -4
1135; RV64IA-NEXT:    slliw a0, a0, 3
1136; RV64IA-NEXT:    li a3, 255
1137; RV64IA-NEXT:    sllw a3, a3, a0
1138; RV64IA-NEXT:    andi a1, a1, 255
1139; RV64IA-NEXT:    sllw a1, a1, a0
1140; RV64IA-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
1141; RV64IA-NEXT:    lr.w a4, (a6)
1142; RV64IA-NEXT:    and a2, a4, a3
1143; RV64IA-NEXT:    mv a5, a4
1144; RV64IA-NEXT:    bgeu a1, a2, .LBB13_3
1145; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB13_1 Depth=1
1146; RV64IA-NEXT:    xor a5, a4, a1
1147; RV64IA-NEXT:    and a5, a5, a3
1148; RV64IA-NEXT:    xor a5, a4, a5
1149; RV64IA-NEXT:  .LBB13_3: # in Loop: Header=BB13_1 Depth=1
1150; RV64IA-NEXT:    sc.w a5, a5, (a6)
1151; RV64IA-NEXT:    bnez a5, .LBB13_1
1152; RV64IA-NEXT:  # %bb.4:
1153; RV64IA-NEXT:    srlw a0, a4, a0
1154; RV64IA-NEXT:    slli a0, a0, 56
1155; RV64IA-NEXT:    srai a0, a0, 56
1156; RV64IA-NEXT:    ret
1157  %1 = atomicrmw umin i8* %a, i8 %b monotonic
1158  ret i8 %1
1159}
1160
1161define signext i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) nounwind {
1162; RV32I-LABEL: atomicrmw_xchg_i16_monotonic:
1163; RV32I:       # %bb.0:
1164; RV32I-NEXT:    addi sp, sp, -16
1165; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1166; RV32I-NEXT:    li a2, 0
1167; RV32I-NEXT:    call __atomic_exchange_2@plt
1168; RV32I-NEXT:    slli a0, a0, 16
1169; RV32I-NEXT:    srai a0, a0, 16
1170; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1171; RV32I-NEXT:    addi sp, sp, 16
1172; RV32I-NEXT:    ret
1173;
1174; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic:
1175; RV32IA:       # %bb.0:
1176; RV32IA-NEXT:    andi a2, a0, -4
1177; RV32IA-NEXT:    slli a0, a0, 3
1178; RV32IA-NEXT:    lui a3, 16
1179; RV32IA-NEXT:    addi a3, a3, -1
1180; RV32IA-NEXT:    sll a4, a3, a0
1181; RV32IA-NEXT:    and a1, a1, a3
1182; RV32IA-NEXT:    sll a1, a1, a0
1183; RV32IA-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
1184; RV32IA-NEXT:    lr.w a3, (a2)
1185; RV32IA-NEXT:    mv a5, a1
1186; RV32IA-NEXT:    xor a5, a3, a5
1187; RV32IA-NEXT:    and a5, a5, a4
1188; RV32IA-NEXT:    xor a5, a3, a5
1189; RV32IA-NEXT:    sc.w a5, a5, (a2)
1190; RV32IA-NEXT:    bnez a5, .LBB14_1
1191; RV32IA-NEXT:  # %bb.2:
1192; RV32IA-NEXT:    srl a0, a3, a0
1193; RV32IA-NEXT:    slli a0, a0, 16
1194; RV32IA-NEXT:    srai a0, a0, 16
1195; RV32IA-NEXT:    ret
1196;
1197; RV64I-LABEL: atomicrmw_xchg_i16_monotonic:
1198; RV64I:       # %bb.0:
1199; RV64I-NEXT:    addi sp, sp, -16
1200; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1201; RV64I-NEXT:    li a2, 0
1202; RV64I-NEXT:    call __atomic_exchange_2@plt
1203; RV64I-NEXT:    slli a0, a0, 48
1204; RV64I-NEXT:    srai a0, a0, 48
1205; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1206; RV64I-NEXT:    addi sp, sp, 16
1207; RV64I-NEXT:    ret
1208;
1209; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic:
1210; RV64IA:       # %bb.0:
1211; RV64IA-NEXT:    andi a2, a0, -4
1212; RV64IA-NEXT:    slliw a0, a0, 3
1213; RV64IA-NEXT:    lui a3, 16
1214; RV64IA-NEXT:    addiw a3, a3, -1
1215; RV64IA-NEXT:    sllw a4, a3, a0
1216; RV64IA-NEXT:    and a1, a1, a3
1217; RV64IA-NEXT:    sllw a1, a1, a0
1218; RV64IA-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
1219; RV64IA-NEXT:    lr.w a3, (a2)
1220; RV64IA-NEXT:    mv a5, a1
1221; RV64IA-NEXT:    xor a5, a3, a5
1222; RV64IA-NEXT:    and a5, a5, a4
1223; RV64IA-NEXT:    xor a5, a3, a5
1224; RV64IA-NEXT:    sc.w a5, a5, (a2)
1225; RV64IA-NEXT:    bnez a5, .LBB14_1
1226; RV64IA-NEXT:  # %bb.2:
1227; RV64IA-NEXT:    srlw a0, a3, a0
1228; RV64IA-NEXT:    slli a0, a0, 48
1229; RV64IA-NEXT:    srai a0, a0, 48
1230; RV64IA-NEXT:    ret
1231  %1 = atomicrmw xchg i16* %a, i16 %b monotonic
1232  ret i16 %1
1233}
1234
1235define signext i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind {
1236; RV32I-LABEL: atomicrmw_add_i16_monotonic:
1237; RV32I:       # %bb.0:
1238; RV32I-NEXT:    addi sp, sp, -16
1239; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1240; RV32I-NEXT:    li a2, 0
1241; RV32I-NEXT:    call __atomic_fetch_add_2@plt
1242; RV32I-NEXT:    slli a0, a0, 16
1243; RV32I-NEXT:    srai a0, a0, 16
1244; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1245; RV32I-NEXT:    addi sp, sp, 16
1246; RV32I-NEXT:    ret
1247;
1248; RV32IA-LABEL: atomicrmw_add_i16_monotonic:
1249; RV32IA:       # %bb.0:
1250; RV32IA-NEXT:    andi a2, a0, -4
1251; RV32IA-NEXT:    slli a0, a0, 3
1252; RV32IA-NEXT:    lui a3, 16
1253; RV32IA-NEXT:    addi a3, a3, -1
1254; RV32IA-NEXT:    sll a4, a3, a0
1255; RV32IA-NEXT:    and a1, a1, a3
1256; RV32IA-NEXT:    sll a1, a1, a0
1257; RV32IA-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
1258; RV32IA-NEXT:    lr.w a3, (a2)
1259; RV32IA-NEXT:    add a5, a3, a1
1260; RV32IA-NEXT:    xor a5, a3, a5
1261; RV32IA-NEXT:    and a5, a5, a4
1262; RV32IA-NEXT:    xor a5, a3, a5
1263; RV32IA-NEXT:    sc.w a5, a5, (a2)
1264; RV32IA-NEXT:    bnez a5, .LBB15_1
1265; RV32IA-NEXT:  # %bb.2:
1266; RV32IA-NEXT:    srl a0, a3, a0
1267; RV32IA-NEXT:    slli a0, a0, 16
1268; RV32IA-NEXT:    srai a0, a0, 16
1269; RV32IA-NEXT:    ret
1270;
1271; RV64I-LABEL: atomicrmw_add_i16_monotonic:
1272; RV64I:       # %bb.0:
1273; RV64I-NEXT:    addi sp, sp, -16
1274; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1275; RV64I-NEXT:    li a2, 0
1276; RV64I-NEXT:    call __atomic_fetch_add_2@plt
1277; RV64I-NEXT:    slli a0, a0, 48
1278; RV64I-NEXT:    srai a0, a0, 48
1279; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1280; RV64I-NEXT:    addi sp, sp, 16
1281; RV64I-NEXT:    ret
1282;
1283; RV64IA-LABEL: atomicrmw_add_i16_monotonic:
1284; RV64IA:       # %bb.0:
1285; RV64IA-NEXT:    andi a2, a0, -4
1286; RV64IA-NEXT:    slliw a0, a0, 3
1287; RV64IA-NEXT:    lui a3, 16
1288; RV64IA-NEXT:    addiw a3, a3, -1
1289; RV64IA-NEXT:    sllw a4, a3, a0
1290; RV64IA-NEXT:    and a1, a1, a3
1291; RV64IA-NEXT:    sllw a1, a1, a0
1292; RV64IA-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
1293; RV64IA-NEXT:    lr.w a3, (a2)
1294; RV64IA-NEXT:    add a5, a3, a1
1295; RV64IA-NEXT:    xor a5, a3, a5
1296; RV64IA-NEXT:    and a5, a5, a4
1297; RV64IA-NEXT:    xor a5, a3, a5
1298; RV64IA-NEXT:    sc.w a5, a5, (a2)
1299; RV64IA-NEXT:    bnez a5, .LBB15_1
1300; RV64IA-NEXT:  # %bb.2:
1301; RV64IA-NEXT:    srlw a0, a3, a0
1302; RV64IA-NEXT:    slli a0, a0, 48
1303; RV64IA-NEXT:    srai a0, a0, 48
1304; RV64IA-NEXT:    ret
1305  %1 = atomicrmw add i16* %a, i16 %b monotonic
1306  ret i16 %1
1307}
1308
1309define signext i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) nounwind {
1310; RV32I-LABEL: atomicrmw_sub_i16_monotonic:
1311; RV32I:       # %bb.0:
1312; RV32I-NEXT:    addi sp, sp, -16
1313; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1314; RV32I-NEXT:    li a2, 0
1315; RV32I-NEXT:    call __atomic_fetch_sub_2@plt
1316; RV32I-NEXT:    slli a0, a0, 16
1317; RV32I-NEXT:    srai a0, a0, 16
1318; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1319; RV32I-NEXT:    addi sp, sp, 16
1320; RV32I-NEXT:    ret
1321;
1322; RV32IA-LABEL: atomicrmw_sub_i16_monotonic:
1323; RV32IA:       # %bb.0:
1324; RV32IA-NEXT:    andi a2, a0, -4
1325; RV32IA-NEXT:    slli a0, a0, 3
1326; RV32IA-NEXT:    lui a3, 16
1327; RV32IA-NEXT:    addi a3, a3, -1
1328; RV32IA-NEXT:    sll a4, a3, a0
1329; RV32IA-NEXT:    and a1, a1, a3
1330; RV32IA-NEXT:    sll a1, a1, a0
1331; RV32IA-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1332; RV32IA-NEXT:    lr.w a3, (a2)
1333; RV32IA-NEXT:    sub a5, a3, a1
1334; RV32IA-NEXT:    xor a5, a3, a5
1335; RV32IA-NEXT:    and a5, a5, a4
1336; RV32IA-NEXT:    xor a5, a3, a5
1337; RV32IA-NEXT:    sc.w a5, a5, (a2)
1338; RV32IA-NEXT:    bnez a5, .LBB16_1
1339; RV32IA-NEXT:  # %bb.2:
1340; RV32IA-NEXT:    srl a0, a3, a0
1341; RV32IA-NEXT:    slli a0, a0, 16
1342; RV32IA-NEXT:    srai a0, a0, 16
1343; RV32IA-NEXT:    ret
1344;
1345; RV64I-LABEL: atomicrmw_sub_i16_monotonic:
1346; RV64I:       # %bb.0:
1347; RV64I-NEXT:    addi sp, sp, -16
1348; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1349; RV64I-NEXT:    li a2, 0
1350; RV64I-NEXT:    call __atomic_fetch_sub_2@plt
1351; RV64I-NEXT:    slli a0, a0, 48
1352; RV64I-NEXT:    srai a0, a0, 48
1353; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1354; RV64I-NEXT:    addi sp, sp, 16
1355; RV64I-NEXT:    ret
1356;
1357; RV64IA-LABEL: atomicrmw_sub_i16_monotonic:
1358; RV64IA:       # %bb.0:
1359; RV64IA-NEXT:    andi a2, a0, -4
1360; RV64IA-NEXT:    slliw a0, a0, 3
1361; RV64IA-NEXT:    lui a3, 16
1362; RV64IA-NEXT:    addiw a3, a3, -1
1363; RV64IA-NEXT:    sllw a4, a3, a0
1364; RV64IA-NEXT:    and a1, a1, a3
1365; RV64IA-NEXT:    sllw a1, a1, a0
1366; RV64IA-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1367; RV64IA-NEXT:    lr.w a3, (a2)
1368; RV64IA-NEXT:    sub a5, a3, a1
1369; RV64IA-NEXT:    xor a5, a3, a5
1370; RV64IA-NEXT:    and a5, a5, a4
1371; RV64IA-NEXT:    xor a5, a3, a5
1372; RV64IA-NEXT:    sc.w a5, a5, (a2)
1373; RV64IA-NEXT:    bnez a5, .LBB16_1
1374; RV64IA-NEXT:  # %bb.2:
1375; RV64IA-NEXT:    srlw a0, a3, a0
1376; RV64IA-NEXT:    slli a0, a0, 48
1377; RV64IA-NEXT:    srai a0, a0, 48
1378; RV64IA-NEXT:    ret
1379  %1 = atomicrmw sub i16* %a, i16 %b monotonic
1380  ret i16 %1
1381}
1382
1383define signext i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind {
1384; RV32I-LABEL: atomicrmw_and_i16_monotonic:
1385; RV32I:       # %bb.0:
1386; RV32I-NEXT:    addi sp, sp, -16
1387; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1388; RV32I-NEXT:    li a2, 0
1389; RV32I-NEXT:    call __atomic_fetch_and_2@plt
1390; RV32I-NEXT:    slli a0, a0, 16
1391; RV32I-NEXT:    srai a0, a0, 16
1392; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1393; RV32I-NEXT:    addi sp, sp, 16
1394; RV32I-NEXT:    ret
1395;
1396; RV32IA-LABEL: atomicrmw_and_i16_monotonic:
1397; RV32IA:       # %bb.0:
1398; RV32IA-NEXT:    andi a2, a0, -4
1399; RV32IA-NEXT:    slli a0, a0, 3
1400; RV32IA-NEXT:    lui a3, 16
1401; RV32IA-NEXT:    addi a3, a3, -1
1402; RV32IA-NEXT:    sll a4, a3, a0
1403; RV32IA-NEXT:    not a4, a4
1404; RV32IA-NEXT:    and a1, a1, a3
1405; RV32IA-NEXT:    sll a1, a1, a0
1406; RV32IA-NEXT:    or a1, a4, a1
1407; RV32IA-NEXT:    amoand.w a1, a1, (a2)
1408; RV32IA-NEXT:    srl a0, a1, a0
1409; RV32IA-NEXT:    slli a0, a0, 16
1410; RV32IA-NEXT:    srai a0, a0, 16
1411; RV32IA-NEXT:    ret
1412;
1413; RV64I-LABEL: atomicrmw_and_i16_monotonic:
1414; RV64I:       # %bb.0:
1415; RV64I-NEXT:    addi sp, sp, -16
1416; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1417; RV64I-NEXT:    li a2, 0
1418; RV64I-NEXT:    call __atomic_fetch_and_2@plt
1419; RV64I-NEXT:    slli a0, a0, 48
1420; RV64I-NEXT:    srai a0, a0, 48
1421; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1422; RV64I-NEXT:    addi sp, sp, 16
1423; RV64I-NEXT:    ret
1424;
1425; RV64IA-LABEL: atomicrmw_and_i16_monotonic:
1426; RV64IA:       # %bb.0:
1427; RV64IA-NEXT:    andi a2, a0, -4
1428; RV64IA-NEXT:    slliw a0, a0, 3
1429; RV64IA-NEXT:    lui a3, 16
1430; RV64IA-NEXT:    addiw a3, a3, -1
1431; RV64IA-NEXT:    sllw a4, a3, a0
1432; RV64IA-NEXT:    not a4, a4
1433; RV64IA-NEXT:    and a1, a1, a3
1434; RV64IA-NEXT:    sllw a1, a1, a0
1435; RV64IA-NEXT:    or a1, a4, a1
1436; RV64IA-NEXT:    amoand.w a1, a1, (a2)
1437; RV64IA-NEXT:    srlw a0, a1, a0
1438; RV64IA-NEXT:    slli a0, a0, 48
1439; RV64IA-NEXT:    srai a0, a0, 48
1440; RV64IA-NEXT:    ret
1441  %1 = atomicrmw and i16* %a, i16 %b monotonic
1442  ret i16 %1
1443}
1444
1445define signext i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) nounwind {
1446; RV32I-LABEL: atomicrmw_nand_i16_monotonic:
1447; RV32I:       # %bb.0:
1448; RV32I-NEXT:    addi sp, sp, -16
1449; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1450; RV32I-NEXT:    li a2, 0
1451; RV32I-NEXT:    call __atomic_fetch_nand_2@plt
1452; RV32I-NEXT:    slli a0, a0, 16
1453; RV32I-NEXT:    srai a0, a0, 16
1454; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1455; RV32I-NEXT:    addi sp, sp, 16
1456; RV32I-NEXT:    ret
1457;
1458; RV32IA-LABEL: atomicrmw_nand_i16_monotonic:
1459; RV32IA:       # %bb.0:
1460; RV32IA-NEXT:    andi a2, a0, -4
1461; RV32IA-NEXT:    slli a0, a0, 3
1462; RV32IA-NEXT:    lui a3, 16
1463; RV32IA-NEXT:    addi a3, a3, -1
1464; RV32IA-NEXT:    sll a4, a3, a0
1465; RV32IA-NEXT:    and a1, a1, a3
1466; RV32IA-NEXT:    sll a1, a1, a0
1467; RV32IA-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
1468; RV32IA-NEXT:    lr.w a3, (a2)
1469; RV32IA-NEXT:    and a5, a3, a1
1470; RV32IA-NEXT:    not a5, a5
1471; RV32IA-NEXT:    xor a5, a3, a5
1472; RV32IA-NEXT:    and a5, a5, a4
1473; RV32IA-NEXT:    xor a5, a3, a5
1474; RV32IA-NEXT:    sc.w a5, a5, (a2)
1475; RV32IA-NEXT:    bnez a5, .LBB18_1
1476; RV32IA-NEXT:  # %bb.2:
1477; RV32IA-NEXT:    srl a0, a3, a0
1478; RV32IA-NEXT:    slli a0, a0, 16
1479; RV32IA-NEXT:    srai a0, a0, 16
1480; RV32IA-NEXT:    ret
1481;
1482; RV64I-LABEL: atomicrmw_nand_i16_monotonic:
1483; RV64I:       # %bb.0:
1484; RV64I-NEXT:    addi sp, sp, -16
1485; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1486; RV64I-NEXT:    li a2, 0
1487; RV64I-NEXT:    call __atomic_fetch_nand_2@plt
1488; RV64I-NEXT:    slli a0, a0, 48
1489; RV64I-NEXT:    srai a0, a0, 48
1490; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1491; RV64I-NEXT:    addi sp, sp, 16
1492; RV64I-NEXT:    ret
1493;
1494; RV64IA-LABEL: atomicrmw_nand_i16_monotonic:
1495; RV64IA:       # %bb.0:
1496; RV64IA-NEXT:    andi a2, a0, -4
1497; RV64IA-NEXT:    slliw a0, a0, 3
1498; RV64IA-NEXT:    lui a3, 16
1499; RV64IA-NEXT:    addiw a3, a3, -1
1500; RV64IA-NEXT:    sllw a4, a3, a0
1501; RV64IA-NEXT:    and a1, a1, a3
1502; RV64IA-NEXT:    sllw a1, a1, a0
1503; RV64IA-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
1504; RV64IA-NEXT:    lr.w a3, (a2)
1505; RV64IA-NEXT:    and a5, a3, a1
1506; RV64IA-NEXT:    not a5, a5
1507; RV64IA-NEXT:    xor a5, a3, a5
1508; RV64IA-NEXT:    and a5, a5, a4
1509; RV64IA-NEXT:    xor a5, a3, a5
1510; RV64IA-NEXT:    sc.w a5, a5, (a2)
1511; RV64IA-NEXT:    bnez a5, .LBB18_1
1512; RV64IA-NEXT:  # %bb.2:
1513; RV64IA-NEXT:    srlw a0, a3, a0
1514; RV64IA-NEXT:    slli a0, a0, 48
1515; RV64IA-NEXT:    srai a0, a0, 48
1516; RV64IA-NEXT:    ret
1517  %1 = atomicrmw nand i16* %a, i16 %b monotonic
1518  ret i16 %1
1519}
1520
1521define signext i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind {
1522; RV32I-LABEL: atomicrmw_or_i16_monotonic:
1523; RV32I:       # %bb.0:
1524; RV32I-NEXT:    addi sp, sp, -16
1525; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1526; RV32I-NEXT:    li a2, 0
1527; RV32I-NEXT:    call __atomic_fetch_or_2@plt
1528; RV32I-NEXT:    slli a0, a0, 16
1529; RV32I-NEXT:    srai a0, a0, 16
1530; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1531; RV32I-NEXT:    addi sp, sp, 16
1532; RV32I-NEXT:    ret
1533;
1534; RV32IA-LABEL: atomicrmw_or_i16_monotonic:
1535; RV32IA:       # %bb.0:
1536; RV32IA-NEXT:    andi a2, a0, -4
1537; RV32IA-NEXT:    slli a0, a0, 3
1538; RV32IA-NEXT:    slli a1, a1, 16
1539; RV32IA-NEXT:    srli a1, a1, 16
1540; RV32IA-NEXT:    sll a1, a1, a0
1541; RV32IA-NEXT:    amoor.w a1, a1, (a2)
1542; RV32IA-NEXT:    srl a0, a1, a0
1543; RV32IA-NEXT:    slli a0, a0, 16
1544; RV32IA-NEXT:    srai a0, a0, 16
1545; RV32IA-NEXT:    ret
1546;
1547; RV64I-LABEL: atomicrmw_or_i16_monotonic:
1548; RV64I:       # %bb.0:
1549; RV64I-NEXT:    addi sp, sp, -16
1550; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1551; RV64I-NEXT:    li a2, 0
1552; RV64I-NEXT:    call __atomic_fetch_or_2@plt
1553; RV64I-NEXT:    slli a0, a0, 48
1554; RV64I-NEXT:    srai a0, a0, 48
1555; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1556; RV64I-NEXT:    addi sp, sp, 16
1557; RV64I-NEXT:    ret
1558;
1559; RV64IA-LABEL: atomicrmw_or_i16_monotonic:
1560; RV64IA:       # %bb.0:
1561; RV64IA-NEXT:    andi a2, a0, -4
1562; RV64IA-NEXT:    slliw a0, a0, 3
1563; RV64IA-NEXT:    slli a1, a1, 48
1564; RV64IA-NEXT:    srli a1, a1, 48
1565; RV64IA-NEXT:    sllw a1, a1, a0
1566; RV64IA-NEXT:    amoor.w a1, a1, (a2)
1567; RV64IA-NEXT:    srlw a0, a1, a0
1568; RV64IA-NEXT:    slli a0, a0, 48
1569; RV64IA-NEXT:    srai a0, a0, 48
1570; RV64IA-NEXT:    ret
1571  %1 = atomicrmw or i16* %a, i16 %b monotonic
1572  ret i16 %1
1573}
1574
1575define signext i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind {
1576; RV32I-LABEL: atomicrmw_xor_i16_monotonic:
1577; RV32I:       # %bb.0:
1578; RV32I-NEXT:    addi sp, sp, -16
1579; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1580; RV32I-NEXT:    li a2, 0
1581; RV32I-NEXT:    call __atomic_fetch_xor_2@plt
1582; RV32I-NEXT:    slli a0, a0, 16
1583; RV32I-NEXT:    srai a0, a0, 16
1584; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1585; RV32I-NEXT:    addi sp, sp, 16
1586; RV32I-NEXT:    ret
1587;
1588; RV32IA-LABEL: atomicrmw_xor_i16_monotonic:
1589; RV32IA:       # %bb.0:
1590; RV32IA-NEXT:    andi a2, a0, -4
1591; RV32IA-NEXT:    slli a0, a0, 3
1592; RV32IA-NEXT:    slli a1, a1, 16
1593; RV32IA-NEXT:    srli a1, a1, 16
1594; RV32IA-NEXT:    sll a1, a1, a0
1595; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
1596; RV32IA-NEXT:    srl a0, a1, a0
1597; RV32IA-NEXT:    slli a0, a0, 16
1598; RV32IA-NEXT:    srai a0, a0, 16
1599; RV32IA-NEXT:    ret
1600;
1601; RV64I-LABEL: atomicrmw_xor_i16_monotonic:
1602; RV64I:       # %bb.0:
1603; RV64I-NEXT:    addi sp, sp, -16
1604; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1605; RV64I-NEXT:    li a2, 0
1606; RV64I-NEXT:    call __atomic_fetch_xor_2@plt
1607; RV64I-NEXT:    slli a0, a0, 48
1608; RV64I-NEXT:    srai a0, a0, 48
1609; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1610; RV64I-NEXT:    addi sp, sp, 16
1611; RV64I-NEXT:    ret
1612;
1613; RV64IA-LABEL: atomicrmw_xor_i16_monotonic:
1614; RV64IA:       # %bb.0:
1615; RV64IA-NEXT:    andi a2, a0, -4
1616; RV64IA-NEXT:    slliw a0, a0, 3
1617; RV64IA-NEXT:    slli a1, a1, 48
1618; RV64IA-NEXT:    srli a1, a1, 48
1619; RV64IA-NEXT:    sllw a1, a1, a0
1620; RV64IA-NEXT:    amoxor.w a1, a1, (a2)
1621; RV64IA-NEXT:    srlw a0, a1, a0
1622; RV64IA-NEXT:    slli a0, a0, 48
1623; RV64IA-NEXT:    srai a0, a0, 48
1624; RV64IA-NEXT:    ret
1625  %1 = atomicrmw xor i16* %a, i16 %b monotonic
1626  ret i16 %1
1627}
1628
1629define signext i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind {
1630; RV32I-LABEL: atomicrmw_max_i16_monotonic:
1631; RV32I:       # %bb.0:
1632; RV32I-NEXT:    addi sp, sp, -32
1633; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1634; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1635; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1636; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1637; RV32I-NEXT:    mv s0, a0
1638; RV32I-NEXT:    lhu a3, 0(a0)
1639; RV32I-NEXT:    mv s2, a1
1640; RV32I-NEXT:    slli a0, a1, 16
1641; RV32I-NEXT:    srai s1, a0, 16
1642; RV32I-NEXT:    j .LBB21_2
1643; RV32I-NEXT:  .LBB21_1: # %atomicrmw.start
1644; RV32I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1645; RV32I-NEXT:    sh a3, 14(sp)
1646; RV32I-NEXT:    addi a1, sp, 14
1647; RV32I-NEXT:    mv a0, s0
1648; RV32I-NEXT:    li a3, 0
1649; RV32I-NEXT:    li a4, 0
1650; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
1651; RV32I-NEXT:    lh a3, 14(sp)
1652; RV32I-NEXT:    bnez a0, .LBB21_4
1653; RV32I-NEXT:  .LBB21_2: # %atomicrmw.start
1654; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1655; RV32I-NEXT:    slli a0, a3, 16
1656; RV32I-NEXT:    srai a0, a0, 16
1657; RV32I-NEXT:    mv a2, a3
1658; RV32I-NEXT:    blt s1, a0, .LBB21_1
1659; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1660; RV32I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1661; RV32I-NEXT:    mv a2, s2
1662; RV32I-NEXT:    j .LBB21_1
1663; RV32I-NEXT:  .LBB21_4: # %atomicrmw.end
1664; RV32I-NEXT:    slli a0, a3, 16
1665; RV32I-NEXT:    srai a0, a0, 16
1666; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1667; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1668; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1669; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1670; RV32I-NEXT:    addi sp, sp, 32
1671; RV32I-NEXT:    ret
1672;
1673; RV32IA-LABEL: atomicrmw_max_i16_monotonic:
1674; RV32IA:       # %bb.0:
1675; RV32IA-NEXT:    andi a6, a0, -4
1676; RV32IA-NEXT:    slli a0, a0, 3
1677; RV32IA-NEXT:    andi a3, a0, 24
1678; RV32IA-NEXT:    lui a4, 16
1679; RV32IA-NEXT:    addi a4, a4, -1
1680; RV32IA-NEXT:    sll a7, a4, a0
1681; RV32IA-NEXT:    slli a1, a1, 16
1682; RV32IA-NEXT:    srai a1, a1, 16
1683; RV32IA-NEXT:    sll a1, a1, a0
1684; RV32IA-NEXT:    li a5, 16
1685; RV32IA-NEXT:    sub a3, a5, a3
1686; RV32IA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
1687; RV32IA-NEXT:    lr.w a5, (a6)
1688; RV32IA-NEXT:    and a4, a5, a7
1689; RV32IA-NEXT:    mv a2, a5
1690; RV32IA-NEXT:    sll a4, a4, a3
1691; RV32IA-NEXT:    sra a4, a4, a3
1692; RV32IA-NEXT:    bge a4, a1, .LBB21_3
1693; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB21_1 Depth=1
1694; RV32IA-NEXT:    xor a2, a5, a1
1695; RV32IA-NEXT:    and a2, a2, a7
1696; RV32IA-NEXT:    xor a2, a5, a2
1697; RV32IA-NEXT:  .LBB21_3: # in Loop: Header=BB21_1 Depth=1
1698; RV32IA-NEXT:    sc.w a2, a2, (a6)
1699; RV32IA-NEXT:    bnez a2, .LBB21_1
1700; RV32IA-NEXT:  # %bb.4:
1701; RV32IA-NEXT:    srl a0, a5, a0
1702; RV32IA-NEXT:    slli a0, a0, 16
1703; RV32IA-NEXT:    srai a0, a0, 16
1704; RV32IA-NEXT:    ret
1705;
1706; RV64I-LABEL: atomicrmw_max_i16_monotonic:
1707; RV64I:       # %bb.0:
1708; RV64I-NEXT:    addi sp, sp, -48
1709; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1710; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1711; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1712; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1713; RV64I-NEXT:    mv s0, a0
1714; RV64I-NEXT:    lhu a3, 0(a0)
1715; RV64I-NEXT:    mv s2, a1
1716; RV64I-NEXT:    slli a0, a1, 48
1717; RV64I-NEXT:    srai s1, a0, 48
1718; RV64I-NEXT:    j .LBB21_2
1719; RV64I-NEXT:  .LBB21_1: # %atomicrmw.start
1720; RV64I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1721; RV64I-NEXT:    sh a3, 14(sp)
1722; RV64I-NEXT:    addi a1, sp, 14
1723; RV64I-NEXT:    mv a0, s0
1724; RV64I-NEXT:    li a3, 0
1725; RV64I-NEXT:    li a4, 0
1726; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
1727; RV64I-NEXT:    lh a3, 14(sp)
1728; RV64I-NEXT:    bnez a0, .LBB21_4
1729; RV64I-NEXT:  .LBB21_2: # %atomicrmw.start
1730; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
1731; RV64I-NEXT:    slli a0, a3, 48
1732; RV64I-NEXT:    srai a0, a0, 48
1733; RV64I-NEXT:    mv a2, a3
1734; RV64I-NEXT:    blt s1, a0, .LBB21_1
1735; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
1736; RV64I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1737; RV64I-NEXT:    mv a2, s2
1738; RV64I-NEXT:    j .LBB21_1
1739; RV64I-NEXT:  .LBB21_4: # %atomicrmw.end
1740; RV64I-NEXT:    slli a0, a3, 48
1741; RV64I-NEXT:    srai a0, a0, 48
1742; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1743; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1744; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1745; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1746; RV64I-NEXT:    addi sp, sp, 48
1747; RV64I-NEXT:    ret
1748;
1749; RV64IA-LABEL: atomicrmw_max_i16_monotonic:
1750; RV64IA:       # %bb.0:
1751; RV64IA-NEXT:    andi a6, a0, -4
1752; RV64IA-NEXT:    slliw a0, a0, 3
1753; RV64IA-NEXT:    andi a3, a0, 24
1754; RV64IA-NEXT:    lui a4, 16
1755; RV64IA-NEXT:    addiw a4, a4, -1
1756; RV64IA-NEXT:    sllw a7, a4, a0
1757; RV64IA-NEXT:    slli a1, a1, 48
1758; RV64IA-NEXT:    srai a1, a1, 48
1759; RV64IA-NEXT:    sllw a1, a1, a0
1760; RV64IA-NEXT:    li a5, 48
1761; RV64IA-NEXT:    sub a3, a5, a3
1762; RV64IA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
1763; RV64IA-NEXT:    lr.w a5, (a6)
1764; RV64IA-NEXT:    and a4, a5, a7
1765; RV64IA-NEXT:    mv a2, a5
1766; RV64IA-NEXT:    sll a4, a4, a3
1767; RV64IA-NEXT:    sra a4, a4, a3
1768; RV64IA-NEXT:    bge a4, a1, .LBB21_3
1769; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB21_1 Depth=1
1770; RV64IA-NEXT:    xor a2, a5, a1
1771; RV64IA-NEXT:    and a2, a2, a7
1772; RV64IA-NEXT:    xor a2, a5, a2
1773; RV64IA-NEXT:  .LBB21_3: # in Loop: Header=BB21_1 Depth=1
1774; RV64IA-NEXT:    sc.w a2, a2, (a6)
1775; RV64IA-NEXT:    bnez a2, .LBB21_1
1776; RV64IA-NEXT:  # %bb.4:
1777; RV64IA-NEXT:    srlw a0, a5, a0
1778; RV64IA-NEXT:    slli a0, a0, 48
1779; RV64IA-NEXT:    srai a0, a0, 48
1780; RV64IA-NEXT:    ret
1781  %1 = atomicrmw max i16* %a, i16 %b monotonic
1782  ret i16 %1
1783}
1784
1785define signext i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind {
1786; RV32I-LABEL: atomicrmw_min_i16_monotonic:
1787; RV32I:       # %bb.0:
1788; RV32I-NEXT:    addi sp, sp, -32
1789; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1790; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1791; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1792; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1793; RV32I-NEXT:    mv s0, a0
1794; RV32I-NEXT:    lhu a3, 0(a0)
1795; RV32I-NEXT:    mv s2, a1
1796; RV32I-NEXT:    slli a0, a1, 16
1797; RV32I-NEXT:    srai s1, a0, 16
1798; RV32I-NEXT:    j .LBB22_2
1799; RV32I-NEXT:  .LBB22_1: # %atomicrmw.start
1800; RV32I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1801; RV32I-NEXT:    sh a3, 14(sp)
1802; RV32I-NEXT:    addi a1, sp, 14
1803; RV32I-NEXT:    mv a0, s0
1804; RV32I-NEXT:    li a3, 0
1805; RV32I-NEXT:    li a4, 0
1806; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
1807; RV32I-NEXT:    lh a3, 14(sp)
1808; RV32I-NEXT:    bnez a0, .LBB22_4
1809; RV32I-NEXT:  .LBB22_2: # %atomicrmw.start
1810; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1811; RV32I-NEXT:    slli a0, a3, 16
1812; RV32I-NEXT:    srai a0, a0, 16
1813; RV32I-NEXT:    mv a2, a3
1814; RV32I-NEXT:    bge s1, a0, .LBB22_1
1815; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1816; RV32I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1817; RV32I-NEXT:    mv a2, s2
1818; RV32I-NEXT:    j .LBB22_1
1819; RV32I-NEXT:  .LBB22_4: # %atomicrmw.end
1820; RV32I-NEXT:    slli a0, a3, 16
1821; RV32I-NEXT:    srai a0, a0, 16
1822; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1823; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1824; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1825; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1826; RV32I-NEXT:    addi sp, sp, 32
1827; RV32I-NEXT:    ret
1828;
1829; RV32IA-LABEL: atomicrmw_min_i16_monotonic:
1830; RV32IA:       # %bb.0:
1831; RV32IA-NEXT:    andi a6, a0, -4
1832; RV32IA-NEXT:    slli a0, a0, 3
1833; RV32IA-NEXT:    andi a3, a0, 24
1834; RV32IA-NEXT:    lui a4, 16
1835; RV32IA-NEXT:    addi a4, a4, -1
1836; RV32IA-NEXT:    sll a7, a4, a0
1837; RV32IA-NEXT:    slli a1, a1, 16
1838; RV32IA-NEXT:    srai a1, a1, 16
1839; RV32IA-NEXT:    sll a1, a1, a0
1840; RV32IA-NEXT:    li a5, 16
1841; RV32IA-NEXT:    sub a3, a5, a3
1842; RV32IA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
1843; RV32IA-NEXT:    lr.w a5, (a6)
1844; RV32IA-NEXT:    and a4, a5, a7
1845; RV32IA-NEXT:    mv a2, a5
1846; RV32IA-NEXT:    sll a4, a4, a3
1847; RV32IA-NEXT:    sra a4, a4, a3
1848; RV32IA-NEXT:    bge a1, a4, .LBB22_3
1849; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB22_1 Depth=1
1850; RV32IA-NEXT:    xor a2, a5, a1
1851; RV32IA-NEXT:    and a2, a2, a7
1852; RV32IA-NEXT:    xor a2, a5, a2
1853; RV32IA-NEXT:  .LBB22_3: # in Loop: Header=BB22_1 Depth=1
1854; RV32IA-NEXT:    sc.w a2, a2, (a6)
1855; RV32IA-NEXT:    bnez a2, .LBB22_1
1856; RV32IA-NEXT:  # %bb.4:
1857; RV32IA-NEXT:    srl a0, a5, a0
1858; RV32IA-NEXT:    slli a0, a0, 16
1859; RV32IA-NEXT:    srai a0, a0, 16
1860; RV32IA-NEXT:    ret
1861;
1862; RV64I-LABEL: atomicrmw_min_i16_monotonic:
1863; RV64I:       # %bb.0:
1864; RV64I-NEXT:    addi sp, sp, -48
1865; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1866; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1867; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1868; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1869; RV64I-NEXT:    mv s0, a0
1870; RV64I-NEXT:    lhu a3, 0(a0)
1871; RV64I-NEXT:    mv s2, a1
1872; RV64I-NEXT:    slli a0, a1, 48
1873; RV64I-NEXT:    srai s1, a0, 48
1874; RV64I-NEXT:    j .LBB22_2
1875; RV64I-NEXT:  .LBB22_1: # %atomicrmw.start
1876; RV64I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1877; RV64I-NEXT:    sh a3, 14(sp)
1878; RV64I-NEXT:    addi a1, sp, 14
1879; RV64I-NEXT:    mv a0, s0
1880; RV64I-NEXT:    li a3, 0
1881; RV64I-NEXT:    li a4, 0
1882; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
1883; RV64I-NEXT:    lh a3, 14(sp)
1884; RV64I-NEXT:    bnez a0, .LBB22_4
1885; RV64I-NEXT:  .LBB22_2: # %atomicrmw.start
1886; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
1887; RV64I-NEXT:    slli a0, a3, 48
1888; RV64I-NEXT:    srai a0, a0, 48
1889; RV64I-NEXT:    mv a2, a3
1890; RV64I-NEXT:    bge s1, a0, .LBB22_1
1891; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
1892; RV64I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1893; RV64I-NEXT:    mv a2, s2
1894; RV64I-NEXT:    j .LBB22_1
1895; RV64I-NEXT:  .LBB22_4: # %atomicrmw.end
1896; RV64I-NEXT:    slli a0, a3, 48
1897; RV64I-NEXT:    srai a0, a0, 48
1898; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1899; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1900; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1901; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1902; RV64I-NEXT:    addi sp, sp, 48
1903; RV64I-NEXT:    ret
1904;
1905; RV64IA-LABEL: atomicrmw_min_i16_monotonic:
1906; RV64IA:       # %bb.0:
1907; RV64IA-NEXT:    andi a6, a0, -4
1908; RV64IA-NEXT:    slliw a0, a0, 3
1909; RV64IA-NEXT:    andi a3, a0, 24
1910; RV64IA-NEXT:    lui a4, 16
1911; RV64IA-NEXT:    addiw a4, a4, -1
1912; RV64IA-NEXT:    sllw a7, a4, a0
1913; RV64IA-NEXT:    slli a1, a1, 48
1914; RV64IA-NEXT:    srai a1, a1, 48
1915; RV64IA-NEXT:    sllw a1, a1, a0
1916; RV64IA-NEXT:    li a5, 48
1917; RV64IA-NEXT:    sub a3, a5, a3
1918; RV64IA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
1919; RV64IA-NEXT:    lr.w a5, (a6)
1920; RV64IA-NEXT:    and a4, a5, a7
1921; RV64IA-NEXT:    mv a2, a5
1922; RV64IA-NEXT:    sll a4, a4, a3
1923; RV64IA-NEXT:    sra a4, a4, a3
1924; RV64IA-NEXT:    bge a1, a4, .LBB22_3
1925; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB22_1 Depth=1
1926; RV64IA-NEXT:    xor a2, a5, a1
1927; RV64IA-NEXT:    and a2, a2, a7
1928; RV64IA-NEXT:    xor a2, a5, a2
1929; RV64IA-NEXT:  .LBB22_3: # in Loop: Header=BB22_1 Depth=1
1930; RV64IA-NEXT:    sc.w a2, a2, (a6)
1931; RV64IA-NEXT:    bnez a2, .LBB22_1
1932; RV64IA-NEXT:  # %bb.4:
1933; RV64IA-NEXT:    srlw a0, a5, a0
1934; RV64IA-NEXT:    slli a0, a0, 48
1935; RV64IA-NEXT:    srai a0, a0, 48
1936; RV64IA-NEXT:    ret
1937  %1 = atomicrmw min i16* %a, i16 %b monotonic
1938  ret i16 %1
1939}
1940
1941define signext i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind {
1942; RV32I-LABEL: atomicrmw_umax_i16_monotonic:
1943; RV32I:       # %bb.0:
1944; RV32I-NEXT:    addi sp, sp, -32
1945; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1946; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1947; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1948; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1949; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
1950; RV32I-NEXT:    mv s2, a1
1951; RV32I-NEXT:    mv s3, a0
1952; RV32I-NEXT:    lhu a1, 0(a0)
1953; RV32I-NEXT:    lui a0, 16
1954; RV32I-NEXT:    addi s0, a0, -1
1955; RV32I-NEXT:    and s1, s2, s0
1956; RV32I-NEXT:    j .LBB23_2
1957; RV32I-NEXT:  .LBB23_1: # %atomicrmw.start
1958; RV32I-NEXT:    # in Loop: Header=BB23_2 Depth=1
1959; RV32I-NEXT:    sh a1, 10(sp)
1960; RV32I-NEXT:    addi a1, sp, 10
1961; RV32I-NEXT:    mv a0, s3
1962; RV32I-NEXT:    li a3, 0
1963; RV32I-NEXT:    li a4, 0
1964; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
1965; RV32I-NEXT:    lh a1, 10(sp)
1966; RV32I-NEXT:    bnez a0, .LBB23_4
1967; RV32I-NEXT:  .LBB23_2: # %atomicrmw.start
1968; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1969; RV32I-NEXT:    and a0, a1, s0
1970; RV32I-NEXT:    mv a2, a1
1971; RV32I-NEXT:    bltu s1, a0, .LBB23_1
1972; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1973; RV32I-NEXT:    # in Loop: Header=BB23_2 Depth=1
1974; RV32I-NEXT:    mv a2, s2
1975; RV32I-NEXT:    j .LBB23_1
1976; RV32I-NEXT:  .LBB23_4: # %atomicrmw.end
1977; RV32I-NEXT:    slli a0, a1, 16
1978; RV32I-NEXT:    srai a0, a0, 16
1979; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1980; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1981; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1982; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1983; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
1984; RV32I-NEXT:    addi sp, sp, 32
1985; RV32I-NEXT:    ret
1986;
1987; RV32IA-LABEL: atomicrmw_umax_i16_monotonic:
1988; RV32IA:       # %bb.0:
1989; RV32IA-NEXT:    andi a6, a0, -4
1990; RV32IA-NEXT:    slli a0, a0, 3
1991; RV32IA-NEXT:    lui a3, 16
1992; RV32IA-NEXT:    addi a3, a3, -1
1993; RV32IA-NEXT:    sll a4, a3, a0
1994; RV32IA-NEXT:    and a1, a1, a3
1995; RV32IA-NEXT:    sll a1, a1, a0
1996; RV32IA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
1997; RV32IA-NEXT:    lr.w a3, (a6)
1998; RV32IA-NEXT:    and a2, a3, a4
1999; RV32IA-NEXT:    mv a5, a3
2000; RV32IA-NEXT:    bgeu a2, a1, .LBB23_3
2001; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB23_1 Depth=1
2002; RV32IA-NEXT:    xor a5, a3, a1
2003; RV32IA-NEXT:    and a5, a5, a4
2004; RV32IA-NEXT:    xor a5, a3, a5
2005; RV32IA-NEXT:  .LBB23_3: # in Loop: Header=BB23_1 Depth=1
2006; RV32IA-NEXT:    sc.w a5, a5, (a6)
2007; RV32IA-NEXT:    bnez a5, .LBB23_1
2008; RV32IA-NEXT:  # %bb.4:
2009; RV32IA-NEXT:    srl a0, a3, a0
2010; RV32IA-NEXT:    slli a0, a0, 16
2011; RV32IA-NEXT:    srai a0, a0, 16
2012; RV32IA-NEXT:    ret
2013;
2014; RV64I-LABEL: atomicrmw_umax_i16_monotonic:
2015; RV64I:       # %bb.0:
2016; RV64I-NEXT:    addi sp, sp, -48
2017; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2018; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2019; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2020; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2021; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
2022; RV64I-NEXT:    mv s2, a1
2023; RV64I-NEXT:    mv s3, a0
2024; RV64I-NEXT:    lhu a1, 0(a0)
2025; RV64I-NEXT:    lui a0, 16
2026; RV64I-NEXT:    addiw s0, a0, -1
2027; RV64I-NEXT:    and s1, s2, s0
2028; RV64I-NEXT:    j .LBB23_2
2029; RV64I-NEXT:  .LBB23_1: # %atomicrmw.start
2030; RV64I-NEXT:    # in Loop: Header=BB23_2 Depth=1
2031; RV64I-NEXT:    sh a1, 6(sp)
2032; RV64I-NEXT:    addi a1, sp, 6
2033; RV64I-NEXT:    mv a0, s3
2034; RV64I-NEXT:    li a3, 0
2035; RV64I-NEXT:    li a4, 0
2036; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
2037; RV64I-NEXT:    lh a1, 6(sp)
2038; RV64I-NEXT:    bnez a0, .LBB23_4
2039; RV64I-NEXT:  .LBB23_2: # %atomicrmw.start
2040; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2041; RV64I-NEXT:    and a0, a1, s0
2042; RV64I-NEXT:    mv a2, a1
2043; RV64I-NEXT:    bltu s1, a0, .LBB23_1
2044; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2045; RV64I-NEXT:    # in Loop: Header=BB23_2 Depth=1
2046; RV64I-NEXT:    mv a2, s2
2047; RV64I-NEXT:    j .LBB23_1
2048; RV64I-NEXT:  .LBB23_4: # %atomicrmw.end
2049; RV64I-NEXT:    slli a0, a1, 48
2050; RV64I-NEXT:    srai a0, a0, 48
2051; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2052; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2053; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2054; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2055; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
2056; RV64I-NEXT:    addi sp, sp, 48
2057; RV64I-NEXT:    ret
2058;
2059; RV64IA-LABEL: atomicrmw_umax_i16_monotonic:
2060; RV64IA:       # %bb.0:
2061; RV64IA-NEXT:    andi a6, a0, -4
2062; RV64IA-NEXT:    slliw a0, a0, 3
2063; RV64IA-NEXT:    lui a3, 16
2064; RV64IA-NEXT:    addiw a3, a3, -1
2065; RV64IA-NEXT:    sllw a4, a3, a0
2066; RV64IA-NEXT:    and a1, a1, a3
2067; RV64IA-NEXT:    sllw a1, a1, a0
2068; RV64IA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2069; RV64IA-NEXT:    lr.w a3, (a6)
2070; RV64IA-NEXT:    and a2, a3, a4
2071; RV64IA-NEXT:    mv a5, a3
2072; RV64IA-NEXT:    bgeu a2, a1, .LBB23_3
2073; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB23_1 Depth=1
2074; RV64IA-NEXT:    xor a5, a3, a1
2075; RV64IA-NEXT:    and a5, a5, a4
2076; RV64IA-NEXT:    xor a5, a3, a5
2077; RV64IA-NEXT:  .LBB23_3: # in Loop: Header=BB23_1 Depth=1
2078; RV64IA-NEXT:    sc.w a5, a5, (a6)
2079; RV64IA-NEXT:    bnez a5, .LBB23_1
2080; RV64IA-NEXT:  # %bb.4:
2081; RV64IA-NEXT:    srlw a0, a3, a0
2082; RV64IA-NEXT:    slli a0, a0, 48
2083; RV64IA-NEXT:    srai a0, a0, 48
2084; RV64IA-NEXT:    ret
2085  %1 = atomicrmw umax i16* %a, i16 %b monotonic
2086  ret i16 %1
2087}
2088
2089define signext i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind {
2090; RV32I-LABEL: atomicrmw_umin_i16_monotonic:
2091; RV32I:       # %bb.0:
2092; RV32I-NEXT:    addi sp, sp, -32
2093; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2094; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2095; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2096; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2097; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
2098; RV32I-NEXT:    mv s2, a1
2099; RV32I-NEXT:    mv s3, a0
2100; RV32I-NEXT:    lhu a1, 0(a0)
2101; RV32I-NEXT:    lui a0, 16
2102; RV32I-NEXT:    addi s0, a0, -1
2103; RV32I-NEXT:    and s1, s2, s0
2104; RV32I-NEXT:    j .LBB24_2
2105; RV32I-NEXT:  .LBB24_1: # %atomicrmw.start
2106; RV32I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2107; RV32I-NEXT:    sh a1, 10(sp)
2108; RV32I-NEXT:    addi a1, sp, 10
2109; RV32I-NEXT:    mv a0, s3
2110; RV32I-NEXT:    li a3, 0
2111; RV32I-NEXT:    li a4, 0
2112; RV32I-NEXT:    call __atomic_compare_exchange_2@plt
2113; RV32I-NEXT:    lh a1, 10(sp)
2114; RV32I-NEXT:    bnez a0, .LBB24_4
2115; RV32I-NEXT:  .LBB24_2: # %atomicrmw.start
2116; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2117; RV32I-NEXT:    and a0, a1, s0
2118; RV32I-NEXT:    mv a2, a1
2119; RV32I-NEXT:    bgeu s1, a0, .LBB24_1
2120; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2121; RV32I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2122; RV32I-NEXT:    mv a2, s2
2123; RV32I-NEXT:    j .LBB24_1
2124; RV32I-NEXT:  .LBB24_4: # %atomicrmw.end
2125; RV32I-NEXT:    slli a0, a1, 16
2126; RV32I-NEXT:    srai a0, a0, 16
2127; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2128; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2129; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2130; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2131; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
2132; RV32I-NEXT:    addi sp, sp, 32
2133; RV32I-NEXT:    ret
2134;
2135; RV32IA-LABEL: atomicrmw_umin_i16_monotonic:
2136; RV32IA:       # %bb.0:
2137; RV32IA-NEXT:    andi a6, a0, -4
2138; RV32IA-NEXT:    slli a0, a0, 3
2139; RV32IA-NEXT:    lui a3, 16
2140; RV32IA-NEXT:    addi a3, a3, -1
2141; RV32IA-NEXT:    sll a4, a3, a0
2142; RV32IA-NEXT:    and a1, a1, a3
2143; RV32IA-NEXT:    sll a1, a1, a0
2144; RV32IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
2145; RV32IA-NEXT:    lr.w a3, (a6)
2146; RV32IA-NEXT:    and a2, a3, a4
2147; RV32IA-NEXT:    mv a5, a3
2148; RV32IA-NEXT:    bgeu a1, a2, .LBB24_3
2149; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB24_1 Depth=1
2150; RV32IA-NEXT:    xor a5, a3, a1
2151; RV32IA-NEXT:    and a5, a5, a4
2152; RV32IA-NEXT:    xor a5, a3, a5
2153; RV32IA-NEXT:  .LBB24_3: # in Loop: Header=BB24_1 Depth=1
2154; RV32IA-NEXT:    sc.w a5, a5, (a6)
2155; RV32IA-NEXT:    bnez a5, .LBB24_1
2156; RV32IA-NEXT:  # %bb.4:
2157; RV32IA-NEXT:    srl a0, a3, a0
2158; RV32IA-NEXT:    slli a0, a0, 16
2159; RV32IA-NEXT:    srai a0, a0, 16
2160; RV32IA-NEXT:    ret
2161;
2162; RV64I-LABEL: atomicrmw_umin_i16_monotonic:
2163; RV64I:       # %bb.0:
2164; RV64I-NEXT:    addi sp, sp, -48
2165; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2166; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2167; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2168; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2169; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
2170; RV64I-NEXT:    mv s2, a1
2171; RV64I-NEXT:    mv s3, a0
2172; RV64I-NEXT:    lhu a1, 0(a0)
2173; RV64I-NEXT:    lui a0, 16
2174; RV64I-NEXT:    addiw s0, a0, -1
2175; RV64I-NEXT:    and s1, s2, s0
2176; RV64I-NEXT:    j .LBB24_2
2177; RV64I-NEXT:  .LBB24_1: # %atomicrmw.start
2178; RV64I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2179; RV64I-NEXT:    sh a1, 6(sp)
2180; RV64I-NEXT:    addi a1, sp, 6
2181; RV64I-NEXT:    mv a0, s3
2182; RV64I-NEXT:    li a3, 0
2183; RV64I-NEXT:    li a4, 0
2184; RV64I-NEXT:    call __atomic_compare_exchange_2@plt
2185; RV64I-NEXT:    lh a1, 6(sp)
2186; RV64I-NEXT:    bnez a0, .LBB24_4
2187; RV64I-NEXT:  .LBB24_2: # %atomicrmw.start
2188; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2189; RV64I-NEXT:    and a0, a1, s0
2190; RV64I-NEXT:    mv a2, a1
2191; RV64I-NEXT:    bgeu s1, a0, .LBB24_1
2192; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2193; RV64I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2194; RV64I-NEXT:    mv a2, s2
2195; RV64I-NEXT:    j .LBB24_1
2196; RV64I-NEXT:  .LBB24_4: # %atomicrmw.end
2197; RV64I-NEXT:    slli a0, a1, 48
2198; RV64I-NEXT:    srai a0, a0, 48
2199; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2200; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2201; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2202; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2203; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
2204; RV64I-NEXT:    addi sp, sp, 48
2205; RV64I-NEXT:    ret
2206;
2207; RV64IA-LABEL: atomicrmw_umin_i16_monotonic:
2208; RV64IA:       # %bb.0:
2209; RV64IA-NEXT:    andi a6, a0, -4
2210; RV64IA-NEXT:    slliw a0, a0, 3
2211; RV64IA-NEXT:    lui a3, 16
2212; RV64IA-NEXT:    addiw a3, a3, -1
2213; RV64IA-NEXT:    sllw a4, a3, a0
2214; RV64IA-NEXT:    and a1, a1, a3
2215; RV64IA-NEXT:    sllw a1, a1, a0
2216; RV64IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
2217; RV64IA-NEXT:    lr.w a3, (a6)
2218; RV64IA-NEXT:    and a2, a3, a4
2219; RV64IA-NEXT:    mv a5, a3
2220; RV64IA-NEXT:    bgeu a1, a2, .LBB24_3
2221; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB24_1 Depth=1
2222; RV64IA-NEXT:    xor a5, a3, a1
2223; RV64IA-NEXT:    and a5, a5, a4
2224; RV64IA-NEXT:    xor a5, a3, a5
2225; RV64IA-NEXT:  .LBB24_3: # in Loop: Header=BB24_1 Depth=1
2226; RV64IA-NEXT:    sc.w a5, a5, (a6)
2227; RV64IA-NEXT:    bnez a5, .LBB24_1
2228; RV64IA-NEXT:  # %bb.4:
2229; RV64IA-NEXT:    srlw a0, a3, a0
2230; RV64IA-NEXT:    slli a0, a0, 48
2231; RV64IA-NEXT:    srai a0, a0, 48
2232; RV64IA-NEXT:    ret
2233  %1 = atomicrmw umin i16* %a, i16 %b monotonic
2234  ret i16 %1
2235}
2236
2237define signext i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) nounwind {
2238; RV32I-LABEL: atomicrmw_xchg_i32_monotonic:
2239; RV32I:       # %bb.0:
2240; RV32I-NEXT:    addi sp, sp, -16
2241; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2242; RV32I-NEXT:    li a2, 0
2243; RV32I-NEXT:    call __atomic_exchange_4@plt
2244; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2245; RV32I-NEXT:    addi sp, sp, 16
2246; RV32I-NEXT:    ret
2247;
2248; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic:
2249; RV32IA:       # %bb.0:
2250; RV32IA-NEXT:    amoswap.w a0, a1, (a0)
2251; RV32IA-NEXT:    ret
2252;
2253; RV64I-LABEL: atomicrmw_xchg_i32_monotonic:
2254; RV64I:       # %bb.0:
2255; RV64I-NEXT:    addi sp, sp, -16
2256; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2257; RV64I-NEXT:    li a2, 0
2258; RV64I-NEXT:    call __atomic_exchange_4@plt
2259; RV64I-NEXT:    sext.w a0, a0
2260; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2261; RV64I-NEXT:    addi sp, sp, 16
2262; RV64I-NEXT:    ret
2263;
2264; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic:
2265; RV64IA:       # %bb.0:
2266; RV64IA-NEXT:    amoswap.w a0, a1, (a0)
2267; RV64IA-NEXT:    ret
2268  %1 = atomicrmw xchg i32* %a, i32 %b monotonic
2269  ret i32 %1
2270}
2271
2272define signext i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind {
2273; RV32I-LABEL: atomicrmw_add_i32_monotonic:
2274; RV32I:       # %bb.0:
2275; RV32I-NEXT:    addi sp, sp, -16
2276; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2277; RV32I-NEXT:    li a2, 0
2278; RV32I-NEXT:    call __atomic_fetch_add_4@plt
2279; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2280; RV32I-NEXT:    addi sp, sp, 16
2281; RV32I-NEXT:    ret
2282;
2283; RV32IA-LABEL: atomicrmw_add_i32_monotonic:
2284; RV32IA:       # %bb.0:
2285; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
2286; RV32IA-NEXT:    ret
2287;
2288; RV64I-LABEL: atomicrmw_add_i32_monotonic:
2289; RV64I:       # %bb.0:
2290; RV64I-NEXT:    addi sp, sp, -16
2291; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2292; RV64I-NEXT:    li a2, 0
2293; RV64I-NEXT:    call __atomic_fetch_add_4@plt
2294; RV64I-NEXT:    sext.w a0, a0
2295; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2296; RV64I-NEXT:    addi sp, sp, 16
2297; RV64I-NEXT:    ret
2298;
2299; RV64IA-LABEL: atomicrmw_add_i32_monotonic:
2300; RV64IA:       # %bb.0:
2301; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
2302; RV64IA-NEXT:    ret
2303  %1 = atomicrmw add i32* %a, i32 %b monotonic
2304  ret i32 %1
2305}
2306
2307define signext i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) nounwind {
2308; RV32I-LABEL: atomicrmw_sub_i32_monotonic:
2309; RV32I:       # %bb.0:
2310; RV32I-NEXT:    addi sp, sp, -16
2311; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2312; RV32I-NEXT:    li a2, 0
2313; RV32I-NEXT:    call __atomic_fetch_sub_4@plt
2314; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2315; RV32I-NEXT:    addi sp, sp, 16
2316; RV32I-NEXT:    ret
2317;
2318; RV32IA-LABEL: atomicrmw_sub_i32_monotonic:
2319; RV32IA:       # %bb.0:
2320; RV32IA-NEXT:    neg a1, a1
2321; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
2322; RV32IA-NEXT:    ret
2323;
2324; RV64I-LABEL: atomicrmw_sub_i32_monotonic:
2325; RV64I:       # %bb.0:
2326; RV64I-NEXT:    addi sp, sp, -16
2327; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2328; RV64I-NEXT:    li a2, 0
2329; RV64I-NEXT:    call __atomic_fetch_sub_4@plt
2330; RV64I-NEXT:    sext.w a0, a0
2331; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2332; RV64I-NEXT:    addi sp, sp, 16
2333; RV64I-NEXT:    ret
2334;
2335; RV64IA-LABEL: atomicrmw_sub_i32_monotonic:
2336; RV64IA:       # %bb.0:
2337; RV64IA-NEXT:    neg a1, a1
2338; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
2339; RV64IA-NEXT:    ret
2340  %1 = atomicrmw sub i32* %a, i32 %b monotonic
2341  ret i32 %1
2342}
2343
2344define signext i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind {
2345; RV32I-LABEL: atomicrmw_and_i32_monotonic:
2346; RV32I:       # %bb.0:
2347; RV32I-NEXT:    addi sp, sp, -16
2348; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2349; RV32I-NEXT:    li a2, 0
2350; RV32I-NEXT:    call __atomic_fetch_and_4@plt
2351; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2352; RV32I-NEXT:    addi sp, sp, 16
2353; RV32I-NEXT:    ret
2354;
2355; RV32IA-LABEL: atomicrmw_and_i32_monotonic:
2356; RV32IA:       # %bb.0:
2357; RV32IA-NEXT:    amoand.w a0, a1, (a0)
2358; RV32IA-NEXT:    ret
2359;
2360; RV64I-LABEL: atomicrmw_and_i32_monotonic:
2361; RV64I:       # %bb.0:
2362; RV64I-NEXT:    addi sp, sp, -16
2363; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2364; RV64I-NEXT:    li a2, 0
2365; RV64I-NEXT:    call __atomic_fetch_and_4@plt
2366; RV64I-NEXT:    sext.w a0, a0
2367; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2368; RV64I-NEXT:    addi sp, sp, 16
2369; RV64I-NEXT:    ret
2370;
2371; RV64IA-LABEL: atomicrmw_and_i32_monotonic:
2372; RV64IA:       # %bb.0:
2373; RV64IA-NEXT:    amoand.w a0, a1, (a0)
2374; RV64IA-NEXT:    ret
2375  %1 = atomicrmw and i32* %a, i32 %b monotonic
2376  ret i32 %1
2377}
2378
2379define signext i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) nounwind {
2380; RV32I-LABEL: atomicrmw_nand_i32_monotonic:
2381; RV32I:       # %bb.0:
2382; RV32I-NEXT:    addi sp, sp, -16
2383; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2384; RV32I-NEXT:    li a2, 0
2385; RV32I-NEXT:    call __atomic_fetch_nand_4@plt
2386; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2387; RV32I-NEXT:    addi sp, sp, 16
2388; RV32I-NEXT:    ret
2389;
2390; RV32IA-LABEL: atomicrmw_nand_i32_monotonic:
2391; RV32IA:       # %bb.0:
2392; RV32IA-NEXT:  .LBB29_1: # =>This Inner Loop Header: Depth=1
2393; RV32IA-NEXT:    lr.w a2, (a0)
2394; RV32IA-NEXT:    and a3, a2, a1
2395; RV32IA-NEXT:    not a3, a3
2396; RV32IA-NEXT:    sc.w a3, a3, (a0)
2397; RV32IA-NEXT:    bnez a3, .LBB29_1
2398; RV32IA-NEXT:  # %bb.2:
2399; RV32IA-NEXT:    mv a0, a2
2400; RV32IA-NEXT:    ret
2401;
2402; RV64I-LABEL: atomicrmw_nand_i32_monotonic:
2403; RV64I:       # %bb.0:
2404; RV64I-NEXT:    addi sp, sp, -16
2405; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2406; RV64I-NEXT:    li a2, 0
2407; RV64I-NEXT:    call __atomic_fetch_nand_4@plt
2408; RV64I-NEXT:    sext.w a0, a0
2409; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2410; RV64I-NEXT:    addi sp, sp, 16
2411; RV64I-NEXT:    ret
2412;
2413; RV64IA-LABEL: atomicrmw_nand_i32_monotonic:
2414; RV64IA:       # %bb.0:
2415; RV64IA-NEXT:  .LBB29_1: # =>This Inner Loop Header: Depth=1
2416; RV64IA-NEXT:    lr.w a2, (a0)
2417; RV64IA-NEXT:    and a3, a2, a1
2418; RV64IA-NEXT:    not a3, a3
2419; RV64IA-NEXT:    sc.w a3, a3, (a0)
2420; RV64IA-NEXT:    bnez a3, .LBB29_1
2421; RV64IA-NEXT:  # %bb.2:
2422; RV64IA-NEXT:    mv a0, a2
2423; RV64IA-NEXT:    ret
2424  %1 = atomicrmw nand i32* %a, i32 %b monotonic
2425  ret i32 %1
2426}
2427
2428define signext i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind {
2429; RV32I-LABEL: atomicrmw_or_i32_monotonic:
2430; RV32I:       # %bb.0:
2431; RV32I-NEXT:    addi sp, sp, -16
2432; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2433; RV32I-NEXT:    li a2, 0
2434; RV32I-NEXT:    call __atomic_fetch_or_4@plt
2435; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2436; RV32I-NEXT:    addi sp, sp, 16
2437; RV32I-NEXT:    ret
2438;
2439; RV32IA-LABEL: atomicrmw_or_i32_monotonic:
2440; RV32IA:       # %bb.0:
2441; RV32IA-NEXT:    amoor.w a0, a1, (a0)
2442; RV32IA-NEXT:    ret
2443;
2444; RV64I-LABEL: atomicrmw_or_i32_monotonic:
2445; RV64I:       # %bb.0:
2446; RV64I-NEXT:    addi sp, sp, -16
2447; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2448; RV64I-NEXT:    li a2, 0
2449; RV64I-NEXT:    call __atomic_fetch_or_4@plt
2450; RV64I-NEXT:    sext.w a0, a0
2451; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2452; RV64I-NEXT:    addi sp, sp, 16
2453; RV64I-NEXT:    ret
2454;
2455; RV64IA-LABEL: atomicrmw_or_i32_monotonic:
2456; RV64IA:       # %bb.0:
2457; RV64IA-NEXT:    amoor.w a0, a1, (a0)
2458; RV64IA-NEXT:    ret
2459  %1 = atomicrmw or i32* %a, i32 %b monotonic
2460  ret i32 %1
2461}
2462
2463define signext i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind {
2464; RV32I-LABEL: atomicrmw_xor_i32_monotonic:
2465; RV32I:       # %bb.0:
2466; RV32I-NEXT:    addi sp, sp, -16
2467; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2468; RV32I-NEXT:    li a2, 0
2469; RV32I-NEXT:    call __atomic_fetch_xor_4@plt
2470; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2471; RV32I-NEXT:    addi sp, sp, 16
2472; RV32I-NEXT:    ret
2473;
2474; RV32IA-LABEL: atomicrmw_xor_i32_monotonic:
2475; RV32IA:       # %bb.0:
2476; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
2477; RV32IA-NEXT:    ret
2478;
2479; RV64I-LABEL: atomicrmw_xor_i32_monotonic:
2480; RV64I:       # %bb.0:
2481; RV64I-NEXT:    addi sp, sp, -16
2482; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2483; RV64I-NEXT:    li a2, 0
2484; RV64I-NEXT:    call __atomic_fetch_xor_4@plt
2485; RV64I-NEXT:    sext.w a0, a0
2486; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2487; RV64I-NEXT:    addi sp, sp, 16
2488; RV64I-NEXT:    ret
2489;
2490; RV64IA-LABEL: atomicrmw_xor_i32_monotonic:
2491; RV64IA:       # %bb.0:
2492; RV64IA-NEXT:    amoxor.w a0, a1, (a0)
2493; RV64IA-NEXT:    ret
2494  %1 = atomicrmw xor i32* %a, i32 %b monotonic
2495  ret i32 %1
2496}
2497
2498define signext i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind {
2499; RV32I-LABEL: atomicrmw_max_i32_monotonic:
2500; RV32I:       # %bb.0:
2501; RV32I-NEXT:    addi sp, sp, -16
2502; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2503; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2504; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2505; RV32I-NEXT:    mv s0, a0
2506; RV32I-NEXT:    lw a3, 0(a0)
2507; RV32I-NEXT:    mv s1, a1
2508; RV32I-NEXT:    j .LBB32_2
2509; RV32I-NEXT:  .LBB32_1: # %atomicrmw.start
2510; RV32I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2511; RV32I-NEXT:    sw a3, 0(sp)
2512; RV32I-NEXT:    mv a1, sp
2513; RV32I-NEXT:    mv a0, s0
2514; RV32I-NEXT:    li a3, 0
2515; RV32I-NEXT:    li a4, 0
2516; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
2517; RV32I-NEXT:    lw a3, 0(sp)
2518; RV32I-NEXT:    bnez a0, .LBB32_4
2519; RV32I-NEXT:  .LBB32_2: # %atomicrmw.start
2520; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2521; RV32I-NEXT:    mv a2, a3
2522; RV32I-NEXT:    blt s1, a3, .LBB32_1
2523; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2524; RV32I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2525; RV32I-NEXT:    mv a2, s1
2526; RV32I-NEXT:    j .LBB32_1
2527; RV32I-NEXT:  .LBB32_4: # %atomicrmw.end
2528; RV32I-NEXT:    mv a0, a3
2529; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2530; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2531; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2532; RV32I-NEXT:    addi sp, sp, 16
2533; RV32I-NEXT:    ret
2534;
2535; RV32IA-LABEL: atomicrmw_max_i32_monotonic:
2536; RV32IA:       # %bb.0:
2537; RV32IA-NEXT:    amomax.w a0, a1, (a0)
2538; RV32IA-NEXT:    ret
2539;
2540; RV64I-LABEL: atomicrmw_max_i32_monotonic:
2541; RV64I:       # %bb.0:
2542; RV64I-NEXT:    addi sp, sp, -48
2543; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2544; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2545; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2546; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2547; RV64I-NEXT:    mv s0, a0
2548; RV64I-NEXT:    lw a3, 0(a0)
2549; RV64I-NEXT:    mv s2, a1
2550; RV64I-NEXT:    sext.w s1, a1
2551; RV64I-NEXT:    j .LBB32_2
2552; RV64I-NEXT:  .LBB32_1: # %atomicrmw.start
2553; RV64I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2554; RV64I-NEXT:    sw a3, 12(sp)
2555; RV64I-NEXT:    addi a1, sp, 12
2556; RV64I-NEXT:    mv a0, s0
2557; RV64I-NEXT:    li a3, 0
2558; RV64I-NEXT:    li a4, 0
2559; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
2560; RV64I-NEXT:    lw a3, 12(sp)
2561; RV64I-NEXT:    bnez a0, .LBB32_4
2562; RV64I-NEXT:  .LBB32_2: # %atomicrmw.start
2563; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2564; RV64I-NEXT:    mv a2, a3
2565; RV64I-NEXT:    blt s1, a3, .LBB32_1
2566; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2567; RV64I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2568; RV64I-NEXT:    mv a2, s2
2569; RV64I-NEXT:    j .LBB32_1
2570; RV64I-NEXT:  .LBB32_4: # %atomicrmw.end
2571; RV64I-NEXT:    mv a0, a3
2572; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2573; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2574; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2575; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2576; RV64I-NEXT:    addi sp, sp, 48
2577; RV64I-NEXT:    ret
2578;
2579; RV64IA-LABEL: atomicrmw_max_i32_monotonic:
2580; RV64IA:       # %bb.0:
2581; RV64IA-NEXT:    amomax.w a0, a1, (a0)
2582; RV64IA-NEXT:    ret
2583  %1 = atomicrmw max i32* %a, i32 %b monotonic
2584  ret i32 %1
2585}
2586
2587define signext i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind {
2588; RV32I-LABEL: atomicrmw_min_i32_monotonic:
2589; RV32I:       # %bb.0:
2590; RV32I-NEXT:    addi sp, sp, -16
2591; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2592; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2593; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2594; RV32I-NEXT:    mv s0, a0
2595; RV32I-NEXT:    lw a3, 0(a0)
2596; RV32I-NEXT:    mv s1, a1
2597; RV32I-NEXT:    j .LBB33_2
2598; RV32I-NEXT:  .LBB33_1: # %atomicrmw.start
2599; RV32I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2600; RV32I-NEXT:    sw a3, 0(sp)
2601; RV32I-NEXT:    mv a1, sp
2602; RV32I-NEXT:    mv a0, s0
2603; RV32I-NEXT:    li a3, 0
2604; RV32I-NEXT:    li a4, 0
2605; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
2606; RV32I-NEXT:    lw a3, 0(sp)
2607; RV32I-NEXT:    bnez a0, .LBB33_4
2608; RV32I-NEXT:  .LBB33_2: # %atomicrmw.start
2609; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2610; RV32I-NEXT:    mv a2, a3
2611; RV32I-NEXT:    bge s1, a3, .LBB33_1
2612; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2613; RV32I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2614; RV32I-NEXT:    mv a2, s1
2615; RV32I-NEXT:    j .LBB33_1
2616; RV32I-NEXT:  .LBB33_4: # %atomicrmw.end
2617; RV32I-NEXT:    mv a0, a3
2618; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2619; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2620; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2621; RV32I-NEXT:    addi sp, sp, 16
2622; RV32I-NEXT:    ret
2623;
2624; RV32IA-LABEL: atomicrmw_min_i32_monotonic:
2625; RV32IA:       # %bb.0:
2626; RV32IA-NEXT:    amomin.w a0, a1, (a0)
2627; RV32IA-NEXT:    ret
2628;
2629; RV64I-LABEL: atomicrmw_min_i32_monotonic:
2630; RV64I:       # %bb.0:
2631; RV64I-NEXT:    addi sp, sp, -48
2632; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2633; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2634; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2635; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2636; RV64I-NEXT:    mv s0, a0
2637; RV64I-NEXT:    lw a3, 0(a0)
2638; RV64I-NEXT:    mv s2, a1
2639; RV64I-NEXT:    sext.w s1, a1
2640; RV64I-NEXT:    j .LBB33_2
2641; RV64I-NEXT:  .LBB33_1: # %atomicrmw.start
2642; RV64I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2643; RV64I-NEXT:    sw a3, 12(sp)
2644; RV64I-NEXT:    addi a1, sp, 12
2645; RV64I-NEXT:    mv a0, s0
2646; RV64I-NEXT:    li a3, 0
2647; RV64I-NEXT:    li a4, 0
2648; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
2649; RV64I-NEXT:    lw a3, 12(sp)
2650; RV64I-NEXT:    bnez a0, .LBB33_4
2651; RV64I-NEXT:  .LBB33_2: # %atomicrmw.start
2652; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2653; RV64I-NEXT:    mv a2, a3
2654; RV64I-NEXT:    bge s1, a3, .LBB33_1
2655; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2656; RV64I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2657; RV64I-NEXT:    mv a2, s2
2658; RV64I-NEXT:    j .LBB33_1
2659; RV64I-NEXT:  .LBB33_4: # %atomicrmw.end
2660; RV64I-NEXT:    mv a0, a3
2661; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2662; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2663; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2664; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2665; RV64I-NEXT:    addi sp, sp, 48
2666; RV64I-NEXT:    ret
2667;
2668; RV64IA-LABEL: atomicrmw_min_i32_monotonic:
2669; RV64IA:       # %bb.0:
2670; RV64IA-NEXT:    amomin.w a0, a1, (a0)
2671; RV64IA-NEXT:    ret
2672  %1 = atomicrmw min i32* %a, i32 %b monotonic
2673  ret i32 %1
2674}
2675
2676define signext i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind {
2677; RV32I-LABEL: atomicrmw_umax_i32_monotonic:
2678; RV32I:       # %bb.0:
2679; RV32I-NEXT:    addi sp, sp, -16
2680; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2681; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2682; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2683; RV32I-NEXT:    mv s0, a0
2684; RV32I-NEXT:    lw a3, 0(a0)
2685; RV32I-NEXT:    mv s1, a1
2686; RV32I-NEXT:    j .LBB34_2
2687; RV32I-NEXT:  .LBB34_1: # %atomicrmw.start
2688; RV32I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2689; RV32I-NEXT:    sw a3, 0(sp)
2690; RV32I-NEXT:    mv a1, sp
2691; RV32I-NEXT:    mv a0, s0
2692; RV32I-NEXT:    li a3, 0
2693; RV32I-NEXT:    li a4, 0
2694; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
2695; RV32I-NEXT:    lw a3, 0(sp)
2696; RV32I-NEXT:    bnez a0, .LBB34_4
2697; RV32I-NEXT:  .LBB34_2: # %atomicrmw.start
2698; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2699; RV32I-NEXT:    mv a2, a3
2700; RV32I-NEXT:    bltu s1, a3, .LBB34_1
2701; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2702; RV32I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2703; RV32I-NEXT:    mv a2, s1
2704; RV32I-NEXT:    j .LBB34_1
2705; RV32I-NEXT:  .LBB34_4: # %atomicrmw.end
2706; RV32I-NEXT:    mv a0, a3
2707; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2708; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2709; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2710; RV32I-NEXT:    addi sp, sp, 16
2711; RV32I-NEXT:    ret
2712;
2713; RV32IA-LABEL: atomicrmw_umax_i32_monotonic:
2714; RV32IA:       # %bb.0:
2715; RV32IA-NEXT:    amomaxu.w a0, a1, (a0)
2716; RV32IA-NEXT:    ret
2717;
2718; RV64I-LABEL: atomicrmw_umax_i32_monotonic:
2719; RV64I:       # %bb.0:
2720; RV64I-NEXT:    addi sp, sp, -48
2721; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2722; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2723; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2724; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2725; RV64I-NEXT:    mv s0, a0
2726; RV64I-NEXT:    lw a3, 0(a0)
2727; RV64I-NEXT:    mv s2, a1
2728; RV64I-NEXT:    sext.w s1, a1
2729; RV64I-NEXT:    j .LBB34_2
2730; RV64I-NEXT:  .LBB34_1: # %atomicrmw.start
2731; RV64I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2732; RV64I-NEXT:    sw a3, 12(sp)
2733; RV64I-NEXT:    addi a1, sp, 12
2734; RV64I-NEXT:    mv a0, s0
2735; RV64I-NEXT:    li a3, 0
2736; RV64I-NEXT:    li a4, 0
2737; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
2738; RV64I-NEXT:    lw a3, 12(sp)
2739; RV64I-NEXT:    bnez a0, .LBB34_4
2740; RV64I-NEXT:  .LBB34_2: # %atomicrmw.start
2741; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2742; RV64I-NEXT:    mv a2, a3
2743; RV64I-NEXT:    bltu s1, a3, .LBB34_1
2744; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2745; RV64I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2746; RV64I-NEXT:    mv a2, s2
2747; RV64I-NEXT:    j .LBB34_1
2748; RV64I-NEXT:  .LBB34_4: # %atomicrmw.end
2749; RV64I-NEXT:    mv a0, a3
2750; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2751; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2752; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2753; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2754; RV64I-NEXT:    addi sp, sp, 48
2755; RV64I-NEXT:    ret
2756;
2757; RV64IA-LABEL: atomicrmw_umax_i32_monotonic:
2758; RV64IA:       # %bb.0:
2759; RV64IA-NEXT:    amomaxu.w a0, a1, (a0)
2760; RV64IA-NEXT:    ret
2761  %1 = atomicrmw umax i32* %a, i32 %b monotonic
2762  ret i32 %1
2763}
2764
2765define signext i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind {
2766; RV32I-LABEL: atomicrmw_umin_i32_monotonic:
2767; RV32I:       # %bb.0:
2768; RV32I-NEXT:    addi sp, sp, -16
2769; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2770; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2771; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2772; RV32I-NEXT:    mv s0, a0
2773; RV32I-NEXT:    lw a3, 0(a0)
2774; RV32I-NEXT:    mv s1, a1
2775; RV32I-NEXT:    j .LBB35_2
2776; RV32I-NEXT:  .LBB35_1: # %atomicrmw.start
2777; RV32I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2778; RV32I-NEXT:    sw a3, 0(sp)
2779; RV32I-NEXT:    mv a1, sp
2780; RV32I-NEXT:    mv a0, s0
2781; RV32I-NEXT:    li a3, 0
2782; RV32I-NEXT:    li a4, 0
2783; RV32I-NEXT:    call __atomic_compare_exchange_4@plt
2784; RV32I-NEXT:    lw a3, 0(sp)
2785; RV32I-NEXT:    bnez a0, .LBB35_4
2786; RV32I-NEXT:  .LBB35_2: # %atomicrmw.start
2787; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2788; RV32I-NEXT:    mv a2, a3
2789; RV32I-NEXT:    bgeu s1, a3, .LBB35_1
2790; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2791; RV32I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2792; RV32I-NEXT:    mv a2, s1
2793; RV32I-NEXT:    j .LBB35_1
2794; RV32I-NEXT:  .LBB35_4: # %atomicrmw.end
2795; RV32I-NEXT:    mv a0, a3
2796; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2797; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2798; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2799; RV32I-NEXT:    addi sp, sp, 16
2800; RV32I-NEXT:    ret
2801;
2802; RV32IA-LABEL: atomicrmw_umin_i32_monotonic:
2803; RV32IA:       # %bb.0:
2804; RV32IA-NEXT:    amominu.w a0, a1, (a0)
2805; RV32IA-NEXT:    ret
2806;
2807; RV64I-LABEL: atomicrmw_umin_i32_monotonic:
2808; RV64I:       # %bb.0:
2809; RV64I-NEXT:    addi sp, sp, -48
2810; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2811; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2812; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2813; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2814; RV64I-NEXT:    mv s0, a0
2815; RV64I-NEXT:    lw a3, 0(a0)
2816; RV64I-NEXT:    mv s2, a1
2817; RV64I-NEXT:    sext.w s1, a1
2818; RV64I-NEXT:    j .LBB35_2
2819; RV64I-NEXT:  .LBB35_1: # %atomicrmw.start
2820; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2821; RV64I-NEXT:    sw a3, 12(sp)
2822; RV64I-NEXT:    addi a1, sp, 12
2823; RV64I-NEXT:    mv a0, s0
2824; RV64I-NEXT:    li a3, 0
2825; RV64I-NEXT:    li a4, 0
2826; RV64I-NEXT:    call __atomic_compare_exchange_4@plt
2827; RV64I-NEXT:    lw a3, 12(sp)
2828; RV64I-NEXT:    bnez a0, .LBB35_4
2829; RV64I-NEXT:  .LBB35_2: # %atomicrmw.start
2830; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2831; RV64I-NEXT:    mv a2, a3
2832; RV64I-NEXT:    bgeu s1, a3, .LBB35_1
2833; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2834; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2835; RV64I-NEXT:    mv a2, s2
2836; RV64I-NEXT:    j .LBB35_1
2837; RV64I-NEXT:  .LBB35_4: # %atomicrmw.end
2838; RV64I-NEXT:    mv a0, a3
2839; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2840; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2841; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2842; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2843; RV64I-NEXT:    addi sp, sp, 48
2844; RV64I-NEXT:    ret
2845;
2846; RV64IA-LABEL: atomicrmw_umin_i32_monotonic:
2847; RV64IA:       # %bb.0:
2848; RV64IA-NEXT:    amominu.w a0, a1, (a0)
2849; RV64IA-NEXT:    ret
2850  %1 = atomicrmw umin i32* %a, i32 %b monotonic
2851  ret i32 %1
2852}
2853
2854define signext i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) nounwind {
2855; RV32I-LABEL: atomicrmw_xchg_i64_monotonic:
2856; RV32I:       # %bb.0:
2857; RV32I-NEXT:    addi sp, sp, -16
2858; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2859; RV32I-NEXT:    li a3, 0
2860; RV32I-NEXT:    call __atomic_exchange_8@plt
2861; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2862; RV32I-NEXT:    addi sp, sp, 16
2863; RV32I-NEXT:    ret
2864;
2865; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic:
2866; RV32IA:       # %bb.0:
2867; RV32IA-NEXT:    addi sp, sp, -16
2868; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2869; RV32IA-NEXT:    li a3, 0
2870; RV32IA-NEXT:    call __atomic_exchange_8@plt
2871; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2872; RV32IA-NEXT:    addi sp, sp, 16
2873; RV32IA-NEXT:    ret
2874;
2875; RV64I-LABEL: atomicrmw_xchg_i64_monotonic:
2876; RV64I:       # %bb.0:
2877; RV64I-NEXT:    addi sp, sp, -16
2878; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2879; RV64I-NEXT:    li a2, 0
2880; RV64I-NEXT:    call __atomic_exchange_8@plt
2881; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2882; RV64I-NEXT:    addi sp, sp, 16
2883; RV64I-NEXT:    ret
2884;
2885; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic:
2886; RV64IA:       # %bb.0:
2887; RV64IA-NEXT:    amoswap.d a0, a1, (a0)
2888; RV64IA-NEXT:    ret
2889  %1 = atomicrmw xchg i64* %a, i64 %b monotonic
2890  ret i64 %1
2891}
2892
2893define signext i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind {
2894; RV32I-LABEL: atomicrmw_add_i64_monotonic:
2895; RV32I:       # %bb.0:
2896; RV32I-NEXT:    addi sp, sp, -16
2897; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2898; RV32I-NEXT:    li a3, 0
2899; RV32I-NEXT:    call __atomic_fetch_add_8@plt
2900; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2901; RV32I-NEXT:    addi sp, sp, 16
2902; RV32I-NEXT:    ret
2903;
2904; RV32IA-LABEL: atomicrmw_add_i64_monotonic:
2905; RV32IA:       # %bb.0:
2906; RV32IA-NEXT:    addi sp, sp, -16
2907; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2908; RV32IA-NEXT:    li a3, 0
2909; RV32IA-NEXT:    call __atomic_fetch_add_8@plt
2910; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2911; RV32IA-NEXT:    addi sp, sp, 16
2912; RV32IA-NEXT:    ret
2913;
2914; RV64I-LABEL: atomicrmw_add_i64_monotonic:
2915; RV64I:       # %bb.0:
2916; RV64I-NEXT:    addi sp, sp, -16
2917; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2918; RV64I-NEXT:    li a2, 0
2919; RV64I-NEXT:    call __atomic_fetch_add_8@plt
2920; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2921; RV64I-NEXT:    addi sp, sp, 16
2922; RV64I-NEXT:    ret
2923;
2924; RV64IA-LABEL: atomicrmw_add_i64_monotonic:
2925; RV64IA:       # %bb.0:
2926; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
2927; RV64IA-NEXT:    ret
2928  %1 = atomicrmw add i64* %a, i64 %b monotonic
2929  ret i64 %1
2930}
2931
2932define signext i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) nounwind {
2933; RV32I-LABEL: atomicrmw_sub_i64_monotonic:
2934; RV32I:       # %bb.0:
2935; RV32I-NEXT:    addi sp, sp, -16
2936; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2937; RV32I-NEXT:    li a3, 0
2938; RV32I-NEXT:    call __atomic_fetch_sub_8@plt
2939; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2940; RV32I-NEXT:    addi sp, sp, 16
2941; RV32I-NEXT:    ret
2942;
2943; RV32IA-LABEL: atomicrmw_sub_i64_monotonic:
2944; RV32IA:       # %bb.0:
2945; RV32IA-NEXT:    addi sp, sp, -16
2946; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2947; RV32IA-NEXT:    li a3, 0
2948; RV32IA-NEXT:    call __atomic_fetch_sub_8@plt
2949; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2950; RV32IA-NEXT:    addi sp, sp, 16
2951; RV32IA-NEXT:    ret
2952;
2953; RV64I-LABEL: atomicrmw_sub_i64_monotonic:
2954; RV64I:       # %bb.0:
2955; RV64I-NEXT:    addi sp, sp, -16
2956; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2957; RV64I-NEXT:    li a2, 0
2958; RV64I-NEXT:    call __atomic_fetch_sub_8@plt
2959; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2960; RV64I-NEXT:    addi sp, sp, 16
2961; RV64I-NEXT:    ret
2962;
2963; RV64IA-LABEL: atomicrmw_sub_i64_monotonic:
2964; RV64IA:       # %bb.0:
2965; RV64IA-NEXT:    neg a1, a1
2966; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
2967; RV64IA-NEXT:    ret
2968  %1 = atomicrmw sub i64* %a, i64 %b monotonic
2969  ret i64 %1
2970}
2971
2972define signext i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind {
2973; RV32I-LABEL: atomicrmw_and_i64_monotonic:
2974; RV32I:       # %bb.0:
2975; RV32I-NEXT:    addi sp, sp, -16
2976; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2977; RV32I-NEXT:    li a3, 0
2978; RV32I-NEXT:    call __atomic_fetch_and_8@plt
2979; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2980; RV32I-NEXT:    addi sp, sp, 16
2981; RV32I-NEXT:    ret
2982;
2983; RV32IA-LABEL: atomicrmw_and_i64_monotonic:
2984; RV32IA:       # %bb.0:
2985; RV32IA-NEXT:    addi sp, sp, -16
2986; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2987; RV32IA-NEXT:    li a3, 0
2988; RV32IA-NEXT:    call __atomic_fetch_and_8@plt
2989; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2990; RV32IA-NEXT:    addi sp, sp, 16
2991; RV32IA-NEXT:    ret
2992;
2993; RV64I-LABEL: atomicrmw_and_i64_monotonic:
2994; RV64I:       # %bb.0:
2995; RV64I-NEXT:    addi sp, sp, -16
2996; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2997; RV64I-NEXT:    li a2, 0
2998; RV64I-NEXT:    call __atomic_fetch_and_8@plt
2999; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3000; RV64I-NEXT:    addi sp, sp, 16
3001; RV64I-NEXT:    ret
3002;
3003; RV64IA-LABEL: atomicrmw_and_i64_monotonic:
3004; RV64IA:       # %bb.0:
3005; RV64IA-NEXT:    amoand.d a0, a1, (a0)
3006; RV64IA-NEXT:    ret
3007  %1 = atomicrmw and i64* %a, i64 %b monotonic
3008  ret i64 %1
3009}
3010
3011define signext i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) nounwind {
3012; RV32I-LABEL: atomicrmw_nand_i64_monotonic:
3013; RV32I:       # %bb.0:
3014; RV32I-NEXT:    addi sp, sp, -16
3015; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3016; RV32I-NEXT:    li a3, 0
3017; RV32I-NEXT:    call __atomic_fetch_nand_8@plt
3018; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3019; RV32I-NEXT:    addi sp, sp, 16
3020; RV32I-NEXT:    ret
3021;
3022; RV32IA-LABEL: atomicrmw_nand_i64_monotonic:
3023; RV32IA:       # %bb.0:
3024; RV32IA-NEXT:    addi sp, sp, -16
3025; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3026; RV32IA-NEXT:    li a3, 0
3027; RV32IA-NEXT:    call __atomic_fetch_nand_8@plt
3028; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3029; RV32IA-NEXT:    addi sp, sp, 16
3030; RV32IA-NEXT:    ret
3031;
3032; RV64I-LABEL: atomicrmw_nand_i64_monotonic:
3033; RV64I:       # %bb.0:
3034; RV64I-NEXT:    addi sp, sp, -16
3035; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3036; RV64I-NEXT:    li a2, 0
3037; RV64I-NEXT:    call __atomic_fetch_nand_8@plt
3038; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3039; RV64I-NEXT:    addi sp, sp, 16
3040; RV64I-NEXT:    ret
3041;
3042; RV64IA-LABEL: atomicrmw_nand_i64_monotonic:
3043; RV64IA:       # %bb.0:
3044; RV64IA-NEXT:  .LBB40_1: # =>This Inner Loop Header: Depth=1
3045; RV64IA-NEXT:    lr.d a2, (a0)
3046; RV64IA-NEXT:    and a3, a2, a1
3047; RV64IA-NEXT:    not a3, a3
3048; RV64IA-NEXT:    sc.d a3, a3, (a0)
3049; RV64IA-NEXT:    bnez a3, .LBB40_1
3050; RV64IA-NEXT:  # %bb.2:
3051; RV64IA-NEXT:    mv a0, a2
3052; RV64IA-NEXT:    ret
3053  %1 = atomicrmw nand i64* %a, i64 %b monotonic
3054  ret i64 %1
3055}
3056
3057define signext i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind {
3058; RV32I-LABEL: atomicrmw_or_i64_monotonic:
3059; RV32I:       # %bb.0:
3060; RV32I-NEXT:    addi sp, sp, -16
3061; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3062; RV32I-NEXT:    li a3, 0
3063; RV32I-NEXT:    call __atomic_fetch_or_8@plt
3064; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3065; RV32I-NEXT:    addi sp, sp, 16
3066; RV32I-NEXT:    ret
3067;
3068; RV32IA-LABEL: atomicrmw_or_i64_monotonic:
3069; RV32IA:       # %bb.0:
3070; RV32IA-NEXT:    addi sp, sp, -16
3071; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3072; RV32IA-NEXT:    li a3, 0
3073; RV32IA-NEXT:    call __atomic_fetch_or_8@plt
3074; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3075; RV32IA-NEXT:    addi sp, sp, 16
3076; RV32IA-NEXT:    ret
3077;
3078; RV64I-LABEL: atomicrmw_or_i64_monotonic:
3079; RV64I:       # %bb.0:
3080; RV64I-NEXT:    addi sp, sp, -16
3081; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3082; RV64I-NEXT:    li a2, 0
3083; RV64I-NEXT:    call __atomic_fetch_or_8@plt
3084; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3085; RV64I-NEXT:    addi sp, sp, 16
3086; RV64I-NEXT:    ret
3087;
3088; RV64IA-LABEL: atomicrmw_or_i64_monotonic:
3089; RV64IA:       # %bb.0:
3090; RV64IA-NEXT:    amoor.d a0, a1, (a0)
3091; RV64IA-NEXT:    ret
3092  %1 = atomicrmw or i64* %a, i64 %b monotonic
3093  ret i64 %1
3094}
3095
3096define signext i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind {
3097; RV32I-LABEL: atomicrmw_xor_i64_monotonic:
3098; RV32I:       # %bb.0:
3099; RV32I-NEXT:    addi sp, sp, -16
3100; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3101; RV32I-NEXT:    li a3, 0
3102; RV32I-NEXT:    call __atomic_fetch_xor_8@plt
3103; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3104; RV32I-NEXT:    addi sp, sp, 16
3105; RV32I-NEXT:    ret
3106;
3107; RV32IA-LABEL: atomicrmw_xor_i64_monotonic:
3108; RV32IA:       # %bb.0:
3109; RV32IA-NEXT:    addi sp, sp, -16
3110; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3111; RV32IA-NEXT:    li a3, 0
3112; RV32IA-NEXT:    call __atomic_fetch_xor_8@plt
3113; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3114; RV32IA-NEXT:    addi sp, sp, 16
3115; RV32IA-NEXT:    ret
3116;
3117; RV64I-LABEL: atomicrmw_xor_i64_monotonic:
3118; RV64I:       # %bb.0:
3119; RV64I-NEXT:    addi sp, sp, -16
3120; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3121; RV64I-NEXT:    li a2, 0
3122; RV64I-NEXT:    call __atomic_fetch_xor_8@plt
3123; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3124; RV64I-NEXT:    addi sp, sp, 16
3125; RV64I-NEXT:    ret
3126;
3127; RV64IA-LABEL: atomicrmw_xor_i64_monotonic:
3128; RV64IA:       # %bb.0:
3129; RV64IA-NEXT:    amoxor.d a0, a1, (a0)
3130; RV64IA-NEXT:    ret
3131  %1 = atomicrmw xor i64* %a, i64 %b monotonic
3132  ret i64 %1
3133}
3134
3135define signext i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind {
3136; RV32I-LABEL: atomicrmw_max_i64_monotonic:
3137; RV32I:       # %bb.0:
3138; RV32I-NEXT:    addi sp, sp, -32
3139; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3140; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3141; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3142; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3143; RV32I-NEXT:    mv s0, a0
3144; RV32I-NEXT:    lw a5, 4(a0)
3145; RV32I-NEXT:    lw a4, 0(a0)
3146; RV32I-NEXT:    mv s1, a2
3147; RV32I-NEXT:    mv s2, a1
3148; RV32I-NEXT:    j .LBB43_2
3149; RV32I-NEXT:  .LBB43_1: # %atomicrmw.start
3150; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3151; RV32I-NEXT:    sw a4, 8(sp)
3152; RV32I-NEXT:    sw a5, 12(sp)
3153; RV32I-NEXT:    addi a1, sp, 8
3154; RV32I-NEXT:    mv a0, s0
3155; RV32I-NEXT:    li a4, 0
3156; RV32I-NEXT:    li a5, 0
3157; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
3158; RV32I-NEXT:    lw a5, 12(sp)
3159; RV32I-NEXT:    lw a4, 8(sp)
3160; RV32I-NEXT:    bnez a0, .LBB43_7
3161; RV32I-NEXT:  .LBB43_2: # %atomicrmw.start
3162; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3163; RV32I-NEXT:    beq a5, s1, .LBB43_4
3164; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3165; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3166; RV32I-NEXT:    slt a0, s1, a5
3167; RV32I-NEXT:    j .LBB43_5
3168; RV32I-NEXT:  .LBB43_4: # in Loop: Header=BB43_2 Depth=1
3169; RV32I-NEXT:    sltu a0, s2, a4
3170; RV32I-NEXT:  .LBB43_5: # %atomicrmw.start
3171; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3172; RV32I-NEXT:    mv a2, a4
3173; RV32I-NEXT:    mv a3, a5
3174; RV32I-NEXT:    bnez a0, .LBB43_1
3175; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3176; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3177; RV32I-NEXT:    mv a2, s2
3178; RV32I-NEXT:    mv a3, s1
3179; RV32I-NEXT:    j .LBB43_1
3180; RV32I-NEXT:  .LBB43_7: # %atomicrmw.end
3181; RV32I-NEXT:    mv a0, a4
3182; RV32I-NEXT:    mv a1, a5
3183; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3184; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3185; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3186; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3187; RV32I-NEXT:    addi sp, sp, 32
3188; RV32I-NEXT:    ret
3189;
3190; RV32IA-LABEL: atomicrmw_max_i64_monotonic:
3191; RV32IA:       # %bb.0:
3192; RV32IA-NEXT:    addi sp, sp, -32
3193; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3194; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3195; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3196; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3197; RV32IA-NEXT:    mv s0, a0
3198; RV32IA-NEXT:    lw a5, 4(a0)
3199; RV32IA-NEXT:    lw a4, 0(a0)
3200; RV32IA-NEXT:    mv s1, a2
3201; RV32IA-NEXT:    mv s2, a1
3202; RV32IA-NEXT:    j .LBB43_2
3203; RV32IA-NEXT:  .LBB43_1: # %atomicrmw.start
3204; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3205; RV32IA-NEXT:    sw a4, 8(sp)
3206; RV32IA-NEXT:    sw a5, 12(sp)
3207; RV32IA-NEXT:    addi a1, sp, 8
3208; RV32IA-NEXT:    mv a0, s0
3209; RV32IA-NEXT:    li a4, 0
3210; RV32IA-NEXT:    li a5, 0
3211; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
3212; RV32IA-NEXT:    lw a5, 12(sp)
3213; RV32IA-NEXT:    lw a4, 8(sp)
3214; RV32IA-NEXT:    bnez a0, .LBB43_7
3215; RV32IA-NEXT:  .LBB43_2: # %atomicrmw.start
3216; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3217; RV32IA-NEXT:    beq a5, s1, .LBB43_4
3218; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3219; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3220; RV32IA-NEXT:    slt a0, s1, a5
3221; RV32IA-NEXT:    j .LBB43_5
3222; RV32IA-NEXT:  .LBB43_4: # in Loop: Header=BB43_2 Depth=1
3223; RV32IA-NEXT:    sltu a0, s2, a4
3224; RV32IA-NEXT:  .LBB43_5: # %atomicrmw.start
3225; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3226; RV32IA-NEXT:    mv a2, a4
3227; RV32IA-NEXT:    mv a3, a5
3228; RV32IA-NEXT:    bnez a0, .LBB43_1
3229; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3230; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3231; RV32IA-NEXT:    mv a2, s2
3232; RV32IA-NEXT:    mv a3, s1
3233; RV32IA-NEXT:    j .LBB43_1
3234; RV32IA-NEXT:  .LBB43_7: # %atomicrmw.end
3235; RV32IA-NEXT:    mv a0, a4
3236; RV32IA-NEXT:    mv a1, a5
3237; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3238; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3239; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3240; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3241; RV32IA-NEXT:    addi sp, sp, 32
3242; RV32IA-NEXT:    ret
3243;
3244; RV64I-LABEL: atomicrmw_max_i64_monotonic:
3245; RV64I:       # %bb.0:
3246; RV64I-NEXT:    addi sp, sp, -32
3247; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3248; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3249; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3250; RV64I-NEXT:    mv s0, a0
3251; RV64I-NEXT:    ld a3, 0(a0)
3252; RV64I-NEXT:    mv s1, a1
3253; RV64I-NEXT:    j .LBB43_2
3254; RV64I-NEXT:  .LBB43_1: # %atomicrmw.start
3255; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3256; RV64I-NEXT:    sd a3, 0(sp)
3257; RV64I-NEXT:    mv a1, sp
3258; RV64I-NEXT:    mv a0, s0
3259; RV64I-NEXT:    li a3, 0
3260; RV64I-NEXT:    li a4, 0
3261; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
3262; RV64I-NEXT:    ld a3, 0(sp)
3263; RV64I-NEXT:    bnez a0, .LBB43_4
3264; RV64I-NEXT:  .LBB43_2: # %atomicrmw.start
3265; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3266; RV64I-NEXT:    mv a2, a3
3267; RV64I-NEXT:    blt s1, a3, .LBB43_1
3268; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3269; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3270; RV64I-NEXT:    mv a2, s1
3271; RV64I-NEXT:    j .LBB43_1
3272; RV64I-NEXT:  .LBB43_4: # %atomicrmw.end
3273; RV64I-NEXT:    mv a0, a3
3274; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3275; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3276; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3277; RV64I-NEXT:    addi sp, sp, 32
3278; RV64I-NEXT:    ret
3279;
3280; RV64IA-LABEL: atomicrmw_max_i64_monotonic:
3281; RV64IA:       # %bb.0:
3282; RV64IA-NEXT:    amomax.d a0, a1, (a0)
3283; RV64IA-NEXT:    ret
3284  %1 = atomicrmw max i64* %a, i64 %b monotonic
3285  ret i64 %1
3286}
3287
3288define signext i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind {
3289; RV32I-LABEL: atomicrmw_min_i64_monotonic:
3290; RV32I:       # %bb.0:
3291; RV32I-NEXT:    addi sp, sp, -32
3292; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3293; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3294; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3295; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3296; RV32I-NEXT:    mv s0, a0
3297; RV32I-NEXT:    lw a5, 4(a0)
3298; RV32I-NEXT:    lw a4, 0(a0)
3299; RV32I-NEXT:    mv s1, a2
3300; RV32I-NEXT:    mv s2, a1
3301; RV32I-NEXT:    j .LBB44_2
3302; RV32I-NEXT:  .LBB44_1: # %atomicrmw.start
3303; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3304; RV32I-NEXT:    sw a4, 8(sp)
3305; RV32I-NEXT:    sw a5, 12(sp)
3306; RV32I-NEXT:    addi a1, sp, 8
3307; RV32I-NEXT:    mv a0, s0
3308; RV32I-NEXT:    li a4, 0
3309; RV32I-NEXT:    li a5, 0
3310; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
3311; RV32I-NEXT:    lw a5, 12(sp)
3312; RV32I-NEXT:    lw a4, 8(sp)
3313; RV32I-NEXT:    bnez a0, .LBB44_7
3314; RV32I-NEXT:  .LBB44_2: # %atomicrmw.start
3315; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3316; RV32I-NEXT:    beq a5, s1, .LBB44_4
3317; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3318; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3319; RV32I-NEXT:    slt a0, s1, a5
3320; RV32I-NEXT:    j .LBB44_5
3321; RV32I-NEXT:  .LBB44_4: # in Loop: Header=BB44_2 Depth=1
3322; RV32I-NEXT:    sltu a0, s2, a4
3323; RV32I-NEXT:  .LBB44_5: # %atomicrmw.start
3324; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3325; RV32I-NEXT:    xori a0, a0, 1
3326; RV32I-NEXT:    mv a2, a4
3327; RV32I-NEXT:    mv a3, a5
3328; RV32I-NEXT:    bnez a0, .LBB44_1
3329; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3330; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3331; RV32I-NEXT:    mv a2, s2
3332; RV32I-NEXT:    mv a3, s1
3333; RV32I-NEXT:    j .LBB44_1
3334; RV32I-NEXT:  .LBB44_7: # %atomicrmw.end
3335; RV32I-NEXT:    mv a0, a4
3336; RV32I-NEXT:    mv a1, a5
3337; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3338; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3339; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3340; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3341; RV32I-NEXT:    addi sp, sp, 32
3342; RV32I-NEXT:    ret
3343;
3344; RV32IA-LABEL: atomicrmw_min_i64_monotonic:
3345; RV32IA:       # %bb.0:
3346; RV32IA-NEXT:    addi sp, sp, -32
3347; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3348; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3349; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3350; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3351; RV32IA-NEXT:    mv s0, a0
3352; RV32IA-NEXT:    lw a5, 4(a0)
3353; RV32IA-NEXT:    lw a4, 0(a0)
3354; RV32IA-NEXT:    mv s1, a2
3355; RV32IA-NEXT:    mv s2, a1
3356; RV32IA-NEXT:    j .LBB44_2
3357; RV32IA-NEXT:  .LBB44_1: # %atomicrmw.start
3358; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3359; RV32IA-NEXT:    sw a4, 8(sp)
3360; RV32IA-NEXT:    sw a5, 12(sp)
3361; RV32IA-NEXT:    addi a1, sp, 8
3362; RV32IA-NEXT:    mv a0, s0
3363; RV32IA-NEXT:    li a4, 0
3364; RV32IA-NEXT:    li a5, 0
3365; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
3366; RV32IA-NEXT:    lw a5, 12(sp)
3367; RV32IA-NEXT:    lw a4, 8(sp)
3368; RV32IA-NEXT:    bnez a0, .LBB44_7
3369; RV32IA-NEXT:  .LBB44_2: # %atomicrmw.start
3370; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3371; RV32IA-NEXT:    beq a5, s1, .LBB44_4
3372; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3373; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3374; RV32IA-NEXT:    slt a0, s1, a5
3375; RV32IA-NEXT:    j .LBB44_5
3376; RV32IA-NEXT:  .LBB44_4: # in Loop: Header=BB44_2 Depth=1
3377; RV32IA-NEXT:    sltu a0, s2, a4
3378; RV32IA-NEXT:  .LBB44_5: # %atomicrmw.start
3379; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3380; RV32IA-NEXT:    xori a0, a0, 1
3381; RV32IA-NEXT:    mv a2, a4
3382; RV32IA-NEXT:    mv a3, a5
3383; RV32IA-NEXT:    bnez a0, .LBB44_1
3384; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3385; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3386; RV32IA-NEXT:    mv a2, s2
3387; RV32IA-NEXT:    mv a3, s1
3388; RV32IA-NEXT:    j .LBB44_1
3389; RV32IA-NEXT:  .LBB44_7: # %atomicrmw.end
3390; RV32IA-NEXT:    mv a0, a4
3391; RV32IA-NEXT:    mv a1, a5
3392; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3393; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3394; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3395; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3396; RV32IA-NEXT:    addi sp, sp, 32
3397; RV32IA-NEXT:    ret
3398;
3399; RV64I-LABEL: atomicrmw_min_i64_monotonic:
3400; RV64I:       # %bb.0:
3401; RV64I-NEXT:    addi sp, sp, -32
3402; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3403; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3404; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3405; RV64I-NEXT:    mv s0, a0
3406; RV64I-NEXT:    ld a3, 0(a0)
3407; RV64I-NEXT:    mv s1, a1
3408; RV64I-NEXT:    j .LBB44_2
3409; RV64I-NEXT:  .LBB44_1: # %atomicrmw.start
3410; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3411; RV64I-NEXT:    sd a3, 0(sp)
3412; RV64I-NEXT:    mv a1, sp
3413; RV64I-NEXT:    mv a0, s0
3414; RV64I-NEXT:    li a3, 0
3415; RV64I-NEXT:    li a4, 0
3416; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
3417; RV64I-NEXT:    ld a3, 0(sp)
3418; RV64I-NEXT:    bnez a0, .LBB44_4
3419; RV64I-NEXT:  .LBB44_2: # %atomicrmw.start
3420; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3421; RV64I-NEXT:    mv a2, a3
3422; RV64I-NEXT:    bge s1, a3, .LBB44_1
3423; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3424; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3425; RV64I-NEXT:    mv a2, s1
3426; RV64I-NEXT:    j .LBB44_1
3427; RV64I-NEXT:  .LBB44_4: # %atomicrmw.end
3428; RV64I-NEXT:    mv a0, a3
3429; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3430; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3431; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3432; RV64I-NEXT:    addi sp, sp, 32
3433; RV64I-NEXT:    ret
3434;
3435; RV64IA-LABEL: atomicrmw_min_i64_monotonic:
3436; RV64IA:       # %bb.0:
3437; RV64IA-NEXT:    amomin.d a0, a1, (a0)
3438; RV64IA-NEXT:    ret
3439  %1 = atomicrmw min i64* %a, i64 %b monotonic
3440  ret i64 %1
3441}
3442
3443define signext i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind {
3444; RV32I-LABEL: atomicrmw_umax_i64_monotonic:
3445; RV32I:       # %bb.0:
3446; RV32I-NEXT:    addi sp, sp, -32
3447; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3448; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3449; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3450; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3451; RV32I-NEXT:    mv s0, a0
3452; RV32I-NEXT:    lw a5, 4(a0)
3453; RV32I-NEXT:    lw a4, 0(a0)
3454; RV32I-NEXT:    mv s1, a2
3455; RV32I-NEXT:    mv s2, a1
3456; RV32I-NEXT:    j .LBB45_2
3457; RV32I-NEXT:  .LBB45_1: # %atomicrmw.start
3458; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3459; RV32I-NEXT:    sw a4, 8(sp)
3460; RV32I-NEXT:    sw a5, 12(sp)
3461; RV32I-NEXT:    addi a1, sp, 8
3462; RV32I-NEXT:    mv a0, s0
3463; RV32I-NEXT:    li a4, 0
3464; RV32I-NEXT:    li a5, 0
3465; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
3466; RV32I-NEXT:    lw a5, 12(sp)
3467; RV32I-NEXT:    lw a4, 8(sp)
3468; RV32I-NEXT:    bnez a0, .LBB45_7
3469; RV32I-NEXT:  .LBB45_2: # %atomicrmw.start
3470; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3471; RV32I-NEXT:    beq a5, s1, .LBB45_4
3472; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3473; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3474; RV32I-NEXT:    sltu a0, s1, a5
3475; RV32I-NEXT:    j .LBB45_5
3476; RV32I-NEXT:  .LBB45_4: # in Loop: Header=BB45_2 Depth=1
3477; RV32I-NEXT:    sltu a0, s2, a4
3478; RV32I-NEXT:  .LBB45_5: # %atomicrmw.start
3479; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3480; RV32I-NEXT:    mv a2, a4
3481; RV32I-NEXT:    mv a3, a5
3482; RV32I-NEXT:    bnez a0, .LBB45_1
3483; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3484; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3485; RV32I-NEXT:    mv a2, s2
3486; RV32I-NEXT:    mv a3, s1
3487; RV32I-NEXT:    j .LBB45_1
3488; RV32I-NEXT:  .LBB45_7: # %atomicrmw.end
3489; RV32I-NEXT:    mv a0, a4
3490; RV32I-NEXT:    mv a1, a5
3491; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3492; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3493; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3494; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3495; RV32I-NEXT:    addi sp, sp, 32
3496; RV32I-NEXT:    ret
3497;
3498; RV32IA-LABEL: atomicrmw_umax_i64_monotonic:
3499; RV32IA:       # %bb.0:
3500; RV32IA-NEXT:    addi sp, sp, -32
3501; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3502; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3503; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3504; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3505; RV32IA-NEXT:    mv s0, a0
3506; RV32IA-NEXT:    lw a5, 4(a0)
3507; RV32IA-NEXT:    lw a4, 0(a0)
3508; RV32IA-NEXT:    mv s1, a2
3509; RV32IA-NEXT:    mv s2, a1
3510; RV32IA-NEXT:    j .LBB45_2
3511; RV32IA-NEXT:  .LBB45_1: # %atomicrmw.start
3512; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3513; RV32IA-NEXT:    sw a4, 8(sp)
3514; RV32IA-NEXT:    sw a5, 12(sp)
3515; RV32IA-NEXT:    addi a1, sp, 8
3516; RV32IA-NEXT:    mv a0, s0
3517; RV32IA-NEXT:    li a4, 0
3518; RV32IA-NEXT:    li a5, 0
3519; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
3520; RV32IA-NEXT:    lw a5, 12(sp)
3521; RV32IA-NEXT:    lw a4, 8(sp)
3522; RV32IA-NEXT:    bnez a0, .LBB45_7
3523; RV32IA-NEXT:  .LBB45_2: # %atomicrmw.start
3524; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3525; RV32IA-NEXT:    beq a5, s1, .LBB45_4
3526; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3527; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3528; RV32IA-NEXT:    sltu a0, s1, a5
3529; RV32IA-NEXT:    j .LBB45_5
3530; RV32IA-NEXT:  .LBB45_4: # in Loop: Header=BB45_2 Depth=1
3531; RV32IA-NEXT:    sltu a0, s2, a4
3532; RV32IA-NEXT:  .LBB45_5: # %atomicrmw.start
3533; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3534; RV32IA-NEXT:    mv a2, a4
3535; RV32IA-NEXT:    mv a3, a5
3536; RV32IA-NEXT:    bnez a0, .LBB45_1
3537; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3538; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3539; RV32IA-NEXT:    mv a2, s2
3540; RV32IA-NEXT:    mv a3, s1
3541; RV32IA-NEXT:    j .LBB45_1
3542; RV32IA-NEXT:  .LBB45_7: # %atomicrmw.end
3543; RV32IA-NEXT:    mv a0, a4
3544; RV32IA-NEXT:    mv a1, a5
3545; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3546; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3547; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3548; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3549; RV32IA-NEXT:    addi sp, sp, 32
3550; RV32IA-NEXT:    ret
3551;
3552; RV64I-LABEL: atomicrmw_umax_i64_monotonic:
3553; RV64I:       # %bb.0:
3554; RV64I-NEXT:    addi sp, sp, -32
3555; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3556; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3557; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3558; RV64I-NEXT:    mv s0, a0
3559; RV64I-NEXT:    ld a3, 0(a0)
3560; RV64I-NEXT:    mv s1, a1
3561; RV64I-NEXT:    j .LBB45_2
3562; RV64I-NEXT:  .LBB45_1: # %atomicrmw.start
3563; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3564; RV64I-NEXT:    sd a3, 0(sp)
3565; RV64I-NEXT:    mv a1, sp
3566; RV64I-NEXT:    mv a0, s0
3567; RV64I-NEXT:    li a3, 0
3568; RV64I-NEXT:    li a4, 0
3569; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
3570; RV64I-NEXT:    ld a3, 0(sp)
3571; RV64I-NEXT:    bnez a0, .LBB45_4
3572; RV64I-NEXT:  .LBB45_2: # %atomicrmw.start
3573; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3574; RV64I-NEXT:    mv a2, a3
3575; RV64I-NEXT:    bltu s1, a3, .LBB45_1
3576; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3577; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3578; RV64I-NEXT:    mv a2, s1
3579; RV64I-NEXT:    j .LBB45_1
3580; RV64I-NEXT:  .LBB45_4: # %atomicrmw.end
3581; RV64I-NEXT:    mv a0, a3
3582; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3583; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3584; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3585; RV64I-NEXT:    addi sp, sp, 32
3586; RV64I-NEXT:    ret
3587;
3588; RV64IA-LABEL: atomicrmw_umax_i64_monotonic:
3589; RV64IA:       # %bb.0:
3590; RV64IA-NEXT:    amomaxu.d a0, a1, (a0)
3591; RV64IA-NEXT:    ret
3592  %1 = atomicrmw umax i64* %a, i64 %b monotonic
3593  ret i64 %1
3594}
3595
3596define signext i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind {
3597; RV32I-LABEL: atomicrmw_umin_i64_monotonic:
3598; RV32I:       # %bb.0:
3599; RV32I-NEXT:    addi sp, sp, -32
3600; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3601; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3602; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3603; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3604; RV32I-NEXT:    mv s0, a0
3605; RV32I-NEXT:    lw a5, 4(a0)
3606; RV32I-NEXT:    lw a4, 0(a0)
3607; RV32I-NEXT:    mv s1, a2
3608; RV32I-NEXT:    mv s2, a1
3609; RV32I-NEXT:    j .LBB46_2
3610; RV32I-NEXT:  .LBB46_1: # %atomicrmw.start
3611; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3612; RV32I-NEXT:    sw a4, 8(sp)
3613; RV32I-NEXT:    sw a5, 12(sp)
3614; RV32I-NEXT:    addi a1, sp, 8
3615; RV32I-NEXT:    mv a0, s0
3616; RV32I-NEXT:    li a4, 0
3617; RV32I-NEXT:    li a5, 0
3618; RV32I-NEXT:    call __atomic_compare_exchange_8@plt
3619; RV32I-NEXT:    lw a5, 12(sp)
3620; RV32I-NEXT:    lw a4, 8(sp)
3621; RV32I-NEXT:    bnez a0, .LBB46_7
3622; RV32I-NEXT:  .LBB46_2: # %atomicrmw.start
3623; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3624; RV32I-NEXT:    beq a5, s1, .LBB46_4
3625; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3626; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3627; RV32I-NEXT:    sltu a0, s1, a5
3628; RV32I-NEXT:    j .LBB46_5
3629; RV32I-NEXT:  .LBB46_4: # in Loop: Header=BB46_2 Depth=1
3630; RV32I-NEXT:    sltu a0, s2, a4
3631; RV32I-NEXT:  .LBB46_5: # %atomicrmw.start
3632; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3633; RV32I-NEXT:    xori a0, a0, 1
3634; RV32I-NEXT:    mv a2, a4
3635; RV32I-NEXT:    mv a3, a5
3636; RV32I-NEXT:    bnez a0, .LBB46_1
3637; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3638; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3639; RV32I-NEXT:    mv a2, s2
3640; RV32I-NEXT:    mv a3, s1
3641; RV32I-NEXT:    j .LBB46_1
3642; RV32I-NEXT:  .LBB46_7: # %atomicrmw.end
3643; RV32I-NEXT:    mv a0, a4
3644; RV32I-NEXT:    mv a1, a5
3645; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3646; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3647; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3648; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3649; RV32I-NEXT:    addi sp, sp, 32
3650; RV32I-NEXT:    ret
3651;
3652; RV32IA-LABEL: atomicrmw_umin_i64_monotonic:
3653; RV32IA:       # %bb.0:
3654; RV32IA-NEXT:    addi sp, sp, -32
3655; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3656; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3657; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3658; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3659; RV32IA-NEXT:    mv s0, a0
3660; RV32IA-NEXT:    lw a5, 4(a0)
3661; RV32IA-NEXT:    lw a4, 0(a0)
3662; RV32IA-NEXT:    mv s1, a2
3663; RV32IA-NEXT:    mv s2, a1
3664; RV32IA-NEXT:    j .LBB46_2
3665; RV32IA-NEXT:  .LBB46_1: # %atomicrmw.start
3666; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3667; RV32IA-NEXT:    sw a4, 8(sp)
3668; RV32IA-NEXT:    sw a5, 12(sp)
3669; RV32IA-NEXT:    addi a1, sp, 8
3670; RV32IA-NEXT:    mv a0, s0
3671; RV32IA-NEXT:    li a4, 0
3672; RV32IA-NEXT:    li a5, 0
3673; RV32IA-NEXT:    call __atomic_compare_exchange_8@plt
3674; RV32IA-NEXT:    lw a5, 12(sp)
3675; RV32IA-NEXT:    lw a4, 8(sp)
3676; RV32IA-NEXT:    bnez a0, .LBB46_7
3677; RV32IA-NEXT:  .LBB46_2: # %atomicrmw.start
3678; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3679; RV32IA-NEXT:    beq a5, s1, .LBB46_4
3680; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3681; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3682; RV32IA-NEXT:    sltu a0, s1, a5
3683; RV32IA-NEXT:    j .LBB46_5
3684; RV32IA-NEXT:  .LBB46_4: # in Loop: Header=BB46_2 Depth=1
3685; RV32IA-NEXT:    sltu a0, s2, a4
3686; RV32IA-NEXT:  .LBB46_5: # %atomicrmw.start
3687; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3688; RV32IA-NEXT:    xori a0, a0, 1
3689; RV32IA-NEXT:    mv a2, a4
3690; RV32IA-NEXT:    mv a3, a5
3691; RV32IA-NEXT:    bnez a0, .LBB46_1
3692; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3693; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3694; RV32IA-NEXT:    mv a2, s2
3695; RV32IA-NEXT:    mv a3, s1
3696; RV32IA-NEXT:    j .LBB46_1
3697; RV32IA-NEXT:  .LBB46_7: # %atomicrmw.end
3698; RV32IA-NEXT:    mv a0, a4
3699; RV32IA-NEXT:    mv a1, a5
3700; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3701; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3702; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3703; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3704; RV32IA-NEXT:    addi sp, sp, 32
3705; RV32IA-NEXT:    ret
3706;
3707; RV64I-LABEL: atomicrmw_umin_i64_monotonic:
3708; RV64I:       # %bb.0:
3709; RV64I-NEXT:    addi sp, sp, -32
3710; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3711; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3712; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3713; RV64I-NEXT:    mv s0, a0
3714; RV64I-NEXT:    ld a3, 0(a0)
3715; RV64I-NEXT:    mv s1, a1
3716; RV64I-NEXT:    j .LBB46_2
3717; RV64I-NEXT:  .LBB46_1: # %atomicrmw.start
3718; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3719; RV64I-NEXT:    sd a3, 0(sp)
3720; RV64I-NEXT:    mv a1, sp
3721; RV64I-NEXT:    mv a0, s0
3722; RV64I-NEXT:    li a3, 0
3723; RV64I-NEXT:    li a4, 0
3724; RV64I-NEXT:    call __atomic_compare_exchange_8@plt
3725; RV64I-NEXT:    ld a3, 0(sp)
3726; RV64I-NEXT:    bnez a0, .LBB46_4
3727; RV64I-NEXT:  .LBB46_2: # %atomicrmw.start
3728; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3729; RV64I-NEXT:    mv a2, a3
3730; RV64I-NEXT:    bgeu s1, a3, .LBB46_1
3731; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3732; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3733; RV64I-NEXT:    mv a2, s1
3734; RV64I-NEXT:    j .LBB46_1
3735; RV64I-NEXT:  .LBB46_4: # %atomicrmw.end
3736; RV64I-NEXT:    mv a0, a3
3737; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3738; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3739; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3740; RV64I-NEXT:    addi sp, sp, 32
3741; RV64I-NEXT:    ret
3742;
3743; RV64IA-LABEL: atomicrmw_umin_i64_monotonic:
3744; RV64IA:       # %bb.0:
3745; RV64IA-NEXT:    amominu.d a0, a1, (a0)
3746; RV64IA-NEXT:    ret
3747  %1 = atomicrmw umin i64* %a, i64 %b monotonic
3748  ret i64 %1
3749}
3750