xref: /llvm-project/llvm/test/CodeGen/RISCV/atomic-signext.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
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-prefixes=RV32IA,RV32IA-NOZACAS %s
6; RUN: llc -mtriple=riscv32 -mattr=+a,+zacas -verify-machineinstrs < %s \
7; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS %s
8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
9; RUN:   | FileCheck -check-prefix=RV64I %s
10; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \
11; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS %s
12; RUN: llc -mtriple=riscv64 -mattr=+a,+zacas -verify-machineinstrs < %s \
13; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS %s
14
15define signext i8 @atomic_load_i8_unordered(ptr %a) nounwind {
16; RV32I-LABEL: atomic_load_i8_unordered:
17; RV32I:       # %bb.0:
18; RV32I-NEXT:    addi sp, sp, -16
19; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20; RV32I-NEXT:    li a1, 0
21; RV32I-NEXT:    call __atomic_load_1
22; RV32I-NEXT:    slli a0, a0, 24
23; RV32I-NEXT:    srai a0, a0, 24
24; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25; RV32I-NEXT:    addi sp, sp, 16
26; RV32I-NEXT:    ret
27;
28; RV32IA-LABEL: atomic_load_i8_unordered:
29; RV32IA:       # %bb.0:
30; RV32IA-NEXT:    lb a0, 0(a0)
31; RV32IA-NEXT:    ret
32;
33; RV64I-LABEL: atomic_load_i8_unordered:
34; RV64I:       # %bb.0:
35; RV64I-NEXT:    addi sp, sp, -16
36; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
37; RV64I-NEXT:    li a1, 0
38; RV64I-NEXT:    call __atomic_load_1
39; RV64I-NEXT:    slli a0, a0, 56
40; RV64I-NEXT:    srai a0, a0, 56
41; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
42; RV64I-NEXT:    addi sp, sp, 16
43; RV64I-NEXT:    ret
44;
45; RV64IA-LABEL: atomic_load_i8_unordered:
46; RV64IA:       # %bb.0:
47; RV64IA-NEXT:    lb a0, 0(a0)
48; RV64IA-NEXT:    ret
49  %1 = load atomic i8, ptr %a unordered, align 1
50  ret i8 %1
51}
52
53define signext i16 @atomic_load_i16_unordered(ptr %a) nounwind {
54; RV32I-LABEL: atomic_load_i16_unordered:
55; RV32I:       # %bb.0:
56; RV32I-NEXT:    addi sp, sp, -16
57; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
58; RV32I-NEXT:    li a1, 0
59; RV32I-NEXT:    call __atomic_load_2
60; RV32I-NEXT:    slli a0, a0, 16
61; RV32I-NEXT:    srai a0, a0, 16
62; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
63; RV32I-NEXT:    addi sp, sp, 16
64; RV32I-NEXT:    ret
65;
66; RV32IA-LABEL: atomic_load_i16_unordered:
67; RV32IA:       # %bb.0:
68; RV32IA-NEXT:    lh a0, 0(a0)
69; RV32IA-NEXT:    ret
70;
71; RV64I-LABEL: atomic_load_i16_unordered:
72; RV64I:       # %bb.0:
73; RV64I-NEXT:    addi sp, sp, -16
74; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
75; RV64I-NEXT:    li a1, 0
76; RV64I-NEXT:    call __atomic_load_2
77; RV64I-NEXT:    slli a0, a0, 48
78; RV64I-NEXT:    srai a0, a0, 48
79; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
80; RV64I-NEXT:    addi sp, sp, 16
81; RV64I-NEXT:    ret
82;
83; RV64IA-LABEL: atomic_load_i16_unordered:
84; RV64IA:       # %bb.0:
85; RV64IA-NEXT:    lh a0, 0(a0)
86; RV64IA-NEXT:    ret
87  %1 = load atomic i16, ptr %a unordered, align 2
88  ret i16 %1
89}
90
91define signext i32 @atomic_load_i32_unordered(ptr %a) nounwind {
92; RV32I-LABEL: atomic_load_i32_unordered:
93; RV32I:       # %bb.0:
94; RV32I-NEXT:    addi sp, sp, -16
95; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
96; RV32I-NEXT:    li a1, 0
97; RV32I-NEXT:    call __atomic_load_4
98; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
99; RV32I-NEXT:    addi sp, sp, 16
100; RV32I-NEXT:    ret
101;
102; RV32IA-LABEL: atomic_load_i32_unordered:
103; RV32IA:       # %bb.0:
104; RV32IA-NEXT:    lw a0, 0(a0)
105; RV32IA-NEXT:    ret
106;
107; RV64I-LABEL: atomic_load_i32_unordered:
108; RV64I:       # %bb.0:
109; RV64I-NEXT:    addi sp, sp, -16
110; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
111; RV64I-NEXT:    li a1, 0
112; RV64I-NEXT:    call __atomic_load_4
113; RV64I-NEXT:    sext.w a0, a0
114; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
115; RV64I-NEXT:    addi sp, sp, 16
116; RV64I-NEXT:    ret
117;
118; RV64IA-LABEL: atomic_load_i32_unordered:
119; RV64IA:       # %bb.0:
120; RV64IA-NEXT:    lw a0, 0(a0)
121; RV64IA-NEXT:    ret
122  %1 = load atomic i32, ptr %a unordered, align 4
123  ret i32 %1
124}
125
126
127define signext i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind {
128; RV32I-LABEL: atomicrmw_xchg_i8_monotonic:
129; RV32I:       # %bb.0:
130; RV32I-NEXT:    addi sp, sp, -16
131; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
132; RV32I-NEXT:    li a2, 0
133; RV32I-NEXT:    call __atomic_exchange_1
134; RV32I-NEXT:    slli a0, a0, 24
135; RV32I-NEXT:    srai a0, a0, 24
136; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
137; RV32I-NEXT:    addi sp, sp, 16
138; RV32I-NEXT:    ret
139;
140; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic:
141; RV32IA:       # %bb.0:
142; RV32IA-NEXT:    andi a2, a0, -4
143; RV32IA-NEXT:    slli a0, a0, 3
144; RV32IA-NEXT:    li a3, 255
145; RV32IA-NEXT:    andi a1, a1, 255
146; RV32IA-NEXT:    sll a3, a3, a0
147; RV32IA-NEXT:    sll a1, a1, a0
148; RV32IA-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
149; RV32IA-NEXT:    lr.w a4, (a2)
150; RV32IA-NEXT:    mv a5, a1
151; RV32IA-NEXT:    xor a5, a4, a5
152; RV32IA-NEXT:    and a5, a5, a3
153; RV32IA-NEXT:    xor a5, a4, a5
154; RV32IA-NEXT:    sc.w a5, a5, (a2)
155; RV32IA-NEXT:    bnez a5, .LBB3_1
156; RV32IA-NEXT:  # %bb.2:
157; RV32IA-NEXT:    srl a0, a4, a0
158; RV32IA-NEXT:    slli a0, a0, 24
159; RV32IA-NEXT:    srai a0, a0, 24
160; RV32IA-NEXT:    ret
161;
162; RV64I-LABEL: atomicrmw_xchg_i8_monotonic:
163; RV64I:       # %bb.0:
164; RV64I-NEXT:    addi sp, sp, -16
165; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
166; RV64I-NEXT:    li a2, 0
167; RV64I-NEXT:    call __atomic_exchange_1
168; RV64I-NEXT:    slli a0, a0, 56
169; RV64I-NEXT:    srai a0, a0, 56
170; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
171; RV64I-NEXT:    addi sp, sp, 16
172; RV64I-NEXT:    ret
173;
174; RV64IA-LABEL: atomicrmw_xchg_i8_monotonic:
175; RV64IA:       # %bb.0:
176; RV64IA-NEXT:    andi a2, a0, -4
177; RV64IA-NEXT:    slli a0, a0, 3
178; RV64IA-NEXT:    li a3, 255
179; RV64IA-NEXT:    andi a1, a1, 255
180; RV64IA-NEXT:    sllw a3, a3, a0
181; RV64IA-NEXT:    sllw a1, a1, a0
182; RV64IA-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
183; RV64IA-NEXT:    lr.w a4, (a2)
184; RV64IA-NEXT:    mv a5, a1
185; RV64IA-NEXT:    xor a5, a4, a5
186; RV64IA-NEXT:    and a5, a5, a3
187; RV64IA-NEXT:    xor a5, a4, a5
188; RV64IA-NEXT:    sc.w a5, a5, (a2)
189; RV64IA-NEXT:    bnez a5, .LBB3_1
190; RV64IA-NEXT:  # %bb.2:
191; RV64IA-NEXT:    srlw a0, a4, a0
192; RV64IA-NEXT:    slli a0, a0, 56
193; RV64IA-NEXT:    srai a0, a0, 56
194; RV64IA-NEXT:    ret
195  %1 = atomicrmw xchg ptr %a, i8 %b monotonic
196  ret i8 %1
197}
198
199define signext i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind {
200; RV32I-LABEL: atomicrmw_add_i8_monotonic:
201; RV32I:       # %bb.0:
202; RV32I-NEXT:    addi sp, sp, -16
203; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
204; RV32I-NEXT:    li a2, 0
205; RV32I-NEXT:    call __atomic_fetch_add_1
206; RV32I-NEXT:    slli a0, a0, 24
207; RV32I-NEXT:    srai a0, a0, 24
208; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
209; RV32I-NEXT:    addi sp, sp, 16
210; RV32I-NEXT:    ret
211;
212; RV32IA-LABEL: atomicrmw_add_i8_monotonic:
213; RV32IA:       # %bb.0:
214; RV32IA-NEXT:    andi a2, a0, -4
215; RV32IA-NEXT:    slli a0, a0, 3
216; RV32IA-NEXT:    li a3, 255
217; RV32IA-NEXT:    andi a1, a1, 255
218; RV32IA-NEXT:    sll a3, a3, a0
219; RV32IA-NEXT:    sll a1, a1, a0
220; RV32IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
221; RV32IA-NEXT:    lr.w a4, (a2)
222; RV32IA-NEXT:    add a5, a4, a1
223; RV32IA-NEXT:    xor a5, a4, a5
224; RV32IA-NEXT:    and a5, a5, a3
225; RV32IA-NEXT:    xor a5, a4, a5
226; RV32IA-NEXT:    sc.w a5, a5, (a2)
227; RV32IA-NEXT:    bnez a5, .LBB4_1
228; RV32IA-NEXT:  # %bb.2:
229; RV32IA-NEXT:    srl a0, a4, a0
230; RV32IA-NEXT:    slli a0, a0, 24
231; RV32IA-NEXT:    srai a0, a0, 24
232; RV32IA-NEXT:    ret
233;
234; RV64I-LABEL: atomicrmw_add_i8_monotonic:
235; RV64I:       # %bb.0:
236; RV64I-NEXT:    addi sp, sp, -16
237; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
238; RV64I-NEXT:    li a2, 0
239; RV64I-NEXT:    call __atomic_fetch_add_1
240; RV64I-NEXT:    slli a0, a0, 56
241; RV64I-NEXT:    srai a0, a0, 56
242; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
243; RV64I-NEXT:    addi sp, sp, 16
244; RV64I-NEXT:    ret
245;
246; RV64IA-LABEL: atomicrmw_add_i8_monotonic:
247; RV64IA:       # %bb.0:
248; RV64IA-NEXT:    andi a2, a0, -4
249; RV64IA-NEXT:    slli a0, a0, 3
250; RV64IA-NEXT:    li a3, 255
251; RV64IA-NEXT:    andi a1, a1, 255
252; RV64IA-NEXT:    sllw a3, a3, a0
253; RV64IA-NEXT:    sllw a1, a1, a0
254; RV64IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
255; RV64IA-NEXT:    lr.w a4, (a2)
256; RV64IA-NEXT:    add a5, a4, a1
257; RV64IA-NEXT:    xor a5, a4, a5
258; RV64IA-NEXT:    and a5, a5, a3
259; RV64IA-NEXT:    xor a5, a4, a5
260; RV64IA-NEXT:    sc.w a5, a5, (a2)
261; RV64IA-NEXT:    bnez a5, .LBB4_1
262; RV64IA-NEXT:  # %bb.2:
263; RV64IA-NEXT:    srlw a0, a4, a0
264; RV64IA-NEXT:    slli a0, a0, 56
265; RV64IA-NEXT:    srai a0, a0, 56
266; RV64IA-NEXT:    ret
267  %1 = atomicrmw add ptr %a, i8 %b monotonic
268  ret i8 %1
269}
270
271define signext i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind {
272; RV32I-LABEL: atomicrmw_sub_i8_monotonic:
273; RV32I:       # %bb.0:
274; RV32I-NEXT:    addi sp, sp, -16
275; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
276; RV32I-NEXT:    li a2, 0
277; RV32I-NEXT:    call __atomic_fetch_sub_1
278; RV32I-NEXT:    slli a0, a0, 24
279; RV32I-NEXT:    srai a0, a0, 24
280; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
281; RV32I-NEXT:    addi sp, sp, 16
282; RV32I-NEXT:    ret
283;
284; RV32IA-LABEL: atomicrmw_sub_i8_monotonic:
285; RV32IA:       # %bb.0:
286; RV32IA-NEXT:    andi a2, a0, -4
287; RV32IA-NEXT:    slli a0, a0, 3
288; RV32IA-NEXT:    li a3, 255
289; RV32IA-NEXT:    andi a1, a1, 255
290; RV32IA-NEXT:    sll a3, a3, a0
291; RV32IA-NEXT:    sll a1, a1, a0
292; RV32IA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
293; RV32IA-NEXT:    lr.w a4, (a2)
294; RV32IA-NEXT:    sub a5, a4, a1
295; RV32IA-NEXT:    xor a5, a4, a5
296; RV32IA-NEXT:    and a5, a5, a3
297; RV32IA-NEXT:    xor a5, a4, a5
298; RV32IA-NEXT:    sc.w a5, a5, (a2)
299; RV32IA-NEXT:    bnez a5, .LBB5_1
300; RV32IA-NEXT:  # %bb.2:
301; RV32IA-NEXT:    srl a0, a4, a0
302; RV32IA-NEXT:    slli a0, a0, 24
303; RV32IA-NEXT:    srai a0, a0, 24
304; RV32IA-NEXT:    ret
305;
306; RV64I-LABEL: atomicrmw_sub_i8_monotonic:
307; RV64I:       # %bb.0:
308; RV64I-NEXT:    addi sp, sp, -16
309; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
310; RV64I-NEXT:    li a2, 0
311; RV64I-NEXT:    call __atomic_fetch_sub_1
312; RV64I-NEXT:    slli a0, a0, 56
313; RV64I-NEXT:    srai a0, a0, 56
314; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
315; RV64I-NEXT:    addi sp, sp, 16
316; RV64I-NEXT:    ret
317;
318; RV64IA-LABEL: atomicrmw_sub_i8_monotonic:
319; RV64IA:       # %bb.0:
320; RV64IA-NEXT:    andi a2, a0, -4
321; RV64IA-NEXT:    slli a0, a0, 3
322; RV64IA-NEXT:    li a3, 255
323; RV64IA-NEXT:    andi a1, a1, 255
324; RV64IA-NEXT:    sllw a3, a3, a0
325; RV64IA-NEXT:    sllw a1, a1, a0
326; RV64IA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
327; RV64IA-NEXT:    lr.w a4, (a2)
328; RV64IA-NEXT:    sub a5, a4, a1
329; RV64IA-NEXT:    xor a5, a4, a5
330; RV64IA-NEXT:    and a5, a5, a3
331; RV64IA-NEXT:    xor a5, a4, a5
332; RV64IA-NEXT:    sc.w a5, a5, (a2)
333; RV64IA-NEXT:    bnez a5, .LBB5_1
334; RV64IA-NEXT:  # %bb.2:
335; RV64IA-NEXT:    srlw a0, a4, a0
336; RV64IA-NEXT:    slli a0, a0, 56
337; RV64IA-NEXT:    srai a0, a0, 56
338; RV64IA-NEXT:    ret
339  %1 = atomicrmw sub ptr %a, i8 %b monotonic
340  ret i8 %1
341}
342
343define signext i8 @atomicrmw_and_i8_monotonic(ptr %a, i8 %b) nounwind {
344; RV32I-LABEL: atomicrmw_and_i8_monotonic:
345; RV32I:       # %bb.0:
346; RV32I-NEXT:    addi sp, sp, -16
347; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
348; RV32I-NEXT:    li a2, 0
349; RV32I-NEXT:    call __atomic_fetch_and_1
350; RV32I-NEXT:    slli a0, a0, 24
351; RV32I-NEXT:    srai a0, a0, 24
352; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
353; RV32I-NEXT:    addi sp, sp, 16
354; RV32I-NEXT:    ret
355;
356; RV32IA-LABEL: atomicrmw_and_i8_monotonic:
357; RV32IA:       # %bb.0:
358; RV32IA-NEXT:    andi a2, a0, -4
359; RV32IA-NEXT:    slli a0, a0, 3
360; RV32IA-NEXT:    li a3, 255
361; RV32IA-NEXT:    andi a1, a1, 255
362; RV32IA-NEXT:    sll a3, a3, a0
363; RV32IA-NEXT:    not a3, a3
364; RV32IA-NEXT:    sll a1, a1, a0
365; RV32IA-NEXT:    or a1, a1, a3
366; RV32IA-NEXT:    amoand.w a1, a1, (a2)
367; RV32IA-NEXT:    srl a0, a1, a0
368; RV32IA-NEXT:    slli a0, a0, 24
369; RV32IA-NEXT:    srai a0, a0, 24
370; RV32IA-NEXT:    ret
371;
372; RV64I-LABEL: atomicrmw_and_i8_monotonic:
373; RV64I:       # %bb.0:
374; RV64I-NEXT:    addi sp, sp, -16
375; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
376; RV64I-NEXT:    li a2, 0
377; RV64I-NEXT:    call __atomic_fetch_and_1
378; RV64I-NEXT:    slli a0, a0, 56
379; RV64I-NEXT:    srai a0, a0, 56
380; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
381; RV64I-NEXT:    addi sp, sp, 16
382; RV64I-NEXT:    ret
383;
384; RV64IA-LABEL: atomicrmw_and_i8_monotonic:
385; RV64IA:       # %bb.0:
386; RV64IA-NEXT:    andi a2, a0, -4
387; RV64IA-NEXT:    slli a0, a0, 3
388; RV64IA-NEXT:    li a3, 255
389; RV64IA-NEXT:    andi a1, a1, 255
390; RV64IA-NEXT:    sllw a3, a3, a0
391; RV64IA-NEXT:    not a3, a3
392; RV64IA-NEXT:    sllw a1, a1, a0
393; RV64IA-NEXT:    or a1, a1, a3
394; RV64IA-NEXT:    amoand.w a1, a1, (a2)
395; RV64IA-NEXT:    srlw a0, a1, a0
396; RV64IA-NEXT:    slli a0, a0, 56
397; RV64IA-NEXT:    srai a0, a0, 56
398; RV64IA-NEXT:    ret
399  %1 = atomicrmw and ptr %a, i8 %b monotonic
400  ret i8 %1
401}
402
403define signext i8 @atomicrmw_nand_i8_monotonic(ptr %a, i8 %b) nounwind {
404; RV32I-LABEL: atomicrmw_nand_i8_monotonic:
405; RV32I:       # %bb.0:
406; RV32I-NEXT:    addi sp, sp, -16
407; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
408; RV32I-NEXT:    li a2, 0
409; RV32I-NEXT:    call __atomic_fetch_nand_1
410; RV32I-NEXT:    slli a0, a0, 24
411; RV32I-NEXT:    srai a0, a0, 24
412; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
413; RV32I-NEXT:    addi sp, sp, 16
414; RV32I-NEXT:    ret
415;
416; RV32IA-LABEL: atomicrmw_nand_i8_monotonic:
417; RV32IA:       # %bb.0:
418; RV32IA-NEXT:    andi a2, a0, -4
419; RV32IA-NEXT:    slli a0, a0, 3
420; RV32IA-NEXT:    li a3, 255
421; RV32IA-NEXT:    andi a1, a1, 255
422; RV32IA-NEXT:    sll a3, a3, a0
423; RV32IA-NEXT:    sll a1, a1, a0
424; RV32IA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
425; RV32IA-NEXT:    lr.w a4, (a2)
426; RV32IA-NEXT:    and a5, a4, a1
427; RV32IA-NEXT:    not a5, a5
428; RV32IA-NEXT:    xor a5, a4, a5
429; RV32IA-NEXT:    and a5, a5, a3
430; RV32IA-NEXT:    xor a5, a4, a5
431; RV32IA-NEXT:    sc.w a5, a5, (a2)
432; RV32IA-NEXT:    bnez a5, .LBB7_1
433; RV32IA-NEXT:  # %bb.2:
434; RV32IA-NEXT:    srl a0, a4, a0
435; RV32IA-NEXT:    slli a0, a0, 24
436; RV32IA-NEXT:    srai a0, a0, 24
437; RV32IA-NEXT:    ret
438;
439; RV64I-LABEL: atomicrmw_nand_i8_monotonic:
440; RV64I:       # %bb.0:
441; RV64I-NEXT:    addi sp, sp, -16
442; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
443; RV64I-NEXT:    li a2, 0
444; RV64I-NEXT:    call __atomic_fetch_nand_1
445; RV64I-NEXT:    slli a0, a0, 56
446; RV64I-NEXT:    srai a0, a0, 56
447; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
448; RV64I-NEXT:    addi sp, sp, 16
449; RV64I-NEXT:    ret
450;
451; RV64IA-LABEL: atomicrmw_nand_i8_monotonic:
452; RV64IA:       # %bb.0:
453; RV64IA-NEXT:    andi a2, a0, -4
454; RV64IA-NEXT:    slli a0, a0, 3
455; RV64IA-NEXT:    li a3, 255
456; RV64IA-NEXT:    andi a1, a1, 255
457; RV64IA-NEXT:    sllw a3, a3, a0
458; RV64IA-NEXT:    sllw a1, a1, a0
459; RV64IA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
460; RV64IA-NEXT:    lr.w a4, (a2)
461; RV64IA-NEXT:    and a5, a4, a1
462; RV64IA-NEXT:    not a5, a5
463; RV64IA-NEXT:    xor a5, a4, a5
464; RV64IA-NEXT:    and a5, a5, a3
465; RV64IA-NEXT:    xor a5, a4, a5
466; RV64IA-NEXT:    sc.w a5, a5, (a2)
467; RV64IA-NEXT:    bnez a5, .LBB7_1
468; RV64IA-NEXT:  # %bb.2:
469; RV64IA-NEXT:    srlw a0, a4, a0
470; RV64IA-NEXT:    slli a0, a0, 56
471; RV64IA-NEXT:    srai a0, a0, 56
472; RV64IA-NEXT:    ret
473  %1 = atomicrmw nand ptr %a, i8 %b monotonic
474  ret i8 %1
475}
476
477define signext i8 @atomicrmw_or_i8_monotonic(ptr %a, i8 %b) nounwind {
478; RV32I-LABEL: atomicrmw_or_i8_monotonic:
479; RV32I:       # %bb.0:
480; RV32I-NEXT:    addi sp, sp, -16
481; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
482; RV32I-NEXT:    li a2, 0
483; RV32I-NEXT:    call __atomic_fetch_or_1
484; RV32I-NEXT:    slli a0, a0, 24
485; RV32I-NEXT:    srai a0, a0, 24
486; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
487; RV32I-NEXT:    addi sp, sp, 16
488; RV32I-NEXT:    ret
489;
490; RV32IA-LABEL: atomicrmw_or_i8_monotonic:
491; RV32IA:       # %bb.0:
492; RV32IA-NEXT:    andi a2, a0, -4
493; RV32IA-NEXT:    slli a0, a0, 3
494; RV32IA-NEXT:    andi a1, a1, 255
495; RV32IA-NEXT:    sll a1, a1, a0
496; RV32IA-NEXT:    amoor.w a1, a1, (a2)
497; RV32IA-NEXT:    srl a0, a1, a0
498; RV32IA-NEXT:    slli a0, a0, 24
499; RV32IA-NEXT:    srai a0, a0, 24
500; RV32IA-NEXT:    ret
501;
502; RV64I-LABEL: atomicrmw_or_i8_monotonic:
503; RV64I:       # %bb.0:
504; RV64I-NEXT:    addi sp, sp, -16
505; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
506; RV64I-NEXT:    li a2, 0
507; RV64I-NEXT:    call __atomic_fetch_or_1
508; RV64I-NEXT:    slli a0, a0, 56
509; RV64I-NEXT:    srai a0, a0, 56
510; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
511; RV64I-NEXT:    addi sp, sp, 16
512; RV64I-NEXT:    ret
513;
514; RV64IA-LABEL: atomicrmw_or_i8_monotonic:
515; RV64IA:       # %bb.0:
516; RV64IA-NEXT:    andi a2, a0, -4
517; RV64IA-NEXT:    slli a0, a0, 3
518; RV64IA-NEXT:    andi a1, a1, 255
519; RV64IA-NEXT:    sllw a1, a1, a0
520; RV64IA-NEXT:    amoor.w a1, a1, (a2)
521; RV64IA-NEXT:    srlw a0, a1, a0
522; RV64IA-NEXT:    slli a0, a0, 56
523; RV64IA-NEXT:    srai a0, a0, 56
524; RV64IA-NEXT:    ret
525  %1 = atomicrmw or ptr %a, i8 %b monotonic
526  ret i8 %1
527}
528
529define signext i8 @atomicrmw_xor_i8_monotonic(ptr %a, i8 %b) nounwind {
530; RV32I-LABEL: atomicrmw_xor_i8_monotonic:
531; RV32I:       # %bb.0:
532; RV32I-NEXT:    addi sp, sp, -16
533; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
534; RV32I-NEXT:    li a2, 0
535; RV32I-NEXT:    call __atomic_fetch_xor_1
536; RV32I-NEXT:    slli a0, a0, 24
537; RV32I-NEXT:    srai a0, a0, 24
538; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
539; RV32I-NEXT:    addi sp, sp, 16
540; RV32I-NEXT:    ret
541;
542; RV32IA-LABEL: atomicrmw_xor_i8_monotonic:
543; RV32IA:       # %bb.0:
544; RV32IA-NEXT:    andi a2, a0, -4
545; RV32IA-NEXT:    slli a0, a0, 3
546; RV32IA-NEXT:    andi a1, a1, 255
547; RV32IA-NEXT:    sll a1, a1, a0
548; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
549; RV32IA-NEXT:    srl a0, a1, a0
550; RV32IA-NEXT:    slli a0, a0, 24
551; RV32IA-NEXT:    srai a0, a0, 24
552; RV32IA-NEXT:    ret
553;
554; RV64I-LABEL: atomicrmw_xor_i8_monotonic:
555; RV64I:       # %bb.0:
556; RV64I-NEXT:    addi sp, sp, -16
557; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
558; RV64I-NEXT:    li a2, 0
559; RV64I-NEXT:    call __atomic_fetch_xor_1
560; RV64I-NEXT:    slli a0, a0, 56
561; RV64I-NEXT:    srai a0, a0, 56
562; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
563; RV64I-NEXT:    addi sp, sp, 16
564; RV64I-NEXT:    ret
565;
566; RV64IA-LABEL: atomicrmw_xor_i8_monotonic:
567; RV64IA:       # %bb.0:
568; RV64IA-NEXT:    andi a2, a0, -4
569; RV64IA-NEXT:    slli a0, a0, 3
570; RV64IA-NEXT:    andi a1, a1, 255
571; RV64IA-NEXT:    sllw a1, a1, a0
572; RV64IA-NEXT:    amoxor.w a1, a1, (a2)
573; RV64IA-NEXT:    srlw a0, a1, a0
574; RV64IA-NEXT:    slli a0, a0, 56
575; RV64IA-NEXT:    srai a0, a0, 56
576; RV64IA-NEXT:    ret
577  %1 = atomicrmw xor ptr %a, i8 %b monotonic
578  ret i8 %1
579}
580
581define signext i8 @atomicrmw_max_i8_monotonic(ptr %a, i8 %b) nounwind {
582; RV32I-LABEL: atomicrmw_max_i8_monotonic:
583; RV32I:       # %bb.0:
584; RV32I-NEXT:    addi sp, sp, -32
585; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
586; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
587; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
588; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
589; RV32I-NEXT:    mv s0, a0
590; RV32I-NEXT:    lbu a3, 0(a0)
591; RV32I-NEXT:    mv s1, a1
592; RV32I-NEXT:    slli a0, a1, 24
593; RV32I-NEXT:    srai s2, a0, 24
594; RV32I-NEXT:    j .LBB10_2
595; RV32I-NEXT:  .LBB10_1: # %atomicrmw.start
596; RV32I-NEXT:    # in Loop: Header=BB10_2 Depth=1
597; RV32I-NEXT:    sb a3, 15(sp)
598; RV32I-NEXT:    addi a1, sp, 15
599; RV32I-NEXT:    mv a0, s0
600; RV32I-NEXT:    li a3, 0
601; RV32I-NEXT:    li a4, 0
602; RV32I-NEXT:    call __atomic_compare_exchange_1
603; RV32I-NEXT:    lbu a3, 15(sp)
604; RV32I-NEXT:    bnez a0, .LBB10_4
605; RV32I-NEXT:  .LBB10_2: # %atomicrmw.start
606; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
607; RV32I-NEXT:    slli a0, a3, 24
608; RV32I-NEXT:    srai a0, a0, 24
609; RV32I-NEXT:    mv a2, a3
610; RV32I-NEXT:    blt s2, a0, .LBB10_1
611; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
612; RV32I-NEXT:    # in Loop: Header=BB10_2 Depth=1
613; RV32I-NEXT:    mv a2, s1
614; RV32I-NEXT:    j .LBB10_1
615; RV32I-NEXT:  .LBB10_4: # %atomicrmw.end
616; RV32I-NEXT:    slli a0, a3, 24
617; RV32I-NEXT:    srai a0, a0, 24
618; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
619; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
620; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
621; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
622; RV32I-NEXT:    addi sp, sp, 32
623; RV32I-NEXT:    ret
624;
625; RV32IA-LABEL: atomicrmw_max_i8_monotonic:
626; RV32IA:       # %bb.0:
627; RV32IA-NEXT:    andi a2, a0, -4
628; RV32IA-NEXT:    slli a0, a0, 3
629; RV32IA-NEXT:    li a3, 255
630; RV32IA-NEXT:    slli a1, a1, 24
631; RV32IA-NEXT:    andi a4, a0, 24
632; RV32IA-NEXT:    sll a3, a3, a0
633; RV32IA-NEXT:    srai a1, a1, 24
634; RV32IA-NEXT:    sll a1, a1, a0
635; RV32IA-NEXT:    xori a4, a4, 24
636; RV32IA-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
637; RV32IA-NEXT:    lr.w a5, (a2)
638; RV32IA-NEXT:    and a7, a5, a3
639; RV32IA-NEXT:    mv a6, a5
640; RV32IA-NEXT:    sll a7, a7, a4
641; RV32IA-NEXT:    sra a7, a7, a4
642; RV32IA-NEXT:    bge a7, a1, .LBB10_3
643; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB10_1 Depth=1
644; RV32IA-NEXT:    xor a6, a5, a1
645; RV32IA-NEXT:    and a6, a6, a3
646; RV32IA-NEXT:    xor a6, a5, a6
647; RV32IA-NEXT:  .LBB10_3: # in Loop: Header=BB10_1 Depth=1
648; RV32IA-NEXT:    sc.w a6, a6, (a2)
649; RV32IA-NEXT:    bnez a6, .LBB10_1
650; RV32IA-NEXT:  # %bb.4:
651; RV32IA-NEXT:    srl a0, a5, a0
652; RV32IA-NEXT:    slli a0, a0, 24
653; RV32IA-NEXT:    srai a0, a0, 24
654; RV32IA-NEXT:    ret
655;
656; RV64I-LABEL: atomicrmw_max_i8_monotonic:
657; RV64I:       # %bb.0:
658; RV64I-NEXT:    addi sp, sp, -48
659; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
660; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
661; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
662; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
663; RV64I-NEXT:    mv s0, a0
664; RV64I-NEXT:    lbu a3, 0(a0)
665; RV64I-NEXT:    mv s1, a1
666; RV64I-NEXT:    slli a0, a1, 56
667; RV64I-NEXT:    srai s2, a0, 56
668; RV64I-NEXT:    j .LBB10_2
669; RV64I-NEXT:  .LBB10_1: # %atomicrmw.start
670; RV64I-NEXT:    # in Loop: Header=BB10_2 Depth=1
671; RV64I-NEXT:    sb a3, 15(sp)
672; RV64I-NEXT:    addi a1, sp, 15
673; RV64I-NEXT:    mv a0, s0
674; RV64I-NEXT:    li a3, 0
675; RV64I-NEXT:    li a4, 0
676; RV64I-NEXT:    call __atomic_compare_exchange_1
677; RV64I-NEXT:    lbu a3, 15(sp)
678; RV64I-NEXT:    bnez a0, .LBB10_4
679; RV64I-NEXT:  .LBB10_2: # %atomicrmw.start
680; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
681; RV64I-NEXT:    slli a0, a3, 56
682; RV64I-NEXT:    srai a0, a0, 56
683; RV64I-NEXT:    mv a2, a3
684; RV64I-NEXT:    blt s2, a0, .LBB10_1
685; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
686; RV64I-NEXT:    # in Loop: Header=BB10_2 Depth=1
687; RV64I-NEXT:    mv a2, s1
688; RV64I-NEXT:    j .LBB10_1
689; RV64I-NEXT:  .LBB10_4: # %atomicrmw.end
690; RV64I-NEXT:    slli a0, a3, 56
691; RV64I-NEXT:    srai a0, a0, 56
692; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
693; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
694; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
695; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
696; RV64I-NEXT:    addi sp, sp, 48
697; RV64I-NEXT:    ret
698;
699; RV64IA-LABEL: atomicrmw_max_i8_monotonic:
700; RV64IA:       # %bb.0:
701; RV64IA-NEXT:    andi a2, a0, -4
702; RV64IA-NEXT:    slli a0, a0, 3
703; RV64IA-NEXT:    li a3, 255
704; RV64IA-NEXT:    slli a1, a1, 56
705; RV64IA-NEXT:    andi a4, a0, 24
706; RV64IA-NEXT:    sllw a3, a3, a0
707; RV64IA-NEXT:    srai a1, a1, 56
708; RV64IA-NEXT:    sllw a1, a1, a0
709; RV64IA-NEXT:    xori a4, a4, 56
710; RV64IA-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
711; RV64IA-NEXT:    lr.w a5, (a2)
712; RV64IA-NEXT:    and a7, a5, a3
713; RV64IA-NEXT:    mv a6, a5
714; RV64IA-NEXT:    sll a7, a7, a4
715; RV64IA-NEXT:    sra a7, a7, a4
716; RV64IA-NEXT:    bge a7, a1, .LBB10_3
717; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB10_1 Depth=1
718; RV64IA-NEXT:    xor a6, a5, a1
719; RV64IA-NEXT:    and a6, a6, a3
720; RV64IA-NEXT:    xor a6, a5, a6
721; RV64IA-NEXT:  .LBB10_3: # in Loop: Header=BB10_1 Depth=1
722; RV64IA-NEXT:    sc.w a6, a6, (a2)
723; RV64IA-NEXT:    bnez a6, .LBB10_1
724; RV64IA-NEXT:  # %bb.4:
725; RV64IA-NEXT:    srlw a0, a5, a0
726; RV64IA-NEXT:    slli a0, a0, 56
727; RV64IA-NEXT:    srai a0, a0, 56
728; RV64IA-NEXT:    ret
729  %1 = atomicrmw max ptr %a, i8 %b monotonic
730  ret i8 %1
731}
732
733define signext i8 @atomicrmw_min_i8_monotonic(ptr %a, i8 %b) nounwind {
734; RV32I-LABEL: atomicrmw_min_i8_monotonic:
735; RV32I:       # %bb.0:
736; RV32I-NEXT:    addi sp, sp, -32
737; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
738; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
739; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
740; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
741; RV32I-NEXT:    mv s0, a0
742; RV32I-NEXT:    lbu a3, 0(a0)
743; RV32I-NEXT:    mv s1, a1
744; RV32I-NEXT:    slli a0, a1, 24
745; RV32I-NEXT:    srai s2, a0, 24
746; RV32I-NEXT:    j .LBB11_2
747; RV32I-NEXT:  .LBB11_1: # %atomicrmw.start
748; RV32I-NEXT:    # in Loop: Header=BB11_2 Depth=1
749; RV32I-NEXT:    sb a3, 15(sp)
750; RV32I-NEXT:    addi a1, sp, 15
751; RV32I-NEXT:    mv a0, s0
752; RV32I-NEXT:    li a3, 0
753; RV32I-NEXT:    li a4, 0
754; RV32I-NEXT:    call __atomic_compare_exchange_1
755; RV32I-NEXT:    lbu a3, 15(sp)
756; RV32I-NEXT:    bnez a0, .LBB11_4
757; RV32I-NEXT:  .LBB11_2: # %atomicrmw.start
758; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
759; RV32I-NEXT:    slli a0, a3, 24
760; RV32I-NEXT:    srai a0, a0, 24
761; RV32I-NEXT:    mv a2, a3
762; RV32I-NEXT:    bge s2, a0, .LBB11_1
763; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
764; RV32I-NEXT:    # in Loop: Header=BB11_2 Depth=1
765; RV32I-NEXT:    mv a2, s1
766; RV32I-NEXT:    j .LBB11_1
767; RV32I-NEXT:  .LBB11_4: # %atomicrmw.end
768; RV32I-NEXT:    slli a0, a3, 24
769; RV32I-NEXT:    srai a0, a0, 24
770; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
771; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
772; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
773; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
774; RV32I-NEXT:    addi sp, sp, 32
775; RV32I-NEXT:    ret
776;
777; RV32IA-LABEL: atomicrmw_min_i8_monotonic:
778; RV32IA:       # %bb.0:
779; RV32IA-NEXT:    andi a2, a0, -4
780; RV32IA-NEXT:    slli a0, a0, 3
781; RV32IA-NEXT:    li a3, 255
782; RV32IA-NEXT:    slli a1, a1, 24
783; RV32IA-NEXT:    andi a4, a0, 24
784; RV32IA-NEXT:    sll a3, a3, a0
785; RV32IA-NEXT:    srai a1, a1, 24
786; RV32IA-NEXT:    sll a1, a1, a0
787; RV32IA-NEXT:    xori a4, a4, 24
788; RV32IA-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
789; RV32IA-NEXT:    lr.w a5, (a2)
790; RV32IA-NEXT:    and a7, a5, a3
791; RV32IA-NEXT:    mv a6, a5
792; RV32IA-NEXT:    sll a7, a7, a4
793; RV32IA-NEXT:    sra a7, a7, a4
794; RV32IA-NEXT:    bge a1, a7, .LBB11_3
795; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB11_1 Depth=1
796; RV32IA-NEXT:    xor a6, a5, a1
797; RV32IA-NEXT:    and a6, a6, a3
798; RV32IA-NEXT:    xor a6, a5, a6
799; RV32IA-NEXT:  .LBB11_3: # in Loop: Header=BB11_1 Depth=1
800; RV32IA-NEXT:    sc.w a6, a6, (a2)
801; RV32IA-NEXT:    bnez a6, .LBB11_1
802; RV32IA-NEXT:  # %bb.4:
803; RV32IA-NEXT:    srl a0, a5, a0
804; RV32IA-NEXT:    slli a0, a0, 24
805; RV32IA-NEXT:    srai a0, a0, 24
806; RV32IA-NEXT:    ret
807;
808; RV64I-LABEL: atomicrmw_min_i8_monotonic:
809; RV64I:       # %bb.0:
810; RV64I-NEXT:    addi sp, sp, -48
811; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
812; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
813; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
814; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
815; RV64I-NEXT:    mv s0, a0
816; RV64I-NEXT:    lbu a3, 0(a0)
817; RV64I-NEXT:    mv s1, a1
818; RV64I-NEXT:    slli a0, a1, 56
819; RV64I-NEXT:    srai s2, a0, 56
820; RV64I-NEXT:    j .LBB11_2
821; RV64I-NEXT:  .LBB11_1: # %atomicrmw.start
822; RV64I-NEXT:    # in Loop: Header=BB11_2 Depth=1
823; RV64I-NEXT:    sb a3, 15(sp)
824; RV64I-NEXT:    addi a1, sp, 15
825; RV64I-NEXT:    mv a0, s0
826; RV64I-NEXT:    li a3, 0
827; RV64I-NEXT:    li a4, 0
828; RV64I-NEXT:    call __atomic_compare_exchange_1
829; RV64I-NEXT:    lbu a3, 15(sp)
830; RV64I-NEXT:    bnez a0, .LBB11_4
831; RV64I-NEXT:  .LBB11_2: # %atomicrmw.start
832; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
833; RV64I-NEXT:    slli a0, a3, 56
834; RV64I-NEXT:    srai a0, a0, 56
835; RV64I-NEXT:    mv a2, a3
836; RV64I-NEXT:    bge s2, a0, .LBB11_1
837; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
838; RV64I-NEXT:    # in Loop: Header=BB11_2 Depth=1
839; RV64I-NEXT:    mv a2, s1
840; RV64I-NEXT:    j .LBB11_1
841; RV64I-NEXT:  .LBB11_4: # %atomicrmw.end
842; RV64I-NEXT:    slli a0, a3, 56
843; RV64I-NEXT:    srai a0, a0, 56
844; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
845; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
846; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
847; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
848; RV64I-NEXT:    addi sp, sp, 48
849; RV64I-NEXT:    ret
850;
851; RV64IA-LABEL: atomicrmw_min_i8_monotonic:
852; RV64IA:       # %bb.0:
853; RV64IA-NEXT:    andi a2, a0, -4
854; RV64IA-NEXT:    slli a0, a0, 3
855; RV64IA-NEXT:    li a3, 255
856; RV64IA-NEXT:    slli a1, a1, 56
857; RV64IA-NEXT:    andi a4, a0, 24
858; RV64IA-NEXT:    sllw a3, a3, a0
859; RV64IA-NEXT:    srai a1, a1, 56
860; RV64IA-NEXT:    sllw a1, a1, a0
861; RV64IA-NEXT:    xori a4, a4, 56
862; RV64IA-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
863; RV64IA-NEXT:    lr.w a5, (a2)
864; RV64IA-NEXT:    and a7, a5, a3
865; RV64IA-NEXT:    mv a6, a5
866; RV64IA-NEXT:    sll a7, a7, a4
867; RV64IA-NEXT:    sra a7, a7, a4
868; RV64IA-NEXT:    bge a1, a7, .LBB11_3
869; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB11_1 Depth=1
870; RV64IA-NEXT:    xor a6, a5, a1
871; RV64IA-NEXT:    and a6, a6, a3
872; RV64IA-NEXT:    xor a6, a5, a6
873; RV64IA-NEXT:  .LBB11_3: # in Loop: Header=BB11_1 Depth=1
874; RV64IA-NEXT:    sc.w a6, a6, (a2)
875; RV64IA-NEXT:    bnez a6, .LBB11_1
876; RV64IA-NEXT:  # %bb.4:
877; RV64IA-NEXT:    srlw a0, a5, a0
878; RV64IA-NEXT:    slli a0, a0, 56
879; RV64IA-NEXT:    srai a0, a0, 56
880; RV64IA-NEXT:    ret
881  %1 = atomicrmw min ptr %a, i8 %b monotonic
882  ret i8 %1
883}
884
885define signext i8 @atomicrmw_umax_i8_monotonic(ptr %a, i8 %b) nounwind {
886; RV32I-LABEL: atomicrmw_umax_i8_monotonic:
887; RV32I:       # %bb.0:
888; RV32I-NEXT:    addi sp, sp, -32
889; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
890; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
891; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
892; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
893; RV32I-NEXT:    mv s0, a0
894; RV32I-NEXT:    lbu a3, 0(a0)
895; RV32I-NEXT:    mv s1, a1
896; RV32I-NEXT:    andi s2, a1, 255
897; RV32I-NEXT:    j .LBB12_2
898; RV32I-NEXT:  .LBB12_1: # %atomicrmw.start
899; RV32I-NEXT:    # in Loop: Header=BB12_2 Depth=1
900; RV32I-NEXT:    sb a3, 15(sp)
901; RV32I-NEXT:    addi a1, sp, 15
902; RV32I-NEXT:    mv a0, s0
903; RV32I-NEXT:    li a3, 0
904; RV32I-NEXT:    li a4, 0
905; RV32I-NEXT:    call __atomic_compare_exchange_1
906; RV32I-NEXT:    lbu a3, 15(sp)
907; RV32I-NEXT:    bnez a0, .LBB12_4
908; RV32I-NEXT:  .LBB12_2: # %atomicrmw.start
909; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
910; RV32I-NEXT:    andi a0, a3, 255
911; RV32I-NEXT:    mv a2, a3
912; RV32I-NEXT:    bltu s2, a0, .LBB12_1
913; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
914; RV32I-NEXT:    # in Loop: Header=BB12_2 Depth=1
915; RV32I-NEXT:    mv a2, s1
916; RV32I-NEXT:    j .LBB12_1
917; RV32I-NEXT:  .LBB12_4: # %atomicrmw.end
918; RV32I-NEXT:    slli a0, a3, 24
919; RV32I-NEXT:    srai a0, a0, 24
920; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
921; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
922; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
923; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
924; RV32I-NEXT:    addi sp, sp, 32
925; RV32I-NEXT:    ret
926;
927; RV32IA-LABEL: atomicrmw_umax_i8_monotonic:
928; RV32IA:       # %bb.0:
929; RV32IA-NEXT:    andi a2, a0, -4
930; RV32IA-NEXT:    slli a0, a0, 3
931; RV32IA-NEXT:    li a3, 255
932; RV32IA-NEXT:    andi a1, a1, 255
933; RV32IA-NEXT:    sll a3, a3, a0
934; RV32IA-NEXT:    sll a1, a1, a0
935; RV32IA-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
936; RV32IA-NEXT:    lr.w a4, (a2)
937; RV32IA-NEXT:    and a6, a4, a3
938; RV32IA-NEXT:    mv a5, a4
939; RV32IA-NEXT:    bgeu a6, a1, .LBB12_3
940; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB12_1 Depth=1
941; RV32IA-NEXT:    xor a5, a4, a1
942; RV32IA-NEXT:    and a5, a5, a3
943; RV32IA-NEXT:    xor a5, a4, a5
944; RV32IA-NEXT:  .LBB12_3: # in Loop: Header=BB12_1 Depth=1
945; RV32IA-NEXT:    sc.w a5, a5, (a2)
946; RV32IA-NEXT:    bnez a5, .LBB12_1
947; RV32IA-NEXT:  # %bb.4:
948; RV32IA-NEXT:    srl a0, a4, a0
949; RV32IA-NEXT:    slli a0, a0, 24
950; RV32IA-NEXT:    srai a0, a0, 24
951; RV32IA-NEXT:    ret
952;
953; RV64I-LABEL: atomicrmw_umax_i8_monotonic:
954; RV64I:       # %bb.0:
955; RV64I-NEXT:    addi sp, sp, -48
956; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
957; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
958; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
959; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
960; RV64I-NEXT:    mv s0, a0
961; RV64I-NEXT:    lbu a3, 0(a0)
962; RV64I-NEXT:    mv s1, a1
963; RV64I-NEXT:    andi s2, a1, 255
964; RV64I-NEXT:    j .LBB12_2
965; RV64I-NEXT:  .LBB12_1: # %atomicrmw.start
966; RV64I-NEXT:    # in Loop: Header=BB12_2 Depth=1
967; RV64I-NEXT:    sb a3, 15(sp)
968; RV64I-NEXT:    addi a1, sp, 15
969; RV64I-NEXT:    mv a0, s0
970; RV64I-NEXT:    li a3, 0
971; RV64I-NEXT:    li a4, 0
972; RV64I-NEXT:    call __atomic_compare_exchange_1
973; RV64I-NEXT:    lbu a3, 15(sp)
974; RV64I-NEXT:    bnez a0, .LBB12_4
975; RV64I-NEXT:  .LBB12_2: # %atomicrmw.start
976; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
977; RV64I-NEXT:    andi a0, a3, 255
978; RV64I-NEXT:    mv a2, a3
979; RV64I-NEXT:    bltu s2, a0, .LBB12_1
980; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
981; RV64I-NEXT:    # in Loop: Header=BB12_2 Depth=1
982; RV64I-NEXT:    mv a2, s1
983; RV64I-NEXT:    j .LBB12_1
984; RV64I-NEXT:  .LBB12_4: # %atomicrmw.end
985; RV64I-NEXT:    slli a0, a3, 56
986; RV64I-NEXT:    srai a0, a0, 56
987; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
988; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
989; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
990; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
991; RV64I-NEXT:    addi sp, sp, 48
992; RV64I-NEXT:    ret
993;
994; RV64IA-LABEL: atomicrmw_umax_i8_monotonic:
995; RV64IA:       # %bb.0:
996; RV64IA-NEXT:    andi a2, a0, -4
997; RV64IA-NEXT:    slli a0, a0, 3
998; RV64IA-NEXT:    li a3, 255
999; RV64IA-NEXT:    andi a1, a1, 255
1000; RV64IA-NEXT:    sllw a3, a3, a0
1001; RV64IA-NEXT:    sllw a1, a1, a0
1002; RV64IA-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
1003; RV64IA-NEXT:    lr.w a4, (a2)
1004; RV64IA-NEXT:    and a6, a4, a3
1005; RV64IA-NEXT:    mv a5, a4
1006; RV64IA-NEXT:    bgeu a6, a1, .LBB12_3
1007; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB12_1 Depth=1
1008; RV64IA-NEXT:    xor a5, a4, a1
1009; RV64IA-NEXT:    and a5, a5, a3
1010; RV64IA-NEXT:    xor a5, a4, a5
1011; RV64IA-NEXT:  .LBB12_3: # in Loop: Header=BB12_1 Depth=1
1012; RV64IA-NEXT:    sc.w a5, a5, (a2)
1013; RV64IA-NEXT:    bnez a5, .LBB12_1
1014; RV64IA-NEXT:  # %bb.4:
1015; RV64IA-NEXT:    srlw a0, a4, a0
1016; RV64IA-NEXT:    slli a0, a0, 56
1017; RV64IA-NEXT:    srai a0, a0, 56
1018; RV64IA-NEXT:    ret
1019  %1 = atomicrmw umax ptr %a, i8 %b monotonic
1020  ret i8 %1
1021}
1022
1023define signext i8 @atomicrmw_umin_i8_monotonic(ptr %a, i8 %b) nounwind {
1024; RV32I-LABEL: atomicrmw_umin_i8_monotonic:
1025; RV32I:       # %bb.0:
1026; RV32I-NEXT:    addi sp, sp, -32
1027; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1028; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1029; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1030; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1031; RV32I-NEXT:    mv s0, a0
1032; RV32I-NEXT:    lbu a3, 0(a0)
1033; RV32I-NEXT:    mv s1, a1
1034; RV32I-NEXT:    andi s2, a1, 255
1035; RV32I-NEXT:    j .LBB13_2
1036; RV32I-NEXT:  .LBB13_1: # %atomicrmw.start
1037; RV32I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1038; RV32I-NEXT:    sb a3, 15(sp)
1039; RV32I-NEXT:    addi a1, sp, 15
1040; RV32I-NEXT:    mv a0, s0
1041; RV32I-NEXT:    li a3, 0
1042; RV32I-NEXT:    li a4, 0
1043; RV32I-NEXT:    call __atomic_compare_exchange_1
1044; RV32I-NEXT:    lbu a3, 15(sp)
1045; RV32I-NEXT:    bnez a0, .LBB13_4
1046; RV32I-NEXT:  .LBB13_2: # %atomicrmw.start
1047; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1048; RV32I-NEXT:    andi a0, a3, 255
1049; RV32I-NEXT:    mv a2, a3
1050; RV32I-NEXT:    bgeu s2, a0, .LBB13_1
1051; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1052; RV32I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1053; RV32I-NEXT:    mv a2, s1
1054; RV32I-NEXT:    j .LBB13_1
1055; RV32I-NEXT:  .LBB13_4: # %atomicrmw.end
1056; RV32I-NEXT:    slli a0, a3, 24
1057; RV32I-NEXT:    srai a0, a0, 24
1058; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1059; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1060; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1061; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1062; RV32I-NEXT:    addi sp, sp, 32
1063; RV32I-NEXT:    ret
1064;
1065; RV32IA-LABEL: atomicrmw_umin_i8_monotonic:
1066; RV32IA:       # %bb.0:
1067; RV32IA-NEXT:    andi a2, a0, -4
1068; RV32IA-NEXT:    slli a0, a0, 3
1069; RV32IA-NEXT:    li a3, 255
1070; RV32IA-NEXT:    andi a1, a1, 255
1071; RV32IA-NEXT:    sll a3, a3, a0
1072; RV32IA-NEXT:    sll a1, a1, a0
1073; RV32IA-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
1074; RV32IA-NEXT:    lr.w a4, (a2)
1075; RV32IA-NEXT:    and a6, a4, a3
1076; RV32IA-NEXT:    mv a5, a4
1077; RV32IA-NEXT:    bgeu a1, a6, .LBB13_3
1078; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB13_1 Depth=1
1079; RV32IA-NEXT:    xor a5, a4, a1
1080; RV32IA-NEXT:    and a5, a5, a3
1081; RV32IA-NEXT:    xor a5, a4, a5
1082; RV32IA-NEXT:  .LBB13_3: # in Loop: Header=BB13_1 Depth=1
1083; RV32IA-NEXT:    sc.w a5, a5, (a2)
1084; RV32IA-NEXT:    bnez a5, .LBB13_1
1085; RV32IA-NEXT:  # %bb.4:
1086; RV32IA-NEXT:    srl a0, a4, a0
1087; RV32IA-NEXT:    slli a0, a0, 24
1088; RV32IA-NEXT:    srai a0, a0, 24
1089; RV32IA-NEXT:    ret
1090;
1091; RV64I-LABEL: atomicrmw_umin_i8_monotonic:
1092; RV64I:       # %bb.0:
1093; RV64I-NEXT:    addi sp, sp, -48
1094; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1095; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1096; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1097; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1098; RV64I-NEXT:    mv s0, a0
1099; RV64I-NEXT:    lbu a3, 0(a0)
1100; RV64I-NEXT:    mv s1, a1
1101; RV64I-NEXT:    andi s2, a1, 255
1102; RV64I-NEXT:    j .LBB13_2
1103; RV64I-NEXT:  .LBB13_1: # %atomicrmw.start
1104; RV64I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1105; RV64I-NEXT:    sb a3, 15(sp)
1106; RV64I-NEXT:    addi a1, sp, 15
1107; RV64I-NEXT:    mv a0, s0
1108; RV64I-NEXT:    li a3, 0
1109; RV64I-NEXT:    li a4, 0
1110; RV64I-NEXT:    call __atomic_compare_exchange_1
1111; RV64I-NEXT:    lbu a3, 15(sp)
1112; RV64I-NEXT:    bnez a0, .LBB13_4
1113; RV64I-NEXT:  .LBB13_2: # %atomicrmw.start
1114; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
1115; RV64I-NEXT:    andi a0, a3, 255
1116; RV64I-NEXT:    mv a2, a3
1117; RV64I-NEXT:    bgeu s2, a0, .LBB13_1
1118; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
1119; RV64I-NEXT:    # in Loop: Header=BB13_2 Depth=1
1120; RV64I-NEXT:    mv a2, s1
1121; RV64I-NEXT:    j .LBB13_1
1122; RV64I-NEXT:  .LBB13_4: # %atomicrmw.end
1123; RV64I-NEXT:    slli a0, a3, 56
1124; RV64I-NEXT:    srai a0, a0, 56
1125; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1126; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1127; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1128; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1129; RV64I-NEXT:    addi sp, sp, 48
1130; RV64I-NEXT:    ret
1131;
1132; RV64IA-LABEL: atomicrmw_umin_i8_monotonic:
1133; RV64IA:       # %bb.0:
1134; RV64IA-NEXT:    andi a2, a0, -4
1135; RV64IA-NEXT:    slli a0, a0, 3
1136; RV64IA-NEXT:    li a3, 255
1137; RV64IA-NEXT:    andi a1, a1, 255
1138; RV64IA-NEXT:    sllw a3, a3, a0
1139; RV64IA-NEXT:    sllw a1, a1, a0
1140; RV64IA-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
1141; RV64IA-NEXT:    lr.w a4, (a2)
1142; RV64IA-NEXT:    and a6, a4, a3
1143; RV64IA-NEXT:    mv a5, a4
1144; RV64IA-NEXT:    bgeu a1, a6, .LBB13_3
1145; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB13_1 Depth=1
1146; RV64IA-NEXT:    xor a5, a4, a1
1147; RV64IA-NEXT:    and a5, a5, a3
1148; RV64IA-NEXT:    xor a5, a4, a5
1149; RV64IA-NEXT:  .LBB13_3: # in Loop: Header=BB13_1 Depth=1
1150; RV64IA-NEXT:    sc.w a5, a5, (a2)
1151; RV64IA-NEXT:    bnez a5, .LBB13_1
1152; RV64IA-NEXT:  # %bb.4:
1153; RV64IA-NEXT:    srlw a0, a4, a0
1154; RV64IA-NEXT:    slli a0, a0, 56
1155; RV64IA-NEXT:    srai a0, a0, 56
1156; RV64IA-NEXT:    ret
1157  %1 = atomicrmw umin ptr %a, i8 %b monotonic
1158  ret i8 %1
1159}
1160
1161define signext i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind {
1162; RV32I-LABEL: atomicrmw_xchg_i16_monotonic:
1163; RV32I:       # %bb.0:
1164; RV32I-NEXT:    addi sp, sp, -16
1165; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1166; RV32I-NEXT:    li a2, 0
1167; RV32I-NEXT:    call __atomic_exchange_2
1168; RV32I-NEXT:    slli a0, a0, 16
1169; RV32I-NEXT:    srai a0, a0, 16
1170; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1171; RV32I-NEXT:    addi sp, sp, 16
1172; RV32I-NEXT:    ret
1173;
1174; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic:
1175; RV32IA:       # %bb.0:
1176; RV32IA-NEXT:    andi a2, a0, -4
1177; RV32IA-NEXT:    slli a0, a0, 3
1178; RV32IA-NEXT:    lui a3, 16
1179; RV32IA-NEXT:    addi a3, a3, -1
1180; RV32IA-NEXT:    sll a4, a3, a0
1181; RV32IA-NEXT:    and a1, a1, a3
1182; RV32IA-NEXT:    sll a1, a1, a0
1183; RV32IA-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
1184; RV32IA-NEXT:    lr.w a3, (a2)
1185; RV32IA-NEXT:    mv a5, a1
1186; RV32IA-NEXT:    xor a5, a3, a5
1187; RV32IA-NEXT:    and a5, a5, a4
1188; RV32IA-NEXT:    xor a5, a3, a5
1189; RV32IA-NEXT:    sc.w a5, a5, (a2)
1190; RV32IA-NEXT:    bnez a5, .LBB14_1
1191; RV32IA-NEXT:  # %bb.2:
1192; RV32IA-NEXT:    srl a0, a3, a0
1193; RV32IA-NEXT:    slli a0, a0, 16
1194; RV32IA-NEXT:    srai a0, a0, 16
1195; RV32IA-NEXT:    ret
1196;
1197; RV64I-LABEL: atomicrmw_xchg_i16_monotonic:
1198; RV64I:       # %bb.0:
1199; RV64I-NEXT:    addi sp, sp, -16
1200; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1201; RV64I-NEXT:    li a2, 0
1202; RV64I-NEXT:    call __atomic_exchange_2
1203; RV64I-NEXT:    slli a0, a0, 48
1204; RV64I-NEXT:    srai a0, a0, 48
1205; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1206; RV64I-NEXT:    addi sp, sp, 16
1207; RV64I-NEXT:    ret
1208;
1209; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic:
1210; RV64IA:       # %bb.0:
1211; RV64IA-NEXT:    andi a2, a0, -4
1212; RV64IA-NEXT:    slli a0, a0, 3
1213; RV64IA-NEXT:    lui a3, 16
1214; RV64IA-NEXT:    addi a3, a3, -1
1215; RV64IA-NEXT:    sllw a4, a3, a0
1216; RV64IA-NEXT:    and a1, a1, a3
1217; RV64IA-NEXT:    sllw a1, a1, a0
1218; RV64IA-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
1219; RV64IA-NEXT:    lr.w a3, (a2)
1220; RV64IA-NEXT:    mv a5, a1
1221; RV64IA-NEXT:    xor a5, a3, a5
1222; RV64IA-NEXT:    and a5, a5, a4
1223; RV64IA-NEXT:    xor a5, a3, a5
1224; RV64IA-NEXT:    sc.w a5, a5, (a2)
1225; RV64IA-NEXT:    bnez a5, .LBB14_1
1226; RV64IA-NEXT:  # %bb.2:
1227; RV64IA-NEXT:    srlw a0, a3, a0
1228; RV64IA-NEXT:    slli a0, a0, 48
1229; RV64IA-NEXT:    srai a0, a0, 48
1230; RV64IA-NEXT:    ret
1231  %1 = atomicrmw xchg ptr %a, i16 %b monotonic
1232  ret i16 %1
1233}
1234
1235define signext i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind {
1236; RV32I-LABEL: atomicrmw_add_i16_monotonic:
1237; RV32I:       # %bb.0:
1238; RV32I-NEXT:    addi sp, sp, -16
1239; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1240; RV32I-NEXT:    li a2, 0
1241; RV32I-NEXT:    call __atomic_fetch_add_2
1242; RV32I-NEXT:    slli a0, a0, 16
1243; RV32I-NEXT:    srai a0, a0, 16
1244; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1245; RV32I-NEXT:    addi sp, sp, 16
1246; RV32I-NEXT:    ret
1247;
1248; RV32IA-LABEL: atomicrmw_add_i16_monotonic:
1249; RV32IA:       # %bb.0:
1250; RV32IA-NEXT:    andi a2, a0, -4
1251; RV32IA-NEXT:    slli a0, a0, 3
1252; RV32IA-NEXT:    lui a3, 16
1253; RV32IA-NEXT:    addi a3, a3, -1
1254; RV32IA-NEXT:    sll a4, a3, a0
1255; RV32IA-NEXT:    and a1, a1, a3
1256; RV32IA-NEXT:    sll a1, a1, a0
1257; RV32IA-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
1258; RV32IA-NEXT:    lr.w a3, (a2)
1259; RV32IA-NEXT:    add a5, a3, a1
1260; RV32IA-NEXT:    xor a5, a3, a5
1261; RV32IA-NEXT:    and a5, a5, a4
1262; RV32IA-NEXT:    xor a5, a3, a5
1263; RV32IA-NEXT:    sc.w a5, a5, (a2)
1264; RV32IA-NEXT:    bnez a5, .LBB15_1
1265; RV32IA-NEXT:  # %bb.2:
1266; RV32IA-NEXT:    srl a0, a3, a0
1267; RV32IA-NEXT:    slli a0, a0, 16
1268; RV32IA-NEXT:    srai a0, a0, 16
1269; RV32IA-NEXT:    ret
1270;
1271; RV64I-LABEL: atomicrmw_add_i16_monotonic:
1272; RV64I:       # %bb.0:
1273; RV64I-NEXT:    addi sp, sp, -16
1274; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1275; RV64I-NEXT:    li a2, 0
1276; RV64I-NEXT:    call __atomic_fetch_add_2
1277; RV64I-NEXT:    slli a0, a0, 48
1278; RV64I-NEXT:    srai a0, a0, 48
1279; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1280; RV64I-NEXT:    addi sp, sp, 16
1281; RV64I-NEXT:    ret
1282;
1283; RV64IA-LABEL: atomicrmw_add_i16_monotonic:
1284; RV64IA:       # %bb.0:
1285; RV64IA-NEXT:    andi a2, a0, -4
1286; RV64IA-NEXT:    slli a0, a0, 3
1287; RV64IA-NEXT:    lui a3, 16
1288; RV64IA-NEXT:    addi a3, a3, -1
1289; RV64IA-NEXT:    sllw a4, a3, a0
1290; RV64IA-NEXT:    and a1, a1, a3
1291; RV64IA-NEXT:    sllw a1, a1, a0
1292; RV64IA-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
1293; RV64IA-NEXT:    lr.w a3, (a2)
1294; RV64IA-NEXT:    add a5, a3, a1
1295; RV64IA-NEXT:    xor a5, a3, a5
1296; RV64IA-NEXT:    and a5, a5, a4
1297; RV64IA-NEXT:    xor a5, a3, a5
1298; RV64IA-NEXT:    sc.w a5, a5, (a2)
1299; RV64IA-NEXT:    bnez a5, .LBB15_1
1300; RV64IA-NEXT:  # %bb.2:
1301; RV64IA-NEXT:    srlw a0, a3, a0
1302; RV64IA-NEXT:    slli a0, a0, 48
1303; RV64IA-NEXT:    srai a0, a0, 48
1304; RV64IA-NEXT:    ret
1305  %1 = atomicrmw add ptr %a, i16 %b monotonic
1306  ret i16 %1
1307}
1308
1309define signext i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind {
1310; RV32I-LABEL: atomicrmw_sub_i16_monotonic:
1311; RV32I:       # %bb.0:
1312; RV32I-NEXT:    addi sp, sp, -16
1313; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1314; RV32I-NEXT:    li a2, 0
1315; RV32I-NEXT:    call __atomic_fetch_sub_2
1316; RV32I-NEXT:    slli a0, a0, 16
1317; RV32I-NEXT:    srai a0, a0, 16
1318; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1319; RV32I-NEXT:    addi sp, sp, 16
1320; RV32I-NEXT:    ret
1321;
1322; RV32IA-LABEL: atomicrmw_sub_i16_monotonic:
1323; RV32IA:       # %bb.0:
1324; RV32IA-NEXT:    andi a2, a0, -4
1325; RV32IA-NEXT:    slli a0, a0, 3
1326; RV32IA-NEXT:    lui a3, 16
1327; RV32IA-NEXT:    addi a3, a3, -1
1328; RV32IA-NEXT:    sll a4, a3, a0
1329; RV32IA-NEXT:    and a1, a1, a3
1330; RV32IA-NEXT:    sll a1, a1, a0
1331; RV32IA-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1332; RV32IA-NEXT:    lr.w a3, (a2)
1333; RV32IA-NEXT:    sub a5, a3, a1
1334; RV32IA-NEXT:    xor a5, a3, a5
1335; RV32IA-NEXT:    and a5, a5, a4
1336; RV32IA-NEXT:    xor a5, a3, a5
1337; RV32IA-NEXT:    sc.w a5, a5, (a2)
1338; RV32IA-NEXT:    bnez a5, .LBB16_1
1339; RV32IA-NEXT:  # %bb.2:
1340; RV32IA-NEXT:    srl a0, a3, a0
1341; RV32IA-NEXT:    slli a0, a0, 16
1342; RV32IA-NEXT:    srai a0, a0, 16
1343; RV32IA-NEXT:    ret
1344;
1345; RV64I-LABEL: atomicrmw_sub_i16_monotonic:
1346; RV64I:       # %bb.0:
1347; RV64I-NEXT:    addi sp, sp, -16
1348; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1349; RV64I-NEXT:    li a2, 0
1350; RV64I-NEXT:    call __atomic_fetch_sub_2
1351; RV64I-NEXT:    slli a0, a0, 48
1352; RV64I-NEXT:    srai a0, a0, 48
1353; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1354; RV64I-NEXT:    addi sp, sp, 16
1355; RV64I-NEXT:    ret
1356;
1357; RV64IA-LABEL: atomicrmw_sub_i16_monotonic:
1358; RV64IA:       # %bb.0:
1359; RV64IA-NEXT:    andi a2, a0, -4
1360; RV64IA-NEXT:    slli a0, a0, 3
1361; RV64IA-NEXT:    lui a3, 16
1362; RV64IA-NEXT:    addi a3, a3, -1
1363; RV64IA-NEXT:    sllw a4, a3, a0
1364; RV64IA-NEXT:    and a1, a1, a3
1365; RV64IA-NEXT:    sllw a1, a1, a0
1366; RV64IA-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1367; RV64IA-NEXT:    lr.w a3, (a2)
1368; RV64IA-NEXT:    sub a5, a3, a1
1369; RV64IA-NEXT:    xor a5, a3, a5
1370; RV64IA-NEXT:    and a5, a5, a4
1371; RV64IA-NEXT:    xor a5, a3, a5
1372; RV64IA-NEXT:    sc.w a5, a5, (a2)
1373; RV64IA-NEXT:    bnez a5, .LBB16_1
1374; RV64IA-NEXT:  # %bb.2:
1375; RV64IA-NEXT:    srlw a0, a3, a0
1376; RV64IA-NEXT:    slli a0, a0, 48
1377; RV64IA-NEXT:    srai a0, a0, 48
1378; RV64IA-NEXT:    ret
1379  %1 = atomicrmw sub ptr %a, i16 %b monotonic
1380  ret i16 %1
1381}
1382
1383define signext i16 @atomicrmw_and_i16_monotonic(ptr %a, i16 %b) nounwind {
1384; RV32I-LABEL: atomicrmw_and_i16_monotonic:
1385; RV32I:       # %bb.0:
1386; RV32I-NEXT:    addi sp, sp, -16
1387; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1388; RV32I-NEXT:    li a2, 0
1389; RV32I-NEXT:    call __atomic_fetch_and_2
1390; RV32I-NEXT:    slli a0, a0, 16
1391; RV32I-NEXT:    srai a0, a0, 16
1392; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1393; RV32I-NEXT:    addi sp, sp, 16
1394; RV32I-NEXT:    ret
1395;
1396; RV32IA-LABEL: atomicrmw_and_i16_monotonic:
1397; RV32IA:       # %bb.0:
1398; RV32IA-NEXT:    andi a2, a0, -4
1399; RV32IA-NEXT:    slli a0, a0, 3
1400; RV32IA-NEXT:    lui a3, 16
1401; RV32IA-NEXT:    addi a3, a3, -1
1402; RV32IA-NEXT:    sll a4, a3, a0
1403; RV32IA-NEXT:    and a1, a1, a3
1404; RV32IA-NEXT:    not a3, a4
1405; RV32IA-NEXT:    sll a1, a1, a0
1406; RV32IA-NEXT:    or a1, a1, a3
1407; RV32IA-NEXT:    amoand.w a1, a1, (a2)
1408; RV32IA-NEXT:    srl a0, a1, a0
1409; RV32IA-NEXT:    slli a0, a0, 16
1410; RV32IA-NEXT:    srai a0, a0, 16
1411; RV32IA-NEXT:    ret
1412;
1413; RV64I-LABEL: atomicrmw_and_i16_monotonic:
1414; RV64I:       # %bb.0:
1415; RV64I-NEXT:    addi sp, sp, -16
1416; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1417; RV64I-NEXT:    li a2, 0
1418; RV64I-NEXT:    call __atomic_fetch_and_2
1419; RV64I-NEXT:    slli a0, a0, 48
1420; RV64I-NEXT:    srai a0, a0, 48
1421; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1422; RV64I-NEXT:    addi sp, sp, 16
1423; RV64I-NEXT:    ret
1424;
1425; RV64IA-LABEL: atomicrmw_and_i16_monotonic:
1426; RV64IA:       # %bb.0:
1427; RV64IA-NEXT:    andi a2, a0, -4
1428; RV64IA-NEXT:    slli a0, a0, 3
1429; RV64IA-NEXT:    lui a3, 16
1430; RV64IA-NEXT:    addi a3, a3, -1
1431; RV64IA-NEXT:    sllw a4, a3, a0
1432; RV64IA-NEXT:    and a1, a1, a3
1433; RV64IA-NEXT:    not a3, a4
1434; RV64IA-NEXT:    sllw a1, a1, a0
1435; RV64IA-NEXT:    or a1, a1, a3
1436; RV64IA-NEXT:    amoand.w a1, a1, (a2)
1437; RV64IA-NEXT:    srlw a0, a1, a0
1438; RV64IA-NEXT:    slli a0, a0, 48
1439; RV64IA-NEXT:    srai a0, a0, 48
1440; RV64IA-NEXT:    ret
1441  %1 = atomicrmw and ptr %a, i16 %b monotonic
1442  ret i16 %1
1443}
1444
1445define signext i16 @atomicrmw_nand_i16_monotonic(ptr %a, i16 %b) nounwind {
1446; RV32I-LABEL: atomicrmw_nand_i16_monotonic:
1447; RV32I:       # %bb.0:
1448; RV32I-NEXT:    addi sp, sp, -16
1449; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1450; RV32I-NEXT:    li a2, 0
1451; RV32I-NEXT:    call __atomic_fetch_nand_2
1452; RV32I-NEXT:    slli a0, a0, 16
1453; RV32I-NEXT:    srai a0, a0, 16
1454; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1455; RV32I-NEXT:    addi sp, sp, 16
1456; RV32I-NEXT:    ret
1457;
1458; RV32IA-LABEL: atomicrmw_nand_i16_monotonic:
1459; RV32IA:       # %bb.0:
1460; RV32IA-NEXT:    andi a2, a0, -4
1461; RV32IA-NEXT:    slli a0, a0, 3
1462; RV32IA-NEXT:    lui a3, 16
1463; RV32IA-NEXT:    addi a3, a3, -1
1464; RV32IA-NEXT:    sll a4, a3, a0
1465; RV32IA-NEXT:    and a1, a1, a3
1466; RV32IA-NEXT:    sll a1, a1, a0
1467; RV32IA-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
1468; RV32IA-NEXT:    lr.w a3, (a2)
1469; RV32IA-NEXT:    and a5, a3, a1
1470; RV32IA-NEXT:    not a5, a5
1471; RV32IA-NEXT:    xor a5, a3, a5
1472; RV32IA-NEXT:    and a5, a5, a4
1473; RV32IA-NEXT:    xor a5, a3, a5
1474; RV32IA-NEXT:    sc.w a5, a5, (a2)
1475; RV32IA-NEXT:    bnez a5, .LBB18_1
1476; RV32IA-NEXT:  # %bb.2:
1477; RV32IA-NEXT:    srl a0, a3, a0
1478; RV32IA-NEXT:    slli a0, a0, 16
1479; RV32IA-NEXT:    srai a0, a0, 16
1480; RV32IA-NEXT:    ret
1481;
1482; RV64I-LABEL: atomicrmw_nand_i16_monotonic:
1483; RV64I:       # %bb.0:
1484; RV64I-NEXT:    addi sp, sp, -16
1485; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1486; RV64I-NEXT:    li a2, 0
1487; RV64I-NEXT:    call __atomic_fetch_nand_2
1488; RV64I-NEXT:    slli a0, a0, 48
1489; RV64I-NEXT:    srai a0, a0, 48
1490; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1491; RV64I-NEXT:    addi sp, sp, 16
1492; RV64I-NEXT:    ret
1493;
1494; RV64IA-LABEL: atomicrmw_nand_i16_monotonic:
1495; RV64IA:       # %bb.0:
1496; RV64IA-NEXT:    andi a2, a0, -4
1497; RV64IA-NEXT:    slli a0, a0, 3
1498; RV64IA-NEXT:    lui a3, 16
1499; RV64IA-NEXT:    addi a3, a3, -1
1500; RV64IA-NEXT:    sllw a4, a3, a0
1501; RV64IA-NEXT:    and a1, a1, a3
1502; RV64IA-NEXT:    sllw a1, a1, a0
1503; RV64IA-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
1504; RV64IA-NEXT:    lr.w a3, (a2)
1505; RV64IA-NEXT:    and a5, a3, a1
1506; RV64IA-NEXT:    not a5, a5
1507; RV64IA-NEXT:    xor a5, a3, a5
1508; RV64IA-NEXT:    and a5, a5, a4
1509; RV64IA-NEXT:    xor a5, a3, a5
1510; RV64IA-NEXT:    sc.w a5, a5, (a2)
1511; RV64IA-NEXT:    bnez a5, .LBB18_1
1512; RV64IA-NEXT:  # %bb.2:
1513; RV64IA-NEXT:    srlw a0, a3, a0
1514; RV64IA-NEXT:    slli a0, a0, 48
1515; RV64IA-NEXT:    srai a0, a0, 48
1516; RV64IA-NEXT:    ret
1517  %1 = atomicrmw nand ptr %a, i16 %b monotonic
1518  ret i16 %1
1519}
1520
1521define signext i16 @atomicrmw_or_i16_monotonic(ptr %a, i16 %b) nounwind {
1522; RV32I-LABEL: atomicrmw_or_i16_monotonic:
1523; RV32I:       # %bb.0:
1524; RV32I-NEXT:    addi sp, sp, -16
1525; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1526; RV32I-NEXT:    li a2, 0
1527; RV32I-NEXT:    call __atomic_fetch_or_2
1528; RV32I-NEXT:    slli a0, a0, 16
1529; RV32I-NEXT:    srai a0, a0, 16
1530; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1531; RV32I-NEXT:    addi sp, sp, 16
1532; RV32I-NEXT:    ret
1533;
1534; RV32IA-LABEL: atomicrmw_or_i16_monotonic:
1535; RV32IA:       # %bb.0:
1536; RV32IA-NEXT:    andi a2, a0, -4
1537; RV32IA-NEXT:    slli a0, a0, 3
1538; RV32IA-NEXT:    slli a1, a1, 16
1539; RV32IA-NEXT:    srli a1, a1, 16
1540; RV32IA-NEXT:    sll a1, a1, a0
1541; RV32IA-NEXT:    amoor.w a1, a1, (a2)
1542; RV32IA-NEXT:    srl a0, a1, a0
1543; RV32IA-NEXT:    slli a0, a0, 16
1544; RV32IA-NEXT:    srai a0, a0, 16
1545; RV32IA-NEXT:    ret
1546;
1547; RV64I-LABEL: atomicrmw_or_i16_monotonic:
1548; RV64I:       # %bb.0:
1549; RV64I-NEXT:    addi sp, sp, -16
1550; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1551; RV64I-NEXT:    li a2, 0
1552; RV64I-NEXT:    call __atomic_fetch_or_2
1553; RV64I-NEXT:    slli a0, a0, 48
1554; RV64I-NEXT:    srai a0, a0, 48
1555; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1556; RV64I-NEXT:    addi sp, sp, 16
1557; RV64I-NEXT:    ret
1558;
1559; RV64IA-LABEL: atomicrmw_or_i16_monotonic:
1560; RV64IA:       # %bb.0:
1561; RV64IA-NEXT:    andi a2, a0, -4
1562; RV64IA-NEXT:    slli a0, a0, 3
1563; RV64IA-NEXT:    slli a1, a1, 48
1564; RV64IA-NEXT:    srli a1, a1, 48
1565; RV64IA-NEXT:    sllw a1, a1, a0
1566; RV64IA-NEXT:    amoor.w a1, a1, (a2)
1567; RV64IA-NEXT:    srlw a0, a1, a0
1568; RV64IA-NEXT:    slli a0, a0, 48
1569; RV64IA-NEXT:    srai a0, a0, 48
1570; RV64IA-NEXT:    ret
1571  %1 = atomicrmw or ptr %a, i16 %b monotonic
1572  ret i16 %1
1573}
1574
1575define signext i16 @atomicrmw_xor_i16_monotonic(ptr %a, i16 %b) nounwind {
1576; RV32I-LABEL: atomicrmw_xor_i16_monotonic:
1577; RV32I:       # %bb.0:
1578; RV32I-NEXT:    addi sp, sp, -16
1579; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1580; RV32I-NEXT:    li a2, 0
1581; RV32I-NEXT:    call __atomic_fetch_xor_2
1582; RV32I-NEXT:    slli a0, a0, 16
1583; RV32I-NEXT:    srai a0, a0, 16
1584; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1585; RV32I-NEXT:    addi sp, sp, 16
1586; RV32I-NEXT:    ret
1587;
1588; RV32IA-LABEL: atomicrmw_xor_i16_monotonic:
1589; RV32IA:       # %bb.0:
1590; RV32IA-NEXT:    andi a2, a0, -4
1591; RV32IA-NEXT:    slli a0, a0, 3
1592; RV32IA-NEXT:    slli a1, a1, 16
1593; RV32IA-NEXT:    srli a1, a1, 16
1594; RV32IA-NEXT:    sll a1, a1, a0
1595; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
1596; RV32IA-NEXT:    srl a0, a1, a0
1597; RV32IA-NEXT:    slli a0, a0, 16
1598; RV32IA-NEXT:    srai a0, a0, 16
1599; RV32IA-NEXT:    ret
1600;
1601; RV64I-LABEL: atomicrmw_xor_i16_monotonic:
1602; RV64I:       # %bb.0:
1603; RV64I-NEXT:    addi sp, sp, -16
1604; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1605; RV64I-NEXT:    li a2, 0
1606; RV64I-NEXT:    call __atomic_fetch_xor_2
1607; RV64I-NEXT:    slli a0, a0, 48
1608; RV64I-NEXT:    srai a0, a0, 48
1609; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1610; RV64I-NEXT:    addi sp, sp, 16
1611; RV64I-NEXT:    ret
1612;
1613; RV64IA-LABEL: atomicrmw_xor_i16_monotonic:
1614; RV64IA:       # %bb.0:
1615; RV64IA-NEXT:    andi a2, a0, -4
1616; RV64IA-NEXT:    slli a0, a0, 3
1617; RV64IA-NEXT:    slli a1, a1, 48
1618; RV64IA-NEXT:    srli a1, a1, 48
1619; RV64IA-NEXT:    sllw a1, a1, a0
1620; RV64IA-NEXT:    amoxor.w a1, a1, (a2)
1621; RV64IA-NEXT:    srlw a0, a1, a0
1622; RV64IA-NEXT:    slli a0, a0, 48
1623; RV64IA-NEXT:    srai a0, a0, 48
1624; RV64IA-NEXT:    ret
1625  %1 = atomicrmw xor ptr %a, i16 %b monotonic
1626  ret i16 %1
1627}
1628
1629define signext i16 @atomicrmw_max_i16_monotonic(ptr %a, i16 %b) nounwind {
1630; RV32I-LABEL: atomicrmw_max_i16_monotonic:
1631; RV32I:       # %bb.0:
1632; RV32I-NEXT:    addi sp, sp, -32
1633; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1634; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1635; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1636; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1637; RV32I-NEXT:    mv s0, a0
1638; RV32I-NEXT:    lhu a3, 0(a0)
1639; RV32I-NEXT:    mv s1, a1
1640; RV32I-NEXT:    slli a0, a1, 16
1641; RV32I-NEXT:    srai s2, a0, 16
1642; RV32I-NEXT:    j .LBB21_2
1643; RV32I-NEXT:  .LBB21_1: # %atomicrmw.start
1644; RV32I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1645; RV32I-NEXT:    sh a3, 14(sp)
1646; RV32I-NEXT:    addi a1, sp, 14
1647; RV32I-NEXT:    mv a0, s0
1648; RV32I-NEXT:    li a3, 0
1649; RV32I-NEXT:    li a4, 0
1650; RV32I-NEXT:    call __atomic_compare_exchange_2
1651; RV32I-NEXT:    lh a3, 14(sp)
1652; RV32I-NEXT:    bnez a0, .LBB21_4
1653; RV32I-NEXT:  .LBB21_2: # %atomicrmw.start
1654; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1655; RV32I-NEXT:    slli a0, a3, 16
1656; RV32I-NEXT:    srai a0, a0, 16
1657; RV32I-NEXT:    mv a2, a3
1658; RV32I-NEXT:    blt s2, a0, .LBB21_1
1659; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1660; RV32I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1661; RV32I-NEXT:    mv a2, s1
1662; RV32I-NEXT:    j .LBB21_1
1663; RV32I-NEXT:  .LBB21_4: # %atomicrmw.end
1664; RV32I-NEXT:    slli a0, a3, 16
1665; RV32I-NEXT:    srai a0, a0, 16
1666; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1667; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1668; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1669; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1670; RV32I-NEXT:    addi sp, sp, 32
1671; RV32I-NEXT:    ret
1672;
1673; RV32IA-LABEL: atomicrmw_max_i16_monotonic:
1674; RV32IA:       # %bb.0:
1675; RV32IA-NEXT:    andi a2, a0, -4
1676; RV32IA-NEXT:    slli a0, a0, 3
1677; RV32IA-NEXT:    lui a3, 16
1678; RV32IA-NEXT:    slli a1, a1, 16
1679; RV32IA-NEXT:    li a4, 16
1680; RV32IA-NEXT:    andi a5, a0, 24
1681; RV32IA-NEXT:    addi a3, a3, -1
1682; RV32IA-NEXT:    srai a1, a1, 16
1683; RV32IA-NEXT:    sll a3, a3, a0
1684; RV32IA-NEXT:    sll a1, a1, a0
1685; RV32IA-NEXT:    sub a4, a4, a5
1686; RV32IA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
1687; RV32IA-NEXT:    lr.w a5, (a2)
1688; RV32IA-NEXT:    and a7, a5, a3
1689; RV32IA-NEXT:    mv a6, a5
1690; RV32IA-NEXT:    sll a7, a7, a4
1691; RV32IA-NEXT:    sra a7, a7, a4
1692; RV32IA-NEXT:    bge a7, a1, .LBB21_3
1693; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB21_1 Depth=1
1694; RV32IA-NEXT:    xor a6, a5, a1
1695; RV32IA-NEXT:    and a6, a6, a3
1696; RV32IA-NEXT:    xor a6, a5, a6
1697; RV32IA-NEXT:  .LBB21_3: # in Loop: Header=BB21_1 Depth=1
1698; RV32IA-NEXT:    sc.w a6, a6, (a2)
1699; RV32IA-NEXT:    bnez a6, .LBB21_1
1700; RV32IA-NEXT:  # %bb.4:
1701; RV32IA-NEXT:    srl a0, a5, a0
1702; RV32IA-NEXT:    slli a0, a0, 16
1703; RV32IA-NEXT:    srai a0, a0, 16
1704; RV32IA-NEXT:    ret
1705;
1706; RV64I-LABEL: atomicrmw_max_i16_monotonic:
1707; RV64I:       # %bb.0:
1708; RV64I-NEXT:    addi sp, sp, -48
1709; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1710; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1711; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1712; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1713; RV64I-NEXT:    mv s0, a0
1714; RV64I-NEXT:    lhu a3, 0(a0)
1715; RV64I-NEXT:    mv s1, a1
1716; RV64I-NEXT:    slli a0, a1, 48
1717; RV64I-NEXT:    srai s2, a0, 48
1718; RV64I-NEXT:    j .LBB21_2
1719; RV64I-NEXT:  .LBB21_1: # %atomicrmw.start
1720; RV64I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1721; RV64I-NEXT:    sh a3, 14(sp)
1722; RV64I-NEXT:    addi a1, sp, 14
1723; RV64I-NEXT:    mv a0, s0
1724; RV64I-NEXT:    li a3, 0
1725; RV64I-NEXT:    li a4, 0
1726; RV64I-NEXT:    call __atomic_compare_exchange_2
1727; RV64I-NEXT:    lh a3, 14(sp)
1728; RV64I-NEXT:    bnez a0, .LBB21_4
1729; RV64I-NEXT:  .LBB21_2: # %atomicrmw.start
1730; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
1731; RV64I-NEXT:    slli a0, a3, 48
1732; RV64I-NEXT:    srai a0, a0, 48
1733; RV64I-NEXT:    mv a2, a3
1734; RV64I-NEXT:    blt s2, a0, .LBB21_1
1735; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
1736; RV64I-NEXT:    # in Loop: Header=BB21_2 Depth=1
1737; RV64I-NEXT:    mv a2, s1
1738; RV64I-NEXT:    j .LBB21_1
1739; RV64I-NEXT:  .LBB21_4: # %atomicrmw.end
1740; RV64I-NEXT:    slli a0, a3, 48
1741; RV64I-NEXT:    srai a0, a0, 48
1742; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1743; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1744; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1745; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1746; RV64I-NEXT:    addi sp, sp, 48
1747; RV64I-NEXT:    ret
1748;
1749; RV64IA-LABEL: atomicrmw_max_i16_monotonic:
1750; RV64IA:       # %bb.0:
1751; RV64IA-NEXT:    andi a2, a0, -4
1752; RV64IA-NEXT:    slli a0, a0, 3
1753; RV64IA-NEXT:    lui a3, 16
1754; RV64IA-NEXT:    slli a1, a1, 48
1755; RV64IA-NEXT:    li a4, 48
1756; RV64IA-NEXT:    andi a5, a0, 24
1757; RV64IA-NEXT:    addi a3, a3, -1
1758; RV64IA-NEXT:    srai a1, a1, 48
1759; RV64IA-NEXT:    sllw a3, a3, a0
1760; RV64IA-NEXT:    sllw a1, a1, a0
1761; RV64IA-NEXT:    sub a4, a4, a5
1762; RV64IA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
1763; RV64IA-NEXT:    lr.w a5, (a2)
1764; RV64IA-NEXT:    and a7, a5, a3
1765; RV64IA-NEXT:    mv a6, a5
1766; RV64IA-NEXT:    sll a7, a7, a4
1767; RV64IA-NEXT:    sra a7, a7, a4
1768; RV64IA-NEXT:    bge a7, a1, .LBB21_3
1769; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB21_1 Depth=1
1770; RV64IA-NEXT:    xor a6, a5, a1
1771; RV64IA-NEXT:    and a6, a6, a3
1772; RV64IA-NEXT:    xor a6, a5, a6
1773; RV64IA-NEXT:  .LBB21_3: # in Loop: Header=BB21_1 Depth=1
1774; RV64IA-NEXT:    sc.w a6, a6, (a2)
1775; RV64IA-NEXT:    bnez a6, .LBB21_1
1776; RV64IA-NEXT:  # %bb.4:
1777; RV64IA-NEXT:    srlw a0, a5, a0
1778; RV64IA-NEXT:    slli a0, a0, 48
1779; RV64IA-NEXT:    srai a0, a0, 48
1780; RV64IA-NEXT:    ret
1781  %1 = atomicrmw max ptr %a, i16 %b monotonic
1782  ret i16 %1
1783}
1784
1785define signext i16 @atomicrmw_min_i16_monotonic(ptr %a, i16 %b) nounwind {
1786; RV32I-LABEL: atomicrmw_min_i16_monotonic:
1787; RV32I:       # %bb.0:
1788; RV32I-NEXT:    addi sp, sp, -32
1789; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1790; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1791; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1792; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1793; RV32I-NEXT:    mv s0, a0
1794; RV32I-NEXT:    lhu a3, 0(a0)
1795; RV32I-NEXT:    mv s1, a1
1796; RV32I-NEXT:    slli a0, a1, 16
1797; RV32I-NEXT:    srai s2, a0, 16
1798; RV32I-NEXT:    j .LBB22_2
1799; RV32I-NEXT:  .LBB22_1: # %atomicrmw.start
1800; RV32I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1801; RV32I-NEXT:    sh a3, 14(sp)
1802; RV32I-NEXT:    addi a1, sp, 14
1803; RV32I-NEXT:    mv a0, s0
1804; RV32I-NEXT:    li a3, 0
1805; RV32I-NEXT:    li a4, 0
1806; RV32I-NEXT:    call __atomic_compare_exchange_2
1807; RV32I-NEXT:    lh a3, 14(sp)
1808; RV32I-NEXT:    bnez a0, .LBB22_4
1809; RV32I-NEXT:  .LBB22_2: # %atomicrmw.start
1810; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1811; RV32I-NEXT:    slli a0, a3, 16
1812; RV32I-NEXT:    srai a0, a0, 16
1813; RV32I-NEXT:    mv a2, a3
1814; RV32I-NEXT:    bge s2, a0, .LBB22_1
1815; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1816; RV32I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1817; RV32I-NEXT:    mv a2, s1
1818; RV32I-NEXT:    j .LBB22_1
1819; RV32I-NEXT:  .LBB22_4: # %atomicrmw.end
1820; RV32I-NEXT:    slli a0, a3, 16
1821; RV32I-NEXT:    srai a0, a0, 16
1822; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1823; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1824; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1825; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1826; RV32I-NEXT:    addi sp, sp, 32
1827; RV32I-NEXT:    ret
1828;
1829; RV32IA-LABEL: atomicrmw_min_i16_monotonic:
1830; RV32IA:       # %bb.0:
1831; RV32IA-NEXT:    andi a2, a0, -4
1832; RV32IA-NEXT:    slli a0, a0, 3
1833; RV32IA-NEXT:    lui a3, 16
1834; RV32IA-NEXT:    slli a1, a1, 16
1835; RV32IA-NEXT:    li a4, 16
1836; RV32IA-NEXT:    andi a5, a0, 24
1837; RV32IA-NEXT:    addi a3, a3, -1
1838; RV32IA-NEXT:    srai a1, a1, 16
1839; RV32IA-NEXT:    sll a3, a3, a0
1840; RV32IA-NEXT:    sll a1, a1, a0
1841; RV32IA-NEXT:    sub a4, a4, a5
1842; RV32IA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
1843; RV32IA-NEXT:    lr.w a5, (a2)
1844; RV32IA-NEXT:    and a7, a5, a3
1845; RV32IA-NEXT:    mv a6, a5
1846; RV32IA-NEXT:    sll a7, a7, a4
1847; RV32IA-NEXT:    sra a7, a7, a4
1848; RV32IA-NEXT:    bge a1, a7, .LBB22_3
1849; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB22_1 Depth=1
1850; RV32IA-NEXT:    xor a6, a5, a1
1851; RV32IA-NEXT:    and a6, a6, a3
1852; RV32IA-NEXT:    xor a6, a5, a6
1853; RV32IA-NEXT:  .LBB22_3: # in Loop: Header=BB22_1 Depth=1
1854; RV32IA-NEXT:    sc.w a6, a6, (a2)
1855; RV32IA-NEXT:    bnez a6, .LBB22_1
1856; RV32IA-NEXT:  # %bb.4:
1857; RV32IA-NEXT:    srl a0, a5, a0
1858; RV32IA-NEXT:    slli a0, a0, 16
1859; RV32IA-NEXT:    srai a0, a0, 16
1860; RV32IA-NEXT:    ret
1861;
1862; RV64I-LABEL: atomicrmw_min_i16_monotonic:
1863; RV64I:       # %bb.0:
1864; RV64I-NEXT:    addi sp, sp, -48
1865; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1866; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1867; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1868; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1869; RV64I-NEXT:    mv s0, a0
1870; RV64I-NEXT:    lhu a3, 0(a0)
1871; RV64I-NEXT:    mv s1, a1
1872; RV64I-NEXT:    slli a0, a1, 48
1873; RV64I-NEXT:    srai s2, a0, 48
1874; RV64I-NEXT:    j .LBB22_2
1875; RV64I-NEXT:  .LBB22_1: # %atomicrmw.start
1876; RV64I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1877; RV64I-NEXT:    sh a3, 14(sp)
1878; RV64I-NEXT:    addi a1, sp, 14
1879; RV64I-NEXT:    mv a0, s0
1880; RV64I-NEXT:    li a3, 0
1881; RV64I-NEXT:    li a4, 0
1882; RV64I-NEXT:    call __atomic_compare_exchange_2
1883; RV64I-NEXT:    lh a3, 14(sp)
1884; RV64I-NEXT:    bnez a0, .LBB22_4
1885; RV64I-NEXT:  .LBB22_2: # %atomicrmw.start
1886; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
1887; RV64I-NEXT:    slli a0, a3, 48
1888; RV64I-NEXT:    srai a0, a0, 48
1889; RV64I-NEXT:    mv a2, a3
1890; RV64I-NEXT:    bge s2, a0, .LBB22_1
1891; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
1892; RV64I-NEXT:    # in Loop: Header=BB22_2 Depth=1
1893; RV64I-NEXT:    mv a2, s1
1894; RV64I-NEXT:    j .LBB22_1
1895; RV64I-NEXT:  .LBB22_4: # %atomicrmw.end
1896; RV64I-NEXT:    slli a0, a3, 48
1897; RV64I-NEXT:    srai a0, a0, 48
1898; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1899; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1900; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1901; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1902; RV64I-NEXT:    addi sp, sp, 48
1903; RV64I-NEXT:    ret
1904;
1905; RV64IA-LABEL: atomicrmw_min_i16_monotonic:
1906; RV64IA:       # %bb.0:
1907; RV64IA-NEXT:    andi a2, a0, -4
1908; RV64IA-NEXT:    slli a0, a0, 3
1909; RV64IA-NEXT:    lui a3, 16
1910; RV64IA-NEXT:    slli a1, a1, 48
1911; RV64IA-NEXT:    li a4, 48
1912; RV64IA-NEXT:    andi a5, a0, 24
1913; RV64IA-NEXT:    addi a3, a3, -1
1914; RV64IA-NEXT:    srai a1, a1, 48
1915; RV64IA-NEXT:    sllw a3, a3, a0
1916; RV64IA-NEXT:    sllw a1, a1, a0
1917; RV64IA-NEXT:    sub a4, a4, a5
1918; RV64IA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
1919; RV64IA-NEXT:    lr.w a5, (a2)
1920; RV64IA-NEXT:    and a7, a5, a3
1921; RV64IA-NEXT:    mv a6, a5
1922; RV64IA-NEXT:    sll a7, a7, a4
1923; RV64IA-NEXT:    sra a7, a7, a4
1924; RV64IA-NEXT:    bge a1, a7, .LBB22_3
1925; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB22_1 Depth=1
1926; RV64IA-NEXT:    xor a6, a5, a1
1927; RV64IA-NEXT:    and a6, a6, a3
1928; RV64IA-NEXT:    xor a6, a5, a6
1929; RV64IA-NEXT:  .LBB22_3: # in Loop: Header=BB22_1 Depth=1
1930; RV64IA-NEXT:    sc.w a6, a6, (a2)
1931; RV64IA-NEXT:    bnez a6, .LBB22_1
1932; RV64IA-NEXT:  # %bb.4:
1933; RV64IA-NEXT:    srlw a0, a5, a0
1934; RV64IA-NEXT:    slli a0, a0, 48
1935; RV64IA-NEXT:    srai a0, a0, 48
1936; RV64IA-NEXT:    ret
1937  %1 = atomicrmw min ptr %a, i16 %b monotonic
1938  ret i16 %1
1939}
1940
1941define signext i16 @atomicrmw_umax_i16_monotonic(ptr %a, i16 %b) nounwind {
1942; RV32I-LABEL: atomicrmw_umax_i16_monotonic:
1943; RV32I:       # %bb.0:
1944; RV32I-NEXT:    addi sp, sp, -32
1945; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1946; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1947; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1948; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1949; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
1950; RV32I-NEXT:    mv s0, a1
1951; RV32I-NEXT:    mv s1, a0
1952; RV32I-NEXT:    lhu a1, 0(a0)
1953; RV32I-NEXT:    lui s2, 16
1954; RV32I-NEXT:    addi s2, s2, -1
1955; RV32I-NEXT:    and s3, s0, s2
1956; RV32I-NEXT:    j .LBB23_2
1957; RV32I-NEXT:  .LBB23_1: # %atomicrmw.start
1958; RV32I-NEXT:    # in Loop: Header=BB23_2 Depth=1
1959; RV32I-NEXT:    sh a1, 10(sp)
1960; RV32I-NEXT:    addi a1, sp, 10
1961; RV32I-NEXT:    mv a0, s1
1962; RV32I-NEXT:    li a3, 0
1963; RV32I-NEXT:    li a4, 0
1964; RV32I-NEXT:    call __atomic_compare_exchange_2
1965; RV32I-NEXT:    lh a1, 10(sp)
1966; RV32I-NEXT:    bnez a0, .LBB23_4
1967; RV32I-NEXT:  .LBB23_2: # %atomicrmw.start
1968; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
1969; RV32I-NEXT:    and a0, a1, s2
1970; RV32I-NEXT:    mv a2, a1
1971; RV32I-NEXT:    bltu s3, a0, .LBB23_1
1972; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
1973; RV32I-NEXT:    # in Loop: Header=BB23_2 Depth=1
1974; RV32I-NEXT:    mv a2, s0
1975; RV32I-NEXT:    j .LBB23_1
1976; RV32I-NEXT:  .LBB23_4: # %atomicrmw.end
1977; RV32I-NEXT:    slli a0, a1, 16
1978; RV32I-NEXT:    srai a0, a0, 16
1979; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1980; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1981; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1982; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1983; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
1984; RV32I-NEXT:    addi sp, sp, 32
1985; RV32I-NEXT:    ret
1986;
1987; RV32IA-LABEL: atomicrmw_umax_i16_monotonic:
1988; RV32IA:       # %bb.0:
1989; RV32IA-NEXT:    andi a2, a0, -4
1990; RV32IA-NEXT:    slli a0, a0, 3
1991; RV32IA-NEXT:    lui a3, 16
1992; RV32IA-NEXT:    addi a3, a3, -1
1993; RV32IA-NEXT:    sll a4, a3, a0
1994; RV32IA-NEXT:    and a1, a1, a3
1995; RV32IA-NEXT:    sll a1, a1, a0
1996; RV32IA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
1997; RV32IA-NEXT:    lr.w a3, (a2)
1998; RV32IA-NEXT:    and a6, a3, a4
1999; RV32IA-NEXT:    mv a5, a3
2000; RV32IA-NEXT:    bgeu a6, a1, .LBB23_3
2001; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB23_1 Depth=1
2002; RV32IA-NEXT:    xor a5, a3, a1
2003; RV32IA-NEXT:    and a5, a5, a4
2004; RV32IA-NEXT:    xor a5, a3, a5
2005; RV32IA-NEXT:  .LBB23_3: # in Loop: Header=BB23_1 Depth=1
2006; RV32IA-NEXT:    sc.w a5, a5, (a2)
2007; RV32IA-NEXT:    bnez a5, .LBB23_1
2008; RV32IA-NEXT:  # %bb.4:
2009; RV32IA-NEXT:    srl a0, a3, a0
2010; RV32IA-NEXT:    slli a0, a0, 16
2011; RV32IA-NEXT:    srai a0, a0, 16
2012; RV32IA-NEXT:    ret
2013;
2014; RV64I-LABEL: atomicrmw_umax_i16_monotonic:
2015; RV64I:       # %bb.0:
2016; RV64I-NEXT:    addi sp, sp, -48
2017; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2018; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2019; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2020; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2021; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
2022; RV64I-NEXT:    mv s0, a1
2023; RV64I-NEXT:    mv s1, a0
2024; RV64I-NEXT:    lhu a1, 0(a0)
2025; RV64I-NEXT:    lui s2, 16
2026; RV64I-NEXT:    addiw s2, s2, -1
2027; RV64I-NEXT:    and s3, s0, s2
2028; RV64I-NEXT:    j .LBB23_2
2029; RV64I-NEXT:  .LBB23_1: # %atomicrmw.start
2030; RV64I-NEXT:    # in Loop: Header=BB23_2 Depth=1
2031; RV64I-NEXT:    sh a1, 6(sp)
2032; RV64I-NEXT:    addi a1, sp, 6
2033; RV64I-NEXT:    mv a0, s1
2034; RV64I-NEXT:    li a3, 0
2035; RV64I-NEXT:    li a4, 0
2036; RV64I-NEXT:    call __atomic_compare_exchange_2
2037; RV64I-NEXT:    lh a1, 6(sp)
2038; RV64I-NEXT:    bnez a0, .LBB23_4
2039; RV64I-NEXT:  .LBB23_2: # %atomicrmw.start
2040; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2041; RV64I-NEXT:    and a0, a1, s2
2042; RV64I-NEXT:    mv a2, a1
2043; RV64I-NEXT:    bltu s3, a0, .LBB23_1
2044; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2045; RV64I-NEXT:    # in Loop: Header=BB23_2 Depth=1
2046; RV64I-NEXT:    mv a2, s0
2047; RV64I-NEXT:    j .LBB23_1
2048; RV64I-NEXT:  .LBB23_4: # %atomicrmw.end
2049; RV64I-NEXT:    slli a0, a1, 48
2050; RV64I-NEXT:    srai a0, a0, 48
2051; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2052; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2053; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2054; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2055; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
2056; RV64I-NEXT:    addi sp, sp, 48
2057; RV64I-NEXT:    ret
2058;
2059; RV64IA-LABEL: atomicrmw_umax_i16_monotonic:
2060; RV64IA:       # %bb.0:
2061; RV64IA-NEXT:    andi a2, a0, -4
2062; RV64IA-NEXT:    slli a0, a0, 3
2063; RV64IA-NEXT:    lui a3, 16
2064; RV64IA-NEXT:    addi a3, a3, -1
2065; RV64IA-NEXT:    sllw a4, a3, a0
2066; RV64IA-NEXT:    and a1, a1, a3
2067; RV64IA-NEXT:    sllw a1, a1, a0
2068; RV64IA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2069; RV64IA-NEXT:    lr.w a3, (a2)
2070; RV64IA-NEXT:    and a6, a3, a4
2071; RV64IA-NEXT:    mv a5, a3
2072; RV64IA-NEXT:    bgeu a6, a1, .LBB23_3
2073; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB23_1 Depth=1
2074; RV64IA-NEXT:    xor a5, a3, a1
2075; RV64IA-NEXT:    and a5, a5, a4
2076; RV64IA-NEXT:    xor a5, a3, a5
2077; RV64IA-NEXT:  .LBB23_3: # in Loop: Header=BB23_1 Depth=1
2078; RV64IA-NEXT:    sc.w a5, a5, (a2)
2079; RV64IA-NEXT:    bnez a5, .LBB23_1
2080; RV64IA-NEXT:  # %bb.4:
2081; RV64IA-NEXT:    srlw a0, a3, a0
2082; RV64IA-NEXT:    slli a0, a0, 48
2083; RV64IA-NEXT:    srai a0, a0, 48
2084; RV64IA-NEXT:    ret
2085  %1 = atomicrmw umax ptr %a, i16 %b monotonic
2086  ret i16 %1
2087}
2088
2089define signext i16 @atomicrmw_umin_i16_monotonic(ptr %a, i16 %b) nounwind {
2090; RV32I-LABEL: atomicrmw_umin_i16_monotonic:
2091; RV32I:       # %bb.0:
2092; RV32I-NEXT:    addi sp, sp, -32
2093; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2094; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2095; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
2096; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
2097; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
2098; RV32I-NEXT:    mv s0, a1
2099; RV32I-NEXT:    mv s1, a0
2100; RV32I-NEXT:    lhu a1, 0(a0)
2101; RV32I-NEXT:    lui s2, 16
2102; RV32I-NEXT:    addi s2, s2, -1
2103; RV32I-NEXT:    and s3, s0, s2
2104; RV32I-NEXT:    j .LBB24_2
2105; RV32I-NEXT:  .LBB24_1: # %atomicrmw.start
2106; RV32I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2107; RV32I-NEXT:    sh a1, 10(sp)
2108; RV32I-NEXT:    addi a1, sp, 10
2109; RV32I-NEXT:    mv a0, s1
2110; RV32I-NEXT:    li a3, 0
2111; RV32I-NEXT:    li a4, 0
2112; RV32I-NEXT:    call __atomic_compare_exchange_2
2113; RV32I-NEXT:    lh a1, 10(sp)
2114; RV32I-NEXT:    bnez a0, .LBB24_4
2115; RV32I-NEXT:  .LBB24_2: # %atomicrmw.start
2116; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2117; RV32I-NEXT:    and a0, a1, s2
2118; RV32I-NEXT:    mv a2, a1
2119; RV32I-NEXT:    bgeu s3, a0, .LBB24_1
2120; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2121; RV32I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2122; RV32I-NEXT:    mv a2, s0
2123; RV32I-NEXT:    j .LBB24_1
2124; RV32I-NEXT:  .LBB24_4: # %atomicrmw.end
2125; RV32I-NEXT:    slli a0, a1, 16
2126; RV32I-NEXT:    srai a0, a0, 16
2127; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2128; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2129; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
2130; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
2131; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
2132; RV32I-NEXT:    addi sp, sp, 32
2133; RV32I-NEXT:    ret
2134;
2135; RV32IA-LABEL: atomicrmw_umin_i16_monotonic:
2136; RV32IA:       # %bb.0:
2137; RV32IA-NEXT:    andi a2, a0, -4
2138; RV32IA-NEXT:    slli a0, a0, 3
2139; RV32IA-NEXT:    lui a3, 16
2140; RV32IA-NEXT:    addi a3, a3, -1
2141; RV32IA-NEXT:    sll a4, a3, a0
2142; RV32IA-NEXT:    and a1, a1, a3
2143; RV32IA-NEXT:    sll a1, a1, a0
2144; RV32IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
2145; RV32IA-NEXT:    lr.w a3, (a2)
2146; RV32IA-NEXT:    and a6, a3, a4
2147; RV32IA-NEXT:    mv a5, a3
2148; RV32IA-NEXT:    bgeu a1, a6, .LBB24_3
2149; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB24_1 Depth=1
2150; RV32IA-NEXT:    xor a5, a3, a1
2151; RV32IA-NEXT:    and a5, a5, a4
2152; RV32IA-NEXT:    xor a5, a3, a5
2153; RV32IA-NEXT:  .LBB24_3: # in Loop: Header=BB24_1 Depth=1
2154; RV32IA-NEXT:    sc.w a5, a5, (a2)
2155; RV32IA-NEXT:    bnez a5, .LBB24_1
2156; RV32IA-NEXT:  # %bb.4:
2157; RV32IA-NEXT:    srl a0, a3, a0
2158; RV32IA-NEXT:    slli a0, a0, 16
2159; RV32IA-NEXT:    srai a0, a0, 16
2160; RV32IA-NEXT:    ret
2161;
2162; RV64I-LABEL: atomicrmw_umin_i16_monotonic:
2163; RV64I:       # %bb.0:
2164; RV64I-NEXT:    addi sp, sp, -48
2165; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2166; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2167; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2168; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2169; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
2170; RV64I-NEXT:    mv s0, a1
2171; RV64I-NEXT:    mv s1, a0
2172; RV64I-NEXT:    lhu a1, 0(a0)
2173; RV64I-NEXT:    lui s2, 16
2174; RV64I-NEXT:    addiw s2, s2, -1
2175; RV64I-NEXT:    and s3, s0, s2
2176; RV64I-NEXT:    j .LBB24_2
2177; RV64I-NEXT:  .LBB24_1: # %atomicrmw.start
2178; RV64I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2179; RV64I-NEXT:    sh a1, 6(sp)
2180; RV64I-NEXT:    addi a1, sp, 6
2181; RV64I-NEXT:    mv a0, s1
2182; RV64I-NEXT:    li a3, 0
2183; RV64I-NEXT:    li a4, 0
2184; RV64I-NEXT:    call __atomic_compare_exchange_2
2185; RV64I-NEXT:    lh a1, 6(sp)
2186; RV64I-NEXT:    bnez a0, .LBB24_4
2187; RV64I-NEXT:  .LBB24_2: # %atomicrmw.start
2188; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2189; RV64I-NEXT:    and a0, a1, s2
2190; RV64I-NEXT:    mv a2, a1
2191; RV64I-NEXT:    bgeu s3, a0, .LBB24_1
2192; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2193; RV64I-NEXT:    # in Loop: Header=BB24_2 Depth=1
2194; RV64I-NEXT:    mv a2, s0
2195; RV64I-NEXT:    j .LBB24_1
2196; RV64I-NEXT:  .LBB24_4: # %atomicrmw.end
2197; RV64I-NEXT:    slli a0, a1, 48
2198; RV64I-NEXT:    srai a0, a0, 48
2199; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2200; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2201; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2202; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2203; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
2204; RV64I-NEXT:    addi sp, sp, 48
2205; RV64I-NEXT:    ret
2206;
2207; RV64IA-LABEL: atomicrmw_umin_i16_monotonic:
2208; RV64IA:       # %bb.0:
2209; RV64IA-NEXT:    andi a2, a0, -4
2210; RV64IA-NEXT:    slli a0, a0, 3
2211; RV64IA-NEXT:    lui a3, 16
2212; RV64IA-NEXT:    addi a3, a3, -1
2213; RV64IA-NEXT:    sllw a4, a3, a0
2214; RV64IA-NEXT:    and a1, a1, a3
2215; RV64IA-NEXT:    sllw a1, a1, a0
2216; RV64IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
2217; RV64IA-NEXT:    lr.w a3, (a2)
2218; RV64IA-NEXT:    and a6, a3, a4
2219; RV64IA-NEXT:    mv a5, a3
2220; RV64IA-NEXT:    bgeu a1, a6, .LBB24_3
2221; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB24_1 Depth=1
2222; RV64IA-NEXT:    xor a5, a3, a1
2223; RV64IA-NEXT:    and a5, a5, a4
2224; RV64IA-NEXT:    xor a5, a3, a5
2225; RV64IA-NEXT:  .LBB24_3: # in Loop: Header=BB24_1 Depth=1
2226; RV64IA-NEXT:    sc.w a5, a5, (a2)
2227; RV64IA-NEXT:    bnez a5, .LBB24_1
2228; RV64IA-NEXT:  # %bb.4:
2229; RV64IA-NEXT:    srlw a0, a3, a0
2230; RV64IA-NEXT:    slli a0, a0, 48
2231; RV64IA-NEXT:    srai a0, a0, 48
2232; RV64IA-NEXT:    ret
2233  %1 = atomicrmw umin ptr %a, i16 %b monotonic
2234  ret i16 %1
2235}
2236
2237define signext i32 @atomicrmw_xchg_i32_monotonic(ptr %a, i32 %b) nounwind {
2238; RV32I-LABEL: atomicrmw_xchg_i32_monotonic:
2239; RV32I:       # %bb.0:
2240; RV32I-NEXT:    addi sp, sp, -16
2241; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2242; RV32I-NEXT:    li a2, 0
2243; RV32I-NEXT:    call __atomic_exchange_4
2244; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2245; RV32I-NEXT:    addi sp, sp, 16
2246; RV32I-NEXT:    ret
2247;
2248; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic:
2249; RV32IA:       # %bb.0:
2250; RV32IA-NEXT:    amoswap.w a0, a1, (a0)
2251; RV32IA-NEXT:    ret
2252;
2253; RV64I-LABEL: atomicrmw_xchg_i32_monotonic:
2254; RV64I:       # %bb.0:
2255; RV64I-NEXT:    addi sp, sp, -16
2256; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2257; RV64I-NEXT:    li a2, 0
2258; RV64I-NEXT:    call __atomic_exchange_4
2259; RV64I-NEXT:    sext.w a0, a0
2260; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2261; RV64I-NEXT:    addi sp, sp, 16
2262; RV64I-NEXT:    ret
2263;
2264; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic:
2265; RV64IA:       # %bb.0:
2266; RV64IA-NEXT:    amoswap.w a0, a1, (a0)
2267; RV64IA-NEXT:    ret
2268  %1 = atomicrmw xchg ptr %a, i32 %b monotonic
2269  ret i32 %1
2270}
2271
2272define signext i32 @atomicrmw_add_i32_monotonic(ptr %a, i32 %b) nounwind {
2273; RV32I-LABEL: atomicrmw_add_i32_monotonic:
2274; RV32I:       # %bb.0:
2275; RV32I-NEXT:    addi sp, sp, -16
2276; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2277; RV32I-NEXT:    li a2, 0
2278; RV32I-NEXT:    call __atomic_fetch_add_4
2279; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2280; RV32I-NEXT:    addi sp, sp, 16
2281; RV32I-NEXT:    ret
2282;
2283; RV32IA-LABEL: atomicrmw_add_i32_monotonic:
2284; RV32IA:       # %bb.0:
2285; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
2286; RV32IA-NEXT:    ret
2287;
2288; RV64I-LABEL: atomicrmw_add_i32_monotonic:
2289; RV64I:       # %bb.0:
2290; RV64I-NEXT:    addi sp, sp, -16
2291; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2292; RV64I-NEXT:    li a2, 0
2293; RV64I-NEXT:    call __atomic_fetch_add_4
2294; RV64I-NEXT:    sext.w a0, a0
2295; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2296; RV64I-NEXT:    addi sp, sp, 16
2297; RV64I-NEXT:    ret
2298;
2299; RV64IA-LABEL: atomicrmw_add_i32_monotonic:
2300; RV64IA:       # %bb.0:
2301; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
2302; RV64IA-NEXT:    ret
2303  %1 = atomicrmw add ptr %a, i32 %b monotonic
2304  ret i32 %1
2305}
2306
2307define signext i32 @atomicrmw_sub_i32_monotonic(ptr %a, i32 %b) nounwind {
2308; RV32I-LABEL: atomicrmw_sub_i32_monotonic:
2309; RV32I:       # %bb.0:
2310; RV32I-NEXT:    addi sp, sp, -16
2311; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2312; RV32I-NEXT:    li a2, 0
2313; RV32I-NEXT:    call __atomic_fetch_sub_4
2314; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2315; RV32I-NEXT:    addi sp, sp, 16
2316; RV32I-NEXT:    ret
2317;
2318; RV32IA-LABEL: atomicrmw_sub_i32_monotonic:
2319; RV32IA:       # %bb.0:
2320; RV32IA-NEXT:    neg a1, a1
2321; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
2322; RV32IA-NEXT:    ret
2323;
2324; RV64I-LABEL: atomicrmw_sub_i32_monotonic:
2325; RV64I:       # %bb.0:
2326; RV64I-NEXT:    addi sp, sp, -16
2327; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2328; RV64I-NEXT:    li a2, 0
2329; RV64I-NEXT:    call __atomic_fetch_sub_4
2330; RV64I-NEXT:    sext.w a0, a0
2331; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2332; RV64I-NEXT:    addi sp, sp, 16
2333; RV64I-NEXT:    ret
2334;
2335; RV64IA-LABEL: atomicrmw_sub_i32_monotonic:
2336; RV64IA:       # %bb.0:
2337; RV64IA-NEXT:    neg a1, a1
2338; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
2339; RV64IA-NEXT:    ret
2340  %1 = atomicrmw sub ptr %a, i32 %b monotonic
2341  ret i32 %1
2342}
2343
2344define signext i32 @atomicrmw_and_i32_monotonic(ptr %a, i32 %b) nounwind {
2345; RV32I-LABEL: atomicrmw_and_i32_monotonic:
2346; RV32I:       # %bb.0:
2347; RV32I-NEXT:    addi sp, sp, -16
2348; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2349; RV32I-NEXT:    li a2, 0
2350; RV32I-NEXT:    call __atomic_fetch_and_4
2351; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2352; RV32I-NEXT:    addi sp, sp, 16
2353; RV32I-NEXT:    ret
2354;
2355; RV32IA-LABEL: atomicrmw_and_i32_monotonic:
2356; RV32IA:       # %bb.0:
2357; RV32IA-NEXT:    amoand.w a0, a1, (a0)
2358; RV32IA-NEXT:    ret
2359;
2360; RV64I-LABEL: atomicrmw_and_i32_monotonic:
2361; RV64I:       # %bb.0:
2362; RV64I-NEXT:    addi sp, sp, -16
2363; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2364; RV64I-NEXT:    li a2, 0
2365; RV64I-NEXT:    call __atomic_fetch_and_4
2366; RV64I-NEXT:    sext.w a0, a0
2367; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2368; RV64I-NEXT:    addi sp, sp, 16
2369; RV64I-NEXT:    ret
2370;
2371; RV64IA-LABEL: atomicrmw_and_i32_monotonic:
2372; RV64IA:       # %bb.0:
2373; RV64IA-NEXT:    amoand.w a0, a1, (a0)
2374; RV64IA-NEXT:    ret
2375  %1 = atomicrmw and ptr %a, i32 %b monotonic
2376  ret i32 %1
2377}
2378
2379define signext i32 @atomicrmw_nand_i32_monotonic(ptr %a, i32 %b) nounwind {
2380; RV32I-LABEL: atomicrmw_nand_i32_monotonic:
2381; RV32I:       # %bb.0:
2382; RV32I-NEXT:    addi sp, sp, -16
2383; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2384; RV32I-NEXT:    li a2, 0
2385; RV32I-NEXT:    call __atomic_fetch_nand_4
2386; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2387; RV32I-NEXT:    addi sp, sp, 16
2388; RV32I-NEXT:    ret
2389;
2390; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
2391; RV32IA-NOZACAS:       # %bb.0:
2392; RV32IA-NOZACAS-NEXT:  .LBB29_1: # =>This Inner Loop Header: Depth=1
2393; RV32IA-NOZACAS-NEXT:    lr.w a2, (a0)
2394; RV32IA-NOZACAS-NEXT:    and a3, a2, a1
2395; RV32IA-NOZACAS-NEXT:    not a3, a3
2396; RV32IA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
2397; RV32IA-NOZACAS-NEXT:    bnez a3, .LBB29_1
2398; RV32IA-NOZACAS-NEXT:  # %bb.2:
2399; RV32IA-NOZACAS-NEXT:    mv a0, a2
2400; RV32IA-NOZACAS-NEXT:    ret
2401;
2402; RV32IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
2403; RV32IA-ZACAS:       # %bb.0:
2404; RV32IA-ZACAS-NEXT:    mv a2, a0
2405; RV32IA-ZACAS-NEXT:    lw a0, 0(a0)
2406; RV32IA-ZACAS-NEXT:  .LBB29_1: # %atomicrmw.start
2407; RV32IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
2408; RV32IA-ZACAS-NEXT:    mv a3, a0
2409; RV32IA-ZACAS-NEXT:    and a4, a0, a1
2410; RV32IA-ZACAS-NEXT:    not a4, a4
2411; RV32IA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
2412; RV32IA-ZACAS-NEXT:    bne a0, a3, .LBB29_1
2413; RV32IA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
2414; RV32IA-ZACAS-NEXT:    ret
2415;
2416; RV64I-LABEL: atomicrmw_nand_i32_monotonic:
2417; RV64I:       # %bb.0:
2418; RV64I-NEXT:    addi sp, sp, -16
2419; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2420; RV64I-NEXT:    li a2, 0
2421; RV64I-NEXT:    call __atomic_fetch_nand_4
2422; RV64I-NEXT:    sext.w a0, a0
2423; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2424; RV64I-NEXT:    addi sp, sp, 16
2425; RV64I-NEXT:    ret
2426;
2427; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
2428; RV64IA-NOZACAS:       # %bb.0:
2429; RV64IA-NOZACAS-NEXT:  .LBB29_1: # =>This Inner Loop Header: Depth=1
2430; RV64IA-NOZACAS-NEXT:    lr.w a2, (a0)
2431; RV64IA-NOZACAS-NEXT:    and a3, a2, a1
2432; RV64IA-NOZACAS-NEXT:    not a3, a3
2433; RV64IA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
2434; RV64IA-NOZACAS-NEXT:    bnez a3, .LBB29_1
2435; RV64IA-NOZACAS-NEXT:  # %bb.2:
2436; RV64IA-NOZACAS-NEXT:    mv a0, a2
2437; RV64IA-NOZACAS-NEXT:    ret
2438;
2439; RV64IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
2440; RV64IA-ZACAS:       # %bb.0:
2441; RV64IA-ZACAS-NEXT:    mv a2, a0
2442; RV64IA-ZACAS-NEXT:    lw a0, 0(a0)
2443; RV64IA-ZACAS-NEXT:  .LBB29_1: # %atomicrmw.start
2444; RV64IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
2445; RV64IA-ZACAS-NEXT:    mv a3, a0
2446; RV64IA-ZACAS-NEXT:    and a4, a0, a1
2447; RV64IA-ZACAS-NEXT:    not a4, a4
2448; RV64IA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
2449; RV64IA-ZACAS-NEXT:    bne a0, a3, .LBB29_1
2450; RV64IA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
2451; RV64IA-ZACAS-NEXT:    ret
2452  %1 = atomicrmw nand ptr %a, i32 %b monotonic
2453  ret i32 %1
2454}
2455
2456define signext i32 @atomicrmw_or_i32_monotonic(ptr %a, i32 %b) nounwind {
2457; RV32I-LABEL: atomicrmw_or_i32_monotonic:
2458; RV32I:       # %bb.0:
2459; RV32I-NEXT:    addi sp, sp, -16
2460; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2461; RV32I-NEXT:    li a2, 0
2462; RV32I-NEXT:    call __atomic_fetch_or_4
2463; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2464; RV32I-NEXT:    addi sp, sp, 16
2465; RV32I-NEXT:    ret
2466;
2467; RV32IA-LABEL: atomicrmw_or_i32_monotonic:
2468; RV32IA:       # %bb.0:
2469; RV32IA-NEXT:    amoor.w a0, a1, (a0)
2470; RV32IA-NEXT:    ret
2471;
2472; RV64I-LABEL: atomicrmw_or_i32_monotonic:
2473; RV64I:       # %bb.0:
2474; RV64I-NEXT:    addi sp, sp, -16
2475; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2476; RV64I-NEXT:    li a2, 0
2477; RV64I-NEXT:    call __atomic_fetch_or_4
2478; RV64I-NEXT:    sext.w a0, a0
2479; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2480; RV64I-NEXT:    addi sp, sp, 16
2481; RV64I-NEXT:    ret
2482;
2483; RV64IA-LABEL: atomicrmw_or_i32_monotonic:
2484; RV64IA:       # %bb.0:
2485; RV64IA-NEXT:    amoor.w a0, a1, (a0)
2486; RV64IA-NEXT:    ret
2487  %1 = atomicrmw or ptr %a, i32 %b monotonic
2488  ret i32 %1
2489}
2490
2491define signext i32 @atomicrmw_xor_i32_monotonic(ptr %a, i32 %b) nounwind {
2492; RV32I-LABEL: atomicrmw_xor_i32_monotonic:
2493; RV32I:       # %bb.0:
2494; RV32I-NEXT:    addi sp, sp, -16
2495; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2496; RV32I-NEXT:    li a2, 0
2497; RV32I-NEXT:    call __atomic_fetch_xor_4
2498; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2499; RV32I-NEXT:    addi sp, sp, 16
2500; RV32I-NEXT:    ret
2501;
2502; RV32IA-LABEL: atomicrmw_xor_i32_monotonic:
2503; RV32IA:       # %bb.0:
2504; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
2505; RV32IA-NEXT:    ret
2506;
2507; RV64I-LABEL: atomicrmw_xor_i32_monotonic:
2508; RV64I:       # %bb.0:
2509; RV64I-NEXT:    addi sp, sp, -16
2510; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2511; RV64I-NEXT:    li a2, 0
2512; RV64I-NEXT:    call __atomic_fetch_xor_4
2513; RV64I-NEXT:    sext.w a0, a0
2514; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2515; RV64I-NEXT:    addi sp, sp, 16
2516; RV64I-NEXT:    ret
2517;
2518; RV64IA-LABEL: atomicrmw_xor_i32_monotonic:
2519; RV64IA:       # %bb.0:
2520; RV64IA-NEXT:    amoxor.w a0, a1, (a0)
2521; RV64IA-NEXT:    ret
2522  %1 = atomicrmw xor ptr %a, i32 %b monotonic
2523  ret i32 %1
2524}
2525
2526define signext i32 @atomicrmw_max_i32_monotonic(ptr %a, i32 %b) nounwind {
2527; RV32I-LABEL: atomicrmw_max_i32_monotonic:
2528; RV32I:       # %bb.0:
2529; RV32I-NEXT:    addi sp, sp, -16
2530; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2531; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2532; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2533; RV32I-NEXT:    mv s0, a0
2534; RV32I-NEXT:    lw a3, 0(a0)
2535; RV32I-NEXT:    mv s1, a1
2536; RV32I-NEXT:    j .LBB32_2
2537; RV32I-NEXT:  .LBB32_1: # %atomicrmw.start
2538; RV32I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2539; RV32I-NEXT:    sw a3, 0(sp)
2540; RV32I-NEXT:    mv a1, sp
2541; RV32I-NEXT:    mv a0, s0
2542; RV32I-NEXT:    li a3, 0
2543; RV32I-NEXT:    li a4, 0
2544; RV32I-NEXT:    call __atomic_compare_exchange_4
2545; RV32I-NEXT:    lw a3, 0(sp)
2546; RV32I-NEXT:    bnez a0, .LBB32_4
2547; RV32I-NEXT:  .LBB32_2: # %atomicrmw.start
2548; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2549; RV32I-NEXT:    mv a2, a3
2550; RV32I-NEXT:    blt s1, a3, .LBB32_1
2551; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2552; RV32I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2553; RV32I-NEXT:    mv a2, s1
2554; RV32I-NEXT:    j .LBB32_1
2555; RV32I-NEXT:  .LBB32_4: # %atomicrmw.end
2556; RV32I-NEXT:    mv a0, a3
2557; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2558; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2559; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2560; RV32I-NEXT:    addi sp, sp, 16
2561; RV32I-NEXT:    ret
2562;
2563; RV32IA-LABEL: atomicrmw_max_i32_monotonic:
2564; RV32IA:       # %bb.0:
2565; RV32IA-NEXT:    amomax.w a0, a1, (a0)
2566; RV32IA-NEXT:    ret
2567;
2568; RV64I-LABEL: atomicrmw_max_i32_monotonic:
2569; RV64I:       # %bb.0:
2570; RV64I-NEXT:    addi sp, sp, -48
2571; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2572; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2573; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2574; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2575; RV64I-NEXT:    mv s0, a0
2576; RV64I-NEXT:    lw a3, 0(a0)
2577; RV64I-NEXT:    mv s1, a1
2578; RV64I-NEXT:    sext.w s2, a1
2579; RV64I-NEXT:    j .LBB32_2
2580; RV64I-NEXT:  .LBB32_1: # %atomicrmw.start
2581; RV64I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2582; RV64I-NEXT:    sw a3, 12(sp)
2583; RV64I-NEXT:    addi a1, sp, 12
2584; RV64I-NEXT:    mv a0, s0
2585; RV64I-NEXT:    li a3, 0
2586; RV64I-NEXT:    li a4, 0
2587; RV64I-NEXT:    call __atomic_compare_exchange_4
2588; RV64I-NEXT:    lw a3, 12(sp)
2589; RV64I-NEXT:    bnez a0, .LBB32_4
2590; RV64I-NEXT:  .LBB32_2: # %atomicrmw.start
2591; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2592; RV64I-NEXT:    mv a2, a3
2593; RV64I-NEXT:    blt s2, a3, .LBB32_1
2594; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2595; RV64I-NEXT:    # in Loop: Header=BB32_2 Depth=1
2596; RV64I-NEXT:    mv a2, s1
2597; RV64I-NEXT:    j .LBB32_1
2598; RV64I-NEXT:  .LBB32_4: # %atomicrmw.end
2599; RV64I-NEXT:    mv a0, a3
2600; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2601; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2602; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2603; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2604; RV64I-NEXT:    addi sp, sp, 48
2605; RV64I-NEXT:    ret
2606;
2607; RV64IA-LABEL: atomicrmw_max_i32_monotonic:
2608; RV64IA:       # %bb.0:
2609; RV64IA-NEXT:    amomax.w a0, a1, (a0)
2610; RV64IA-NEXT:    ret
2611  %1 = atomicrmw max ptr %a, i32 %b monotonic
2612  ret i32 %1
2613}
2614
2615define signext i32 @atomicrmw_min_i32_monotonic(ptr %a, i32 %b) nounwind {
2616; RV32I-LABEL: atomicrmw_min_i32_monotonic:
2617; RV32I:       # %bb.0:
2618; RV32I-NEXT:    addi sp, sp, -16
2619; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2620; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2621; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2622; RV32I-NEXT:    mv s0, a0
2623; RV32I-NEXT:    lw a3, 0(a0)
2624; RV32I-NEXT:    mv s1, a1
2625; RV32I-NEXT:    j .LBB33_2
2626; RV32I-NEXT:  .LBB33_1: # %atomicrmw.start
2627; RV32I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2628; RV32I-NEXT:    sw a3, 0(sp)
2629; RV32I-NEXT:    mv a1, sp
2630; RV32I-NEXT:    mv a0, s0
2631; RV32I-NEXT:    li a3, 0
2632; RV32I-NEXT:    li a4, 0
2633; RV32I-NEXT:    call __atomic_compare_exchange_4
2634; RV32I-NEXT:    lw a3, 0(sp)
2635; RV32I-NEXT:    bnez a0, .LBB33_4
2636; RV32I-NEXT:  .LBB33_2: # %atomicrmw.start
2637; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2638; RV32I-NEXT:    mv a2, a3
2639; RV32I-NEXT:    bge s1, a3, .LBB33_1
2640; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2641; RV32I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2642; RV32I-NEXT:    mv a2, s1
2643; RV32I-NEXT:    j .LBB33_1
2644; RV32I-NEXT:  .LBB33_4: # %atomicrmw.end
2645; RV32I-NEXT:    mv a0, a3
2646; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2647; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2648; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2649; RV32I-NEXT:    addi sp, sp, 16
2650; RV32I-NEXT:    ret
2651;
2652; RV32IA-LABEL: atomicrmw_min_i32_monotonic:
2653; RV32IA:       # %bb.0:
2654; RV32IA-NEXT:    amomin.w a0, a1, (a0)
2655; RV32IA-NEXT:    ret
2656;
2657; RV64I-LABEL: atomicrmw_min_i32_monotonic:
2658; RV64I:       # %bb.0:
2659; RV64I-NEXT:    addi sp, sp, -48
2660; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2661; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2662; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2663; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2664; RV64I-NEXT:    mv s0, a0
2665; RV64I-NEXT:    lw a3, 0(a0)
2666; RV64I-NEXT:    mv s1, a1
2667; RV64I-NEXT:    sext.w s2, a1
2668; RV64I-NEXT:    j .LBB33_2
2669; RV64I-NEXT:  .LBB33_1: # %atomicrmw.start
2670; RV64I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2671; RV64I-NEXT:    sw a3, 12(sp)
2672; RV64I-NEXT:    addi a1, sp, 12
2673; RV64I-NEXT:    mv a0, s0
2674; RV64I-NEXT:    li a3, 0
2675; RV64I-NEXT:    li a4, 0
2676; RV64I-NEXT:    call __atomic_compare_exchange_4
2677; RV64I-NEXT:    lw a3, 12(sp)
2678; RV64I-NEXT:    bnez a0, .LBB33_4
2679; RV64I-NEXT:  .LBB33_2: # %atomicrmw.start
2680; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2681; RV64I-NEXT:    mv a2, a3
2682; RV64I-NEXT:    bge s2, a3, .LBB33_1
2683; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2684; RV64I-NEXT:    # in Loop: Header=BB33_2 Depth=1
2685; RV64I-NEXT:    mv a2, s1
2686; RV64I-NEXT:    j .LBB33_1
2687; RV64I-NEXT:  .LBB33_4: # %atomicrmw.end
2688; RV64I-NEXT:    mv a0, a3
2689; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2690; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2691; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2692; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2693; RV64I-NEXT:    addi sp, sp, 48
2694; RV64I-NEXT:    ret
2695;
2696; RV64IA-LABEL: atomicrmw_min_i32_monotonic:
2697; RV64IA:       # %bb.0:
2698; RV64IA-NEXT:    amomin.w a0, a1, (a0)
2699; RV64IA-NEXT:    ret
2700  %1 = atomicrmw min ptr %a, i32 %b monotonic
2701  ret i32 %1
2702}
2703
2704define signext i32 @atomicrmw_umax_i32_monotonic(ptr %a, i32 %b) nounwind {
2705; RV32I-LABEL: atomicrmw_umax_i32_monotonic:
2706; RV32I:       # %bb.0:
2707; RV32I-NEXT:    addi sp, sp, -16
2708; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2709; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2710; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2711; RV32I-NEXT:    mv s0, a0
2712; RV32I-NEXT:    lw a3, 0(a0)
2713; RV32I-NEXT:    mv s1, a1
2714; RV32I-NEXT:    j .LBB34_2
2715; RV32I-NEXT:  .LBB34_1: # %atomicrmw.start
2716; RV32I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2717; RV32I-NEXT:    sw a3, 0(sp)
2718; RV32I-NEXT:    mv a1, sp
2719; RV32I-NEXT:    mv a0, s0
2720; RV32I-NEXT:    li a3, 0
2721; RV32I-NEXT:    li a4, 0
2722; RV32I-NEXT:    call __atomic_compare_exchange_4
2723; RV32I-NEXT:    lw a3, 0(sp)
2724; RV32I-NEXT:    bnez a0, .LBB34_4
2725; RV32I-NEXT:  .LBB34_2: # %atomicrmw.start
2726; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2727; RV32I-NEXT:    mv a2, a3
2728; RV32I-NEXT:    bltu s1, a3, .LBB34_1
2729; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2730; RV32I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2731; RV32I-NEXT:    mv a2, s1
2732; RV32I-NEXT:    j .LBB34_1
2733; RV32I-NEXT:  .LBB34_4: # %atomicrmw.end
2734; RV32I-NEXT:    mv a0, a3
2735; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2736; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2737; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2738; RV32I-NEXT:    addi sp, sp, 16
2739; RV32I-NEXT:    ret
2740;
2741; RV32IA-LABEL: atomicrmw_umax_i32_monotonic:
2742; RV32IA:       # %bb.0:
2743; RV32IA-NEXT:    amomaxu.w a0, a1, (a0)
2744; RV32IA-NEXT:    ret
2745;
2746; RV64I-LABEL: atomicrmw_umax_i32_monotonic:
2747; RV64I:       # %bb.0:
2748; RV64I-NEXT:    addi sp, sp, -48
2749; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2750; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2751; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2752; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2753; RV64I-NEXT:    mv s0, a0
2754; RV64I-NEXT:    lw a3, 0(a0)
2755; RV64I-NEXT:    mv s1, a1
2756; RV64I-NEXT:    sext.w s2, a1
2757; RV64I-NEXT:    j .LBB34_2
2758; RV64I-NEXT:  .LBB34_1: # %atomicrmw.start
2759; RV64I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2760; RV64I-NEXT:    sw a3, 12(sp)
2761; RV64I-NEXT:    addi a1, sp, 12
2762; RV64I-NEXT:    mv a0, s0
2763; RV64I-NEXT:    li a3, 0
2764; RV64I-NEXT:    li a4, 0
2765; RV64I-NEXT:    call __atomic_compare_exchange_4
2766; RV64I-NEXT:    lw a3, 12(sp)
2767; RV64I-NEXT:    bnez a0, .LBB34_4
2768; RV64I-NEXT:  .LBB34_2: # %atomicrmw.start
2769; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2770; RV64I-NEXT:    mv a2, a3
2771; RV64I-NEXT:    bltu s2, a3, .LBB34_1
2772; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2773; RV64I-NEXT:    # in Loop: Header=BB34_2 Depth=1
2774; RV64I-NEXT:    mv a2, s1
2775; RV64I-NEXT:    j .LBB34_1
2776; RV64I-NEXT:  .LBB34_4: # %atomicrmw.end
2777; RV64I-NEXT:    mv a0, a3
2778; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2779; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2780; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2781; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2782; RV64I-NEXT:    addi sp, sp, 48
2783; RV64I-NEXT:    ret
2784;
2785; RV64IA-LABEL: atomicrmw_umax_i32_monotonic:
2786; RV64IA:       # %bb.0:
2787; RV64IA-NEXT:    amomaxu.w a0, a1, (a0)
2788; RV64IA-NEXT:    ret
2789  %1 = atomicrmw umax ptr %a, i32 %b monotonic
2790  ret i32 %1
2791}
2792
2793define signext i32 @atomicrmw_umin_i32_monotonic(ptr %a, i32 %b) nounwind {
2794; RV32I-LABEL: atomicrmw_umin_i32_monotonic:
2795; RV32I:       # %bb.0:
2796; RV32I-NEXT:    addi sp, sp, -16
2797; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2798; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2799; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2800; RV32I-NEXT:    mv s0, a0
2801; RV32I-NEXT:    lw a3, 0(a0)
2802; RV32I-NEXT:    mv s1, a1
2803; RV32I-NEXT:    j .LBB35_2
2804; RV32I-NEXT:  .LBB35_1: # %atomicrmw.start
2805; RV32I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2806; RV32I-NEXT:    sw a3, 0(sp)
2807; RV32I-NEXT:    mv a1, sp
2808; RV32I-NEXT:    mv a0, s0
2809; RV32I-NEXT:    li a3, 0
2810; RV32I-NEXT:    li a4, 0
2811; RV32I-NEXT:    call __atomic_compare_exchange_4
2812; RV32I-NEXT:    lw a3, 0(sp)
2813; RV32I-NEXT:    bnez a0, .LBB35_4
2814; RV32I-NEXT:  .LBB35_2: # %atomicrmw.start
2815; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
2816; RV32I-NEXT:    mv a2, a3
2817; RV32I-NEXT:    bgeu s1, a3, .LBB35_1
2818; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
2819; RV32I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2820; RV32I-NEXT:    mv a2, s1
2821; RV32I-NEXT:    j .LBB35_1
2822; RV32I-NEXT:  .LBB35_4: # %atomicrmw.end
2823; RV32I-NEXT:    mv a0, a3
2824; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2825; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2826; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
2827; RV32I-NEXT:    addi sp, sp, 16
2828; RV32I-NEXT:    ret
2829;
2830; RV32IA-LABEL: atomicrmw_umin_i32_monotonic:
2831; RV32IA:       # %bb.0:
2832; RV32IA-NEXT:    amominu.w a0, a1, (a0)
2833; RV32IA-NEXT:    ret
2834;
2835; RV64I-LABEL: atomicrmw_umin_i32_monotonic:
2836; RV64I:       # %bb.0:
2837; RV64I-NEXT:    addi sp, sp, -48
2838; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2839; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2840; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2841; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
2842; RV64I-NEXT:    mv s0, a0
2843; RV64I-NEXT:    lw a3, 0(a0)
2844; RV64I-NEXT:    mv s1, a1
2845; RV64I-NEXT:    sext.w s2, a1
2846; RV64I-NEXT:    j .LBB35_2
2847; RV64I-NEXT:  .LBB35_1: # %atomicrmw.start
2848; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2849; RV64I-NEXT:    sw a3, 12(sp)
2850; RV64I-NEXT:    addi a1, sp, 12
2851; RV64I-NEXT:    mv a0, s0
2852; RV64I-NEXT:    li a3, 0
2853; RV64I-NEXT:    li a4, 0
2854; RV64I-NEXT:    call __atomic_compare_exchange_4
2855; RV64I-NEXT:    lw a3, 12(sp)
2856; RV64I-NEXT:    bnez a0, .LBB35_4
2857; RV64I-NEXT:  .LBB35_2: # %atomicrmw.start
2858; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
2859; RV64I-NEXT:    mv a2, a3
2860; RV64I-NEXT:    bgeu s2, a3, .LBB35_1
2861; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
2862; RV64I-NEXT:    # in Loop: Header=BB35_2 Depth=1
2863; RV64I-NEXT:    mv a2, s1
2864; RV64I-NEXT:    j .LBB35_1
2865; RV64I-NEXT:  .LBB35_4: # %atomicrmw.end
2866; RV64I-NEXT:    mv a0, a3
2867; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2868; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2869; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2870; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
2871; RV64I-NEXT:    addi sp, sp, 48
2872; RV64I-NEXT:    ret
2873;
2874; RV64IA-LABEL: atomicrmw_umin_i32_monotonic:
2875; RV64IA:       # %bb.0:
2876; RV64IA-NEXT:    amominu.w a0, a1, (a0)
2877; RV64IA-NEXT:    ret
2878  %1 = atomicrmw umin ptr %a, i32 %b monotonic
2879  ret i32 %1
2880}
2881
2882define signext i64 @atomicrmw_xchg_i64_monotonic(ptr %a, i64 %b) nounwind {
2883; RV32I-LABEL: atomicrmw_xchg_i64_monotonic:
2884; RV32I:       # %bb.0:
2885; RV32I-NEXT:    addi sp, sp, -16
2886; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2887; RV32I-NEXT:    li a3, 0
2888; RV32I-NEXT:    call __atomic_exchange_8
2889; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2890; RV32I-NEXT:    addi sp, sp, 16
2891; RV32I-NEXT:    ret
2892;
2893; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic:
2894; RV32IA:       # %bb.0:
2895; RV32IA-NEXT:    addi sp, sp, -16
2896; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2897; RV32IA-NEXT:    li a3, 0
2898; RV32IA-NEXT:    call __atomic_exchange_8
2899; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2900; RV32IA-NEXT:    addi sp, sp, 16
2901; RV32IA-NEXT:    ret
2902;
2903; RV64I-LABEL: atomicrmw_xchg_i64_monotonic:
2904; RV64I:       # %bb.0:
2905; RV64I-NEXT:    addi sp, sp, -16
2906; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2907; RV64I-NEXT:    li a2, 0
2908; RV64I-NEXT:    call __atomic_exchange_8
2909; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2910; RV64I-NEXT:    addi sp, sp, 16
2911; RV64I-NEXT:    ret
2912;
2913; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic:
2914; RV64IA:       # %bb.0:
2915; RV64IA-NEXT:    amoswap.d a0, a1, (a0)
2916; RV64IA-NEXT:    ret
2917  %1 = atomicrmw xchg ptr %a, i64 %b monotonic
2918  ret i64 %1
2919}
2920
2921define signext i64 @atomicrmw_add_i64_monotonic(ptr %a, i64 %b) nounwind {
2922; RV32I-LABEL: atomicrmw_add_i64_monotonic:
2923; RV32I:       # %bb.0:
2924; RV32I-NEXT:    addi sp, sp, -16
2925; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2926; RV32I-NEXT:    li a3, 0
2927; RV32I-NEXT:    call __atomic_fetch_add_8
2928; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2929; RV32I-NEXT:    addi sp, sp, 16
2930; RV32I-NEXT:    ret
2931;
2932; RV32IA-LABEL: atomicrmw_add_i64_monotonic:
2933; RV32IA:       # %bb.0:
2934; RV32IA-NEXT:    addi sp, sp, -16
2935; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2936; RV32IA-NEXT:    li a3, 0
2937; RV32IA-NEXT:    call __atomic_fetch_add_8
2938; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2939; RV32IA-NEXT:    addi sp, sp, 16
2940; RV32IA-NEXT:    ret
2941;
2942; RV64I-LABEL: atomicrmw_add_i64_monotonic:
2943; RV64I:       # %bb.0:
2944; RV64I-NEXT:    addi sp, sp, -16
2945; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2946; RV64I-NEXT:    li a2, 0
2947; RV64I-NEXT:    call __atomic_fetch_add_8
2948; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2949; RV64I-NEXT:    addi sp, sp, 16
2950; RV64I-NEXT:    ret
2951;
2952; RV64IA-LABEL: atomicrmw_add_i64_monotonic:
2953; RV64IA:       # %bb.0:
2954; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
2955; RV64IA-NEXT:    ret
2956  %1 = atomicrmw add ptr %a, i64 %b monotonic
2957  ret i64 %1
2958}
2959
2960define signext i64 @atomicrmw_sub_i64_monotonic(ptr %a, i64 %b) nounwind {
2961; RV32I-LABEL: atomicrmw_sub_i64_monotonic:
2962; RV32I:       # %bb.0:
2963; RV32I-NEXT:    addi sp, sp, -16
2964; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2965; RV32I-NEXT:    li a3, 0
2966; RV32I-NEXT:    call __atomic_fetch_sub_8
2967; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2968; RV32I-NEXT:    addi sp, sp, 16
2969; RV32I-NEXT:    ret
2970;
2971; RV32IA-LABEL: atomicrmw_sub_i64_monotonic:
2972; RV32IA:       # %bb.0:
2973; RV32IA-NEXT:    addi sp, sp, -16
2974; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2975; RV32IA-NEXT:    li a3, 0
2976; RV32IA-NEXT:    call __atomic_fetch_sub_8
2977; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2978; RV32IA-NEXT:    addi sp, sp, 16
2979; RV32IA-NEXT:    ret
2980;
2981; RV64I-LABEL: atomicrmw_sub_i64_monotonic:
2982; RV64I:       # %bb.0:
2983; RV64I-NEXT:    addi sp, sp, -16
2984; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2985; RV64I-NEXT:    li a2, 0
2986; RV64I-NEXT:    call __atomic_fetch_sub_8
2987; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2988; RV64I-NEXT:    addi sp, sp, 16
2989; RV64I-NEXT:    ret
2990;
2991; RV64IA-LABEL: atomicrmw_sub_i64_monotonic:
2992; RV64IA:       # %bb.0:
2993; RV64IA-NEXT:    neg a1, a1
2994; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
2995; RV64IA-NEXT:    ret
2996  %1 = atomicrmw sub ptr %a, i64 %b monotonic
2997  ret i64 %1
2998}
2999
3000define signext i64 @atomicrmw_and_i64_monotonic(ptr %a, i64 %b) nounwind {
3001; RV32I-LABEL: atomicrmw_and_i64_monotonic:
3002; RV32I:       # %bb.0:
3003; RV32I-NEXT:    addi sp, sp, -16
3004; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3005; RV32I-NEXT:    li a3, 0
3006; RV32I-NEXT:    call __atomic_fetch_and_8
3007; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3008; RV32I-NEXT:    addi sp, sp, 16
3009; RV32I-NEXT:    ret
3010;
3011; RV32IA-LABEL: atomicrmw_and_i64_monotonic:
3012; RV32IA:       # %bb.0:
3013; RV32IA-NEXT:    addi sp, sp, -16
3014; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3015; RV32IA-NEXT:    li a3, 0
3016; RV32IA-NEXT:    call __atomic_fetch_and_8
3017; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3018; RV32IA-NEXT:    addi sp, sp, 16
3019; RV32IA-NEXT:    ret
3020;
3021; RV64I-LABEL: atomicrmw_and_i64_monotonic:
3022; RV64I:       # %bb.0:
3023; RV64I-NEXT:    addi sp, sp, -16
3024; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3025; RV64I-NEXT:    li a2, 0
3026; RV64I-NEXT:    call __atomic_fetch_and_8
3027; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3028; RV64I-NEXT:    addi sp, sp, 16
3029; RV64I-NEXT:    ret
3030;
3031; RV64IA-LABEL: atomicrmw_and_i64_monotonic:
3032; RV64IA:       # %bb.0:
3033; RV64IA-NEXT:    amoand.d a0, a1, (a0)
3034; RV64IA-NEXT:    ret
3035  %1 = atomicrmw and ptr %a, i64 %b monotonic
3036  ret i64 %1
3037}
3038
3039define signext i64 @atomicrmw_nand_i64_monotonic(ptr %a, i64 %b) nounwind {
3040; RV32I-LABEL: atomicrmw_nand_i64_monotonic:
3041; RV32I:       # %bb.0:
3042; RV32I-NEXT:    addi sp, sp, -16
3043; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3044; RV32I-NEXT:    li a3, 0
3045; RV32I-NEXT:    call __atomic_fetch_nand_8
3046; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3047; RV32I-NEXT:    addi sp, sp, 16
3048; RV32I-NEXT:    ret
3049;
3050; RV32IA-LABEL: atomicrmw_nand_i64_monotonic:
3051; RV32IA:       # %bb.0:
3052; RV32IA-NEXT:    addi sp, sp, -16
3053; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3054; RV32IA-NEXT:    li a3, 0
3055; RV32IA-NEXT:    call __atomic_fetch_nand_8
3056; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3057; RV32IA-NEXT:    addi sp, sp, 16
3058; RV32IA-NEXT:    ret
3059;
3060; RV64I-LABEL: atomicrmw_nand_i64_monotonic:
3061; RV64I:       # %bb.0:
3062; RV64I-NEXT:    addi sp, sp, -16
3063; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3064; RV64I-NEXT:    li a2, 0
3065; RV64I-NEXT:    call __atomic_fetch_nand_8
3066; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3067; RV64I-NEXT:    addi sp, sp, 16
3068; RV64I-NEXT:    ret
3069;
3070; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic:
3071; RV64IA-NOZACAS:       # %bb.0:
3072; RV64IA-NOZACAS-NEXT:  .LBB40_1: # =>This Inner Loop Header: Depth=1
3073; RV64IA-NOZACAS-NEXT:    lr.d a2, (a0)
3074; RV64IA-NOZACAS-NEXT:    and a3, a2, a1
3075; RV64IA-NOZACAS-NEXT:    not a3, a3
3076; RV64IA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
3077; RV64IA-NOZACAS-NEXT:    bnez a3, .LBB40_1
3078; RV64IA-NOZACAS-NEXT:  # %bb.2:
3079; RV64IA-NOZACAS-NEXT:    mv a0, a2
3080; RV64IA-NOZACAS-NEXT:    ret
3081;
3082; RV64IA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic:
3083; RV64IA-ZACAS:       # %bb.0:
3084; RV64IA-ZACAS-NEXT:    mv a2, a0
3085; RV64IA-ZACAS-NEXT:    ld a0, 0(a0)
3086; RV64IA-ZACAS-NEXT:  .LBB40_1: # %atomicrmw.start
3087; RV64IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
3088; RV64IA-ZACAS-NEXT:    mv a3, a0
3089; RV64IA-ZACAS-NEXT:    and a4, a0, a1
3090; RV64IA-ZACAS-NEXT:    not a4, a4
3091; RV64IA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
3092; RV64IA-ZACAS-NEXT:    bne a0, a3, .LBB40_1
3093; RV64IA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
3094; RV64IA-ZACAS-NEXT:    ret
3095  %1 = atomicrmw nand ptr %a, i64 %b monotonic
3096  ret i64 %1
3097}
3098
3099define signext i64 @atomicrmw_or_i64_monotonic(ptr %a, i64 %b) nounwind {
3100; RV32I-LABEL: atomicrmw_or_i64_monotonic:
3101; RV32I:       # %bb.0:
3102; RV32I-NEXT:    addi sp, sp, -16
3103; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3104; RV32I-NEXT:    li a3, 0
3105; RV32I-NEXT:    call __atomic_fetch_or_8
3106; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3107; RV32I-NEXT:    addi sp, sp, 16
3108; RV32I-NEXT:    ret
3109;
3110; RV32IA-LABEL: atomicrmw_or_i64_monotonic:
3111; RV32IA:       # %bb.0:
3112; RV32IA-NEXT:    addi sp, sp, -16
3113; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3114; RV32IA-NEXT:    li a3, 0
3115; RV32IA-NEXT:    call __atomic_fetch_or_8
3116; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3117; RV32IA-NEXT:    addi sp, sp, 16
3118; RV32IA-NEXT:    ret
3119;
3120; RV64I-LABEL: atomicrmw_or_i64_monotonic:
3121; RV64I:       # %bb.0:
3122; RV64I-NEXT:    addi sp, sp, -16
3123; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3124; RV64I-NEXT:    li a2, 0
3125; RV64I-NEXT:    call __atomic_fetch_or_8
3126; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3127; RV64I-NEXT:    addi sp, sp, 16
3128; RV64I-NEXT:    ret
3129;
3130; RV64IA-LABEL: atomicrmw_or_i64_monotonic:
3131; RV64IA:       # %bb.0:
3132; RV64IA-NEXT:    amoor.d a0, a1, (a0)
3133; RV64IA-NEXT:    ret
3134  %1 = atomicrmw or ptr %a, i64 %b monotonic
3135  ret i64 %1
3136}
3137
3138define signext i64 @atomicrmw_xor_i64_monotonic(ptr %a, i64 %b) nounwind {
3139; RV32I-LABEL: atomicrmw_xor_i64_monotonic:
3140; RV32I:       # %bb.0:
3141; RV32I-NEXT:    addi sp, sp, -16
3142; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3143; RV32I-NEXT:    li a3, 0
3144; RV32I-NEXT:    call __atomic_fetch_xor_8
3145; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3146; RV32I-NEXT:    addi sp, sp, 16
3147; RV32I-NEXT:    ret
3148;
3149; RV32IA-LABEL: atomicrmw_xor_i64_monotonic:
3150; RV32IA:       # %bb.0:
3151; RV32IA-NEXT:    addi sp, sp, -16
3152; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3153; RV32IA-NEXT:    li a3, 0
3154; RV32IA-NEXT:    call __atomic_fetch_xor_8
3155; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3156; RV32IA-NEXT:    addi sp, sp, 16
3157; RV32IA-NEXT:    ret
3158;
3159; RV64I-LABEL: atomicrmw_xor_i64_monotonic:
3160; RV64I:       # %bb.0:
3161; RV64I-NEXT:    addi sp, sp, -16
3162; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3163; RV64I-NEXT:    li a2, 0
3164; RV64I-NEXT:    call __atomic_fetch_xor_8
3165; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3166; RV64I-NEXT:    addi sp, sp, 16
3167; RV64I-NEXT:    ret
3168;
3169; RV64IA-LABEL: atomicrmw_xor_i64_monotonic:
3170; RV64IA:       # %bb.0:
3171; RV64IA-NEXT:    amoxor.d a0, a1, (a0)
3172; RV64IA-NEXT:    ret
3173  %1 = atomicrmw xor ptr %a, i64 %b monotonic
3174  ret i64 %1
3175}
3176
3177define signext i64 @atomicrmw_max_i64_monotonic(ptr %a, i64 %b) nounwind {
3178; RV32I-LABEL: atomicrmw_max_i64_monotonic:
3179; RV32I:       # %bb.0:
3180; RV32I-NEXT:    addi sp, sp, -32
3181; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3182; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3183; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3184; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3185; RV32I-NEXT:    mv s0, a2
3186; RV32I-NEXT:    mv s1, a0
3187; RV32I-NEXT:    lw a4, 0(a0)
3188; RV32I-NEXT:    lw a5, 4(a0)
3189; RV32I-NEXT:    mv s2, a1
3190; RV32I-NEXT:    j .LBB43_2
3191; RV32I-NEXT:  .LBB43_1: # %atomicrmw.start
3192; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3193; RV32I-NEXT:    sw a4, 8(sp)
3194; RV32I-NEXT:    sw a5, 12(sp)
3195; RV32I-NEXT:    addi a1, sp, 8
3196; RV32I-NEXT:    mv a0, s1
3197; RV32I-NEXT:    li a4, 0
3198; RV32I-NEXT:    li a5, 0
3199; RV32I-NEXT:    call __atomic_compare_exchange_8
3200; RV32I-NEXT:    lw a4, 8(sp)
3201; RV32I-NEXT:    lw a5, 12(sp)
3202; RV32I-NEXT:    bnez a0, .LBB43_7
3203; RV32I-NEXT:  .LBB43_2: # %atomicrmw.start
3204; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3205; RV32I-NEXT:    beq a5, s0, .LBB43_4
3206; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3207; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3208; RV32I-NEXT:    slt a0, s0, a5
3209; RV32I-NEXT:    j .LBB43_5
3210; RV32I-NEXT:  .LBB43_4: # in Loop: Header=BB43_2 Depth=1
3211; RV32I-NEXT:    sltu a0, s2, a4
3212; RV32I-NEXT:  .LBB43_5: # %atomicrmw.start
3213; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3214; RV32I-NEXT:    mv a2, a4
3215; RV32I-NEXT:    mv a3, a5
3216; RV32I-NEXT:    bnez a0, .LBB43_1
3217; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3218; RV32I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3219; RV32I-NEXT:    mv a2, s2
3220; RV32I-NEXT:    mv a3, s0
3221; RV32I-NEXT:    j .LBB43_1
3222; RV32I-NEXT:  .LBB43_7: # %atomicrmw.end
3223; RV32I-NEXT:    mv a0, a4
3224; RV32I-NEXT:    mv a1, a5
3225; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3226; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3227; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3228; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3229; RV32I-NEXT:    addi sp, sp, 32
3230; RV32I-NEXT:    ret
3231;
3232; RV32IA-LABEL: atomicrmw_max_i64_monotonic:
3233; RV32IA:       # %bb.0:
3234; RV32IA-NEXT:    addi sp, sp, -32
3235; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3236; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3237; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3238; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3239; RV32IA-NEXT:    mv s0, a2
3240; RV32IA-NEXT:    mv s1, a0
3241; RV32IA-NEXT:    lw a4, 0(a0)
3242; RV32IA-NEXT:    lw a5, 4(a0)
3243; RV32IA-NEXT:    mv s2, a1
3244; RV32IA-NEXT:    j .LBB43_2
3245; RV32IA-NEXT:  .LBB43_1: # %atomicrmw.start
3246; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3247; RV32IA-NEXT:    sw a4, 8(sp)
3248; RV32IA-NEXT:    sw a5, 12(sp)
3249; RV32IA-NEXT:    addi a1, sp, 8
3250; RV32IA-NEXT:    mv a0, s1
3251; RV32IA-NEXT:    li a4, 0
3252; RV32IA-NEXT:    li a5, 0
3253; RV32IA-NEXT:    call __atomic_compare_exchange_8
3254; RV32IA-NEXT:    lw a4, 8(sp)
3255; RV32IA-NEXT:    lw a5, 12(sp)
3256; RV32IA-NEXT:    bnez a0, .LBB43_7
3257; RV32IA-NEXT:  .LBB43_2: # %atomicrmw.start
3258; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3259; RV32IA-NEXT:    beq a5, s0, .LBB43_4
3260; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3261; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3262; RV32IA-NEXT:    slt a0, s0, a5
3263; RV32IA-NEXT:    j .LBB43_5
3264; RV32IA-NEXT:  .LBB43_4: # in Loop: Header=BB43_2 Depth=1
3265; RV32IA-NEXT:    sltu a0, s2, a4
3266; RV32IA-NEXT:  .LBB43_5: # %atomicrmw.start
3267; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3268; RV32IA-NEXT:    mv a2, a4
3269; RV32IA-NEXT:    mv a3, a5
3270; RV32IA-NEXT:    bnez a0, .LBB43_1
3271; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3272; RV32IA-NEXT:    # in Loop: Header=BB43_2 Depth=1
3273; RV32IA-NEXT:    mv a2, s2
3274; RV32IA-NEXT:    mv a3, s0
3275; RV32IA-NEXT:    j .LBB43_1
3276; RV32IA-NEXT:  .LBB43_7: # %atomicrmw.end
3277; RV32IA-NEXT:    mv a0, a4
3278; RV32IA-NEXT:    mv a1, a5
3279; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3280; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3281; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3282; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3283; RV32IA-NEXT:    addi sp, sp, 32
3284; RV32IA-NEXT:    ret
3285;
3286; RV64I-LABEL: atomicrmw_max_i64_monotonic:
3287; RV64I:       # %bb.0:
3288; RV64I-NEXT:    addi sp, sp, -32
3289; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3290; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3291; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3292; RV64I-NEXT:    mv s0, a0
3293; RV64I-NEXT:    ld a3, 0(a0)
3294; RV64I-NEXT:    mv s1, a1
3295; RV64I-NEXT:    j .LBB43_2
3296; RV64I-NEXT:  .LBB43_1: # %atomicrmw.start
3297; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3298; RV64I-NEXT:    sd a3, 0(sp)
3299; RV64I-NEXT:    mv a1, sp
3300; RV64I-NEXT:    mv a0, s0
3301; RV64I-NEXT:    li a3, 0
3302; RV64I-NEXT:    li a4, 0
3303; RV64I-NEXT:    call __atomic_compare_exchange_8
3304; RV64I-NEXT:    ld a3, 0(sp)
3305; RV64I-NEXT:    bnez a0, .LBB43_4
3306; RV64I-NEXT:  .LBB43_2: # %atomicrmw.start
3307; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3308; RV64I-NEXT:    mv a2, a3
3309; RV64I-NEXT:    blt s1, a3, .LBB43_1
3310; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3311; RV64I-NEXT:    # in Loop: Header=BB43_2 Depth=1
3312; RV64I-NEXT:    mv a2, s1
3313; RV64I-NEXT:    j .LBB43_1
3314; RV64I-NEXT:  .LBB43_4: # %atomicrmw.end
3315; RV64I-NEXT:    mv a0, a3
3316; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3317; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3318; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3319; RV64I-NEXT:    addi sp, sp, 32
3320; RV64I-NEXT:    ret
3321;
3322; RV64IA-LABEL: atomicrmw_max_i64_monotonic:
3323; RV64IA:       # %bb.0:
3324; RV64IA-NEXT:    amomax.d a0, a1, (a0)
3325; RV64IA-NEXT:    ret
3326  %1 = atomicrmw max ptr %a, i64 %b monotonic
3327  ret i64 %1
3328}
3329
3330define signext i64 @atomicrmw_min_i64_monotonic(ptr %a, i64 %b) nounwind {
3331; RV32I-LABEL: atomicrmw_min_i64_monotonic:
3332; RV32I:       # %bb.0:
3333; RV32I-NEXT:    addi sp, sp, -32
3334; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3335; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3336; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3337; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3338; RV32I-NEXT:    mv s0, a2
3339; RV32I-NEXT:    mv s1, a0
3340; RV32I-NEXT:    lw a4, 0(a0)
3341; RV32I-NEXT:    lw a5, 4(a0)
3342; RV32I-NEXT:    mv s2, a1
3343; RV32I-NEXT:    j .LBB44_2
3344; RV32I-NEXT:  .LBB44_1: # %atomicrmw.start
3345; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3346; RV32I-NEXT:    sw a4, 8(sp)
3347; RV32I-NEXT:    sw a5, 12(sp)
3348; RV32I-NEXT:    addi a1, sp, 8
3349; RV32I-NEXT:    mv a0, s1
3350; RV32I-NEXT:    li a4, 0
3351; RV32I-NEXT:    li a5, 0
3352; RV32I-NEXT:    call __atomic_compare_exchange_8
3353; RV32I-NEXT:    lw a4, 8(sp)
3354; RV32I-NEXT:    lw a5, 12(sp)
3355; RV32I-NEXT:    bnez a0, .LBB44_7
3356; RV32I-NEXT:  .LBB44_2: # %atomicrmw.start
3357; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3358; RV32I-NEXT:    beq a5, s0, .LBB44_4
3359; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3360; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3361; RV32I-NEXT:    slt a0, s0, a5
3362; RV32I-NEXT:    j .LBB44_5
3363; RV32I-NEXT:  .LBB44_4: # in Loop: Header=BB44_2 Depth=1
3364; RV32I-NEXT:    sltu a0, s2, a4
3365; RV32I-NEXT:  .LBB44_5: # %atomicrmw.start
3366; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3367; RV32I-NEXT:    mv a2, a4
3368; RV32I-NEXT:    mv a3, a5
3369; RV32I-NEXT:    beqz a0, .LBB44_1
3370; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3371; RV32I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3372; RV32I-NEXT:    mv a2, s2
3373; RV32I-NEXT:    mv a3, s0
3374; RV32I-NEXT:    j .LBB44_1
3375; RV32I-NEXT:  .LBB44_7: # %atomicrmw.end
3376; RV32I-NEXT:    mv a0, a4
3377; RV32I-NEXT:    mv a1, a5
3378; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3379; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3380; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3381; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3382; RV32I-NEXT:    addi sp, sp, 32
3383; RV32I-NEXT:    ret
3384;
3385; RV32IA-LABEL: atomicrmw_min_i64_monotonic:
3386; RV32IA:       # %bb.0:
3387; RV32IA-NEXT:    addi sp, sp, -32
3388; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3389; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3390; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3391; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3392; RV32IA-NEXT:    mv s0, a2
3393; RV32IA-NEXT:    mv s1, a0
3394; RV32IA-NEXT:    lw a4, 0(a0)
3395; RV32IA-NEXT:    lw a5, 4(a0)
3396; RV32IA-NEXT:    mv s2, a1
3397; RV32IA-NEXT:    j .LBB44_2
3398; RV32IA-NEXT:  .LBB44_1: # %atomicrmw.start
3399; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3400; RV32IA-NEXT:    sw a4, 8(sp)
3401; RV32IA-NEXT:    sw a5, 12(sp)
3402; RV32IA-NEXT:    addi a1, sp, 8
3403; RV32IA-NEXT:    mv a0, s1
3404; RV32IA-NEXT:    li a4, 0
3405; RV32IA-NEXT:    li a5, 0
3406; RV32IA-NEXT:    call __atomic_compare_exchange_8
3407; RV32IA-NEXT:    lw a4, 8(sp)
3408; RV32IA-NEXT:    lw a5, 12(sp)
3409; RV32IA-NEXT:    bnez a0, .LBB44_7
3410; RV32IA-NEXT:  .LBB44_2: # %atomicrmw.start
3411; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3412; RV32IA-NEXT:    beq a5, s0, .LBB44_4
3413; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3414; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3415; RV32IA-NEXT:    slt a0, s0, a5
3416; RV32IA-NEXT:    j .LBB44_5
3417; RV32IA-NEXT:  .LBB44_4: # in Loop: Header=BB44_2 Depth=1
3418; RV32IA-NEXT:    sltu a0, s2, a4
3419; RV32IA-NEXT:  .LBB44_5: # %atomicrmw.start
3420; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3421; RV32IA-NEXT:    mv a2, a4
3422; RV32IA-NEXT:    mv a3, a5
3423; RV32IA-NEXT:    beqz a0, .LBB44_1
3424; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3425; RV32IA-NEXT:    # in Loop: Header=BB44_2 Depth=1
3426; RV32IA-NEXT:    mv a2, s2
3427; RV32IA-NEXT:    mv a3, s0
3428; RV32IA-NEXT:    j .LBB44_1
3429; RV32IA-NEXT:  .LBB44_7: # %atomicrmw.end
3430; RV32IA-NEXT:    mv a0, a4
3431; RV32IA-NEXT:    mv a1, a5
3432; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3433; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3434; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3435; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3436; RV32IA-NEXT:    addi sp, sp, 32
3437; RV32IA-NEXT:    ret
3438;
3439; RV64I-LABEL: atomicrmw_min_i64_monotonic:
3440; RV64I:       # %bb.0:
3441; RV64I-NEXT:    addi sp, sp, -32
3442; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3443; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3444; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3445; RV64I-NEXT:    mv s0, a0
3446; RV64I-NEXT:    ld a3, 0(a0)
3447; RV64I-NEXT:    mv s1, a1
3448; RV64I-NEXT:    j .LBB44_2
3449; RV64I-NEXT:  .LBB44_1: # %atomicrmw.start
3450; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3451; RV64I-NEXT:    sd a3, 0(sp)
3452; RV64I-NEXT:    mv a1, sp
3453; RV64I-NEXT:    mv a0, s0
3454; RV64I-NEXT:    li a3, 0
3455; RV64I-NEXT:    li a4, 0
3456; RV64I-NEXT:    call __atomic_compare_exchange_8
3457; RV64I-NEXT:    ld a3, 0(sp)
3458; RV64I-NEXT:    bnez a0, .LBB44_4
3459; RV64I-NEXT:  .LBB44_2: # %atomicrmw.start
3460; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3461; RV64I-NEXT:    mv a2, a3
3462; RV64I-NEXT:    bge s1, a3, .LBB44_1
3463; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3464; RV64I-NEXT:    # in Loop: Header=BB44_2 Depth=1
3465; RV64I-NEXT:    mv a2, s1
3466; RV64I-NEXT:    j .LBB44_1
3467; RV64I-NEXT:  .LBB44_4: # %atomicrmw.end
3468; RV64I-NEXT:    mv a0, a3
3469; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3470; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3471; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3472; RV64I-NEXT:    addi sp, sp, 32
3473; RV64I-NEXT:    ret
3474;
3475; RV64IA-LABEL: atomicrmw_min_i64_monotonic:
3476; RV64IA:       # %bb.0:
3477; RV64IA-NEXT:    amomin.d a0, a1, (a0)
3478; RV64IA-NEXT:    ret
3479  %1 = atomicrmw min ptr %a, i64 %b monotonic
3480  ret i64 %1
3481}
3482
3483define signext i64 @atomicrmw_umax_i64_monotonic(ptr %a, i64 %b) nounwind {
3484; RV32I-LABEL: atomicrmw_umax_i64_monotonic:
3485; RV32I:       # %bb.0:
3486; RV32I-NEXT:    addi sp, sp, -32
3487; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3488; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3489; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3490; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3491; RV32I-NEXT:    mv s0, a2
3492; RV32I-NEXT:    mv s1, a0
3493; RV32I-NEXT:    lw a4, 0(a0)
3494; RV32I-NEXT:    lw a5, 4(a0)
3495; RV32I-NEXT:    mv s2, a1
3496; RV32I-NEXT:    j .LBB45_2
3497; RV32I-NEXT:  .LBB45_1: # %atomicrmw.start
3498; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3499; RV32I-NEXT:    sw a4, 8(sp)
3500; RV32I-NEXT:    sw a5, 12(sp)
3501; RV32I-NEXT:    addi a1, sp, 8
3502; RV32I-NEXT:    mv a0, s1
3503; RV32I-NEXT:    li a4, 0
3504; RV32I-NEXT:    li a5, 0
3505; RV32I-NEXT:    call __atomic_compare_exchange_8
3506; RV32I-NEXT:    lw a4, 8(sp)
3507; RV32I-NEXT:    lw a5, 12(sp)
3508; RV32I-NEXT:    bnez a0, .LBB45_7
3509; RV32I-NEXT:  .LBB45_2: # %atomicrmw.start
3510; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3511; RV32I-NEXT:    beq a5, s0, .LBB45_4
3512; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3513; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3514; RV32I-NEXT:    sltu a0, s0, a5
3515; RV32I-NEXT:    j .LBB45_5
3516; RV32I-NEXT:  .LBB45_4: # in Loop: Header=BB45_2 Depth=1
3517; RV32I-NEXT:    sltu a0, s2, a4
3518; RV32I-NEXT:  .LBB45_5: # %atomicrmw.start
3519; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3520; RV32I-NEXT:    mv a2, a4
3521; RV32I-NEXT:    mv a3, a5
3522; RV32I-NEXT:    bnez a0, .LBB45_1
3523; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3524; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3525; RV32I-NEXT:    mv a2, s2
3526; RV32I-NEXT:    mv a3, s0
3527; RV32I-NEXT:    j .LBB45_1
3528; RV32I-NEXT:  .LBB45_7: # %atomicrmw.end
3529; RV32I-NEXT:    mv a0, a4
3530; RV32I-NEXT:    mv a1, a5
3531; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3532; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3533; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3534; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3535; RV32I-NEXT:    addi sp, sp, 32
3536; RV32I-NEXT:    ret
3537;
3538; RV32IA-LABEL: atomicrmw_umax_i64_monotonic:
3539; RV32IA:       # %bb.0:
3540; RV32IA-NEXT:    addi sp, sp, -32
3541; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3542; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3543; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3544; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3545; RV32IA-NEXT:    mv s0, a2
3546; RV32IA-NEXT:    mv s1, a0
3547; RV32IA-NEXT:    lw a4, 0(a0)
3548; RV32IA-NEXT:    lw a5, 4(a0)
3549; RV32IA-NEXT:    mv s2, a1
3550; RV32IA-NEXT:    j .LBB45_2
3551; RV32IA-NEXT:  .LBB45_1: # %atomicrmw.start
3552; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3553; RV32IA-NEXT:    sw a4, 8(sp)
3554; RV32IA-NEXT:    sw a5, 12(sp)
3555; RV32IA-NEXT:    addi a1, sp, 8
3556; RV32IA-NEXT:    mv a0, s1
3557; RV32IA-NEXT:    li a4, 0
3558; RV32IA-NEXT:    li a5, 0
3559; RV32IA-NEXT:    call __atomic_compare_exchange_8
3560; RV32IA-NEXT:    lw a4, 8(sp)
3561; RV32IA-NEXT:    lw a5, 12(sp)
3562; RV32IA-NEXT:    bnez a0, .LBB45_7
3563; RV32IA-NEXT:  .LBB45_2: # %atomicrmw.start
3564; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3565; RV32IA-NEXT:    beq a5, s0, .LBB45_4
3566; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3567; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3568; RV32IA-NEXT:    sltu a0, s0, a5
3569; RV32IA-NEXT:    j .LBB45_5
3570; RV32IA-NEXT:  .LBB45_4: # in Loop: Header=BB45_2 Depth=1
3571; RV32IA-NEXT:    sltu a0, s2, a4
3572; RV32IA-NEXT:  .LBB45_5: # %atomicrmw.start
3573; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3574; RV32IA-NEXT:    mv a2, a4
3575; RV32IA-NEXT:    mv a3, a5
3576; RV32IA-NEXT:    bnez a0, .LBB45_1
3577; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3578; RV32IA-NEXT:    # in Loop: Header=BB45_2 Depth=1
3579; RV32IA-NEXT:    mv a2, s2
3580; RV32IA-NEXT:    mv a3, s0
3581; RV32IA-NEXT:    j .LBB45_1
3582; RV32IA-NEXT:  .LBB45_7: # %atomicrmw.end
3583; RV32IA-NEXT:    mv a0, a4
3584; RV32IA-NEXT:    mv a1, a5
3585; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3586; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3587; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3588; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3589; RV32IA-NEXT:    addi sp, sp, 32
3590; RV32IA-NEXT:    ret
3591;
3592; RV64I-LABEL: atomicrmw_umax_i64_monotonic:
3593; RV64I:       # %bb.0:
3594; RV64I-NEXT:    addi sp, sp, -32
3595; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3596; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3597; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3598; RV64I-NEXT:    mv s0, a0
3599; RV64I-NEXT:    ld a3, 0(a0)
3600; RV64I-NEXT:    mv s1, a1
3601; RV64I-NEXT:    j .LBB45_2
3602; RV64I-NEXT:  .LBB45_1: # %atomicrmw.start
3603; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3604; RV64I-NEXT:    sd a3, 0(sp)
3605; RV64I-NEXT:    mv a1, sp
3606; RV64I-NEXT:    mv a0, s0
3607; RV64I-NEXT:    li a3, 0
3608; RV64I-NEXT:    li a4, 0
3609; RV64I-NEXT:    call __atomic_compare_exchange_8
3610; RV64I-NEXT:    ld a3, 0(sp)
3611; RV64I-NEXT:    bnez a0, .LBB45_4
3612; RV64I-NEXT:  .LBB45_2: # %atomicrmw.start
3613; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3614; RV64I-NEXT:    mv a2, a3
3615; RV64I-NEXT:    bltu s1, a3, .LBB45_1
3616; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3617; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
3618; RV64I-NEXT:    mv a2, s1
3619; RV64I-NEXT:    j .LBB45_1
3620; RV64I-NEXT:  .LBB45_4: # %atomicrmw.end
3621; RV64I-NEXT:    mv a0, a3
3622; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3623; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3624; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3625; RV64I-NEXT:    addi sp, sp, 32
3626; RV64I-NEXT:    ret
3627;
3628; RV64IA-LABEL: atomicrmw_umax_i64_monotonic:
3629; RV64IA:       # %bb.0:
3630; RV64IA-NEXT:    amomaxu.d a0, a1, (a0)
3631; RV64IA-NEXT:    ret
3632  %1 = atomicrmw umax ptr %a, i64 %b monotonic
3633  ret i64 %1
3634}
3635
3636define signext i64 @atomicrmw_umin_i64_monotonic(ptr %a, i64 %b) nounwind {
3637; RV32I-LABEL: atomicrmw_umin_i64_monotonic:
3638; RV32I:       # %bb.0:
3639; RV32I-NEXT:    addi sp, sp, -32
3640; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3641; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3642; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3643; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3644; RV32I-NEXT:    mv s0, a2
3645; RV32I-NEXT:    mv s1, a0
3646; RV32I-NEXT:    lw a4, 0(a0)
3647; RV32I-NEXT:    lw a5, 4(a0)
3648; RV32I-NEXT:    mv s2, a1
3649; RV32I-NEXT:    j .LBB46_2
3650; RV32I-NEXT:  .LBB46_1: # %atomicrmw.start
3651; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3652; RV32I-NEXT:    sw a4, 8(sp)
3653; RV32I-NEXT:    sw a5, 12(sp)
3654; RV32I-NEXT:    addi a1, sp, 8
3655; RV32I-NEXT:    mv a0, s1
3656; RV32I-NEXT:    li a4, 0
3657; RV32I-NEXT:    li a5, 0
3658; RV32I-NEXT:    call __atomic_compare_exchange_8
3659; RV32I-NEXT:    lw a4, 8(sp)
3660; RV32I-NEXT:    lw a5, 12(sp)
3661; RV32I-NEXT:    bnez a0, .LBB46_7
3662; RV32I-NEXT:  .LBB46_2: # %atomicrmw.start
3663; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3664; RV32I-NEXT:    beq a5, s0, .LBB46_4
3665; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
3666; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3667; RV32I-NEXT:    sltu a0, s0, a5
3668; RV32I-NEXT:    j .LBB46_5
3669; RV32I-NEXT:  .LBB46_4: # in Loop: Header=BB46_2 Depth=1
3670; RV32I-NEXT:    sltu a0, s2, a4
3671; RV32I-NEXT:  .LBB46_5: # %atomicrmw.start
3672; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3673; RV32I-NEXT:    mv a2, a4
3674; RV32I-NEXT:    mv a3, a5
3675; RV32I-NEXT:    beqz a0, .LBB46_1
3676; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
3677; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3678; RV32I-NEXT:    mv a2, s2
3679; RV32I-NEXT:    mv a3, s0
3680; RV32I-NEXT:    j .LBB46_1
3681; RV32I-NEXT:  .LBB46_7: # %atomicrmw.end
3682; RV32I-NEXT:    mv a0, a4
3683; RV32I-NEXT:    mv a1, a5
3684; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3685; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3686; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3687; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3688; RV32I-NEXT:    addi sp, sp, 32
3689; RV32I-NEXT:    ret
3690;
3691; RV32IA-LABEL: atomicrmw_umin_i64_monotonic:
3692; RV32IA:       # %bb.0:
3693; RV32IA-NEXT:    addi sp, sp, -32
3694; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3695; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
3696; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
3697; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
3698; RV32IA-NEXT:    mv s0, a2
3699; RV32IA-NEXT:    mv s1, a0
3700; RV32IA-NEXT:    lw a4, 0(a0)
3701; RV32IA-NEXT:    lw a5, 4(a0)
3702; RV32IA-NEXT:    mv s2, a1
3703; RV32IA-NEXT:    j .LBB46_2
3704; RV32IA-NEXT:  .LBB46_1: # %atomicrmw.start
3705; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3706; RV32IA-NEXT:    sw a4, 8(sp)
3707; RV32IA-NEXT:    sw a5, 12(sp)
3708; RV32IA-NEXT:    addi a1, sp, 8
3709; RV32IA-NEXT:    mv a0, s1
3710; RV32IA-NEXT:    li a4, 0
3711; RV32IA-NEXT:    li a5, 0
3712; RV32IA-NEXT:    call __atomic_compare_exchange_8
3713; RV32IA-NEXT:    lw a4, 8(sp)
3714; RV32IA-NEXT:    lw a5, 12(sp)
3715; RV32IA-NEXT:    bnez a0, .LBB46_7
3716; RV32IA-NEXT:  .LBB46_2: # %atomicrmw.start
3717; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
3718; RV32IA-NEXT:    beq a5, s0, .LBB46_4
3719; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
3720; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3721; RV32IA-NEXT:    sltu a0, s0, a5
3722; RV32IA-NEXT:    j .LBB46_5
3723; RV32IA-NEXT:  .LBB46_4: # in Loop: Header=BB46_2 Depth=1
3724; RV32IA-NEXT:    sltu a0, s2, a4
3725; RV32IA-NEXT:  .LBB46_5: # %atomicrmw.start
3726; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3727; RV32IA-NEXT:    mv a2, a4
3728; RV32IA-NEXT:    mv a3, a5
3729; RV32IA-NEXT:    beqz a0, .LBB46_1
3730; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
3731; RV32IA-NEXT:    # in Loop: Header=BB46_2 Depth=1
3732; RV32IA-NEXT:    mv a2, s2
3733; RV32IA-NEXT:    mv a3, s0
3734; RV32IA-NEXT:    j .LBB46_1
3735; RV32IA-NEXT:  .LBB46_7: # %atomicrmw.end
3736; RV32IA-NEXT:    mv a0, a4
3737; RV32IA-NEXT:    mv a1, a5
3738; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3739; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
3740; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
3741; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
3742; RV32IA-NEXT:    addi sp, sp, 32
3743; RV32IA-NEXT:    ret
3744;
3745; RV64I-LABEL: atomicrmw_umin_i64_monotonic:
3746; RV64I:       # %bb.0:
3747; RV64I-NEXT:    addi sp, sp, -32
3748; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3749; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3750; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3751; RV64I-NEXT:    mv s0, a0
3752; RV64I-NEXT:    ld a3, 0(a0)
3753; RV64I-NEXT:    mv s1, a1
3754; RV64I-NEXT:    j .LBB46_2
3755; RV64I-NEXT:  .LBB46_1: # %atomicrmw.start
3756; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3757; RV64I-NEXT:    sd a3, 0(sp)
3758; RV64I-NEXT:    mv a1, sp
3759; RV64I-NEXT:    mv a0, s0
3760; RV64I-NEXT:    li a3, 0
3761; RV64I-NEXT:    li a4, 0
3762; RV64I-NEXT:    call __atomic_compare_exchange_8
3763; RV64I-NEXT:    ld a3, 0(sp)
3764; RV64I-NEXT:    bnez a0, .LBB46_4
3765; RV64I-NEXT:  .LBB46_2: # %atomicrmw.start
3766; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3767; RV64I-NEXT:    mv a2, a3
3768; RV64I-NEXT:    bgeu s1, a3, .LBB46_1
3769; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
3770; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
3771; RV64I-NEXT:    mv a2, s1
3772; RV64I-NEXT:    j .LBB46_1
3773; RV64I-NEXT:  .LBB46_4: # %atomicrmw.end
3774; RV64I-NEXT:    mv a0, a3
3775; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3776; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3777; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3778; RV64I-NEXT:    addi sp, sp, 32
3779; RV64I-NEXT:    ret
3780;
3781; RV64IA-LABEL: atomicrmw_umin_i64_monotonic:
3782; RV64IA:       # %bb.0:
3783; RV64IA-NEXT:    amominu.d a0, a1, (a0)
3784; RV64IA-NEXT:    ret
3785  %1 = atomicrmw umin ptr %a, i64 %b monotonic
3786  ret i64 %1
3787}
3788
3789define signext i8 @cmpxchg_i8_monotonic_monotonic_val0(ptr %ptr, i8 signext %cmp, i8 signext %val) nounwind {
3790; RV32I-LABEL: cmpxchg_i8_monotonic_monotonic_val0:
3791; RV32I:       # %bb.0:
3792; RV32I-NEXT:    addi sp, sp, -16
3793; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3794; RV32I-NEXT:    sb a1, 11(sp)
3795; RV32I-NEXT:    addi a1, sp, 11
3796; RV32I-NEXT:    li a3, 0
3797; RV32I-NEXT:    li a4, 0
3798; RV32I-NEXT:    call __atomic_compare_exchange_1
3799; RV32I-NEXT:    lb a0, 11(sp)
3800; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3801; RV32I-NEXT:    addi sp, sp, 16
3802; RV32I-NEXT:    ret
3803;
3804; RV32IA-LABEL: cmpxchg_i8_monotonic_monotonic_val0:
3805; RV32IA:       # %bb.0:
3806; RV32IA-NEXT:    andi a3, a0, -4
3807; RV32IA-NEXT:    slli a0, a0, 3
3808; RV32IA-NEXT:    li a4, 255
3809; RV32IA-NEXT:    andi a1, a1, 255
3810; RV32IA-NEXT:    andi a2, a2, 255
3811; RV32IA-NEXT:    sll a4, a4, a0
3812; RV32IA-NEXT:    sll a1, a1, a0
3813; RV32IA-NEXT:    sll a2, a2, a0
3814; RV32IA-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
3815; RV32IA-NEXT:    lr.w a5, (a3)
3816; RV32IA-NEXT:    and a6, a5, a4
3817; RV32IA-NEXT:    bne a6, a1, .LBB47_3
3818; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
3819; RV32IA-NEXT:    xor a6, a5, a2
3820; RV32IA-NEXT:    and a6, a6, a4
3821; RV32IA-NEXT:    xor a6, a5, a6
3822; RV32IA-NEXT:    sc.w a6, a6, (a3)
3823; RV32IA-NEXT:    bnez a6, .LBB47_1
3824; RV32IA-NEXT:  .LBB47_3:
3825; RV32IA-NEXT:    srl a0, a5, a0
3826; RV32IA-NEXT:    slli a0, a0, 24
3827; RV32IA-NEXT:    srai a0, a0, 24
3828; RV32IA-NEXT:    ret
3829;
3830; RV64I-LABEL: cmpxchg_i8_monotonic_monotonic_val0:
3831; RV64I:       # %bb.0:
3832; RV64I-NEXT:    addi sp, sp, -16
3833; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3834; RV64I-NEXT:    sb a1, 7(sp)
3835; RV64I-NEXT:    addi a1, sp, 7
3836; RV64I-NEXT:    li a3, 0
3837; RV64I-NEXT:    li a4, 0
3838; RV64I-NEXT:    call __atomic_compare_exchange_1
3839; RV64I-NEXT:    lb a0, 7(sp)
3840; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3841; RV64I-NEXT:    addi sp, sp, 16
3842; RV64I-NEXT:    ret
3843;
3844; RV64IA-LABEL: cmpxchg_i8_monotonic_monotonic_val0:
3845; RV64IA:       # %bb.0:
3846; RV64IA-NEXT:    andi a3, a0, -4
3847; RV64IA-NEXT:    slli a0, a0, 3
3848; RV64IA-NEXT:    li a4, 255
3849; RV64IA-NEXT:    andi a1, a1, 255
3850; RV64IA-NEXT:    andi a2, a2, 255
3851; RV64IA-NEXT:    sllw a4, a4, a0
3852; RV64IA-NEXT:    sllw a1, a1, a0
3853; RV64IA-NEXT:    sllw a2, a2, a0
3854; RV64IA-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
3855; RV64IA-NEXT:    lr.w a5, (a3)
3856; RV64IA-NEXT:    and a6, a5, a4
3857; RV64IA-NEXT:    bne a6, a1, .LBB47_3
3858; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
3859; RV64IA-NEXT:    xor a6, a5, a2
3860; RV64IA-NEXT:    and a6, a6, a4
3861; RV64IA-NEXT:    xor a6, a5, a6
3862; RV64IA-NEXT:    sc.w a6, a6, (a3)
3863; RV64IA-NEXT:    bnez a6, .LBB47_1
3864; RV64IA-NEXT:  .LBB47_3:
3865; RV64IA-NEXT:    srlw a0, a5, a0
3866; RV64IA-NEXT:    slli a0, a0, 56
3867; RV64IA-NEXT:    srai a0, a0, 56
3868; RV64IA-NEXT:    ret
3869  %1 = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
3870  %2 = extractvalue { i8, i1 } %1, 0
3871  ret i8 %2
3872}
3873
3874define i1 @cmpxchg_i8_monotonic_monotonic_val1(ptr %ptr, i8 signext %cmp, i8 signext %val) nounwind {
3875; RV32I-LABEL: cmpxchg_i8_monotonic_monotonic_val1:
3876; RV32I:       # %bb.0:
3877; RV32I-NEXT:    addi sp, sp, -16
3878; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3879; RV32I-NEXT:    sb a1, 11(sp)
3880; RV32I-NEXT:    addi a1, sp, 11
3881; RV32I-NEXT:    li a3, 0
3882; RV32I-NEXT:    li a4, 0
3883; RV32I-NEXT:    call __atomic_compare_exchange_1
3884; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3885; RV32I-NEXT:    addi sp, sp, 16
3886; RV32I-NEXT:    ret
3887;
3888; RV32IA-LABEL: cmpxchg_i8_monotonic_monotonic_val1:
3889; RV32IA:       # %bb.0:
3890; RV32IA-NEXT:    andi a3, a0, -4
3891; RV32IA-NEXT:    slli a0, a0, 3
3892; RV32IA-NEXT:    li a4, 255
3893; RV32IA-NEXT:    andi a1, a1, 255
3894; RV32IA-NEXT:    andi a2, a2, 255
3895; RV32IA-NEXT:    sll a4, a4, a0
3896; RV32IA-NEXT:    sll a1, a1, a0
3897; RV32IA-NEXT:    sll a0, a2, a0
3898; RV32IA-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
3899; RV32IA-NEXT:    lr.w a2, (a3)
3900; RV32IA-NEXT:    and a5, a2, a4
3901; RV32IA-NEXT:    bne a5, a1, .LBB48_3
3902; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
3903; RV32IA-NEXT:    xor a5, a2, a0
3904; RV32IA-NEXT:    and a5, a5, a4
3905; RV32IA-NEXT:    xor a5, a2, a5
3906; RV32IA-NEXT:    sc.w a5, a5, (a3)
3907; RV32IA-NEXT:    bnez a5, .LBB48_1
3908; RV32IA-NEXT:  .LBB48_3:
3909; RV32IA-NEXT:    and a2, a2, a4
3910; RV32IA-NEXT:    xor a1, a1, a2
3911; RV32IA-NEXT:    seqz a0, a1
3912; RV32IA-NEXT:    ret
3913;
3914; RV64I-LABEL: cmpxchg_i8_monotonic_monotonic_val1:
3915; RV64I:       # %bb.0:
3916; RV64I-NEXT:    addi sp, sp, -16
3917; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3918; RV64I-NEXT:    sb a1, 7(sp)
3919; RV64I-NEXT:    addi a1, sp, 7
3920; RV64I-NEXT:    li a3, 0
3921; RV64I-NEXT:    li a4, 0
3922; RV64I-NEXT:    call __atomic_compare_exchange_1
3923; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3924; RV64I-NEXT:    addi sp, sp, 16
3925; RV64I-NEXT:    ret
3926;
3927; RV64IA-LABEL: cmpxchg_i8_monotonic_monotonic_val1:
3928; RV64IA:       # %bb.0:
3929; RV64IA-NEXT:    andi a3, a0, -4
3930; RV64IA-NEXT:    slli a0, a0, 3
3931; RV64IA-NEXT:    li a4, 255
3932; RV64IA-NEXT:    andi a1, a1, 255
3933; RV64IA-NEXT:    andi a2, a2, 255
3934; RV64IA-NEXT:    sllw a4, a4, a0
3935; RV64IA-NEXT:    sllw a1, a1, a0
3936; RV64IA-NEXT:    sllw a0, a2, a0
3937; RV64IA-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
3938; RV64IA-NEXT:    lr.w a2, (a3)
3939; RV64IA-NEXT:    and a5, a2, a4
3940; RV64IA-NEXT:    bne a5, a1, .LBB48_3
3941; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
3942; RV64IA-NEXT:    xor a5, a2, a0
3943; RV64IA-NEXT:    and a5, a5, a4
3944; RV64IA-NEXT:    xor a5, a2, a5
3945; RV64IA-NEXT:    sc.w a5, a5, (a3)
3946; RV64IA-NEXT:    bnez a5, .LBB48_1
3947; RV64IA-NEXT:  .LBB48_3:
3948; RV64IA-NEXT:    and a2, a2, a4
3949; RV64IA-NEXT:    xor a1, a1, a2
3950; RV64IA-NEXT:    seqz a0, a1
3951; RV64IA-NEXT:    ret
3952  %1 = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
3953  %2 = extractvalue { i8, i1 } %1, 1
3954  ret i1 %2
3955}
3956
3957define signext i16 @cmpxchg_i16_monotonic_monotonic_val0(ptr %ptr, i16 signext %cmp, i16 signext %val) nounwind {
3958; RV32I-LABEL: cmpxchg_i16_monotonic_monotonic_val0:
3959; RV32I:       # %bb.0:
3960; RV32I-NEXT:    addi sp, sp, -16
3961; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3962; RV32I-NEXT:    sh a1, 10(sp)
3963; RV32I-NEXT:    addi a1, sp, 10
3964; RV32I-NEXT:    li a3, 0
3965; RV32I-NEXT:    li a4, 0
3966; RV32I-NEXT:    call __atomic_compare_exchange_2
3967; RV32I-NEXT:    lh a0, 10(sp)
3968; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3969; RV32I-NEXT:    addi sp, sp, 16
3970; RV32I-NEXT:    ret
3971;
3972; RV32IA-LABEL: cmpxchg_i16_monotonic_monotonic_val0:
3973; RV32IA:       # %bb.0:
3974; RV32IA-NEXT:    andi a3, a0, -4
3975; RV32IA-NEXT:    slli a0, a0, 3
3976; RV32IA-NEXT:    lui a4, 16
3977; RV32IA-NEXT:    addi a4, a4, -1
3978; RV32IA-NEXT:    sll a5, a4, a0
3979; RV32IA-NEXT:    and a1, a1, a4
3980; RV32IA-NEXT:    and a2, a2, a4
3981; RV32IA-NEXT:    sll a1, a1, a0
3982; RV32IA-NEXT:    sll a2, a2, a0
3983; RV32IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
3984; RV32IA-NEXT:    lr.w a4, (a3)
3985; RV32IA-NEXT:    and a6, a4, a5
3986; RV32IA-NEXT:    bne a6, a1, .LBB49_3
3987; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
3988; RV32IA-NEXT:    xor a6, a4, a2
3989; RV32IA-NEXT:    and a6, a6, a5
3990; RV32IA-NEXT:    xor a6, a4, a6
3991; RV32IA-NEXT:    sc.w a6, a6, (a3)
3992; RV32IA-NEXT:    bnez a6, .LBB49_1
3993; RV32IA-NEXT:  .LBB49_3:
3994; RV32IA-NEXT:    srl a0, a4, a0
3995; RV32IA-NEXT:    slli a0, a0, 16
3996; RV32IA-NEXT:    srai a0, a0, 16
3997; RV32IA-NEXT:    ret
3998;
3999; RV64I-LABEL: cmpxchg_i16_monotonic_monotonic_val0:
4000; RV64I:       # %bb.0:
4001; RV64I-NEXT:    addi sp, sp, -16
4002; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4003; RV64I-NEXT:    sh a1, 6(sp)
4004; RV64I-NEXT:    addi a1, sp, 6
4005; RV64I-NEXT:    li a3, 0
4006; RV64I-NEXT:    li a4, 0
4007; RV64I-NEXT:    call __atomic_compare_exchange_2
4008; RV64I-NEXT:    lh a0, 6(sp)
4009; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4010; RV64I-NEXT:    addi sp, sp, 16
4011; RV64I-NEXT:    ret
4012;
4013; RV64IA-LABEL: cmpxchg_i16_monotonic_monotonic_val0:
4014; RV64IA:       # %bb.0:
4015; RV64IA-NEXT:    andi a3, a0, -4
4016; RV64IA-NEXT:    slli a0, a0, 3
4017; RV64IA-NEXT:    lui a4, 16
4018; RV64IA-NEXT:    addi a4, a4, -1
4019; RV64IA-NEXT:    sllw a5, a4, a0
4020; RV64IA-NEXT:    and a1, a1, a4
4021; RV64IA-NEXT:    and a2, a2, a4
4022; RV64IA-NEXT:    sllw a1, a1, a0
4023; RV64IA-NEXT:    sllw a2, a2, a0
4024; RV64IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
4025; RV64IA-NEXT:    lr.w a4, (a3)
4026; RV64IA-NEXT:    and a6, a4, a5
4027; RV64IA-NEXT:    bne a6, a1, .LBB49_3
4028; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
4029; RV64IA-NEXT:    xor a6, a4, a2
4030; RV64IA-NEXT:    and a6, a6, a5
4031; RV64IA-NEXT:    xor a6, a4, a6
4032; RV64IA-NEXT:    sc.w a6, a6, (a3)
4033; RV64IA-NEXT:    bnez a6, .LBB49_1
4034; RV64IA-NEXT:  .LBB49_3:
4035; RV64IA-NEXT:    srlw a0, a4, a0
4036; RV64IA-NEXT:    slli a0, a0, 48
4037; RV64IA-NEXT:    srai a0, a0, 48
4038; RV64IA-NEXT:    ret
4039  %1 = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
4040  %2 = extractvalue { i16, i1 } %1, 0
4041  ret i16 %2
4042}
4043
4044define i1 @cmpxchg_i16_monotonic_monotonic_val1(ptr %ptr, i16 signext %cmp, i16 signext %val) nounwind {
4045; RV32I-LABEL: cmpxchg_i16_monotonic_monotonic_val1:
4046; RV32I:       # %bb.0:
4047; RV32I-NEXT:    addi sp, sp, -16
4048; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4049; RV32I-NEXT:    sh a1, 10(sp)
4050; RV32I-NEXT:    addi a1, sp, 10
4051; RV32I-NEXT:    li a3, 0
4052; RV32I-NEXT:    li a4, 0
4053; RV32I-NEXT:    call __atomic_compare_exchange_2
4054; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4055; RV32I-NEXT:    addi sp, sp, 16
4056; RV32I-NEXT:    ret
4057;
4058; RV32IA-LABEL: cmpxchg_i16_monotonic_monotonic_val1:
4059; RV32IA:       # %bb.0:
4060; RV32IA-NEXT:    andi a3, a0, -4
4061; RV32IA-NEXT:    slli a0, a0, 3
4062; RV32IA-NEXT:    lui a4, 16
4063; RV32IA-NEXT:    addi a4, a4, -1
4064; RV32IA-NEXT:    sll a5, a4, a0
4065; RV32IA-NEXT:    and a1, a1, a4
4066; RV32IA-NEXT:    and a2, a2, a4
4067; RV32IA-NEXT:    sll a1, a1, a0
4068; RV32IA-NEXT:    sll a0, a2, a0
4069; RV32IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
4070; RV32IA-NEXT:    lr.w a2, (a3)
4071; RV32IA-NEXT:    and a4, a2, a5
4072; RV32IA-NEXT:    bne a4, a1, .LBB50_3
4073; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
4074; RV32IA-NEXT:    xor a4, a2, a0
4075; RV32IA-NEXT:    and a4, a4, a5
4076; RV32IA-NEXT:    xor a4, a2, a4
4077; RV32IA-NEXT:    sc.w a4, a4, (a3)
4078; RV32IA-NEXT:    bnez a4, .LBB50_1
4079; RV32IA-NEXT:  .LBB50_3:
4080; RV32IA-NEXT:    and a2, a2, a5
4081; RV32IA-NEXT:    xor a1, a1, a2
4082; RV32IA-NEXT:    seqz a0, a1
4083; RV32IA-NEXT:    ret
4084;
4085; RV64I-LABEL: cmpxchg_i16_monotonic_monotonic_val1:
4086; RV64I:       # %bb.0:
4087; RV64I-NEXT:    addi sp, sp, -16
4088; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4089; RV64I-NEXT:    sh a1, 6(sp)
4090; RV64I-NEXT:    addi a1, sp, 6
4091; RV64I-NEXT:    li a3, 0
4092; RV64I-NEXT:    li a4, 0
4093; RV64I-NEXT:    call __atomic_compare_exchange_2
4094; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4095; RV64I-NEXT:    addi sp, sp, 16
4096; RV64I-NEXT:    ret
4097;
4098; RV64IA-LABEL: cmpxchg_i16_monotonic_monotonic_val1:
4099; RV64IA:       # %bb.0:
4100; RV64IA-NEXT:    andi a3, a0, -4
4101; RV64IA-NEXT:    slli a0, a0, 3
4102; RV64IA-NEXT:    lui a4, 16
4103; RV64IA-NEXT:    addi a4, a4, -1
4104; RV64IA-NEXT:    sllw a5, a4, a0
4105; RV64IA-NEXT:    and a1, a1, a4
4106; RV64IA-NEXT:    and a2, a2, a4
4107; RV64IA-NEXT:    sllw a1, a1, a0
4108; RV64IA-NEXT:    sllw a0, a2, a0
4109; RV64IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
4110; RV64IA-NEXT:    lr.w a2, (a3)
4111; RV64IA-NEXT:    and a4, a2, a5
4112; RV64IA-NEXT:    bne a4, a1, .LBB50_3
4113; RV64IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
4114; RV64IA-NEXT:    xor a4, a2, a0
4115; RV64IA-NEXT:    and a4, a4, a5
4116; RV64IA-NEXT:    xor a4, a2, a4
4117; RV64IA-NEXT:    sc.w a4, a4, (a3)
4118; RV64IA-NEXT:    bnez a4, .LBB50_1
4119; RV64IA-NEXT:  .LBB50_3:
4120; RV64IA-NEXT:    and a2, a2, a5
4121; RV64IA-NEXT:    xor a1, a1, a2
4122; RV64IA-NEXT:    seqz a0, a1
4123; RV64IA-NEXT:    ret
4124  %1 = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
4125  %2 = extractvalue { i16, i1 } %1, 1
4126  ret i1 %2
4127}
4128
4129define signext i32 @cmpxchg_i32_monotonic_monotonic_val0(ptr %ptr, i32 signext %cmp, i32 signext %val) nounwind {
4130; RV32I-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4131; RV32I:       # %bb.0:
4132; RV32I-NEXT:    addi sp, sp, -16
4133; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4134; RV32I-NEXT:    sw a1, 8(sp)
4135; RV32I-NEXT:    addi a1, sp, 8
4136; RV32I-NEXT:    li a3, 0
4137; RV32I-NEXT:    li a4, 0
4138; RV32I-NEXT:    call __atomic_compare_exchange_4
4139; RV32I-NEXT:    lw a0, 8(sp)
4140; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4141; RV32I-NEXT:    addi sp, sp, 16
4142; RV32I-NEXT:    ret
4143;
4144; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4145; RV32IA-NOZACAS:       # %bb.0:
4146; RV32IA-NOZACAS-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
4147; RV32IA-NOZACAS-NEXT:    lr.w a3, (a0)
4148; RV32IA-NOZACAS-NEXT:    bne a3, a1, .LBB51_3
4149; RV32IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
4150; RV32IA-NOZACAS-NEXT:    sc.w a4, a2, (a0)
4151; RV32IA-NOZACAS-NEXT:    bnez a4, .LBB51_1
4152; RV32IA-NOZACAS-NEXT:  .LBB51_3:
4153; RV32IA-NOZACAS-NEXT:    mv a0, a3
4154; RV32IA-NOZACAS-NEXT:    ret
4155;
4156; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4157; RV32IA-ZACAS:       # %bb.0:
4158; RV32IA-ZACAS-NEXT:    amocas.w a1, a2, (a0)
4159; RV32IA-ZACAS-NEXT:    mv a0, a1
4160; RV32IA-ZACAS-NEXT:    ret
4161;
4162; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4163; RV64I:       # %bb.0:
4164; RV64I-NEXT:    addi sp, sp, -16
4165; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4166; RV64I-NEXT:    sw a1, 4(sp)
4167; RV64I-NEXT:    addi a1, sp, 4
4168; RV64I-NEXT:    li a3, 0
4169; RV64I-NEXT:    li a4, 0
4170; RV64I-NEXT:    call __atomic_compare_exchange_4
4171; RV64I-NEXT:    lw a0, 4(sp)
4172; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4173; RV64I-NEXT:    addi sp, sp, 16
4174; RV64I-NEXT:    ret
4175;
4176; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4177; RV64IA-NOZACAS:       # %bb.0:
4178; RV64IA-NOZACAS-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
4179; RV64IA-NOZACAS-NEXT:    lr.w a3, (a0)
4180; RV64IA-NOZACAS-NEXT:    bne a3, a1, .LBB51_3
4181; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
4182; RV64IA-NOZACAS-NEXT:    sc.w a4, a2, (a0)
4183; RV64IA-NOZACAS-NEXT:    bnez a4, .LBB51_1
4184; RV64IA-NOZACAS-NEXT:  .LBB51_3:
4185; RV64IA-NOZACAS-NEXT:    mv a0, a3
4186; RV64IA-NOZACAS-NEXT:    ret
4187;
4188; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0:
4189; RV64IA-ZACAS:       # %bb.0:
4190; RV64IA-ZACAS-NEXT:    amocas.w a1, a2, (a0)
4191; RV64IA-ZACAS-NEXT:    mv a0, a1
4192; RV64IA-ZACAS-NEXT:    ret
4193  %1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
4194  %2 = extractvalue { i32, i1 } %1, 0
4195  ret i32 %2
4196}
4197
4198define i1 @cmpxchg_i32_monotonic_monotonic_val1(ptr %ptr, i32 signext %cmp, i32 signext %val) nounwind {
4199; RV32I-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4200; RV32I:       # %bb.0:
4201; RV32I-NEXT:    addi sp, sp, -16
4202; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4203; RV32I-NEXT:    sw a1, 8(sp)
4204; RV32I-NEXT:    addi a1, sp, 8
4205; RV32I-NEXT:    li a3, 0
4206; RV32I-NEXT:    li a4, 0
4207; RV32I-NEXT:    call __atomic_compare_exchange_4
4208; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4209; RV32I-NEXT:    addi sp, sp, 16
4210; RV32I-NEXT:    ret
4211;
4212; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4213; RV32IA-NOZACAS:       # %bb.0:
4214; RV32IA-NOZACAS-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
4215; RV32IA-NOZACAS-NEXT:    lr.w a3, (a0)
4216; RV32IA-NOZACAS-NEXT:    bne a3, a1, .LBB52_3
4217; RV32IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
4218; RV32IA-NOZACAS-NEXT:    sc.w a4, a2, (a0)
4219; RV32IA-NOZACAS-NEXT:    bnez a4, .LBB52_1
4220; RV32IA-NOZACAS-NEXT:  .LBB52_3:
4221; RV32IA-NOZACAS-NEXT:    xor a1, a3, a1
4222; RV32IA-NOZACAS-NEXT:    seqz a0, a1
4223; RV32IA-NOZACAS-NEXT:    ret
4224;
4225; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4226; RV32IA-ZACAS:       # %bb.0:
4227; RV32IA-ZACAS-NEXT:    mv a3, a1
4228; RV32IA-ZACAS-NEXT:    amocas.w a3, a2, (a0)
4229; RV32IA-ZACAS-NEXT:    xor a1, a3, a1
4230; RV32IA-ZACAS-NEXT:    seqz a0, a1
4231; RV32IA-ZACAS-NEXT:    ret
4232;
4233; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4234; RV64I:       # %bb.0:
4235; RV64I-NEXT:    addi sp, sp, -16
4236; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4237; RV64I-NEXT:    sw a1, 4(sp)
4238; RV64I-NEXT:    addi a1, sp, 4
4239; RV64I-NEXT:    li a3, 0
4240; RV64I-NEXT:    li a4, 0
4241; RV64I-NEXT:    call __atomic_compare_exchange_4
4242; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4243; RV64I-NEXT:    addi sp, sp, 16
4244; RV64I-NEXT:    ret
4245;
4246; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4247; RV64IA-NOZACAS:       # %bb.0:
4248; RV64IA-NOZACAS-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
4249; RV64IA-NOZACAS-NEXT:    lr.w a3, (a0)
4250; RV64IA-NOZACAS-NEXT:    bne a3, a1, .LBB52_3
4251; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
4252; RV64IA-NOZACAS-NEXT:    sc.w a4, a2, (a0)
4253; RV64IA-NOZACAS-NEXT:    bnez a4, .LBB52_1
4254; RV64IA-NOZACAS-NEXT:  .LBB52_3:
4255; RV64IA-NOZACAS-NEXT:    xor a1, a3, a1
4256; RV64IA-NOZACAS-NEXT:    seqz a0, a1
4257; RV64IA-NOZACAS-NEXT:    ret
4258;
4259; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1:
4260; RV64IA-ZACAS:       # %bb.0:
4261; RV64IA-ZACAS-NEXT:    mv a3, a1
4262; RV64IA-ZACAS-NEXT:    amocas.w a3, a2, (a0)
4263; RV64IA-ZACAS-NEXT:    xor a1, a3, a1
4264; RV64IA-ZACAS-NEXT:    seqz a0, a1
4265; RV64IA-ZACAS-NEXT:    ret
4266  %1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
4267  %2 = extractvalue { i32, i1 } %1, 1
4268  ret i1 %2
4269}
4270
4271define signext i32 @atomicrmw_xchg_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4272; RV32I-LABEL: atomicrmw_xchg_i32_monotonic_crossbb:
4273; RV32I:       # %bb.0:
4274; RV32I-NEXT:    andi a1, a1, 1
4275; RV32I-NEXT:    beqz a1, .LBB53_2
4276; RV32I-NEXT:  # %bb.1: # %then
4277; RV32I-NEXT:    addi sp, sp, -16
4278; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4279; RV32I-NEXT:    li a1, 1
4280; RV32I-NEXT:    li a2, 0
4281; RV32I-NEXT:    call __atomic_exchange_4
4282; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4283; RV32I-NEXT:    addi sp, sp, 16
4284; RV32I-NEXT:    ret
4285; RV32I-NEXT:  .LBB53_2: # %else
4286; RV32I-NEXT:    lw a1, 0(a0)
4287; RV32I-NEXT:    li a2, 1
4288; RV32I-NEXT:    sw a2, 0(a0)
4289; RV32I-NEXT:    mv a0, a1
4290; RV32I-NEXT:    ret
4291;
4292; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic_crossbb:
4293; RV32IA:       # %bb.0:
4294; RV32IA-NEXT:    andi a1, a1, 1
4295; RV32IA-NEXT:    beqz a1, .LBB53_2
4296; RV32IA-NEXT:  # %bb.1: # %then
4297; RV32IA-NEXT:    li a1, 1
4298; RV32IA-NEXT:    amoswap.w a0, a1, (a0)
4299; RV32IA-NEXT:    ret
4300; RV32IA-NEXT:  .LBB53_2: # %else
4301; RV32IA-NEXT:    mv a1, a0
4302; RV32IA-NEXT:    lw a0, 0(a0)
4303; RV32IA-NEXT:    li a2, 1
4304; RV32IA-NEXT:    sw a2, 0(a1)
4305; RV32IA-NEXT:    ret
4306;
4307; RV64I-LABEL: atomicrmw_xchg_i32_monotonic_crossbb:
4308; RV64I:       # %bb.0:
4309; RV64I-NEXT:    andi a1, a1, 1
4310; RV64I-NEXT:    beqz a1, .LBB53_2
4311; RV64I-NEXT:  # %bb.1: # %then
4312; RV64I-NEXT:    addi sp, sp, -16
4313; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4314; RV64I-NEXT:    li a1, 1
4315; RV64I-NEXT:    li a2, 0
4316; RV64I-NEXT:    call __atomic_exchange_4
4317; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4318; RV64I-NEXT:    addi sp, sp, 16
4319; RV64I-NEXT:    sext.w a0, a0
4320; RV64I-NEXT:    ret
4321; RV64I-NEXT:  .LBB53_2: # %else
4322; RV64I-NEXT:    lw a1, 0(a0)
4323; RV64I-NEXT:    li a2, 1
4324; RV64I-NEXT:    sw a2, 0(a0)
4325; RV64I-NEXT:    sext.w a0, a1
4326; RV64I-NEXT:    ret
4327;
4328; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic_crossbb:
4329; RV64IA:       # %bb.0:
4330; RV64IA-NEXT:    andi a1, a1, 1
4331; RV64IA-NEXT:    beqz a1, .LBB53_2
4332; RV64IA-NEXT:  # %bb.1: # %then
4333; RV64IA-NEXT:    li a1, 1
4334; RV64IA-NEXT:    amoswap.w a0, a1, (a0)
4335; RV64IA-NEXT:    ret
4336; RV64IA-NEXT:  .LBB53_2: # %else
4337; RV64IA-NEXT:    mv a1, a0
4338; RV64IA-NEXT:    lw a0, 0(a0)
4339; RV64IA-NEXT:    li a2, 1
4340; RV64IA-NEXT:    sw a2, 0(a1)
4341; RV64IA-NEXT:    ret
4342  br i1 %c, label %then, label %else
4343
4344then:
4345  %1 = atomicrmw xchg ptr %a, i32 1 monotonic
4346  br label %merge
4347
4348else:
4349  %2 = load i32, ptr %a, align 4
4350  store i32 1, ptr %a
4351  br label %merge
4352
4353merge:
4354  %3 = phi i32 [ %1, %then ], [ %2, %else ]
4355  ret i32 %3
4356}
4357
4358define signext i32 @atomicrmw_add_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4359; RV32I-LABEL: atomicrmw_add_i32_monotonic_crossbb:
4360; RV32I:       # %bb.0:
4361; RV32I-NEXT:    andi a1, a1, 1
4362; RV32I-NEXT:    beqz a1, .LBB54_2
4363; RV32I-NEXT:  # %bb.1: # %then
4364; RV32I-NEXT:    addi sp, sp, -16
4365; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4366; RV32I-NEXT:    li a1, 1
4367; RV32I-NEXT:    li a2, 0
4368; RV32I-NEXT:    call __atomic_fetch_add_4
4369; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4370; RV32I-NEXT:    addi sp, sp, 16
4371; RV32I-NEXT:    ret
4372; RV32I-NEXT:  .LBB54_2: # %else
4373; RV32I-NEXT:    lw a1, 0(a0)
4374; RV32I-NEXT:    addi a2, a1, 1
4375; RV32I-NEXT:    sw a2, 0(a0)
4376; RV32I-NEXT:    mv a0, a1
4377; RV32I-NEXT:    ret
4378;
4379; RV32IA-LABEL: atomicrmw_add_i32_monotonic_crossbb:
4380; RV32IA:       # %bb.0:
4381; RV32IA-NEXT:    andi a1, a1, 1
4382; RV32IA-NEXT:    beqz a1, .LBB54_2
4383; RV32IA-NEXT:  # %bb.1: # %then
4384; RV32IA-NEXT:    li a1, 1
4385; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
4386; RV32IA-NEXT:    ret
4387; RV32IA-NEXT:  .LBB54_2: # %else
4388; RV32IA-NEXT:    mv a1, a0
4389; RV32IA-NEXT:    lw a0, 0(a0)
4390; RV32IA-NEXT:    addi a2, a0, 1
4391; RV32IA-NEXT:    sw a2, 0(a1)
4392; RV32IA-NEXT:    ret
4393;
4394; RV64I-LABEL: atomicrmw_add_i32_monotonic_crossbb:
4395; RV64I:       # %bb.0:
4396; RV64I-NEXT:    andi a1, a1, 1
4397; RV64I-NEXT:    beqz a1, .LBB54_2
4398; RV64I-NEXT:  # %bb.1: # %then
4399; RV64I-NEXT:    addi sp, sp, -16
4400; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4401; RV64I-NEXT:    li a1, 1
4402; RV64I-NEXT:    li a2, 0
4403; RV64I-NEXT:    call __atomic_fetch_add_4
4404; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4405; RV64I-NEXT:    addi sp, sp, 16
4406; RV64I-NEXT:    sext.w a0, a0
4407; RV64I-NEXT:    ret
4408; RV64I-NEXT:  .LBB54_2: # %else
4409; RV64I-NEXT:    lw a1, 0(a0)
4410; RV64I-NEXT:    addi a2, a1, 1
4411; RV64I-NEXT:    sw a2, 0(a0)
4412; RV64I-NEXT:    sext.w a0, a1
4413; RV64I-NEXT:    ret
4414;
4415; RV64IA-LABEL: atomicrmw_add_i32_monotonic_crossbb:
4416; RV64IA:       # %bb.0:
4417; RV64IA-NEXT:    andi a1, a1, 1
4418; RV64IA-NEXT:    beqz a1, .LBB54_2
4419; RV64IA-NEXT:  # %bb.1: # %then
4420; RV64IA-NEXT:    li a1, 1
4421; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
4422; RV64IA-NEXT:    ret
4423; RV64IA-NEXT:  .LBB54_2: # %else
4424; RV64IA-NEXT:    mv a1, a0
4425; RV64IA-NEXT:    lw a0, 0(a0)
4426; RV64IA-NEXT:    addi a2, a0, 1
4427; RV64IA-NEXT:    sw a2, 0(a1)
4428; RV64IA-NEXT:    ret
4429  br i1 %c, label %then, label %else
4430
4431then:
4432  %1 = atomicrmw add ptr %a, i32 1 monotonic
4433  br label %merge
4434
4435else:
4436  %2 = load i32, ptr %a, align 4
4437  %3 = add i32 %2, 1
4438  store i32 %3, ptr %a
4439  br label %merge
4440
4441merge:
4442  %4 = phi i32 [ %1, %then ], [ %2, %else ]
4443  ret i32 %4
4444}
4445
4446define signext i32 @atomicrmw_sub_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4447; RV32I-LABEL: atomicrmw_sub_i32_monotonic_crossbb:
4448; RV32I:       # %bb.0:
4449; RV32I-NEXT:    andi a1, a1, 1
4450; RV32I-NEXT:    beqz a1, .LBB55_2
4451; RV32I-NEXT:  # %bb.1: # %then
4452; RV32I-NEXT:    addi sp, sp, -16
4453; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4454; RV32I-NEXT:    li a1, 1
4455; RV32I-NEXT:    li a2, 0
4456; RV32I-NEXT:    call __atomic_fetch_sub_4
4457; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4458; RV32I-NEXT:    addi sp, sp, 16
4459; RV32I-NEXT:    ret
4460; RV32I-NEXT:  .LBB55_2: # %else
4461; RV32I-NEXT:    lw a1, 0(a0)
4462; RV32I-NEXT:    addi a2, a1, -1
4463; RV32I-NEXT:    sw a2, 0(a0)
4464; RV32I-NEXT:    mv a0, a1
4465; RV32I-NEXT:    ret
4466;
4467; RV32IA-LABEL: atomicrmw_sub_i32_monotonic_crossbb:
4468; RV32IA:       # %bb.0:
4469; RV32IA-NEXT:    andi a1, a1, 1
4470; RV32IA-NEXT:    beqz a1, .LBB55_2
4471; RV32IA-NEXT:  # %bb.1: # %then
4472; RV32IA-NEXT:    li a1, -1
4473; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
4474; RV32IA-NEXT:    ret
4475; RV32IA-NEXT:  .LBB55_2: # %else
4476; RV32IA-NEXT:    mv a1, a0
4477; RV32IA-NEXT:    lw a0, 0(a0)
4478; RV32IA-NEXT:    addi a2, a0, -1
4479; RV32IA-NEXT:    sw a2, 0(a1)
4480; RV32IA-NEXT:    ret
4481;
4482; RV64I-LABEL: atomicrmw_sub_i32_monotonic_crossbb:
4483; RV64I:       # %bb.0:
4484; RV64I-NEXT:    andi a1, a1, 1
4485; RV64I-NEXT:    beqz a1, .LBB55_2
4486; RV64I-NEXT:  # %bb.1: # %then
4487; RV64I-NEXT:    addi sp, sp, -16
4488; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4489; RV64I-NEXT:    li a1, 1
4490; RV64I-NEXT:    li a2, 0
4491; RV64I-NEXT:    call __atomic_fetch_sub_4
4492; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4493; RV64I-NEXT:    addi sp, sp, 16
4494; RV64I-NEXT:    sext.w a0, a0
4495; RV64I-NEXT:    ret
4496; RV64I-NEXT:  .LBB55_2: # %else
4497; RV64I-NEXT:    lw a1, 0(a0)
4498; RV64I-NEXT:    addi a2, a1, -1
4499; RV64I-NEXT:    sw a2, 0(a0)
4500; RV64I-NEXT:    sext.w a0, a1
4501; RV64I-NEXT:    ret
4502;
4503; RV64IA-LABEL: atomicrmw_sub_i32_monotonic_crossbb:
4504; RV64IA:       # %bb.0:
4505; RV64IA-NEXT:    andi a1, a1, 1
4506; RV64IA-NEXT:    beqz a1, .LBB55_2
4507; RV64IA-NEXT:  # %bb.1: # %then
4508; RV64IA-NEXT:    li a1, -1
4509; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
4510; RV64IA-NEXT:    ret
4511; RV64IA-NEXT:  .LBB55_2: # %else
4512; RV64IA-NEXT:    mv a1, a0
4513; RV64IA-NEXT:    lw a0, 0(a0)
4514; RV64IA-NEXT:    addi a2, a0, -1
4515; RV64IA-NEXT:    sw a2, 0(a1)
4516; RV64IA-NEXT:    ret
4517  br i1 %c, label %then, label %else
4518
4519then:
4520  %1 = atomicrmw sub ptr %a, i32 1 monotonic
4521  br label %merge
4522
4523else:
4524  %2 = load i32, ptr %a, align 4
4525  %3 = sub i32 %2, 1
4526  store i32 %3, ptr %a
4527  br label %merge
4528
4529merge:
4530  %4 = phi i32 [ %1, %then ], [ %2, %else ]
4531  ret i32 %4
4532}
4533
4534define signext i32 @atomicrmw_and_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4535; RV32I-LABEL: atomicrmw_and_i32_monotonic_crossbb:
4536; RV32I:       # %bb.0:
4537; RV32I-NEXT:    andi a1, a1, 1
4538; RV32I-NEXT:    beqz a1, .LBB56_2
4539; RV32I-NEXT:  # %bb.1: # %then
4540; RV32I-NEXT:    addi sp, sp, -16
4541; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4542; RV32I-NEXT:    li a1, 1
4543; RV32I-NEXT:    li a2, 0
4544; RV32I-NEXT:    call __atomic_fetch_and_4
4545; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4546; RV32I-NEXT:    addi sp, sp, 16
4547; RV32I-NEXT:    ret
4548; RV32I-NEXT:  .LBB56_2: # %else
4549; RV32I-NEXT:    lw a1, 0(a0)
4550; RV32I-NEXT:    andi a2, a1, 1
4551; RV32I-NEXT:    sw a2, 0(a0)
4552; RV32I-NEXT:    mv a0, a1
4553; RV32I-NEXT:    ret
4554;
4555; RV32IA-LABEL: atomicrmw_and_i32_monotonic_crossbb:
4556; RV32IA:       # %bb.0:
4557; RV32IA-NEXT:    andi a1, a1, 1
4558; RV32IA-NEXT:    beqz a1, .LBB56_2
4559; RV32IA-NEXT:  # %bb.1: # %then
4560; RV32IA-NEXT:    li a1, 1
4561; RV32IA-NEXT:    amoand.w a0, a1, (a0)
4562; RV32IA-NEXT:    ret
4563; RV32IA-NEXT:  .LBB56_2: # %else
4564; RV32IA-NEXT:    mv a1, a0
4565; RV32IA-NEXT:    lw a0, 0(a0)
4566; RV32IA-NEXT:    andi a2, a0, 1
4567; RV32IA-NEXT:    sw a2, 0(a1)
4568; RV32IA-NEXT:    ret
4569;
4570; RV64I-LABEL: atomicrmw_and_i32_monotonic_crossbb:
4571; RV64I:       # %bb.0:
4572; RV64I-NEXT:    andi a1, a1, 1
4573; RV64I-NEXT:    beqz a1, .LBB56_2
4574; RV64I-NEXT:  # %bb.1: # %then
4575; RV64I-NEXT:    addi sp, sp, -16
4576; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4577; RV64I-NEXT:    li a1, 1
4578; RV64I-NEXT:    li a2, 0
4579; RV64I-NEXT:    call __atomic_fetch_and_4
4580; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4581; RV64I-NEXT:    addi sp, sp, 16
4582; RV64I-NEXT:    sext.w a0, a0
4583; RV64I-NEXT:    ret
4584; RV64I-NEXT:  .LBB56_2: # %else
4585; RV64I-NEXT:    lwu a1, 0(a0)
4586; RV64I-NEXT:    andi a2, a1, 1
4587; RV64I-NEXT:    sw a2, 0(a0)
4588; RV64I-NEXT:    sext.w a0, a1
4589; RV64I-NEXT:    ret
4590;
4591; RV64IA-LABEL: atomicrmw_and_i32_monotonic_crossbb:
4592; RV64IA:       # %bb.0:
4593; RV64IA-NEXT:    andi a1, a1, 1
4594; RV64IA-NEXT:    beqz a1, .LBB56_2
4595; RV64IA-NEXT:  # %bb.1: # %then
4596; RV64IA-NEXT:    li a1, 1
4597; RV64IA-NEXT:    amoand.w a0, a1, (a0)
4598; RV64IA-NEXT:    ret
4599; RV64IA-NEXT:  .LBB56_2: # %else
4600; RV64IA-NEXT:    mv a1, a0
4601; RV64IA-NEXT:    lw a0, 0(a0)
4602; RV64IA-NEXT:    andi a2, a0, 1
4603; RV64IA-NEXT:    sw a2, 0(a1)
4604; RV64IA-NEXT:    ret
4605  br i1 %c, label %then, label %else
4606
4607then:
4608  %1 = atomicrmw and ptr %a, i32 1 monotonic
4609  br label %merge
4610
4611else:
4612  %2 = load i32, ptr %a, align 4
4613  %3 = and i32 %2, 1
4614  store i32 %3, ptr %a
4615  br label %merge
4616
4617merge:
4618  %4 = phi i32 [ %1, %then ], [ %2, %else ]
4619  ret i32 %4
4620}
4621
4622define signext i32 @atomicrmw_nand_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4623; RV32I-LABEL: atomicrmw_nand_i32_monotonic_crossbb:
4624; RV32I:       # %bb.0:
4625; RV32I-NEXT:    andi a1, a1, 1
4626; RV32I-NEXT:    beqz a1, .LBB57_2
4627; RV32I-NEXT:  # %bb.1: # %then
4628; RV32I-NEXT:    addi sp, sp, -16
4629; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4630; RV32I-NEXT:    li a1, 1
4631; RV32I-NEXT:    li a2, 0
4632; RV32I-NEXT:    call __atomic_fetch_nand_4
4633; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4634; RV32I-NEXT:    addi sp, sp, 16
4635; RV32I-NEXT:    ret
4636; RV32I-NEXT:  .LBB57_2: # %else
4637; RV32I-NEXT:    lw a1, 0(a0)
4638; RV32I-NEXT:    andi a2, a1, 1
4639; RV32I-NEXT:    sw a2, 0(a0)
4640; RV32I-NEXT:    mv a0, a1
4641; RV32I-NEXT:    ret
4642;
4643; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb:
4644; RV32IA-NOZACAS:       # %bb.0:
4645; RV32IA-NOZACAS-NEXT:    andi a2, a1, 1
4646; RV32IA-NOZACAS-NEXT:    mv a1, a0
4647; RV32IA-NOZACAS-NEXT:    beqz a2, .LBB57_2
4648; RV32IA-NOZACAS-NEXT:  # %bb.1: # %then
4649; RV32IA-NOZACAS-NEXT:    li a2, 1
4650; RV32IA-NOZACAS-NEXT:  .LBB57_3: # %then
4651; RV32IA-NOZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4652; RV32IA-NOZACAS-NEXT:    lr.w a0, (a1)
4653; RV32IA-NOZACAS-NEXT:    and a3, a0, a2
4654; RV32IA-NOZACAS-NEXT:    not a3, a3
4655; RV32IA-NOZACAS-NEXT:    sc.w a3, a3, (a1)
4656; RV32IA-NOZACAS-NEXT:    bnez a3, .LBB57_3
4657; RV32IA-NOZACAS-NEXT:  # %bb.4: # %then
4658; RV32IA-NOZACAS-NEXT:    ret
4659; RV32IA-NOZACAS-NEXT:  .LBB57_2: # %else
4660; RV32IA-NOZACAS-NEXT:    lw a0, 0(a1)
4661; RV32IA-NOZACAS-NEXT:    andi a2, a0, 1
4662; RV32IA-NOZACAS-NEXT:    sw a2, 0(a1)
4663; RV32IA-NOZACAS-NEXT:    ret
4664;
4665; RV32IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb:
4666; RV32IA-ZACAS:       # %bb.0:
4667; RV32IA-ZACAS-NEXT:    andi a1, a1, 1
4668; RV32IA-ZACAS-NEXT:    beqz a1, .LBB57_4
4669; RV32IA-ZACAS-NEXT:  # %bb.1: # %then
4670; RV32IA-ZACAS-NEXT:    lw a1, 0(a0)
4671; RV32IA-ZACAS-NEXT:  .LBB57_2: # %atomicrmw.start
4672; RV32IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4673; RV32IA-ZACAS-NEXT:    mv a2, a1
4674; RV32IA-ZACAS-NEXT:    not a3, a1
4675; RV32IA-ZACAS-NEXT:    ori a3, a3, -2
4676; RV32IA-ZACAS-NEXT:    amocas.w a1, a3, (a0)
4677; RV32IA-ZACAS-NEXT:    bne a1, a2, .LBB57_2
4678; RV32IA-ZACAS-NEXT:  # %bb.3: # %merge
4679; RV32IA-ZACAS-NEXT:    mv a0, a1
4680; RV32IA-ZACAS-NEXT:    ret
4681; RV32IA-ZACAS-NEXT:  .LBB57_4: # %else
4682; RV32IA-ZACAS-NEXT:    lw a1, 0(a0)
4683; RV32IA-ZACAS-NEXT:    andi a2, a1, 1
4684; RV32IA-ZACAS-NEXT:    sw a2, 0(a0)
4685; RV32IA-ZACAS-NEXT:    mv a0, a1
4686; RV32IA-ZACAS-NEXT:    ret
4687;
4688; RV64I-LABEL: atomicrmw_nand_i32_monotonic_crossbb:
4689; RV64I:       # %bb.0:
4690; RV64I-NEXT:    andi a1, a1, 1
4691; RV64I-NEXT:    beqz a1, .LBB57_2
4692; RV64I-NEXT:  # %bb.1: # %then
4693; RV64I-NEXT:    addi sp, sp, -16
4694; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4695; RV64I-NEXT:    li a1, 1
4696; RV64I-NEXT:    li a2, 0
4697; RV64I-NEXT:    call __atomic_fetch_nand_4
4698; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4699; RV64I-NEXT:    addi sp, sp, 16
4700; RV64I-NEXT:    sext.w a0, a0
4701; RV64I-NEXT:    ret
4702; RV64I-NEXT:  .LBB57_2: # %else
4703; RV64I-NEXT:    lwu a1, 0(a0)
4704; RV64I-NEXT:    andi a2, a1, 1
4705; RV64I-NEXT:    sw a2, 0(a0)
4706; RV64I-NEXT:    sext.w a0, a1
4707; RV64I-NEXT:    ret
4708;
4709; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb:
4710; RV64IA-NOZACAS:       # %bb.0:
4711; RV64IA-NOZACAS-NEXT:    andi a2, a1, 1
4712; RV64IA-NOZACAS-NEXT:    mv a1, a0
4713; RV64IA-NOZACAS-NEXT:    beqz a2, .LBB57_2
4714; RV64IA-NOZACAS-NEXT:  # %bb.1: # %then
4715; RV64IA-NOZACAS-NEXT:    li a2, 1
4716; RV64IA-NOZACAS-NEXT:  .LBB57_3: # %then
4717; RV64IA-NOZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4718; RV64IA-NOZACAS-NEXT:    lr.w a0, (a1)
4719; RV64IA-NOZACAS-NEXT:    and a3, a0, a2
4720; RV64IA-NOZACAS-NEXT:    not a3, a3
4721; RV64IA-NOZACAS-NEXT:    sc.w a3, a3, (a1)
4722; RV64IA-NOZACAS-NEXT:    bnez a3, .LBB57_3
4723; RV64IA-NOZACAS-NEXT:  # %bb.4: # %then
4724; RV64IA-NOZACAS-NEXT:    ret
4725; RV64IA-NOZACAS-NEXT:  .LBB57_2: # %else
4726; RV64IA-NOZACAS-NEXT:    lw a0, 0(a1)
4727; RV64IA-NOZACAS-NEXT:    andi a2, a0, 1
4728; RV64IA-NOZACAS-NEXT:    sw a2, 0(a1)
4729; RV64IA-NOZACAS-NEXT:    ret
4730;
4731; RV64IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb:
4732; RV64IA-ZACAS:       # %bb.0:
4733; RV64IA-ZACAS-NEXT:    andi a1, a1, 1
4734; RV64IA-ZACAS-NEXT:    beqz a1, .LBB57_4
4735; RV64IA-ZACAS-NEXT:  # %bb.1: # %then
4736; RV64IA-ZACAS-NEXT:    lw a1, 0(a0)
4737; RV64IA-ZACAS-NEXT:  .LBB57_2: # %atomicrmw.start
4738; RV64IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4739; RV64IA-ZACAS-NEXT:    mv a2, a1
4740; RV64IA-ZACAS-NEXT:    not a3, a1
4741; RV64IA-ZACAS-NEXT:    ori a3, a3, -2
4742; RV64IA-ZACAS-NEXT:    amocas.w a1, a3, (a0)
4743; RV64IA-ZACAS-NEXT:    bne a1, a2, .LBB57_2
4744; RV64IA-ZACAS-NEXT:  # %bb.3: # %merge
4745; RV64IA-ZACAS-NEXT:    mv a0, a1
4746; RV64IA-ZACAS-NEXT:    ret
4747; RV64IA-ZACAS-NEXT:  .LBB57_4: # %else
4748; RV64IA-ZACAS-NEXT:    lw a1, 0(a0)
4749; RV64IA-ZACAS-NEXT:    andi a2, a1, 1
4750; RV64IA-ZACAS-NEXT:    sw a2, 0(a0)
4751; RV64IA-ZACAS-NEXT:    mv a0, a1
4752; RV64IA-ZACAS-NEXT:    ret
4753  br i1 %c, label %then, label %else
4754
4755then:
4756  %1 = atomicrmw nand ptr %a, i32 1 monotonic
4757  br label %merge
4758
4759else:
4760  %2 = load i32, ptr %a, align 4
4761  %3 = and i32 %2, 1
4762  store i32 %3, ptr %a
4763  br label %merge
4764
4765merge:
4766  %4 = phi i32 [ %1, %then ], [ %2, %else ]
4767  ret i32 %4
4768}
4769
4770define signext i32 @atomicrmw_or_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4771; RV32I-LABEL: atomicrmw_or_i32_monotonic_crossbb:
4772; RV32I:       # %bb.0:
4773; RV32I-NEXT:    andi a1, a1, 1
4774; RV32I-NEXT:    beqz a1, .LBB58_2
4775; RV32I-NEXT:  # %bb.1: # %then
4776; RV32I-NEXT:    addi sp, sp, -16
4777; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4778; RV32I-NEXT:    li a1, 1
4779; RV32I-NEXT:    li a2, 0
4780; RV32I-NEXT:    call __atomic_fetch_or_4
4781; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4782; RV32I-NEXT:    addi sp, sp, 16
4783; RV32I-NEXT:    ret
4784; RV32I-NEXT:  .LBB58_2: # %else
4785; RV32I-NEXT:    lw a1, 0(a0)
4786; RV32I-NEXT:    ori a2, a1, 1
4787; RV32I-NEXT:    sw a2, 0(a0)
4788; RV32I-NEXT:    mv a0, a1
4789; RV32I-NEXT:    ret
4790;
4791; RV32IA-LABEL: atomicrmw_or_i32_monotonic_crossbb:
4792; RV32IA:       # %bb.0:
4793; RV32IA-NEXT:    andi a1, a1, 1
4794; RV32IA-NEXT:    beqz a1, .LBB58_2
4795; RV32IA-NEXT:  # %bb.1: # %then
4796; RV32IA-NEXT:    li a1, 1
4797; RV32IA-NEXT:    amoor.w a0, a1, (a0)
4798; RV32IA-NEXT:    ret
4799; RV32IA-NEXT:  .LBB58_2: # %else
4800; RV32IA-NEXT:    mv a1, a0
4801; RV32IA-NEXT:    lw a0, 0(a0)
4802; RV32IA-NEXT:    ori a2, a0, 1
4803; RV32IA-NEXT:    sw a2, 0(a1)
4804; RV32IA-NEXT:    ret
4805;
4806; RV64I-LABEL: atomicrmw_or_i32_monotonic_crossbb:
4807; RV64I:       # %bb.0:
4808; RV64I-NEXT:    andi a1, a1, 1
4809; RV64I-NEXT:    beqz a1, .LBB58_2
4810; RV64I-NEXT:  # %bb.1: # %then
4811; RV64I-NEXT:    addi sp, sp, -16
4812; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4813; RV64I-NEXT:    li a1, 1
4814; RV64I-NEXT:    li a2, 0
4815; RV64I-NEXT:    call __atomic_fetch_or_4
4816; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4817; RV64I-NEXT:    addi sp, sp, 16
4818; RV64I-NEXT:    sext.w a0, a0
4819; RV64I-NEXT:    ret
4820; RV64I-NEXT:  .LBB58_2: # %else
4821; RV64I-NEXT:    lw a1, 0(a0)
4822; RV64I-NEXT:    ori a2, a1, 1
4823; RV64I-NEXT:    sw a2, 0(a0)
4824; RV64I-NEXT:    sext.w a0, a1
4825; RV64I-NEXT:    ret
4826;
4827; RV64IA-LABEL: atomicrmw_or_i32_monotonic_crossbb:
4828; RV64IA:       # %bb.0:
4829; RV64IA-NEXT:    andi a1, a1, 1
4830; RV64IA-NEXT:    beqz a1, .LBB58_2
4831; RV64IA-NEXT:  # %bb.1: # %then
4832; RV64IA-NEXT:    li a1, 1
4833; RV64IA-NEXT:    amoor.w a0, a1, (a0)
4834; RV64IA-NEXT:    ret
4835; RV64IA-NEXT:  .LBB58_2: # %else
4836; RV64IA-NEXT:    mv a1, a0
4837; RV64IA-NEXT:    lw a0, 0(a0)
4838; RV64IA-NEXT:    ori a2, a0, 1
4839; RV64IA-NEXT:    sw a2, 0(a1)
4840; RV64IA-NEXT:    ret
4841  br i1 %c, label %then, label %else
4842
4843then:
4844  %1 = atomicrmw or ptr %a, i32 1 monotonic
4845  br label %merge
4846
4847else:
4848  %2 = load i32, ptr %a, align 4
4849  %3 = or i32 %2, 1
4850  store i32 %3, ptr %a
4851  br label %merge
4852
4853merge:
4854  %4 = phi i32 [ %1, %then ], [ %2, %else ]
4855  ret i32 %4
4856}
4857
4858define signext i32 @atomicrmw_xor_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4859; RV32I-LABEL: atomicrmw_xor_i32_monotonic_crossbb:
4860; RV32I:       # %bb.0:
4861; RV32I-NEXT:    andi a1, a1, 1
4862; RV32I-NEXT:    beqz a1, .LBB59_2
4863; RV32I-NEXT:  # %bb.1: # %then
4864; RV32I-NEXT:    addi sp, sp, -16
4865; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4866; RV32I-NEXT:    li a1, 1
4867; RV32I-NEXT:    li a2, 0
4868; RV32I-NEXT:    call __atomic_fetch_xor_4
4869; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4870; RV32I-NEXT:    addi sp, sp, 16
4871; RV32I-NEXT:    ret
4872; RV32I-NEXT:  .LBB59_2: # %else
4873; RV32I-NEXT:    lw a1, 0(a0)
4874; RV32I-NEXT:    xori a2, a1, 1
4875; RV32I-NEXT:    sw a2, 0(a0)
4876; RV32I-NEXT:    mv a0, a1
4877; RV32I-NEXT:    ret
4878;
4879; RV32IA-LABEL: atomicrmw_xor_i32_monotonic_crossbb:
4880; RV32IA:       # %bb.0:
4881; RV32IA-NEXT:    andi a1, a1, 1
4882; RV32IA-NEXT:    beqz a1, .LBB59_2
4883; RV32IA-NEXT:  # %bb.1: # %then
4884; RV32IA-NEXT:    li a1, 1
4885; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
4886; RV32IA-NEXT:    ret
4887; RV32IA-NEXT:  .LBB59_2: # %else
4888; RV32IA-NEXT:    mv a1, a0
4889; RV32IA-NEXT:    lw a0, 0(a0)
4890; RV32IA-NEXT:    xori a2, a0, 1
4891; RV32IA-NEXT:    sw a2, 0(a1)
4892; RV32IA-NEXT:    ret
4893;
4894; RV64I-LABEL: atomicrmw_xor_i32_monotonic_crossbb:
4895; RV64I:       # %bb.0:
4896; RV64I-NEXT:    andi a1, a1, 1
4897; RV64I-NEXT:    beqz a1, .LBB59_2
4898; RV64I-NEXT:  # %bb.1: # %then
4899; RV64I-NEXT:    addi sp, sp, -16
4900; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4901; RV64I-NEXT:    li a1, 1
4902; RV64I-NEXT:    li a2, 0
4903; RV64I-NEXT:    call __atomic_fetch_xor_4
4904; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4905; RV64I-NEXT:    addi sp, sp, 16
4906; RV64I-NEXT:    sext.w a0, a0
4907; RV64I-NEXT:    ret
4908; RV64I-NEXT:  .LBB59_2: # %else
4909; RV64I-NEXT:    lw a1, 0(a0)
4910; RV64I-NEXT:    xori a2, a1, 1
4911; RV64I-NEXT:    sw a2, 0(a0)
4912; RV64I-NEXT:    sext.w a0, a1
4913; RV64I-NEXT:    ret
4914;
4915; RV64IA-LABEL: atomicrmw_xor_i32_monotonic_crossbb:
4916; RV64IA:       # %bb.0:
4917; RV64IA-NEXT:    andi a1, a1, 1
4918; RV64IA-NEXT:    beqz a1, .LBB59_2
4919; RV64IA-NEXT:  # %bb.1: # %then
4920; RV64IA-NEXT:    li a1, 1
4921; RV64IA-NEXT:    amoxor.w a0, a1, (a0)
4922; RV64IA-NEXT:    ret
4923; RV64IA-NEXT:  .LBB59_2: # %else
4924; RV64IA-NEXT:    mv a1, a0
4925; RV64IA-NEXT:    lw a0, 0(a0)
4926; RV64IA-NEXT:    xori a2, a0, 1
4927; RV64IA-NEXT:    sw a2, 0(a1)
4928; RV64IA-NEXT:    ret
4929  br i1 %c, label %then, label %else
4930
4931then:
4932  %1 = atomicrmw xor ptr %a, i32 1 monotonic
4933  br label %merge
4934
4935else:
4936  %2 = load i32, ptr %a, align 4
4937  %3 = xor i32 %2, 1
4938  store i32 %3, ptr %a
4939  br label %merge
4940
4941merge:
4942  %4 = phi i32 [ %1, %then ], [ %2, %else ]
4943  ret i32 %4
4944}
4945
4946define signext i32 @atomicrmw_max_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
4947; RV32I-LABEL: atomicrmw_max_i32_monotonic_crossbb:
4948; RV32I:       # %bb.0:
4949; RV32I-NEXT:    addi sp, sp, -16
4950; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4951; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
4952; RV32I-NEXT:    andi a1, a1, 1
4953; RV32I-NEXT:    mv s0, a0
4954; RV32I-NEXT:    beqz a1, .LBB60_5
4955; RV32I-NEXT:  # %bb.1: # %then
4956; RV32I-NEXT:    lw a1, 0(s0)
4957; RV32I-NEXT:    j .LBB60_3
4958; RV32I-NEXT:  .LBB60_2: # %atomicrmw.start
4959; RV32I-NEXT:    # in Loop: Header=BB60_3 Depth=1
4960; RV32I-NEXT:    sw a1, 4(sp)
4961; RV32I-NEXT:    addi a1, sp, 4
4962; RV32I-NEXT:    mv a0, s0
4963; RV32I-NEXT:    li a3, 0
4964; RV32I-NEXT:    li a4, 0
4965; RV32I-NEXT:    call __atomic_compare_exchange_4
4966; RV32I-NEXT:    lw a1, 4(sp)
4967; RV32I-NEXT:    bnez a0, .LBB60_8
4968; RV32I-NEXT:  .LBB60_3: # %atomicrmw.start
4969; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
4970; RV32I-NEXT:    mv a2, a1
4971; RV32I-NEXT:    bgtz a1, .LBB60_2
4972; RV32I-NEXT:  # %bb.4: # %atomicrmw.start
4973; RV32I-NEXT:    # in Loop: Header=BB60_3 Depth=1
4974; RV32I-NEXT:    li a2, 1
4975; RV32I-NEXT:    j .LBB60_2
4976; RV32I-NEXT:  .LBB60_5: # %else
4977; RV32I-NEXT:    lw a1, 0(s0)
4978; RV32I-NEXT:    mv a0, a1
4979; RV32I-NEXT:    bgtz a1, .LBB60_7
4980; RV32I-NEXT:  # %bb.6: # %else
4981; RV32I-NEXT:    li a0, 1
4982; RV32I-NEXT:  .LBB60_7: # %else
4983; RV32I-NEXT:    sw a0, 0(s0)
4984; RV32I-NEXT:  .LBB60_8: # %merge
4985; RV32I-NEXT:    mv a0, a1
4986; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4987; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
4988; RV32I-NEXT:    addi sp, sp, 16
4989; RV32I-NEXT:    ret
4990;
4991; RV32IA-LABEL: atomicrmw_max_i32_monotonic_crossbb:
4992; RV32IA:       # %bb.0:
4993; RV32IA-NEXT:    andi a2, a1, 1
4994; RV32IA-NEXT:    mv a1, a0
4995; RV32IA-NEXT:    beqz a2, .LBB60_2
4996; RV32IA-NEXT:  # %bb.1: # %then
4997; RV32IA-NEXT:    li a0, 1
4998; RV32IA-NEXT:    amomax.w a0, a0, (a1)
4999; RV32IA-NEXT:    ret
5000; RV32IA-NEXT:  .LBB60_2: # %else
5001; RV32IA-NEXT:    lw a0, 0(a1)
5002; RV32IA-NEXT:    mv a2, a0
5003; RV32IA-NEXT:    bgtz a0, .LBB60_4
5004; RV32IA-NEXT:  # %bb.3: # %else
5005; RV32IA-NEXT:    li a2, 1
5006; RV32IA-NEXT:  .LBB60_4: # %else
5007; RV32IA-NEXT:    sw a2, 0(a1)
5008; RV32IA-NEXT:    ret
5009;
5010; RV64I-LABEL: atomicrmw_max_i32_monotonic_crossbb:
5011; RV64I:       # %bb.0:
5012; RV64I-NEXT:    addi sp, sp, -32
5013; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5014; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5015; RV64I-NEXT:    andi a1, a1, 1
5016; RV64I-NEXT:    mv s0, a0
5017; RV64I-NEXT:    beqz a1, .LBB60_5
5018; RV64I-NEXT:  # %bb.1: # %then
5019; RV64I-NEXT:    lw a1, 0(s0)
5020; RV64I-NEXT:    j .LBB60_3
5021; RV64I-NEXT:  .LBB60_2: # %atomicrmw.start
5022; RV64I-NEXT:    # in Loop: Header=BB60_3 Depth=1
5023; RV64I-NEXT:    sw a1, 12(sp)
5024; RV64I-NEXT:    addi a1, sp, 12
5025; RV64I-NEXT:    mv a0, s0
5026; RV64I-NEXT:    li a3, 0
5027; RV64I-NEXT:    li a4, 0
5028; RV64I-NEXT:    call __atomic_compare_exchange_4
5029; RV64I-NEXT:    lw a1, 12(sp)
5030; RV64I-NEXT:    bnez a0, .LBB60_8
5031; RV64I-NEXT:  .LBB60_3: # %atomicrmw.start
5032; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
5033; RV64I-NEXT:    li a0, 1
5034; RV64I-NEXT:    mv a2, a1
5035; RV64I-NEXT:    blt a0, a1, .LBB60_2
5036; RV64I-NEXT:  # %bb.4: # %atomicrmw.start
5037; RV64I-NEXT:    # in Loop: Header=BB60_3 Depth=1
5038; RV64I-NEXT:    li a2, 1
5039; RV64I-NEXT:    j .LBB60_2
5040; RV64I-NEXT:  .LBB60_5: # %else
5041; RV64I-NEXT:    lw a1, 0(s0)
5042; RV64I-NEXT:    mv a0, a1
5043; RV64I-NEXT:    bgtz a1, .LBB60_7
5044; RV64I-NEXT:  # %bb.6: # %else
5045; RV64I-NEXT:    li a0, 1
5046; RV64I-NEXT:  .LBB60_7: # %else
5047; RV64I-NEXT:    sw a0, 0(s0)
5048; RV64I-NEXT:  .LBB60_8: # %merge
5049; RV64I-NEXT:    mv a0, a1
5050; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5051; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5052; RV64I-NEXT:    addi sp, sp, 32
5053; RV64I-NEXT:    ret
5054;
5055; RV64IA-LABEL: atomicrmw_max_i32_monotonic_crossbb:
5056; RV64IA:       # %bb.0:
5057; RV64IA-NEXT:    andi a2, a1, 1
5058; RV64IA-NEXT:    mv a1, a0
5059; RV64IA-NEXT:    beqz a2, .LBB60_2
5060; RV64IA-NEXT:  # %bb.1: # %then
5061; RV64IA-NEXT:    li a0, 1
5062; RV64IA-NEXT:    amomax.w a0, a0, (a1)
5063; RV64IA-NEXT:    ret
5064; RV64IA-NEXT:  .LBB60_2: # %else
5065; RV64IA-NEXT:    lw a0, 0(a1)
5066; RV64IA-NEXT:    mv a2, a0
5067; RV64IA-NEXT:    bgtz a0, .LBB60_4
5068; RV64IA-NEXT:  # %bb.3: # %else
5069; RV64IA-NEXT:    li a2, 1
5070; RV64IA-NEXT:  .LBB60_4: # %else
5071; RV64IA-NEXT:    sw a2, 0(a1)
5072; RV64IA-NEXT:    ret
5073  br i1 %c, label %then, label %else
5074
5075then:
5076  %1 = atomicrmw max ptr %a, i32 1 monotonic
5077  br label %merge
5078
5079else:
5080  %2 = load i32, ptr %a, align 4
5081  %3 = call i32 @llvm.smax.i32(i32 %2, i32 1)
5082  store i32 %3, ptr %a
5083  br label %merge
5084
5085merge:
5086  %4 = phi i32 [ %1, %then ], [ %2, %else ]
5087  ret i32 %4
5088}
5089declare i32 @llvm.smax.i32(i32, i32)
5090
5091define signext i32 @atomicrmw_min_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
5092; RV32I-LABEL: atomicrmw_min_i32_monotonic_crossbb:
5093; RV32I:       # %bb.0:
5094; RV32I-NEXT:    addi sp, sp, -16
5095; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5096; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5097; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
5098; RV32I-NEXT:    andi a1, a1, 1
5099; RV32I-NEXT:    mv s0, a0
5100; RV32I-NEXT:    beqz a1, .LBB61_5
5101; RV32I-NEXT:  # %bb.1: # %then
5102; RV32I-NEXT:    lw a1, 0(s0)
5103; RV32I-NEXT:    li s1, 2
5104; RV32I-NEXT:    j .LBB61_3
5105; RV32I-NEXT:  .LBB61_2: # %atomicrmw.start
5106; RV32I-NEXT:    # in Loop: Header=BB61_3 Depth=1
5107; RV32I-NEXT:    sw a1, 0(sp)
5108; RV32I-NEXT:    mv a1, sp
5109; RV32I-NEXT:    mv a0, s0
5110; RV32I-NEXT:    li a3, 0
5111; RV32I-NEXT:    li a4, 0
5112; RV32I-NEXT:    call __atomic_compare_exchange_4
5113; RV32I-NEXT:    lw a1, 0(sp)
5114; RV32I-NEXT:    bnez a0, .LBB61_8
5115; RV32I-NEXT:  .LBB61_3: # %atomicrmw.start
5116; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
5117; RV32I-NEXT:    mv a2, a1
5118; RV32I-NEXT:    blt a1, s1, .LBB61_2
5119; RV32I-NEXT:  # %bb.4: # %atomicrmw.start
5120; RV32I-NEXT:    # in Loop: Header=BB61_3 Depth=1
5121; RV32I-NEXT:    li a2, 1
5122; RV32I-NEXT:    j .LBB61_2
5123; RV32I-NEXT:  .LBB61_5: # %else
5124; RV32I-NEXT:    lw a1, 0(s0)
5125; RV32I-NEXT:    mv a0, a1
5126; RV32I-NEXT:    blez a1, .LBB61_7
5127; RV32I-NEXT:  # %bb.6: # %else
5128; RV32I-NEXT:    li a0, 1
5129; RV32I-NEXT:  .LBB61_7: # %else
5130; RV32I-NEXT:    sw a0, 0(s0)
5131; RV32I-NEXT:  .LBB61_8: # %merge
5132; RV32I-NEXT:    mv a0, a1
5133; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5134; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5135; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
5136; RV32I-NEXT:    addi sp, sp, 16
5137; RV32I-NEXT:    ret
5138;
5139; RV32IA-LABEL: atomicrmw_min_i32_monotonic_crossbb:
5140; RV32IA:       # %bb.0:
5141; RV32IA-NEXT:    andi a2, a1, 1
5142; RV32IA-NEXT:    mv a1, a0
5143; RV32IA-NEXT:    beqz a2, .LBB61_2
5144; RV32IA-NEXT:  # %bb.1: # %then
5145; RV32IA-NEXT:    li a0, 1
5146; RV32IA-NEXT:    amomin.w a0, a0, (a1)
5147; RV32IA-NEXT:    ret
5148; RV32IA-NEXT:  .LBB61_2: # %else
5149; RV32IA-NEXT:    lw a0, 0(a1)
5150; RV32IA-NEXT:    mv a2, a0
5151; RV32IA-NEXT:    blez a0, .LBB61_4
5152; RV32IA-NEXT:  # %bb.3: # %else
5153; RV32IA-NEXT:    li a2, 1
5154; RV32IA-NEXT:  .LBB61_4: # %else
5155; RV32IA-NEXT:    sw a2, 0(a1)
5156; RV32IA-NEXT:    ret
5157;
5158; RV64I-LABEL: atomicrmw_min_i32_monotonic_crossbb:
5159; RV64I:       # %bb.0:
5160; RV64I-NEXT:    addi sp, sp, -32
5161; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5162; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5163; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
5164; RV64I-NEXT:    andi a1, a1, 1
5165; RV64I-NEXT:    mv s0, a0
5166; RV64I-NEXT:    beqz a1, .LBB61_5
5167; RV64I-NEXT:  # %bb.1: # %then
5168; RV64I-NEXT:    lw a1, 0(s0)
5169; RV64I-NEXT:    li s1, 2
5170; RV64I-NEXT:    j .LBB61_3
5171; RV64I-NEXT:  .LBB61_2: # %atomicrmw.start
5172; RV64I-NEXT:    # in Loop: Header=BB61_3 Depth=1
5173; RV64I-NEXT:    sw a1, 4(sp)
5174; RV64I-NEXT:    addi a1, sp, 4
5175; RV64I-NEXT:    mv a0, s0
5176; RV64I-NEXT:    li a3, 0
5177; RV64I-NEXT:    li a4, 0
5178; RV64I-NEXT:    call __atomic_compare_exchange_4
5179; RV64I-NEXT:    lw a1, 4(sp)
5180; RV64I-NEXT:    bnez a0, .LBB61_8
5181; RV64I-NEXT:  .LBB61_3: # %atomicrmw.start
5182; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
5183; RV64I-NEXT:    mv a2, a1
5184; RV64I-NEXT:    blt a1, s1, .LBB61_2
5185; RV64I-NEXT:  # %bb.4: # %atomicrmw.start
5186; RV64I-NEXT:    # in Loop: Header=BB61_3 Depth=1
5187; RV64I-NEXT:    li a2, 1
5188; RV64I-NEXT:    j .LBB61_2
5189; RV64I-NEXT:  .LBB61_5: # %else
5190; RV64I-NEXT:    lw a1, 0(s0)
5191; RV64I-NEXT:    mv a0, a1
5192; RV64I-NEXT:    blez a1, .LBB61_7
5193; RV64I-NEXT:  # %bb.6: # %else
5194; RV64I-NEXT:    li a0, 1
5195; RV64I-NEXT:  .LBB61_7: # %else
5196; RV64I-NEXT:    sw a0, 0(s0)
5197; RV64I-NEXT:  .LBB61_8: # %merge
5198; RV64I-NEXT:    mv a0, a1
5199; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5200; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5201; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
5202; RV64I-NEXT:    addi sp, sp, 32
5203; RV64I-NEXT:    ret
5204;
5205; RV64IA-LABEL: atomicrmw_min_i32_monotonic_crossbb:
5206; RV64IA:       # %bb.0:
5207; RV64IA-NEXT:    andi a2, a1, 1
5208; RV64IA-NEXT:    mv a1, a0
5209; RV64IA-NEXT:    beqz a2, .LBB61_2
5210; RV64IA-NEXT:  # %bb.1: # %then
5211; RV64IA-NEXT:    li a0, 1
5212; RV64IA-NEXT:    amomin.w a0, a0, (a1)
5213; RV64IA-NEXT:    ret
5214; RV64IA-NEXT:  .LBB61_2: # %else
5215; RV64IA-NEXT:    lw a0, 0(a1)
5216; RV64IA-NEXT:    mv a2, a0
5217; RV64IA-NEXT:    blez a0, .LBB61_4
5218; RV64IA-NEXT:  # %bb.3: # %else
5219; RV64IA-NEXT:    li a2, 1
5220; RV64IA-NEXT:  .LBB61_4: # %else
5221; RV64IA-NEXT:    sw a2, 0(a1)
5222; RV64IA-NEXT:    ret
5223  br i1 %c, label %then, label %else
5224
5225then:
5226  %1 = atomicrmw min ptr %a, i32 1 monotonic
5227  br label %merge
5228
5229else:
5230  %2 = load i32, ptr %a, align 4
5231  %3 = call i32 @llvm.smin.i32(i32 %2, i32 1)
5232  store i32 %3, ptr %a
5233  br label %merge
5234
5235merge:
5236  %4 = phi i32 [ %1, %then ], [ %2, %else ]
5237  ret i32 %4
5238}
5239declare i32 @llvm.smin.i32(i32, i32)
5240
5241define signext i32 @atomicrmw_umax_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
5242; RV32I-LABEL: atomicrmw_umax_i32_monotonic_crossbb:
5243; RV32I:       # %bb.0:
5244; RV32I-NEXT:    addi sp, sp, -16
5245; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5246; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5247; RV32I-NEXT:    andi a1, a1, 1
5248; RV32I-NEXT:    mv s0, a0
5249; RV32I-NEXT:    beqz a1, .LBB62_3
5250; RV32I-NEXT:  # %bb.1: # %then
5251; RV32I-NEXT:    lw a1, 0(s0)
5252; RV32I-NEXT:  .LBB62_2: # %atomicrmw.start
5253; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
5254; RV32I-NEXT:    seqz a2, a1
5255; RV32I-NEXT:    add a2, a1, a2
5256; RV32I-NEXT:    sw a1, 4(sp)
5257; RV32I-NEXT:    addi a1, sp, 4
5258; RV32I-NEXT:    mv a0, s0
5259; RV32I-NEXT:    li a3, 0
5260; RV32I-NEXT:    li a4, 0
5261; RV32I-NEXT:    call __atomic_compare_exchange_4
5262; RV32I-NEXT:    lw a1, 4(sp)
5263; RV32I-NEXT:    beqz a0, .LBB62_2
5264; RV32I-NEXT:    j .LBB62_4
5265; RV32I-NEXT:  .LBB62_3: # %else
5266; RV32I-NEXT:    lw a1, 0(s0)
5267; RV32I-NEXT:    seqz a0, a1
5268; RV32I-NEXT:    add a0, a1, a0
5269; RV32I-NEXT:    sw a0, 0(s0)
5270; RV32I-NEXT:  .LBB62_4: # %merge
5271; RV32I-NEXT:    mv a0, a1
5272; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5273; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5274; RV32I-NEXT:    addi sp, sp, 16
5275; RV32I-NEXT:    ret
5276;
5277; RV32IA-LABEL: atomicrmw_umax_i32_monotonic_crossbb:
5278; RV32IA:       # %bb.0:
5279; RV32IA-NEXT:    andi a1, a1, 1
5280; RV32IA-NEXT:    beqz a1, .LBB62_2
5281; RV32IA-NEXT:  # %bb.1: # %then
5282; RV32IA-NEXT:    li a1, 1
5283; RV32IA-NEXT:    amomaxu.w a0, a1, (a0)
5284; RV32IA-NEXT:    ret
5285; RV32IA-NEXT:  .LBB62_2: # %else
5286; RV32IA-NEXT:    mv a1, a0
5287; RV32IA-NEXT:    lw a0, 0(a0)
5288; RV32IA-NEXT:    seqz a2, a0
5289; RV32IA-NEXT:    add a2, a0, a2
5290; RV32IA-NEXT:    sw a2, 0(a1)
5291; RV32IA-NEXT:    ret
5292;
5293; RV64I-LABEL: atomicrmw_umax_i32_monotonic_crossbb:
5294; RV64I:       # %bb.0:
5295; RV64I-NEXT:    addi sp, sp, -32
5296; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5297; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5298; RV64I-NEXT:    andi a1, a1, 1
5299; RV64I-NEXT:    mv s0, a0
5300; RV64I-NEXT:    beqz a1, .LBB62_5
5301; RV64I-NEXT:  # %bb.1: # %then
5302; RV64I-NEXT:    lw a1, 0(s0)
5303; RV64I-NEXT:    j .LBB62_3
5304; RV64I-NEXT:  .LBB62_2: # %atomicrmw.start
5305; RV64I-NEXT:    # in Loop: Header=BB62_3 Depth=1
5306; RV64I-NEXT:    sw a1, 12(sp)
5307; RV64I-NEXT:    addi a1, sp, 12
5308; RV64I-NEXT:    mv a0, s0
5309; RV64I-NEXT:    li a3, 0
5310; RV64I-NEXT:    li a4, 0
5311; RV64I-NEXT:    call __atomic_compare_exchange_4
5312; RV64I-NEXT:    lw a1, 12(sp)
5313; RV64I-NEXT:    bnez a0, .LBB62_6
5314; RV64I-NEXT:  .LBB62_3: # %atomicrmw.start
5315; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
5316; RV64I-NEXT:    li a0, 1
5317; RV64I-NEXT:    mv a2, a1
5318; RV64I-NEXT:    bltu a0, a1, .LBB62_2
5319; RV64I-NEXT:  # %bb.4: # %atomicrmw.start
5320; RV64I-NEXT:    # in Loop: Header=BB62_3 Depth=1
5321; RV64I-NEXT:    li a2, 1
5322; RV64I-NEXT:    j .LBB62_2
5323; RV64I-NEXT:  .LBB62_5: # %else
5324; RV64I-NEXT:    lw a1, 0(s0)
5325; RV64I-NEXT:    seqz a0, a1
5326; RV64I-NEXT:    add a0, a1, a0
5327; RV64I-NEXT:    sw a0, 0(s0)
5328; RV64I-NEXT:  .LBB62_6: # %merge
5329; RV64I-NEXT:    mv a0, a1
5330; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5331; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5332; RV64I-NEXT:    addi sp, sp, 32
5333; RV64I-NEXT:    ret
5334;
5335; RV64IA-LABEL: atomicrmw_umax_i32_monotonic_crossbb:
5336; RV64IA:       # %bb.0:
5337; RV64IA-NEXT:    andi a1, a1, 1
5338; RV64IA-NEXT:    beqz a1, .LBB62_2
5339; RV64IA-NEXT:  # %bb.1: # %then
5340; RV64IA-NEXT:    li a1, 1
5341; RV64IA-NEXT:    amomaxu.w a0, a1, (a0)
5342; RV64IA-NEXT:    ret
5343; RV64IA-NEXT:  .LBB62_2: # %else
5344; RV64IA-NEXT:    mv a1, a0
5345; RV64IA-NEXT:    lw a0, 0(a0)
5346; RV64IA-NEXT:    seqz a2, a0
5347; RV64IA-NEXT:    add a2, a0, a2
5348; RV64IA-NEXT:    sw a2, 0(a1)
5349; RV64IA-NEXT:    ret
5350  br i1 %c, label %then, label %else
5351
5352then:
5353  %1 = atomicrmw umax ptr %a, i32 1 monotonic
5354  br label %merge
5355
5356else:
5357  %2 = load i32, ptr %a, align 4
5358  %3 = call i32 @llvm.umax.i32(i32 %2, i32 1)
5359  store i32 %3, ptr %a
5360  br label %merge
5361
5362merge:
5363  %4 = phi i32 [ %1, %then ], [ %2, %else ]
5364  ret i32 %4
5365}
5366declare i32 @llvm.umax.i32(i32, i32)
5367
5368define signext i32 @atomicrmw_umin_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind {
5369; RV32I-LABEL: atomicrmw_umin_i32_monotonic_crossbb:
5370; RV32I:       # %bb.0:
5371; RV32I-NEXT:    addi sp, sp, -16
5372; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5373; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5374; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
5375; RV32I-NEXT:    andi a1, a1, 1
5376; RV32I-NEXT:    mv s0, a0
5377; RV32I-NEXT:    beqz a1, .LBB63_5
5378; RV32I-NEXT:  # %bb.1: # %then
5379; RV32I-NEXT:    lw a1, 0(s0)
5380; RV32I-NEXT:    li s1, 2
5381; RV32I-NEXT:    j .LBB63_3
5382; RV32I-NEXT:  .LBB63_2: # %atomicrmw.start
5383; RV32I-NEXT:    # in Loop: Header=BB63_3 Depth=1
5384; RV32I-NEXT:    sw a1, 0(sp)
5385; RV32I-NEXT:    mv a1, sp
5386; RV32I-NEXT:    mv a0, s0
5387; RV32I-NEXT:    li a3, 0
5388; RV32I-NEXT:    li a4, 0
5389; RV32I-NEXT:    call __atomic_compare_exchange_4
5390; RV32I-NEXT:    lw a1, 0(sp)
5391; RV32I-NEXT:    bnez a0, .LBB63_8
5392; RV32I-NEXT:  .LBB63_3: # %atomicrmw.start
5393; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
5394; RV32I-NEXT:    mv a2, a1
5395; RV32I-NEXT:    bltu a1, s1, .LBB63_2
5396; RV32I-NEXT:  # %bb.4: # %atomicrmw.start
5397; RV32I-NEXT:    # in Loop: Header=BB63_3 Depth=1
5398; RV32I-NEXT:    li a2, 1
5399; RV32I-NEXT:    j .LBB63_2
5400; RV32I-NEXT:  .LBB63_5: # %else
5401; RV32I-NEXT:    lw a1, 0(s0)
5402; RV32I-NEXT:    li a2, 1
5403; RV32I-NEXT:    mv a0, a1
5404; RV32I-NEXT:    bltu a1, a2, .LBB63_7
5405; RV32I-NEXT:  # %bb.6: # %else
5406; RV32I-NEXT:    li a0, 1
5407; RV32I-NEXT:  .LBB63_7: # %else
5408; RV32I-NEXT:    sw a0, 0(s0)
5409; RV32I-NEXT:  .LBB63_8: # %merge
5410; RV32I-NEXT:    mv a0, a1
5411; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5412; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5413; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
5414; RV32I-NEXT:    addi sp, sp, 16
5415; RV32I-NEXT:    ret
5416;
5417; RV32IA-LABEL: atomicrmw_umin_i32_monotonic_crossbb:
5418; RV32IA:       # %bb.0:
5419; RV32IA-NEXT:    andi a2, a1, 1
5420; RV32IA-NEXT:    mv a1, a0
5421; RV32IA-NEXT:    beqz a2, .LBB63_2
5422; RV32IA-NEXT:  # %bb.1: # %then
5423; RV32IA-NEXT:    li a0, 1
5424; RV32IA-NEXT:    amominu.w a0, a0, (a1)
5425; RV32IA-NEXT:    ret
5426; RV32IA-NEXT:  .LBB63_2: # %else
5427; RV32IA-NEXT:    lw a0, 0(a1)
5428; RV32IA-NEXT:    li a3, 1
5429; RV32IA-NEXT:    mv a2, a0
5430; RV32IA-NEXT:    bltu a0, a3, .LBB63_4
5431; RV32IA-NEXT:  # %bb.3: # %else
5432; RV32IA-NEXT:    li a2, 1
5433; RV32IA-NEXT:  .LBB63_4: # %else
5434; RV32IA-NEXT:    sw a2, 0(a1)
5435; RV32IA-NEXT:    ret
5436;
5437; RV64I-LABEL: atomicrmw_umin_i32_monotonic_crossbb:
5438; RV64I:       # %bb.0:
5439; RV64I-NEXT:    addi sp, sp, -32
5440; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5441; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5442; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
5443; RV64I-NEXT:    andi a1, a1, 1
5444; RV64I-NEXT:    mv s0, a0
5445; RV64I-NEXT:    beqz a1, .LBB63_5
5446; RV64I-NEXT:  # %bb.1: # %then
5447; RV64I-NEXT:    lw a1, 0(s0)
5448; RV64I-NEXT:    li s1, 2
5449; RV64I-NEXT:    j .LBB63_3
5450; RV64I-NEXT:  .LBB63_2: # %atomicrmw.start
5451; RV64I-NEXT:    # in Loop: Header=BB63_3 Depth=1
5452; RV64I-NEXT:    sw a1, 4(sp)
5453; RV64I-NEXT:    addi a1, sp, 4
5454; RV64I-NEXT:    mv a0, s0
5455; RV64I-NEXT:    li a3, 0
5456; RV64I-NEXT:    li a4, 0
5457; RV64I-NEXT:    call __atomic_compare_exchange_4
5458; RV64I-NEXT:    lw a1, 4(sp)
5459; RV64I-NEXT:    bnez a0, .LBB63_8
5460; RV64I-NEXT:  .LBB63_3: # %atomicrmw.start
5461; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
5462; RV64I-NEXT:    mv a2, a1
5463; RV64I-NEXT:    bltu a1, s1, .LBB63_2
5464; RV64I-NEXT:  # %bb.4: # %atomicrmw.start
5465; RV64I-NEXT:    # in Loop: Header=BB63_3 Depth=1
5466; RV64I-NEXT:    li a2, 1
5467; RV64I-NEXT:    j .LBB63_2
5468; RV64I-NEXT:  .LBB63_5: # %else
5469; RV64I-NEXT:    lw a1, 0(s0)
5470; RV64I-NEXT:    li a2, 1
5471; RV64I-NEXT:    mv a0, a1
5472; RV64I-NEXT:    bltu a1, a2, .LBB63_7
5473; RV64I-NEXT:  # %bb.6: # %else
5474; RV64I-NEXT:    li a0, 1
5475; RV64I-NEXT:  .LBB63_7: # %else
5476; RV64I-NEXT:    sw a0, 0(s0)
5477; RV64I-NEXT:  .LBB63_8: # %merge
5478; RV64I-NEXT:    mv a0, a1
5479; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5480; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5481; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
5482; RV64I-NEXT:    addi sp, sp, 32
5483; RV64I-NEXT:    ret
5484;
5485; RV64IA-LABEL: atomicrmw_umin_i32_monotonic_crossbb:
5486; RV64IA:       # %bb.0:
5487; RV64IA-NEXT:    andi a2, a1, 1
5488; RV64IA-NEXT:    mv a1, a0
5489; RV64IA-NEXT:    beqz a2, .LBB63_2
5490; RV64IA-NEXT:  # %bb.1: # %then
5491; RV64IA-NEXT:    li a0, 1
5492; RV64IA-NEXT:    amominu.w a0, a0, (a1)
5493; RV64IA-NEXT:    ret
5494; RV64IA-NEXT:  .LBB63_2: # %else
5495; RV64IA-NEXT:    lw a0, 0(a1)
5496; RV64IA-NEXT:    li a3, 1
5497; RV64IA-NEXT:    mv a2, a0
5498; RV64IA-NEXT:    bltu a0, a3, .LBB63_4
5499; RV64IA-NEXT:  # %bb.3: # %else
5500; RV64IA-NEXT:    li a2, 1
5501; RV64IA-NEXT:  .LBB63_4: # %else
5502; RV64IA-NEXT:    sw a2, 0(a1)
5503; RV64IA-NEXT:    ret
5504  br i1 %c, label %then, label %else
5505
5506then:
5507  %1 = atomicrmw umin ptr %a, i32 1 monotonic
5508  br label %merge
5509
5510else:
5511  %2 = load i32, ptr %a, align 4
5512  %3 = call i32 @llvm.umin.i32(i32 %2, i32 1)
5513  store i32 %3, ptr %a
5514  br label %merge
5515
5516merge:
5517  %4 = phi i32 [ %1, %then ], [ %2, %else ]
5518  ret i32 %4
5519}
5520declare i32 @llvm.umin.i32(i32, i32)
5521
5522define signext i32 @cmpxchg_i32_monotonic_crossbb(ptr %ptr, i32 signext %cmp, i32 signext %val, i1 zeroext %c) nounwind {
5523; RV32I-LABEL: cmpxchg_i32_monotonic_crossbb:
5524; RV32I:       # %bb.0:
5525; RV32I-NEXT:    beqz a3, .LBB64_2
5526; RV32I-NEXT:  # %bb.1: # %then
5527; RV32I-NEXT:    addi sp, sp, -16
5528; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5529; RV32I-NEXT:    sw a1, 8(sp)
5530; RV32I-NEXT:    addi a1, sp, 8
5531; RV32I-NEXT:    li a3, 5
5532; RV32I-NEXT:    li a4, 5
5533; RV32I-NEXT:    call __atomic_compare_exchange_4
5534; RV32I-NEXT:    lw a0, 8(sp)
5535; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5536; RV32I-NEXT:    addi sp, sp, 16
5537; RV32I-NEXT:    ret
5538; RV32I-NEXT:  .LBB64_2: # %else
5539; RV32I-NEXT:    lw a0, 0(a0)
5540; RV32I-NEXT:    ret
5541;
5542; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5543; RV32IA-NOZACAS:       # %bb.0:
5544; RV32IA-NOZACAS-NEXT:    mv a4, a0
5545; RV32IA-NOZACAS-NEXT:    beqz a3, .LBB64_2
5546; RV32IA-NOZACAS-NEXT:  # %bb.1: # %then
5547; RV32IA-NOZACAS-NEXT:  .LBB64_3: # %then
5548; RV32IA-NOZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
5549; RV32IA-NOZACAS-NEXT:    lr.w.aqrl a0, (a4)
5550; RV32IA-NOZACAS-NEXT:    bne a0, a1, .LBB64_5
5551; RV32IA-NOZACAS-NEXT:  # %bb.4: # %then
5552; RV32IA-NOZACAS-NEXT:    # in Loop: Header=BB64_3 Depth=1
5553; RV32IA-NOZACAS-NEXT:    sc.w.rl a3, a2, (a4)
5554; RV32IA-NOZACAS-NEXT:    bnez a3, .LBB64_3
5555; RV32IA-NOZACAS-NEXT:  .LBB64_5: # %then
5556; RV32IA-NOZACAS-NEXT:    ret
5557; RV32IA-NOZACAS-NEXT:  .LBB64_2: # %else
5558; RV32IA-NOZACAS-NEXT:    lw a0, 0(a4)
5559; RV32IA-NOZACAS-NEXT:    ret
5560;
5561; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5562; RV32IA-ZACAS:       # %bb.0:
5563; RV32IA-ZACAS-NEXT:    beqz a3, .LBB64_2
5564; RV32IA-ZACAS-NEXT:  # %bb.1: # %then
5565; RV32IA-ZACAS-NEXT:    fence rw, rw
5566; RV32IA-ZACAS-NEXT:    amocas.w.aqrl a1, a2, (a0)
5567; RV32IA-ZACAS-NEXT:    mv a0, a1
5568; RV32IA-ZACAS-NEXT:    ret
5569; RV32IA-ZACAS-NEXT:  .LBB64_2: # %else
5570; RV32IA-ZACAS-NEXT:    lw a0, 0(a0)
5571; RV32IA-ZACAS-NEXT:    ret
5572;
5573; RV64I-LABEL: cmpxchg_i32_monotonic_crossbb:
5574; RV64I:       # %bb.0:
5575; RV64I-NEXT:    beqz a3, .LBB64_2
5576; RV64I-NEXT:  # %bb.1: # %then
5577; RV64I-NEXT:    addi sp, sp, -16
5578; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5579; RV64I-NEXT:    sw a1, 4(sp)
5580; RV64I-NEXT:    addi a1, sp, 4
5581; RV64I-NEXT:    li a3, 5
5582; RV64I-NEXT:    li a4, 5
5583; RV64I-NEXT:    call __atomic_compare_exchange_4
5584; RV64I-NEXT:    lw a0, 4(sp)
5585; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5586; RV64I-NEXT:    addi sp, sp, 16
5587; RV64I-NEXT:    ret
5588; RV64I-NEXT:  .LBB64_2: # %else
5589; RV64I-NEXT:    lw a0, 0(a0)
5590; RV64I-NEXT:    ret
5591;
5592; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5593; RV64IA-NOZACAS:       # %bb.0:
5594; RV64IA-NOZACAS-NEXT:    beqz a3, .LBB64_2
5595; RV64IA-NOZACAS-NEXT:  # %bb.1: # %then
5596; RV64IA-NOZACAS-NEXT:  .LBB64_3: # %then
5597; RV64IA-NOZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
5598; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a3, (a0)
5599; RV64IA-NOZACAS-NEXT:    bne a3, a1, .LBB64_5
5600; RV64IA-NOZACAS-NEXT:  # %bb.4: # %then
5601; RV64IA-NOZACAS-NEXT:    # in Loop: Header=BB64_3 Depth=1
5602; RV64IA-NOZACAS-NEXT:    sc.w.rl a4, a2, (a0)
5603; RV64IA-NOZACAS-NEXT:    bnez a4, .LBB64_3
5604; RV64IA-NOZACAS-NEXT:  .LBB64_5: # %then
5605; RV64IA-NOZACAS-NEXT:    sext.w a0, a3
5606; RV64IA-NOZACAS-NEXT:    ret
5607; RV64IA-NOZACAS-NEXT:  .LBB64_2: # %else
5608; RV64IA-NOZACAS-NEXT:    lw a3, 0(a0)
5609; RV64IA-NOZACAS-NEXT:    sext.w a0, a3
5610; RV64IA-NOZACAS-NEXT:    ret
5611;
5612; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_crossbb:
5613; RV64IA-ZACAS:       # %bb.0:
5614; RV64IA-ZACAS-NEXT:    beqz a3, .LBB64_2
5615; RV64IA-ZACAS-NEXT:  # %bb.1: # %then
5616; RV64IA-ZACAS-NEXT:    fence rw, rw
5617; RV64IA-ZACAS-NEXT:    amocas.w.aqrl a1, a2, (a0)
5618; RV64IA-ZACAS-NEXT:    mv a0, a1
5619; RV64IA-ZACAS-NEXT:    ret
5620; RV64IA-ZACAS-NEXT:  .LBB64_2: # %else
5621; RV64IA-ZACAS-NEXT:    lw a0, 0(a0)
5622; RV64IA-ZACAS-NEXT:    ret
5623  br i1 %c, label %then, label %else
5624
5625then:
5626  %1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst
5627  %2 = extractvalue { i32, i1 } %1, 0
5628  br label %merge
5629
5630else:
5631  %3 = load i32, ptr %ptr, align 4
5632  br label %merge
5633
5634merge:
5635  %4 = phi i32 [ %2, %then ], [ %3, %else ]
5636  ret i32 %4
5637}
5638