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