xref: /llvm-project/llvm/test/CodeGen/RISCV/atomic-rmw.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,RV32IA-WMO,RV32IA-WMO-NOZACAS %s
6; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \
7; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-NOZACAS,RV32IA-TSO,RV32IA-TSO-NOZACAS %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,RV64IA-WMO,RV64IA-WMO-NOZACAS %s
12; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \
13; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS,RV64IA-TSO,RV64IA-TSO-NOZACAS %s
14
15; RUN: llc -mtriple=riscv32 -mattr=+a,+zacas -verify-machineinstrs < %s \
16; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS,RV32IA-WMO,RV32IA-WMO-ZACAS %s
17; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso,+zacas -verify-machineinstrs < %s \
18; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS,RV32IA-TSO,RV32IA-TSO-ZACAS %s
19; RUN: llc -mtriple=riscv64 -mattr=+a,+zacas -verify-machineinstrs < %s \
20; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS,RV64IA-WMO,RV64IA-WMO-ZACAS %s
21; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zacas -verify-machineinstrs < %s \
22; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS,RV64IA-TSO,RV64IA-TSO-ZACAS %s
23
24; RUN: llc -mtriple=riscv64 -mattr=+a,+zabha -verify-machineinstrs < %s \
25; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-WMO,RV64IA-WMO-ZABHA,RV64IA-WMO-ZABHA-NOZACAS %s
26; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zabha -verify-machineinstrs < %s \
27; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-TSO,RV64IA-TSO-ZABHA,RV64IA-TSO-ZABHA-NOZACAS %s
28; RUN: llc -mtriple=riscv64 -mattr=+a,+zabha,+zacas -verify-machineinstrs < %s \
29; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-WMO,RV64IA-WMO-ZABHA,RV64IA-WMO-ZABHA-ZACAS %s
30; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zabha,+zacas -verify-machineinstrs < %s \
31; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-TSO,RV64IA-TSO-ZABHA,RV64IA-TSO-ZABHA-ZACAS %s
32
33define i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind {
34; RV32I-LABEL: atomicrmw_xchg_i8_monotonic:
35; RV32I:       # %bb.0:
36; RV32I-NEXT:    addi sp, sp, -16
37; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
38; RV32I-NEXT:    li a2, 0
39; RV32I-NEXT:    call __atomic_exchange_1
40; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
41; RV32I-NEXT:    addi sp, sp, 16
42; RV32I-NEXT:    ret
43;
44; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic:
45; RV32IA:       # %bb.0:
46; RV32IA-NEXT:    andi a2, a0, -4
47; RV32IA-NEXT:    slli a0, a0, 3
48; RV32IA-NEXT:    li a3, 255
49; RV32IA-NEXT:    andi a1, a1, 255
50; RV32IA-NEXT:    sll a3, a3, a0
51; RV32IA-NEXT:    sll a1, a1, a0
52; RV32IA-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
53; RV32IA-NEXT:    lr.w a4, (a2)
54; RV32IA-NEXT:    mv a5, a1
55; RV32IA-NEXT:    xor a5, a4, a5
56; RV32IA-NEXT:    and a5, a5, a3
57; RV32IA-NEXT:    xor a5, a4, a5
58; RV32IA-NEXT:    sc.w a5, a5, (a2)
59; RV32IA-NEXT:    bnez a5, .LBB0_1
60; RV32IA-NEXT:  # %bb.2:
61; RV32IA-NEXT:    srl a0, a4, a0
62; RV32IA-NEXT:    ret
63;
64; RV64I-LABEL: atomicrmw_xchg_i8_monotonic:
65; RV64I:       # %bb.0:
66; RV64I-NEXT:    addi sp, sp, -16
67; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
68; RV64I-NEXT:    li a2, 0
69; RV64I-NEXT:    call __atomic_exchange_1
70; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
71; RV64I-NEXT:    addi sp, sp, 16
72; RV64I-NEXT:    ret
73;
74; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i8_monotonic:
75; RV64IA-NOZACAS:       # %bb.0:
76; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
77; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
78; RV64IA-NOZACAS-NEXT:    li a3, 255
79; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
80; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
81; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
82; RV64IA-NOZACAS-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
83; RV64IA-NOZACAS-NEXT:    lr.w a4, (a2)
84; RV64IA-NOZACAS-NEXT:    mv a5, a1
85; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
86; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
87; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
88; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
89; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB0_1
90; RV64IA-NOZACAS-NEXT:  # %bb.2:
91; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
92; RV64IA-NOZACAS-NEXT:    ret
93;
94; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i8_monotonic:
95; RV64IA-ZACAS:       # %bb.0:
96; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
97; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
98; RV64IA-ZACAS-NEXT:    li a3, 255
99; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
100; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
101; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
102; RV64IA-ZACAS-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
103; RV64IA-ZACAS-NEXT:    lr.w a4, (a2)
104; RV64IA-ZACAS-NEXT:    mv a5, a1
105; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
106; RV64IA-ZACAS-NEXT:    and a5, a5, a3
107; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
108; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
109; RV64IA-ZACAS-NEXT:    bnez a5, .LBB0_1
110; RV64IA-ZACAS-NEXT:  # %bb.2:
111; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
112; RV64IA-ZACAS-NEXT:    ret
113;
114; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_monotonic:
115; RV64IA-WMO-ZABHA:       # %bb.0:
116; RV64IA-WMO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
117; RV64IA-WMO-ZABHA-NEXT:    ret
118;
119; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_monotonic:
120; RV64IA-TSO-ZABHA:       # %bb.0:
121; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
122; RV64IA-TSO-ZABHA-NEXT:    ret
123  %1 = atomicrmw xchg ptr %a, i8 %b monotonic
124  ret i8 %1
125}
126
127define i8 @atomicrmw_xchg_i8_acquire(ptr %a, i8 %b) nounwind {
128; RV32I-LABEL: atomicrmw_xchg_i8_acquire:
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, 2
133; RV32I-NEXT:    call __atomic_exchange_1
134; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
135; RV32I-NEXT:    addi sp, sp, 16
136; RV32I-NEXT:    ret
137;
138; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_acquire:
139; RV32IA-WMO:       # %bb.0:
140; RV32IA-WMO-NEXT:    andi a2, a0, -4
141; RV32IA-WMO-NEXT:    slli a0, a0, 3
142; RV32IA-WMO-NEXT:    li a3, 255
143; RV32IA-WMO-NEXT:    andi a1, a1, 255
144; RV32IA-WMO-NEXT:    sll a3, a3, a0
145; RV32IA-WMO-NEXT:    sll a1, a1, a0
146; RV32IA-WMO-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
147; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
148; RV32IA-WMO-NEXT:    mv a5, a1
149; RV32IA-WMO-NEXT:    xor a5, a4, a5
150; RV32IA-WMO-NEXT:    and a5, a5, a3
151; RV32IA-WMO-NEXT:    xor a5, a4, a5
152; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
153; RV32IA-WMO-NEXT:    bnez a5, .LBB1_1
154; RV32IA-WMO-NEXT:  # %bb.2:
155; RV32IA-WMO-NEXT:    srl a0, a4, a0
156; RV32IA-WMO-NEXT:    ret
157;
158; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_acquire:
159; RV32IA-TSO:       # %bb.0:
160; RV32IA-TSO-NEXT:    andi a2, a0, -4
161; RV32IA-TSO-NEXT:    slli a0, a0, 3
162; RV32IA-TSO-NEXT:    li a3, 255
163; RV32IA-TSO-NEXT:    andi a1, a1, 255
164; RV32IA-TSO-NEXT:    sll a3, a3, a0
165; RV32IA-TSO-NEXT:    sll a1, a1, a0
166; RV32IA-TSO-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
167; RV32IA-TSO-NEXT:    lr.w a4, (a2)
168; RV32IA-TSO-NEXT:    mv a5, a1
169; RV32IA-TSO-NEXT:    xor a5, a4, a5
170; RV32IA-TSO-NEXT:    and a5, a5, a3
171; RV32IA-TSO-NEXT:    xor a5, a4, a5
172; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
173; RV32IA-TSO-NEXT:    bnez a5, .LBB1_1
174; RV32IA-TSO-NEXT:  # %bb.2:
175; RV32IA-TSO-NEXT:    srl a0, a4, a0
176; RV32IA-TSO-NEXT:    ret
177;
178; RV64I-LABEL: atomicrmw_xchg_i8_acquire:
179; RV64I:       # %bb.0:
180; RV64I-NEXT:    addi sp, sp, -16
181; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
182; RV64I-NEXT:    li a2, 2
183; RV64I-NEXT:    call __atomic_exchange_1
184; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
185; RV64I-NEXT:    addi sp, sp, 16
186; RV64I-NEXT:    ret
187;
188; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_acquire:
189; RV64IA-WMO-NOZACAS:       # %bb.0:
190; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
191; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
192; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
193; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
194; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
195; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
196; RV64IA-WMO-NOZACAS-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
197; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
198; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a1
199; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
200; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
201; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
202; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
203; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB1_1
204; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
205; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
206; RV64IA-WMO-NOZACAS-NEXT:    ret
207;
208; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_acquire:
209; RV64IA-TSO-NOZACAS:       # %bb.0:
210; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
211; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
212; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
213; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
214; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
215; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
216; RV64IA-TSO-NOZACAS-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
217; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
218; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a1
219; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
220; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
221; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
222; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
223; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB1_1
224; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
225; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
226; RV64IA-TSO-NOZACAS-NEXT:    ret
227;
228; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_acquire:
229; RV64IA-WMO-ZACAS:       # %bb.0:
230; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
231; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
232; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
233; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
234; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
235; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
236; RV64IA-WMO-ZACAS-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
237; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
238; RV64IA-WMO-ZACAS-NEXT:    mv a5, a1
239; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
240; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
241; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
242; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
243; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB1_1
244; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
245; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
246; RV64IA-WMO-ZACAS-NEXT:    ret
247;
248; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_acquire:
249; RV64IA-TSO-ZACAS:       # %bb.0:
250; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
251; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
252; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
253; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
254; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
255; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
256; RV64IA-TSO-ZACAS-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
257; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
258; RV64IA-TSO-ZACAS-NEXT:    mv a5, a1
259; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
260; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
261; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
262; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
263; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB1_1
264; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
265; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
266; RV64IA-TSO-ZACAS-NEXT:    ret
267;
268; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_acquire:
269; RV64IA-WMO-ZABHA:       # %bb.0:
270; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aq a0, a1, (a0)
271; RV64IA-WMO-ZABHA-NEXT:    ret
272;
273; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_acquire:
274; RV64IA-TSO-ZABHA:       # %bb.0:
275; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
276; RV64IA-TSO-ZABHA-NEXT:    ret
277  %1 = atomicrmw xchg ptr %a, i8 %b acquire
278  ret i8 %1
279}
280
281define i8 @atomicrmw_xchg_i8_release(ptr %a, i8 %b) nounwind {
282; RV32I-LABEL: atomicrmw_xchg_i8_release:
283; RV32I:       # %bb.0:
284; RV32I-NEXT:    addi sp, sp, -16
285; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
286; RV32I-NEXT:    li a2, 3
287; RV32I-NEXT:    call __atomic_exchange_1
288; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
289; RV32I-NEXT:    addi sp, sp, 16
290; RV32I-NEXT:    ret
291;
292; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_release:
293; RV32IA-WMO:       # %bb.0:
294; RV32IA-WMO-NEXT:    andi a2, a0, -4
295; RV32IA-WMO-NEXT:    slli a0, a0, 3
296; RV32IA-WMO-NEXT:    li a3, 255
297; RV32IA-WMO-NEXT:    andi a1, a1, 255
298; RV32IA-WMO-NEXT:    sll a3, a3, a0
299; RV32IA-WMO-NEXT:    sll a1, a1, a0
300; RV32IA-WMO-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
301; RV32IA-WMO-NEXT:    lr.w a4, (a2)
302; RV32IA-WMO-NEXT:    mv a5, a1
303; RV32IA-WMO-NEXT:    xor a5, a4, a5
304; RV32IA-WMO-NEXT:    and a5, a5, a3
305; RV32IA-WMO-NEXT:    xor a5, a4, a5
306; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
307; RV32IA-WMO-NEXT:    bnez a5, .LBB2_1
308; RV32IA-WMO-NEXT:  # %bb.2:
309; RV32IA-WMO-NEXT:    srl a0, a4, a0
310; RV32IA-WMO-NEXT:    ret
311;
312; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_release:
313; RV32IA-TSO:       # %bb.0:
314; RV32IA-TSO-NEXT:    andi a2, a0, -4
315; RV32IA-TSO-NEXT:    slli a0, a0, 3
316; RV32IA-TSO-NEXT:    li a3, 255
317; RV32IA-TSO-NEXT:    andi a1, a1, 255
318; RV32IA-TSO-NEXT:    sll a3, a3, a0
319; RV32IA-TSO-NEXT:    sll a1, a1, a0
320; RV32IA-TSO-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
321; RV32IA-TSO-NEXT:    lr.w a4, (a2)
322; RV32IA-TSO-NEXT:    mv a5, a1
323; RV32IA-TSO-NEXT:    xor a5, a4, a5
324; RV32IA-TSO-NEXT:    and a5, a5, a3
325; RV32IA-TSO-NEXT:    xor a5, a4, a5
326; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
327; RV32IA-TSO-NEXT:    bnez a5, .LBB2_1
328; RV32IA-TSO-NEXT:  # %bb.2:
329; RV32IA-TSO-NEXT:    srl a0, a4, a0
330; RV32IA-TSO-NEXT:    ret
331;
332; RV64I-LABEL: atomicrmw_xchg_i8_release:
333; RV64I:       # %bb.0:
334; RV64I-NEXT:    addi sp, sp, -16
335; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
336; RV64I-NEXT:    li a2, 3
337; RV64I-NEXT:    call __atomic_exchange_1
338; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
339; RV64I-NEXT:    addi sp, sp, 16
340; RV64I-NEXT:    ret
341;
342; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_release:
343; RV64IA-WMO-NOZACAS:       # %bb.0:
344; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
345; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
346; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
347; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
348; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
349; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
350; RV64IA-WMO-NOZACAS-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
351; RV64IA-WMO-NOZACAS-NEXT:    lr.w a4, (a2)
352; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a1
353; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
354; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
355; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
356; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
357; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB2_1
358; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
359; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
360; RV64IA-WMO-NOZACAS-NEXT:    ret
361;
362; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_release:
363; RV64IA-TSO-NOZACAS:       # %bb.0:
364; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
365; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
366; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
367; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
368; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
369; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
370; RV64IA-TSO-NOZACAS-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
371; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
372; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a1
373; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
374; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
375; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
376; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
377; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB2_1
378; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
379; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
380; RV64IA-TSO-NOZACAS-NEXT:    ret
381;
382; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_release:
383; RV64IA-WMO-ZACAS:       # %bb.0:
384; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
385; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
386; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
387; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
388; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
389; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
390; RV64IA-WMO-ZACAS-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
391; RV64IA-WMO-ZACAS-NEXT:    lr.w a4, (a2)
392; RV64IA-WMO-ZACAS-NEXT:    mv a5, a1
393; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
394; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
395; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
396; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
397; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB2_1
398; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
399; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
400; RV64IA-WMO-ZACAS-NEXT:    ret
401;
402; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_release:
403; RV64IA-TSO-ZACAS:       # %bb.0:
404; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
405; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
406; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
407; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
408; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
409; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
410; RV64IA-TSO-ZACAS-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
411; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
412; RV64IA-TSO-ZACAS-NEXT:    mv a5, a1
413; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
414; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
415; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
416; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
417; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB2_1
418; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
419; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
420; RV64IA-TSO-ZACAS-NEXT:    ret
421;
422; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_release:
423; RV64IA-WMO-ZABHA:       # %bb.0:
424; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.rl a0, a1, (a0)
425; RV64IA-WMO-ZABHA-NEXT:    ret
426;
427; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_release:
428; RV64IA-TSO-ZABHA:       # %bb.0:
429; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
430; RV64IA-TSO-ZABHA-NEXT:    ret
431  %1 = atomicrmw xchg ptr %a, i8 %b release
432  ret i8 %1
433}
434
435define i8 @atomicrmw_xchg_i8_acq_rel(ptr %a, i8 %b) nounwind {
436; RV32I-LABEL: atomicrmw_xchg_i8_acq_rel:
437; RV32I:       # %bb.0:
438; RV32I-NEXT:    addi sp, sp, -16
439; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
440; RV32I-NEXT:    li a2, 4
441; RV32I-NEXT:    call __atomic_exchange_1
442; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
443; RV32I-NEXT:    addi sp, sp, 16
444; RV32I-NEXT:    ret
445;
446; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_acq_rel:
447; RV32IA-WMO:       # %bb.0:
448; RV32IA-WMO-NEXT:    andi a2, a0, -4
449; RV32IA-WMO-NEXT:    slli a0, a0, 3
450; RV32IA-WMO-NEXT:    li a3, 255
451; RV32IA-WMO-NEXT:    andi a1, a1, 255
452; RV32IA-WMO-NEXT:    sll a3, a3, a0
453; RV32IA-WMO-NEXT:    sll a1, a1, a0
454; RV32IA-WMO-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
455; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
456; RV32IA-WMO-NEXT:    mv a5, a1
457; RV32IA-WMO-NEXT:    xor a5, a4, a5
458; RV32IA-WMO-NEXT:    and a5, a5, a3
459; RV32IA-WMO-NEXT:    xor a5, a4, a5
460; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
461; RV32IA-WMO-NEXT:    bnez a5, .LBB3_1
462; RV32IA-WMO-NEXT:  # %bb.2:
463; RV32IA-WMO-NEXT:    srl a0, a4, a0
464; RV32IA-WMO-NEXT:    ret
465;
466; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_acq_rel:
467; RV32IA-TSO:       # %bb.0:
468; RV32IA-TSO-NEXT:    andi a2, a0, -4
469; RV32IA-TSO-NEXT:    slli a0, a0, 3
470; RV32IA-TSO-NEXT:    li a3, 255
471; RV32IA-TSO-NEXT:    andi a1, a1, 255
472; RV32IA-TSO-NEXT:    sll a3, a3, a0
473; RV32IA-TSO-NEXT:    sll a1, a1, a0
474; RV32IA-TSO-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
475; RV32IA-TSO-NEXT:    lr.w a4, (a2)
476; RV32IA-TSO-NEXT:    mv a5, a1
477; RV32IA-TSO-NEXT:    xor a5, a4, a5
478; RV32IA-TSO-NEXT:    and a5, a5, a3
479; RV32IA-TSO-NEXT:    xor a5, a4, a5
480; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
481; RV32IA-TSO-NEXT:    bnez a5, .LBB3_1
482; RV32IA-TSO-NEXT:  # %bb.2:
483; RV32IA-TSO-NEXT:    srl a0, a4, a0
484; RV32IA-TSO-NEXT:    ret
485;
486; RV64I-LABEL: atomicrmw_xchg_i8_acq_rel:
487; RV64I:       # %bb.0:
488; RV64I-NEXT:    addi sp, sp, -16
489; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
490; RV64I-NEXT:    li a2, 4
491; RV64I-NEXT:    call __atomic_exchange_1
492; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
493; RV64I-NEXT:    addi sp, sp, 16
494; RV64I-NEXT:    ret
495;
496; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
497; RV64IA-WMO-NOZACAS:       # %bb.0:
498; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
499; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
500; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
501; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
502; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
503; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
504; RV64IA-WMO-NOZACAS-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
505; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
506; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a1
507; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
508; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
509; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
510; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
511; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB3_1
512; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
513; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
514; RV64IA-WMO-NOZACAS-NEXT:    ret
515;
516; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
517; RV64IA-TSO-NOZACAS:       # %bb.0:
518; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
519; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
520; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
521; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
522; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
523; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
524; RV64IA-TSO-NOZACAS-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
525; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
526; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a1
527; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
528; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
529; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
530; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
531; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB3_1
532; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
533; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
534; RV64IA-TSO-NOZACAS-NEXT:    ret
535;
536; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
537; RV64IA-WMO-ZACAS:       # %bb.0:
538; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
539; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
540; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
541; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
542; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
543; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
544; RV64IA-WMO-ZACAS-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
545; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
546; RV64IA-WMO-ZACAS-NEXT:    mv a5, a1
547; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
548; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
549; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
550; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
551; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB3_1
552; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
553; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
554; RV64IA-WMO-ZACAS-NEXT:    ret
555;
556; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
557; RV64IA-TSO-ZACAS:       # %bb.0:
558; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
559; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
560; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
561; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
562; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
563; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
564; RV64IA-TSO-ZACAS-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
565; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
566; RV64IA-TSO-ZACAS-NEXT:    mv a5, a1
567; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
568; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
569; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
570; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
571; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB3_1
572; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
573; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
574; RV64IA-TSO-ZACAS-NEXT:    ret
575;
576; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_acq_rel:
577; RV64IA-WMO-ZABHA:       # %bb.0:
578; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aqrl a0, a1, (a0)
579; RV64IA-WMO-ZABHA-NEXT:    ret
580;
581; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_acq_rel:
582; RV64IA-TSO-ZABHA:       # %bb.0:
583; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
584; RV64IA-TSO-ZABHA-NEXT:    ret
585  %1 = atomicrmw xchg ptr %a, i8 %b acq_rel
586  ret i8 %1
587}
588
589define i8 @atomicrmw_xchg_i8_seq_cst(ptr %a, i8 %b) nounwind {
590; RV32I-LABEL: atomicrmw_xchg_i8_seq_cst:
591; RV32I:       # %bb.0:
592; RV32I-NEXT:    addi sp, sp, -16
593; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
594; RV32I-NEXT:    li a2, 5
595; RV32I-NEXT:    call __atomic_exchange_1
596; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
597; RV32I-NEXT:    addi sp, sp, 16
598; RV32I-NEXT:    ret
599;
600; RV32IA-LABEL: atomicrmw_xchg_i8_seq_cst:
601; RV32IA:       # %bb.0:
602; RV32IA-NEXT:    andi a2, a0, -4
603; RV32IA-NEXT:    slli a0, a0, 3
604; RV32IA-NEXT:    li a3, 255
605; RV32IA-NEXT:    andi a1, a1, 255
606; RV32IA-NEXT:    sll a3, a3, a0
607; RV32IA-NEXT:    sll a1, a1, a0
608; RV32IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
609; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
610; RV32IA-NEXT:    mv a5, a1
611; RV32IA-NEXT:    xor a5, a4, a5
612; RV32IA-NEXT:    and a5, a5, a3
613; RV32IA-NEXT:    xor a5, a4, a5
614; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
615; RV32IA-NEXT:    bnez a5, .LBB4_1
616; RV32IA-NEXT:  # %bb.2:
617; RV32IA-NEXT:    srl a0, a4, a0
618; RV32IA-NEXT:    ret
619;
620; RV64I-LABEL: atomicrmw_xchg_i8_seq_cst:
621; RV64I:       # %bb.0:
622; RV64I-NEXT:    addi sp, sp, -16
623; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
624; RV64I-NEXT:    li a2, 5
625; RV64I-NEXT:    call __atomic_exchange_1
626; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
627; RV64I-NEXT:    addi sp, sp, 16
628; RV64I-NEXT:    ret
629;
630; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i8_seq_cst:
631; RV64IA-NOZACAS:       # %bb.0:
632; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
633; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
634; RV64IA-NOZACAS-NEXT:    li a3, 255
635; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
636; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
637; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
638; RV64IA-NOZACAS-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
639; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
640; RV64IA-NOZACAS-NEXT:    mv a5, a1
641; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
642; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
643; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
644; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
645; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB4_1
646; RV64IA-NOZACAS-NEXT:  # %bb.2:
647; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
648; RV64IA-NOZACAS-NEXT:    ret
649;
650; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i8_seq_cst:
651; RV64IA-ZACAS:       # %bb.0:
652; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
653; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
654; RV64IA-ZACAS-NEXT:    li a3, 255
655; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
656; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
657; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
658; RV64IA-ZACAS-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
659; RV64IA-ZACAS-NEXT:    lr.w.aqrl a4, (a2)
660; RV64IA-ZACAS-NEXT:    mv a5, a1
661; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
662; RV64IA-ZACAS-NEXT:    and a5, a5, a3
663; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
664; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
665; RV64IA-ZACAS-NEXT:    bnez a5, .LBB4_1
666; RV64IA-ZACAS-NEXT:  # %bb.2:
667; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
668; RV64IA-ZACAS-NEXT:    ret
669;
670; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_seq_cst:
671; RV64IA-WMO-ZABHA:       # %bb.0:
672; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aqrl a0, a1, (a0)
673; RV64IA-WMO-ZABHA-NEXT:    ret
674;
675; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_seq_cst:
676; RV64IA-TSO-ZABHA:       # %bb.0:
677; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
678; RV64IA-TSO-ZABHA-NEXT:    ret
679  %1 = atomicrmw xchg ptr %a, i8 %b seq_cst
680  ret i8 %1
681}
682
683; Ensure the following 'atomicrmw xchg a, {0,-1}` cases are lowered to an
684; amoand or amoor with appropriate mask.
685
686define i8 @atomicrmw_xchg_0_i8_monotonic(ptr %a) nounwind {
687; RV32I-LABEL: atomicrmw_xchg_0_i8_monotonic:
688; RV32I:       # %bb.0:
689; RV32I-NEXT:    addi sp, sp, -16
690; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
691; RV32I-NEXT:    li a1, 0
692; RV32I-NEXT:    li a2, 0
693; RV32I-NEXT:    call __atomic_exchange_1
694; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
695; RV32I-NEXT:    addi sp, sp, 16
696; RV32I-NEXT:    ret
697;
698; RV32IA-LABEL: atomicrmw_xchg_0_i8_monotonic:
699; RV32IA:       # %bb.0:
700; RV32IA-NEXT:    andi a1, a0, -4
701; RV32IA-NEXT:    slli a0, a0, 3
702; RV32IA-NEXT:    li a2, 255
703; RV32IA-NEXT:    sll a2, a2, a0
704; RV32IA-NEXT:    not a2, a2
705; RV32IA-NEXT:    amoand.w a1, a2, (a1)
706; RV32IA-NEXT:    srl a0, a1, a0
707; RV32IA-NEXT:    ret
708;
709; RV64I-LABEL: atomicrmw_xchg_0_i8_monotonic:
710; RV64I:       # %bb.0:
711; RV64I-NEXT:    addi sp, sp, -16
712; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
713; RV64I-NEXT:    li a1, 0
714; RV64I-NEXT:    li a2, 0
715; RV64I-NEXT:    call __atomic_exchange_1
716; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
717; RV64I-NEXT:    addi sp, sp, 16
718; RV64I-NEXT:    ret
719;
720; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_0_i8_monotonic:
721; RV64IA-NOZACAS:       # %bb.0:
722; RV64IA-NOZACAS-NEXT:    andi a1, a0, -4
723; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
724; RV64IA-NOZACAS-NEXT:    li a2, 255
725; RV64IA-NOZACAS-NEXT:    sllw a2, a2, a0
726; RV64IA-NOZACAS-NEXT:    not a2, a2
727; RV64IA-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
728; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
729; RV64IA-NOZACAS-NEXT:    ret
730;
731; RV64IA-ZACAS-LABEL: atomicrmw_xchg_0_i8_monotonic:
732; RV64IA-ZACAS:       # %bb.0:
733; RV64IA-ZACAS-NEXT:    andi a1, a0, -4
734; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
735; RV64IA-ZACAS-NEXT:    li a2, 255
736; RV64IA-ZACAS-NEXT:    sllw a2, a2, a0
737; RV64IA-ZACAS-NEXT:    not a2, a2
738; RV64IA-ZACAS-NEXT:    amoand.w a1, a2, (a1)
739; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
740; RV64IA-ZACAS-NEXT:    ret
741;
742; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_monotonic:
743; RV64IA-WMO-ZABHA:       # %bb.0:
744; RV64IA-WMO-ZABHA-NEXT:    amoswap.b a0, zero, (a0)
745; RV64IA-WMO-ZABHA-NEXT:    ret
746;
747; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_monotonic:
748; RV64IA-TSO-ZABHA:       # %bb.0:
749; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, zero, (a0)
750; RV64IA-TSO-ZABHA-NEXT:    ret
751  %1 = atomicrmw xchg ptr %a, i8 0 monotonic
752  ret i8 %1
753}
754
755define i8 @atomicrmw_xchg_0_i8_acquire(ptr %a) nounwind {
756; RV32I-LABEL: atomicrmw_xchg_0_i8_acquire:
757; RV32I:       # %bb.0:
758; RV32I-NEXT:    addi sp, sp, -16
759; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
760; RV32I-NEXT:    li a2, 2
761; RV32I-NEXT:    li a1, 0
762; RV32I-NEXT:    call __atomic_exchange_1
763; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
764; RV32I-NEXT:    addi sp, sp, 16
765; RV32I-NEXT:    ret
766;
767; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_acquire:
768; RV32IA-WMO:       # %bb.0:
769; RV32IA-WMO-NEXT:    andi a1, a0, -4
770; RV32IA-WMO-NEXT:    slli a0, a0, 3
771; RV32IA-WMO-NEXT:    li a2, 255
772; RV32IA-WMO-NEXT:    sll a2, a2, a0
773; RV32IA-WMO-NEXT:    not a2, a2
774; RV32IA-WMO-NEXT:    amoand.w.aq a1, a2, (a1)
775; RV32IA-WMO-NEXT:    srl a0, a1, a0
776; RV32IA-WMO-NEXT:    ret
777;
778; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_acquire:
779; RV32IA-TSO:       # %bb.0:
780; RV32IA-TSO-NEXT:    andi a1, a0, -4
781; RV32IA-TSO-NEXT:    slli a0, a0, 3
782; RV32IA-TSO-NEXT:    li a2, 255
783; RV32IA-TSO-NEXT:    sll a2, a2, a0
784; RV32IA-TSO-NEXT:    not a2, a2
785; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
786; RV32IA-TSO-NEXT:    srl a0, a1, a0
787; RV32IA-TSO-NEXT:    ret
788;
789; RV64I-LABEL: atomicrmw_xchg_0_i8_acquire:
790; RV64I:       # %bb.0:
791; RV64I-NEXT:    addi sp, sp, -16
792; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
793; RV64I-NEXT:    li a2, 2
794; RV64I-NEXT:    li a1, 0
795; RV64I-NEXT:    call __atomic_exchange_1
796; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
797; RV64I-NEXT:    addi sp, sp, 16
798; RV64I-NEXT:    ret
799;
800; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
801; RV64IA-WMO-NOZACAS:       # %bb.0:
802; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
803; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
804; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
805; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
806; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
807; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aq a1, a2, (a1)
808; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
809; RV64IA-WMO-NOZACAS-NEXT:    ret
810;
811; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
812; RV64IA-TSO-NOZACAS:       # %bb.0:
813; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
814; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
815; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
816; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
817; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
818; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
819; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
820; RV64IA-TSO-NOZACAS-NEXT:    ret
821;
822; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
823; RV64IA-WMO-ZACAS:       # %bb.0:
824; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
825; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
826; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
827; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
828; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
829; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aq a1, a2, (a1)
830; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
831; RV64IA-WMO-ZACAS-NEXT:    ret
832;
833; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
834; RV64IA-TSO-ZACAS:       # %bb.0:
835; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
836; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
837; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
838; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
839; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
840; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
841; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
842; RV64IA-TSO-ZACAS-NEXT:    ret
843;
844; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acquire:
845; RV64IA-WMO-ZABHA:       # %bb.0:
846; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aq a0, zero, (a0)
847; RV64IA-WMO-ZABHA-NEXT:    ret
848;
849; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acquire:
850; RV64IA-TSO-ZABHA:       # %bb.0:
851; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, zero, (a0)
852; RV64IA-TSO-ZABHA-NEXT:    ret
853  %1 = atomicrmw xchg ptr %a, i8 0 acquire
854  ret i8 %1
855}
856
857define i8 @atomicrmw_xchg_0_i8_release(ptr %a) nounwind {
858; RV32I-LABEL: atomicrmw_xchg_0_i8_release:
859; RV32I:       # %bb.0:
860; RV32I-NEXT:    addi sp, sp, -16
861; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
862; RV32I-NEXT:    li a2, 3
863; RV32I-NEXT:    li a1, 0
864; RV32I-NEXT:    call __atomic_exchange_1
865; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
866; RV32I-NEXT:    addi sp, sp, 16
867; RV32I-NEXT:    ret
868;
869; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_release:
870; RV32IA-WMO:       # %bb.0:
871; RV32IA-WMO-NEXT:    andi a1, a0, -4
872; RV32IA-WMO-NEXT:    slli a0, a0, 3
873; RV32IA-WMO-NEXT:    li a2, 255
874; RV32IA-WMO-NEXT:    sll a2, a2, a0
875; RV32IA-WMO-NEXT:    not a2, a2
876; RV32IA-WMO-NEXT:    amoand.w.rl a1, a2, (a1)
877; RV32IA-WMO-NEXT:    srl a0, a1, a0
878; RV32IA-WMO-NEXT:    ret
879;
880; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_release:
881; RV32IA-TSO:       # %bb.0:
882; RV32IA-TSO-NEXT:    andi a1, a0, -4
883; RV32IA-TSO-NEXT:    slli a0, a0, 3
884; RV32IA-TSO-NEXT:    li a2, 255
885; RV32IA-TSO-NEXT:    sll a2, a2, a0
886; RV32IA-TSO-NEXT:    not a2, a2
887; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
888; RV32IA-TSO-NEXT:    srl a0, a1, a0
889; RV32IA-TSO-NEXT:    ret
890;
891; RV64I-LABEL: atomicrmw_xchg_0_i8_release:
892; RV64I:       # %bb.0:
893; RV64I-NEXT:    addi sp, sp, -16
894; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
895; RV64I-NEXT:    li a2, 3
896; RV64I-NEXT:    li a1, 0
897; RV64I-NEXT:    call __atomic_exchange_1
898; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
899; RV64I-NEXT:    addi sp, sp, 16
900; RV64I-NEXT:    ret
901;
902; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_release:
903; RV64IA-WMO-NOZACAS:       # %bb.0:
904; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
905; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
906; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
907; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
908; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
909; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.rl a1, a2, (a1)
910; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
911; RV64IA-WMO-NOZACAS-NEXT:    ret
912;
913; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_release:
914; RV64IA-TSO-NOZACAS:       # %bb.0:
915; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
916; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
917; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
918; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
919; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
920; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
921; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
922; RV64IA-TSO-NOZACAS-NEXT:    ret
923;
924; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_release:
925; RV64IA-WMO-ZACAS:       # %bb.0:
926; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
927; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
928; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
929; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
930; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
931; RV64IA-WMO-ZACAS-NEXT:    amoand.w.rl a1, a2, (a1)
932; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
933; RV64IA-WMO-ZACAS-NEXT:    ret
934;
935; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_release:
936; RV64IA-TSO-ZACAS:       # %bb.0:
937; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
938; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
939; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
940; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
941; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
942; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
943; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
944; RV64IA-TSO-ZACAS-NEXT:    ret
945;
946; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_release:
947; RV64IA-WMO-ZABHA:       # %bb.0:
948; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.rl a0, zero, (a0)
949; RV64IA-WMO-ZABHA-NEXT:    ret
950;
951; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_release:
952; RV64IA-TSO-ZABHA:       # %bb.0:
953; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, zero, (a0)
954; RV64IA-TSO-ZABHA-NEXT:    ret
955  %1 = atomicrmw xchg ptr %a, i8 0 release
956  ret i8 %1
957}
958
959define i8 @atomicrmw_xchg_0_i8_acq_rel(ptr %a) nounwind {
960; RV32I-LABEL: atomicrmw_xchg_0_i8_acq_rel:
961; RV32I:       # %bb.0:
962; RV32I-NEXT:    addi sp, sp, -16
963; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
964; RV32I-NEXT:    li a2, 4
965; RV32I-NEXT:    li a1, 0
966; RV32I-NEXT:    call __atomic_exchange_1
967; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
968; RV32I-NEXT:    addi sp, sp, 16
969; RV32I-NEXT:    ret
970;
971; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_acq_rel:
972; RV32IA-WMO:       # %bb.0:
973; RV32IA-WMO-NEXT:    andi a1, a0, -4
974; RV32IA-WMO-NEXT:    slli a0, a0, 3
975; RV32IA-WMO-NEXT:    li a2, 255
976; RV32IA-WMO-NEXT:    sll a2, a2, a0
977; RV32IA-WMO-NEXT:    not a2, a2
978; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a2, (a1)
979; RV32IA-WMO-NEXT:    srl a0, a1, a0
980; RV32IA-WMO-NEXT:    ret
981;
982; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_acq_rel:
983; RV32IA-TSO:       # %bb.0:
984; RV32IA-TSO-NEXT:    andi a1, a0, -4
985; RV32IA-TSO-NEXT:    slli a0, a0, 3
986; RV32IA-TSO-NEXT:    li a2, 255
987; RV32IA-TSO-NEXT:    sll a2, a2, a0
988; RV32IA-TSO-NEXT:    not a2, a2
989; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
990; RV32IA-TSO-NEXT:    srl a0, a1, a0
991; RV32IA-TSO-NEXT:    ret
992;
993; RV64I-LABEL: atomicrmw_xchg_0_i8_acq_rel:
994; RV64I:       # %bb.0:
995; RV64I-NEXT:    addi sp, sp, -16
996; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
997; RV64I-NEXT:    li a2, 4
998; RV64I-NEXT:    li a1, 0
999; RV64I-NEXT:    call __atomic_exchange_1
1000; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1001; RV64I-NEXT:    addi sp, sp, 16
1002; RV64I-NEXT:    ret
1003;
1004; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
1005; RV64IA-WMO-NOZACAS:       # %bb.0:
1006; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
1007; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1008; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
1009; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
1010; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
1011; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
1012; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
1013; RV64IA-WMO-NOZACAS-NEXT:    ret
1014;
1015; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
1016; RV64IA-TSO-NOZACAS:       # %bb.0:
1017; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
1018; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1019; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
1020; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
1021; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
1022; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
1023; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
1024; RV64IA-TSO-NOZACAS-NEXT:    ret
1025;
1026; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
1027; RV64IA-WMO-ZACAS:       # %bb.0:
1028; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
1029; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1030; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
1031; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
1032; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
1033; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
1034; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
1035; RV64IA-WMO-ZACAS-NEXT:    ret
1036;
1037; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
1038; RV64IA-TSO-ZACAS:       # %bb.0:
1039; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
1040; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1041; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
1042; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
1043; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
1044; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
1045; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
1046; RV64IA-TSO-ZACAS-NEXT:    ret
1047;
1048; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acq_rel:
1049; RV64IA-WMO-ZABHA:       # %bb.0:
1050; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aqrl a0, zero, (a0)
1051; RV64IA-WMO-ZABHA-NEXT:    ret
1052;
1053; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acq_rel:
1054; RV64IA-TSO-ZABHA:       # %bb.0:
1055; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, zero, (a0)
1056; RV64IA-TSO-ZABHA-NEXT:    ret
1057  %1 = atomicrmw xchg ptr %a, i8 0 acq_rel
1058  ret i8 %1
1059}
1060
1061define i8 @atomicrmw_xchg_0_i8_seq_cst(ptr %a) nounwind {
1062; RV32I-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1063; RV32I:       # %bb.0:
1064; RV32I-NEXT:    addi sp, sp, -16
1065; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1066; RV32I-NEXT:    li a2, 5
1067; RV32I-NEXT:    li a1, 0
1068; RV32I-NEXT:    call __atomic_exchange_1
1069; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1070; RV32I-NEXT:    addi sp, sp, 16
1071; RV32I-NEXT:    ret
1072;
1073; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1074; RV32IA-WMO:       # %bb.0:
1075; RV32IA-WMO-NEXT:    andi a1, a0, -4
1076; RV32IA-WMO-NEXT:    slli a0, a0, 3
1077; RV32IA-WMO-NEXT:    li a2, 255
1078; RV32IA-WMO-NEXT:    sll a2, a2, a0
1079; RV32IA-WMO-NEXT:    not a2, a2
1080; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a2, (a1)
1081; RV32IA-WMO-NEXT:    srl a0, a1, a0
1082; RV32IA-WMO-NEXT:    ret
1083;
1084; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1085; RV32IA-TSO:       # %bb.0:
1086; RV32IA-TSO-NEXT:    andi a1, a0, -4
1087; RV32IA-TSO-NEXT:    slli a0, a0, 3
1088; RV32IA-TSO-NEXT:    li a2, 255
1089; RV32IA-TSO-NEXT:    sll a2, a2, a0
1090; RV32IA-TSO-NEXT:    not a2, a2
1091; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
1092; RV32IA-TSO-NEXT:    srl a0, a1, a0
1093; RV32IA-TSO-NEXT:    ret
1094;
1095; RV64I-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1096; RV64I:       # %bb.0:
1097; RV64I-NEXT:    addi sp, sp, -16
1098; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1099; RV64I-NEXT:    li a2, 5
1100; RV64I-NEXT:    li a1, 0
1101; RV64I-NEXT:    call __atomic_exchange_1
1102; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1103; RV64I-NEXT:    addi sp, sp, 16
1104; RV64I-NEXT:    ret
1105;
1106; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1107; RV64IA-WMO-NOZACAS:       # %bb.0:
1108; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
1109; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1110; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
1111; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
1112; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
1113; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
1114; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
1115; RV64IA-WMO-NOZACAS-NEXT:    ret
1116;
1117; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1118; RV64IA-TSO-NOZACAS:       # %bb.0:
1119; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
1120; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1121; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
1122; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
1123; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
1124; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
1125; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
1126; RV64IA-TSO-NOZACAS-NEXT:    ret
1127;
1128; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1129; RV64IA-WMO-ZACAS:       # %bb.0:
1130; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
1131; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1132; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
1133; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
1134; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
1135; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
1136; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
1137; RV64IA-WMO-ZACAS-NEXT:    ret
1138;
1139; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1140; RV64IA-TSO-ZACAS:       # %bb.0:
1141; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
1142; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1143; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
1144; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
1145; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
1146; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
1147; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
1148; RV64IA-TSO-ZACAS-NEXT:    ret
1149;
1150; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1151; RV64IA-WMO-ZABHA:       # %bb.0:
1152; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aqrl a0, zero, (a0)
1153; RV64IA-WMO-ZABHA-NEXT:    ret
1154;
1155; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_seq_cst:
1156; RV64IA-TSO-ZABHA:       # %bb.0:
1157; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, zero, (a0)
1158; RV64IA-TSO-ZABHA-NEXT:    ret
1159  %1 = atomicrmw xchg ptr %a, i8 0 seq_cst
1160  ret i8 %1
1161}
1162
1163define i8 @atomicrmw_xchg_minus_1_i8_monotonic(ptr %a) nounwind {
1164; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
1165; RV32I:       # %bb.0:
1166; RV32I-NEXT:    addi sp, sp, -16
1167; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1168; RV32I-NEXT:    li a1, 255
1169; RV32I-NEXT:    li a2, 0
1170; RV32I-NEXT:    call __atomic_exchange_1
1171; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1172; RV32I-NEXT:    addi sp, sp, 16
1173; RV32I-NEXT:    ret
1174;
1175; RV32IA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
1176; RV32IA:       # %bb.0:
1177; RV32IA-NEXT:    andi a1, a0, -4
1178; RV32IA-NEXT:    slli a0, a0, 3
1179; RV32IA-NEXT:    li a2, 255
1180; RV32IA-NEXT:    sll a2, a2, a0
1181; RV32IA-NEXT:    amoor.w a1, a2, (a1)
1182; RV32IA-NEXT:    srl a0, a1, a0
1183; RV32IA-NEXT:    ret
1184;
1185; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
1186; RV64I:       # %bb.0:
1187; RV64I-NEXT:    addi sp, sp, -16
1188; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1189; RV64I-NEXT:    li a1, 255
1190; RV64I-NEXT:    li a2, 0
1191; RV64I-NEXT:    call __atomic_exchange_1
1192; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1193; RV64I-NEXT:    addi sp, sp, 16
1194; RV64I-NEXT:    ret
1195;
1196; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
1197; RV64IA-NOZACAS:       # %bb.0:
1198; RV64IA-NOZACAS-NEXT:    andi a1, a0, -4
1199; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
1200; RV64IA-NOZACAS-NEXT:    li a2, 255
1201; RV64IA-NOZACAS-NEXT:    sllw a2, a2, a0
1202; RV64IA-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
1203; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
1204; RV64IA-NOZACAS-NEXT:    ret
1205;
1206; RV64IA-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
1207; RV64IA-ZACAS:       # %bb.0:
1208; RV64IA-ZACAS-NEXT:    andi a1, a0, -4
1209; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
1210; RV64IA-ZACAS-NEXT:    li a2, 255
1211; RV64IA-ZACAS-NEXT:    sllw a2, a2, a0
1212; RV64IA-ZACAS-NEXT:    amoor.w a1, a2, (a1)
1213; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
1214; RV64IA-ZACAS-NEXT:    ret
1215;
1216; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
1217; RV64IA-WMO-ZABHA:       # %bb.0:
1218; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
1219; RV64IA-WMO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
1220; RV64IA-WMO-ZABHA-NEXT:    ret
1221;
1222; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
1223; RV64IA-TSO-ZABHA:       # %bb.0:
1224; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
1225; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
1226; RV64IA-TSO-ZABHA-NEXT:    ret
1227  %1 = atomicrmw xchg ptr %a, i8 -1 monotonic
1228  ret i8 %1
1229}
1230
1231define i8 @atomicrmw_xchg_minus_1_i8_acquire(ptr %a) nounwind {
1232; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1233; RV32I:       # %bb.0:
1234; RV32I-NEXT:    addi sp, sp, -16
1235; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1236; RV32I-NEXT:    li a1, 255
1237; RV32I-NEXT:    li a2, 2
1238; RV32I-NEXT:    call __atomic_exchange_1
1239; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1240; RV32I-NEXT:    addi sp, sp, 16
1241; RV32I-NEXT:    ret
1242;
1243; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1244; RV32IA-WMO:       # %bb.0:
1245; RV32IA-WMO-NEXT:    andi a1, a0, -4
1246; RV32IA-WMO-NEXT:    slli a0, a0, 3
1247; RV32IA-WMO-NEXT:    li a2, 255
1248; RV32IA-WMO-NEXT:    sll a2, a2, a0
1249; RV32IA-WMO-NEXT:    amoor.w.aq a1, a2, (a1)
1250; RV32IA-WMO-NEXT:    srl a0, a1, a0
1251; RV32IA-WMO-NEXT:    ret
1252;
1253; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1254; RV32IA-TSO:       # %bb.0:
1255; RV32IA-TSO-NEXT:    andi a1, a0, -4
1256; RV32IA-TSO-NEXT:    slli a0, a0, 3
1257; RV32IA-TSO-NEXT:    li a2, 255
1258; RV32IA-TSO-NEXT:    sll a2, a2, a0
1259; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
1260; RV32IA-TSO-NEXT:    srl a0, a1, a0
1261; RV32IA-TSO-NEXT:    ret
1262;
1263; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1264; RV64I:       # %bb.0:
1265; RV64I-NEXT:    addi sp, sp, -16
1266; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1267; RV64I-NEXT:    li a1, 255
1268; RV64I-NEXT:    li a2, 2
1269; RV64I-NEXT:    call __atomic_exchange_1
1270; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1271; RV64I-NEXT:    addi sp, sp, 16
1272; RV64I-NEXT:    ret
1273;
1274; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1275; RV64IA-WMO-NOZACAS:       # %bb.0:
1276; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
1277; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1278; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
1279; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
1280; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aq a1, a2, (a1)
1281; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
1282; RV64IA-WMO-NOZACAS-NEXT:    ret
1283;
1284; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1285; RV64IA-TSO-NOZACAS:       # %bb.0:
1286; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
1287; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1288; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
1289; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
1290; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
1291; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
1292; RV64IA-TSO-NOZACAS-NEXT:    ret
1293;
1294; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1295; RV64IA-WMO-ZACAS:       # %bb.0:
1296; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
1297; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1298; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
1299; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
1300; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aq a1, a2, (a1)
1301; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
1302; RV64IA-WMO-ZACAS-NEXT:    ret
1303;
1304; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1305; RV64IA-TSO-ZACAS:       # %bb.0:
1306; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
1307; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1308; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
1309; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
1310; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
1311; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
1312; RV64IA-TSO-ZACAS-NEXT:    ret
1313;
1314; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1315; RV64IA-WMO-ZABHA:       # %bb.0:
1316; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
1317; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aq a0, a1, (a0)
1318; RV64IA-WMO-ZABHA-NEXT:    ret
1319;
1320; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
1321; RV64IA-TSO-ZABHA:       # %bb.0:
1322; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
1323; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
1324; RV64IA-TSO-ZABHA-NEXT:    ret
1325  %1 = atomicrmw xchg ptr %a, i8 -1 acquire
1326  ret i8 %1
1327}
1328
1329define i8 @atomicrmw_xchg_minus_1_i8_release(ptr %a) nounwind {
1330; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_release:
1331; RV32I:       # %bb.0:
1332; RV32I-NEXT:    addi sp, sp, -16
1333; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1334; RV32I-NEXT:    li a1, 255
1335; RV32I-NEXT:    li a2, 3
1336; RV32I-NEXT:    call __atomic_exchange_1
1337; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1338; RV32I-NEXT:    addi sp, sp, 16
1339; RV32I-NEXT:    ret
1340;
1341; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_release:
1342; RV32IA-WMO:       # %bb.0:
1343; RV32IA-WMO-NEXT:    andi a1, a0, -4
1344; RV32IA-WMO-NEXT:    slli a0, a0, 3
1345; RV32IA-WMO-NEXT:    li a2, 255
1346; RV32IA-WMO-NEXT:    sll a2, a2, a0
1347; RV32IA-WMO-NEXT:    amoor.w.rl a1, a2, (a1)
1348; RV32IA-WMO-NEXT:    srl a0, a1, a0
1349; RV32IA-WMO-NEXT:    ret
1350;
1351; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_release:
1352; RV32IA-TSO:       # %bb.0:
1353; RV32IA-TSO-NEXT:    andi a1, a0, -4
1354; RV32IA-TSO-NEXT:    slli a0, a0, 3
1355; RV32IA-TSO-NEXT:    li a2, 255
1356; RV32IA-TSO-NEXT:    sll a2, a2, a0
1357; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
1358; RV32IA-TSO-NEXT:    srl a0, a1, a0
1359; RV32IA-TSO-NEXT:    ret
1360;
1361; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_release:
1362; RV64I:       # %bb.0:
1363; RV64I-NEXT:    addi sp, sp, -16
1364; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1365; RV64I-NEXT:    li a1, 255
1366; RV64I-NEXT:    li a2, 3
1367; RV64I-NEXT:    call __atomic_exchange_1
1368; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1369; RV64I-NEXT:    addi sp, sp, 16
1370; RV64I-NEXT:    ret
1371;
1372; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
1373; RV64IA-WMO-NOZACAS:       # %bb.0:
1374; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
1375; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1376; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
1377; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
1378; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.rl a1, a2, (a1)
1379; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
1380; RV64IA-WMO-NOZACAS-NEXT:    ret
1381;
1382; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
1383; RV64IA-TSO-NOZACAS:       # %bb.0:
1384; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
1385; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1386; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
1387; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
1388; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
1389; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
1390; RV64IA-TSO-NOZACAS-NEXT:    ret
1391;
1392; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
1393; RV64IA-WMO-ZACAS:       # %bb.0:
1394; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
1395; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1396; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
1397; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
1398; RV64IA-WMO-ZACAS-NEXT:    amoor.w.rl a1, a2, (a1)
1399; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
1400; RV64IA-WMO-ZACAS-NEXT:    ret
1401;
1402; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
1403; RV64IA-TSO-ZACAS:       # %bb.0:
1404; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
1405; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1406; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
1407; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
1408; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
1409; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
1410; RV64IA-TSO-ZACAS-NEXT:    ret
1411;
1412; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_release:
1413; RV64IA-WMO-ZABHA:       # %bb.0:
1414; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
1415; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.rl a0, a1, (a0)
1416; RV64IA-WMO-ZABHA-NEXT:    ret
1417;
1418; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_release:
1419; RV64IA-TSO-ZABHA:       # %bb.0:
1420; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
1421; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
1422; RV64IA-TSO-ZABHA-NEXT:    ret
1423  %1 = atomicrmw xchg ptr %a, i8 -1 release
1424  ret i8 %1
1425}
1426
1427define i8 @atomicrmw_xchg_minus_1_i8_acq_rel(ptr %a) nounwind {
1428; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1429; RV32I:       # %bb.0:
1430; RV32I-NEXT:    addi sp, sp, -16
1431; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1432; RV32I-NEXT:    li a1, 255
1433; RV32I-NEXT:    li a2, 4
1434; RV32I-NEXT:    call __atomic_exchange_1
1435; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1436; RV32I-NEXT:    addi sp, sp, 16
1437; RV32I-NEXT:    ret
1438;
1439; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1440; RV32IA-WMO:       # %bb.0:
1441; RV32IA-WMO-NEXT:    andi a1, a0, -4
1442; RV32IA-WMO-NEXT:    slli a0, a0, 3
1443; RV32IA-WMO-NEXT:    li a2, 255
1444; RV32IA-WMO-NEXT:    sll a2, a2, a0
1445; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a2, (a1)
1446; RV32IA-WMO-NEXT:    srl a0, a1, a0
1447; RV32IA-WMO-NEXT:    ret
1448;
1449; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1450; RV32IA-TSO:       # %bb.0:
1451; RV32IA-TSO-NEXT:    andi a1, a0, -4
1452; RV32IA-TSO-NEXT:    slli a0, a0, 3
1453; RV32IA-TSO-NEXT:    li a2, 255
1454; RV32IA-TSO-NEXT:    sll a2, a2, a0
1455; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
1456; RV32IA-TSO-NEXT:    srl a0, a1, a0
1457; RV32IA-TSO-NEXT:    ret
1458;
1459; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1460; RV64I:       # %bb.0:
1461; RV64I-NEXT:    addi sp, sp, -16
1462; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1463; RV64I-NEXT:    li a1, 255
1464; RV64I-NEXT:    li a2, 4
1465; RV64I-NEXT:    call __atomic_exchange_1
1466; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1467; RV64I-NEXT:    addi sp, sp, 16
1468; RV64I-NEXT:    ret
1469;
1470; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1471; RV64IA-WMO-NOZACAS:       # %bb.0:
1472; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
1473; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1474; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
1475; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
1476; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
1477; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
1478; RV64IA-WMO-NOZACAS-NEXT:    ret
1479;
1480; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1481; RV64IA-TSO-NOZACAS:       # %bb.0:
1482; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
1483; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1484; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
1485; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
1486; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
1487; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
1488; RV64IA-TSO-NOZACAS-NEXT:    ret
1489;
1490; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1491; RV64IA-WMO-ZACAS:       # %bb.0:
1492; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
1493; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1494; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
1495; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
1496; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
1497; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
1498; RV64IA-WMO-ZACAS-NEXT:    ret
1499;
1500; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1501; RV64IA-TSO-ZACAS:       # %bb.0:
1502; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
1503; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1504; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
1505; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
1506; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
1507; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
1508; RV64IA-TSO-ZACAS-NEXT:    ret
1509;
1510; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1511; RV64IA-WMO-ZABHA:       # %bb.0:
1512; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
1513; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aqrl a0, a1, (a0)
1514; RV64IA-WMO-ZABHA-NEXT:    ret
1515;
1516; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
1517; RV64IA-TSO-ZABHA:       # %bb.0:
1518; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
1519; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
1520; RV64IA-TSO-ZABHA-NEXT:    ret
1521  %1 = atomicrmw xchg ptr %a, i8 -1 acq_rel
1522  ret i8 %1
1523}
1524
1525define i8 @atomicrmw_xchg_minus_1_i8_seq_cst(ptr %a) nounwind {
1526; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1527; RV32I:       # %bb.0:
1528; RV32I-NEXT:    addi sp, sp, -16
1529; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1530; RV32I-NEXT:    li a1, 255
1531; RV32I-NEXT:    li a2, 5
1532; RV32I-NEXT:    call __atomic_exchange_1
1533; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1534; RV32I-NEXT:    addi sp, sp, 16
1535; RV32I-NEXT:    ret
1536;
1537; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1538; RV32IA-WMO:       # %bb.0:
1539; RV32IA-WMO-NEXT:    andi a1, a0, -4
1540; RV32IA-WMO-NEXT:    slli a0, a0, 3
1541; RV32IA-WMO-NEXT:    li a2, 255
1542; RV32IA-WMO-NEXT:    sll a2, a2, a0
1543; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a2, (a1)
1544; RV32IA-WMO-NEXT:    srl a0, a1, a0
1545; RV32IA-WMO-NEXT:    ret
1546;
1547; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1548; RV32IA-TSO:       # %bb.0:
1549; RV32IA-TSO-NEXT:    andi a1, a0, -4
1550; RV32IA-TSO-NEXT:    slli a0, a0, 3
1551; RV32IA-TSO-NEXT:    li a2, 255
1552; RV32IA-TSO-NEXT:    sll a2, a2, a0
1553; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
1554; RV32IA-TSO-NEXT:    srl a0, a1, a0
1555; RV32IA-TSO-NEXT:    ret
1556;
1557; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1558; RV64I:       # %bb.0:
1559; RV64I-NEXT:    addi sp, sp, -16
1560; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1561; RV64I-NEXT:    li a1, 255
1562; RV64I-NEXT:    li a2, 5
1563; RV64I-NEXT:    call __atomic_exchange_1
1564; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1565; RV64I-NEXT:    addi sp, sp, 16
1566; RV64I-NEXT:    ret
1567;
1568; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1569; RV64IA-WMO-NOZACAS:       # %bb.0:
1570; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
1571; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1572; RV64IA-WMO-NOZACAS-NEXT:    li a2, 255
1573; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
1574; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
1575; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
1576; RV64IA-WMO-NOZACAS-NEXT:    ret
1577;
1578; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1579; RV64IA-TSO-NOZACAS:       # %bb.0:
1580; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
1581; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1582; RV64IA-TSO-NOZACAS-NEXT:    li a2, 255
1583; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
1584; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
1585; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
1586; RV64IA-TSO-NOZACAS-NEXT:    ret
1587;
1588; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1589; RV64IA-WMO-ZACAS:       # %bb.0:
1590; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
1591; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1592; RV64IA-WMO-ZACAS-NEXT:    li a2, 255
1593; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
1594; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
1595; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
1596; RV64IA-WMO-ZACAS-NEXT:    ret
1597;
1598; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1599; RV64IA-TSO-ZACAS:       # %bb.0:
1600; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
1601; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1602; RV64IA-TSO-ZACAS-NEXT:    li a2, 255
1603; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
1604; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
1605; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
1606; RV64IA-TSO-ZACAS-NEXT:    ret
1607;
1608; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1609; RV64IA-WMO-ZABHA:       # %bb.0:
1610; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
1611; RV64IA-WMO-ZABHA-NEXT:    amoswap.b.aqrl a0, a1, (a0)
1612; RV64IA-WMO-ZABHA-NEXT:    ret
1613;
1614; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
1615; RV64IA-TSO-ZABHA:       # %bb.0:
1616; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
1617; RV64IA-TSO-ZABHA-NEXT:    amoswap.b a0, a1, (a0)
1618; RV64IA-TSO-ZABHA-NEXT:    ret
1619  %1 = atomicrmw xchg ptr %a, i8 -1 seq_cst
1620  ret i8 %1
1621}
1622
1623define i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind {
1624; RV32I-LABEL: atomicrmw_add_i8_monotonic:
1625; RV32I:       # %bb.0:
1626; RV32I-NEXT:    addi sp, sp, -16
1627; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1628; RV32I-NEXT:    li a2, 0
1629; RV32I-NEXT:    call __atomic_fetch_add_1
1630; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1631; RV32I-NEXT:    addi sp, sp, 16
1632; RV32I-NEXT:    ret
1633;
1634; RV32IA-LABEL: atomicrmw_add_i8_monotonic:
1635; RV32IA:       # %bb.0:
1636; RV32IA-NEXT:    andi a2, a0, -4
1637; RV32IA-NEXT:    slli a0, a0, 3
1638; RV32IA-NEXT:    li a3, 255
1639; RV32IA-NEXT:    andi a1, a1, 255
1640; RV32IA-NEXT:    sll a3, a3, a0
1641; RV32IA-NEXT:    sll a1, a1, a0
1642; RV32IA-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
1643; RV32IA-NEXT:    lr.w a4, (a2)
1644; RV32IA-NEXT:    add a5, a4, a1
1645; RV32IA-NEXT:    xor a5, a4, a5
1646; RV32IA-NEXT:    and a5, a5, a3
1647; RV32IA-NEXT:    xor a5, a4, a5
1648; RV32IA-NEXT:    sc.w a5, a5, (a2)
1649; RV32IA-NEXT:    bnez a5, .LBB15_1
1650; RV32IA-NEXT:  # %bb.2:
1651; RV32IA-NEXT:    srl a0, a4, a0
1652; RV32IA-NEXT:    ret
1653;
1654; RV64I-LABEL: atomicrmw_add_i8_monotonic:
1655; RV64I:       # %bb.0:
1656; RV64I-NEXT:    addi sp, sp, -16
1657; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1658; RV64I-NEXT:    li a2, 0
1659; RV64I-NEXT:    call __atomic_fetch_add_1
1660; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1661; RV64I-NEXT:    addi sp, sp, 16
1662; RV64I-NEXT:    ret
1663;
1664; RV64IA-NOZACAS-LABEL: atomicrmw_add_i8_monotonic:
1665; RV64IA-NOZACAS:       # %bb.0:
1666; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
1667; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
1668; RV64IA-NOZACAS-NEXT:    li a3, 255
1669; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
1670; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
1671; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
1672; RV64IA-NOZACAS-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
1673; RV64IA-NOZACAS-NEXT:    lr.w a4, (a2)
1674; RV64IA-NOZACAS-NEXT:    add a5, a4, a1
1675; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
1676; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
1677; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
1678; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
1679; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB15_1
1680; RV64IA-NOZACAS-NEXT:  # %bb.2:
1681; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
1682; RV64IA-NOZACAS-NEXT:    ret
1683;
1684; RV64IA-ZACAS-LABEL: atomicrmw_add_i8_monotonic:
1685; RV64IA-ZACAS:       # %bb.0:
1686; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
1687; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
1688; RV64IA-ZACAS-NEXT:    li a3, 255
1689; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
1690; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
1691; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
1692; RV64IA-ZACAS-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
1693; RV64IA-ZACAS-NEXT:    lr.w a4, (a2)
1694; RV64IA-ZACAS-NEXT:    add a5, a4, a1
1695; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
1696; RV64IA-ZACAS-NEXT:    and a5, a5, a3
1697; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
1698; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
1699; RV64IA-ZACAS-NEXT:    bnez a5, .LBB15_1
1700; RV64IA-ZACAS-NEXT:  # %bb.2:
1701; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
1702; RV64IA-ZACAS-NEXT:    ret
1703;
1704; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_monotonic:
1705; RV64IA-WMO-ZABHA:       # %bb.0:
1706; RV64IA-WMO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
1707; RV64IA-WMO-ZABHA-NEXT:    ret
1708;
1709; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_monotonic:
1710; RV64IA-TSO-ZABHA:       # %bb.0:
1711; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
1712; RV64IA-TSO-ZABHA-NEXT:    ret
1713  %1 = atomicrmw add ptr %a, i8 %b monotonic
1714  ret i8 %1
1715}
1716
1717define i8 @atomicrmw_add_i8_acquire(ptr %a, i8 %b) nounwind {
1718; RV32I-LABEL: atomicrmw_add_i8_acquire:
1719; RV32I:       # %bb.0:
1720; RV32I-NEXT:    addi sp, sp, -16
1721; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1722; RV32I-NEXT:    li a2, 2
1723; RV32I-NEXT:    call __atomic_fetch_add_1
1724; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1725; RV32I-NEXT:    addi sp, sp, 16
1726; RV32I-NEXT:    ret
1727;
1728; RV32IA-WMO-LABEL: atomicrmw_add_i8_acquire:
1729; RV32IA-WMO:       # %bb.0:
1730; RV32IA-WMO-NEXT:    andi a2, a0, -4
1731; RV32IA-WMO-NEXT:    slli a0, a0, 3
1732; RV32IA-WMO-NEXT:    li a3, 255
1733; RV32IA-WMO-NEXT:    andi a1, a1, 255
1734; RV32IA-WMO-NEXT:    sll a3, a3, a0
1735; RV32IA-WMO-NEXT:    sll a1, a1, a0
1736; RV32IA-WMO-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1737; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
1738; RV32IA-WMO-NEXT:    add a5, a4, a1
1739; RV32IA-WMO-NEXT:    xor a5, a4, a5
1740; RV32IA-WMO-NEXT:    and a5, a5, a3
1741; RV32IA-WMO-NEXT:    xor a5, a4, a5
1742; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
1743; RV32IA-WMO-NEXT:    bnez a5, .LBB16_1
1744; RV32IA-WMO-NEXT:  # %bb.2:
1745; RV32IA-WMO-NEXT:    srl a0, a4, a0
1746; RV32IA-WMO-NEXT:    ret
1747;
1748; RV32IA-TSO-LABEL: atomicrmw_add_i8_acquire:
1749; RV32IA-TSO:       # %bb.0:
1750; RV32IA-TSO-NEXT:    andi a2, a0, -4
1751; RV32IA-TSO-NEXT:    slli a0, a0, 3
1752; RV32IA-TSO-NEXT:    li a3, 255
1753; RV32IA-TSO-NEXT:    andi a1, a1, 255
1754; RV32IA-TSO-NEXT:    sll a3, a3, a0
1755; RV32IA-TSO-NEXT:    sll a1, a1, a0
1756; RV32IA-TSO-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1757; RV32IA-TSO-NEXT:    lr.w a4, (a2)
1758; RV32IA-TSO-NEXT:    add a5, a4, a1
1759; RV32IA-TSO-NEXT:    xor a5, a4, a5
1760; RV32IA-TSO-NEXT:    and a5, a5, a3
1761; RV32IA-TSO-NEXT:    xor a5, a4, a5
1762; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
1763; RV32IA-TSO-NEXT:    bnez a5, .LBB16_1
1764; RV32IA-TSO-NEXT:  # %bb.2:
1765; RV32IA-TSO-NEXT:    srl a0, a4, a0
1766; RV32IA-TSO-NEXT:    ret
1767;
1768; RV64I-LABEL: atomicrmw_add_i8_acquire:
1769; RV64I:       # %bb.0:
1770; RV64I-NEXT:    addi sp, sp, -16
1771; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1772; RV64I-NEXT:    li a2, 2
1773; RV64I-NEXT:    call __atomic_fetch_add_1
1774; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1775; RV64I-NEXT:    addi sp, sp, 16
1776; RV64I-NEXT:    ret
1777;
1778; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_acquire:
1779; RV64IA-WMO-NOZACAS:       # %bb.0:
1780; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
1781; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1782; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
1783; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
1784; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
1785; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
1786; RV64IA-WMO-NOZACAS-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1787; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
1788; RV64IA-WMO-NOZACAS-NEXT:    add a5, a4, a1
1789; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
1790; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
1791; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
1792; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
1793; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB16_1
1794; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
1795; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
1796; RV64IA-WMO-NOZACAS-NEXT:    ret
1797;
1798; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_acquire:
1799; RV64IA-TSO-NOZACAS:       # %bb.0:
1800; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
1801; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1802; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
1803; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
1804; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
1805; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
1806; RV64IA-TSO-NOZACAS-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1807; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
1808; RV64IA-TSO-NOZACAS-NEXT:    add a5, a4, a1
1809; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
1810; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
1811; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
1812; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
1813; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB16_1
1814; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
1815; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
1816; RV64IA-TSO-NOZACAS-NEXT:    ret
1817;
1818; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_acquire:
1819; RV64IA-WMO-ZACAS:       # %bb.0:
1820; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
1821; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1822; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
1823; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
1824; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
1825; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
1826; RV64IA-WMO-ZACAS-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1827; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
1828; RV64IA-WMO-ZACAS-NEXT:    add a5, a4, a1
1829; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
1830; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
1831; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
1832; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
1833; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB16_1
1834; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
1835; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
1836; RV64IA-WMO-ZACAS-NEXT:    ret
1837;
1838; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_acquire:
1839; RV64IA-TSO-ZACAS:       # %bb.0:
1840; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
1841; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1842; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
1843; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
1844; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
1845; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
1846; RV64IA-TSO-ZACAS-NEXT:  .LBB16_1: # =>This Inner Loop Header: Depth=1
1847; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
1848; RV64IA-TSO-ZACAS-NEXT:    add a5, a4, a1
1849; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
1850; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
1851; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
1852; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
1853; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB16_1
1854; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
1855; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
1856; RV64IA-TSO-ZACAS-NEXT:    ret
1857;
1858; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_acquire:
1859; RV64IA-WMO-ZABHA:       # %bb.0:
1860; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.aq a0, a1, (a0)
1861; RV64IA-WMO-ZABHA-NEXT:    ret
1862;
1863; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_acquire:
1864; RV64IA-TSO-ZABHA:       # %bb.0:
1865; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
1866; RV64IA-TSO-ZABHA-NEXT:    ret
1867  %1 = atomicrmw add ptr %a, i8 %b acquire
1868  ret i8 %1
1869}
1870
1871define i8 @atomicrmw_add_i8_release(ptr %a, i8 %b) nounwind {
1872; RV32I-LABEL: atomicrmw_add_i8_release:
1873; RV32I:       # %bb.0:
1874; RV32I-NEXT:    addi sp, sp, -16
1875; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1876; RV32I-NEXT:    li a2, 3
1877; RV32I-NEXT:    call __atomic_fetch_add_1
1878; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1879; RV32I-NEXT:    addi sp, sp, 16
1880; RV32I-NEXT:    ret
1881;
1882; RV32IA-WMO-LABEL: atomicrmw_add_i8_release:
1883; RV32IA-WMO:       # %bb.0:
1884; RV32IA-WMO-NEXT:    andi a2, a0, -4
1885; RV32IA-WMO-NEXT:    slli a0, a0, 3
1886; RV32IA-WMO-NEXT:    li a3, 255
1887; RV32IA-WMO-NEXT:    andi a1, a1, 255
1888; RV32IA-WMO-NEXT:    sll a3, a3, a0
1889; RV32IA-WMO-NEXT:    sll a1, a1, a0
1890; RV32IA-WMO-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
1891; RV32IA-WMO-NEXT:    lr.w a4, (a2)
1892; RV32IA-WMO-NEXT:    add a5, a4, a1
1893; RV32IA-WMO-NEXT:    xor a5, a4, a5
1894; RV32IA-WMO-NEXT:    and a5, a5, a3
1895; RV32IA-WMO-NEXT:    xor a5, a4, a5
1896; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
1897; RV32IA-WMO-NEXT:    bnez a5, .LBB17_1
1898; RV32IA-WMO-NEXT:  # %bb.2:
1899; RV32IA-WMO-NEXT:    srl a0, a4, a0
1900; RV32IA-WMO-NEXT:    ret
1901;
1902; RV32IA-TSO-LABEL: atomicrmw_add_i8_release:
1903; RV32IA-TSO:       # %bb.0:
1904; RV32IA-TSO-NEXT:    andi a2, a0, -4
1905; RV32IA-TSO-NEXT:    slli a0, a0, 3
1906; RV32IA-TSO-NEXT:    li a3, 255
1907; RV32IA-TSO-NEXT:    andi a1, a1, 255
1908; RV32IA-TSO-NEXT:    sll a3, a3, a0
1909; RV32IA-TSO-NEXT:    sll a1, a1, a0
1910; RV32IA-TSO-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
1911; RV32IA-TSO-NEXT:    lr.w a4, (a2)
1912; RV32IA-TSO-NEXT:    add a5, a4, a1
1913; RV32IA-TSO-NEXT:    xor a5, a4, a5
1914; RV32IA-TSO-NEXT:    and a5, a5, a3
1915; RV32IA-TSO-NEXT:    xor a5, a4, a5
1916; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
1917; RV32IA-TSO-NEXT:    bnez a5, .LBB17_1
1918; RV32IA-TSO-NEXT:  # %bb.2:
1919; RV32IA-TSO-NEXT:    srl a0, a4, a0
1920; RV32IA-TSO-NEXT:    ret
1921;
1922; RV64I-LABEL: atomicrmw_add_i8_release:
1923; RV64I:       # %bb.0:
1924; RV64I-NEXT:    addi sp, sp, -16
1925; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1926; RV64I-NEXT:    li a2, 3
1927; RV64I-NEXT:    call __atomic_fetch_add_1
1928; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1929; RV64I-NEXT:    addi sp, sp, 16
1930; RV64I-NEXT:    ret
1931;
1932; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_release:
1933; RV64IA-WMO-NOZACAS:       # %bb.0:
1934; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
1935; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
1936; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
1937; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
1938; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
1939; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
1940; RV64IA-WMO-NOZACAS-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
1941; RV64IA-WMO-NOZACAS-NEXT:    lr.w a4, (a2)
1942; RV64IA-WMO-NOZACAS-NEXT:    add a5, a4, a1
1943; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
1944; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
1945; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
1946; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
1947; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB17_1
1948; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
1949; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
1950; RV64IA-WMO-NOZACAS-NEXT:    ret
1951;
1952; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_release:
1953; RV64IA-TSO-NOZACAS:       # %bb.0:
1954; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
1955; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
1956; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
1957; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
1958; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
1959; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
1960; RV64IA-TSO-NOZACAS-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
1961; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
1962; RV64IA-TSO-NOZACAS-NEXT:    add a5, a4, a1
1963; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
1964; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
1965; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
1966; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
1967; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB17_1
1968; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
1969; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
1970; RV64IA-TSO-NOZACAS-NEXT:    ret
1971;
1972; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_release:
1973; RV64IA-WMO-ZACAS:       # %bb.0:
1974; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
1975; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
1976; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
1977; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
1978; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
1979; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
1980; RV64IA-WMO-ZACAS-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
1981; RV64IA-WMO-ZACAS-NEXT:    lr.w a4, (a2)
1982; RV64IA-WMO-ZACAS-NEXT:    add a5, a4, a1
1983; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
1984; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
1985; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
1986; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
1987; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB17_1
1988; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
1989; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
1990; RV64IA-WMO-ZACAS-NEXT:    ret
1991;
1992; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_release:
1993; RV64IA-TSO-ZACAS:       # %bb.0:
1994; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
1995; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
1996; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
1997; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
1998; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
1999; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
2000; RV64IA-TSO-ZACAS-NEXT:  .LBB17_1: # =>This Inner Loop Header: Depth=1
2001; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
2002; RV64IA-TSO-ZACAS-NEXT:    add a5, a4, a1
2003; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2004; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
2005; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2006; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
2007; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB17_1
2008; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
2009; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
2010; RV64IA-TSO-ZACAS-NEXT:    ret
2011;
2012; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_release:
2013; RV64IA-WMO-ZABHA:       # %bb.0:
2014; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.rl a0, a1, (a0)
2015; RV64IA-WMO-ZABHA-NEXT:    ret
2016;
2017; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_release:
2018; RV64IA-TSO-ZABHA:       # %bb.0:
2019; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2020; RV64IA-TSO-ZABHA-NEXT:    ret
2021  %1 = atomicrmw add ptr %a, i8 %b release
2022  ret i8 %1
2023}
2024
2025define i8 @atomicrmw_add_i8_acq_rel(ptr %a, i8 %b) nounwind {
2026; RV32I-LABEL: atomicrmw_add_i8_acq_rel:
2027; RV32I:       # %bb.0:
2028; RV32I-NEXT:    addi sp, sp, -16
2029; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2030; RV32I-NEXT:    li a2, 4
2031; RV32I-NEXT:    call __atomic_fetch_add_1
2032; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2033; RV32I-NEXT:    addi sp, sp, 16
2034; RV32I-NEXT:    ret
2035;
2036; RV32IA-WMO-LABEL: atomicrmw_add_i8_acq_rel:
2037; RV32IA-WMO:       # %bb.0:
2038; RV32IA-WMO-NEXT:    andi a2, a0, -4
2039; RV32IA-WMO-NEXT:    slli a0, a0, 3
2040; RV32IA-WMO-NEXT:    li a3, 255
2041; RV32IA-WMO-NEXT:    andi a1, a1, 255
2042; RV32IA-WMO-NEXT:    sll a3, a3, a0
2043; RV32IA-WMO-NEXT:    sll a1, a1, a0
2044; RV32IA-WMO-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
2045; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
2046; RV32IA-WMO-NEXT:    add a5, a4, a1
2047; RV32IA-WMO-NEXT:    xor a5, a4, a5
2048; RV32IA-WMO-NEXT:    and a5, a5, a3
2049; RV32IA-WMO-NEXT:    xor a5, a4, a5
2050; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
2051; RV32IA-WMO-NEXT:    bnez a5, .LBB18_1
2052; RV32IA-WMO-NEXT:  # %bb.2:
2053; RV32IA-WMO-NEXT:    srl a0, a4, a0
2054; RV32IA-WMO-NEXT:    ret
2055;
2056; RV32IA-TSO-LABEL: atomicrmw_add_i8_acq_rel:
2057; RV32IA-TSO:       # %bb.0:
2058; RV32IA-TSO-NEXT:    andi a2, a0, -4
2059; RV32IA-TSO-NEXT:    slli a0, a0, 3
2060; RV32IA-TSO-NEXT:    li a3, 255
2061; RV32IA-TSO-NEXT:    andi a1, a1, 255
2062; RV32IA-TSO-NEXT:    sll a3, a3, a0
2063; RV32IA-TSO-NEXT:    sll a1, a1, a0
2064; RV32IA-TSO-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
2065; RV32IA-TSO-NEXT:    lr.w a4, (a2)
2066; RV32IA-TSO-NEXT:    add a5, a4, a1
2067; RV32IA-TSO-NEXT:    xor a5, a4, a5
2068; RV32IA-TSO-NEXT:    and a5, a5, a3
2069; RV32IA-TSO-NEXT:    xor a5, a4, a5
2070; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
2071; RV32IA-TSO-NEXT:    bnez a5, .LBB18_1
2072; RV32IA-TSO-NEXT:  # %bb.2:
2073; RV32IA-TSO-NEXT:    srl a0, a4, a0
2074; RV32IA-TSO-NEXT:    ret
2075;
2076; RV64I-LABEL: atomicrmw_add_i8_acq_rel:
2077; RV64I:       # %bb.0:
2078; RV64I-NEXT:    addi sp, sp, -16
2079; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2080; RV64I-NEXT:    li a2, 4
2081; RV64I-NEXT:    call __atomic_fetch_add_1
2082; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2083; RV64I-NEXT:    addi sp, sp, 16
2084; RV64I-NEXT:    ret
2085;
2086; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_acq_rel:
2087; RV64IA-WMO-NOZACAS:       # %bb.0:
2088; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
2089; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
2090; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
2091; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
2092; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
2093; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
2094; RV64IA-WMO-NOZACAS-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
2095; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
2096; RV64IA-WMO-NOZACAS-NEXT:    add a5, a4, a1
2097; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2098; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
2099; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2100; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2101; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB18_1
2102; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
2103; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
2104; RV64IA-WMO-NOZACAS-NEXT:    ret
2105;
2106; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_acq_rel:
2107; RV64IA-TSO-NOZACAS:       # %bb.0:
2108; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
2109; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
2110; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
2111; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
2112; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
2113; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
2114; RV64IA-TSO-NOZACAS-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
2115; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
2116; RV64IA-TSO-NOZACAS-NEXT:    add a5, a4, a1
2117; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2118; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
2119; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2120; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
2121; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB18_1
2122; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
2123; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
2124; RV64IA-TSO-NOZACAS-NEXT:    ret
2125;
2126; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_acq_rel:
2127; RV64IA-WMO-ZACAS:       # %bb.0:
2128; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
2129; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
2130; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
2131; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
2132; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
2133; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
2134; RV64IA-WMO-ZACAS-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
2135; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
2136; RV64IA-WMO-ZACAS-NEXT:    add a5, a4, a1
2137; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2138; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
2139; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2140; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2141; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB18_1
2142; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
2143; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
2144; RV64IA-WMO-ZACAS-NEXT:    ret
2145;
2146; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_acq_rel:
2147; RV64IA-TSO-ZACAS:       # %bb.0:
2148; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
2149; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
2150; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
2151; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
2152; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
2153; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
2154; RV64IA-TSO-ZACAS-NEXT:  .LBB18_1: # =>This Inner Loop Header: Depth=1
2155; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
2156; RV64IA-TSO-ZACAS-NEXT:    add a5, a4, a1
2157; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2158; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
2159; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2160; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
2161; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB18_1
2162; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
2163; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
2164; RV64IA-TSO-ZACAS-NEXT:    ret
2165;
2166; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_acq_rel:
2167; RV64IA-WMO-ZABHA:       # %bb.0:
2168; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.aqrl a0, a1, (a0)
2169; RV64IA-WMO-ZABHA-NEXT:    ret
2170;
2171; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_acq_rel:
2172; RV64IA-TSO-ZABHA:       # %bb.0:
2173; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2174; RV64IA-TSO-ZABHA-NEXT:    ret
2175  %1 = atomicrmw add ptr %a, i8 %b acq_rel
2176  ret i8 %1
2177}
2178
2179define i8 @atomicrmw_add_i8_seq_cst(ptr %a, i8 %b) nounwind {
2180; RV32I-LABEL: atomicrmw_add_i8_seq_cst:
2181; RV32I:       # %bb.0:
2182; RV32I-NEXT:    addi sp, sp, -16
2183; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2184; RV32I-NEXT:    li a2, 5
2185; RV32I-NEXT:    call __atomic_fetch_add_1
2186; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2187; RV32I-NEXT:    addi sp, sp, 16
2188; RV32I-NEXT:    ret
2189;
2190; RV32IA-LABEL: atomicrmw_add_i8_seq_cst:
2191; RV32IA:       # %bb.0:
2192; RV32IA-NEXT:    andi a2, a0, -4
2193; RV32IA-NEXT:    slli a0, a0, 3
2194; RV32IA-NEXT:    li a3, 255
2195; RV32IA-NEXT:    andi a1, a1, 255
2196; RV32IA-NEXT:    sll a3, a3, a0
2197; RV32IA-NEXT:    sll a1, a1, a0
2198; RV32IA-NEXT:  .LBB19_1: # =>This Inner Loop Header: Depth=1
2199; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
2200; RV32IA-NEXT:    add a5, a4, a1
2201; RV32IA-NEXT:    xor a5, a4, a5
2202; RV32IA-NEXT:    and a5, a5, a3
2203; RV32IA-NEXT:    xor a5, a4, a5
2204; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
2205; RV32IA-NEXT:    bnez a5, .LBB19_1
2206; RV32IA-NEXT:  # %bb.2:
2207; RV32IA-NEXT:    srl a0, a4, a0
2208; RV32IA-NEXT:    ret
2209;
2210; RV64I-LABEL: atomicrmw_add_i8_seq_cst:
2211; RV64I:       # %bb.0:
2212; RV64I-NEXT:    addi sp, sp, -16
2213; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2214; RV64I-NEXT:    li a2, 5
2215; RV64I-NEXT:    call __atomic_fetch_add_1
2216; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2217; RV64I-NEXT:    addi sp, sp, 16
2218; RV64I-NEXT:    ret
2219;
2220; RV64IA-NOZACAS-LABEL: atomicrmw_add_i8_seq_cst:
2221; RV64IA-NOZACAS:       # %bb.0:
2222; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
2223; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
2224; RV64IA-NOZACAS-NEXT:    li a3, 255
2225; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
2226; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
2227; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
2228; RV64IA-NOZACAS-NEXT:  .LBB19_1: # =>This Inner Loop Header: Depth=1
2229; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
2230; RV64IA-NOZACAS-NEXT:    add a5, a4, a1
2231; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
2232; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
2233; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
2234; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2235; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB19_1
2236; RV64IA-NOZACAS-NEXT:  # %bb.2:
2237; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
2238; RV64IA-NOZACAS-NEXT:    ret
2239;
2240; RV64IA-ZACAS-LABEL: atomicrmw_add_i8_seq_cst:
2241; RV64IA-ZACAS:       # %bb.0:
2242; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
2243; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
2244; RV64IA-ZACAS-NEXT:    li a3, 255
2245; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
2246; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
2247; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
2248; RV64IA-ZACAS-NEXT:  .LBB19_1: # =>This Inner Loop Header: Depth=1
2249; RV64IA-ZACAS-NEXT:    lr.w.aqrl a4, (a2)
2250; RV64IA-ZACAS-NEXT:    add a5, a4, a1
2251; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
2252; RV64IA-ZACAS-NEXT:    and a5, a5, a3
2253; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
2254; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2255; RV64IA-ZACAS-NEXT:    bnez a5, .LBB19_1
2256; RV64IA-ZACAS-NEXT:  # %bb.2:
2257; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
2258; RV64IA-ZACAS-NEXT:    ret
2259;
2260; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_seq_cst:
2261; RV64IA-WMO-ZABHA:       # %bb.0:
2262; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.aqrl a0, a1, (a0)
2263; RV64IA-WMO-ZABHA-NEXT:    ret
2264;
2265; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_seq_cst:
2266; RV64IA-TSO-ZABHA:       # %bb.0:
2267; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2268; RV64IA-TSO-ZABHA-NEXT:    ret
2269  %1 = atomicrmw add ptr %a, i8 %b seq_cst
2270  ret i8 %1
2271}
2272
2273define i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind {
2274; RV32I-LABEL: atomicrmw_sub_i8_monotonic:
2275; RV32I:       # %bb.0:
2276; RV32I-NEXT:    addi sp, sp, -16
2277; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2278; RV32I-NEXT:    li a2, 0
2279; RV32I-NEXT:    call __atomic_fetch_sub_1
2280; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2281; RV32I-NEXT:    addi sp, sp, 16
2282; RV32I-NEXT:    ret
2283;
2284; RV32IA-LABEL: atomicrmw_sub_i8_monotonic:
2285; RV32IA:       # %bb.0:
2286; RV32IA-NEXT:    andi a2, a0, -4
2287; RV32IA-NEXT:    slli a0, a0, 3
2288; RV32IA-NEXT:    li a3, 255
2289; RV32IA-NEXT:    andi a1, a1, 255
2290; RV32IA-NEXT:    sll a3, a3, a0
2291; RV32IA-NEXT:    sll a1, a1, a0
2292; RV32IA-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
2293; RV32IA-NEXT:    lr.w a4, (a2)
2294; RV32IA-NEXT:    sub a5, a4, a1
2295; RV32IA-NEXT:    xor a5, a4, a5
2296; RV32IA-NEXT:    and a5, a5, a3
2297; RV32IA-NEXT:    xor a5, a4, a5
2298; RV32IA-NEXT:    sc.w a5, a5, (a2)
2299; RV32IA-NEXT:    bnez a5, .LBB20_1
2300; RV32IA-NEXT:  # %bb.2:
2301; RV32IA-NEXT:    srl a0, a4, a0
2302; RV32IA-NEXT:    ret
2303;
2304; RV64I-LABEL: atomicrmw_sub_i8_monotonic:
2305; RV64I:       # %bb.0:
2306; RV64I-NEXT:    addi sp, sp, -16
2307; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2308; RV64I-NEXT:    li a2, 0
2309; RV64I-NEXT:    call __atomic_fetch_sub_1
2310; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2311; RV64I-NEXT:    addi sp, sp, 16
2312; RV64I-NEXT:    ret
2313;
2314; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i8_monotonic:
2315; RV64IA-NOZACAS:       # %bb.0:
2316; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
2317; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
2318; RV64IA-NOZACAS-NEXT:    li a3, 255
2319; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
2320; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
2321; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
2322; RV64IA-NOZACAS-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
2323; RV64IA-NOZACAS-NEXT:    lr.w a4, (a2)
2324; RV64IA-NOZACAS-NEXT:    sub a5, a4, a1
2325; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
2326; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
2327; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
2328; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
2329; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB20_1
2330; RV64IA-NOZACAS-NEXT:  # %bb.2:
2331; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
2332; RV64IA-NOZACAS-NEXT:    ret
2333;
2334; RV64IA-ZACAS-LABEL: atomicrmw_sub_i8_monotonic:
2335; RV64IA-ZACAS:       # %bb.0:
2336; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
2337; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
2338; RV64IA-ZACAS-NEXT:    li a3, 255
2339; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
2340; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
2341; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
2342; RV64IA-ZACAS-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
2343; RV64IA-ZACAS-NEXT:    lr.w a4, (a2)
2344; RV64IA-ZACAS-NEXT:    sub a5, a4, a1
2345; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
2346; RV64IA-ZACAS-NEXT:    and a5, a5, a3
2347; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
2348; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
2349; RV64IA-ZACAS-NEXT:    bnez a5, .LBB20_1
2350; RV64IA-ZACAS-NEXT:  # %bb.2:
2351; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
2352; RV64IA-ZACAS-NEXT:    ret
2353;
2354; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_monotonic:
2355; RV64IA-WMO-ZABHA:       # %bb.0:
2356; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
2357; RV64IA-WMO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2358; RV64IA-WMO-ZABHA-NEXT:    ret
2359;
2360; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_monotonic:
2361; RV64IA-TSO-ZABHA:       # %bb.0:
2362; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
2363; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2364; RV64IA-TSO-ZABHA-NEXT:    ret
2365  %1 = atomicrmw sub ptr %a, i8 %b monotonic
2366  ret i8 %1
2367}
2368
2369define i8 @atomicrmw_sub_i8_acquire(ptr %a, i8 %b) nounwind {
2370; RV32I-LABEL: atomicrmw_sub_i8_acquire:
2371; RV32I:       # %bb.0:
2372; RV32I-NEXT:    addi sp, sp, -16
2373; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2374; RV32I-NEXT:    li a2, 2
2375; RV32I-NEXT:    call __atomic_fetch_sub_1
2376; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2377; RV32I-NEXT:    addi sp, sp, 16
2378; RV32I-NEXT:    ret
2379;
2380; RV32IA-WMO-LABEL: atomicrmw_sub_i8_acquire:
2381; RV32IA-WMO:       # %bb.0:
2382; RV32IA-WMO-NEXT:    andi a2, a0, -4
2383; RV32IA-WMO-NEXT:    slli a0, a0, 3
2384; RV32IA-WMO-NEXT:    li a3, 255
2385; RV32IA-WMO-NEXT:    andi a1, a1, 255
2386; RV32IA-WMO-NEXT:    sll a3, a3, a0
2387; RV32IA-WMO-NEXT:    sll a1, a1, a0
2388; RV32IA-WMO-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
2389; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
2390; RV32IA-WMO-NEXT:    sub a5, a4, a1
2391; RV32IA-WMO-NEXT:    xor a5, a4, a5
2392; RV32IA-WMO-NEXT:    and a5, a5, a3
2393; RV32IA-WMO-NEXT:    xor a5, a4, a5
2394; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
2395; RV32IA-WMO-NEXT:    bnez a5, .LBB21_1
2396; RV32IA-WMO-NEXT:  # %bb.2:
2397; RV32IA-WMO-NEXT:    srl a0, a4, a0
2398; RV32IA-WMO-NEXT:    ret
2399;
2400; RV32IA-TSO-LABEL: atomicrmw_sub_i8_acquire:
2401; RV32IA-TSO:       # %bb.0:
2402; RV32IA-TSO-NEXT:    andi a2, a0, -4
2403; RV32IA-TSO-NEXT:    slli a0, a0, 3
2404; RV32IA-TSO-NEXT:    li a3, 255
2405; RV32IA-TSO-NEXT:    andi a1, a1, 255
2406; RV32IA-TSO-NEXT:    sll a3, a3, a0
2407; RV32IA-TSO-NEXT:    sll a1, a1, a0
2408; RV32IA-TSO-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
2409; RV32IA-TSO-NEXT:    lr.w a4, (a2)
2410; RV32IA-TSO-NEXT:    sub a5, a4, a1
2411; RV32IA-TSO-NEXT:    xor a5, a4, a5
2412; RV32IA-TSO-NEXT:    and a5, a5, a3
2413; RV32IA-TSO-NEXT:    xor a5, a4, a5
2414; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
2415; RV32IA-TSO-NEXT:    bnez a5, .LBB21_1
2416; RV32IA-TSO-NEXT:  # %bb.2:
2417; RV32IA-TSO-NEXT:    srl a0, a4, a0
2418; RV32IA-TSO-NEXT:    ret
2419;
2420; RV64I-LABEL: atomicrmw_sub_i8_acquire:
2421; RV64I:       # %bb.0:
2422; RV64I-NEXT:    addi sp, sp, -16
2423; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2424; RV64I-NEXT:    li a2, 2
2425; RV64I-NEXT:    call __atomic_fetch_sub_1
2426; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2427; RV64I-NEXT:    addi sp, sp, 16
2428; RV64I-NEXT:    ret
2429;
2430; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_acquire:
2431; RV64IA-WMO-NOZACAS:       # %bb.0:
2432; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
2433; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
2434; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
2435; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
2436; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
2437; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
2438; RV64IA-WMO-NOZACAS-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
2439; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
2440; RV64IA-WMO-NOZACAS-NEXT:    sub a5, a4, a1
2441; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2442; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
2443; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2444; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
2445; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB21_1
2446; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
2447; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
2448; RV64IA-WMO-NOZACAS-NEXT:    ret
2449;
2450; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_acquire:
2451; RV64IA-TSO-NOZACAS:       # %bb.0:
2452; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
2453; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
2454; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
2455; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
2456; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
2457; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
2458; RV64IA-TSO-NOZACAS-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
2459; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
2460; RV64IA-TSO-NOZACAS-NEXT:    sub a5, a4, a1
2461; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2462; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
2463; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2464; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
2465; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB21_1
2466; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
2467; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
2468; RV64IA-TSO-NOZACAS-NEXT:    ret
2469;
2470; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_acquire:
2471; RV64IA-WMO-ZACAS:       # %bb.0:
2472; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
2473; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
2474; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
2475; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
2476; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
2477; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
2478; RV64IA-WMO-ZACAS-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
2479; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
2480; RV64IA-WMO-ZACAS-NEXT:    sub a5, a4, a1
2481; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2482; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
2483; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2484; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
2485; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB21_1
2486; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
2487; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
2488; RV64IA-WMO-ZACAS-NEXT:    ret
2489;
2490; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_acquire:
2491; RV64IA-TSO-ZACAS:       # %bb.0:
2492; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
2493; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
2494; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
2495; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
2496; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
2497; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
2498; RV64IA-TSO-ZACAS-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
2499; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
2500; RV64IA-TSO-ZACAS-NEXT:    sub a5, a4, a1
2501; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2502; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
2503; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2504; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
2505; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB21_1
2506; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
2507; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
2508; RV64IA-TSO-ZACAS-NEXT:    ret
2509;
2510; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_acquire:
2511; RV64IA-WMO-ZABHA:       # %bb.0:
2512; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
2513; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.aq a0, a1, (a0)
2514; RV64IA-WMO-ZABHA-NEXT:    ret
2515;
2516; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_acquire:
2517; RV64IA-TSO-ZABHA:       # %bb.0:
2518; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
2519; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2520; RV64IA-TSO-ZABHA-NEXT:    ret
2521  %1 = atomicrmw sub ptr %a, i8 %b acquire
2522  ret i8 %1
2523}
2524
2525define i8 @atomicrmw_sub_i8_release(ptr %a, i8 %b) nounwind {
2526; RV32I-LABEL: atomicrmw_sub_i8_release:
2527; RV32I:       # %bb.0:
2528; RV32I-NEXT:    addi sp, sp, -16
2529; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2530; RV32I-NEXT:    li a2, 3
2531; RV32I-NEXT:    call __atomic_fetch_sub_1
2532; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2533; RV32I-NEXT:    addi sp, sp, 16
2534; RV32I-NEXT:    ret
2535;
2536; RV32IA-WMO-LABEL: atomicrmw_sub_i8_release:
2537; RV32IA-WMO:       # %bb.0:
2538; RV32IA-WMO-NEXT:    andi a2, a0, -4
2539; RV32IA-WMO-NEXT:    slli a0, a0, 3
2540; RV32IA-WMO-NEXT:    li a3, 255
2541; RV32IA-WMO-NEXT:    andi a1, a1, 255
2542; RV32IA-WMO-NEXT:    sll a3, a3, a0
2543; RV32IA-WMO-NEXT:    sll a1, a1, a0
2544; RV32IA-WMO-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
2545; RV32IA-WMO-NEXT:    lr.w a4, (a2)
2546; RV32IA-WMO-NEXT:    sub a5, a4, a1
2547; RV32IA-WMO-NEXT:    xor a5, a4, a5
2548; RV32IA-WMO-NEXT:    and a5, a5, a3
2549; RV32IA-WMO-NEXT:    xor a5, a4, a5
2550; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
2551; RV32IA-WMO-NEXT:    bnez a5, .LBB22_1
2552; RV32IA-WMO-NEXT:  # %bb.2:
2553; RV32IA-WMO-NEXT:    srl a0, a4, a0
2554; RV32IA-WMO-NEXT:    ret
2555;
2556; RV32IA-TSO-LABEL: atomicrmw_sub_i8_release:
2557; RV32IA-TSO:       # %bb.0:
2558; RV32IA-TSO-NEXT:    andi a2, a0, -4
2559; RV32IA-TSO-NEXT:    slli a0, a0, 3
2560; RV32IA-TSO-NEXT:    li a3, 255
2561; RV32IA-TSO-NEXT:    andi a1, a1, 255
2562; RV32IA-TSO-NEXT:    sll a3, a3, a0
2563; RV32IA-TSO-NEXT:    sll a1, a1, a0
2564; RV32IA-TSO-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
2565; RV32IA-TSO-NEXT:    lr.w a4, (a2)
2566; RV32IA-TSO-NEXT:    sub a5, a4, a1
2567; RV32IA-TSO-NEXT:    xor a5, a4, a5
2568; RV32IA-TSO-NEXT:    and a5, a5, a3
2569; RV32IA-TSO-NEXT:    xor a5, a4, a5
2570; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
2571; RV32IA-TSO-NEXT:    bnez a5, .LBB22_1
2572; RV32IA-TSO-NEXT:  # %bb.2:
2573; RV32IA-TSO-NEXT:    srl a0, a4, a0
2574; RV32IA-TSO-NEXT:    ret
2575;
2576; RV64I-LABEL: atomicrmw_sub_i8_release:
2577; RV64I:       # %bb.0:
2578; RV64I-NEXT:    addi sp, sp, -16
2579; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2580; RV64I-NEXT:    li a2, 3
2581; RV64I-NEXT:    call __atomic_fetch_sub_1
2582; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2583; RV64I-NEXT:    addi sp, sp, 16
2584; RV64I-NEXT:    ret
2585;
2586; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_release:
2587; RV64IA-WMO-NOZACAS:       # %bb.0:
2588; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
2589; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
2590; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
2591; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
2592; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
2593; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
2594; RV64IA-WMO-NOZACAS-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
2595; RV64IA-WMO-NOZACAS-NEXT:    lr.w a4, (a2)
2596; RV64IA-WMO-NOZACAS-NEXT:    sub a5, a4, a1
2597; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2598; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
2599; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2600; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2601; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB22_1
2602; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
2603; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
2604; RV64IA-WMO-NOZACAS-NEXT:    ret
2605;
2606; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_release:
2607; RV64IA-TSO-NOZACAS:       # %bb.0:
2608; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
2609; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
2610; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
2611; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
2612; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
2613; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
2614; RV64IA-TSO-NOZACAS-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
2615; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
2616; RV64IA-TSO-NOZACAS-NEXT:    sub a5, a4, a1
2617; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2618; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
2619; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2620; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
2621; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB22_1
2622; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
2623; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
2624; RV64IA-TSO-NOZACAS-NEXT:    ret
2625;
2626; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_release:
2627; RV64IA-WMO-ZACAS:       # %bb.0:
2628; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
2629; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
2630; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
2631; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
2632; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
2633; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
2634; RV64IA-WMO-ZACAS-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
2635; RV64IA-WMO-ZACAS-NEXT:    lr.w a4, (a2)
2636; RV64IA-WMO-ZACAS-NEXT:    sub a5, a4, a1
2637; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2638; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
2639; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2640; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2641; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB22_1
2642; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
2643; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
2644; RV64IA-WMO-ZACAS-NEXT:    ret
2645;
2646; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_release:
2647; RV64IA-TSO-ZACAS:       # %bb.0:
2648; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
2649; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
2650; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
2651; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
2652; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
2653; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
2654; RV64IA-TSO-ZACAS-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
2655; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
2656; RV64IA-TSO-ZACAS-NEXT:    sub a5, a4, a1
2657; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2658; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
2659; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2660; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
2661; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB22_1
2662; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
2663; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
2664; RV64IA-TSO-ZACAS-NEXT:    ret
2665;
2666; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_release:
2667; RV64IA-WMO-ZABHA:       # %bb.0:
2668; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
2669; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.rl a0, a1, (a0)
2670; RV64IA-WMO-ZABHA-NEXT:    ret
2671;
2672; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_release:
2673; RV64IA-TSO-ZABHA:       # %bb.0:
2674; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
2675; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2676; RV64IA-TSO-ZABHA-NEXT:    ret
2677  %1 = atomicrmw sub ptr %a, i8 %b release
2678  ret i8 %1
2679}
2680
2681define i8 @atomicrmw_sub_i8_acq_rel(ptr %a, i8 %b) nounwind {
2682; RV32I-LABEL: atomicrmw_sub_i8_acq_rel:
2683; RV32I:       # %bb.0:
2684; RV32I-NEXT:    addi sp, sp, -16
2685; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2686; RV32I-NEXT:    li a2, 4
2687; RV32I-NEXT:    call __atomic_fetch_sub_1
2688; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2689; RV32I-NEXT:    addi sp, sp, 16
2690; RV32I-NEXT:    ret
2691;
2692; RV32IA-WMO-LABEL: atomicrmw_sub_i8_acq_rel:
2693; RV32IA-WMO:       # %bb.0:
2694; RV32IA-WMO-NEXT:    andi a2, a0, -4
2695; RV32IA-WMO-NEXT:    slli a0, a0, 3
2696; RV32IA-WMO-NEXT:    li a3, 255
2697; RV32IA-WMO-NEXT:    andi a1, a1, 255
2698; RV32IA-WMO-NEXT:    sll a3, a3, a0
2699; RV32IA-WMO-NEXT:    sll a1, a1, a0
2700; RV32IA-WMO-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2701; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
2702; RV32IA-WMO-NEXT:    sub a5, a4, a1
2703; RV32IA-WMO-NEXT:    xor a5, a4, a5
2704; RV32IA-WMO-NEXT:    and a5, a5, a3
2705; RV32IA-WMO-NEXT:    xor a5, a4, a5
2706; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
2707; RV32IA-WMO-NEXT:    bnez a5, .LBB23_1
2708; RV32IA-WMO-NEXT:  # %bb.2:
2709; RV32IA-WMO-NEXT:    srl a0, a4, a0
2710; RV32IA-WMO-NEXT:    ret
2711;
2712; RV32IA-TSO-LABEL: atomicrmw_sub_i8_acq_rel:
2713; RV32IA-TSO:       # %bb.0:
2714; RV32IA-TSO-NEXT:    andi a2, a0, -4
2715; RV32IA-TSO-NEXT:    slli a0, a0, 3
2716; RV32IA-TSO-NEXT:    li a3, 255
2717; RV32IA-TSO-NEXT:    andi a1, a1, 255
2718; RV32IA-TSO-NEXT:    sll a3, a3, a0
2719; RV32IA-TSO-NEXT:    sll a1, a1, a0
2720; RV32IA-TSO-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2721; RV32IA-TSO-NEXT:    lr.w a4, (a2)
2722; RV32IA-TSO-NEXT:    sub a5, a4, a1
2723; RV32IA-TSO-NEXT:    xor a5, a4, a5
2724; RV32IA-TSO-NEXT:    and a5, a5, a3
2725; RV32IA-TSO-NEXT:    xor a5, a4, a5
2726; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
2727; RV32IA-TSO-NEXT:    bnez a5, .LBB23_1
2728; RV32IA-TSO-NEXT:  # %bb.2:
2729; RV32IA-TSO-NEXT:    srl a0, a4, a0
2730; RV32IA-TSO-NEXT:    ret
2731;
2732; RV64I-LABEL: atomicrmw_sub_i8_acq_rel:
2733; RV64I:       # %bb.0:
2734; RV64I-NEXT:    addi sp, sp, -16
2735; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2736; RV64I-NEXT:    li a2, 4
2737; RV64I-NEXT:    call __atomic_fetch_sub_1
2738; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2739; RV64I-NEXT:    addi sp, sp, 16
2740; RV64I-NEXT:    ret
2741;
2742; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
2743; RV64IA-WMO-NOZACAS:       # %bb.0:
2744; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
2745; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
2746; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
2747; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
2748; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
2749; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
2750; RV64IA-WMO-NOZACAS-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2751; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
2752; RV64IA-WMO-NOZACAS-NEXT:    sub a5, a4, a1
2753; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2754; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
2755; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
2756; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2757; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB23_1
2758; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
2759; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
2760; RV64IA-WMO-NOZACAS-NEXT:    ret
2761;
2762; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
2763; RV64IA-TSO-NOZACAS:       # %bb.0:
2764; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
2765; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
2766; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
2767; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
2768; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
2769; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
2770; RV64IA-TSO-NOZACAS-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2771; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
2772; RV64IA-TSO-NOZACAS-NEXT:    sub a5, a4, a1
2773; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2774; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
2775; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
2776; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
2777; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB23_1
2778; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
2779; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
2780; RV64IA-TSO-NOZACAS-NEXT:    ret
2781;
2782; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
2783; RV64IA-WMO-ZACAS:       # %bb.0:
2784; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
2785; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
2786; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
2787; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
2788; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
2789; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
2790; RV64IA-WMO-ZACAS-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2791; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
2792; RV64IA-WMO-ZACAS-NEXT:    sub a5, a4, a1
2793; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2794; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
2795; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
2796; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2797; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB23_1
2798; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
2799; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
2800; RV64IA-WMO-ZACAS-NEXT:    ret
2801;
2802; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
2803; RV64IA-TSO-ZACAS:       # %bb.0:
2804; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
2805; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
2806; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
2807; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
2808; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
2809; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
2810; RV64IA-TSO-ZACAS-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
2811; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
2812; RV64IA-TSO-ZACAS-NEXT:    sub a5, a4, a1
2813; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2814; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
2815; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
2816; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
2817; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB23_1
2818; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
2819; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
2820; RV64IA-TSO-ZACAS-NEXT:    ret
2821;
2822; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_acq_rel:
2823; RV64IA-WMO-ZABHA:       # %bb.0:
2824; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
2825; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.aqrl a0, a1, (a0)
2826; RV64IA-WMO-ZABHA-NEXT:    ret
2827;
2828; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_acq_rel:
2829; RV64IA-TSO-ZABHA:       # %bb.0:
2830; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
2831; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2832; RV64IA-TSO-ZABHA-NEXT:    ret
2833  %1 = atomicrmw sub ptr %a, i8 %b acq_rel
2834  ret i8 %1
2835}
2836
2837define i8 @atomicrmw_sub_i8_seq_cst(ptr %a, i8 %b) nounwind {
2838; RV32I-LABEL: atomicrmw_sub_i8_seq_cst:
2839; RV32I:       # %bb.0:
2840; RV32I-NEXT:    addi sp, sp, -16
2841; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2842; RV32I-NEXT:    li a2, 5
2843; RV32I-NEXT:    call __atomic_fetch_sub_1
2844; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2845; RV32I-NEXT:    addi sp, sp, 16
2846; RV32I-NEXT:    ret
2847;
2848; RV32IA-LABEL: atomicrmw_sub_i8_seq_cst:
2849; RV32IA:       # %bb.0:
2850; RV32IA-NEXT:    andi a2, a0, -4
2851; RV32IA-NEXT:    slli a0, a0, 3
2852; RV32IA-NEXT:    li a3, 255
2853; RV32IA-NEXT:    andi a1, a1, 255
2854; RV32IA-NEXT:    sll a3, a3, a0
2855; RV32IA-NEXT:    sll a1, a1, a0
2856; RV32IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
2857; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
2858; RV32IA-NEXT:    sub a5, a4, a1
2859; RV32IA-NEXT:    xor a5, a4, a5
2860; RV32IA-NEXT:    and a5, a5, a3
2861; RV32IA-NEXT:    xor a5, a4, a5
2862; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
2863; RV32IA-NEXT:    bnez a5, .LBB24_1
2864; RV32IA-NEXT:  # %bb.2:
2865; RV32IA-NEXT:    srl a0, a4, a0
2866; RV32IA-NEXT:    ret
2867;
2868; RV64I-LABEL: atomicrmw_sub_i8_seq_cst:
2869; RV64I:       # %bb.0:
2870; RV64I-NEXT:    addi sp, sp, -16
2871; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2872; RV64I-NEXT:    li a2, 5
2873; RV64I-NEXT:    call __atomic_fetch_sub_1
2874; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2875; RV64I-NEXT:    addi sp, sp, 16
2876; RV64I-NEXT:    ret
2877;
2878; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i8_seq_cst:
2879; RV64IA-NOZACAS:       # %bb.0:
2880; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
2881; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
2882; RV64IA-NOZACAS-NEXT:    li a3, 255
2883; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
2884; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
2885; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
2886; RV64IA-NOZACAS-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
2887; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
2888; RV64IA-NOZACAS-NEXT:    sub a5, a4, a1
2889; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
2890; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
2891; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
2892; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2893; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB24_1
2894; RV64IA-NOZACAS-NEXT:  # %bb.2:
2895; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
2896; RV64IA-NOZACAS-NEXT:    ret
2897;
2898; RV64IA-ZACAS-LABEL: atomicrmw_sub_i8_seq_cst:
2899; RV64IA-ZACAS:       # %bb.0:
2900; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
2901; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
2902; RV64IA-ZACAS-NEXT:    li a3, 255
2903; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
2904; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
2905; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
2906; RV64IA-ZACAS-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
2907; RV64IA-ZACAS-NEXT:    lr.w.aqrl a4, (a2)
2908; RV64IA-ZACAS-NEXT:    sub a5, a4, a1
2909; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
2910; RV64IA-ZACAS-NEXT:    and a5, a5, a3
2911; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
2912; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
2913; RV64IA-ZACAS-NEXT:    bnez a5, .LBB24_1
2914; RV64IA-ZACAS-NEXT:  # %bb.2:
2915; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
2916; RV64IA-ZACAS-NEXT:    ret
2917;
2918; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_seq_cst:
2919; RV64IA-WMO-ZABHA:       # %bb.0:
2920; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
2921; RV64IA-WMO-ZABHA-NEXT:    amoadd.b.aqrl a0, a1, (a0)
2922; RV64IA-WMO-ZABHA-NEXT:    ret
2923;
2924; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_seq_cst:
2925; RV64IA-TSO-ZABHA:       # %bb.0:
2926; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
2927; RV64IA-TSO-ZABHA-NEXT:    amoadd.b a0, a1, (a0)
2928; RV64IA-TSO-ZABHA-NEXT:    ret
2929  %1 = atomicrmw sub ptr %a, i8 %b seq_cst
2930  ret i8 %1
2931}
2932
2933define i8 @atomicrmw_and_i8_monotonic(ptr %a, i8 %b) nounwind {
2934; RV32I-LABEL: atomicrmw_and_i8_monotonic:
2935; RV32I:       # %bb.0:
2936; RV32I-NEXT:    addi sp, sp, -16
2937; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2938; RV32I-NEXT:    li a2, 0
2939; RV32I-NEXT:    call __atomic_fetch_and_1
2940; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2941; RV32I-NEXT:    addi sp, sp, 16
2942; RV32I-NEXT:    ret
2943;
2944; RV32IA-LABEL: atomicrmw_and_i8_monotonic:
2945; RV32IA:       # %bb.0:
2946; RV32IA-NEXT:    andi a2, a0, -4
2947; RV32IA-NEXT:    slli a0, a0, 3
2948; RV32IA-NEXT:    li a3, 255
2949; RV32IA-NEXT:    andi a1, a1, 255
2950; RV32IA-NEXT:    sll a3, a3, a0
2951; RV32IA-NEXT:    not a3, a3
2952; RV32IA-NEXT:    sll a1, a1, a0
2953; RV32IA-NEXT:    or a1, a1, a3
2954; RV32IA-NEXT:    amoand.w a1, a1, (a2)
2955; RV32IA-NEXT:    srl a0, a1, a0
2956; RV32IA-NEXT:    ret
2957;
2958; RV64I-LABEL: atomicrmw_and_i8_monotonic:
2959; RV64I:       # %bb.0:
2960; RV64I-NEXT:    addi sp, sp, -16
2961; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2962; RV64I-NEXT:    li a2, 0
2963; RV64I-NEXT:    call __atomic_fetch_and_1
2964; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2965; RV64I-NEXT:    addi sp, sp, 16
2966; RV64I-NEXT:    ret
2967;
2968; RV64IA-NOZACAS-LABEL: atomicrmw_and_i8_monotonic:
2969; RV64IA-NOZACAS:       # %bb.0:
2970; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
2971; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
2972; RV64IA-NOZACAS-NEXT:    li a3, 255
2973; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
2974; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
2975; RV64IA-NOZACAS-NEXT:    not a3, a3
2976; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
2977; RV64IA-NOZACAS-NEXT:    or a1, a1, a3
2978; RV64IA-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
2979; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
2980; RV64IA-NOZACAS-NEXT:    ret
2981;
2982; RV64IA-ZACAS-LABEL: atomicrmw_and_i8_monotonic:
2983; RV64IA-ZACAS:       # %bb.0:
2984; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
2985; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
2986; RV64IA-ZACAS-NEXT:    li a3, 255
2987; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
2988; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
2989; RV64IA-ZACAS-NEXT:    not a3, a3
2990; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
2991; RV64IA-ZACAS-NEXT:    or a1, a1, a3
2992; RV64IA-ZACAS-NEXT:    amoand.w a1, a1, (a2)
2993; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
2994; RV64IA-ZACAS-NEXT:    ret
2995;
2996; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_monotonic:
2997; RV64IA-WMO-ZABHA:       # %bb.0:
2998; RV64IA-WMO-ZABHA-NEXT:    amoand.b a0, a1, (a0)
2999; RV64IA-WMO-ZABHA-NEXT:    ret
3000;
3001; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_monotonic:
3002; RV64IA-TSO-ZABHA:       # %bb.0:
3003; RV64IA-TSO-ZABHA-NEXT:    amoand.b a0, a1, (a0)
3004; RV64IA-TSO-ZABHA-NEXT:    ret
3005  %1 = atomicrmw and ptr %a, i8 %b monotonic
3006  ret i8 %1
3007}
3008
3009define i8 @atomicrmw_and_i8_acquire(ptr %a, i8 %b) nounwind {
3010; RV32I-LABEL: atomicrmw_and_i8_acquire:
3011; RV32I:       # %bb.0:
3012; RV32I-NEXT:    addi sp, sp, -16
3013; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3014; RV32I-NEXT:    li a2, 2
3015; RV32I-NEXT:    call __atomic_fetch_and_1
3016; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3017; RV32I-NEXT:    addi sp, sp, 16
3018; RV32I-NEXT:    ret
3019;
3020; RV32IA-WMO-LABEL: atomicrmw_and_i8_acquire:
3021; RV32IA-WMO:       # %bb.0:
3022; RV32IA-WMO-NEXT:    andi a2, a0, -4
3023; RV32IA-WMO-NEXT:    slli a0, a0, 3
3024; RV32IA-WMO-NEXT:    li a3, 255
3025; RV32IA-WMO-NEXT:    andi a1, a1, 255
3026; RV32IA-WMO-NEXT:    sll a3, a3, a0
3027; RV32IA-WMO-NEXT:    not a3, a3
3028; RV32IA-WMO-NEXT:    sll a1, a1, a0
3029; RV32IA-WMO-NEXT:    or a1, a1, a3
3030; RV32IA-WMO-NEXT:    amoand.w.aq a1, a1, (a2)
3031; RV32IA-WMO-NEXT:    srl a0, a1, a0
3032; RV32IA-WMO-NEXT:    ret
3033;
3034; RV32IA-TSO-LABEL: atomicrmw_and_i8_acquire:
3035; RV32IA-TSO:       # %bb.0:
3036; RV32IA-TSO-NEXT:    andi a2, a0, -4
3037; RV32IA-TSO-NEXT:    slli a0, a0, 3
3038; RV32IA-TSO-NEXT:    li a3, 255
3039; RV32IA-TSO-NEXT:    andi a1, a1, 255
3040; RV32IA-TSO-NEXT:    sll a3, a3, a0
3041; RV32IA-TSO-NEXT:    not a3, a3
3042; RV32IA-TSO-NEXT:    sll a1, a1, a0
3043; RV32IA-TSO-NEXT:    or a1, a1, a3
3044; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
3045; RV32IA-TSO-NEXT:    srl a0, a1, a0
3046; RV32IA-TSO-NEXT:    ret
3047;
3048; RV64I-LABEL: atomicrmw_and_i8_acquire:
3049; RV64I:       # %bb.0:
3050; RV64I-NEXT:    addi sp, sp, -16
3051; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3052; RV64I-NEXT:    li a2, 2
3053; RV64I-NEXT:    call __atomic_fetch_and_1
3054; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3055; RV64I-NEXT:    addi sp, sp, 16
3056; RV64I-NEXT:    ret
3057;
3058; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_acquire:
3059; RV64IA-WMO-NOZACAS:       # %bb.0:
3060; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
3061; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
3062; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
3063; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
3064; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
3065; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
3066; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
3067; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
3068; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aq a1, a1, (a2)
3069; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
3070; RV64IA-WMO-NOZACAS-NEXT:    ret
3071;
3072; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_acquire:
3073; RV64IA-TSO-NOZACAS:       # %bb.0:
3074; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
3075; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
3076; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
3077; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
3078; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
3079; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
3080; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
3081; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
3082; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
3083; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
3084; RV64IA-TSO-NOZACAS-NEXT:    ret
3085;
3086; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_acquire:
3087; RV64IA-WMO-ZACAS:       # %bb.0:
3088; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
3089; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
3090; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
3091; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
3092; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
3093; RV64IA-WMO-ZACAS-NEXT:    not a3, a3
3094; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
3095; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
3096; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aq a1, a1, (a2)
3097; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
3098; RV64IA-WMO-ZACAS-NEXT:    ret
3099;
3100; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_acquire:
3101; RV64IA-TSO-ZACAS:       # %bb.0:
3102; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
3103; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
3104; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
3105; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
3106; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
3107; RV64IA-TSO-ZACAS-NEXT:    not a3, a3
3108; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
3109; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
3110; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
3111; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
3112; RV64IA-TSO-ZACAS-NEXT:    ret
3113;
3114; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_acquire:
3115; RV64IA-WMO-ZABHA:       # %bb.0:
3116; RV64IA-WMO-ZABHA-NEXT:    amoand.b.aq a0, a1, (a0)
3117; RV64IA-WMO-ZABHA-NEXT:    ret
3118;
3119; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_acquire:
3120; RV64IA-TSO-ZABHA:       # %bb.0:
3121; RV64IA-TSO-ZABHA-NEXT:    amoand.b a0, a1, (a0)
3122; RV64IA-TSO-ZABHA-NEXT:    ret
3123  %1 = atomicrmw and ptr %a, i8 %b acquire
3124  ret i8 %1
3125}
3126
3127define i8 @atomicrmw_and_i8_release(ptr %a, i8 %b) nounwind {
3128; RV32I-LABEL: atomicrmw_and_i8_release:
3129; RV32I:       # %bb.0:
3130; RV32I-NEXT:    addi sp, sp, -16
3131; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3132; RV32I-NEXT:    li a2, 3
3133; RV32I-NEXT:    call __atomic_fetch_and_1
3134; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3135; RV32I-NEXT:    addi sp, sp, 16
3136; RV32I-NEXT:    ret
3137;
3138; RV32IA-WMO-LABEL: atomicrmw_and_i8_release:
3139; RV32IA-WMO:       # %bb.0:
3140; RV32IA-WMO-NEXT:    andi a2, a0, -4
3141; RV32IA-WMO-NEXT:    slli a0, a0, 3
3142; RV32IA-WMO-NEXT:    li a3, 255
3143; RV32IA-WMO-NEXT:    andi a1, a1, 255
3144; RV32IA-WMO-NEXT:    sll a3, a3, a0
3145; RV32IA-WMO-NEXT:    not a3, a3
3146; RV32IA-WMO-NEXT:    sll a1, a1, a0
3147; RV32IA-WMO-NEXT:    or a1, a1, a3
3148; RV32IA-WMO-NEXT:    amoand.w.rl a1, a1, (a2)
3149; RV32IA-WMO-NEXT:    srl a0, a1, a0
3150; RV32IA-WMO-NEXT:    ret
3151;
3152; RV32IA-TSO-LABEL: atomicrmw_and_i8_release:
3153; RV32IA-TSO:       # %bb.0:
3154; RV32IA-TSO-NEXT:    andi a2, a0, -4
3155; RV32IA-TSO-NEXT:    slli a0, a0, 3
3156; RV32IA-TSO-NEXT:    li a3, 255
3157; RV32IA-TSO-NEXT:    andi a1, a1, 255
3158; RV32IA-TSO-NEXT:    sll a3, a3, a0
3159; RV32IA-TSO-NEXT:    not a3, a3
3160; RV32IA-TSO-NEXT:    sll a1, a1, a0
3161; RV32IA-TSO-NEXT:    or a1, a1, a3
3162; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
3163; RV32IA-TSO-NEXT:    srl a0, a1, a0
3164; RV32IA-TSO-NEXT:    ret
3165;
3166; RV64I-LABEL: atomicrmw_and_i8_release:
3167; RV64I:       # %bb.0:
3168; RV64I-NEXT:    addi sp, sp, -16
3169; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3170; RV64I-NEXT:    li a2, 3
3171; RV64I-NEXT:    call __atomic_fetch_and_1
3172; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3173; RV64I-NEXT:    addi sp, sp, 16
3174; RV64I-NEXT:    ret
3175;
3176; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_release:
3177; RV64IA-WMO-NOZACAS:       # %bb.0:
3178; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
3179; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
3180; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
3181; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
3182; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
3183; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
3184; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
3185; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
3186; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.rl a1, a1, (a2)
3187; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
3188; RV64IA-WMO-NOZACAS-NEXT:    ret
3189;
3190; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_release:
3191; RV64IA-TSO-NOZACAS:       # %bb.0:
3192; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
3193; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
3194; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
3195; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
3196; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
3197; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
3198; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
3199; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
3200; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
3201; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
3202; RV64IA-TSO-NOZACAS-NEXT:    ret
3203;
3204; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_release:
3205; RV64IA-WMO-ZACAS:       # %bb.0:
3206; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
3207; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
3208; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
3209; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
3210; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
3211; RV64IA-WMO-ZACAS-NEXT:    not a3, a3
3212; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
3213; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
3214; RV64IA-WMO-ZACAS-NEXT:    amoand.w.rl a1, a1, (a2)
3215; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
3216; RV64IA-WMO-ZACAS-NEXT:    ret
3217;
3218; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_release:
3219; RV64IA-TSO-ZACAS:       # %bb.0:
3220; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
3221; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
3222; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
3223; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
3224; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
3225; RV64IA-TSO-ZACAS-NEXT:    not a3, a3
3226; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
3227; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
3228; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
3229; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
3230; RV64IA-TSO-ZACAS-NEXT:    ret
3231;
3232; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_release:
3233; RV64IA-WMO-ZABHA:       # %bb.0:
3234; RV64IA-WMO-ZABHA-NEXT:    amoand.b.rl a0, a1, (a0)
3235; RV64IA-WMO-ZABHA-NEXT:    ret
3236;
3237; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_release:
3238; RV64IA-TSO-ZABHA:       # %bb.0:
3239; RV64IA-TSO-ZABHA-NEXT:    amoand.b a0, a1, (a0)
3240; RV64IA-TSO-ZABHA-NEXT:    ret
3241  %1 = atomicrmw and ptr %a, i8 %b release
3242  ret i8 %1
3243}
3244
3245define i8 @atomicrmw_and_i8_acq_rel(ptr %a, i8 %b) nounwind {
3246; RV32I-LABEL: atomicrmw_and_i8_acq_rel:
3247; RV32I:       # %bb.0:
3248; RV32I-NEXT:    addi sp, sp, -16
3249; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3250; RV32I-NEXT:    li a2, 4
3251; RV32I-NEXT:    call __atomic_fetch_and_1
3252; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3253; RV32I-NEXT:    addi sp, sp, 16
3254; RV32I-NEXT:    ret
3255;
3256; RV32IA-WMO-LABEL: atomicrmw_and_i8_acq_rel:
3257; RV32IA-WMO:       # %bb.0:
3258; RV32IA-WMO-NEXT:    andi a2, a0, -4
3259; RV32IA-WMO-NEXT:    slli a0, a0, 3
3260; RV32IA-WMO-NEXT:    li a3, 255
3261; RV32IA-WMO-NEXT:    andi a1, a1, 255
3262; RV32IA-WMO-NEXT:    sll a3, a3, a0
3263; RV32IA-WMO-NEXT:    not a3, a3
3264; RV32IA-WMO-NEXT:    sll a1, a1, a0
3265; RV32IA-WMO-NEXT:    or a1, a1, a3
3266; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a1, (a2)
3267; RV32IA-WMO-NEXT:    srl a0, a1, a0
3268; RV32IA-WMO-NEXT:    ret
3269;
3270; RV32IA-TSO-LABEL: atomicrmw_and_i8_acq_rel:
3271; RV32IA-TSO:       # %bb.0:
3272; RV32IA-TSO-NEXT:    andi a2, a0, -4
3273; RV32IA-TSO-NEXT:    slli a0, a0, 3
3274; RV32IA-TSO-NEXT:    li a3, 255
3275; RV32IA-TSO-NEXT:    andi a1, a1, 255
3276; RV32IA-TSO-NEXT:    sll a3, a3, a0
3277; RV32IA-TSO-NEXT:    not a3, a3
3278; RV32IA-TSO-NEXT:    sll a1, a1, a0
3279; RV32IA-TSO-NEXT:    or a1, a1, a3
3280; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
3281; RV32IA-TSO-NEXT:    srl a0, a1, a0
3282; RV32IA-TSO-NEXT:    ret
3283;
3284; RV64I-LABEL: atomicrmw_and_i8_acq_rel:
3285; RV64I:       # %bb.0:
3286; RV64I-NEXT:    addi sp, sp, -16
3287; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3288; RV64I-NEXT:    li a2, 4
3289; RV64I-NEXT:    call __atomic_fetch_and_1
3290; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3291; RV64I-NEXT:    addi sp, sp, 16
3292; RV64I-NEXT:    ret
3293;
3294; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_acq_rel:
3295; RV64IA-WMO-NOZACAS:       # %bb.0:
3296; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
3297; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
3298; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
3299; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
3300; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
3301; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
3302; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
3303; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
3304; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
3305; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
3306; RV64IA-WMO-NOZACAS-NEXT:    ret
3307;
3308; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_acq_rel:
3309; RV64IA-TSO-NOZACAS:       # %bb.0:
3310; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
3311; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
3312; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
3313; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
3314; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
3315; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
3316; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
3317; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
3318; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
3319; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
3320; RV64IA-TSO-NOZACAS-NEXT:    ret
3321;
3322; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_acq_rel:
3323; RV64IA-WMO-ZACAS:       # %bb.0:
3324; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
3325; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
3326; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
3327; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
3328; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
3329; RV64IA-WMO-ZACAS-NEXT:    not a3, a3
3330; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
3331; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
3332; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
3333; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
3334; RV64IA-WMO-ZACAS-NEXT:    ret
3335;
3336; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_acq_rel:
3337; RV64IA-TSO-ZACAS:       # %bb.0:
3338; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
3339; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
3340; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
3341; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
3342; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
3343; RV64IA-TSO-ZACAS-NEXT:    not a3, a3
3344; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
3345; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
3346; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
3347; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
3348; RV64IA-TSO-ZACAS-NEXT:    ret
3349;
3350; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_acq_rel:
3351; RV64IA-WMO-ZABHA:       # %bb.0:
3352; RV64IA-WMO-ZABHA-NEXT:    amoand.b.aqrl a0, a1, (a0)
3353; RV64IA-WMO-ZABHA-NEXT:    ret
3354;
3355; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_acq_rel:
3356; RV64IA-TSO-ZABHA:       # %bb.0:
3357; RV64IA-TSO-ZABHA-NEXT:    amoand.b a0, a1, (a0)
3358; RV64IA-TSO-ZABHA-NEXT:    ret
3359  %1 = atomicrmw and ptr %a, i8 %b acq_rel
3360  ret i8 %1
3361}
3362
3363define i8 @atomicrmw_and_i8_seq_cst(ptr %a, i8 %b) nounwind {
3364; RV32I-LABEL: atomicrmw_and_i8_seq_cst:
3365; RV32I:       # %bb.0:
3366; RV32I-NEXT:    addi sp, sp, -16
3367; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3368; RV32I-NEXT:    li a2, 5
3369; RV32I-NEXT:    call __atomic_fetch_and_1
3370; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3371; RV32I-NEXT:    addi sp, sp, 16
3372; RV32I-NEXT:    ret
3373;
3374; RV32IA-WMO-LABEL: atomicrmw_and_i8_seq_cst:
3375; RV32IA-WMO:       # %bb.0:
3376; RV32IA-WMO-NEXT:    andi a2, a0, -4
3377; RV32IA-WMO-NEXT:    slli a0, a0, 3
3378; RV32IA-WMO-NEXT:    li a3, 255
3379; RV32IA-WMO-NEXT:    andi a1, a1, 255
3380; RV32IA-WMO-NEXT:    sll a3, a3, a0
3381; RV32IA-WMO-NEXT:    not a3, a3
3382; RV32IA-WMO-NEXT:    sll a1, a1, a0
3383; RV32IA-WMO-NEXT:    or a1, a1, a3
3384; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a1, (a2)
3385; RV32IA-WMO-NEXT:    srl a0, a1, a0
3386; RV32IA-WMO-NEXT:    ret
3387;
3388; RV32IA-TSO-LABEL: atomicrmw_and_i8_seq_cst:
3389; RV32IA-TSO:       # %bb.0:
3390; RV32IA-TSO-NEXT:    andi a2, a0, -4
3391; RV32IA-TSO-NEXT:    slli a0, a0, 3
3392; RV32IA-TSO-NEXT:    li a3, 255
3393; RV32IA-TSO-NEXT:    andi a1, a1, 255
3394; RV32IA-TSO-NEXT:    sll a3, a3, a0
3395; RV32IA-TSO-NEXT:    not a3, a3
3396; RV32IA-TSO-NEXT:    sll a1, a1, a0
3397; RV32IA-TSO-NEXT:    or a1, a1, a3
3398; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
3399; RV32IA-TSO-NEXT:    srl a0, a1, a0
3400; RV32IA-TSO-NEXT:    ret
3401;
3402; RV64I-LABEL: atomicrmw_and_i8_seq_cst:
3403; RV64I:       # %bb.0:
3404; RV64I-NEXT:    addi sp, sp, -16
3405; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3406; RV64I-NEXT:    li a2, 5
3407; RV64I-NEXT:    call __atomic_fetch_and_1
3408; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3409; RV64I-NEXT:    addi sp, sp, 16
3410; RV64I-NEXT:    ret
3411;
3412; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_seq_cst:
3413; RV64IA-WMO-NOZACAS:       # %bb.0:
3414; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
3415; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
3416; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
3417; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
3418; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
3419; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
3420; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
3421; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
3422; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
3423; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
3424; RV64IA-WMO-NOZACAS-NEXT:    ret
3425;
3426; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_seq_cst:
3427; RV64IA-TSO-NOZACAS:       # %bb.0:
3428; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
3429; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
3430; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
3431; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
3432; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
3433; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
3434; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
3435; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
3436; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
3437; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
3438; RV64IA-TSO-NOZACAS-NEXT:    ret
3439;
3440; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_seq_cst:
3441; RV64IA-WMO-ZACAS:       # %bb.0:
3442; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
3443; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
3444; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
3445; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
3446; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
3447; RV64IA-WMO-ZACAS-NEXT:    not a3, a3
3448; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
3449; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
3450; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
3451; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
3452; RV64IA-WMO-ZACAS-NEXT:    ret
3453;
3454; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_seq_cst:
3455; RV64IA-TSO-ZACAS:       # %bb.0:
3456; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
3457; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
3458; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
3459; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
3460; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
3461; RV64IA-TSO-ZACAS-NEXT:    not a3, a3
3462; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
3463; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
3464; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
3465; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
3466; RV64IA-TSO-ZACAS-NEXT:    ret
3467;
3468; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_seq_cst:
3469; RV64IA-WMO-ZABHA:       # %bb.0:
3470; RV64IA-WMO-ZABHA-NEXT:    amoand.b.aqrl a0, a1, (a0)
3471; RV64IA-WMO-ZABHA-NEXT:    ret
3472;
3473; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_seq_cst:
3474; RV64IA-TSO-ZABHA:       # %bb.0:
3475; RV64IA-TSO-ZABHA-NEXT:    amoand.b a0, a1, (a0)
3476; RV64IA-TSO-ZABHA-NEXT:    ret
3477  %1 = atomicrmw and ptr %a, i8 %b seq_cst
3478  ret i8 %1
3479}
3480
3481define i8 @atomicrmw_nand_i8_monotonic(ptr %a, i8 %b) nounwind {
3482; RV32I-LABEL: atomicrmw_nand_i8_monotonic:
3483; RV32I:       # %bb.0:
3484; RV32I-NEXT:    addi sp, sp, -16
3485; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3486; RV32I-NEXT:    li a2, 0
3487; RV32I-NEXT:    call __atomic_fetch_nand_1
3488; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3489; RV32I-NEXT:    addi sp, sp, 16
3490; RV32I-NEXT:    ret
3491;
3492; RV32IA-LABEL: atomicrmw_nand_i8_monotonic:
3493; RV32IA:       # %bb.0:
3494; RV32IA-NEXT:    andi a2, a0, -4
3495; RV32IA-NEXT:    slli a0, a0, 3
3496; RV32IA-NEXT:    li a3, 255
3497; RV32IA-NEXT:    andi a1, a1, 255
3498; RV32IA-NEXT:    sll a3, a3, a0
3499; RV32IA-NEXT:    sll a1, a1, a0
3500; RV32IA-NEXT:  .LBB30_1: # =>This Inner Loop Header: Depth=1
3501; RV32IA-NEXT:    lr.w a4, (a2)
3502; RV32IA-NEXT:    and a5, a4, a1
3503; RV32IA-NEXT:    not a5, a5
3504; RV32IA-NEXT:    xor a5, a4, a5
3505; RV32IA-NEXT:    and a5, a5, a3
3506; RV32IA-NEXT:    xor a5, a4, a5
3507; RV32IA-NEXT:    sc.w a5, a5, (a2)
3508; RV32IA-NEXT:    bnez a5, .LBB30_1
3509; RV32IA-NEXT:  # %bb.2:
3510; RV32IA-NEXT:    srl a0, a4, a0
3511; RV32IA-NEXT:    ret
3512;
3513; RV64I-LABEL: atomicrmw_nand_i8_monotonic:
3514; RV64I:       # %bb.0:
3515; RV64I-NEXT:    addi sp, sp, -16
3516; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3517; RV64I-NEXT:    li a2, 0
3518; RV64I-NEXT:    call __atomic_fetch_nand_1
3519; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3520; RV64I-NEXT:    addi sp, sp, 16
3521; RV64I-NEXT:    ret
3522;
3523; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic:
3524; RV64IA-NOZACAS:       # %bb.0:
3525; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
3526; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
3527; RV64IA-NOZACAS-NEXT:    li a3, 255
3528; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
3529; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
3530; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
3531; RV64IA-NOZACAS-NEXT:  .LBB30_1: # =>This Inner Loop Header: Depth=1
3532; RV64IA-NOZACAS-NEXT:    lr.w a4, (a2)
3533; RV64IA-NOZACAS-NEXT:    and a5, a4, a1
3534; RV64IA-NOZACAS-NEXT:    not a5, a5
3535; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
3536; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
3537; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
3538; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3539; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB30_1
3540; RV64IA-NOZACAS-NEXT:  # %bb.2:
3541; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
3542; RV64IA-NOZACAS-NEXT:    ret
3543;
3544; RV64IA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic:
3545; RV64IA-ZACAS:       # %bb.0:
3546; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
3547; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
3548; RV64IA-ZACAS-NEXT:    li a3, 255
3549; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
3550; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
3551; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
3552; RV64IA-ZACAS-NEXT:  .LBB30_1: # =>This Inner Loop Header: Depth=1
3553; RV64IA-ZACAS-NEXT:    lr.w a4, (a2)
3554; RV64IA-ZACAS-NEXT:    and a5, a4, a1
3555; RV64IA-ZACAS-NEXT:    not a5, a5
3556; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
3557; RV64IA-ZACAS-NEXT:    and a5, a5, a3
3558; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
3559; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
3560; RV64IA-ZACAS-NEXT:    bnez a5, .LBB30_1
3561; RV64IA-ZACAS-NEXT:  # %bb.2:
3562; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
3563; RV64IA-ZACAS-NEXT:    ret
3564;
3565; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic:
3566; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
3567; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
3568; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
3569; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    li a3, 255
3570; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
3571; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
3572; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
3573; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB30_1: # =>This Inner Loop Header: Depth=1
3574; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w a4, (a2)
3575; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
3576; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
3577; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3578; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
3579; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3580; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3581; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB30_1
3582; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
3583; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
3584; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
3585;
3586; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic:
3587; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
3588; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
3589; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
3590; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    li a3, 255
3591; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
3592; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
3593; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
3594; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB30_1: # =>This Inner Loop Header: Depth=1
3595; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a4, (a2)
3596; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
3597; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
3598; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3599; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
3600; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3601; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3602; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB30_1
3603; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
3604; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
3605; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
3606;
3607; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic:
3608; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
3609; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
3610; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
3611; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB30_1: # %atomicrmw.start
3612; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
3613; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
3614; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
3615; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
3616; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.b a0, a3, (a2)
3617; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
3618; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB30_1
3619; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
3620; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
3621;
3622; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic:
3623; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
3624; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
3625; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
3626; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB30_1: # %atomicrmw.start
3627; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
3628; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
3629; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
3630; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
3631; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.b a0, a3, (a2)
3632; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
3633; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB30_1
3634; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
3635; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
3636  %1 = atomicrmw nand ptr %a, i8 %b monotonic
3637  ret i8 %1
3638}
3639
3640define i8 @atomicrmw_nand_i8_acquire(ptr %a, i8 %b) nounwind {
3641; RV32I-LABEL: atomicrmw_nand_i8_acquire:
3642; RV32I:       # %bb.0:
3643; RV32I-NEXT:    addi sp, sp, -16
3644; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3645; RV32I-NEXT:    li a2, 2
3646; RV32I-NEXT:    call __atomic_fetch_nand_1
3647; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3648; RV32I-NEXT:    addi sp, sp, 16
3649; RV32I-NEXT:    ret
3650;
3651; RV32IA-WMO-LABEL: atomicrmw_nand_i8_acquire:
3652; RV32IA-WMO:       # %bb.0:
3653; RV32IA-WMO-NEXT:    andi a2, a0, -4
3654; RV32IA-WMO-NEXT:    slli a0, a0, 3
3655; RV32IA-WMO-NEXT:    li a3, 255
3656; RV32IA-WMO-NEXT:    andi a1, a1, 255
3657; RV32IA-WMO-NEXT:    sll a3, a3, a0
3658; RV32IA-WMO-NEXT:    sll a1, a1, a0
3659; RV32IA-WMO-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3660; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
3661; RV32IA-WMO-NEXT:    and a5, a4, a1
3662; RV32IA-WMO-NEXT:    not a5, a5
3663; RV32IA-WMO-NEXT:    xor a5, a4, a5
3664; RV32IA-WMO-NEXT:    and a5, a5, a3
3665; RV32IA-WMO-NEXT:    xor a5, a4, a5
3666; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
3667; RV32IA-WMO-NEXT:    bnez a5, .LBB31_1
3668; RV32IA-WMO-NEXT:  # %bb.2:
3669; RV32IA-WMO-NEXT:    srl a0, a4, a0
3670; RV32IA-WMO-NEXT:    ret
3671;
3672; RV32IA-TSO-LABEL: atomicrmw_nand_i8_acquire:
3673; RV32IA-TSO:       # %bb.0:
3674; RV32IA-TSO-NEXT:    andi a2, a0, -4
3675; RV32IA-TSO-NEXT:    slli a0, a0, 3
3676; RV32IA-TSO-NEXT:    li a3, 255
3677; RV32IA-TSO-NEXT:    andi a1, a1, 255
3678; RV32IA-TSO-NEXT:    sll a3, a3, a0
3679; RV32IA-TSO-NEXT:    sll a1, a1, a0
3680; RV32IA-TSO-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3681; RV32IA-TSO-NEXT:    lr.w a4, (a2)
3682; RV32IA-TSO-NEXT:    and a5, a4, a1
3683; RV32IA-TSO-NEXT:    not a5, a5
3684; RV32IA-TSO-NEXT:    xor a5, a4, a5
3685; RV32IA-TSO-NEXT:    and a5, a5, a3
3686; RV32IA-TSO-NEXT:    xor a5, a4, a5
3687; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
3688; RV32IA-TSO-NEXT:    bnez a5, .LBB31_1
3689; RV32IA-TSO-NEXT:  # %bb.2:
3690; RV32IA-TSO-NEXT:    srl a0, a4, a0
3691; RV32IA-TSO-NEXT:    ret
3692;
3693; RV64I-LABEL: atomicrmw_nand_i8_acquire:
3694; RV64I:       # %bb.0:
3695; RV64I-NEXT:    addi sp, sp, -16
3696; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3697; RV64I-NEXT:    li a2, 2
3698; RV64I-NEXT:    call __atomic_fetch_nand_1
3699; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3700; RV64I-NEXT:    addi sp, sp, 16
3701; RV64I-NEXT:    ret
3702;
3703; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
3704; RV64IA-WMO-NOZACAS:       # %bb.0:
3705; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
3706; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
3707; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
3708; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
3709; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
3710; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
3711; RV64IA-WMO-NOZACAS-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3712; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
3713; RV64IA-WMO-NOZACAS-NEXT:    and a5, a4, a1
3714; RV64IA-WMO-NOZACAS-NEXT:    not a5, a5
3715; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
3716; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
3717; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
3718; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3719; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB31_1
3720; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
3721; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
3722; RV64IA-WMO-NOZACAS-NEXT:    ret
3723;
3724; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
3725; RV64IA-TSO-NOZACAS:       # %bb.0:
3726; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
3727; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
3728; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
3729; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
3730; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
3731; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
3732; RV64IA-TSO-NOZACAS-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3733; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
3734; RV64IA-TSO-NOZACAS-NEXT:    and a5, a4, a1
3735; RV64IA-TSO-NOZACAS-NEXT:    not a5, a5
3736; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
3737; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
3738; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
3739; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3740; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB31_1
3741; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
3742; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
3743; RV64IA-TSO-NOZACAS-NEXT:    ret
3744;
3745; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
3746; RV64IA-WMO-ZACAS:       # %bb.0:
3747; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
3748; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
3749; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
3750; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
3751; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
3752; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
3753; RV64IA-WMO-ZACAS-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3754; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
3755; RV64IA-WMO-ZACAS-NEXT:    and a5, a4, a1
3756; RV64IA-WMO-ZACAS-NEXT:    not a5, a5
3757; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
3758; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
3759; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
3760; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
3761; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB31_1
3762; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
3763; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
3764; RV64IA-WMO-ZACAS-NEXT:    ret
3765;
3766; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
3767; RV64IA-TSO-ZACAS:       # %bb.0:
3768; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
3769; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
3770; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
3771; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
3772; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
3773; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
3774; RV64IA-TSO-ZACAS-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3775; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
3776; RV64IA-TSO-ZACAS-NEXT:    and a5, a4, a1
3777; RV64IA-TSO-ZACAS-NEXT:    not a5, a5
3778; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
3779; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
3780; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
3781; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
3782; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB31_1
3783; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
3784; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
3785; RV64IA-TSO-ZACAS-NEXT:    ret
3786;
3787; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
3788; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
3789; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
3790; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
3791; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    li a3, 255
3792; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
3793; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
3794; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
3795; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3796; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aq a4, (a2)
3797; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
3798; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
3799; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3800; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
3801; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3802; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3803; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB31_1
3804; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
3805; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
3806; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
3807;
3808; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
3809; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
3810; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
3811; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
3812; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    li a3, 255
3813; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
3814; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
3815; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
3816; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB31_1: # =>This Inner Loop Header: Depth=1
3817; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a4, (a2)
3818; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
3819; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
3820; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3821; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
3822; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
3823; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3824; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB31_1
3825; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
3826; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
3827; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
3828;
3829; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
3830; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
3831; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
3832; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
3833; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB31_1: # %atomicrmw.start
3834; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
3835; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
3836; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
3837; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
3838; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.b.aq a0, a3, (a2)
3839; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
3840; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB31_1
3841; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
3842; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
3843;
3844; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
3845; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
3846; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
3847; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
3848; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB31_1: # %atomicrmw.start
3849; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
3850; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
3851; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
3852; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
3853; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.b a0, a3, (a2)
3854; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
3855; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB31_1
3856; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
3857; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
3858  %1 = atomicrmw nand ptr %a, i8 %b acquire
3859  ret i8 %1
3860}
3861
3862define i8 @atomicrmw_nand_i8_release(ptr %a, i8 %b) nounwind {
3863; RV32I-LABEL: atomicrmw_nand_i8_release:
3864; RV32I:       # %bb.0:
3865; RV32I-NEXT:    addi sp, sp, -16
3866; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3867; RV32I-NEXT:    li a2, 3
3868; RV32I-NEXT:    call __atomic_fetch_nand_1
3869; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3870; RV32I-NEXT:    addi sp, sp, 16
3871; RV32I-NEXT:    ret
3872;
3873; RV32IA-WMO-LABEL: atomicrmw_nand_i8_release:
3874; RV32IA-WMO:       # %bb.0:
3875; RV32IA-WMO-NEXT:    andi a2, a0, -4
3876; RV32IA-WMO-NEXT:    slli a0, a0, 3
3877; RV32IA-WMO-NEXT:    li a3, 255
3878; RV32IA-WMO-NEXT:    andi a1, a1, 255
3879; RV32IA-WMO-NEXT:    sll a3, a3, a0
3880; RV32IA-WMO-NEXT:    sll a1, a1, a0
3881; RV32IA-WMO-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
3882; RV32IA-WMO-NEXT:    lr.w a4, (a2)
3883; RV32IA-WMO-NEXT:    and a5, a4, a1
3884; RV32IA-WMO-NEXT:    not a5, a5
3885; RV32IA-WMO-NEXT:    xor a5, a4, a5
3886; RV32IA-WMO-NEXT:    and a5, a5, a3
3887; RV32IA-WMO-NEXT:    xor a5, a4, a5
3888; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
3889; RV32IA-WMO-NEXT:    bnez a5, .LBB32_1
3890; RV32IA-WMO-NEXT:  # %bb.2:
3891; RV32IA-WMO-NEXT:    srl a0, a4, a0
3892; RV32IA-WMO-NEXT:    ret
3893;
3894; RV32IA-TSO-LABEL: atomicrmw_nand_i8_release:
3895; RV32IA-TSO:       # %bb.0:
3896; RV32IA-TSO-NEXT:    andi a2, a0, -4
3897; RV32IA-TSO-NEXT:    slli a0, a0, 3
3898; RV32IA-TSO-NEXT:    li a3, 255
3899; RV32IA-TSO-NEXT:    andi a1, a1, 255
3900; RV32IA-TSO-NEXT:    sll a3, a3, a0
3901; RV32IA-TSO-NEXT:    sll a1, a1, a0
3902; RV32IA-TSO-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
3903; RV32IA-TSO-NEXT:    lr.w a4, (a2)
3904; RV32IA-TSO-NEXT:    and a5, a4, a1
3905; RV32IA-TSO-NEXT:    not a5, a5
3906; RV32IA-TSO-NEXT:    xor a5, a4, a5
3907; RV32IA-TSO-NEXT:    and a5, a5, a3
3908; RV32IA-TSO-NEXT:    xor a5, a4, a5
3909; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
3910; RV32IA-TSO-NEXT:    bnez a5, .LBB32_1
3911; RV32IA-TSO-NEXT:  # %bb.2:
3912; RV32IA-TSO-NEXT:    srl a0, a4, a0
3913; RV32IA-TSO-NEXT:    ret
3914;
3915; RV64I-LABEL: atomicrmw_nand_i8_release:
3916; RV64I:       # %bb.0:
3917; RV64I-NEXT:    addi sp, sp, -16
3918; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3919; RV64I-NEXT:    li a2, 3
3920; RV64I-NEXT:    call __atomic_fetch_nand_1
3921; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3922; RV64I-NEXT:    addi sp, sp, 16
3923; RV64I-NEXT:    ret
3924;
3925; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_release:
3926; RV64IA-WMO-NOZACAS:       # %bb.0:
3927; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
3928; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
3929; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
3930; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
3931; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
3932; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
3933; RV64IA-WMO-NOZACAS-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
3934; RV64IA-WMO-NOZACAS-NEXT:    lr.w a4, (a2)
3935; RV64IA-WMO-NOZACAS-NEXT:    and a5, a4, a1
3936; RV64IA-WMO-NOZACAS-NEXT:    not a5, a5
3937; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
3938; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
3939; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
3940; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
3941; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB32_1
3942; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
3943; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
3944; RV64IA-WMO-NOZACAS-NEXT:    ret
3945;
3946; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_release:
3947; RV64IA-TSO-NOZACAS:       # %bb.0:
3948; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
3949; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
3950; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
3951; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
3952; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
3953; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
3954; RV64IA-TSO-NOZACAS-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
3955; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
3956; RV64IA-TSO-NOZACAS-NEXT:    and a5, a4, a1
3957; RV64IA-TSO-NOZACAS-NEXT:    not a5, a5
3958; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
3959; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
3960; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
3961; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
3962; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB32_1
3963; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
3964; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
3965; RV64IA-TSO-NOZACAS-NEXT:    ret
3966;
3967; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_release:
3968; RV64IA-WMO-ZACAS:       # %bb.0:
3969; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
3970; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
3971; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
3972; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
3973; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
3974; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
3975; RV64IA-WMO-ZACAS-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
3976; RV64IA-WMO-ZACAS-NEXT:    lr.w a4, (a2)
3977; RV64IA-WMO-ZACAS-NEXT:    and a5, a4, a1
3978; RV64IA-WMO-ZACAS-NEXT:    not a5, a5
3979; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
3980; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
3981; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
3982; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
3983; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB32_1
3984; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
3985; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
3986; RV64IA-WMO-ZACAS-NEXT:    ret
3987;
3988; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_release:
3989; RV64IA-TSO-ZACAS:       # %bb.0:
3990; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
3991; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
3992; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
3993; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
3994; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
3995; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
3996; RV64IA-TSO-ZACAS-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
3997; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
3998; RV64IA-TSO-ZACAS-NEXT:    and a5, a4, a1
3999; RV64IA-TSO-ZACAS-NEXT:    not a5, a5
4000; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
4001; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
4002; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
4003; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
4004; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB32_1
4005; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
4006; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
4007; RV64IA-TSO-ZACAS-NEXT:    ret
4008;
4009; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_release:
4010; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
4011; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
4012; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
4013; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    li a3, 255
4014; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
4015; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
4016; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
4017; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
4018; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w a4, (a2)
4019; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
4020; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
4021; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4022; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
4023; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4024; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4025; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB32_1
4026; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
4027; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
4028; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
4029;
4030; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_release:
4031; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
4032; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
4033; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
4034; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    li a3, 255
4035; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
4036; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
4037; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
4038; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB32_1: # =>This Inner Loop Header: Depth=1
4039; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a4, (a2)
4040; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
4041; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
4042; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4043; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
4044; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4045; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
4046; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB32_1
4047; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
4048; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
4049; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
4050;
4051; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_release:
4052; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
4053; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
4054; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
4055; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB32_1: # %atomicrmw.start
4056; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4057; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
4058; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
4059; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
4060; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.b.rl a0, a3, (a2)
4061; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
4062; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB32_1
4063; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
4064; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
4065;
4066; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_release:
4067; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
4068; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
4069; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
4070; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB32_1: # %atomicrmw.start
4071; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4072; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
4073; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
4074; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
4075; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.b a0, a3, (a2)
4076; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
4077; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB32_1
4078; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
4079; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
4080  %1 = atomicrmw nand ptr %a, i8 %b release
4081  ret i8 %1
4082}
4083
4084define i8 @atomicrmw_nand_i8_acq_rel(ptr %a, i8 %b) nounwind {
4085; RV32I-LABEL: atomicrmw_nand_i8_acq_rel:
4086; RV32I:       # %bb.0:
4087; RV32I-NEXT:    addi sp, sp, -16
4088; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4089; RV32I-NEXT:    li a2, 4
4090; RV32I-NEXT:    call __atomic_fetch_nand_1
4091; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4092; RV32I-NEXT:    addi sp, sp, 16
4093; RV32I-NEXT:    ret
4094;
4095; RV32IA-WMO-LABEL: atomicrmw_nand_i8_acq_rel:
4096; RV32IA-WMO:       # %bb.0:
4097; RV32IA-WMO-NEXT:    andi a2, a0, -4
4098; RV32IA-WMO-NEXT:    slli a0, a0, 3
4099; RV32IA-WMO-NEXT:    li a3, 255
4100; RV32IA-WMO-NEXT:    andi a1, a1, 255
4101; RV32IA-WMO-NEXT:    sll a3, a3, a0
4102; RV32IA-WMO-NEXT:    sll a1, a1, a0
4103; RV32IA-WMO-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4104; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
4105; RV32IA-WMO-NEXT:    and a5, a4, a1
4106; RV32IA-WMO-NEXT:    not a5, a5
4107; RV32IA-WMO-NEXT:    xor a5, a4, a5
4108; RV32IA-WMO-NEXT:    and a5, a5, a3
4109; RV32IA-WMO-NEXT:    xor a5, a4, a5
4110; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
4111; RV32IA-WMO-NEXT:    bnez a5, .LBB33_1
4112; RV32IA-WMO-NEXT:  # %bb.2:
4113; RV32IA-WMO-NEXT:    srl a0, a4, a0
4114; RV32IA-WMO-NEXT:    ret
4115;
4116; RV32IA-TSO-LABEL: atomicrmw_nand_i8_acq_rel:
4117; RV32IA-TSO:       # %bb.0:
4118; RV32IA-TSO-NEXT:    andi a2, a0, -4
4119; RV32IA-TSO-NEXT:    slli a0, a0, 3
4120; RV32IA-TSO-NEXT:    li a3, 255
4121; RV32IA-TSO-NEXT:    andi a1, a1, 255
4122; RV32IA-TSO-NEXT:    sll a3, a3, a0
4123; RV32IA-TSO-NEXT:    sll a1, a1, a0
4124; RV32IA-TSO-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4125; RV32IA-TSO-NEXT:    lr.w a4, (a2)
4126; RV32IA-TSO-NEXT:    and a5, a4, a1
4127; RV32IA-TSO-NEXT:    not a5, a5
4128; RV32IA-TSO-NEXT:    xor a5, a4, a5
4129; RV32IA-TSO-NEXT:    and a5, a5, a3
4130; RV32IA-TSO-NEXT:    xor a5, a4, a5
4131; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
4132; RV32IA-TSO-NEXT:    bnez a5, .LBB33_1
4133; RV32IA-TSO-NEXT:  # %bb.2:
4134; RV32IA-TSO-NEXT:    srl a0, a4, a0
4135; RV32IA-TSO-NEXT:    ret
4136;
4137; RV64I-LABEL: atomicrmw_nand_i8_acq_rel:
4138; RV64I:       # %bb.0:
4139; RV64I-NEXT:    addi sp, sp, -16
4140; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4141; RV64I-NEXT:    li a2, 4
4142; RV64I-NEXT:    call __atomic_fetch_nand_1
4143; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4144; RV64I-NEXT:    addi sp, sp, 16
4145; RV64I-NEXT:    ret
4146;
4147; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4148; RV64IA-WMO-NOZACAS:       # %bb.0:
4149; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
4150; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
4151; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
4152; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
4153; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
4154; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
4155; RV64IA-WMO-NOZACAS-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4156; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
4157; RV64IA-WMO-NOZACAS-NEXT:    and a5, a4, a1
4158; RV64IA-WMO-NOZACAS-NEXT:    not a5, a5
4159; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
4160; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
4161; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
4162; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4163; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB33_1
4164; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
4165; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
4166; RV64IA-WMO-NOZACAS-NEXT:    ret
4167;
4168; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4169; RV64IA-TSO-NOZACAS:       # %bb.0:
4170; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
4171; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
4172; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
4173; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
4174; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
4175; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
4176; RV64IA-TSO-NOZACAS-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4177; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
4178; RV64IA-TSO-NOZACAS-NEXT:    and a5, a4, a1
4179; RV64IA-TSO-NOZACAS-NEXT:    not a5, a5
4180; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
4181; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
4182; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
4183; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
4184; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB33_1
4185; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
4186; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
4187; RV64IA-TSO-NOZACAS-NEXT:    ret
4188;
4189; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4190; RV64IA-WMO-ZACAS:       # %bb.0:
4191; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
4192; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
4193; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
4194; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
4195; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
4196; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
4197; RV64IA-WMO-ZACAS-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4198; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
4199; RV64IA-WMO-ZACAS-NEXT:    and a5, a4, a1
4200; RV64IA-WMO-ZACAS-NEXT:    not a5, a5
4201; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
4202; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
4203; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
4204; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4205; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB33_1
4206; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
4207; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
4208; RV64IA-WMO-ZACAS-NEXT:    ret
4209;
4210; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4211; RV64IA-TSO-ZACAS:       # %bb.0:
4212; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
4213; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
4214; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
4215; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
4216; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
4217; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
4218; RV64IA-TSO-ZACAS-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4219; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
4220; RV64IA-TSO-ZACAS-NEXT:    and a5, a4, a1
4221; RV64IA-TSO-ZACAS-NEXT:    not a5, a5
4222; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
4223; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
4224; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
4225; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
4226; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB33_1
4227; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
4228; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
4229; RV64IA-TSO-ZACAS-NEXT:    ret
4230;
4231; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4232; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
4233; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
4234; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
4235; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    li a3, 255
4236; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
4237; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
4238; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
4239; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4240; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aq a4, (a2)
4241; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
4242; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
4243; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4244; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
4245; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4246; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4247; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB33_1
4248; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
4249; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
4250; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
4251;
4252; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4253; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
4254; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
4255; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
4256; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    li a3, 255
4257; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
4258; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
4259; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
4260; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB33_1: # =>This Inner Loop Header: Depth=1
4261; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a4, (a2)
4262; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
4263; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
4264; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4265; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
4266; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4267; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
4268; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB33_1
4269; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
4270; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
4271; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
4272;
4273; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4274; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
4275; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
4276; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
4277; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB33_1: # %atomicrmw.start
4278; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4279; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
4280; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
4281; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
4282; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.b.aqrl a0, a3, (a2)
4283; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
4284; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB33_1
4285; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
4286; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
4287;
4288; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
4289; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
4290; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
4291; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
4292; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB33_1: # %atomicrmw.start
4293; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4294; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
4295; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
4296; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
4297; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.b a0, a3, (a2)
4298; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
4299; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB33_1
4300; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
4301; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
4302  %1 = atomicrmw nand ptr %a, i8 %b acq_rel
4303  ret i8 %1
4304}
4305
4306define i8 @atomicrmw_nand_i8_seq_cst(ptr %a, i8 %b) nounwind {
4307; RV32I-LABEL: atomicrmw_nand_i8_seq_cst:
4308; RV32I:       # %bb.0:
4309; RV32I-NEXT:    addi sp, sp, -16
4310; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4311; RV32I-NEXT:    li a2, 5
4312; RV32I-NEXT:    call __atomic_fetch_nand_1
4313; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4314; RV32I-NEXT:    addi sp, sp, 16
4315; RV32I-NEXT:    ret
4316;
4317; RV32IA-LABEL: atomicrmw_nand_i8_seq_cst:
4318; RV32IA:       # %bb.0:
4319; RV32IA-NEXT:    andi a2, a0, -4
4320; RV32IA-NEXT:    slli a0, a0, 3
4321; RV32IA-NEXT:    li a3, 255
4322; RV32IA-NEXT:    andi a1, a1, 255
4323; RV32IA-NEXT:    sll a3, a3, a0
4324; RV32IA-NEXT:    sll a1, a1, a0
4325; RV32IA-NEXT:  .LBB34_1: # =>This Inner Loop Header: Depth=1
4326; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
4327; RV32IA-NEXT:    and a5, a4, a1
4328; RV32IA-NEXT:    not a5, a5
4329; RV32IA-NEXT:    xor a5, a4, a5
4330; RV32IA-NEXT:    and a5, a5, a3
4331; RV32IA-NEXT:    xor a5, a4, a5
4332; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
4333; RV32IA-NEXT:    bnez a5, .LBB34_1
4334; RV32IA-NEXT:  # %bb.2:
4335; RV32IA-NEXT:    srl a0, a4, a0
4336; RV32IA-NEXT:    ret
4337;
4338; RV64I-LABEL: atomicrmw_nand_i8_seq_cst:
4339; RV64I:       # %bb.0:
4340; RV64I-NEXT:    addi sp, sp, -16
4341; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4342; RV64I-NEXT:    li a2, 5
4343; RV64I-NEXT:    call __atomic_fetch_nand_1
4344; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4345; RV64I-NEXT:    addi sp, sp, 16
4346; RV64I-NEXT:    ret
4347;
4348; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
4349; RV64IA-NOZACAS:       # %bb.0:
4350; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
4351; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
4352; RV64IA-NOZACAS-NEXT:    li a3, 255
4353; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
4354; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
4355; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
4356; RV64IA-NOZACAS-NEXT:  .LBB34_1: # =>This Inner Loop Header: Depth=1
4357; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
4358; RV64IA-NOZACAS-NEXT:    and a5, a4, a1
4359; RV64IA-NOZACAS-NEXT:    not a5, a5
4360; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
4361; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
4362; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
4363; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4364; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB34_1
4365; RV64IA-NOZACAS-NEXT:  # %bb.2:
4366; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
4367; RV64IA-NOZACAS-NEXT:    ret
4368;
4369; RV64IA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
4370; RV64IA-ZACAS:       # %bb.0:
4371; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
4372; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
4373; RV64IA-ZACAS-NEXT:    li a3, 255
4374; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
4375; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
4376; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
4377; RV64IA-ZACAS-NEXT:  .LBB34_1: # =>This Inner Loop Header: Depth=1
4378; RV64IA-ZACAS-NEXT:    lr.w.aqrl a4, (a2)
4379; RV64IA-ZACAS-NEXT:    and a5, a4, a1
4380; RV64IA-ZACAS-NEXT:    not a5, a5
4381; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
4382; RV64IA-ZACAS-NEXT:    and a5, a5, a3
4383; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
4384; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4385; RV64IA-ZACAS-NEXT:    bnez a5, .LBB34_1
4386; RV64IA-ZACAS-NEXT:  # %bb.2:
4387; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
4388; RV64IA-ZACAS-NEXT:    ret
4389;
4390; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
4391; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
4392; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
4393; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
4394; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    li a3, 255
4395; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
4396; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
4397; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
4398; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB34_1: # =>This Inner Loop Header: Depth=1
4399; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
4400; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
4401; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
4402; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4403; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
4404; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4405; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4406; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB34_1
4407; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
4408; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
4409; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
4410;
4411; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
4412; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
4413; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
4414; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
4415; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    li a3, 255
4416; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a1, a1, 255
4417; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a3, a3, a0
4418; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
4419; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB34_1: # =>This Inner Loop Header: Depth=1
4420; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
4421; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a4, a1
4422; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
4423; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4424; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a3
4425; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a4, a5
4426; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
4427; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB34_1
4428; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
4429; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a4, a0
4430; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
4431;
4432; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
4433; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
4434; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
4435; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
4436; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB34_1: # %atomicrmw.start
4437; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4438; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
4439; RV64IA-WMO-ZABHA-ZACAS-NEXT:    fence rw, rw
4440; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
4441; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
4442; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.b.aqrl a0, a3, (a2)
4443; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
4444; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB34_1
4445; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
4446; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
4447;
4448; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
4449; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
4450; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
4451; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lbu a0, 0(a0)
4452; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB34_1: # %atomicrmw.start
4453; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
4454; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
4455; RV64IA-TSO-ZABHA-ZACAS-NEXT:    fence rw, rw
4456; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
4457; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 56
4458; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.b a0, a3, (a2)
4459; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 56
4460; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB34_1
4461; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
4462; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
4463  %1 = atomicrmw nand ptr %a, i8 %b seq_cst
4464  ret i8 %1
4465}
4466
4467define i8 @atomicrmw_or_i8_monotonic(ptr %a, i8 %b) nounwind {
4468; RV32I-LABEL: atomicrmw_or_i8_monotonic:
4469; RV32I:       # %bb.0:
4470; RV32I-NEXT:    addi sp, sp, -16
4471; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4472; RV32I-NEXT:    li a2, 0
4473; RV32I-NEXT:    call __atomic_fetch_or_1
4474; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4475; RV32I-NEXT:    addi sp, sp, 16
4476; RV32I-NEXT:    ret
4477;
4478; RV32IA-LABEL: atomicrmw_or_i8_monotonic:
4479; RV32IA:       # %bb.0:
4480; RV32IA-NEXT:    andi a2, a0, -4
4481; RV32IA-NEXT:    slli a0, a0, 3
4482; RV32IA-NEXT:    andi a1, a1, 255
4483; RV32IA-NEXT:    sll a1, a1, a0
4484; RV32IA-NEXT:    amoor.w a1, a1, (a2)
4485; RV32IA-NEXT:    srl a0, a1, a0
4486; RV32IA-NEXT:    ret
4487;
4488; RV64I-LABEL: atomicrmw_or_i8_monotonic:
4489; RV64I:       # %bb.0:
4490; RV64I-NEXT:    addi sp, sp, -16
4491; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4492; RV64I-NEXT:    li a2, 0
4493; RV64I-NEXT:    call __atomic_fetch_or_1
4494; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4495; RV64I-NEXT:    addi sp, sp, 16
4496; RV64I-NEXT:    ret
4497;
4498; RV64IA-NOZACAS-LABEL: atomicrmw_or_i8_monotonic:
4499; RV64IA-NOZACAS:       # %bb.0:
4500; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
4501; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
4502; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
4503; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
4504; RV64IA-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
4505; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
4506; RV64IA-NOZACAS-NEXT:    ret
4507;
4508; RV64IA-ZACAS-LABEL: atomicrmw_or_i8_monotonic:
4509; RV64IA-ZACAS:       # %bb.0:
4510; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
4511; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
4512; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
4513; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
4514; RV64IA-ZACAS-NEXT:    amoor.w a1, a1, (a2)
4515; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
4516; RV64IA-ZACAS-NEXT:    ret
4517;
4518; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_monotonic:
4519; RV64IA-WMO-ZABHA:       # %bb.0:
4520; RV64IA-WMO-ZABHA-NEXT:    amoor.b a0, a1, (a0)
4521; RV64IA-WMO-ZABHA-NEXT:    ret
4522;
4523; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_monotonic:
4524; RV64IA-TSO-ZABHA:       # %bb.0:
4525; RV64IA-TSO-ZABHA-NEXT:    amoor.b a0, a1, (a0)
4526; RV64IA-TSO-ZABHA-NEXT:    ret
4527  %1 = atomicrmw or ptr %a, i8 %b monotonic
4528  ret i8 %1
4529}
4530
4531define i8 @atomicrmw_or_i8_acquire(ptr %a, i8 %b) nounwind {
4532; RV32I-LABEL: atomicrmw_or_i8_acquire:
4533; RV32I:       # %bb.0:
4534; RV32I-NEXT:    addi sp, sp, -16
4535; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4536; RV32I-NEXT:    li a2, 2
4537; RV32I-NEXT:    call __atomic_fetch_or_1
4538; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4539; RV32I-NEXT:    addi sp, sp, 16
4540; RV32I-NEXT:    ret
4541;
4542; RV32IA-WMO-LABEL: atomicrmw_or_i8_acquire:
4543; RV32IA-WMO:       # %bb.0:
4544; RV32IA-WMO-NEXT:    andi a2, a0, -4
4545; RV32IA-WMO-NEXT:    slli a0, a0, 3
4546; RV32IA-WMO-NEXT:    andi a1, a1, 255
4547; RV32IA-WMO-NEXT:    sll a1, a1, a0
4548; RV32IA-WMO-NEXT:    amoor.w.aq a1, a1, (a2)
4549; RV32IA-WMO-NEXT:    srl a0, a1, a0
4550; RV32IA-WMO-NEXT:    ret
4551;
4552; RV32IA-TSO-LABEL: atomicrmw_or_i8_acquire:
4553; RV32IA-TSO:       # %bb.0:
4554; RV32IA-TSO-NEXT:    andi a2, a0, -4
4555; RV32IA-TSO-NEXT:    slli a0, a0, 3
4556; RV32IA-TSO-NEXT:    andi a1, a1, 255
4557; RV32IA-TSO-NEXT:    sll a1, a1, a0
4558; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
4559; RV32IA-TSO-NEXT:    srl a0, a1, a0
4560; RV32IA-TSO-NEXT:    ret
4561;
4562; RV64I-LABEL: atomicrmw_or_i8_acquire:
4563; RV64I:       # %bb.0:
4564; RV64I-NEXT:    addi sp, sp, -16
4565; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4566; RV64I-NEXT:    li a2, 2
4567; RV64I-NEXT:    call __atomic_fetch_or_1
4568; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4569; RV64I-NEXT:    addi sp, sp, 16
4570; RV64I-NEXT:    ret
4571;
4572; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_acquire:
4573; RV64IA-WMO-NOZACAS:       # %bb.0:
4574; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
4575; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
4576; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
4577; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
4578; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aq a1, a1, (a2)
4579; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
4580; RV64IA-WMO-NOZACAS-NEXT:    ret
4581;
4582; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_acquire:
4583; RV64IA-TSO-NOZACAS:       # %bb.0:
4584; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
4585; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
4586; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
4587; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
4588; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
4589; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
4590; RV64IA-TSO-NOZACAS-NEXT:    ret
4591;
4592; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_acquire:
4593; RV64IA-WMO-ZACAS:       # %bb.0:
4594; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
4595; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
4596; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
4597; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
4598; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aq a1, a1, (a2)
4599; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
4600; RV64IA-WMO-ZACAS-NEXT:    ret
4601;
4602; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_acquire:
4603; RV64IA-TSO-ZACAS:       # %bb.0:
4604; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
4605; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
4606; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
4607; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
4608; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
4609; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
4610; RV64IA-TSO-ZACAS-NEXT:    ret
4611;
4612; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_acquire:
4613; RV64IA-WMO-ZABHA:       # %bb.0:
4614; RV64IA-WMO-ZABHA-NEXT:    amoor.b.aq a0, a1, (a0)
4615; RV64IA-WMO-ZABHA-NEXT:    ret
4616;
4617; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_acquire:
4618; RV64IA-TSO-ZABHA:       # %bb.0:
4619; RV64IA-TSO-ZABHA-NEXT:    amoor.b a0, a1, (a0)
4620; RV64IA-TSO-ZABHA-NEXT:    ret
4621  %1 = atomicrmw or ptr %a, i8 %b acquire
4622  ret i8 %1
4623}
4624
4625define i8 @atomicrmw_or_i8_release(ptr %a, i8 %b) nounwind {
4626; RV32I-LABEL: atomicrmw_or_i8_release:
4627; RV32I:       # %bb.0:
4628; RV32I-NEXT:    addi sp, sp, -16
4629; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4630; RV32I-NEXT:    li a2, 3
4631; RV32I-NEXT:    call __atomic_fetch_or_1
4632; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4633; RV32I-NEXT:    addi sp, sp, 16
4634; RV32I-NEXT:    ret
4635;
4636; RV32IA-WMO-LABEL: atomicrmw_or_i8_release:
4637; RV32IA-WMO:       # %bb.0:
4638; RV32IA-WMO-NEXT:    andi a2, a0, -4
4639; RV32IA-WMO-NEXT:    slli a0, a0, 3
4640; RV32IA-WMO-NEXT:    andi a1, a1, 255
4641; RV32IA-WMO-NEXT:    sll a1, a1, a0
4642; RV32IA-WMO-NEXT:    amoor.w.rl a1, a1, (a2)
4643; RV32IA-WMO-NEXT:    srl a0, a1, a0
4644; RV32IA-WMO-NEXT:    ret
4645;
4646; RV32IA-TSO-LABEL: atomicrmw_or_i8_release:
4647; RV32IA-TSO:       # %bb.0:
4648; RV32IA-TSO-NEXT:    andi a2, a0, -4
4649; RV32IA-TSO-NEXT:    slli a0, a0, 3
4650; RV32IA-TSO-NEXT:    andi a1, a1, 255
4651; RV32IA-TSO-NEXT:    sll a1, a1, a0
4652; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
4653; RV32IA-TSO-NEXT:    srl a0, a1, a0
4654; RV32IA-TSO-NEXT:    ret
4655;
4656; RV64I-LABEL: atomicrmw_or_i8_release:
4657; RV64I:       # %bb.0:
4658; RV64I-NEXT:    addi sp, sp, -16
4659; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4660; RV64I-NEXT:    li a2, 3
4661; RV64I-NEXT:    call __atomic_fetch_or_1
4662; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4663; RV64I-NEXT:    addi sp, sp, 16
4664; RV64I-NEXT:    ret
4665;
4666; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_release:
4667; RV64IA-WMO-NOZACAS:       # %bb.0:
4668; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
4669; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
4670; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
4671; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
4672; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.rl a1, a1, (a2)
4673; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
4674; RV64IA-WMO-NOZACAS-NEXT:    ret
4675;
4676; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_release:
4677; RV64IA-TSO-NOZACAS:       # %bb.0:
4678; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
4679; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
4680; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
4681; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
4682; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
4683; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
4684; RV64IA-TSO-NOZACAS-NEXT:    ret
4685;
4686; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_release:
4687; RV64IA-WMO-ZACAS:       # %bb.0:
4688; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
4689; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
4690; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
4691; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
4692; RV64IA-WMO-ZACAS-NEXT:    amoor.w.rl a1, a1, (a2)
4693; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
4694; RV64IA-WMO-ZACAS-NEXT:    ret
4695;
4696; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_release:
4697; RV64IA-TSO-ZACAS:       # %bb.0:
4698; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
4699; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
4700; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
4701; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
4702; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
4703; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
4704; RV64IA-TSO-ZACAS-NEXT:    ret
4705;
4706; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_release:
4707; RV64IA-WMO-ZABHA:       # %bb.0:
4708; RV64IA-WMO-ZABHA-NEXT:    amoor.b.rl a0, a1, (a0)
4709; RV64IA-WMO-ZABHA-NEXT:    ret
4710;
4711; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_release:
4712; RV64IA-TSO-ZABHA:       # %bb.0:
4713; RV64IA-TSO-ZABHA-NEXT:    amoor.b a0, a1, (a0)
4714; RV64IA-TSO-ZABHA-NEXT:    ret
4715  %1 = atomicrmw or ptr %a, i8 %b release
4716  ret i8 %1
4717}
4718
4719define i8 @atomicrmw_or_i8_acq_rel(ptr %a, i8 %b) nounwind {
4720; RV32I-LABEL: atomicrmw_or_i8_acq_rel:
4721; RV32I:       # %bb.0:
4722; RV32I-NEXT:    addi sp, sp, -16
4723; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4724; RV32I-NEXT:    li a2, 4
4725; RV32I-NEXT:    call __atomic_fetch_or_1
4726; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4727; RV32I-NEXT:    addi sp, sp, 16
4728; RV32I-NEXT:    ret
4729;
4730; RV32IA-WMO-LABEL: atomicrmw_or_i8_acq_rel:
4731; RV32IA-WMO:       # %bb.0:
4732; RV32IA-WMO-NEXT:    andi a2, a0, -4
4733; RV32IA-WMO-NEXT:    slli a0, a0, 3
4734; RV32IA-WMO-NEXT:    andi a1, a1, 255
4735; RV32IA-WMO-NEXT:    sll a1, a1, a0
4736; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a1, (a2)
4737; RV32IA-WMO-NEXT:    srl a0, a1, a0
4738; RV32IA-WMO-NEXT:    ret
4739;
4740; RV32IA-TSO-LABEL: atomicrmw_or_i8_acq_rel:
4741; RV32IA-TSO:       # %bb.0:
4742; RV32IA-TSO-NEXT:    andi a2, a0, -4
4743; RV32IA-TSO-NEXT:    slli a0, a0, 3
4744; RV32IA-TSO-NEXT:    andi a1, a1, 255
4745; RV32IA-TSO-NEXT:    sll a1, a1, a0
4746; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
4747; RV32IA-TSO-NEXT:    srl a0, a1, a0
4748; RV32IA-TSO-NEXT:    ret
4749;
4750; RV64I-LABEL: atomicrmw_or_i8_acq_rel:
4751; RV64I:       # %bb.0:
4752; RV64I-NEXT:    addi sp, sp, -16
4753; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4754; RV64I-NEXT:    li a2, 4
4755; RV64I-NEXT:    call __atomic_fetch_or_1
4756; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4757; RV64I-NEXT:    addi sp, sp, 16
4758; RV64I-NEXT:    ret
4759;
4760; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_acq_rel:
4761; RV64IA-WMO-NOZACAS:       # %bb.0:
4762; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
4763; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
4764; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
4765; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
4766; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
4767; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
4768; RV64IA-WMO-NOZACAS-NEXT:    ret
4769;
4770; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_acq_rel:
4771; RV64IA-TSO-NOZACAS:       # %bb.0:
4772; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
4773; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
4774; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
4775; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
4776; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
4777; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
4778; RV64IA-TSO-NOZACAS-NEXT:    ret
4779;
4780; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_acq_rel:
4781; RV64IA-WMO-ZACAS:       # %bb.0:
4782; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
4783; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
4784; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
4785; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
4786; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
4787; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
4788; RV64IA-WMO-ZACAS-NEXT:    ret
4789;
4790; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_acq_rel:
4791; RV64IA-TSO-ZACAS:       # %bb.0:
4792; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
4793; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
4794; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
4795; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
4796; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
4797; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
4798; RV64IA-TSO-ZACAS-NEXT:    ret
4799;
4800; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_acq_rel:
4801; RV64IA-WMO-ZABHA:       # %bb.0:
4802; RV64IA-WMO-ZABHA-NEXT:    amoor.b.aqrl a0, a1, (a0)
4803; RV64IA-WMO-ZABHA-NEXT:    ret
4804;
4805; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_acq_rel:
4806; RV64IA-TSO-ZABHA:       # %bb.0:
4807; RV64IA-TSO-ZABHA-NEXT:    amoor.b a0, a1, (a0)
4808; RV64IA-TSO-ZABHA-NEXT:    ret
4809  %1 = atomicrmw or ptr %a, i8 %b acq_rel
4810  ret i8 %1
4811}
4812
4813define i8 @atomicrmw_or_i8_seq_cst(ptr %a, i8 %b) nounwind {
4814; RV32I-LABEL: atomicrmw_or_i8_seq_cst:
4815; RV32I:       # %bb.0:
4816; RV32I-NEXT:    addi sp, sp, -16
4817; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4818; RV32I-NEXT:    li a2, 5
4819; RV32I-NEXT:    call __atomic_fetch_or_1
4820; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4821; RV32I-NEXT:    addi sp, sp, 16
4822; RV32I-NEXT:    ret
4823;
4824; RV32IA-WMO-LABEL: atomicrmw_or_i8_seq_cst:
4825; RV32IA-WMO:       # %bb.0:
4826; RV32IA-WMO-NEXT:    andi a2, a0, -4
4827; RV32IA-WMO-NEXT:    slli a0, a0, 3
4828; RV32IA-WMO-NEXT:    andi a1, a1, 255
4829; RV32IA-WMO-NEXT:    sll a1, a1, a0
4830; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a1, (a2)
4831; RV32IA-WMO-NEXT:    srl a0, a1, a0
4832; RV32IA-WMO-NEXT:    ret
4833;
4834; RV32IA-TSO-LABEL: atomicrmw_or_i8_seq_cst:
4835; RV32IA-TSO:       # %bb.0:
4836; RV32IA-TSO-NEXT:    andi a2, a0, -4
4837; RV32IA-TSO-NEXT:    slli a0, a0, 3
4838; RV32IA-TSO-NEXT:    andi a1, a1, 255
4839; RV32IA-TSO-NEXT:    sll a1, a1, a0
4840; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
4841; RV32IA-TSO-NEXT:    srl a0, a1, a0
4842; RV32IA-TSO-NEXT:    ret
4843;
4844; RV64I-LABEL: atomicrmw_or_i8_seq_cst:
4845; RV64I:       # %bb.0:
4846; RV64I-NEXT:    addi sp, sp, -16
4847; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4848; RV64I-NEXT:    li a2, 5
4849; RV64I-NEXT:    call __atomic_fetch_or_1
4850; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4851; RV64I-NEXT:    addi sp, sp, 16
4852; RV64I-NEXT:    ret
4853;
4854; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_seq_cst:
4855; RV64IA-WMO-NOZACAS:       # %bb.0:
4856; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
4857; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
4858; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
4859; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
4860; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
4861; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
4862; RV64IA-WMO-NOZACAS-NEXT:    ret
4863;
4864; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_seq_cst:
4865; RV64IA-TSO-NOZACAS:       # %bb.0:
4866; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
4867; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
4868; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
4869; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
4870; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
4871; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
4872; RV64IA-TSO-NOZACAS-NEXT:    ret
4873;
4874; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_seq_cst:
4875; RV64IA-WMO-ZACAS:       # %bb.0:
4876; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
4877; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
4878; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
4879; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
4880; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
4881; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
4882; RV64IA-WMO-ZACAS-NEXT:    ret
4883;
4884; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_seq_cst:
4885; RV64IA-TSO-ZACAS:       # %bb.0:
4886; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
4887; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
4888; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
4889; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
4890; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
4891; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
4892; RV64IA-TSO-ZACAS-NEXT:    ret
4893;
4894; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_seq_cst:
4895; RV64IA-WMO-ZABHA:       # %bb.0:
4896; RV64IA-WMO-ZABHA-NEXT:    amoor.b.aqrl a0, a1, (a0)
4897; RV64IA-WMO-ZABHA-NEXT:    ret
4898;
4899; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_seq_cst:
4900; RV64IA-TSO-ZABHA:       # %bb.0:
4901; RV64IA-TSO-ZABHA-NEXT:    amoor.b a0, a1, (a0)
4902; RV64IA-TSO-ZABHA-NEXT:    ret
4903  %1 = atomicrmw or ptr %a, i8 %b seq_cst
4904  ret i8 %1
4905}
4906
4907define i8 @atomicrmw_xor_i8_monotonic(ptr %a, i8 %b) nounwind {
4908; RV32I-LABEL: atomicrmw_xor_i8_monotonic:
4909; RV32I:       # %bb.0:
4910; RV32I-NEXT:    addi sp, sp, -16
4911; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4912; RV32I-NEXT:    li a2, 0
4913; RV32I-NEXT:    call __atomic_fetch_xor_1
4914; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4915; RV32I-NEXT:    addi sp, sp, 16
4916; RV32I-NEXT:    ret
4917;
4918; RV32IA-LABEL: atomicrmw_xor_i8_monotonic:
4919; RV32IA:       # %bb.0:
4920; RV32IA-NEXT:    andi a2, a0, -4
4921; RV32IA-NEXT:    slli a0, a0, 3
4922; RV32IA-NEXT:    andi a1, a1, 255
4923; RV32IA-NEXT:    sll a1, a1, a0
4924; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
4925; RV32IA-NEXT:    srl a0, a1, a0
4926; RV32IA-NEXT:    ret
4927;
4928; RV64I-LABEL: atomicrmw_xor_i8_monotonic:
4929; RV64I:       # %bb.0:
4930; RV64I-NEXT:    addi sp, sp, -16
4931; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4932; RV64I-NEXT:    li a2, 0
4933; RV64I-NEXT:    call __atomic_fetch_xor_1
4934; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4935; RV64I-NEXT:    addi sp, sp, 16
4936; RV64I-NEXT:    ret
4937;
4938; RV64IA-NOZACAS-LABEL: atomicrmw_xor_i8_monotonic:
4939; RV64IA-NOZACAS:       # %bb.0:
4940; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
4941; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
4942; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
4943; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
4944; RV64IA-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
4945; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
4946; RV64IA-NOZACAS-NEXT:    ret
4947;
4948; RV64IA-ZACAS-LABEL: atomicrmw_xor_i8_monotonic:
4949; RV64IA-ZACAS:       # %bb.0:
4950; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
4951; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
4952; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
4953; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
4954; RV64IA-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
4955; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
4956; RV64IA-ZACAS-NEXT:    ret
4957;
4958; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_monotonic:
4959; RV64IA-WMO-ZABHA:       # %bb.0:
4960; RV64IA-WMO-ZABHA-NEXT:    amoxor.b a0, a1, (a0)
4961; RV64IA-WMO-ZABHA-NEXT:    ret
4962;
4963; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_monotonic:
4964; RV64IA-TSO-ZABHA:       # %bb.0:
4965; RV64IA-TSO-ZABHA-NEXT:    amoxor.b a0, a1, (a0)
4966; RV64IA-TSO-ZABHA-NEXT:    ret
4967  %1 = atomicrmw xor ptr %a, i8 %b monotonic
4968  ret i8 %1
4969}
4970
4971define i8 @atomicrmw_xor_i8_acquire(ptr %a, i8 %b) nounwind {
4972; RV32I-LABEL: atomicrmw_xor_i8_acquire:
4973; RV32I:       # %bb.0:
4974; RV32I-NEXT:    addi sp, sp, -16
4975; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4976; RV32I-NEXT:    li a2, 2
4977; RV32I-NEXT:    call __atomic_fetch_xor_1
4978; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4979; RV32I-NEXT:    addi sp, sp, 16
4980; RV32I-NEXT:    ret
4981;
4982; RV32IA-WMO-LABEL: atomicrmw_xor_i8_acquire:
4983; RV32IA-WMO:       # %bb.0:
4984; RV32IA-WMO-NEXT:    andi a2, a0, -4
4985; RV32IA-WMO-NEXT:    slli a0, a0, 3
4986; RV32IA-WMO-NEXT:    andi a1, a1, 255
4987; RV32IA-WMO-NEXT:    sll a1, a1, a0
4988; RV32IA-WMO-NEXT:    amoxor.w.aq a1, a1, (a2)
4989; RV32IA-WMO-NEXT:    srl a0, a1, a0
4990; RV32IA-WMO-NEXT:    ret
4991;
4992; RV32IA-TSO-LABEL: atomicrmw_xor_i8_acquire:
4993; RV32IA-TSO:       # %bb.0:
4994; RV32IA-TSO-NEXT:    andi a2, a0, -4
4995; RV32IA-TSO-NEXT:    slli a0, a0, 3
4996; RV32IA-TSO-NEXT:    andi a1, a1, 255
4997; RV32IA-TSO-NEXT:    sll a1, a1, a0
4998; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
4999; RV32IA-TSO-NEXT:    srl a0, a1, a0
5000; RV32IA-TSO-NEXT:    ret
5001;
5002; RV64I-LABEL: atomicrmw_xor_i8_acquire:
5003; RV64I:       # %bb.0:
5004; RV64I-NEXT:    addi sp, sp, -16
5005; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5006; RV64I-NEXT:    li a2, 2
5007; RV64I-NEXT:    call __atomic_fetch_xor_1
5008; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5009; RV64I-NEXT:    addi sp, sp, 16
5010; RV64I-NEXT:    ret
5011;
5012; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_acquire:
5013; RV64IA-WMO-NOZACAS:       # %bb.0:
5014; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
5015; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
5016; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
5017; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
5018; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.aq a1, a1, (a2)
5019; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
5020; RV64IA-WMO-NOZACAS-NEXT:    ret
5021;
5022; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_acquire:
5023; RV64IA-TSO-NOZACAS:       # %bb.0:
5024; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
5025; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
5026; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
5027; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
5028; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
5029; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
5030; RV64IA-TSO-NOZACAS-NEXT:    ret
5031;
5032; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_acquire:
5033; RV64IA-WMO-ZACAS:       # %bb.0:
5034; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
5035; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
5036; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
5037; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
5038; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.aq a1, a1, (a2)
5039; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
5040; RV64IA-WMO-ZACAS-NEXT:    ret
5041;
5042; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_acquire:
5043; RV64IA-TSO-ZACAS:       # %bb.0:
5044; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
5045; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
5046; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
5047; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
5048; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
5049; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
5050; RV64IA-TSO-ZACAS-NEXT:    ret
5051;
5052; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_acquire:
5053; RV64IA-WMO-ZABHA:       # %bb.0:
5054; RV64IA-WMO-ZABHA-NEXT:    amoxor.b.aq a0, a1, (a0)
5055; RV64IA-WMO-ZABHA-NEXT:    ret
5056;
5057; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_acquire:
5058; RV64IA-TSO-ZABHA:       # %bb.0:
5059; RV64IA-TSO-ZABHA-NEXT:    amoxor.b a0, a1, (a0)
5060; RV64IA-TSO-ZABHA-NEXT:    ret
5061  %1 = atomicrmw xor ptr %a, i8 %b acquire
5062  ret i8 %1
5063}
5064
5065define i8 @atomicrmw_xor_i8_release(ptr %a, i8 %b) nounwind {
5066; RV32I-LABEL: atomicrmw_xor_i8_release:
5067; RV32I:       # %bb.0:
5068; RV32I-NEXT:    addi sp, sp, -16
5069; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5070; RV32I-NEXT:    li a2, 3
5071; RV32I-NEXT:    call __atomic_fetch_xor_1
5072; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5073; RV32I-NEXT:    addi sp, sp, 16
5074; RV32I-NEXT:    ret
5075;
5076; RV32IA-WMO-LABEL: atomicrmw_xor_i8_release:
5077; RV32IA-WMO:       # %bb.0:
5078; RV32IA-WMO-NEXT:    andi a2, a0, -4
5079; RV32IA-WMO-NEXT:    slli a0, a0, 3
5080; RV32IA-WMO-NEXT:    andi a1, a1, 255
5081; RV32IA-WMO-NEXT:    sll a1, a1, a0
5082; RV32IA-WMO-NEXT:    amoxor.w.rl a1, a1, (a2)
5083; RV32IA-WMO-NEXT:    srl a0, a1, a0
5084; RV32IA-WMO-NEXT:    ret
5085;
5086; RV32IA-TSO-LABEL: atomicrmw_xor_i8_release:
5087; RV32IA-TSO:       # %bb.0:
5088; RV32IA-TSO-NEXT:    andi a2, a0, -4
5089; RV32IA-TSO-NEXT:    slli a0, a0, 3
5090; RV32IA-TSO-NEXT:    andi a1, a1, 255
5091; RV32IA-TSO-NEXT:    sll a1, a1, a0
5092; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
5093; RV32IA-TSO-NEXT:    srl a0, a1, a0
5094; RV32IA-TSO-NEXT:    ret
5095;
5096; RV64I-LABEL: atomicrmw_xor_i8_release:
5097; RV64I:       # %bb.0:
5098; RV64I-NEXT:    addi sp, sp, -16
5099; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5100; RV64I-NEXT:    li a2, 3
5101; RV64I-NEXT:    call __atomic_fetch_xor_1
5102; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5103; RV64I-NEXT:    addi sp, sp, 16
5104; RV64I-NEXT:    ret
5105;
5106; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_release:
5107; RV64IA-WMO-NOZACAS:       # %bb.0:
5108; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
5109; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
5110; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
5111; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
5112; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.rl a1, a1, (a2)
5113; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
5114; RV64IA-WMO-NOZACAS-NEXT:    ret
5115;
5116; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_release:
5117; RV64IA-TSO-NOZACAS:       # %bb.0:
5118; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
5119; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
5120; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
5121; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
5122; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
5123; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
5124; RV64IA-TSO-NOZACAS-NEXT:    ret
5125;
5126; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_release:
5127; RV64IA-WMO-ZACAS:       # %bb.0:
5128; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
5129; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
5130; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
5131; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
5132; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.rl a1, a1, (a2)
5133; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
5134; RV64IA-WMO-ZACAS-NEXT:    ret
5135;
5136; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_release:
5137; RV64IA-TSO-ZACAS:       # %bb.0:
5138; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
5139; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
5140; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
5141; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
5142; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
5143; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
5144; RV64IA-TSO-ZACAS-NEXT:    ret
5145;
5146; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_release:
5147; RV64IA-WMO-ZABHA:       # %bb.0:
5148; RV64IA-WMO-ZABHA-NEXT:    amoxor.b.rl a0, a1, (a0)
5149; RV64IA-WMO-ZABHA-NEXT:    ret
5150;
5151; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_release:
5152; RV64IA-TSO-ZABHA:       # %bb.0:
5153; RV64IA-TSO-ZABHA-NEXT:    amoxor.b a0, a1, (a0)
5154; RV64IA-TSO-ZABHA-NEXT:    ret
5155  %1 = atomicrmw xor ptr %a, i8 %b release
5156  ret i8 %1
5157}
5158
5159define i8 @atomicrmw_xor_i8_acq_rel(ptr %a, i8 %b) nounwind {
5160; RV32I-LABEL: atomicrmw_xor_i8_acq_rel:
5161; RV32I:       # %bb.0:
5162; RV32I-NEXT:    addi sp, sp, -16
5163; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5164; RV32I-NEXT:    li a2, 4
5165; RV32I-NEXT:    call __atomic_fetch_xor_1
5166; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5167; RV32I-NEXT:    addi sp, sp, 16
5168; RV32I-NEXT:    ret
5169;
5170; RV32IA-WMO-LABEL: atomicrmw_xor_i8_acq_rel:
5171; RV32IA-WMO:       # %bb.0:
5172; RV32IA-WMO-NEXT:    andi a2, a0, -4
5173; RV32IA-WMO-NEXT:    slli a0, a0, 3
5174; RV32IA-WMO-NEXT:    andi a1, a1, 255
5175; RV32IA-WMO-NEXT:    sll a1, a1, a0
5176; RV32IA-WMO-NEXT:    amoxor.w.aqrl a1, a1, (a2)
5177; RV32IA-WMO-NEXT:    srl a0, a1, a0
5178; RV32IA-WMO-NEXT:    ret
5179;
5180; RV32IA-TSO-LABEL: atomicrmw_xor_i8_acq_rel:
5181; RV32IA-TSO:       # %bb.0:
5182; RV32IA-TSO-NEXT:    andi a2, a0, -4
5183; RV32IA-TSO-NEXT:    slli a0, a0, 3
5184; RV32IA-TSO-NEXT:    andi a1, a1, 255
5185; RV32IA-TSO-NEXT:    sll a1, a1, a0
5186; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
5187; RV32IA-TSO-NEXT:    srl a0, a1, a0
5188; RV32IA-TSO-NEXT:    ret
5189;
5190; RV64I-LABEL: atomicrmw_xor_i8_acq_rel:
5191; RV64I:       # %bb.0:
5192; RV64I-NEXT:    addi sp, sp, -16
5193; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5194; RV64I-NEXT:    li a2, 4
5195; RV64I-NEXT:    call __atomic_fetch_xor_1
5196; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5197; RV64I-NEXT:    addi sp, sp, 16
5198; RV64I-NEXT:    ret
5199;
5200; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
5201; RV64IA-WMO-NOZACAS:       # %bb.0:
5202; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
5203; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
5204; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
5205; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
5206; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
5207; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
5208; RV64IA-WMO-NOZACAS-NEXT:    ret
5209;
5210; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
5211; RV64IA-TSO-NOZACAS:       # %bb.0:
5212; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
5213; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
5214; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
5215; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
5216; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
5217; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
5218; RV64IA-TSO-NOZACAS-NEXT:    ret
5219;
5220; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
5221; RV64IA-WMO-ZACAS:       # %bb.0:
5222; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
5223; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
5224; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
5225; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
5226; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
5227; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
5228; RV64IA-WMO-ZACAS-NEXT:    ret
5229;
5230; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
5231; RV64IA-TSO-ZACAS:       # %bb.0:
5232; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
5233; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
5234; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
5235; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
5236; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
5237; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
5238; RV64IA-TSO-ZACAS-NEXT:    ret
5239;
5240; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_acq_rel:
5241; RV64IA-WMO-ZABHA:       # %bb.0:
5242; RV64IA-WMO-ZABHA-NEXT:    amoxor.b.aqrl a0, a1, (a0)
5243; RV64IA-WMO-ZABHA-NEXT:    ret
5244;
5245; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_acq_rel:
5246; RV64IA-TSO-ZABHA:       # %bb.0:
5247; RV64IA-TSO-ZABHA-NEXT:    amoxor.b a0, a1, (a0)
5248; RV64IA-TSO-ZABHA-NEXT:    ret
5249  %1 = atomicrmw xor ptr %a, i8 %b acq_rel
5250  ret i8 %1
5251}
5252
5253define i8 @atomicrmw_xor_i8_seq_cst(ptr %a, i8 %b) nounwind {
5254; RV32I-LABEL: atomicrmw_xor_i8_seq_cst:
5255; RV32I:       # %bb.0:
5256; RV32I-NEXT:    addi sp, sp, -16
5257; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5258; RV32I-NEXT:    li a2, 5
5259; RV32I-NEXT:    call __atomic_fetch_xor_1
5260; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5261; RV32I-NEXT:    addi sp, sp, 16
5262; RV32I-NEXT:    ret
5263;
5264; RV32IA-WMO-LABEL: atomicrmw_xor_i8_seq_cst:
5265; RV32IA-WMO:       # %bb.0:
5266; RV32IA-WMO-NEXT:    andi a2, a0, -4
5267; RV32IA-WMO-NEXT:    slli a0, a0, 3
5268; RV32IA-WMO-NEXT:    andi a1, a1, 255
5269; RV32IA-WMO-NEXT:    sll a1, a1, a0
5270; RV32IA-WMO-NEXT:    amoxor.w.aqrl a1, a1, (a2)
5271; RV32IA-WMO-NEXT:    srl a0, a1, a0
5272; RV32IA-WMO-NEXT:    ret
5273;
5274; RV32IA-TSO-LABEL: atomicrmw_xor_i8_seq_cst:
5275; RV32IA-TSO:       # %bb.0:
5276; RV32IA-TSO-NEXT:    andi a2, a0, -4
5277; RV32IA-TSO-NEXT:    slli a0, a0, 3
5278; RV32IA-TSO-NEXT:    andi a1, a1, 255
5279; RV32IA-TSO-NEXT:    sll a1, a1, a0
5280; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
5281; RV32IA-TSO-NEXT:    srl a0, a1, a0
5282; RV32IA-TSO-NEXT:    ret
5283;
5284; RV64I-LABEL: atomicrmw_xor_i8_seq_cst:
5285; RV64I:       # %bb.0:
5286; RV64I-NEXT:    addi sp, sp, -16
5287; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5288; RV64I-NEXT:    li a2, 5
5289; RV64I-NEXT:    call __atomic_fetch_xor_1
5290; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5291; RV64I-NEXT:    addi sp, sp, 16
5292; RV64I-NEXT:    ret
5293;
5294; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
5295; RV64IA-WMO-NOZACAS:       # %bb.0:
5296; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
5297; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
5298; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
5299; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
5300; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
5301; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
5302; RV64IA-WMO-NOZACAS-NEXT:    ret
5303;
5304; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
5305; RV64IA-TSO-NOZACAS:       # %bb.0:
5306; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
5307; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
5308; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
5309; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
5310; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
5311; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
5312; RV64IA-TSO-NOZACAS-NEXT:    ret
5313;
5314; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
5315; RV64IA-WMO-ZACAS:       # %bb.0:
5316; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
5317; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
5318; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
5319; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
5320; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
5321; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
5322; RV64IA-WMO-ZACAS-NEXT:    ret
5323;
5324; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
5325; RV64IA-TSO-ZACAS:       # %bb.0:
5326; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
5327; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
5328; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
5329; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
5330; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
5331; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
5332; RV64IA-TSO-ZACAS-NEXT:    ret
5333;
5334; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_seq_cst:
5335; RV64IA-WMO-ZABHA:       # %bb.0:
5336; RV64IA-WMO-ZABHA-NEXT:    amoxor.b.aqrl a0, a1, (a0)
5337; RV64IA-WMO-ZABHA-NEXT:    ret
5338;
5339; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_seq_cst:
5340; RV64IA-TSO-ZABHA:       # %bb.0:
5341; RV64IA-TSO-ZABHA-NEXT:    amoxor.b a0, a1, (a0)
5342; RV64IA-TSO-ZABHA-NEXT:    ret
5343  %1 = atomicrmw xor ptr %a, i8 %b seq_cst
5344  ret i8 %1
5345}
5346
5347define i8 @atomicrmw_max_i8_monotonic(ptr %a, i8 %b) nounwind {
5348; RV32I-LABEL: atomicrmw_max_i8_monotonic:
5349; RV32I:       # %bb.0:
5350; RV32I-NEXT:    addi sp, sp, -32
5351; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
5352; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
5353; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
5354; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
5355; RV32I-NEXT:    mv s0, a0
5356; RV32I-NEXT:    lbu a3, 0(a0)
5357; RV32I-NEXT:    mv s1, a1
5358; RV32I-NEXT:    slli a0, a1, 24
5359; RV32I-NEXT:    srai s2, a0, 24
5360; RV32I-NEXT:    j .LBB45_2
5361; RV32I-NEXT:  .LBB45_1: # %atomicrmw.start
5362; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
5363; RV32I-NEXT:    sb a3, 15(sp)
5364; RV32I-NEXT:    addi a1, sp, 15
5365; RV32I-NEXT:    mv a0, s0
5366; RV32I-NEXT:    li a3, 0
5367; RV32I-NEXT:    li a4, 0
5368; RV32I-NEXT:    call __atomic_compare_exchange_1
5369; RV32I-NEXT:    lbu a3, 15(sp)
5370; RV32I-NEXT:    bnez a0, .LBB45_4
5371; RV32I-NEXT:  .LBB45_2: # %atomicrmw.start
5372; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
5373; RV32I-NEXT:    slli a0, a3, 24
5374; RV32I-NEXT:    srai a0, a0, 24
5375; RV32I-NEXT:    mv a2, a3
5376; RV32I-NEXT:    blt s2, a0, .LBB45_1
5377; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
5378; RV32I-NEXT:    # in Loop: Header=BB45_2 Depth=1
5379; RV32I-NEXT:    mv a2, s1
5380; RV32I-NEXT:    j .LBB45_1
5381; RV32I-NEXT:  .LBB45_4: # %atomicrmw.end
5382; RV32I-NEXT:    mv a0, a3
5383; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
5384; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
5385; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
5386; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
5387; RV32I-NEXT:    addi sp, sp, 32
5388; RV32I-NEXT:    ret
5389;
5390; RV32IA-LABEL: atomicrmw_max_i8_monotonic:
5391; RV32IA:       # %bb.0:
5392; RV32IA-NEXT:    andi a2, a0, -4
5393; RV32IA-NEXT:    slli a0, a0, 3
5394; RV32IA-NEXT:    li a3, 255
5395; RV32IA-NEXT:    slli a1, a1, 24
5396; RV32IA-NEXT:    andi a4, a0, 24
5397; RV32IA-NEXT:    sll a3, a3, a0
5398; RV32IA-NEXT:    srai a1, a1, 24
5399; RV32IA-NEXT:    sll a1, a1, a0
5400; RV32IA-NEXT:    xori a4, a4, 24
5401; RV32IA-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
5402; RV32IA-NEXT:    lr.w a5, (a2)
5403; RV32IA-NEXT:    and a7, a5, a3
5404; RV32IA-NEXT:    mv a6, a5
5405; RV32IA-NEXT:    sll a7, a7, a4
5406; RV32IA-NEXT:    sra a7, a7, a4
5407; RV32IA-NEXT:    bge a7, a1, .LBB45_3
5408; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
5409; RV32IA-NEXT:    xor a6, a5, a1
5410; RV32IA-NEXT:    and a6, a6, a3
5411; RV32IA-NEXT:    xor a6, a5, a6
5412; RV32IA-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
5413; RV32IA-NEXT:    sc.w a6, a6, (a2)
5414; RV32IA-NEXT:    bnez a6, .LBB45_1
5415; RV32IA-NEXT:  # %bb.4:
5416; RV32IA-NEXT:    srl a0, a5, a0
5417; RV32IA-NEXT:    ret
5418;
5419; RV64I-LABEL: atomicrmw_max_i8_monotonic:
5420; RV64I:       # %bb.0:
5421; RV64I-NEXT:    addi sp, sp, -48
5422; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
5423; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
5424; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
5425; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
5426; RV64I-NEXT:    mv s0, a0
5427; RV64I-NEXT:    lbu a3, 0(a0)
5428; RV64I-NEXT:    mv s1, a1
5429; RV64I-NEXT:    slli a0, a1, 56
5430; RV64I-NEXT:    srai s2, a0, 56
5431; RV64I-NEXT:    j .LBB45_2
5432; RV64I-NEXT:  .LBB45_1: # %atomicrmw.start
5433; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
5434; RV64I-NEXT:    sb a3, 15(sp)
5435; RV64I-NEXT:    addi a1, sp, 15
5436; RV64I-NEXT:    mv a0, s0
5437; RV64I-NEXT:    li a3, 0
5438; RV64I-NEXT:    li a4, 0
5439; RV64I-NEXT:    call __atomic_compare_exchange_1
5440; RV64I-NEXT:    lbu a3, 15(sp)
5441; RV64I-NEXT:    bnez a0, .LBB45_4
5442; RV64I-NEXT:  .LBB45_2: # %atomicrmw.start
5443; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
5444; RV64I-NEXT:    slli a0, a3, 56
5445; RV64I-NEXT:    srai a0, a0, 56
5446; RV64I-NEXT:    mv a2, a3
5447; RV64I-NEXT:    blt s2, a0, .LBB45_1
5448; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
5449; RV64I-NEXT:    # in Loop: Header=BB45_2 Depth=1
5450; RV64I-NEXT:    mv a2, s1
5451; RV64I-NEXT:    j .LBB45_1
5452; RV64I-NEXT:  .LBB45_4: # %atomicrmw.end
5453; RV64I-NEXT:    mv a0, a3
5454; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
5455; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
5456; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
5457; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
5458; RV64I-NEXT:    addi sp, sp, 48
5459; RV64I-NEXT:    ret
5460;
5461; RV64IA-NOZACAS-LABEL: atomicrmw_max_i8_monotonic:
5462; RV64IA-NOZACAS:       # %bb.0:
5463; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
5464; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
5465; RV64IA-NOZACAS-NEXT:    li a3, 255
5466; RV64IA-NOZACAS-NEXT:    slli a1, a1, 56
5467; RV64IA-NOZACAS-NEXT:    andi a4, a0, 24
5468; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
5469; RV64IA-NOZACAS-NEXT:    srai a1, a1, 56
5470; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
5471; RV64IA-NOZACAS-NEXT:    xori a4, a4, 56
5472; RV64IA-NOZACAS-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
5473; RV64IA-NOZACAS-NEXT:    lr.w a5, (a2)
5474; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
5475; RV64IA-NOZACAS-NEXT:    mv a6, a5
5476; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
5477; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
5478; RV64IA-NOZACAS-NEXT:    bge a7, a1, .LBB45_3
5479; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
5480; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
5481; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
5482; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
5483; RV64IA-NOZACAS-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
5484; RV64IA-NOZACAS-NEXT:    sc.w a6, a6, (a2)
5485; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB45_1
5486; RV64IA-NOZACAS-NEXT:  # %bb.4:
5487; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
5488; RV64IA-NOZACAS-NEXT:    ret
5489;
5490; RV64IA-ZACAS-LABEL: atomicrmw_max_i8_monotonic:
5491; RV64IA-ZACAS:       # %bb.0:
5492; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
5493; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
5494; RV64IA-ZACAS-NEXT:    li a3, 255
5495; RV64IA-ZACAS-NEXT:    slli a1, a1, 56
5496; RV64IA-ZACAS-NEXT:    andi a4, a0, 24
5497; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
5498; RV64IA-ZACAS-NEXT:    srai a1, a1, 56
5499; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
5500; RV64IA-ZACAS-NEXT:    xori a4, a4, 56
5501; RV64IA-ZACAS-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
5502; RV64IA-ZACAS-NEXT:    lr.w a5, (a2)
5503; RV64IA-ZACAS-NEXT:    and a7, a5, a3
5504; RV64IA-ZACAS-NEXT:    mv a6, a5
5505; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
5506; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
5507; RV64IA-ZACAS-NEXT:    bge a7, a1, .LBB45_3
5508; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
5509; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
5510; RV64IA-ZACAS-NEXT:    and a6, a6, a3
5511; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
5512; RV64IA-ZACAS-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
5513; RV64IA-ZACAS-NEXT:    sc.w a6, a6, (a2)
5514; RV64IA-ZACAS-NEXT:    bnez a6, .LBB45_1
5515; RV64IA-ZACAS-NEXT:  # %bb.4:
5516; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
5517; RV64IA-ZACAS-NEXT:    ret
5518;
5519; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_monotonic:
5520; RV64IA-WMO-ZABHA:       # %bb.0:
5521; RV64IA-WMO-ZABHA-NEXT:    amomax.b a0, a1, (a0)
5522; RV64IA-WMO-ZABHA-NEXT:    ret
5523;
5524; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_monotonic:
5525; RV64IA-TSO-ZABHA:       # %bb.0:
5526; RV64IA-TSO-ZABHA-NEXT:    amomax.b a0, a1, (a0)
5527; RV64IA-TSO-ZABHA-NEXT:    ret
5528  %1 = atomicrmw max ptr %a, i8 %b monotonic
5529  ret i8 %1
5530}
5531
5532define i8 @atomicrmw_max_i8_acquire(ptr %a, i8 %b) nounwind {
5533; RV32I-LABEL: atomicrmw_max_i8_acquire:
5534; RV32I:       # %bb.0:
5535; RV32I-NEXT:    addi sp, sp, -32
5536; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
5537; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
5538; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
5539; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
5540; RV32I-NEXT:    mv s0, a0
5541; RV32I-NEXT:    lbu a3, 0(a0)
5542; RV32I-NEXT:    mv s1, a1
5543; RV32I-NEXT:    slli a0, a1, 24
5544; RV32I-NEXT:    srai s2, a0, 24
5545; RV32I-NEXT:    j .LBB46_2
5546; RV32I-NEXT:  .LBB46_1: # %atomicrmw.start
5547; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
5548; RV32I-NEXT:    sb a3, 15(sp)
5549; RV32I-NEXT:    addi a1, sp, 15
5550; RV32I-NEXT:    li a3, 2
5551; RV32I-NEXT:    li a4, 2
5552; RV32I-NEXT:    mv a0, s0
5553; RV32I-NEXT:    call __atomic_compare_exchange_1
5554; RV32I-NEXT:    lbu a3, 15(sp)
5555; RV32I-NEXT:    bnez a0, .LBB46_4
5556; RV32I-NEXT:  .LBB46_2: # %atomicrmw.start
5557; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
5558; RV32I-NEXT:    slli a0, a3, 24
5559; RV32I-NEXT:    srai a0, a0, 24
5560; RV32I-NEXT:    mv a2, a3
5561; RV32I-NEXT:    blt s2, a0, .LBB46_1
5562; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
5563; RV32I-NEXT:    # in Loop: Header=BB46_2 Depth=1
5564; RV32I-NEXT:    mv a2, s1
5565; RV32I-NEXT:    j .LBB46_1
5566; RV32I-NEXT:  .LBB46_4: # %atomicrmw.end
5567; RV32I-NEXT:    mv a0, a3
5568; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
5569; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
5570; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
5571; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
5572; RV32I-NEXT:    addi sp, sp, 32
5573; RV32I-NEXT:    ret
5574;
5575; RV32IA-WMO-LABEL: atomicrmw_max_i8_acquire:
5576; RV32IA-WMO:       # %bb.0:
5577; RV32IA-WMO-NEXT:    andi a2, a0, -4
5578; RV32IA-WMO-NEXT:    slli a0, a0, 3
5579; RV32IA-WMO-NEXT:    li a3, 255
5580; RV32IA-WMO-NEXT:    slli a1, a1, 24
5581; RV32IA-WMO-NEXT:    andi a4, a0, 24
5582; RV32IA-WMO-NEXT:    sll a3, a3, a0
5583; RV32IA-WMO-NEXT:    srai a1, a1, 24
5584; RV32IA-WMO-NEXT:    sll a1, a1, a0
5585; RV32IA-WMO-NEXT:    xori a4, a4, 24
5586; RV32IA-WMO-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
5587; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
5588; RV32IA-WMO-NEXT:    and a7, a5, a3
5589; RV32IA-WMO-NEXT:    mv a6, a5
5590; RV32IA-WMO-NEXT:    sll a7, a7, a4
5591; RV32IA-WMO-NEXT:    sra a7, a7, a4
5592; RV32IA-WMO-NEXT:    bge a7, a1, .LBB46_3
5593; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
5594; RV32IA-WMO-NEXT:    xor a6, a5, a1
5595; RV32IA-WMO-NEXT:    and a6, a6, a3
5596; RV32IA-WMO-NEXT:    xor a6, a5, a6
5597; RV32IA-WMO-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
5598; RV32IA-WMO-NEXT:    sc.w a6, a6, (a2)
5599; RV32IA-WMO-NEXT:    bnez a6, .LBB46_1
5600; RV32IA-WMO-NEXT:  # %bb.4:
5601; RV32IA-WMO-NEXT:    srl a0, a5, a0
5602; RV32IA-WMO-NEXT:    ret
5603;
5604; RV32IA-TSO-LABEL: atomicrmw_max_i8_acquire:
5605; RV32IA-TSO:       # %bb.0:
5606; RV32IA-TSO-NEXT:    andi a2, a0, -4
5607; RV32IA-TSO-NEXT:    slli a0, a0, 3
5608; RV32IA-TSO-NEXT:    li a3, 255
5609; RV32IA-TSO-NEXT:    slli a1, a1, 24
5610; RV32IA-TSO-NEXT:    andi a4, a0, 24
5611; RV32IA-TSO-NEXT:    sll a3, a3, a0
5612; RV32IA-TSO-NEXT:    srai a1, a1, 24
5613; RV32IA-TSO-NEXT:    sll a1, a1, a0
5614; RV32IA-TSO-NEXT:    xori a4, a4, 24
5615; RV32IA-TSO-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
5616; RV32IA-TSO-NEXT:    lr.w a5, (a2)
5617; RV32IA-TSO-NEXT:    and a7, a5, a3
5618; RV32IA-TSO-NEXT:    mv a6, a5
5619; RV32IA-TSO-NEXT:    sll a7, a7, a4
5620; RV32IA-TSO-NEXT:    sra a7, a7, a4
5621; RV32IA-TSO-NEXT:    bge a7, a1, .LBB46_3
5622; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
5623; RV32IA-TSO-NEXT:    xor a6, a5, a1
5624; RV32IA-TSO-NEXT:    and a6, a6, a3
5625; RV32IA-TSO-NEXT:    xor a6, a5, a6
5626; RV32IA-TSO-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
5627; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
5628; RV32IA-TSO-NEXT:    bnez a6, .LBB46_1
5629; RV32IA-TSO-NEXT:  # %bb.4:
5630; RV32IA-TSO-NEXT:    srl a0, a5, a0
5631; RV32IA-TSO-NEXT:    ret
5632;
5633; RV64I-LABEL: atomicrmw_max_i8_acquire:
5634; RV64I:       # %bb.0:
5635; RV64I-NEXT:    addi sp, sp, -48
5636; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
5637; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
5638; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
5639; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
5640; RV64I-NEXT:    mv s0, a0
5641; RV64I-NEXT:    lbu a3, 0(a0)
5642; RV64I-NEXT:    mv s1, a1
5643; RV64I-NEXT:    slli a0, a1, 56
5644; RV64I-NEXT:    srai s2, a0, 56
5645; RV64I-NEXT:    j .LBB46_2
5646; RV64I-NEXT:  .LBB46_1: # %atomicrmw.start
5647; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
5648; RV64I-NEXT:    sb a3, 15(sp)
5649; RV64I-NEXT:    addi a1, sp, 15
5650; RV64I-NEXT:    li a3, 2
5651; RV64I-NEXT:    li a4, 2
5652; RV64I-NEXT:    mv a0, s0
5653; RV64I-NEXT:    call __atomic_compare_exchange_1
5654; RV64I-NEXT:    lbu a3, 15(sp)
5655; RV64I-NEXT:    bnez a0, .LBB46_4
5656; RV64I-NEXT:  .LBB46_2: # %atomicrmw.start
5657; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
5658; RV64I-NEXT:    slli a0, a3, 56
5659; RV64I-NEXT:    srai a0, a0, 56
5660; RV64I-NEXT:    mv a2, a3
5661; RV64I-NEXT:    blt s2, a0, .LBB46_1
5662; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
5663; RV64I-NEXT:    # in Loop: Header=BB46_2 Depth=1
5664; RV64I-NEXT:    mv a2, s1
5665; RV64I-NEXT:    j .LBB46_1
5666; RV64I-NEXT:  .LBB46_4: # %atomicrmw.end
5667; RV64I-NEXT:    mv a0, a3
5668; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
5669; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
5670; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
5671; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
5672; RV64I-NEXT:    addi sp, sp, 48
5673; RV64I-NEXT:    ret
5674;
5675; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_acquire:
5676; RV64IA-WMO-NOZACAS:       # %bb.0:
5677; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
5678; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
5679; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
5680; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 56
5681; RV64IA-WMO-NOZACAS-NEXT:    andi a4, a0, 24
5682; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
5683; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 56
5684; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
5685; RV64IA-WMO-NOZACAS-NEXT:    xori a4, a4, 56
5686; RV64IA-WMO-NOZACAS-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
5687; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
5688; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
5689; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
5690; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
5691; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
5692; RV64IA-WMO-NOZACAS-NEXT:    bge a7, a1, .LBB46_3
5693; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
5694; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
5695; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
5696; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
5697; RV64IA-WMO-NOZACAS-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
5698; RV64IA-WMO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
5699; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB46_1
5700; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
5701; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
5702; RV64IA-WMO-NOZACAS-NEXT:    ret
5703;
5704; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_acquire:
5705; RV64IA-TSO-NOZACAS:       # %bb.0:
5706; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
5707; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
5708; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
5709; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 56
5710; RV64IA-TSO-NOZACAS-NEXT:    andi a4, a0, 24
5711; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
5712; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 56
5713; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
5714; RV64IA-TSO-NOZACAS-NEXT:    xori a4, a4, 56
5715; RV64IA-TSO-NOZACAS-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
5716; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
5717; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
5718; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
5719; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
5720; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
5721; RV64IA-TSO-NOZACAS-NEXT:    bge a7, a1, .LBB46_3
5722; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
5723; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
5724; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
5725; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
5726; RV64IA-TSO-NOZACAS-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
5727; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
5728; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB46_1
5729; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
5730; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
5731; RV64IA-TSO-NOZACAS-NEXT:    ret
5732;
5733; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_acquire:
5734; RV64IA-WMO-ZACAS:       # %bb.0:
5735; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
5736; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
5737; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
5738; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 56
5739; RV64IA-WMO-ZACAS-NEXT:    andi a4, a0, 24
5740; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
5741; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 56
5742; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
5743; RV64IA-WMO-ZACAS-NEXT:    xori a4, a4, 56
5744; RV64IA-WMO-ZACAS-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
5745; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
5746; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
5747; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
5748; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
5749; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
5750; RV64IA-WMO-ZACAS-NEXT:    bge a7, a1, .LBB46_3
5751; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
5752; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
5753; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
5754; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
5755; RV64IA-WMO-ZACAS-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
5756; RV64IA-WMO-ZACAS-NEXT:    sc.w a6, a6, (a2)
5757; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB46_1
5758; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
5759; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
5760; RV64IA-WMO-ZACAS-NEXT:    ret
5761;
5762; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_acquire:
5763; RV64IA-TSO-ZACAS:       # %bb.0:
5764; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
5765; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
5766; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
5767; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 56
5768; RV64IA-TSO-ZACAS-NEXT:    andi a4, a0, 24
5769; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
5770; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 56
5771; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
5772; RV64IA-TSO-ZACAS-NEXT:    xori a4, a4, 56
5773; RV64IA-TSO-ZACAS-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
5774; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
5775; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
5776; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
5777; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
5778; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
5779; RV64IA-TSO-ZACAS-NEXT:    bge a7, a1, .LBB46_3
5780; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
5781; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
5782; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
5783; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
5784; RV64IA-TSO-ZACAS-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
5785; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
5786; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB46_1
5787; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
5788; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
5789; RV64IA-TSO-ZACAS-NEXT:    ret
5790;
5791; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_acquire:
5792; RV64IA-WMO-ZABHA:       # %bb.0:
5793; RV64IA-WMO-ZABHA-NEXT:    amomax.b.aq a0, a1, (a0)
5794; RV64IA-WMO-ZABHA-NEXT:    ret
5795;
5796; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_acquire:
5797; RV64IA-TSO-ZABHA:       # %bb.0:
5798; RV64IA-TSO-ZABHA-NEXT:    amomax.b a0, a1, (a0)
5799; RV64IA-TSO-ZABHA-NEXT:    ret
5800  %1 = atomicrmw max ptr %a, i8 %b acquire
5801  ret i8 %1
5802}
5803
5804define i8 @atomicrmw_max_i8_release(ptr %a, i8 %b) nounwind {
5805; RV32I-LABEL: atomicrmw_max_i8_release:
5806; RV32I:       # %bb.0:
5807; RV32I-NEXT:    addi sp, sp, -32
5808; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
5809; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
5810; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
5811; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
5812; RV32I-NEXT:    mv s0, a0
5813; RV32I-NEXT:    lbu a3, 0(a0)
5814; RV32I-NEXT:    mv s1, a1
5815; RV32I-NEXT:    slli a0, a1, 24
5816; RV32I-NEXT:    srai s2, a0, 24
5817; RV32I-NEXT:    j .LBB47_2
5818; RV32I-NEXT:  .LBB47_1: # %atomicrmw.start
5819; RV32I-NEXT:    # in Loop: Header=BB47_2 Depth=1
5820; RV32I-NEXT:    sb a3, 15(sp)
5821; RV32I-NEXT:    addi a1, sp, 15
5822; RV32I-NEXT:    li a3, 3
5823; RV32I-NEXT:    mv a0, s0
5824; RV32I-NEXT:    li a4, 0
5825; RV32I-NEXT:    call __atomic_compare_exchange_1
5826; RV32I-NEXT:    lbu a3, 15(sp)
5827; RV32I-NEXT:    bnez a0, .LBB47_4
5828; RV32I-NEXT:  .LBB47_2: # %atomicrmw.start
5829; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
5830; RV32I-NEXT:    slli a0, a3, 24
5831; RV32I-NEXT:    srai a0, a0, 24
5832; RV32I-NEXT:    mv a2, a3
5833; RV32I-NEXT:    blt s2, a0, .LBB47_1
5834; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
5835; RV32I-NEXT:    # in Loop: Header=BB47_2 Depth=1
5836; RV32I-NEXT:    mv a2, s1
5837; RV32I-NEXT:    j .LBB47_1
5838; RV32I-NEXT:  .LBB47_4: # %atomicrmw.end
5839; RV32I-NEXT:    mv a0, a3
5840; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
5841; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
5842; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
5843; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
5844; RV32I-NEXT:    addi sp, sp, 32
5845; RV32I-NEXT:    ret
5846;
5847; RV32IA-WMO-LABEL: atomicrmw_max_i8_release:
5848; RV32IA-WMO:       # %bb.0:
5849; RV32IA-WMO-NEXT:    andi a2, a0, -4
5850; RV32IA-WMO-NEXT:    slli a0, a0, 3
5851; RV32IA-WMO-NEXT:    li a3, 255
5852; RV32IA-WMO-NEXT:    slli a1, a1, 24
5853; RV32IA-WMO-NEXT:    andi a4, a0, 24
5854; RV32IA-WMO-NEXT:    sll a3, a3, a0
5855; RV32IA-WMO-NEXT:    srai a1, a1, 24
5856; RV32IA-WMO-NEXT:    sll a1, a1, a0
5857; RV32IA-WMO-NEXT:    xori a4, a4, 24
5858; RV32IA-WMO-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
5859; RV32IA-WMO-NEXT:    lr.w a5, (a2)
5860; RV32IA-WMO-NEXT:    and a7, a5, a3
5861; RV32IA-WMO-NEXT:    mv a6, a5
5862; RV32IA-WMO-NEXT:    sll a7, a7, a4
5863; RV32IA-WMO-NEXT:    sra a7, a7, a4
5864; RV32IA-WMO-NEXT:    bge a7, a1, .LBB47_3
5865; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
5866; RV32IA-WMO-NEXT:    xor a6, a5, a1
5867; RV32IA-WMO-NEXT:    and a6, a6, a3
5868; RV32IA-WMO-NEXT:    xor a6, a5, a6
5869; RV32IA-WMO-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
5870; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
5871; RV32IA-WMO-NEXT:    bnez a6, .LBB47_1
5872; RV32IA-WMO-NEXT:  # %bb.4:
5873; RV32IA-WMO-NEXT:    srl a0, a5, a0
5874; RV32IA-WMO-NEXT:    ret
5875;
5876; RV32IA-TSO-LABEL: atomicrmw_max_i8_release:
5877; RV32IA-TSO:       # %bb.0:
5878; RV32IA-TSO-NEXT:    andi a2, a0, -4
5879; RV32IA-TSO-NEXT:    slli a0, a0, 3
5880; RV32IA-TSO-NEXT:    li a3, 255
5881; RV32IA-TSO-NEXT:    slli a1, a1, 24
5882; RV32IA-TSO-NEXT:    andi a4, a0, 24
5883; RV32IA-TSO-NEXT:    sll a3, a3, a0
5884; RV32IA-TSO-NEXT:    srai a1, a1, 24
5885; RV32IA-TSO-NEXT:    sll a1, a1, a0
5886; RV32IA-TSO-NEXT:    xori a4, a4, 24
5887; RV32IA-TSO-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
5888; RV32IA-TSO-NEXT:    lr.w a5, (a2)
5889; RV32IA-TSO-NEXT:    and a7, a5, a3
5890; RV32IA-TSO-NEXT:    mv a6, a5
5891; RV32IA-TSO-NEXT:    sll a7, a7, a4
5892; RV32IA-TSO-NEXT:    sra a7, a7, a4
5893; RV32IA-TSO-NEXT:    bge a7, a1, .LBB47_3
5894; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
5895; RV32IA-TSO-NEXT:    xor a6, a5, a1
5896; RV32IA-TSO-NEXT:    and a6, a6, a3
5897; RV32IA-TSO-NEXT:    xor a6, a5, a6
5898; RV32IA-TSO-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
5899; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
5900; RV32IA-TSO-NEXT:    bnez a6, .LBB47_1
5901; RV32IA-TSO-NEXT:  # %bb.4:
5902; RV32IA-TSO-NEXT:    srl a0, a5, a0
5903; RV32IA-TSO-NEXT:    ret
5904;
5905; RV64I-LABEL: atomicrmw_max_i8_release:
5906; RV64I:       # %bb.0:
5907; RV64I-NEXT:    addi sp, sp, -48
5908; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
5909; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
5910; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
5911; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
5912; RV64I-NEXT:    mv s0, a0
5913; RV64I-NEXT:    lbu a3, 0(a0)
5914; RV64I-NEXT:    mv s1, a1
5915; RV64I-NEXT:    slli a0, a1, 56
5916; RV64I-NEXT:    srai s2, a0, 56
5917; RV64I-NEXT:    j .LBB47_2
5918; RV64I-NEXT:  .LBB47_1: # %atomicrmw.start
5919; RV64I-NEXT:    # in Loop: Header=BB47_2 Depth=1
5920; RV64I-NEXT:    sb a3, 15(sp)
5921; RV64I-NEXT:    addi a1, sp, 15
5922; RV64I-NEXT:    li a3, 3
5923; RV64I-NEXT:    mv a0, s0
5924; RV64I-NEXT:    li a4, 0
5925; RV64I-NEXT:    call __atomic_compare_exchange_1
5926; RV64I-NEXT:    lbu a3, 15(sp)
5927; RV64I-NEXT:    bnez a0, .LBB47_4
5928; RV64I-NEXT:  .LBB47_2: # %atomicrmw.start
5929; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
5930; RV64I-NEXT:    slli a0, a3, 56
5931; RV64I-NEXT:    srai a0, a0, 56
5932; RV64I-NEXT:    mv a2, a3
5933; RV64I-NEXT:    blt s2, a0, .LBB47_1
5934; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
5935; RV64I-NEXT:    # in Loop: Header=BB47_2 Depth=1
5936; RV64I-NEXT:    mv a2, s1
5937; RV64I-NEXT:    j .LBB47_1
5938; RV64I-NEXT:  .LBB47_4: # %atomicrmw.end
5939; RV64I-NEXT:    mv a0, a3
5940; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
5941; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
5942; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
5943; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
5944; RV64I-NEXT:    addi sp, sp, 48
5945; RV64I-NEXT:    ret
5946;
5947; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_release:
5948; RV64IA-WMO-NOZACAS:       # %bb.0:
5949; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
5950; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
5951; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
5952; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 56
5953; RV64IA-WMO-NOZACAS-NEXT:    andi a4, a0, 24
5954; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
5955; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 56
5956; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
5957; RV64IA-WMO-NOZACAS-NEXT:    xori a4, a4, 56
5958; RV64IA-WMO-NOZACAS-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
5959; RV64IA-WMO-NOZACAS-NEXT:    lr.w a5, (a2)
5960; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
5961; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
5962; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
5963; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
5964; RV64IA-WMO-NOZACAS-NEXT:    bge a7, a1, .LBB47_3
5965; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
5966; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
5967; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
5968; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
5969; RV64IA-WMO-NOZACAS-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
5970; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
5971; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB47_1
5972; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
5973; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
5974; RV64IA-WMO-NOZACAS-NEXT:    ret
5975;
5976; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_release:
5977; RV64IA-TSO-NOZACAS:       # %bb.0:
5978; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
5979; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
5980; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
5981; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 56
5982; RV64IA-TSO-NOZACAS-NEXT:    andi a4, a0, 24
5983; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
5984; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 56
5985; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
5986; RV64IA-TSO-NOZACAS-NEXT:    xori a4, a4, 56
5987; RV64IA-TSO-NOZACAS-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
5988; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
5989; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
5990; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
5991; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
5992; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
5993; RV64IA-TSO-NOZACAS-NEXT:    bge a7, a1, .LBB47_3
5994; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
5995; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
5996; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
5997; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
5998; RV64IA-TSO-NOZACAS-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
5999; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
6000; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB47_1
6001; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
6002; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
6003; RV64IA-TSO-NOZACAS-NEXT:    ret
6004;
6005; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_release:
6006; RV64IA-WMO-ZACAS:       # %bb.0:
6007; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
6008; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
6009; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
6010; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 56
6011; RV64IA-WMO-ZACAS-NEXT:    andi a4, a0, 24
6012; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
6013; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 56
6014; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
6015; RV64IA-WMO-ZACAS-NEXT:    xori a4, a4, 56
6016; RV64IA-WMO-ZACAS-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
6017; RV64IA-WMO-ZACAS-NEXT:    lr.w a5, (a2)
6018; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
6019; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
6020; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
6021; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
6022; RV64IA-WMO-ZACAS-NEXT:    bge a7, a1, .LBB47_3
6023; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
6024; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
6025; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
6026; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
6027; RV64IA-WMO-ZACAS-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
6028; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
6029; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB47_1
6030; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
6031; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
6032; RV64IA-WMO-ZACAS-NEXT:    ret
6033;
6034; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_release:
6035; RV64IA-TSO-ZACAS:       # %bb.0:
6036; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
6037; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
6038; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
6039; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 56
6040; RV64IA-TSO-ZACAS-NEXT:    andi a4, a0, 24
6041; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
6042; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 56
6043; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
6044; RV64IA-TSO-ZACAS-NEXT:    xori a4, a4, 56
6045; RV64IA-TSO-ZACAS-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
6046; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
6047; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
6048; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
6049; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
6050; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
6051; RV64IA-TSO-ZACAS-NEXT:    bge a7, a1, .LBB47_3
6052; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
6053; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
6054; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
6055; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
6056; RV64IA-TSO-ZACAS-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
6057; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
6058; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB47_1
6059; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
6060; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
6061; RV64IA-TSO-ZACAS-NEXT:    ret
6062;
6063; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_release:
6064; RV64IA-WMO-ZABHA:       # %bb.0:
6065; RV64IA-WMO-ZABHA-NEXT:    amomax.b.rl a0, a1, (a0)
6066; RV64IA-WMO-ZABHA-NEXT:    ret
6067;
6068; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_release:
6069; RV64IA-TSO-ZABHA:       # %bb.0:
6070; RV64IA-TSO-ZABHA-NEXT:    amomax.b a0, a1, (a0)
6071; RV64IA-TSO-ZABHA-NEXT:    ret
6072  %1 = atomicrmw max ptr %a, i8 %b release
6073  ret i8 %1
6074}
6075
6076define i8 @atomicrmw_max_i8_acq_rel(ptr %a, i8 %b) nounwind {
6077; RV32I-LABEL: atomicrmw_max_i8_acq_rel:
6078; RV32I:       # %bb.0:
6079; RV32I-NEXT:    addi sp, sp, -32
6080; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6081; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6082; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6083; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6084; RV32I-NEXT:    mv s0, a0
6085; RV32I-NEXT:    lbu a3, 0(a0)
6086; RV32I-NEXT:    mv s1, a1
6087; RV32I-NEXT:    slli a0, a1, 24
6088; RV32I-NEXT:    srai s2, a0, 24
6089; RV32I-NEXT:    j .LBB48_2
6090; RV32I-NEXT:  .LBB48_1: # %atomicrmw.start
6091; RV32I-NEXT:    # in Loop: Header=BB48_2 Depth=1
6092; RV32I-NEXT:    sb a3, 15(sp)
6093; RV32I-NEXT:    addi a1, sp, 15
6094; RV32I-NEXT:    li a3, 4
6095; RV32I-NEXT:    li a4, 2
6096; RV32I-NEXT:    mv a0, s0
6097; RV32I-NEXT:    call __atomic_compare_exchange_1
6098; RV32I-NEXT:    lbu a3, 15(sp)
6099; RV32I-NEXT:    bnez a0, .LBB48_4
6100; RV32I-NEXT:  .LBB48_2: # %atomicrmw.start
6101; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
6102; RV32I-NEXT:    slli a0, a3, 24
6103; RV32I-NEXT:    srai a0, a0, 24
6104; RV32I-NEXT:    mv a2, a3
6105; RV32I-NEXT:    blt s2, a0, .LBB48_1
6106; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
6107; RV32I-NEXT:    # in Loop: Header=BB48_2 Depth=1
6108; RV32I-NEXT:    mv a2, s1
6109; RV32I-NEXT:    j .LBB48_1
6110; RV32I-NEXT:  .LBB48_4: # %atomicrmw.end
6111; RV32I-NEXT:    mv a0, a3
6112; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
6113; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
6114; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
6115; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
6116; RV32I-NEXT:    addi sp, sp, 32
6117; RV32I-NEXT:    ret
6118;
6119; RV32IA-WMO-LABEL: atomicrmw_max_i8_acq_rel:
6120; RV32IA-WMO:       # %bb.0:
6121; RV32IA-WMO-NEXT:    andi a2, a0, -4
6122; RV32IA-WMO-NEXT:    slli a0, a0, 3
6123; RV32IA-WMO-NEXT:    li a3, 255
6124; RV32IA-WMO-NEXT:    slli a1, a1, 24
6125; RV32IA-WMO-NEXT:    andi a4, a0, 24
6126; RV32IA-WMO-NEXT:    sll a3, a3, a0
6127; RV32IA-WMO-NEXT:    srai a1, a1, 24
6128; RV32IA-WMO-NEXT:    sll a1, a1, a0
6129; RV32IA-WMO-NEXT:    xori a4, a4, 24
6130; RV32IA-WMO-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
6131; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
6132; RV32IA-WMO-NEXT:    and a7, a5, a3
6133; RV32IA-WMO-NEXT:    mv a6, a5
6134; RV32IA-WMO-NEXT:    sll a7, a7, a4
6135; RV32IA-WMO-NEXT:    sra a7, a7, a4
6136; RV32IA-WMO-NEXT:    bge a7, a1, .LBB48_3
6137; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
6138; RV32IA-WMO-NEXT:    xor a6, a5, a1
6139; RV32IA-WMO-NEXT:    and a6, a6, a3
6140; RV32IA-WMO-NEXT:    xor a6, a5, a6
6141; RV32IA-WMO-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
6142; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
6143; RV32IA-WMO-NEXT:    bnez a6, .LBB48_1
6144; RV32IA-WMO-NEXT:  # %bb.4:
6145; RV32IA-WMO-NEXT:    srl a0, a5, a0
6146; RV32IA-WMO-NEXT:    ret
6147;
6148; RV32IA-TSO-LABEL: atomicrmw_max_i8_acq_rel:
6149; RV32IA-TSO:       # %bb.0:
6150; RV32IA-TSO-NEXT:    andi a2, a0, -4
6151; RV32IA-TSO-NEXT:    slli a0, a0, 3
6152; RV32IA-TSO-NEXT:    li a3, 255
6153; RV32IA-TSO-NEXT:    slli a1, a1, 24
6154; RV32IA-TSO-NEXT:    andi a4, a0, 24
6155; RV32IA-TSO-NEXT:    sll a3, a3, a0
6156; RV32IA-TSO-NEXT:    srai a1, a1, 24
6157; RV32IA-TSO-NEXT:    sll a1, a1, a0
6158; RV32IA-TSO-NEXT:    xori a4, a4, 24
6159; RV32IA-TSO-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
6160; RV32IA-TSO-NEXT:    lr.w a5, (a2)
6161; RV32IA-TSO-NEXT:    and a7, a5, a3
6162; RV32IA-TSO-NEXT:    mv a6, a5
6163; RV32IA-TSO-NEXT:    sll a7, a7, a4
6164; RV32IA-TSO-NEXT:    sra a7, a7, a4
6165; RV32IA-TSO-NEXT:    bge a7, a1, .LBB48_3
6166; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
6167; RV32IA-TSO-NEXT:    xor a6, a5, a1
6168; RV32IA-TSO-NEXT:    and a6, a6, a3
6169; RV32IA-TSO-NEXT:    xor a6, a5, a6
6170; RV32IA-TSO-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
6171; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
6172; RV32IA-TSO-NEXT:    bnez a6, .LBB48_1
6173; RV32IA-TSO-NEXT:  # %bb.4:
6174; RV32IA-TSO-NEXT:    srl a0, a5, a0
6175; RV32IA-TSO-NEXT:    ret
6176;
6177; RV64I-LABEL: atomicrmw_max_i8_acq_rel:
6178; RV64I:       # %bb.0:
6179; RV64I-NEXT:    addi sp, sp, -48
6180; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
6181; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
6182; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
6183; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
6184; RV64I-NEXT:    mv s0, a0
6185; RV64I-NEXT:    lbu a3, 0(a0)
6186; RV64I-NEXT:    mv s1, a1
6187; RV64I-NEXT:    slli a0, a1, 56
6188; RV64I-NEXT:    srai s2, a0, 56
6189; RV64I-NEXT:    j .LBB48_2
6190; RV64I-NEXT:  .LBB48_1: # %atomicrmw.start
6191; RV64I-NEXT:    # in Loop: Header=BB48_2 Depth=1
6192; RV64I-NEXT:    sb a3, 15(sp)
6193; RV64I-NEXT:    addi a1, sp, 15
6194; RV64I-NEXT:    li a3, 4
6195; RV64I-NEXT:    li a4, 2
6196; RV64I-NEXT:    mv a0, s0
6197; RV64I-NEXT:    call __atomic_compare_exchange_1
6198; RV64I-NEXT:    lbu a3, 15(sp)
6199; RV64I-NEXT:    bnez a0, .LBB48_4
6200; RV64I-NEXT:  .LBB48_2: # %atomicrmw.start
6201; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
6202; RV64I-NEXT:    slli a0, a3, 56
6203; RV64I-NEXT:    srai a0, a0, 56
6204; RV64I-NEXT:    mv a2, a3
6205; RV64I-NEXT:    blt s2, a0, .LBB48_1
6206; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
6207; RV64I-NEXT:    # in Loop: Header=BB48_2 Depth=1
6208; RV64I-NEXT:    mv a2, s1
6209; RV64I-NEXT:    j .LBB48_1
6210; RV64I-NEXT:  .LBB48_4: # %atomicrmw.end
6211; RV64I-NEXT:    mv a0, a3
6212; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
6213; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
6214; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
6215; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
6216; RV64I-NEXT:    addi sp, sp, 48
6217; RV64I-NEXT:    ret
6218;
6219; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_acq_rel:
6220; RV64IA-WMO-NOZACAS:       # %bb.0:
6221; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
6222; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
6223; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
6224; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 56
6225; RV64IA-WMO-NOZACAS-NEXT:    andi a4, a0, 24
6226; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
6227; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 56
6228; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
6229; RV64IA-WMO-NOZACAS-NEXT:    xori a4, a4, 56
6230; RV64IA-WMO-NOZACAS-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
6231; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
6232; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
6233; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
6234; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
6235; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
6236; RV64IA-WMO-NOZACAS-NEXT:    bge a7, a1, .LBB48_3
6237; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
6238; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
6239; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
6240; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
6241; RV64IA-WMO-NOZACAS-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
6242; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
6243; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB48_1
6244; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
6245; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
6246; RV64IA-WMO-NOZACAS-NEXT:    ret
6247;
6248; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_acq_rel:
6249; RV64IA-TSO-NOZACAS:       # %bb.0:
6250; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
6251; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
6252; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
6253; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 56
6254; RV64IA-TSO-NOZACAS-NEXT:    andi a4, a0, 24
6255; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
6256; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 56
6257; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
6258; RV64IA-TSO-NOZACAS-NEXT:    xori a4, a4, 56
6259; RV64IA-TSO-NOZACAS-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
6260; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
6261; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
6262; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
6263; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
6264; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
6265; RV64IA-TSO-NOZACAS-NEXT:    bge a7, a1, .LBB48_3
6266; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
6267; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
6268; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
6269; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
6270; RV64IA-TSO-NOZACAS-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
6271; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
6272; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB48_1
6273; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
6274; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
6275; RV64IA-TSO-NOZACAS-NEXT:    ret
6276;
6277; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_acq_rel:
6278; RV64IA-WMO-ZACAS:       # %bb.0:
6279; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
6280; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
6281; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
6282; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 56
6283; RV64IA-WMO-ZACAS-NEXT:    andi a4, a0, 24
6284; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
6285; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 56
6286; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
6287; RV64IA-WMO-ZACAS-NEXT:    xori a4, a4, 56
6288; RV64IA-WMO-ZACAS-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
6289; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
6290; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
6291; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
6292; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
6293; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
6294; RV64IA-WMO-ZACAS-NEXT:    bge a7, a1, .LBB48_3
6295; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
6296; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
6297; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
6298; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
6299; RV64IA-WMO-ZACAS-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
6300; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
6301; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB48_1
6302; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
6303; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
6304; RV64IA-WMO-ZACAS-NEXT:    ret
6305;
6306; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_acq_rel:
6307; RV64IA-TSO-ZACAS:       # %bb.0:
6308; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
6309; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
6310; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
6311; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 56
6312; RV64IA-TSO-ZACAS-NEXT:    andi a4, a0, 24
6313; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
6314; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 56
6315; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
6316; RV64IA-TSO-ZACAS-NEXT:    xori a4, a4, 56
6317; RV64IA-TSO-ZACAS-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
6318; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
6319; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
6320; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
6321; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
6322; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
6323; RV64IA-TSO-ZACAS-NEXT:    bge a7, a1, .LBB48_3
6324; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
6325; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
6326; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
6327; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
6328; RV64IA-TSO-ZACAS-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
6329; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
6330; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB48_1
6331; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
6332; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
6333; RV64IA-TSO-ZACAS-NEXT:    ret
6334;
6335; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_acq_rel:
6336; RV64IA-WMO-ZABHA:       # %bb.0:
6337; RV64IA-WMO-ZABHA-NEXT:    amomax.b.aqrl a0, a1, (a0)
6338; RV64IA-WMO-ZABHA-NEXT:    ret
6339;
6340; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_acq_rel:
6341; RV64IA-TSO-ZABHA:       # %bb.0:
6342; RV64IA-TSO-ZABHA-NEXT:    amomax.b a0, a1, (a0)
6343; RV64IA-TSO-ZABHA-NEXT:    ret
6344  %1 = atomicrmw max ptr %a, i8 %b acq_rel
6345  ret i8 %1
6346}
6347
6348define i8 @atomicrmw_max_i8_seq_cst(ptr %a, i8 %b) nounwind {
6349; RV32I-LABEL: atomicrmw_max_i8_seq_cst:
6350; RV32I:       # %bb.0:
6351; RV32I-NEXT:    addi sp, sp, -32
6352; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6353; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6354; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6355; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6356; RV32I-NEXT:    mv s0, a0
6357; RV32I-NEXT:    lbu a3, 0(a0)
6358; RV32I-NEXT:    mv s1, a1
6359; RV32I-NEXT:    slli a0, a1, 24
6360; RV32I-NEXT:    srai s2, a0, 24
6361; RV32I-NEXT:    j .LBB49_2
6362; RV32I-NEXT:  .LBB49_1: # %atomicrmw.start
6363; RV32I-NEXT:    # in Loop: Header=BB49_2 Depth=1
6364; RV32I-NEXT:    sb a3, 15(sp)
6365; RV32I-NEXT:    addi a1, sp, 15
6366; RV32I-NEXT:    li a3, 5
6367; RV32I-NEXT:    li a4, 5
6368; RV32I-NEXT:    mv a0, s0
6369; RV32I-NEXT:    call __atomic_compare_exchange_1
6370; RV32I-NEXT:    lbu a3, 15(sp)
6371; RV32I-NEXT:    bnez a0, .LBB49_4
6372; RV32I-NEXT:  .LBB49_2: # %atomicrmw.start
6373; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
6374; RV32I-NEXT:    slli a0, a3, 24
6375; RV32I-NEXT:    srai a0, a0, 24
6376; RV32I-NEXT:    mv a2, a3
6377; RV32I-NEXT:    blt s2, a0, .LBB49_1
6378; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
6379; RV32I-NEXT:    # in Loop: Header=BB49_2 Depth=1
6380; RV32I-NEXT:    mv a2, s1
6381; RV32I-NEXT:    j .LBB49_1
6382; RV32I-NEXT:  .LBB49_4: # %atomicrmw.end
6383; RV32I-NEXT:    mv a0, a3
6384; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
6385; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
6386; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
6387; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
6388; RV32I-NEXT:    addi sp, sp, 32
6389; RV32I-NEXT:    ret
6390;
6391; RV32IA-LABEL: atomicrmw_max_i8_seq_cst:
6392; RV32IA:       # %bb.0:
6393; RV32IA-NEXT:    andi a2, a0, -4
6394; RV32IA-NEXT:    slli a0, a0, 3
6395; RV32IA-NEXT:    li a3, 255
6396; RV32IA-NEXT:    slli a1, a1, 24
6397; RV32IA-NEXT:    andi a4, a0, 24
6398; RV32IA-NEXT:    sll a3, a3, a0
6399; RV32IA-NEXT:    srai a1, a1, 24
6400; RV32IA-NEXT:    sll a1, a1, a0
6401; RV32IA-NEXT:    xori a4, a4, 24
6402; RV32IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
6403; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
6404; RV32IA-NEXT:    and a7, a5, a3
6405; RV32IA-NEXT:    mv a6, a5
6406; RV32IA-NEXT:    sll a7, a7, a4
6407; RV32IA-NEXT:    sra a7, a7, a4
6408; RV32IA-NEXT:    bge a7, a1, .LBB49_3
6409; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
6410; RV32IA-NEXT:    xor a6, a5, a1
6411; RV32IA-NEXT:    and a6, a6, a3
6412; RV32IA-NEXT:    xor a6, a5, a6
6413; RV32IA-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
6414; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
6415; RV32IA-NEXT:    bnez a6, .LBB49_1
6416; RV32IA-NEXT:  # %bb.4:
6417; RV32IA-NEXT:    srl a0, a5, a0
6418; RV32IA-NEXT:    ret
6419;
6420; RV64I-LABEL: atomicrmw_max_i8_seq_cst:
6421; RV64I:       # %bb.0:
6422; RV64I-NEXT:    addi sp, sp, -48
6423; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
6424; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
6425; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
6426; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
6427; RV64I-NEXT:    mv s0, a0
6428; RV64I-NEXT:    lbu a3, 0(a0)
6429; RV64I-NEXT:    mv s1, a1
6430; RV64I-NEXT:    slli a0, a1, 56
6431; RV64I-NEXT:    srai s2, a0, 56
6432; RV64I-NEXT:    j .LBB49_2
6433; RV64I-NEXT:  .LBB49_1: # %atomicrmw.start
6434; RV64I-NEXT:    # in Loop: Header=BB49_2 Depth=1
6435; RV64I-NEXT:    sb a3, 15(sp)
6436; RV64I-NEXT:    addi a1, sp, 15
6437; RV64I-NEXT:    li a3, 5
6438; RV64I-NEXT:    li a4, 5
6439; RV64I-NEXT:    mv a0, s0
6440; RV64I-NEXT:    call __atomic_compare_exchange_1
6441; RV64I-NEXT:    lbu a3, 15(sp)
6442; RV64I-NEXT:    bnez a0, .LBB49_4
6443; RV64I-NEXT:  .LBB49_2: # %atomicrmw.start
6444; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
6445; RV64I-NEXT:    slli a0, a3, 56
6446; RV64I-NEXT:    srai a0, a0, 56
6447; RV64I-NEXT:    mv a2, a3
6448; RV64I-NEXT:    blt s2, a0, .LBB49_1
6449; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
6450; RV64I-NEXT:    # in Loop: Header=BB49_2 Depth=1
6451; RV64I-NEXT:    mv a2, s1
6452; RV64I-NEXT:    j .LBB49_1
6453; RV64I-NEXT:  .LBB49_4: # %atomicrmw.end
6454; RV64I-NEXT:    mv a0, a3
6455; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
6456; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
6457; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
6458; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
6459; RV64I-NEXT:    addi sp, sp, 48
6460; RV64I-NEXT:    ret
6461;
6462; RV64IA-NOZACAS-LABEL: atomicrmw_max_i8_seq_cst:
6463; RV64IA-NOZACAS:       # %bb.0:
6464; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
6465; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
6466; RV64IA-NOZACAS-NEXT:    li a3, 255
6467; RV64IA-NOZACAS-NEXT:    slli a1, a1, 56
6468; RV64IA-NOZACAS-NEXT:    andi a4, a0, 24
6469; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
6470; RV64IA-NOZACAS-NEXT:    srai a1, a1, 56
6471; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
6472; RV64IA-NOZACAS-NEXT:    xori a4, a4, 56
6473; RV64IA-NOZACAS-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
6474; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a5, (a2)
6475; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
6476; RV64IA-NOZACAS-NEXT:    mv a6, a5
6477; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
6478; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
6479; RV64IA-NOZACAS-NEXT:    bge a7, a1, .LBB49_3
6480; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
6481; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
6482; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
6483; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
6484; RV64IA-NOZACAS-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
6485; RV64IA-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
6486; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB49_1
6487; RV64IA-NOZACAS-NEXT:  # %bb.4:
6488; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
6489; RV64IA-NOZACAS-NEXT:    ret
6490;
6491; RV64IA-ZACAS-LABEL: atomicrmw_max_i8_seq_cst:
6492; RV64IA-ZACAS:       # %bb.0:
6493; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
6494; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
6495; RV64IA-ZACAS-NEXT:    li a3, 255
6496; RV64IA-ZACAS-NEXT:    slli a1, a1, 56
6497; RV64IA-ZACAS-NEXT:    andi a4, a0, 24
6498; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
6499; RV64IA-ZACAS-NEXT:    srai a1, a1, 56
6500; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
6501; RV64IA-ZACAS-NEXT:    xori a4, a4, 56
6502; RV64IA-ZACAS-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
6503; RV64IA-ZACAS-NEXT:    lr.w.aqrl a5, (a2)
6504; RV64IA-ZACAS-NEXT:    and a7, a5, a3
6505; RV64IA-ZACAS-NEXT:    mv a6, a5
6506; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
6507; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
6508; RV64IA-ZACAS-NEXT:    bge a7, a1, .LBB49_3
6509; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
6510; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
6511; RV64IA-ZACAS-NEXT:    and a6, a6, a3
6512; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
6513; RV64IA-ZACAS-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
6514; RV64IA-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
6515; RV64IA-ZACAS-NEXT:    bnez a6, .LBB49_1
6516; RV64IA-ZACAS-NEXT:  # %bb.4:
6517; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
6518; RV64IA-ZACAS-NEXT:    ret
6519;
6520; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_seq_cst:
6521; RV64IA-WMO-ZABHA:       # %bb.0:
6522; RV64IA-WMO-ZABHA-NEXT:    amomax.b.aqrl a0, a1, (a0)
6523; RV64IA-WMO-ZABHA-NEXT:    ret
6524;
6525; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_seq_cst:
6526; RV64IA-TSO-ZABHA:       # %bb.0:
6527; RV64IA-TSO-ZABHA-NEXT:    amomax.b a0, a1, (a0)
6528; RV64IA-TSO-ZABHA-NEXT:    ret
6529  %1 = atomicrmw max ptr %a, i8 %b seq_cst
6530  ret i8 %1
6531}
6532
6533define i8 @atomicrmw_min_i8_monotonic(ptr %a, i8 %b) nounwind {
6534; RV32I-LABEL: atomicrmw_min_i8_monotonic:
6535; RV32I:       # %bb.0:
6536; RV32I-NEXT:    addi sp, sp, -32
6537; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6538; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6539; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6540; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6541; RV32I-NEXT:    mv s0, a0
6542; RV32I-NEXT:    lbu a3, 0(a0)
6543; RV32I-NEXT:    mv s1, a1
6544; RV32I-NEXT:    slli a0, a1, 24
6545; RV32I-NEXT:    srai s2, a0, 24
6546; RV32I-NEXT:    j .LBB50_2
6547; RV32I-NEXT:  .LBB50_1: # %atomicrmw.start
6548; RV32I-NEXT:    # in Loop: Header=BB50_2 Depth=1
6549; RV32I-NEXT:    sb a3, 15(sp)
6550; RV32I-NEXT:    addi a1, sp, 15
6551; RV32I-NEXT:    mv a0, s0
6552; RV32I-NEXT:    li a3, 0
6553; RV32I-NEXT:    li a4, 0
6554; RV32I-NEXT:    call __atomic_compare_exchange_1
6555; RV32I-NEXT:    lbu a3, 15(sp)
6556; RV32I-NEXT:    bnez a0, .LBB50_4
6557; RV32I-NEXT:  .LBB50_2: # %atomicrmw.start
6558; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
6559; RV32I-NEXT:    slli a0, a3, 24
6560; RV32I-NEXT:    srai a0, a0, 24
6561; RV32I-NEXT:    mv a2, a3
6562; RV32I-NEXT:    bge s2, a0, .LBB50_1
6563; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
6564; RV32I-NEXT:    # in Loop: Header=BB50_2 Depth=1
6565; RV32I-NEXT:    mv a2, s1
6566; RV32I-NEXT:    j .LBB50_1
6567; RV32I-NEXT:  .LBB50_4: # %atomicrmw.end
6568; RV32I-NEXT:    mv a0, a3
6569; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
6570; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
6571; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
6572; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
6573; RV32I-NEXT:    addi sp, sp, 32
6574; RV32I-NEXT:    ret
6575;
6576; RV32IA-LABEL: atomicrmw_min_i8_monotonic:
6577; RV32IA:       # %bb.0:
6578; RV32IA-NEXT:    andi a2, a0, -4
6579; RV32IA-NEXT:    slli a0, a0, 3
6580; RV32IA-NEXT:    li a3, 255
6581; RV32IA-NEXT:    slli a1, a1, 24
6582; RV32IA-NEXT:    andi a4, a0, 24
6583; RV32IA-NEXT:    sll a3, a3, a0
6584; RV32IA-NEXT:    srai a1, a1, 24
6585; RV32IA-NEXT:    sll a1, a1, a0
6586; RV32IA-NEXT:    xori a4, a4, 24
6587; RV32IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
6588; RV32IA-NEXT:    lr.w a5, (a2)
6589; RV32IA-NEXT:    and a7, a5, a3
6590; RV32IA-NEXT:    mv a6, a5
6591; RV32IA-NEXT:    sll a7, a7, a4
6592; RV32IA-NEXT:    sra a7, a7, a4
6593; RV32IA-NEXT:    bge a1, a7, .LBB50_3
6594; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
6595; RV32IA-NEXT:    xor a6, a5, a1
6596; RV32IA-NEXT:    and a6, a6, a3
6597; RV32IA-NEXT:    xor a6, a5, a6
6598; RV32IA-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
6599; RV32IA-NEXT:    sc.w a6, a6, (a2)
6600; RV32IA-NEXT:    bnez a6, .LBB50_1
6601; RV32IA-NEXT:  # %bb.4:
6602; RV32IA-NEXT:    srl a0, a5, a0
6603; RV32IA-NEXT:    ret
6604;
6605; RV64I-LABEL: atomicrmw_min_i8_monotonic:
6606; RV64I:       # %bb.0:
6607; RV64I-NEXT:    addi sp, sp, -48
6608; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
6609; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
6610; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
6611; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
6612; RV64I-NEXT:    mv s0, a0
6613; RV64I-NEXT:    lbu a3, 0(a0)
6614; RV64I-NEXT:    mv s1, a1
6615; RV64I-NEXT:    slli a0, a1, 56
6616; RV64I-NEXT:    srai s2, a0, 56
6617; RV64I-NEXT:    j .LBB50_2
6618; RV64I-NEXT:  .LBB50_1: # %atomicrmw.start
6619; RV64I-NEXT:    # in Loop: Header=BB50_2 Depth=1
6620; RV64I-NEXT:    sb a3, 15(sp)
6621; RV64I-NEXT:    addi a1, sp, 15
6622; RV64I-NEXT:    mv a0, s0
6623; RV64I-NEXT:    li a3, 0
6624; RV64I-NEXT:    li a4, 0
6625; RV64I-NEXT:    call __atomic_compare_exchange_1
6626; RV64I-NEXT:    lbu a3, 15(sp)
6627; RV64I-NEXT:    bnez a0, .LBB50_4
6628; RV64I-NEXT:  .LBB50_2: # %atomicrmw.start
6629; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
6630; RV64I-NEXT:    slli a0, a3, 56
6631; RV64I-NEXT:    srai a0, a0, 56
6632; RV64I-NEXT:    mv a2, a3
6633; RV64I-NEXT:    bge s2, a0, .LBB50_1
6634; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
6635; RV64I-NEXT:    # in Loop: Header=BB50_2 Depth=1
6636; RV64I-NEXT:    mv a2, s1
6637; RV64I-NEXT:    j .LBB50_1
6638; RV64I-NEXT:  .LBB50_4: # %atomicrmw.end
6639; RV64I-NEXT:    mv a0, a3
6640; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
6641; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
6642; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
6643; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
6644; RV64I-NEXT:    addi sp, sp, 48
6645; RV64I-NEXT:    ret
6646;
6647; RV64IA-NOZACAS-LABEL: atomicrmw_min_i8_monotonic:
6648; RV64IA-NOZACAS:       # %bb.0:
6649; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
6650; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
6651; RV64IA-NOZACAS-NEXT:    li a3, 255
6652; RV64IA-NOZACAS-NEXT:    slli a1, a1, 56
6653; RV64IA-NOZACAS-NEXT:    andi a4, a0, 24
6654; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
6655; RV64IA-NOZACAS-NEXT:    srai a1, a1, 56
6656; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
6657; RV64IA-NOZACAS-NEXT:    xori a4, a4, 56
6658; RV64IA-NOZACAS-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
6659; RV64IA-NOZACAS-NEXT:    lr.w a5, (a2)
6660; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
6661; RV64IA-NOZACAS-NEXT:    mv a6, a5
6662; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
6663; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
6664; RV64IA-NOZACAS-NEXT:    bge a1, a7, .LBB50_3
6665; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
6666; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
6667; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
6668; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
6669; RV64IA-NOZACAS-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
6670; RV64IA-NOZACAS-NEXT:    sc.w a6, a6, (a2)
6671; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB50_1
6672; RV64IA-NOZACAS-NEXT:  # %bb.4:
6673; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
6674; RV64IA-NOZACAS-NEXT:    ret
6675;
6676; RV64IA-ZACAS-LABEL: atomicrmw_min_i8_monotonic:
6677; RV64IA-ZACAS:       # %bb.0:
6678; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
6679; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
6680; RV64IA-ZACAS-NEXT:    li a3, 255
6681; RV64IA-ZACAS-NEXT:    slli a1, a1, 56
6682; RV64IA-ZACAS-NEXT:    andi a4, a0, 24
6683; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
6684; RV64IA-ZACAS-NEXT:    srai a1, a1, 56
6685; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
6686; RV64IA-ZACAS-NEXT:    xori a4, a4, 56
6687; RV64IA-ZACAS-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
6688; RV64IA-ZACAS-NEXT:    lr.w a5, (a2)
6689; RV64IA-ZACAS-NEXT:    and a7, a5, a3
6690; RV64IA-ZACAS-NEXT:    mv a6, a5
6691; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
6692; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
6693; RV64IA-ZACAS-NEXT:    bge a1, a7, .LBB50_3
6694; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
6695; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
6696; RV64IA-ZACAS-NEXT:    and a6, a6, a3
6697; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
6698; RV64IA-ZACAS-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
6699; RV64IA-ZACAS-NEXT:    sc.w a6, a6, (a2)
6700; RV64IA-ZACAS-NEXT:    bnez a6, .LBB50_1
6701; RV64IA-ZACAS-NEXT:  # %bb.4:
6702; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
6703; RV64IA-ZACAS-NEXT:    ret
6704;
6705; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_monotonic:
6706; RV64IA-WMO-ZABHA:       # %bb.0:
6707; RV64IA-WMO-ZABHA-NEXT:    amomin.b a0, a1, (a0)
6708; RV64IA-WMO-ZABHA-NEXT:    ret
6709;
6710; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_monotonic:
6711; RV64IA-TSO-ZABHA:       # %bb.0:
6712; RV64IA-TSO-ZABHA-NEXT:    amomin.b a0, a1, (a0)
6713; RV64IA-TSO-ZABHA-NEXT:    ret
6714  %1 = atomicrmw min ptr %a, i8 %b monotonic
6715  ret i8 %1
6716}
6717
6718define i8 @atomicrmw_min_i8_acquire(ptr %a, i8 %b) nounwind {
6719; RV32I-LABEL: atomicrmw_min_i8_acquire:
6720; RV32I:       # %bb.0:
6721; RV32I-NEXT:    addi sp, sp, -32
6722; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6723; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6724; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6725; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6726; RV32I-NEXT:    mv s0, a0
6727; RV32I-NEXT:    lbu a3, 0(a0)
6728; RV32I-NEXT:    mv s1, a1
6729; RV32I-NEXT:    slli a0, a1, 24
6730; RV32I-NEXT:    srai s2, a0, 24
6731; RV32I-NEXT:    j .LBB51_2
6732; RV32I-NEXT:  .LBB51_1: # %atomicrmw.start
6733; RV32I-NEXT:    # in Loop: Header=BB51_2 Depth=1
6734; RV32I-NEXT:    sb a3, 15(sp)
6735; RV32I-NEXT:    addi a1, sp, 15
6736; RV32I-NEXT:    li a3, 2
6737; RV32I-NEXT:    li a4, 2
6738; RV32I-NEXT:    mv a0, s0
6739; RV32I-NEXT:    call __atomic_compare_exchange_1
6740; RV32I-NEXT:    lbu a3, 15(sp)
6741; RV32I-NEXT:    bnez a0, .LBB51_4
6742; RV32I-NEXT:  .LBB51_2: # %atomicrmw.start
6743; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
6744; RV32I-NEXT:    slli a0, a3, 24
6745; RV32I-NEXT:    srai a0, a0, 24
6746; RV32I-NEXT:    mv a2, a3
6747; RV32I-NEXT:    bge s2, a0, .LBB51_1
6748; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
6749; RV32I-NEXT:    # in Loop: Header=BB51_2 Depth=1
6750; RV32I-NEXT:    mv a2, s1
6751; RV32I-NEXT:    j .LBB51_1
6752; RV32I-NEXT:  .LBB51_4: # %atomicrmw.end
6753; RV32I-NEXT:    mv a0, a3
6754; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
6755; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
6756; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
6757; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
6758; RV32I-NEXT:    addi sp, sp, 32
6759; RV32I-NEXT:    ret
6760;
6761; RV32IA-WMO-LABEL: atomicrmw_min_i8_acquire:
6762; RV32IA-WMO:       # %bb.0:
6763; RV32IA-WMO-NEXT:    andi a2, a0, -4
6764; RV32IA-WMO-NEXT:    slli a0, a0, 3
6765; RV32IA-WMO-NEXT:    li a3, 255
6766; RV32IA-WMO-NEXT:    slli a1, a1, 24
6767; RV32IA-WMO-NEXT:    andi a4, a0, 24
6768; RV32IA-WMO-NEXT:    sll a3, a3, a0
6769; RV32IA-WMO-NEXT:    srai a1, a1, 24
6770; RV32IA-WMO-NEXT:    sll a1, a1, a0
6771; RV32IA-WMO-NEXT:    xori a4, a4, 24
6772; RV32IA-WMO-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
6773; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
6774; RV32IA-WMO-NEXT:    and a7, a5, a3
6775; RV32IA-WMO-NEXT:    mv a6, a5
6776; RV32IA-WMO-NEXT:    sll a7, a7, a4
6777; RV32IA-WMO-NEXT:    sra a7, a7, a4
6778; RV32IA-WMO-NEXT:    bge a1, a7, .LBB51_3
6779; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
6780; RV32IA-WMO-NEXT:    xor a6, a5, a1
6781; RV32IA-WMO-NEXT:    and a6, a6, a3
6782; RV32IA-WMO-NEXT:    xor a6, a5, a6
6783; RV32IA-WMO-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
6784; RV32IA-WMO-NEXT:    sc.w a6, a6, (a2)
6785; RV32IA-WMO-NEXT:    bnez a6, .LBB51_1
6786; RV32IA-WMO-NEXT:  # %bb.4:
6787; RV32IA-WMO-NEXT:    srl a0, a5, a0
6788; RV32IA-WMO-NEXT:    ret
6789;
6790; RV32IA-TSO-LABEL: atomicrmw_min_i8_acquire:
6791; RV32IA-TSO:       # %bb.0:
6792; RV32IA-TSO-NEXT:    andi a2, a0, -4
6793; RV32IA-TSO-NEXT:    slli a0, a0, 3
6794; RV32IA-TSO-NEXT:    li a3, 255
6795; RV32IA-TSO-NEXT:    slli a1, a1, 24
6796; RV32IA-TSO-NEXT:    andi a4, a0, 24
6797; RV32IA-TSO-NEXT:    sll a3, a3, a0
6798; RV32IA-TSO-NEXT:    srai a1, a1, 24
6799; RV32IA-TSO-NEXT:    sll a1, a1, a0
6800; RV32IA-TSO-NEXT:    xori a4, a4, 24
6801; RV32IA-TSO-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
6802; RV32IA-TSO-NEXT:    lr.w a5, (a2)
6803; RV32IA-TSO-NEXT:    and a7, a5, a3
6804; RV32IA-TSO-NEXT:    mv a6, a5
6805; RV32IA-TSO-NEXT:    sll a7, a7, a4
6806; RV32IA-TSO-NEXT:    sra a7, a7, a4
6807; RV32IA-TSO-NEXT:    bge a1, a7, .LBB51_3
6808; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
6809; RV32IA-TSO-NEXT:    xor a6, a5, a1
6810; RV32IA-TSO-NEXT:    and a6, a6, a3
6811; RV32IA-TSO-NEXT:    xor a6, a5, a6
6812; RV32IA-TSO-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
6813; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
6814; RV32IA-TSO-NEXT:    bnez a6, .LBB51_1
6815; RV32IA-TSO-NEXT:  # %bb.4:
6816; RV32IA-TSO-NEXT:    srl a0, a5, a0
6817; RV32IA-TSO-NEXT:    ret
6818;
6819; RV64I-LABEL: atomicrmw_min_i8_acquire:
6820; RV64I:       # %bb.0:
6821; RV64I-NEXT:    addi sp, sp, -48
6822; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
6823; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
6824; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
6825; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
6826; RV64I-NEXT:    mv s0, a0
6827; RV64I-NEXT:    lbu a3, 0(a0)
6828; RV64I-NEXT:    mv s1, a1
6829; RV64I-NEXT:    slli a0, a1, 56
6830; RV64I-NEXT:    srai s2, a0, 56
6831; RV64I-NEXT:    j .LBB51_2
6832; RV64I-NEXT:  .LBB51_1: # %atomicrmw.start
6833; RV64I-NEXT:    # in Loop: Header=BB51_2 Depth=1
6834; RV64I-NEXT:    sb a3, 15(sp)
6835; RV64I-NEXT:    addi a1, sp, 15
6836; RV64I-NEXT:    li a3, 2
6837; RV64I-NEXT:    li a4, 2
6838; RV64I-NEXT:    mv a0, s0
6839; RV64I-NEXT:    call __atomic_compare_exchange_1
6840; RV64I-NEXT:    lbu a3, 15(sp)
6841; RV64I-NEXT:    bnez a0, .LBB51_4
6842; RV64I-NEXT:  .LBB51_2: # %atomicrmw.start
6843; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
6844; RV64I-NEXT:    slli a0, a3, 56
6845; RV64I-NEXT:    srai a0, a0, 56
6846; RV64I-NEXT:    mv a2, a3
6847; RV64I-NEXT:    bge s2, a0, .LBB51_1
6848; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
6849; RV64I-NEXT:    # in Loop: Header=BB51_2 Depth=1
6850; RV64I-NEXT:    mv a2, s1
6851; RV64I-NEXT:    j .LBB51_1
6852; RV64I-NEXT:  .LBB51_4: # %atomicrmw.end
6853; RV64I-NEXT:    mv a0, a3
6854; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
6855; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
6856; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
6857; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
6858; RV64I-NEXT:    addi sp, sp, 48
6859; RV64I-NEXT:    ret
6860;
6861; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_acquire:
6862; RV64IA-WMO-NOZACAS:       # %bb.0:
6863; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
6864; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
6865; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
6866; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 56
6867; RV64IA-WMO-NOZACAS-NEXT:    andi a4, a0, 24
6868; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
6869; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 56
6870; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
6871; RV64IA-WMO-NOZACAS-NEXT:    xori a4, a4, 56
6872; RV64IA-WMO-NOZACAS-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
6873; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
6874; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
6875; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
6876; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
6877; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
6878; RV64IA-WMO-NOZACAS-NEXT:    bge a1, a7, .LBB51_3
6879; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
6880; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
6881; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
6882; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
6883; RV64IA-WMO-NOZACAS-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
6884; RV64IA-WMO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
6885; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB51_1
6886; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
6887; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
6888; RV64IA-WMO-NOZACAS-NEXT:    ret
6889;
6890; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_acquire:
6891; RV64IA-TSO-NOZACAS:       # %bb.0:
6892; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
6893; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
6894; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
6895; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 56
6896; RV64IA-TSO-NOZACAS-NEXT:    andi a4, a0, 24
6897; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
6898; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 56
6899; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
6900; RV64IA-TSO-NOZACAS-NEXT:    xori a4, a4, 56
6901; RV64IA-TSO-NOZACAS-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
6902; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
6903; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
6904; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
6905; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
6906; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
6907; RV64IA-TSO-NOZACAS-NEXT:    bge a1, a7, .LBB51_3
6908; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
6909; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
6910; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
6911; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
6912; RV64IA-TSO-NOZACAS-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
6913; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
6914; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB51_1
6915; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
6916; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
6917; RV64IA-TSO-NOZACAS-NEXT:    ret
6918;
6919; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_acquire:
6920; RV64IA-WMO-ZACAS:       # %bb.0:
6921; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
6922; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
6923; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
6924; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 56
6925; RV64IA-WMO-ZACAS-NEXT:    andi a4, a0, 24
6926; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
6927; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 56
6928; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
6929; RV64IA-WMO-ZACAS-NEXT:    xori a4, a4, 56
6930; RV64IA-WMO-ZACAS-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
6931; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
6932; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
6933; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
6934; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
6935; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
6936; RV64IA-WMO-ZACAS-NEXT:    bge a1, a7, .LBB51_3
6937; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
6938; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
6939; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
6940; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
6941; RV64IA-WMO-ZACAS-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
6942; RV64IA-WMO-ZACAS-NEXT:    sc.w a6, a6, (a2)
6943; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB51_1
6944; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
6945; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
6946; RV64IA-WMO-ZACAS-NEXT:    ret
6947;
6948; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_acquire:
6949; RV64IA-TSO-ZACAS:       # %bb.0:
6950; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
6951; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
6952; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
6953; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 56
6954; RV64IA-TSO-ZACAS-NEXT:    andi a4, a0, 24
6955; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
6956; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 56
6957; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
6958; RV64IA-TSO-ZACAS-NEXT:    xori a4, a4, 56
6959; RV64IA-TSO-ZACAS-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
6960; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
6961; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
6962; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
6963; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
6964; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
6965; RV64IA-TSO-ZACAS-NEXT:    bge a1, a7, .LBB51_3
6966; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
6967; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
6968; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
6969; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
6970; RV64IA-TSO-ZACAS-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
6971; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
6972; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB51_1
6973; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
6974; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
6975; RV64IA-TSO-ZACAS-NEXT:    ret
6976;
6977; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_acquire:
6978; RV64IA-WMO-ZABHA:       # %bb.0:
6979; RV64IA-WMO-ZABHA-NEXT:    amomin.b.aq a0, a1, (a0)
6980; RV64IA-WMO-ZABHA-NEXT:    ret
6981;
6982; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_acquire:
6983; RV64IA-TSO-ZABHA:       # %bb.0:
6984; RV64IA-TSO-ZABHA-NEXT:    amomin.b a0, a1, (a0)
6985; RV64IA-TSO-ZABHA-NEXT:    ret
6986  %1 = atomicrmw min ptr %a, i8 %b acquire
6987  ret i8 %1
6988}
6989
6990define i8 @atomicrmw_min_i8_release(ptr %a, i8 %b) nounwind {
6991; RV32I-LABEL: atomicrmw_min_i8_release:
6992; RV32I:       # %bb.0:
6993; RV32I-NEXT:    addi sp, sp, -32
6994; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
6995; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
6996; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
6997; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
6998; RV32I-NEXT:    mv s0, a0
6999; RV32I-NEXT:    lbu a3, 0(a0)
7000; RV32I-NEXT:    mv s1, a1
7001; RV32I-NEXT:    slli a0, a1, 24
7002; RV32I-NEXT:    srai s2, a0, 24
7003; RV32I-NEXT:    j .LBB52_2
7004; RV32I-NEXT:  .LBB52_1: # %atomicrmw.start
7005; RV32I-NEXT:    # in Loop: Header=BB52_2 Depth=1
7006; RV32I-NEXT:    sb a3, 15(sp)
7007; RV32I-NEXT:    addi a1, sp, 15
7008; RV32I-NEXT:    li a3, 3
7009; RV32I-NEXT:    mv a0, s0
7010; RV32I-NEXT:    li a4, 0
7011; RV32I-NEXT:    call __atomic_compare_exchange_1
7012; RV32I-NEXT:    lbu a3, 15(sp)
7013; RV32I-NEXT:    bnez a0, .LBB52_4
7014; RV32I-NEXT:  .LBB52_2: # %atomicrmw.start
7015; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7016; RV32I-NEXT:    slli a0, a3, 24
7017; RV32I-NEXT:    srai a0, a0, 24
7018; RV32I-NEXT:    mv a2, a3
7019; RV32I-NEXT:    bge s2, a0, .LBB52_1
7020; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7021; RV32I-NEXT:    # in Loop: Header=BB52_2 Depth=1
7022; RV32I-NEXT:    mv a2, s1
7023; RV32I-NEXT:    j .LBB52_1
7024; RV32I-NEXT:  .LBB52_4: # %atomicrmw.end
7025; RV32I-NEXT:    mv a0, a3
7026; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7027; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7028; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7029; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7030; RV32I-NEXT:    addi sp, sp, 32
7031; RV32I-NEXT:    ret
7032;
7033; RV32IA-WMO-LABEL: atomicrmw_min_i8_release:
7034; RV32IA-WMO:       # %bb.0:
7035; RV32IA-WMO-NEXT:    andi a2, a0, -4
7036; RV32IA-WMO-NEXT:    slli a0, a0, 3
7037; RV32IA-WMO-NEXT:    li a3, 255
7038; RV32IA-WMO-NEXT:    slli a1, a1, 24
7039; RV32IA-WMO-NEXT:    andi a4, a0, 24
7040; RV32IA-WMO-NEXT:    sll a3, a3, a0
7041; RV32IA-WMO-NEXT:    srai a1, a1, 24
7042; RV32IA-WMO-NEXT:    sll a1, a1, a0
7043; RV32IA-WMO-NEXT:    xori a4, a4, 24
7044; RV32IA-WMO-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
7045; RV32IA-WMO-NEXT:    lr.w a5, (a2)
7046; RV32IA-WMO-NEXT:    and a7, a5, a3
7047; RV32IA-WMO-NEXT:    mv a6, a5
7048; RV32IA-WMO-NEXT:    sll a7, a7, a4
7049; RV32IA-WMO-NEXT:    sra a7, a7, a4
7050; RV32IA-WMO-NEXT:    bge a1, a7, .LBB52_3
7051; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
7052; RV32IA-WMO-NEXT:    xor a6, a5, a1
7053; RV32IA-WMO-NEXT:    and a6, a6, a3
7054; RV32IA-WMO-NEXT:    xor a6, a5, a6
7055; RV32IA-WMO-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
7056; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
7057; RV32IA-WMO-NEXT:    bnez a6, .LBB52_1
7058; RV32IA-WMO-NEXT:  # %bb.4:
7059; RV32IA-WMO-NEXT:    srl a0, a5, a0
7060; RV32IA-WMO-NEXT:    ret
7061;
7062; RV32IA-TSO-LABEL: atomicrmw_min_i8_release:
7063; RV32IA-TSO:       # %bb.0:
7064; RV32IA-TSO-NEXT:    andi a2, a0, -4
7065; RV32IA-TSO-NEXT:    slli a0, a0, 3
7066; RV32IA-TSO-NEXT:    li a3, 255
7067; RV32IA-TSO-NEXT:    slli a1, a1, 24
7068; RV32IA-TSO-NEXT:    andi a4, a0, 24
7069; RV32IA-TSO-NEXT:    sll a3, a3, a0
7070; RV32IA-TSO-NEXT:    srai a1, a1, 24
7071; RV32IA-TSO-NEXT:    sll a1, a1, a0
7072; RV32IA-TSO-NEXT:    xori a4, a4, 24
7073; RV32IA-TSO-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
7074; RV32IA-TSO-NEXT:    lr.w a5, (a2)
7075; RV32IA-TSO-NEXT:    and a7, a5, a3
7076; RV32IA-TSO-NEXT:    mv a6, a5
7077; RV32IA-TSO-NEXT:    sll a7, a7, a4
7078; RV32IA-TSO-NEXT:    sra a7, a7, a4
7079; RV32IA-TSO-NEXT:    bge a1, a7, .LBB52_3
7080; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
7081; RV32IA-TSO-NEXT:    xor a6, a5, a1
7082; RV32IA-TSO-NEXT:    and a6, a6, a3
7083; RV32IA-TSO-NEXT:    xor a6, a5, a6
7084; RV32IA-TSO-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
7085; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
7086; RV32IA-TSO-NEXT:    bnez a6, .LBB52_1
7087; RV32IA-TSO-NEXT:  # %bb.4:
7088; RV32IA-TSO-NEXT:    srl a0, a5, a0
7089; RV32IA-TSO-NEXT:    ret
7090;
7091; RV64I-LABEL: atomicrmw_min_i8_release:
7092; RV64I:       # %bb.0:
7093; RV64I-NEXT:    addi sp, sp, -48
7094; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7095; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7096; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7097; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7098; RV64I-NEXT:    mv s0, a0
7099; RV64I-NEXT:    lbu a3, 0(a0)
7100; RV64I-NEXT:    mv s1, a1
7101; RV64I-NEXT:    slli a0, a1, 56
7102; RV64I-NEXT:    srai s2, a0, 56
7103; RV64I-NEXT:    j .LBB52_2
7104; RV64I-NEXT:  .LBB52_1: # %atomicrmw.start
7105; RV64I-NEXT:    # in Loop: Header=BB52_2 Depth=1
7106; RV64I-NEXT:    sb a3, 15(sp)
7107; RV64I-NEXT:    addi a1, sp, 15
7108; RV64I-NEXT:    li a3, 3
7109; RV64I-NEXT:    mv a0, s0
7110; RV64I-NEXT:    li a4, 0
7111; RV64I-NEXT:    call __atomic_compare_exchange_1
7112; RV64I-NEXT:    lbu a3, 15(sp)
7113; RV64I-NEXT:    bnez a0, .LBB52_4
7114; RV64I-NEXT:  .LBB52_2: # %atomicrmw.start
7115; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7116; RV64I-NEXT:    slli a0, a3, 56
7117; RV64I-NEXT:    srai a0, a0, 56
7118; RV64I-NEXT:    mv a2, a3
7119; RV64I-NEXT:    bge s2, a0, .LBB52_1
7120; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7121; RV64I-NEXT:    # in Loop: Header=BB52_2 Depth=1
7122; RV64I-NEXT:    mv a2, s1
7123; RV64I-NEXT:    j .LBB52_1
7124; RV64I-NEXT:  .LBB52_4: # %atomicrmw.end
7125; RV64I-NEXT:    mv a0, a3
7126; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7127; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7128; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7129; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7130; RV64I-NEXT:    addi sp, sp, 48
7131; RV64I-NEXT:    ret
7132;
7133; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_release:
7134; RV64IA-WMO-NOZACAS:       # %bb.0:
7135; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
7136; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
7137; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
7138; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 56
7139; RV64IA-WMO-NOZACAS-NEXT:    andi a4, a0, 24
7140; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
7141; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 56
7142; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
7143; RV64IA-WMO-NOZACAS-NEXT:    xori a4, a4, 56
7144; RV64IA-WMO-NOZACAS-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
7145; RV64IA-WMO-NOZACAS-NEXT:    lr.w a5, (a2)
7146; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
7147; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
7148; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
7149; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
7150; RV64IA-WMO-NOZACAS-NEXT:    bge a1, a7, .LBB52_3
7151; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
7152; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
7153; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
7154; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
7155; RV64IA-WMO-NOZACAS-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
7156; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
7157; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB52_1
7158; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
7159; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
7160; RV64IA-WMO-NOZACAS-NEXT:    ret
7161;
7162; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_release:
7163; RV64IA-TSO-NOZACAS:       # %bb.0:
7164; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
7165; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
7166; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
7167; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 56
7168; RV64IA-TSO-NOZACAS-NEXT:    andi a4, a0, 24
7169; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
7170; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 56
7171; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
7172; RV64IA-TSO-NOZACAS-NEXT:    xori a4, a4, 56
7173; RV64IA-TSO-NOZACAS-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
7174; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
7175; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
7176; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
7177; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
7178; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
7179; RV64IA-TSO-NOZACAS-NEXT:    bge a1, a7, .LBB52_3
7180; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
7181; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
7182; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
7183; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
7184; RV64IA-TSO-NOZACAS-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
7185; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
7186; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB52_1
7187; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
7188; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
7189; RV64IA-TSO-NOZACAS-NEXT:    ret
7190;
7191; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_release:
7192; RV64IA-WMO-ZACAS:       # %bb.0:
7193; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
7194; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
7195; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
7196; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 56
7197; RV64IA-WMO-ZACAS-NEXT:    andi a4, a0, 24
7198; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
7199; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 56
7200; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
7201; RV64IA-WMO-ZACAS-NEXT:    xori a4, a4, 56
7202; RV64IA-WMO-ZACAS-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
7203; RV64IA-WMO-ZACAS-NEXT:    lr.w a5, (a2)
7204; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
7205; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
7206; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
7207; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
7208; RV64IA-WMO-ZACAS-NEXT:    bge a1, a7, .LBB52_3
7209; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
7210; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
7211; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
7212; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
7213; RV64IA-WMO-ZACAS-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
7214; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
7215; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB52_1
7216; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
7217; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
7218; RV64IA-WMO-ZACAS-NEXT:    ret
7219;
7220; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_release:
7221; RV64IA-TSO-ZACAS:       # %bb.0:
7222; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
7223; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
7224; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
7225; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 56
7226; RV64IA-TSO-ZACAS-NEXT:    andi a4, a0, 24
7227; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
7228; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 56
7229; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
7230; RV64IA-TSO-ZACAS-NEXT:    xori a4, a4, 56
7231; RV64IA-TSO-ZACAS-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
7232; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
7233; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
7234; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
7235; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
7236; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
7237; RV64IA-TSO-ZACAS-NEXT:    bge a1, a7, .LBB52_3
7238; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
7239; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
7240; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
7241; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
7242; RV64IA-TSO-ZACAS-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
7243; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
7244; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB52_1
7245; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
7246; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
7247; RV64IA-TSO-ZACAS-NEXT:    ret
7248;
7249; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_release:
7250; RV64IA-WMO-ZABHA:       # %bb.0:
7251; RV64IA-WMO-ZABHA-NEXT:    amomin.b.rl a0, a1, (a0)
7252; RV64IA-WMO-ZABHA-NEXT:    ret
7253;
7254; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_release:
7255; RV64IA-TSO-ZABHA:       # %bb.0:
7256; RV64IA-TSO-ZABHA-NEXT:    amomin.b a0, a1, (a0)
7257; RV64IA-TSO-ZABHA-NEXT:    ret
7258  %1 = atomicrmw min ptr %a, i8 %b release
7259  ret i8 %1
7260}
7261
7262define i8 @atomicrmw_min_i8_acq_rel(ptr %a, i8 %b) nounwind {
7263; RV32I-LABEL: atomicrmw_min_i8_acq_rel:
7264; RV32I:       # %bb.0:
7265; RV32I-NEXT:    addi sp, sp, -32
7266; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7267; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7268; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7269; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7270; RV32I-NEXT:    mv s0, a0
7271; RV32I-NEXT:    lbu a3, 0(a0)
7272; RV32I-NEXT:    mv s1, a1
7273; RV32I-NEXT:    slli a0, a1, 24
7274; RV32I-NEXT:    srai s2, a0, 24
7275; RV32I-NEXT:    j .LBB53_2
7276; RV32I-NEXT:  .LBB53_1: # %atomicrmw.start
7277; RV32I-NEXT:    # in Loop: Header=BB53_2 Depth=1
7278; RV32I-NEXT:    sb a3, 15(sp)
7279; RV32I-NEXT:    addi a1, sp, 15
7280; RV32I-NEXT:    li a3, 4
7281; RV32I-NEXT:    li a4, 2
7282; RV32I-NEXT:    mv a0, s0
7283; RV32I-NEXT:    call __atomic_compare_exchange_1
7284; RV32I-NEXT:    lbu a3, 15(sp)
7285; RV32I-NEXT:    bnez a0, .LBB53_4
7286; RV32I-NEXT:  .LBB53_2: # %atomicrmw.start
7287; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7288; RV32I-NEXT:    slli a0, a3, 24
7289; RV32I-NEXT:    srai a0, a0, 24
7290; RV32I-NEXT:    mv a2, a3
7291; RV32I-NEXT:    bge s2, a0, .LBB53_1
7292; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7293; RV32I-NEXT:    # in Loop: Header=BB53_2 Depth=1
7294; RV32I-NEXT:    mv a2, s1
7295; RV32I-NEXT:    j .LBB53_1
7296; RV32I-NEXT:  .LBB53_4: # %atomicrmw.end
7297; RV32I-NEXT:    mv a0, a3
7298; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7299; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7300; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7301; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7302; RV32I-NEXT:    addi sp, sp, 32
7303; RV32I-NEXT:    ret
7304;
7305; RV32IA-WMO-LABEL: atomicrmw_min_i8_acq_rel:
7306; RV32IA-WMO:       # %bb.0:
7307; RV32IA-WMO-NEXT:    andi a2, a0, -4
7308; RV32IA-WMO-NEXT:    slli a0, a0, 3
7309; RV32IA-WMO-NEXT:    li a3, 255
7310; RV32IA-WMO-NEXT:    slli a1, a1, 24
7311; RV32IA-WMO-NEXT:    andi a4, a0, 24
7312; RV32IA-WMO-NEXT:    sll a3, a3, a0
7313; RV32IA-WMO-NEXT:    srai a1, a1, 24
7314; RV32IA-WMO-NEXT:    sll a1, a1, a0
7315; RV32IA-WMO-NEXT:    xori a4, a4, 24
7316; RV32IA-WMO-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
7317; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
7318; RV32IA-WMO-NEXT:    and a7, a5, a3
7319; RV32IA-WMO-NEXT:    mv a6, a5
7320; RV32IA-WMO-NEXT:    sll a7, a7, a4
7321; RV32IA-WMO-NEXT:    sra a7, a7, a4
7322; RV32IA-WMO-NEXT:    bge a1, a7, .LBB53_3
7323; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
7324; RV32IA-WMO-NEXT:    xor a6, a5, a1
7325; RV32IA-WMO-NEXT:    and a6, a6, a3
7326; RV32IA-WMO-NEXT:    xor a6, a5, a6
7327; RV32IA-WMO-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
7328; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
7329; RV32IA-WMO-NEXT:    bnez a6, .LBB53_1
7330; RV32IA-WMO-NEXT:  # %bb.4:
7331; RV32IA-WMO-NEXT:    srl a0, a5, a0
7332; RV32IA-WMO-NEXT:    ret
7333;
7334; RV32IA-TSO-LABEL: atomicrmw_min_i8_acq_rel:
7335; RV32IA-TSO:       # %bb.0:
7336; RV32IA-TSO-NEXT:    andi a2, a0, -4
7337; RV32IA-TSO-NEXT:    slli a0, a0, 3
7338; RV32IA-TSO-NEXT:    li a3, 255
7339; RV32IA-TSO-NEXT:    slli a1, a1, 24
7340; RV32IA-TSO-NEXT:    andi a4, a0, 24
7341; RV32IA-TSO-NEXT:    sll a3, a3, a0
7342; RV32IA-TSO-NEXT:    srai a1, a1, 24
7343; RV32IA-TSO-NEXT:    sll a1, a1, a0
7344; RV32IA-TSO-NEXT:    xori a4, a4, 24
7345; RV32IA-TSO-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
7346; RV32IA-TSO-NEXT:    lr.w a5, (a2)
7347; RV32IA-TSO-NEXT:    and a7, a5, a3
7348; RV32IA-TSO-NEXT:    mv a6, a5
7349; RV32IA-TSO-NEXT:    sll a7, a7, a4
7350; RV32IA-TSO-NEXT:    sra a7, a7, a4
7351; RV32IA-TSO-NEXT:    bge a1, a7, .LBB53_3
7352; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
7353; RV32IA-TSO-NEXT:    xor a6, a5, a1
7354; RV32IA-TSO-NEXT:    and a6, a6, a3
7355; RV32IA-TSO-NEXT:    xor a6, a5, a6
7356; RV32IA-TSO-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
7357; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
7358; RV32IA-TSO-NEXT:    bnez a6, .LBB53_1
7359; RV32IA-TSO-NEXT:  # %bb.4:
7360; RV32IA-TSO-NEXT:    srl a0, a5, a0
7361; RV32IA-TSO-NEXT:    ret
7362;
7363; RV64I-LABEL: atomicrmw_min_i8_acq_rel:
7364; RV64I:       # %bb.0:
7365; RV64I-NEXT:    addi sp, sp, -48
7366; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7367; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7368; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7369; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7370; RV64I-NEXT:    mv s0, a0
7371; RV64I-NEXT:    lbu a3, 0(a0)
7372; RV64I-NEXT:    mv s1, a1
7373; RV64I-NEXT:    slli a0, a1, 56
7374; RV64I-NEXT:    srai s2, a0, 56
7375; RV64I-NEXT:    j .LBB53_2
7376; RV64I-NEXT:  .LBB53_1: # %atomicrmw.start
7377; RV64I-NEXT:    # in Loop: Header=BB53_2 Depth=1
7378; RV64I-NEXT:    sb a3, 15(sp)
7379; RV64I-NEXT:    addi a1, sp, 15
7380; RV64I-NEXT:    li a3, 4
7381; RV64I-NEXT:    li a4, 2
7382; RV64I-NEXT:    mv a0, s0
7383; RV64I-NEXT:    call __atomic_compare_exchange_1
7384; RV64I-NEXT:    lbu a3, 15(sp)
7385; RV64I-NEXT:    bnez a0, .LBB53_4
7386; RV64I-NEXT:  .LBB53_2: # %atomicrmw.start
7387; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7388; RV64I-NEXT:    slli a0, a3, 56
7389; RV64I-NEXT:    srai a0, a0, 56
7390; RV64I-NEXT:    mv a2, a3
7391; RV64I-NEXT:    bge s2, a0, .LBB53_1
7392; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7393; RV64I-NEXT:    # in Loop: Header=BB53_2 Depth=1
7394; RV64I-NEXT:    mv a2, s1
7395; RV64I-NEXT:    j .LBB53_1
7396; RV64I-NEXT:  .LBB53_4: # %atomicrmw.end
7397; RV64I-NEXT:    mv a0, a3
7398; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7399; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7400; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7401; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7402; RV64I-NEXT:    addi sp, sp, 48
7403; RV64I-NEXT:    ret
7404;
7405; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_acq_rel:
7406; RV64IA-WMO-NOZACAS:       # %bb.0:
7407; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
7408; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
7409; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
7410; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 56
7411; RV64IA-WMO-NOZACAS-NEXT:    andi a4, a0, 24
7412; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
7413; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 56
7414; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
7415; RV64IA-WMO-NOZACAS-NEXT:    xori a4, a4, 56
7416; RV64IA-WMO-NOZACAS-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
7417; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
7418; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
7419; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
7420; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
7421; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
7422; RV64IA-WMO-NOZACAS-NEXT:    bge a1, a7, .LBB53_3
7423; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
7424; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
7425; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
7426; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
7427; RV64IA-WMO-NOZACAS-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
7428; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
7429; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB53_1
7430; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
7431; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
7432; RV64IA-WMO-NOZACAS-NEXT:    ret
7433;
7434; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_acq_rel:
7435; RV64IA-TSO-NOZACAS:       # %bb.0:
7436; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
7437; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
7438; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
7439; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 56
7440; RV64IA-TSO-NOZACAS-NEXT:    andi a4, a0, 24
7441; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
7442; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 56
7443; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
7444; RV64IA-TSO-NOZACAS-NEXT:    xori a4, a4, 56
7445; RV64IA-TSO-NOZACAS-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
7446; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
7447; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
7448; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
7449; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
7450; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
7451; RV64IA-TSO-NOZACAS-NEXT:    bge a1, a7, .LBB53_3
7452; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
7453; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
7454; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
7455; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
7456; RV64IA-TSO-NOZACAS-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
7457; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
7458; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB53_1
7459; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
7460; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
7461; RV64IA-TSO-NOZACAS-NEXT:    ret
7462;
7463; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_acq_rel:
7464; RV64IA-WMO-ZACAS:       # %bb.0:
7465; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
7466; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
7467; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
7468; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 56
7469; RV64IA-WMO-ZACAS-NEXT:    andi a4, a0, 24
7470; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
7471; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 56
7472; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
7473; RV64IA-WMO-ZACAS-NEXT:    xori a4, a4, 56
7474; RV64IA-WMO-ZACAS-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
7475; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
7476; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
7477; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
7478; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
7479; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
7480; RV64IA-WMO-ZACAS-NEXT:    bge a1, a7, .LBB53_3
7481; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
7482; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
7483; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
7484; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
7485; RV64IA-WMO-ZACAS-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
7486; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
7487; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB53_1
7488; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
7489; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
7490; RV64IA-WMO-ZACAS-NEXT:    ret
7491;
7492; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_acq_rel:
7493; RV64IA-TSO-ZACAS:       # %bb.0:
7494; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
7495; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
7496; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
7497; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 56
7498; RV64IA-TSO-ZACAS-NEXT:    andi a4, a0, 24
7499; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
7500; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 56
7501; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
7502; RV64IA-TSO-ZACAS-NEXT:    xori a4, a4, 56
7503; RV64IA-TSO-ZACAS-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
7504; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
7505; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
7506; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
7507; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
7508; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
7509; RV64IA-TSO-ZACAS-NEXT:    bge a1, a7, .LBB53_3
7510; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
7511; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
7512; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
7513; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
7514; RV64IA-TSO-ZACAS-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
7515; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
7516; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB53_1
7517; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
7518; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
7519; RV64IA-TSO-ZACAS-NEXT:    ret
7520;
7521; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_acq_rel:
7522; RV64IA-WMO-ZABHA:       # %bb.0:
7523; RV64IA-WMO-ZABHA-NEXT:    amomin.b.aqrl a0, a1, (a0)
7524; RV64IA-WMO-ZABHA-NEXT:    ret
7525;
7526; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_acq_rel:
7527; RV64IA-TSO-ZABHA:       # %bb.0:
7528; RV64IA-TSO-ZABHA-NEXT:    amomin.b a0, a1, (a0)
7529; RV64IA-TSO-ZABHA-NEXT:    ret
7530  %1 = atomicrmw min ptr %a, i8 %b acq_rel
7531  ret i8 %1
7532}
7533
7534define i8 @atomicrmw_min_i8_seq_cst(ptr %a, i8 %b) nounwind {
7535; RV32I-LABEL: atomicrmw_min_i8_seq_cst:
7536; RV32I:       # %bb.0:
7537; RV32I-NEXT:    addi sp, sp, -32
7538; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7539; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7540; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7541; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7542; RV32I-NEXT:    mv s0, a0
7543; RV32I-NEXT:    lbu a3, 0(a0)
7544; RV32I-NEXT:    mv s1, a1
7545; RV32I-NEXT:    slli a0, a1, 24
7546; RV32I-NEXT:    srai s2, a0, 24
7547; RV32I-NEXT:    j .LBB54_2
7548; RV32I-NEXT:  .LBB54_1: # %atomicrmw.start
7549; RV32I-NEXT:    # in Loop: Header=BB54_2 Depth=1
7550; RV32I-NEXT:    sb a3, 15(sp)
7551; RV32I-NEXT:    addi a1, sp, 15
7552; RV32I-NEXT:    li a3, 5
7553; RV32I-NEXT:    li a4, 5
7554; RV32I-NEXT:    mv a0, s0
7555; RV32I-NEXT:    call __atomic_compare_exchange_1
7556; RV32I-NEXT:    lbu a3, 15(sp)
7557; RV32I-NEXT:    bnez a0, .LBB54_4
7558; RV32I-NEXT:  .LBB54_2: # %atomicrmw.start
7559; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7560; RV32I-NEXT:    slli a0, a3, 24
7561; RV32I-NEXT:    srai a0, a0, 24
7562; RV32I-NEXT:    mv a2, a3
7563; RV32I-NEXT:    bge s2, a0, .LBB54_1
7564; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7565; RV32I-NEXT:    # in Loop: Header=BB54_2 Depth=1
7566; RV32I-NEXT:    mv a2, s1
7567; RV32I-NEXT:    j .LBB54_1
7568; RV32I-NEXT:  .LBB54_4: # %atomicrmw.end
7569; RV32I-NEXT:    mv a0, a3
7570; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7571; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7572; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7573; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7574; RV32I-NEXT:    addi sp, sp, 32
7575; RV32I-NEXT:    ret
7576;
7577; RV32IA-LABEL: atomicrmw_min_i8_seq_cst:
7578; RV32IA:       # %bb.0:
7579; RV32IA-NEXT:    andi a2, a0, -4
7580; RV32IA-NEXT:    slli a0, a0, 3
7581; RV32IA-NEXT:    li a3, 255
7582; RV32IA-NEXT:    slli a1, a1, 24
7583; RV32IA-NEXT:    andi a4, a0, 24
7584; RV32IA-NEXT:    sll a3, a3, a0
7585; RV32IA-NEXT:    srai a1, a1, 24
7586; RV32IA-NEXT:    sll a1, a1, a0
7587; RV32IA-NEXT:    xori a4, a4, 24
7588; RV32IA-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
7589; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
7590; RV32IA-NEXT:    and a7, a5, a3
7591; RV32IA-NEXT:    mv a6, a5
7592; RV32IA-NEXT:    sll a7, a7, a4
7593; RV32IA-NEXT:    sra a7, a7, a4
7594; RV32IA-NEXT:    bge a1, a7, .LBB54_3
7595; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
7596; RV32IA-NEXT:    xor a6, a5, a1
7597; RV32IA-NEXT:    and a6, a6, a3
7598; RV32IA-NEXT:    xor a6, a5, a6
7599; RV32IA-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
7600; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
7601; RV32IA-NEXT:    bnez a6, .LBB54_1
7602; RV32IA-NEXT:  # %bb.4:
7603; RV32IA-NEXT:    srl a0, a5, a0
7604; RV32IA-NEXT:    ret
7605;
7606; RV64I-LABEL: atomicrmw_min_i8_seq_cst:
7607; RV64I:       # %bb.0:
7608; RV64I-NEXT:    addi sp, sp, -48
7609; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7610; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7611; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7612; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7613; RV64I-NEXT:    mv s0, a0
7614; RV64I-NEXT:    lbu a3, 0(a0)
7615; RV64I-NEXT:    mv s1, a1
7616; RV64I-NEXT:    slli a0, a1, 56
7617; RV64I-NEXT:    srai s2, a0, 56
7618; RV64I-NEXT:    j .LBB54_2
7619; RV64I-NEXT:  .LBB54_1: # %atomicrmw.start
7620; RV64I-NEXT:    # in Loop: Header=BB54_2 Depth=1
7621; RV64I-NEXT:    sb a3, 15(sp)
7622; RV64I-NEXT:    addi a1, sp, 15
7623; RV64I-NEXT:    li a3, 5
7624; RV64I-NEXT:    li a4, 5
7625; RV64I-NEXT:    mv a0, s0
7626; RV64I-NEXT:    call __atomic_compare_exchange_1
7627; RV64I-NEXT:    lbu a3, 15(sp)
7628; RV64I-NEXT:    bnez a0, .LBB54_4
7629; RV64I-NEXT:  .LBB54_2: # %atomicrmw.start
7630; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7631; RV64I-NEXT:    slli a0, a3, 56
7632; RV64I-NEXT:    srai a0, a0, 56
7633; RV64I-NEXT:    mv a2, a3
7634; RV64I-NEXT:    bge s2, a0, .LBB54_1
7635; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7636; RV64I-NEXT:    # in Loop: Header=BB54_2 Depth=1
7637; RV64I-NEXT:    mv a2, s1
7638; RV64I-NEXT:    j .LBB54_1
7639; RV64I-NEXT:  .LBB54_4: # %atomicrmw.end
7640; RV64I-NEXT:    mv a0, a3
7641; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7642; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7643; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7644; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7645; RV64I-NEXT:    addi sp, sp, 48
7646; RV64I-NEXT:    ret
7647;
7648; RV64IA-NOZACAS-LABEL: atomicrmw_min_i8_seq_cst:
7649; RV64IA-NOZACAS:       # %bb.0:
7650; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
7651; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
7652; RV64IA-NOZACAS-NEXT:    li a3, 255
7653; RV64IA-NOZACAS-NEXT:    slli a1, a1, 56
7654; RV64IA-NOZACAS-NEXT:    andi a4, a0, 24
7655; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
7656; RV64IA-NOZACAS-NEXT:    srai a1, a1, 56
7657; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
7658; RV64IA-NOZACAS-NEXT:    xori a4, a4, 56
7659; RV64IA-NOZACAS-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
7660; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a5, (a2)
7661; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
7662; RV64IA-NOZACAS-NEXT:    mv a6, a5
7663; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
7664; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
7665; RV64IA-NOZACAS-NEXT:    bge a1, a7, .LBB54_3
7666; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
7667; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
7668; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
7669; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
7670; RV64IA-NOZACAS-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
7671; RV64IA-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
7672; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB54_1
7673; RV64IA-NOZACAS-NEXT:  # %bb.4:
7674; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
7675; RV64IA-NOZACAS-NEXT:    ret
7676;
7677; RV64IA-ZACAS-LABEL: atomicrmw_min_i8_seq_cst:
7678; RV64IA-ZACAS:       # %bb.0:
7679; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
7680; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
7681; RV64IA-ZACAS-NEXT:    li a3, 255
7682; RV64IA-ZACAS-NEXT:    slli a1, a1, 56
7683; RV64IA-ZACAS-NEXT:    andi a4, a0, 24
7684; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
7685; RV64IA-ZACAS-NEXT:    srai a1, a1, 56
7686; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
7687; RV64IA-ZACAS-NEXT:    xori a4, a4, 56
7688; RV64IA-ZACAS-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
7689; RV64IA-ZACAS-NEXT:    lr.w.aqrl a5, (a2)
7690; RV64IA-ZACAS-NEXT:    and a7, a5, a3
7691; RV64IA-ZACAS-NEXT:    mv a6, a5
7692; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
7693; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
7694; RV64IA-ZACAS-NEXT:    bge a1, a7, .LBB54_3
7695; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
7696; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
7697; RV64IA-ZACAS-NEXT:    and a6, a6, a3
7698; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
7699; RV64IA-ZACAS-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
7700; RV64IA-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
7701; RV64IA-ZACAS-NEXT:    bnez a6, .LBB54_1
7702; RV64IA-ZACAS-NEXT:  # %bb.4:
7703; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
7704; RV64IA-ZACAS-NEXT:    ret
7705;
7706; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_seq_cst:
7707; RV64IA-WMO-ZABHA:       # %bb.0:
7708; RV64IA-WMO-ZABHA-NEXT:    amomin.b.aqrl a0, a1, (a0)
7709; RV64IA-WMO-ZABHA-NEXT:    ret
7710;
7711; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_seq_cst:
7712; RV64IA-TSO-ZABHA:       # %bb.0:
7713; RV64IA-TSO-ZABHA-NEXT:    amomin.b a0, a1, (a0)
7714; RV64IA-TSO-ZABHA-NEXT:    ret
7715  %1 = atomicrmw min ptr %a, i8 %b seq_cst
7716  ret i8 %1
7717}
7718
7719define i8 @atomicrmw_umax_i8_monotonic(ptr %a, i8 %b) nounwind {
7720; RV32I-LABEL: atomicrmw_umax_i8_monotonic:
7721; RV32I:       # %bb.0:
7722; RV32I-NEXT:    addi sp, sp, -32
7723; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7724; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7725; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7726; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7727; RV32I-NEXT:    mv s0, a0
7728; RV32I-NEXT:    lbu a3, 0(a0)
7729; RV32I-NEXT:    mv s1, a1
7730; RV32I-NEXT:    andi s2, a1, 255
7731; RV32I-NEXT:    j .LBB55_2
7732; RV32I-NEXT:  .LBB55_1: # %atomicrmw.start
7733; RV32I-NEXT:    # in Loop: Header=BB55_2 Depth=1
7734; RV32I-NEXT:    sb a3, 15(sp)
7735; RV32I-NEXT:    addi a1, sp, 15
7736; RV32I-NEXT:    mv a0, s0
7737; RV32I-NEXT:    li a3, 0
7738; RV32I-NEXT:    li a4, 0
7739; RV32I-NEXT:    call __atomic_compare_exchange_1
7740; RV32I-NEXT:    lbu a3, 15(sp)
7741; RV32I-NEXT:    bnez a0, .LBB55_4
7742; RV32I-NEXT:  .LBB55_2: # %atomicrmw.start
7743; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7744; RV32I-NEXT:    andi a0, a3, 255
7745; RV32I-NEXT:    mv a2, a3
7746; RV32I-NEXT:    bltu s2, a0, .LBB55_1
7747; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7748; RV32I-NEXT:    # in Loop: Header=BB55_2 Depth=1
7749; RV32I-NEXT:    mv a2, s1
7750; RV32I-NEXT:    j .LBB55_1
7751; RV32I-NEXT:  .LBB55_4: # %atomicrmw.end
7752; RV32I-NEXT:    mv a0, a3
7753; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7754; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7755; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7756; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7757; RV32I-NEXT:    addi sp, sp, 32
7758; RV32I-NEXT:    ret
7759;
7760; RV32IA-LABEL: atomicrmw_umax_i8_monotonic:
7761; RV32IA:       # %bb.0:
7762; RV32IA-NEXT:    andi a2, a0, -4
7763; RV32IA-NEXT:    slli a0, a0, 3
7764; RV32IA-NEXT:    li a3, 255
7765; RV32IA-NEXT:    andi a1, a1, 255
7766; RV32IA-NEXT:    sll a3, a3, a0
7767; RV32IA-NEXT:    sll a1, a1, a0
7768; RV32IA-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
7769; RV32IA-NEXT:    lr.w a4, (a2)
7770; RV32IA-NEXT:    and a6, a4, a3
7771; RV32IA-NEXT:    mv a5, a4
7772; RV32IA-NEXT:    bgeu a6, a1, .LBB55_3
7773; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB55_1 Depth=1
7774; RV32IA-NEXT:    xor a5, a4, a1
7775; RV32IA-NEXT:    and a5, a5, a3
7776; RV32IA-NEXT:    xor a5, a4, a5
7777; RV32IA-NEXT:  .LBB55_3: # in Loop: Header=BB55_1 Depth=1
7778; RV32IA-NEXT:    sc.w a5, a5, (a2)
7779; RV32IA-NEXT:    bnez a5, .LBB55_1
7780; RV32IA-NEXT:  # %bb.4:
7781; RV32IA-NEXT:    srl a0, a4, a0
7782; RV32IA-NEXT:    ret
7783;
7784; RV64I-LABEL: atomicrmw_umax_i8_monotonic:
7785; RV64I:       # %bb.0:
7786; RV64I-NEXT:    addi sp, sp, -48
7787; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7788; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7789; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7790; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7791; RV64I-NEXT:    mv s0, a0
7792; RV64I-NEXT:    lbu a3, 0(a0)
7793; RV64I-NEXT:    mv s1, a1
7794; RV64I-NEXT:    andi s2, a1, 255
7795; RV64I-NEXT:    j .LBB55_2
7796; RV64I-NEXT:  .LBB55_1: # %atomicrmw.start
7797; RV64I-NEXT:    # in Loop: Header=BB55_2 Depth=1
7798; RV64I-NEXT:    sb a3, 15(sp)
7799; RV64I-NEXT:    addi a1, sp, 15
7800; RV64I-NEXT:    mv a0, s0
7801; RV64I-NEXT:    li a3, 0
7802; RV64I-NEXT:    li a4, 0
7803; RV64I-NEXT:    call __atomic_compare_exchange_1
7804; RV64I-NEXT:    lbu a3, 15(sp)
7805; RV64I-NEXT:    bnez a0, .LBB55_4
7806; RV64I-NEXT:  .LBB55_2: # %atomicrmw.start
7807; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7808; RV64I-NEXT:    andi a0, a3, 255
7809; RV64I-NEXT:    mv a2, a3
7810; RV64I-NEXT:    bltu s2, a0, .LBB55_1
7811; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
7812; RV64I-NEXT:    # in Loop: Header=BB55_2 Depth=1
7813; RV64I-NEXT:    mv a2, s1
7814; RV64I-NEXT:    j .LBB55_1
7815; RV64I-NEXT:  .LBB55_4: # %atomicrmw.end
7816; RV64I-NEXT:    mv a0, a3
7817; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
7818; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
7819; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
7820; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
7821; RV64I-NEXT:    addi sp, sp, 48
7822; RV64I-NEXT:    ret
7823;
7824; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i8_monotonic:
7825; RV64IA-NOZACAS:       # %bb.0:
7826; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
7827; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
7828; RV64IA-NOZACAS-NEXT:    li a3, 255
7829; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
7830; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
7831; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
7832; RV64IA-NOZACAS-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
7833; RV64IA-NOZACAS-NEXT:    lr.w a4, (a2)
7834; RV64IA-NOZACAS-NEXT:    and a6, a4, a3
7835; RV64IA-NOZACAS-NEXT:    mv a5, a4
7836; RV64IA-NOZACAS-NEXT:    bgeu a6, a1, .LBB55_3
7837; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB55_1 Depth=1
7838; RV64IA-NOZACAS-NEXT:    xor a5, a4, a1
7839; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
7840; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
7841; RV64IA-NOZACAS-NEXT:  .LBB55_3: # in Loop: Header=BB55_1 Depth=1
7842; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
7843; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB55_1
7844; RV64IA-NOZACAS-NEXT:  # %bb.4:
7845; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
7846; RV64IA-NOZACAS-NEXT:    ret
7847;
7848; RV64IA-ZACAS-LABEL: atomicrmw_umax_i8_monotonic:
7849; RV64IA-ZACAS:       # %bb.0:
7850; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
7851; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
7852; RV64IA-ZACAS-NEXT:    li a3, 255
7853; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
7854; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
7855; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
7856; RV64IA-ZACAS-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
7857; RV64IA-ZACAS-NEXT:    lr.w a4, (a2)
7858; RV64IA-ZACAS-NEXT:    and a6, a4, a3
7859; RV64IA-ZACAS-NEXT:    mv a5, a4
7860; RV64IA-ZACAS-NEXT:    bgeu a6, a1, .LBB55_3
7861; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB55_1 Depth=1
7862; RV64IA-ZACAS-NEXT:    xor a5, a4, a1
7863; RV64IA-ZACAS-NEXT:    and a5, a5, a3
7864; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
7865; RV64IA-ZACAS-NEXT:  .LBB55_3: # in Loop: Header=BB55_1 Depth=1
7866; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
7867; RV64IA-ZACAS-NEXT:    bnez a5, .LBB55_1
7868; RV64IA-ZACAS-NEXT:  # %bb.4:
7869; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
7870; RV64IA-ZACAS-NEXT:    ret
7871;
7872; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_monotonic:
7873; RV64IA-WMO-ZABHA:       # %bb.0:
7874; RV64IA-WMO-ZABHA-NEXT:    amomaxu.b a0, a1, (a0)
7875; RV64IA-WMO-ZABHA-NEXT:    ret
7876;
7877; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_monotonic:
7878; RV64IA-TSO-ZABHA:       # %bb.0:
7879; RV64IA-TSO-ZABHA-NEXT:    amomaxu.b a0, a1, (a0)
7880; RV64IA-TSO-ZABHA-NEXT:    ret
7881  %1 = atomicrmw umax ptr %a, i8 %b monotonic
7882  ret i8 %1
7883}
7884
7885define i8 @atomicrmw_umax_i8_acquire(ptr %a, i8 %b) nounwind {
7886; RV32I-LABEL: atomicrmw_umax_i8_acquire:
7887; RV32I:       # %bb.0:
7888; RV32I-NEXT:    addi sp, sp, -32
7889; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
7890; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
7891; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
7892; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
7893; RV32I-NEXT:    mv s0, a0
7894; RV32I-NEXT:    lbu a3, 0(a0)
7895; RV32I-NEXT:    mv s1, a1
7896; RV32I-NEXT:    andi s2, a1, 255
7897; RV32I-NEXT:    j .LBB56_2
7898; RV32I-NEXT:  .LBB56_1: # %atomicrmw.start
7899; RV32I-NEXT:    # in Loop: Header=BB56_2 Depth=1
7900; RV32I-NEXT:    sb a3, 15(sp)
7901; RV32I-NEXT:    addi a1, sp, 15
7902; RV32I-NEXT:    li a3, 2
7903; RV32I-NEXT:    li a4, 2
7904; RV32I-NEXT:    mv a0, s0
7905; RV32I-NEXT:    call __atomic_compare_exchange_1
7906; RV32I-NEXT:    lbu a3, 15(sp)
7907; RV32I-NEXT:    bnez a0, .LBB56_4
7908; RV32I-NEXT:  .LBB56_2: # %atomicrmw.start
7909; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
7910; RV32I-NEXT:    andi a0, a3, 255
7911; RV32I-NEXT:    mv a2, a3
7912; RV32I-NEXT:    bltu s2, a0, .LBB56_1
7913; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
7914; RV32I-NEXT:    # in Loop: Header=BB56_2 Depth=1
7915; RV32I-NEXT:    mv a2, s1
7916; RV32I-NEXT:    j .LBB56_1
7917; RV32I-NEXT:  .LBB56_4: # %atomicrmw.end
7918; RV32I-NEXT:    mv a0, a3
7919; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
7920; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
7921; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
7922; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
7923; RV32I-NEXT:    addi sp, sp, 32
7924; RV32I-NEXT:    ret
7925;
7926; RV32IA-WMO-LABEL: atomicrmw_umax_i8_acquire:
7927; RV32IA-WMO:       # %bb.0:
7928; RV32IA-WMO-NEXT:    andi a2, a0, -4
7929; RV32IA-WMO-NEXT:    slli a0, a0, 3
7930; RV32IA-WMO-NEXT:    li a3, 255
7931; RV32IA-WMO-NEXT:    andi a1, a1, 255
7932; RV32IA-WMO-NEXT:    sll a3, a3, a0
7933; RV32IA-WMO-NEXT:    sll a1, a1, a0
7934; RV32IA-WMO-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
7935; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
7936; RV32IA-WMO-NEXT:    and a6, a4, a3
7937; RV32IA-WMO-NEXT:    mv a5, a4
7938; RV32IA-WMO-NEXT:    bgeu a6, a1, .LBB56_3
7939; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB56_1 Depth=1
7940; RV32IA-WMO-NEXT:    xor a5, a4, a1
7941; RV32IA-WMO-NEXT:    and a5, a5, a3
7942; RV32IA-WMO-NEXT:    xor a5, a4, a5
7943; RV32IA-WMO-NEXT:  .LBB56_3: # in Loop: Header=BB56_1 Depth=1
7944; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
7945; RV32IA-WMO-NEXT:    bnez a5, .LBB56_1
7946; RV32IA-WMO-NEXT:  # %bb.4:
7947; RV32IA-WMO-NEXT:    srl a0, a4, a0
7948; RV32IA-WMO-NEXT:    ret
7949;
7950; RV32IA-TSO-LABEL: atomicrmw_umax_i8_acquire:
7951; RV32IA-TSO:       # %bb.0:
7952; RV32IA-TSO-NEXT:    andi a2, a0, -4
7953; RV32IA-TSO-NEXT:    slli a0, a0, 3
7954; RV32IA-TSO-NEXT:    li a3, 255
7955; RV32IA-TSO-NEXT:    andi a1, a1, 255
7956; RV32IA-TSO-NEXT:    sll a3, a3, a0
7957; RV32IA-TSO-NEXT:    sll a1, a1, a0
7958; RV32IA-TSO-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
7959; RV32IA-TSO-NEXT:    lr.w a4, (a2)
7960; RV32IA-TSO-NEXT:    and a6, a4, a3
7961; RV32IA-TSO-NEXT:    mv a5, a4
7962; RV32IA-TSO-NEXT:    bgeu a6, a1, .LBB56_3
7963; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB56_1 Depth=1
7964; RV32IA-TSO-NEXT:    xor a5, a4, a1
7965; RV32IA-TSO-NEXT:    and a5, a5, a3
7966; RV32IA-TSO-NEXT:    xor a5, a4, a5
7967; RV32IA-TSO-NEXT:  .LBB56_3: # in Loop: Header=BB56_1 Depth=1
7968; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
7969; RV32IA-TSO-NEXT:    bnez a5, .LBB56_1
7970; RV32IA-TSO-NEXT:  # %bb.4:
7971; RV32IA-TSO-NEXT:    srl a0, a4, a0
7972; RV32IA-TSO-NEXT:    ret
7973;
7974; RV64I-LABEL: atomicrmw_umax_i8_acquire:
7975; RV64I:       # %bb.0:
7976; RV64I-NEXT:    addi sp, sp, -48
7977; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
7978; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
7979; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
7980; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
7981; RV64I-NEXT:    mv s0, a0
7982; RV64I-NEXT:    lbu a3, 0(a0)
7983; RV64I-NEXT:    mv s1, a1
7984; RV64I-NEXT:    andi s2, a1, 255
7985; RV64I-NEXT:    j .LBB56_2
7986; RV64I-NEXT:  .LBB56_1: # %atomicrmw.start
7987; RV64I-NEXT:    # in Loop: Header=BB56_2 Depth=1
7988; RV64I-NEXT:    sb a3, 15(sp)
7989; RV64I-NEXT:    addi a1, sp, 15
7990; RV64I-NEXT:    li a3, 2
7991; RV64I-NEXT:    li a4, 2
7992; RV64I-NEXT:    mv a0, s0
7993; RV64I-NEXT:    call __atomic_compare_exchange_1
7994; RV64I-NEXT:    lbu a3, 15(sp)
7995; RV64I-NEXT:    bnez a0, .LBB56_4
7996; RV64I-NEXT:  .LBB56_2: # %atomicrmw.start
7997; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
7998; RV64I-NEXT:    andi a0, a3, 255
7999; RV64I-NEXT:    mv a2, a3
8000; RV64I-NEXT:    bltu s2, a0, .LBB56_1
8001; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8002; RV64I-NEXT:    # in Loop: Header=BB56_2 Depth=1
8003; RV64I-NEXT:    mv a2, s1
8004; RV64I-NEXT:    j .LBB56_1
8005; RV64I-NEXT:  .LBB56_4: # %atomicrmw.end
8006; RV64I-NEXT:    mv a0, a3
8007; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8008; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8009; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8010; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8011; RV64I-NEXT:    addi sp, sp, 48
8012; RV64I-NEXT:    ret
8013;
8014; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_acquire:
8015; RV64IA-WMO-NOZACAS:       # %bb.0:
8016; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
8017; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
8018; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
8019; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
8020; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
8021; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
8022; RV64IA-WMO-NOZACAS-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
8023; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
8024; RV64IA-WMO-NOZACAS-NEXT:    and a6, a4, a3
8025; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a4
8026; RV64IA-WMO-NOZACAS-NEXT:    bgeu a6, a1, .LBB56_3
8027; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB56_1 Depth=1
8028; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a1
8029; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
8030; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
8031; RV64IA-WMO-NOZACAS-NEXT:  .LBB56_3: # in Loop: Header=BB56_1 Depth=1
8032; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
8033; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB56_1
8034; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
8035; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
8036; RV64IA-WMO-NOZACAS-NEXT:    ret
8037;
8038; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_acquire:
8039; RV64IA-TSO-NOZACAS:       # %bb.0:
8040; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
8041; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
8042; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
8043; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
8044; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
8045; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
8046; RV64IA-TSO-NOZACAS-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
8047; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
8048; RV64IA-TSO-NOZACAS-NEXT:    and a6, a4, a3
8049; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a4
8050; RV64IA-TSO-NOZACAS-NEXT:    bgeu a6, a1, .LBB56_3
8051; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB56_1 Depth=1
8052; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a1
8053; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
8054; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
8055; RV64IA-TSO-NOZACAS-NEXT:  .LBB56_3: # in Loop: Header=BB56_1 Depth=1
8056; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
8057; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB56_1
8058; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
8059; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
8060; RV64IA-TSO-NOZACAS-NEXT:    ret
8061;
8062; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_acquire:
8063; RV64IA-WMO-ZACAS:       # %bb.0:
8064; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
8065; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
8066; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
8067; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
8068; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
8069; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
8070; RV64IA-WMO-ZACAS-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
8071; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
8072; RV64IA-WMO-ZACAS-NEXT:    and a6, a4, a3
8073; RV64IA-WMO-ZACAS-NEXT:    mv a5, a4
8074; RV64IA-WMO-ZACAS-NEXT:    bgeu a6, a1, .LBB56_3
8075; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB56_1 Depth=1
8076; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a1
8077; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
8078; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
8079; RV64IA-WMO-ZACAS-NEXT:  .LBB56_3: # in Loop: Header=BB56_1 Depth=1
8080; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
8081; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB56_1
8082; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
8083; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
8084; RV64IA-WMO-ZACAS-NEXT:    ret
8085;
8086; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_acquire:
8087; RV64IA-TSO-ZACAS:       # %bb.0:
8088; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
8089; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
8090; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
8091; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
8092; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
8093; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
8094; RV64IA-TSO-ZACAS-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
8095; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
8096; RV64IA-TSO-ZACAS-NEXT:    and a6, a4, a3
8097; RV64IA-TSO-ZACAS-NEXT:    mv a5, a4
8098; RV64IA-TSO-ZACAS-NEXT:    bgeu a6, a1, .LBB56_3
8099; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB56_1 Depth=1
8100; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a1
8101; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
8102; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
8103; RV64IA-TSO-ZACAS-NEXT:  .LBB56_3: # in Loop: Header=BB56_1 Depth=1
8104; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
8105; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB56_1
8106; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
8107; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
8108; RV64IA-TSO-ZACAS-NEXT:    ret
8109;
8110; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_acquire:
8111; RV64IA-WMO-ZABHA:       # %bb.0:
8112; RV64IA-WMO-ZABHA-NEXT:    amomaxu.b.aq a0, a1, (a0)
8113; RV64IA-WMO-ZABHA-NEXT:    ret
8114;
8115; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_acquire:
8116; RV64IA-TSO-ZABHA:       # %bb.0:
8117; RV64IA-TSO-ZABHA-NEXT:    amomaxu.b a0, a1, (a0)
8118; RV64IA-TSO-ZABHA-NEXT:    ret
8119  %1 = atomicrmw umax ptr %a, i8 %b acquire
8120  ret i8 %1
8121}
8122
8123define i8 @atomicrmw_umax_i8_release(ptr %a, i8 %b) nounwind {
8124; RV32I-LABEL: atomicrmw_umax_i8_release:
8125; RV32I:       # %bb.0:
8126; RV32I-NEXT:    addi sp, sp, -32
8127; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8128; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8129; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8130; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8131; RV32I-NEXT:    mv s0, a0
8132; RV32I-NEXT:    lbu a3, 0(a0)
8133; RV32I-NEXT:    mv s1, a1
8134; RV32I-NEXT:    andi s2, a1, 255
8135; RV32I-NEXT:    j .LBB57_2
8136; RV32I-NEXT:  .LBB57_1: # %atomicrmw.start
8137; RV32I-NEXT:    # in Loop: Header=BB57_2 Depth=1
8138; RV32I-NEXT:    sb a3, 15(sp)
8139; RV32I-NEXT:    addi a1, sp, 15
8140; RV32I-NEXT:    li a3, 3
8141; RV32I-NEXT:    mv a0, s0
8142; RV32I-NEXT:    li a4, 0
8143; RV32I-NEXT:    call __atomic_compare_exchange_1
8144; RV32I-NEXT:    lbu a3, 15(sp)
8145; RV32I-NEXT:    bnez a0, .LBB57_4
8146; RV32I-NEXT:  .LBB57_2: # %atomicrmw.start
8147; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8148; RV32I-NEXT:    andi a0, a3, 255
8149; RV32I-NEXT:    mv a2, a3
8150; RV32I-NEXT:    bltu s2, a0, .LBB57_1
8151; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8152; RV32I-NEXT:    # in Loop: Header=BB57_2 Depth=1
8153; RV32I-NEXT:    mv a2, s1
8154; RV32I-NEXT:    j .LBB57_1
8155; RV32I-NEXT:  .LBB57_4: # %atomicrmw.end
8156; RV32I-NEXT:    mv a0, a3
8157; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8158; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8159; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8160; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8161; RV32I-NEXT:    addi sp, sp, 32
8162; RV32I-NEXT:    ret
8163;
8164; RV32IA-WMO-LABEL: atomicrmw_umax_i8_release:
8165; RV32IA-WMO:       # %bb.0:
8166; RV32IA-WMO-NEXT:    andi a2, a0, -4
8167; RV32IA-WMO-NEXT:    slli a0, a0, 3
8168; RV32IA-WMO-NEXT:    li a3, 255
8169; RV32IA-WMO-NEXT:    andi a1, a1, 255
8170; RV32IA-WMO-NEXT:    sll a3, a3, a0
8171; RV32IA-WMO-NEXT:    sll a1, a1, a0
8172; RV32IA-WMO-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
8173; RV32IA-WMO-NEXT:    lr.w a4, (a2)
8174; RV32IA-WMO-NEXT:    and a6, a4, a3
8175; RV32IA-WMO-NEXT:    mv a5, a4
8176; RV32IA-WMO-NEXT:    bgeu a6, a1, .LBB57_3
8177; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB57_1 Depth=1
8178; RV32IA-WMO-NEXT:    xor a5, a4, a1
8179; RV32IA-WMO-NEXT:    and a5, a5, a3
8180; RV32IA-WMO-NEXT:    xor a5, a4, a5
8181; RV32IA-WMO-NEXT:  .LBB57_3: # in Loop: Header=BB57_1 Depth=1
8182; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
8183; RV32IA-WMO-NEXT:    bnez a5, .LBB57_1
8184; RV32IA-WMO-NEXT:  # %bb.4:
8185; RV32IA-WMO-NEXT:    srl a0, a4, a0
8186; RV32IA-WMO-NEXT:    ret
8187;
8188; RV32IA-TSO-LABEL: atomicrmw_umax_i8_release:
8189; RV32IA-TSO:       # %bb.0:
8190; RV32IA-TSO-NEXT:    andi a2, a0, -4
8191; RV32IA-TSO-NEXT:    slli a0, a0, 3
8192; RV32IA-TSO-NEXT:    li a3, 255
8193; RV32IA-TSO-NEXT:    andi a1, a1, 255
8194; RV32IA-TSO-NEXT:    sll a3, a3, a0
8195; RV32IA-TSO-NEXT:    sll a1, a1, a0
8196; RV32IA-TSO-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
8197; RV32IA-TSO-NEXT:    lr.w a4, (a2)
8198; RV32IA-TSO-NEXT:    and a6, a4, a3
8199; RV32IA-TSO-NEXT:    mv a5, a4
8200; RV32IA-TSO-NEXT:    bgeu a6, a1, .LBB57_3
8201; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB57_1 Depth=1
8202; RV32IA-TSO-NEXT:    xor a5, a4, a1
8203; RV32IA-TSO-NEXT:    and a5, a5, a3
8204; RV32IA-TSO-NEXT:    xor a5, a4, a5
8205; RV32IA-TSO-NEXT:  .LBB57_3: # in Loop: Header=BB57_1 Depth=1
8206; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
8207; RV32IA-TSO-NEXT:    bnez a5, .LBB57_1
8208; RV32IA-TSO-NEXT:  # %bb.4:
8209; RV32IA-TSO-NEXT:    srl a0, a4, a0
8210; RV32IA-TSO-NEXT:    ret
8211;
8212; RV64I-LABEL: atomicrmw_umax_i8_release:
8213; RV64I:       # %bb.0:
8214; RV64I-NEXT:    addi sp, sp, -48
8215; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8216; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8217; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8218; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8219; RV64I-NEXT:    mv s0, a0
8220; RV64I-NEXT:    lbu a3, 0(a0)
8221; RV64I-NEXT:    mv s1, a1
8222; RV64I-NEXT:    andi s2, a1, 255
8223; RV64I-NEXT:    j .LBB57_2
8224; RV64I-NEXT:  .LBB57_1: # %atomicrmw.start
8225; RV64I-NEXT:    # in Loop: Header=BB57_2 Depth=1
8226; RV64I-NEXT:    sb a3, 15(sp)
8227; RV64I-NEXT:    addi a1, sp, 15
8228; RV64I-NEXT:    li a3, 3
8229; RV64I-NEXT:    mv a0, s0
8230; RV64I-NEXT:    li a4, 0
8231; RV64I-NEXT:    call __atomic_compare_exchange_1
8232; RV64I-NEXT:    lbu a3, 15(sp)
8233; RV64I-NEXT:    bnez a0, .LBB57_4
8234; RV64I-NEXT:  .LBB57_2: # %atomicrmw.start
8235; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8236; RV64I-NEXT:    andi a0, a3, 255
8237; RV64I-NEXT:    mv a2, a3
8238; RV64I-NEXT:    bltu s2, a0, .LBB57_1
8239; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8240; RV64I-NEXT:    # in Loop: Header=BB57_2 Depth=1
8241; RV64I-NEXT:    mv a2, s1
8242; RV64I-NEXT:    j .LBB57_1
8243; RV64I-NEXT:  .LBB57_4: # %atomicrmw.end
8244; RV64I-NEXT:    mv a0, a3
8245; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8246; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8247; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8248; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8249; RV64I-NEXT:    addi sp, sp, 48
8250; RV64I-NEXT:    ret
8251;
8252; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_release:
8253; RV64IA-WMO-NOZACAS:       # %bb.0:
8254; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
8255; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
8256; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
8257; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
8258; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
8259; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
8260; RV64IA-WMO-NOZACAS-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
8261; RV64IA-WMO-NOZACAS-NEXT:    lr.w a4, (a2)
8262; RV64IA-WMO-NOZACAS-NEXT:    and a6, a4, a3
8263; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a4
8264; RV64IA-WMO-NOZACAS-NEXT:    bgeu a6, a1, .LBB57_3
8265; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB57_1 Depth=1
8266; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a1
8267; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
8268; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
8269; RV64IA-WMO-NOZACAS-NEXT:  .LBB57_3: # in Loop: Header=BB57_1 Depth=1
8270; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
8271; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB57_1
8272; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
8273; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
8274; RV64IA-WMO-NOZACAS-NEXT:    ret
8275;
8276; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_release:
8277; RV64IA-TSO-NOZACAS:       # %bb.0:
8278; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
8279; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
8280; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
8281; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
8282; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
8283; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
8284; RV64IA-TSO-NOZACAS-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
8285; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
8286; RV64IA-TSO-NOZACAS-NEXT:    and a6, a4, a3
8287; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a4
8288; RV64IA-TSO-NOZACAS-NEXT:    bgeu a6, a1, .LBB57_3
8289; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB57_1 Depth=1
8290; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a1
8291; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
8292; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
8293; RV64IA-TSO-NOZACAS-NEXT:  .LBB57_3: # in Loop: Header=BB57_1 Depth=1
8294; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
8295; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB57_1
8296; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
8297; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
8298; RV64IA-TSO-NOZACAS-NEXT:    ret
8299;
8300; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_release:
8301; RV64IA-WMO-ZACAS:       # %bb.0:
8302; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
8303; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
8304; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
8305; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
8306; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
8307; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
8308; RV64IA-WMO-ZACAS-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
8309; RV64IA-WMO-ZACAS-NEXT:    lr.w a4, (a2)
8310; RV64IA-WMO-ZACAS-NEXT:    and a6, a4, a3
8311; RV64IA-WMO-ZACAS-NEXT:    mv a5, a4
8312; RV64IA-WMO-ZACAS-NEXT:    bgeu a6, a1, .LBB57_3
8313; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB57_1 Depth=1
8314; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a1
8315; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
8316; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
8317; RV64IA-WMO-ZACAS-NEXT:  .LBB57_3: # in Loop: Header=BB57_1 Depth=1
8318; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
8319; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB57_1
8320; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
8321; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
8322; RV64IA-WMO-ZACAS-NEXT:    ret
8323;
8324; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_release:
8325; RV64IA-TSO-ZACAS:       # %bb.0:
8326; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
8327; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
8328; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
8329; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
8330; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
8331; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
8332; RV64IA-TSO-ZACAS-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
8333; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
8334; RV64IA-TSO-ZACAS-NEXT:    and a6, a4, a3
8335; RV64IA-TSO-ZACAS-NEXT:    mv a5, a4
8336; RV64IA-TSO-ZACAS-NEXT:    bgeu a6, a1, .LBB57_3
8337; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB57_1 Depth=1
8338; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a1
8339; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
8340; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
8341; RV64IA-TSO-ZACAS-NEXT:  .LBB57_3: # in Loop: Header=BB57_1 Depth=1
8342; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
8343; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB57_1
8344; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
8345; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
8346; RV64IA-TSO-ZACAS-NEXT:    ret
8347;
8348; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_release:
8349; RV64IA-WMO-ZABHA:       # %bb.0:
8350; RV64IA-WMO-ZABHA-NEXT:    amomaxu.b.rl a0, a1, (a0)
8351; RV64IA-WMO-ZABHA-NEXT:    ret
8352;
8353; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_release:
8354; RV64IA-TSO-ZABHA:       # %bb.0:
8355; RV64IA-TSO-ZABHA-NEXT:    amomaxu.b a0, a1, (a0)
8356; RV64IA-TSO-ZABHA-NEXT:    ret
8357  %1 = atomicrmw umax ptr %a, i8 %b release
8358  ret i8 %1
8359}
8360
8361define i8 @atomicrmw_umax_i8_acq_rel(ptr %a, i8 %b) nounwind {
8362; RV32I-LABEL: atomicrmw_umax_i8_acq_rel:
8363; RV32I:       # %bb.0:
8364; RV32I-NEXT:    addi sp, sp, -32
8365; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8366; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8367; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8368; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8369; RV32I-NEXT:    mv s0, a0
8370; RV32I-NEXT:    lbu a3, 0(a0)
8371; RV32I-NEXT:    mv s1, a1
8372; RV32I-NEXT:    andi s2, a1, 255
8373; RV32I-NEXT:    j .LBB58_2
8374; RV32I-NEXT:  .LBB58_1: # %atomicrmw.start
8375; RV32I-NEXT:    # in Loop: Header=BB58_2 Depth=1
8376; RV32I-NEXT:    sb a3, 15(sp)
8377; RV32I-NEXT:    addi a1, sp, 15
8378; RV32I-NEXT:    li a3, 4
8379; RV32I-NEXT:    li a4, 2
8380; RV32I-NEXT:    mv a0, s0
8381; RV32I-NEXT:    call __atomic_compare_exchange_1
8382; RV32I-NEXT:    lbu a3, 15(sp)
8383; RV32I-NEXT:    bnez a0, .LBB58_4
8384; RV32I-NEXT:  .LBB58_2: # %atomicrmw.start
8385; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8386; RV32I-NEXT:    andi a0, a3, 255
8387; RV32I-NEXT:    mv a2, a3
8388; RV32I-NEXT:    bltu s2, a0, .LBB58_1
8389; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8390; RV32I-NEXT:    # in Loop: Header=BB58_2 Depth=1
8391; RV32I-NEXT:    mv a2, s1
8392; RV32I-NEXT:    j .LBB58_1
8393; RV32I-NEXT:  .LBB58_4: # %atomicrmw.end
8394; RV32I-NEXT:    mv a0, a3
8395; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8396; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8397; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8398; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8399; RV32I-NEXT:    addi sp, sp, 32
8400; RV32I-NEXT:    ret
8401;
8402; RV32IA-WMO-LABEL: atomicrmw_umax_i8_acq_rel:
8403; RV32IA-WMO:       # %bb.0:
8404; RV32IA-WMO-NEXT:    andi a2, a0, -4
8405; RV32IA-WMO-NEXT:    slli a0, a0, 3
8406; RV32IA-WMO-NEXT:    li a3, 255
8407; RV32IA-WMO-NEXT:    andi a1, a1, 255
8408; RV32IA-WMO-NEXT:    sll a3, a3, a0
8409; RV32IA-WMO-NEXT:    sll a1, a1, a0
8410; RV32IA-WMO-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
8411; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
8412; RV32IA-WMO-NEXT:    and a6, a4, a3
8413; RV32IA-WMO-NEXT:    mv a5, a4
8414; RV32IA-WMO-NEXT:    bgeu a6, a1, .LBB58_3
8415; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB58_1 Depth=1
8416; RV32IA-WMO-NEXT:    xor a5, a4, a1
8417; RV32IA-WMO-NEXT:    and a5, a5, a3
8418; RV32IA-WMO-NEXT:    xor a5, a4, a5
8419; RV32IA-WMO-NEXT:  .LBB58_3: # in Loop: Header=BB58_1 Depth=1
8420; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
8421; RV32IA-WMO-NEXT:    bnez a5, .LBB58_1
8422; RV32IA-WMO-NEXT:  # %bb.4:
8423; RV32IA-WMO-NEXT:    srl a0, a4, a0
8424; RV32IA-WMO-NEXT:    ret
8425;
8426; RV32IA-TSO-LABEL: atomicrmw_umax_i8_acq_rel:
8427; RV32IA-TSO:       # %bb.0:
8428; RV32IA-TSO-NEXT:    andi a2, a0, -4
8429; RV32IA-TSO-NEXT:    slli a0, a0, 3
8430; RV32IA-TSO-NEXT:    li a3, 255
8431; RV32IA-TSO-NEXT:    andi a1, a1, 255
8432; RV32IA-TSO-NEXT:    sll a3, a3, a0
8433; RV32IA-TSO-NEXT:    sll a1, a1, a0
8434; RV32IA-TSO-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
8435; RV32IA-TSO-NEXT:    lr.w a4, (a2)
8436; RV32IA-TSO-NEXT:    and a6, a4, a3
8437; RV32IA-TSO-NEXT:    mv a5, a4
8438; RV32IA-TSO-NEXT:    bgeu a6, a1, .LBB58_3
8439; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB58_1 Depth=1
8440; RV32IA-TSO-NEXT:    xor a5, a4, a1
8441; RV32IA-TSO-NEXT:    and a5, a5, a3
8442; RV32IA-TSO-NEXT:    xor a5, a4, a5
8443; RV32IA-TSO-NEXT:  .LBB58_3: # in Loop: Header=BB58_1 Depth=1
8444; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
8445; RV32IA-TSO-NEXT:    bnez a5, .LBB58_1
8446; RV32IA-TSO-NEXT:  # %bb.4:
8447; RV32IA-TSO-NEXT:    srl a0, a4, a0
8448; RV32IA-TSO-NEXT:    ret
8449;
8450; RV64I-LABEL: atomicrmw_umax_i8_acq_rel:
8451; RV64I:       # %bb.0:
8452; RV64I-NEXT:    addi sp, sp, -48
8453; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8454; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8455; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8456; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8457; RV64I-NEXT:    mv s0, a0
8458; RV64I-NEXT:    lbu a3, 0(a0)
8459; RV64I-NEXT:    mv s1, a1
8460; RV64I-NEXT:    andi s2, a1, 255
8461; RV64I-NEXT:    j .LBB58_2
8462; RV64I-NEXT:  .LBB58_1: # %atomicrmw.start
8463; RV64I-NEXT:    # in Loop: Header=BB58_2 Depth=1
8464; RV64I-NEXT:    sb a3, 15(sp)
8465; RV64I-NEXT:    addi a1, sp, 15
8466; RV64I-NEXT:    li a3, 4
8467; RV64I-NEXT:    li a4, 2
8468; RV64I-NEXT:    mv a0, s0
8469; RV64I-NEXT:    call __atomic_compare_exchange_1
8470; RV64I-NEXT:    lbu a3, 15(sp)
8471; RV64I-NEXT:    bnez a0, .LBB58_4
8472; RV64I-NEXT:  .LBB58_2: # %atomicrmw.start
8473; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8474; RV64I-NEXT:    andi a0, a3, 255
8475; RV64I-NEXT:    mv a2, a3
8476; RV64I-NEXT:    bltu s2, a0, .LBB58_1
8477; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8478; RV64I-NEXT:    # in Loop: Header=BB58_2 Depth=1
8479; RV64I-NEXT:    mv a2, s1
8480; RV64I-NEXT:    j .LBB58_1
8481; RV64I-NEXT:  .LBB58_4: # %atomicrmw.end
8482; RV64I-NEXT:    mv a0, a3
8483; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8484; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8485; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8486; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8487; RV64I-NEXT:    addi sp, sp, 48
8488; RV64I-NEXT:    ret
8489;
8490; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
8491; RV64IA-WMO-NOZACAS:       # %bb.0:
8492; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
8493; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
8494; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
8495; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
8496; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
8497; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
8498; RV64IA-WMO-NOZACAS-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
8499; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
8500; RV64IA-WMO-NOZACAS-NEXT:    and a6, a4, a3
8501; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a4
8502; RV64IA-WMO-NOZACAS-NEXT:    bgeu a6, a1, .LBB58_3
8503; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB58_1 Depth=1
8504; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a1
8505; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
8506; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
8507; RV64IA-WMO-NOZACAS-NEXT:  .LBB58_3: # in Loop: Header=BB58_1 Depth=1
8508; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
8509; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB58_1
8510; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
8511; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
8512; RV64IA-WMO-NOZACAS-NEXT:    ret
8513;
8514; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
8515; RV64IA-TSO-NOZACAS:       # %bb.0:
8516; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
8517; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
8518; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
8519; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
8520; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
8521; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
8522; RV64IA-TSO-NOZACAS-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
8523; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
8524; RV64IA-TSO-NOZACAS-NEXT:    and a6, a4, a3
8525; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a4
8526; RV64IA-TSO-NOZACAS-NEXT:    bgeu a6, a1, .LBB58_3
8527; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB58_1 Depth=1
8528; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a1
8529; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
8530; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
8531; RV64IA-TSO-NOZACAS-NEXT:  .LBB58_3: # in Loop: Header=BB58_1 Depth=1
8532; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
8533; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB58_1
8534; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
8535; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
8536; RV64IA-TSO-NOZACAS-NEXT:    ret
8537;
8538; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
8539; RV64IA-WMO-ZACAS:       # %bb.0:
8540; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
8541; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
8542; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
8543; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
8544; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
8545; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
8546; RV64IA-WMO-ZACAS-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
8547; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
8548; RV64IA-WMO-ZACAS-NEXT:    and a6, a4, a3
8549; RV64IA-WMO-ZACAS-NEXT:    mv a5, a4
8550; RV64IA-WMO-ZACAS-NEXT:    bgeu a6, a1, .LBB58_3
8551; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB58_1 Depth=1
8552; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a1
8553; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
8554; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
8555; RV64IA-WMO-ZACAS-NEXT:  .LBB58_3: # in Loop: Header=BB58_1 Depth=1
8556; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
8557; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB58_1
8558; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
8559; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
8560; RV64IA-WMO-ZACAS-NEXT:    ret
8561;
8562; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
8563; RV64IA-TSO-ZACAS:       # %bb.0:
8564; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
8565; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
8566; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
8567; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
8568; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
8569; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
8570; RV64IA-TSO-ZACAS-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
8571; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
8572; RV64IA-TSO-ZACAS-NEXT:    and a6, a4, a3
8573; RV64IA-TSO-ZACAS-NEXT:    mv a5, a4
8574; RV64IA-TSO-ZACAS-NEXT:    bgeu a6, a1, .LBB58_3
8575; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB58_1 Depth=1
8576; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a1
8577; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
8578; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
8579; RV64IA-TSO-ZACAS-NEXT:  .LBB58_3: # in Loop: Header=BB58_1 Depth=1
8580; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
8581; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB58_1
8582; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
8583; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
8584; RV64IA-TSO-ZACAS-NEXT:    ret
8585;
8586; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_acq_rel:
8587; RV64IA-WMO-ZABHA:       # %bb.0:
8588; RV64IA-WMO-ZABHA-NEXT:    amomaxu.b.aqrl a0, a1, (a0)
8589; RV64IA-WMO-ZABHA-NEXT:    ret
8590;
8591; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_acq_rel:
8592; RV64IA-TSO-ZABHA:       # %bb.0:
8593; RV64IA-TSO-ZABHA-NEXT:    amomaxu.b a0, a1, (a0)
8594; RV64IA-TSO-ZABHA-NEXT:    ret
8595  %1 = atomicrmw umax ptr %a, i8 %b acq_rel
8596  ret i8 %1
8597}
8598
8599define i8 @atomicrmw_umax_i8_seq_cst(ptr %a, i8 %b) nounwind {
8600; RV32I-LABEL: atomicrmw_umax_i8_seq_cst:
8601; RV32I:       # %bb.0:
8602; RV32I-NEXT:    addi sp, sp, -32
8603; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8604; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8605; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8606; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8607; RV32I-NEXT:    mv s0, a0
8608; RV32I-NEXT:    lbu a3, 0(a0)
8609; RV32I-NEXT:    mv s1, a1
8610; RV32I-NEXT:    andi s2, a1, 255
8611; RV32I-NEXT:    j .LBB59_2
8612; RV32I-NEXT:  .LBB59_1: # %atomicrmw.start
8613; RV32I-NEXT:    # in Loop: Header=BB59_2 Depth=1
8614; RV32I-NEXT:    sb a3, 15(sp)
8615; RV32I-NEXT:    addi a1, sp, 15
8616; RV32I-NEXT:    li a3, 5
8617; RV32I-NEXT:    li a4, 5
8618; RV32I-NEXT:    mv a0, s0
8619; RV32I-NEXT:    call __atomic_compare_exchange_1
8620; RV32I-NEXT:    lbu a3, 15(sp)
8621; RV32I-NEXT:    bnez a0, .LBB59_4
8622; RV32I-NEXT:  .LBB59_2: # %atomicrmw.start
8623; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8624; RV32I-NEXT:    andi a0, a3, 255
8625; RV32I-NEXT:    mv a2, a3
8626; RV32I-NEXT:    bltu s2, a0, .LBB59_1
8627; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8628; RV32I-NEXT:    # in Loop: Header=BB59_2 Depth=1
8629; RV32I-NEXT:    mv a2, s1
8630; RV32I-NEXT:    j .LBB59_1
8631; RV32I-NEXT:  .LBB59_4: # %atomicrmw.end
8632; RV32I-NEXT:    mv a0, a3
8633; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8634; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8635; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8636; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8637; RV32I-NEXT:    addi sp, sp, 32
8638; RV32I-NEXT:    ret
8639;
8640; RV32IA-LABEL: atomicrmw_umax_i8_seq_cst:
8641; RV32IA:       # %bb.0:
8642; RV32IA-NEXT:    andi a2, a0, -4
8643; RV32IA-NEXT:    slli a0, a0, 3
8644; RV32IA-NEXT:    li a3, 255
8645; RV32IA-NEXT:    andi a1, a1, 255
8646; RV32IA-NEXT:    sll a3, a3, a0
8647; RV32IA-NEXT:    sll a1, a1, a0
8648; RV32IA-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
8649; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
8650; RV32IA-NEXT:    and a6, a4, a3
8651; RV32IA-NEXT:    mv a5, a4
8652; RV32IA-NEXT:    bgeu a6, a1, .LBB59_3
8653; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB59_1 Depth=1
8654; RV32IA-NEXT:    xor a5, a4, a1
8655; RV32IA-NEXT:    and a5, a5, a3
8656; RV32IA-NEXT:    xor a5, a4, a5
8657; RV32IA-NEXT:  .LBB59_3: # in Loop: Header=BB59_1 Depth=1
8658; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
8659; RV32IA-NEXT:    bnez a5, .LBB59_1
8660; RV32IA-NEXT:  # %bb.4:
8661; RV32IA-NEXT:    srl a0, a4, a0
8662; RV32IA-NEXT:    ret
8663;
8664; RV64I-LABEL: atomicrmw_umax_i8_seq_cst:
8665; RV64I:       # %bb.0:
8666; RV64I-NEXT:    addi sp, sp, -48
8667; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8668; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8669; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8670; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8671; RV64I-NEXT:    mv s0, a0
8672; RV64I-NEXT:    lbu a3, 0(a0)
8673; RV64I-NEXT:    mv s1, a1
8674; RV64I-NEXT:    andi s2, a1, 255
8675; RV64I-NEXT:    j .LBB59_2
8676; RV64I-NEXT:  .LBB59_1: # %atomicrmw.start
8677; RV64I-NEXT:    # in Loop: Header=BB59_2 Depth=1
8678; RV64I-NEXT:    sb a3, 15(sp)
8679; RV64I-NEXT:    addi a1, sp, 15
8680; RV64I-NEXT:    li a3, 5
8681; RV64I-NEXT:    li a4, 5
8682; RV64I-NEXT:    mv a0, s0
8683; RV64I-NEXT:    call __atomic_compare_exchange_1
8684; RV64I-NEXT:    lbu a3, 15(sp)
8685; RV64I-NEXT:    bnez a0, .LBB59_4
8686; RV64I-NEXT:  .LBB59_2: # %atomicrmw.start
8687; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8688; RV64I-NEXT:    andi a0, a3, 255
8689; RV64I-NEXT:    mv a2, a3
8690; RV64I-NEXT:    bltu s2, a0, .LBB59_1
8691; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8692; RV64I-NEXT:    # in Loop: Header=BB59_2 Depth=1
8693; RV64I-NEXT:    mv a2, s1
8694; RV64I-NEXT:    j .LBB59_1
8695; RV64I-NEXT:  .LBB59_4: # %atomicrmw.end
8696; RV64I-NEXT:    mv a0, a3
8697; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8698; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8699; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8700; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8701; RV64I-NEXT:    addi sp, sp, 48
8702; RV64I-NEXT:    ret
8703;
8704; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i8_seq_cst:
8705; RV64IA-NOZACAS:       # %bb.0:
8706; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
8707; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
8708; RV64IA-NOZACAS-NEXT:    li a3, 255
8709; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
8710; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
8711; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
8712; RV64IA-NOZACAS-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
8713; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
8714; RV64IA-NOZACAS-NEXT:    and a6, a4, a3
8715; RV64IA-NOZACAS-NEXT:    mv a5, a4
8716; RV64IA-NOZACAS-NEXT:    bgeu a6, a1, .LBB59_3
8717; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB59_1 Depth=1
8718; RV64IA-NOZACAS-NEXT:    xor a5, a4, a1
8719; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
8720; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
8721; RV64IA-NOZACAS-NEXT:  .LBB59_3: # in Loop: Header=BB59_1 Depth=1
8722; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
8723; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB59_1
8724; RV64IA-NOZACAS-NEXT:  # %bb.4:
8725; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
8726; RV64IA-NOZACAS-NEXT:    ret
8727;
8728; RV64IA-ZACAS-LABEL: atomicrmw_umax_i8_seq_cst:
8729; RV64IA-ZACAS:       # %bb.0:
8730; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
8731; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
8732; RV64IA-ZACAS-NEXT:    li a3, 255
8733; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
8734; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
8735; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
8736; RV64IA-ZACAS-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
8737; RV64IA-ZACAS-NEXT:    lr.w.aqrl a4, (a2)
8738; RV64IA-ZACAS-NEXT:    and a6, a4, a3
8739; RV64IA-ZACAS-NEXT:    mv a5, a4
8740; RV64IA-ZACAS-NEXT:    bgeu a6, a1, .LBB59_3
8741; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB59_1 Depth=1
8742; RV64IA-ZACAS-NEXT:    xor a5, a4, a1
8743; RV64IA-ZACAS-NEXT:    and a5, a5, a3
8744; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
8745; RV64IA-ZACAS-NEXT:  .LBB59_3: # in Loop: Header=BB59_1 Depth=1
8746; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
8747; RV64IA-ZACAS-NEXT:    bnez a5, .LBB59_1
8748; RV64IA-ZACAS-NEXT:  # %bb.4:
8749; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
8750; RV64IA-ZACAS-NEXT:    ret
8751;
8752; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_seq_cst:
8753; RV64IA-WMO-ZABHA:       # %bb.0:
8754; RV64IA-WMO-ZABHA-NEXT:    amomaxu.b.aqrl a0, a1, (a0)
8755; RV64IA-WMO-ZABHA-NEXT:    ret
8756;
8757; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_seq_cst:
8758; RV64IA-TSO-ZABHA:       # %bb.0:
8759; RV64IA-TSO-ZABHA-NEXT:    amomaxu.b a0, a1, (a0)
8760; RV64IA-TSO-ZABHA-NEXT:    ret
8761  %1 = atomicrmw umax ptr %a, i8 %b seq_cst
8762  ret i8 %1
8763}
8764
8765define i8 @atomicrmw_umin_i8_monotonic(ptr %a, i8 %b) nounwind {
8766; RV32I-LABEL: atomicrmw_umin_i8_monotonic:
8767; RV32I:       # %bb.0:
8768; RV32I-NEXT:    addi sp, sp, -32
8769; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8770; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8771; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8772; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8773; RV32I-NEXT:    mv s0, a0
8774; RV32I-NEXT:    lbu a3, 0(a0)
8775; RV32I-NEXT:    mv s1, a1
8776; RV32I-NEXT:    andi s2, a1, 255
8777; RV32I-NEXT:    j .LBB60_2
8778; RV32I-NEXT:  .LBB60_1: # %atomicrmw.start
8779; RV32I-NEXT:    # in Loop: Header=BB60_2 Depth=1
8780; RV32I-NEXT:    sb a3, 15(sp)
8781; RV32I-NEXT:    addi a1, sp, 15
8782; RV32I-NEXT:    mv a0, s0
8783; RV32I-NEXT:    li a3, 0
8784; RV32I-NEXT:    li a4, 0
8785; RV32I-NEXT:    call __atomic_compare_exchange_1
8786; RV32I-NEXT:    lbu a3, 15(sp)
8787; RV32I-NEXT:    bnez a0, .LBB60_4
8788; RV32I-NEXT:  .LBB60_2: # %atomicrmw.start
8789; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8790; RV32I-NEXT:    andi a0, a3, 255
8791; RV32I-NEXT:    mv a2, a3
8792; RV32I-NEXT:    bgeu s2, a0, .LBB60_1
8793; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8794; RV32I-NEXT:    # in Loop: Header=BB60_2 Depth=1
8795; RV32I-NEXT:    mv a2, s1
8796; RV32I-NEXT:    j .LBB60_1
8797; RV32I-NEXT:  .LBB60_4: # %atomicrmw.end
8798; RV32I-NEXT:    mv a0, a3
8799; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8800; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8801; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8802; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8803; RV32I-NEXT:    addi sp, sp, 32
8804; RV32I-NEXT:    ret
8805;
8806; RV32IA-LABEL: atomicrmw_umin_i8_monotonic:
8807; RV32IA:       # %bb.0:
8808; RV32IA-NEXT:    andi a2, a0, -4
8809; RV32IA-NEXT:    slli a0, a0, 3
8810; RV32IA-NEXT:    li a3, 255
8811; RV32IA-NEXT:    andi a1, a1, 255
8812; RV32IA-NEXT:    sll a3, a3, a0
8813; RV32IA-NEXT:    sll a1, a1, a0
8814; RV32IA-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
8815; RV32IA-NEXT:    lr.w a4, (a2)
8816; RV32IA-NEXT:    and a6, a4, a3
8817; RV32IA-NEXT:    mv a5, a4
8818; RV32IA-NEXT:    bgeu a1, a6, .LBB60_3
8819; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB60_1 Depth=1
8820; RV32IA-NEXT:    xor a5, a4, a1
8821; RV32IA-NEXT:    and a5, a5, a3
8822; RV32IA-NEXT:    xor a5, a4, a5
8823; RV32IA-NEXT:  .LBB60_3: # in Loop: Header=BB60_1 Depth=1
8824; RV32IA-NEXT:    sc.w a5, a5, (a2)
8825; RV32IA-NEXT:    bnez a5, .LBB60_1
8826; RV32IA-NEXT:  # %bb.4:
8827; RV32IA-NEXT:    srl a0, a4, a0
8828; RV32IA-NEXT:    ret
8829;
8830; RV64I-LABEL: atomicrmw_umin_i8_monotonic:
8831; RV64I:       # %bb.0:
8832; RV64I-NEXT:    addi sp, sp, -48
8833; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
8834; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
8835; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
8836; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
8837; RV64I-NEXT:    mv s0, a0
8838; RV64I-NEXT:    lbu a3, 0(a0)
8839; RV64I-NEXT:    mv s1, a1
8840; RV64I-NEXT:    andi s2, a1, 255
8841; RV64I-NEXT:    j .LBB60_2
8842; RV64I-NEXT:  .LBB60_1: # %atomicrmw.start
8843; RV64I-NEXT:    # in Loop: Header=BB60_2 Depth=1
8844; RV64I-NEXT:    sb a3, 15(sp)
8845; RV64I-NEXT:    addi a1, sp, 15
8846; RV64I-NEXT:    mv a0, s0
8847; RV64I-NEXT:    li a3, 0
8848; RV64I-NEXT:    li a4, 0
8849; RV64I-NEXT:    call __atomic_compare_exchange_1
8850; RV64I-NEXT:    lbu a3, 15(sp)
8851; RV64I-NEXT:    bnez a0, .LBB60_4
8852; RV64I-NEXT:  .LBB60_2: # %atomicrmw.start
8853; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
8854; RV64I-NEXT:    andi a0, a3, 255
8855; RV64I-NEXT:    mv a2, a3
8856; RV64I-NEXT:    bgeu s2, a0, .LBB60_1
8857; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
8858; RV64I-NEXT:    # in Loop: Header=BB60_2 Depth=1
8859; RV64I-NEXT:    mv a2, s1
8860; RV64I-NEXT:    j .LBB60_1
8861; RV64I-NEXT:  .LBB60_4: # %atomicrmw.end
8862; RV64I-NEXT:    mv a0, a3
8863; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
8864; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
8865; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
8866; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
8867; RV64I-NEXT:    addi sp, sp, 48
8868; RV64I-NEXT:    ret
8869;
8870; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i8_monotonic:
8871; RV64IA-NOZACAS:       # %bb.0:
8872; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
8873; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
8874; RV64IA-NOZACAS-NEXT:    li a3, 255
8875; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
8876; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
8877; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
8878; RV64IA-NOZACAS-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
8879; RV64IA-NOZACAS-NEXT:    lr.w a4, (a2)
8880; RV64IA-NOZACAS-NEXT:    and a6, a4, a3
8881; RV64IA-NOZACAS-NEXT:    mv a5, a4
8882; RV64IA-NOZACAS-NEXT:    bgeu a1, a6, .LBB60_3
8883; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB60_1 Depth=1
8884; RV64IA-NOZACAS-NEXT:    xor a5, a4, a1
8885; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
8886; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
8887; RV64IA-NOZACAS-NEXT:  .LBB60_3: # in Loop: Header=BB60_1 Depth=1
8888; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
8889; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB60_1
8890; RV64IA-NOZACAS-NEXT:  # %bb.4:
8891; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
8892; RV64IA-NOZACAS-NEXT:    ret
8893;
8894; RV64IA-ZACAS-LABEL: atomicrmw_umin_i8_monotonic:
8895; RV64IA-ZACAS:       # %bb.0:
8896; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
8897; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
8898; RV64IA-ZACAS-NEXT:    li a3, 255
8899; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
8900; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
8901; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
8902; RV64IA-ZACAS-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
8903; RV64IA-ZACAS-NEXT:    lr.w a4, (a2)
8904; RV64IA-ZACAS-NEXT:    and a6, a4, a3
8905; RV64IA-ZACAS-NEXT:    mv a5, a4
8906; RV64IA-ZACAS-NEXT:    bgeu a1, a6, .LBB60_3
8907; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB60_1 Depth=1
8908; RV64IA-ZACAS-NEXT:    xor a5, a4, a1
8909; RV64IA-ZACAS-NEXT:    and a5, a5, a3
8910; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
8911; RV64IA-ZACAS-NEXT:  .LBB60_3: # in Loop: Header=BB60_1 Depth=1
8912; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
8913; RV64IA-ZACAS-NEXT:    bnez a5, .LBB60_1
8914; RV64IA-ZACAS-NEXT:  # %bb.4:
8915; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
8916; RV64IA-ZACAS-NEXT:    ret
8917;
8918; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_monotonic:
8919; RV64IA-WMO-ZABHA:       # %bb.0:
8920; RV64IA-WMO-ZABHA-NEXT:    amominu.b a0, a1, (a0)
8921; RV64IA-WMO-ZABHA-NEXT:    ret
8922;
8923; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_monotonic:
8924; RV64IA-TSO-ZABHA:       # %bb.0:
8925; RV64IA-TSO-ZABHA-NEXT:    amominu.b a0, a1, (a0)
8926; RV64IA-TSO-ZABHA-NEXT:    ret
8927  %1 = atomicrmw umin ptr %a, i8 %b monotonic
8928  ret i8 %1
8929}
8930
8931define i8 @atomicrmw_umin_i8_acquire(ptr %a, i8 %b) nounwind {
8932; RV32I-LABEL: atomicrmw_umin_i8_acquire:
8933; RV32I:       # %bb.0:
8934; RV32I-NEXT:    addi sp, sp, -32
8935; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
8936; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
8937; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
8938; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
8939; RV32I-NEXT:    mv s0, a0
8940; RV32I-NEXT:    lbu a3, 0(a0)
8941; RV32I-NEXT:    mv s1, a1
8942; RV32I-NEXT:    andi s2, a1, 255
8943; RV32I-NEXT:    j .LBB61_2
8944; RV32I-NEXT:  .LBB61_1: # %atomicrmw.start
8945; RV32I-NEXT:    # in Loop: Header=BB61_2 Depth=1
8946; RV32I-NEXT:    sb a3, 15(sp)
8947; RV32I-NEXT:    addi a1, sp, 15
8948; RV32I-NEXT:    li a3, 2
8949; RV32I-NEXT:    li a4, 2
8950; RV32I-NEXT:    mv a0, s0
8951; RV32I-NEXT:    call __atomic_compare_exchange_1
8952; RV32I-NEXT:    lbu a3, 15(sp)
8953; RV32I-NEXT:    bnez a0, .LBB61_4
8954; RV32I-NEXT:  .LBB61_2: # %atomicrmw.start
8955; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
8956; RV32I-NEXT:    andi a0, a3, 255
8957; RV32I-NEXT:    mv a2, a3
8958; RV32I-NEXT:    bgeu s2, a0, .LBB61_1
8959; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
8960; RV32I-NEXT:    # in Loop: Header=BB61_2 Depth=1
8961; RV32I-NEXT:    mv a2, s1
8962; RV32I-NEXT:    j .LBB61_1
8963; RV32I-NEXT:  .LBB61_4: # %atomicrmw.end
8964; RV32I-NEXT:    mv a0, a3
8965; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
8966; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
8967; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
8968; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
8969; RV32I-NEXT:    addi sp, sp, 32
8970; RV32I-NEXT:    ret
8971;
8972; RV32IA-WMO-LABEL: atomicrmw_umin_i8_acquire:
8973; RV32IA-WMO:       # %bb.0:
8974; RV32IA-WMO-NEXT:    andi a2, a0, -4
8975; RV32IA-WMO-NEXT:    slli a0, a0, 3
8976; RV32IA-WMO-NEXT:    li a3, 255
8977; RV32IA-WMO-NEXT:    andi a1, a1, 255
8978; RV32IA-WMO-NEXT:    sll a3, a3, a0
8979; RV32IA-WMO-NEXT:    sll a1, a1, a0
8980; RV32IA-WMO-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
8981; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
8982; RV32IA-WMO-NEXT:    and a6, a4, a3
8983; RV32IA-WMO-NEXT:    mv a5, a4
8984; RV32IA-WMO-NEXT:    bgeu a1, a6, .LBB61_3
8985; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB61_1 Depth=1
8986; RV32IA-WMO-NEXT:    xor a5, a4, a1
8987; RV32IA-WMO-NEXT:    and a5, a5, a3
8988; RV32IA-WMO-NEXT:    xor a5, a4, a5
8989; RV32IA-WMO-NEXT:  .LBB61_3: # in Loop: Header=BB61_1 Depth=1
8990; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
8991; RV32IA-WMO-NEXT:    bnez a5, .LBB61_1
8992; RV32IA-WMO-NEXT:  # %bb.4:
8993; RV32IA-WMO-NEXT:    srl a0, a4, a0
8994; RV32IA-WMO-NEXT:    ret
8995;
8996; RV32IA-TSO-LABEL: atomicrmw_umin_i8_acquire:
8997; RV32IA-TSO:       # %bb.0:
8998; RV32IA-TSO-NEXT:    andi a2, a0, -4
8999; RV32IA-TSO-NEXT:    slli a0, a0, 3
9000; RV32IA-TSO-NEXT:    li a3, 255
9001; RV32IA-TSO-NEXT:    andi a1, a1, 255
9002; RV32IA-TSO-NEXT:    sll a3, a3, a0
9003; RV32IA-TSO-NEXT:    sll a1, a1, a0
9004; RV32IA-TSO-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
9005; RV32IA-TSO-NEXT:    lr.w a4, (a2)
9006; RV32IA-TSO-NEXT:    and a6, a4, a3
9007; RV32IA-TSO-NEXT:    mv a5, a4
9008; RV32IA-TSO-NEXT:    bgeu a1, a6, .LBB61_3
9009; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB61_1 Depth=1
9010; RV32IA-TSO-NEXT:    xor a5, a4, a1
9011; RV32IA-TSO-NEXT:    and a5, a5, a3
9012; RV32IA-TSO-NEXT:    xor a5, a4, a5
9013; RV32IA-TSO-NEXT:  .LBB61_3: # in Loop: Header=BB61_1 Depth=1
9014; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
9015; RV32IA-TSO-NEXT:    bnez a5, .LBB61_1
9016; RV32IA-TSO-NEXT:  # %bb.4:
9017; RV32IA-TSO-NEXT:    srl a0, a4, a0
9018; RV32IA-TSO-NEXT:    ret
9019;
9020; RV64I-LABEL: atomicrmw_umin_i8_acquire:
9021; RV64I:       # %bb.0:
9022; RV64I-NEXT:    addi sp, sp, -48
9023; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9024; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9025; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9026; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9027; RV64I-NEXT:    mv s0, a0
9028; RV64I-NEXT:    lbu a3, 0(a0)
9029; RV64I-NEXT:    mv s1, a1
9030; RV64I-NEXT:    andi s2, a1, 255
9031; RV64I-NEXT:    j .LBB61_2
9032; RV64I-NEXT:  .LBB61_1: # %atomicrmw.start
9033; RV64I-NEXT:    # in Loop: Header=BB61_2 Depth=1
9034; RV64I-NEXT:    sb a3, 15(sp)
9035; RV64I-NEXT:    addi a1, sp, 15
9036; RV64I-NEXT:    li a3, 2
9037; RV64I-NEXT:    li a4, 2
9038; RV64I-NEXT:    mv a0, s0
9039; RV64I-NEXT:    call __atomic_compare_exchange_1
9040; RV64I-NEXT:    lbu a3, 15(sp)
9041; RV64I-NEXT:    bnez a0, .LBB61_4
9042; RV64I-NEXT:  .LBB61_2: # %atomicrmw.start
9043; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9044; RV64I-NEXT:    andi a0, a3, 255
9045; RV64I-NEXT:    mv a2, a3
9046; RV64I-NEXT:    bgeu s2, a0, .LBB61_1
9047; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9048; RV64I-NEXT:    # in Loop: Header=BB61_2 Depth=1
9049; RV64I-NEXT:    mv a2, s1
9050; RV64I-NEXT:    j .LBB61_1
9051; RV64I-NEXT:  .LBB61_4: # %atomicrmw.end
9052; RV64I-NEXT:    mv a0, a3
9053; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9054; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9055; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9056; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9057; RV64I-NEXT:    addi sp, sp, 48
9058; RV64I-NEXT:    ret
9059;
9060; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_acquire:
9061; RV64IA-WMO-NOZACAS:       # %bb.0:
9062; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
9063; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
9064; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
9065; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
9066; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
9067; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
9068; RV64IA-WMO-NOZACAS-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
9069; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
9070; RV64IA-WMO-NOZACAS-NEXT:    and a6, a4, a3
9071; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a4
9072; RV64IA-WMO-NOZACAS-NEXT:    bgeu a1, a6, .LBB61_3
9073; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB61_1 Depth=1
9074; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a1
9075; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
9076; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
9077; RV64IA-WMO-NOZACAS-NEXT:  .LBB61_3: # in Loop: Header=BB61_1 Depth=1
9078; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
9079; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB61_1
9080; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
9081; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
9082; RV64IA-WMO-NOZACAS-NEXT:    ret
9083;
9084; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_acquire:
9085; RV64IA-TSO-NOZACAS:       # %bb.0:
9086; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
9087; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
9088; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
9089; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
9090; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
9091; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
9092; RV64IA-TSO-NOZACAS-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
9093; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
9094; RV64IA-TSO-NOZACAS-NEXT:    and a6, a4, a3
9095; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a4
9096; RV64IA-TSO-NOZACAS-NEXT:    bgeu a1, a6, .LBB61_3
9097; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB61_1 Depth=1
9098; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a1
9099; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
9100; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
9101; RV64IA-TSO-NOZACAS-NEXT:  .LBB61_3: # in Loop: Header=BB61_1 Depth=1
9102; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
9103; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB61_1
9104; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
9105; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
9106; RV64IA-TSO-NOZACAS-NEXT:    ret
9107;
9108; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_acquire:
9109; RV64IA-WMO-ZACAS:       # %bb.0:
9110; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
9111; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
9112; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
9113; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
9114; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
9115; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
9116; RV64IA-WMO-ZACAS-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
9117; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
9118; RV64IA-WMO-ZACAS-NEXT:    and a6, a4, a3
9119; RV64IA-WMO-ZACAS-NEXT:    mv a5, a4
9120; RV64IA-WMO-ZACAS-NEXT:    bgeu a1, a6, .LBB61_3
9121; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB61_1 Depth=1
9122; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a1
9123; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
9124; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
9125; RV64IA-WMO-ZACAS-NEXT:  .LBB61_3: # in Loop: Header=BB61_1 Depth=1
9126; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
9127; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB61_1
9128; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
9129; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
9130; RV64IA-WMO-ZACAS-NEXT:    ret
9131;
9132; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_acquire:
9133; RV64IA-TSO-ZACAS:       # %bb.0:
9134; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
9135; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
9136; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
9137; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
9138; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
9139; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
9140; RV64IA-TSO-ZACAS-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
9141; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
9142; RV64IA-TSO-ZACAS-NEXT:    and a6, a4, a3
9143; RV64IA-TSO-ZACAS-NEXT:    mv a5, a4
9144; RV64IA-TSO-ZACAS-NEXT:    bgeu a1, a6, .LBB61_3
9145; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB61_1 Depth=1
9146; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a1
9147; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
9148; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
9149; RV64IA-TSO-ZACAS-NEXT:  .LBB61_3: # in Loop: Header=BB61_1 Depth=1
9150; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
9151; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB61_1
9152; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
9153; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
9154; RV64IA-TSO-ZACAS-NEXT:    ret
9155;
9156; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_acquire:
9157; RV64IA-WMO-ZABHA:       # %bb.0:
9158; RV64IA-WMO-ZABHA-NEXT:    amominu.b.aq a0, a1, (a0)
9159; RV64IA-WMO-ZABHA-NEXT:    ret
9160;
9161; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_acquire:
9162; RV64IA-TSO-ZABHA:       # %bb.0:
9163; RV64IA-TSO-ZABHA-NEXT:    amominu.b a0, a1, (a0)
9164; RV64IA-TSO-ZABHA-NEXT:    ret
9165  %1 = atomicrmw umin ptr %a, i8 %b acquire
9166  ret i8 %1
9167}
9168
9169define i8 @atomicrmw_umin_i8_release(ptr %a, i8 %b) nounwind {
9170; RV32I-LABEL: atomicrmw_umin_i8_release:
9171; RV32I:       # %bb.0:
9172; RV32I-NEXT:    addi sp, sp, -32
9173; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9174; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9175; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9176; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9177; RV32I-NEXT:    mv s0, a0
9178; RV32I-NEXT:    lbu a3, 0(a0)
9179; RV32I-NEXT:    mv s1, a1
9180; RV32I-NEXT:    andi s2, a1, 255
9181; RV32I-NEXT:    j .LBB62_2
9182; RV32I-NEXT:  .LBB62_1: # %atomicrmw.start
9183; RV32I-NEXT:    # in Loop: Header=BB62_2 Depth=1
9184; RV32I-NEXT:    sb a3, 15(sp)
9185; RV32I-NEXT:    addi a1, sp, 15
9186; RV32I-NEXT:    li a3, 3
9187; RV32I-NEXT:    mv a0, s0
9188; RV32I-NEXT:    li a4, 0
9189; RV32I-NEXT:    call __atomic_compare_exchange_1
9190; RV32I-NEXT:    lbu a3, 15(sp)
9191; RV32I-NEXT:    bnez a0, .LBB62_4
9192; RV32I-NEXT:  .LBB62_2: # %atomicrmw.start
9193; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9194; RV32I-NEXT:    andi a0, a3, 255
9195; RV32I-NEXT:    mv a2, a3
9196; RV32I-NEXT:    bgeu s2, a0, .LBB62_1
9197; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9198; RV32I-NEXT:    # in Loop: Header=BB62_2 Depth=1
9199; RV32I-NEXT:    mv a2, s1
9200; RV32I-NEXT:    j .LBB62_1
9201; RV32I-NEXT:  .LBB62_4: # %atomicrmw.end
9202; RV32I-NEXT:    mv a0, a3
9203; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9204; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9205; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9206; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9207; RV32I-NEXT:    addi sp, sp, 32
9208; RV32I-NEXT:    ret
9209;
9210; RV32IA-WMO-LABEL: atomicrmw_umin_i8_release:
9211; RV32IA-WMO:       # %bb.0:
9212; RV32IA-WMO-NEXT:    andi a2, a0, -4
9213; RV32IA-WMO-NEXT:    slli a0, a0, 3
9214; RV32IA-WMO-NEXT:    li a3, 255
9215; RV32IA-WMO-NEXT:    andi a1, a1, 255
9216; RV32IA-WMO-NEXT:    sll a3, a3, a0
9217; RV32IA-WMO-NEXT:    sll a1, a1, a0
9218; RV32IA-WMO-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
9219; RV32IA-WMO-NEXT:    lr.w a4, (a2)
9220; RV32IA-WMO-NEXT:    and a6, a4, a3
9221; RV32IA-WMO-NEXT:    mv a5, a4
9222; RV32IA-WMO-NEXT:    bgeu a1, a6, .LBB62_3
9223; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB62_1 Depth=1
9224; RV32IA-WMO-NEXT:    xor a5, a4, a1
9225; RV32IA-WMO-NEXT:    and a5, a5, a3
9226; RV32IA-WMO-NEXT:    xor a5, a4, a5
9227; RV32IA-WMO-NEXT:  .LBB62_3: # in Loop: Header=BB62_1 Depth=1
9228; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
9229; RV32IA-WMO-NEXT:    bnez a5, .LBB62_1
9230; RV32IA-WMO-NEXT:  # %bb.4:
9231; RV32IA-WMO-NEXT:    srl a0, a4, a0
9232; RV32IA-WMO-NEXT:    ret
9233;
9234; RV32IA-TSO-LABEL: atomicrmw_umin_i8_release:
9235; RV32IA-TSO:       # %bb.0:
9236; RV32IA-TSO-NEXT:    andi a2, a0, -4
9237; RV32IA-TSO-NEXT:    slli a0, a0, 3
9238; RV32IA-TSO-NEXT:    li a3, 255
9239; RV32IA-TSO-NEXT:    andi a1, a1, 255
9240; RV32IA-TSO-NEXT:    sll a3, a3, a0
9241; RV32IA-TSO-NEXT:    sll a1, a1, a0
9242; RV32IA-TSO-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
9243; RV32IA-TSO-NEXT:    lr.w a4, (a2)
9244; RV32IA-TSO-NEXT:    and a6, a4, a3
9245; RV32IA-TSO-NEXT:    mv a5, a4
9246; RV32IA-TSO-NEXT:    bgeu a1, a6, .LBB62_3
9247; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB62_1 Depth=1
9248; RV32IA-TSO-NEXT:    xor a5, a4, a1
9249; RV32IA-TSO-NEXT:    and a5, a5, a3
9250; RV32IA-TSO-NEXT:    xor a5, a4, a5
9251; RV32IA-TSO-NEXT:  .LBB62_3: # in Loop: Header=BB62_1 Depth=1
9252; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
9253; RV32IA-TSO-NEXT:    bnez a5, .LBB62_1
9254; RV32IA-TSO-NEXT:  # %bb.4:
9255; RV32IA-TSO-NEXT:    srl a0, a4, a0
9256; RV32IA-TSO-NEXT:    ret
9257;
9258; RV64I-LABEL: atomicrmw_umin_i8_release:
9259; RV64I:       # %bb.0:
9260; RV64I-NEXT:    addi sp, sp, -48
9261; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9262; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9263; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9264; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9265; RV64I-NEXT:    mv s0, a0
9266; RV64I-NEXT:    lbu a3, 0(a0)
9267; RV64I-NEXT:    mv s1, a1
9268; RV64I-NEXT:    andi s2, a1, 255
9269; RV64I-NEXT:    j .LBB62_2
9270; RV64I-NEXT:  .LBB62_1: # %atomicrmw.start
9271; RV64I-NEXT:    # in Loop: Header=BB62_2 Depth=1
9272; RV64I-NEXT:    sb a3, 15(sp)
9273; RV64I-NEXT:    addi a1, sp, 15
9274; RV64I-NEXT:    li a3, 3
9275; RV64I-NEXT:    mv a0, s0
9276; RV64I-NEXT:    li a4, 0
9277; RV64I-NEXT:    call __atomic_compare_exchange_1
9278; RV64I-NEXT:    lbu a3, 15(sp)
9279; RV64I-NEXT:    bnez a0, .LBB62_4
9280; RV64I-NEXT:  .LBB62_2: # %atomicrmw.start
9281; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9282; RV64I-NEXT:    andi a0, a3, 255
9283; RV64I-NEXT:    mv a2, a3
9284; RV64I-NEXT:    bgeu s2, a0, .LBB62_1
9285; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9286; RV64I-NEXT:    # in Loop: Header=BB62_2 Depth=1
9287; RV64I-NEXT:    mv a2, s1
9288; RV64I-NEXT:    j .LBB62_1
9289; RV64I-NEXT:  .LBB62_4: # %atomicrmw.end
9290; RV64I-NEXT:    mv a0, a3
9291; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9292; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9293; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9294; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9295; RV64I-NEXT:    addi sp, sp, 48
9296; RV64I-NEXT:    ret
9297;
9298; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_release:
9299; RV64IA-WMO-NOZACAS:       # %bb.0:
9300; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
9301; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
9302; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
9303; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
9304; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
9305; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
9306; RV64IA-WMO-NOZACAS-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
9307; RV64IA-WMO-NOZACAS-NEXT:    lr.w a4, (a2)
9308; RV64IA-WMO-NOZACAS-NEXT:    and a6, a4, a3
9309; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a4
9310; RV64IA-WMO-NOZACAS-NEXT:    bgeu a1, a6, .LBB62_3
9311; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB62_1 Depth=1
9312; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a1
9313; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
9314; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
9315; RV64IA-WMO-NOZACAS-NEXT:  .LBB62_3: # in Loop: Header=BB62_1 Depth=1
9316; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
9317; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB62_1
9318; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
9319; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
9320; RV64IA-WMO-NOZACAS-NEXT:    ret
9321;
9322; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_release:
9323; RV64IA-TSO-NOZACAS:       # %bb.0:
9324; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
9325; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
9326; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
9327; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
9328; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
9329; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
9330; RV64IA-TSO-NOZACAS-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
9331; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
9332; RV64IA-TSO-NOZACAS-NEXT:    and a6, a4, a3
9333; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a4
9334; RV64IA-TSO-NOZACAS-NEXT:    bgeu a1, a6, .LBB62_3
9335; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB62_1 Depth=1
9336; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a1
9337; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
9338; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
9339; RV64IA-TSO-NOZACAS-NEXT:  .LBB62_3: # in Loop: Header=BB62_1 Depth=1
9340; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
9341; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB62_1
9342; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
9343; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
9344; RV64IA-TSO-NOZACAS-NEXT:    ret
9345;
9346; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_release:
9347; RV64IA-WMO-ZACAS:       # %bb.0:
9348; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
9349; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
9350; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
9351; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
9352; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
9353; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
9354; RV64IA-WMO-ZACAS-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
9355; RV64IA-WMO-ZACAS-NEXT:    lr.w a4, (a2)
9356; RV64IA-WMO-ZACAS-NEXT:    and a6, a4, a3
9357; RV64IA-WMO-ZACAS-NEXT:    mv a5, a4
9358; RV64IA-WMO-ZACAS-NEXT:    bgeu a1, a6, .LBB62_3
9359; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB62_1 Depth=1
9360; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a1
9361; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
9362; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
9363; RV64IA-WMO-ZACAS-NEXT:  .LBB62_3: # in Loop: Header=BB62_1 Depth=1
9364; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
9365; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB62_1
9366; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
9367; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
9368; RV64IA-WMO-ZACAS-NEXT:    ret
9369;
9370; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_release:
9371; RV64IA-TSO-ZACAS:       # %bb.0:
9372; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
9373; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
9374; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
9375; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
9376; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
9377; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
9378; RV64IA-TSO-ZACAS-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
9379; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
9380; RV64IA-TSO-ZACAS-NEXT:    and a6, a4, a3
9381; RV64IA-TSO-ZACAS-NEXT:    mv a5, a4
9382; RV64IA-TSO-ZACAS-NEXT:    bgeu a1, a6, .LBB62_3
9383; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB62_1 Depth=1
9384; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a1
9385; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
9386; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
9387; RV64IA-TSO-ZACAS-NEXT:  .LBB62_3: # in Loop: Header=BB62_1 Depth=1
9388; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
9389; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB62_1
9390; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
9391; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
9392; RV64IA-TSO-ZACAS-NEXT:    ret
9393;
9394; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_release:
9395; RV64IA-WMO-ZABHA:       # %bb.0:
9396; RV64IA-WMO-ZABHA-NEXT:    amominu.b.rl a0, a1, (a0)
9397; RV64IA-WMO-ZABHA-NEXT:    ret
9398;
9399; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_release:
9400; RV64IA-TSO-ZABHA:       # %bb.0:
9401; RV64IA-TSO-ZABHA-NEXT:    amominu.b a0, a1, (a0)
9402; RV64IA-TSO-ZABHA-NEXT:    ret
9403  %1 = atomicrmw umin ptr %a, i8 %b release
9404  ret i8 %1
9405}
9406
9407define i8 @atomicrmw_umin_i8_acq_rel(ptr %a, i8 %b) nounwind {
9408; RV32I-LABEL: atomicrmw_umin_i8_acq_rel:
9409; RV32I:       # %bb.0:
9410; RV32I-NEXT:    addi sp, sp, -32
9411; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9412; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9413; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9414; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9415; RV32I-NEXT:    mv s0, a0
9416; RV32I-NEXT:    lbu a3, 0(a0)
9417; RV32I-NEXT:    mv s1, a1
9418; RV32I-NEXT:    andi s2, a1, 255
9419; RV32I-NEXT:    j .LBB63_2
9420; RV32I-NEXT:  .LBB63_1: # %atomicrmw.start
9421; RV32I-NEXT:    # in Loop: Header=BB63_2 Depth=1
9422; RV32I-NEXT:    sb a3, 15(sp)
9423; RV32I-NEXT:    addi a1, sp, 15
9424; RV32I-NEXT:    li a3, 4
9425; RV32I-NEXT:    li a4, 2
9426; RV32I-NEXT:    mv a0, s0
9427; RV32I-NEXT:    call __atomic_compare_exchange_1
9428; RV32I-NEXT:    lbu a3, 15(sp)
9429; RV32I-NEXT:    bnez a0, .LBB63_4
9430; RV32I-NEXT:  .LBB63_2: # %atomicrmw.start
9431; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9432; RV32I-NEXT:    andi a0, a3, 255
9433; RV32I-NEXT:    mv a2, a3
9434; RV32I-NEXT:    bgeu s2, a0, .LBB63_1
9435; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9436; RV32I-NEXT:    # in Loop: Header=BB63_2 Depth=1
9437; RV32I-NEXT:    mv a2, s1
9438; RV32I-NEXT:    j .LBB63_1
9439; RV32I-NEXT:  .LBB63_4: # %atomicrmw.end
9440; RV32I-NEXT:    mv a0, a3
9441; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9442; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9443; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9444; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9445; RV32I-NEXT:    addi sp, sp, 32
9446; RV32I-NEXT:    ret
9447;
9448; RV32IA-WMO-LABEL: atomicrmw_umin_i8_acq_rel:
9449; RV32IA-WMO:       # %bb.0:
9450; RV32IA-WMO-NEXT:    andi a2, a0, -4
9451; RV32IA-WMO-NEXT:    slli a0, a0, 3
9452; RV32IA-WMO-NEXT:    li a3, 255
9453; RV32IA-WMO-NEXT:    andi a1, a1, 255
9454; RV32IA-WMO-NEXT:    sll a3, a3, a0
9455; RV32IA-WMO-NEXT:    sll a1, a1, a0
9456; RV32IA-WMO-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
9457; RV32IA-WMO-NEXT:    lr.w.aq a4, (a2)
9458; RV32IA-WMO-NEXT:    and a6, a4, a3
9459; RV32IA-WMO-NEXT:    mv a5, a4
9460; RV32IA-WMO-NEXT:    bgeu a1, a6, .LBB63_3
9461; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB63_1 Depth=1
9462; RV32IA-WMO-NEXT:    xor a5, a4, a1
9463; RV32IA-WMO-NEXT:    and a5, a5, a3
9464; RV32IA-WMO-NEXT:    xor a5, a4, a5
9465; RV32IA-WMO-NEXT:  .LBB63_3: # in Loop: Header=BB63_1 Depth=1
9466; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
9467; RV32IA-WMO-NEXT:    bnez a5, .LBB63_1
9468; RV32IA-WMO-NEXT:  # %bb.4:
9469; RV32IA-WMO-NEXT:    srl a0, a4, a0
9470; RV32IA-WMO-NEXT:    ret
9471;
9472; RV32IA-TSO-LABEL: atomicrmw_umin_i8_acq_rel:
9473; RV32IA-TSO:       # %bb.0:
9474; RV32IA-TSO-NEXT:    andi a2, a0, -4
9475; RV32IA-TSO-NEXT:    slli a0, a0, 3
9476; RV32IA-TSO-NEXT:    li a3, 255
9477; RV32IA-TSO-NEXT:    andi a1, a1, 255
9478; RV32IA-TSO-NEXT:    sll a3, a3, a0
9479; RV32IA-TSO-NEXT:    sll a1, a1, a0
9480; RV32IA-TSO-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
9481; RV32IA-TSO-NEXT:    lr.w a4, (a2)
9482; RV32IA-TSO-NEXT:    and a6, a4, a3
9483; RV32IA-TSO-NEXT:    mv a5, a4
9484; RV32IA-TSO-NEXT:    bgeu a1, a6, .LBB63_3
9485; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB63_1 Depth=1
9486; RV32IA-TSO-NEXT:    xor a5, a4, a1
9487; RV32IA-TSO-NEXT:    and a5, a5, a3
9488; RV32IA-TSO-NEXT:    xor a5, a4, a5
9489; RV32IA-TSO-NEXT:  .LBB63_3: # in Loop: Header=BB63_1 Depth=1
9490; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
9491; RV32IA-TSO-NEXT:    bnez a5, .LBB63_1
9492; RV32IA-TSO-NEXT:  # %bb.4:
9493; RV32IA-TSO-NEXT:    srl a0, a4, a0
9494; RV32IA-TSO-NEXT:    ret
9495;
9496; RV64I-LABEL: atomicrmw_umin_i8_acq_rel:
9497; RV64I:       # %bb.0:
9498; RV64I-NEXT:    addi sp, sp, -48
9499; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9500; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9501; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9502; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9503; RV64I-NEXT:    mv s0, a0
9504; RV64I-NEXT:    lbu a3, 0(a0)
9505; RV64I-NEXT:    mv s1, a1
9506; RV64I-NEXT:    andi s2, a1, 255
9507; RV64I-NEXT:    j .LBB63_2
9508; RV64I-NEXT:  .LBB63_1: # %atomicrmw.start
9509; RV64I-NEXT:    # in Loop: Header=BB63_2 Depth=1
9510; RV64I-NEXT:    sb a3, 15(sp)
9511; RV64I-NEXT:    addi a1, sp, 15
9512; RV64I-NEXT:    li a3, 4
9513; RV64I-NEXT:    li a4, 2
9514; RV64I-NEXT:    mv a0, s0
9515; RV64I-NEXT:    call __atomic_compare_exchange_1
9516; RV64I-NEXT:    lbu a3, 15(sp)
9517; RV64I-NEXT:    bnez a0, .LBB63_4
9518; RV64I-NEXT:  .LBB63_2: # %atomicrmw.start
9519; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9520; RV64I-NEXT:    andi a0, a3, 255
9521; RV64I-NEXT:    mv a2, a3
9522; RV64I-NEXT:    bgeu s2, a0, .LBB63_1
9523; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9524; RV64I-NEXT:    # in Loop: Header=BB63_2 Depth=1
9525; RV64I-NEXT:    mv a2, s1
9526; RV64I-NEXT:    j .LBB63_1
9527; RV64I-NEXT:  .LBB63_4: # %atomicrmw.end
9528; RV64I-NEXT:    mv a0, a3
9529; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9530; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9531; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9532; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9533; RV64I-NEXT:    addi sp, sp, 48
9534; RV64I-NEXT:    ret
9535;
9536; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
9537; RV64IA-WMO-NOZACAS:       # %bb.0:
9538; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
9539; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
9540; RV64IA-WMO-NOZACAS-NEXT:    li a3, 255
9541; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a1, 255
9542; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
9543; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
9544; RV64IA-WMO-NOZACAS-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
9545; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a4, (a2)
9546; RV64IA-WMO-NOZACAS-NEXT:    and a6, a4, a3
9547; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a4
9548; RV64IA-WMO-NOZACAS-NEXT:    bgeu a1, a6, .LBB63_3
9549; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB63_1 Depth=1
9550; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a1
9551; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a3
9552; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a4, a5
9553; RV64IA-WMO-NOZACAS-NEXT:  .LBB63_3: # in Loop: Header=BB63_1 Depth=1
9554; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
9555; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB63_1
9556; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
9557; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a4, a0
9558; RV64IA-WMO-NOZACAS-NEXT:    ret
9559;
9560; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
9561; RV64IA-TSO-NOZACAS:       # %bb.0:
9562; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
9563; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
9564; RV64IA-TSO-NOZACAS-NEXT:    li a3, 255
9565; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a1, 255
9566; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
9567; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
9568; RV64IA-TSO-NOZACAS-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
9569; RV64IA-TSO-NOZACAS-NEXT:    lr.w a4, (a2)
9570; RV64IA-TSO-NOZACAS-NEXT:    and a6, a4, a3
9571; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a4
9572; RV64IA-TSO-NOZACAS-NEXT:    bgeu a1, a6, .LBB63_3
9573; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB63_1 Depth=1
9574; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a1
9575; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a3
9576; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a4, a5
9577; RV64IA-TSO-NOZACAS-NEXT:  .LBB63_3: # in Loop: Header=BB63_1 Depth=1
9578; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
9579; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB63_1
9580; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
9581; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a4, a0
9582; RV64IA-TSO-NOZACAS-NEXT:    ret
9583;
9584; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
9585; RV64IA-WMO-ZACAS:       # %bb.0:
9586; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
9587; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
9588; RV64IA-WMO-ZACAS-NEXT:    li a3, 255
9589; RV64IA-WMO-ZACAS-NEXT:    andi a1, a1, 255
9590; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
9591; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
9592; RV64IA-WMO-ZACAS-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
9593; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a4, (a2)
9594; RV64IA-WMO-ZACAS-NEXT:    and a6, a4, a3
9595; RV64IA-WMO-ZACAS-NEXT:    mv a5, a4
9596; RV64IA-WMO-ZACAS-NEXT:    bgeu a1, a6, .LBB63_3
9597; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB63_1 Depth=1
9598; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a1
9599; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a3
9600; RV64IA-WMO-ZACAS-NEXT:    xor a5, a4, a5
9601; RV64IA-WMO-ZACAS-NEXT:  .LBB63_3: # in Loop: Header=BB63_1 Depth=1
9602; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
9603; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB63_1
9604; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
9605; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a4, a0
9606; RV64IA-WMO-ZACAS-NEXT:    ret
9607;
9608; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
9609; RV64IA-TSO-ZACAS:       # %bb.0:
9610; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
9611; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
9612; RV64IA-TSO-ZACAS-NEXT:    li a3, 255
9613; RV64IA-TSO-ZACAS-NEXT:    andi a1, a1, 255
9614; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
9615; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
9616; RV64IA-TSO-ZACAS-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
9617; RV64IA-TSO-ZACAS-NEXT:    lr.w a4, (a2)
9618; RV64IA-TSO-ZACAS-NEXT:    and a6, a4, a3
9619; RV64IA-TSO-ZACAS-NEXT:    mv a5, a4
9620; RV64IA-TSO-ZACAS-NEXT:    bgeu a1, a6, .LBB63_3
9621; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB63_1 Depth=1
9622; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a1
9623; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a3
9624; RV64IA-TSO-ZACAS-NEXT:    xor a5, a4, a5
9625; RV64IA-TSO-ZACAS-NEXT:  .LBB63_3: # in Loop: Header=BB63_1 Depth=1
9626; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
9627; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB63_1
9628; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
9629; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a4, a0
9630; RV64IA-TSO-ZACAS-NEXT:    ret
9631;
9632; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_acq_rel:
9633; RV64IA-WMO-ZABHA:       # %bb.0:
9634; RV64IA-WMO-ZABHA-NEXT:    amominu.b.aqrl a0, a1, (a0)
9635; RV64IA-WMO-ZABHA-NEXT:    ret
9636;
9637; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_acq_rel:
9638; RV64IA-TSO-ZABHA:       # %bb.0:
9639; RV64IA-TSO-ZABHA-NEXT:    amominu.b a0, a1, (a0)
9640; RV64IA-TSO-ZABHA-NEXT:    ret
9641  %1 = atomicrmw umin ptr %a, i8 %b acq_rel
9642  ret i8 %1
9643}
9644
9645define i8 @atomicrmw_umin_i8_seq_cst(ptr %a, i8 %b) nounwind {
9646; RV32I-LABEL: atomicrmw_umin_i8_seq_cst:
9647; RV32I:       # %bb.0:
9648; RV32I-NEXT:    addi sp, sp, -32
9649; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
9650; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
9651; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
9652; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
9653; RV32I-NEXT:    mv s0, a0
9654; RV32I-NEXT:    lbu a3, 0(a0)
9655; RV32I-NEXT:    mv s1, a1
9656; RV32I-NEXT:    andi s2, a1, 255
9657; RV32I-NEXT:    j .LBB64_2
9658; RV32I-NEXT:  .LBB64_1: # %atomicrmw.start
9659; RV32I-NEXT:    # in Loop: Header=BB64_2 Depth=1
9660; RV32I-NEXT:    sb a3, 15(sp)
9661; RV32I-NEXT:    addi a1, sp, 15
9662; RV32I-NEXT:    li a3, 5
9663; RV32I-NEXT:    li a4, 5
9664; RV32I-NEXT:    mv a0, s0
9665; RV32I-NEXT:    call __atomic_compare_exchange_1
9666; RV32I-NEXT:    lbu a3, 15(sp)
9667; RV32I-NEXT:    bnez a0, .LBB64_4
9668; RV32I-NEXT:  .LBB64_2: # %atomicrmw.start
9669; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
9670; RV32I-NEXT:    andi a0, a3, 255
9671; RV32I-NEXT:    mv a2, a3
9672; RV32I-NEXT:    bgeu s2, a0, .LBB64_1
9673; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
9674; RV32I-NEXT:    # in Loop: Header=BB64_2 Depth=1
9675; RV32I-NEXT:    mv a2, s1
9676; RV32I-NEXT:    j .LBB64_1
9677; RV32I-NEXT:  .LBB64_4: # %atomicrmw.end
9678; RV32I-NEXT:    mv a0, a3
9679; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
9680; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
9681; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
9682; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
9683; RV32I-NEXT:    addi sp, sp, 32
9684; RV32I-NEXT:    ret
9685;
9686; RV32IA-LABEL: atomicrmw_umin_i8_seq_cst:
9687; RV32IA:       # %bb.0:
9688; RV32IA-NEXT:    andi a2, a0, -4
9689; RV32IA-NEXT:    slli a0, a0, 3
9690; RV32IA-NEXT:    li a3, 255
9691; RV32IA-NEXT:    andi a1, a1, 255
9692; RV32IA-NEXT:    sll a3, a3, a0
9693; RV32IA-NEXT:    sll a1, a1, a0
9694; RV32IA-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
9695; RV32IA-NEXT:    lr.w.aqrl a4, (a2)
9696; RV32IA-NEXT:    and a6, a4, a3
9697; RV32IA-NEXT:    mv a5, a4
9698; RV32IA-NEXT:    bgeu a1, a6, .LBB64_3
9699; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB64_1 Depth=1
9700; RV32IA-NEXT:    xor a5, a4, a1
9701; RV32IA-NEXT:    and a5, a5, a3
9702; RV32IA-NEXT:    xor a5, a4, a5
9703; RV32IA-NEXT:  .LBB64_3: # in Loop: Header=BB64_1 Depth=1
9704; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
9705; RV32IA-NEXT:    bnez a5, .LBB64_1
9706; RV32IA-NEXT:  # %bb.4:
9707; RV32IA-NEXT:    srl a0, a4, a0
9708; RV32IA-NEXT:    ret
9709;
9710; RV64I-LABEL: atomicrmw_umin_i8_seq_cst:
9711; RV64I:       # %bb.0:
9712; RV64I-NEXT:    addi sp, sp, -48
9713; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
9714; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
9715; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
9716; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
9717; RV64I-NEXT:    mv s0, a0
9718; RV64I-NEXT:    lbu a3, 0(a0)
9719; RV64I-NEXT:    mv s1, a1
9720; RV64I-NEXT:    andi s2, a1, 255
9721; RV64I-NEXT:    j .LBB64_2
9722; RV64I-NEXT:  .LBB64_1: # %atomicrmw.start
9723; RV64I-NEXT:    # in Loop: Header=BB64_2 Depth=1
9724; RV64I-NEXT:    sb a3, 15(sp)
9725; RV64I-NEXT:    addi a1, sp, 15
9726; RV64I-NEXT:    li a3, 5
9727; RV64I-NEXT:    li a4, 5
9728; RV64I-NEXT:    mv a0, s0
9729; RV64I-NEXT:    call __atomic_compare_exchange_1
9730; RV64I-NEXT:    lbu a3, 15(sp)
9731; RV64I-NEXT:    bnez a0, .LBB64_4
9732; RV64I-NEXT:  .LBB64_2: # %atomicrmw.start
9733; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
9734; RV64I-NEXT:    andi a0, a3, 255
9735; RV64I-NEXT:    mv a2, a3
9736; RV64I-NEXT:    bgeu s2, a0, .LBB64_1
9737; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
9738; RV64I-NEXT:    # in Loop: Header=BB64_2 Depth=1
9739; RV64I-NEXT:    mv a2, s1
9740; RV64I-NEXT:    j .LBB64_1
9741; RV64I-NEXT:  .LBB64_4: # %atomicrmw.end
9742; RV64I-NEXT:    mv a0, a3
9743; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
9744; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
9745; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
9746; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
9747; RV64I-NEXT:    addi sp, sp, 48
9748; RV64I-NEXT:    ret
9749;
9750; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i8_seq_cst:
9751; RV64IA-NOZACAS:       # %bb.0:
9752; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
9753; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
9754; RV64IA-NOZACAS-NEXT:    li a3, 255
9755; RV64IA-NOZACAS-NEXT:    andi a1, a1, 255
9756; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
9757; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
9758; RV64IA-NOZACAS-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
9759; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a4, (a2)
9760; RV64IA-NOZACAS-NEXT:    and a6, a4, a3
9761; RV64IA-NOZACAS-NEXT:    mv a5, a4
9762; RV64IA-NOZACAS-NEXT:    bgeu a1, a6, .LBB64_3
9763; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB64_1 Depth=1
9764; RV64IA-NOZACAS-NEXT:    xor a5, a4, a1
9765; RV64IA-NOZACAS-NEXT:    and a5, a5, a3
9766; RV64IA-NOZACAS-NEXT:    xor a5, a4, a5
9767; RV64IA-NOZACAS-NEXT:  .LBB64_3: # in Loop: Header=BB64_1 Depth=1
9768; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
9769; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB64_1
9770; RV64IA-NOZACAS-NEXT:  # %bb.4:
9771; RV64IA-NOZACAS-NEXT:    srlw a0, a4, a0
9772; RV64IA-NOZACAS-NEXT:    ret
9773;
9774; RV64IA-ZACAS-LABEL: atomicrmw_umin_i8_seq_cst:
9775; RV64IA-ZACAS:       # %bb.0:
9776; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
9777; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
9778; RV64IA-ZACAS-NEXT:    li a3, 255
9779; RV64IA-ZACAS-NEXT:    andi a1, a1, 255
9780; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
9781; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
9782; RV64IA-ZACAS-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
9783; RV64IA-ZACAS-NEXT:    lr.w.aqrl a4, (a2)
9784; RV64IA-ZACAS-NEXT:    and a6, a4, a3
9785; RV64IA-ZACAS-NEXT:    mv a5, a4
9786; RV64IA-ZACAS-NEXT:    bgeu a1, a6, .LBB64_3
9787; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB64_1 Depth=1
9788; RV64IA-ZACAS-NEXT:    xor a5, a4, a1
9789; RV64IA-ZACAS-NEXT:    and a5, a5, a3
9790; RV64IA-ZACAS-NEXT:    xor a5, a4, a5
9791; RV64IA-ZACAS-NEXT:  .LBB64_3: # in Loop: Header=BB64_1 Depth=1
9792; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
9793; RV64IA-ZACAS-NEXT:    bnez a5, .LBB64_1
9794; RV64IA-ZACAS-NEXT:  # %bb.4:
9795; RV64IA-ZACAS-NEXT:    srlw a0, a4, a0
9796; RV64IA-ZACAS-NEXT:    ret
9797;
9798; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_seq_cst:
9799; RV64IA-WMO-ZABHA:       # %bb.0:
9800; RV64IA-WMO-ZABHA-NEXT:    amominu.b.aqrl a0, a1, (a0)
9801; RV64IA-WMO-ZABHA-NEXT:    ret
9802;
9803; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_seq_cst:
9804; RV64IA-TSO-ZABHA:       # %bb.0:
9805; RV64IA-TSO-ZABHA-NEXT:    amominu.b a0, a1, (a0)
9806; RV64IA-TSO-ZABHA-NEXT:    ret
9807  %1 = atomicrmw umin ptr %a, i8 %b seq_cst
9808  ret i8 %1
9809}
9810
9811define i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind {
9812; RV32I-LABEL: atomicrmw_xchg_i16_monotonic:
9813; RV32I:       # %bb.0:
9814; RV32I-NEXT:    addi sp, sp, -16
9815; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9816; RV32I-NEXT:    li a2, 0
9817; RV32I-NEXT:    call __atomic_exchange_2
9818; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9819; RV32I-NEXT:    addi sp, sp, 16
9820; RV32I-NEXT:    ret
9821;
9822; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic:
9823; RV32IA:       # %bb.0:
9824; RV32IA-NEXT:    andi a2, a0, -4
9825; RV32IA-NEXT:    slli a0, a0, 3
9826; RV32IA-NEXT:    lui a3, 16
9827; RV32IA-NEXT:    addi a3, a3, -1
9828; RV32IA-NEXT:    sll a4, a3, a0
9829; RV32IA-NEXT:    and a1, a1, a3
9830; RV32IA-NEXT:    sll a1, a1, a0
9831; RV32IA-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
9832; RV32IA-NEXT:    lr.w a3, (a2)
9833; RV32IA-NEXT:    mv a5, a1
9834; RV32IA-NEXT:    xor a5, a3, a5
9835; RV32IA-NEXT:    and a5, a5, a4
9836; RV32IA-NEXT:    xor a5, a3, a5
9837; RV32IA-NEXT:    sc.w a5, a5, (a2)
9838; RV32IA-NEXT:    bnez a5, .LBB65_1
9839; RV32IA-NEXT:  # %bb.2:
9840; RV32IA-NEXT:    srl a0, a3, a0
9841; RV32IA-NEXT:    ret
9842;
9843; RV64I-LABEL: atomicrmw_xchg_i16_monotonic:
9844; RV64I:       # %bb.0:
9845; RV64I-NEXT:    addi sp, sp, -16
9846; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9847; RV64I-NEXT:    li a2, 0
9848; RV64I-NEXT:    call __atomic_exchange_2
9849; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9850; RV64I-NEXT:    addi sp, sp, 16
9851; RV64I-NEXT:    ret
9852;
9853; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i16_monotonic:
9854; RV64IA-NOZACAS:       # %bb.0:
9855; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
9856; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
9857; RV64IA-NOZACAS-NEXT:    lui a3, 16
9858; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
9859; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
9860; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
9861; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
9862; RV64IA-NOZACAS-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
9863; RV64IA-NOZACAS-NEXT:    lr.w a3, (a2)
9864; RV64IA-NOZACAS-NEXT:    mv a5, a1
9865; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
9866; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
9867; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
9868; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
9869; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB65_1
9870; RV64IA-NOZACAS-NEXT:  # %bb.2:
9871; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
9872; RV64IA-NOZACAS-NEXT:    ret
9873;
9874; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i16_monotonic:
9875; RV64IA-ZACAS:       # %bb.0:
9876; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
9877; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
9878; RV64IA-ZACAS-NEXT:    lui a3, 16
9879; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
9880; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
9881; RV64IA-ZACAS-NEXT:    and a1, a1, a3
9882; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
9883; RV64IA-ZACAS-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
9884; RV64IA-ZACAS-NEXT:    lr.w a3, (a2)
9885; RV64IA-ZACAS-NEXT:    mv a5, a1
9886; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
9887; RV64IA-ZACAS-NEXT:    and a5, a5, a4
9888; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
9889; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
9890; RV64IA-ZACAS-NEXT:    bnez a5, .LBB65_1
9891; RV64IA-ZACAS-NEXT:  # %bb.2:
9892; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
9893; RV64IA-ZACAS-NEXT:    ret
9894;
9895; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_monotonic:
9896; RV64IA-WMO-ZABHA:       # %bb.0:
9897; RV64IA-WMO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
9898; RV64IA-WMO-ZABHA-NEXT:    ret
9899;
9900; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_monotonic:
9901; RV64IA-TSO-ZABHA:       # %bb.0:
9902; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
9903; RV64IA-TSO-ZABHA-NEXT:    ret
9904  %1 = atomicrmw xchg ptr %a, i16 %b monotonic
9905  ret i16 %1
9906}
9907
9908define i16 @atomicrmw_xchg_i16_acquire(ptr %a, i16 %b) nounwind {
9909; RV32I-LABEL: atomicrmw_xchg_i16_acquire:
9910; RV32I:       # %bb.0:
9911; RV32I-NEXT:    addi sp, sp, -16
9912; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
9913; RV32I-NEXT:    li a2, 2
9914; RV32I-NEXT:    call __atomic_exchange_2
9915; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9916; RV32I-NEXT:    addi sp, sp, 16
9917; RV32I-NEXT:    ret
9918;
9919; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_acquire:
9920; RV32IA-WMO:       # %bb.0:
9921; RV32IA-WMO-NEXT:    andi a2, a0, -4
9922; RV32IA-WMO-NEXT:    slli a0, a0, 3
9923; RV32IA-WMO-NEXT:    lui a3, 16
9924; RV32IA-WMO-NEXT:    addi a3, a3, -1
9925; RV32IA-WMO-NEXT:    sll a4, a3, a0
9926; RV32IA-WMO-NEXT:    and a1, a1, a3
9927; RV32IA-WMO-NEXT:    sll a1, a1, a0
9928; RV32IA-WMO-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
9929; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
9930; RV32IA-WMO-NEXT:    mv a5, a1
9931; RV32IA-WMO-NEXT:    xor a5, a3, a5
9932; RV32IA-WMO-NEXT:    and a5, a5, a4
9933; RV32IA-WMO-NEXT:    xor a5, a3, a5
9934; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
9935; RV32IA-WMO-NEXT:    bnez a5, .LBB66_1
9936; RV32IA-WMO-NEXT:  # %bb.2:
9937; RV32IA-WMO-NEXT:    srl a0, a3, a0
9938; RV32IA-WMO-NEXT:    ret
9939;
9940; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_acquire:
9941; RV32IA-TSO:       # %bb.0:
9942; RV32IA-TSO-NEXT:    andi a2, a0, -4
9943; RV32IA-TSO-NEXT:    slli a0, a0, 3
9944; RV32IA-TSO-NEXT:    lui a3, 16
9945; RV32IA-TSO-NEXT:    addi a3, a3, -1
9946; RV32IA-TSO-NEXT:    sll a4, a3, a0
9947; RV32IA-TSO-NEXT:    and a1, a1, a3
9948; RV32IA-TSO-NEXT:    sll a1, a1, a0
9949; RV32IA-TSO-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
9950; RV32IA-TSO-NEXT:    lr.w a3, (a2)
9951; RV32IA-TSO-NEXT:    mv a5, a1
9952; RV32IA-TSO-NEXT:    xor a5, a3, a5
9953; RV32IA-TSO-NEXT:    and a5, a5, a4
9954; RV32IA-TSO-NEXT:    xor a5, a3, a5
9955; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
9956; RV32IA-TSO-NEXT:    bnez a5, .LBB66_1
9957; RV32IA-TSO-NEXT:  # %bb.2:
9958; RV32IA-TSO-NEXT:    srl a0, a3, a0
9959; RV32IA-TSO-NEXT:    ret
9960;
9961; RV64I-LABEL: atomicrmw_xchg_i16_acquire:
9962; RV64I:       # %bb.0:
9963; RV64I-NEXT:    addi sp, sp, -16
9964; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
9965; RV64I-NEXT:    li a2, 2
9966; RV64I-NEXT:    call __atomic_exchange_2
9967; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
9968; RV64I-NEXT:    addi sp, sp, 16
9969; RV64I-NEXT:    ret
9970;
9971; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_acquire:
9972; RV64IA-WMO-NOZACAS:       # %bb.0:
9973; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
9974; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
9975; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
9976; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
9977; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
9978; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
9979; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
9980; RV64IA-WMO-NOZACAS-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
9981; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
9982; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a1
9983; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
9984; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
9985; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
9986; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
9987; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB66_1
9988; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
9989; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
9990; RV64IA-WMO-NOZACAS-NEXT:    ret
9991;
9992; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_acquire:
9993; RV64IA-TSO-NOZACAS:       # %bb.0:
9994; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
9995; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
9996; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
9997; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
9998; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
9999; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
10000; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
10001; RV64IA-TSO-NOZACAS-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
10002; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
10003; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a1
10004; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
10005; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
10006; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
10007; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
10008; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB66_1
10009; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
10010; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
10011; RV64IA-TSO-NOZACAS-NEXT:    ret
10012;
10013; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_acquire:
10014; RV64IA-WMO-ZACAS:       # %bb.0:
10015; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
10016; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
10017; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
10018; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
10019; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
10020; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
10021; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
10022; RV64IA-WMO-ZACAS-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
10023; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
10024; RV64IA-WMO-ZACAS-NEXT:    mv a5, a1
10025; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
10026; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
10027; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
10028; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
10029; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB66_1
10030; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
10031; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
10032; RV64IA-WMO-ZACAS-NEXT:    ret
10033;
10034; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_acquire:
10035; RV64IA-TSO-ZACAS:       # %bb.0:
10036; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
10037; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
10038; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
10039; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
10040; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
10041; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
10042; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
10043; RV64IA-TSO-ZACAS-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
10044; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
10045; RV64IA-TSO-ZACAS-NEXT:    mv a5, a1
10046; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
10047; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
10048; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
10049; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
10050; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB66_1
10051; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
10052; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
10053; RV64IA-TSO-ZACAS-NEXT:    ret
10054;
10055; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_acquire:
10056; RV64IA-WMO-ZABHA:       # %bb.0:
10057; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aq a0, a1, (a0)
10058; RV64IA-WMO-ZABHA-NEXT:    ret
10059;
10060; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_acquire:
10061; RV64IA-TSO-ZABHA:       # %bb.0:
10062; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
10063; RV64IA-TSO-ZABHA-NEXT:    ret
10064  %1 = atomicrmw xchg ptr %a, i16 %b acquire
10065  ret i16 %1
10066}
10067
10068define i16 @atomicrmw_xchg_i16_release(ptr %a, i16 %b) nounwind {
10069; RV32I-LABEL: atomicrmw_xchg_i16_release:
10070; RV32I:       # %bb.0:
10071; RV32I-NEXT:    addi sp, sp, -16
10072; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10073; RV32I-NEXT:    li a2, 3
10074; RV32I-NEXT:    call __atomic_exchange_2
10075; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10076; RV32I-NEXT:    addi sp, sp, 16
10077; RV32I-NEXT:    ret
10078;
10079; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_release:
10080; RV32IA-WMO:       # %bb.0:
10081; RV32IA-WMO-NEXT:    andi a2, a0, -4
10082; RV32IA-WMO-NEXT:    slli a0, a0, 3
10083; RV32IA-WMO-NEXT:    lui a3, 16
10084; RV32IA-WMO-NEXT:    addi a3, a3, -1
10085; RV32IA-WMO-NEXT:    sll a4, a3, a0
10086; RV32IA-WMO-NEXT:    and a1, a1, a3
10087; RV32IA-WMO-NEXT:    sll a1, a1, a0
10088; RV32IA-WMO-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
10089; RV32IA-WMO-NEXT:    lr.w a3, (a2)
10090; RV32IA-WMO-NEXT:    mv a5, a1
10091; RV32IA-WMO-NEXT:    xor a5, a3, a5
10092; RV32IA-WMO-NEXT:    and a5, a5, a4
10093; RV32IA-WMO-NEXT:    xor a5, a3, a5
10094; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
10095; RV32IA-WMO-NEXT:    bnez a5, .LBB67_1
10096; RV32IA-WMO-NEXT:  # %bb.2:
10097; RV32IA-WMO-NEXT:    srl a0, a3, a0
10098; RV32IA-WMO-NEXT:    ret
10099;
10100; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_release:
10101; RV32IA-TSO:       # %bb.0:
10102; RV32IA-TSO-NEXT:    andi a2, a0, -4
10103; RV32IA-TSO-NEXT:    slli a0, a0, 3
10104; RV32IA-TSO-NEXT:    lui a3, 16
10105; RV32IA-TSO-NEXT:    addi a3, a3, -1
10106; RV32IA-TSO-NEXT:    sll a4, a3, a0
10107; RV32IA-TSO-NEXT:    and a1, a1, a3
10108; RV32IA-TSO-NEXT:    sll a1, a1, a0
10109; RV32IA-TSO-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
10110; RV32IA-TSO-NEXT:    lr.w a3, (a2)
10111; RV32IA-TSO-NEXT:    mv a5, a1
10112; RV32IA-TSO-NEXT:    xor a5, a3, a5
10113; RV32IA-TSO-NEXT:    and a5, a5, a4
10114; RV32IA-TSO-NEXT:    xor a5, a3, a5
10115; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
10116; RV32IA-TSO-NEXT:    bnez a5, .LBB67_1
10117; RV32IA-TSO-NEXT:  # %bb.2:
10118; RV32IA-TSO-NEXT:    srl a0, a3, a0
10119; RV32IA-TSO-NEXT:    ret
10120;
10121; RV64I-LABEL: atomicrmw_xchg_i16_release:
10122; RV64I:       # %bb.0:
10123; RV64I-NEXT:    addi sp, sp, -16
10124; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10125; RV64I-NEXT:    li a2, 3
10126; RV64I-NEXT:    call __atomic_exchange_2
10127; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10128; RV64I-NEXT:    addi sp, sp, 16
10129; RV64I-NEXT:    ret
10130;
10131; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_release:
10132; RV64IA-WMO-NOZACAS:       # %bb.0:
10133; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
10134; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
10135; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
10136; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
10137; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
10138; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
10139; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
10140; RV64IA-WMO-NOZACAS-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
10141; RV64IA-WMO-NOZACAS-NEXT:    lr.w a3, (a2)
10142; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a1
10143; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
10144; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
10145; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
10146; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
10147; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB67_1
10148; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
10149; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
10150; RV64IA-WMO-NOZACAS-NEXT:    ret
10151;
10152; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_release:
10153; RV64IA-TSO-NOZACAS:       # %bb.0:
10154; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
10155; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
10156; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
10157; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
10158; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
10159; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
10160; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
10161; RV64IA-TSO-NOZACAS-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
10162; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
10163; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a1
10164; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
10165; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
10166; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
10167; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
10168; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB67_1
10169; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
10170; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
10171; RV64IA-TSO-NOZACAS-NEXT:    ret
10172;
10173; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_release:
10174; RV64IA-WMO-ZACAS:       # %bb.0:
10175; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
10176; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
10177; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
10178; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
10179; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
10180; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
10181; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
10182; RV64IA-WMO-ZACAS-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
10183; RV64IA-WMO-ZACAS-NEXT:    lr.w a3, (a2)
10184; RV64IA-WMO-ZACAS-NEXT:    mv a5, a1
10185; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
10186; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
10187; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
10188; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
10189; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB67_1
10190; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
10191; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
10192; RV64IA-WMO-ZACAS-NEXT:    ret
10193;
10194; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_release:
10195; RV64IA-TSO-ZACAS:       # %bb.0:
10196; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
10197; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
10198; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
10199; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
10200; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
10201; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
10202; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
10203; RV64IA-TSO-ZACAS-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
10204; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
10205; RV64IA-TSO-ZACAS-NEXT:    mv a5, a1
10206; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
10207; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
10208; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
10209; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
10210; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB67_1
10211; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
10212; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
10213; RV64IA-TSO-ZACAS-NEXT:    ret
10214;
10215; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_release:
10216; RV64IA-WMO-ZABHA:       # %bb.0:
10217; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.rl a0, a1, (a0)
10218; RV64IA-WMO-ZABHA-NEXT:    ret
10219;
10220; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_release:
10221; RV64IA-TSO-ZABHA:       # %bb.0:
10222; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
10223; RV64IA-TSO-ZABHA-NEXT:    ret
10224  %1 = atomicrmw xchg ptr %a, i16 %b release
10225  ret i16 %1
10226}
10227
10228define i16 @atomicrmw_xchg_i16_acq_rel(ptr %a, i16 %b) nounwind {
10229; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel:
10230; RV32I:       # %bb.0:
10231; RV32I-NEXT:    addi sp, sp, -16
10232; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10233; RV32I-NEXT:    li a2, 4
10234; RV32I-NEXT:    call __atomic_exchange_2
10235; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10236; RV32I-NEXT:    addi sp, sp, 16
10237; RV32I-NEXT:    ret
10238;
10239; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_acq_rel:
10240; RV32IA-WMO:       # %bb.0:
10241; RV32IA-WMO-NEXT:    andi a2, a0, -4
10242; RV32IA-WMO-NEXT:    slli a0, a0, 3
10243; RV32IA-WMO-NEXT:    lui a3, 16
10244; RV32IA-WMO-NEXT:    addi a3, a3, -1
10245; RV32IA-WMO-NEXT:    sll a4, a3, a0
10246; RV32IA-WMO-NEXT:    and a1, a1, a3
10247; RV32IA-WMO-NEXT:    sll a1, a1, a0
10248; RV32IA-WMO-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
10249; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
10250; RV32IA-WMO-NEXT:    mv a5, a1
10251; RV32IA-WMO-NEXT:    xor a5, a3, a5
10252; RV32IA-WMO-NEXT:    and a5, a5, a4
10253; RV32IA-WMO-NEXT:    xor a5, a3, a5
10254; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
10255; RV32IA-WMO-NEXT:    bnez a5, .LBB68_1
10256; RV32IA-WMO-NEXT:  # %bb.2:
10257; RV32IA-WMO-NEXT:    srl a0, a3, a0
10258; RV32IA-WMO-NEXT:    ret
10259;
10260; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_acq_rel:
10261; RV32IA-TSO:       # %bb.0:
10262; RV32IA-TSO-NEXT:    andi a2, a0, -4
10263; RV32IA-TSO-NEXT:    slli a0, a0, 3
10264; RV32IA-TSO-NEXT:    lui a3, 16
10265; RV32IA-TSO-NEXT:    addi a3, a3, -1
10266; RV32IA-TSO-NEXT:    sll a4, a3, a0
10267; RV32IA-TSO-NEXT:    and a1, a1, a3
10268; RV32IA-TSO-NEXT:    sll a1, a1, a0
10269; RV32IA-TSO-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
10270; RV32IA-TSO-NEXT:    lr.w a3, (a2)
10271; RV32IA-TSO-NEXT:    mv a5, a1
10272; RV32IA-TSO-NEXT:    xor a5, a3, a5
10273; RV32IA-TSO-NEXT:    and a5, a5, a4
10274; RV32IA-TSO-NEXT:    xor a5, a3, a5
10275; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
10276; RV32IA-TSO-NEXT:    bnez a5, .LBB68_1
10277; RV32IA-TSO-NEXT:  # %bb.2:
10278; RV32IA-TSO-NEXT:    srl a0, a3, a0
10279; RV32IA-TSO-NEXT:    ret
10280;
10281; RV64I-LABEL: atomicrmw_xchg_i16_acq_rel:
10282; RV64I:       # %bb.0:
10283; RV64I-NEXT:    addi sp, sp, -16
10284; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10285; RV64I-NEXT:    li a2, 4
10286; RV64I-NEXT:    call __atomic_exchange_2
10287; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10288; RV64I-NEXT:    addi sp, sp, 16
10289; RV64I-NEXT:    ret
10290;
10291; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
10292; RV64IA-WMO-NOZACAS:       # %bb.0:
10293; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
10294; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
10295; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
10296; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
10297; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
10298; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
10299; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
10300; RV64IA-WMO-NOZACAS-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
10301; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
10302; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a1
10303; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
10304; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
10305; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
10306; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
10307; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB68_1
10308; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
10309; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
10310; RV64IA-WMO-NOZACAS-NEXT:    ret
10311;
10312; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
10313; RV64IA-TSO-NOZACAS:       # %bb.0:
10314; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
10315; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
10316; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
10317; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
10318; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
10319; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
10320; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
10321; RV64IA-TSO-NOZACAS-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
10322; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
10323; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a1
10324; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
10325; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
10326; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
10327; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
10328; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB68_1
10329; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
10330; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
10331; RV64IA-TSO-NOZACAS-NEXT:    ret
10332;
10333; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
10334; RV64IA-WMO-ZACAS:       # %bb.0:
10335; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
10336; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
10337; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
10338; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
10339; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
10340; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
10341; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
10342; RV64IA-WMO-ZACAS-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
10343; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
10344; RV64IA-WMO-ZACAS-NEXT:    mv a5, a1
10345; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
10346; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
10347; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
10348; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
10349; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB68_1
10350; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
10351; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
10352; RV64IA-WMO-ZACAS-NEXT:    ret
10353;
10354; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
10355; RV64IA-TSO-ZACAS:       # %bb.0:
10356; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
10357; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
10358; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
10359; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
10360; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
10361; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
10362; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
10363; RV64IA-TSO-ZACAS-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
10364; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
10365; RV64IA-TSO-ZACAS-NEXT:    mv a5, a1
10366; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
10367; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
10368; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
10369; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
10370; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB68_1
10371; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
10372; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
10373; RV64IA-TSO-ZACAS-NEXT:    ret
10374;
10375; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_acq_rel:
10376; RV64IA-WMO-ZABHA:       # %bb.0:
10377; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aqrl a0, a1, (a0)
10378; RV64IA-WMO-ZABHA-NEXT:    ret
10379;
10380; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_acq_rel:
10381; RV64IA-TSO-ZABHA:       # %bb.0:
10382; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
10383; RV64IA-TSO-ZABHA-NEXT:    ret
10384  %1 = atomicrmw xchg ptr %a, i16 %b acq_rel
10385  ret i16 %1
10386}
10387
10388define i16 @atomicrmw_xchg_i16_seq_cst(ptr %a, i16 %b) nounwind {
10389; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst:
10390; RV32I:       # %bb.0:
10391; RV32I-NEXT:    addi sp, sp, -16
10392; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10393; RV32I-NEXT:    li a2, 5
10394; RV32I-NEXT:    call __atomic_exchange_2
10395; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10396; RV32I-NEXT:    addi sp, sp, 16
10397; RV32I-NEXT:    ret
10398;
10399; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst:
10400; RV32IA:       # %bb.0:
10401; RV32IA-NEXT:    andi a2, a0, -4
10402; RV32IA-NEXT:    slli a0, a0, 3
10403; RV32IA-NEXT:    lui a3, 16
10404; RV32IA-NEXT:    addi a3, a3, -1
10405; RV32IA-NEXT:    sll a4, a3, a0
10406; RV32IA-NEXT:    and a1, a1, a3
10407; RV32IA-NEXT:    sll a1, a1, a0
10408; RV32IA-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
10409; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
10410; RV32IA-NEXT:    mv a5, a1
10411; RV32IA-NEXT:    xor a5, a3, a5
10412; RV32IA-NEXT:    and a5, a5, a4
10413; RV32IA-NEXT:    xor a5, a3, a5
10414; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
10415; RV32IA-NEXT:    bnez a5, .LBB69_1
10416; RV32IA-NEXT:  # %bb.2:
10417; RV32IA-NEXT:    srl a0, a3, a0
10418; RV32IA-NEXT:    ret
10419;
10420; RV64I-LABEL: atomicrmw_xchg_i16_seq_cst:
10421; RV64I:       # %bb.0:
10422; RV64I-NEXT:    addi sp, sp, -16
10423; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10424; RV64I-NEXT:    li a2, 5
10425; RV64I-NEXT:    call __atomic_exchange_2
10426; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10427; RV64I-NEXT:    addi sp, sp, 16
10428; RV64I-NEXT:    ret
10429;
10430; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i16_seq_cst:
10431; RV64IA-NOZACAS:       # %bb.0:
10432; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
10433; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
10434; RV64IA-NOZACAS-NEXT:    lui a3, 16
10435; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
10436; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
10437; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
10438; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
10439; RV64IA-NOZACAS-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
10440; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
10441; RV64IA-NOZACAS-NEXT:    mv a5, a1
10442; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
10443; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
10444; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
10445; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
10446; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB69_1
10447; RV64IA-NOZACAS-NEXT:  # %bb.2:
10448; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
10449; RV64IA-NOZACAS-NEXT:    ret
10450;
10451; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i16_seq_cst:
10452; RV64IA-ZACAS:       # %bb.0:
10453; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
10454; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
10455; RV64IA-ZACAS-NEXT:    lui a3, 16
10456; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
10457; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
10458; RV64IA-ZACAS-NEXT:    and a1, a1, a3
10459; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
10460; RV64IA-ZACAS-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
10461; RV64IA-ZACAS-NEXT:    lr.w.aqrl a3, (a2)
10462; RV64IA-ZACAS-NEXT:    mv a5, a1
10463; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
10464; RV64IA-ZACAS-NEXT:    and a5, a5, a4
10465; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
10466; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
10467; RV64IA-ZACAS-NEXT:    bnez a5, .LBB69_1
10468; RV64IA-ZACAS-NEXT:  # %bb.2:
10469; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
10470; RV64IA-ZACAS-NEXT:    ret
10471;
10472; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_seq_cst:
10473; RV64IA-WMO-ZABHA:       # %bb.0:
10474; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aqrl a0, a1, (a0)
10475; RV64IA-WMO-ZABHA-NEXT:    ret
10476;
10477; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_seq_cst:
10478; RV64IA-TSO-ZABHA:       # %bb.0:
10479; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
10480; RV64IA-TSO-ZABHA-NEXT:    ret
10481  %1 = atomicrmw xchg ptr %a, i16 %b seq_cst
10482  ret i16 %1
10483}
10484
10485; Ensure the following 'atomicrmw xchg a, {0,-1}` cases are lowered to an
10486; amoand or amoor with appropriate mask.
10487
10488define i16 @atomicrmw_xchg_0_i16_monotonic(ptr %a) nounwind {
10489; RV32I-LABEL: atomicrmw_xchg_0_i16_monotonic:
10490; RV32I:       # %bb.0:
10491; RV32I-NEXT:    addi sp, sp, -16
10492; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10493; RV32I-NEXT:    li a1, 0
10494; RV32I-NEXT:    li a2, 0
10495; RV32I-NEXT:    call __atomic_exchange_2
10496; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10497; RV32I-NEXT:    addi sp, sp, 16
10498; RV32I-NEXT:    ret
10499;
10500; RV32IA-LABEL: atomicrmw_xchg_0_i16_monotonic:
10501; RV32IA:       # %bb.0:
10502; RV32IA-NEXT:    andi a1, a0, -4
10503; RV32IA-NEXT:    slli a0, a0, 3
10504; RV32IA-NEXT:    lui a2, 16
10505; RV32IA-NEXT:    addi a2, a2, -1
10506; RV32IA-NEXT:    sll a2, a2, a0
10507; RV32IA-NEXT:    not a2, a2
10508; RV32IA-NEXT:    amoand.w a1, a2, (a1)
10509; RV32IA-NEXT:    srl a0, a1, a0
10510; RV32IA-NEXT:    ret
10511;
10512; RV64I-LABEL: atomicrmw_xchg_0_i16_monotonic:
10513; RV64I:       # %bb.0:
10514; RV64I-NEXT:    addi sp, sp, -16
10515; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10516; RV64I-NEXT:    li a1, 0
10517; RV64I-NEXT:    li a2, 0
10518; RV64I-NEXT:    call __atomic_exchange_2
10519; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10520; RV64I-NEXT:    addi sp, sp, 16
10521; RV64I-NEXT:    ret
10522;
10523; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_0_i16_monotonic:
10524; RV64IA-NOZACAS:       # %bb.0:
10525; RV64IA-NOZACAS-NEXT:    andi a1, a0, -4
10526; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
10527; RV64IA-NOZACAS-NEXT:    lui a2, 16
10528; RV64IA-NOZACAS-NEXT:    addi a2, a2, -1
10529; RV64IA-NOZACAS-NEXT:    sllw a2, a2, a0
10530; RV64IA-NOZACAS-NEXT:    not a2, a2
10531; RV64IA-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
10532; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
10533; RV64IA-NOZACAS-NEXT:    ret
10534;
10535; RV64IA-ZACAS-LABEL: atomicrmw_xchg_0_i16_monotonic:
10536; RV64IA-ZACAS:       # %bb.0:
10537; RV64IA-ZACAS-NEXT:    andi a1, a0, -4
10538; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
10539; RV64IA-ZACAS-NEXT:    lui a2, 16
10540; RV64IA-ZACAS-NEXT:    addi a2, a2, -1
10541; RV64IA-ZACAS-NEXT:    sllw a2, a2, a0
10542; RV64IA-ZACAS-NEXT:    not a2, a2
10543; RV64IA-ZACAS-NEXT:    amoand.w a1, a2, (a1)
10544; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
10545; RV64IA-ZACAS-NEXT:    ret
10546;
10547; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_monotonic:
10548; RV64IA-WMO-ZABHA:       # %bb.0:
10549; RV64IA-WMO-ZABHA-NEXT:    amoswap.h a0, zero, (a0)
10550; RV64IA-WMO-ZABHA-NEXT:    ret
10551;
10552; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_monotonic:
10553; RV64IA-TSO-ZABHA:       # %bb.0:
10554; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, zero, (a0)
10555; RV64IA-TSO-ZABHA-NEXT:    ret
10556  %1 = atomicrmw xchg ptr %a, i16 0 monotonic
10557  ret i16 %1
10558}
10559
10560define i16 @atomicrmw_xchg_0_i16_acquire(ptr %a) nounwind {
10561; RV32I-LABEL: atomicrmw_xchg_0_i16_acquire:
10562; RV32I:       # %bb.0:
10563; RV32I-NEXT:    addi sp, sp, -16
10564; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10565; RV32I-NEXT:    li a2, 2
10566; RV32I-NEXT:    li a1, 0
10567; RV32I-NEXT:    call __atomic_exchange_2
10568; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10569; RV32I-NEXT:    addi sp, sp, 16
10570; RV32I-NEXT:    ret
10571;
10572; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_acquire:
10573; RV32IA-WMO:       # %bb.0:
10574; RV32IA-WMO-NEXT:    andi a1, a0, -4
10575; RV32IA-WMO-NEXT:    slli a0, a0, 3
10576; RV32IA-WMO-NEXT:    lui a2, 16
10577; RV32IA-WMO-NEXT:    addi a2, a2, -1
10578; RV32IA-WMO-NEXT:    sll a2, a2, a0
10579; RV32IA-WMO-NEXT:    not a2, a2
10580; RV32IA-WMO-NEXT:    amoand.w.aq a1, a2, (a1)
10581; RV32IA-WMO-NEXT:    srl a0, a1, a0
10582; RV32IA-WMO-NEXT:    ret
10583;
10584; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_acquire:
10585; RV32IA-TSO:       # %bb.0:
10586; RV32IA-TSO-NEXT:    andi a1, a0, -4
10587; RV32IA-TSO-NEXT:    slli a0, a0, 3
10588; RV32IA-TSO-NEXT:    lui a2, 16
10589; RV32IA-TSO-NEXT:    addi a2, a2, -1
10590; RV32IA-TSO-NEXT:    sll a2, a2, a0
10591; RV32IA-TSO-NEXT:    not a2, a2
10592; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
10593; RV32IA-TSO-NEXT:    srl a0, a1, a0
10594; RV32IA-TSO-NEXT:    ret
10595;
10596; RV64I-LABEL: atomicrmw_xchg_0_i16_acquire:
10597; RV64I:       # %bb.0:
10598; RV64I-NEXT:    addi sp, sp, -16
10599; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10600; RV64I-NEXT:    li a2, 2
10601; RV64I-NEXT:    li a1, 0
10602; RV64I-NEXT:    call __atomic_exchange_2
10603; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10604; RV64I-NEXT:    addi sp, sp, 16
10605; RV64I-NEXT:    ret
10606;
10607; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
10608; RV64IA-WMO-NOZACAS:       # %bb.0:
10609; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
10610; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
10611; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
10612; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
10613; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
10614; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
10615; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aq a1, a2, (a1)
10616; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
10617; RV64IA-WMO-NOZACAS-NEXT:    ret
10618;
10619; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
10620; RV64IA-TSO-NOZACAS:       # %bb.0:
10621; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
10622; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
10623; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
10624; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
10625; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
10626; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
10627; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
10628; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
10629; RV64IA-TSO-NOZACAS-NEXT:    ret
10630;
10631; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
10632; RV64IA-WMO-ZACAS:       # %bb.0:
10633; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
10634; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
10635; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
10636; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
10637; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
10638; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
10639; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aq a1, a2, (a1)
10640; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
10641; RV64IA-WMO-ZACAS-NEXT:    ret
10642;
10643; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
10644; RV64IA-TSO-ZACAS:       # %bb.0:
10645; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
10646; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
10647; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
10648; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
10649; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
10650; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
10651; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
10652; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
10653; RV64IA-TSO-ZACAS-NEXT:    ret
10654;
10655; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acquire:
10656; RV64IA-WMO-ZABHA:       # %bb.0:
10657; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aq a0, zero, (a0)
10658; RV64IA-WMO-ZABHA-NEXT:    ret
10659;
10660; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acquire:
10661; RV64IA-TSO-ZABHA:       # %bb.0:
10662; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, zero, (a0)
10663; RV64IA-TSO-ZABHA-NEXT:    ret
10664  %1 = atomicrmw xchg ptr %a, i16 0 acquire
10665  ret i16 %1
10666}
10667
10668define i16 @atomicrmw_xchg_0_i16_release(ptr %a) nounwind {
10669; RV32I-LABEL: atomicrmw_xchg_0_i16_release:
10670; RV32I:       # %bb.0:
10671; RV32I-NEXT:    addi sp, sp, -16
10672; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10673; RV32I-NEXT:    li a2, 3
10674; RV32I-NEXT:    li a1, 0
10675; RV32I-NEXT:    call __atomic_exchange_2
10676; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10677; RV32I-NEXT:    addi sp, sp, 16
10678; RV32I-NEXT:    ret
10679;
10680; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_release:
10681; RV32IA-WMO:       # %bb.0:
10682; RV32IA-WMO-NEXT:    andi a1, a0, -4
10683; RV32IA-WMO-NEXT:    slli a0, a0, 3
10684; RV32IA-WMO-NEXT:    lui a2, 16
10685; RV32IA-WMO-NEXT:    addi a2, a2, -1
10686; RV32IA-WMO-NEXT:    sll a2, a2, a0
10687; RV32IA-WMO-NEXT:    not a2, a2
10688; RV32IA-WMO-NEXT:    amoand.w.rl a1, a2, (a1)
10689; RV32IA-WMO-NEXT:    srl a0, a1, a0
10690; RV32IA-WMO-NEXT:    ret
10691;
10692; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_release:
10693; RV32IA-TSO:       # %bb.0:
10694; RV32IA-TSO-NEXT:    andi a1, a0, -4
10695; RV32IA-TSO-NEXT:    slli a0, a0, 3
10696; RV32IA-TSO-NEXT:    lui a2, 16
10697; RV32IA-TSO-NEXT:    addi a2, a2, -1
10698; RV32IA-TSO-NEXT:    sll a2, a2, a0
10699; RV32IA-TSO-NEXT:    not a2, a2
10700; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
10701; RV32IA-TSO-NEXT:    srl a0, a1, a0
10702; RV32IA-TSO-NEXT:    ret
10703;
10704; RV64I-LABEL: atomicrmw_xchg_0_i16_release:
10705; RV64I:       # %bb.0:
10706; RV64I-NEXT:    addi sp, sp, -16
10707; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10708; RV64I-NEXT:    li a2, 3
10709; RV64I-NEXT:    li a1, 0
10710; RV64I-NEXT:    call __atomic_exchange_2
10711; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10712; RV64I-NEXT:    addi sp, sp, 16
10713; RV64I-NEXT:    ret
10714;
10715; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_release:
10716; RV64IA-WMO-NOZACAS:       # %bb.0:
10717; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
10718; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
10719; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
10720; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
10721; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
10722; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
10723; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.rl a1, a2, (a1)
10724; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
10725; RV64IA-WMO-NOZACAS-NEXT:    ret
10726;
10727; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_release:
10728; RV64IA-TSO-NOZACAS:       # %bb.0:
10729; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
10730; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
10731; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
10732; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
10733; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
10734; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
10735; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
10736; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
10737; RV64IA-TSO-NOZACAS-NEXT:    ret
10738;
10739; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_release:
10740; RV64IA-WMO-ZACAS:       # %bb.0:
10741; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
10742; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
10743; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
10744; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
10745; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
10746; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
10747; RV64IA-WMO-ZACAS-NEXT:    amoand.w.rl a1, a2, (a1)
10748; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
10749; RV64IA-WMO-ZACAS-NEXT:    ret
10750;
10751; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_release:
10752; RV64IA-TSO-ZACAS:       # %bb.0:
10753; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
10754; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
10755; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
10756; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
10757; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
10758; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
10759; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
10760; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
10761; RV64IA-TSO-ZACAS-NEXT:    ret
10762;
10763; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_release:
10764; RV64IA-WMO-ZABHA:       # %bb.0:
10765; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.rl a0, zero, (a0)
10766; RV64IA-WMO-ZABHA-NEXT:    ret
10767;
10768; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_release:
10769; RV64IA-TSO-ZABHA:       # %bb.0:
10770; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, zero, (a0)
10771; RV64IA-TSO-ZABHA-NEXT:    ret
10772  %1 = atomicrmw xchg ptr %a, i16 0 release
10773  ret i16 %1
10774}
10775
10776define i16 @atomicrmw_xchg_0_i16_acq_rel(ptr %a) nounwind {
10777; RV32I-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10778; RV32I:       # %bb.0:
10779; RV32I-NEXT:    addi sp, sp, -16
10780; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10781; RV32I-NEXT:    li a2, 4
10782; RV32I-NEXT:    li a1, 0
10783; RV32I-NEXT:    call __atomic_exchange_2
10784; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10785; RV32I-NEXT:    addi sp, sp, 16
10786; RV32I-NEXT:    ret
10787;
10788; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10789; RV32IA-WMO:       # %bb.0:
10790; RV32IA-WMO-NEXT:    andi a1, a0, -4
10791; RV32IA-WMO-NEXT:    slli a0, a0, 3
10792; RV32IA-WMO-NEXT:    lui a2, 16
10793; RV32IA-WMO-NEXT:    addi a2, a2, -1
10794; RV32IA-WMO-NEXT:    sll a2, a2, a0
10795; RV32IA-WMO-NEXT:    not a2, a2
10796; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a2, (a1)
10797; RV32IA-WMO-NEXT:    srl a0, a1, a0
10798; RV32IA-WMO-NEXT:    ret
10799;
10800; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10801; RV32IA-TSO:       # %bb.0:
10802; RV32IA-TSO-NEXT:    andi a1, a0, -4
10803; RV32IA-TSO-NEXT:    slli a0, a0, 3
10804; RV32IA-TSO-NEXT:    lui a2, 16
10805; RV32IA-TSO-NEXT:    addi a2, a2, -1
10806; RV32IA-TSO-NEXT:    sll a2, a2, a0
10807; RV32IA-TSO-NEXT:    not a2, a2
10808; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
10809; RV32IA-TSO-NEXT:    srl a0, a1, a0
10810; RV32IA-TSO-NEXT:    ret
10811;
10812; RV64I-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10813; RV64I:       # %bb.0:
10814; RV64I-NEXT:    addi sp, sp, -16
10815; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10816; RV64I-NEXT:    li a2, 4
10817; RV64I-NEXT:    li a1, 0
10818; RV64I-NEXT:    call __atomic_exchange_2
10819; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10820; RV64I-NEXT:    addi sp, sp, 16
10821; RV64I-NEXT:    ret
10822;
10823; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10824; RV64IA-WMO-NOZACAS:       # %bb.0:
10825; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
10826; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
10827; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
10828; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
10829; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
10830; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
10831; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
10832; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
10833; RV64IA-WMO-NOZACAS-NEXT:    ret
10834;
10835; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10836; RV64IA-TSO-NOZACAS:       # %bb.0:
10837; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
10838; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
10839; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
10840; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
10841; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
10842; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
10843; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
10844; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
10845; RV64IA-TSO-NOZACAS-NEXT:    ret
10846;
10847; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10848; RV64IA-WMO-ZACAS:       # %bb.0:
10849; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
10850; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
10851; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
10852; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
10853; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
10854; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
10855; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
10856; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
10857; RV64IA-WMO-ZACAS-NEXT:    ret
10858;
10859; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10860; RV64IA-TSO-ZACAS:       # %bb.0:
10861; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
10862; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
10863; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
10864; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
10865; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
10866; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
10867; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
10868; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
10869; RV64IA-TSO-ZACAS-NEXT:    ret
10870;
10871; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10872; RV64IA-WMO-ZABHA:       # %bb.0:
10873; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aqrl a0, zero, (a0)
10874; RV64IA-WMO-ZABHA-NEXT:    ret
10875;
10876; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acq_rel:
10877; RV64IA-TSO-ZABHA:       # %bb.0:
10878; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, zero, (a0)
10879; RV64IA-TSO-ZABHA-NEXT:    ret
10880  %1 = atomicrmw xchg ptr %a, i16 0 acq_rel
10881  ret i16 %1
10882}
10883
10884define i16 @atomicrmw_xchg_0_i16_seq_cst(ptr %a) nounwind {
10885; RV32I-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10886; RV32I:       # %bb.0:
10887; RV32I-NEXT:    addi sp, sp, -16
10888; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10889; RV32I-NEXT:    li a2, 5
10890; RV32I-NEXT:    li a1, 0
10891; RV32I-NEXT:    call __atomic_exchange_2
10892; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10893; RV32I-NEXT:    addi sp, sp, 16
10894; RV32I-NEXT:    ret
10895;
10896; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10897; RV32IA-WMO:       # %bb.0:
10898; RV32IA-WMO-NEXT:    andi a1, a0, -4
10899; RV32IA-WMO-NEXT:    slli a0, a0, 3
10900; RV32IA-WMO-NEXT:    lui a2, 16
10901; RV32IA-WMO-NEXT:    addi a2, a2, -1
10902; RV32IA-WMO-NEXT:    sll a2, a2, a0
10903; RV32IA-WMO-NEXT:    not a2, a2
10904; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a2, (a1)
10905; RV32IA-WMO-NEXT:    srl a0, a1, a0
10906; RV32IA-WMO-NEXT:    ret
10907;
10908; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10909; RV32IA-TSO:       # %bb.0:
10910; RV32IA-TSO-NEXT:    andi a1, a0, -4
10911; RV32IA-TSO-NEXT:    slli a0, a0, 3
10912; RV32IA-TSO-NEXT:    lui a2, 16
10913; RV32IA-TSO-NEXT:    addi a2, a2, -1
10914; RV32IA-TSO-NEXT:    sll a2, a2, a0
10915; RV32IA-TSO-NEXT:    not a2, a2
10916; RV32IA-TSO-NEXT:    amoand.w a1, a2, (a1)
10917; RV32IA-TSO-NEXT:    srl a0, a1, a0
10918; RV32IA-TSO-NEXT:    ret
10919;
10920; RV64I-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10921; RV64I:       # %bb.0:
10922; RV64I-NEXT:    addi sp, sp, -16
10923; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
10924; RV64I-NEXT:    li a2, 5
10925; RV64I-NEXT:    li a1, 0
10926; RV64I-NEXT:    call __atomic_exchange_2
10927; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10928; RV64I-NEXT:    addi sp, sp, 16
10929; RV64I-NEXT:    ret
10930;
10931; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10932; RV64IA-WMO-NOZACAS:       # %bb.0:
10933; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
10934; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
10935; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
10936; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
10937; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
10938; RV64IA-WMO-NOZACAS-NEXT:    not a2, a2
10939; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
10940; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
10941; RV64IA-WMO-NOZACAS-NEXT:    ret
10942;
10943; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10944; RV64IA-TSO-NOZACAS:       # %bb.0:
10945; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
10946; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
10947; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
10948; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
10949; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
10950; RV64IA-TSO-NOZACAS-NEXT:    not a2, a2
10951; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a2, (a1)
10952; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
10953; RV64IA-TSO-NOZACAS-NEXT:    ret
10954;
10955; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10956; RV64IA-WMO-ZACAS:       # %bb.0:
10957; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
10958; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
10959; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
10960; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
10961; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
10962; RV64IA-WMO-ZACAS-NEXT:    not a2, a2
10963; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a2, (a1)
10964; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
10965; RV64IA-WMO-ZACAS-NEXT:    ret
10966;
10967; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10968; RV64IA-TSO-ZACAS:       # %bb.0:
10969; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
10970; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
10971; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
10972; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
10973; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
10974; RV64IA-TSO-ZACAS-NEXT:    not a2, a2
10975; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a2, (a1)
10976; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
10977; RV64IA-TSO-ZACAS-NEXT:    ret
10978;
10979; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10980; RV64IA-WMO-ZABHA:       # %bb.0:
10981; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aqrl a0, zero, (a0)
10982; RV64IA-WMO-ZABHA-NEXT:    ret
10983;
10984; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_seq_cst:
10985; RV64IA-TSO-ZABHA:       # %bb.0:
10986; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, zero, (a0)
10987; RV64IA-TSO-ZABHA-NEXT:    ret
10988  %1 = atomicrmw xchg ptr %a, i16 0 seq_cst
10989  ret i16 %1
10990}
10991
10992define i16 @atomicrmw_xchg_minus_1_i16_monotonic(ptr %a) nounwind {
10993; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
10994; RV32I:       # %bb.0:
10995; RV32I-NEXT:    addi sp, sp, -16
10996; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10997; RV32I-NEXT:    lui a1, 16
10998; RV32I-NEXT:    addi a1, a1, -1
10999; RV32I-NEXT:    li a2, 0
11000; RV32I-NEXT:    call __atomic_exchange_2
11001; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11002; RV32I-NEXT:    addi sp, sp, 16
11003; RV32I-NEXT:    ret
11004;
11005; RV32IA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
11006; RV32IA:       # %bb.0:
11007; RV32IA-NEXT:    andi a1, a0, -4
11008; RV32IA-NEXT:    slli a0, a0, 3
11009; RV32IA-NEXT:    lui a2, 16
11010; RV32IA-NEXT:    addi a2, a2, -1
11011; RV32IA-NEXT:    sll a2, a2, a0
11012; RV32IA-NEXT:    amoor.w a1, a2, (a1)
11013; RV32IA-NEXT:    srl a0, a1, a0
11014; RV32IA-NEXT:    ret
11015;
11016; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
11017; RV64I:       # %bb.0:
11018; RV64I-NEXT:    addi sp, sp, -16
11019; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11020; RV64I-NEXT:    lui a1, 16
11021; RV64I-NEXT:    addiw a1, a1, -1
11022; RV64I-NEXT:    li a2, 0
11023; RV64I-NEXT:    call __atomic_exchange_2
11024; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11025; RV64I-NEXT:    addi sp, sp, 16
11026; RV64I-NEXT:    ret
11027;
11028; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
11029; RV64IA-NOZACAS:       # %bb.0:
11030; RV64IA-NOZACAS-NEXT:    andi a1, a0, -4
11031; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
11032; RV64IA-NOZACAS-NEXT:    lui a2, 16
11033; RV64IA-NOZACAS-NEXT:    addi a2, a2, -1
11034; RV64IA-NOZACAS-NEXT:    sllw a2, a2, a0
11035; RV64IA-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
11036; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
11037; RV64IA-NOZACAS-NEXT:    ret
11038;
11039; RV64IA-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
11040; RV64IA-ZACAS:       # %bb.0:
11041; RV64IA-ZACAS-NEXT:    andi a1, a0, -4
11042; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
11043; RV64IA-ZACAS-NEXT:    lui a2, 16
11044; RV64IA-ZACAS-NEXT:    addi a2, a2, -1
11045; RV64IA-ZACAS-NEXT:    sllw a2, a2, a0
11046; RV64IA-ZACAS-NEXT:    amoor.w a1, a2, (a1)
11047; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
11048; RV64IA-ZACAS-NEXT:    ret
11049;
11050; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
11051; RV64IA-WMO-ZABHA:       # %bb.0:
11052; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
11053; RV64IA-WMO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
11054; RV64IA-WMO-ZABHA-NEXT:    ret
11055;
11056; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
11057; RV64IA-TSO-ZABHA:       # %bb.0:
11058; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
11059; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
11060; RV64IA-TSO-ZABHA-NEXT:    ret
11061  %1 = atomicrmw xchg ptr %a, i16 -1 monotonic
11062  ret i16 %1
11063}
11064
11065define i16 @atomicrmw_xchg_minus_1_i16_acquire(ptr %a) nounwind {
11066; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11067; RV32I:       # %bb.0:
11068; RV32I-NEXT:    addi sp, sp, -16
11069; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11070; RV32I-NEXT:    lui a1, 16
11071; RV32I-NEXT:    addi a1, a1, -1
11072; RV32I-NEXT:    li a2, 2
11073; RV32I-NEXT:    call __atomic_exchange_2
11074; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11075; RV32I-NEXT:    addi sp, sp, 16
11076; RV32I-NEXT:    ret
11077;
11078; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11079; RV32IA-WMO:       # %bb.0:
11080; RV32IA-WMO-NEXT:    andi a1, a0, -4
11081; RV32IA-WMO-NEXT:    slli a0, a0, 3
11082; RV32IA-WMO-NEXT:    lui a2, 16
11083; RV32IA-WMO-NEXT:    addi a2, a2, -1
11084; RV32IA-WMO-NEXT:    sll a2, a2, a0
11085; RV32IA-WMO-NEXT:    amoor.w.aq a1, a2, (a1)
11086; RV32IA-WMO-NEXT:    srl a0, a1, a0
11087; RV32IA-WMO-NEXT:    ret
11088;
11089; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11090; RV32IA-TSO:       # %bb.0:
11091; RV32IA-TSO-NEXT:    andi a1, a0, -4
11092; RV32IA-TSO-NEXT:    slli a0, a0, 3
11093; RV32IA-TSO-NEXT:    lui a2, 16
11094; RV32IA-TSO-NEXT:    addi a2, a2, -1
11095; RV32IA-TSO-NEXT:    sll a2, a2, a0
11096; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
11097; RV32IA-TSO-NEXT:    srl a0, a1, a0
11098; RV32IA-TSO-NEXT:    ret
11099;
11100; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11101; RV64I:       # %bb.0:
11102; RV64I-NEXT:    addi sp, sp, -16
11103; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11104; RV64I-NEXT:    lui a1, 16
11105; RV64I-NEXT:    addiw a1, a1, -1
11106; RV64I-NEXT:    li a2, 2
11107; RV64I-NEXT:    call __atomic_exchange_2
11108; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11109; RV64I-NEXT:    addi sp, sp, 16
11110; RV64I-NEXT:    ret
11111;
11112; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11113; RV64IA-WMO-NOZACAS:       # %bb.0:
11114; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
11115; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
11116; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
11117; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
11118; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
11119; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aq a1, a2, (a1)
11120; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
11121; RV64IA-WMO-NOZACAS-NEXT:    ret
11122;
11123; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11124; RV64IA-TSO-NOZACAS:       # %bb.0:
11125; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
11126; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
11127; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
11128; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
11129; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
11130; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
11131; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
11132; RV64IA-TSO-NOZACAS-NEXT:    ret
11133;
11134; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11135; RV64IA-WMO-ZACAS:       # %bb.0:
11136; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
11137; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
11138; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
11139; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
11140; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
11141; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aq a1, a2, (a1)
11142; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
11143; RV64IA-WMO-ZACAS-NEXT:    ret
11144;
11145; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11146; RV64IA-TSO-ZACAS:       # %bb.0:
11147; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
11148; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
11149; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
11150; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
11151; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
11152; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
11153; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
11154; RV64IA-TSO-ZACAS-NEXT:    ret
11155;
11156; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11157; RV64IA-WMO-ZABHA:       # %bb.0:
11158; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
11159; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aq a0, a1, (a0)
11160; RV64IA-WMO-ZABHA-NEXT:    ret
11161;
11162; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
11163; RV64IA-TSO-ZABHA:       # %bb.0:
11164; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
11165; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
11166; RV64IA-TSO-ZABHA-NEXT:    ret
11167  %1 = atomicrmw xchg ptr %a, i16 -1 acquire
11168  ret i16 %1
11169}
11170
11171define i16 @atomicrmw_xchg_minus_1_i16_release(ptr %a) nounwind {
11172; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_release:
11173; RV32I:       # %bb.0:
11174; RV32I-NEXT:    addi sp, sp, -16
11175; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11176; RV32I-NEXT:    lui a1, 16
11177; RV32I-NEXT:    addi a1, a1, -1
11178; RV32I-NEXT:    li a2, 3
11179; RV32I-NEXT:    call __atomic_exchange_2
11180; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11181; RV32I-NEXT:    addi sp, sp, 16
11182; RV32I-NEXT:    ret
11183;
11184; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_release:
11185; RV32IA-WMO:       # %bb.0:
11186; RV32IA-WMO-NEXT:    andi a1, a0, -4
11187; RV32IA-WMO-NEXT:    slli a0, a0, 3
11188; RV32IA-WMO-NEXT:    lui a2, 16
11189; RV32IA-WMO-NEXT:    addi a2, a2, -1
11190; RV32IA-WMO-NEXT:    sll a2, a2, a0
11191; RV32IA-WMO-NEXT:    amoor.w.rl a1, a2, (a1)
11192; RV32IA-WMO-NEXT:    srl a0, a1, a0
11193; RV32IA-WMO-NEXT:    ret
11194;
11195; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_release:
11196; RV32IA-TSO:       # %bb.0:
11197; RV32IA-TSO-NEXT:    andi a1, a0, -4
11198; RV32IA-TSO-NEXT:    slli a0, a0, 3
11199; RV32IA-TSO-NEXT:    lui a2, 16
11200; RV32IA-TSO-NEXT:    addi a2, a2, -1
11201; RV32IA-TSO-NEXT:    sll a2, a2, a0
11202; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
11203; RV32IA-TSO-NEXT:    srl a0, a1, a0
11204; RV32IA-TSO-NEXT:    ret
11205;
11206; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_release:
11207; RV64I:       # %bb.0:
11208; RV64I-NEXT:    addi sp, sp, -16
11209; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11210; RV64I-NEXT:    lui a1, 16
11211; RV64I-NEXT:    addiw a1, a1, -1
11212; RV64I-NEXT:    li a2, 3
11213; RV64I-NEXT:    call __atomic_exchange_2
11214; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11215; RV64I-NEXT:    addi sp, sp, 16
11216; RV64I-NEXT:    ret
11217;
11218; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
11219; RV64IA-WMO-NOZACAS:       # %bb.0:
11220; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
11221; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
11222; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
11223; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
11224; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
11225; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.rl a1, a2, (a1)
11226; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
11227; RV64IA-WMO-NOZACAS-NEXT:    ret
11228;
11229; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
11230; RV64IA-TSO-NOZACAS:       # %bb.0:
11231; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
11232; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
11233; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
11234; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
11235; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
11236; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
11237; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
11238; RV64IA-TSO-NOZACAS-NEXT:    ret
11239;
11240; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
11241; RV64IA-WMO-ZACAS:       # %bb.0:
11242; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
11243; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
11244; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
11245; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
11246; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
11247; RV64IA-WMO-ZACAS-NEXT:    amoor.w.rl a1, a2, (a1)
11248; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
11249; RV64IA-WMO-ZACAS-NEXT:    ret
11250;
11251; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
11252; RV64IA-TSO-ZACAS:       # %bb.0:
11253; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
11254; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
11255; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
11256; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
11257; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
11258; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
11259; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
11260; RV64IA-TSO-ZACAS-NEXT:    ret
11261;
11262; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_release:
11263; RV64IA-WMO-ZABHA:       # %bb.0:
11264; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
11265; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.rl a0, a1, (a0)
11266; RV64IA-WMO-ZABHA-NEXT:    ret
11267;
11268; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_release:
11269; RV64IA-TSO-ZABHA:       # %bb.0:
11270; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
11271; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
11272; RV64IA-TSO-ZABHA-NEXT:    ret
11273  %1 = atomicrmw xchg ptr %a, i16 -1 release
11274  ret i16 %1
11275}
11276
11277define i16 @atomicrmw_xchg_minus_1_i16_acq_rel(ptr %a) nounwind {
11278; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11279; RV32I:       # %bb.0:
11280; RV32I-NEXT:    addi sp, sp, -16
11281; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11282; RV32I-NEXT:    lui a1, 16
11283; RV32I-NEXT:    addi a1, a1, -1
11284; RV32I-NEXT:    li a2, 4
11285; RV32I-NEXT:    call __atomic_exchange_2
11286; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11287; RV32I-NEXT:    addi sp, sp, 16
11288; RV32I-NEXT:    ret
11289;
11290; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11291; RV32IA-WMO:       # %bb.0:
11292; RV32IA-WMO-NEXT:    andi a1, a0, -4
11293; RV32IA-WMO-NEXT:    slli a0, a0, 3
11294; RV32IA-WMO-NEXT:    lui a2, 16
11295; RV32IA-WMO-NEXT:    addi a2, a2, -1
11296; RV32IA-WMO-NEXT:    sll a2, a2, a0
11297; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a2, (a1)
11298; RV32IA-WMO-NEXT:    srl a0, a1, a0
11299; RV32IA-WMO-NEXT:    ret
11300;
11301; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11302; RV32IA-TSO:       # %bb.0:
11303; RV32IA-TSO-NEXT:    andi a1, a0, -4
11304; RV32IA-TSO-NEXT:    slli a0, a0, 3
11305; RV32IA-TSO-NEXT:    lui a2, 16
11306; RV32IA-TSO-NEXT:    addi a2, a2, -1
11307; RV32IA-TSO-NEXT:    sll a2, a2, a0
11308; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
11309; RV32IA-TSO-NEXT:    srl a0, a1, a0
11310; RV32IA-TSO-NEXT:    ret
11311;
11312; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11313; RV64I:       # %bb.0:
11314; RV64I-NEXT:    addi sp, sp, -16
11315; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11316; RV64I-NEXT:    lui a1, 16
11317; RV64I-NEXT:    addiw a1, a1, -1
11318; RV64I-NEXT:    li a2, 4
11319; RV64I-NEXT:    call __atomic_exchange_2
11320; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11321; RV64I-NEXT:    addi sp, sp, 16
11322; RV64I-NEXT:    ret
11323;
11324; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11325; RV64IA-WMO-NOZACAS:       # %bb.0:
11326; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
11327; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
11328; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
11329; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
11330; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
11331; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
11332; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
11333; RV64IA-WMO-NOZACAS-NEXT:    ret
11334;
11335; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11336; RV64IA-TSO-NOZACAS:       # %bb.0:
11337; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
11338; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
11339; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
11340; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
11341; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
11342; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
11343; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
11344; RV64IA-TSO-NOZACAS-NEXT:    ret
11345;
11346; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11347; RV64IA-WMO-ZACAS:       # %bb.0:
11348; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
11349; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
11350; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
11351; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
11352; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
11353; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
11354; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
11355; RV64IA-WMO-ZACAS-NEXT:    ret
11356;
11357; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11358; RV64IA-TSO-ZACAS:       # %bb.0:
11359; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
11360; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
11361; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
11362; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
11363; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
11364; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
11365; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
11366; RV64IA-TSO-ZACAS-NEXT:    ret
11367;
11368; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11369; RV64IA-WMO-ZABHA:       # %bb.0:
11370; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
11371; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aqrl a0, a1, (a0)
11372; RV64IA-WMO-ZABHA-NEXT:    ret
11373;
11374; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
11375; RV64IA-TSO-ZABHA:       # %bb.0:
11376; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
11377; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
11378; RV64IA-TSO-ZABHA-NEXT:    ret
11379  %1 = atomicrmw xchg ptr %a, i16 -1 acq_rel
11380  ret i16 %1
11381}
11382
11383define i16 @atomicrmw_xchg_minus_1_i16_seq_cst(ptr %a) nounwind {
11384; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11385; RV32I:       # %bb.0:
11386; RV32I-NEXT:    addi sp, sp, -16
11387; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11388; RV32I-NEXT:    lui a1, 16
11389; RV32I-NEXT:    addi a1, a1, -1
11390; RV32I-NEXT:    li a2, 5
11391; RV32I-NEXT:    call __atomic_exchange_2
11392; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11393; RV32I-NEXT:    addi sp, sp, 16
11394; RV32I-NEXT:    ret
11395;
11396; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11397; RV32IA-WMO:       # %bb.0:
11398; RV32IA-WMO-NEXT:    andi a1, a0, -4
11399; RV32IA-WMO-NEXT:    slli a0, a0, 3
11400; RV32IA-WMO-NEXT:    lui a2, 16
11401; RV32IA-WMO-NEXT:    addi a2, a2, -1
11402; RV32IA-WMO-NEXT:    sll a2, a2, a0
11403; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a2, (a1)
11404; RV32IA-WMO-NEXT:    srl a0, a1, a0
11405; RV32IA-WMO-NEXT:    ret
11406;
11407; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11408; RV32IA-TSO:       # %bb.0:
11409; RV32IA-TSO-NEXT:    andi a1, a0, -4
11410; RV32IA-TSO-NEXT:    slli a0, a0, 3
11411; RV32IA-TSO-NEXT:    lui a2, 16
11412; RV32IA-TSO-NEXT:    addi a2, a2, -1
11413; RV32IA-TSO-NEXT:    sll a2, a2, a0
11414; RV32IA-TSO-NEXT:    amoor.w a1, a2, (a1)
11415; RV32IA-TSO-NEXT:    srl a0, a1, a0
11416; RV32IA-TSO-NEXT:    ret
11417;
11418; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11419; RV64I:       # %bb.0:
11420; RV64I-NEXT:    addi sp, sp, -16
11421; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11422; RV64I-NEXT:    lui a1, 16
11423; RV64I-NEXT:    addiw a1, a1, -1
11424; RV64I-NEXT:    li a2, 5
11425; RV64I-NEXT:    call __atomic_exchange_2
11426; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11427; RV64I-NEXT:    addi sp, sp, 16
11428; RV64I-NEXT:    ret
11429;
11430; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11431; RV64IA-WMO-NOZACAS:       # %bb.0:
11432; RV64IA-WMO-NOZACAS-NEXT:    andi a1, a0, -4
11433; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
11434; RV64IA-WMO-NOZACAS-NEXT:    lui a2, 16
11435; RV64IA-WMO-NOZACAS-NEXT:    addi a2, a2, -1
11436; RV64IA-WMO-NOZACAS-NEXT:    sllw a2, a2, a0
11437; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
11438; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
11439; RV64IA-WMO-NOZACAS-NEXT:    ret
11440;
11441; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11442; RV64IA-TSO-NOZACAS:       # %bb.0:
11443; RV64IA-TSO-NOZACAS-NEXT:    andi a1, a0, -4
11444; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
11445; RV64IA-TSO-NOZACAS-NEXT:    lui a2, 16
11446; RV64IA-TSO-NOZACAS-NEXT:    addi a2, a2, -1
11447; RV64IA-TSO-NOZACAS-NEXT:    sllw a2, a2, a0
11448; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a2, (a1)
11449; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
11450; RV64IA-TSO-NOZACAS-NEXT:    ret
11451;
11452; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11453; RV64IA-WMO-ZACAS:       # %bb.0:
11454; RV64IA-WMO-ZACAS-NEXT:    andi a1, a0, -4
11455; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
11456; RV64IA-WMO-ZACAS-NEXT:    lui a2, 16
11457; RV64IA-WMO-ZACAS-NEXT:    addi a2, a2, -1
11458; RV64IA-WMO-ZACAS-NEXT:    sllw a2, a2, a0
11459; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a2, (a1)
11460; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
11461; RV64IA-WMO-ZACAS-NEXT:    ret
11462;
11463; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11464; RV64IA-TSO-ZACAS:       # %bb.0:
11465; RV64IA-TSO-ZACAS-NEXT:    andi a1, a0, -4
11466; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
11467; RV64IA-TSO-ZACAS-NEXT:    lui a2, 16
11468; RV64IA-TSO-ZACAS-NEXT:    addi a2, a2, -1
11469; RV64IA-TSO-ZACAS-NEXT:    sllw a2, a2, a0
11470; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a2, (a1)
11471; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
11472; RV64IA-TSO-ZACAS-NEXT:    ret
11473;
11474; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11475; RV64IA-WMO-ZABHA:       # %bb.0:
11476; RV64IA-WMO-ZABHA-NEXT:    li a1, -1
11477; RV64IA-WMO-ZABHA-NEXT:    amoswap.h.aqrl a0, a1, (a0)
11478; RV64IA-WMO-ZABHA-NEXT:    ret
11479;
11480; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
11481; RV64IA-TSO-ZABHA:       # %bb.0:
11482; RV64IA-TSO-ZABHA-NEXT:    li a1, -1
11483; RV64IA-TSO-ZABHA-NEXT:    amoswap.h a0, a1, (a0)
11484; RV64IA-TSO-ZABHA-NEXT:    ret
11485  %1 = atomicrmw xchg ptr %a, i16 -1 seq_cst
11486  ret i16 %1
11487}
11488
11489define i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind {
11490; RV32I-LABEL: atomicrmw_add_i16_monotonic:
11491; RV32I:       # %bb.0:
11492; RV32I-NEXT:    addi sp, sp, -16
11493; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11494; RV32I-NEXT:    li a2, 0
11495; RV32I-NEXT:    call __atomic_fetch_add_2
11496; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11497; RV32I-NEXT:    addi sp, sp, 16
11498; RV32I-NEXT:    ret
11499;
11500; RV32IA-LABEL: atomicrmw_add_i16_monotonic:
11501; RV32IA:       # %bb.0:
11502; RV32IA-NEXT:    andi a2, a0, -4
11503; RV32IA-NEXT:    slli a0, a0, 3
11504; RV32IA-NEXT:    lui a3, 16
11505; RV32IA-NEXT:    addi a3, a3, -1
11506; RV32IA-NEXT:    sll a4, a3, a0
11507; RV32IA-NEXT:    and a1, a1, a3
11508; RV32IA-NEXT:    sll a1, a1, a0
11509; RV32IA-NEXT:  .LBB80_1: # =>This Inner Loop Header: Depth=1
11510; RV32IA-NEXT:    lr.w a3, (a2)
11511; RV32IA-NEXT:    add a5, a3, a1
11512; RV32IA-NEXT:    xor a5, a3, a5
11513; RV32IA-NEXT:    and a5, a5, a4
11514; RV32IA-NEXT:    xor a5, a3, a5
11515; RV32IA-NEXT:    sc.w a5, a5, (a2)
11516; RV32IA-NEXT:    bnez a5, .LBB80_1
11517; RV32IA-NEXT:  # %bb.2:
11518; RV32IA-NEXT:    srl a0, a3, a0
11519; RV32IA-NEXT:    ret
11520;
11521; RV64I-LABEL: atomicrmw_add_i16_monotonic:
11522; RV64I:       # %bb.0:
11523; RV64I-NEXT:    addi sp, sp, -16
11524; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11525; RV64I-NEXT:    li a2, 0
11526; RV64I-NEXT:    call __atomic_fetch_add_2
11527; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11528; RV64I-NEXT:    addi sp, sp, 16
11529; RV64I-NEXT:    ret
11530;
11531; RV64IA-NOZACAS-LABEL: atomicrmw_add_i16_monotonic:
11532; RV64IA-NOZACAS:       # %bb.0:
11533; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
11534; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
11535; RV64IA-NOZACAS-NEXT:    lui a3, 16
11536; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
11537; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
11538; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
11539; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
11540; RV64IA-NOZACAS-NEXT:  .LBB80_1: # =>This Inner Loop Header: Depth=1
11541; RV64IA-NOZACAS-NEXT:    lr.w a3, (a2)
11542; RV64IA-NOZACAS-NEXT:    add a5, a3, a1
11543; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
11544; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
11545; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
11546; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
11547; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB80_1
11548; RV64IA-NOZACAS-NEXT:  # %bb.2:
11549; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
11550; RV64IA-NOZACAS-NEXT:    ret
11551;
11552; RV64IA-ZACAS-LABEL: atomicrmw_add_i16_monotonic:
11553; RV64IA-ZACAS:       # %bb.0:
11554; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
11555; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
11556; RV64IA-ZACAS-NEXT:    lui a3, 16
11557; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
11558; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
11559; RV64IA-ZACAS-NEXT:    and a1, a1, a3
11560; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
11561; RV64IA-ZACAS-NEXT:  .LBB80_1: # =>This Inner Loop Header: Depth=1
11562; RV64IA-ZACAS-NEXT:    lr.w a3, (a2)
11563; RV64IA-ZACAS-NEXT:    add a5, a3, a1
11564; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
11565; RV64IA-ZACAS-NEXT:    and a5, a5, a4
11566; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
11567; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
11568; RV64IA-ZACAS-NEXT:    bnez a5, .LBB80_1
11569; RV64IA-ZACAS-NEXT:  # %bb.2:
11570; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
11571; RV64IA-ZACAS-NEXT:    ret
11572;
11573; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_monotonic:
11574; RV64IA-WMO-ZABHA:       # %bb.0:
11575; RV64IA-WMO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
11576; RV64IA-WMO-ZABHA-NEXT:    ret
11577;
11578; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_monotonic:
11579; RV64IA-TSO-ZABHA:       # %bb.0:
11580; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
11581; RV64IA-TSO-ZABHA-NEXT:    ret
11582  %1 = atomicrmw add ptr %a, i16 %b monotonic
11583  ret i16 %1
11584}
11585
11586define i16 @atomicrmw_add_i16_acquire(ptr %a, i16 %b) nounwind {
11587; RV32I-LABEL: atomicrmw_add_i16_acquire:
11588; RV32I:       # %bb.0:
11589; RV32I-NEXT:    addi sp, sp, -16
11590; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11591; RV32I-NEXT:    li a2, 2
11592; RV32I-NEXT:    call __atomic_fetch_add_2
11593; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11594; RV32I-NEXT:    addi sp, sp, 16
11595; RV32I-NEXT:    ret
11596;
11597; RV32IA-WMO-LABEL: atomicrmw_add_i16_acquire:
11598; RV32IA-WMO:       # %bb.0:
11599; RV32IA-WMO-NEXT:    andi a2, a0, -4
11600; RV32IA-WMO-NEXT:    slli a0, a0, 3
11601; RV32IA-WMO-NEXT:    lui a3, 16
11602; RV32IA-WMO-NEXT:    addi a3, a3, -1
11603; RV32IA-WMO-NEXT:    sll a4, a3, a0
11604; RV32IA-WMO-NEXT:    and a1, a1, a3
11605; RV32IA-WMO-NEXT:    sll a1, a1, a0
11606; RV32IA-WMO-NEXT:  .LBB81_1: # =>This Inner Loop Header: Depth=1
11607; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
11608; RV32IA-WMO-NEXT:    add a5, a3, a1
11609; RV32IA-WMO-NEXT:    xor a5, a3, a5
11610; RV32IA-WMO-NEXT:    and a5, a5, a4
11611; RV32IA-WMO-NEXT:    xor a5, a3, a5
11612; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
11613; RV32IA-WMO-NEXT:    bnez a5, .LBB81_1
11614; RV32IA-WMO-NEXT:  # %bb.2:
11615; RV32IA-WMO-NEXT:    srl a0, a3, a0
11616; RV32IA-WMO-NEXT:    ret
11617;
11618; RV32IA-TSO-LABEL: atomicrmw_add_i16_acquire:
11619; RV32IA-TSO:       # %bb.0:
11620; RV32IA-TSO-NEXT:    andi a2, a0, -4
11621; RV32IA-TSO-NEXT:    slli a0, a0, 3
11622; RV32IA-TSO-NEXT:    lui a3, 16
11623; RV32IA-TSO-NEXT:    addi a3, a3, -1
11624; RV32IA-TSO-NEXT:    sll a4, a3, a0
11625; RV32IA-TSO-NEXT:    and a1, a1, a3
11626; RV32IA-TSO-NEXT:    sll a1, a1, a0
11627; RV32IA-TSO-NEXT:  .LBB81_1: # =>This Inner Loop Header: Depth=1
11628; RV32IA-TSO-NEXT:    lr.w a3, (a2)
11629; RV32IA-TSO-NEXT:    add a5, a3, a1
11630; RV32IA-TSO-NEXT:    xor a5, a3, a5
11631; RV32IA-TSO-NEXT:    and a5, a5, a4
11632; RV32IA-TSO-NEXT:    xor a5, a3, a5
11633; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
11634; RV32IA-TSO-NEXT:    bnez a5, .LBB81_1
11635; RV32IA-TSO-NEXT:  # %bb.2:
11636; RV32IA-TSO-NEXT:    srl a0, a3, a0
11637; RV32IA-TSO-NEXT:    ret
11638;
11639; RV64I-LABEL: atomicrmw_add_i16_acquire:
11640; RV64I:       # %bb.0:
11641; RV64I-NEXT:    addi sp, sp, -16
11642; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11643; RV64I-NEXT:    li a2, 2
11644; RV64I-NEXT:    call __atomic_fetch_add_2
11645; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11646; RV64I-NEXT:    addi sp, sp, 16
11647; RV64I-NEXT:    ret
11648;
11649; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_acquire:
11650; RV64IA-WMO-NOZACAS:       # %bb.0:
11651; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
11652; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
11653; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
11654; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
11655; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
11656; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
11657; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
11658; RV64IA-WMO-NOZACAS-NEXT:  .LBB81_1: # =>This Inner Loop Header: Depth=1
11659; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
11660; RV64IA-WMO-NOZACAS-NEXT:    add a5, a3, a1
11661; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
11662; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
11663; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
11664; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
11665; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB81_1
11666; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
11667; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
11668; RV64IA-WMO-NOZACAS-NEXT:    ret
11669;
11670; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_acquire:
11671; RV64IA-TSO-NOZACAS:       # %bb.0:
11672; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
11673; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
11674; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
11675; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
11676; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
11677; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
11678; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
11679; RV64IA-TSO-NOZACAS-NEXT:  .LBB81_1: # =>This Inner Loop Header: Depth=1
11680; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
11681; RV64IA-TSO-NOZACAS-NEXT:    add a5, a3, a1
11682; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
11683; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
11684; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
11685; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
11686; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB81_1
11687; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
11688; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
11689; RV64IA-TSO-NOZACAS-NEXT:    ret
11690;
11691; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_acquire:
11692; RV64IA-WMO-ZACAS:       # %bb.0:
11693; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
11694; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
11695; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
11696; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
11697; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
11698; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
11699; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
11700; RV64IA-WMO-ZACAS-NEXT:  .LBB81_1: # =>This Inner Loop Header: Depth=1
11701; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
11702; RV64IA-WMO-ZACAS-NEXT:    add a5, a3, a1
11703; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
11704; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
11705; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
11706; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
11707; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB81_1
11708; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
11709; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
11710; RV64IA-WMO-ZACAS-NEXT:    ret
11711;
11712; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_acquire:
11713; RV64IA-TSO-ZACAS:       # %bb.0:
11714; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
11715; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
11716; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
11717; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
11718; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
11719; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
11720; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
11721; RV64IA-TSO-ZACAS-NEXT:  .LBB81_1: # =>This Inner Loop Header: Depth=1
11722; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
11723; RV64IA-TSO-ZACAS-NEXT:    add a5, a3, a1
11724; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
11725; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
11726; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
11727; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
11728; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB81_1
11729; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
11730; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
11731; RV64IA-TSO-ZACAS-NEXT:    ret
11732;
11733; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_acquire:
11734; RV64IA-WMO-ZABHA:       # %bb.0:
11735; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.aq a0, a1, (a0)
11736; RV64IA-WMO-ZABHA-NEXT:    ret
11737;
11738; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_acquire:
11739; RV64IA-TSO-ZABHA:       # %bb.0:
11740; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
11741; RV64IA-TSO-ZABHA-NEXT:    ret
11742  %1 = atomicrmw add ptr %a, i16 %b acquire
11743  ret i16 %1
11744}
11745
11746define i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind {
11747; RV32I-LABEL: atomicrmw_add_i16_release:
11748; RV32I:       # %bb.0:
11749; RV32I-NEXT:    addi sp, sp, -16
11750; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11751; RV32I-NEXT:    li a2, 3
11752; RV32I-NEXT:    call __atomic_fetch_add_2
11753; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11754; RV32I-NEXT:    addi sp, sp, 16
11755; RV32I-NEXT:    ret
11756;
11757; RV32IA-WMO-LABEL: atomicrmw_add_i16_release:
11758; RV32IA-WMO:       # %bb.0:
11759; RV32IA-WMO-NEXT:    andi a2, a0, -4
11760; RV32IA-WMO-NEXT:    slli a0, a0, 3
11761; RV32IA-WMO-NEXT:    lui a3, 16
11762; RV32IA-WMO-NEXT:    addi a3, a3, -1
11763; RV32IA-WMO-NEXT:    sll a4, a3, a0
11764; RV32IA-WMO-NEXT:    and a1, a1, a3
11765; RV32IA-WMO-NEXT:    sll a1, a1, a0
11766; RV32IA-WMO-NEXT:  .LBB82_1: # =>This Inner Loop Header: Depth=1
11767; RV32IA-WMO-NEXT:    lr.w a3, (a2)
11768; RV32IA-WMO-NEXT:    add a5, a3, a1
11769; RV32IA-WMO-NEXT:    xor a5, a3, a5
11770; RV32IA-WMO-NEXT:    and a5, a5, a4
11771; RV32IA-WMO-NEXT:    xor a5, a3, a5
11772; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
11773; RV32IA-WMO-NEXT:    bnez a5, .LBB82_1
11774; RV32IA-WMO-NEXT:  # %bb.2:
11775; RV32IA-WMO-NEXT:    srl a0, a3, a0
11776; RV32IA-WMO-NEXT:    ret
11777;
11778; RV32IA-TSO-LABEL: atomicrmw_add_i16_release:
11779; RV32IA-TSO:       # %bb.0:
11780; RV32IA-TSO-NEXT:    andi a2, a0, -4
11781; RV32IA-TSO-NEXT:    slli a0, a0, 3
11782; RV32IA-TSO-NEXT:    lui a3, 16
11783; RV32IA-TSO-NEXT:    addi a3, a3, -1
11784; RV32IA-TSO-NEXT:    sll a4, a3, a0
11785; RV32IA-TSO-NEXT:    and a1, a1, a3
11786; RV32IA-TSO-NEXT:    sll a1, a1, a0
11787; RV32IA-TSO-NEXT:  .LBB82_1: # =>This Inner Loop Header: Depth=1
11788; RV32IA-TSO-NEXT:    lr.w a3, (a2)
11789; RV32IA-TSO-NEXT:    add a5, a3, a1
11790; RV32IA-TSO-NEXT:    xor a5, a3, a5
11791; RV32IA-TSO-NEXT:    and a5, a5, a4
11792; RV32IA-TSO-NEXT:    xor a5, a3, a5
11793; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
11794; RV32IA-TSO-NEXT:    bnez a5, .LBB82_1
11795; RV32IA-TSO-NEXT:  # %bb.2:
11796; RV32IA-TSO-NEXT:    srl a0, a3, a0
11797; RV32IA-TSO-NEXT:    ret
11798;
11799; RV64I-LABEL: atomicrmw_add_i16_release:
11800; RV64I:       # %bb.0:
11801; RV64I-NEXT:    addi sp, sp, -16
11802; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11803; RV64I-NEXT:    li a2, 3
11804; RV64I-NEXT:    call __atomic_fetch_add_2
11805; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11806; RV64I-NEXT:    addi sp, sp, 16
11807; RV64I-NEXT:    ret
11808;
11809; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_release:
11810; RV64IA-WMO-NOZACAS:       # %bb.0:
11811; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
11812; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
11813; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
11814; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
11815; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
11816; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
11817; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
11818; RV64IA-WMO-NOZACAS-NEXT:  .LBB82_1: # =>This Inner Loop Header: Depth=1
11819; RV64IA-WMO-NOZACAS-NEXT:    lr.w a3, (a2)
11820; RV64IA-WMO-NOZACAS-NEXT:    add a5, a3, a1
11821; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
11822; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
11823; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
11824; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
11825; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB82_1
11826; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
11827; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
11828; RV64IA-WMO-NOZACAS-NEXT:    ret
11829;
11830; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_release:
11831; RV64IA-TSO-NOZACAS:       # %bb.0:
11832; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
11833; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
11834; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
11835; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
11836; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
11837; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
11838; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
11839; RV64IA-TSO-NOZACAS-NEXT:  .LBB82_1: # =>This Inner Loop Header: Depth=1
11840; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
11841; RV64IA-TSO-NOZACAS-NEXT:    add a5, a3, a1
11842; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
11843; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
11844; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
11845; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
11846; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB82_1
11847; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
11848; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
11849; RV64IA-TSO-NOZACAS-NEXT:    ret
11850;
11851; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_release:
11852; RV64IA-WMO-ZACAS:       # %bb.0:
11853; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
11854; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
11855; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
11856; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
11857; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
11858; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
11859; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
11860; RV64IA-WMO-ZACAS-NEXT:  .LBB82_1: # =>This Inner Loop Header: Depth=1
11861; RV64IA-WMO-ZACAS-NEXT:    lr.w a3, (a2)
11862; RV64IA-WMO-ZACAS-NEXT:    add a5, a3, a1
11863; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
11864; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
11865; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
11866; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
11867; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB82_1
11868; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
11869; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
11870; RV64IA-WMO-ZACAS-NEXT:    ret
11871;
11872; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_release:
11873; RV64IA-TSO-ZACAS:       # %bb.0:
11874; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
11875; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
11876; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
11877; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
11878; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
11879; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
11880; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
11881; RV64IA-TSO-ZACAS-NEXT:  .LBB82_1: # =>This Inner Loop Header: Depth=1
11882; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
11883; RV64IA-TSO-ZACAS-NEXT:    add a5, a3, a1
11884; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
11885; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
11886; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
11887; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
11888; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB82_1
11889; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
11890; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
11891; RV64IA-TSO-ZACAS-NEXT:    ret
11892;
11893; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_release:
11894; RV64IA-WMO-ZABHA:       # %bb.0:
11895; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.rl a0, a1, (a0)
11896; RV64IA-WMO-ZABHA-NEXT:    ret
11897;
11898; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_release:
11899; RV64IA-TSO-ZABHA:       # %bb.0:
11900; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
11901; RV64IA-TSO-ZABHA-NEXT:    ret
11902  %1 = atomicrmw add ptr %a, i16 %b release
11903  ret i16 %1
11904}
11905
11906define i16 @atomicrmw_add_i16_acq_rel(ptr %a, i16 %b) nounwind {
11907; RV32I-LABEL: atomicrmw_add_i16_acq_rel:
11908; RV32I:       # %bb.0:
11909; RV32I-NEXT:    addi sp, sp, -16
11910; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
11911; RV32I-NEXT:    li a2, 4
11912; RV32I-NEXT:    call __atomic_fetch_add_2
11913; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
11914; RV32I-NEXT:    addi sp, sp, 16
11915; RV32I-NEXT:    ret
11916;
11917; RV32IA-WMO-LABEL: atomicrmw_add_i16_acq_rel:
11918; RV32IA-WMO:       # %bb.0:
11919; RV32IA-WMO-NEXT:    andi a2, a0, -4
11920; RV32IA-WMO-NEXT:    slli a0, a0, 3
11921; RV32IA-WMO-NEXT:    lui a3, 16
11922; RV32IA-WMO-NEXT:    addi a3, a3, -1
11923; RV32IA-WMO-NEXT:    sll a4, a3, a0
11924; RV32IA-WMO-NEXT:    and a1, a1, a3
11925; RV32IA-WMO-NEXT:    sll a1, a1, a0
11926; RV32IA-WMO-NEXT:  .LBB83_1: # =>This Inner Loop Header: Depth=1
11927; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
11928; RV32IA-WMO-NEXT:    add a5, a3, a1
11929; RV32IA-WMO-NEXT:    xor a5, a3, a5
11930; RV32IA-WMO-NEXT:    and a5, a5, a4
11931; RV32IA-WMO-NEXT:    xor a5, a3, a5
11932; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
11933; RV32IA-WMO-NEXT:    bnez a5, .LBB83_1
11934; RV32IA-WMO-NEXT:  # %bb.2:
11935; RV32IA-WMO-NEXT:    srl a0, a3, a0
11936; RV32IA-WMO-NEXT:    ret
11937;
11938; RV32IA-TSO-LABEL: atomicrmw_add_i16_acq_rel:
11939; RV32IA-TSO:       # %bb.0:
11940; RV32IA-TSO-NEXT:    andi a2, a0, -4
11941; RV32IA-TSO-NEXT:    slli a0, a0, 3
11942; RV32IA-TSO-NEXT:    lui a3, 16
11943; RV32IA-TSO-NEXT:    addi a3, a3, -1
11944; RV32IA-TSO-NEXT:    sll a4, a3, a0
11945; RV32IA-TSO-NEXT:    and a1, a1, a3
11946; RV32IA-TSO-NEXT:    sll a1, a1, a0
11947; RV32IA-TSO-NEXT:  .LBB83_1: # =>This Inner Loop Header: Depth=1
11948; RV32IA-TSO-NEXT:    lr.w a3, (a2)
11949; RV32IA-TSO-NEXT:    add a5, a3, a1
11950; RV32IA-TSO-NEXT:    xor a5, a3, a5
11951; RV32IA-TSO-NEXT:    and a5, a5, a4
11952; RV32IA-TSO-NEXT:    xor a5, a3, a5
11953; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
11954; RV32IA-TSO-NEXT:    bnez a5, .LBB83_1
11955; RV32IA-TSO-NEXT:  # %bb.2:
11956; RV32IA-TSO-NEXT:    srl a0, a3, a0
11957; RV32IA-TSO-NEXT:    ret
11958;
11959; RV64I-LABEL: atomicrmw_add_i16_acq_rel:
11960; RV64I:       # %bb.0:
11961; RV64I-NEXT:    addi sp, sp, -16
11962; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
11963; RV64I-NEXT:    li a2, 4
11964; RV64I-NEXT:    call __atomic_fetch_add_2
11965; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11966; RV64I-NEXT:    addi sp, sp, 16
11967; RV64I-NEXT:    ret
11968;
11969; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_acq_rel:
11970; RV64IA-WMO-NOZACAS:       # %bb.0:
11971; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
11972; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
11973; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
11974; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
11975; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
11976; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
11977; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
11978; RV64IA-WMO-NOZACAS-NEXT:  .LBB83_1: # =>This Inner Loop Header: Depth=1
11979; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
11980; RV64IA-WMO-NOZACAS-NEXT:    add a5, a3, a1
11981; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
11982; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
11983; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
11984; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
11985; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB83_1
11986; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
11987; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
11988; RV64IA-WMO-NOZACAS-NEXT:    ret
11989;
11990; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_acq_rel:
11991; RV64IA-TSO-NOZACAS:       # %bb.0:
11992; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
11993; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
11994; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
11995; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
11996; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
11997; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
11998; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
11999; RV64IA-TSO-NOZACAS-NEXT:  .LBB83_1: # =>This Inner Loop Header: Depth=1
12000; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
12001; RV64IA-TSO-NOZACAS-NEXT:    add a5, a3, a1
12002; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12003; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
12004; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12005; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
12006; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB83_1
12007; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
12008; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
12009; RV64IA-TSO-NOZACAS-NEXT:    ret
12010;
12011; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_acq_rel:
12012; RV64IA-WMO-ZACAS:       # %bb.0:
12013; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
12014; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
12015; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
12016; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
12017; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
12018; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
12019; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
12020; RV64IA-WMO-ZACAS-NEXT:  .LBB83_1: # =>This Inner Loop Header: Depth=1
12021; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
12022; RV64IA-WMO-ZACAS-NEXT:    add a5, a3, a1
12023; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12024; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
12025; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12026; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12027; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB83_1
12028; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
12029; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
12030; RV64IA-WMO-ZACAS-NEXT:    ret
12031;
12032; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_acq_rel:
12033; RV64IA-TSO-ZACAS:       # %bb.0:
12034; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
12035; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
12036; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
12037; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
12038; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
12039; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
12040; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
12041; RV64IA-TSO-ZACAS-NEXT:  .LBB83_1: # =>This Inner Loop Header: Depth=1
12042; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
12043; RV64IA-TSO-ZACAS-NEXT:    add a5, a3, a1
12044; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12045; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
12046; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12047; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
12048; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB83_1
12049; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
12050; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
12051; RV64IA-TSO-ZACAS-NEXT:    ret
12052;
12053; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_acq_rel:
12054; RV64IA-WMO-ZABHA:       # %bb.0:
12055; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.aqrl a0, a1, (a0)
12056; RV64IA-WMO-ZABHA-NEXT:    ret
12057;
12058; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_acq_rel:
12059; RV64IA-TSO-ZABHA:       # %bb.0:
12060; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12061; RV64IA-TSO-ZABHA-NEXT:    ret
12062  %1 = atomicrmw add ptr %a, i16 %b acq_rel
12063  ret i16 %1
12064}
12065
12066define i16 @atomicrmw_add_i16_seq_cst(ptr %a, i16 %b) nounwind {
12067; RV32I-LABEL: atomicrmw_add_i16_seq_cst:
12068; RV32I:       # %bb.0:
12069; RV32I-NEXT:    addi sp, sp, -16
12070; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12071; RV32I-NEXT:    li a2, 5
12072; RV32I-NEXT:    call __atomic_fetch_add_2
12073; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12074; RV32I-NEXT:    addi sp, sp, 16
12075; RV32I-NEXT:    ret
12076;
12077; RV32IA-LABEL: atomicrmw_add_i16_seq_cst:
12078; RV32IA:       # %bb.0:
12079; RV32IA-NEXT:    andi a2, a0, -4
12080; RV32IA-NEXT:    slli a0, a0, 3
12081; RV32IA-NEXT:    lui a3, 16
12082; RV32IA-NEXT:    addi a3, a3, -1
12083; RV32IA-NEXT:    sll a4, a3, a0
12084; RV32IA-NEXT:    and a1, a1, a3
12085; RV32IA-NEXT:    sll a1, a1, a0
12086; RV32IA-NEXT:  .LBB84_1: # =>This Inner Loop Header: Depth=1
12087; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
12088; RV32IA-NEXT:    add a5, a3, a1
12089; RV32IA-NEXT:    xor a5, a3, a5
12090; RV32IA-NEXT:    and a5, a5, a4
12091; RV32IA-NEXT:    xor a5, a3, a5
12092; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
12093; RV32IA-NEXT:    bnez a5, .LBB84_1
12094; RV32IA-NEXT:  # %bb.2:
12095; RV32IA-NEXT:    srl a0, a3, a0
12096; RV32IA-NEXT:    ret
12097;
12098; RV64I-LABEL: atomicrmw_add_i16_seq_cst:
12099; RV64I:       # %bb.0:
12100; RV64I-NEXT:    addi sp, sp, -16
12101; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12102; RV64I-NEXT:    li a2, 5
12103; RV64I-NEXT:    call __atomic_fetch_add_2
12104; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12105; RV64I-NEXT:    addi sp, sp, 16
12106; RV64I-NEXT:    ret
12107;
12108; RV64IA-NOZACAS-LABEL: atomicrmw_add_i16_seq_cst:
12109; RV64IA-NOZACAS:       # %bb.0:
12110; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
12111; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
12112; RV64IA-NOZACAS-NEXT:    lui a3, 16
12113; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
12114; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
12115; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
12116; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
12117; RV64IA-NOZACAS-NEXT:  .LBB84_1: # =>This Inner Loop Header: Depth=1
12118; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
12119; RV64IA-NOZACAS-NEXT:    add a5, a3, a1
12120; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
12121; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
12122; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
12123; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12124; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB84_1
12125; RV64IA-NOZACAS-NEXT:  # %bb.2:
12126; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
12127; RV64IA-NOZACAS-NEXT:    ret
12128;
12129; RV64IA-ZACAS-LABEL: atomicrmw_add_i16_seq_cst:
12130; RV64IA-ZACAS:       # %bb.0:
12131; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
12132; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
12133; RV64IA-ZACAS-NEXT:    lui a3, 16
12134; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
12135; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
12136; RV64IA-ZACAS-NEXT:    and a1, a1, a3
12137; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
12138; RV64IA-ZACAS-NEXT:  .LBB84_1: # =>This Inner Loop Header: Depth=1
12139; RV64IA-ZACAS-NEXT:    lr.w.aqrl a3, (a2)
12140; RV64IA-ZACAS-NEXT:    add a5, a3, a1
12141; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
12142; RV64IA-ZACAS-NEXT:    and a5, a5, a4
12143; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
12144; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12145; RV64IA-ZACAS-NEXT:    bnez a5, .LBB84_1
12146; RV64IA-ZACAS-NEXT:  # %bb.2:
12147; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
12148; RV64IA-ZACAS-NEXT:    ret
12149;
12150; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_seq_cst:
12151; RV64IA-WMO-ZABHA:       # %bb.0:
12152; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.aqrl a0, a1, (a0)
12153; RV64IA-WMO-ZABHA-NEXT:    ret
12154;
12155; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_seq_cst:
12156; RV64IA-TSO-ZABHA:       # %bb.0:
12157; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12158; RV64IA-TSO-ZABHA-NEXT:    ret
12159  %1 = atomicrmw add ptr %a, i16 %b seq_cst
12160  ret i16 %1
12161}
12162
12163define i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind {
12164; RV32I-LABEL: atomicrmw_sub_i16_monotonic:
12165; RV32I:       # %bb.0:
12166; RV32I-NEXT:    addi sp, sp, -16
12167; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12168; RV32I-NEXT:    li a2, 0
12169; RV32I-NEXT:    call __atomic_fetch_sub_2
12170; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12171; RV32I-NEXT:    addi sp, sp, 16
12172; RV32I-NEXT:    ret
12173;
12174; RV32IA-LABEL: atomicrmw_sub_i16_monotonic:
12175; RV32IA:       # %bb.0:
12176; RV32IA-NEXT:    andi a2, a0, -4
12177; RV32IA-NEXT:    slli a0, a0, 3
12178; RV32IA-NEXT:    lui a3, 16
12179; RV32IA-NEXT:    addi a3, a3, -1
12180; RV32IA-NEXT:    sll a4, a3, a0
12181; RV32IA-NEXT:    and a1, a1, a3
12182; RV32IA-NEXT:    sll a1, a1, a0
12183; RV32IA-NEXT:  .LBB85_1: # =>This Inner Loop Header: Depth=1
12184; RV32IA-NEXT:    lr.w a3, (a2)
12185; RV32IA-NEXT:    sub a5, a3, a1
12186; RV32IA-NEXT:    xor a5, a3, a5
12187; RV32IA-NEXT:    and a5, a5, a4
12188; RV32IA-NEXT:    xor a5, a3, a5
12189; RV32IA-NEXT:    sc.w a5, a5, (a2)
12190; RV32IA-NEXT:    bnez a5, .LBB85_1
12191; RV32IA-NEXT:  # %bb.2:
12192; RV32IA-NEXT:    srl a0, a3, a0
12193; RV32IA-NEXT:    ret
12194;
12195; RV64I-LABEL: atomicrmw_sub_i16_monotonic:
12196; RV64I:       # %bb.0:
12197; RV64I-NEXT:    addi sp, sp, -16
12198; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12199; RV64I-NEXT:    li a2, 0
12200; RV64I-NEXT:    call __atomic_fetch_sub_2
12201; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12202; RV64I-NEXT:    addi sp, sp, 16
12203; RV64I-NEXT:    ret
12204;
12205; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i16_monotonic:
12206; RV64IA-NOZACAS:       # %bb.0:
12207; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
12208; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
12209; RV64IA-NOZACAS-NEXT:    lui a3, 16
12210; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
12211; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
12212; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
12213; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
12214; RV64IA-NOZACAS-NEXT:  .LBB85_1: # =>This Inner Loop Header: Depth=1
12215; RV64IA-NOZACAS-NEXT:    lr.w a3, (a2)
12216; RV64IA-NOZACAS-NEXT:    sub a5, a3, a1
12217; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
12218; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
12219; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
12220; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
12221; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB85_1
12222; RV64IA-NOZACAS-NEXT:  # %bb.2:
12223; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
12224; RV64IA-NOZACAS-NEXT:    ret
12225;
12226; RV64IA-ZACAS-LABEL: atomicrmw_sub_i16_monotonic:
12227; RV64IA-ZACAS:       # %bb.0:
12228; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
12229; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
12230; RV64IA-ZACAS-NEXT:    lui a3, 16
12231; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
12232; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
12233; RV64IA-ZACAS-NEXT:    and a1, a1, a3
12234; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
12235; RV64IA-ZACAS-NEXT:  .LBB85_1: # =>This Inner Loop Header: Depth=1
12236; RV64IA-ZACAS-NEXT:    lr.w a3, (a2)
12237; RV64IA-ZACAS-NEXT:    sub a5, a3, a1
12238; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
12239; RV64IA-ZACAS-NEXT:    and a5, a5, a4
12240; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
12241; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
12242; RV64IA-ZACAS-NEXT:    bnez a5, .LBB85_1
12243; RV64IA-ZACAS-NEXT:  # %bb.2:
12244; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
12245; RV64IA-ZACAS-NEXT:    ret
12246;
12247; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_monotonic:
12248; RV64IA-WMO-ZABHA:       # %bb.0:
12249; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
12250; RV64IA-WMO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12251; RV64IA-WMO-ZABHA-NEXT:    ret
12252;
12253; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_monotonic:
12254; RV64IA-TSO-ZABHA:       # %bb.0:
12255; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
12256; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12257; RV64IA-TSO-ZABHA-NEXT:    ret
12258  %1 = atomicrmw sub ptr %a, i16 %b monotonic
12259  ret i16 %1
12260}
12261
12262define i16 @atomicrmw_sub_i16_acquire(ptr %a, i16 %b) nounwind {
12263; RV32I-LABEL: atomicrmw_sub_i16_acquire:
12264; RV32I:       # %bb.0:
12265; RV32I-NEXT:    addi sp, sp, -16
12266; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12267; RV32I-NEXT:    li a2, 2
12268; RV32I-NEXT:    call __atomic_fetch_sub_2
12269; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12270; RV32I-NEXT:    addi sp, sp, 16
12271; RV32I-NEXT:    ret
12272;
12273; RV32IA-WMO-LABEL: atomicrmw_sub_i16_acquire:
12274; RV32IA-WMO:       # %bb.0:
12275; RV32IA-WMO-NEXT:    andi a2, a0, -4
12276; RV32IA-WMO-NEXT:    slli a0, a0, 3
12277; RV32IA-WMO-NEXT:    lui a3, 16
12278; RV32IA-WMO-NEXT:    addi a3, a3, -1
12279; RV32IA-WMO-NEXT:    sll a4, a3, a0
12280; RV32IA-WMO-NEXT:    and a1, a1, a3
12281; RV32IA-WMO-NEXT:    sll a1, a1, a0
12282; RV32IA-WMO-NEXT:  .LBB86_1: # =>This Inner Loop Header: Depth=1
12283; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
12284; RV32IA-WMO-NEXT:    sub a5, a3, a1
12285; RV32IA-WMO-NEXT:    xor a5, a3, a5
12286; RV32IA-WMO-NEXT:    and a5, a5, a4
12287; RV32IA-WMO-NEXT:    xor a5, a3, a5
12288; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
12289; RV32IA-WMO-NEXT:    bnez a5, .LBB86_1
12290; RV32IA-WMO-NEXT:  # %bb.2:
12291; RV32IA-WMO-NEXT:    srl a0, a3, a0
12292; RV32IA-WMO-NEXT:    ret
12293;
12294; RV32IA-TSO-LABEL: atomicrmw_sub_i16_acquire:
12295; RV32IA-TSO:       # %bb.0:
12296; RV32IA-TSO-NEXT:    andi a2, a0, -4
12297; RV32IA-TSO-NEXT:    slli a0, a0, 3
12298; RV32IA-TSO-NEXT:    lui a3, 16
12299; RV32IA-TSO-NEXT:    addi a3, a3, -1
12300; RV32IA-TSO-NEXT:    sll a4, a3, a0
12301; RV32IA-TSO-NEXT:    and a1, a1, a3
12302; RV32IA-TSO-NEXT:    sll a1, a1, a0
12303; RV32IA-TSO-NEXT:  .LBB86_1: # =>This Inner Loop Header: Depth=1
12304; RV32IA-TSO-NEXT:    lr.w a3, (a2)
12305; RV32IA-TSO-NEXT:    sub a5, a3, a1
12306; RV32IA-TSO-NEXT:    xor a5, a3, a5
12307; RV32IA-TSO-NEXT:    and a5, a5, a4
12308; RV32IA-TSO-NEXT:    xor a5, a3, a5
12309; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
12310; RV32IA-TSO-NEXT:    bnez a5, .LBB86_1
12311; RV32IA-TSO-NEXT:  # %bb.2:
12312; RV32IA-TSO-NEXT:    srl a0, a3, a0
12313; RV32IA-TSO-NEXT:    ret
12314;
12315; RV64I-LABEL: atomicrmw_sub_i16_acquire:
12316; RV64I:       # %bb.0:
12317; RV64I-NEXT:    addi sp, sp, -16
12318; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12319; RV64I-NEXT:    li a2, 2
12320; RV64I-NEXT:    call __atomic_fetch_sub_2
12321; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12322; RV64I-NEXT:    addi sp, sp, 16
12323; RV64I-NEXT:    ret
12324;
12325; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_acquire:
12326; RV64IA-WMO-NOZACAS:       # %bb.0:
12327; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
12328; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
12329; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
12330; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
12331; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
12332; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
12333; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
12334; RV64IA-WMO-NOZACAS-NEXT:  .LBB86_1: # =>This Inner Loop Header: Depth=1
12335; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
12336; RV64IA-WMO-NOZACAS-NEXT:    sub a5, a3, a1
12337; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
12338; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
12339; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
12340; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
12341; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB86_1
12342; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
12343; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
12344; RV64IA-WMO-NOZACAS-NEXT:    ret
12345;
12346; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_acquire:
12347; RV64IA-TSO-NOZACAS:       # %bb.0:
12348; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
12349; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
12350; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
12351; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
12352; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
12353; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
12354; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
12355; RV64IA-TSO-NOZACAS-NEXT:  .LBB86_1: # =>This Inner Loop Header: Depth=1
12356; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
12357; RV64IA-TSO-NOZACAS-NEXT:    sub a5, a3, a1
12358; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12359; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
12360; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12361; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
12362; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB86_1
12363; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
12364; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
12365; RV64IA-TSO-NOZACAS-NEXT:    ret
12366;
12367; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_acquire:
12368; RV64IA-WMO-ZACAS:       # %bb.0:
12369; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
12370; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
12371; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
12372; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
12373; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
12374; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
12375; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
12376; RV64IA-WMO-ZACAS-NEXT:  .LBB86_1: # =>This Inner Loop Header: Depth=1
12377; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
12378; RV64IA-WMO-ZACAS-NEXT:    sub a5, a3, a1
12379; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12380; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
12381; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12382; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
12383; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB86_1
12384; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
12385; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
12386; RV64IA-WMO-ZACAS-NEXT:    ret
12387;
12388; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_acquire:
12389; RV64IA-TSO-ZACAS:       # %bb.0:
12390; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
12391; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
12392; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
12393; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
12394; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
12395; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
12396; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
12397; RV64IA-TSO-ZACAS-NEXT:  .LBB86_1: # =>This Inner Loop Header: Depth=1
12398; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
12399; RV64IA-TSO-ZACAS-NEXT:    sub a5, a3, a1
12400; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12401; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
12402; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12403; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
12404; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB86_1
12405; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
12406; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
12407; RV64IA-TSO-ZACAS-NEXT:    ret
12408;
12409; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_acquire:
12410; RV64IA-WMO-ZABHA:       # %bb.0:
12411; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
12412; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.aq a0, a1, (a0)
12413; RV64IA-WMO-ZABHA-NEXT:    ret
12414;
12415; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_acquire:
12416; RV64IA-TSO-ZABHA:       # %bb.0:
12417; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
12418; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12419; RV64IA-TSO-ZABHA-NEXT:    ret
12420  %1 = atomicrmw sub ptr %a, i16 %b acquire
12421  ret i16 %1
12422}
12423
12424define i16 @atomicrmw_sub_i16_release(ptr %a, i16 %b) nounwind {
12425; RV32I-LABEL: atomicrmw_sub_i16_release:
12426; RV32I:       # %bb.0:
12427; RV32I-NEXT:    addi sp, sp, -16
12428; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12429; RV32I-NEXT:    li a2, 3
12430; RV32I-NEXT:    call __atomic_fetch_sub_2
12431; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12432; RV32I-NEXT:    addi sp, sp, 16
12433; RV32I-NEXT:    ret
12434;
12435; RV32IA-WMO-LABEL: atomicrmw_sub_i16_release:
12436; RV32IA-WMO:       # %bb.0:
12437; RV32IA-WMO-NEXT:    andi a2, a0, -4
12438; RV32IA-WMO-NEXT:    slli a0, a0, 3
12439; RV32IA-WMO-NEXT:    lui a3, 16
12440; RV32IA-WMO-NEXT:    addi a3, a3, -1
12441; RV32IA-WMO-NEXT:    sll a4, a3, a0
12442; RV32IA-WMO-NEXT:    and a1, a1, a3
12443; RV32IA-WMO-NEXT:    sll a1, a1, a0
12444; RV32IA-WMO-NEXT:  .LBB87_1: # =>This Inner Loop Header: Depth=1
12445; RV32IA-WMO-NEXT:    lr.w a3, (a2)
12446; RV32IA-WMO-NEXT:    sub a5, a3, a1
12447; RV32IA-WMO-NEXT:    xor a5, a3, a5
12448; RV32IA-WMO-NEXT:    and a5, a5, a4
12449; RV32IA-WMO-NEXT:    xor a5, a3, a5
12450; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
12451; RV32IA-WMO-NEXT:    bnez a5, .LBB87_1
12452; RV32IA-WMO-NEXT:  # %bb.2:
12453; RV32IA-WMO-NEXT:    srl a0, a3, a0
12454; RV32IA-WMO-NEXT:    ret
12455;
12456; RV32IA-TSO-LABEL: atomicrmw_sub_i16_release:
12457; RV32IA-TSO:       # %bb.0:
12458; RV32IA-TSO-NEXT:    andi a2, a0, -4
12459; RV32IA-TSO-NEXT:    slli a0, a0, 3
12460; RV32IA-TSO-NEXT:    lui a3, 16
12461; RV32IA-TSO-NEXT:    addi a3, a3, -1
12462; RV32IA-TSO-NEXT:    sll a4, a3, a0
12463; RV32IA-TSO-NEXT:    and a1, a1, a3
12464; RV32IA-TSO-NEXT:    sll a1, a1, a0
12465; RV32IA-TSO-NEXT:  .LBB87_1: # =>This Inner Loop Header: Depth=1
12466; RV32IA-TSO-NEXT:    lr.w a3, (a2)
12467; RV32IA-TSO-NEXT:    sub a5, a3, a1
12468; RV32IA-TSO-NEXT:    xor a5, a3, a5
12469; RV32IA-TSO-NEXT:    and a5, a5, a4
12470; RV32IA-TSO-NEXT:    xor a5, a3, a5
12471; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
12472; RV32IA-TSO-NEXT:    bnez a5, .LBB87_1
12473; RV32IA-TSO-NEXT:  # %bb.2:
12474; RV32IA-TSO-NEXT:    srl a0, a3, a0
12475; RV32IA-TSO-NEXT:    ret
12476;
12477; RV64I-LABEL: atomicrmw_sub_i16_release:
12478; RV64I:       # %bb.0:
12479; RV64I-NEXT:    addi sp, sp, -16
12480; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12481; RV64I-NEXT:    li a2, 3
12482; RV64I-NEXT:    call __atomic_fetch_sub_2
12483; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12484; RV64I-NEXT:    addi sp, sp, 16
12485; RV64I-NEXT:    ret
12486;
12487; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_release:
12488; RV64IA-WMO-NOZACAS:       # %bb.0:
12489; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
12490; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
12491; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
12492; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
12493; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
12494; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
12495; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
12496; RV64IA-WMO-NOZACAS-NEXT:  .LBB87_1: # =>This Inner Loop Header: Depth=1
12497; RV64IA-WMO-NOZACAS-NEXT:    lr.w a3, (a2)
12498; RV64IA-WMO-NOZACAS-NEXT:    sub a5, a3, a1
12499; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
12500; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
12501; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
12502; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12503; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB87_1
12504; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
12505; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
12506; RV64IA-WMO-NOZACAS-NEXT:    ret
12507;
12508; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_release:
12509; RV64IA-TSO-NOZACAS:       # %bb.0:
12510; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
12511; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
12512; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
12513; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
12514; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
12515; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
12516; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
12517; RV64IA-TSO-NOZACAS-NEXT:  .LBB87_1: # =>This Inner Loop Header: Depth=1
12518; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
12519; RV64IA-TSO-NOZACAS-NEXT:    sub a5, a3, a1
12520; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12521; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
12522; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12523; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
12524; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB87_1
12525; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
12526; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
12527; RV64IA-TSO-NOZACAS-NEXT:    ret
12528;
12529; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_release:
12530; RV64IA-WMO-ZACAS:       # %bb.0:
12531; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
12532; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
12533; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
12534; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
12535; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
12536; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
12537; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
12538; RV64IA-WMO-ZACAS-NEXT:  .LBB87_1: # =>This Inner Loop Header: Depth=1
12539; RV64IA-WMO-ZACAS-NEXT:    lr.w a3, (a2)
12540; RV64IA-WMO-ZACAS-NEXT:    sub a5, a3, a1
12541; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12542; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
12543; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12544; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12545; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB87_1
12546; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
12547; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
12548; RV64IA-WMO-ZACAS-NEXT:    ret
12549;
12550; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_release:
12551; RV64IA-TSO-ZACAS:       # %bb.0:
12552; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
12553; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
12554; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
12555; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
12556; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
12557; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
12558; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
12559; RV64IA-TSO-ZACAS-NEXT:  .LBB87_1: # =>This Inner Loop Header: Depth=1
12560; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
12561; RV64IA-TSO-ZACAS-NEXT:    sub a5, a3, a1
12562; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12563; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
12564; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12565; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
12566; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB87_1
12567; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
12568; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
12569; RV64IA-TSO-ZACAS-NEXT:    ret
12570;
12571; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_release:
12572; RV64IA-WMO-ZABHA:       # %bb.0:
12573; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
12574; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.rl a0, a1, (a0)
12575; RV64IA-WMO-ZABHA-NEXT:    ret
12576;
12577; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_release:
12578; RV64IA-TSO-ZABHA:       # %bb.0:
12579; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
12580; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12581; RV64IA-TSO-ZABHA-NEXT:    ret
12582  %1 = atomicrmw sub ptr %a, i16 %b release
12583  ret i16 %1
12584}
12585
12586define i16 @atomicrmw_sub_i16_acq_rel(ptr %a, i16 %b) nounwind {
12587; RV32I-LABEL: atomicrmw_sub_i16_acq_rel:
12588; RV32I:       # %bb.0:
12589; RV32I-NEXT:    addi sp, sp, -16
12590; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12591; RV32I-NEXT:    li a2, 4
12592; RV32I-NEXT:    call __atomic_fetch_sub_2
12593; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12594; RV32I-NEXT:    addi sp, sp, 16
12595; RV32I-NEXT:    ret
12596;
12597; RV32IA-WMO-LABEL: atomicrmw_sub_i16_acq_rel:
12598; RV32IA-WMO:       # %bb.0:
12599; RV32IA-WMO-NEXT:    andi a2, a0, -4
12600; RV32IA-WMO-NEXT:    slli a0, a0, 3
12601; RV32IA-WMO-NEXT:    lui a3, 16
12602; RV32IA-WMO-NEXT:    addi a3, a3, -1
12603; RV32IA-WMO-NEXT:    sll a4, a3, a0
12604; RV32IA-WMO-NEXT:    and a1, a1, a3
12605; RV32IA-WMO-NEXT:    sll a1, a1, a0
12606; RV32IA-WMO-NEXT:  .LBB88_1: # =>This Inner Loop Header: Depth=1
12607; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
12608; RV32IA-WMO-NEXT:    sub a5, a3, a1
12609; RV32IA-WMO-NEXT:    xor a5, a3, a5
12610; RV32IA-WMO-NEXT:    and a5, a5, a4
12611; RV32IA-WMO-NEXT:    xor a5, a3, a5
12612; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
12613; RV32IA-WMO-NEXT:    bnez a5, .LBB88_1
12614; RV32IA-WMO-NEXT:  # %bb.2:
12615; RV32IA-WMO-NEXT:    srl a0, a3, a0
12616; RV32IA-WMO-NEXT:    ret
12617;
12618; RV32IA-TSO-LABEL: atomicrmw_sub_i16_acq_rel:
12619; RV32IA-TSO:       # %bb.0:
12620; RV32IA-TSO-NEXT:    andi a2, a0, -4
12621; RV32IA-TSO-NEXT:    slli a0, a0, 3
12622; RV32IA-TSO-NEXT:    lui a3, 16
12623; RV32IA-TSO-NEXT:    addi a3, a3, -1
12624; RV32IA-TSO-NEXT:    sll a4, a3, a0
12625; RV32IA-TSO-NEXT:    and a1, a1, a3
12626; RV32IA-TSO-NEXT:    sll a1, a1, a0
12627; RV32IA-TSO-NEXT:  .LBB88_1: # =>This Inner Loop Header: Depth=1
12628; RV32IA-TSO-NEXT:    lr.w a3, (a2)
12629; RV32IA-TSO-NEXT:    sub a5, a3, a1
12630; RV32IA-TSO-NEXT:    xor a5, a3, a5
12631; RV32IA-TSO-NEXT:    and a5, a5, a4
12632; RV32IA-TSO-NEXT:    xor a5, a3, a5
12633; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
12634; RV32IA-TSO-NEXT:    bnez a5, .LBB88_1
12635; RV32IA-TSO-NEXT:  # %bb.2:
12636; RV32IA-TSO-NEXT:    srl a0, a3, a0
12637; RV32IA-TSO-NEXT:    ret
12638;
12639; RV64I-LABEL: atomicrmw_sub_i16_acq_rel:
12640; RV64I:       # %bb.0:
12641; RV64I-NEXT:    addi sp, sp, -16
12642; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12643; RV64I-NEXT:    li a2, 4
12644; RV64I-NEXT:    call __atomic_fetch_sub_2
12645; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12646; RV64I-NEXT:    addi sp, sp, 16
12647; RV64I-NEXT:    ret
12648;
12649; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
12650; RV64IA-WMO-NOZACAS:       # %bb.0:
12651; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
12652; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
12653; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
12654; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
12655; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
12656; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
12657; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
12658; RV64IA-WMO-NOZACAS-NEXT:  .LBB88_1: # =>This Inner Loop Header: Depth=1
12659; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
12660; RV64IA-WMO-NOZACAS-NEXT:    sub a5, a3, a1
12661; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
12662; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
12663; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
12664; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12665; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB88_1
12666; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
12667; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
12668; RV64IA-WMO-NOZACAS-NEXT:    ret
12669;
12670; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
12671; RV64IA-TSO-NOZACAS:       # %bb.0:
12672; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
12673; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
12674; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
12675; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
12676; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
12677; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
12678; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
12679; RV64IA-TSO-NOZACAS-NEXT:  .LBB88_1: # =>This Inner Loop Header: Depth=1
12680; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
12681; RV64IA-TSO-NOZACAS-NEXT:    sub a5, a3, a1
12682; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12683; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
12684; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
12685; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
12686; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB88_1
12687; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
12688; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
12689; RV64IA-TSO-NOZACAS-NEXT:    ret
12690;
12691; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
12692; RV64IA-WMO-ZACAS:       # %bb.0:
12693; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
12694; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
12695; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
12696; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
12697; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
12698; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
12699; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
12700; RV64IA-WMO-ZACAS-NEXT:  .LBB88_1: # =>This Inner Loop Header: Depth=1
12701; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
12702; RV64IA-WMO-ZACAS-NEXT:    sub a5, a3, a1
12703; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12704; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
12705; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
12706; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12707; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB88_1
12708; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
12709; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
12710; RV64IA-WMO-ZACAS-NEXT:    ret
12711;
12712; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
12713; RV64IA-TSO-ZACAS:       # %bb.0:
12714; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
12715; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
12716; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
12717; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
12718; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
12719; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
12720; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
12721; RV64IA-TSO-ZACAS-NEXT:  .LBB88_1: # =>This Inner Loop Header: Depth=1
12722; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
12723; RV64IA-TSO-ZACAS-NEXT:    sub a5, a3, a1
12724; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12725; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
12726; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
12727; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
12728; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB88_1
12729; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
12730; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
12731; RV64IA-TSO-ZACAS-NEXT:    ret
12732;
12733; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_acq_rel:
12734; RV64IA-WMO-ZABHA:       # %bb.0:
12735; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
12736; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.aqrl a0, a1, (a0)
12737; RV64IA-WMO-ZABHA-NEXT:    ret
12738;
12739; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_acq_rel:
12740; RV64IA-TSO-ZABHA:       # %bb.0:
12741; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
12742; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12743; RV64IA-TSO-ZABHA-NEXT:    ret
12744  %1 = atomicrmw sub ptr %a, i16 %b acq_rel
12745  ret i16 %1
12746}
12747
12748define i16 @atomicrmw_sub_i16_seq_cst(ptr %a, i16 %b) nounwind {
12749; RV32I-LABEL: atomicrmw_sub_i16_seq_cst:
12750; RV32I:       # %bb.0:
12751; RV32I-NEXT:    addi sp, sp, -16
12752; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12753; RV32I-NEXT:    li a2, 5
12754; RV32I-NEXT:    call __atomic_fetch_sub_2
12755; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12756; RV32I-NEXT:    addi sp, sp, 16
12757; RV32I-NEXT:    ret
12758;
12759; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst:
12760; RV32IA:       # %bb.0:
12761; RV32IA-NEXT:    andi a2, a0, -4
12762; RV32IA-NEXT:    slli a0, a0, 3
12763; RV32IA-NEXT:    lui a3, 16
12764; RV32IA-NEXT:    addi a3, a3, -1
12765; RV32IA-NEXT:    sll a4, a3, a0
12766; RV32IA-NEXT:    and a1, a1, a3
12767; RV32IA-NEXT:    sll a1, a1, a0
12768; RV32IA-NEXT:  .LBB89_1: # =>This Inner Loop Header: Depth=1
12769; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
12770; RV32IA-NEXT:    sub a5, a3, a1
12771; RV32IA-NEXT:    xor a5, a3, a5
12772; RV32IA-NEXT:    and a5, a5, a4
12773; RV32IA-NEXT:    xor a5, a3, a5
12774; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
12775; RV32IA-NEXT:    bnez a5, .LBB89_1
12776; RV32IA-NEXT:  # %bb.2:
12777; RV32IA-NEXT:    srl a0, a3, a0
12778; RV32IA-NEXT:    ret
12779;
12780; RV64I-LABEL: atomicrmw_sub_i16_seq_cst:
12781; RV64I:       # %bb.0:
12782; RV64I-NEXT:    addi sp, sp, -16
12783; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12784; RV64I-NEXT:    li a2, 5
12785; RV64I-NEXT:    call __atomic_fetch_sub_2
12786; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12787; RV64I-NEXT:    addi sp, sp, 16
12788; RV64I-NEXT:    ret
12789;
12790; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i16_seq_cst:
12791; RV64IA-NOZACAS:       # %bb.0:
12792; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
12793; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
12794; RV64IA-NOZACAS-NEXT:    lui a3, 16
12795; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
12796; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
12797; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
12798; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
12799; RV64IA-NOZACAS-NEXT:  .LBB89_1: # =>This Inner Loop Header: Depth=1
12800; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
12801; RV64IA-NOZACAS-NEXT:    sub a5, a3, a1
12802; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
12803; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
12804; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
12805; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12806; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB89_1
12807; RV64IA-NOZACAS-NEXT:  # %bb.2:
12808; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
12809; RV64IA-NOZACAS-NEXT:    ret
12810;
12811; RV64IA-ZACAS-LABEL: atomicrmw_sub_i16_seq_cst:
12812; RV64IA-ZACAS:       # %bb.0:
12813; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
12814; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
12815; RV64IA-ZACAS-NEXT:    lui a3, 16
12816; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
12817; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
12818; RV64IA-ZACAS-NEXT:    and a1, a1, a3
12819; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
12820; RV64IA-ZACAS-NEXT:  .LBB89_1: # =>This Inner Loop Header: Depth=1
12821; RV64IA-ZACAS-NEXT:    lr.w.aqrl a3, (a2)
12822; RV64IA-ZACAS-NEXT:    sub a5, a3, a1
12823; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
12824; RV64IA-ZACAS-NEXT:    and a5, a5, a4
12825; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
12826; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
12827; RV64IA-ZACAS-NEXT:    bnez a5, .LBB89_1
12828; RV64IA-ZACAS-NEXT:  # %bb.2:
12829; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
12830; RV64IA-ZACAS-NEXT:    ret
12831;
12832; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_seq_cst:
12833; RV64IA-WMO-ZABHA:       # %bb.0:
12834; RV64IA-WMO-ZABHA-NEXT:    neg a1, a1
12835; RV64IA-WMO-ZABHA-NEXT:    amoadd.h.aqrl a0, a1, (a0)
12836; RV64IA-WMO-ZABHA-NEXT:    ret
12837;
12838; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_seq_cst:
12839; RV64IA-TSO-ZABHA:       # %bb.0:
12840; RV64IA-TSO-ZABHA-NEXT:    neg a1, a1
12841; RV64IA-TSO-ZABHA-NEXT:    amoadd.h a0, a1, (a0)
12842; RV64IA-TSO-ZABHA-NEXT:    ret
12843  %1 = atomicrmw sub ptr %a, i16 %b seq_cst
12844  ret i16 %1
12845}
12846
12847define i16 @atomicrmw_and_i16_monotonic(ptr %a, i16 %b) nounwind {
12848; RV32I-LABEL: atomicrmw_and_i16_monotonic:
12849; RV32I:       # %bb.0:
12850; RV32I-NEXT:    addi sp, sp, -16
12851; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12852; RV32I-NEXT:    li a2, 0
12853; RV32I-NEXT:    call __atomic_fetch_and_2
12854; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12855; RV32I-NEXT:    addi sp, sp, 16
12856; RV32I-NEXT:    ret
12857;
12858; RV32IA-LABEL: atomicrmw_and_i16_monotonic:
12859; RV32IA:       # %bb.0:
12860; RV32IA-NEXT:    andi a2, a0, -4
12861; RV32IA-NEXT:    slli a0, a0, 3
12862; RV32IA-NEXT:    lui a3, 16
12863; RV32IA-NEXT:    addi a3, a3, -1
12864; RV32IA-NEXT:    sll a4, a3, a0
12865; RV32IA-NEXT:    and a1, a1, a3
12866; RV32IA-NEXT:    not a3, a4
12867; RV32IA-NEXT:    sll a1, a1, a0
12868; RV32IA-NEXT:    or a1, a1, a3
12869; RV32IA-NEXT:    amoand.w a1, a1, (a2)
12870; RV32IA-NEXT:    srl a0, a1, a0
12871; RV32IA-NEXT:    ret
12872;
12873; RV64I-LABEL: atomicrmw_and_i16_monotonic:
12874; RV64I:       # %bb.0:
12875; RV64I-NEXT:    addi sp, sp, -16
12876; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12877; RV64I-NEXT:    li a2, 0
12878; RV64I-NEXT:    call __atomic_fetch_and_2
12879; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12880; RV64I-NEXT:    addi sp, sp, 16
12881; RV64I-NEXT:    ret
12882;
12883; RV64IA-NOZACAS-LABEL: atomicrmw_and_i16_monotonic:
12884; RV64IA-NOZACAS:       # %bb.0:
12885; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
12886; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
12887; RV64IA-NOZACAS-NEXT:    lui a3, 16
12888; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
12889; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
12890; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
12891; RV64IA-NOZACAS-NEXT:    not a3, a4
12892; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
12893; RV64IA-NOZACAS-NEXT:    or a1, a1, a3
12894; RV64IA-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
12895; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
12896; RV64IA-NOZACAS-NEXT:    ret
12897;
12898; RV64IA-ZACAS-LABEL: atomicrmw_and_i16_monotonic:
12899; RV64IA-ZACAS:       # %bb.0:
12900; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
12901; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
12902; RV64IA-ZACAS-NEXT:    lui a3, 16
12903; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
12904; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
12905; RV64IA-ZACAS-NEXT:    and a1, a1, a3
12906; RV64IA-ZACAS-NEXT:    not a3, a4
12907; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
12908; RV64IA-ZACAS-NEXT:    or a1, a1, a3
12909; RV64IA-ZACAS-NEXT:    amoand.w a1, a1, (a2)
12910; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
12911; RV64IA-ZACAS-NEXT:    ret
12912;
12913; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_monotonic:
12914; RV64IA-WMO-ZABHA:       # %bb.0:
12915; RV64IA-WMO-ZABHA-NEXT:    amoand.h a0, a1, (a0)
12916; RV64IA-WMO-ZABHA-NEXT:    ret
12917;
12918; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_monotonic:
12919; RV64IA-TSO-ZABHA:       # %bb.0:
12920; RV64IA-TSO-ZABHA-NEXT:    amoand.h a0, a1, (a0)
12921; RV64IA-TSO-ZABHA-NEXT:    ret
12922  %1 = atomicrmw and ptr %a, i16 %b monotonic
12923  ret i16 %1
12924}
12925
12926define i16 @atomicrmw_and_i16_acquire(ptr %a, i16 %b) nounwind {
12927; RV32I-LABEL: atomicrmw_and_i16_acquire:
12928; RV32I:       # %bb.0:
12929; RV32I-NEXT:    addi sp, sp, -16
12930; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
12931; RV32I-NEXT:    li a2, 2
12932; RV32I-NEXT:    call __atomic_fetch_and_2
12933; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12934; RV32I-NEXT:    addi sp, sp, 16
12935; RV32I-NEXT:    ret
12936;
12937; RV32IA-WMO-LABEL: atomicrmw_and_i16_acquire:
12938; RV32IA-WMO:       # %bb.0:
12939; RV32IA-WMO-NEXT:    andi a2, a0, -4
12940; RV32IA-WMO-NEXT:    slli a0, a0, 3
12941; RV32IA-WMO-NEXT:    lui a3, 16
12942; RV32IA-WMO-NEXT:    addi a3, a3, -1
12943; RV32IA-WMO-NEXT:    sll a4, a3, a0
12944; RV32IA-WMO-NEXT:    and a1, a1, a3
12945; RV32IA-WMO-NEXT:    not a3, a4
12946; RV32IA-WMO-NEXT:    sll a1, a1, a0
12947; RV32IA-WMO-NEXT:    or a1, a1, a3
12948; RV32IA-WMO-NEXT:    amoand.w.aq a1, a1, (a2)
12949; RV32IA-WMO-NEXT:    srl a0, a1, a0
12950; RV32IA-WMO-NEXT:    ret
12951;
12952; RV32IA-TSO-LABEL: atomicrmw_and_i16_acquire:
12953; RV32IA-TSO:       # %bb.0:
12954; RV32IA-TSO-NEXT:    andi a2, a0, -4
12955; RV32IA-TSO-NEXT:    slli a0, a0, 3
12956; RV32IA-TSO-NEXT:    lui a3, 16
12957; RV32IA-TSO-NEXT:    addi a3, a3, -1
12958; RV32IA-TSO-NEXT:    sll a4, a3, a0
12959; RV32IA-TSO-NEXT:    and a1, a1, a3
12960; RV32IA-TSO-NEXT:    not a3, a4
12961; RV32IA-TSO-NEXT:    sll a1, a1, a0
12962; RV32IA-TSO-NEXT:    or a1, a1, a3
12963; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
12964; RV32IA-TSO-NEXT:    srl a0, a1, a0
12965; RV32IA-TSO-NEXT:    ret
12966;
12967; RV64I-LABEL: atomicrmw_and_i16_acquire:
12968; RV64I:       # %bb.0:
12969; RV64I-NEXT:    addi sp, sp, -16
12970; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12971; RV64I-NEXT:    li a2, 2
12972; RV64I-NEXT:    call __atomic_fetch_and_2
12973; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
12974; RV64I-NEXT:    addi sp, sp, 16
12975; RV64I-NEXT:    ret
12976;
12977; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_acquire:
12978; RV64IA-WMO-NOZACAS:       # %bb.0:
12979; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
12980; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
12981; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
12982; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
12983; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
12984; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
12985; RV64IA-WMO-NOZACAS-NEXT:    not a3, a4
12986; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
12987; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
12988; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aq a1, a1, (a2)
12989; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
12990; RV64IA-WMO-NOZACAS-NEXT:    ret
12991;
12992; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_acquire:
12993; RV64IA-TSO-NOZACAS:       # %bb.0:
12994; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
12995; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
12996; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
12997; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
12998; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
12999; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
13000; RV64IA-TSO-NOZACAS-NEXT:    not a3, a4
13001; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
13002; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
13003; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
13004; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
13005; RV64IA-TSO-NOZACAS-NEXT:    ret
13006;
13007; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_acquire:
13008; RV64IA-WMO-ZACAS:       # %bb.0:
13009; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
13010; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
13011; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
13012; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
13013; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
13014; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
13015; RV64IA-WMO-ZACAS-NEXT:    not a3, a4
13016; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
13017; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
13018; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aq a1, a1, (a2)
13019; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
13020; RV64IA-WMO-ZACAS-NEXT:    ret
13021;
13022; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_acquire:
13023; RV64IA-TSO-ZACAS:       # %bb.0:
13024; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
13025; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
13026; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
13027; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
13028; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
13029; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
13030; RV64IA-TSO-ZACAS-NEXT:    not a3, a4
13031; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
13032; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
13033; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
13034; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
13035; RV64IA-TSO-ZACAS-NEXT:    ret
13036;
13037; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_acquire:
13038; RV64IA-WMO-ZABHA:       # %bb.0:
13039; RV64IA-WMO-ZABHA-NEXT:    amoand.h.aq a0, a1, (a0)
13040; RV64IA-WMO-ZABHA-NEXT:    ret
13041;
13042; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_acquire:
13043; RV64IA-TSO-ZABHA:       # %bb.0:
13044; RV64IA-TSO-ZABHA-NEXT:    amoand.h a0, a1, (a0)
13045; RV64IA-TSO-ZABHA-NEXT:    ret
13046  %1 = atomicrmw and ptr %a, i16 %b acquire
13047  ret i16 %1
13048}
13049
13050define i16 @atomicrmw_and_i16_release(ptr %a, i16 %b) nounwind {
13051; RV32I-LABEL: atomicrmw_and_i16_release:
13052; RV32I:       # %bb.0:
13053; RV32I-NEXT:    addi sp, sp, -16
13054; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13055; RV32I-NEXT:    li a2, 3
13056; RV32I-NEXT:    call __atomic_fetch_and_2
13057; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13058; RV32I-NEXT:    addi sp, sp, 16
13059; RV32I-NEXT:    ret
13060;
13061; RV32IA-WMO-LABEL: atomicrmw_and_i16_release:
13062; RV32IA-WMO:       # %bb.0:
13063; RV32IA-WMO-NEXT:    andi a2, a0, -4
13064; RV32IA-WMO-NEXT:    slli a0, a0, 3
13065; RV32IA-WMO-NEXT:    lui a3, 16
13066; RV32IA-WMO-NEXT:    addi a3, a3, -1
13067; RV32IA-WMO-NEXT:    sll a4, a3, a0
13068; RV32IA-WMO-NEXT:    and a1, a1, a3
13069; RV32IA-WMO-NEXT:    not a3, a4
13070; RV32IA-WMO-NEXT:    sll a1, a1, a0
13071; RV32IA-WMO-NEXT:    or a1, a1, a3
13072; RV32IA-WMO-NEXT:    amoand.w.rl a1, a1, (a2)
13073; RV32IA-WMO-NEXT:    srl a0, a1, a0
13074; RV32IA-WMO-NEXT:    ret
13075;
13076; RV32IA-TSO-LABEL: atomicrmw_and_i16_release:
13077; RV32IA-TSO:       # %bb.0:
13078; RV32IA-TSO-NEXT:    andi a2, a0, -4
13079; RV32IA-TSO-NEXT:    slli a0, a0, 3
13080; RV32IA-TSO-NEXT:    lui a3, 16
13081; RV32IA-TSO-NEXT:    addi a3, a3, -1
13082; RV32IA-TSO-NEXT:    sll a4, a3, a0
13083; RV32IA-TSO-NEXT:    and a1, a1, a3
13084; RV32IA-TSO-NEXT:    not a3, a4
13085; RV32IA-TSO-NEXT:    sll a1, a1, a0
13086; RV32IA-TSO-NEXT:    or a1, a1, a3
13087; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
13088; RV32IA-TSO-NEXT:    srl a0, a1, a0
13089; RV32IA-TSO-NEXT:    ret
13090;
13091; RV64I-LABEL: atomicrmw_and_i16_release:
13092; RV64I:       # %bb.0:
13093; RV64I-NEXT:    addi sp, sp, -16
13094; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13095; RV64I-NEXT:    li a2, 3
13096; RV64I-NEXT:    call __atomic_fetch_and_2
13097; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13098; RV64I-NEXT:    addi sp, sp, 16
13099; RV64I-NEXT:    ret
13100;
13101; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_release:
13102; RV64IA-WMO-NOZACAS:       # %bb.0:
13103; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
13104; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
13105; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
13106; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
13107; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
13108; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
13109; RV64IA-WMO-NOZACAS-NEXT:    not a3, a4
13110; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
13111; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
13112; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.rl a1, a1, (a2)
13113; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
13114; RV64IA-WMO-NOZACAS-NEXT:    ret
13115;
13116; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_release:
13117; RV64IA-TSO-NOZACAS:       # %bb.0:
13118; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
13119; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
13120; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
13121; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
13122; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
13123; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
13124; RV64IA-TSO-NOZACAS-NEXT:    not a3, a4
13125; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
13126; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
13127; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
13128; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
13129; RV64IA-TSO-NOZACAS-NEXT:    ret
13130;
13131; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_release:
13132; RV64IA-WMO-ZACAS:       # %bb.0:
13133; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
13134; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
13135; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
13136; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
13137; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
13138; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
13139; RV64IA-WMO-ZACAS-NEXT:    not a3, a4
13140; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
13141; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
13142; RV64IA-WMO-ZACAS-NEXT:    amoand.w.rl a1, a1, (a2)
13143; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
13144; RV64IA-WMO-ZACAS-NEXT:    ret
13145;
13146; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_release:
13147; RV64IA-TSO-ZACAS:       # %bb.0:
13148; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
13149; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
13150; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
13151; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
13152; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
13153; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
13154; RV64IA-TSO-ZACAS-NEXT:    not a3, a4
13155; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
13156; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
13157; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
13158; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
13159; RV64IA-TSO-ZACAS-NEXT:    ret
13160;
13161; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_release:
13162; RV64IA-WMO-ZABHA:       # %bb.0:
13163; RV64IA-WMO-ZABHA-NEXT:    amoand.h.rl a0, a1, (a0)
13164; RV64IA-WMO-ZABHA-NEXT:    ret
13165;
13166; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_release:
13167; RV64IA-TSO-ZABHA:       # %bb.0:
13168; RV64IA-TSO-ZABHA-NEXT:    amoand.h a0, a1, (a0)
13169; RV64IA-TSO-ZABHA-NEXT:    ret
13170  %1 = atomicrmw and ptr %a, i16 %b release
13171  ret i16 %1
13172}
13173
13174define i16 @atomicrmw_and_i16_acq_rel(ptr %a, i16 %b) nounwind {
13175; RV32I-LABEL: atomicrmw_and_i16_acq_rel:
13176; RV32I:       # %bb.0:
13177; RV32I-NEXT:    addi sp, sp, -16
13178; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13179; RV32I-NEXT:    li a2, 4
13180; RV32I-NEXT:    call __atomic_fetch_and_2
13181; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13182; RV32I-NEXT:    addi sp, sp, 16
13183; RV32I-NEXT:    ret
13184;
13185; RV32IA-WMO-LABEL: atomicrmw_and_i16_acq_rel:
13186; RV32IA-WMO:       # %bb.0:
13187; RV32IA-WMO-NEXT:    andi a2, a0, -4
13188; RV32IA-WMO-NEXT:    slli a0, a0, 3
13189; RV32IA-WMO-NEXT:    lui a3, 16
13190; RV32IA-WMO-NEXT:    addi a3, a3, -1
13191; RV32IA-WMO-NEXT:    sll a4, a3, a0
13192; RV32IA-WMO-NEXT:    and a1, a1, a3
13193; RV32IA-WMO-NEXT:    not a3, a4
13194; RV32IA-WMO-NEXT:    sll a1, a1, a0
13195; RV32IA-WMO-NEXT:    or a1, a1, a3
13196; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a1, (a2)
13197; RV32IA-WMO-NEXT:    srl a0, a1, a0
13198; RV32IA-WMO-NEXT:    ret
13199;
13200; RV32IA-TSO-LABEL: atomicrmw_and_i16_acq_rel:
13201; RV32IA-TSO:       # %bb.0:
13202; RV32IA-TSO-NEXT:    andi a2, a0, -4
13203; RV32IA-TSO-NEXT:    slli a0, a0, 3
13204; RV32IA-TSO-NEXT:    lui a3, 16
13205; RV32IA-TSO-NEXT:    addi a3, a3, -1
13206; RV32IA-TSO-NEXT:    sll a4, a3, a0
13207; RV32IA-TSO-NEXT:    and a1, a1, a3
13208; RV32IA-TSO-NEXT:    not a3, a4
13209; RV32IA-TSO-NEXT:    sll a1, a1, a0
13210; RV32IA-TSO-NEXT:    or a1, a1, a3
13211; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
13212; RV32IA-TSO-NEXT:    srl a0, a1, a0
13213; RV32IA-TSO-NEXT:    ret
13214;
13215; RV64I-LABEL: atomicrmw_and_i16_acq_rel:
13216; RV64I:       # %bb.0:
13217; RV64I-NEXT:    addi sp, sp, -16
13218; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13219; RV64I-NEXT:    li a2, 4
13220; RV64I-NEXT:    call __atomic_fetch_and_2
13221; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13222; RV64I-NEXT:    addi sp, sp, 16
13223; RV64I-NEXT:    ret
13224;
13225; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_acq_rel:
13226; RV64IA-WMO-NOZACAS:       # %bb.0:
13227; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
13228; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
13229; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
13230; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
13231; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
13232; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
13233; RV64IA-WMO-NOZACAS-NEXT:    not a3, a4
13234; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
13235; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
13236; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
13237; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
13238; RV64IA-WMO-NOZACAS-NEXT:    ret
13239;
13240; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_acq_rel:
13241; RV64IA-TSO-NOZACAS:       # %bb.0:
13242; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
13243; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
13244; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
13245; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
13246; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
13247; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
13248; RV64IA-TSO-NOZACAS-NEXT:    not a3, a4
13249; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
13250; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
13251; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
13252; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
13253; RV64IA-TSO-NOZACAS-NEXT:    ret
13254;
13255; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_acq_rel:
13256; RV64IA-WMO-ZACAS:       # %bb.0:
13257; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
13258; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
13259; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
13260; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
13261; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
13262; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
13263; RV64IA-WMO-ZACAS-NEXT:    not a3, a4
13264; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
13265; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
13266; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
13267; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
13268; RV64IA-WMO-ZACAS-NEXT:    ret
13269;
13270; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_acq_rel:
13271; RV64IA-TSO-ZACAS:       # %bb.0:
13272; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
13273; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
13274; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
13275; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
13276; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
13277; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
13278; RV64IA-TSO-ZACAS-NEXT:    not a3, a4
13279; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
13280; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
13281; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
13282; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
13283; RV64IA-TSO-ZACAS-NEXT:    ret
13284;
13285; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_acq_rel:
13286; RV64IA-WMO-ZABHA:       # %bb.0:
13287; RV64IA-WMO-ZABHA-NEXT:    amoand.h.aqrl a0, a1, (a0)
13288; RV64IA-WMO-ZABHA-NEXT:    ret
13289;
13290; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_acq_rel:
13291; RV64IA-TSO-ZABHA:       # %bb.0:
13292; RV64IA-TSO-ZABHA-NEXT:    amoand.h a0, a1, (a0)
13293; RV64IA-TSO-ZABHA-NEXT:    ret
13294  %1 = atomicrmw and ptr %a, i16 %b acq_rel
13295  ret i16 %1
13296}
13297
13298define i16 @atomicrmw_and_i16_seq_cst(ptr %a, i16 %b) nounwind {
13299; RV32I-LABEL: atomicrmw_and_i16_seq_cst:
13300; RV32I:       # %bb.0:
13301; RV32I-NEXT:    addi sp, sp, -16
13302; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13303; RV32I-NEXT:    li a2, 5
13304; RV32I-NEXT:    call __atomic_fetch_and_2
13305; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13306; RV32I-NEXT:    addi sp, sp, 16
13307; RV32I-NEXT:    ret
13308;
13309; RV32IA-WMO-LABEL: atomicrmw_and_i16_seq_cst:
13310; RV32IA-WMO:       # %bb.0:
13311; RV32IA-WMO-NEXT:    andi a2, a0, -4
13312; RV32IA-WMO-NEXT:    slli a0, a0, 3
13313; RV32IA-WMO-NEXT:    lui a3, 16
13314; RV32IA-WMO-NEXT:    addi a3, a3, -1
13315; RV32IA-WMO-NEXT:    sll a4, a3, a0
13316; RV32IA-WMO-NEXT:    and a1, a1, a3
13317; RV32IA-WMO-NEXT:    not a3, a4
13318; RV32IA-WMO-NEXT:    sll a1, a1, a0
13319; RV32IA-WMO-NEXT:    or a1, a1, a3
13320; RV32IA-WMO-NEXT:    amoand.w.aqrl a1, a1, (a2)
13321; RV32IA-WMO-NEXT:    srl a0, a1, a0
13322; RV32IA-WMO-NEXT:    ret
13323;
13324; RV32IA-TSO-LABEL: atomicrmw_and_i16_seq_cst:
13325; RV32IA-TSO:       # %bb.0:
13326; RV32IA-TSO-NEXT:    andi a2, a0, -4
13327; RV32IA-TSO-NEXT:    slli a0, a0, 3
13328; RV32IA-TSO-NEXT:    lui a3, 16
13329; RV32IA-TSO-NEXT:    addi a3, a3, -1
13330; RV32IA-TSO-NEXT:    sll a4, a3, a0
13331; RV32IA-TSO-NEXT:    and a1, a1, a3
13332; RV32IA-TSO-NEXT:    not a3, a4
13333; RV32IA-TSO-NEXT:    sll a1, a1, a0
13334; RV32IA-TSO-NEXT:    or a1, a1, a3
13335; RV32IA-TSO-NEXT:    amoand.w a1, a1, (a2)
13336; RV32IA-TSO-NEXT:    srl a0, a1, a0
13337; RV32IA-TSO-NEXT:    ret
13338;
13339; RV64I-LABEL: atomicrmw_and_i16_seq_cst:
13340; RV64I:       # %bb.0:
13341; RV64I-NEXT:    addi sp, sp, -16
13342; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13343; RV64I-NEXT:    li a2, 5
13344; RV64I-NEXT:    call __atomic_fetch_and_2
13345; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13346; RV64I-NEXT:    addi sp, sp, 16
13347; RV64I-NEXT:    ret
13348;
13349; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_seq_cst:
13350; RV64IA-WMO-NOZACAS:       # %bb.0:
13351; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
13352; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
13353; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
13354; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
13355; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
13356; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
13357; RV64IA-WMO-NOZACAS-NEXT:    not a3, a4
13358; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
13359; RV64IA-WMO-NOZACAS-NEXT:    or a1, a1, a3
13360; RV64IA-WMO-NOZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
13361; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
13362; RV64IA-WMO-NOZACAS-NEXT:    ret
13363;
13364; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_seq_cst:
13365; RV64IA-TSO-NOZACAS:       # %bb.0:
13366; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
13367; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
13368; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
13369; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
13370; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
13371; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
13372; RV64IA-TSO-NOZACAS-NEXT:    not a3, a4
13373; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
13374; RV64IA-TSO-NOZACAS-NEXT:    or a1, a1, a3
13375; RV64IA-TSO-NOZACAS-NEXT:    amoand.w a1, a1, (a2)
13376; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
13377; RV64IA-TSO-NOZACAS-NEXT:    ret
13378;
13379; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_seq_cst:
13380; RV64IA-WMO-ZACAS:       # %bb.0:
13381; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
13382; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
13383; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
13384; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
13385; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
13386; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
13387; RV64IA-WMO-ZACAS-NEXT:    not a3, a4
13388; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
13389; RV64IA-WMO-ZACAS-NEXT:    or a1, a1, a3
13390; RV64IA-WMO-ZACAS-NEXT:    amoand.w.aqrl a1, a1, (a2)
13391; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
13392; RV64IA-WMO-ZACAS-NEXT:    ret
13393;
13394; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_seq_cst:
13395; RV64IA-TSO-ZACAS:       # %bb.0:
13396; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
13397; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
13398; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
13399; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
13400; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
13401; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
13402; RV64IA-TSO-ZACAS-NEXT:    not a3, a4
13403; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
13404; RV64IA-TSO-ZACAS-NEXT:    or a1, a1, a3
13405; RV64IA-TSO-ZACAS-NEXT:    amoand.w a1, a1, (a2)
13406; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
13407; RV64IA-TSO-ZACAS-NEXT:    ret
13408;
13409; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_seq_cst:
13410; RV64IA-WMO-ZABHA:       # %bb.0:
13411; RV64IA-WMO-ZABHA-NEXT:    amoand.h.aqrl a0, a1, (a0)
13412; RV64IA-WMO-ZABHA-NEXT:    ret
13413;
13414; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_seq_cst:
13415; RV64IA-TSO-ZABHA:       # %bb.0:
13416; RV64IA-TSO-ZABHA-NEXT:    amoand.h a0, a1, (a0)
13417; RV64IA-TSO-ZABHA-NEXT:    ret
13418  %1 = atomicrmw and ptr %a, i16 %b seq_cst
13419  ret i16 %1
13420}
13421
13422define i16 @atomicrmw_nand_i16_monotonic(ptr %a, i16 %b) nounwind {
13423; RV32I-LABEL: atomicrmw_nand_i16_monotonic:
13424; RV32I:       # %bb.0:
13425; RV32I-NEXT:    addi sp, sp, -16
13426; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13427; RV32I-NEXT:    li a2, 0
13428; RV32I-NEXT:    call __atomic_fetch_nand_2
13429; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13430; RV32I-NEXT:    addi sp, sp, 16
13431; RV32I-NEXT:    ret
13432;
13433; RV32IA-LABEL: atomicrmw_nand_i16_monotonic:
13434; RV32IA:       # %bb.0:
13435; RV32IA-NEXT:    andi a2, a0, -4
13436; RV32IA-NEXT:    slli a0, a0, 3
13437; RV32IA-NEXT:    lui a3, 16
13438; RV32IA-NEXT:    addi a3, a3, -1
13439; RV32IA-NEXT:    sll a4, a3, a0
13440; RV32IA-NEXT:    and a1, a1, a3
13441; RV32IA-NEXT:    sll a1, a1, a0
13442; RV32IA-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
13443; RV32IA-NEXT:    lr.w a3, (a2)
13444; RV32IA-NEXT:    and a5, a3, a1
13445; RV32IA-NEXT:    not a5, a5
13446; RV32IA-NEXT:    xor a5, a3, a5
13447; RV32IA-NEXT:    and a5, a5, a4
13448; RV32IA-NEXT:    xor a5, a3, a5
13449; RV32IA-NEXT:    sc.w a5, a5, (a2)
13450; RV32IA-NEXT:    bnez a5, .LBB95_1
13451; RV32IA-NEXT:  # %bb.2:
13452; RV32IA-NEXT:    srl a0, a3, a0
13453; RV32IA-NEXT:    ret
13454;
13455; RV64I-LABEL: atomicrmw_nand_i16_monotonic:
13456; RV64I:       # %bb.0:
13457; RV64I-NEXT:    addi sp, sp, -16
13458; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13459; RV64I-NEXT:    li a2, 0
13460; RV64I-NEXT:    call __atomic_fetch_nand_2
13461; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13462; RV64I-NEXT:    addi sp, sp, 16
13463; RV64I-NEXT:    ret
13464;
13465; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic:
13466; RV64IA-NOZACAS:       # %bb.0:
13467; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
13468; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
13469; RV64IA-NOZACAS-NEXT:    lui a3, 16
13470; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
13471; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
13472; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
13473; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
13474; RV64IA-NOZACAS-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
13475; RV64IA-NOZACAS-NEXT:    lr.w a3, (a2)
13476; RV64IA-NOZACAS-NEXT:    and a5, a3, a1
13477; RV64IA-NOZACAS-NEXT:    not a5, a5
13478; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
13479; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
13480; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
13481; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13482; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB95_1
13483; RV64IA-NOZACAS-NEXT:  # %bb.2:
13484; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
13485; RV64IA-NOZACAS-NEXT:    ret
13486;
13487; RV64IA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic:
13488; RV64IA-ZACAS:       # %bb.0:
13489; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
13490; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
13491; RV64IA-ZACAS-NEXT:    lui a3, 16
13492; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
13493; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
13494; RV64IA-ZACAS-NEXT:    and a1, a1, a3
13495; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
13496; RV64IA-ZACAS-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
13497; RV64IA-ZACAS-NEXT:    lr.w a3, (a2)
13498; RV64IA-ZACAS-NEXT:    and a5, a3, a1
13499; RV64IA-ZACAS-NEXT:    not a5, a5
13500; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
13501; RV64IA-ZACAS-NEXT:    and a5, a5, a4
13502; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
13503; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
13504; RV64IA-ZACAS-NEXT:    bnez a5, .LBB95_1
13505; RV64IA-ZACAS-NEXT:  # %bb.2:
13506; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
13507; RV64IA-ZACAS-NEXT:    ret
13508;
13509; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic:
13510; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
13511; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
13512; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
13513; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lui a3, 16
13514; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
13515; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
13516; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
13517; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
13518; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
13519; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w a3, (a2)
13520; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
13521; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
13522; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13523; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
13524; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13525; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13526; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB95_1
13527; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
13528; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
13529; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
13530;
13531; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic:
13532; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
13533; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
13534; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
13535; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lui a3, 16
13536; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
13537; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
13538; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
13539; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
13540; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
13541; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a3, (a2)
13542; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
13543; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
13544; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13545; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
13546; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13547; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13548; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB95_1
13549; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
13550; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
13551; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
13552;
13553; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic:
13554; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
13555; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
13556; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
13557; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB95_1: # %atomicrmw.start
13558; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
13559; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
13560; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
13561; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
13562; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.h a0, a3, (a2)
13563; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
13564; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB95_1
13565; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
13566; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
13567;
13568; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic:
13569; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
13570; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
13571; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
13572; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB95_1: # %atomicrmw.start
13573; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
13574; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
13575; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
13576; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
13577; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.h a0, a3, (a2)
13578; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
13579; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB95_1
13580; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
13581; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
13582  %1 = atomicrmw nand ptr %a, i16 %b monotonic
13583  ret i16 %1
13584}
13585
13586define i16 @atomicrmw_nand_i16_acquire(ptr %a, i16 %b) nounwind {
13587; RV32I-LABEL: atomicrmw_nand_i16_acquire:
13588; RV32I:       # %bb.0:
13589; RV32I-NEXT:    addi sp, sp, -16
13590; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13591; RV32I-NEXT:    li a2, 2
13592; RV32I-NEXT:    call __atomic_fetch_nand_2
13593; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13594; RV32I-NEXT:    addi sp, sp, 16
13595; RV32I-NEXT:    ret
13596;
13597; RV32IA-WMO-LABEL: atomicrmw_nand_i16_acquire:
13598; RV32IA-WMO:       # %bb.0:
13599; RV32IA-WMO-NEXT:    andi a2, a0, -4
13600; RV32IA-WMO-NEXT:    slli a0, a0, 3
13601; RV32IA-WMO-NEXT:    lui a3, 16
13602; RV32IA-WMO-NEXT:    addi a3, a3, -1
13603; RV32IA-WMO-NEXT:    sll a4, a3, a0
13604; RV32IA-WMO-NEXT:    and a1, a1, a3
13605; RV32IA-WMO-NEXT:    sll a1, a1, a0
13606; RV32IA-WMO-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13607; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
13608; RV32IA-WMO-NEXT:    and a5, a3, a1
13609; RV32IA-WMO-NEXT:    not a5, a5
13610; RV32IA-WMO-NEXT:    xor a5, a3, a5
13611; RV32IA-WMO-NEXT:    and a5, a5, a4
13612; RV32IA-WMO-NEXT:    xor a5, a3, a5
13613; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
13614; RV32IA-WMO-NEXT:    bnez a5, .LBB96_1
13615; RV32IA-WMO-NEXT:  # %bb.2:
13616; RV32IA-WMO-NEXT:    srl a0, a3, a0
13617; RV32IA-WMO-NEXT:    ret
13618;
13619; RV32IA-TSO-LABEL: atomicrmw_nand_i16_acquire:
13620; RV32IA-TSO:       # %bb.0:
13621; RV32IA-TSO-NEXT:    andi a2, a0, -4
13622; RV32IA-TSO-NEXT:    slli a0, a0, 3
13623; RV32IA-TSO-NEXT:    lui a3, 16
13624; RV32IA-TSO-NEXT:    addi a3, a3, -1
13625; RV32IA-TSO-NEXT:    sll a4, a3, a0
13626; RV32IA-TSO-NEXT:    and a1, a1, a3
13627; RV32IA-TSO-NEXT:    sll a1, a1, a0
13628; RV32IA-TSO-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13629; RV32IA-TSO-NEXT:    lr.w a3, (a2)
13630; RV32IA-TSO-NEXT:    and a5, a3, a1
13631; RV32IA-TSO-NEXT:    not a5, a5
13632; RV32IA-TSO-NEXT:    xor a5, a3, a5
13633; RV32IA-TSO-NEXT:    and a5, a5, a4
13634; RV32IA-TSO-NEXT:    xor a5, a3, a5
13635; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
13636; RV32IA-TSO-NEXT:    bnez a5, .LBB96_1
13637; RV32IA-TSO-NEXT:  # %bb.2:
13638; RV32IA-TSO-NEXT:    srl a0, a3, a0
13639; RV32IA-TSO-NEXT:    ret
13640;
13641; RV64I-LABEL: atomicrmw_nand_i16_acquire:
13642; RV64I:       # %bb.0:
13643; RV64I-NEXT:    addi sp, sp, -16
13644; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13645; RV64I-NEXT:    li a2, 2
13646; RV64I-NEXT:    call __atomic_fetch_nand_2
13647; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13648; RV64I-NEXT:    addi sp, sp, 16
13649; RV64I-NEXT:    ret
13650;
13651; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
13652; RV64IA-WMO-NOZACAS:       # %bb.0:
13653; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
13654; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
13655; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
13656; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
13657; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
13658; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
13659; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
13660; RV64IA-WMO-NOZACAS-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13661; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
13662; RV64IA-WMO-NOZACAS-NEXT:    and a5, a3, a1
13663; RV64IA-WMO-NOZACAS-NEXT:    not a5, a5
13664; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
13665; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
13666; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
13667; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13668; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB96_1
13669; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
13670; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
13671; RV64IA-WMO-NOZACAS-NEXT:    ret
13672;
13673; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
13674; RV64IA-TSO-NOZACAS:       # %bb.0:
13675; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
13676; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
13677; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
13678; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
13679; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
13680; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
13681; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
13682; RV64IA-TSO-NOZACAS-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13683; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
13684; RV64IA-TSO-NOZACAS-NEXT:    and a5, a3, a1
13685; RV64IA-TSO-NOZACAS-NEXT:    not a5, a5
13686; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
13687; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
13688; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
13689; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13690; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB96_1
13691; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
13692; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
13693; RV64IA-TSO-NOZACAS-NEXT:    ret
13694;
13695; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
13696; RV64IA-WMO-ZACAS:       # %bb.0:
13697; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
13698; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
13699; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
13700; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
13701; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
13702; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
13703; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
13704; RV64IA-WMO-ZACAS-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13705; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
13706; RV64IA-WMO-ZACAS-NEXT:    and a5, a3, a1
13707; RV64IA-WMO-ZACAS-NEXT:    not a5, a5
13708; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
13709; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
13710; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
13711; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
13712; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB96_1
13713; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
13714; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
13715; RV64IA-WMO-ZACAS-NEXT:    ret
13716;
13717; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
13718; RV64IA-TSO-ZACAS:       # %bb.0:
13719; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
13720; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
13721; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
13722; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
13723; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
13724; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
13725; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
13726; RV64IA-TSO-ZACAS-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13727; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
13728; RV64IA-TSO-ZACAS-NEXT:    and a5, a3, a1
13729; RV64IA-TSO-ZACAS-NEXT:    not a5, a5
13730; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
13731; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
13732; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
13733; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
13734; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB96_1
13735; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
13736; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
13737; RV64IA-TSO-ZACAS-NEXT:    ret
13738;
13739; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
13740; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
13741; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
13742; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
13743; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lui a3, 16
13744; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
13745; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
13746; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
13747; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
13748; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13749; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aq a3, (a2)
13750; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
13751; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
13752; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13753; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
13754; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13755; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13756; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB96_1
13757; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
13758; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
13759; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
13760;
13761; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
13762; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
13763; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
13764; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
13765; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lui a3, 16
13766; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
13767; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
13768; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
13769; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
13770; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
13771; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a3, (a2)
13772; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
13773; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
13774; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13775; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
13776; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13777; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13778; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB96_1
13779; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
13780; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
13781; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
13782;
13783; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
13784; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
13785; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
13786; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
13787; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB96_1: # %atomicrmw.start
13788; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
13789; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
13790; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
13791; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
13792; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.h.aq a0, a3, (a2)
13793; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
13794; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB96_1
13795; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
13796; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
13797;
13798; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
13799; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
13800; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
13801; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
13802; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB96_1: # %atomicrmw.start
13803; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
13804; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
13805; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
13806; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
13807; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.h a0, a3, (a2)
13808; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
13809; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB96_1
13810; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
13811; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
13812  %1 = atomicrmw nand ptr %a, i16 %b acquire
13813  ret i16 %1
13814}
13815
13816define i16 @atomicrmw_nand_i16_release(ptr %a, i16 %b) nounwind {
13817; RV32I-LABEL: atomicrmw_nand_i16_release:
13818; RV32I:       # %bb.0:
13819; RV32I-NEXT:    addi sp, sp, -16
13820; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13821; RV32I-NEXT:    li a2, 3
13822; RV32I-NEXT:    call __atomic_fetch_nand_2
13823; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13824; RV32I-NEXT:    addi sp, sp, 16
13825; RV32I-NEXT:    ret
13826;
13827; RV32IA-WMO-LABEL: atomicrmw_nand_i16_release:
13828; RV32IA-WMO:       # %bb.0:
13829; RV32IA-WMO-NEXT:    andi a2, a0, -4
13830; RV32IA-WMO-NEXT:    slli a0, a0, 3
13831; RV32IA-WMO-NEXT:    lui a3, 16
13832; RV32IA-WMO-NEXT:    addi a3, a3, -1
13833; RV32IA-WMO-NEXT:    sll a4, a3, a0
13834; RV32IA-WMO-NEXT:    and a1, a1, a3
13835; RV32IA-WMO-NEXT:    sll a1, a1, a0
13836; RV32IA-WMO-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
13837; RV32IA-WMO-NEXT:    lr.w a3, (a2)
13838; RV32IA-WMO-NEXT:    and a5, a3, a1
13839; RV32IA-WMO-NEXT:    not a5, a5
13840; RV32IA-WMO-NEXT:    xor a5, a3, a5
13841; RV32IA-WMO-NEXT:    and a5, a5, a4
13842; RV32IA-WMO-NEXT:    xor a5, a3, a5
13843; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
13844; RV32IA-WMO-NEXT:    bnez a5, .LBB97_1
13845; RV32IA-WMO-NEXT:  # %bb.2:
13846; RV32IA-WMO-NEXT:    srl a0, a3, a0
13847; RV32IA-WMO-NEXT:    ret
13848;
13849; RV32IA-TSO-LABEL: atomicrmw_nand_i16_release:
13850; RV32IA-TSO:       # %bb.0:
13851; RV32IA-TSO-NEXT:    andi a2, a0, -4
13852; RV32IA-TSO-NEXT:    slli a0, a0, 3
13853; RV32IA-TSO-NEXT:    lui a3, 16
13854; RV32IA-TSO-NEXT:    addi a3, a3, -1
13855; RV32IA-TSO-NEXT:    sll a4, a3, a0
13856; RV32IA-TSO-NEXT:    and a1, a1, a3
13857; RV32IA-TSO-NEXT:    sll a1, a1, a0
13858; RV32IA-TSO-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
13859; RV32IA-TSO-NEXT:    lr.w a3, (a2)
13860; RV32IA-TSO-NEXT:    and a5, a3, a1
13861; RV32IA-TSO-NEXT:    not a5, a5
13862; RV32IA-TSO-NEXT:    xor a5, a3, a5
13863; RV32IA-TSO-NEXT:    and a5, a5, a4
13864; RV32IA-TSO-NEXT:    xor a5, a3, a5
13865; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
13866; RV32IA-TSO-NEXT:    bnez a5, .LBB97_1
13867; RV32IA-TSO-NEXT:  # %bb.2:
13868; RV32IA-TSO-NEXT:    srl a0, a3, a0
13869; RV32IA-TSO-NEXT:    ret
13870;
13871; RV64I-LABEL: atomicrmw_nand_i16_release:
13872; RV64I:       # %bb.0:
13873; RV64I-NEXT:    addi sp, sp, -16
13874; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
13875; RV64I-NEXT:    li a2, 3
13876; RV64I-NEXT:    call __atomic_fetch_nand_2
13877; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13878; RV64I-NEXT:    addi sp, sp, 16
13879; RV64I-NEXT:    ret
13880;
13881; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_release:
13882; RV64IA-WMO-NOZACAS:       # %bb.0:
13883; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
13884; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
13885; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
13886; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
13887; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
13888; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
13889; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
13890; RV64IA-WMO-NOZACAS-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
13891; RV64IA-WMO-NOZACAS-NEXT:    lr.w a3, (a2)
13892; RV64IA-WMO-NOZACAS-NEXT:    and a5, a3, a1
13893; RV64IA-WMO-NOZACAS-NEXT:    not a5, a5
13894; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
13895; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
13896; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
13897; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
13898; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB97_1
13899; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
13900; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
13901; RV64IA-WMO-NOZACAS-NEXT:    ret
13902;
13903; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_release:
13904; RV64IA-TSO-NOZACAS:       # %bb.0:
13905; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
13906; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
13907; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
13908; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
13909; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
13910; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
13911; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
13912; RV64IA-TSO-NOZACAS-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
13913; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
13914; RV64IA-TSO-NOZACAS-NEXT:    and a5, a3, a1
13915; RV64IA-TSO-NOZACAS-NEXT:    not a5, a5
13916; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
13917; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
13918; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
13919; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
13920; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB97_1
13921; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
13922; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
13923; RV64IA-TSO-NOZACAS-NEXT:    ret
13924;
13925; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_release:
13926; RV64IA-WMO-ZACAS:       # %bb.0:
13927; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
13928; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
13929; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
13930; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
13931; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
13932; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
13933; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
13934; RV64IA-WMO-ZACAS-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
13935; RV64IA-WMO-ZACAS-NEXT:    lr.w a3, (a2)
13936; RV64IA-WMO-ZACAS-NEXT:    and a5, a3, a1
13937; RV64IA-WMO-ZACAS-NEXT:    not a5, a5
13938; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
13939; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
13940; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
13941; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
13942; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB97_1
13943; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
13944; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
13945; RV64IA-WMO-ZACAS-NEXT:    ret
13946;
13947; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_release:
13948; RV64IA-TSO-ZACAS:       # %bb.0:
13949; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
13950; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
13951; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
13952; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
13953; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
13954; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
13955; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
13956; RV64IA-TSO-ZACAS-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
13957; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
13958; RV64IA-TSO-ZACAS-NEXT:    and a5, a3, a1
13959; RV64IA-TSO-ZACAS-NEXT:    not a5, a5
13960; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
13961; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
13962; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
13963; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
13964; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB97_1
13965; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
13966; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
13967; RV64IA-TSO-ZACAS-NEXT:    ret
13968;
13969; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_release:
13970; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
13971; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
13972; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
13973; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lui a3, 16
13974; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
13975; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
13976; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
13977; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
13978; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
13979; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w a3, (a2)
13980; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
13981; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
13982; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13983; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
13984; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
13985; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
13986; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB97_1
13987; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
13988; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
13989; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
13990;
13991; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_release:
13992; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
13993; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
13994; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
13995; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lui a3, 16
13996; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
13997; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
13998; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
13999; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
14000; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
14001; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a3, (a2)
14002; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
14003; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
14004; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14005; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
14006; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14007; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
14008; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB97_1
14009; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
14010; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
14011; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
14012;
14013; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_release:
14014; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
14015; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
14016; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
14017; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB97_1: # %atomicrmw.start
14018; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
14019; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
14020; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
14021; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
14022; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.h.rl a0, a3, (a2)
14023; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
14024; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB97_1
14025; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
14026; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
14027;
14028; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_release:
14029; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
14030; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
14031; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
14032; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB97_1: # %atomicrmw.start
14033; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
14034; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
14035; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
14036; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
14037; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.h a0, a3, (a2)
14038; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
14039; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB97_1
14040; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
14041; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
14042  %1 = atomicrmw nand ptr %a, i16 %b release
14043  ret i16 %1
14044}
14045
14046define i16 @atomicrmw_nand_i16_acq_rel(ptr %a, i16 %b) nounwind {
14047; RV32I-LABEL: atomicrmw_nand_i16_acq_rel:
14048; RV32I:       # %bb.0:
14049; RV32I-NEXT:    addi sp, sp, -16
14050; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14051; RV32I-NEXT:    li a2, 4
14052; RV32I-NEXT:    call __atomic_fetch_nand_2
14053; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14054; RV32I-NEXT:    addi sp, sp, 16
14055; RV32I-NEXT:    ret
14056;
14057; RV32IA-WMO-LABEL: atomicrmw_nand_i16_acq_rel:
14058; RV32IA-WMO:       # %bb.0:
14059; RV32IA-WMO-NEXT:    andi a2, a0, -4
14060; RV32IA-WMO-NEXT:    slli a0, a0, 3
14061; RV32IA-WMO-NEXT:    lui a3, 16
14062; RV32IA-WMO-NEXT:    addi a3, a3, -1
14063; RV32IA-WMO-NEXT:    sll a4, a3, a0
14064; RV32IA-WMO-NEXT:    and a1, a1, a3
14065; RV32IA-WMO-NEXT:    sll a1, a1, a0
14066; RV32IA-WMO-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14067; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
14068; RV32IA-WMO-NEXT:    and a5, a3, a1
14069; RV32IA-WMO-NEXT:    not a5, a5
14070; RV32IA-WMO-NEXT:    xor a5, a3, a5
14071; RV32IA-WMO-NEXT:    and a5, a5, a4
14072; RV32IA-WMO-NEXT:    xor a5, a3, a5
14073; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
14074; RV32IA-WMO-NEXT:    bnez a5, .LBB98_1
14075; RV32IA-WMO-NEXT:  # %bb.2:
14076; RV32IA-WMO-NEXT:    srl a0, a3, a0
14077; RV32IA-WMO-NEXT:    ret
14078;
14079; RV32IA-TSO-LABEL: atomicrmw_nand_i16_acq_rel:
14080; RV32IA-TSO:       # %bb.0:
14081; RV32IA-TSO-NEXT:    andi a2, a0, -4
14082; RV32IA-TSO-NEXT:    slli a0, a0, 3
14083; RV32IA-TSO-NEXT:    lui a3, 16
14084; RV32IA-TSO-NEXT:    addi a3, a3, -1
14085; RV32IA-TSO-NEXT:    sll a4, a3, a0
14086; RV32IA-TSO-NEXT:    and a1, a1, a3
14087; RV32IA-TSO-NEXT:    sll a1, a1, a0
14088; RV32IA-TSO-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14089; RV32IA-TSO-NEXT:    lr.w a3, (a2)
14090; RV32IA-TSO-NEXT:    and a5, a3, a1
14091; RV32IA-TSO-NEXT:    not a5, a5
14092; RV32IA-TSO-NEXT:    xor a5, a3, a5
14093; RV32IA-TSO-NEXT:    and a5, a5, a4
14094; RV32IA-TSO-NEXT:    xor a5, a3, a5
14095; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
14096; RV32IA-TSO-NEXT:    bnez a5, .LBB98_1
14097; RV32IA-TSO-NEXT:  # %bb.2:
14098; RV32IA-TSO-NEXT:    srl a0, a3, a0
14099; RV32IA-TSO-NEXT:    ret
14100;
14101; RV64I-LABEL: atomicrmw_nand_i16_acq_rel:
14102; RV64I:       # %bb.0:
14103; RV64I-NEXT:    addi sp, sp, -16
14104; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14105; RV64I-NEXT:    li a2, 4
14106; RV64I-NEXT:    call __atomic_fetch_nand_2
14107; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14108; RV64I-NEXT:    addi sp, sp, 16
14109; RV64I-NEXT:    ret
14110;
14111; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14112; RV64IA-WMO-NOZACAS:       # %bb.0:
14113; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
14114; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
14115; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
14116; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
14117; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
14118; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
14119; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
14120; RV64IA-WMO-NOZACAS-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14121; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
14122; RV64IA-WMO-NOZACAS-NEXT:    and a5, a3, a1
14123; RV64IA-WMO-NOZACAS-NEXT:    not a5, a5
14124; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
14125; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
14126; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
14127; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
14128; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB98_1
14129; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
14130; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
14131; RV64IA-WMO-NOZACAS-NEXT:    ret
14132;
14133; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14134; RV64IA-TSO-NOZACAS:       # %bb.0:
14135; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
14136; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
14137; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
14138; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
14139; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
14140; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
14141; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
14142; RV64IA-TSO-NOZACAS-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14143; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
14144; RV64IA-TSO-NOZACAS-NEXT:    and a5, a3, a1
14145; RV64IA-TSO-NOZACAS-NEXT:    not a5, a5
14146; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
14147; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
14148; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
14149; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
14150; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB98_1
14151; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
14152; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
14153; RV64IA-TSO-NOZACAS-NEXT:    ret
14154;
14155; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14156; RV64IA-WMO-ZACAS:       # %bb.0:
14157; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
14158; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
14159; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
14160; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
14161; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
14162; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
14163; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
14164; RV64IA-WMO-ZACAS-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14165; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
14166; RV64IA-WMO-ZACAS-NEXT:    and a5, a3, a1
14167; RV64IA-WMO-ZACAS-NEXT:    not a5, a5
14168; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
14169; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
14170; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
14171; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
14172; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB98_1
14173; RV64IA-WMO-ZACAS-NEXT:  # %bb.2:
14174; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
14175; RV64IA-WMO-ZACAS-NEXT:    ret
14176;
14177; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14178; RV64IA-TSO-ZACAS:       # %bb.0:
14179; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
14180; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
14181; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
14182; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
14183; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
14184; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
14185; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
14186; RV64IA-TSO-ZACAS-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14187; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
14188; RV64IA-TSO-ZACAS-NEXT:    and a5, a3, a1
14189; RV64IA-TSO-ZACAS-NEXT:    not a5, a5
14190; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
14191; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
14192; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
14193; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
14194; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB98_1
14195; RV64IA-TSO-ZACAS-NEXT:  # %bb.2:
14196; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
14197; RV64IA-TSO-ZACAS-NEXT:    ret
14198;
14199; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14200; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
14201; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
14202; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
14203; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lui a3, 16
14204; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
14205; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
14206; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
14207; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
14208; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14209; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aq a3, (a2)
14210; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
14211; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
14212; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14213; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
14214; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14215; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
14216; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB98_1
14217; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
14218; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
14219; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
14220;
14221; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14222; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
14223; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
14224; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
14225; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lui a3, 16
14226; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
14227; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
14228; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
14229; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
14230; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
14231; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a3, (a2)
14232; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
14233; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
14234; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14235; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
14236; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14237; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
14238; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB98_1
14239; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
14240; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
14241; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
14242;
14243; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14244; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
14245; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
14246; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
14247; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB98_1: # %atomicrmw.start
14248; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
14249; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
14250; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
14251; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
14252; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.h.aqrl a0, a3, (a2)
14253; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
14254; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB98_1
14255; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
14256; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
14257;
14258; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
14259; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
14260; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
14261; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
14262; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB98_1: # %atomicrmw.start
14263; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
14264; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
14265; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
14266; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
14267; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.h a0, a3, (a2)
14268; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
14269; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB98_1
14270; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
14271; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
14272  %1 = atomicrmw nand ptr %a, i16 %b acq_rel
14273  ret i16 %1
14274}
14275
14276define i16 @atomicrmw_nand_i16_seq_cst(ptr %a, i16 %b) nounwind {
14277; RV32I-LABEL: atomicrmw_nand_i16_seq_cst:
14278; RV32I:       # %bb.0:
14279; RV32I-NEXT:    addi sp, sp, -16
14280; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14281; RV32I-NEXT:    li a2, 5
14282; RV32I-NEXT:    call __atomic_fetch_nand_2
14283; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14284; RV32I-NEXT:    addi sp, sp, 16
14285; RV32I-NEXT:    ret
14286;
14287; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst:
14288; RV32IA:       # %bb.0:
14289; RV32IA-NEXT:    andi a2, a0, -4
14290; RV32IA-NEXT:    slli a0, a0, 3
14291; RV32IA-NEXT:    lui a3, 16
14292; RV32IA-NEXT:    addi a3, a3, -1
14293; RV32IA-NEXT:    sll a4, a3, a0
14294; RV32IA-NEXT:    and a1, a1, a3
14295; RV32IA-NEXT:    sll a1, a1, a0
14296; RV32IA-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
14297; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
14298; RV32IA-NEXT:    and a5, a3, a1
14299; RV32IA-NEXT:    not a5, a5
14300; RV32IA-NEXT:    xor a5, a3, a5
14301; RV32IA-NEXT:    and a5, a5, a4
14302; RV32IA-NEXT:    xor a5, a3, a5
14303; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
14304; RV32IA-NEXT:    bnez a5, .LBB99_1
14305; RV32IA-NEXT:  # %bb.2:
14306; RV32IA-NEXT:    srl a0, a3, a0
14307; RV32IA-NEXT:    ret
14308;
14309; RV64I-LABEL: atomicrmw_nand_i16_seq_cst:
14310; RV64I:       # %bb.0:
14311; RV64I-NEXT:    addi sp, sp, -16
14312; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14313; RV64I-NEXT:    li a2, 5
14314; RV64I-NEXT:    call __atomic_fetch_nand_2
14315; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14316; RV64I-NEXT:    addi sp, sp, 16
14317; RV64I-NEXT:    ret
14318;
14319; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
14320; RV64IA-NOZACAS:       # %bb.0:
14321; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
14322; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
14323; RV64IA-NOZACAS-NEXT:    lui a3, 16
14324; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
14325; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
14326; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
14327; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
14328; RV64IA-NOZACAS-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
14329; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
14330; RV64IA-NOZACAS-NEXT:    and a5, a3, a1
14331; RV64IA-NOZACAS-NEXT:    not a5, a5
14332; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
14333; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
14334; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
14335; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
14336; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB99_1
14337; RV64IA-NOZACAS-NEXT:  # %bb.2:
14338; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
14339; RV64IA-NOZACAS-NEXT:    ret
14340;
14341; RV64IA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
14342; RV64IA-ZACAS:       # %bb.0:
14343; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
14344; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
14345; RV64IA-ZACAS-NEXT:    lui a3, 16
14346; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
14347; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
14348; RV64IA-ZACAS-NEXT:    and a1, a1, a3
14349; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
14350; RV64IA-ZACAS-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
14351; RV64IA-ZACAS-NEXT:    lr.w.aqrl a3, (a2)
14352; RV64IA-ZACAS-NEXT:    and a5, a3, a1
14353; RV64IA-ZACAS-NEXT:    not a5, a5
14354; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
14355; RV64IA-ZACAS-NEXT:    and a5, a5, a4
14356; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
14357; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
14358; RV64IA-ZACAS-NEXT:    bnez a5, .LBB99_1
14359; RV64IA-ZACAS-NEXT:  # %bb.2:
14360; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
14361; RV64IA-ZACAS-NEXT:    ret
14362;
14363; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
14364; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
14365; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
14366; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
14367; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lui a3, 16
14368; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
14369; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
14370; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
14371; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
14372; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
14373; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
14374; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
14375; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a5, a5
14376; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14377; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
14378; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14379; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
14380; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB99_1
14381; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
14382; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
14383; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
14384;
14385; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
14386; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
14387; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    andi a2, a0, -4
14388; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    slli a0, a0, 3
14389; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lui a3, 16
14390; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    addi a3, a3, -1
14391; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a4, a3, a0
14392; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a1, a1, a3
14393; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sllw a1, a1, a0
14394; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
14395; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
14396; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a3, a1
14397; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a5, a5
14398; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14399; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a5, a5, a4
14400; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    xor a5, a3, a5
14401; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
14402; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a5, .LBB99_1
14403; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
14404; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    srlw a0, a3, a0
14405; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
14406;
14407; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
14408; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
14409; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
14410; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
14411; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB99_1: # %atomicrmw.start
14412; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
14413; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
14414; RV64IA-WMO-ZABHA-ZACAS-NEXT:    fence rw, rw
14415; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a3, a3
14416; RV64IA-WMO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
14417; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.h.aqrl a0, a3, (a2)
14418; RV64IA-WMO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
14419; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB99_1
14420; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
14421; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
14422;
14423; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
14424; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
14425; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
14426; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lhu a0, 0(a0)
14427; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB99_1: # %atomicrmw.start
14428; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
14429; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a3, a0, a1
14430; RV64IA-TSO-ZABHA-ZACAS-NEXT:    fence rw, rw
14431; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a3, a3
14432; RV64IA-TSO-ZABHA-ZACAS-NEXT:    slli a4, a0, 48
14433; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.h a0, a3, (a2)
14434; RV64IA-TSO-ZABHA-ZACAS-NEXT:    srai a4, a4, 48
14435; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a4, .LBB99_1
14436; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
14437; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
14438  %1 = atomicrmw nand ptr %a, i16 %b seq_cst
14439  ret i16 %1
14440}
14441
14442define i16 @atomicrmw_or_i16_monotonic(ptr %a, i16 %b) nounwind {
14443; RV32I-LABEL: atomicrmw_or_i16_monotonic:
14444; RV32I:       # %bb.0:
14445; RV32I-NEXT:    addi sp, sp, -16
14446; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14447; RV32I-NEXT:    li a2, 0
14448; RV32I-NEXT:    call __atomic_fetch_or_2
14449; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14450; RV32I-NEXT:    addi sp, sp, 16
14451; RV32I-NEXT:    ret
14452;
14453; RV32IA-LABEL: atomicrmw_or_i16_monotonic:
14454; RV32IA:       # %bb.0:
14455; RV32IA-NEXT:    andi a2, a0, -4
14456; RV32IA-NEXT:    slli a0, a0, 3
14457; RV32IA-NEXT:    slli a1, a1, 16
14458; RV32IA-NEXT:    srli a1, a1, 16
14459; RV32IA-NEXT:    sll a1, a1, a0
14460; RV32IA-NEXT:    amoor.w a1, a1, (a2)
14461; RV32IA-NEXT:    srl a0, a1, a0
14462; RV32IA-NEXT:    ret
14463;
14464; RV64I-LABEL: atomicrmw_or_i16_monotonic:
14465; RV64I:       # %bb.0:
14466; RV64I-NEXT:    addi sp, sp, -16
14467; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14468; RV64I-NEXT:    li a2, 0
14469; RV64I-NEXT:    call __atomic_fetch_or_2
14470; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14471; RV64I-NEXT:    addi sp, sp, 16
14472; RV64I-NEXT:    ret
14473;
14474; RV64IA-NOZACAS-LABEL: atomicrmw_or_i16_monotonic:
14475; RV64IA-NOZACAS:       # %bb.0:
14476; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
14477; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
14478; RV64IA-NOZACAS-NEXT:    slli a1, a1, 48
14479; RV64IA-NOZACAS-NEXT:    srli a1, a1, 48
14480; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
14481; RV64IA-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
14482; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
14483; RV64IA-NOZACAS-NEXT:    ret
14484;
14485; RV64IA-ZACAS-LABEL: atomicrmw_or_i16_monotonic:
14486; RV64IA-ZACAS:       # %bb.0:
14487; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
14488; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
14489; RV64IA-ZACAS-NEXT:    slli a1, a1, 48
14490; RV64IA-ZACAS-NEXT:    srli a1, a1, 48
14491; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
14492; RV64IA-ZACAS-NEXT:    amoor.w a1, a1, (a2)
14493; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
14494; RV64IA-ZACAS-NEXT:    ret
14495;
14496; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_monotonic:
14497; RV64IA-WMO-ZABHA:       # %bb.0:
14498; RV64IA-WMO-ZABHA-NEXT:    amoor.h a0, a1, (a0)
14499; RV64IA-WMO-ZABHA-NEXT:    ret
14500;
14501; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_monotonic:
14502; RV64IA-TSO-ZABHA:       # %bb.0:
14503; RV64IA-TSO-ZABHA-NEXT:    amoor.h a0, a1, (a0)
14504; RV64IA-TSO-ZABHA-NEXT:    ret
14505  %1 = atomicrmw or ptr %a, i16 %b monotonic
14506  ret i16 %1
14507}
14508
14509define i16 @atomicrmw_or_i16_acquire(ptr %a, i16 %b) nounwind {
14510; RV32I-LABEL: atomicrmw_or_i16_acquire:
14511; RV32I:       # %bb.0:
14512; RV32I-NEXT:    addi sp, sp, -16
14513; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14514; RV32I-NEXT:    li a2, 2
14515; RV32I-NEXT:    call __atomic_fetch_or_2
14516; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14517; RV32I-NEXT:    addi sp, sp, 16
14518; RV32I-NEXT:    ret
14519;
14520; RV32IA-WMO-LABEL: atomicrmw_or_i16_acquire:
14521; RV32IA-WMO:       # %bb.0:
14522; RV32IA-WMO-NEXT:    andi a2, a0, -4
14523; RV32IA-WMO-NEXT:    slli a0, a0, 3
14524; RV32IA-WMO-NEXT:    slli a1, a1, 16
14525; RV32IA-WMO-NEXT:    srli a1, a1, 16
14526; RV32IA-WMO-NEXT:    sll a1, a1, a0
14527; RV32IA-WMO-NEXT:    amoor.w.aq a1, a1, (a2)
14528; RV32IA-WMO-NEXT:    srl a0, a1, a0
14529; RV32IA-WMO-NEXT:    ret
14530;
14531; RV32IA-TSO-LABEL: atomicrmw_or_i16_acquire:
14532; RV32IA-TSO:       # %bb.0:
14533; RV32IA-TSO-NEXT:    andi a2, a0, -4
14534; RV32IA-TSO-NEXT:    slli a0, a0, 3
14535; RV32IA-TSO-NEXT:    slli a1, a1, 16
14536; RV32IA-TSO-NEXT:    srli a1, a1, 16
14537; RV32IA-TSO-NEXT:    sll a1, a1, a0
14538; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
14539; RV32IA-TSO-NEXT:    srl a0, a1, a0
14540; RV32IA-TSO-NEXT:    ret
14541;
14542; RV64I-LABEL: atomicrmw_or_i16_acquire:
14543; RV64I:       # %bb.0:
14544; RV64I-NEXT:    addi sp, sp, -16
14545; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14546; RV64I-NEXT:    li a2, 2
14547; RV64I-NEXT:    call __atomic_fetch_or_2
14548; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14549; RV64I-NEXT:    addi sp, sp, 16
14550; RV64I-NEXT:    ret
14551;
14552; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_acquire:
14553; RV64IA-WMO-NOZACAS:       # %bb.0:
14554; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
14555; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
14556; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
14557; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
14558; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
14559; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aq a1, a1, (a2)
14560; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
14561; RV64IA-WMO-NOZACAS-NEXT:    ret
14562;
14563; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_acquire:
14564; RV64IA-TSO-NOZACAS:       # %bb.0:
14565; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
14566; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
14567; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
14568; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
14569; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
14570; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
14571; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
14572; RV64IA-TSO-NOZACAS-NEXT:    ret
14573;
14574; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_acquire:
14575; RV64IA-WMO-ZACAS:       # %bb.0:
14576; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
14577; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
14578; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
14579; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
14580; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
14581; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aq a1, a1, (a2)
14582; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
14583; RV64IA-WMO-ZACAS-NEXT:    ret
14584;
14585; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_acquire:
14586; RV64IA-TSO-ZACAS:       # %bb.0:
14587; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
14588; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
14589; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
14590; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
14591; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
14592; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
14593; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
14594; RV64IA-TSO-ZACAS-NEXT:    ret
14595;
14596; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_acquire:
14597; RV64IA-WMO-ZABHA:       # %bb.0:
14598; RV64IA-WMO-ZABHA-NEXT:    amoor.h.aq a0, a1, (a0)
14599; RV64IA-WMO-ZABHA-NEXT:    ret
14600;
14601; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_acquire:
14602; RV64IA-TSO-ZABHA:       # %bb.0:
14603; RV64IA-TSO-ZABHA-NEXT:    amoor.h a0, a1, (a0)
14604; RV64IA-TSO-ZABHA-NEXT:    ret
14605  %1 = atomicrmw or ptr %a, i16 %b acquire
14606  ret i16 %1
14607}
14608
14609define i16 @atomicrmw_or_i16_release(ptr %a, i16 %b) nounwind {
14610; RV32I-LABEL: atomicrmw_or_i16_release:
14611; RV32I:       # %bb.0:
14612; RV32I-NEXT:    addi sp, sp, -16
14613; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14614; RV32I-NEXT:    li a2, 3
14615; RV32I-NEXT:    call __atomic_fetch_or_2
14616; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14617; RV32I-NEXT:    addi sp, sp, 16
14618; RV32I-NEXT:    ret
14619;
14620; RV32IA-WMO-LABEL: atomicrmw_or_i16_release:
14621; RV32IA-WMO:       # %bb.0:
14622; RV32IA-WMO-NEXT:    andi a2, a0, -4
14623; RV32IA-WMO-NEXT:    slli a0, a0, 3
14624; RV32IA-WMO-NEXT:    slli a1, a1, 16
14625; RV32IA-WMO-NEXT:    srli a1, a1, 16
14626; RV32IA-WMO-NEXT:    sll a1, a1, a0
14627; RV32IA-WMO-NEXT:    amoor.w.rl a1, a1, (a2)
14628; RV32IA-WMO-NEXT:    srl a0, a1, a0
14629; RV32IA-WMO-NEXT:    ret
14630;
14631; RV32IA-TSO-LABEL: atomicrmw_or_i16_release:
14632; RV32IA-TSO:       # %bb.0:
14633; RV32IA-TSO-NEXT:    andi a2, a0, -4
14634; RV32IA-TSO-NEXT:    slli a0, a0, 3
14635; RV32IA-TSO-NEXT:    slli a1, a1, 16
14636; RV32IA-TSO-NEXT:    srli a1, a1, 16
14637; RV32IA-TSO-NEXT:    sll a1, a1, a0
14638; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
14639; RV32IA-TSO-NEXT:    srl a0, a1, a0
14640; RV32IA-TSO-NEXT:    ret
14641;
14642; RV64I-LABEL: atomicrmw_or_i16_release:
14643; RV64I:       # %bb.0:
14644; RV64I-NEXT:    addi sp, sp, -16
14645; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14646; RV64I-NEXT:    li a2, 3
14647; RV64I-NEXT:    call __atomic_fetch_or_2
14648; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14649; RV64I-NEXT:    addi sp, sp, 16
14650; RV64I-NEXT:    ret
14651;
14652; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_release:
14653; RV64IA-WMO-NOZACAS:       # %bb.0:
14654; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
14655; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
14656; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
14657; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
14658; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
14659; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.rl a1, a1, (a2)
14660; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
14661; RV64IA-WMO-NOZACAS-NEXT:    ret
14662;
14663; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_release:
14664; RV64IA-TSO-NOZACAS:       # %bb.0:
14665; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
14666; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
14667; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
14668; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
14669; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
14670; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
14671; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
14672; RV64IA-TSO-NOZACAS-NEXT:    ret
14673;
14674; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_release:
14675; RV64IA-WMO-ZACAS:       # %bb.0:
14676; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
14677; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
14678; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
14679; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
14680; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
14681; RV64IA-WMO-ZACAS-NEXT:    amoor.w.rl a1, a1, (a2)
14682; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
14683; RV64IA-WMO-ZACAS-NEXT:    ret
14684;
14685; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_release:
14686; RV64IA-TSO-ZACAS:       # %bb.0:
14687; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
14688; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
14689; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
14690; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
14691; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
14692; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
14693; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
14694; RV64IA-TSO-ZACAS-NEXT:    ret
14695;
14696; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_release:
14697; RV64IA-WMO-ZABHA:       # %bb.0:
14698; RV64IA-WMO-ZABHA-NEXT:    amoor.h.rl a0, a1, (a0)
14699; RV64IA-WMO-ZABHA-NEXT:    ret
14700;
14701; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_release:
14702; RV64IA-TSO-ZABHA:       # %bb.0:
14703; RV64IA-TSO-ZABHA-NEXT:    amoor.h a0, a1, (a0)
14704; RV64IA-TSO-ZABHA-NEXT:    ret
14705  %1 = atomicrmw or ptr %a, i16 %b release
14706  ret i16 %1
14707}
14708
14709define i16 @atomicrmw_or_i16_acq_rel(ptr %a, i16 %b) nounwind {
14710; RV32I-LABEL: atomicrmw_or_i16_acq_rel:
14711; RV32I:       # %bb.0:
14712; RV32I-NEXT:    addi sp, sp, -16
14713; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14714; RV32I-NEXT:    li a2, 4
14715; RV32I-NEXT:    call __atomic_fetch_or_2
14716; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14717; RV32I-NEXT:    addi sp, sp, 16
14718; RV32I-NEXT:    ret
14719;
14720; RV32IA-WMO-LABEL: atomicrmw_or_i16_acq_rel:
14721; RV32IA-WMO:       # %bb.0:
14722; RV32IA-WMO-NEXT:    andi a2, a0, -4
14723; RV32IA-WMO-NEXT:    slli a0, a0, 3
14724; RV32IA-WMO-NEXT:    slli a1, a1, 16
14725; RV32IA-WMO-NEXT:    srli a1, a1, 16
14726; RV32IA-WMO-NEXT:    sll a1, a1, a0
14727; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a1, (a2)
14728; RV32IA-WMO-NEXT:    srl a0, a1, a0
14729; RV32IA-WMO-NEXT:    ret
14730;
14731; RV32IA-TSO-LABEL: atomicrmw_or_i16_acq_rel:
14732; RV32IA-TSO:       # %bb.0:
14733; RV32IA-TSO-NEXT:    andi a2, a0, -4
14734; RV32IA-TSO-NEXT:    slli a0, a0, 3
14735; RV32IA-TSO-NEXT:    slli a1, a1, 16
14736; RV32IA-TSO-NEXT:    srli a1, a1, 16
14737; RV32IA-TSO-NEXT:    sll a1, a1, a0
14738; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
14739; RV32IA-TSO-NEXT:    srl a0, a1, a0
14740; RV32IA-TSO-NEXT:    ret
14741;
14742; RV64I-LABEL: atomicrmw_or_i16_acq_rel:
14743; RV64I:       # %bb.0:
14744; RV64I-NEXT:    addi sp, sp, -16
14745; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14746; RV64I-NEXT:    li a2, 4
14747; RV64I-NEXT:    call __atomic_fetch_or_2
14748; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14749; RV64I-NEXT:    addi sp, sp, 16
14750; RV64I-NEXT:    ret
14751;
14752; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_acq_rel:
14753; RV64IA-WMO-NOZACAS:       # %bb.0:
14754; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
14755; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
14756; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
14757; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
14758; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
14759; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
14760; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
14761; RV64IA-WMO-NOZACAS-NEXT:    ret
14762;
14763; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_acq_rel:
14764; RV64IA-TSO-NOZACAS:       # %bb.0:
14765; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
14766; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
14767; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
14768; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
14769; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
14770; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
14771; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
14772; RV64IA-TSO-NOZACAS-NEXT:    ret
14773;
14774; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_acq_rel:
14775; RV64IA-WMO-ZACAS:       # %bb.0:
14776; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
14777; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
14778; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
14779; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
14780; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
14781; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
14782; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
14783; RV64IA-WMO-ZACAS-NEXT:    ret
14784;
14785; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_acq_rel:
14786; RV64IA-TSO-ZACAS:       # %bb.0:
14787; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
14788; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
14789; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
14790; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
14791; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
14792; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
14793; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
14794; RV64IA-TSO-ZACAS-NEXT:    ret
14795;
14796; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_acq_rel:
14797; RV64IA-WMO-ZABHA:       # %bb.0:
14798; RV64IA-WMO-ZABHA-NEXT:    amoor.h.aqrl a0, a1, (a0)
14799; RV64IA-WMO-ZABHA-NEXT:    ret
14800;
14801; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_acq_rel:
14802; RV64IA-TSO-ZABHA:       # %bb.0:
14803; RV64IA-TSO-ZABHA-NEXT:    amoor.h a0, a1, (a0)
14804; RV64IA-TSO-ZABHA-NEXT:    ret
14805  %1 = atomicrmw or ptr %a, i16 %b acq_rel
14806  ret i16 %1
14807}
14808
14809define i16 @atomicrmw_or_i16_seq_cst(ptr %a, i16 %b) nounwind {
14810; RV32I-LABEL: atomicrmw_or_i16_seq_cst:
14811; RV32I:       # %bb.0:
14812; RV32I-NEXT:    addi sp, sp, -16
14813; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14814; RV32I-NEXT:    li a2, 5
14815; RV32I-NEXT:    call __atomic_fetch_or_2
14816; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14817; RV32I-NEXT:    addi sp, sp, 16
14818; RV32I-NEXT:    ret
14819;
14820; RV32IA-WMO-LABEL: atomicrmw_or_i16_seq_cst:
14821; RV32IA-WMO:       # %bb.0:
14822; RV32IA-WMO-NEXT:    andi a2, a0, -4
14823; RV32IA-WMO-NEXT:    slli a0, a0, 3
14824; RV32IA-WMO-NEXT:    slli a1, a1, 16
14825; RV32IA-WMO-NEXT:    srli a1, a1, 16
14826; RV32IA-WMO-NEXT:    sll a1, a1, a0
14827; RV32IA-WMO-NEXT:    amoor.w.aqrl a1, a1, (a2)
14828; RV32IA-WMO-NEXT:    srl a0, a1, a0
14829; RV32IA-WMO-NEXT:    ret
14830;
14831; RV32IA-TSO-LABEL: atomicrmw_or_i16_seq_cst:
14832; RV32IA-TSO:       # %bb.0:
14833; RV32IA-TSO-NEXT:    andi a2, a0, -4
14834; RV32IA-TSO-NEXT:    slli a0, a0, 3
14835; RV32IA-TSO-NEXT:    slli a1, a1, 16
14836; RV32IA-TSO-NEXT:    srli a1, a1, 16
14837; RV32IA-TSO-NEXT:    sll a1, a1, a0
14838; RV32IA-TSO-NEXT:    amoor.w a1, a1, (a2)
14839; RV32IA-TSO-NEXT:    srl a0, a1, a0
14840; RV32IA-TSO-NEXT:    ret
14841;
14842; RV64I-LABEL: atomicrmw_or_i16_seq_cst:
14843; RV64I:       # %bb.0:
14844; RV64I-NEXT:    addi sp, sp, -16
14845; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14846; RV64I-NEXT:    li a2, 5
14847; RV64I-NEXT:    call __atomic_fetch_or_2
14848; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14849; RV64I-NEXT:    addi sp, sp, 16
14850; RV64I-NEXT:    ret
14851;
14852; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_seq_cst:
14853; RV64IA-WMO-NOZACAS:       # %bb.0:
14854; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
14855; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
14856; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
14857; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
14858; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
14859; RV64IA-WMO-NOZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
14860; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
14861; RV64IA-WMO-NOZACAS-NEXT:    ret
14862;
14863; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_seq_cst:
14864; RV64IA-TSO-NOZACAS:       # %bb.0:
14865; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
14866; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
14867; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
14868; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
14869; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
14870; RV64IA-TSO-NOZACAS-NEXT:    amoor.w a1, a1, (a2)
14871; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
14872; RV64IA-TSO-NOZACAS-NEXT:    ret
14873;
14874; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_seq_cst:
14875; RV64IA-WMO-ZACAS:       # %bb.0:
14876; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
14877; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
14878; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
14879; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
14880; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
14881; RV64IA-WMO-ZACAS-NEXT:    amoor.w.aqrl a1, a1, (a2)
14882; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
14883; RV64IA-WMO-ZACAS-NEXT:    ret
14884;
14885; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_seq_cst:
14886; RV64IA-TSO-ZACAS:       # %bb.0:
14887; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
14888; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
14889; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
14890; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
14891; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
14892; RV64IA-TSO-ZACAS-NEXT:    amoor.w a1, a1, (a2)
14893; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
14894; RV64IA-TSO-ZACAS-NEXT:    ret
14895;
14896; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_seq_cst:
14897; RV64IA-WMO-ZABHA:       # %bb.0:
14898; RV64IA-WMO-ZABHA-NEXT:    amoor.h.aqrl a0, a1, (a0)
14899; RV64IA-WMO-ZABHA-NEXT:    ret
14900;
14901; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_seq_cst:
14902; RV64IA-TSO-ZABHA:       # %bb.0:
14903; RV64IA-TSO-ZABHA-NEXT:    amoor.h a0, a1, (a0)
14904; RV64IA-TSO-ZABHA-NEXT:    ret
14905  %1 = atomicrmw or ptr %a, i16 %b seq_cst
14906  ret i16 %1
14907}
14908
14909define i16 @atomicrmw_xor_i16_monotonic(ptr %a, i16 %b) nounwind {
14910; RV32I-LABEL: atomicrmw_xor_i16_monotonic:
14911; RV32I:       # %bb.0:
14912; RV32I-NEXT:    addi sp, sp, -16
14913; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14914; RV32I-NEXT:    li a2, 0
14915; RV32I-NEXT:    call __atomic_fetch_xor_2
14916; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14917; RV32I-NEXT:    addi sp, sp, 16
14918; RV32I-NEXT:    ret
14919;
14920; RV32IA-LABEL: atomicrmw_xor_i16_monotonic:
14921; RV32IA:       # %bb.0:
14922; RV32IA-NEXT:    andi a2, a0, -4
14923; RV32IA-NEXT:    slli a0, a0, 3
14924; RV32IA-NEXT:    slli a1, a1, 16
14925; RV32IA-NEXT:    srli a1, a1, 16
14926; RV32IA-NEXT:    sll a1, a1, a0
14927; RV32IA-NEXT:    amoxor.w a1, a1, (a2)
14928; RV32IA-NEXT:    srl a0, a1, a0
14929; RV32IA-NEXT:    ret
14930;
14931; RV64I-LABEL: atomicrmw_xor_i16_monotonic:
14932; RV64I:       # %bb.0:
14933; RV64I-NEXT:    addi sp, sp, -16
14934; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
14935; RV64I-NEXT:    li a2, 0
14936; RV64I-NEXT:    call __atomic_fetch_xor_2
14937; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14938; RV64I-NEXT:    addi sp, sp, 16
14939; RV64I-NEXT:    ret
14940;
14941; RV64IA-NOZACAS-LABEL: atomicrmw_xor_i16_monotonic:
14942; RV64IA-NOZACAS:       # %bb.0:
14943; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
14944; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
14945; RV64IA-NOZACAS-NEXT:    slli a1, a1, 48
14946; RV64IA-NOZACAS-NEXT:    srli a1, a1, 48
14947; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
14948; RV64IA-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
14949; RV64IA-NOZACAS-NEXT:    srlw a0, a1, a0
14950; RV64IA-NOZACAS-NEXT:    ret
14951;
14952; RV64IA-ZACAS-LABEL: atomicrmw_xor_i16_monotonic:
14953; RV64IA-ZACAS:       # %bb.0:
14954; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
14955; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
14956; RV64IA-ZACAS-NEXT:    slli a1, a1, 48
14957; RV64IA-ZACAS-NEXT:    srli a1, a1, 48
14958; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
14959; RV64IA-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
14960; RV64IA-ZACAS-NEXT:    srlw a0, a1, a0
14961; RV64IA-ZACAS-NEXT:    ret
14962;
14963; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_monotonic:
14964; RV64IA-WMO-ZABHA:       # %bb.0:
14965; RV64IA-WMO-ZABHA-NEXT:    amoxor.h a0, a1, (a0)
14966; RV64IA-WMO-ZABHA-NEXT:    ret
14967;
14968; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_monotonic:
14969; RV64IA-TSO-ZABHA:       # %bb.0:
14970; RV64IA-TSO-ZABHA-NEXT:    amoxor.h a0, a1, (a0)
14971; RV64IA-TSO-ZABHA-NEXT:    ret
14972  %1 = atomicrmw xor ptr %a, i16 %b monotonic
14973  ret i16 %1
14974}
14975
14976define i16 @atomicrmw_xor_i16_acquire(ptr %a, i16 %b) nounwind {
14977; RV32I-LABEL: atomicrmw_xor_i16_acquire:
14978; RV32I:       # %bb.0:
14979; RV32I-NEXT:    addi sp, sp, -16
14980; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14981; RV32I-NEXT:    li a2, 2
14982; RV32I-NEXT:    call __atomic_fetch_xor_2
14983; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
14984; RV32I-NEXT:    addi sp, sp, 16
14985; RV32I-NEXT:    ret
14986;
14987; RV32IA-WMO-LABEL: atomicrmw_xor_i16_acquire:
14988; RV32IA-WMO:       # %bb.0:
14989; RV32IA-WMO-NEXT:    andi a2, a0, -4
14990; RV32IA-WMO-NEXT:    slli a0, a0, 3
14991; RV32IA-WMO-NEXT:    slli a1, a1, 16
14992; RV32IA-WMO-NEXT:    srli a1, a1, 16
14993; RV32IA-WMO-NEXT:    sll a1, a1, a0
14994; RV32IA-WMO-NEXT:    amoxor.w.aq a1, a1, (a2)
14995; RV32IA-WMO-NEXT:    srl a0, a1, a0
14996; RV32IA-WMO-NEXT:    ret
14997;
14998; RV32IA-TSO-LABEL: atomicrmw_xor_i16_acquire:
14999; RV32IA-TSO:       # %bb.0:
15000; RV32IA-TSO-NEXT:    andi a2, a0, -4
15001; RV32IA-TSO-NEXT:    slli a0, a0, 3
15002; RV32IA-TSO-NEXT:    slli a1, a1, 16
15003; RV32IA-TSO-NEXT:    srli a1, a1, 16
15004; RV32IA-TSO-NEXT:    sll a1, a1, a0
15005; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
15006; RV32IA-TSO-NEXT:    srl a0, a1, a0
15007; RV32IA-TSO-NEXT:    ret
15008;
15009; RV64I-LABEL: atomicrmw_xor_i16_acquire:
15010; RV64I:       # %bb.0:
15011; RV64I-NEXT:    addi sp, sp, -16
15012; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
15013; RV64I-NEXT:    li a2, 2
15014; RV64I-NEXT:    call __atomic_fetch_xor_2
15015; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
15016; RV64I-NEXT:    addi sp, sp, 16
15017; RV64I-NEXT:    ret
15018;
15019; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_acquire:
15020; RV64IA-WMO-NOZACAS:       # %bb.0:
15021; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
15022; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
15023; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
15024; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
15025; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
15026; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.aq a1, a1, (a2)
15027; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
15028; RV64IA-WMO-NOZACAS-NEXT:    ret
15029;
15030; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_acquire:
15031; RV64IA-TSO-NOZACAS:       # %bb.0:
15032; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
15033; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
15034; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
15035; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
15036; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
15037; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
15038; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
15039; RV64IA-TSO-NOZACAS-NEXT:    ret
15040;
15041; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_acquire:
15042; RV64IA-WMO-ZACAS:       # %bb.0:
15043; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
15044; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
15045; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
15046; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
15047; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
15048; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.aq a1, a1, (a2)
15049; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
15050; RV64IA-WMO-ZACAS-NEXT:    ret
15051;
15052; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_acquire:
15053; RV64IA-TSO-ZACAS:       # %bb.0:
15054; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
15055; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
15056; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
15057; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
15058; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
15059; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
15060; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
15061; RV64IA-TSO-ZACAS-NEXT:    ret
15062;
15063; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_acquire:
15064; RV64IA-WMO-ZABHA:       # %bb.0:
15065; RV64IA-WMO-ZABHA-NEXT:    amoxor.h.aq a0, a1, (a0)
15066; RV64IA-WMO-ZABHA-NEXT:    ret
15067;
15068; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_acquire:
15069; RV64IA-TSO-ZABHA:       # %bb.0:
15070; RV64IA-TSO-ZABHA-NEXT:    amoxor.h a0, a1, (a0)
15071; RV64IA-TSO-ZABHA-NEXT:    ret
15072  %1 = atomicrmw xor ptr %a, i16 %b acquire
15073  ret i16 %1
15074}
15075
15076define i16 @atomicrmw_xor_i16_release(ptr %a, i16 %b) nounwind {
15077; RV32I-LABEL: atomicrmw_xor_i16_release:
15078; RV32I:       # %bb.0:
15079; RV32I-NEXT:    addi sp, sp, -16
15080; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
15081; RV32I-NEXT:    li a2, 3
15082; RV32I-NEXT:    call __atomic_fetch_xor_2
15083; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
15084; RV32I-NEXT:    addi sp, sp, 16
15085; RV32I-NEXT:    ret
15086;
15087; RV32IA-WMO-LABEL: atomicrmw_xor_i16_release:
15088; RV32IA-WMO:       # %bb.0:
15089; RV32IA-WMO-NEXT:    andi a2, a0, -4
15090; RV32IA-WMO-NEXT:    slli a0, a0, 3
15091; RV32IA-WMO-NEXT:    slli a1, a1, 16
15092; RV32IA-WMO-NEXT:    srli a1, a1, 16
15093; RV32IA-WMO-NEXT:    sll a1, a1, a0
15094; RV32IA-WMO-NEXT:    amoxor.w.rl a1, a1, (a2)
15095; RV32IA-WMO-NEXT:    srl a0, a1, a0
15096; RV32IA-WMO-NEXT:    ret
15097;
15098; RV32IA-TSO-LABEL: atomicrmw_xor_i16_release:
15099; RV32IA-TSO:       # %bb.0:
15100; RV32IA-TSO-NEXT:    andi a2, a0, -4
15101; RV32IA-TSO-NEXT:    slli a0, a0, 3
15102; RV32IA-TSO-NEXT:    slli a1, a1, 16
15103; RV32IA-TSO-NEXT:    srli a1, a1, 16
15104; RV32IA-TSO-NEXT:    sll a1, a1, a0
15105; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
15106; RV32IA-TSO-NEXT:    srl a0, a1, a0
15107; RV32IA-TSO-NEXT:    ret
15108;
15109; RV64I-LABEL: atomicrmw_xor_i16_release:
15110; RV64I:       # %bb.0:
15111; RV64I-NEXT:    addi sp, sp, -16
15112; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
15113; RV64I-NEXT:    li a2, 3
15114; RV64I-NEXT:    call __atomic_fetch_xor_2
15115; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
15116; RV64I-NEXT:    addi sp, sp, 16
15117; RV64I-NEXT:    ret
15118;
15119; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_release:
15120; RV64IA-WMO-NOZACAS:       # %bb.0:
15121; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
15122; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
15123; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
15124; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
15125; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
15126; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.rl a1, a1, (a2)
15127; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
15128; RV64IA-WMO-NOZACAS-NEXT:    ret
15129;
15130; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_release:
15131; RV64IA-TSO-NOZACAS:       # %bb.0:
15132; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
15133; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
15134; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
15135; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
15136; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
15137; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
15138; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
15139; RV64IA-TSO-NOZACAS-NEXT:    ret
15140;
15141; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_release:
15142; RV64IA-WMO-ZACAS:       # %bb.0:
15143; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
15144; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
15145; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
15146; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
15147; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
15148; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.rl a1, a1, (a2)
15149; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
15150; RV64IA-WMO-ZACAS-NEXT:    ret
15151;
15152; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_release:
15153; RV64IA-TSO-ZACAS:       # %bb.0:
15154; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
15155; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
15156; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
15157; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
15158; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
15159; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
15160; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
15161; RV64IA-TSO-ZACAS-NEXT:    ret
15162;
15163; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_release:
15164; RV64IA-WMO-ZABHA:       # %bb.0:
15165; RV64IA-WMO-ZABHA-NEXT:    amoxor.h.rl a0, a1, (a0)
15166; RV64IA-WMO-ZABHA-NEXT:    ret
15167;
15168; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_release:
15169; RV64IA-TSO-ZABHA:       # %bb.0:
15170; RV64IA-TSO-ZABHA-NEXT:    amoxor.h a0, a1, (a0)
15171; RV64IA-TSO-ZABHA-NEXT:    ret
15172  %1 = atomicrmw xor ptr %a, i16 %b release
15173  ret i16 %1
15174}
15175
15176define i16 @atomicrmw_xor_i16_acq_rel(ptr %a, i16 %b) nounwind {
15177; RV32I-LABEL: atomicrmw_xor_i16_acq_rel:
15178; RV32I:       # %bb.0:
15179; RV32I-NEXT:    addi sp, sp, -16
15180; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
15181; RV32I-NEXT:    li a2, 4
15182; RV32I-NEXT:    call __atomic_fetch_xor_2
15183; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
15184; RV32I-NEXT:    addi sp, sp, 16
15185; RV32I-NEXT:    ret
15186;
15187; RV32IA-WMO-LABEL: atomicrmw_xor_i16_acq_rel:
15188; RV32IA-WMO:       # %bb.0:
15189; RV32IA-WMO-NEXT:    andi a2, a0, -4
15190; RV32IA-WMO-NEXT:    slli a0, a0, 3
15191; RV32IA-WMO-NEXT:    slli a1, a1, 16
15192; RV32IA-WMO-NEXT:    srli a1, a1, 16
15193; RV32IA-WMO-NEXT:    sll a1, a1, a0
15194; RV32IA-WMO-NEXT:    amoxor.w.aqrl a1, a1, (a2)
15195; RV32IA-WMO-NEXT:    srl a0, a1, a0
15196; RV32IA-WMO-NEXT:    ret
15197;
15198; RV32IA-TSO-LABEL: atomicrmw_xor_i16_acq_rel:
15199; RV32IA-TSO:       # %bb.0:
15200; RV32IA-TSO-NEXT:    andi a2, a0, -4
15201; RV32IA-TSO-NEXT:    slli a0, a0, 3
15202; RV32IA-TSO-NEXT:    slli a1, a1, 16
15203; RV32IA-TSO-NEXT:    srli a1, a1, 16
15204; RV32IA-TSO-NEXT:    sll a1, a1, a0
15205; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
15206; RV32IA-TSO-NEXT:    srl a0, a1, a0
15207; RV32IA-TSO-NEXT:    ret
15208;
15209; RV64I-LABEL: atomicrmw_xor_i16_acq_rel:
15210; RV64I:       # %bb.0:
15211; RV64I-NEXT:    addi sp, sp, -16
15212; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
15213; RV64I-NEXT:    li a2, 4
15214; RV64I-NEXT:    call __atomic_fetch_xor_2
15215; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
15216; RV64I-NEXT:    addi sp, sp, 16
15217; RV64I-NEXT:    ret
15218;
15219; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
15220; RV64IA-WMO-NOZACAS:       # %bb.0:
15221; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
15222; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
15223; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
15224; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
15225; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
15226; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
15227; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
15228; RV64IA-WMO-NOZACAS-NEXT:    ret
15229;
15230; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
15231; RV64IA-TSO-NOZACAS:       # %bb.0:
15232; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
15233; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
15234; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
15235; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
15236; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
15237; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
15238; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
15239; RV64IA-TSO-NOZACAS-NEXT:    ret
15240;
15241; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
15242; RV64IA-WMO-ZACAS:       # %bb.0:
15243; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
15244; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
15245; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
15246; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
15247; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
15248; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
15249; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
15250; RV64IA-WMO-ZACAS-NEXT:    ret
15251;
15252; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
15253; RV64IA-TSO-ZACAS:       # %bb.0:
15254; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
15255; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
15256; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
15257; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
15258; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
15259; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
15260; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
15261; RV64IA-TSO-ZACAS-NEXT:    ret
15262;
15263; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_acq_rel:
15264; RV64IA-WMO-ZABHA:       # %bb.0:
15265; RV64IA-WMO-ZABHA-NEXT:    amoxor.h.aqrl a0, a1, (a0)
15266; RV64IA-WMO-ZABHA-NEXT:    ret
15267;
15268; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_acq_rel:
15269; RV64IA-TSO-ZABHA:       # %bb.0:
15270; RV64IA-TSO-ZABHA-NEXT:    amoxor.h a0, a1, (a0)
15271; RV64IA-TSO-ZABHA-NEXT:    ret
15272  %1 = atomicrmw xor ptr %a, i16 %b acq_rel
15273  ret i16 %1
15274}
15275
15276define i16 @atomicrmw_xor_i16_seq_cst(ptr %a, i16 %b) nounwind {
15277; RV32I-LABEL: atomicrmw_xor_i16_seq_cst:
15278; RV32I:       # %bb.0:
15279; RV32I-NEXT:    addi sp, sp, -16
15280; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
15281; RV32I-NEXT:    li a2, 5
15282; RV32I-NEXT:    call __atomic_fetch_xor_2
15283; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
15284; RV32I-NEXT:    addi sp, sp, 16
15285; RV32I-NEXT:    ret
15286;
15287; RV32IA-WMO-LABEL: atomicrmw_xor_i16_seq_cst:
15288; RV32IA-WMO:       # %bb.0:
15289; RV32IA-WMO-NEXT:    andi a2, a0, -4
15290; RV32IA-WMO-NEXT:    slli a0, a0, 3
15291; RV32IA-WMO-NEXT:    slli a1, a1, 16
15292; RV32IA-WMO-NEXT:    srli a1, a1, 16
15293; RV32IA-WMO-NEXT:    sll a1, a1, a0
15294; RV32IA-WMO-NEXT:    amoxor.w.aqrl a1, a1, (a2)
15295; RV32IA-WMO-NEXT:    srl a0, a1, a0
15296; RV32IA-WMO-NEXT:    ret
15297;
15298; RV32IA-TSO-LABEL: atomicrmw_xor_i16_seq_cst:
15299; RV32IA-TSO:       # %bb.0:
15300; RV32IA-TSO-NEXT:    andi a2, a0, -4
15301; RV32IA-TSO-NEXT:    slli a0, a0, 3
15302; RV32IA-TSO-NEXT:    slli a1, a1, 16
15303; RV32IA-TSO-NEXT:    srli a1, a1, 16
15304; RV32IA-TSO-NEXT:    sll a1, a1, a0
15305; RV32IA-TSO-NEXT:    amoxor.w a1, a1, (a2)
15306; RV32IA-TSO-NEXT:    srl a0, a1, a0
15307; RV32IA-TSO-NEXT:    ret
15308;
15309; RV64I-LABEL: atomicrmw_xor_i16_seq_cst:
15310; RV64I:       # %bb.0:
15311; RV64I-NEXT:    addi sp, sp, -16
15312; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
15313; RV64I-NEXT:    li a2, 5
15314; RV64I-NEXT:    call __atomic_fetch_xor_2
15315; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
15316; RV64I-NEXT:    addi sp, sp, 16
15317; RV64I-NEXT:    ret
15318;
15319; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
15320; RV64IA-WMO-NOZACAS:       # %bb.0:
15321; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
15322; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
15323; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
15324; RV64IA-WMO-NOZACAS-NEXT:    srli a1, a1, 48
15325; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
15326; RV64IA-WMO-NOZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
15327; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a1, a0
15328; RV64IA-WMO-NOZACAS-NEXT:    ret
15329;
15330; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
15331; RV64IA-TSO-NOZACAS:       # %bb.0:
15332; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
15333; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
15334; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
15335; RV64IA-TSO-NOZACAS-NEXT:    srli a1, a1, 48
15336; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
15337; RV64IA-TSO-NOZACAS-NEXT:    amoxor.w a1, a1, (a2)
15338; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a1, a0
15339; RV64IA-TSO-NOZACAS-NEXT:    ret
15340;
15341; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
15342; RV64IA-WMO-ZACAS:       # %bb.0:
15343; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
15344; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
15345; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
15346; RV64IA-WMO-ZACAS-NEXT:    srli a1, a1, 48
15347; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
15348; RV64IA-WMO-ZACAS-NEXT:    amoxor.w.aqrl a1, a1, (a2)
15349; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a1, a0
15350; RV64IA-WMO-ZACAS-NEXT:    ret
15351;
15352; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
15353; RV64IA-TSO-ZACAS:       # %bb.0:
15354; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
15355; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
15356; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
15357; RV64IA-TSO-ZACAS-NEXT:    srli a1, a1, 48
15358; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
15359; RV64IA-TSO-ZACAS-NEXT:    amoxor.w a1, a1, (a2)
15360; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a1, a0
15361; RV64IA-TSO-ZACAS-NEXT:    ret
15362;
15363; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_seq_cst:
15364; RV64IA-WMO-ZABHA:       # %bb.0:
15365; RV64IA-WMO-ZABHA-NEXT:    amoxor.h.aqrl a0, a1, (a0)
15366; RV64IA-WMO-ZABHA-NEXT:    ret
15367;
15368; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_seq_cst:
15369; RV64IA-TSO-ZABHA:       # %bb.0:
15370; RV64IA-TSO-ZABHA-NEXT:    amoxor.h a0, a1, (a0)
15371; RV64IA-TSO-ZABHA-NEXT:    ret
15372  %1 = atomicrmw xor ptr %a, i16 %b seq_cst
15373  ret i16 %1
15374}
15375
15376define i16 @atomicrmw_max_i16_monotonic(ptr %a, i16 %b) nounwind {
15377; RV32I-LABEL: atomicrmw_max_i16_monotonic:
15378; RV32I:       # %bb.0:
15379; RV32I-NEXT:    addi sp, sp, -32
15380; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15381; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15382; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15383; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15384; RV32I-NEXT:    mv s0, a0
15385; RV32I-NEXT:    lhu a3, 0(a0)
15386; RV32I-NEXT:    mv s1, a1
15387; RV32I-NEXT:    slli a0, a1, 16
15388; RV32I-NEXT:    srai s2, a0, 16
15389; RV32I-NEXT:    j .LBB110_2
15390; RV32I-NEXT:  .LBB110_1: # %atomicrmw.start
15391; RV32I-NEXT:    # in Loop: Header=BB110_2 Depth=1
15392; RV32I-NEXT:    sh a3, 14(sp)
15393; RV32I-NEXT:    addi a1, sp, 14
15394; RV32I-NEXT:    mv a0, s0
15395; RV32I-NEXT:    li a3, 0
15396; RV32I-NEXT:    li a4, 0
15397; RV32I-NEXT:    call __atomic_compare_exchange_2
15398; RV32I-NEXT:    lh a3, 14(sp)
15399; RV32I-NEXT:    bnez a0, .LBB110_4
15400; RV32I-NEXT:  .LBB110_2: # %atomicrmw.start
15401; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15402; RV32I-NEXT:    slli a0, a3, 16
15403; RV32I-NEXT:    srai a0, a0, 16
15404; RV32I-NEXT:    mv a2, a3
15405; RV32I-NEXT:    blt s2, a0, .LBB110_1
15406; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15407; RV32I-NEXT:    # in Loop: Header=BB110_2 Depth=1
15408; RV32I-NEXT:    mv a2, s1
15409; RV32I-NEXT:    j .LBB110_1
15410; RV32I-NEXT:  .LBB110_4: # %atomicrmw.end
15411; RV32I-NEXT:    mv a0, a3
15412; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15413; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15414; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15415; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15416; RV32I-NEXT:    addi sp, sp, 32
15417; RV32I-NEXT:    ret
15418;
15419; RV32IA-LABEL: atomicrmw_max_i16_monotonic:
15420; RV32IA:       # %bb.0:
15421; RV32IA-NEXT:    andi a2, a0, -4
15422; RV32IA-NEXT:    slli a0, a0, 3
15423; RV32IA-NEXT:    lui a3, 16
15424; RV32IA-NEXT:    slli a1, a1, 16
15425; RV32IA-NEXT:    li a4, 16
15426; RV32IA-NEXT:    andi a5, a0, 24
15427; RV32IA-NEXT:    addi a3, a3, -1
15428; RV32IA-NEXT:    srai a1, a1, 16
15429; RV32IA-NEXT:    sll a3, a3, a0
15430; RV32IA-NEXT:    sll a1, a1, a0
15431; RV32IA-NEXT:    sub a4, a4, a5
15432; RV32IA-NEXT:  .LBB110_1: # =>This Inner Loop Header: Depth=1
15433; RV32IA-NEXT:    lr.w a5, (a2)
15434; RV32IA-NEXT:    and a7, a5, a3
15435; RV32IA-NEXT:    mv a6, a5
15436; RV32IA-NEXT:    sll a7, a7, a4
15437; RV32IA-NEXT:    sra a7, a7, a4
15438; RV32IA-NEXT:    bge a7, a1, .LBB110_3
15439; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB110_1 Depth=1
15440; RV32IA-NEXT:    xor a6, a5, a1
15441; RV32IA-NEXT:    and a6, a6, a3
15442; RV32IA-NEXT:    xor a6, a5, a6
15443; RV32IA-NEXT:  .LBB110_3: # in Loop: Header=BB110_1 Depth=1
15444; RV32IA-NEXT:    sc.w a6, a6, (a2)
15445; RV32IA-NEXT:    bnez a6, .LBB110_1
15446; RV32IA-NEXT:  # %bb.4:
15447; RV32IA-NEXT:    srl a0, a5, a0
15448; RV32IA-NEXT:    ret
15449;
15450; RV64I-LABEL: atomicrmw_max_i16_monotonic:
15451; RV64I:       # %bb.0:
15452; RV64I-NEXT:    addi sp, sp, -48
15453; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
15454; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
15455; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
15456; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
15457; RV64I-NEXT:    mv s0, a0
15458; RV64I-NEXT:    lhu a3, 0(a0)
15459; RV64I-NEXT:    mv s1, a1
15460; RV64I-NEXT:    slli a0, a1, 48
15461; RV64I-NEXT:    srai s2, a0, 48
15462; RV64I-NEXT:    j .LBB110_2
15463; RV64I-NEXT:  .LBB110_1: # %atomicrmw.start
15464; RV64I-NEXT:    # in Loop: Header=BB110_2 Depth=1
15465; RV64I-NEXT:    sh a3, 14(sp)
15466; RV64I-NEXT:    addi a1, sp, 14
15467; RV64I-NEXT:    mv a0, s0
15468; RV64I-NEXT:    li a3, 0
15469; RV64I-NEXT:    li a4, 0
15470; RV64I-NEXT:    call __atomic_compare_exchange_2
15471; RV64I-NEXT:    lh a3, 14(sp)
15472; RV64I-NEXT:    bnez a0, .LBB110_4
15473; RV64I-NEXT:  .LBB110_2: # %atomicrmw.start
15474; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15475; RV64I-NEXT:    slli a0, a3, 48
15476; RV64I-NEXT:    srai a0, a0, 48
15477; RV64I-NEXT:    mv a2, a3
15478; RV64I-NEXT:    blt s2, a0, .LBB110_1
15479; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15480; RV64I-NEXT:    # in Loop: Header=BB110_2 Depth=1
15481; RV64I-NEXT:    mv a2, s1
15482; RV64I-NEXT:    j .LBB110_1
15483; RV64I-NEXT:  .LBB110_4: # %atomicrmw.end
15484; RV64I-NEXT:    mv a0, a3
15485; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
15486; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
15487; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
15488; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
15489; RV64I-NEXT:    addi sp, sp, 48
15490; RV64I-NEXT:    ret
15491;
15492; RV64IA-NOZACAS-LABEL: atomicrmw_max_i16_monotonic:
15493; RV64IA-NOZACAS:       # %bb.0:
15494; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
15495; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
15496; RV64IA-NOZACAS-NEXT:    lui a3, 16
15497; RV64IA-NOZACAS-NEXT:    slli a1, a1, 48
15498; RV64IA-NOZACAS-NEXT:    li a4, 48
15499; RV64IA-NOZACAS-NEXT:    andi a5, a0, 24
15500; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
15501; RV64IA-NOZACAS-NEXT:    srai a1, a1, 48
15502; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
15503; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
15504; RV64IA-NOZACAS-NEXT:    sub a4, a4, a5
15505; RV64IA-NOZACAS-NEXT:  .LBB110_1: # =>This Inner Loop Header: Depth=1
15506; RV64IA-NOZACAS-NEXT:    lr.w a5, (a2)
15507; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
15508; RV64IA-NOZACAS-NEXT:    mv a6, a5
15509; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
15510; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
15511; RV64IA-NOZACAS-NEXT:    bge a7, a1, .LBB110_3
15512; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB110_1 Depth=1
15513; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
15514; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
15515; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
15516; RV64IA-NOZACAS-NEXT:  .LBB110_3: # in Loop: Header=BB110_1 Depth=1
15517; RV64IA-NOZACAS-NEXT:    sc.w a6, a6, (a2)
15518; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB110_1
15519; RV64IA-NOZACAS-NEXT:  # %bb.4:
15520; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
15521; RV64IA-NOZACAS-NEXT:    ret
15522;
15523; RV64IA-ZACAS-LABEL: atomicrmw_max_i16_monotonic:
15524; RV64IA-ZACAS:       # %bb.0:
15525; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
15526; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
15527; RV64IA-ZACAS-NEXT:    lui a3, 16
15528; RV64IA-ZACAS-NEXT:    slli a1, a1, 48
15529; RV64IA-ZACAS-NEXT:    li a4, 48
15530; RV64IA-ZACAS-NEXT:    andi a5, a0, 24
15531; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
15532; RV64IA-ZACAS-NEXT:    srai a1, a1, 48
15533; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
15534; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
15535; RV64IA-ZACAS-NEXT:    sub a4, a4, a5
15536; RV64IA-ZACAS-NEXT:  .LBB110_1: # =>This Inner Loop Header: Depth=1
15537; RV64IA-ZACAS-NEXT:    lr.w a5, (a2)
15538; RV64IA-ZACAS-NEXT:    and a7, a5, a3
15539; RV64IA-ZACAS-NEXT:    mv a6, a5
15540; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
15541; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
15542; RV64IA-ZACAS-NEXT:    bge a7, a1, .LBB110_3
15543; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB110_1 Depth=1
15544; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
15545; RV64IA-ZACAS-NEXT:    and a6, a6, a3
15546; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
15547; RV64IA-ZACAS-NEXT:  .LBB110_3: # in Loop: Header=BB110_1 Depth=1
15548; RV64IA-ZACAS-NEXT:    sc.w a6, a6, (a2)
15549; RV64IA-ZACAS-NEXT:    bnez a6, .LBB110_1
15550; RV64IA-ZACAS-NEXT:  # %bb.4:
15551; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
15552; RV64IA-ZACAS-NEXT:    ret
15553;
15554; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_monotonic:
15555; RV64IA-WMO-ZABHA:       # %bb.0:
15556; RV64IA-WMO-ZABHA-NEXT:    amomax.h a0, a1, (a0)
15557; RV64IA-WMO-ZABHA-NEXT:    ret
15558;
15559; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_monotonic:
15560; RV64IA-TSO-ZABHA:       # %bb.0:
15561; RV64IA-TSO-ZABHA-NEXT:    amomax.h a0, a1, (a0)
15562; RV64IA-TSO-ZABHA-NEXT:    ret
15563  %1 = atomicrmw max ptr %a, i16 %b monotonic
15564  ret i16 %1
15565}
15566
15567define i16 @atomicrmw_max_i16_acquire(ptr %a, i16 %b) nounwind {
15568; RV32I-LABEL: atomicrmw_max_i16_acquire:
15569; RV32I:       # %bb.0:
15570; RV32I-NEXT:    addi sp, sp, -32
15571; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15572; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15573; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15574; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15575; RV32I-NEXT:    mv s0, a0
15576; RV32I-NEXT:    lhu a3, 0(a0)
15577; RV32I-NEXT:    mv s1, a1
15578; RV32I-NEXT:    slli a0, a1, 16
15579; RV32I-NEXT:    srai s2, a0, 16
15580; RV32I-NEXT:    j .LBB111_2
15581; RV32I-NEXT:  .LBB111_1: # %atomicrmw.start
15582; RV32I-NEXT:    # in Loop: Header=BB111_2 Depth=1
15583; RV32I-NEXT:    sh a3, 14(sp)
15584; RV32I-NEXT:    addi a1, sp, 14
15585; RV32I-NEXT:    li a3, 2
15586; RV32I-NEXT:    li a4, 2
15587; RV32I-NEXT:    mv a0, s0
15588; RV32I-NEXT:    call __atomic_compare_exchange_2
15589; RV32I-NEXT:    lh a3, 14(sp)
15590; RV32I-NEXT:    bnez a0, .LBB111_4
15591; RV32I-NEXT:  .LBB111_2: # %atomicrmw.start
15592; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15593; RV32I-NEXT:    slli a0, a3, 16
15594; RV32I-NEXT:    srai a0, a0, 16
15595; RV32I-NEXT:    mv a2, a3
15596; RV32I-NEXT:    blt s2, a0, .LBB111_1
15597; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15598; RV32I-NEXT:    # in Loop: Header=BB111_2 Depth=1
15599; RV32I-NEXT:    mv a2, s1
15600; RV32I-NEXT:    j .LBB111_1
15601; RV32I-NEXT:  .LBB111_4: # %atomicrmw.end
15602; RV32I-NEXT:    mv a0, a3
15603; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15604; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15605; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15606; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15607; RV32I-NEXT:    addi sp, sp, 32
15608; RV32I-NEXT:    ret
15609;
15610; RV32IA-WMO-LABEL: atomicrmw_max_i16_acquire:
15611; RV32IA-WMO:       # %bb.0:
15612; RV32IA-WMO-NEXT:    andi a2, a0, -4
15613; RV32IA-WMO-NEXT:    slli a0, a0, 3
15614; RV32IA-WMO-NEXT:    lui a3, 16
15615; RV32IA-WMO-NEXT:    slli a1, a1, 16
15616; RV32IA-WMO-NEXT:    li a4, 16
15617; RV32IA-WMO-NEXT:    andi a5, a0, 24
15618; RV32IA-WMO-NEXT:    addi a3, a3, -1
15619; RV32IA-WMO-NEXT:    srai a1, a1, 16
15620; RV32IA-WMO-NEXT:    sll a3, a3, a0
15621; RV32IA-WMO-NEXT:    sll a1, a1, a0
15622; RV32IA-WMO-NEXT:    sub a4, a4, a5
15623; RV32IA-WMO-NEXT:  .LBB111_1: # =>This Inner Loop Header: Depth=1
15624; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
15625; RV32IA-WMO-NEXT:    and a7, a5, a3
15626; RV32IA-WMO-NEXT:    mv a6, a5
15627; RV32IA-WMO-NEXT:    sll a7, a7, a4
15628; RV32IA-WMO-NEXT:    sra a7, a7, a4
15629; RV32IA-WMO-NEXT:    bge a7, a1, .LBB111_3
15630; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB111_1 Depth=1
15631; RV32IA-WMO-NEXT:    xor a6, a5, a1
15632; RV32IA-WMO-NEXT:    and a6, a6, a3
15633; RV32IA-WMO-NEXT:    xor a6, a5, a6
15634; RV32IA-WMO-NEXT:  .LBB111_3: # in Loop: Header=BB111_1 Depth=1
15635; RV32IA-WMO-NEXT:    sc.w a6, a6, (a2)
15636; RV32IA-WMO-NEXT:    bnez a6, .LBB111_1
15637; RV32IA-WMO-NEXT:  # %bb.4:
15638; RV32IA-WMO-NEXT:    srl a0, a5, a0
15639; RV32IA-WMO-NEXT:    ret
15640;
15641; RV32IA-TSO-LABEL: atomicrmw_max_i16_acquire:
15642; RV32IA-TSO:       # %bb.0:
15643; RV32IA-TSO-NEXT:    andi a2, a0, -4
15644; RV32IA-TSO-NEXT:    slli a0, a0, 3
15645; RV32IA-TSO-NEXT:    lui a3, 16
15646; RV32IA-TSO-NEXT:    slli a1, a1, 16
15647; RV32IA-TSO-NEXT:    li a4, 16
15648; RV32IA-TSO-NEXT:    andi a5, a0, 24
15649; RV32IA-TSO-NEXT:    addi a3, a3, -1
15650; RV32IA-TSO-NEXT:    srai a1, a1, 16
15651; RV32IA-TSO-NEXT:    sll a3, a3, a0
15652; RV32IA-TSO-NEXT:    sll a1, a1, a0
15653; RV32IA-TSO-NEXT:    sub a4, a4, a5
15654; RV32IA-TSO-NEXT:  .LBB111_1: # =>This Inner Loop Header: Depth=1
15655; RV32IA-TSO-NEXT:    lr.w a5, (a2)
15656; RV32IA-TSO-NEXT:    and a7, a5, a3
15657; RV32IA-TSO-NEXT:    mv a6, a5
15658; RV32IA-TSO-NEXT:    sll a7, a7, a4
15659; RV32IA-TSO-NEXT:    sra a7, a7, a4
15660; RV32IA-TSO-NEXT:    bge a7, a1, .LBB111_3
15661; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB111_1 Depth=1
15662; RV32IA-TSO-NEXT:    xor a6, a5, a1
15663; RV32IA-TSO-NEXT:    and a6, a6, a3
15664; RV32IA-TSO-NEXT:    xor a6, a5, a6
15665; RV32IA-TSO-NEXT:  .LBB111_3: # in Loop: Header=BB111_1 Depth=1
15666; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
15667; RV32IA-TSO-NEXT:    bnez a6, .LBB111_1
15668; RV32IA-TSO-NEXT:  # %bb.4:
15669; RV32IA-TSO-NEXT:    srl a0, a5, a0
15670; RV32IA-TSO-NEXT:    ret
15671;
15672; RV64I-LABEL: atomicrmw_max_i16_acquire:
15673; RV64I:       # %bb.0:
15674; RV64I-NEXT:    addi sp, sp, -48
15675; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
15676; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
15677; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
15678; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
15679; RV64I-NEXT:    mv s0, a0
15680; RV64I-NEXT:    lhu a3, 0(a0)
15681; RV64I-NEXT:    mv s1, a1
15682; RV64I-NEXT:    slli a0, a1, 48
15683; RV64I-NEXT:    srai s2, a0, 48
15684; RV64I-NEXT:    j .LBB111_2
15685; RV64I-NEXT:  .LBB111_1: # %atomicrmw.start
15686; RV64I-NEXT:    # in Loop: Header=BB111_2 Depth=1
15687; RV64I-NEXT:    sh a3, 14(sp)
15688; RV64I-NEXT:    addi a1, sp, 14
15689; RV64I-NEXT:    li a3, 2
15690; RV64I-NEXT:    li a4, 2
15691; RV64I-NEXT:    mv a0, s0
15692; RV64I-NEXT:    call __atomic_compare_exchange_2
15693; RV64I-NEXT:    lh a3, 14(sp)
15694; RV64I-NEXT:    bnez a0, .LBB111_4
15695; RV64I-NEXT:  .LBB111_2: # %atomicrmw.start
15696; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15697; RV64I-NEXT:    slli a0, a3, 48
15698; RV64I-NEXT:    srai a0, a0, 48
15699; RV64I-NEXT:    mv a2, a3
15700; RV64I-NEXT:    blt s2, a0, .LBB111_1
15701; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15702; RV64I-NEXT:    # in Loop: Header=BB111_2 Depth=1
15703; RV64I-NEXT:    mv a2, s1
15704; RV64I-NEXT:    j .LBB111_1
15705; RV64I-NEXT:  .LBB111_4: # %atomicrmw.end
15706; RV64I-NEXT:    mv a0, a3
15707; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
15708; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
15709; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
15710; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
15711; RV64I-NEXT:    addi sp, sp, 48
15712; RV64I-NEXT:    ret
15713;
15714; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_acquire:
15715; RV64IA-WMO-NOZACAS:       # %bb.0:
15716; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
15717; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
15718; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
15719; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
15720; RV64IA-WMO-NOZACAS-NEXT:    li a4, 48
15721; RV64IA-WMO-NOZACAS-NEXT:    andi a5, a0, 24
15722; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
15723; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 48
15724; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
15725; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
15726; RV64IA-WMO-NOZACAS-NEXT:    sub a4, a4, a5
15727; RV64IA-WMO-NOZACAS-NEXT:  .LBB111_1: # =>This Inner Loop Header: Depth=1
15728; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
15729; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
15730; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
15731; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
15732; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
15733; RV64IA-WMO-NOZACAS-NEXT:    bge a7, a1, .LBB111_3
15734; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB111_1 Depth=1
15735; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
15736; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
15737; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
15738; RV64IA-WMO-NOZACAS-NEXT:  .LBB111_3: # in Loop: Header=BB111_1 Depth=1
15739; RV64IA-WMO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
15740; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB111_1
15741; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
15742; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
15743; RV64IA-WMO-NOZACAS-NEXT:    ret
15744;
15745; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_acquire:
15746; RV64IA-TSO-NOZACAS:       # %bb.0:
15747; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
15748; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
15749; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
15750; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
15751; RV64IA-TSO-NOZACAS-NEXT:    li a4, 48
15752; RV64IA-TSO-NOZACAS-NEXT:    andi a5, a0, 24
15753; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
15754; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 48
15755; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
15756; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
15757; RV64IA-TSO-NOZACAS-NEXT:    sub a4, a4, a5
15758; RV64IA-TSO-NOZACAS-NEXT:  .LBB111_1: # =>This Inner Loop Header: Depth=1
15759; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
15760; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
15761; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
15762; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
15763; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
15764; RV64IA-TSO-NOZACAS-NEXT:    bge a7, a1, .LBB111_3
15765; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB111_1 Depth=1
15766; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
15767; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
15768; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
15769; RV64IA-TSO-NOZACAS-NEXT:  .LBB111_3: # in Loop: Header=BB111_1 Depth=1
15770; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
15771; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB111_1
15772; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
15773; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
15774; RV64IA-TSO-NOZACAS-NEXT:    ret
15775;
15776; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_acquire:
15777; RV64IA-WMO-ZACAS:       # %bb.0:
15778; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
15779; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
15780; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
15781; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
15782; RV64IA-WMO-ZACAS-NEXT:    li a4, 48
15783; RV64IA-WMO-ZACAS-NEXT:    andi a5, a0, 24
15784; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
15785; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 48
15786; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
15787; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
15788; RV64IA-WMO-ZACAS-NEXT:    sub a4, a4, a5
15789; RV64IA-WMO-ZACAS-NEXT:  .LBB111_1: # =>This Inner Loop Header: Depth=1
15790; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
15791; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
15792; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
15793; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
15794; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
15795; RV64IA-WMO-ZACAS-NEXT:    bge a7, a1, .LBB111_3
15796; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB111_1 Depth=1
15797; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
15798; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
15799; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
15800; RV64IA-WMO-ZACAS-NEXT:  .LBB111_3: # in Loop: Header=BB111_1 Depth=1
15801; RV64IA-WMO-ZACAS-NEXT:    sc.w a6, a6, (a2)
15802; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB111_1
15803; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
15804; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
15805; RV64IA-WMO-ZACAS-NEXT:    ret
15806;
15807; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_acquire:
15808; RV64IA-TSO-ZACAS:       # %bb.0:
15809; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
15810; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
15811; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
15812; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
15813; RV64IA-TSO-ZACAS-NEXT:    li a4, 48
15814; RV64IA-TSO-ZACAS-NEXT:    andi a5, a0, 24
15815; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
15816; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 48
15817; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
15818; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
15819; RV64IA-TSO-ZACAS-NEXT:    sub a4, a4, a5
15820; RV64IA-TSO-ZACAS-NEXT:  .LBB111_1: # =>This Inner Loop Header: Depth=1
15821; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
15822; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
15823; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
15824; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
15825; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
15826; RV64IA-TSO-ZACAS-NEXT:    bge a7, a1, .LBB111_3
15827; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB111_1 Depth=1
15828; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
15829; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
15830; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
15831; RV64IA-TSO-ZACAS-NEXT:  .LBB111_3: # in Loop: Header=BB111_1 Depth=1
15832; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
15833; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB111_1
15834; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
15835; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
15836; RV64IA-TSO-ZACAS-NEXT:    ret
15837;
15838; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_acquire:
15839; RV64IA-WMO-ZABHA:       # %bb.0:
15840; RV64IA-WMO-ZABHA-NEXT:    amomax.h.aq a0, a1, (a0)
15841; RV64IA-WMO-ZABHA-NEXT:    ret
15842;
15843; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_acquire:
15844; RV64IA-TSO-ZABHA:       # %bb.0:
15845; RV64IA-TSO-ZABHA-NEXT:    amomax.h a0, a1, (a0)
15846; RV64IA-TSO-ZABHA-NEXT:    ret
15847  %1 = atomicrmw max ptr %a, i16 %b acquire
15848  ret i16 %1
15849}
15850
15851define i16 @atomicrmw_max_i16_release(ptr %a, i16 %b) nounwind {
15852; RV32I-LABEL: atomicrmw_max_i16_release:
15853; RV32I:       # %bb.0:
15854; RV32I-NEXT:    addi sp, sp, -32
15855; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
15856; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
15857; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
15858; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
15859; RV32I-NEXT:    mv s0, a0
15860; RV32I-NEXT:    lhu a3, 0(a0)
15861; RV32I-NEXT:    mv s1, a1
15862; RV32I-NEXT:    slli a0, a1, 16
15863; RV32I-NEXT:    srai s2, a0, 16
15864; RV32I-NEXT:    j .LBB112_2
15865; RV32I-NEXT:  .LBB112_1: # %atomicrmw.start
15866; RV32I-NEXT:    # in Loop: Header=BB112_2 Depth=1
15867; RV32I-NEXT:    sh a3, 14(sp)
15868; RV32I-NEXT:    addi a1, sp, 14
15869; RV32I-NEXT:    li a3, 3
15870; RV32I-NEXT:    mv a0, s0
15871; RV32I-NEXT:    li a4, 0
15872; RV32I-NEXT:    call __atomic_compare_exchange_2
15873; RV32I-NEXT:    lh a3, 14(sp)
15874; RV32I-NEXT:    bnez a0, .LBB112_4
15875; RV32I-NEXT:  .LBB112_2: # %atomicrmw.start
15876; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
15877; RV32I-NEXT:    slli a0, a3, 16
15878; RV32I-NEXT:    srai a0, a0, 16
15879; RV32I-NEXT:    mv a2, a3
15880; RV32I-NEXT:    blt s2, a0, .LBB112_1
15881; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
15882; RV32I-NEXT:    # in Loop: Header=BB112_2 Depth=1
15883; RV32I-NEXT:    mv a2, s1
15884; RV32I-NEXT:    j .LBB112_1
15885; RV32I-NEXT:  .LBB112_4: # %atomicrmw.end
15886; RV32I-NEXT:    mv a0, a3
15887; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
15888; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
15889; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
15890; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
15891; RV32I-NEXT:    addi sp, sp, 32
15892; RV32I-NEXT:    ret
15893;
15894; RV32IA-WMO-LABEL: atomicrmw_max_i16_release:
15895; RV32IA-WMO:       # %bb.0:
15896; RV32IA-WMO-NEXT:    andi a2, a0, -4
15897; RV32IA-WMO-NEXT:    slli a0, a0, 3
15898; RV32IA-WMO-NEXT:    lui a3, 16
15899; RV32IA-WMO-NEXT:    slli a1, a1, 16
15900; RV32IA-WMO-NEXT:    li a4, 16
15901; RV32IA-WMO-NEXT:    andi a5, a0, 24
15902; RV32IA-WMO-NEXT:    addi a3, a3, -1
15903; RV32IA-WMO-NEXT:    srai a1, a1, 16
15904; RV32IA-WMO-NEXT:    sll a3, a3, a0
15905; RV32IA-WMO-NEXT:    sll a1, a1, a0
15906; RV32IA-WMO-NEXT:    sub a4, a4, a5
15907; RV32IA-WMO-NEXT:  .LBB112_1: # =>This Inner Loop Header: Depth=1
15908; RV32IA-WMO-NEXT:    lr.w a5, (a2)
15909; RV32IA-WMO-NEXT:    and a7, a5, a3
15910; RV32IA-WMO-NEXT:    mv a6, a5
15911; RV32IA-WMO-NEXT:    sll a7, a7, a4
15912; RV32IA-WMO-NEXT:    sra a7, a7, a4
15913; RV32IA-WMO-NEXT:    bge a7, a1, .LBB112_3
15914; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB112_1 Depth=1
15915; RV32IA-WMO-NEXT:    xor a6, a5, a1
15916; RV32IA-WMO-NEXT:    and a6, a6, a3
15917; RV32IA-WMO-NEXT:    xor a6, a5, a6
15918; RV32IA-WMO-NEXT:  .LBB112_3: # in Loop: Header=BB112_1 Depth=1
15919; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
15920; RV32IA-WMO-NEXT:    bnez a6, .LBB112_1
15921; RV32IA-WMO-NEXT:  # %bb.4:
15922; RV32IA-WMO-NEXT:    srl a0, a5, a0
15923; RV32IA-WMO-NEXT:    ret
15924;
15925; RV32IA-TSO-LABEL: atomicrmw_max_i16_release:
15926; RV32IA-TSO:       # %bb.0:
15927; RV32IA-TSO-NEXT:    andi a2, a0, -4
15928; RV32IA-TSO-NEXT:    slli a0, a0, 3
15929; RV32IA-TSO-NEXT:    lui a3, 16
15930; RV32IA-TSO-NEXT:    slli a1, a1, 16
15931; RV32IA-TSO-NEXT:    li a4, 16
15932; RV32IA-TSO-NEXT:    andi a5, a0, 24
15933; RV32IA-TSO-NEXT:    addi a3, a3, -1
15934; RV32IA-TSO-NEXT:    srai a1, a1, 16
15935; RV32IA-TSO-NEXT:    sll a3, a3, a0
15936; RV32IA-TSO-NEXT:    sll a1, a1, a0
15937; RV32IA-TSO-NEXT:    sub a4, a4, a5
15938; RV32IA-TSO-NEXT:  .LBB112_1: # =>This Inner Loop Header: Depth=1
15939; RV32IA-TSO-NEXT:    lr.w a5, (a2)
15940; RV32IA-TSO-NEXT:    and a7, a5, a3
15941; RV32IA-TSO-NEXT:    mv a6, a5
15942; RV32IA-TSO-NEXT:    sll a7, a7, a4
15943; RV32IA-TSO-NEXT:    sra a7, a7, a4
15944; RV32IA-TSO-NEXT:    bge a7, a1, .LBB112_3
15945; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB112_1 Depth=1
15946; RV32IA-TSO-NEXT:    xor a6, a5, a1
15947; RV32IA-TSO-NEXT:    and a6, a6, a3
15948; RV32IA-TSO-NEXT:    xor a6, a5, a6
15949; RV32IA-TSO-NEXT:  .LBB112_3: # in Loop: Header=BB112_1 Depth=1
15950; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
15951; RV32IA-TSO-NEXT:    bnez a6, .LBB112_1
15952; RV32IA-TSO-NEXT:  # %bb.4:
15953; RV32IA-TSO-NEXT:    srl a0, a5, a0
15954; RV32IA-TSO-NEXT:    ret
15955;
15956; RV64I-LABEL: atomicrmw_max_i16_release:
15957; RV64I:       # %bb.0:
15958; RV64I-NEXT:    addi sp, sp, -48
15959; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
15960; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
15961; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
15962; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
15963; RV64I-NEXT:    mv s0, a0
15964; RV64I-NEXT:    lhu a3, 0(a0)
15965; RV64I-NEXT:    mv s1, a1
15966; RV64I-NEXT:    slli a0, a1, 48
15967; RV64I-NEXT:    srai s2, a0, 48
15968; RV64I-NEXT:    j .LBB112_2
15969; RV64I-NEXT:  .LBB112_1: # %atomicrmw.start
15970; RV64I-NEXT:    # in Loop: Header=BB112_2 Depth=1
15971; RV64I-NEXT:    sh a3, 14(sp)
15972; RV64I-NEXT:    addi a1, sp, 14
15973; RV64I-NEXT:    li a3, 3
15974; RV64I-NEXT:    mv a0, s0
15975; RV64I-NEXT:    li a4, 0
15976; RV64I-NEXT:    call __atomic_compare_exchange_2
15977; RV64I-NEXT:    lh a3, 14(sp)
15978; RV64I-NEXT:    bnez a0, .LBB112_4
15979; RV64I-NEXT:  .LBB112_2: # %atomicrmw.start
15980; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
15981; RV64I-NEXT:    slli a0, a3, 48
15982; RV64I-NEXT:    srai a0, a0, 48
15983; RV64I-NEXT:    mv a2, a3
15984; RV64I-NEXT:    blt s2, a0, .LBB112_1
15985; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
15986; RV64I-NEXT:    # in Loop: Header=BB112_2 Depth=1
15987; RV64I-NEXT:    mv a2, s1
15988; RV64I-NEXT:    j .LBB112_1
15989; RV64I-NEXT:  .LBB112_4: # %atomicrmw.end
15990; RV64I-NEXT:    mv a0, a3
15991; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
15992; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
15993; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
15994; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
15995; RV64I-NEXT:    addi sp, sp, 48
15996; RV64I-NEXT:    ret
15997;
15998; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_release:
15999; RV64IA-WMO-NOZACAS:       # %bb.0:
16000; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
16001; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
16002; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
16003; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
16004; RV64IA-WMO-NOZACAS-NEXT:    li a4, 48
16005; RV64IA-WMO-NOZACAS-NEXT:    andi a5, a0, 24
16006; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
16007; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 48
16008; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
16009; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
16010; RV64IA-WMO-NOZACAS-NEXT:    sub a4, a4, a5
16011; RV64IA-WMO-NOZACAS-NEXT:  .LBB112_1: # =>This Inner Loop Header: Depth=1
16012; RV64IA-WMO-NOZACAS-NEXT:    lr.w a5, (a2)
16013; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
16014; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
16015; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
16016; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
16017; RV64IA-WMO-NOZACAS-NEXT:    bge a7, a1, .LBB112_3
16018; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB112_1 Depth=1
16019; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
16020; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
16021; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
16022; RV64IA-WMO-NOZACAS-NEXT:  .LBB112_3: # in Loop: Header=BB112_1 Depth=1
16023; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
16024; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB112_1
16025; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
16026; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
16027; RV64IA-WMO-NOZACAS-NEXT:    ret
16028;
16029; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_release:
16030; RV64IA-TSO-NOZACAS:       # %bb.0:
16031; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
16032; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
16033; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
16034; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
16035; RV64IA-TSO-NOZACAS-NEXT:    li a4, 48
16036; RV64IA-TSO-NOZACAS-NEXT:    andi a5, a0, 24
16037; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
16038; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 48
16039; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
16040; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
16041; RV64IA-TSO-NOZACAS-NEXT:    sub a4, a4, a5
16042; RV64IA-TSO-NOZACAS-NEXT:  .LBB112_1: # =>This Inner Loop Header: Depth=1
16043; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
16044; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
16045; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
16046; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
16047; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
16048; RV64IA-TSO-NOZACAS-NEXT:    bge a7, a1, .LBB112_3
16049; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB112_1 Depth=1
16050; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
16051; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
16052; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
16053; RV64IA-TSO-NOZACAS-NEXT:  .LBB112_3: # in Loop: Header=BB112_1 Depth=1
16054; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
16055; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB112_1
16056; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
16057; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
16058; RV64IA-TSO-NOZACAS-NEXT:    ret
16059;
16060; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_release:
16061; RV64IA-WMO-ZACAS:       # %bb.0:
16062; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
16063; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
16064; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
16065; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
16066; RV64IA-WMO-ZACAS-NEXT:    li a4, 48
16067; RV64IA-WMO-ZACAS-NEXT:    andi a5, a0, 24
16068; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
16069; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 48
16070; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
16071; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
16072; RV64IA-WMO-ZACAS-NEXT:    sub a4, a4, a5
16073; RV64IA-WMO-ZACAS-NEXT:  .LBB112_1: # =>This Inner Loop Header: Depth=1
16074; RV64IA-WMO-ZACAS-NEXT:    lr.w a5, (a2)
16075; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
16076; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
16077; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
16078; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
16079; RV64IA-WMO-ZACAS-NEXT:    bge a7, a1, .LBB112_3
16080; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB112_1 Depth=1
16081; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
16082; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
16083; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
16084; RV64IA-WMO-ZACAS-NEXT:  .LBB112_3: # in Loop: Header=BB112_1 Depth=1
16085; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
16086; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB112_1
16087; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
16088; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
16089; RV64IA-WMO-ZACAS-NEXT:    ret
16090;
16091; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_release:
16092; RV64IA-TSO-ZACAS:       # %bb.0:
16093; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
16094; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
16095; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
16096; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
16097; RV64IA-TSO-ZACAS-NEXT:    li a4, 48
16098; RV64IA-TSO-ZACAS-NEXT:    andi a5, a0, 24
16099; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
16100; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 48
16101; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
16102; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
16103; RV64IA-TSO-ZACAS-NEXT:    sub a4, a4, a5
16104; RV64IA-TSO-ZACAS-NEXT:  .LBB112_1: # =>This Inner Loop Header: Depth=1
16105; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
16106; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
16107; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
16108; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
16109; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
16110; RV64IA-TSO-ZACAS-NEXT:    bge a7, a1, .LBB112_3
16111; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB112_1 Depth=1
16112; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
16113; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
16114; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
16115; RV64IA-TSO-ZACAS-NEXT:  .LBB112_3: # in Loop: Header=BB112_1 Depth=1
16116; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
16117; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB112_1
16118; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
16119; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
16120; RV64IA-TSO-ZACAS-NEXT:    ret
16121;
16122; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_release:
16123; RV64IA-WMO-ZABHA:       # %bb.0:
16124; RV64IA-WMO-ZABHA-NEXT:    amomax.h.rl a0, a1, (a0)
16125; RV64IA-WMO-ZABHA-NEXT:    ret
16126;
16127; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_release:
16128; RV64IA-TSO-ZABHA:       # %bb.0:
16129; RV64IA-TSO-ZABHA-NEXT:    amomax.h a0, a1, (a0)
16130; RV64IA-TSO-ZABHA-NEXT:    ret
16131  %1 = atomicrmw max ptr %a, i16 %b release
16132  ret i16 %1
16133}
16134
16135define i16 @atomicrmw_max_i16_acq_rel(ptr %a, i16 %b) nounwind {
16136; RV32I-LABEL: atomicrmw_max_i16_acq_rel:
16137; RV32I:       # %bb.0:
16138; RV32I-NEXT:    addi sp, sp, -32
16139; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16140; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16141; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16142; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16143; RV32I-NEXT:    mv s0, a0
16144; RV32I-NEXT:    lhu a3, 0(a0)
16145; RV32I-NEXT:    mv s1, a1
16146; RV32I-NEXT:    slli a0, a1, 16
16147; RV32I-NEXT:    srai s2, a0, 16
16148; RV32I-NEXT:    j .LBB113_2
16149; RV32I-NEXT:  .LBB113_1: # %atomicrmw.start
16150; RV32I-NEXT:    # in Loop: Header=BB113_2 Depth=1
16151; RV32I-NEXT:    sh a3, 14(sp)
16152; RV32I-NEXT:    addi a1, sp, 14
16153; RV32I-NEXT:    li a3, 4
16154; RV32I-NEXT:    li a4, 2
16155; RV32I-NEXT:    mv a0, s0
16156; RV32I-NEXT:    call __atomic_compare_exchange_2
16157; RV32I-NEXT:    lh a3, 14(sp)
16158; RV32I-NEXT:    bnez a0, .LBB113_4
16159; RV32I-NEXT:  .LBB113_2: # %atomicrmw.start
16160; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16161; RV32I-NEXT:    slli a0, a3, 16
16162; RV32I-NEXT:    srai a0, a0, 16
16163; RV32I-NEXT:    mv a2, a3
16164; RV32I-NEXT:    blt s2, a0, .LBB113_1
16165; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16166; RV32I-NEXT:    # in Loop: Header=BB113_2 Depth=1
16167; RV32I-NEXT:    mv a2, s1
16168; RV32I-NEXT:    j .LBB113_1
16169; RV32I-NEXT:  .LBB113_4: # %atomicrmw.end
16170; RV32I-NEXT:    mv a0, a3
16171; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16172; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16173; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16174; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16175; RV32I-NEXT:    addi sp, sp, 32
16176; RV32I-NEXT:    ret
16177;
16178; RV32IA-WMO-LABEL: atomicrmw_max_i16_acq_rel:
16179; RV32IA-WMO:       # %bb.0:
16180; RV32IA-WMO-NEXT:    andi a2, a0, -4
16181; RV32IA-WMO-NEXT:    slli a0, a0, 3
16182; RV32IA-WMO-NEXT:    lui a3, 16
16183; RV32IA-WMO-NEXT:    slli a1, a1, 16
16184; RV32IA-WMO-NEXT:    li a4, 16
16185; RV32IA-WMO-NEXT:    andi a5, a0, 24
16186; RV32IA-WMO-NEXT:    addi a3, a3, -1
16187; RV32IA-WMO-NEXT:    srai a1, a1, 16
16188; RV32IA-WMO-NEXT:    sll a3, a3, a0
16189; RV32IA-WMO-NEXT:    sll a1, a1, a0
16190; RV32IA-WMO-NEXT:    sub a4, a4, a5
16191; RV32IA-WMO-NEXT:  .LBB113_1: # =>This Inner Loop Header: Depth=1
16192; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
16193; RV32IA-WMO-NEXT:    and a7, a5, a3
16194; RV32IA-WMO-NEXT:    mv a6, a5
16195; RV32IA-WMO-NEXT:    sll a7, a7, a4
16196; RV32IA-WMO-NEXT:    sra a7, a7, a4
16197; RV32IA-WMO-NEXT:    bge a7, a1, .LBB113_3
16198; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB113_1 Depth=1
16199; RV32IA-WMO-NEXT:    xor a6, a5, a1
16200; RV32IA-WMO-NEXT:    and a6, a6, a3
16201; RV32IA-WMO-NEXT:    xor a6, a5, a6
16202; RV32IA-WMO-NEXT:  .LBB113_3: # in Loop: Header=BB113_1 Depth=1
16203; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
16204; RV32IA-WMO-NEXT:    bnez a6, .LBB113_1
16205; RV32IA-WMO-NEXT:  # %bb.4:
16206; RV32IA-WMO-NEXT:    srl a0, a5, a0
16207; RV32IA-WMO-NEXT:    ret
16208;
16209; RV32IA-TSO-LABEL: atomicrmw_max_i16_acq_rel:
16210; RV32IA-TSO:       # %bb.0:
16211; RV32IA-TSO-NEXT:    andi a2, a0, -4
16212; RV32IA-TSO-NEXT:    slli a0, a0, 3
16213; RV32IA-TSO-NEXT:    lui a3, 16
16214; RV32IA-TSO-NEXT:    slli a1, a1, 16
16215; RV32IA-TSO-NEXT:    li a4, 16
16216; RV32IA-TSO-NEXT:    andi a5, a0, 24
16217; RV32IA-TSO-NEXT:    addi a3, a3, -1
16218; RV32IA-TSO-NEXT:    srai a1, a1, 16
16219; RV32IA-TSO-NEXT:    sll a3, a3, a0
16220; RV32IA-TSO-NEXT:    sll a1, a1, a0
16221; RV32IA-TSO-NEXT:    sub a4, a4, a5
16222; RV32IA-TSO-NEXT:  .LBB113_1: # =>This Inner Loop Header: Depth=1
16223; RV32IA-TSO-NEXT:    lr.w a5, (a2)
16224; RV32IA-TSO-NEXT:    and a7, a5, a3
16225; RV32IA-TSO-NEXT:    mv a6, a5
16226; RV32IA-TSO-NEXT:    sll a7, a7, a4
16227; RV32IA-TSO-NEXT:    sra a7, a7, a4
16228; RV32IA-TSO-NEXT:    bge a7, a1, .LBB113_3
16229; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB113_1 Depth=1
16230; RV32IA-TSO-NEXT:    xor a6, a5, a1
16231; RV32IA-TSO-NEXT:    and a6, a6, a3
16232; RV32IA-TSO-NEXT:    xor a6, a5, a6
16233; RV32IA-TSO-NEXT:  .LBB113_3: # in Loop: Header=BB113_1 Depth=1
16234; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
16235; RV32IA-TSO-NEXT:    bnez a6, .LBB113_1
16236; RV32IA-TSO-NEXT:  # %bb.4:
16237; RV32IA-TSO-NEXT:    srl a0, a5, a0
16238; RV32IA-TSO-NEXT:    ret
16239;
16240; RV64I-LABEL: atomicrmw_max_i16_acq_rel:
16241; RV64I:       # %bb.0:
16242; RV64I-NEXT:    addi sp, sp, -48
16243; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
16244; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
16245; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
16246; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
16247; RV64I-NEXT:    mv s0, a0
16248; RV64I-NEXT:    lhu a3, 0(a0)
16249; RV64I-NEXT:    mv s1, a1
16250; RV64I-NEXT:    slli a0, a1, 48
16251; RV64I-NEXT:    srai s2, a0, 48
16252; RV64I-NEXT:    j .LBB113_2
16253; RV64I-NEXT:  .LBB113_1: # %atomicrmw.start
16254; RV64I-NEXT:    # in Loop: Header=BB113_2 Depth=1
16255; RV64I-NEXT:    sh a3, 14(sp)
16256; RV64I-NEXT:    addi a1, sp, 14
16257; RV64I-NEXT:    li a3, 4
16258; RV64I-NEXT:    li a4, 2
16259; RV64I-NEXT:    mv a0, s0
16260; RV64I-NEXT:    call __atomic_compare_exchange_2
16261; RV64I-NEXT:    lh a3, 14(sp)
16262; RV64I-NEXT:    bnez a0, .LBB113_4
16263; RV64I-NEXT:  .LBB113_2: # %atomicrmw.start
16264; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16265; RV64I-NEXT:    slli a0, a3, 48
16266; RV64I-NEXT:    srai a0, a0, 48
16267; RV64I-NEXT:    mv a2, a3
16268; RV64I-NEXT:    blt s2, a0, .LBB113_1
16269; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16270; RV64I-NEXT:    # in Loop: Header=BB113_2 Depth=1
16271; RV64I-NEXT:    mv a2, s1
16272; RV64I-NEXT:    j .LBB113_1
16273; RV64I-NEXT:  .LBB113_4: # %atomicrmw.end
16274; RV64I-NEXT:    mv a0, a3
16275; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
16276; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
16277; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
16278; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
16279; RV64I-NEXT:    addi sp, sp, 48
16280; RV64I-NEXT:    ret
16281;
16282; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_acq_rel:
16283; RV64IA-WMO-NOZACAS:       # %bb.0:
16284; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
16285; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
16286; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
16287; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
16288; RV64IA-WMO-NOZACAS-NEXT:    li a4, 48
16289; RV64IA-WMO-NOZACAS-NEXT:    andi a5, a0, 24
16290; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
16291; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 48
16292; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
16293; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
16294; RV64IA-WMO-NOZACAS-NEXT:    sub a4, a4, a5
16295; RV64IA-WMO-NOZACAS-NEXT:  .LBB113_1: # =>This Inner Loop Header: Depth=1
16296; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
16297; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
16298; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
16299; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
16300; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
16301; RV64IA-WMO-NOZACAS-NEXT:    bge a7, a1, .LBB113_3
16302; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB113_1 Depth=1
16303; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
16304; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
16305; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
16306; RV64IA-WMO-NOZACAS-NEXT:  .LBB113_3: # in Loop: Header=BB113_1 Depth=1
16307; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
16308; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB113_1
16309; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
16310; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
16311; RV64IA-WMO-NOZACAS-NEXT:    ret
16312;
16313; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_acq_rel:
16314; RV64IA-TSO-NOZACAS:       # %bb.0:
16315; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
16316; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
16317; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
16318; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
16319; RV64IA-TSO-NOZACAS-NEXT:    li a4, 48
16320; RV64IA-TSO-NOZACAS-NEXT:    andi a5, a0, 24
16321; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
16322; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 48
16323; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
16324; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
16325; RV64IA-TSO-NOZACAS-NEXT:    sub a4, a4, a5
16326; RV64IA-TSO-NOZACAS-NEXT:  .LBB113_1: # =>This Inner Loop Header: Depth=1
16327; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
16328; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
16329; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
16330; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
16331; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
16332; RV64IA-TSO-NOZACAS-NEXT:    bge a7, a1, .LBB113_3
16333; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB113_1 Depth=1
16334; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
16335; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
16336; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
16337; RV64IA-TSO-NOZACAS-NEXT:  .LBB113_3: # in Loop: Header=BB113_1 Depth=1
16338; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
16339; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB113_1
16340; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
16341; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
16342; RV64IA-TSO-NOZACAS-NEXT:    ret
16343;
16344; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_acq_rel:
16345; RV64IA-WMO-ZACAS:       # %bb.0:
16346; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
16347; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
16348; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
16349; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
16350; RV64IA-WMO-ZACAS-NEXT:    li a4, 48
16351; RV64IA-WMO-ZACAS-NEXT:    andi a5, a0, 24
16352; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
16353; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 48
16354; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
16355; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
16356; RV64IA-WMO-ZACAS-NEXT:    sub a4, a4, a5
16357; RV64IA-WMO-ZACAS-NEXT:  .LBB113_1: # =>This Inner Loop Header: Depth=1
16358; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
16359; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
16360; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
16361; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
16362; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
16363; RV64IA-WMO-ZACAS-NEXT:    bge a7, a1, .LBB113_3
16364; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB113_1 Depth=1
16365; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
16366; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
16367; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
16368; RV64IA-WMO-ZACAS-NEXT:  .LBB113_3: # in Loop: Header=BB113_1 Depth=1
16369; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
16370; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB113_1
16371; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
16372; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
16373; RV64IA-WMO-ZACAS-NEXT:    ret
16374;
16375; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_acq_rel:
16376; RV64IA-TSO-ZACAS:       # %bb.0:
16377; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
16378; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
16379; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
16380; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
16381; RV64IA-TSO-ZACAS-NEXT:    li a4, 48
16382; RV64IA-TSO-ZACAS-NEXT:    andi a5, a0, 24
16383; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
16384; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 48
16385; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
16386; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
16387; RV64IA-TSO-ZACAS-NEXT:    sub a4, a4, a5
16388; RV64IA-TSO-ZACAS-NEXT:  .LBB113_1: # =>This Inner Loop Header: Depth=1
16389; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
16390; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
16391; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
16392; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
16393; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
16394; RV64IA-TSO-ZACAS-NEXT:    bge a7, a1, .LBB113_3
16395; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB113_1 Depth=1
16396; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
16397; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
16398; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
16399; RV64IA-TSO-ZACAS-NEXT:  .LBB113_3: # in Loop: Header=BB113_1 Depth=1
16400; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
16401; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB113_1
16402; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
16403; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
16404; RV64IA-TSO-ZACAS-NEXT:    ret
16405;
16406; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_acq_rel:
16407; RV64IA-WMO-ZABHA:       # %bb.0:
16408; RV64IA-WMO-ZABHA-NEXT:    amomax.h.aqrl a0, a1, (a0)
16409; RV64IA-WMO-ZABHA-NEXT:    ret
16410;
16411; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_acq_rel:
16412; RV64IA-TSO-ZABHA:       # %bb.0:
16413; RV64IA-TSO-ZABHA-NEXT:    amomax.h a0, a1, (a0)
16414; RV64IA-TSO-ZABHA-NEXT:    ret
16415  %1 = atomicrmw max ptr %a, i16 %b acq_rel
16416  ret i16 %1
16417}
16418
16419define i16 @atomicrmw_max_i16_seq_cst(ptr %a, i16 %b) nounwind {
16420; RV32I-LABEL: atomicrmw_max_i16_seq_cst:
16421; RV32I:       # %bb.0:
16422; RV32I-NEXT:    addi sp, sp, -32
16423; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16424; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16425; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16426; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16427; RV32I-NEXT:    mv s0, a0
16428; RV32I-NEXT:    lhu a3, 0(a0)
16429; RV32I-NEXT:    mv s1, a1
16430; RV32I-NEXT:    slli a0, a1, 16
16431; RV32I-NEXT:    srai s2, a0, 16
16432; RV32I-NEXT:    j .LBB114_2
16433; RV32I-NEXT:  .LBB114_1: # %atomicrmw.start
16434; RV32I-NEXT:    # in Loop: Header=BB114_2 Depth=1
16435; RV32I-NEXT:    sh a3, 14(sp)
16436; RV32I-NEXT:    addi a1, sp, 14
16437; RV32I-NEXT:    li a3, 5
16438; RV32I-NEXT:    li a4, 5
16439; RV32I-NEXT:    mv a0, s0
16440; RV32I-NEXT:    call __atomic_compare_exchange_2
16441; RV32I-NEXT:    lh a3, 14(sp)
16442; RV32I-NEXT:    bnez a0, .LBB114_4
16443; RV32I-NEXT:  .LBB114_2: # %atomicrmw.start
16444; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16445; RV32I-NEXT:    slli a0, a3, 16
16446; RV32I-NEXT:    srai a0, a0, 16
16447; RV32I-NEXT:    mv a2, a3
16448; RV32I-NEXT:    blt s2, a0, .LBB114_1
16449; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16450; RV32I-NEXT:    # in Loop: Header=BB114_2 Depth=1
16451; RV32I-NEXT:    mv a2, s1
16452; RV32I-NEXT:    j .LBB114_1
16453; RV32I-NEXT:  .LBB114_4: # %atomicrmw.end
16454; RV32I-NEXT:    mv a0, a3
16455; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16456; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16457; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16458; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16459; RV32I-NEXT:    addi sp, sp, 32
16460; RV32I-NEXT:    ret
16461;
16462; RV32IA-LABEL: atomicrmw_max_i16_seq_cst:
16463; RV32IA:       # %bb.0:
16464; RV32IA-NEXT:    andi a2, a0, -4
16465; RV32IA-NEXT:    slli a0, a0, 3
16466; RV32IA-NEXT:    lui a3, 16
16467; RV32IA-NEXT:    slli a1, a1, 16
16468; RV32IA-NEXT:    li a4, 16
16469; RV32IA-NEXT:    andi a5, a0, 24
16470; RV32IA-NEXT:    addi a3, a3, -1
16471; RV32IA-NEXT:    srai a1, a1, 16
16472; RV32IA-NEXT:    sll a3, a3, a0
16473; RV32IA-NEXT:    sll a1, a1, a0
16474; RV32IA-NEXT:    sub a4, a4, a5
16475; RV32IA-NEXT:  .LBB114_1: # =>This Inner Loop Header: Depth=1
16476; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
16477; RV32IA-NEXT:    and a7, a5, a3
16478; RV32IA-NEXT:    mv a6, a5
16479; RV32IA-NEXT:    sll a7, a7, a4
16480; RV32IA-NEXT:    sra a7, a7, a4
16481; RV32IA-NEXT:    bge a7, a1, .LBB114_3
16482; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB114_1 Depth=1
16483; RV32IA-NEXT:    xor a6, a5, a1
16484; RV32IA-NEXT:    and a6, a6, a3
16485; RV32IA-NEXT:    xor a6, a5, a6
16486; RV32IA-NEXT:  .LBB114_3: # in Loop: Header=BB114_1 Depth=1
16487; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
16488; RV32IA-NEXT:    bnez a6, .LBB114_1
16489; RV32IA-NEXT:  # %bb.4:
16490; RV32IA-NEXT:    srl a0, a5, a0
16491; RV32IA-NEXT:    ret
16492;
16493; RV64I-LABEL: atomicrmw_max_i16_seq_cst:
16494; RV64I:       # %bb.0:
16495; RV64I-NEXT:    addi sp, sp, -48
16496; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
16497; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
16498; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
16499; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
16500; RV64I-NEXT:    mv s0, a0
16501; RV64I-NEXT:    lhu a3, 0(a0)
16502; RV64I-NEXT:    mv s1, a1
16503; RV64I-NEXT:    slli a0, a1, 48
16504; RV64I-NEXT:    srai s2, a0, 48
16505; RV64I-NEXT:    j .LBB114_2
16506; RV64I-NEXT:  .LBB114_1: # %atomicrmw.start
16507; RV64I-NEXT:    # in Loop: Header=BB114_2 Depth=1
16508; RV64I-NEXT:    sh a3, 14(sp)
16509; RV64I-NEXT:    addi a1, sp, 14
16510; RV64I-NEXT:    li a3, 5
16511; RV64I-NEXT:    li a4, 5
16512; RV64I-NEXT:    mv a0, s0
16513; RV64I-NEXT:    call __atomic_compare_exchange_2
16514; RV64I-NEXT:    lh a3, 14(sp)
16515; RV64I-NEXT:    bnez a0, .LBB114_4
16516; RV64I-NEXT:  .LBB114_2: # %atomicrmw.start
16517; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16518; RV64I-NEXT:    slli a0, a3, 48
16519; RV64I-NEXT:    srai a0, a0, 48
16520; RV64I-NEXT:    mv a2, a3
16521; RV64I-NEXT:    blt s2, a0, .LBB114_1
16522; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16523; RV64I-NEXT:    # in Loop: Header=BB114_2 Depth=1
16524; RV64I-NEXT:    mv a2, s1
16525; RV64I-NEXT:    j .LBB114_1
16526; RV64I-NEXT:  .LBB114_4: # %atomicrmw.end
16527; RV64I-NEXT:    mv a0, a3
16528; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
16529; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
16530; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
16531; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
16532; RV64I-NEXT:    addi sp, sp, 48
16533; RV64I-NEXT:    ret
16534;
16535; RV64IA-NOZACAS-LABEL: atomicrmw_max_i16_seq_cst:
16536; RV64IA-NOZACAS:       # %bb.0:
16537; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
16538; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
16539; RV64IA-NOZACAS-NEXT:    lui a3, 16
16540; RV64IA-NOZACAS-NEXT:    slli a1, a1, 48
16541; RV64IA-NOZACAS-NEXT:    li a4, 48
16542; RV64IA-NOZACAS-NEXT:    andi a5, a0, 24
16543; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
16544; RV64IA-NOZACAS-NEXT:    srai a1, a1, 48
16545; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
16546; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
16547; RV64IA-NOZACAS-NEXT:    sub a4, a4, a5
16548; RV64IA-NOZACAS-NEXT:  .LBB114_1: # =>This Inner Loop Header: Depth=1
16549; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a5, (a2)
16550; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
16551; RV64IA-NOZACAS-NEXT:    mv a6, a5
16552; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
16553; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
16554; RV64IA-NOZACAS-NEXT:    bge a7, a1, .LBB114_3
16555; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB114_1 Depth=1
16556; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
16557; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
16558; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
16559; RV64IA-NOZACAS-NEXT:  .LBB114_3: # in Loop: Header=BB114_1 Depth=1
16560; RV64IA-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
16561; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB114_1
16562; RV64IA-NOZACAS-NEXT:  # %bb.4:
16563; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
16564; RV64IA-NOZACAS-NEXT:    ret
16565;
16566; RV64IA-ZACAS-LABEL: atomicrmw_max_i16_seq_cst:
16567; RV64IA-ZACAS:       # %bb.0:
16568; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
16569; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
16570; RV64IA-ZACAS-NEXT:    lui a3, 16
16571; RV64IA-ZACAS-NEXT:    slli a1, a1, 48
16572; RV64IA-ZACAS-NEXT:    li a4, 48
16573; RV64IA-ZACAS-NEXT:    andi a5, a0, 24
16574; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
16575; RV64IA-ZACAS-NEXT:    srai a1, a1, 48
16576; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
16577; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
16578; RV64IA-ZACAS-NEXT:    sub a4, a4, a5
16579; RV64IA-ZACAS-NEXT:  .LBB114_1: # =>This Inner Loop Header: Depth=1
16580; RV64IA-ZACAS-NEXT:    lr.w.aqrl a5, (a2)
16581; RV64IA-ZACAS-NEXT:    and a7, a5, a3
16582; RV64IA-ZACAS-NEXT:    mv a6, a5
16583; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
16584; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
16585; RV64IA-ZACAS-NEXT:    bge a7, a1, .LBB114_3
16586; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB114_1 Depth=1
16587; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
16588; RV64IA-ZACAS-NEXT:    and a6, a6, a3
16589; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
16590; RV64IA-ZACAS-NEXT:  .LBB114_3: # in Loop: Header=BB114_1 Depth=1
16591; RV64IA-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
16592; RV64IA-ZACAS-NEXT:    bnez a6, .LBB114_1
16593; RV64IA-ZACAS-NEXT:  # %bb.4:
16594; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
16595; RV64IA-ZACAS-NEXT:    ret
16596;
16597; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_seq_cst:
16598; RV64IA-WMO-ZABHA:       # %bb.0:
16599; RV64IA-WMO-ZABHA-NEXT:    amomax.h.aqrl a0, a1, (a0)
16600; RV64IA-WMO-ZABHA-NEXT:    ret
16601;
16602; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_seq_cst:
16603; RV64IA-TSO-ZABHA:       # %bb.0:
16604; RV64IA-TSO-ZABHA-NEXT:    amomax.h a0, a1, (a0)
16605; RV64IA-TSO-ZABHA-NEXT:    ret
16606  %1 = atomicrmw max ptr %a, i16 %b seq_cst
16607  ret i16 %1
16608}
16609
16610define i16 @atomicrmw_min_i16_monotonic(ptr %a, i16 %b) nounwind {
16611; RV32I-LABEL: atomicrmw_min_i16_monotonic:
16612; RV32I:       # %bb.0:
16613; RV32I-NEXT:    addi sp, sp, -32
16614; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16615; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16616; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16617; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16618; RV32I-NEXT:    mv s0, a0
16619; RV32I-NEXT:    lhu a3, 0(a0)
16620; RV32I-NEXT:    mv s1, a1
16621; RV32I-NEXT:    slli a0, a1, 16
16622; RV32I-NEXT:    srai s2, a0, 16
16623; RV32I-NEXT:    j .LBB115_2
16624; RV32I-NEXT:  .LBB115_1: # %atomicrmw.start
16625; RV32I-NEXT:    # in Loop: Header=BB115_2 Depth=1
16626; RV32I-NEXT:    sh a3, 14(sp)
16627; RV32I-NEXT:    addi a1, sp, 14
16628; RV32I-NEXT:    mv a0, s0
16629; RV32I-NEXT:    li a3, 0
16630; RV32I-NEXT:    li a4, 0
16631; RV32I-NEXT:    call __atomic_compare_exchange_2
16632; RV32I-NEXT:    lh a3, 14(sp)
16633; RV32I-NEXT:    bnez a0, .LBB115_4
16634; RV32I-NEXT:  .LBB115_2: # %atomicrmw.start
16635; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16636; RV32I-NEXT:    slli a0, a3, 16
16637; RV32I-NEXT:    srai a0, a0, 16
16638; RV32I-NEXT:    mv a2, a3
16639; RV32I-NEXT:    bge s2, a0, .LBB115_1
16640; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16641; RV32I-NEXT:    # in Loop: Header=BB115_2 Depth=1
16642; RV32I-NEXT:    mv a2, s1
16643; RV32I-NEXT:    j .LBB115_1
16644; RV32I-NEXT:  .LBB115_4: # %atomicrmw.end
16645; RV32I-NEXT:    mv a0, a3
16646; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16647; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16648; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16649; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16650; RV32I-NEXT:    addi sp, sp, 32
16651; RV32I-NEXT:    ret
16652;
16653; RV32IA-LABEL: atomicrmw_min_i16_monotonic:
16654; RV32IA:       # %bb.0:
16655; RV32IA-NEXT:    andi a2, a0, -4
16656; RV32IA-NEXT:    slli a0, a0, 3
16657; RV32IA-NEXT:    lui a3, 16
16658; RV32IA-NEXT:    slli a1, a1, 16
16659; RV32IA-NEXT:    li a4, 16
16660; RV32IA-NEXT:    andi a5, a0, 24
16661; RV32IA-NEXT:    addi a3, a3, -1
16662; RV32IA-NEXT:    srai a1, a1, 16
16663; RV32IA-NEXT:    sll a3, a3, a0
16664; RV32IA-NEXT:    sll a1, a1, a0
16665; RV32IA-NEXT:    sub a4, a4, a5
16666; RV32IA-NEXT:  .LBB115_1: # =>This Inner Loop Header: Depth=1
16667; RV32IA-NEXT:    lr.w a5, (a2)
16668; RV32IA-NEXT:    and a7, a5, a3
16669; RV32IA-NEXT:    mv a6, a5
16670; RV32IA-NEXT:    sll a7, a7, a4
16671; RV32IA-NEXT:    sra a7, a7, a4
16672; RV32IA-NEXT:    bge a1, a7, .LBB115_3
16673; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB115_1 Depth=1
16674; RV32IA-NEXT:    xor a6, a5, a1
16675; RV32IA-NEXT:    and a6, a6, a3
16676; RV32IA-NEXT:    xor a6, a5, a6
16677; RV32IA-NEXT:  .LBB115_3: # in Loop: Header=BB115_1 Depth=1
16678; RV32IA-NEXT:    sc.w a6, a6, (a2)
16679; RV32IA-NEXT:    bnez a6, .LBB115_1
16680; RV32IA-NEXT:  # %bb.4:
16681; RV32IA-NEXT:    srl a0, a5, a0
16682; RV32IA-NEXT:    ret
16683;
16684; RV64I-LABEL: atomicrmw_min_i16_monotonic:
16685; RV64I:       # %bb.0:
16686; RV64I-NEXT:    addi sp, sp, -48
16687; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
16688; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
16689; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
16690; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
16691; RV64I-NEXT:    mv s0, a0
16692; RV64I-NEXT:    lhu a3, 0(a0)
16693; RV64I-NEXT:    mv s1, a1
16694; RV64I-NEXT:    slli a0, a1, 48
16695; RV64I-NEXT:    srai s2, a0, 48
16696; RV64I-NEXT:    j .LBB115_2
16697; RV64I-NEXT:  .LBB115_1: # %atomicrmw.start
16698; RV64I-NEXT:    # in Loop: Header=BB115_2 Depth=1
16699; RV64I-NEXT:    sh a3, 14(sp)
16700; RV64I-NEXT:    addi a1, sp, 14
16701; RV64I-NEXT:    mv a0, s0
16702; RV64I-NEXT:    li a3, 0
16703; RV64I-NEXT:    li a4, 0
16704; RV64I-NEXT:    call __atomic_compare_exchange_2
16705; RV64I-NEXT:    lh a3, 14(sp)
16706; RV64I-NEXT:    bnez a0, .LBB115_4
16707; RV64I-NEXT:  .LBB115_2: # %atomicrmw.start
16708; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16709; RV64I-NEXT:    slli a0, a3, 48
16710; RV64I-NEXT:    srai a0, a0, 48
16711; RV64I-NEXT:    mv a2, a3
16712; RV64I-NEXT:    bge s2, a0, .LBB115_1
16713; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16714; RV64I-NEXT:    # in Loop: Header=BB115_2 Depth=1
16715; RV64I-NEXT:    mv a2, s1
16716; RV64I-NEXT:    j .LBB115_1
16717; RV64I-NEXT:  .LBB115_4: # %atomicrmw.end
16718; RV64I-NEXT:    mv a0, a3
16719; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
16720; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
16721; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
16722; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
16723; RV64I-NEXT:    addi sp, sp, 48
16724; RV64I-NEXT:    ret
16725;
16726; RV64IA-NOZACAS-LABEL: atomicrmw_min_i16_monotonic:
16727; RV64IA-NOZACAS:       # %bb.0:
16728; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
16729; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
16730; RV64IA-NOZACAS-NEXT:    lui a3, 16
16731; RV64IA-NOZACAS-NEXT:    slli a1, a1, 48
16732; RV64IA-NOZACAS-NEXT:    li a4, 48
16733; RV64IA-NOZACAS-NEXT:    andi a5, a0, 24
16734; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
16735; RV64IA-NOZACAS-NEXT:    srai a1, a1, 48
16736; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
16737; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
16738; RV64IA-NOZACAS-NEXT:    sub a4, a4, a5
16739; RV64IA-NOZACAS-NEXT:  .LBB115_1: # =>This Inner Loop Header: Depth=1
16740; RV64IA-NOZACAS-NEXT:    lr.w a5, (a2)
16741; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
16742; RV64IA-NOZACAS-NEXT:    mv a6, a5
16743; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
16744; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
16745; RV64IA-NOZACAS-NEXT:    bge a1, a7, .LBB115_3
16746; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB115_1 Depth=1
16747; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
16748; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
16749; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
16750; RV64IA-NOZACAS-NEXT:  .LBB115_3: # in Loop: Header=BB115_1 Depth=1
16751; RV64IA-NOZACAS-NEXT:    sc.w a6, a6, (a2)
16752; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB115_1
16753; RV64IA-NOZACAS-NEXT:  # %bb.4:
16754; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
16755; RV64IA-NOZACAS-NEXT:    ret
16756;
16757; RV64IA-ZACAS-LABEL: atomicrmw_min_i16_monotonic:
16758; RV64IA-ZACAS:       # %bb.0:
16759; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
16760; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
16761; RV64IA-ZACAS-NEXT:    lui a3, 16
16762; RV64IA-ZACAS-NEXT:    slli a1, a1, 48
16763; RV64IA-ZACAS-NEXT:    li a4, 48
16764; RV64IA-ZACAS-NEXT:    andi a5, a0, 24
16765; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
16766; RV64IA-ZACAS-NEXT:    srai a1, a1, 48
16767; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
16768; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
16769; RV64IA-ZACAS-NEXT:    sub a4, a4, a5
16770; RV64IA-ZACAS-NEXT:  .LBB115_1: # =>This Inner Loop Header: Depth=1
16771; RV64IA-ZACAS-NEXT:    lr.w a5, (a2)
16772; RV64IA-ZACAS-NEXT:    and a7, a5, a3
16773; RV64IA-ZACAS-NEXT:    mv a6, a5
16774; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
16775; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
16776; RV64IA-ZACAS-NEXT:    bge a1, a7, .LBB115_3
16777; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB115_1 Depth=1
16778; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
16779; RV64IA-ZACAS-NEXT:    and a6, a6, a3
16780; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
16781; RV64IA-ZACAS-NEXT:  .LBB115_3: # in Loop: Header=BB115_1 Depth=1
16782; RV64IA-ZACAS-NEXT:    sc.w a6, a6, (a2)
16783; RV64IA-ZACAS-NEXT:    bnez a6, .LBB115_1
16784; RV64IA-ZACAS-NEXT:  # %bb.4:
16785; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
16786; RV64IA-ZACAS-NEXT:    ret
16787;
16788; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_monotonic:
16789; RV64IA-WMO-ZABHA:       # %bb.0:
16790; RV64IA-WMO-ZABHA-NEXT:    amomin.h a0, a1, (a0)
16791; RV64IA-WMO-ZABHA-NEXT:    ret
16792;
16793; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_monotonic:
16794; RV64IA-TSO-ZABHA:       # %bb.0:
16795; RV64IA-TSO-ZABHA-NEXT:    amomin.h a0, a1, (a0)
16796; RV64IA-TSO-ZABHA-NEXT:    ret
16797  %1 = atomicrmw min ptr %a, i16 %b monotonic
16798  ret i16 %1
16799}
16800
16801define i16 @atomicrmw_min_i16_acquire(ptr %a, i16 %b) nounwind {
16802; RV32I-LABEL: atomicrmw_min_i16_acquire:
16803; RV32I:       # %bb.0:
16804; RV32I-NEXT:    addi sp, sp, -32
16805; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
16806; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
16807; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
16808; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
16809; RV32I-NEXT:    mv s0, a0
16810; RV32I-NEXT:    lhu a3, 0(a0)
16811; RV32I-NEXT:    mv s1, a1
16812; RV32I-NEXT:    slli a0, a1, 16
16813; RV32I-NEXT:    srai s2, a0, 16
16814; RV32I-NEXT:    j .LBB116_2
16815; RV32I-NEXT:  .LBB116_1: # %atomicrmw.start
16816; RV32I-NEXT:    # in Loop: Header=BB116_2 Depth=1
16817; RV32I-NEXT:    sh a3, 14(sp)
16818; RV32I-NEXT:    addi a1, sp, 14
16819; RV32I-NEXT:    li a3, 2
16820; RV32I-NEXT:    li a4, 2
16821; RV32I-NEXT:    mv a0, s0
16822; RV32I-NEXT:    call __atomic_compare_exchange_2
16823; RV32I-NEXT:    lh a3, 14(sp)
16824; RV32I-NEXT:    bnez a0, .LBB116_4
16825; RV32I-NEXT:  .LBB116_2: # %atomicrmw.start
16826; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
16827; RV32I-NEXT:    slli a0, a3, 16
16828; RV32I-NEXT:    srai a0, a0, 16
16829; RV32I-NEXT:    mv a2, a3
16830; RV32I-NEXT:    bge s2, a0, .LBB116_1
16831; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
16832; RV32I-NEXT:    # in Loop: Header=BB116_2 Depth=1
16833; RV32I-NEXT:    mv a2, s1
16834; RV32I-NEXT:    j .LBB116_1
16835; RV32I-NEXT:  .LBB116_4: # %atomicrmw.end
16836; RV32I-NEXT:    mv a0, a3
16837; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
16838; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
16839; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
16840; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
16841; RV32I-NEXT:    addi sp, sp, 32
16842; RV32I-NEXT:    ret
16843;
16844; RV32IA-WMO-LABEL: atomicrmw_min_i16_acquire:
16845; RV32IA-WMO:       # %bb.0:
16846; RV32IA-WMO-NEXT:    andi a2, a0, -4
16847; RV32IA-WMO-NEXT:    slli a0, a0, 3
16848; RV32IA-WMO-NEXT:    lui a3, 16
16849; RV32IA-WMO-NEXT:    slli a1, a1, 16
16850; RV32IA-WMO-NEXT:    li a4, 16
16851; RV32IA-WMO-NEXT:    andi a5, a0, 24
16852; RV32IA-WMO-NEXT:    addi a3, a3, -1
16853; RV32IA-WMO-NEXT:    srai a1, a1, 16
16854; RV32IA-WMO-NEXT:    sll a3, a3, a0
16855; RV32IA-WMO-NEXT:    sll a1, a1, a0
16856; RV32IA-WMO-NEXT:    sub a4, a4, a5
16857; RV32IA-WMO-NEXT:  .LBB116_1: # =>This Inner Loop Header: Depth=1
16858; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
16859; RV32IA-WMO-NEXT:    and a7, a5, a3
16860; RV32IA-WMO-NEXT:    mv a6, a5
16861; RV32IA-WMO-NEXT:    sll a7, a7, a4
16862; RV32IA-WMO-NEXT:    sra a7, a7, a4
16863; RV32IA-WMO-NEXT:    bge a1, a7, .LBB116_3
16864; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB116_1 Depth=1
16865; RV32IA-WMO-NEXT:    xor a6, a5, a1
16866; RV32IA-WMO-NEXT:    and a6, a6, a3
16867; RV32IA-WMO-NEXT:    xor a6, a5, a6
16868; RV32IA-WMO-NEXT:  .LBB116_3: # in Loop: Header=BB116_1 Depth=1
16869; RV32IA-WMO-NEXT:    sc.w a6, a6, (a2)
16870; RV32IA-WMO-NEXT:    bnez a6, .LBB116_1
16871; RV32IA-WMO-NEXT:  # %bb.4:
16872; RV32IA-WMO-NEXT:    srl a0, a5, a0
16873; RV32IA-WMO-NEXT:    ret
16874;
16875; RV32IA-TSO-LABEL: atomicrmw_min_i16_acquire:
16876; RV32IA-TSO:       # %bb.0:
16877; RV32IA-TSO-NEXT:    andi a2, a0, -4
16878; RV32IA-TSO-NEXT:    slli a0, a0, 3
16879; RV32IA-TSO-NEXT:    lui a3, 16
16880; RV32IA-TSO-NEXT:    slli a1, a1, 16
16881; RV32IA-TSO-NEXT:    li a4, 16
16882; RV32IA-TSO-NEXT:    andi a5, a0, 24
16883; RV32IA-TSO-NEXT:    addi a3, a3, -1
16884; RV32IA-TSO-NEXT:    srai a1, a1, 16
16885; RV32IA-TSO-NEXT:    sll a3, a3, a0
16886; RV32IA-TSO-NEXT:    sll a1, a1, a0
16887; RV32IA-TSO-NEXT:    sub a4, a4, a5
16888; RV32IA-TSO-NEXT:  .LBB116_1: # =>This Inner Loop Header: Depth=1
16889; RV32IA-TSO-NEXT:    lr.w a5, (a2)
16890; RV32IA-TSO-NEXT:    and a7, a5, a3
16891; RV32IA-TSO-NEXT:    mv a6, a5
16892; RV32IA-TSO-NEXT:    sll a7, a7, a4
16893; RV32IA-TSO-NEXT:    sra a7, a7, a4
16894; RV32IA-TSO-NEXT:    bge a1, a7, .LBB116_3
16895; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB116_1 Depth=1
16896; RV32IA-TSO-NEXT:    xor a6, a5, a1
16897; RV32IA-TSO-NEXT:    and a6, a6, a3
16898; RV32IA-TSO-NEXT:    xor a6, a5, a6
16899; RV32IA-TSO-NEXT:  .LBB116_3: # in Loop: Header=BB116_1 Depth=1
16900; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
16901; RV32IA-TSO-NEXT:    bnez a6, .LBB116_1
16902; RV32IA-TSO-NEXT:  # %bb.4:
16903; RV32IA-TSO-NEXT:    srl a0, a5, a0
16904; RV32IA-TSO-NEXT:    ret
16905;
16906; RV64I-LABEL: atomicrmw_min_i16_acquire:
16907; RV64I:       # %bb.0:
16908; RV64I-NEXT:    addi sp, sp, -48
16909; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
16910; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
16911; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
16912; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
16913; RV64I-NEXT:    mv s0, a0
16914; RV64I-NEXT:    lhu a3, 0(a0)
16915; RV64I-NEXT:    mv s1, a1
16916; RV64I-NEXT:    slli a0, a1, 48
16917; RV64I-NEXT:    srai s2, a0, 48
16918; RV64I-NEXT:    j .LBB116_2
16919; RV64I-NEXT:  .LBB116_1: # %atomicrmw.start
16920; RV64I-NEXT:    # in Loop: Header=BB116_2 Depth=1
16921; RV64I-NEXT:    sh a3, 14(sp)
16922; RV64I-NEXT:    addi a1, sp, 14
16923; RV64I-NEXT:    li a3, 2
16924; RV64I-NEXT:    li a4, 2
16925; RV64I-NEXT:    mv a0, s0
16926; RV64I-NEXT:    call __atomic_compare_exchange_2
16927; RV64I-NEXT:    lh a3, 14(sp)
16928; RV64I-NEXT:    bnez a0, .LBB116_4
16929; RV64I-NEXT:  .LBB116_2: # %atomicrmw.start
16930; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
16931; RV64I-NEXT:    slli a0, a3, 48
16932; RV64I-NEXT:    srai a0, a0, 48
16933; RV64I-NEXT:    mv a2, a3
16934; RV64I-NEXT:    bge s2, a0, .LBB116_1
16935; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
16936; RV64I-NEXT:    # in Loop: Header=BB116_2 Depth=1
16937; RV64I-NEXT:    mv a2, s1
16938; RV64I-NEXT:    j .LBB116_1
16939; RV64I-NEXT:  .LBB116_4: # %atomicrmw.end
16940; RV64I-NEXT:    mv a0, a3
16941; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
16942; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
16943; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
16944; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
16945; RV64I-NEXT:    addi sp, sp, 48
16946; RV64I-NEXT:    ret
16947;
16948; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_acquire:
16949; RV64IA-WMO-NOZACAS:       # %bb.0:
16950; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
16951; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
16952; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
16953; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
16954; RV64IA-WMO-NOZACAS-NEXT:    li a4, 48
16955; RV64IA-WMO-NOZACAS-NEXT:    andi a5, a0, 24
16956; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
16957; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 48
16958; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
16959; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
16960; RV64IA-WMO-NOZACAS-NEXT:    sub a4, a4, a5
16961; RV64IA-WMO-NOZACAS-NEXT:  .LBB116_1: # =>This Inner Loop Header: Depth=1
16962; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
16963; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
16964; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
16965; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
16966; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
16967; RV64IA-WMO-NOZACAS-NEXT:    bge a1, a7, .LBB116_3
16968; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB116_1 Depth=1
16969; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
16970; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
16971; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
16972; RV64IA-WMO-NOZACAS-NEXT:  .LBB116_3: # in Loop: Header=BB116_1 Depth=1
16973; RV64IA-WMO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
16974; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB116_1
16975; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
16976; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
16977; RV64IA-WMO-NOZACAS-NEXT:    ret
16978;
16979; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_acquire:
16980; RV64IA-TSO-NOZACAS:       # %bb.0:
16981; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
16982; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
16983; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
16984; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
16985; RV64IA-TSO-NOZACAS-NEXT:    li a4, 48
16986; RV64IA-TSO-NOZACAS-NEXT:    andi a5, a0, 24
16987; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
16988; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 48
16989; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
16990; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
16991; RV64IA-TSO-NOZACAS-NEXT:    sub a4, a4, a5
16992; RV64IA-TSO-NOZACAS-NEXT:  .LBB116_1: # =>This Inner Loop Header: Depth=1
16993; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
16994; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
16995; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
16996; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
16997; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
16998; RV64IA-TSO-NOZACAS-NEXT:    bge a1, a7, .LBB116_3
16999; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB116_1 Depth=1
17000; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
17001; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
17002; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
17003; RV64IA-TSO-NOZACAS-NEXT:  .LBB116_3: # in Loop: Header=BB116_1 Depth=1
17004; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
17005; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB116_1
17006; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
17007; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
17008; RV64IA-TSO-NOZACAS-NEXT:    ret
17009;
17010; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_acquire:
17011; RV64IA-WMO-ZACAS:       # %bb.0:
17012; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
17013; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
17014; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
17015; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
17016; RV64IA-WMO-ZACAS-NEXT:    li a4, 48
17017; RV64IA-WMO-ZACAS-NEXT:    andi a5, a0, 24
17018; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
17019; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 48
17020; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
17021; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
17022; RV64IA-WMO-ZACAS-NEXT:    sub a4, a4, a5
17023; RV64IA-WMO-ZACAS-NEXT:  .LBB116_1: # =>This Inner Loop Header: Depth=1
17024; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
17025; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
17026; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
17027; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
17028; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
17029; RV64IA-WMO-ZACAS-NEXT:    bge a1, a7, .LBB116_3
17030; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB116_1 Depth=1
17031; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
17032; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
17033; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
17034; RV64IA-WMO-ZACAS-NEXT:  .LBB116_3: # in Loop: Header=BB116_1 Depth=1
17035; RV64IA-WMO-ZACAS-NEXT:    sc.w a6, a6, (a2)
17036; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB116_1
17037; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
17038; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
17039; RV64IA-WMO-ZACAS-NEXT:    ret
17040;
17041; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_acquire:
17042; RV64IA-TSO-ZACAS:       # %bb.0:
17043; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
17044; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
17045; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
17046; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
17047; RV64IA-TSO-ZACAS-NEXT:    li a4, 48
17048; RV64IA-TSO-ZACAS-NEXT:    andi a5, a0, 24
17049; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
17050; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 48
17051; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
17052; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
17053; RV64IA-TSO-ZACAS-NEXT:    sub a4, a4, a5
17054; RV64IA-TSO-ZACAS-NEXT:  .LBB116_1: # =>This Inner Loop Header: Depth=1
17055; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
17056; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
17057; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
17058; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
17059; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
17060; RV64IA-TSO-ZACAS-NEXT:    bge a1, a7, .LBB116_3
17061; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB116_1 Depth=1
17062; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
17063; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
17064; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
17065; RV64IA-TSO-ZACAS-NEXT:  .LBB116_3: # in Loop: Header=BB116_1 Depth=1
17066; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
17067; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB116_1
17068; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
17069; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
17070; RV64IA-TSO-ZACAS-NEXT:    ret
17071;
17072; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_acquire:
17073; RV64IA-WMO-ZABHA:       # %bb.0:
17074; RV64IA-WMO-ZABHA-NEXT:    amomin.h.aq a0, a1, (a0)
17075; RV64IA-WMO-ZABHA-NEXT:    ret
17076;
17077; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_acquire:
17078; RV64IA-TSO-ZABHA:       # %bb.0:
17079; RV64IA-TSO-ZABHA-NEXT:    amomin.h a0, a1, (a0)
17080; RV64IA-TSO-ZABHA-NEXT:    ret
17081  %1 = atomicrmw min ptr %a, i16 %b acquire
17082  ret i16 %1
17083}
17084
17085define i16 @atomicrmw_min_i16_release(ptr %a, i16 %b) nounwind {
17086; RV32I-LABEL: atomicrmw_min_i16_release:
17087; RV32I:       # %bb.0:
17088; RV32I-NEXT:    addi sp, sp, -32
17089; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17090; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17091; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17092; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17093; RV32I-NEXT:    mv s0, a0
17094; RV32I-NEXT:    lhu a3, 0(a0)
17095; RV32I-NEXT:    mv s1, a1
17096; RV32I-NEXT:    slli a0, a1, 16
17097; RV32I-NEXT:    srai s2, a0, 16
17098; RV32I-NEXT:    j .LBB117_2
17099; RV32I-NEXT:  .LBB117_1: # %atomicrmw.start
17100; RV32I-NEXT:    # in Loop: Header=BB117_2 Depth=1
17101; RV32I-NEXT:    sh a3, 14(sp)
17102; RV32I-NEXT:    addi a1, sp, 14
17103; RV32I-NEXT:    li a3, 3
17104; RV32I-NEXT:    mv a0, s0
17105; RV32I-NEXT:    li a4, 0
17106; RV32I-NEXT:    call __atomic_compare_exchange_2
17107; RV32I-NEXT:    lh a3, 14(sp)
17108; RV32I-NEXT:    bnez a0, .LBB117_4
17109; RV32I-NEXT:  .LBB117_2: # %atomicrmw.start
17110; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17111; RV32I-NEXT:    slli a0, a3, 16
17112; RV32I-NEXT:    srai a0, a0, 16
17113; RV32I-NEXT:    mv a2, a3
17114; RV32I-NEXT:    bge s2, a0, .LBB117_1
17115; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17116; RV32I-NEXT:    # in Loop: Header=BB117_2 Depth=1
17117; RV32I-NEXT:    mv a2, s1
17118; RV32I-NEXT:    j .LBB117_1
17119; RV32I-NEXT:  .LBB117_4: # %atomicrmw.end
17120; RV32I-NEXT:    mv a0, a3
17121; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17122; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17123; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17124; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17125; RV32I-NEXT:    addi sp, sp, 32
17126; RV32I-NEXT:    ret
17127;
17128; RV32IA-WMO-LABEL: atomicrmw_min_i16_release:
17129; RV32IA-WMO:       # %bb.0:
17130; RV32IA-WMO-NEXT:    andi a2, a0, -4
17131; RV32IA-WMO-NEXT:    slli a0, a0, 3
17132; RV32IA-WMO-NEXT:    lui a3, 16
17133; RV32IA-WMO-NEXT:    slli a1, a1, 16
17134; RV32IA-WMO-NEXT:    li a4, 16
17135; RV32IA-WMO-NEXT:    andi a5, a0, 24
17136; RV32IA-WMO-NEXT:    addi a3, a3, -1
17137; RV32IA-WMO-NEXT:    srai a1, a1, 16
17138; RV32IA-WMO-NEXT:    sll a3, a3, a0
17139; RV32IA-WMO-NEXT:    sll a1, a1, a0
17140; RV32IA-WMO-NEXT:    sub a4, a4, a5
17141; RV32IA-WMO-NEXT:  .LBB117_1: # =>This Inner Loop Header: Depth=1
17142; RV32IA-WMO-NEXT:    lr.w a5, (a2)
17143; RV32IA-WMO-NEXT:    and a7, a5, a3
17144; RV32IA-WMO-NEXT:    mv a6, a5
17145; RV32IA-WMO-NEXT:    sll a7, a7, a4
17146; RV32IA-WMO-NEXT:    sra a7, a7, a4
17147; RV32IA-WMO-NEXT:    bge a1, a7, .LBB117_3
17148; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB117_1 Depth=1
17149; RV32IA-WMO-NEXT:    xor a6, a5, a1
17150; RV32IA-WMO-NEXT:    and a6, a6, a3
17151; RV32IA-WMO-NEXT:    xor a6, a5, a6
17152; RV32IA-WMO-NEXT:  .LBB117_3: # in Loop: Header=BB117_1 Depth=1
17153; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
17154; RV32IA-WMO-NEXT:    bnez a6, .LBB117_1
17155; RV32IA-WMO-NEXT:  # %bb.4:
17156; RV32IA-WMO-NEXT:    srl a0, a5, a0
17157; RV32IA-WMO-NEXT:    ret
17158;
17159; RV32IA-TSO-LABEL: atomicrmw_min_i16_release:
17160; RV32IA-TSO:       # %bb.0:
17161; RV32IA-TSO-NEXT:    andi a2, a0, -4
17162; RV32IA-TSO-NEXT:    slli a0, a0, 3
17163; RV32IA-TSO-NEXT:    lui a3, 16
17164; RV32IA-TSO-NEXT:    slli a1, a1, 16
17165; RV32IA-TSO-NEXT:    li a4, 16
17166; RV32IA-TSO-NEXT:    andi a5, a0, 24
17167; RV32IA-TSO-NEXT:    addi a3, a3, -1
17168; RV32IA-TSO-NEXT:    srai a1, a1, 16
17169; RV32IA-TSO-NEXT:    sll a3, a3, a0
17170; RV32IA-TSO-NEXT:    sll a1, a1, a0
17171; RV32IA-TSO-NEXT:    sub a4, a4, a5
17172; RV32IA-TSO-NEXT:  .LBB117_1: # =>This Inner Loop Header: Depth=1
17173; RV32IA-TSO-NEXT:    lr.w a5, (a2)
17174; RV32IA-TSO-NEXT:    and a7, a5, a3
17175; RV32IA-TSO-NEXT:    mv a6, a5
17176; RV32IA-TSO-NEXT:    sll a7, a7, a4
17177; RV32IA-TSO-NEXT:    sra a7, a7, a4
17178; RV32IA-TSO-NEXT:    bge a1, a7, .LBB117_3
17179; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB117_1 Depth=1
17180; RV32IA-TSO-NEXT:    xor a6, a5, a1
17181; RV32IA-TSO-NEXT:    and a6, a6, a3
17182; RV32IA-TSO-NEXT:    xor a6, a5, a6
17183; RV32IA-TSO-NEXT:  .LBB117_3: # in Loop: Header=BB117_1 Depth=1
17184; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
17185; RV32IA-TSO-NEXT:    bnez a6, .LBB117_1
17186; RV32IA-TSO-NEXT:  # %bb.4:
17187; RV32IA-TSO-NEXT:    srl a0, a5, a0
17188; RV32IA-TSO-NEXT:    ret
17189;
17190; RV64I-LABEL: atomicrmw_min_i16_release:
17191; RV64I:       # %bb.0:
17192; RV64I-NEXT:    addi sp, sp, -48
17193; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
17194; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
17195; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
17196; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
17197; RV64I-NEXT:    mv s0, a0
17198; RV64I-NEXT:    lhu a3, 0(a0)
17199; RV64I-NEXT:    mv s1, a1
17200; RV64I-NEXT:    slli a0, a1, 48
17201; RV64I-NEXT:    srai s2, a0, 48
17202; RV64I-NEXT:    j .LBB117_2
17203; RV64I-NEXT:  .LBB117_1: # %atomicrmw.start
17204; RV64I-NEXT:    # in Loop: Header=BB117_2 Depth=1
17205; RV64I-NEXT:    sh a3, 14(sp)
17206; RV64I-NEXT:    addi a1, sp, 14
17207; RV64I-NEXT:    li a3, 3
17208; RV64I-NEXT:    mv a0, s0
17209; RV64I-NEXT:    li a4, 0
17210; RV64I-NEXT:    call __atomic_compare_exchange_2
17211; RV64I-NEXT:    lh a3, 14(sp)
17212; RV64I-NEXT:    bnez a0, .LBB117_4
17213; RV64I-NEXT:  .LBB117_2: # %atomicrmw.start
17214; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17215; RV64I-NEXT:    slli a0, a3, 48
17216; RV64I-NEXT:    srai a0, a0, 48
17217; RV64I-NEXT:    mv a2, a3
17218; RV64I-NEXT:    bge s2, a0, .LBB117_1
17219; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17220; RV64I-NEXT:    # in Loop: Header=BB117_2 Depth=1
17221; RV64I-NEXT:    mv a2, s1
17222; RV64I-NEXT:    j .LBB117_1
17223; RV64I-NEXT:  .LBB117_4: # %atomicrmw.end
17224; RV64I-NEXT:    mv a0, a3
17225; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
17226; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
17227; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
17228; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
17229; RV64I-NEXT:    addi sp, sp, 48
17230; RV64I-NEXT:    ret
17231;
17232; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_release:
17233; RV64IA-WMO-NOZACAS:       # %bb.0:
17234; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
17235; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
17236; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
17237; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
17238; RV64IA-WMO-NOZACAS-NEXT:    li a4, 48
17239; RV64IA-WMO-NOZACAS-NEXT:    andi a5, a0, 24
17240; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
17241; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 48
17242; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
17243; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
17244; RV64IA-WMO-NOZACAS-NEXT:    sub a4, a4, a5
17245; RV64IA-WMO-NOZACAS-NEXT:  .LBB117_1: # =>This Inner Loop Header: Depth=1
17246; RV64IA-WMO-NOZACAS-NEXT:    lr.w a5, (a2)
17247; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
17248; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
17249; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
17250; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
17251; RV64IA-WMO-NOZACAS-NEXT:    bge a1, a7, .LBB117_3
17252; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB117_1 Depth=1
17253; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
17254; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
17255; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
17256; RV64IA-WMO-NOZACAS-NEXT:  .LBB117_3: # in Loop: Header=BB117_1 Depth=1
17257; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
17258; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB117_1
17259; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
17260; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
17261; RV64IA-WMO-NOZACAS-NEXT:    ret
17262;
17263; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_release:
17264; RV64IA-TSO-NOZACAS:       # %bb.0:
17265; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
17266; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
17267; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
17268; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
17269; RV64IA-TSO-NOZACAS-NEXT:    li a4, 48
17270; RV64IA-TSO-NOZACAS-NEXT:    andi a5, a0, 24
17271; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
17272; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 48
17273; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
17274; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
17275; RV64IA-TSO-NOZACAS-NEXT:    sub a4, a4, a5
17276; RV64IA-TSO-NOZACAS-NEXT:  .LBB117_1: # =>This Inner Loop Header: Depth=1
17277; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
17278; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
17279; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
17280; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
17281; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
17282; RV64IA-TSO-NOZACAS-NEXT:    bge a1, a7, .LBB117_3
17283; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB117_1 Depth=1
17284; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
17285; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
17286; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
17287; RV64IA-TSO-NOZACAS-NEXT:  .LBB117_3: # in Loop: Header=BB117_1 Depth=1
17288; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
17289; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB117_1
17290; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
17291; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
17292; RV64IA-TSO-NOZACAS-NEXT:    ret
17293;
17294; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_release:
17295; RV64IA-WMO-ZACAS:       # %bb.0:
17296; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
17297; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
17298; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
17299; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
17300; RV64IA-WMO-ZACAS-NEXT:    li a4, 48
17301; RV64IA-WMO-ZACAS-NEXT:    andi a5, a0, 24
17302; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
17303; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 48
17304; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
17305; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
17306; RV64IA-WMO-ZACAS-NEXT:    sub a4, a4, a5
17307; RV64IA-WMO-ZACAS-NEXT:  .LBB117_1: # =>This Inner Loop Header: Depth=1
17308; RV64IA-WMO-ZACAS-NEXT:    lr.w a5, (a2)
17309; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
17310; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
17311; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
17312; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
17313; RV64IA-WMO-ZACAS-NEXT:    bge a1, a7, .LBB117_3
17314; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB117_1 Depth=1
17315; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
17316; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
17317; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
17318; RV64IA-WMO-ZACAS-NEXT:  .LBB117_3: # in Loop: Header=BB117_1 Depth=1
17319; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
17320; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB117_1
17321; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
17322; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
17323; RV64IA-WMO-ZACAS-NEXT:    ret
17324;
17325; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_release:
17326; RV64IA-TSO-ZACAS:       # %bb.0:
17327; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
17328; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
17329; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
17330; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
17331; RV64IA-TSO-ZACAS-NEXT:    li a4, 48
17332; RV64IA-TSO-ZACAS-NEXT:    andi a5, a0, 24
17333; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
17334; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 48
17335; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
17336; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
17337; RV64IA-TSO-ZACAS-NEXT:    sub a4, a4, a5
17338; RV64IA-TSO-ZACAS-NEXT:  .LBB117_1: # =>This Inner Loop Header: Depth=1
17339; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
17340; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
17341; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
17342; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
17343; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
17344; RV64IA-TSO-ZACAS-NEXT:    bge a1, a7, .LBB117_3
17345; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB117_1 Depth=1
17346; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
17347; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
17348; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
17349; RV64IA-TSO-ZACAS-NEXT:  .LBB117_3: # in Loop: Header=BB117_1 Depth=1
17350; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
17351; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB117_1
17352; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
17353; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
17354; RV64IA-TSO-ZACAS-NEXT:    ret
17355;
17356; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_release:
17357; RV64IA-WMO-ZABHA:       # %bb.0:
17358; RV64IA-WMO-ZABHA-NEXT:    amomin.h.rl a0, a1, (a0)
17359; RV64IA-WMO-ZABHA-NEXT:    ret
17360;
17361; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_release:
17362; RV64IA-TSO-ZABHA:       # %bb.0:
17363; RV64IA-TSO-ZABHA-NEXT:    amomin.h a0, a1, (a0)
17364; RV64IA-TSO-ZABHA-NEXT:    ret
17365  %1 = atomicrmw min ptr %a, i16 %b release
17366  ret i16 %1
17367}
17368
17369define i16 @atomicrmw_min_i16_acq_rel(ptr %a, i16 %b) nounwind {
17370; RV32I-LABEL: atomicrmw_min_i16_acq_rel:
17371; RV32I:       # %bb.0:
17372; RV32I-NEXT:    addi sp, sp, -32
17373; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17374; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17375; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17376; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17377; RV32I-NEXT:    mv s0, a0
17378; RV32I-NEXT:    lhu a3, 0(a0)
17379; RV32I-NEXT:    mv s1, a1
17380; RV32I-NEXT:    slli a0, a1, 16
17381; RV32I-NEXT:    srai s2, a0, 16
17382; RV32I-NEXT:    j .LBB118_2
17383; RV32I-NEXT:  .LBB118_1: # %atomicrmw.start
17384; RV32I-NEXT:    # in Loop: Header=BB118_2 Depth=1
17385; RV32I-NEXT:    sh a3, 14(sp)
17386; RV32I-NEXT:    addi a1, sp, 14
17387; RV32I-NEXT:    li a3, 4
17388; RV32I-NEXT:    li a4, 2
17389; RV32I-NEXT:    mv a0, s0
17390; RV32I-NEXT:    call __atomic_compare_exchange_2
17391; RV32I-NEXT:    lh a3, 14(sp)
17392; RV32I-NEXT:    bnez a0, .LBB118_4
17393; RV32I-NEXT:  .LBB118_2: # %atomicrmw.start
17394; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17395; RV32I-NEXT:    slli a0, a3, 16
17396; RV32I-NEXT:    srai a0, a0, 16
17397; RV32I-NEXT:    mv a2, a3
17398; RV32I-NEXT:    bge s2, a0, .LBB118_1
17399; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17400; RV32I-NEXT:    # in Loop: Header=BB118_2 Depth=1
17401; RV32I-NEXT:    mv a2, s1
17402; RV32I-NEXT:    j .LBB118_1
17403; RV32I-NEXT:  .LBB118_4: # %atomicrmw.end
17404; RV32I-NEXT:    mv a0, a3
17405; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17406; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17407; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17408; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17409; RV32I-NEXT:    addi sp, sp, 32
17410; RV32I-NEXT:    ret
17411;
17412; RV32IA-WMO-LABEL: atomicrmw_min_i16_acq_rel:
17413; RV32IA-WMO:       # %bb.0:
17414; RV32IA-WMO-NEXT:    andi a2, a0, -4
17415; RV32IA-WMO-NEXT:    slli a0, a0, 3
17416; RV32IA-WMO-NEXT:    lui a3, 16
17417; RV32IA-WMO-NEXT:    slli a1, a1, 16
17418; RV32IA-WMO-NEXT:    li a4, 16
17419; RV32IA-WMO-NEXT:    andi a5, a0, 24
17420; RV32IA-WMO-NEXT:    addi a3, a3, -1
17421; RV32IA-WMO-NEXT:    srai a1, a1, 16
17422; RV32IA-WMO-NEXT:    sll a3, a3, a0
17423; RV32IA-WMO-NEXT:    sll a1, a1, a0
17424; RV32IA-WMO-NEXT:    sub a4, a4, a5
17425; RV32IA-WMO-NEXT:  .LBB118_1: # =>This Inner Loop Header: Depth=1
17426; RV32IA-WMO-NEXT:    lr.w.aq a5, (a2)
17427; RV32IA-WMO-NEXT:    and a7, a5, a3
17428; RV32IA-WMO-NEXT:    mv a6, a5
17429; RV32IA-WMO-NEXT:    sll a7, a7, a4
17430; RV32IA-WMO-NEXT:    sra a7, a7, a4
17431; RV32IA-WMO-NEXT:    bge a1, a7, .LBB118_3
17432; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB118_1 Depth=1
17433; RV32IA-WMO-NEXT:    xor a6, a5, a1
17434; RV32IA-WMO-NEXT:    and a6, a6, a3
17435; RV32IA-WMO-NEXT:    xor a6, a5, a6
17436; RV32IA-WMO-NEXT:  .LBB118_3: # in Loop: Header=BB118_1 Depth=1
17437; RV32IA-WMO-NEXT:    sc.w.rl a6, a6, (a2)
17438; RV32IA-WMO-NEXT:    bnez a6, .LBB118_1
17439; RV32IA-WMO-NEXT:  # %bb.4:
17440; RV32IA-WMO-NEXT:    srl a0, a5, a0
17441; RV32IA-WMO-NEXT:    ret
17442;
17443; RV32IA-TSO-LABEL: atomicrmw_min_i16_acq_rel:
17444; RV32IA-TSO:       # %bb.0:
17445; RV32IA-TSO-NEXT:    andi a2, a0, -4
17446; RV32IA-TSO-NEXT:    slli a0, a0, 3
17447; RV32IA-TSO-NEXT:    lui a3, 16
17448; RV32IA-TSO-NEXT:    slli a1, a1, 16
17449; RV32IA-TSO-NEXT:    li a4, 16
17450; RV32IA-TSO-NEXT:    andi a5, a0, 24
17451; RV32IA-TSO-NEXT:    addi a3, a3, -1
17452; RV32IA-TSO-NEXT:    srai a1, a1, 16
17453; RV32IA-TSO-NEXT:    sll a3, a3, a0
17454; RV32IA-TSO-NEXT:    sll a1, a1, a0
17455; RV32IA-TSO-NEXT:    sub a4, a4, a5
17456; RV32IA-TSO-NEXT:  .LBB118_1: # =>This Inner Loop Header: Depth=1
17457; RV32IA-TSO-NEXT:    lr.w a5, (a2)
17458; RV32IA-TSO-NEXT:    and a7, a5, a3
17459; RV32IA-TSO-NEXT:    mv a6, a5
17460; RV32IA-TSO-NEXT:    sll a7, a7, a4
17461; RV32IA-TSO-NEXT:    sra a7, a7, a4
17462; RV32IA-TSO-NEXT:    bge a1, a7, .LBB118_3
17463; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB118_1 Depth=1
17464; RV32IA-TSO-NEXT:    xor a6, a5, a1
17465; RV32IA-TSO-NEXT:    and a6, a6, a3
17466; RV32IA-TSO-NEXT:    xor a6, a5, a6
17467; RV32IA-TSO-NEXT:  .LBB118_3: # in Loop: Header=BB118_1 Depth=1
17468; RV32IA-TSO-NEXT:    sc.w a6, a6, (a2)
17469; RV32IA-TSO-NEXT:    bnez a6, .LBB118_1
17470; RV32IA-TSO-NEXT:  # %bb.4:
17471; RV32IA-TSO-NEXT:    srl a0, a5, a0
17472; RV32IA-TSO-NEXT:    ret
17473;
17474; RV64I-LABEL: atomicrmw_min_i16_acq_rel:
17475; RV64I:       # %bb.0:
17476; RV64I-NEXT:    addi sp, sp, -48
17477; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
17478; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
17479; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
17480; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
17481; RV64I-NEXT:    mv s0, a0
17482; RV64I-NEXT:    lhu a3, 0(a0)
17483; RV64I-NEXT:    mv s1, a1
17484; RV64I-NEXT:    slli a0, a1, 48
17485; RV64I-NEXT:    srai s2, a0, 48
17486; RV64I-NEXT:    j .LBB118_2
17487; RV64I-NEXT:  .LBB118_1: # %atomicrmw.start
17488; RV64I-NEXT:    # in Loop: Header=BB118_2 Depth=1
17489; RV64I-NEXT:    sh a3, 14(sp)
17490; RV64I-NEXT:    addi a1, sp, 14
17491; RV64I-NEXT:    li a3, 4
17492; RV64I-NEXT:    li a4, 2
17493; RV64I-NEXT:    mv a0, s0
17494; RV64I-NEXT:    call __atomic_compare_exchange_2
17495; RV64I-NEXT:    lh a3, 14(sp)
17496; RV64I-NEXT:    bnez a0, .LBB118_4
17497; RV64I-NEXT:  .LBB118_2: # %atomicrmw.start
17498; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17499; RV64I-NEXT:    slli a0, a3, 48
17500; RV64I-NEXT:    srai a0, a0, 48
17501; RV64I-NEXT:    mv a2, a3
17502; RV64I-NEXT:    bge s2, a0, .LBB118_1
17503; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17504; RV64I-NEXT:    # in Loop: Header=BB118_2 Depth=1
17505; RV64I-NEXT:    mv a2, s1
17506; RV64I-NEXT:    j .LBB118_1
17507; RV64I-NEXT:  .LBB118_4: # %atomicrmw.end
17508; RV64I-NEXT:    mv a0, a3
17509; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
17510; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
17511; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
17512; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
17513; RV64I-NEXT:    addi sp, sp, 48
17514; RV64I-NEXT:    ret
17515;
17516; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_acq_rel:
17517; RV64IA-WMO-NOZACAS:       # %bb.0:
17518; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
17519; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
17520; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
17521; RV64IA-WMO-NOZACAS-NEXT:    slli a1, a1, 48
17522; RV64IA-WMO-NOZACAS-NEXT:    li a4, 48
17523; RV64IA-WMO-NOZACAS-NEXT:    andi a5, a0, 24
17524; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
17525; RV64IA-WMO-NOZACAS-NEXT:    srai a1, a1, 48
17526; RV64IA-WMO-NOZACAS-NEXT:    sllw a3, a3, a0
17527; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
17528; RV64IA-WMO-NOZACAS-NEXT:    sub a4, a4, a5
17529; RV64IA-WMO-NOZACAS-NEXT:  .LBB118_1: # =>This Inner Loop Header: Depth=1
17530; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a5, (a2)
17531; RV64IA-WMO-NOZACAS-NEXT:    and a7, a5, a3
17532; RV64IA-WMO-NOZACAS-NEXT:    mv a6, a5
17533; RV64IA-WMO-NOZACAS-NEXT:    sll a7, a7, a4
17534; RV64IA-WMO-NOZACAS-NEXT:    sra a7, a7, a4
17535; RV64IA-WMO-NOZACAS-NEXT:    bge a1, a7, .LBB118_3
17536; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB118_1 Depth=1
17537; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a1
17538; RV64IA-WMO-NOZACAS-NEXT:    and a6, a6, a3
17539; RV64IA-WMO-NOZACAS-NEXT:    xor a6, a5, a6
17540; RV64IA-WMO-NOZACAS-NEXT:  .LBB118_3: # in Loop: Header=BB118_1 Depth=1
17541; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
17542; RV64IA-WMO-NOZACAS-NEXT:    bnez a6, .LBB118_1
17543; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
17544; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a5, a0
17545; RV64IA-WMO-NOZACAS-NEXT:    ret
17546;
17547; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_acq_rel:
17548; RV64IA-TSO-NOZACAS:       # %bb.0:
17549; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
17550; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
17551; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
17552; RV64IA-TSO-NOZACAS-NEXT:    slli a1, a1, 48
17553; RV64IA-TSO-NOZACAS-NEXT:    li a4, 48
17554; RV64IA-TSO-NOZACAS-NEXT:    andi a5, a0, 24
17555; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
17556; RV64IA-TSO-NOZACAS-NEXT:    srai a1, a1, 48
17557; RV64IA-TSO-NOZACAS-NEXT:    sllw a3, a3, a0
17558; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
17559; RV64IA-TSO-NOZACAS-NEXT:    sub a4, a4, a5
17560; RV64IA-TSO-NOZACAS-NEXT:  .LBB118_1: # =>This Inner Loop Header: Depth=1
17561; RV64IA-TSO-NOZACAS-NEXT:    lr.w a5, (a2)
17562; RV64IA-TSO-NOZACAS-NEXT:    and a7, a5, a3
17563; RV64IA-TSO-NOZACAS-NEXT:    mv a6, a5
17564; RV64IA-TSO-NOZACAS-NEXT:    sll a7, a7, a4
17565; RV64IA-TSO-NOZACAS-NEXT:    sra a7, a7, a4
17566; RV64IA-TSO-NOZACAS-NEXT:    bge a1, a7, .LBB118_3
17567; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB118_1 Depth=1
17568; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a1
17569; RV64IA-TSO-NOZACAS-NEXT:    and a6, a6, a3
17570; RV64IA-TSO-NOZACAS-NEXT:    xor a6, a5, a6
17571; RV64IA-TSO-NOZACAS-NEXT:  .LBB118_3: # in Loop: Header=BB118_1 Depth=1
17572; RV64IA-TSO-NOZACAS-NEXT:    sc.w a6, a6, (a2)
17573; RV64IA-TSO-NOZACAS-NEXT:    bnez a6, .LBB118_1
17574; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
17575; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a5, a0
17576; RV64IA-TSO-NOZACAS-NEXT:    ret
17577;
17578; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_acq_rel:
17579; RV64IA-WMO-ZACAS:       # %bb.0:
17580; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
17581; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
17582; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
17583; RV64IA-WMO-ZACAS-NEXT:    slli a1, a1, 48
17584; RV64IA-WMO-ZACAS-NEXT:    li a4, 48
17585; RV64IA-WMO-ZACAS-NEXT:    andi a5, a0, 24
17586; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
17587; RV64IA-WMO-ZACAS-NEXT:    srai a1, a1, 48
17588; RV64IA-WMO-ZACAS-NEXT:    sllw a3, a3, a0
17589; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
17590; RV64IA-WMO-ZACAS-NEXT:    sub a4, a4, a5
17591; RV64IA-WMO-ZACAS-NEXT:  .LBB118_1: # =>This Inner Loop Header: Depth=1
17592; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a5, (a2)
17593; RV64IA-WMO-ZACAS-NEXT:    and a7, a5, a3
17594; RV64IA-WMO-ZACAS-NEXT:    mv a6, a5
17595; RV64IA-WMO-ZACAS-NEXT:    sll a7, a7, a4
17596; RV64IA-WMO-ZACAS-NEXT:    sra a7, a7, a4
17597; RV64IA-WMO-ZACAS-NEXT:    bge a1, a7, .LBB118_3
17598; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB118_1 Depth=1
17599; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a1
17600; RV64IA-WMO-ZACAS-NEXT:    and a6, a6, a3
17601; RV64IA-WMO-ZACAS-NEXT:    xor a6, a5, a6
17602; RV64IA-WMO-ZACAS-NEXT:  .LBB118_3: # in Loop: Header=BB118_1 Depth=1
17603; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
17604; RV64IA-WMO-ZACAS-NEXT:    bnez a6, .LBB118_1
17605; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
17606; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a5, a0
17607; RV64IA-WMO-ZACAS-NEXT:    ret
17608;
17609; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_acq_rel:
17610; RV64IA-TSO-ZACAS:       # %bb.0:
17611; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
17612; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
17613; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
17614; RV64IA-TSO-ZACAS-NEXT:    slli a1, a1, 48
17615; RV64IA-TSO-ZACAS-NEXT:    li a4, 48
17616; RV64IA-TSO-ZACAS-NEXT:    andi a5, a0, 24
17617; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
17618; RV64IA-TSO-ZACAS-NEXT:    srai a1, a1, 48
17619; RV64IA-TSO-ZACAS-NEXT:    sllw a3, a3, a0
17620; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
17621; RV64IA-TSO-ZACAS-NEXT:    sub a4, a4, a5
17622; RV64IA-TSO-ZACAS-NEXT:  .LBB118_1: # =>This Inner Loop Header: Depth=1
17623; RV64IA-TSO-ZACAS-NEXT:    lr.w a5, (a2)
17624; RV64IA-TSO-ZACAS-NEXT:    and a7, a5, a3
17625; RV64IA-TSO-ZACAS-NEXT:    mv a6, a5
17626; RV64IA-TSO-ZACAS-NEXT:    sll a7, a7, a4
17627; RV64IA-TSO-ZACAS-NEXT:    sra a7, a7, a4
17628; RV64IA-TSO-ZACAS-NEXT:    bge a1, a7, .LBB118_3
17629; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB118_1 Depth=1
17630; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a1
17631; RV64IA-TSO-ZACAS-NEXT:    and a6, a6, a3
17632; RV64IA-TSO-ZACAS-NEXT:    xor a6, a5, a6
17633; RV64IA-TSO-ZACAS-NEXT:  .LBB118_3: # in Loop: Header=BB118_1 Depth=1
17634; RV64IA-TSO-ZACAS-NEXT:    sc.w a6, a6, (a2)
17635; RV64IA-TSO-ZACAS-NEXT:    bnez a6, .LBB118_1
17636; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
17637; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a5, a0
17638; RV64IA-TSO-ZACAS-NEXT:    ret
17639;
17640; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_acq_rel:
17641; RV64IA-WMO-ZABHA:       # %bb.0:
17642; RV64IA-WMO-ZABHA-NEXT:    amomin.h.aqrl a0, a1, (a0)
17643; RV64IA-WMO-ZABHA-NEXT:    ret
17644;
17645; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_acq_rel:
17646; RV64IA-TSO-ZABHA:       # %bb.0:
17647; RV64IA-TSO-ZABHA-NEXT:    amomin.h a0, a1, (a0)
17648; RV64IA-TSO-ZABHA-NEXT:    ret
17649  %1 = atomicrmw min ptr %a, i16 %b acq_rel
17650  ret i16 %1
17651}
17652
17653define i16 @atomicrmw_min_i16_seq_cst(ptr %a, i16 %b) nounwind {
17654; RV32I-LABEL: atomicrmw_min_i16_seq_cst:
17655; RV32I:       # %bb.0:
17656; RV32I-NEXT:    addi sp, sp, -32
17657; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17658; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17659; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17660; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17661; RV32I-NEXT:    mv s0, a0
17662; RV32I-NEXT:    lhu a3, 0(a0)
17663; RV32I-NEXT:    mv s1, a1
17664; RV32I-NEXT:    slli a0, a1, 16
17665; RV32I-NEXT:    srai s2, a0, 16
17666; RV32I-NEXT:    j .LBB119_2
17667; RV32I-NEXT:  .LBB119_1: # %atomicrmw.start
17668; RV32I-NEXT:    # in Loop: Header=BB119_2 Depth=1
17669; RV32I-NEXT:    sh a3, 14(sp)
17670; RV32I-NEXT:    addi a1, sp, 14
17671; RV32I-NEXT:    li a3, 5
17672; RV32I-NEXT:    li a4, 5
17673; RV32I-NEXT:    mv a0, s0
17674; RV32I-NEXT:    call __atomic_compare_exchange_2
17675; RV32I-NEXT:    lh a3, 14(sp)
17676; RV32I-NEXT:    bnez a0, .LBB119_4
17677; RV32I-NEXT:  .LBB119_2: # %atomicrmw.start
17678; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17679; RV32I-NEXT:    slli a0, a3, 16
17680; RV32I-NEXT:    srai a0, a0, 16
17681; RV32I-NEXT:    mv a2, a3
17682; RV32I-NEXT:    bge s2, a0, .LBB119_1
17683; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17684; RV32I-NEXT:    # in Loop: Header=BB119_2 Depth=1
17685; RV32I-NEXT:    mv a2, s1
17686; RV32I-NEXT:    j .LBB119_1
17687; RV32I-NEXT:  .LBB119_4: # %atomicrmw.end
17688; RV32I-NEXT:    mv a0, a3
17689; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17690; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17691; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17692; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17693; RV32I-NEXT:    addi sp, sp, 32
17694; RV32I-NEXT:    ret
17695;
17696; RV32IA-LABEL: atomicrmw_min_i16_seq_cst:
17697; RV32IA:       # %bb.0:
17698; RV32IA-NEXT:    andi a2, a0, -4
17699; RV32IA-NEXT:    slli a0, a0, 3
17700; RV32IA-NEXT:    lui a3, 16
17701; RV32IA-NEXT:    slli a1, a1, 16
17702; RV32IA-NEXT:    li a4, 16
17703; RV32IA-NEXT:    andi a5, a0, 24
17704; RV32IA-NEXT:    addi a3, a3, -1
17705; RV32IA-NEXT:    srai a1, a1, 16
17706; RV32IA-NEXT:    sll a3, a3, a0
17707; RV32IA-NEXT:    sll a1, a1, a0
17708; RV32IA-NEXT:    sub a4, a4, a5
17709; RV32IA-NEXT:  .LBB119_1: # =>This Inner Loop Header: Depth=1
17710; RV32IA-NEXT:    lr.w.aqrl a5, (a2)
17711; RV32IA-NEXT:    and a7, a5, a3
17712; RV32IA-NEXT:    mv a6, a5
17713; RV32IA-NEXT:    sll a7, a7, a4
17714; RV32IA-NEXT:    sra a7, a7, a4
17715; RV32IA-NEXT:    bge a1, a7, .LBB119_3
17716; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB119_1 Depth=1
17717; RV32IA-NEXT:    xor a6, a5, a1
17718; RV32IA-NEXT:    and a6, a6, a3
17719; RV32IA-NEXT:    xor a6, a5, a6
17720; RV32IA-NEXT:  .LBB119_3: # in Loop: Header=BB119_1 Depth=1
17721; RV32IA-NEXT:    sc.w.rl a6, a6, (a2)
17722; RV32IA-NEXT:    bnez a6, .LBB119_1
17723; RV32IA-NEXT:  # %bb.4:
17724; RV32IA-NEXT:    srl a0, a5, a0
17725; RV32IA-NEXT:    ret
17726;
17727; RV64I-LABEL: atomicrmw_min_i16_seq_cst:
17728; RV64I:       # %bb.0:
17729; RV64I-NEXT:    addi sp, sp, -48
17730; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
17731; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
17732; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
17733; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
17734; RV64I-NEXT:    mv s0, a0
17735; RV64I-NEXT:    lhu a3, 0(a0)
17736; RV64I-NEXT:    mv s1, a1
17737; RV64I-NEXT:    slli a0, a1, 48
17738; RV64I-NEXT:    srai s2, a0, 48
17739; RV64I-NEXT:    j .LBB119_2
17740; RV64I-NEXT:  .LBB119_1: # %atomicrmw.start
17741; RV64I-NEXT:    # in Loop: Header=BB119_2 Depth=1
17742; RV64I-NEXT:    sh a3, 14(sp)
17743; RV64I-NEXT:    addi a1, sp, 14
17744; RV64I-NEXT:    li a3, 5
17745; RV64I-NEXT:    li a4, 5
17746; RV64I-NEXT:    mv a0, s0
17747; RV64I-NEXT:    call __atomic_compare_exchange_2
17748; RV64I-NEXT:    lh a3, 14(sp)
17749; RV64I-NEXT:    bnez a0, .LBB119_4
17750; RV64I-NEXT:  .LBB119_2: # %atomicrmw.start
17751; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17752; RV64I-NEXT:    slli a0, a3, 48
17753; RV64I-NEXT:    srai a0, a0, 48
17754; RV64I-NEXT:    mv a2, a3
17755; RV64I-NEXT:    bge s2, a0, .LBB119_1
17756; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17757; RV64I-NEXT:    # in Loop: Header=BB119_2 Depth=1
17758; RV64I-NEXT:    mv a2, s1
17759; RV64I-NEXT:    j .LBB119_1
17760; RV64I-NEXT:  .LBB119_4: # %atomicrmw.end
17761; RV64I-NEXT:    mv a0, a3
17762; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
17763; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
17764; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
17765; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
17766; RV64I-NEXT:    addi sp, sp, 48
17767; RV64I-NEXT:    ret
17768;
17769; RV64IA-NOZACAS-LABEL: atomicrmw_min_i16_seq_cst:
17770; RV64IA-NOZACAS:       # %bb.0:
17771; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
17772; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
17773; RV64IA-NOZACAS-NEXT:    lui a3, 16
17774; RV64IA-NOZACAS-NEXT:    slli a1, a1, 48
17775; RV64IA-NOZACAS-NEXT:    li a4, 48
17776; RV64IA-NOZACAS-NEXT:    andi a5, a0, 24
17777; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
17778; RV64IA-NOZACAS-NEXT:    srai a1, a1, 48
17779; RV64IA-NOZACAS-NEXT:    sllw a3, a3, a0
17780; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
17781; RV64IA-NOZACAS-NEXT:    sub a4, a4, a5
17782; RV64IA-NOZACAS-NEXT:  .LBB119_1: # =>This Inner Loop Header: Depth=1
17783; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a5, (a2)
17784; RV64IA-NOZACAS-NEXT:    and a7, a5, a3
17785; RV64IA-NOZACAS-NEXT:    mv a6, a5
17786; RV64IA-NOZACAS-NEXT:    sll a7, a7, a4
17787; RV64IA-NOZACAS-NEXT:    sra a7, a7, a4
17788; RV64IA-NOZACAS-NEXT:    bge a1, a7, .LBB119_3
17789; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB119_1 Depth=1
17790; RV64IA-NOZACAS-NEXT:    xor a6, a5, a1
17791; RV64IA-NOZACAS-NEXT:    and a6, a6, a3
17792; RV64IA-NOZACAS-NEXT:    xor a6, a5, a6
17793; RV64IA-NOZACAS-NEXT:  .LBB119_3: # in Loop: Header=BB119_1 Depth=1
17794; RV64IA-NOZACAS-NEXT:    sc.w.rl a6, a6, (a2)
17795; RV64IA-NOZACAS-NEXT:    bnez a6, .LBB119_1
17796; RV64IA-NOZACAS-NEXT:  # %bb.4:
17797; RV64IA-NOZACAS-NEXT:    srlw a0, a5, a0
17798; RV64IA-NOZACAS-NEXT:    ret
17799;
17800; RV64IA-ZACAS-LABEL: atomicrmw_min_i16_seq_cst:
17801; RV64IA-ZACAS:       # %bb.0:
17802; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
17803; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
17804; RV64IA-ZACAS-NEXT:    lui a3, 16
17805; RV64IA-ZACAS-NEXT:    slli a1, a1, 48
17806; RV64IA-ZACAS-NEXT:    li a4, 48
17807; RV64IA-ZACAS-NEXT:    andi a5, a0, 24
17808; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
17809; RV64IA-ZACAS-NEXT:    srai a1, a1, 48
17810; RV64IA-ZACAS-NEXT:    sllw a3, a3, a0
17811; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
17812; RV64IA-ZACAS-NEXT:    sub a4, a4, a5
17813; RV64IA-ZACAS-NEXT:  .LBB119_1: # =>This Inner Loop Header: Depth=1
17814; RV64IA-ZACAS-NEXT:    lr.w.aqrl a5, (a2)
17815; RV64IA-ZACAS-NEXT:    and a7, a5, a3
17816; RV64IA-ZACAS-NEXT:    mv a6, a5
17817; RV64IA-ZACAS-NEXT:    sll a7, a7, a4
17818; RV64IA-ZACAS-NEXT:    sra a7, a7, a4
17819; RV64IA-ZACAS-NEXT:    bge a1, a7, .LBB119_3
17820; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB119_1 Depth=1
17821; RV64IA-ZACAS-NEXT:    xor a6, a5, a1
17822; RV64IA-ZACAS-NEXT:    and a6, a6, a3
17823; RV64IA-ZACAS-NEXT:    xor a6, a5, a6
17824; RV64IA-ZACAS-NEXT:  .LBB119_3: # in Loop: Header=BB119_1 Depth=1
17825; RV64IA-ZACAS-NEXT:    sc.w.rl a6, a6, (a2)
17826; RV64IA-ZACAS-NEXT:    bnez a6, .LBB119_1
17827; RV64IA-ZACAS-NEXT:  # %bb.4:
17828; RV64IA-ZACAS-NEXT:    srlw a0, a5, a0
17829; RV64IA-ZACAS-NEXT:    ret
17830;
17831; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_seq_cst:
17832; RV64IA-WMO-ZABHA:       # %bb.0:
17833; RV64IA-WMO-ZABHA-NEXT:    amomin.h.aqrl a0, a1, (a0)
17834; RV64IA-WMO-ZABHA-NEXT:    ret
17835;
17836; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_seq_cst:
17837; RV64IA-TSO-ZABHA:       # %bb.0:
17838; RV64IA-TSO-ZABHA-NEXT:    amomin.h a0, a1, (a0)
17839; RV64IA-TSO-ZABHA-NEXT:    ret
17840  %1 = atomicrmw min ptr %a, i16 %b seq_cst
17841  ret i16 %1
17842}
17843
17844define i16 @atomicrmw_umax_i16_monotonic(ptr %a, i16 %b) nounwind {
17845; RV32I-LABEL: atomicrmw_umax_i16_monotonic:
17846; RV32I:       # %bb.0:
17847; RV32I-NEXT:    addi sp, sp, -32
17848; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17849; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
17850; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
17851; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
17852; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
17853; RV32I-NEXT:    mv s0, a1
17854; RV32I-NEXT:    mv s1, a0
17855; RV32I-NEXT:    lhu a1, 0(a0)
17856; RV32I-NEXT:    lui s2, 16
17857; RV32I-NEXT:    addi s2, s2, -1
17858; RV32I-NEXT:    and s3, s0, s2
17859; RV32I-NEXT:    j .LBB120_2
17860; RV32I-NEXT:  .LBB120_1: # %atomicrmw.start
17861; RV32I-NEXT:    # in Loop: Header=BB120_2 Depth=1
17862; RV32I-NEXT:    sh a1, 10(sp)
17863; RV32I-NEXT:    addi a1, sp, 10
17864; RV32I-NEXT:    mv a0, s1
17865; RV32I-NEXT:    li a3, 0
17866; RV32I-NEXT:    li a4, 0
17867; RV32I-NEXT:    call __atomic_compare_exchange_2
17868; RV32I-NEXT:    lh a1, 10(sp)
17869; RV32I-NEXT:    bnez a0, .LBB120_4
17870; RV32I-NEXT:  .LBB120_2: # %atomicrmw.start
17871; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
17872; RV32I-NEXT:    and a0, a1, s2
17873; RV32I-NEXT:    mv a2, a1
17874; RV32I-NEXT:    bltu s3, a0, .LBB120_1
17875; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
17876; RV32I-NEXT:    # in Loop: Header=BB120_2 Depth=1
17877; RV32I-NEXT:    mv a2, s0
17878; RV32I-NEXT:    j .LBB120_1
17879; RV32I-NEXT:  .LBB120_4: # %atomicrmw.end
17880; RV32I-NEXT:    mv a0, a1
17881; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
17882; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
17883; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
17884; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
17885; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
17886; RV32I-NEXT:    addi sp, sp, 32
17887; RV32I-NEXT:    ret
17888;
17889; RV32IA-LABEL: atomicrmw_umax_i16_monotonic:
17890; RV32IA:       # %bb.0:
17891; RV32IA-NEXT:    andi a2, a0, -4
17892; RV32IA-NEXT:    slli a0, a0, 3
17893; RV32IA-NEXT:    lui a3, 16
17894; RV32IA-NEXT:    addi a3, a3, -1
17895; RV32IA-NEXT:    sll a4, a3, a0
17896; RV32IA-NEXT:    and a1, a1, a3
17897; RV32IA-NEXT:    sll a1, a1, a0
17898; RV32IA-NEXT:  .LBB120_1: # =>This Inner Loop Header: Depth=1
17899; RV32IA-NEXT:    lr.w a3, (a2)
17900; RV32IA-NEXT:    and a6, a3, a4
17901; RV32IA-NEXT:    mv a5, a3
17902; RV32IA-NEXT:    bgeu a6, a1, .LBB120_3
17903; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB120_1 Depth=1
17904; RV32IA-NEXT:    xor a5, a3, a1
17905; RV32IA-NEXT:    and a5, a5, a4
17906; RV32IA-NEXT:    xor a5, a3, a5
17907; RV32IA-NEXT:  .LBB120_3: # in Loop: Header=BB120_1 Depth=1
17908; RV32IA-NEXT:    sc.w a5, a5, (a2)
17909; RV32IA-NEXT:    bnez a5, .LBB120_1
17910; RV32IA-NEXT:  # %bb.4:
17911; RV32IA-NEXT:    srl a0, a3, a0
17912; RV32IA-NEXT:    ret
17913;
17914; RV64I-LABEL: atomicrmw_umax_i16_monotonic:
17915; RV64I:       # %bb.0:
17916; RV64I-NEXT:    addi sp, sp, -48
17917; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
17918; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
17919; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
17920; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
17921; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
17922; RV64I-NEXT:    mv s0, a1
17923; RV64I-NEXT:    mv s1, a0
17924; RV64I-NEXT:    lhu a1, 0(a0)
17925; RV64I-NEXT:    lui s2, 16
17926; RV64I-NEXT:    addiw s2, s2, -1
17927; RV64I-NEXT:    and s3, s0, s2
17928; RV64I-NEXT:    j .LBB120_2
17929; RV64I-NEXT:  .LBB120_1: # %atomicrmw.start
17930; RV64I-NEXT:    # in Loop: Header=BB120_2 Depth=1
17931; RV64I-NEXT:    sh a1, 6(sp)
17932; RV64I-NEXT:    addi a1, sp, 6
17933; RV64I-NEXT:    mv a0, s1
17934; RV64I-NEXT:    li a3, 0
17935; RV64I-NEXT:    li a4, 0
17936; RV64I-NEXT:    call __atomic_compare_exchange_2
17937; RV64I-NEXT:    lh a1, 6(sp)
17938; RV64I-NEXT:    bnez a0, .LBB120_4
17939; RV64I-NEXT:  .LBB120_2: # %atomicrmw.start
17940; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
17941; RV64I-NEXT:    and a0, a1, s2
17942; RV64I-NEXT:    mv a2, a1
17943; RV64I-NEXT:    bltu s3, a0, .LBB120_1
17944; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
17945; RV64I-NEXT:    # in Loop: Header=BB120_2 Depth=1
17946; RV64I-NEXT:    mv a2, s0
17947; RV64I-NEXT:    j .LBB120_1
17948; RV64I-NEXT:  .LBB120_4: # %atomicrmw.end
17949; RV64I-NEXT:    mv a0, a1
17950; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
17951; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
17952; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
17953; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
17954; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
17955; RV64I-NEXT:    addi sp, sp, 48
17956; RV64I-NEXT:    ret
17957;
17958; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i16_monotonic:
17959; RV64IA-NOZACAS:       # %bb.0:
17960; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
17961; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
17962; RV64IA-NOZACAS-NEXT:    lui a3, 16
17963; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
17964; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
17965; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
17966; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
17967; RV64IA-NOZACAS-NEXT:  .LBB120_1: # =>This Inner Loop Header: Depth=1
17968; RV64IA-NOZACAS-NEXT:    lr.w a3, (a2)
17969; RV64IA-NOZACAS-NEXT:    and a6, a3, a4
17970; RV64IA-NOZACAS-NEXT:    mv a5, a3
17971; RV64IA-NOZACAS-NEXT:    bgeu a6, a1, .LBB120_3
17972; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB120_1 Depth=1
17973; RV64IA-NOZACAS-NEXT:    xor a5, a3, a1
17974; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
17975; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
17976; RV64IA-NOZACAS-NEXT:  .LBB120_3: # in Loop: Header=BB120_1 Depth=1
17977; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
17978; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB120_1
17979; RV64IA-NOZACAS-NEXT:  # %bb.4:
17980; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
17981; RV64IA-NOZACAS-NEXT:    ret
17982;
17983; RV64IA-ZACAS-LABEL: atomicrmw_umax_i16_monotonic:
17984; RV64IA-ZACAS:       # %bb.0:
17985; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
17986; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
17987; RV64IA-ZACAS-NEXT:    lui a3, 16
17988; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
17989; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
17990; RV64IA-ZACAS-NEXT:    and a1, a1, a3
17991; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
17992; RV64IA-ZACAS-NEXT:  .LBB120_1: # =>This Inner Loop Header: Depth=1
17993; RV64IA-ZACAS-NEXT:    lr.w a3, (a2)
17994; RV64IA-ZACAS-NEXT:    and a6, a3, a4
17995; RV64IA-ZACAS-NEXT:    mv a5, a3
17996; RV64IA-ZACAS-NEXT:    bgeu a6, a1, .LBB120_3
17997; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB120_1 Depth=1
17998; RV64IA-ZACAS-NEXT:    xor a5, a3, a1
17999; RV64IA-ZACAS-NEXT:    and a5, a5, a4
18000; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
18001; RV64IA-ZACAS-NEXT:  .LBB120_3: # in Loop: Header=BB120_1 Depth=1
18002; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
18003; RV64IA-ZACAS-NEXT:    bnez a5, .LBB120_1
18004; RV64IA-ZACAS-NEXT:  # %bb.4:
18005; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
18006; RV64IA-ZACAS-NEXT:    ret
18007;
18008; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_monotonic:
18009; RV64IA-WMO-ZABHA:       # %bb.0:
18010; RV64IA-WMO-ZABHA-NEXT:    amomaxu.h a0, a1, (a0)
18011; RV64IA-WMO-ZABHA-NEXT:    ret
18012;
18013; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_monotonic:
18014; RV64IA-TSO-ZABHA:       # %bb.0:
18015; RV64IA-TSO-ZABHA-NEXT:    amomaxu.h a0, a1, (a0)
18016; RV64IA-TSO-ZABHA-NEXT:    ret
18017  %1 = atomicrmw umax ptr %a, i16 %b monotonic
18018  ret i16 %1
18019}
18020
18021define i16 @atomicrmw_umax_i16_acquire(ptr %a, i16 %b) nounwind {
18022; RV32I-LABEL: atomicrmw_umax_i16_acquire:
18023; RV32I:       # %bb.0:
18024; RV32I-NEXT:    addi sp, sp, -32
18025; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
18026; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
18027; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
18028; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
18029; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
18030; RV32I-NEXT:    mv s0, a1
18031; RV32I-NEXT:    mv s1, a0
18032; RV32I-NEXT:    lhu a1, 0(a0)
18033; RV32I-NEXT:    lui s2, 16
18034; RV32I-NEXT:    addi s2, s2, -1
18035; RV32I-NEXT:    and s3, s0, s2
18036; RV32I-NEXT:    j .LBB121_2
18037; RV32I-NEXT:  .LBB121_1: # %atomicrmw.start
18038; RV32I-NEXT:    # in Loop: Header=BB121_2 Depth=1
18039; RV32I-NEXT:    sh a1, 10(sp)
18040; RV32I-NEXT:    addi a1, sp, 10
18041; RV32I-NEXT:    li a3, 2
18042; RV32I-NEXT:    li a4, 2
18043; RV32I-NEXT:    mv a0, s1
18044; RV32I-NEXT:    call __atomic_compare_exchange_2
18045; RV32I-NEXT:    lh a1, 10(sp)
18046; RV32I-NEXT:    bnez a0, .LBB121_4
18047; RV32I-NEXT:  .LBB121_2: # %atomicrmw.start
18048; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
18049; RV32I-NEXT:    and a0, a1, s2
18050; RV32I-NEXT:    mv a2, a1
18051; RV32I-NEXT:    bltu s3, a0, .LBB121_1
18052; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
18053; RV32I-NEXT:    # in Loop: Header=BB121_2 Depth=1
18054; RV32I-NEXT:    mv a2, s0
18055; RV32I-NEXT:    j .LBB121_1
18056; RV32I-NEXT:  .LBB121_4: # %atomicrmw.end
18057; RV32I-NEXT:    mv a0, a1
18058; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
18059; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
18060; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
18061; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
18062; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
18063; RV32I-NEXT:    addi sp, sp, 32
18064; RV32I-NEXT:    ret
18065;
18066; RV32IA-WMO-LABEL: atomicrmw_umax_i16_acquire:
18067; RV32IA-WMO:       # %bb.0:
18068; RV32IA-WMO-NEXT:    andi a2, a0, -4
18069; RV32IA-WMO-NEXT:    slli a0, a0, 3
18070; RV32IA-WMO-NEXT:    lui a3, 16
18071; RV32IA-WMO-NEXT:    addi a3, a3, -1
18072; RV32IA-WMO-NEXT:    sll a4, a3, a0
18073; RV32IA-WMO-NEXT:    and a1, a1, a3
18074; RV32IA-WMO-NEXT:    sll a1, a1, a0
18075; RV32IA-WMO-NEXT:  .LBB121_1: # =>This Inner Loop Header: Depth=1
18076; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
18077; RV32IA-WMO-NEXT:    and a6, a3, a4
18078; RV32IA-WMO-NEXT:    mv a5, a3
18079; RV32IA-WMO-NEXT:    bgeu a6, a1, .LBB121_3
18080; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB121_1 Depth=1
18081; RV32IA-WMO-NEXT:    xor a5, a3, a1
18082; RV32IA-WMO-NEXT:    and a5, a5, a4
18083; RV32IA-WMO-NEXT:    xor a5, a3, a5
18084; RV32IA-WMO-NEXT:  .LBB121_3: # in Loop: Header=BB121_1 Depth=1
18085; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
18086; RV32IA-WMO-NEXT:    bnez a5, .LBB121_1
18087; RV32IA-WMO-NEXT:  # %bb.4:
18088; RV32IA-WMO-NEXT:    srl a0, a3, a0
18089; RV32IA-WMO-NEXT:    ret
18090;
18091; RV32IA-TSO-LABEL: atomicrmw_umax_i16_acquire:
18092; RV32IA-TSO:       # %bb.0:
18093; RV32IA-TSO-NEXT:    andi a2, a0, -4
18094; RV32IA-TSO-NEXT:    slli a0, a0, 3
18095; RV32IA-TSO-NEXT:    lui a3, 16
18096; RV32IA-TSO-NEXT:    addi a3, a3, -1
18097; RV32IA-TSO-NEXT:    sll a4, a3, a0
18098; RV32IA-TSO-NEXT:    and a1, a1, a3
18099; RV32IA-TSO-NEXT:    sll a1, a1, a0
18100; RV32IA-TSO-NEXT:  .LBB121_1: # =>This Inner Loop Header: Depth=1
18101; RV32IA-TSO-NEXT:    lr.w a3, (a2)
18102; RV32IA-TSO-NEXT:    and a6, a3, a4
18103; RV32IA-TSO-NEXT:    mv a5, a3
18104; RV32IA-TSO-NEXT:    bgeu a6, a1, .LBB121_3
18105; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB121_1 Depth=1
18106; RV32IA-TSO-NEXT:    xor a5, a3, a1
18107; RV32IA-TSO-NEXT:    and a5, a5, a4
18108; RV32IA-TSO-NEXT:    xor a5, a3, a5
18109; RV32IA-TSO-NEXT:  .LBB121_3: # in Loop: Header=BB121_1 Depth=1
18110; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
18111; RV32IA-TSO-NEXT:    bnez a5, .LBB121_1
18112; RV32IA-TSO-NEXT:  # %bb.4:
18113; RV32IA-TSO-NEXT:    srl a0, a3, a0
18114; RV32IA-TSO-NEXT:    ret
18115;
18116; RV64I-LABEL: atomicrmw_umax_i16_acquire:
18117; RV64I:       # %bb.0:
18118; RV64I-NEXT:    addi sp, sp, -48
18119; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
18120; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
18121; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
18122; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
18123; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
18124; RV64I-NEXT:    mv s0, a1
18125; RV64I-NEXT:    mv s1, a0
18126; RV64I-NEXT:    lhu a1, 0(a0)
18127; RV64I-NEXT:    lui s2, 16
18128; RV64I-NEXT:    addiw s2, s2, -1
18129; RV64I-NEXT:    and s3, s0, s2
18130; RV64I-NEXT:    j .LBB121_2
18131; RV64I-NEXT:  .LBB121_1: # %atomicrmw.start
18132; RV64I-NEXT:    # in Loop: Header=BB121_2 Depth=1
18133; RV64I-NEXT:    sh a1, 6(sp)
18134; RV64I-NEXT:    addi a1, sp, 6
18135; RV64I-NEXT:    li a3, 2
18136; RV64I-NEXT:    li a4, 2
18137; RV64I-NEXT:    mv a0, s1
18138; RV64I-NEXT:    call __atomic_compare_exchange_2
18139; RV64I-NEXT:    lh a1, 6(sp)
18140; RV64I-NEXT:    bnez a0, .LBB121_4
18141; RV64I-NEXT:  .LBB121_2: # %atomicrmw.start
18142; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
18143; RV64I-NEXT:    and a0, a1, s2
18144; RV64I-NEXT:    mv a2, a1
18145; RV64I-NEXT:    bltu s3, a0, .LBB121_1
18146; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
18147; RV64I-NEXT:    # in Loop: Header=BB121_2 Depth=1
18148; RV64I-NEXT:    mv a2, s0
18149; RV64I-NEXT:    j .LBB121_1
18150; RV64I-NEXT:  .LBB121_4: # %atomicrmw.end
18151; RV64I-NEXT:    mv a0, a1
18152; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
18153; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
18154; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
18155; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
18156; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
18157; RV64I-NEXT:    addi sp, sp, 48
18158; RV64I-NEXT:    ret
18159;
18160; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_acquire:
18161; RV64IA-WMO-NOZACAS:       # %bb.0:
18162; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
18163; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
18164; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
18165; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
18166; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
18167; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
18168; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
18169; RV64IA-WMO-NOZACAS-NEXT:  .LBB121_1: # =>This Inner Loop Header: Depth=1
18170; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
18171; RV64IA-WMO-NOZACAS-NEXT:    and a6, a3, a4
18172; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a3
18173; RV64IA-WMO-NOZACAS-NEXT:    bgeu a6, a1, .LBB121_3
18174; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB121_1 Depth=1
18175; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a1
18176; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
18177; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
18178; RV64IA-WMO-NOZACAS-NEXT:  .LBB121_3: # in Loop: Header=BB121_1 Depth=1
18179; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
18180; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB121_1
18181; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
18182; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
18183; RV64IA-WMO-NOZACAS-NEXT:    ret
18184;
18185; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_acquire:
18186; RV64IA-TSO-NOZACAS:       # %bb.0:
18187; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
18188; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
18189; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
18190; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
18191; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
18192; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
18193; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
18194; RV64IA-TSO-NOZACAS-NEXT:  .LBB121_1: # =>This Inner Loop Header: Depth=1
18195; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
18196; RV64IA-TSO-NOZACAS-NEXT:    and a6, a3, a4
18197; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a3
18198; RV64IA-TSO-NOZACAS-NEXT:    bgeu a6, a1, .LBB121_3
18199; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB121_1 Depth=1
18200; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a1
18201; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
18202; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
18203; RV64IA-TSO-NOZACAS-NEXT:  .LBB121_3: # in Loop: Header=BB121_1 Depth=1
18204; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
18205; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB121_1
18206; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
18207; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
18208; RV64IA-TSO-NOZACAS-NEXT:    ret
18209;
18210; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_acquire:
18211; RV64IA-WMO-ZACAS:       # %bb.0:
18212; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
18213; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
18214; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
18215; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
18216; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
18217; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
18218; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
18219; RV64IA-WMO-ZACAS-NEXT:  .LBB121_1: # =>This Inner Loop Header: Depth=1
18220; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
18221; RV64IA-WMO-ZACAS-NEXT:    and a6, a3, a4
18222; RV64IA-WMO-ZACAS-NEXT:    mv a5, a3
18223; RV64IA-WMO-ZACAS-NEXT:    bgeu a6, a1, .LBB121_3
18224; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB121_1 Depth=1
18225; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a1
18226; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
18227; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
18228; RV64IA-WMO-ZACAS-NEXT:  .LBB121_3: # in Loop: Header=BB121_1 Depth=1
18229; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
18230; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB121_1
18231; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
18232; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
18233; RV64IA-WMO-ZACAS-NEXT:    ret
18234;
18235; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_acquire:
18236; RV64IA-TSO-ZACAS:       # %bb.0:
18237; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
18238; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
18239; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
18240; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
18241; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
18242; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
18243; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
18244; RV64IA-TSO-ZACAS-NEXT:  .LBB121_1: # =>This Inner Loop Header: Depth=1
18245; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
18246; RV64IA-TSO-ZACAS-NEXT:    and a6, a3, a4
18247; RV64IA-TSO-ZACAS-NEXT:    mv a5, a3
18248; RV64IA-TSO-ZACAS-NEXT:    bgeu a6, a1, .LBB121_3
18249; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB121_1 Depth=1
18250; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a1
18251; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
18252; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
18253; RV64IA-TSO-ZACAS-NEXT:  .LBB121_3: # in Loop: Header=BB121_1 Depth=1
18254; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
18255; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB121_1
18256; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
18257; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
18258; RV64IA-TSO-ZACAS-NEXT:    ret
18259;
18260; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_acquire:
18261; RV64IA-WMO-ZABHA:       # %bb.0:
18262; RV64IA-WMO-ZABHA-NEXT:    amomaxu.h.aq a0, a1, (a0)
18263; RV64IA-WMO-ZABHA-NEXT:    ret
18264;
18265; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_acquire:
18266; RV64IA-TSO-ZABHA:       # %bb.0:
18267; RV64IA-TSO-ZABHA-NEXT:    amomaxu.h a0, a1, (a0)
18268; RV64IA-TSO-ZABHA-NEXT:    ret
18269  %1 = atomicrmw umax ptr %a, i16 %b acquire
18270  ret i16 %1
18271}
18272
18273define i16 @atomicrmw_umax_i16_release(ptr %a, i16 %b) nounwind {
18274; RV32I-LABEL: atomicrmw_umax_i16_release:
18275; RV32I:       # %bb.0:
18276; RV32I-NEXT:    addi sp, sp, -32
18277; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
18278; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
18279; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
18280; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
18281; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
18282; RV32I-NEXT:    mv s0, a1
18283; RV32I-NEXT:    mv s1, a0
18284; RV32I-NEXT:    lhu a1, 0(a0)
18285; RV32I-NEXT:    lui s2, 16
18286; RV32I-NEXT:    addi s2, s2, -1
18287; RV32I-NEXT:    and s3, s0, s2
18288; RV32I-NEXT:    j .LBB122_2
18289; RV32I-NEXT:  .LBB122_1: # %atomicrmw.start
18290; RV32I-NEXT:    # in Loop: Header=BB122_2 Depth=1
18291; RV32I-NEXT:    sh a1, 10(sp)
18292; RV32I-NEXT:    addi a1, sp, 10
18293; RV32I-NEXT:    li a3, 3
18294; RV32I-NEXT:    mv a0, s1
18295; RV32I-NEXT:    li a4, 0
18296; RV32I-NEXT:    call __atomic_compare_exchange_2
18297; RV32I-NEXT:    lh a1, 10(sp)
18298; RV32I-NEXT:    bnez a0, .LBB122_4
18299; RV32I-NEXT:  .LBB122_2: # %atomicrmw.start
18300; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
18301; RV32I-NEXT:    and a0, a1, s2
18302; RV32I-NEXT:    mv a2, a1
18303; RV32I-NEXT:    bltu s3, a0, .LBB122_1
18304; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
18305; RV32I-NEXT:    # in Loop: Header=BB122_2 Depth=1
18306; RV32I-NEXT:    mv a2, s0
18307; RV32I-NEXT:    j .LBB122_1
18308; RV32I-NEXT:  .LBB122_4: # %atomicrmw.end
18309; RV32I-NEXT:    mv a0, a1
18310; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
18311; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
18312; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
18313; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
18314; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
18315; RV32I-NEXT:    addi sp, sp, 32
18316; RV32I-NEXT:    ret
18317;
18318; RV32IA-WMO-LABEL: atomicrmw_umax_i16_release:
18319; RV32IA-WMO:       # %bb.0:
18320; RV32IA-WMO-NEXT:    andi a2, a0, -4
18321; RV32IA-WMO-NEXT:    slli a0, a0, 3
18322; RV32IA-WMO-NEXT:    lui a3, 16
18323; RV32IA-WMO-NEXT:    addi a3, a3, -1
18324; RV32IA-WMO-NEXT:    sll a4, a3, a0
18325; RV32IA-WMO-NEXT:    and a1, a1, a3
18326; RV32IA-WMO-NEXT:    sll a1, a1, a0
18327; RV32IA-WMO-NEXT:  .LBB122_1: # =>This Inner Loop Header: Depth=1
18328; RV32IA-WMO-NEXT:    lr.w a3, (a2)
18329; RV32IA-WMO-NEXT:    and a6, a3, a4
18330; RV32IA-WMO-NEXT:    mv a5, a3
18331; RV32IA-WMO-NEXT:    bgeu a6, a1, .LBB122_3
18332; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB122_1 Depth=1
18333; RV32IA-WMO-NEXT:    xor a5, a3, a1
18334; RV32IA-WMO-NEXT:    and a5, a5, a4
18335; RV32IA-WMO-NEXT:    xor a5, a3, a5
18336; RV32IA-WMO-NEXT:  .LBB122_3: # in Loop: Header=BB122_1 Depth=1
18337; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
18338; RV32IA-WMO-NEXT:    bnez a5, .LBB122_1
18339; RV32IA-WMO-NEXT:  # %bb.4:
18340; RV32IA-WMO-NEXT:    srl a0, a3, a0
18341; RV32IA-WMO-NEXT:    ret
18342;
18343; RV32IA-TSO-LABEL: atomicrmw_umax_i16_release:
18344; RV32IA-TSO:       # %bb.0:
18345; RV32IA-TSO-NEXT:    andi a2, a0, -4
18346; RV32IA-TSO-NEXT:    slli a0, a0, 3
18347; RV32IA-TSO-NEXT:    lui a3, 16
18348; RV32IA-TSO-NEXT:    addi a3, a3, -1
18349; RV32IA-TSO-NEXT:    sll a4, a3, a0
18350; RV32IA-TSO-NEXT:    and a1, a1, a3
18351; RV32IA-TSO-NEXT:    sll a1, a1, a0
18352; RV32IA-TSO-NEXT:  .LBB122_1: # =>This Inner Loop Header: Depth=1
18353; RV32IA-TSO-NEXT:    lr.w a3, (a2)
18354; RV32IA-TSO-NEXT:    and a6, a3, a4
18355; RV32IA-TSO-NEXT:    mv a5, a3
18356; RV32IA-TSO-NEXT:    bgeu a6, a1, .LBB122_3
18357; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB122_1 Depth=1
18358; RV32IA-TSO-NEXT:    xor a5, a3, a1
18359; RV32IA-TSO-NEXT:    and a5, a5, a4
18360; RV32IA-TSO-NEXT:    xor a5, a3, a5
18361; RV32IA-TSO-NEXT:  .LBB122_3: # in Loop: Header=BB122_1 Depth=1
18362; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
18363; RV32IA-TSO-NEXT:    bnez a5, .LBB122_1
18364; RV32IA-TSO-NEXT:  # %bb.4:
18365; RV32IA-TSO-NEXT:    srl a0, a3, a0
18366; RV32IA-TSO-NEXT:    ret
18367;
18368; RV64I-LABEL: atomicrmw_umax_i16_release:
18369; RV64I:       # %bb.0:
18370; RV64I-NEXT:    addi sp, sp, -48
18371; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
18372; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
18373; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
18374; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
18375; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
18376; RV64I-NEXT:    mv s0, a1
18377; RV64I-NEXT:    mv s1, a0
18378; RV64I-NEXT:    lhu a1, 0(a0)
18379; RV64I-NEXT:    lui s2, 16
18380; RV64I-NEXT:    addiw s2, s2, -1
18381; RV64I-NEXT:    and s3, s0, s2
18382; RV64I-NEXT:    j .LBB122_2
18383; RV64I-NEXT:  .LBB122_1: # %atomicrmw.start
18384; RV64I-NEXT:    # in Loop: Header=BB122_2 Depth=1
18385; RV64I-NEXT:    sh a1, 6(sp)
18386; RV64I-NEXT:    addi a1, sp, 6
18387; RV64I-NEXT:    li a3, 3
18388; RV64I-NEXT:    mv a0, s1
18389; RV64I-NEXT:    li a4, 0
18390; RV64I-NEXT:    call __atomic_compare_exchange_2
18391; RV64I-NEXT:    lh a1, 6(sp)
18392; RV64I-NEXT:    bnez a0, .LBB122_4
18393; RV64I-NEXT:  .LBB122_2: # %atomicrmw.start
18394; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
18395; RV64I-NEXT:    and a0, a1, s2
18396; RV64I-NEXT:    mv a2, a1
18397; RV64I-NEXT:    bltu s3, a0, .LBB122_1
18398; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
18399; RV64I-NEXT:    # in Loop: Header=BB122_2 Depth=1
18400; RV64I-NEXT:    mv a2, s0
18401; RV64I-NEXT:    j .LBB122_1
18402; RV64I-NEXT:  .LBB122_4: # %atomicrmw.end
18403; RV64I-NEXT:    mv a0, a1
18404; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
18405; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
18406; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
18407; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
18408; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
18409; RV64I-NEXT:    addi sp, sp, 48
18410; RV64I-NEXT:    ret
18411;
18412; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_release:
18413; RV64IA-WMO-NOZACAS:       # %bb.0:
18414; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
18415; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
18416; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
18417; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
18418; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
18419; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
18420; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
18421; RV64IA-WMO-NOZACAS-NEXT:  .LBB122_1: # =>This Inner Loop Header: Depth=1
18422; RV64IA-WMO-NOZACAS-NEXT:    lr.w a3, (a2)
18423; RV64IA-WMO-NOZACAS-NEXT:    and a6, a3, a4
18424; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a3
18425; RV64IA-WMO-NOZACAS-NEXT:    bgeu a6, a1, .LBB122_3
18426; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB122_1 Depth=1
18427; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a1
18428; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
18429; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
18430; RV64IA-WMO-NOZACAS-NEXT:  .LBB122_3: # in Loop: Header=BB122_1 Depth=1
18431; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
18432; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB122_1
18433; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
18434; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
18435; RV64IA-WMO-NOZACAS-NEXT:    ret
18436;
18437; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_release:
18438; RV64IA-TSO-NOZACAS:       # %bb.0:
18439; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
18440; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
18441; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
18442; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
18443; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
18444; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
18445; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
18446; RV64IA-TSO-NOZACAS-NEXT:  .LBB122_1: # =>This Inner Loop Header: Depth=1
18447; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
18448; RV64IA-TSO-NOZACAS-NEXT:    and a6, a3, a4
18449; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a3
18450; RV64IA-TSO-NOZACAS-NEXT:    bgeu a6, a1, .LBB122_3
18451; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB122_1 Depth=1
18452; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a1
18453; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
18454; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
18455; RV64IA-TSO-NOZACAS-NEXT:  .LBB122_3: # in Loop: Header=BB122_1 Depth=1
18456; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
18457; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB122_1
18458; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
18459; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
18460; RV64IA-TSO-NOZACAS-NEXT:    ret
18461;
18462; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_release:
18463; RV64IA-WMO-ZACAS:       # %bb.0:
18464; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
18465; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
18466; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
18467; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
18468; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
18469; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
18470; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
18471; RV64IA-WMO-ZACAS-NEXT:  .LBB122_1: # =>This Inner Loop Header: Depth=1
18472; RV64IA-WMO-ZACAS-NEXT:    lr.w a3, (a2)
18473; RV64IA-WMO-ZACAS-NEXT:    and a6, a3, a4
18474; RV64IA-WMO-ZACAS-NEXT:    mv a5, a3
18475; RV64IA-WMO-ZACAS-NEXT:    bgeu a6, a1, .LBB122_3
18476; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB122_1 Depth=1
18477; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a1
18478; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
18479; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
18480; RV64IA-WMO-ZACAS-NEXT:  .LBB122_3: # in Loop: Header=BB122_1 Depth=1
18481; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
18482; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB122_1
18483; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
18484; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
18485; RV64IA-WMO-ZACAS-NEXT:    ret
18486;
18487; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_release:
18488; RV64IA-TSO-ZACAS:       # %bb.0:
18489; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
18490; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
18491; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
18492; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
18493; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
18494; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
18495; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
18496; RV64IA-TSO-ZACAS-NEXT:  .LBB122_1: # =>This Inner Loop Header: Depth=1
18497; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
18498; RV64IA-TSO-ZACAS-NEXT:    and a6, a3, a4
18499; RV64IA-TSO-ZACAS-NEXT:    mv a5, a3
18500; RV64IA-TSO-ZACAS-NEXT:    bgeu a6, a1, .LBB122_3
18501; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB122_1 Depth=1
18502; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a1
18503; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
18504; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
18505; RV64IA-TSO-ZACAS-NEXT:  .LBB122_3: # in Loop: Header=BB122_1 Depth=1
18506; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
18507; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB122_1
18508; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
18509; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
18510; RV64IA-TSO-ZACAS-NEXT:    ret
18511;
18512; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_release:
18513; RV64IA-WMO-ZABHA:       # %bb.0:
18514; RV64IA-WMO-ZABHA-NEXT:    amomaxu.h.rl a0, a1, (a0)
18515; RV64IA-WMO-ZABHA-NEXT:    ret
18516;
18517; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_release:
18518; RV64IA-TSO-ZABHA:       # %bb.0:
18519; RV64IA-TSO-ZABHA-NEXT:    amomaxu.h a0, a1, (a0)
18520; RV64IA-TSO-ZABHA-NEXT:    ret
18521  %1 = atomicrmw umax ptr %a, i16 %b release
18522  ret i16 %1
18523}
18524
18525define i16 @atomicrmw_umax_i16_acq_rel(ptr %a, i16 %b) nounwind {
18526; RV32I-LABEL: atomicrmw_umax_i16_acq_rel:
18527; RV32I:       # %bb.0:
18528; RV32I-NEXT:    addi sp, sp, -32
18529; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
18530; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
18531; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
18532; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
18533; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
18534; RV32I-NEXT:    mv s0, a1
18535; RV32I-NEXT:    mv s1, a0
18536; RV32I-NEXT:    lhu a1, 0(a0)
18537; RV32I-NEXT:    lui s2, 16
18538; RV32I-NEXT:    addi s2, s2, -1
18539; RV32I-NEXT:    and s3, s0, s2
18540; RV32I-NEXT:    j .LBB123_2
18541; RV32I-NEXT:  .LBB123_1: # %atomicrmw.start
18542; RV32I-NEXT:    # in Loop: Header=BB123_2 Depth=1
18543; RV32I-NEXT:    sh a1, 10(sp)
18544; RV32I-NEXT:    addi a1, sp, 10
18545; RV32I-NEXT:    li a3, 4
18546; RV32I-NEXT:    li a4, 2
18547; RV32I-NEXT:    mv a0, s1
18548; RV32I-NEXT:    call __atomic_compare_exchange_2
18549; RV32I-NEXT:    lh a1, 10(sp)
18550; RV32I-NEXT:    bnez a0, .LBB123_4
18551; RV32I-NEXT:  .LBB123_2: # %atomicrmw.start
18552; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
18553; RV32I-NEXT:    and a0, a1, s2
18554; RV32I-NEXT:    mv a2, a1
18555; RV32I-NEXT:    bltu s3, a0, .LBB123_1
18556; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
18557; RV32I-NEXT:    # in Loop: Header=BB123_2 Depth=1
18558; RV32I-NEXT:    mv a2, s0
18559; RV32I-NEXT:    j .LBB123_1
18560; RV32I-NEXT:  .LBB123_4: # %atomicrmw.end
18561; RV32I-NEXT:    mv a0, a1
18562; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
18563; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
18564; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
18565; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
18566; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
18567; RV32I-NEXT:    addi sp, sp, 32
18568; RV32I-NEXT:    ret
18569;
18570; RV32IA-WMO-LABEL: atomicrmw_umax_i16_acq_rel:
18571; RV32IA-WMO:       # %bb.0:
18572; RV32IA-WMO-NEXT:    andi a2, a0, -4
18573; RV32IA-WMO-NEXT:    slli a0, a0, 3
18574; RV32IA-WMO-NEXT:    lui a3, 16
18575; RV32IA-WMO-NEXT:    addi a3, a3, -1
18576; RV32IA-WMO-NEXT:    sll a4, a3, a0
18577; RV32IA-WMO-NEXT:    and a1, a1, a3
18578; RV32IA-WMO-NEXT:    sll a1, a1, a0
18579; RV32IA-WMO-NEXT:  .LBB123_1: # =>This Inner Loop Header: Depth=1
18580; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
18581; RV32IA-WMO-NEXT:    and a6, a3, a4
18582; RV32IA-WMO-NEXT:    mv a5, a3
18583; RV32IA-WMO-NEXT:    bgeu a6, a1, .LBB123_3
18584; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB123_1 Depth=1
18585; RV32IA-WMO-NEXT:    xor a5, a3, a1
18586; RV32IA-WMO-NEXT:    and a5, a5, a4
18587; RV32IA-WMO-NEXT:    xor a5, a3, a5
18588; RV32IA-WMO-NEXT:  .LBB123_3: # in Loop: Header=BB123_1 Depth=1
18589; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
18590; RV32IA-WMO-NEXT:    bnez a5, .LBB123_1
18591; RV32IA-WMO-NEXT:  # %bb.4:
18592; RV32IA-WMO-NEXT:    srl a0, a3, a0
18593; RV32IA-WMO-NEXT:    ret
18594;
18595; RV32IA-TSO-LABEL: atomicrmw_umax_i16_acq_rel:
18596; RV32IA-TSO:       # %bb.0:
18597; RV32IA-TSO-NEXT:    andi a2, a0, -4
18598; RV32IA-TSO-NEXT:    slli a0, a0, 3
18599; RV32IA-TSO-NEXT:    lui a3, 16
18600; RV32IA-TSO-NEXT:    addi a3, a3, -1
18601; RV32IA-TSO-NEXT:    sll a4, a3, a0
18602; RV32IA-TSO-NEXT:    and a1, a1, a3
18603; RV32IA-TSO-NEXT:    sll a1, a1, a0
18604; RV32IA-TSO-NEXT:  .LBB123_1: # =>This Inner Loop Header: Depth=1
18605; RV32IA-TSO-NEXT:    lr.w a3, (a2)
18606; RV32IA-TSO-NEXT:    and a6, a3, a4
18607; RV32IA-TSO-NEXT:    mv a5, a3
18608; RV32IA-TSO-NEXT:    bgeu a6, a1, .LBB123_3
18609; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB123_1 Depth=1
18610; RV32IA-TSO-NEXT:    xor a5, a3, a1
18611; RV32IA-TSO-NEXT:    and a5, a5, a4
18612; RV32IA-TSO-NEXT:    xor a5, a3, a5
18613; RV32IA-TSO-NEXT:  .LBB123_3: # in Loop: Header=BB123_1 Depth=1
18614; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
18615; RV32IA-TSO-NEXT:    bnez a5, .LBB123_1
18616; RV32IA-TSO-NEXT:  # %bb.4:
18617; RV32IA-TSO-NEXT:    srl a0, a3, a0
18618; RV32IA-TSO-NEXT:    ret
18619;
18620; RV64I-LABEL: atomicrmw_umax_i16_acq_rel:
18621; RV64I:       # %bb.0:
18622; RV64I-NEXT:    addi sp, sp, -48
18623; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
18624; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
18625; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
18626; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
18627; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
18628; RV64I-NEXT:    mv s0, a1
18629; RV64I-NEXT:    mv s1, a0
18630; RV64I-NEXT:    lhu a1, 0(a0)
18631; RV64I-NEXT:    lui s2, 16
18632; RV64I-NEXT:    addiw s2, s2, -1
18633; RV64I-NEXT:    and s3, s0, s2
18634; RV64I-NEXT:    j .LBB123_2
18635; RV64I-NEXT:  .LBB123_1: # %atomicrmw.start
18636; RV64I-NEXT:    # in Loop: Header=BB123_2 Depth=1
18637; RV64I-NEXT:    sh a1, 6(sp)
18638; RV64I-NEXT:    addi a1, sp, 6
18639; RV64I-NEXT:    li a3, 4
18640; RV64I-NEXT:    li a4, 2
18641; RV64I-NEXT:    mv a0, s1
18642; RV64I-NEXT:    call __atomic_compare_exchange_2
18643; RV64I-NEXT:    lh a1, 6(sp)
18644; RV64I-NEXT:    bnez a0, .LBB123_4
18645; RV64I-NEXT:  .LBB123_2: # %atomicrmw.start
18646; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
18647; RV64I-NEXT:    and a0, a1, s2
18648; RV64I-NEXT:    mv a2, a1
18649; RV64I-NEXT:    bltu s3, a0, .LBB123_1
18650; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
18651; RV64I-NEXT:    # in Loop: Header=BB123_2 Depth=1
18652; RV64I-NEXT:    mv a2, s0
18653; RV64I-NEXT:    j .LBB123_1
18654; RV64I-NEXT:  .LBB123_4: # %atomicrmw.end
18655; RV64I-NEXT:    mv a0, a1
18656; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
18657; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
18658; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
18659; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
18660; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
18661; RV64I-NEXT:    addi sp, sp, 48
18662; RV64I-NEXT:    ret
18663;
18664; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
18665; RV64IA-WMO-NOZACAS:       # %bb.0:
18666; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
18667; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
18668; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
18669; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
18670; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
18671; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
18672; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
18673; RV64IA-WMO-NOZACAS-NEXT:  .LBB123_1: # =>This Inner Loop Header: Depth=1
18674; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
18675; RV64IA-WMO-NOZACAS-NEXT:    and a6, a3, a4
18676; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a3
18677; RV64IA-WMO-NOZACAS-NEXT:    bgeu a6, a1, .LBB123_3
18678; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB123_1 Depth=1
18679; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a1
18680; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
18681; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
18682; RV64IA-WMO-NOZACAS-NEXT:  .LBB123_3: # in Loop: Header=BB123_1 Depth=1
18683; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
18684; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB123_1
18685; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
18686; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
18687; RV64IA-WMO-NOZACAS-NEXT:    ret
18688;
18689; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
18690; RV64IA-TSO-NOZACAS:       # %bb.0:
18691; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
18692; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
18693; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
18694; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
18695; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
18696; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
18697; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
18698; RV64IA-TSO-NOZACAS-NEXT:  .LBB123_1: # =>This Inner Loop Header: Depth=1
18699; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
18700; RV64IA-TSO-NOZACAS-NEXT:    and a6, a3, a4
18701; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a3
18702; RV64IA-TSO-NOZACAS-NEXT:    bgeu a6, a1, .LBB123_3
18703; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB123_1 Depth=1
18704; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a1
18705; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
18706; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
18707; RV64IA-TSO-NOZACAS-NEXT:  .LBB123_3: # in Loop: Header=BB123_1 Depth=1
18708; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
18709; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB123_1
18710; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
18711; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
18712; RV64IA-TSO-NOZACAS-NEXT:    ret
18713;
18714; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
18715; RV64IA-WMO-ZACAS:       # %bb.0:
18716; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
18717; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
18718; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
18719; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
18720; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
18721; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
18722; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
18723; RV64IA-WMO-ZACAS-NEXT:  .LBB123_1: # =>This Inner Loop Header: Depth=1
18724; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
18725; RV64IA-WMO-ZACAS-NEXT:    and a6, a3, a4
18726; RV64IA-WMO-ZACAS-NEXT:    mv a5, a3
18727; RV64IA-WMO-ZACAS-NEXT:    bgeu a6, a1, .LBB123_3
18728; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB123_1 Depth=1
18729; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a1
18730; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
18731; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
18732; RV64IA-WMO-ZACAS-NEXT:  .LBB123_3: # in Loop: Header=BB123_1 Depth=1
18733; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
18734; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB123_1
18735; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
18736; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
18737; RV64IA-WMO-ZACAS-NEXT:    ret
18738;
18739; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
18740; RV64IA-TSO-ZACAS:       # %bb.0:
18741; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
18742; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
18743; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
18744; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
18745; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
18746; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
18747; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
18748; RV64IA-TSO-ZACAS-NEXT:  .LBB123_1: # =>This Inner Loop Header: Depth=1
18749; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
18750; RV64IA-TSO-ZACAS-NEXT:    and a6, a3, a4
18751; RV64IA-TSO-ZACAS-NEXT:    mv a5, a3
18752; RV64IA-TSO-ZACAS-NEXT:    bgeu a6, a1, .LBB123_3
18753; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB123_1 Depth=1
18754; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a1
18755; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
18756; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
18757; RV64IA-TSO-ZACAS-NEXT:  .LBB123_3: # in Loop: Header=BB123_1 Depth=1
18758; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
18759; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB123_1
18760; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
18761; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
18762; RV64IA-TSO-ZACAS-NEXT:    ret
18763;
18764; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_acq_rel:
18765; RV64IA-WMO-ZABHA:       # %bb.0:
18766; RV64IA-WMO-ZABHA-NEXT:    amomaxu.h.aqrl a0, a1, (a0)
18767; RV64IA-WMO-ZABHA-NEXT:    ret
18768;
18769; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_acq_rel:
18770; RV64IA-TSO-ZABHA:       # %bb.0:
18771; RV64IA-TSO-ZABHA-NEXT:    amomaxu.h a0, a1, (a0)
18772; RV64IA-TSO-ZABHA-NEXT:    ret
18773  %1 = atomicrmw umax ptr %a, i16 %b acq_rel
18774  ret i16 %1
18775}
18776
18777define i16 @atomicrmw_umax_i16_seq_cst(ptr %a, i16 %b) nounwind {
18778; RV32I-LABEL: atomicrmw_umax_i16_seq_cst:
18779; RV32I:       # %bb.0:
18780; RV32I-NEXT:    addi sp, sp, -32
18781; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
18782; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
18783; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
18784; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
18785; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
18786; RV32I-NEXT:    mv s0, a1
18787; RV32I-NEXT:    mv s1, a0
18788; RV32I-NEXT:    lhu a1, 0(a0)
18789; RV32I-NEXT:    lui s2, 16
18790; RV32I-NEXT:    addi s2, s2, -1
18791; RV32I-NEXT:    and s3, s0, s2
18792; RV32I-NEXT:    j .LBB124_2
18793; RV32I-NEXT:  .LBB124_1: # %atomicrmw.start
18794; RV32I-NEXT:    # in Loop: Header=BB124_2 Depth=1
18795; RV32I-NEXT:    sh a1, 10(sp)
18796; RV32I-NEXT:    addi a1, sp, 10
18797; RV32I-NEXT:    li a3, 5
18798; RV32I-NEXT:    li a4, 5
18799; RV32I-NEXT:    mv a0, s1
18800; RV32I-NEXT:    call __atomic_compare_exchange_2
18801; RV32I-NEXT:    lh a1, 10(sp)
18802; RV32I-NEXT:    bnez a0, .LBB124_4
18803; RV32I-NEXT:  .LBB124_2: # %atomicrmw.start
18804; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
18805; RV32I-NEXT:    and a0, a1, s2
18806; RV32I-NEXT:    mv a2, a1
18807; RV32I-NEXT:    bltu s3, a0, .LBB124_1
18808; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
18809; RV32I-NEXT:    # in Loop: Header=BB124_2 Depth=1
18810; RV32I-NEXT:    mv a2, s0
18811; RV32I-NEXT:    j .LBB124_1
18812; RV32I-NEXT:  .LBB124_4: # %atomicrmw.end
18813; RV32I-NEXT:    mv a0, a1
18814; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
18815; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
18816; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
18817; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
18818; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
18819; RV32I-NEXT:    addi sp, sp, 32
18820; RV32I-NEXT:    ret
18821;
18822; RV32IA-LABEL: atomicrmw_umax_i16_seq_cst:
18823; RV32IA:       # %bb.0:
18824; RV32IA-NEXT:    andi a2, a0, -4
18825; RV32IA-NEXT:    slli a0, a0, 3
18826; RV32IA-NEXT:    lui a3, 16
18827; RV32IA-NEXT:    addi a3, a3, -1
18828; RV32IA-NEXT:    sll a4, a3, a0
18829; RV32IA-NEXT:    and a1, a1, a3
18830; RV32IA-NEXT:    sll a1, a1, a0
18831; RV32IA-NEXT:  .LBB124_1: # =>This Inner Loop Header: Depth=1
18832; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
18833; RV32IA-NEXT:    and a6, a3, a4
18834; RV32IA-NEXT:    mv a5, a3
18835; RV32IA-NEXT:    bgeu a6, a1, .LBB124_3
18836; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB124_1 Depth=1
18837; RV32IA-NEXT:    xor a5, a3, a1
18838; RV32IA-NEXT:    and a5, a5, a4
18839; RV32IA-NEXT:    xor a5, a3, a5
18840; RV32IA-NEXT:  .LBB124_3: # in Loop: Header=BB124_1 Depth=1
18841; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
18842; RV32IA-NEXT:    bnez a5, .LBB124_1
18843; RV32IA-NEXT:  # %bb.4:
18844; RV32IA-NEXT:    srl a0, a3, a0
18845; RV32IA-NEXT:    ret
18846;
18847; RV64I-LABEL: atomicrmw_umax_i16_seq_cst:
18848; RV64I:       # %bb.0:
18849; RV64I-NEXT:    addi sp, sp, -48
18850; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
18851; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
18852; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
18853; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
18854; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
18855; RV64I-NEXT:    mv s0, a1
18856; RV64I-NEXT:    mv s1, a0
18857; RV64I-NEXT:    lhu a1, 0(a0)
18858; RV64I-NEXT:    lui s2, 16
18859; RV64I-NEXT:    addiw s2, s2, -1
18860; RV64I-NEXT:    and s3, s0, s2
18861; RV64I-NEXT:    j .LBB124_2
18862; RV64I-NEXT:  .LBB124_1: # %atomicrmw.start
18863; RV64I-NEXT:    # in Loop: Header=BB124_2 Depth=1
18864; RV64I-NEXT:    sh a1, 6(sp)
18865; RV64I-NEXT:    addi a1, sp, 6
18866; RV64I-NEXT:    li a3, 5
18867; RV64I-NEXT:    li a4, 5
18868; RV64I-NEXT:    mv a0, s1
18869; RV64I-NEXT:    call __atomic_compare_exchange_2
18870; RV64I-NEXT:    lh a1, 6(sp)
18871; RV64I-NEXT:    bnez a0, .LBB124_4
18872; RV64I-NEXT:  .LBB124_2: # %atomicrmw.start
18873; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
18874; RV64I-NEXT:    and a0, a1, s2
18875; RV64I-NEXT:    mv a2, a1
18876; RV64I-NEXT:    bltu s3, a0, .LBB124_1
18877; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
18878; RV64I-NEXT:    # in Loop: Header=BB124_2 Depth=1
18879; RV64I-NEXT:    mv a2, s0
18880; RV64I-NEXT:    j .LBB124_1
18881; RV64I-NEXT:  .LBB124_4: # %atomicrmw.end
18882; RV64I-NEXT:    mv a0, a1
18883; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
18884; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
18885; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
18886; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
18887; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
18888; RV64I-NEXT:    addi sp, sp, 48
18889; RV64I-NEXT:    ret
18890;
18891; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i16_seq_cst:
18892; RV64IA-NOZACAS:       # %bb.0:
18893; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
18894; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
18895; RV64IA-NOZACAS-NEXT:    lui a3, 16
18896; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
18897; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
18898; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
18899; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
18900; RV64IA-NOZACAS-NEXT:  .LBB124_1: # =>This Inner Loop Header: Depth=1
18901; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
18902; RV64IA-NOZACAS-NEXT:    and a6, a3, a4
18903; RV64IA-NOZACAS-NEXT:    mv a5, a3
18904; RV64IA-NOZACAS-NEXT:    bgeu a6, a1, .LBB124_3
18905; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB124_1 Depth=1
18906; RV64IA-NOZACAS-NEXT:    xor a5, a3, a1
18907; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
18908; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
18909; RV64IA-NOZACAS-NEXT:  .LBB124_3: # in Loop: Header=BB124_1 Depth=1
18910; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
18911; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB124_1
18912; RV64IA-NOZACAS-NEXT:  # %bb.4:
18913; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
18914; RV64IA-NOZACAS-NEXT:    ret
18915;
18916; RV64IA-ZACAS-LABEL: atomicrmw_umax_i16_seq_cst:
18917; RV64IA-ZACAS:       # %bb.0:
18918; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
18919; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
18920; RV64IA-ZACAS-NEXT:    lui a3, 16
18921; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
18922; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
18923; RV64IA-ZACAS-NEXT:    and a1, a1, a3
18924; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
18925; RV64IA-ZACAS-NEXT:  .LBB124_1: # =>This Inner Loop Header: Depth=1
18926; RV64IA-ZACAS-NEXT:    lr.w.aqrl a3, (a2)
18927; RV64IA-ZACAS-NEXT:    and a6, a3, a4
18928; RV64IA-ZACAS-NEXT:    mv a5, a3
18929; RV64IA-ZACAS-NEXT:    bgeu a6, a1, .LBB124_3
18930; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB124_1 Depth=1
18931; RV64IA-ZACAS-NEXT:    xor a5, a3, a1
18932; RV64IA-ZACAS-NEXT:    and a5, a5, a4
18933; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
18934; RV64IA-ZACAS-NEXT:  .LBB124_3: # in Loop: Header=BB124_1 Depth=1
18935; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
18936; RV64IA-ZACAS-NEXT:    bnez a5, .LBB124_1
18937; RV64IA-ZACAS-NEXT:  # %bb.4:
18938; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
18939; RV64IA-ZACAS-NEXT:    ret
18940;
18941; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_seq_cst:
18942; RV64IA-WMO-ZABHA:       # %bb.0:
18943; RV64IA-WMO-ZABHA-NEXT:    amomaxu.h.aqrl a0, a1, (a0)
18944; RV64IA-WMO-ZABHA-NEXT:    ret
18945;
18946; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_seq_cst:
18947; RV64IA-TSO-ZABHA:       # %bb.0:
18948; RV64IA-TSO-ZABHA-NEXT:    amomaxu.h a0, a1, (a0)
18949; RV64IA-TSO-ZABHA-NEXT:    ret
18950  %1 = atomicrmw umax ptr %a, i16 %b seq_cst
18951  ret i16 %1
18952}
18953
18954define i16 @atomicrmw_umin_i16_monotonic(ptr %a, i16 %b) nounwind {
18955; RV32I-LABEL: atomicrmw_umin_i16_monotonic:
18956; RV32I:       # %bb.0:
18957; RV32I-NEXT:    addi sp, sp, -32
18958; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
18959; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
18960; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
18961; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
18962; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
18963; RV32I-NEXT:    mv s0, a1
18964; RV32I-NEXT:    mv s1, a0
18965; RV32I-NEXT:    lhu a1, 0(a0)
18966; RV32I-NEXT:    lui s2, 16
18967; RV32I-NEXT:    addi s2, s2, -1
18968; RV32I-NEXT:    and s3, s0, s2
18969; RV32I-NEXT:    j .LBB125_2
18970; RV32I-NEXT:  .LBB125_1: # %atomicrmw.start
18971; RV32I-NEXT:    # in Loop: Header=BB125_2 Depth=1
18972; RV32I-NEXT:    sh a1, 10(sp)
18973; RV32I-NEXT:    addi a1, sp, 10
18974; RV32I-NEXT:    mv a0, s1
18975; RV32I-NEXT:    li a3, 0
18976; RV32I-NEXT:    li a4, 0
18977; RV32I-NEXT:    call __atomic_compare_exchange_2
18978; RV32I-NEXT:    lh a1, 10(sp)
18979; RV32I-NEXT:    bnez a0, .LBB125_4
18980; RV32I-NEXT:  .LBB125_2: # %atomicrmw.start
18981; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
18982; RV32I-NEXT:    and a0, a1, s2
18983; RV32I-NEXT:    mv a2, a1
18984; RV32I-NEXT:    bgeu s3, a0, .LBB125_1
18985; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
18986; RV32I-NEXT:    # in Loop: Header=BB125_2 Depth=1
18987; RV32I-NEXT:    mv a2, s0
18988; RV32I-NEXT:    j .LBB125_1
18989; RV32I-NEXT:  .LBB125_4: # %atomicrmw.end
18990; RV32I-NEXT:    mv a0, a1
18991; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
18992; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
18993; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
18994; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
18995; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
18996; RV32I-NEXT:    addi sp, sp, 32
18997; RV32I-NEXT:    ret
18998;
18999; RV32IA-LABEL: atomicrmw_umin_i16_monotonic:
19000; RV32IA:       # %bb.0:
19001; RV32IA-NEXT:    andi a2, a0, -4
19002; RV32IA-NEXT:    slli a0, a0, 3
19003; RV32IA-NEXT:    lui a3, 16
19004; RV32IA-NEXT:    addi a3, a3, -1
19005; RV32IA-NEXT:    sll a4, a3, a0
19006; RV32IA-NEXT:    and a1, a1, a3
19007; RV32IA-NEXT:    sll a1, a1, a0
19008; RV32IA-NEXT:  .LBB125_1: # =>This Inner Loop Header: Depth=1
19009; RV32IA-NEXT:    lr.w a3, (a2)
19010; RV32IA-NEXT:    and a6, a3, a4
19011; RV32IA-NEXT:    mv a5, a3
19012; RV32IA-NEXT:    bgeu a1, a6, .LBB125_3
19013; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB125_1 Depth=1
19014; RV32IA-NEXT:    xor a5, a3, a1
19015; RV32IA-NEXT:    and a5, a5, a4
19016; RV32IA-NEXT:    xor a5, a3, a5
19017; RV32IA-NEXT:  .LBB125_3: # in Loop: Header=BB125_1 Depth=1
19018; RV32IA-NEXT:    sc.w a5, a5, (a2)
19019; RV32IA-NEXT:    bnez a5, .LBB125_1
19020; RV32IA-NEXT:  # %bb.4:
19021; RV32IA-NEXT:    srl a0, a3, a0
19022; RV32IA-NEXT:    ret
19023;
19024; RV64I-LABEL: atomicrmw_umin_i16_monotonic:
19025; RV64I:       # %bb.0:
19026; RV64I-NEXT:    addi sp, sp, -48
19027; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
19028; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
19029; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
19030; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
19031; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
19032; RV64I-NEXT:    mv s0, a1
19033; RV64I-NEXT:    mv s1, a0
19034; RV64I-NEXT:    lhu a1, 0(a0)
19035; RV64I-NEXT:    lui s2, 16
19036; RV64I-NEXT:    addiw s2, s2, -1
19037; RV64I-NEXT:    and s3, s0, s2
19038; RV64I-NEXT:    j .LBB125_2
19039; RV64I-NEXT:  .LBB125_1: # %atomicrmw.start
19040; RV64I-NEXT:    # in Loop: Header=BB125_2 Depth=1
19041; RV64I-NEXT:    sh a1, 6(sp)
19042; RV64I-NEXT:    addi a1, sp, 6
19043; RV64I-NEXT:    mv a0, s1
19044; RV64I-NEXT:    li a3, 0
19045; RV64I-NEXT:    li a4, 0
19046; RV64I-NEXT:    call __atomic_compare_exchange_2
19047; RV64I-NEXT:    lh a1, 6(sp)
19048; RV64I-NEXT:    bnez a0, .LBB125_4
19049; RV64I-NEXT:  .LBB125_2: # %atomicrmw.start
19050; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
19051; RV64I-NEXT:    and a0, a1, s2
19052; RV64I-NEXT:    mv a2, a1
19053; RV64I-NEXT:    bgeu s3, a0, .LBB125_1
19054; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
19055; RV64I-NEXT:    # in Loop: Header=BB125_2 Depth=1
19056; RV64I-NEXT:    mv a2, s0
19057; RV64I-NEXT:    j .LBB125_1
19058; RV64I-NEXT:  .LBB125_4: # %atomicrmw.end
19059; RV64I-NEXT:    mv a0, a1
19060; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
19061; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
19062; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
19063; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
19064; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
19065; RV64I-NEXT:    addi sp, sp, 48
19066; RV64I-NEXT:    ret
19067;
19068; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i16_monotonic:
19069; RV64IA-NOZACAS:       # %bb.0:
19070; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
19071; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
19072; RV64IA-NOZACAS-NEXT:    lui a3, 16
19073; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
19074; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
19075; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
19076; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
19077; RV64IA-NOZACAS-NEXT:  .LBB125_1: # =>This Inner Loop Header: Depth=1
19078; RV64IA-NOZACAS-NEXT:    lr.w a3, (a2)
19079; RV64IA-NOZACAS-NEXT:    and a6, a3, a4
19080; RV64IA-NOZACAS-NEXT:    mv a5, a3
19081; RV64IA-NOZACAS-NEXT:    bgeu a1, a6, .LBB125_3
19082; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB125_1 Depth=1
19083; RV64IA-NOZACAS-NEXT:    xor a5, a3, a1
19084; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
19085; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
19086; RV64IA-NOZACAS-NEXT:  .LBB125_3: # in Loop: Header=BB125_1 Depth=1
19087; RV64IA-NOZACAS-NEXT:    sc.w a5, a5, (a2)
19088; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB125_1
19089; RV64IA-NOZACAS-NEXT:  # %bb.4:
19090; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
19091; RV64IA-NOZACAS-NEXT:    ret
19092;
19093; RV64IA-ZACAS-LABEL: atomicrmw_umin_i16_monotonic:
19094; RV64IA-ZACAS:       # %bb.0:
19095; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
19096; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
19097; RV64IA-ZACAS-NEXT:    lui a3, 16
19098; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
19099; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
19100; RV64IA-ZACAS-NEXT:    and a1, a1, a3
19101; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
19102; RV64IA-ZACAS-NEXT:  .LBB125_1: # =>This Inner Loop Header: Depth=1
19103; RV64IA-ZACAS-NEXT:    lr.w a3, (a2)
19104; RV64IA-ZACAS-NEXT:    and a6, a3, a4
19105; RV64IA-ZACAS-NEXT:    mv a5, a3
19106; RV64IA-ZACAS-NEXT:    bgeu a1, a6, .LBB125_3
19107; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB125_1 Depth=1
19108; RV64IA-ZACAS-NEXT:    xor a5, a3, a1
19109; RV64IA-ZACAS-NEXT:    and a5, a5, a4
19110; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
19111; RV64IA-ZACAS-NEXT:  .LBB125_3: # in Loop: Header=BB125_1 Depth=1
19112; RV64IA-ZACAS-NEXT:    sc.w a5, a5, (a2)
19113; RV64IA-ZACAS-NEXT:    bnez a5, .LBB125_1
19114; RV64IA-ZACAS-NEXT:  # %bb.4:
19115; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
19116; RV64IA-ZACAS-NEXT:    ret
19117;
19118; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_monotonic:
19119; RV64IA-WMO-ZABHA:       # %bb.0:
19120; RV64IA-WMO-ZABHA-NEXT:    amominu.h a0, a1, (a0)
19121; RV64IA-WMO-ZABHA-NEXT:    ret
19122;
19123; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_monotonic:
19124; RV64IA-TSO-ZABHA:       # %bb.0:
19125; RV64IA-TSO-ZABHA-NEXT:    amominu.h a0, a1, (a0)
19126; RV64IA-TSO-ZABHA-NEXT:    ret
19127  %1 = atomicrmw umin ptr %a, i16 %b monotonic
19128  ret i16 %1
19129}
19130
19131define i16 @atomicrmw_umin_i16_acquire(ptr %a, i16 %b) nounwind {
19132; RV32I-LABEL: atomicrmw_umin_i16_acquire:
19133; RV32I:       # %bb.0:
19134; RV32I-NEXT:    addi sp, sp, -32
19135; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
19136; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
19137; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
19138; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
19139; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
19140; RV32I-NEXT:    mv s0, a1
19141; RV32I-NEXT:    mv s1, a0
19142; RV32I-NEXT:    lhu a1, 0(a0)
19143; RV32I-NEXT:    lui s2, 16
19144; RV32I-NEXT:    addi s2, s2, -1
19145; RV32I-NEXT:    and s3, s0, s2
19146; RV32I-NEXT:    j .LBB126_2
19147; RV32I-NEXT:  .LBB126_1: # %atomicrmw.start
19148; RV32I-NEXT:    # in Loop: Header=BB126_2 Depth=1
19149; RV32I-NEXT:    sh a1, 10(sp)
19150; RV32I-NEXT:    addi a1, sp, 10
19151; RV32I-NEXT:    li a3, 2
19152; RV32I-NEXT:    li a4, 2
19153; RV32I-NEXT:    mv a0, s1
19154; RV32I-NEXT:    call __atomic_compare_exchange_2
19155; RV32I-NEXT:    lh a1, 10(sp)
19156; RV32I-NEXT:    bnez a0, .LBB126_4
19157; RV32I-NEXT:  .LBB126_2: # %atomicrmw.start
19158; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
19159; RV32I-NEXT:    and a0, a1, s2
19160; RV32I-NEXT:    mv a2, a1
19161; RV32I-NEXT:    bgeu s3, a0, .LBB126_1
19162; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
19163; RV32I-NEXT:    # in Loop: Header=BB126_2 Depth=1
19164; RV32I-NEXT:    mv a2, s0
19165; RV32I-NEXT:    j .LBB126_1
19166; RV32I-NEXT:  .LBB126_4: # %atomicrmw.end
19167; RV32I-NEXT:    mv a0, a1
19168; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
19169; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
19170; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
19171; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
19172; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
19173; RV32I-NEXT:    addi sp, sp, 32
19174; RV32I-NEXT:    ret
19175;
19176; RV32IA-WMO-LABEL: atomicrmw_umin_i16_acquire:
19177; RV32IA-WMO:       # %bb.0:
19178; RV32IA-WMO-NEXT:    andi a2, a0, -4
19179; RV32IA-WMO-NEXT:    slli a0, a0, 3
19180; RV32IA-WMO-NEXT:    lui a3, 16
19181; RV32IA-WMO-NEXT:    addi a3, a3, -1
19182; RV32IA-WMO-NEXT:    sll a4, a3, a0
19183; RV32IA-WMO-NEXT:    and a1, a1, a3
19184; RV32IA-WMO-NEXT:    sll a1, a1, a0
19185; RV32IA-WMO-NEXT:  .LBB126_1: # =>This Inner Loop Header: Depth=1
19186; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
19187; RV32IA-WMO-NEXT:    and a6, a3, a4
19188; RV32IA-WMO-NEXT:    mv a5, a3
19189; RV32IA-WMO-NEXT:    bgeu a1, a6, .LBB126_3
19190; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB126_1 Depth=1
19191; RV32IA-WMO-NEXT:    xor a5, a3, a1
19192; RV32IA-WMO-NEXT:    and a5, a5, a4
19193; RV32IA-WMO-NEXT:    xor a5, a3, a5
19194; RV32IA-WMO-NEXT:  .LBB126_3: # in Loop: Header=BB126_1 Depth=1
19195; RV32IA-WMO-NEXT:    sc.w a5, a5, (a2)
19196; RV32IA-WMO-NEXT:    bnez a5, .LBB126_1
19197; RV32IA-WMO-NEXT:  # %bb.4:
19198; RV32IA-WMO-NEXT:    srl a0, a3, a0
19199; RV32IA-WMO-NEXT:    ret
19200;
19201; RV32IA-TSO-LABEL: atomicrmw_umin_i16_acquire:
19202; RV32IA-TSO:       # %bb.0:
19203; RV32IA-TSO-NEXT:    andi a2, a0, -4
19204; RV32IA-TSO-NEXT:    slli a0, a0, 3
19205; RV32IA-TSO-NEXT:    lui a3, 16
19206; RV32IA-TSO-NEXT:    addi a3, a3, -1
19207; RV32IA-TSO-NEXT:    sll a4, a3, a0
19208; RV32IA-TSO-NEXT:    and a1, a1, a3
19209; RV32IA-TSO-NEXT:    sll a1, a1, a0
19210; RV32IA-TSO-NEXT:  .LBB126_1: # =>This Inner Loop Header: Depth=1
19211; RV32IA-TSO-NEXT:    lr.w a3, (a2)
19212; RV32IA-TSO-NEXT:    and a6, a3, a4
19213; RV32IA-TSO-NEXT:    mv a5, a3
19214; RV32IA-TSO-NEXT:    bgeu a1, a6, .LBB126_3
19215; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB126_1 Depth=1
19216; RV32IA-TSO-NEXT:    xor a5, a3, a1
19217; RV32IA-TSO-NEXT:    and a5, a5, a4
19218; RV32IA-TSO-NEXT:    xor a5, a3, a5
19219; RV32IA-TSO-NEXT:  .LBB126_3: # in Loop: Header=BB126_1 Depth=1
19220; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
19221; RV32IA-TSO-NEXT:    bnez a5, .LBB126_1
19222; RV32IA-TSO-NEXT:  # %bb.4:
19223; RV32IA-TSO-NEXT:    srl a0, a3, a0
19224; RV32IA-TSO-NEXT:    ret
19225;
19226; RV64I-LABEL: atomicrmw_umin_i16_acquire:
19227; RV64I:       # %bb.0:
19228; RV64I-NEXT:    addi sp, sp, -48
19229; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
19230; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
19231; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
19232; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
19233; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
19234; RV64I-NEXT:    mv s0, a1
19235; RV64I-NEXT:    mv s1, a0
19236; RV64I-NEXT:    lhu a1, 0(a0)
19237; RV64I-NEXT:    lui s2, 16
19238; RV64I-NEXT:    addiw s2, s2, -1
19239; RV64I-NEXT:    and s3, s0, s2
19240; RV64I-NEXT:    j .LBB126_2
19241; RV64I-NEXT:  .LBB126_1: # %atomicrmw.start
19242; RV64I-NEXT:    # in Loop: Header=BB126_2 Depth=1
19243; RV64I-NEXT:    sh a1, 6(sp)
19244; RV64I-NEXT:    addi a1, sp, 6
19245; RV64I-NEXT:    li a3, 2
19246; RV64I-NEXT:    li a4, 2
19247; RV64I-NEXT:    mv a0, s1
19248; RV64I-NEXT:    call __atomic_compare_exchange_2
19249; RV64I-NEXT:    lh a1, 6(sp)
19250; RV64I-NEXT:    bnez a0, .LBB126_4
19251; RV64I-NEXT:  .LBB126_2: # %atomicrmw.start
19252; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
19253; RV64I-NEXT:    and a0, a1, s2
19254; RV64I-NEXT:    mv a2, a1
19255; RV64I-NEXT:    bgeu s3, a0, .LBB126_1
19256; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
19257; RV64I-NEXT:    # in Loop: Header=BB126_2 Depth=1
19258; RV64I-NEXT:    mv a2, s0
19259; RV64I-NEXT:    j .LBB126_1
19260; RV64I-NEXT:  .LBB126_4: # %atomicrmw.end
19261; RV64I-NEXT:    mv a0, a1
19262; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
19263; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
19264; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
19265; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
19266; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
19267; RV64I-NEXT:    addi sp, sp, 48
19268; RV64I-NEXT:    ret
19269;
19270; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_acquire:
19271; RV64IA-WMO-NOZACAS:       # %bb.0:
19272; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
19273; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
19274; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
19275; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
19276; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
19277; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
19278; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
19279; RV64IA-WMO-NOZACAS-NEXT:  .LBB126_1: # =>This Inner Loop Header: Depth=1
19280; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
19281; RV64IA-WMO-NOZACAS-NEXT:    and a6, a3, a4
19282; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a3
19283; RV64IA-WMO-NOZACAS-NEXT:    bgeu a1, a6, .LBB126_3
19284; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB126_1 Depth=1
19285; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a1
19286; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
19287; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
19288; RV64IA-WMO-NOZACAS-NEXT:  .LBB126_3: # in Loop: Header=BB126_1 Depth=1
19289; RV64IA-WMO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
19290; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB126_1
19291; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
19292; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
19293; RV64IA-WMO-NOZACAS-NEXT:    ret
19294;
19295; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_acquire:
19296; RV64IA-TSO-NOZACAS:       # %bb.0:
19297; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
19298; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
19299; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
19300; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
19301; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
19302; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
19303; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
19304; RV64IA-TSO-NOZACAS-NEXT:  .LBB126_1: # =>This Inner Loop Header: Depth=1
19305; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
19306; RV64IA-TSO-NOZACAS-NEXT:    and a6, a3, a4
19307; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a3
19308; RV64IA-TSO-NOZACAS-NEXT:    bgeu a1, a6, .LBB126_3
19309; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB126_1 Depth=1
19310; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a1
19311; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
19312; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
19313; RV64IA-TSO-NOZACAS-NEXT:  .LBB126_3: # in Loop: Header=BB126_1 Depth=1
19314; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
19315; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB126_1
19316; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
19317; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
19318; RV64IA-TSO-NOZACAS-NEXT:    ret
19319;
19320; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_acquire:
19321; RV64IA-WMO-ZACAS:       # %bb.0:
19322; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
19323; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
19324; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
19325; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
19326; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
19327; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
19328; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
19329; RV64IA-WMO-ZACAS-NEXT:  .LBB126_1: # =>This Inner Loop Header: Depth=1
19330; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
19331; RV64IA-WMO-ZACAS-NEXT:    and a6, a3, a4
19332; RV64IA-WMO-ZACAS-NEXT:    mv a5, a3
19333; RV64IA-WMO-ZACAS-NEXT:    bgeu a1, a6, .LBB126_3
19334; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB126_1 Depth=1
19335; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a1
19336; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
19337; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
19338; RV64IA-WMO-ZACAS-NEXT:  .LBB126_3: # in Loop: Header=BB126_1 Depth=1
19339; RV64IA-WMO-ZACAS-NEXT:    sc.w a5, a5, (a2)
19340; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB126_1
19341; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
19342; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
19343; RV64IA-WMO-ZACAS-NEXT:    ret
19344;
19345; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_acquire:
19346; RV64IA-TSO-ZACAS:       # %bb.0:
19347; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
19348; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
19349; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
19350; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
19351; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
19352; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
19353; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
19354; RV64IA-TSO-ZACAS-NEXT:  .LBB126_1: # =>This Inner Loop Header: Depth=1
19355; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
19356; RV64IA-TSO-ZACAS-NEXT:    and a6, a3, a4
19357; RV64IA-TSO-ZACAS-NEXT:    mv a5, a3
19358; RV64IA-TSO-ZACAS-NEXT:    bgeu a1, a6, .LBB126_3
19359; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB126_1 Depth=1
19360; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a1
19361; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
19362; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
19363; RV64IA-TSO-ZACAS-NEXT:  .LBB126_3: # in Loop: Header=BB126_1 Depth=1
19364; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
19365; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB126_1
19366; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
19367; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
19368; RV64IA-TSO-ZACAS-NEXT:    ret
19369;
19370; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_acquire:
19371; RV64IA-WMO-ZABHA:       # %bb.0:
19372; RV64IA-WMO-ZABHA-NEXT:    amominu.h.aq a0, a1, (a0)
19373; RV64IA-WMO-ZABHA-NEXT:    ret
19374;
19375; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_acquire:
19376; RV64IA-TSO-ZABHA:       # %bb.0:
19377; RV64IA-TSO-ZABHA-NEXT:    amominu.h a0, a1, (a0)
19378; RV64IA-TSO-ZABHA-NEXT:    ret
19379  %1 = atomicrmw umin ptr %a, i16 %b acquire
19380  ret i16 %1
19381}
19382
19383define i16 @atomicrmw_umin_i16_release(ptr %a, i16 %b) nounwind {
19384; RV32I-LABEL: atomicrmw_umin_i16_release:
19385; RV32I:       # %bb.0:
19386; RV32I-NEXT:    addi sp, sp, -32
19387; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
19388; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
19389; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
19390; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
19391; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
19392; RV32I-NEXT:    mv s0, a1
19393; RV32I-NEXT:    mv s1, a0
19394; RV32I-NEXT:    lhu a1, 0(a0)
19395; RV32I-NEXT:    lui s2, 16
19396; RV32I-NEXT:    addi s2, s2, -1
19397; RV32I-NEXT:    and s3, s0, s2
19398; RV32I-NEXT:    j .LBB127_2
19399; RV32I-NEXT:  .LBB127_1: # %atomicrmw.start
19400; RV32I-NEXT:    # in Loop: Header=BB127_2 Depth=1
19401; RV32I-NEXT:    sh a1, 10(sp)
19402; RV32I-NEXT:    addi a1, sp, 10
19403; RV32I-NEXT:    li a3, 3
19404; RV32I-NEXT:    mv a0, s1
19405; RV32I-NEXT:    li a4, 0
19406; RV32I-NEXT:    call __atomic_compare_exchange_2
19407; RV32I-NEXT:    lh a1, 10(sp)
19408; RV32I-NEXT:    bnez a0, .LBB127_4
19409; RV32I-NEXT:  .LBB127_2: # %atomicrmw.start
19410; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
19411; RV32I-NEXT:    and a0, a1, s2
19412; RV32I-NEXT:    mv a2, a1
19413; RV32I-NEXT:    bgeu s3, a0, .LBB127_1
19414; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
19415; RV32I-NEXT:    # in Loop: Header=BB127_2 Depth=1
19416; RV32I-NEXT:    mv a2, s0
19417; RV32I-NEXT:    j .LBB127_1
19418; RV32I-NEXT:  .LBB127_4: # %atomicrmw.end
19419; RV32I-NEXT:    mv a0, a1
19420; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
19421; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
19422; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
19423; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
19424; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
19425; RV32I-NEXT:    addi sp, sp, 32
19426; RV32I-NEXT:    ret
19427;
19428; RV32IA-WMO-LABEL: atomicrmw_umin_i16_release:
19429; RV32IA-WMO:       # %bb.0:
19430; RV32IA-WMO-NEXT:    andi a2, a0, -4
19431; RV32IA-WMO-NEXT:    slli a0, a0, 3
19432; RV32IA-WMO-NEXT:    lui a3, 16
19433; RV32IA-WMO-NEXT:    addi a3, a3, -1
19434; RV32IA-WMO-NEXT:    sll a4, a3, a0
19435; RV32IA-WMO-NEXT:    and a1, a1, a3
19436; RV32IA-WMO-NEXT:    sll a1, a1, a0
19437; RV32IA-WMO-NEXT:  .LBB127_1: # =>This Inner Loop Header: Depth=1
19438; RV32IA-WMO-NEXT:    lr.w a3, (a2)
19439; RV32IA-WMO-NEXT:    and a6, a3, a4
19440; RV32IA-WMO-NEXT:    mv a5, a3
19441; RV32IA-WMO-NEXT:    bgeu a1, a6, .LBB127_3
19442; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB127_1 Depth=1
19443; RV32IA-WMO-NEXT:    xor a5, a3, a1
19444; RV32IA-WMO-NEXT:    and a5, a5, a4
19445; RV32IA-WMO-NEXT:    xor a5, a3, a5
19446; RV32IA-WMO-NEXT:  .LBB127_3: # in Loop: Header=BB127_1 Depth=1
19447; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
19448; RV32IA-WMO-NEXT:    bnez a5, .LBB127_1
19449; RV32IA-WMO-NEXT:  # %bb.4:
19450; RV32IA-WMO-NEXT:    srl a0, a3, a0
19451; RV32IA-WMO-NEXT:    ret
19452;
19453; RV32IA-TSO-LABEL: atomicrmw_umin_i16_release:
19454; RV32IA-TSO:       # %bb.0:
19455; RV32IA-TSO-NEXT:    andi a2, a0, -4
19456; RV32IA-TSO-NEXT:    slli a0, a0, 3
19457; RV32IA-TSO-NEXT:    lui a3, 16
19458; RV32IA-TSO-NEXT:    addi a3, a3, -1
19459; RV32IA-TSO-NEXT:    sll a4, a3, a0
19460; RV32IA-TSO-NEXT:    and a1, a1, a3
19461; RV32IA-TSO-NEXT:    sll a1, a1, a0
19462; RV32IA-TSO-NEXT:  .LBB127_1: # =>This Inner Loop Header: Depth=1
19463; RV32IA-TSO-NEXT:    lr.w a3, (a2)
19464; RV32IA-TSO-NEXT:    and a6, a3, a4
19465; RV32IA-TSO-NEXT:    mv a5, a3
19466; RV32IA-TSO-NEXT:    bgeu a1, a6, .LBB127_3
19467; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB127_1 Depth=1
19468; RV32IA-TSO-NEXT:    xor a5, a3, a1
19469; RV32IA-TSO-NEXT:    and a5, a5, a4
19470; RV32IA-TSO-NEXT:    xor a5, a3, a5
19471; RV32IA-TSO-NEXT:  .LBB127_3: # in Loop: Header=BB127_1 Depth=1
19472; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
19473; RV32IA-TSO-NEXT:    bnez a5, .LBB127_1
19474; RV32IA-TSO-NEXT:  # %bb.4:
19475; RV32IA-TSO-NEXT:    srl a0, a3, a0
19476; RV32IA-TSO-NEXT:    ret
19477;
19478; RV64I-LABEL: atomicrmw_umin_i16_release:
19479; RV64I:       # %bb.0:
19480; RV64I-NEXT:    addi sp, sp, -48
19481; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
19482; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
19483; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
19484; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
19485; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
19486; RV64I-NEXT:    mv s0, a1
19487; RV64I-NEXT:    mv s1, a0
19488; RV64I-NEXT:    lhu a1, 0(a0)
19489; RV64I-NEXT:    lui s2, 16
19490; RV64I-NEXT:    addiw s2, s2, -1
19491; RV64I-NEXT:    and s3, s0, s2
19492; RV64I-NEXT:    j .LBB127_2
19493; RV64I-NEXT:  .LBB127_1: # %atomicrmw.start
19494; RV64I-NEXT:    # in Loop: Header=BB127_2 Depth=1
19495; RV64I-NEXT:    sh a1, 6(sp)
19496; RV64I-NEXT:    addi a1, sp, 6
19497; RV64I-NEXT:    li a3, 3
19498; RV64I-NEXT:    mv a0, s1
19499; RV64I-NEXT:    li a4, 0
19500; RV64I-NEXT:    call __atomic_compare_exchange_2
19501; RV64I-NEXT:    lh a1, 6(sp)
19502; RV64I-NEXT:    bnez a0, .LBB127_4
19503; RV64I-NEXT:  .LBB127_2: # %atomicrmw.start
19504; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
19505; RV64I-NEXT:    and a0, a1, s2
19506; RV64I-NEXT:    mv a2, a1
19507; RV64I-NEXT:    bgeu s3, a0, .LBB127_1
19508; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
19509; RV64I-NEXT:    # in Loop: Header=BB127_2 Depth=1
19510; RV64I-NEXT:    mv a2, s0
19511; RV64I-NEXT:    j .LBB127_1
19512; RV64I-NEXT:  .LBB127_4: # %atomicrmw.end
19513; RV64I-NEXT:    mv a0, a1
19514; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
19515; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
19516; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
19517; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
19518; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
19519; RV64I-NEXT:    addi sp, sp, 48
19520; RV64I-NEXT:    ret
19521;
19522; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_release:
19523; RV64IA-WMO-NOZACAS:       # %bb.0:
19524; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
19525; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
19526; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
19527; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
19528; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
19529; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
19530; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
19531; RV64IA-WMO-NOZACAS-NEXT:  .LBB127_1: # =>This Inner Loop Header: Depth=1
19532; RV64IA-WMO-NOZACAS-NEXT:    lr.w a3, (a2)
19533; RV64IA-WMO-NOZACAS-NEXT:    and a6, a3, a4
19534; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a3
19535; RV64IA-WMO-NOZACAS-NEXT:    bgeu a1, a6, .LBB127_3
19536; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB127_1 Depth=1
19537; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a1
19538; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
19539; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
19540; RV64IA-WMO-NOZACAS-NEXT:  .LBB127_3: # in Loop: Header=BB127_1 Depth=1
19541; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
19542; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB127_1
19543; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
19544; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
19545; RV64IA-WMO-NOZACAS-NEXT:    ret
19546;
19547; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_release:
19548; RV64IA-TSO-NOZACAS:       # %bb.0:
19549; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
19550; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
19551; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
19552; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
19553; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
19554; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
19555; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
19556; RV64IA-TSO-NOZACAS-NEXT:  .LBB127_1: # =>This Inner Loop Header: Depth=1
19557; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
19558; RV64IA-TSO-NOZACAS-NEXT:    and a6, a3, a4
19559; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a3
19560; RV64IA-TSO-NOZACAS-NEXT:    bgeu a1, a6, .LBB127_3
19561; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB127_1 Depth=1
19562; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a1
19563; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
19564; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
19565; RV64IA-TSO-NOZACAS-NEXT:  .LBB127_3: # in Loop: Header=BB127_1 Depth=1
19566; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
19567; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB127_1
19568; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
19569; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
19570; RV64IA-TSO-NOZACAS-NEXT:    ret
19571;
19572; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_release:
19573; RV64IA-WMO-ZACAS:       # %bb.0:
19574; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
19575; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
19576; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
19577; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
19578; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
19579; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
19580; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
19581; RV64IA-WMO-ZACAS-NEXT:  .LBB127_1: # =>This Inner Loop Header: Depth=1
19582; RV64IA-WMO-ZACAS-NEXT:    lr.w a3, (a2)
19583; RV64IA-WMO-ZACAS-NEXT:    and a6, a3, a4
19584; RV64IA-WMO-ZACAS-NEXT:    mv a5, a3
19585; RV64IA-WMO-ZACAS-NEXT:    bgeu a1, a6, .LBB127_3
19586; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB127_1 Depth=1
19587; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a1
19588; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
19589; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
19590; RV64IA-WMO-ZACAS-NEXT:  .LBB127_3: # in Loop: Header=BB127_1 Depth=1
19591; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
19592; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB127_1
19593; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
19594; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
19595; RV64IA-WMO-ZACAS-NEXT:    ret
19596;
19597; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_release:
19598; RV64IA-TSO-ZACAS:       # %bb.0:
19599; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
19600; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
19601; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
19602; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
19603; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
19604; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
19605; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
19606; RV64IA-TSO-ZACAS-NEXT:  .LBB127_1: # =>This Inner Loop Header: Depth=1
19607; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
19608; RV64IA-TSO-ZACAS-NEXT:    and a6, a3, a4
19609; RV64IA-TSO-ZACAS-NEXT:    mv a5, a3
19610; RV64IA-TSO-ZACAS-NEXT:    bgeu a1, a6, .LBB127_3
19611; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB127_1 Depth=1
19612; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a1
19613; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
19614; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
19615; RV64IA-TSO-ZACAS-NEXT:  .LBB127_3: # in Loop: Header=BB127_1 Depth=1
19616; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
19617; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB127_1
19618; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
19619; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
19620; RV64IA-TSO-ZACAS-NEXT:    ret
19621;
19622; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_release:
19623; RV64IA-WMO-ZABHA:       # %bb.0:
19624; RV64IA-WMO-ZABHA-NEXT:    amominu.h.rl a0, a1, (a0)
19625; RV64IA-WMO-ZABHA-NEXT:    ret
19626;
19627; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_release:
19628; RV64IA-TSO-ZABHA:       # %bb.0:
19629; RV64IA-TSO-ZABHA-NEXT:    amominu.h a0, a1, (a0)
19630; RV64IA-TSO-ZABHA-NEXT:    ret
19631  %1 = atomicrmw umin ptr %a, i16 %b release
19632  ret i16 %1
19633}
19634
19635define i16 @atomicrmw_umin_i16_acq_rel(ptr %a, i16 %b) nounwind {
19636; RV32I-LABEL: atomicrmw_umin_i16_acq_rel:
19637; RV32I:       # %bb.0:
19638; RV32I-NEXT:    addi sp, sp, -32
19639; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
19640; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
19641; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
19642; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
19643; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
19644; RV32I-NEXT:    mv s0, a1
19645; RV32I-NEXT:    mv s1, a0
19646; RV32I-NEXT:    lhu a1, 0(a0)
19647; RV32I-NEXT:    lui s2, 16
19648; RV32I-NEXT:    addi s2, s2, -1
19649; RV32I-NEXT:    and s3, s0, s2
19650; RV32I-NEXT:    j .LBB128_2
19651; RV32I-NEXT:  .LBB128_1: # %atomicrmw.start
19652; RV32I-NEXT:    # in Loop: Header=BB128_2 Depth=1
19653; RV32I-NEXT:    sh a1, 10(sp)
19654; RV32I-NEXT:    addi a1, sp, 10
19655; RV32I-NEXT:    li a3, 4
19656; RV32I-NEXT:    li a4, 2
19657; RV32I-NEXT:    mv a0, s1
19658; RV32I-NEXT:    call __atomic_compare_exchange_2
19659; RV32I-NEXT:    lh a1, 10(sp)
19660; RV32I-NEXT:    bnez a0, .LBB128_4
19661; RV32I-NEXT:  .LBB128_2: # %atomicrmw.start
19662; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
19663; RV32I-NEXT:    and a0, a1, s2
19664; RV32I-NEXT:    mv a2, a1
19665; RV32I-NEXT:    bgeu s3, a0, .LBB128_1
19666; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
19667; RV32I-NEXT:    # in Loop: Header=BB128_2 Depth=1
19668; RV32I-NEXT:    mv a2, s0
19669; RV32I-NEXT:    j .LBB128_1
19670; RV32I-NEXT:  .LBB128_4: # %atomicrmw.end
19671; RV32I-NEXT:    mv a0, a1
19672; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
19673; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
19674; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
19675; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
19676; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
19677; RV32I-NEXT:    addi sp, sp, 32
19678; RV32I-NEXT:    ret
19679;
19680; RV32IA-WMO-LABEL: atomicrmw_umin_i16_acq_rel:
19681; RV32IA-WMO:       # %bb.0:
19682; RV32IA-WMO-NEXT:    andi a2, a0, -4
19683; RV32IA-WMO-NEXT:    slli a0, a0, 3
19684; RV32IA-WMO-NEXT:    lui a3, 16
19685; RV32IA-WMO-NEXT:    addi a3, a3, -1
19686; RV32IA-WMO-NEXT:    sll a4, a3, a0
19687; RV32IA-WMO-NEXT:    and a1, a1, a3
19688; RV32IA-WMO-NEXT:    sll a1, a1, a0
19689; RV32IA-WMO-NEXT:  .LBB128_1: # =>This Inner Loop Header: Depth=1
19690; RV32IA-WMO-NEXT:    lr.w.aq a3, (a2)
19691; RV32IA-WMO-NEXT:    and a6, a3, a4
19692; RV32IA-WMO-NEXT:    mv a5, a3
19693; RV32IA-WMO-NEXT:    bgeu a1, a6, .LBB128_3
19694; RV32IA-WMO-NEXT:  # %bb.2: # in Loop: Header=BB128_1 Depth=1
19695; RV32IA-WMO-NEXT:    xor a5, a3, a1
19696; RV32IA-WMO-NEXT:    and a5, a5, a4
19697; RV32IA-WMO-NEXT:    xor a5, a3, a5
19698; RV32IA-WMO-NEXT:  .LBB128_3: # in Loop: Header=BB128_1 Depth=1
19699; RV32IA-WMO-NEXT:    sc.w.rl a5, a5, (a2)
19700; RV32IA-WMO-NEXT:    bnez a5, .LBB128_1
19701; RV32IA-WMO-NEXT:  # %bb.4:
19702; RV32IA-WMO-NEXT:    srl a0, a3, a0
19703; RV32IA-WMO-NEXT:    ret
19704;
19705; RV32IA-TSO-LABEL: atomicrmw_umin_i16_acq_rel:
19706; RV32IA-TSO:       # %bb.0:
19707; RV32IA-TSO-NEXT:    andi a2, a0, -4
19708; RV32IA-TSO-NEXT:    slli a0, a0, 3
19709; RV32IA-TSO-NEXT:    lui a3, 16
19710; RV32IA-TSO-NEXT:    addi a3, a3, -1
19711; RV32IA-TSO-NEXT:    sll a4, a3, a0
19712; RV32IA-TSO-NEXT:    and a1, a1, a3
19713; RV32IA-TSO-NEXT:    sll a1, a1, a0
19714; RV32IA-TSO-NEXT:  .LBB128_1: # =>This Inner Loop Header: Depth=1
19715; RV32IA-TSO-NEXT:    lr.w a3, (a2)
19716; RV32IA-TSO-NEXT:    and a6, a3, a4
19717; RV32IA-TSO-NEXT:    mv a5, a3
19718; RV32IA-TSO-NEXT:    bgeu a1, a6, .LBB128_3
19719; RV32IA-TSO-NEXT:  # %bb.2: # in Loop: Header=BB128_1 Depth=1
19720; RV32IA-TSO-NEXT:    xor a5, a3, a1
19721; RV32IA-TSO-NEXT:    and a5, a5, a4
19722; RV32IA-TSO-NEXT:    xor a5, a3, a5
19723; RV32IA-TSO-NEXT:  .LBB128_3: # in Loop: Header=BB128_1 Depth=1
19724; RV32IA-TSO-NEXT:    sc.w a5, a5, (a2)
19725; RV32IA-TSO-NEXT:    bnez a5, .LBB128_1
19726; RV32IA-TSO-NEXT:  # %bb.4:
19727; RV32IA-TSO-NEXT:    srl a0, a3, a0
19728; RV32IA-TSO-NEXT:    ret
19729;
19730; RV64I-LABEL: atomicrmw_umin_i16_acq_rel:
19731; RV64I:       # %bb.0:
19732; RV64I-NEXT:    addi sp, sp, -48
19733; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
19734; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
19735; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
19736; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
19737; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
19738; RV64I-NEXT:    mv s0, a1
19739; RV64I-NEXT:    mv s1, a0
19740; RV64I-NEXT:    lhu a1, 0(a0)
19741; RV64I-NEXT:    lui s2, 16
19742; RV64I-NEXT:    addiw s2, s2, -1
19743; RV64I-NEXT:    and s3, s0, s2
19744; RV64I-NEXT:    j .LBB128_2
19745; RV64I-NEXT:  .LBB128_1: # %atomicrmw.start
19746; RV64I-NEXT:    # in Loop: Header=BB128_2 Depth=1
19747; RV64I-NEXT:    sh a1, 6(sp)
19748; RV64I-NEXT:    addi a1, sp, 6
19749; RV64I-NEXT:    li a3, 4
19750; RV64I-NEXT:    li a4, 2
19751; RV64I-NEXT:    mv a0, s1
19752; RV64I-NEXT:    call __atomic_compare_exchange_2
19753; RV64I-NEXT:    lh a1, 6(sp)
19754; RV64I-NEXT:    bnez a0, .LBB128_4
19755; RV64I-NEXT:  .LBB128_2: # %atomicrmw.start
19756; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
19757; RV64I-NEXT:    and a0, a1, s2
19758; RV64I-NEXT:    mv a2, a1
19759; RV64I-NEXT:    bgeu s3, a0, .LBB128_1
19760; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
19761; RV64I-NEXT:    # in Loop: Header=BB128_2 Depth=1
19762; RV64I-NEXT:    mv a2, s0
19763; RV64I-NEXT:    j .LBB128_1
19764; RV64I-NEXT:  .LBB128_4: # %atomicrmw.end
19765; RV64I-NEXT:    mv a0, a1
19766; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
19767; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
19768; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
19769; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
19770; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
19771; RV64I-NEXT:    addi sp, sp, 48
19772; RV64I-NEXT:    ret
19773;
19774; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
19775; RV64IA-WMO-NOZACAS:       # %bb.0:
19776; RV64IA-WMO-NOZACAS-NEXT:    andi a2, a0, -4
19777; RV64IA-WMO-NOZACAS-NEXT:    slli a0, a0, 3
19778; RV64IA-WMO-NOZACAS-NEXT:    lui a3, 16
19779; RV64IA-WMO-NOZACAS-NEXT:    addi a3, a3, -1
19780; RV64IA-WMO-NOZACAS-NEXT:    sllw a4, a3, a0
19781; RV64IA-WMO-NOZACAS-NEXT:    and a1, a1, a3
19782; RV64IA-WMO-NOZACAS-NEXT:    sllw a1, a1, a0
19783; RV64IA-WMO-NOZACAS-NEXT:  .LBB128_1: # =>This Inner Loop Header: Depth=1
19784; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a3, (a2)
19785; RV64IA-WMO-NOZACAS-NEXT:    and a6, a3, a4
19786; RV64IA-WMO-NOZACAS-NEXT:    mv a5, a3
19787; RV64IA-WMO-NOZACAS-NEXT:    bgeu a1, a6, .LBB128_3
19788; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB128_1 Depth=1
19789; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a1
19790; RV64IA-WMO-NOZACAS-NEXT:    and a5, a5, a4
19791; RV64IA-WMO-NOZACAS-NEXT:    xor a5, a3, a5
19792; RV64IA-WMO-NOZACAS-NEXT:  .LBB128_3: # in Loop: Header=BB128_1 Depth=1
19793; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
19794; RV64IA-WMO-NOZACAS-NEXT:    bnez a5, .LBB128_1
19795; RV64IA-WMO-NOZACAS-NEXT:  # %bb.4:
19796; RV64IA-WMO-NOZACAS-NEXT:    srlw a0, a3, a0
19797; RV64IA-WMO-NOZACAS-NEXT:    ret
19798;
19799; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
19800; RV64IA-TSO-NOZACAS:       # %bb.0:
19801; RV64IA-TSO-NOZACAS-NEXT:    andi a2, a0, -4
19802; RV64IA-TSO-NOZACAS-NEXT:    slli a0, a0, 3
19803; RV64IA-TSO-NOZACAS-NEXT:    lui a3, 16
19804; RV64IA-TSO-NOZACAS-NEXT:    addi a3, a3, -1
19805; RV64IA-TSO-NOZACAS-NEXT:    sllw a4, a3, a0
19806; RV64IA-TSO-NOZACAS-NEXT:    and a1, a1, a3
19807; RV64IA-TSO-NOZACAS-NEXT:    sllw a1, a1, a0
19808; RV64IA-TSO-NOZACAS-NEXT:  .LBB128_1: # =>This Inner Loop Header: Depth=1
19809; RV64IA-TSO-NOZACAS-NEXT:    lr.w a3, (a2)
19810; RV64IA-TSO-NOZACAS-NEXT:    and a6, a3, a4
19811; RV64IA-TSO-NOZACAS-NEXT:    mv a5, a3
19812; RV64IA-TSO-NOZACAS-NEXT:    bgeu a1, a6, .LBB128_3
19813; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB128_1 Depth=1
19814; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a1
19815; RV64IA-TSO-NOZACAS-NEXT:    and a5, a5, a4
19816; RV64IA-TSO-NOZACAS-NEXT:    xor a5, a3, a5
19817; RV64IA-TSO-NOZACAS-NEXT:  .LBB128_3: # in Loop: Header=BB128_1 Depth=1
19818; RV64IA-TSO-NOZACAS-NEXT:    sc.w a5, a5, (a2)
19819; RV64IA-TSO-NOZACAS-NEXT:    bnez a5, .LBB128_1
19820; RV64IA-TSO-NOZACAS-NEXT:  # %bb.4:
19821; RV64IA-TSO-NOZACAS-NEXT:    srlw a0, a3, a0
19822; RV64IA-TSO-NOZACAS-NEXT:    ret
19823;
19824; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
19825; RV64IA-WMO-ZACAS:       # %bb.0:
19826; RV64IA-WMO-ZACAS-NEXT:    andi a2, a0, -4
19827; RV64IA-WMO-ZACAS-NEXT:    slli a0, a0, 3
19828; RV64IA-WMO-ZACAS-NEXT:    lui a3, 16
19829; RV64IA-WMO-ZACAS-NEXT:    addi a3, a3, -1
19830; RV64IA-WMO-ZACAS-NEXT:    sllw a4, a3, a0
19831; RV64IA-WMO-ZACAS-NEXT:    and a1, a1, a3
19832; RV64IA-WMO-ZACAS-NEXT:    sllw a1, a1, a0
19833; RV64IA-WMO-ZACAS-NEXT:  .LBB128_1: # =>This Inner Loop Header: Depth=1
19834; RV64IA-WMO-ZACAS-NEXT:    lr.w.aq a3, (a2)
19835; RV64IA-WMO-ZACAS-NEXT:    and a6, a3, a4
19836; RV64IA-WMO-ZACAS-NEXT:    mv a5, a3
19837; RV64IA-WMO-ZACAS-NEXT:    bgeu a1, a6, .LBB128_3
19838; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB128_1 Depth=1
19839; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a1
19840; RV64IA-WMO-ZACAS-NEXT:    and a5, a5, a4
19841; RV64IA-WMO-ZACAS-NEXT:    xor a5, a3, a5
19842; RV64IA-WMO-ZACAS-NEXT:  .LBB128_3: # in Loop: Header=BB128_1 Depth=1
19843; RV64IA-WMO-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
19844; RV64IA-WMO-ZACAS-NEXT:    bnez a5, .LBB128_1
19845; RV64IA-WMO-ZACAS-NEXT:  # %bb.4:
19846; RV64IA-WMO-ZACAS-NEXT:    srlw a0, a3, a0
19847; RV64IA-WMO-ZACAS-NEXT:    ret
19848;
19849; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
19850; RV64IA-TSO-ZACAS:       # %bb.0:
19851; RV64IA-TSO-ZACAS-NEXT:    andi a2, a0, -4
19852; RV64IA-TSO-ZACAS-NEXT:    slli a0, a0, 3
19853; RV64IA-TSO-ZACAS-NEXT:    lui a3, 16
19854; RV64IA-TSO-ZACAS-NEXT:    addi a3, a3, -1
19855; RV64IA-TSO-ZACAS-NEXT:    sllw a4, a3, a0
19856; RV64IA-TSO-ZACAS-NEXT:    and a1, a1, a3
19857; RV64IA-TSO-ZACAS-NEXT:    sllw a1, a1, a0
19858; RV64IA-TSO-ZACAS-NEXT:  .LBB128_1: # =>This Inner Loop Header: Depth=1
19859; RV64IA-TSO-ZACAS-NEXT:    lr.w a3, (a2)
19860; RV64IA-TSO-ZACAS-NEXT:    and a6, a3, a4
19861; RV64IA-TSO-ZACAS-NEXT:    mv a5, a3
19862; RV64IA-TSO-ZACAS-NEXT:    bgeu a1, a6, .LBB128_3
19863; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB128_1 Depth=1
19864; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a1
19865; RV64IA-TSO-ZACAS-NEXT:    and a5, a5, a4
19866; RV64IA-TSO-ZACAS-NEXT:    xor a5, a3, a5
19867; RV64IA-TSO-ZACAS-NEXT:  .LBB128_3: # in Loop: Header=BB128_1 Depth=1
19868; RV64IA-TSO-ZACAS-NEXT:    sc.w a5, a5, (a2)
19869; RV64IA-TSO-ZACAS-NEXT:    bnez a5, .LBB128_1
19870; RV64IA-TSO-ZACAS-NEXT:  # %bb.4:
19871; RV64IA-TSO-ZACAS-NEXT:    srlw a0, a3, a0
19872; RV64IA-TSO-ZACAS-NEXT:    ret
19873;
19874; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_acq_rel:
19875; RV64IA-WMO-ZABHA:       # %bb.0:
19876; RV64IA-WMO-ZABHA-NEXT:    amominu.h.aqrl a0, a1, (a0)
19877; RV64IA-WMO-ZABHA-NEXT:    ret
19878;
19879; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_acq_rel:
19880; RV64IA-TSO-ZABHA:       # %bb.0:
19881; RV64IA-TSO-ZABHA-NEXT:    amominu.h a0, a1, (a0)
19882; RV64IA-TSO-ZABHA-NEXT:    ret
19883  %1 = atomicrmw umin ptr %a, i16 %b acq_rel
19884  ret i16 %1
19885}
19886
19887define i16 @atomicrmw_umin_i16_seq_cst(ptr %a, i16 %b) nounwind {
19888; RV32I-LABEL: atomicrmw_umin_i16_seq_cst:
19889; RV32I:       # %bb.0:
19890; RV32I-NEXT:    addi sp, sp, -32
19891; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
19892; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
19893; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
19894; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
19895; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
19896; RV32I-NEXT:    mv s0, a1
19897; RV32I-NEXT:    mv s1, a0
19898; RV32I-NEXT:    lhu a1, 0(a0)
19899; RV32I-NEXT:    lui s2, 16
19900; RV32I-NEXT:    addi s2, s2, -1
19901; RV32I-NEXT:    and s3, s0, s2
19902; RV32I-NEXT:    j .LBB129_2
19903; RV32I-NEXT:  .LBB129_1: # %atomicrmw.start
19904; RV32I-NEXT:    # in Loop: Header=BB129_2 Depth=1
19905; RV32I-NEXT:    sh a1, 10(sp)
19906; RV32I-NEXT:    addi a1, sp, 10
19907; RV32I-NEXT:    li a3, 5
19908; RV32I-NEXT:    li a4, 5
19909; RV32I-NEXT:    mv a0, s1
19910; RV32I-NEXT:    call __atomic_compare_exchange_2
19911; RV32I-NEXT:    lh a1, 10(sp)
19912; RV32I-NEXT:    bnez a0, .LBB129_4
19913; RV32I-NEXT:  .LBB129_2: # %atomicrmw.start
19914; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
19915; RV32I-NEXT:    and a0, a1, s2
19916; RV32I-NEXT:    mv a2, a1
19917; RV32I-NEXT:    bgeu s3, a0, .LBB129_1
19918; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
19919; RV32I-NEXT:    # in Loop: Header=BB129_2 Depth=1
19920; RV32I-NEXT:    mv a2, s0
19921; RV32I-NEXT:    j .LBB129_1
19922; RV32I-NEXT:  .LBB129_4: # %atomicrmw.end
19923; RV32I-NEXT:    mv a0, a1
19924; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
19925; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
19926; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
19927; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
19928; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
19929; RV32I-NEXT:    addi sp, sp, 32
19930; RV32I-NEXT:    ret
19931;
19932; RV32IA-LABEL: atomicrmw_umin_i16_seq_cst:
19933; RV32IA:       # %bb.0:
19934; RV32IA-NEXT:    andi a2, a0, -4
19935; RV32IA-NEXT:    slli a0, a0, 3
19936; RV32IA-NEXT:    lui a3, 16
19937; RV32IA-NEXT:    addi a3, a3, -1
19938; RV32IA-NEXT:    sll a4, a3, a0
19939; RV32IA-NEXT:    and a1, a1, a3
19940; RV32IA-NEXT:    sll a1, a1, a0
19941; RV32IA-NEXT:  .LBB129_1: # =>This Inner Loop Header: Depth=1
19942; RV32IA-NEXT:    lr.w.aqrl a3, (a2)
19943; RV32IA-NEXT:    and a6, a3, a4
19944; RV32IA-NEXT:    mv a5, a3
19945; RV32IA-NEXT:    bgeu a1, a6, .LBB129_3
19946; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB129_1 Depth=1
19947; RV32IA-NEXT:    xor a5, a3, a1
19948; RV32IA-NEXT:    and a5, a5, a4
19949; RV32IA-NEXT:    xor a5, a3, a5
19950; RV32IA-NEXT:  .LBB129_3: # in Loop: Header=BB129_1 Depth=1
19951; RV32IA-NEXT:    sc.w.rl a5, a5, (a2)
19952; RV32IA-NEXT:    bnez a5, .LBB129_1
19953; RV32IA-NEXT:  # %bb.4:
19954; RV32IA-NEXT:    srl a0, a3, a0
19955; RV32IA-NEXT:    ret
19956;
19957; RV64I-LABEL: atomicrmw_umin_i16_seq_cst:
19958; RV64I:       # %bb.0:
19959; RV64I-NEXT:    addi sp, sp, -48
19960; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
19961; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
19962; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
19963; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
19964; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
19965; RV64I-NEXT:    mv s0, a1
19966; RV64I-NEXT:    mv s1, a0
19967; RV64I-NEXT:    lhu a1, 0(a0)
19968; RV64I-NEXT:    lui s2, 16
19969; RV64I-NEXT:    addiw s2, s2, -1
19970; RV64I-NEXT:    and s3, s0, s2
19971; RV64I-NEXT:    j .LBB129_2
19972; RV64I-NEXT:  .LBB129_1: # %atomicrmw.start
19973; RV64I-NEXT:    # in Loop: Header=BB129_2 Depth=1
19974; RV64I-NEXT:    sh a1, 6(sp)
19975; RV64I-NEXT:    addi a1, sp, 6
19976; RV64I-NEXT:    li a3, 5
19977; RV64I-NEXT:    li a4, 5
19978; RV64I-NEXT:    mv a0, s1
19979; RV64I-NEXT:    call __atomic_compare_exchange_2
19980; RV64I-NEXT:    lh a1, 6(sp)
19981; RV64I-NEXT:    bnez a0, .LBB129_4
19982; RV64I-NEXT:  .LBB129_2: # %atomicrmw.start
19983; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
19984; RV64I-NEXT:    and a0, a1, s2
19985; RV64I-NEXT:    mv a2, a1
19986; RV64I-NEXT:    bgeu s3, a0, .LBB129_1
19987; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
19988; RV64I-NEXT:    # in Loop: Header=BB129_2 Depth=1
19989; RV64I-NEXT:    mv a2, s0
19990; RV64I-NEXT:    j .LBB129_1
19991; RV64I-NEXT:  .LBB129_4: # %atomicrmw.end
19992; RV64I-NEXT:    mv a0, a1
19993; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
19994; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
19995; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
19996; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
19997; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
19998; RV64I-NEXT:    addi sp, sp, 48
19999; RV64I-NEXT:    ret
20000;
20001; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i16_seq_cst:
20002; RV64IA-NOZACAS:       # %bb.0:
20003; RV64IA-NOZACAS-NEXT:    andi a2, a0, -4
20004; RV64IA-NOZACAS-NEXT:    slli a0, a0, 3
20005; RV64IA-NOZACAS-NEXT:    lui a3, 16
20006; RV64IA-NOZACAS-NEXT:    addi a3, a3, -1
20007; RV64IA-NOZACAS-NEXT:    sllw a4, a3, a0
20008; RV64IA-NOZACAS-NEXT:    and a1, a1, a3
20009; RV64IA-NOZACAS-NEXT:    sllw a1, a1, a0
20010; RV64IA-NOZACAS-NEXT:  .LBB129_1: # =>This Inner Loop Header: Depth=1
20011; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a3, (a2)
20012; RV64IA-NOZACAS-NEXT:    and a6, a3, a4
20013; RV64IA-NOZACAS-NEXT:    mv a5, a3
20014; RV64IA-NOZACAS-NEXT:    bgeu a1, a6, .LBB129_3
20015; RV64IA-NOZACAS-NEXT:  # %bb.2: # in Loop: Header=BB129_1 Depth=1
20016; RV64IA-NOZACAS-NEXT:    xor a5, a3, a1
20017; RV64IA-NOZACAS-NEXT:    and a5, a5, a4
20018; RV64IA-NOZACAS-NEXT:    xor a5, a3, a5
20019; RV64IA-NOZACAS-NEXT:  .LBB129_3: # in Loop: Header=BB129_1 Depth=1
20020; RV64IA-NOZACAS-NEXT:    sc.w.rl a5, a5, (a2)
20021; RV64IA-NOZACAS-NEXT:    bnez a5, .LBB129_1
20022; RV64IA-NOZACAS-NEXT:  # %bb.4:
20023; RV64IA-NOZACAS-NEXT:    srlw a0, a3, a0
20024; RV64IA-NOZACAS-NEXT:    ret
20025;
20026; RV64IA-ZACAS-LABEL: atomicrmw_umin_i16_seq_cst:
20027; RV64IA-ZACAS:       # %bb.0:
20028; RV64IA-ZACAS-NEXT:    andi a2, a0, -4
20029; RV64IA-ZACAS-NEXT:    slli a0, a0, 3
20030; RV64IA-ZACAS-NEXT:    lui a3, 16
20031; RV64IA-ZACAS-NEXT:    addi a3, a3, -1
20032; RV64IA-ZACAS-NEXT:    sllw a4, a3, a0
20033; RV64IA-ZACAS-NEXT:    and a1, a1, a3
20034; RV64IA-ZACAS-NEXT:    sllw a1, a1, a0
20035; RV64IA-ZACAS-NEXT:  .LBB129_1: # =>This Inner Loop Header: Depth=1
20036; RV64IA-ZACAS-NEXT:    lr.w.aqrl a3, (a2)
20037; RV64IA-ZACAS-NEXT:    and a6, a3, a4
20038; RV64IA-ZACAS-NEXT:    mv a5, a3
20039; RV64IA-ZACAS-NEXT:    bgeu a1, a6, .LBB129_3
20040; RV64IA-ZACAS-NEXT:  # %bb.2: # in Loop: Header=BB129_1 Depth=1
20041; RV64IA-ZACAS-NEXT:    xor a5, a3, a1
20042; RV64IA-ZACAS-NEXT:    and a5, a5, a4
20043; RV64IA-ZACAS-NEXT:    xor a5, a3, a5
20044; RV64IA-ZACAS-NEXT:  .LBB129_3: # in Loop: Header=BB129_1 Depth=1
20045; RV64IA-ZACAS-NEXT:    sc.w.rl a5, a5, (a2)
20046; RV64IA-ZACAS-NEXT:    bnez a5, .LBB129_1
20047; RV64IA-ZACAS-NEXT:  # %bb.4:
20048; RV64IA-ZACAS-NEXT:    srlw a0, a3, a0
20049; RV64IA-ZACAS-NEXT:    ret
20050;
20051; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_seq_cst:
20052; RV64IA-WMO-ZABHA:       # %bb.0:
20053; RV64IA-WMO-ZABHA-NEXT:    amominu.h.aqrl a0, a1, (a0)
20054; RV64IA-WMO-ZABHA-NEXT:    ret
20055;
20056; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_seq_cst:
20057; RV64IA-TSO-ZABHA:       # %bb.0:
20058; RV64IA-TSO-ZABHA-NEXT:    amominu.h a0, a1, (a0)
20059; RV64IA-TSO-ZABHA-NEXT:    ret
20060  %1 = atomicrmw umin ptr %a, i16 %b seq_cst
20061  ret i16 %1
20062}
20063
20064define i32 @atomicrmw_xchg_i32_monotonic(ptr %a, i32 %b) nounwind {
20065; RV32I-LABEL: atomicrmw_xchg_i32_monotonic:
20066; RV32I:       # %bb.0:
20067; RV32I-NEXT:    addi sp, sp, -16
20068; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20069; RV32I-NEXT:    li a2, 0
20070; RV32I-NEXT:    call __atomic_exchange_4
20071; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20072; RV32I-NEXT:    addi sp, sp, 16
20073; RV32I-NEXT:    ret
20074;
20075; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic:
20076; RV32IA:       # %bb.0:
20077; RV32IA-NEXT:    amoswap.w a0, a1, (a0)
20078; RV32IA-NEXT:    ret
20079;
20080; RV64I-LABEL: atomicrmw_xchg_i32_monotonic:
20081; RV64I:       # %bb.0:
20082; RV64I-NEXT:    addi sp, sp, -16
20083; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20084; RV64I-NEXT:    li a2, 0
20085; RV64I-NEXT:    call __atomic_exchange_4
20086; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20087; RV64I-NEXT:    addi sp, sp, 16
20088; RV64I-NEXT:    ret
20089;
20090; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic:
20091; RV64IA:       # %bb.0:
20092; RV64IA-NEXT:    amoswap.w a0, a1, (a0)
20093; RV64IA-NEXT:    ret
20094  %1 = atomicrmw xchg ptr %a, i32 %b monotonic
20095  ret i32 %1
20096}
20097
20098define i32 @atomicrmw_xchg_i32_acquire(ptr %a, i32 %b) nounwind {
20099; RV32I-LABEL: atomicrmw_xchg_i32_acquire:
20100; RV32I:       # %bb.0:
20101; RV32I-NEXT:    addi sp, sp, -16
20102; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20103; RV32I-NEXT:    li a2, 2
20104; RV32I-NEXT:    call __atomic_exchange_4
20105; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20106; RV32I-NEXT:    addi sp, sp, 16
20107; RV32I-NEXT:    ret
20108;
20109; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_acquire:
20110; RV32IA-WMO:       # %bb.0:
20111; RV32IA-WMO-NEXT:    amoswap.w.aq a0, a1, (a0)
20112; RV32IA-WMO-NEXT:    ret
20113;
20114; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_acquire:
20115; RV32IA-TSO:       # %bb.0:
20116; RV32IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20117; RV32IA-TSO-NEXT:    ret
20118;
20119; RV64I-LABEL: atomicrmw_xchg_i32_acquire:
20120; RV64I:       # %bb.0:
20121; RV64I-NEXT:    addi sp, sp, -16
20122; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20123; RV64I-NEXT:    li a2, 2
20124; RV64I-NEXT:    call __atomic_exchange_4
20125; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20126; RV64I-NEXT:    addi sp, sp, 16
20127; RV64I-NEXT:    ret
20128;
20129; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_acquire:
20130; RV64IA-WMO:       # %bb.0:
20131; RV64IA-WMO-NEXT:    amoswap.w.aq a0, a1, (a0)
20132; RV64IA-WMO-NEXT:    ret
20133;
20134; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_acquire:
20135; RV64IA-TSO:       # %bb.0:
20136; RV64IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20137; RV64IA-TSO-NEXT:    ret
20138  %1 = atomicrmw xchg ptr %a, i32 %b acquire
20139  ret i32 %1
20140}
20141
20142define i32 @atomicrmw_xchg_i32_release(ptr %a, i32 %b) nounwind {
20143; RV32I-LABEL: atomicrmw_xchg_i32_release:
20144; RV32I:       # %bb.0:
20145; RV32I-NEXT:    addi sp, sp, -16
20146; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20147; RV32I-NEXT:    li a2, 3
20148; RV32I-NEXT:    call __atomic_exchange_4
20149; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20150; RV32I-NEXT:    addi sp, sp, 16
20151; RV32I-NEXT:    ret
20152;
20153; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_release:
20154; RV32IA-WMO:       # %bb.0:
20155; RV32IA-WMO-NEXT:    amoswap.w.rl a0, a1, (a0)
20156; RV32IA-WMO-NEXT:    ret
20157;
20158; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_release:
20159; RV32IA-TSO:       # %bb.0:
20160; RV32IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20161; RV32IA-TSO-NEXT:    ret
20162;
20163; RV64I-LABEL: atomicrmw_xchg_i32_release:
20164; RV64I:       # %bb.0:
20165; RV64I-NEXT:    addi sp, sp, -16
20166; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20167; RV64I-NEXT:    li a2, 3
20168; RV64I-NEXT:    call __atomic_exchange_4
20169; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20170; RV64I-NEXT:    addi sp, sp, 16
20171; RV64I-NEXT:    ret
20172;
20173; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_release:
20174; RV64IA-WMO:       # %bb.0:
20175; RV64IA-WMO-NEXT:    amoswap.w.rl a0, a1, (a0)
20176; RV64IA-WMO-NEXT:    ret
20177;
20178; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_release:
20179; RV64IA-TSO:       # %bb.0:
20180; RV64IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20181; RV64IA-TSO-NEXT:    ret
20182  %1 = atomicrmw xchg ptr %a, i32 %b release
20183  ret i32 %1
20184}
20185
20186define i32 @atomicrmw_xchg_i32_acq_rel(ptr %a, i32 %b) nounwind {
20187; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel:
20188; RV32I:       # %bb.0:
20189; RV32I-NEXT:    addi sp, sp, -16
20190; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20191; RV32I-NEXT:    li a2, 4
20192; RV32I-NEXT:    call __atomic_exchange_4
20193; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20194; RV32I-NEXT:    addi sp, sp, 16
20195; RV32I-NEXT:    ret
20196;
20197; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_acq_rel:
20198; RV32IA-WMO:       # %bb.0:
20199; RV32IA-WMO-NEXT:    amoswap.w.aqrl a0, a1, (a0)
20200; RV32IA-WMO-NEXT:    ret
20201;
20202; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_acq_rel:
20203; RV32IA-TSO:       # %bb.0:
20204; RV32IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20205; RV32IA-TSO-NEXT:    ret
20206;
20207; RV64I-LABEL: atomicrmw_xchg_i32_acq_rel:
20208; RV64I:       # %bb.0:
20209; RV64I-NEXT:    addi sp, sp, -16
20210; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20211; RV64I-NEXT:    li a2, 4
20212; RV64I-NEXT:    call __atomic_exchange_4
20213; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20214; RV64I-NEXT:    addi sp, sp, 16
20215; RV64I-NEXT:    ret
20216;
20217; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_acq_rel:
20218; RV64IA-WMO:       # %bb.0:
20219; RV64IA-WMO-NEXT:    amoswap.w.aqrl a0, a1, (a0)
20220; RV64IA-WMO-NEXT:    ret
20221;
20222; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_acq_rel:
20223; RV64IA-TSO:       # %bb.0:
20224; RV64IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20225; RV64IA-TSO-NEXT:    ret
20226  %1 = atomicrmw xchg ptr %a, i32 %b acq_rel
20227  ret i32 %1
20228}
20229
20230define i32 @atomicrmw_xchg_i32_seq_cst(ptr %a, i32 %b) nounwind {
20231; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst:
20232; RV32I:       # %bb.0:
20233; RV32I-NEXT:    addi sp, sp, -16
20234; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20235; RV32I-NEXT:    li a2, 5
20236; RV32I-NEXT:    call __atomic_exchange_4
20237; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20238; RV32I-NEXT:    addi sp, sp, 16
20239; RV32I-NEXT:    ret
20240;
20241; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_seq_cst:
20242; RV32IA-WMO:       # %bb.0:
20243; RV32IA-WMO-NEXT:    amoswap.w.aqrl a0, a1, (a0)
20244; RV32IA-WMO-NEXT:    ret
20245;
20246; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_seq_cst:
20247; RV32IA-TSO:       # %bb.0:
20248; RV32IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20249; RV32IA-TSO-NEXT:    ret
20250;
20251; RV64I-LABEL: atomicrmw_xchg_i32_seq_cst:
20252; RV64I:       # %bb.0:
20253; RV64I-NEXT:    addi sp, sp, -16
20254; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20255; RV64I-NEXT:    li a2, 5
20256; RV64I-NEXT:    call __atomic_exchange_4
20257; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20258; RV64I-NEXT:    addi sp, sp, 16
20259; RV64I-NEXT:    ret
20260;
20261; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_seq_cst:
20262; RV64IA-WMO:       # %bb.0:
20263; RV64IA-WMO-NEXT:    amoswap.w.aqrl a0, a1, (a0)
20264; RV64IA-WMO-NEXT:    ret
20265;
20266; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_seq_cst:
20267; RV64IA-TSO:       # %bb.0:
20268; RV64IA-TSO-NEXT:    amoswap.w a0, a1, (a0)
20269; RV64IA-TSO-NEXT:    ret
20270  %1 = atomicrmw xchg ptr %a, i32 %b seq_cst
20271  ret i32 %1
20272}
20273
20274define i32 @atomicrmw_add_i32_monotonic(ptr %a, i32 %b) nounwind {
20275; RV32I-LABEL: atomicrmw_add_i32_monotonic:
20276; RV32I:       # %bb.0:
20277; RV32I-NEXT:    addi sp, sp, -16
20278; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20279; RV32I-NEXT:    li a2, 0
20280; RV32I-NEXT:    call __atomic_fetch_add_4
20281; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20282; RV32I-NEXT:    addi sp, sp, 16
20283; RV32I-NEXT:    ret
20284;
20285; RV32IA-LABEL: atomicrmw_add_i32_monotonic:
20286; RV32IA:       # %bb.0:
20287; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
20288; RV32IA-NEXT:    ret
20289;
20290; RV64I-LABEL: atomicrmw_add_i32_monotonic:
20291; RV64I:       # %bb.0:
20292; RV64I-NEXT:    addi sp, sp, -16
20293; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20294; RV64I-NEXT:    li a2, 0
20295; RV64I-NEXT:    call __atomic_fetch_add_4
20296; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20297; RV64I-NEXT:    addi sp, sp, 16
20298; RV64I-NEXT:    ret
20299;
20300; RV64IA-LABEL: atomicrmw_add_i32_monotonic:
20301; RV64IA:       # %bb.0:
20302; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
20303; RV64IA-NEXT:    ret
20304  %1 = atomicrmw add ptr %a, i32 %b monotonic
20305  ret i32 %1
20306}
20307
20308define i32 @atomicrmw_add_i32_acquire(ptr %a, i32 %b) nounwind {
20309; RV32I-LABEL: atomicrmw_add_i32_acquire:
20310; RV32I:       # %bb.0:
20311; RV32I-NEXT:    addi sp, sp, -16
20312; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20313; RV32I-NEXT:    li a2, 2
20314; RV32I-NEXT:    call __atomic_fetch_add_4
20315; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20316; RV32I-NEXT:    addi sp, sp, 16
20317; RV32I-NEXT:    ret
20318;
20319; RV32IA-WMO-LABEL: atomicrmw_add_i32_acquire:
20320; RV32IA-WMO:       # %bb.0:
20321; RV32IA-WMO-NEXT:    amoadd.w.aq a0, a1, (a0)
20322; RV32IA-WMO-NEXT:    ret
20323;
20324; RV32IA-TSO-LABEL: atomicrmw_add_i32_acquire:
20325; RV32IA-TSO:       # %bb.0:
20326; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20327; RV32IA-TSO-NEXT:    ret
20328;
20329; RV64I-LABEL: atomicrmw_add_i32_acquire:
20330; RV64I:       # %bb.0:
20331; RV64I-NEXT:    addi sp, sp, -16
20332; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20333; RV64I-NEXT:    li a2, 2
20334; RV64I-NEXT:    call __atomic_fetch_add_4
20335; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20336; RV64I-NEXT:    addi sp, sp, 16
20337; RV64I-NEXT:    ret
20338;
20339; RV64IA-WMO-LABEL: atomicrmw_add_i32_acquire:
20340; RV64IA-WMO:       # %bb.0:
20341; RV64IA-WMO-NEXT:    amoadd.w.aq a0, a1, (a0)
20342; RV64IA-WMO-NEXT:    ret
20343;
20344; RV64IA-TSO-LABEL: atomicrmw_add_i32_acquire:
20345; RV64IA-TSO:       # %bb.0:
20346; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20347; RV64IA-TSO-NEXT:    ret
20348  %1 = atomicrmw add ptr %a, i32 %b acquire
20349  ret i32 %1
20350}
20351
20352define i32 @atomicrmw_add_i32_release(ptr %a, i32 %b) nounwind {
20353; RV32I-LABEL: atomicrmw_add_i32_release:
20354; RV32I:       # %bb.0:
20355; RV32I-NEXT:    addi sp, sp, -16
20356; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20357; RV32I-NEXT:    li a2, 3
20358; RV32I-NEXT:    call __atomic_fetch_add_4
20359; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20360; RV32I-NEXT:    addi sp, sp, 16
20361; RV32I-NEXT:    ret
20362;
20363; RV32IA-WMO-LABEL: atomicrmw_add_i32_release:
20364; RV32IA-WMO:       # %bb.0:
20365; RV32IA-WMO-NEXT:    amoadd.w.rl a0, a1, (a0)
20366; RV32IA-WMO-NEXT:    ret
20367;
20368; RV32IA-TSO-LABEL: atomicrmw_add_i32_release:
20369; RV32IA-TSO:       # %bb.0:
20370; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20371; RV32IA-TSO-NEXT:    ret
20372;
20373; RV64I-LABEL: atomicrmw_add_i32_release:
20374; RV64I:       # %bb.0:
20375; RV64I-NEXT:    addi sp, sp, -16
20376; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20377; RV64I-NEXT:    li a2, 3
20378; RV64I-NEXT:    call __atomic_fetch_add_4
20379; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20380; RV64I-NEXT:    addi sp, sp, 16
20381; RV64I-NEXT:    ret
20382;
20383; RV64IA-WMO-LABEL: atomicrmw_add_i32_release:
20384; RV64IA-WMO:       # %bb.0:
20385; RV64IA-WMO-NEXT:    amoadd.w.rl a0, a1, (a0)
20386; RV64IA-WMO-NEXT:    ret
20387;
20388; RV64IA-TSO-LABEL: atomicrmw_add_i32_release:
20389; RV64IA-TSO:       # %bb.0:
20390; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20391; RV64IA-TSO-NEXT:    ret
20392  %1 = atomicrmw add ptr %a, i32 %b release
20393  ret i32 %1
20394}
20395
20396define i32 @atomicrmw_add_i32_acq_rel(ptr %a, i32 %b) nounwind {
20397; RV32I-LABEL: atomicrmw_add_i32_acq_rel:
20398; RV32I:       # %bb.0:
20399; RV32I-NEXT:    addi sp, sp, -16
20400; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20401; RV32I-NEXT:    li a2, 4
20402; RV32I-NEXT:    call __atomic_fetch_add_4
20403; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20404; RV32I-NEXT:    addi sp, sp, 16
20405; RV32I-NEXT:    ret
20406;
20407; RV32IA-WMO-LABEL: atomicrmw_add_i32_acq_rel:
20408; RV32IA-WMO:       # %bb.0:
20409; RV32IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20410; RV32IA-WMO-NEXT:    ret
20411;
20412; RV32IA-TSO-LABEL: atomicrmw_add_i32_acq_rel:
20413; RV32IA-TSO:       # %bb.0:
20414; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20415; RV32IA-TSO-NEXT:    ret
20416;
20417; RV64I-LABEL: atomicrmw_add_i32_acq_rel:
20418; RV64I:       # %bb.0:
20419; RV64I-NEXT:    addi sp, sp, -16
20420; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20421; RV64I-NEXT:    li a2, 4
20422; RV64I-NEXT:    call __atomic_fetch_add_4
20423; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20424; RV64I-NEXT:    addi sp, sp, 16
20425; RV64I-NEXT:    ret
20426;
20427; RV64IA-WMO-LABEL: atomicrmw_add_i32_acq_rel:
20428; RV64IA-WMO:       # %bb.0:
20429; RV64IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20430; RV64IA-WMO-NEXT:    ret
20431;
20432; RV64IA-TSO-LABEL: atomicrmw_add_i32_acq_rel:
20433; RV64IA-TSO:       # %bb.0:
20434; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20435; RV64IA-TSO-NEXT:    ret
20436  %1 = atomicrmw add ptr %a, i32 %b acq_rel
20437  ret i32 %1
20438}
20439
20440define i32 @atomicrmw_add_i32_seq_cst(ptr %a, i32 %b) nounwind {
20441; RV32I-LABEL: atomicrmw_add_i32_seq_cst:
20442; RV32I:       # %bb.0:
20443; RV32I-NEXT:    addi sp, sp, -16
20444; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20445; RV32I-NEXT:    li a2, 5
20446; RV32I-NEXT:    call __atomic_fetch_add_4
20447; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20448; RV32I-NEXT:    addi sp, sp, 16
20449; RV32I-NEXT:    ret
20450;
20451; RV32IA-WMO-LABEL: atomicrmw_add_i32_seq_cst:
20452; RV32IA-WMO:       # %bb.0:
20453; RV32IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20454; RV32IA-WMO-NEXT:    ret
20455;
20456; RV32IA-TSO-LABEL: atomicrmw_add_i32_seq_cst:
20457; RV32IA-TSO:       # %bb.0:
20458; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20459; RV32IA-TSO-NEXT:    ret
20460;
20461; RV64I-LABEL: atomicrmw_add_i32_seq_cst:
20462; RV64I:       # %bb.0:
20463; RV64I-NEXT:    addi sp, sp, -16
20464; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20465; RV64I-NEXT:    li a2, 5
20466; RV64I-NEXT:    call __atomic_fetch_add_4
20467; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20468; RV64I-NEXT:    addi sp, sp, 16
20469; RV64I-NEXT:    ret
20470;
20471; RV64IA-WMO-LABEL: atomicrmw_add_i32_seq_cst:
20472; RV64IA-WMO:       # %bb.0:
20473; RV64IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20474; RV64IA-WMO-NEXT:    ret
20475;
20476; RV64IA-TSO-LABEL: atomicrmw_add_i32_seq_cst:
20477; RV64IA-TSO:       # %bb.0:
20478; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20479; RV64IA-TSO-NEXT:    ret
20480  %1 = atomicrmw add ptr %a, i32 %b seq_cst
20481  ret i32 %1
20482}
20483
20484define i32 @atomicrmw_sub_i32_monotonic(ptr %a, i32 %b) nounwind {
20485; RV32I-LABEL: atomicrmw_sub_i32_monotonic:
20486; RV32I:       # %bb.0:
20487; RV32I-NEXT:    addi sp, sp, -16
20488; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20489; RV32I-NEXT:    li a2, 0
20490; RV32I-NEXT:    call __atomic_fetch_sub_4
20491; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20492; RV32I-NEXT:    addi sp, sp, 16
20493; RV32I-NEXT:    ret
20494;
20495; RV32IA-LABEL: atomicrmw_sub_i32_monotonic:
20496; RV32IA:       # %bb.0:
20497; RV32IA-NEXT:    neg a1, a1
20498; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
20499; RV32IA-NEXT:    ret
20500;
20501; RV64I-LABEL: atomicrmw_sub_i32_monotonic:
20502; RV64I:       # %bb.0:
20503; RV64I-NEXT:    addi sp, sp, -16
20504; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20505; RV64I-NEXT:    li a2, 0
20506; RV64I-NEXT:    call __atomic_fetch_sub_4
20507; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20508; RV64I-NEXT:    addi sp, sp, 16
20509; RV64I-NEXT:    ret
20510;
20511; RV64IA-LABEL: atomicrmw_sub_i32_monotonic:
20512; RV64IA:       # %bb.0:
20513; RV64IA-NEXT:    neg a1, a1
20514; RV64IA-NEXT:    amoadd.w a0, a1, (a0)
20515; RV64IA-NEXT:    ret
20516  %1 = atomicrmw sub ptr %a, i32 %b monotonic
20517  ret i32 %1
20518}
20519
20520define i32 @atomicrmw_sub_i32_acquire(ptr %a, i32 %b) nounwind {
20521; RV32I-LABEL: atomicrmw_sub_i32_acquire:
20522; RV32I:       # %bb.0:
20523; RV32I-NEXT:    addi sp, sp, -16
20524; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20525; RV32I-NEXT:    li a2, 2
20526; RV32I-NEXT:    call __atomic_fetch_sub_4
20527; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20528; RV32I-NEXT:    addi sp, sp, 16
20529; RV32I-NEXT:    ret
20530;
20531; RV32IA-WMO-LABEL: atomicrmw_sub_i32_acquire:
20532; RV32IA-WMO:       # %bb.0:
20533; RV32IA-WMO-NEXT:    neg a1, a1
20534; RV32IA-WMO-NEXT:    amoadd.w.aq a0, a1, (a0)
20535; RV32IA-WMO-NEXT:    ret
20536;
20537; RV32IA-TSO-LABEL: atomicrmw_sub_i32_acquire:
20538; RV32IA-TSO:       # %bb.0:
20539; RV32IA-TSO-NEXT:    neg a1, a1
20540; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20541; RV32IA-TSO-NEXT:    ret
20542;
20543; RV64I-LABEL: atomicrmw_sub_i32_acquire:
20544; RV64I:       # %bb.0:
20545; RV64I-NEXT:    addi sp, sp, -16
20546; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20547; RV64I-NEXT:    li a2, 2
20548; RV64I-NEXT:    call __atomic_fetch_sub_4
20549; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20550; RV64I-NEXT:    addi sp, sp, 16
20551; RV64I-NEXT:    ret
20552;
20553; RV64IA-WMO-LABEL: atomicrmw_sub_i32_acquire:
20554; RV64IA-WMO:       # %bb.0:
20555; RV64IA-WMO-NEXT:    neg a1, a1
20556; RV64IA-WMO-NEXT:    amoadd.w.aq a0, a1, (a0)
20557; RV64IA-WMO-NEXT:    ret
20558;
20559; RV64IA-TSO-LABEL: atomicrmw_sub_i32_acquire:
20560; RV64IA-TSO:       # %bb.0:
20561; RV64IA-TSO-NEXT:    neg a1, a1
20562; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20563; RV64IA-TSO-NEXT:    ret
20564  %1 = atomicrmw sub ptr %a, i32 %b acquire
20565  ret i32 %1
20566}
20567
20568define i32 @atomicrmw_sub_i32_release(ptr %a, i32 %b) nounwind {
20569; RV32I-LABEL: atomicrmw_sub_i32_release:
20570; RV32I:       # %bb.0:
20571; RV32I-NEXT:    addi sp, sp, -16
20572; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20573; RV32I-NEXT:    li a2, 3
20574; RV32I-NEXT:    call __atomic_fetch_sub_4
20575; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20576; RV32I-NEXT:    addi sp, sp, 16
20577; RV32I-NEXT:    ret
20578;
20579; RV32IA-WMO-LABEL: atomicrmw_sub_i32_release:
20580; RV32IA-WMO:       # %bb.0:
20581; RV32IA-WMO-NEXT:    neg a1, a1
20582; RV32IA-WMO-NEXT:    amoadd.w.rl a0, a1, (a0)
20583; RV32IA-WMO-NEXT:    ret
20584;
20585; RV32IA-TSO-LABEL: atomicrmw_sub_i32_release:
20586; RV32IA-TSO:       # %bb.0:
20587; RV32IA-TSO-NEXT:    neg a1, a1
20588; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20589; RV32IA-TSO-NEXT:    ret
20590;
20591; RV64I-LABEL: atomicrmw_sub_i32_release:
20592; RV64I:       # %bb.0:
20593; RV64I-NEXT:    addi sp, sp, -16
20594; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20595; RV64I-NEXT:    li a2, 3
20596; RV64I-NEXT:    call __atomic_fetch_sub_4
20597; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20598; RV64I-NEXT:    addi sp, sp, 16
20599; RV64I-NEXT:    ret
20600;
20601; RV64IA-WMO-LABEL: atomicrmw_sub_i32_release:
20602; RV64IA-WMO:       # %bb.0:
20603; RV64IA-WMO-NEXT:    neg a1, a1
20604; RV64IA-WMO-NEXT:    amoadd.w.rl a0, a1, (a0)
20605; RV64IA-WMO-NEXT:    ret
20606;
20607; RV64IA-TSO-LABEL: atomicrmw_sub_i32_release:
20608; RV64IA-TSO:       # %bb.0:
20609; RV64IA-TSO-NEXT:    neg a1, a1
20610; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20611; RV64IA-TSO-NEXT:    ret
20612  %1 = atomicrmw sub ptr %a, i32 %b release
20613  ret i32 %1
20614}
20615
20616define i32 @atomicrmw_sub_i32_acq_rel(ptr %a, i32 %b) nounwind {
20617; RV32I-LABEL: atomicrmw_sub_i32_acq_rel:
20618; RV32I:       # %bb.0:
20619; RV32I-NEXT:    addi sp, sp, -16
20620; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20621; RV32I-NEXT:    li a2, 4
20622; RV32I-NEXT:    call __atomic_fetch_sub_4
20623; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20624; RV32I-NEXT:    addi sp, sp, 16
20625; RV32I-NEXT:    ret
20626;
20627; RV32IA-WMO-LABEL: atomicrmw_sub_i32_acq_rel:
20628; RV32IA-WMO:       # %bb.0:
20629; RV32IA-WMO-NEXT:    neg a1, a1
20630; RV32IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20631; RV32IA-WMO-NEXT:    ret
20632;
20633; RV32IA-TSO-LABEL: atomicrmw_sub_i32_acq_rel:
20634; RV32IA-TSO:       # %bb.0:
20635; RV32IA-TSO-NEXT:    neg a1, a1
20636; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20637; RV32IA-TSO-NEXT:    ret
20638;
20639; RV64I-LABEL: atomicrmw_sub_i32_acq_rel:
20640; RV64I:       # %bb.0:
20641; RV64I-NEXT:    addi sp, sp, -16
20642; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20643; RV64I-NEXT:    li a2, 4
20644; RV64I-NEXT:    call __atomic_fetch_sub_4
20645; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20646; RV64I-NEXT:    addi sp, sp, 16
20647; RV64I-NEXT:    ret
20648;
20649; RV64IA-WMO-LABEL: atomicrmw_sub_i32_acq_rel:
20650; RV64IA-WMO:       # %bb.0:
20651; RV64IA-WMO-NEXT:    neg a1, a1
20652; RV64IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20653; RV64IA-WMO-NEXT:    ret
20654;
20655; RV64IA-TSO-LABEL: atomicrmw_sub_i32_acq_rel:
20656; RV64IA-TSO:       # %bb.0:
20657; RV64IA-TSO-NEXT:    neg a1, a1
20658; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20659; RV64IA-TSO-NEXT:    ret
20660  %1 = atomicrmw sub ptr %a, i32 %b acq_rel
20661  ret i32 %1
20662}
20663
20664define i32 @atomicrmw_sub_i32_seq_cst(ptr %a, i32 %b) nounwind {
20665; RV32I-LABEL: atomicrmw_sub_i32_seq_cst:
20666; RV32I:       # %bb.0:
20667; RV32I-NEXT:    addi sp, sp, -16
20668; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20669; RV32I-NEXT:    li a2, 5
20670; RV32I-NEXT:    call __atomic_fetch_sub_4
20671; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20672; RV32I-NEXT:    addi sp, sp, 16
20673; RV32I-NEXT:    ret
20674;
20675; RV32IA-WMO-LABEL: atomicrmw_sub_i32_seq_cst:
20676; RV32IA-WMO:       # %bb.0:
20677; RV32IA-WMO-NEXT:    neg a1, a1
20678; RV32IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20679; RV32IA-WMO-NEXT:    ret
20680;
20681; RV32IA-TSO-LABEL: atomicrmw_sub_i32_seq_cst:
20682; RV32IA-TSO:       # %bb.0:
20683; RV32IA-TSO-NEXT:    neg a1, a1
20684; RV32IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20685; RV32IA-TSO-NEXT:    ret
20686;
20687; RV64I-LABEL: atomicrmw_sub_i32_seq_cst:
20688; RV64I:       # %bb.0:
20689; RV64I-NEXT:    addi sp, sp, -16
20690; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20691; RV64I-NEXT:    li a2, 5
20692; RV64I-NEXT:    call __atomic_fetch_sub_4
20693; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20694; RV64I-NEXT:    addi sp, sp, 16
20695; RV64I-NEXT:    ret
20696;
20697; RV64IA-WMO-LABEL: atomicrmw_sub_i32_seq_cst:
20698; RV64IA-WMO:       # %bb.0:
20699; RV64IA-WMO-NEXT:    neg a1, a1
20700; RV64IA-WMO-NEXT:    amoadd.w.aqrl a0, a1, (a0)
20701; RV64IA-WMO-NEXT:    ret
20702;
20703; RV64IA-TSO-LABEL: atomicrmw_sub_i32_seq_cst:
20704; RV64IA-TSO:       # %bb.0:
20705; RV64IA-TSO-NEXT:    neg a1, a1
20706; RV64IA-TSO-NEXT:    amoadd.w a0, a1, (a0)
20707; RV64IA-TSO-NEXT:    ret
20708  %1 = atomicrmw sub ptr %a, i32 %b seq_cst
20709  ret i32 %1
20710}
20711
20712define i32 @atomicrmw_and_i32_monotonic(ptr %a, i32 %b) nounwind {
20713; RV32I-LABEL: atomicrmw_and_i32_monotonic:
20714; RV32I:       # %bb.0:
20715; RV32I-NEXT:    addi sp, sp, -16
20716; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20717; RV32I-NEXT:    li a2, 0
20718; RV32I-NEXT:    call __atomic_fetch_and_4
20719; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20720; RV32I-NEXT:    addi sp, sp, 16
20721; RV32I-NEXT:    ret
20722;
20723; RV32IA-LABEL: atomicrmw_and_i32_monotonic:
20724; RV32IA:       # %bb.0:
20725; RV32IA-NEXT:    amoand.w a0, a1, (a0)
20726; RV32IA-NEXT:    ret
20727;
20728; RV64I-LABEL: atomicrmw_and_i32_monotonic:
20729; RV64I:       # %bb.0:
20730; RV64I-NEXT:    addi sp, sp, -16
20731; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20732; RV64I-NEXT:    li a2, 0
20733; RV64I-NEXT:    call __atomic_fetch_and_4
20734; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20735; RV64I-NEXT:    addi sp, sp, 16
20736; RV64I-NEXT:    ret
20737;
20738; RV64IA-LABEL: atomicrmw_and_i32_monotonic:
20739; RV64IA:       # %bb.0:
20740; RV64IA-NEXT:    amoand.w a0, a1, (a0)
20741; RV64IA-NEXT:    ret
20742  %1 = atomicrmw and ptr %a, i32 %b monotonic
20743  ret i32 %1
20744}
20745
20746define i32 @atomicrmw_and_i32_acquire(ptr %a, i32 %b) nounwind {
20747; RV32I-LABEL: atomicrmw_and_i32_acquire:
20748; RV32I:       # %bb.0:
20749; RV32I-NEXT:    addi sp, sp, -16
20750; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20751; RV32I-NEXT:    li a2, 2
20752; RV32I-NEXT:    call __atomic_fetch_and_4
20753; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20754; RV32I-NEXT:    addi sp, sp, 16
20755; RV32I-NEXT:    ret
20756;
20757; RV32IA-WMO-LABEL: atomicrmw_and_i32_acquire:
20758; RV32IA-WMO:       # %bb.0:
20759; RV32IA-WMO-NEXT:    amoand.w.aq a0, a1, (a0)
20760; RV32IA-WMO-NEXT:    ret
20761;
20762; RV32IA-TSO-LABEL: atomicrmw_and_i32_acquire:
20763; RV32IA-TSO:       # %bb.0:
20764; RV32IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20765; RV32IA-TSO-NEXT:    ret
20766;
20767; RV64I-LABEL: atomicrmw_and_i32_acquire:
20768; RV64I:       # %bb.0:
20769; RV64I-NEXT:    addi sp, sp, -16
20770; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20771; RV64I-NEXT:    li a2, 2
20772; RV64I-NEXT:    call __atomic_fetch_and_4
20773; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20774; RV64I-NEXT:    addi sp, sp, 16
20775; RV64I-NEXT:    ret
20776;
20777; RV64IA-WMO-LABEL: atomicrmw_and_i32_acquire:
20778; RV64IA-WMO:       # %bb.0:
20779; RV64IA-WMO-NEXT:    amoand.w.aq a0, a1, (a0)
20780; RV64IA-WMO-NEXT:    ret
20781;
20782; RV64IA-TSO-LABEL: atomicrmw_and_i32_acquire:
20783; RV64IA-TSO:       # %bb.0:
20784; RV64IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20785; RV64IA-TSO-NEXT:    ret
20786  %1 = atomicrmw and ptr %a, i32 %b acquire
20787  ret i32 %1
20788}
20789
20790define i32 @atomicrmw_and_i32_release(ptr %a, i32 %b) nounwind {
20791; RV32I-LABEL: atomicrmw_and_i32_release:
20792; RV32I:       # %bb.0:
20793; RV32I-NEXT:    addi sp, sp, -16
20794; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20795; RV32I-NEXT:    li a2, 3
20796; RV32I-NEXT:    call __atomic_fetch_and_4
20797; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20798; RV32I-NEXT:    addi sp, sp, 16
20799; RV32I-NEXT:    ret
20800;
20801; RV32IA-WMO-LABEL: atomicrmw_and_i32_release:
20802; RV32IA-WMO:       # %bb.0:
20803; RV32IA-WMO-NEXT:    amoand.w.rl a0, a1, (a0)
20804; RV32IA-WMO-NEXT:    ret
20805;
20806; RV32IA-TSO-LABEL: atomicrmw_and_i32_release:
20807; RV32IA-TSO:       # %bb.0:
20808; RV32IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20809; RV32IA-TSO-NEXT:    ret
20810;
20811; RV64I-LABEL: atomicrmw_and_i32_release:
20812; RV64I:       # %bb.0:
20813; RV64I-NEXT:    addi sp, sp, -16
20814; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20815; RV64I-NEXT:    li a2, 3
20816; RV64I-NEXT:    call __atomic_fetch_and_4
20817; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20818; RV64I-NEXT:    addi sp, sp, 16
20819; RV64I-NEXT:    ret
20820;
20821; RV64IA-WMO-LABEL: atomicrmw_and_i32_release:
20822; RV64IA-WMO:       # %bb.0:
20823; RV64IA-WMO-NEXT:    amoand.w.rl a0, a1, (a0)
20824; RV64IA-WMO-NEXT:    ret
20825;
20826; RV64IA-TSO-LABEL: atomicrmw_and_i32_release:
20827; RV64IA-TSO:       # %bb.0:
20828; RV64IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20829; RV64IA-TSO-NEXT:    ret
20830  %1 = atomicrmw and ptr %a, i32 %b release
20831  ret i32 %1
20832}
20833
20834define i32 @atomicrmw_and_i32_acq_rel(ptr %a, i32 %b) nounwind {
20835; RV32I-LABEL: atomicrmw_and_i32_acq_rel:
20836; RV32I:       # %bb.0:
20837; RV32I-NEXT:    addi sp, sp, -16
20838; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20839; RV32I-NEXT:    li a2, 4
20840; RV32I-NEXT:    call __atomic_fetch_and_4
20841; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20842; RV32I-NEXT:    addi sp, sp, 16
20843; RV32I-NEXT:    ret
20844;
20845; RV32IA-WMO-LABEL: atomicrmw_and_i32_acq_rel:
20846; RV32IA-WMO:       # %bb.0:
20847; RV32IA-WMO-NEXT:    amoand.w.aqrl a0, a1, (a0)
20848; RV32IA-WMO-NEXT:    ret
20849;
20850; RV32IA-TSO-LABEL: atomicrmw_and_i32_acq_rel:
20851; RV32IA-TSO:       # %bb.0:
20852; RV32IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20853; RV32IA-TSO-NEXT:    ret
20854;
20855; RV64I-LABEL: atomicrmw_and_i32_acq_rel:
20856; RV64I:       # %bb.0:
20857; RV64I-NEXT:    addi sp, sp, -16
20858; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20859; RV64I-NEXT:    li a2, 4
20860; RV64I-NEXT:    call __atomic_fetch_and_4
20861; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20862; RV64I-NEXT:    addi sp, sp, 16
20863; RV64I-NEXT:    ret
20864;
20865; RV64IA-WMO-LABEL: atomicrmw_and_i32_acq_rel:
20866; RV64IA-WMO:       # %bb.0:
20867; RV64IA-WMO-NEXT:    amoand.w.aqrl a0, a1, (a0)
20868; RV64IA-WMO-NEXT:    ret
20869;
20870; RV64IA-TSO-LABEL: atomicrmw_and_i32_acq_rel:
20871; RV64IA-TSO:       # %bb.0:
20872; RV64IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20873; RV64IA-TSO-NEXT:    ret
20874  %1 = atomicrmw and ptr %a, i32 %b acq_rel
20875  ret i32 %1
20876}
20877
20878define i32 @atomicrmw_and_i32_seq_cst(ptr %a, i32 %b) nounwind {
20879; RV32I-LABEL: atomicrmw_and_i32_seq_cst:
20880; RV32I:       # %bb.0:
20881; RV32I-NEXT:    addi sp, sp, -16
20882; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20883; RV32I-NEXT:    li a2, 5
20884; RV32I-NEXT:    call __atomic_fetch_and_4
20885; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20886; RV32I-NEXT:    addi sp, sp, 16
20887; RV32I-NEXT:    ret
20888;
20889; RV32IA-WMO-LABEL: atomicrmw_and_i32_seq_cst:
20890; RV32IA-WMO:       # %bb.0:
20891; RV32IA-WMO-NEXT:    amoand.w.aqrl a0, a1, (a0)
20892; RV32IA-WMO-NEXT:    ret
20893;
20894; RV32IA-TSO-LABEL: atomicrmw_and_i32_seq_cst:
20895; RV32IA-TSO:       # %bb.0:
20896; RV32IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20897; RV32IA-TSO-NEXT:    ret
20898;
20899; RV64I-LABEL: atomicrmw_and_i32_seq_cst:
20900; RV64I:       # %bb.0:
20901; RV64I-NEXT:    addi sp, sp, -16
20902; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20903; RV64I-NEXT:    li a2, 5
20904; RV64I-NEXT:    call __atomic_fetch_and_4
20905; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20906; RV64I-NEXT:    addi sp, sp, 16
20907; RV64I-NEXT:    ret
20908;
20909; RV64IA-WMO-LABEL: atomicrmw_and_i32_seq_cst:
20910; RV64IA-WMO:       # %bb.0:
20911; RV64IA-WMO-NEXT:    amoand.w.aqrl a0, a1, (a0)
20912; RV64IA-WMO-NEXT:    ret
20913;
20914; RV64IA-TSO-LABEL: atomicrmw_and_i32_seq_cst:
20915; RV64IA-TSO:       # %bb.0:
20916; RV64IA-TSO-NEXT:    amoand.w a0, a1, (a0)
20917; RV64IA-TSO-NEXT:    ret
20918  %1 = atomicrmw and ptr %a, i32 %b seq_cst
20919  ret i32 %1
20920}
20921
20922define i32 @atomicrmw_nand_i32_monotonic(ptr %a, i32 %b) nounwind {
20923; RV32I-LABEL: atomicrmw_nand_i32_monotonic:
20924; RV32I:       # %bb.0:
20925; RV32I-NEXT:    addi sp, sp, -16
20926; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20927; RV32I-NEXT:    li a2, 0
20928; RV32I-NEXT:    call __atomic_fetch_nand_4
20929; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20930; RV32I-NEXT:    addi sp, sp, 16
20931; RV32I-NEXT:    ret
20932;
20933; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
20934; RV32IA-NOZACAS:       # %bb.0:
20935; RV32IA-NOZACAS-NEXT:  .LBB150_1: # =>This Inner Loop Header: Depth=1
20936; RV32IA-NOZACAS-NEXT:    lr.w a2, (a0)
20937; RV32IA-NOZACAS-NEXT:    and a3, a2, a1
20938; RV32IA-NOZACAS-NEXT:    not a3, a3
20939; RV32IA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
20940; RV32IA-NOZACAS-NEXT:    bnez a3, .LBB150_1
20941; RV32IA-NOZACAS-NEXT:  # %bb.2:
20942; RV32IA-NOZACAS-NEXT:    mv a0, a2
20943; RV32IA-NOZACAS-NEXT:    ret
20944;
20945; RV64I-LABEL: atomicrmw_nand_i32_monotonic:
20946; RV64I:       # %bb.0:
20947; RV64I-NEXT:    addi sp, sp, -16
20948; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20949; RV64I-NEXT:    li a2, 0
20950; RV64I-NEXT:    call __atomic_fetch_nand_4
20951; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20952; RV64I-NEXT:    addi sp, sp, 16
20953; RV64I-NEXT:    ret
20954;
20955; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
20956; RV64IA-NOZACAS:       # %bb.0:
20957; RV64IA-NOZACAS-NEXT:  .LBB150_1: # =>This Inner Loop Header: Depth=1
20958; RV64IA-NOZACAS-NEXT:    lr.w a2, (a0)
20959; RV64IA-NOZACAS-NEXT:    and a3, a2, a1
20960; RV64IA-NOZACAS-NEXT:    not a3, a3
20961; RV64IA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
20962; RV64IA-NOZACAS-NEXT:    bnez a3, .LBB150_1
20963; RV64IA-NOZACAS-NEXT:  # %bb.2:
20964; RV64IA-NOZACAS-NEXT:    mv a0, a2
20965; RV64IA-NOZACAS-NEXT:    ret
20966;
20967; RV32IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
20968; RV32IA-ZACAS:       # %bb.0:
20969; RV32IA-ZACAS-NEXT:    mv a2, a0
20970; RV32IA-ZACAS-NEXT:    lw a0, 0(a0)
20971; RV32IA-ZACAS-NEXT:  .LBB150_1: # %atomicrmw.start
20972; RV32IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
20973; RV32IA-ZACAS-NEXT:    mv a3, a0
20974; RV32IA-ZACAS-NEXT:    and a4, a0, a1
20975; RV32IA-ZACAS-NEXT:    not a4, a4
20976; RV32IA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
20977; RV32IA-ZACAS-NEXT:    bne a0, a3, .LBB150_1
20978; RV32IA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
20979; RV32IA-ZACAS-NEXT:    ret
20980;
20981; RV64IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
20982; RV64IA-ZACAS:       # %bb.0:
20983; RV64IA-ZACAS-NEXT:    mv a2, a0
20984; RV64IA-ZACAS-NEXT:    lw a0, 0(a0)
20985; RV64IA-ZACAS-NEXT:  .LBB150_1: # %atomicrmw.start
20986; RV64IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
20987; RV64IA-ZACAS-NEXT:    mv a3, a0
20988; RV64IA-ZACAS-NEXT:    and a4, a0, a1
20989; RV64IA-ZACAS-NEXT:    not a4, a4
20990; RV64IA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
20991; RV64IA-ZACAS-NEXT:    bne a0, a3, .LBB150_1
20992; RV64IA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
20993; RV64IA-ZACAS-NEXT:    ret
20994;
20995; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
20996; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
20997; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB150_1: # =>This Inner Loop Header: Depth=1
20998; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w a2, (a0)
20999; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21000; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
21001; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21002; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB150_1
21003; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21004; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21005; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
21006;
21007; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
21008; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
21009; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB150_1: # =>This Inner Loop Header: Depth=1
21010; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a2, (a0)
21011; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21012; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
21013; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21014; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB150_1
21015; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21016; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21017; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
21018;
21019; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
21020; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
21021; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
21022; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21023; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB150_1: # %atomicrmw.start
21024; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21025; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
21026; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21027; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
21028; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21029; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB150_1
21030; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21031; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
21032;
21033; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
21034; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
21035; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
21036; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21037; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB150_1: # %atomicrmw.start
21038; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21039; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
21040; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21041; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
21042; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21043; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB150_1
21044; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21045; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
21046  %1 = atomicrmw nand ptr %a, i32 %b monotonic
21047  ret i32 %1
21048}
21049
21050define i32 @atomicrmw_nand_i32_acquire(ptr %a, i32 %b) nounwind {
21051; RV32I-LABEL: atomicrmw_nand_i32_acquire:
21052; RV32I:       # %bb.0:
21053; RV32I-NEXT:    addi sp, sp, -16
21054; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21055; RV32I-NEXT:    li a2, 2
21056; RV32I-NEXT:    call __atomic_fetch_nand_4
21057; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21058; RV32I-NEXT:    addi sp, sp, 16
21059; RV32I-NEXT:    ret
21060;
21061; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
21062; RV32IA-WMO-NOZACAS:       # %bb.0:
21063; RV32IA-WMO-NOZACAS-NEXT:  .LBB151_1: # =>This Inner Loop Header: Depth=1
21064; RV32IA-WMO-NOZACAS-NEXT:    lr.w.aq a2, (a0)
21065; RV32IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
21066; RV32IA-WMO-NOZACAS-NEXT:    not a3, a3
21067; RV32IA-WMO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21068; RV32IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB151_1
21069; RV32IA-WMO-NOZACAS-NEXT:  # %bb.2:
21070; RV32IA-WMO-NOZACAS-NEXT:    mv a0, a2
21071; RV32IA-WMO-NOZACAS-NEXT:    ret
21072;
21073; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
21074; RV32IA-TSO-NOZACAS:       # %bb.0:
21075; RV32IA-TSO-NOZACAS-NEXT:  .LBB151_1: # =>This Inner Loop Header: Depth=1
21076; RV32IA-TSO-NOZACAS-NEXT:    lr.w a2, (a0)
21077; RV32IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
21078; RV32IA-TSO-NOZACAS-NEXT:    not a3, a3
21079; RV32IA-TSO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21080; RV32IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB151_1
21081; RV32IA-TSO-NOZACAS-NEXT:  # %bb.2:
21082; RV32IA-TSO-NOZACAS-NEXT:    mv a0, a2
21083; RV32IA-TSO-NOZACAS-NEXT:    ret
21084;
21085; RV64I-LABEL: atomicrmw_nand_i32_acquire:
21086; RV64I:       # %bb.0:
21087; RV64I-NEXT:    addi sp, sp, -16
21088; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21089; RV64I-NEXT:    li a2, 2
21090; RV64I-NEXT:    call __atomic_fetch_nand_4
21091; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21092; RV64I-NEXT:    addi sp, sp, 16
21093; RV64I-NEXT:    ret
21094;
21095; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
21096; RV64IA-WMO-NOZACAS:       # %bb.0:
21097; RV64IA-WMO-NOZACAS-NEXT:  .LBB151_1: # =>This Inner Loop Header: Depth=1
21098; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a2, (a0)
21099; RV64IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
21100; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
21101; RV64IA-WMO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21102; RV64IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB151_1
21103; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
21104; RV64IA-WMO-NOZACAS-NEXT:    mv a0, a2
21105; RV64IA-WMO-NOZACAS-NEXT:    ret
21106;
21107; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
21108; RV64IA-TSO-NOZACAS:       # %bb.0:
21109; RV64IA-TSO-NOZACAS-NEXT:  .LBB151_1: # =>This Inner Loop Header: Depth=1
21110; RV64IA-TSO-NOZACAS-NEXT:    lr.w a2, (a0)
21111; RV64IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
21112; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
21113; RV64IA-TSO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21114; RV64IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB151_1
21115; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
21116; RV64IA-TSO-NOZACAS-NEXT:    mv a0, a2
21117; RV64IA-TSO-NOZACAS-NEXT:    ret
21118;
21119; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
21120; RV32IA-WMO-ZACAS:       # %bb.0:
21121; RV32IA-WMO-ZACAS-NEXT:    mv a2, a0
21122; RV32IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21123; RV32IA-WMO-ZACAS-NEXT:  .LBB151_1: # %atomicrmw.start
21124; RV32IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21125; RV32IA-WMO-ZACAS-NEXT:    mv a3, a0
21126; RV32IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21127; RV32IA-WMO-ZACAS-NEXT:    not a4, a4
21128; RV32IA-WMO-ZACAS-NEXT:    amocas.w.aq a0, a4, (a2)
21129; RV32IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB151_1
21130; RV32IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21131; RV32IA-WMO-ZACAS-NEXT:    ret
21132;
21133; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
21134; RV32IA-TSO-ZACAS:       # %bb.0:
21135; RV32IA-TSO-ZACAS-NEXT:    mv a2, a0
21136; RV32IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21137; RV32IA-TSO-ZACAS-NEXT:  .LBB151_1: # %atomicrmw.start
21138; RV32IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21139; RV32IA-TSO-ZACAS-NEXT:    mv a3, a0
21140; RV32IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21141; RV32IA-TSO-ZACAS-NEXT:    not a4, a4
21142; RV32IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21143; RV32IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB151_1
21144; RV32IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21145; RV32IA-TSO-ZACAS-NEXT:    ret
21146;
21147; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
21148; RV64IA-WMO-ZACAS:       # %bb.0:
21149; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
21150; RV64IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21151; RV64IA-WMO-ZACAS-NEXT:  .LBB151_1: # %atomicrmw.start
21152; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21153; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
21154; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21155; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
21156; RV64IA-WMO-ZACAS-NEXT:    amocas.w.aq a0, a4, (a2)
21157; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB151_1
21158; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21159; RV64IA-WMO-ZACAS-NEXT:    ret
21160;
21161; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
21162; RV64IA-TSO-ZACAS:       # %bb.0:
21163; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
21164; RV64IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21165; RV64IA-TSO-ZACAS-NEXT:  .LBB151_1: # %atomicrmw.start
21166; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21167; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
21168; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21169; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
21170; RV64IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21171; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB151_1
21172; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21173; RV64IA-TSO-ZACAS-NEXT:    ret
21174;
21175; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
21176; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
21177; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB151_1: # =>This Inner Loop Header: Depth=1
21178; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aq a2, (a0)
21179; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21180; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
21181; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21182; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB151_1
21183; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21184; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21185; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
21186;
21187; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
21188; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
21189; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB151_1: # =>This Inner Loop Header: Depth=1
21190; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a2, (a0)
21191; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21192; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
21193; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21194; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB151_1
21195; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21196; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21197; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
21198;
21199; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
21200; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
21201; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
21202; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21203; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB151_1: # %atomicrmw.start
21204; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21205; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
21206; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21207; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
21208; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.w.aq a0, a4, (a2)
21209; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB151_1
21210; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21211; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
21212;
21213; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
21214; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
21215; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
21216; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21217; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB151_1: # %atomicrmw.start
21218; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21219; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
21220; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21221; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
21222; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21223; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB151_1
21224; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21225; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
21226  %1 = atomicrmw nand ptr %a, i32 %b acquire
21227  ret i32 %1
21228}
21229
21230define i32 @atomicrmw_nand_i32_release(ptr %a, i32 %b) nounwind {
21231; RV32I-LABEL: atomicrmw_nand_i32_release:
21232; RV32I:       # %bb.0:
21233; RV32I-NEXT:    addi sp, sp, -16
21234; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21235; RV32I-NEXT:    li a2, 3
21236; RV32I-NEXT:    call __atomic_fetch_nand_4
21237; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21238; RV32I-NEXT:    addi sp, sp, 16
21239; RV32I-NEXT:    ret
21240;
21241; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
21242; RV32IA-WMO-NOZACAS:       # %bb.0:
21243; RV32IA-WMO-NOZACAS-NEXT:  .LBB152_1: # =>This Inner Loop Header: Depth=1
21244; RV32IA-WMO-NOZACAS-NEXT:    lr.w a2, (a0)
21245; RV32IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
21246; RV32IA-WMO-NOZACAS-NEXT:    not a3, a3
21247; RV32IA-WMO-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21248; RV32IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB152_1
21249; RV32IA-WMO-NOZACAS-NEXT:  # %bb.2:
21250; RV32IA-WMO-NOZACAS-NEXT:    mv a0, a2
21251; RV32IA-WMO-NOZACAS-NEXT:    ret
21252;
21253; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
21254; RV32IA-TSO-NOZACAS:       # %bb.0:
21255; RV32IA-TSO-NOZACAS-NEXT:  .LBB152_1: # =>This Inner Loop Header: Depth=1
21256; RV32IA-TSO-NOZACAS-NEXT:    lr.w a2, (a0)
21257; RV32IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
21258; RV32IA-TSO-NOZACAS-NEXT:    not a3, a3
21259; RV32IA-TSO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21260; RV32IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB152_1
21261; RV32IA-TSO-NOZACAS-NEXT:  # %bb.2:
21262; RV32IA-TSO-NOZACAS-NEXT:    mv a0, a2
21263; RV32IA-TSO-NOZACAS-NEXT:    ret
21264;
21265; RV64I-LABEL: atomicrmw_nand_i32_release:
21266; RV64I:       # %bb.0:
21267; RV64I-NEXT:    addi sp, sp, -16
21268; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21269; RV64I-NEXT:    li a2, 3
21270; RV64I-NEXT:    call __atomic_fetch_nand_4
21271; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21272; RV64I-NEXT:    addi sp, sp, 16
21273; RV64I-NEXT:    ret
21274;
21275; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
21276; RV64IA-WMO-NOZACAS:       # %bb.0:
21277; RV64IA-WMO-NOZACAS-NEXT:  .LBB152_1: # =>This Inner Loop Header: Depth=1
21278; RV64IA-WMO-NOZACAS-NEXT:    lr.w a2, (a0)
21279; RV64IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
21280; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
21281; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21282; RV64IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB152_1
21283; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
21284; RV64IA-WMO-NOZACAS-NEXT:    mv a0, a2
21285; RV64IA-WMO-NOZACAS-NEXT:    ret
21286;
21287; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
21288; RV64IA-TSO-NOZACAS:       # %bb.0:
21289; RV64IA-TSO-NOZACAS-NEXT:  .LBB152_1: # =>This Inner Loop Header: Depth=1
21290; RV64IA-TSO-NOZACAS-NEXT:    lr.w a2, (a0)
21291; RV64IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
21292; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
21293; RV64IA-TSO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21294; RV64IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB152_1
21295; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
21296; RV64IA-TSO-NOZACAS-NEXT:    mv a0, a2
21297; RV64IA-TSO-NOZACAS-NEXT:    ret
21298;
21299; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_release:
21300; RV32IA-WMO-ZACAS:       # %bb.0:
21301; RV32IA-WMO-ZACAS-NEXT:    mv a2, a0
21302; RV32IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21303; RV32IA-WMO-ZACAS-NEXT:  .LBB152_1: # %atomicrmw.start
21304; RV32IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21305; RV32IA-WMO-ZACAS-NEXT:    mv a3, a0
21306; RV32IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21307; RV32IA-WMO-ZACAS-NEXT:    not a4, a4
21308; RV32IA-WMO-ZACAS-NEXT:    amocas.w.rl a0, a4, (a2)
21309; RV32IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB152_1
21310; RV32IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21311; RV32IA-WMO-ZACAS-NEXT:    ret
21312;
21313; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_release:
21314; RV32IA-TSO-ZACAS:       # %bb.0:
21315; RV32IA-TSO-ZACAS-NEXT:    mv a2, a0
21316; RV32IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21317; RV32IA-TSO-ZACAS-NEXT:  .LBB152_1: # %atomicrmw.start
21318; RV32IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21319; RV32IA-TSO-ZACAS-NEXT:    mv a3, a0
21320; RV32IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21321; RV32IA-TSO-ZACAS-NEXT:    not a4, a4
21322; RV32IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21323; RV32IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB152_1
21324; RV32IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21325; RV32IA-TSO-ZACAS-NEXT:    ret
21326;
21327; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_release:
21328; RV64IA-WMO-ZACAS:       # %bb.0:
21329; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
21330; RV64IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21331; RV64IA-WMO-ZACAS-NEXT:  .LBB152_1: # %atomicrmw.start
21332; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21333; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
21334; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21335; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
21336; RV64IA-WMO-ZACAS-NEXT:    amocas.w.rl a0, a4, (a2)
21337; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB152_1
21338; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21339; RV64IA-WMO-ZACAS-NEXT:    ret
21340;
21341; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_release:
21342; RV64IA-TSO-ZACAS:       # %bb.0:
21343; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
21344; RV64IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21345; RV64IA-TSO-ZACAS-NEXT:  .LBB152_1: # %atomicrmw.start
21346; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21347; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
21348; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21349; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
21350; RV64IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21351; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB152_1
21352; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21353; RV64IA-TSO-ZACAS-NEXT:    ret
21354;
21355; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_release:
21356; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
21357; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB152_1: # =>This Inner Loop Header: Depth=1
21358; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w a2, (a0)
21359; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21360; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
21361; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21362; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB152_1
21363; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21364; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21365; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
21366;
21367; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_release:
21368; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
21369; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB152_1: # =>This Inner Loop Header: Depth=1
21370; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a2, (a0)
21371; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21372; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
21373; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21374; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB152_1
21375; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21376; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21377; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
21378;
21379; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_release:
21380; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
21381; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
21382; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21383; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB152_1: # %atomicrmw.start
21384; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21385; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
21386; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21387; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
21388; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.w.rl a0, a4, (a2)
21389; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB152_1
21390; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21391; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
21392;
21393; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_release:
21394; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
21395; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
21396; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21397; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB152_1: # %atomicrmw.start
21398; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21399; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
21400; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21401; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
21402; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21403; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB152_1
21404; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21405; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
21406  %1 = atomicrmw nand ptr %a, i32 %b release
21407  ret i32 %1
21408}
21409
21410define i32 @atomicrmw_nand_i32_acq_rel(ptr %a, i32 %b) nounwind {
21411; RV32I-LABEL: atomicrmw_nand_i32_acq_rel:
21412; RV32I:       # %bb.0:
21413; RV32I-NEXT:    addi sp, sp, -16
21414; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21415; RV32I-NEXT:    li a2, 4
21416; RV32I-NEXT:    call __atomic_fetch_nand_4
21417; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21418; RV32I-NEXT:    addi sp, sp, 16
21419; RV32I-NEXT:    ret
21420;
21421; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21422; RV32IA-WMO-NOZACAS:       # %bb.0:
21423; RV32IA-WMO-NOZACAS-NEXT:  .LBB153_1: # =>This Inner Loop Header: Depth=1
21424; RV32IA-WMO-NOZACAS-NEXT:    lr.w.aq a2, (a0)
21425; RV32IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
21426; RV32IA-WMO-NOZACAS-NEXT:    not a3, a3
21427; RV32IA-WMO-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21428; RV32IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB153_1
21429; RV32IA-WMO-NOZACAS-NEXT:  # %bb.2:
21430; RV32IA-WMO-NOZACAS-NEXT:    mv a0, a2
21431; RV32IA-WMO-NOZACAS-NEXT:    ret
21432;
21433; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21434; RV32IA-TSO-NOZACAS:       # %bb.0:
21435; RV32IA-TSO-NOZACAS-NEXT:  .LBB153_1: # =>This Inner Loop Header: Depth=1
21436; RV32IA-TSO-NOZACAS-NEXT:    lr.w a2, (a0)
21437; RV32IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
21438; RV32IA-TSO-NOZACAS-NEXT:    not a3, a3
21439; RV32IA-TSO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21440; RV32IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB153_1
21441; RV32IA-TSO-NOZACAS-NEXT:  # %bb.2:
21442; RV32IA-TSO-NOZACAS-NEXT:    mv a0, a2
21443; RV32IA-TSO-NOZACAS-NEXT:    ret
21444;
21445; RV64I-LABEL: atomicrmw_nand_i32_acq_rel:
21446; RV64I:       # %bb.0:
21447; RV64I-NEXT:    addi sp, sp, -16
21448; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21449; RV64I-NEXT:    li a2, 4
21450; RV64I-NEXT:    call __atomic_fetch_nand_4
21451; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21452; RV64I-NEXT:    addi sp, sp, 16
21453; RV64I-NEXT:    ret
21454;
21455; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21456; RV64IA-WMO-NOZACAS:       # %bb.0:
21457; RV64IA-WMO-NOZACAS-NEXT:  .LBB153_1: # =>This Inner Loop Header: Depth=1
21458; RV64IA-WMO-NOZACAS-NEXT:    lr.w.aq a2, (a0)
21459; RV64IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
21460; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
21461; RV64IA-WMO-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21462; RV64IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB153_1
21463; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
21464; RV64IA-WMO-NOZACAS-NEXT:    mv a0, a2
21465; RV64IA-WMO-NOZACAS-NEXT:    ret
21466;
21467; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21468; RV64IA-TSO-NOZACAS:       # %bb.0:
21469; RV64IA-TSO-NOZACAS-NEXT:  .LBB153_1: # =>This Inner Loop Header: Depth=1
21470; RV64IA-TSO-NOZACAS-NEXT:    lr.w a2, (a0)
21471; RV64IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
21472; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
21473; RV64IA-TSO-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21474; RV64IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB153_1
21475; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
21476; RV64IA-TSO-NOZACAS-NEXT:    mv a0, a2
21477; RV64IA-TSO-NOZACAS-NEXT:    ret
21478;
21479; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21480; RV32IA-WMO-ZACAS:       # %bb.0:
21481; RV32IA-WMO-ZACAS-NEXT:    mv a2, a0
21482; RV32IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21483; RV32IA-WMO-ZACAS-NEXT:  .LBB153_1: # %atomicrmw.start
21484; RV32IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21485; RV32IA-WMO-ZACAS-NEXT:    mv a3, a0
21486; RV32IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21487; RV32IA-WMO-ZACAS-NEXT:    not a4, a4
21488; RV32IA-WMO-ZACAS-NEXT:    amocas.w.aqrl a0, a4, (a2)
21489; RV32IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB153_1
21490; RV32IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21491; RV32IA-WMO-ZACAS-NEXT:    ret
21492;
21493; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21494; RV32IA-TSO-ZACAS:       # %bb.0:
21495; RV32IA-TSO-ZACAS-NEXT:    mv a2, a0
21496; RV32IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21497; RV32IA-TSO-ZACAS-NEXT:  .LBB153_1: # %atomicrmw.start
21498; RV32IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21499; RV32IA-TSO-ZACAS-NEXT:    mv a3, a0
21500; RV32IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21501; RV32IA-TSO-ZACAS-NEXT:    not a4, a4
21502; RV32IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21503; RV32IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB153_1
21504; RV32IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21505; RV32IA-TSO-ZACAS-NEXT:    ret
21506;
21507; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21508; RV64IA-WMO-ZACAS:       # %bb.0:
21509; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
21510; RV64IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21511; RV64IA-WMO-ZACAS-NEXT:  .LBB153_1: # %atomicrmw.start
21512; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21513; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
21514; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21515; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
21516; RV64IA-WMO-ZACAS-NEXT:    amocas.w.aqrl a0, a4, (a2)
21517; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB153_1
21518; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21519; RV64IA-WMO-ZACAS-NEXT:    ret
21520;
21521; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21522; RV64IA-TSO-ZACAS:       # %bb.0:
21523; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
21524; RV64IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21525; RV64IA-TSO-ZACAS-NEXT:  .LBB153_1: # %atomicrmw.start
21526; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21527; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
21528; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21529; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
21530; RV64IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21531; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB153_1
21532; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21533; RV64IA-TSO-ZACAS-NEXT:    ret
21534;
21535; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21536; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
21537; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB153_1: # =>This Inner Loop Header: Depth=1
21538; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aq a2, (a0)
21539; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21540; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
21541; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21542; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB153_1
21543; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21544; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21545; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
21546;
21547; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21548; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
21549; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB153_1: # =>This Inner Loop Header: Depth=1
21550; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w a2, (a0)
21551; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21552; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
21553; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w a3, a3, (a0)
21554; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB153_1
21555; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21556; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21557; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
21558;
21559; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21560; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
21561; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
21562; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21563; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB153_1: # %atomicrmw.start
21564; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21565; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
21566; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21567; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
21568; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.w.aqrl a0, a4, (a2)
21569; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB153_1
21570; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21571; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
21572;
21573; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
21574; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
21575; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
21576; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21577; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB153_1: # %atomicrmw.start
21578; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21579; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
21580; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21581; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
21582; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21583; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB153_1
21584; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21585; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
21586  %1 = atomicrmw nand ptr %a, i32 %b acq_rel
21587  ret i32 %1
21588}
21589
21590define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
21591; RV32I-LABEL: atomicrmw_nand_i32_seq_cst:
21592; RV32I:       # %bb.0:
21593; RV32I-NEXT:    addi sp, sp, -16
21594; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21595; RV32I-NEXT:    li a2, 5
21596; RV32I-NEXT:    call __atomic_fetch_nand_4
21597; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21598; RV32I-NEXT:    addi sp, sp, 16
21599; RV32I-NEXT:    ret
21600;
21601; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21602; RV32IA-NOZACAS:       # %bb.0:
21603; RV32IA-NOZACAS-NEXT:  .LBB154_1: # =>This Inner Loop Header: Depth=1
21604; RV32IA-NOZACAS-NEXT:    lr.w.aqrl a2, (a0)
21605; RV32IA-NOZACAS-NEXT:    and a3, a2, a1
21606; RV32IA-NOZACAS-NEXT:    not a3, a3
21607; RV32IA-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21608; RV32IA-NOZACAS-NEXT:    bnez a3, .LBB154_1
21609; RV32IA-NOZACAS-NEXT:  # %bb.2:
21610; RV32IA-NOZACAS-NEXT:    mv a0, a2
21611; RV32IA-NOZACAS-NEXT:    ret
21612;
21613; RV64I-LABEL: atomicrmw_nand_i32_seq_cst:
21614; RV64I:       # %bb.0:
21615; RV64I-NEXT:    addi sp, sp, -16
21616; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21617; RV64I-NEXT:    li a2, 5
21618; RV64I-NEXT:    call __atomic_fetch_nand_4
21619; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21620; RV64I-NEXT:    addi sp, sp, 16
21621; RV64I-NEXT:    ret
21622;
21623; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21624; RV64IA-NOZACAS:       # %bb.0:
21625; RV64IA-NOZACAS-NEXT:  .LBB154_1: # =>This Inner Loop Header: Depth=1
21626; RV64IA-NOZACAS-NEXT:    lr.w.aqrl a2, (a0)
21627; RV64IA-NOZACAS-NEXT:    and a3, a2, a1
21628; RV64IA-NOZACAS-NEXT:    not a3, a3
21629; RV64IA-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21630; RV64IA-NOZACAS-NEXT:    bnez a3, .LBB154_1
21631; RV64IA-NOZACAS-NEXT:  # %bb.2:
21632; RV64IA-NOZACAS-NEXT:    mv a0, a2
21633; RV64IA-NOZACAS-NEXT:    ret
21634;
21635; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21636; RV32IA-WMO-ZACAS:       # %bb.0:
21637; RV32IA-WMO-ZACAS-NEXT:    mv a2, a0
21638; RV32IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21639; RV32IA-WMO-ZACAS-NEXT:  .LBB154_1: # %atomicrmw.start
21640; RV32IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21641; RV32IA-WMO-ZACAS-NEXT:    mv a3, a0
21642; RV32IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21643; RV32IA-WMO-ZACAS-NEXT:    not a4, a4
21644; RV32IA-WMO-ZACAS-NEXT:    fence rw, rw
21645; RV32IA-WMO-ZACAS-NEXT:    amocas.w.aqrl a0, a4, (a2)
21646; RV32IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB154_1
21647; RV32IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21648; RV32IA-WMO-ZACAS-NEXT:    ret
21649;
21650; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21651; RV32IA-TSO-ZACAS:       # %bb.0:
21652; RV32IA-TSO-ZACAS-NEXT:    mv a2, a0
21653; RV32IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21654; RV32IA-TSO-ZACAS-NEXT:  .LBB154_1: # %atomicrmw.start
21655; RV32IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21656; RV32IA-TSO-ZACAS-NEXT:    mv a3, a0
21657; RV32IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21658; RV32IA-TSO-ZACAS-NEXT:    not a4, a4
21659; RV32IA-TSO-ZACAS-NEXT:    fence rw, rw
21660; RV32IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21661; RV32IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB154_1
21662; RV32IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21663; RV32IA-TSO-ZACAS-NEXT:    ret
21664;
21665; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21666; RV64IA-WMO-ZACAS:       # %bb.0:
21667; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
21668; RV64IA-WMO-ZACAS-NEXT:    lw a0, 0(a0)
21669; RV64IA-WMO-ZACAS-NEXT:  .LBB154_1: # %atomicrmw.start
21670; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21671; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
21672; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
21673; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
21674; RV64IA-WMO-ZACAS-NEXT:    fence rw, rw
21675; RV64IA-WMO-ZACAS-NEXT:    amocas.w.aqrl a0, a4, (a2)
21676; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB154_1
21677; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21678; RV64IA-WMO-ZACAS-NEXT:    ret
21679;
21680; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21681; RV64IA-TSO-ZACAS:       # %bb.0:
21682; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
21683; RV64IA-TSO-ZACAS-NEXT:    lw a0, 0(a0)
21684; RV64IA-TSO-ZACAS-NEXT:  .LBB154_1: # %atomicrmw.start
21685; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21686; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
21687; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
21688; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
21689; RV64IA-TSO-ZACAS-NEXT:    fence rw, rw
21690; RV64IA-TSO-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21691; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB154_1
21692; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21693; RV64IA-TSO-ZACAS-NEXT:    ret
21694;
21695; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21696; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
21697; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB154_1: # =>This Inner Loop Header: Depth=1
21698; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.w.aqrl a2, (a0)
21699; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21700; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
21701; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21702; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB154_1
21703; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21704; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21705; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
21706;
21707; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21708; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
21709; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB154_1: # =>This Inner Loop Header: Depth=1
21710; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.w.aqrl a2, (a0)
21711; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
21712; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
21713; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.w.rl a3, a3, (a0)
21714; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB154_1
21715; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
21716; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
21717; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
21718;
21719; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21720; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
21721; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
21722; RV64IA-WMO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21723; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB154_1: # %atomicrmw.start
21724; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21725; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
21726; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21727; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
21728; RV64IA-WMO-ZABHA-ZACAS-NEXT:    fence rw, rw
21729; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.w.aqrl a0, a4, (a2)
21730; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB154_1
21731; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21732; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
21733;
21734; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
21735; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
21736; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
21737; RV64IA-TSO-ZABHA-ZACAS-NEXT:    lw a0, 0(a0)
21738; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB154_1: # %atomicrmw.start
21739; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
21740; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
21741; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
21742; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
21743; RV64IA-TSO-ZABHA-ZACAS-NEXT:    fence rw, rw
21744; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.w a0, a4, (a2)
21745; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB154_1
21746; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
21747; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
21748  %1 = atomicrmw nand ptr %a, i32 %b seq_cst
21749  ret i32 %1
21750}
21751
21752define i32 @atomicrmw_or_i32_monotonic(ptr %a, i32 %b) nounwind {
21753; RV32I-LABEL: atomicrmw_or_i32_monotonic:
21754; RV32I:       # %bb.0:
21755; RV32I-NEXT:    addi sp, sp, -16
21756; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21757; RV32I-NEXT:    li a2, 0
21758; RV32I-NEXT:    call __atomic_fetch_or_4
21759; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21760; RV32I-NEXT:    addi sp, sp, 16
21761; RV32I-NEXT:    ret
21762;
21763; RV32IA-LABEL: atomicrmw_or_i32_monotonic:
21764; RV32IA:       # %bb.0:
21765; RV32IA-NEXT:    amoor.w a0, a1, (a0)
21766; RV32IA-NEXT:    ret
21767;
21768; RV64I-LABEL: atomicrmw_or_i32_monotonic:
21769; RV64I:       # %bb.0:
21770; RV64I-NEXT:    addi sp, sp, -16
21771; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21772; RV64I-NEXT:    li a2, 0
21773; RV64I-NEXT:    call __atomic_fetch_or_4
21774; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21775; RV64I-NEXT:    addi sp, sp, 16
21776; RV64I-NEXT:    ret
21777;
21778; RV64IA-LABEL: atomicrmw_or_i32_monotonic:
21779; RV64IA:       # %bb.0:
21780; RV64IA-NEXT:    amoor.w a0, a1, (a0)
21781; RV64IA-NEXT:    ret
21782  %1 = atomicrmw or ptr %a, i32 %b monotonic
21783  ret i32 %1
21784}
21785
21786define i32 @atomicrmw_or_i32_acquire(ptr %a, i32 %b) nounwind {
21787; RV32I-LABEL: atomicrmw_or_i32_acquire:
21788; RV32I:       # %bb.0:
21789; RV32I-NEXT:    addi sp, sp, -16
21790; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21791; RV32I-NEXT:    li a2, 2
21792; RV32I-NEXT:    call __atomic_fetch_or_4
21793; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21794; RV32I-NEXT:    addi sp, sp, 16
21795; RV32I-NEXT:    ret
21796;
21797; RV32IA-WMO-LABEL: atomicrmw_or_i32_acquire:
21798; RV32IA-WMO:       # %bb.0:
21799; RV32IA-WMO-NEXT:    amoor.w.aq a0, a1, (a0)
21800; RV32IA-WMO-NEXT:    ret
21801;
21802; RV32IA-TSO-LABEL: atomicrmw_or_i32_acquire:
21803; RV32IA-TSO:       # %bb.0:
21804; RV32IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21805; RV32IA-TSO-NEXT:    ret
21806;
21807; RV64I-LABEL: atomicrmw_or_i32_acquire:
21808; RV64I:       # %bb.0:
21809; RV64I-NEXT:    addi sp, sp, -16
21810; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21811; RV64I-NEXT:    li a2, 2
21812; RV64I-NEXT:    call __atomic_fetch_or_4
21813; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21814; RV64I-NEXT:    addi sp, sp, 16
21815; RV64I-NEXT:    ret
21816;
21817; RV64IA-WMO-LABEL: atomicrmw_or_i32_acquire:
21818; RV64IA-WMO:       # %bb.0:
21819; RV64IA-WMO-NEXT:    amoor.w.aq a0, a1, (a0)
21820; RV64IA-WMO-NEXT:    ret
21821;
21822; RV64IA-TSO-LABEL: atomicrmw_or_i32_acquire:
21823; RV64IA-TSO:       # %bb.0:
21824; RV64IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21825; RV64IA-TSO-NEXT:    ret
21826  %1 = atomicrmw or ptr %a, i32 %b acquire
21827  ret i32 %1
21828}
21829
21830define i32 @atomicrmw_or_i32_release(ptr %a, i32 %b) nounwind {
21831; RV32I-LABEL: atomicrmw_or_i32_release:
21832; RV32I:       # %bb.0:
21833; RV32I-NEXT:    addi sp, sp, -16
21834; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21835; RV32I-NEXT:    li a2, 3
21836; RV32I-NEXT:    call __atomic_fetch_or_4
21837; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21838; RV32I-NEXT:    addi sp, sp, 16
21839; RV32I-NEXT:    ret
21840;
21841; RV32IA-WMO-LABEL: atomicrmw_or_i32_release:
21842; RV32IA-WMO:       # %bb.0:
21843; RV32IA-WMO-NEXT:    amoor.w.rl a0, a1, (a0)
21844; RV32IA-WMO-NEXT:    ret
21845;
21846; RV32IA-TSO-LABEL: atomicrmw_or_i32_release:
21847; RV32IA-TSO:       # %bb.0:
21848; RV32IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21849; RV32IA-TSO-NEXT:    ret
21850;
21851; RV64I-LABEL: atomicrmw_or_i32_release:
21852; RV64I:       # %bb.0:
21853; RV64I-NEXT:    addi sp, sp, -16
21854; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21855; RV64I-NEXT:    li a2, 3
21856; RV64I-NEXT:    call __atomic_fetch_or_4
21857; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21858; RV64I-NEXT:    addi sp, sp, 16
21859; RV64I-NEXT:    ret
21860;
21861; RV64IA-WMO-LABEL: atomicrmw_or_i32_release:
21862; RV64IA-WMO:       # %bb.0:
21863; RV64IA-WMO-NEXT:    amoor.w.rl a0, a1, (a0)
21864; RV64IA-WMO-NEXT:    ret
21865;
21866; RV64IA-TSO-LABEL: atomicrmw_or_i32_release:
21867; RV64IA-TSO:       # %bb.0:
21868; RV64IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21869; RV64IA-TSO-NEXT:    ret
21870  %1 = atomicrmw or ptr %a, i32 %b release
21871  ret i32 %1
21872}
21873
21874define i32 @atomicrmw_or_i32_acq_rel(ptr %a, i32 %b) nounwind {
21875; RV32I-LABEL: atomicrmw_or_i32_acq_rel:
21876; RV32I:       # %bb.0:
21877; RV32I-NEXT:    addi sp, sp, -16
21878; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21879; RV32I-NEXT:    li a2, 4
21880; RV32I-NEXT:    call __atomic_fetch_or_4
21881; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21882; RV32I-NEXT:    addi sp, sp, 16
21883; RV32I-NEXT:    ret
21884;
21885; RV32IA-WMO-LABEL: atomicrmw_or_i32_acq_rel:
21886; RV32IA-WMO:       # %bb.0:
21887; RV32IA-WMO-NEXT:    amoor.w.aqrl a0, a1, (a0)
21888; RV32IA-WMO-NEXT:    ret
21889;
21890; RV32IA-TSO-LABEL: atomicrmw_or_i32_acq_rel:
21891; RV32IA-TSO:       # %bb.0:
21892; RV32IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21893; RV32IA-TSO-NEXT:    ret
21894;
21895; RV64I-LABEL: atomicrmw_or_i32_acq_rel:
21896; RV64I:       # %bb.0:
21897; RV64I-NEXT:    addi sp, sp, -16
21898; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21899; RV64I-NEXT:    li a2, 4
21900; RV64I-NEXT:    call __atomic_fetch_or_4
21901; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21902; RV64I-NEXT:    addi sp, sp, 16
21903; RV64I-NEXT:    ret
21904;
21905; RV64IA-WMO-LABEL: atomicrmw_or_i32_acq_rel:
21906; RV64IA-WMO:       # %bb.0:
21907; RV64IA-WMO-NEXT:    amoor.w.aqrl a0, a1, (a0)
21908; RV64IA-WMO-NEXT:    ret
21909;
21910; RV64IA-TSO-LABEL: atomicrmw_or_i32_acq_rel:
21911; RV64IA-TSO:       # %bb.0:
21912; RV64IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21913; RV64IA-TSO-NEXT:    ret
21914  %1 = atomicrmw or ptr %a, i32 %b acq_rel
21915  ret i32 %1
21916}
21917
21918define i32 @atomicrmw_or_i32_seq_cst(ptr %a, i32 %b) nounwind {
21919; RV32I-LABEL: atomicrmw_or_i32_seq_cst:
21920; RV32I:       # %bb.0:
21921; RV32I-NEXT:    addi sp, sp, -16
21922; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21923; RV32I-NEXT:    li a2, 5
21924; RV32I-NEXT:    call __atomic_fetch_or_4
21925; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21926; RV32I-NEXT:    addi sp, sp, 16
21927; RV32I-NEXT:    ret
21928;
21929; RV32IA-WMO-LABEL: atomicrmw_or_i32_seq_cst:
21930; RV32IA-WMO:       # %bb.0:
21931; RV32IA-WMO-NEXT:    amoor.w.aqrl a0, a1, (a0)
21932; RV32IA-WMO-NEXT:    ret
21933;
21934; RV32IA-TSO-LABEL: atomicrmw_or_i32_seq_cst:
21935; RV32IA-TSO:       # %bb.0:
21936; RV32IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21937; RV32IA-TSO-NEXT:    ret
21938;
21939; RV64I-LABEL: atomicrmw_or_i32_seq_cst:
21940; RV64I:       # %bb.0:
21941; RV64I-NEXT:    addi sp, sp, -16
21942; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21943; RV64I-NEXT:    li a2, 5
21944; RV64I-NEXT:    call __atomic_fetch_or_4
21945; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21946; RV64I-NEXT:    addi sp, sp, 16
21947; RV64I-NEXT:    ret
21948;
21949; RV64IA-WMO-LABEL: atomicrmw_or_i32_seq_cst:
21950; RV64IA-WMO:       # %bb.0:
21951; RV64IA-WMO-NEXT:    amoor.w.aqrl a0, a1, (a0)
21952; RV64IA-WMO-NEXT:    ret
21953;
21954; RV64IA-TSO-LABEL: atomicrmw_or_i32_seq_cst:
21955; RV64IA-TSO:       # %bb.0:
21956; RV64IA-TSO-NEXT:    amoor.w a0, a1, (a0)
21957; RV64IA-TSO-NEXT:    ret
21958  %1 = atomicrmw or ptr %a, i32 %b seq_cst
21959  ret i32 %1
21960}
21961
21962define i32 @atomicrmw_xor_i32_monotonic(ptr %a, i32 %b) nounwind {
21963; RV32I-LABEL: atomicrmw_xor_i32_monotonic:
21964; RV32I:       # %bb.0:
21965; RV32I-NEXT:    addi sp, sp, -16
21966; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21967; RV32I-NEXT:    li a2, 0
21968; RV32I-NEXT:    call __atomic_fetch_xor_4
21969; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
21970; RV32I-NEXT:    addi sp, sp, 16
21971; RV32I-NEXT:    ret
21972;
21973; RV32IA-LABEL: atomicrmw_xor_i32_monotonic:
21974; RV32IA:       # %bb.0:
21975; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
21976; RV32IA-NEXT:    ret
21977;
21978; RV64I-LABEL: atomicrmw_xor_i32_monotonic:
21979; RV64I:       # %bb.0:
21980; RV64I-NEXT:    addi sp, sp, -16
21981; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
21982; RV64I-NEXT:    li a2, 0
21983; RV64I-NEXT:    call __atomic_fetch_xor_4
21984; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21985; RV64I-NEXT:    addi sp, sp, 16
21986; RV64I-NEXT:    ret
21987;
21988; RV64IA-LABEL: atomicrmw_xor_i32_monotonic:
21989; RV64IA:       # %bb.0:
21990; RV64IA-NEXT:    amoxor.w a0, a1, (a0)
21991; RV64IA-NEXT:    ret
21992  %1 = atomicrmw xor ptr %a, i32 %b monotonic
21993  ret i32 %1
21994}
21995
21996define i32 @atomicrmw_xor_i32_acquire(ptr %a, i32 %b) nounwind {
21997; RV32I-LABEL: atomicrmw_xor_i32_acquire:
21998; RV32I:       # %bb.0:
21999; RV32I-NEXT:    addi sp, sp, -16
22000; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22001; RV32I-NEXT:    li a2, 2
22002; RV32I-NEXT:    call __atomic_fetch_xor_4
22003; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22004; RV32I-NEXT:    addi sp, sp, 16
22005; RV32I-NEXT:    ret
22006;
22007; RV32IA-WMO-LABEL: atomicrmw_xor_i32_acquire:
22008; RV32IA-WMO:       # %bb.0:
22009; RV32IA-WMO-NEXT:    amoxor.w.aq a0, a1, (a0)
22010; RV32IA-WMO-NEXT:    ret
22011;
22012; RV32IA-TSO-LABEL: atomicrmw_xor_i32_acquire:
22013; RV32IA-TSO:       # %bb.0:
22014; RV32IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22015; RV32IA-TSO-NEXT:    ret
22016;
22017; RV64I-LABEL: atomicrmw_xor_i32_acquire:
22018; RV64I:       # %bb.0:
22019; RV64I-NEXT:    addi sp, sp, -16
22020; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
22021; RV64I-NEXT:    li a2, 2
22022; RV64I-NEXT:    call __atomic_fetch_xor_4
22023; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
22024; RV64I-NEXT:    addi sp, sp, 16
22025; RV64I-NEXT:    ret
22026;
22027; RV64IA-WMO-LABEL: atomicrmw_xor_i32_acquire:
22028; RV64IA-WMO:       # %bb.0:
22029; RV64IA-WMO-NEXT:    amoxor.w.aq a0, a1, (a0)
22030; RV64IA-WMO-NEXT:    ret
22031;
22032; RV64IA-TSO-LABEL: atomicrmw_xor_i32_acquire:
22033; RV64IA-TSO:       # %bb.0:
22034; RV64IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22035; RV64IA-TSO-NEXT:    ret
22036  %1 = atomicrmw xor ptr %a, i32 %b acquire
22037  ret i32 %1
22038}
22039
22040define i32 @atomicrmw_xor_i32_release(ptr %a, i32 %b) nounwind {
22041; RV32I-LABEL: atomicrmw_xor_i32_release:
22042; RV32I:       # %bb.0:
22043; RV32I-NEXT:    addi sp, sp, -16
22044; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22045; RV32I-NEXT:    li a2, 3
22046; RV32I-NEXT:    call __atomic_fetch_xor_4
22047; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22048; RV32I-NEXT:    addi sp, sp, 16
22049; RV32I-NEXT:    ret
22050;
22051; RV32IA-WMO-LABEL: atomicrmw_xor_i32_release:
22052; RV32IA-WMO:       # %bb.0:
22053; RV32IA-WMO-NEXT:    amoxor.w.rl a0, a1, (a0)
22054; RV32IA-WMO-NEXT:    ret
22055;
22056; RV32IA-TSO-LABEL: atomicrmw_xor_i32_release:
22057; RV32IA-TSO:       # %bb.0:
22058; RV32IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22059; RV32IA-TSO-NEXT:    ret
22060;
22061; RV64I-LABEL: atomicrmw_xor_i32_release:
22062; RV64I:       # %bb.0:
22063; RV64I-NEXT:    addi sp, sp, -16
22064; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
22065; RV64I-NEXT:    li a2, 3
22066; RV64I-NEXT:    call __atomic_fetch_xor_4
22067; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
22068; RV64I-NEXT:    addi sp, sp, 16
22069; RV64I-NEXT:    ret
22070;
22071; RV64IA-WMO-LABEL: atomicrmw_xor_i32_release:
22072; RV64IA-WMO:       # %bb.0:
22073; RV64IA-WMO-NEXT:    amoxor.w.rl a0, a1, (a0)
22074; RV64IA-WMO-NEXT:    ret
22075;
22076; RV64IA-TSO-LABEL: atomicrmw_xor_i32_release:
22077; RV64IA-TSO:       # %bb.0:
22078; RV64IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22079; RV64IA-TSO-NEXT:    ret
22080  %1 = atomicrmw xor ptr %a, i32 %b release
22081  ret i32 %1
22082}
22083
22084define i32 @atomicrmw_xor_i32_acq_rel(ptr %a, i32 %b) nounwind {
22085; RV32I-LABEL: atomicrmw_xor_i32_acq_rel:
22086; RV32I:       # %bb.0:
22087; RV32I-NEXT:    addi sp, sp, -16
22088; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22089; RV32I-NEXT:    li a2, 4
22090; RV32I-NEXT:    call __atomic_fetch_xor_4
22091; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22092; RV32I-NEXT:    addi sp, sp, 16
22093; RV32I-NEXT:    ret
22094;
22095; RV32IA-WMO-LABEL: atomicrmw_xor_i32_acq_rel:
22096; RV32IA-WMO:       # %bb.0:
22097; RV32IA-WMO-NEXT:    amoxor.w.aqrl a0, a1, (a0)
22098; RV32IA-WMO-NEXT:    ret
22099;
22100; RV32IA-TSO-LABEL: atomicrmw_xor_i32_acq_rel:
22101; RV32IA-TSO:       # %bb.0:
22102; RV32IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22103; RV32IA-TSO-NEXT:    ret
22104;
22105; RV64I-LABEL: atomicrmw_xor_i32_acq_rel:
22106; RV64I:       # %bb.0:
22107; RV64I-NEXT:    addi sp, sp, -16
22108; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
22109; RV64I-NEXT:    li a2, 4
22110; RV64I-NEXT:    call __atomic_fetch_xor_4
22111; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
22112; RV64I-NEXT:    addi sp, sp, 16
22113; RV64I-NEXT:    ret
22114;
22115; RV64IA-WMO-LABEL: atomicrmw_xor_i32_acq_rel:
22116; RV64IA-WMO:       # %bb.0:
22117; RV64IA-WMO-NEXT:    amoxor.w.aqrl a0, a1, (a0)
22118; RV64IA-WMO-NEXT:    ret
22119;
22120; RV64IA-TSO-LABEL: atomicrmw_xor_i32_acq_rel:
22121; RV64IA-TSO:       # %bb.0:
22122; RV64IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22123; RV64IA-TSO-NEXT:    ret
22124  %1 = atomicrmw xor ptr %a, i32 %b acq_rel
22125  ret i32 %1
22126}
22127
22128define i32 @atomicrmw_xor_i32_seq_cst(ptr %a, i32 %b) nounwind {
22129; RV32I-LABEL: atomicrmw_xor_i32_seq_cst:
22130; RV32I:       # %bb.0:
22131; RV32I-NEXT:    addi sp, sp, -16
22132; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22133; RV32I-NEXT:    li a2, 5
22134; RV32I-NEXT:    call __atomic_fetch_xor_4
22135; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22136; RV32I-NEXT:    addi sp, sp, 16
22137; RV32I-NEXT:    ret
22138;
22139; RV32IA-WMO-LABEL: atomicrmw_xor_i32_seq_cst:
22140; RV32IA-WMO:       # %bb.0:
22141; RV32IA-WMO-NEXT:    amoxor.w.aqrl a0, a1, (a0)
22142; RV32IA-WMO-NEXT:    ret
22143;
22144; RV32IA-TSO-LABEL: atomicrmw_xor_i32_seq_cst:
22145; RV32IA-TSO:       # %bb.0:
22146; RV32IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22147; RV32IA-TSO-NEXT:    ret
22148;
22149; RV64I-LABEL: atomicrmw_xor_i32_seq_cst:
22150; RV64I:       # %bb.0:
22151; RV64I-NEXT:    addi sp, sp, -16
22152; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
22153; RV64I-NEXT:    li a2, 5
22154; RV64I-NEXT:    call __atomic_fetch_xor_4
22155; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
22156; RV64I-NEXT:    addi sp, sp, 16
22157; RV64I-NEXT:    ret
22158;
22159; RV64IA-WMO-LABEL: atomicrmw_xor_i32_seq_cst:
22160; RV64IA-WMO:       # %bb.0:
22161; RV64IA-WMO-NEXT:    amoxor.w.aqrl a0, a1, (a0)
22162; RV64IA-WMO-NEXT:    ret
22163;
22164; RV64IA-TSO-LABEL: atomicrmw_xor_i32_seq_cst:
22165; RV64IA-TSO:       # %bb.0:
22166; RV64IA-TSO-NEXT:    amoxor.w a0, a1, (a0)
22167; RV64IA-TSO-NEXT:    ret
22168  %1 = atomicrmw xor ptr %a, i32 %b seq_cst
22169  ret i32 %1
22170}
22171
22172define i32 @atomicrmw_max_i32_monotonic(ptr %a, i32 %b) nounwind {
22173; RV32I-LABEL: atomicrmw_max_i32_monotonic:
22174; RV32I:       # %bb.0:
22175; RV32I-NEXT:    addi sp, sp, -16
22176; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22177; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22178; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22179; RV32I-NEXT:    mv s0, a0
22180; RV32I-NEXT:    lw a3, 0(a0)
22181; RV32I-NEXT:    mv s1, a1
22182; RV32I-NEXT:    j .LBB165_2
22183; RV32I-NEXT:  .LBB165_1: # %atomicrmw.start
22184; RV32I-NEXT:    # in Loop: Header=BB165_2 Depth=1
22185; RV32I-NEXT:    sw a3, 0(sp)
22186; RV32I-NEXT:    mv a1, sp
22187; RV32I-NEXT:    mv a0, s0
22188; RV32I-NEXT:    li a3, 0
22189; RV32I-NEXT:    li a4, 0
22190; RV32I-NEXT:    call __atomic_compare_exchange_4
22191; RV32I-NEXT:    lw a3, 0(sp)
22192; RV32I-NEXT:    bnez a0, .LBB165_4
22193; RV32I-NEXT:  .LBB165_2: # %atomicrmw.start
22194; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22195; RV32I-NEXT:    mv a2, a3
22196; RV32I-NEXT:    blt s1, a3, .LBB165_1
22197; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22198; RV32I-NEXT:    # in Loop: Header=BB165_2 Depth=1
22199; RV32I-NEXT:    mv a2, s1
22200; RV32I-NEXT:    j .LBB165_1
22201; RV32I-NEXT:  .LBB165_4: # %atomicrmw.end
22202; RV32I-NEXT:    mv a0, a3
22203; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22204; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22205; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22206; RV32I-NEXT:    addi sp, sp, 16
22207; RV32I-NEXT:    ret
22208;
22209; RV32IA-LABEL: atomicrmw_max_i32_monotonic:
22210; RV32IA:       # %bb.0:
22211; RV32IA-NEXT:    amomax.w a0, a1, (a0)
22212; RV32IA-NEXT:    ret
22213;
22214; RV64I-LABEL: atomicrmw_max_i32_monotonic:
22215; RV64I:       # %bb.0:
22216; RV64I-NEXT:    addi sp, sp, -48
22217; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22218; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22219; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22220; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22221; RV64I-NEXT:    mv s0, a0
22222; RV64I-NEXT:    lw a3, 0(a0)
22223; RV64I-NEXT:    mv s1, a1
22224; RV64I-NEXT:    sext.w s2, a1
22225; RV64I-NEXT:    j .LBB165_2
22226; RV64I-NEXT:  .LBB165_1: # %atomicrmw.start
22227; RV64I-NEXT:    # in Loop: Header=BB165_2 Depth=1
22228; RV64I-NEXT:    sw a3, 12(sp)
22229; RV64I-NEXT:    addi a1, sp, 12
22230; RV64I-NEXT:    mv a0, s0
22231; RV64I-NEXT:    li a3, 0
22232; RV64I-NEXT:    li a4, 0
22233; RV64I-NEXT:    call __atomic_compare_exchange_4
22234; RV64I-NEXT:    lw a3, 12(sp)
22235; RV64I-NEXT:    bnez a0, .LBB165_4
22236; RV64I-NEXT:  .LBB165_2: # %atomicrmw.start
22237; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22238; RV64I-NEXT:    mv a2, a3
22239; RV64I-NEXT:    blt s2, a3, .LBB165_1
22240; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22241; RV64I-NEXT:    # in Loop: Header=BB165_2 Depth=1
22242; RV64I-NEXT:    mv a2, s1
22243; RV64I-NEXT:    j .LBB165_1
22244; RV64I-NEXT:  .LBB165_4: # %atomicrmw.end
22245; RV64I-NEXT:    mv a0, a3
22246; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22247; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22248; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22249; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22250; RV64I-NEXT:    addi sp, sp, 48
22251; RV64I-NEXT:    ret
22252;
22253; RV64IA-LABEL: atomicrmw_max_i32_monotonic:
22254; RV64IA:       # %bb.0:
22255; RV64IA-NEXT:    amomax.w a0, a1, (a0)
22256; RV64IA-NEXT:    ret
22257  %1 = atomicrmw max ptr %a, i32 %b monotonic
22258  ret i32 %1
22259}
22260
22261define i32 @atomicrmw_max_i32_acquire(ptr %a, i32 %b) nounwind {
22262; RV32I-LABEL: atomicrmw_max_i32_acquire:
22263; RV32I:       # %bb.0:
22264; RV32I-NEXT:    addi sp, sp, -16
22265; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22266; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22267; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22268; RV32I-NEXT:    mv s0, a0
22269; RV32I-NEXT:    lw a3, 0(a0)
22270; RV32I-NEXT:    mv s1, a1
22271; RV32I-NEXT:    j .LBB166_2
22272; RV32I-NEXT:  .LBB166_1: # %atomicrmw.start
22273; RV32I-NEXT:    # in Loop: Header=BB166_2 Depth=1
22274; RV32I-NEXT:    sw a3, 0(sp)
22275; RV32I-NEXT:    mv a1, sp
22276; RV32I-NEXT:    li a3, 2
22277; RV32I-NEXT:    li a4, 2
22278; RV32I-NEXT:    mv a0, s0
22279; RV32I-NEXT:    call __atomic_compare_exchange_4
22280; RV32I-NEXT:    lw a3, 0(sp)
22281; RV32I-NEXT:    bnez a0, .LBB166_4
22282; RV32I-NEXT:  .LBB166_2: # %atomicrmw.start
22283; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22284; RV32I-NEXT:    mv a2, a3
22285; RV32I-NEXT:    blt s1, a3, .LBB166_1
22286; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22287; RV32I-NEXT:    # in Loop: Header=BB166_2 Depth=1
22288; RV32I-NEXT:    mv a2, s1
22289; RV32I-NEXT:    j .LBB166_1
22290; RV32I-NEXT:  .LBB166_4: # %atomicrmw.end
22291; RV32I-NEXT:    mv a0, a3
22292; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22293; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22294; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22295; RV32I-NEXT:    addi sp, sp, 16
22296; RV32I-NEXT:    ret
22297;
22298; RV32IA-WMO-LABEL: atomicrmw_max_i32_acquire:
22299; RV32IA-WMO:       # %bb.0:
22300; RV32IA-WMO-NEXT:    amomax.w.aq a0, a1, (a0)
22301; RV32IA-WMO-NEXT:    ret
22302;
22303; RV32IA-TSO-LABEL: atomicrmw_max_i32_acquire:
22304; RV32IA-TSO:       # %bb.0:
22305; RV32IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22306; RV32IA-TSO-NEXT:    ret
22307;
22308; RV64I-LABEL: atomicrmw_max_i32_acquire:
22309; RV64I:       # %bb.0:
22310; RV64I-NEXT:    addi sp, sp, -48
22311; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22312; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22313; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22314; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22315; RV64I-NEXT:    mv s0, a0
22316; RV64I-NEXT:    lw a3, 0(a0)
22317; RV64I-NEXT:    mv s1, a1
22318; RV64I-NEXT:    sext.w s2, a1
22319; RV64I-NEXT:    j .LBB166_2
22320; RV64I-NEXT:  .LBB166_1: # %atomicrmw.start
22321; RV64I-NEXT:    # in Loop: Header=BB166_2 Depth=1
22322; RV64I-NEXT:    sw a3, 12(sp)
22323; RV64I-NEXT:    addi a1, sp, 12
22324; RV64I-NEXT:    li a3, 2
22325; RV64I-NEXT:    li a4, 2
22326; RV64I-NEXT:    mv a0, s0
22327; RV64I-NEXT:    call __atomic_compare_exchange_4
22328; RV64I-NEXT:    lw a3, 12(sp)
22329; RV64I-NEXT:    bnez a0, .LBB166_4
22330; RV64I-NEXT:  .LBB166_2: # %atomicrmw.start
22331; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22332; RV64I-NEXT:    mv a2, a3
22333; RV64I-NEXT:    blt s2, a3, .LBB166_1
22334; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22335; RV64I-NEXT:    # in Loop: Header=BB166_2 Depth=1
22336; RV64I-NEXT:    mv a2, s1
22337; RV64I-NEXT:    j .LBB166_1
22338; RV64I-NEXT:  .LBB166_4: # %atomicrmw.end
22339; RV64I-NEXT:    mv a0, a3
22340; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22341; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22342; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22343; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22344; RV64I-NEXT:    addi sp, sp, 48
22345; RV64I-NEXT:    ret
22346;
22347; RV64IA-WMO-LABEL: atomicrmw_max_i32_acquire:
22348; RV64IA-WMO:       # %bb.0:
22349; RV64IA-WMO-NEXT:    amomax.w.aq a0, a1, (a0)
22350; RV64IA-WMO-NEXT:    ret
22351;
22352; RV64IA-TSO-LABEL: atomicrmw_max_i32_acquire:
22353; RV64IA-TSO:       # %bb.0:
22354; RV64IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22355; RV64IA-TSO-NEXT:    ret
22356  %1 = atomicrmw max ptr %a, i32 %b acquire
22357  ret i32 %1
22358}
22359
22360define i32 @atomicrmw_max_i32_release(ptr %a, i32 %b) nounwind {
22361; RV32I-LABEL: atomicrmw_max_i32_release:
22362; RV32I:       # %bb.0:
22363; RV32I-NEXT:    addi sp, sp, -16
22364; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22365; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22366; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22367; RV32I-NEXT:    mv s0, a0
22368; RV32I-NEXT:    lw a3, 0(a0)
22369; RV32I-NEXT:    mv s1, a1
22370; RV32I-NEXT:    j .LBB167_2
22371; RV32I-NEXT:  .LBB167_1: # %atomicrmw.start
22372; RV32I-NEXT:    # in Loop: Header=BB167_2 Depth=1
22373; RV32I-NEXT:    sw a3, 0(sp)
22374; RV32I-NEXT:    mv a1, sp
22375; RV32I-NEXT:    li a3, 3
22376; RV32I-NEXT:    mv a0, s0
22377; RV32I-NEXT:    li a4, 0
22378; RV32I-NEXT:    call __atomic_compare_exchange_4
22379; RV32I-NEXT:    lw a3, 0(sp)
22380; RV32I-NEXT:    bnez a0, .LBB167_4
22381; RV32I-NEXT:  .LBB167_2: # %atomicrmw.start
22382; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22383; RV32I-NEXT:    mv a2, a3
22384; RV32I-NEXT:    blt s1, a3, .LBB167_1
22385; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22386; RV32I-NEXT:    # in Loop: Header=BB167_2 Depth=1
22387; RV32I-NEXT:    mv a2, s1
22388; RV32I-NEXT:    j .LBB167_1
22389; RV32I-NEXT:  .LBB167_4: # %atomicrmw.end
22390; RV32I-NEXT:    mv a0, a3
22391; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22392; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22393; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22394; RV32I-NEXT:    addi sp, sp, 16
22395; RV32I-NEXT:    ret
22396;
22397; RV32IA-WMO-LABEL: atomicrmw_max_i32_release:
22398; RV32IA-WMO:       # %bb.0:
22399; RV32IA-WMO-NEXT:    amomax.w.rl a0, a1, (a0)
22400; RV32IA-WMO-NEXT:    ret
22401;
22402; RV32IA-TSO-LABEL: atomicrmw_max_i32_release:
22403; RV32IA-TSO:       # %bb.0:
22404; RV32IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22405; RV32IA-TSO-NEXT:    ret
22406;
22407; RV64I-LABEL: atomicrmw_max_i32_release:
22408; RV64I:       # %bb.0:
22409; RV64I-NEXT:    addi sp, sp, -48
22410; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22411; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22412; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22413; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22414; RV64I-NEXT:    mv s0, a0
22415; RV64I-NEXT:    lw a3, 0(a0)
22416; RV64I-NEXT:    mv s1, a1
22417; RV64I-NEXT:    sext.w s2, a1
22418; RV64I-NEXT:    j .LBB167_2
22419; RV64I-NEXT:  .LBB167_1: # %atomicrmw.start
22420; RV64I-NEXT:    # in Loop: Header=BB167_2 Depth=1
22421; RV64I-NEXT:    sw a3, 12(sp)
22422; RV64I-NEXT:    addi a1, sp, 12
22423; RV64I-NEXT:    li a3, 3
22424; RV64I-NEXT:    mv a0, s0
22425; RV64I-NEXT:    li a4, 0
22426; RV64I-NEXT:    call __atomic_compare_exchange_4
22427; RV64I-NEXT:    lw a3, 12(sp)
22428; RV64I-NEXT:    bnez a0, .LBB167_4
22429; RV64I-NEXT:  .LBB167_2: # %atomicrmw.start
22430; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22431; RV64I-NEXT:    mv a2, a3
22432; RV64I-NEXT:    blt s2, a3, .LBB167_1
22433; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22434; RV64I-NEXT:    # in Loop: Header=BB167_2 Depth=1
22435; RV64I-NEXT:    mv a2, s1
22436; RV64I-NEXT:    j .LBB167_1
22437; RV64I-NEXT:  .LBB167_4: # %atomicrmw.end
22438; RV64I-NEXT:    mv a0, a3
22439; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22440; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22441; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22442; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22443; RV64I-NEXT:    addi sp, sp, 48
22444; RV64I-NEXT:    ret
22445;
22446; RV64IA-WMO-LABEL: atomicrmw_max_i32_release:
22447; RV64IA-WMO:       # %bb.0:
22448; RV64IA-WMO-NEXT:    amomax.w.rl a0, a1, (a0)
22449; RV64IA-WMO-NEXT:    ret
22450;
22451; RV64IA-TSO-LABEL: atomicrmw_max_i32_release:
22452; RV64IA-TSO:       # %bb.0:
22453; RV64IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22454; RV64IA-TSO-NEXT:    ret
22455  %1 = atomicrmw max ptr %a, i32 %b release
22456  ret i32 %1
22457}
22458
22459define i32 @atomicrmw_max_i32_acq_rel(ptr %a, i32 %b) nounwind {
22460; RV32I-LABEL: atomicrmw_max_i32_acq_rel:
22461; RV32I:       # %bb.0:
22462; RV32I-NEXT:    addi sp, sp, -16
22463; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22464; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22465; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22466; RV32I-NEXT:    mv s0, a0
22467; RV32I-NEXT:    lw a3, 0(a0)
22468; RV32I-NEXT:    mv s1, a1
22469; RV32I-NEXT:    j .LBB168_2
22470; RV32I-NEXT:  .LBB168_1: # %atomicrmw.start
22471; RV32I-NEXT:    # in Loop: Header=BB168_2 Depth=1
22472; RV32I-NEXT:    sw a3, 0(sp)
22473; RV32I-NEXT:    mv a1, sp
22474; RV32I-NEXT:    li a3, 4
22475; RV32I-NEXT:    li a4, 2
22476; RV32I-NEXT:    mv a0, s0
22477; RV32I-NEXT:    call __atomic_compare_exchange_4
22478; RV32I-NEXT:    lw a3, 0(sp)
22479; RV32I-NEXT:    bnez a0, .LBB168_4
22480; RV32I-NEXT:  .LBB168_2: # %atomicrmw.start
22481; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22482; RV32I-NEXT:    mv a2, a3
22483; RV32I-NEXT:    blt s1, a3, .LBB168_1
22484; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22485; RV32I-NEXT:    # in Loop: Header=BB168_2 Depth=1
22486; RV32I-NEXT:    mv a2, s1
22487; RV32I-NEXT:    j .LBB168_1
22488; RV32I-NEXT:  .LBB168_4: # %atomicrmw.end
22489; RV32I-NEXT:    mv a0, a3
22490; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22491; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22492; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22493; RV32I-NEXT:    addi sp, sp, 16
22494; RV32I-NEXT:    ret
22495;
22496; RV32IA-WMO-LABEL: atomicrmw_max_i32_acq_rel:
22497; RV32IA-WMO:       # %bb.0:
22498; RV32IA-WMO-NEXT:    amomax.w.aqrl a0, a1, (a0)
22499; RV32IA-WMO-NEXT:    ret
22500;
22501; RV32IA-TSO-LABEL: atomicrmw_max_i32_acq_rel:
22502; RV32IA-TSO:       # %bb.0:
22503; RV32IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22504; RV32IA-TSO-NEXT:    ret
22505;
22506; RV64I-LABEL: atomicrmw_max_i32_acq_rel:
22507; RV64I:       # %bb.0:
22508; RV64I-NEXT:    addi sp, sp, -48
22509; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22510; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22511; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22512; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22513; RV64I-NEXT:    mv s0, a0
22514; RV64I-NEXT:    lw a3, 0(a0)
22515; RV64I-NEXT:    mv s1, a1
22516; RV64I-NEXT:    sext.w s2, a1
22517; RV64I-NEXT:    j .LBB168_2
22518; RV64I-NEXT:  .LBB168_1: # %atomicrmw.start
22519; RV64I-NEXT:    # in Loop: Header=BB168_2 Depth=1
22520; RV64I-NEXT:    sw a3, 12(sp)
22521; RV64I-NEXT:    addi a1, sp, 12
22522; RV64I-NEXT:    li a3, 4
22523; RV64I-NEXT:    li a4, 2
22524; RV64I-NEXT:    mv a0, s0
22525; RV64I-NEXT:    call __atomic_compare_exchange_4
22526; RV64I-NEXT:    lw a3, 12(sp)
22527; RV64I-NEXT:    bnez a0, .LBB168_4
22528; RV64I-NEXT:  .LBB168_2: # %atomicrmw.start
22529; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22530; RV64I-NEXT:    mv a2, a3
22531; RV64I-NEXT:    blt s2, a3, .LBB168_1
22532; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22533; RV64I-NEXT:    # in Loop: Header=BB168_2 Depth=1
22534; RV64I-NEXT:    mv a2, s1
22535; RV64I-NEXT:    j .LBB168_1
22536; RV64I-NEXT:  .LBB168_4: # %atomicrmw.end
22537; RV64I-NEXT:    mv a0, a3
22538; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22539; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22540; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22541; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22542; RV64I-NEXT:    addi sp, sp, 48
22543; RV64I-NEXT:    ret
22544;
22545; RV64IA-WMO-LABEL: atomicrmw_max_i32_acq_rel:
22546; RV64IA-WMO:       # %bb.0:
22547; RV64IA-WMO-NEXT:    amomax.w.aqrl a0, a1, (a0)
22548; RV64IA-WMO-NEXT:    ret
22549;
22550; RV64IA-TSO-LABEL: atomicrmw_max_i32_acq_rel:
22551; RV64IA-TSO:       # %bb.0:
22552; RV64IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22553; RV64IA-TSO-NEXT:    ret
22554  %1 = atomicrmw max ptr %a, i32 %b acq_rel
22555  ret i32 %1
22556}
22557
22558define i32 @atomicrmw_max_i32_seq_cst(ptr %a, i32 %b) nounwind {
22559; RV32I-LABEL: atomicrmw_max_i32_seq_cst:
22560; RV32I:       # %bb.0:
22561; RV32I-NEXT:    addi sp, sp, -16
22562; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22563; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22564; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22565; RV32I-NEXT:    mv s0, a0
22566; RV32I-NEXT:    lw a3, 0(a0)
22567; RV32I-NEXT:    mv s1, a1
22568; RV32I-NEXT:    j .LBB169_2
22569; RV32I-NEXT:  .LBB169_1: # %atomicrmw.start
22570; RV32I-NEXT:    # in Loop: Header=BB169_2 Depth=1
22571; RV32I-NEXT:    sw a3, 0(sp)
22572; RV32I-NEXT:    mv a1, sp
22573; RV32I-NEXT:    li a3, 5
22574; RV32I-NEXT:    li a4, 5
22575; RV32I-NEXT:    mv a0, s0
22576; RV32I-NEXT:    call __atomic_compare_exchange_4
22577; RV32I-NEXT:    lw a3, 0(sp)
22578; RV32I-NEXT:    bnez a0, .LBB169_4
22579; RV32I-NEXT:  .LBB169_2: # %atomicrmw.start
22580; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22581; RV32I-NEXT:    mv a2, a3
22582; RV32I-NEXT:    blt s1, a3, .LBB169_1
22583; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22584; RV32I-NEXT:    # in Loop: Header=BB169_2 Depth=1
22585; RV32I-NEXT:    mv a2, s1
22586; RV32I-NEXT:    j .LBB169_1
22587; RV32I-NEXT:  .LBB169_4: # %atomicrmw.end
22588; RV32I-NEXT:    mv a0, a3
22589; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22590; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22591; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22592; RV32I-NEXT:    addi sp, sp, 16
22593; RV32I-NEXT:    ret
22594;
22595; RV32IA-WMO-LABEL: atomicrmw_max_i32_seq_cst:
22596; RV32IA-WMO:       # %bb.0:
22597; RV32IA-WMO-NEXT:    amomax.w.aqrl a0, a1, (a0)
22598; RV32IA-WMO-NEXT:    ret
22599;
22600; RV32IA-TSO-LABEL: atomicrmw_max_i32_seq_cst:
22601; RV32IA-TSO:       # %bb.0:
22602; RV32IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22603; RV32IA-TSO-NEXT:    ret
22604;
22605; RV64I-LABEL: atomicrmw_max_i32_seq_cst:
22606; RV64I:       # %bb.0:
22607; RV64I-NEXT:    addi sp, sp, -48
22608; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22609; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22610; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22611; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22612; RV64I-NEXT:    mv s0, a0
22613; RV64I-NEXT:    lw a3, 0(a0)
22614; RV64I-NEXT:    mv s1, a1
22615; RV64I-NEXT:    sext.w s2, a1
22616; RV64I-NEXT:    j .LBB169_2
22617; RV64I-NEXT:  .LBB169_1: # %atomicrmw.start
22618; RV64I-NEXT:    # in Loop: Header=BB169_2 Depth=1
22619; RV64I-NEXT:    sw a3, 12(sp)
22620; RV64I-NEXT:    addi a1, sp, 12
22621; RV64I-NEXT:    li a3, 5
22622; RV64I-NEXT:    li a4, 5
22623; RV64I-NEXT:    mv a0, s0
22624; RV64I-NEXT:    call __atomic_compare_exchange_4
22625; RV64I-NEXT:    lw a3, 12(sp)
22626; RV64I-NEXT:    bnez a0, .LBB169_4
22627; RV64I-NEXT:  .LBB169_2: # %atomicrmw.start
22628; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22629; RV64I-NEXT:    mv a2, a3
22630; RV64I-NEXT:    blt s2, a3, .LBB169_1
22631; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22632; RV64I-NEXT:    # in Loop: Header=BB169_2 Depth=1
22633; RV64I-NEXT:    mv a2, s1
22634; RV64I-NEXT:    j .LBB169_1
22635; RV64I-NEXT:  .LBB169_4: # %atomicrmw.end
22636; RV64I-NEXT:    mv a0, a3
22637; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22638; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22639; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22640; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22641; RV64I-NEXT:    addi sp, sp, 48
22642; RV64I-NEXT:    ret
22643;
22644; RV64IA-WMO-LABEL: atomicrmw_max_i32_seq_cst:
22645; RV64IA-WMO:       # %bb.0:
22646; RV64IA-WMO-NEXT:    amomax.w.aqrl a0, a1, (a0)
22647; RV64IA-WMO-NEXT:    ret
22648;
22649; RV64IA-TSO-LABEL: atomicrmw_max_i32_seq_cst:
22650; RV64IA-TSO:       # %bb.0:
22651; RV64IA-TSO-NEXT:    amomax.w a0, a1, (a0)
22652; RV64IA-TSO-NEXT:    ret
22653  %1 = atomicrmw max ptr %a, i32 %b seq_cst
22654  ret i32 %1
22655}
22656
22657define i32 @atomicrmw_min_i32_monotonic(ptr %a, i32 %b) nounwind {
22658; RV32I-LABEL: atomicrmw_min_i32_monotonic:
22659; RV32I:       # %bb.0:
22660; RV32I-NEXT:    addi sp, sp, -16
22661; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22662; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22663; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22664; RV32I-NEXT:    mv s0, a0
22665; RV32I-NEXT:    lw a3, 0(a0)
22666; RV32I-NEXT:    mv s1, a1
22667; RV32I-NEXT:    j .LBB170_2
22668; RV32I-NEXT:  .LBB170_1: # %atomicrmw.start
22669; RV32I-NEXT:    # in Loop: Header=BB170_2 Depth=1
22670; RV32I-NEXT:    sw a3, 0(sp)
22671; RV32I-NEXT:    mv a1, sp
22672; RV32I-NEXT:    mv a0, s0
22673; RV32I-NEXT:    li a3, 0
22674; RV32I-NEXT:    li a4, 0
22675; RV32I-NEXT:    call __atomic_compare_exchange_4
22676; RV32I-NEXT:    lw a3, 0(sp)
22677; RV32I-NEXT:    bnez a0, .LBB170_4
22678; RV32I-NEXT:  .LBB170_2: # %atomicrmw.start
22679; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22680; RV32I-NEXT:    mv a2, a3
22681; RV32I-NEXT:    bge s1, a3, .LBB170_1
22682; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22683; RV32I-NEXT:    # in Loop: Header=BB170_2 Depth=1
22684; RV32I-NEXT:    mv a2, s1
22685; RV32I-NEXT:    j .LBB170_1
22686; RV32I-NEXT:  .LBB170_4: # %atomicrmw.end
22687; RV32I-NEXT:    mv a0, a3
22688; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22689; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22690; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22691; RV32I-NEXT:    addi sp, sp, 16
22692; RV32I-NEXT:    ret
22693;
22694; RV32IA-LABEL: atomicrmw_min_i32_monotonic:
22695; RV32IA:       # %bb.0:
22696; RV32IA-NEXT:    amomin.w a0, a1, (a0)
22697; RV32IA-NEXT:    ret
22698;
22699; RV64I-LABEL: atomicrmw_min_i32_monotonic:
22700; RV64I:       # %bb.0:
22701; RV64I-NEXT:    addi sp, sp, -48
22702; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22703; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22704; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22705; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22706; RV64I-NEXT:    mv s0, a0
22707; RV64I-NEXT:    lw a3, 0(a0)
22708; RV64I-NEXT:    mv s1, a1
22709; RV64I-NEXT:    sext.w s2, a1
22710; RV64I-NEXT:    j .LBB170_2
22711; RV64I-NEXT:  .LBB170_1: # %atomicrmw.start
22712; RV64I-NEXT:    # in Loop: Header=BB170_2 Depth=1
22713; RV64I-NEXT:    sw a3, 12(sp)
22714; RV64I-NEXT:    addi a1, sp, 12
22715; RV64I-NEXT:    mv a0, s0
22716; RV64I-NEXT:    li a3, 0
22717; RV64I-NEXT:    li a4, 0
22718; RV64I-NEXT:    call __atomic_compare_exchange_4
22719; RV64I-NEXT:    lw a3, 12(sp)
22720; RV64I-NEXT:    bnez a0, .LBB170_4
22721; RV64I-NEXT:  .LBB170_2: # %atomicrmw.start
22722; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22723; RV64I-NEXT:    mv a2, a3
22724; RV64I-NEXT:    bge s2, a3, .LBB170_1
22725; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22726; RV64I-NEXT:    # in Loop: Header=BB170_2 Depth=1
22727; RV64I-NEXT:    mv a2, s1
22728; RV64I-NEXT:    j .LBB170_1
22729; RV64I-NEXT:  .LBB170_4: # %atomicrmw.end
22730; RV64I-NEXT:    mv a0, a3
22731; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22732; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22733; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22734; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22735; RV64I-NEXT:    addi sp, sp, 48
22736; RV64I-NEXT:    ret
22737;
22738; RV64IA-LABEL: atomicrmw_min_i32_monotonic:
22739; RV64IA:       # %bb.0:
22740; RV64IA-NEXT:    amomin.w a0, a1, (a0)
22741; RV64IA-NEXT:    ret
22742  %1 = atomicrmw min ptr %a, i32 %b monotonic
22743  ret i32 %1
22744}
22745
22746define i32 @atomicrmw_min_i32_acquire(ptr %a, i32 %b) nounwind {
22747; RV32I-LABEL: atomicrmw_min_i32_acquire:
22748; RV32I:       # %bb.0:
22749; RV32I-NEXT:    addi sp, sp, -16
22750; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22751; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22752; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22753; RV32I-NEXT:    mv s0, a0
22754; RV32I-NEXT:    lw a3, 0(a0)
22755; RV32I-NEXT:    mv s1, a1
22756; RV32I-NEXT:    j .LBB171_2
22757; RV32I-NEXT:  .LBB171_1: # %atomicrmw.start
22758; RV32I-NEXT:    # in Loop: Header=BB171_2 Depth=1
22759; RV32I-NEXT:    sw a3, 0(sp)
22760; RV32I-NEXT:    mv a1, sp
22761; RV32I-NEXT:    li a3, 2
22762; RV32I-NEXT:    li a4, 2
22763; RV32I-NEXT:    mv a0, s0
22764; RV32I-NEXT:    call __atomic_compare_exchange_4
22765; RV32I-NEXT:    lw a3, 0(sp)
22766; RV32I-NEXT:    bnez a0, .LBB171_4
22767; RV32I-NEXT:  .LBB171_2: # %atomicrmw.start
22768; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22769; RV32I-NEXT:    mv a2, a3
22770; RV32I-NEXT:    bge s1, a3, .LBB171_1
22771; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22772; RV32I-NEXT:    # in Loop: Header=BB171_2 Depth=1
22773; RV32I-NEXT:    mv a2, s1
22774; RV32I-NEXT:    j .LBB171_1
22775; RV32I-NEXT:  .LBB171_4: # %atomicrmw.end
22776; RV32I-NEXT:    mv a0, a3
22777; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22778; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22779; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22780; RV32I-NEXT:    addi sp, sp, 16
22781; RV32I-NEXT:    ret
22782;
22783; RV32IA-WMO-LABEL: atomicrmw_min_i32_acquire:
22784; RV32IA-WMO:       # %bb.0:
22785; RV32IA-WMO-NEXT:    amomin.w.aq a0, a1, (a0)
22786; RV32IA-WMO-NEXT:    ret
22787;
22788; RV32IA-TSO-LABEL: atomicrmw_min_i32_acquire:
22789; RV32IA-TSO:       # %bb.0:
22790; RV32IA-TSO-NEXT:    amomin.w a0, a1, (a0)
22791; RV32IA-TSO-NEXT:    ret
22792;
22793; RV64I-LABEL: atomicrmw_min_i32_acquire:
22794; RV64I:       # %bb.0:
22795; RV64I-NEXT:    addi sp, sp, -48
22796; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22797; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22798; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22799; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22800; RV64I-NEXT:    mv s0, a0
22801; RV64I-NEXT:    lw a3, 0(a0)
22802; RV64I-NEXT:    mv s1, a1
22803; RV64I-NEXT:    sext.w s2, a1
22804; RV64I-NEXT:    j .LBB171_2
22805; RV64I-NEXT:  .LBB171_1: # %atomicrmw.start
22806; RV64I-NEXT:    # in Loop: Header=BB171_2 Depth=1
22807; RV64I-NEXT:    sw a3, 12(sp)
22808; RV64I-NEXT:    addi a1, sp, 12
22809; RV64I-NEXT:    li a3, 2
22810; RV64I-NEXT:    li a4, 2
22811; RV64I-NEXT:    mv a0, s0
22812; RV64I-NEXT:    call __atomic_compare_exchange_4
22813; RV64I-NEXT:    lw a3, 12(sp)
22814; RV64I-NEXT:    bnez a0, .LBB171_4
22815; RV64I-NEXT:  .LBB171_2: # %atomicrmw.start
22816; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22817; RV64I-NEXT:    mv a2, a3
22818; RV64I-NEXT:    bge s2, a3, .LBB171_1
22819; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22820; RV64I-NEXT:    # in Loop: Header=BB171_2 Depth=1
22821; RV64I-NEXT:    mv a2, s1
22822; RV64I-NEXT:    j .LBB171_1
22823; RV64I-NEXT:  .LBB171_4: # %atomicrmw.end
22824; RV64I-NEXT:    mv a0, a3
22825; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22826; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22827; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22828; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22829; RV64I-NEXT:    addi sp, sp, 48
22830; RV64I-NEXT:    ret
22831;
22832; RV64IA-WMO-LABEL: atomicrmw_min_i32_acquire:
22833; RV64IA-WMO:       # %bb.0:
22834; RV64IA-WMO-NEXT:    amomin.w.aq a0, a1, (a0)
22835; RV64IA-WMO-NEXT:    ret
22836;
22837; RV64IA-TSO-LABEL: atomicrmw_min_i32_acquire:
22838; RV64IA-TSO:       # %bb.0:
22839; RV64IA-TSO-NEXT:    amomin.w a0, a1, (a0)
22840; RV64IA-TSO-NEXT:    ret
22841  %1 = atomicrmw min ptr %a, i32 %b acquire
22842  ret i32 %1
22843}
22844
22845define i32 @atomicrmw_min_i32_release(ptr %a, i32 %b) nounwind {
22846; RV32I-LABEL: atomicrmw_min_i32_release:
22847; RV32I:       # %bb.0:
22848; RV32I-NEXT:    addi sp, sp, -16
22849; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22850; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22851; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22852; RV32I-NEXT:    mv s0, a0
22853; RV32I-NEXT:    lw a3, 0(a0)
22854; RV32I-NEXT:    mv s1, a1
22855; RV32I-NEXT:    j .LBB172_2
22856; RV32I-NEXT:  .LBB172_1: # %atomicrmw.start
22857; RV32I-NEXT:    # in Loop: Header=BB172_2 Depth=1
22858; RV32I-NEXT:    sw a3, 0(sp)
22859; RV32I-NEXT:    mv a1, sp
22860; RV32I-NEXT:    li a3, 3
22861; RV32I-NEXT:    mv a0, s0
22862; RV32I-NEXT:    li a4, 0
22863; RV32I-NEXT:    call __atomic_compare_exchange_4
22864; RV32I-NEXT:    lw a3, 0(sp)
22865; RV32I-NEXT:    bnez a0, .LBB172_4
22866; RV32I-NEXT:  .LBB172_2: # %atomicrmw.start
22867; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22868; RV32I-NEXT:    mv a2, a3
22869; RV32I-NEXT:    bge s1, a3, .LBB172_1
22870; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22871; RV32I-NEXT:    # in Loop: Header=BB172_2 Depth=1
22872; RV32I-NEXT:    mv a2, s1
22873; RV32I-NEXT:    j .LBB172_1
22874; RV32I-NEXT:  .LBB172_4: # %atomicrmw.end
22875; RV32I-NEXT:    mv a0, a3
22876; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22877; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22878; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22879; RV32I-NEXT:    addi sp, sp, 16
22880; RV32I-NEXT:    ret
22881;
22882; RV32IA-WMO-LABEL: atomicrmw_min_i32_release:
22883; RV32IA-WMO:       # %bb.0:
22884; RV32IA-WMO-NEXT:    amomin.w.rl a0, a1, (a0)
22885; RV32IA-WMO-NEXT:    ret
22886;
22887; RV32IA-TSO-LABEL: atomicrmw_min_i32_release:
22888; RV32IA-TSO:       # %bb.0:
22889; RV32IA-TSO-NEXT:    amomin.w a0, a1, (a0)
22890; RV32IA-TSO-NEXT:    ret
22891;
22892; RV64I-LABEL: atomicrmw_min_i32_release:
22893; RV64I:       # %bb.0:
22894; RV64I-NEXT:    addi sp, sp, -48
22895; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22896; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22897; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22898; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22899; RV64I-NEXT:    mv s0, a0
22900; RV64I-NEXT:    lw a3, 0(a0)
22901; RV64I-NEXT:    mv s1, a1
22902; RV64I-NEXT:    sext.w s2, a1
22903; RV64I-NEXT:    j .LBB172_2
22904; RV64I-NEXT:  .LBB172_1: # %atomicrmw.start
22905; RV64I-NEXT:    # in Loop: Header=BB172_2 Depth=1
22906; RV64I-NEXT:    sw a3, 12(sp)
22907; RV64I-NEXT:    addi a1, sp, 12
22908; RV64I-NEXT:    li a3, 3
22909; RV64I-NEXT:    mv a0, s0
22910; RV64I-NEXT:    li a4, 0
22911; RV64I-NEXT:    call __atomic_compare_exchange_4
22912; RV64I-NEXT:    lw a3, 12(sp)
22913; RV64I-NEXT:    bnez a0, .LBB172_4
22914; RV64I-NEXT:  .LBB172_2: # %atomicrmw.start
22915; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
22916; RV64I-NEXT:    mv a2, a3
22917; RV64I-NEXT:    bge s2, a3, .LBB172_1
22918; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
22919; RV64I-NEXT:    # in Loop: Header=BB172_2 Depth=1
22920; RV64I-NEXT:    mv a2, s1
22921; RV64I-NEXT:    j .LBB172_1
22922; RV64I-NEXT:  .LBB172_4: # %atomicrmw.end
22923; RV64I-NEXT:    mv a0, a3
22924; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
22925; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
22926; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
22927; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
22928; RV64I-NEXT:    addi sp, sp, 48
22929; RV64I-NEXT:    ret
22930;
22931; RV64IA-WMO-LABEL: atomicrmw_min_i32_release:
22932; RV64IA-WMO:       # %bb.0:
22933; RV64IA-WMO-NEXT:    amomin.w.rl a0, a1, (a0)
22934; RV64IA-WMO-NEXT:    ret
22935;
22936; RV64IA-TSO-LABEL: atomicrmw_min_i32_release:
22937; RV64IA-TSO:       # %bb.0:
22938; RV64IA-TSO-NEXT:    amomin.w a0, a1, (a0)
22939; RV64IA-TSO-NEXT:    ret
22940  %1 = atomicrmw min ptr %a, i32 %b release
22941  ret i32 %1
22942}
22943
22944define i32 @atomicrmw_min_i32_acq_rel(ptr %a, i32 %b) nounwind {
22945; RV32I-LABEL: atomicrmw_min_i32_acq_rel:
22946; RV32I:       # %bb.0:
22947; RV32I-NEXT:    addi sp, sp, -16
22948; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
22949; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
22950; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
22951; RV32I-NEXT:    mv s0, a0
22952; RV32I-NEXT:    lw a3, 0(a0)
22953; RV32I-NEXT:    mv s1, a1
22954; RV32I-NEXT:    j .LBB173_2
22955; RV32I-NEXT:  .LBB173_1: # %atomicrmw.start
22956; RV32I-NEXT:    # in Loop: Header=BB173_2 Depth=1
22957; RV32I-NEXT:    sw a3, 0(sp)
22958; RV32I-NEXT:    mv a1, sp
22959; RV32I-NEXT:    li a3, 4
22960; RV32I-NEXT:    li a4, 2
22961; RV32I-NEXT:    mv a0, s0
22962; RV32I-NEXT:    call __atomic_compare_exchange_4
22963; RV32I-NEXT:    lw a3, 0(sp)
22964; RV32I-NEXT:    bnez a0, .LBB173_4
22965; RV32I-NEXT:  .LBB173_2: # %atomicrmw.start
22966; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
22967; RV32I-NEXT:    mv a2, a3
22968; RV32I-NEXT:    bge s1, a3, .LBB173_1
22969; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
22970; RV32I-NEXT:    # in Loop: Header=BB173_2 Depth=1
22971; RV32I-NEXT:    mv a2, s1
22972; RV32I-NEXT:    j .LBB173_1
22973; RV32I-NEXT:  .LBB173_4: # %atomicrmw.end
22974; RV32I-NEXT:    mv a0, a3
22975; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
22976; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
22977; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
22978; RV32I-NEXT:    addi sp, sp, 16
22979; RV32I-NEXT:    ret
22980;
22981; RV32IA-WMO-LABEL: atomicrmw_min_i32_acq_rel:
22982; RV32IA-WMO:       # %bb.0:
22983; RV32IA-WMO-NEXT:    amomin.w.aqrl a0, a1, (a0)
22984; RV32IA-WMO-NEXT:    ret
22985;
22986; RV32IA-TSO-LABEL: atomicrmw_min_i32_acq_rel:
22987; RV32IA-TSO:       # %bb.0:
22988; RV32IA-TSO-NEXT:    amomin.w a0, a1, (a0)
22989; RV32IA-TSO-NEXT:    ret
22990;
22991; RV64I-LABEL: atomicrmw_min_i32_acq_rel:
22992; RV64I:       # %bb.0:
22993; RV64I-NEXT:    addi sp, sp, -48
22994; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
22995; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
22996; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
22997; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
22998; RV64I-NEXT:    mv s0, a0
22999; RV64I-NEXT:    lw a3, 0(a0)
23000; RV64I-NEXT:    mv s1, a1
23001; RV64I-NEXT:    sext.w s2, a1
23002; RV64I-NEXT:    j .LBB173_2
23003; RV64I-NEXT:  .LBB173_1: # %atomicrmw.start
23004; RV64I-NEXT:    # in Loop: Header=BB173_2 Depth=1
23005; RV64I-NEXT:    sw a3, 12(sp)
23006; RV64I-NEXT:    addi a1, sp, 12
23007; RV64I-NEXT:    li a3, 4
23008; RV64I-NEXT:    li a4, 2
23009; RV64I-NEXT:    mv a0, s0
23010; RV64I-NEXT:    call __atomic_compare_exchange_4
23011; RV64I-NEXT:    lw a3, 12(sp)
23012; RV64I-NEXT:    bnez a0, .LBB173_4
23013; RV64I-NEXT:  .LBB173_2: # %atomicrmw.start
23014; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23015; RV64I-NEXT:    mv a2, a3
23016; RV64I-NEXT:    bge s2, a3, .LBB173_1
23017; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23018; RV64I-NEXT:    # in Loop: Header=BB173_2 Depth=1
23019; RV64I-NEXT:    mv a2, s1
23020; RV64I-NEXT:    j .LBB173_1
23021; RV64I-NEXT:  .LBB173_4: # %atomicrmw.end
23022; RV64I-NEXT:    mv a0, a3
23023; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23024; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23025; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23026; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23027; RV64I-NEXT:    addi sp, sp, 48
23028; RV64I-NEXT:    ret
23029;
23030; RV64IA-WMO-LABEL: atomicrmw_min_i32_acq_rel:
23031; RV64IA-WMO:       # %bb.0:
23032; RV64IA-WMO-NEXT:    amomin.w.aqrl a0, a1, (a0)
23033; RV64IA-WMO-NEXT:    ret
23034;
23035; RV64IA-TSO-LABEL: atomicrmw_min_i32_acq_rel:
23036; RV64IA-TSO:       # %bb.0:
23037; RV64IA-TSO-NEXT:    amomin.w a0, a1, (a0)
23038; RV64IA-TSO-NEXT:    ret
23039  %1 = atomicrmw min ptr %a, i32 %b acq_rel
23040  ret i32 %1
23041}
23042
23043define i32 @atomicrmw_min_i32_seq_cst(ptr %a, i32 %b) nounwind {
23044; RV32I-LABEL: atomicrmw_min_i32_seq_cst:
23045; RV32I:       # %bb.0:
23046; RV32I-NEXT:    addi sp, sp, -16
23047; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23048; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23049; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23050; RV32I-NEXT:    mv s0, a0
23051; RV32I-NEXT:    lw a3, 0(a0)
23052; RV32I-NEXT:    mv s1, a1
23053; RV32I-NEXT:    j .LBB174_2
23054; RV32I-NEXT:  .LBB174_1: # %atomicrmw.start
23055; RV32I-NEXT:    # in Loop: Header=BB174_2 Depth=1
23056; RV32I-NEXT:    sw a3, 0(sp)
23057; RV32I-NEXT:    mv a1, sp
23058; RV32I-NEXT:    li a3, 5
23059; RV32I-NEXT:    li a4, 5
23060; RV32I-NEXT:    mv a0, s0
23061; RV32I-NEXT:    call __atomic_compare_exchange_4
23062; RV32I-NEXT:    lw a3, 0(sp)
23063; RV32I-NEXT:    bnez a0, .LBB174_4
23064; RV32I-NEXT:  .LBB174_2: # %atomicrmw.start
23065; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23066; RV32I-NEXT:    mv a2, a3
23067; RV32I-NEXT:    bge s1, a3, .LBB174_1
23068; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23069; RV32I-NEXT:    # in Loop: Header=BB174_2 Depth=1
23070; RV32I-NEXT:    mv a2, s1
23071; RV32I-NEXT:    j .LBB174_1
23072; RV32I-NEXT:  .LBB174_4: # %atomicrmw.end
23073; RV32I-NEXT:    mv a0, a3
23074; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23075; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23076; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23077; RV32I-NEXT:    addi sp, sp, 16
23078; RV32I-NEXT:    ret
23079;
23080; RV32IA-WMO-LABEL: atomicrmw_min_i32_seq_cst:
23081; RV32IA-WMO:       # %bb.0:
23082; RV32IA-WMO-NEXT:    amomin.w.aqrl a0, a1, (a0)
23083; RV32IA-WMO-NEXT:    ret
23084;
23085; RV32IA-TSO-LABEL: atomicrmw_min_i32_seq_cst:
23086; RV32IA-TSO:       # %bb.0:
23087; RV32IA-TSO-NEXT:    amomin.w a0, a1, (a0)
23088; RV32IA-TSO-NEXT:    ret
23089;
23090; RV64I-LABEL: atomicrmw_min_i32_seq_cst:
23091; RV64I:       # %bb.0:
23092; RV64I-NEXT:    addi sp, sp, -48
23093; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23094; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23095; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23096; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23097; RV64I-NEXT:    mv s0, a0
23098; RV64I-NEXT:    lw a3, 0(a0)
23099; RV64I-NEXT:    mv s1, a1
23100; RV64I-NEXT:    sext.w s2, a1
23101; RV64I-NEXT:    j .LBB174_2
23102; RV64I-NEXT:  .LBB174_1: # %atomicrmw.start
23103; RV64I-NEXT:    # in Loop: Header=BB174_2 Depth=1
23104; RV64I-NEXT:    sw a3, 12(sp)
23105; RV64I-NEXT:    addi a1, sp, 12
23106; RV64I-NEXT:    li a3, 5
23107; RV64I-NEXT:    li a4, 5
23108; RV64I-NEXT:    mv a0, s0
23109; RV64I-NEXT:    call __atomic_compare_exchange_4
23110; RV64I-NEXT:    lw a3, 12(sp)
23111; RV64I-NEXT:    bnez a0, .LBB174_4
23112; RV64I-NEXT:  .LBB174_2: # %atomicrmw.start
23113; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23114; RV64I-NEXT:    mv a2, a3
23115; RV64I-NEXT:    bge s2, a3, .LBB174_1
23116; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23117; RV64I-NEXT:    # in Loop: Header=BB174_2 Depth=1
23118; RV64I-NEXT:    mv a2, s1
23119; RV64I-NEXT:    j .LBB174_1
23120; RV64I-NEXT:  .LBB174_4: # %atomicrmw.end
23121; RV64I-NEXT:    mv a0, a3
23122; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23123; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23124; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23125; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23126; RV64I-NEXT:    addi sp, sp, 48
23127; RV64I-NEXT:    ret
23128;
23129; RV64IA-WMO-LABEL: atomicrmw_min_i32_seq_cst:
23130; RV64IA-WMO:       # %bb.0:
23131; RV64IA-WMO-NEXT:    amomin.w.aqrl a0, a1, (a0)
23132; RV64IA-WMO-NEXT:    ret
23133;
23134; RV64IA-TSO-LABEL: atomicrmw_min_i32_seq_cst:
23135; RV64IA-TSO:       # %bb.0:
23136; RV64IA-TSO-NEXT:    amomin.w a0, a1, (a0)
23137; RV64IA-TSO-NEXT:    ret
23138  %1 = atomicrmw min ptr %a, i32 %b seq_cst
23139  ret i32 %1
23140}
23141
23142define i32 @atomicrmw_umax_i32_monotonic(ptr %a, i32 %b) nounwind {
23143; RV32I-LABEL: atomicrmw_umax_i32_monotonic:
23144; RV32I:       # %bb.0:
23145; RV32I-NEXT:    addi sp, sp, -16
23146; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23147; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23148; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23149; RV32I-NEXT:    mv s0, a0
23150; RV32I-NEXT:    lw a3, 0(a0)
23151; RV32I-NEXT:    mv s1, a1
23152; RV32I-NEXT:    j .LBB175_2
23153; RV32I-NEXT:  .LBB175_1: # %atomicrmw.start
23154; RV32I-NEXT:    # in Loop: Header=BB175_2 Depth=1
23155; RV32I-NEXT:    sw a3, 0(sp)
23156; RV32I-NEXT:    mv a1, sp
23157; RV32I-NEXT:    mv a0, s0
23158; RV32I-NEXT:    li a3, 0
23159; RV32I-NEXT:    li a4, 0
23160; RV32I-NEXT:    call __atomic_compare_exchange_4
23161; RV32I-NEXT:    lw a3, 0(sp)
23162; RV32I-NEXT:    bnez a0, .LBB175_4
23163; RV32I-NEXT:  .LBB175_2: # %atomicrmw.start
23164; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23165; RV32I-NEXT:    mv a2, a3
23166; RV32I-NEXT:    bltu s1, a3, .LBB175_1
23167; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23168; RV32I-NEXT:    # in Loop: Header=BB175_2 Depth=1
23169; RV32I-NEXT:    mv a2, s1
23170; RV32I-NEXT:    j .LBB175_1
23171; RV32I-NEXT:  .LBB175_4: # %atomicrmw.end
23172; RV32I-NEXT:    mv a0, a3
23173; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23174; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23175; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23176; RV32I-NEXT:    addi sp, sp, 16
23177; RV32I-NEXT:    ret
23178;
23179; RV32IA-LABEL: atomicrmw_umax_i32_monotonic:
23180; RV32IA:       # %bb.0:
23181; RV32IA-NEXT:    amomaxu.w a0, a1, (a0)
23182; RV32IA-NEXT:    ret
23183;
23184; RV64I-LABEL: atomicrmw_umax_i32_monotonic:
23185; RV64I:       # %bb.0:
23186; RV64I-NEXT:    addi sp, sp, -48
23187; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23188; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23189; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23190; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23191; RV64I-NEXT:    mv s0, a0
23192; RV64I-NEXT:    lw a3, 0(a0)
23193; RV64I-NEXT:    mv s1, a1
23194; RV64I-NEXT:    sext.w s2, a1
23195; RV64I-NEXT:    j .LBB175_2
23196; RV64I-NEXT:  .LBB175_1: # %atomicrmw.start
23197; RV64I-NEXT:    # in Loop: Header=BB175_2 Depth=1
23198; RV64I-NEXT:    sw a3, 12(sp)
23199; RV64I-NEXT:    addi a1, sp, 12
23200; RV64I-NEXT:    mv a0, s0
23201; RV64I-NEXT:    li a3, 0
23202; RV64I-NEXT:    li a4, 0
23203; RV64I-NEXT:    call __atomic_compare_exchange_4
23204; RV64I-NEXT:    lw a3, 12(sp)
23205; RV64I-NEXT:    bnez a0, .LBB175_4
23206; RV64I-NEXT:  .LBB175_2: # %atomicrmw.start
23207; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23208; RV64I-NEXT:    mv a2, a3
23209; RV64I-NEXT:    bltu s2, a3, .LBB175_1
23210; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23211; RV64I-NEXT:    # in Loop: Header=BB175_2 Depth=1
23212; RV64I-NEXT:    mv a2, s1
23213; RV64I-NEXT:    j .LBB175_1
23214; RV64I-NEXT:  .LBB175_4: # %atomicrmw.end
23215; RV64I-NEXT:    mv a0, a3
23216; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23217; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23218; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23219; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23220; RV64I-NEXT:    addi sp, sp, 48
23221; RV64I-NEXT:    ret
23222;
23223; RV64IA-LABEL: atomicrmw_umax_i32_monotonic:
23224; RV64IA:       # %bb.0:
23225; RV64IA-NEXT:    amomaxu.w a0, a1, (a0)
23226; RV64IA-NEXT:    ret
23227  %1 = atomicrmw umax ptr %a, i32 %b monotonic
23228  ret i32 %1
23229}
23230
23231define i32 @atomicrmw_umax_i32_acquire(ptr %a, i32 %b) nounwind {
23232; RV32I-LABEL: atomicrmw_umax_i32_acquire:
23233; RV32I:       # %bb.0:
23234; RV32I-NEXT:    addi sp, sp, -16
23235; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23236; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23237; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23238; RV32I-NEXT:    mv s0, a0
23239; RV32I-NEXT:    lw a3, 0(a0)
23240; RV32I-NEXT:    mv s1, a1
23241; RV32I-NEXT:    j .LBB176_2
23242; RV32I-NEXT:  .LBB176_1: # %atomicrmw.start
23243; RV32I-NEXT:    # in Loop: Header=BB176_2 Depth=1
23244; RV32I-NEXT:    sw a3, 0(sp)
23245; RV32I-NEXT:    mv a1, sp
23246; RV32I-NEXT:    li a3, 2
23247; RV32I-NEXT:    li a4, 2
23248; RV32I-NEXT:    mv a0, s0
23249; RV32I-NEXT:    call __atomic_compare_exchange_4
23250; RV32I-NEXT:    lw a3, 0(sp)
23251; RV32I-NEXT:    bnez a0, .LBB176_4
23252; RV32I-NEXT:  .LBB176_2: # %atomicrmw.start
23253; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23254; RV32I-NEXT:    mv a2, a3
23255; RV32I-NEXT:    bltu s1, a3, .LBB176_1
23256; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23257; RV32I-NEXT:    # in Loop: Header=BB176_2 Depth=1
23258; RV32I-NEXT:    mv a2, s1
23259; RV32I-NEXT:    j .LBB176_1
23260; RV32I-NEXT:  .LBB176_4: # %atomicrmw.end
23261; RV32I-NEXT:    mv a0, a3
23262; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23263; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23264; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23265; RV32I-NEXT:    addi sp, sp, 16
23266; RV32I-NEXT:    ret
23267;
23268; RV32IA-WMO-LABEL: atomicrmw_umax_i32_acquire:
23269; RV32IA-WMO:       # %bb.0:
23270; RV32IA-WMO-NEXT:    amomaxu.w.aq a0, a1, (a0)
23271; RV32IA-WMO-NEXT:    ret
23272;
23273; RV32IA-TSO-LABEL: atomicrmw_umax_i32_acquire:
23274; RV32IA-TSO:       # %bb.0:
23275; RV32IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23276; RV32IA-TSO-NEXT:    ret
23277;
23278; RV64I-LABEL: atomicrmw_umax_i32_acquire:
23279; RV64I:       # %bb.0:
23280; RV64I-NEXT:    addi sp, sp, -48
23281; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23282; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23283; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23284; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23285; RV64I-NEXT:    mv s0, a0
23286; RV64I-NEXT:    lw a3, 0(a0)
23287; RV64I-NEXT:    mv s1, a1
23288; RV64I-NEXT:    sext.w s2, a1
23289; RV64I-NEXT:    j .LBB176_2
23290; RV64I-NEXT:  .LBB176_1: # %atomicrmw.start
23291; RV64I-NEXT:    # in Loop: Header=BB176_2 Depth=1
23292; RV64I-NEXT:    sw a3, 12(sp)
23293; RV64I-NEXT:    addi a1, sp, 12
23294; RV64I-NEXT:    li a3, 2
23295; RV64I-NEXT:    li a4, 2
23296; RV64I-NEXT:    mv a0, s0
23297; RV64I-NEXT:    call __atomic_compare_exchange_4
23298; RV64I-NEXT:    lw a3, 12(sp)
23299; RV64I-NEXT:    bnez a0, .LBB176_4
23300; RV64I-NEXT:  .LBB176_2: # %atomicrmw.start
23301; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23302; RV64I-NEXT:    mv a2, a3
23303; RV64I-NEXT:    bltu s2, a3, .LBB176_1
23304; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23305; RV64I-NEXT:    # in Loop: Header=BB176_2 Depth=1
23306; RV64I-NEXT:    mv a2, s1
23307; RV64I-NEXT:    j .LBB176_1
23308; RV64I-NEXT:  .LBB176_4: # %atomicrmw.end
23309; RV64I-NEXT:    mv a0, a3
23310; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23311; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23312; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23313; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23314; RV64I-NEXT:    addi sp, sp, 48
23315; RV64I-NEXT:    ret
23316;
23317; RV64IA-WMO-LABEL: atomicrmw_umax_i32_acquire:
23318; RV64IA-WMO:       # %bb.0:
23319; RV64IA-WMO-NEXT:    amomaxu.w.aq a0, a1, (a0)
23320; RV64IA-WMO-NEXT:    ret
23321;
23322; RV64IA-TSO-LABEL: atomicrmw_umax_i32_acquire:
23323; RV64IA-TSO:       # %bb.0:
23324; RV64IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23325; RV64IA-TSO-NEXT:    ret
23326  %1 = atomicrmw umax ptr %a, i32 %b acquire
23327  ret i32 %1
23328}
23329
23330define i32 @atomicrmw_umax_i32_release(ptr %a, i32 %b) nounwind {
23331; RV32I-LABEL: atomicrmw_umax_i32_release:
23332; RV32I:       # %bb.0:
23333; RV32I-NEXT:    addi sp, sp, -16
23334; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23335; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23336; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23337; RV32I-NEXT:    mv s0, a0
23338; RV32I-NEXT:    lw a3, 0(a0)
23339; RV32I-NEXT:    mv s1, a1
23340; RV32I-NEXT:    j .LBB177_2
23341; RV32I-NEXT:  .LBB177_1: # %atomicrmw.start
23342; RV32I-NEXT:    # in Loop: Header=BB177_2 Depth=1
23343; RV32I-NEXT:    sw a3, 0(sp)
23344; RV32I-NEXT:    mv a1, sp
23345; RV32I-NEXT:    li a3, 3
23346; RV32I-NEXT:    mv a0, s0
23347; RV32I-NEXT:    li a4, 0
23348; RV32I-NEXT:    call __atomic_compare_exchange_4
23349; RV32I-NEXT:    lw a3, 0(sp)
23350; RV32I-NEXT:    bnez a0, .LBB177_4
23351; RV32I-NEXT:  .LBB177_2: # %atomicrmw.start
23352; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23353; RV32I-NEXT:    mv a2, a3
23354; RV32I-NEXT:    bltu s1, a3, .LBB177_1
23355; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23356; RV32I-NEXT:    # in Loop: Header=BB177_2 Depth=1
23357; RV32I-NEXT:    mv a2, s1
23358; RV32I-NEXT:    j .LBB177_1
23359; RV32I-NEXT:  .LBB177_4: # %atomicrmw.end
23360; RV32I-NEXT:    mv a0, a3
23361; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23362; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23363; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23364; RV32I-NEXT:    addi sp, sp, 16
23365; RV32I-NEXT:    ret
23366;
23367; RV32IA-WMO-LABEL: atomicrmw_umax_i32_release:
23368; RV32IA-WMO:       # %bb.0:
23369; RV32IA-WMO-NEXT:    amomaxu.w.rl a0, a1, (a0)
23370; RV32IA-WMO-NEXT:    ret
23371;
23372; RV32IA-TSO-LABEL: atomicrmw_umax_i32_release:
23373; RV32IA-TSO:       # %bb.0:
23374; RV32IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23375; RV32IA-TSO-NEXT:    ret
23376;
23377; RV64I-LABEL: atomicrmw_umax_i32_release:
23378; RV64I:       # %bb.0:
23379; RV64I-NEXT:    addi sp, sp, -48
23380; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23381; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23382; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23383; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23384; RV64I-NEXT:    mv s0, a0
23385; RV64I-NEXT:    lw a3, 0(a0)
23386; RV64I-NEXT:    mv s1, a1
23387; RV64I-NEXT:    sext.w s2, a1
23388; RV64I-NEXT:    j .LBB177_2
23389; RV64I-NEXT:  .LBB177_1: # %atomicrmw.start
23390; RV64I-NEXT:    # in Loop: Header=BB177_2 Depth=1
23391; RV64I-NEXT:    sw a3, 12(sp)
23392; RV64I-NEXT:    addi a1, sp, 12
23393; RV64I-NEXT:    li a3, 3
23394; RV64I-NEXT:    mv a0, s0
23395; RV64I-NEXT:    li a4, 0
23396; RV64I-NEXT:    call __atomic_compare_exchange_4
23397; RV64I-NEXT:    lw a3, 12(sp)
23398; RV64I-NEXT:    bnez a0, .LBB177_4
23399; RV64I-NEXT:  .LBB177_2: # %atomicrmw.start
23400; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23401; RV64I-NEXT:    mv a2, a3
23402; RV64I-NEXT:    bltu s2, a3, .LBB177_1
23403; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23404; RV64I-NEXT:    # in Loop: Header=BB177_2 Depth=1
23405; RV64I-NEXT:    mv a2, s1
23406; RV64I-NEXT:    j .LBB177_1
23407; RV64I-NEXT:  .LBB177_4: # %atomicrmw.end
23408; RV64I-NEXT:    mv a0, a3
23409; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23410; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23411; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23412; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23413; RV64I-NEXT:    addi sp, sp, 48
23414; RV64I-NEXT:    ret
23415;
23416; RV64IA-WMO-LABEL: atomicrmw_umax_i32_release:
23417; RV64IA-WMO:       # %bb.0:
23418; RV64IA-WMO-NEXT:    amomaxu.w.rl a0, a1, (a0)
23419; RV64IA-WMO-NEXT:    ret
23420;
23421; RV64IA-TSO-LABEL: atomicrmw_umax_i32_release:
23422; RV64IA-TSO:       # %bb.0:
23423; RV64IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23424; RV64IA-TSO-NEXT:    ret
23425  %1 = atomicrmw umax ptr %a, i32 %b release
23426  ret i32 %1
23427}
23428
23429define i32 @atomicrmw_umax_i32_acq_rel(ptr %a, i32 %b) nounwind {
23430; RV32I-LABEL: atomicrmw_umax_i32_acq_rel:
23431; RV32I:       # %bb.0:
23432; RV32I-NEXT:    addi sp, sp, -16
23433; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23434; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23435; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23436; RV32I-NEXT:    mv s0, a0
23437; RV32I-NEXT:    lw a3, 0(a0)
23438; RV32I-NEXT:    mv s1, a1
23439; RV32I-NEXT:    j .LBB178_2
23440; RV32I-NEXT:  .LBB178_1: # %atomicrmw.start
23441; RV32I-NEXT:    # in Loop: Header=BB178_2 Depth=1
23442; RV32I-NEXT:    sw a3, 0(sp)
23443; RV32I-NEXT:    mv a1, sp
23444; RV32I-NEXT:    li a3, 4
23445; RV32I-NEXT:    li a4, 2
23446; RV32I-NEXT:    mv a0, s0
23447; RV32I-NEXT:    call __atomic_compare_exchange_4
23448; RV32I-NEXT:    lw a3, 0(sp)
23449; RV32I-NEXT:    bnez a0, .LBB178_4
23450; RV32I-NEXT:  .LBB178_2: # %atomicrmw.start
23451; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23452; RV32I-NEXT:    mv a2, a3
23453; RV32I-NEXT:    bltu s1, a3, .LBB178_1
23454; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23455; RV32I-NEXT:    # in Loop: Header=BB178_2 Depth=1
23456; RV32I-NEXT:    mv a2, s1
23457; RV32I-NEXT:    j .LBB178_1
23458; RV32I-NEXT:  .LBB178_4: # %atomicrmw.end
23459; RV32I-NEXT:    mv a0, a3
23460; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23461; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23462; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23463; RV32I-NEXT:    addi sp, sp, 16
23464; RV32I-NEXT:    ret
23465;
23466; RV32IA-WMO-LABEL: atomicrmw_umax_i32_acq_rel:
23467; RV32IA-WMO:       # %bb.0:
23468; RV32IA-WMO-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
23469; RV32IA-WMO-NEXT:    ret
23470;
23471; RV32IA-TSO-LABEL: atomicrmw_umax_i32_acq_rel:
23472; RV32IA-TSO:       # %bb.0:
23473; RV32IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23474; RV32IA-TSO-NEXT:    ret
23475;
23476; RV64I-LABEL: atomicrmw_umax_i32_acq_rel:
23477; RV64I:       # %bb.0:
23478; RV64I-NEXT:    addi sp, sp, -48
23479; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23480; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23481; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23482; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23483; RV64I-NEXT:    mv s0, a0
23484; RV64I-NEXT:    lw a3, 0(a0)
23485; RV64I-NEXT:    mv s1, a1
23486; RV64I-NEXT:    sext.w s2, a1
23487; RV64I-NEXT:    j .LBB178_2
23488; RV64I-NEXT:  .LBB178_1: # %atomicrmw.start
23489; RV64I-NEXT:    # in Loop: Header=BB178_2 Depth=1
23490; RV64I-NEXT:    sw a3, 12(sp)
23491; RV64I-NEXT:    addi a1, sp, 12
23492; RV64I-NEXT:    li a3, 4
23493; RV64I-NEXT:    li a4, 2
23494; RV64I-NEXT:    mv a0, s0
23495; RV64I-NEXT:    call __atomic_compare_exchange_4
23496; RV64I-NEXT:    lw a3, 12(sp)
23497; RV64I-NEXT:    bnez a0, .LBB178_4
23498; RV64I-NEXT:  .LBB178_2: # %atomicrmw.start
23499; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23500; RV64I-NEXT:    mv a2, a3
23501; RV64I-NEXT:    bltu s2, a3, .LBB178_1
23502; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23503; RV64I-NEXT:    # in Loop: Header=BB178_2 Depth=1
23504; RV64I-NEXT:    mv a2, s1
23505; RV64I-NEXT:    j .LBB178_1
23506; RV64I-NEXT:  .LBB178_4: # %atomicrmw.end
23507; RV64I-NEXT:    mv a0, a3
23508; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23509; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23510; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23511; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23512; RV64I-NEXT:    addi sp, sp, 48
23513; RV64I-NEXT:    ret
23514;
23515; RV64IA-WMO-LABEL: atomicrmw_umax_i32_acq_rel:
23516; RV64IA-WMO:       # %bb.0:
23517; RV64IA-WMO-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
23518; RV64IA-WMO-NEXT:    ret
23519;
23520; RV64IA-TSO-LABEL: atomicrmw_umax_i32_acq_rel:
23521; RV64IA-TSO:       # %bb.0:
23522; RV64IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23523; RV64IA-TSO-NEXT:    ret
23524  %1 = atomicrmw umax ptr %a, i32 %b acq_rel
23525  ret i32 %1
23526}
23527
23528define i32 @atomicrmw_umax_i32_seq_cst(ptr %a, i32 %b) nounwind {
23529; RV32I-LABEL: atomicrmw_umax_i32_seq_cst:
23530; RV32I:       # %bb.0:
23531; RV32I-NEXT:    addi sp, sp, -16
23532; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23533; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23534; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23535; RV32I-NEXT:    mv s0, a0
23536; RV32I-NEXT:    lw a3, 0(a0)
23537; RV32I-NEXT:    mv s1, a1
23538; RV32I-NEXT:    j .LBB179_2
23539; RV32I-NEXT:  .LBB179_1: # %atomicrmw.start
23540; RV32I-NEXT:    # in Loop: Header=BB179_2 Depth=1
23541; RV32I-NEXT:    sw a3, 0(sp)
23542; RV32I-NEXT:    mv a1, sp
23543; RV32I-NEXT:    li a3, 5
23544; RV32I-NEXT:    li a4, 5
23545; RV32I-NEXT:    mv a0, s0
23546; RV32I-NEXT:    call __atomic_compare_exchange_4
23547; RV32I-NEXT:    lw a3, 0(sp)
23548; RV32I-NEXT:    bnez a0, .LBB179_4
23549; RV32I-NEXT:  .LBB179_2: # %atomicrmw.start
23550; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23551; RV32I-NEXT:    mv a2, a3
23552; RV32I-NEXT:    bltu s1, a3, .LBB179_1
23553; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23554; RV32I-NEXT:    # in Loop: Header=BB179_2 Depth=1
23555; RV32I-NEXT:    mv a2, s1
23556; RV32I-NEXT:    j .LBB179_1
23557; RV32I-NEXT:  .LBB179_4: # %atomicrmw.end
23558; RV32I-NEXT:    mv a0, a3
23559; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23560; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23561; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23562; RV32I-NEXT:    addi sp, sp, 16
23563; RV32I-NEXT:    ret
23564;
23565; RV32IA-WMO-LABEL: atomicrmw_umax_i32_seq_cst:
23566; RV32IA-WMO:       # %bb.0:
23567; RV32IA-WMO-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
23568; RV32IA-WMO-NEXT:    ret
23569;
23570; RV32IA-TSO-LABEL: atomicrmw_umax_i32_seq_cst:
23571; RV32IA-TSO:       # %bb.0:
23572; RV32IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23573; RV32IA-TSO-NEXT:    ret
23574;
23575; RV64I-LABEL: atomicrmw_umax_i32_seq_cst:
23576; RV64I:       # %bb.0:
23577; RV64I-NEXT:    addi sp, sp, -48
23578; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23579; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23580; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23581; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23582; RV64I-NEXT:    mv s0, a0
23583; RV64I-NEXT:    lw a3, 0(a0)
23584; RV64I-NEXT:    mv s1, a1
23585; RV64I-NEXT:    sext.w s2, a1
23586; RV64I-NEXT:    j .LBB179_2
23587; RV64I-NEXT:  .LBB179_1: # %atomicrmw.start
23588; RV64I-NEXT:    # in Loop: Header=BB179_2 Depth=1
23589; RV64I-NEXT:    sw a3, 12(sp)
23590; RV64I-NEXT:    addi a1, sp, 12
23591; RV64I-NEXT:    li a3, 5
23592; RV64I-NEXT:    li a4, 5
23593; RV64I-NEXT:    mv a0, s0
23594; RV64I-NEXT:    call __atomic_compare_exchange_4
23595; RV64I-NEXT:    lw a3, 12(sp)
23596; RV64I-NEXT:    bnez a0, .LBB179_4
23597; RV64I-NEXT:  .LBB179_2: # %atomicrmw.start
23598; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23599; RV64I-NEXT:    mv a2, a3
23600; RV64I-NEXT:    bltu s2, a3, .LBB179_1
23601; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23602; RV64I-NEXT:    # in Loop: Header=BB179_2 Depth=1
23603; RV64I-NEXT:    mv a2, s1
23604; RV64I-NEXT:    j .LBB179_1
23605; RV64I-NEXT:  .LBB179_4: # %atomicrmw.end
23606; RV64I-NEXT:    mv a0, a3
23607; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23608; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23609; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23610; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23611; RV64I-NEXT:    addi sp, sp, 48
23612; RV64I-NEXT:    ret
23613;
23614; RV64IA-WMO-LABEL: atomicrmw_umax_i32_seq_cst:
23615; RV64IA-WMO:       # %bb.0:
23616; RV64IA-WMO-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
23617; RV64IA-WMO-NEXT:    ret
23618;
23619; RV64IA-TSO-LABEL: atomicrmw_umax_i32_seq_cst:
23620; RV64IA-TSO:       # %bb.0:
23621; RV64IA-TSO-NEXT:    amomaxu.w a0, a1, (a0)
23622; RV64IA-TSO-NEXT:    ret
23623  %1 = atomicrmw umax ptr %a, i32 %b seq_cst
23624  ret i32 %1
23625}
23626
23627define i32 @atomicrmw_umin_i32_monotonic(ptr %a, i32 %b) nounwind {
23628; RV32I-LABEL: atomicrmw_umin_i32_monotonic:
23629; RV32I:       # %bb.0:
23630; RV32I-NEXT:    addi sp, sp, -16
23631; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23632; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23633; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23634; RV32I-NEXT:    mv s0, a0
23635; RV32I-NEXT:    lw a3, 0(a0)
23636; RV32I-NEXT:    mv s1, a1
23637; RV32I-NEXT:    j .LBB180_2
23638; RV32I-NEXT:  .LBB180_1: # %atomicrmw.start
23639; RV32I-NEXT:    # in Loop: Header=BB180_2 Depth=1
23640; RV32I-NEXT:    sw a3, 0(sp)
23641; RV32I-NEXT:    mv a1, sp
23642; RV32I-NEXT:    mv a0, s0
23643; RV32I-NEXT:    li a3, 0
23644; RV32I-NEXT:    li a4, 0
23645; RV32I-NEXT:    call __atomic_compare_exchange_4
23646; RV32I-NEXT:    lw a3, 0(sp)
23647; RV32I-NEXT:    bnez a0, .LBB180_4
23648; RV32I-NEXT:  .LBB180_2: # %atomicrmw.start
23649; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23650; RV32I-NEXT:    mv a2, a3
23651; RV32I-NEXT:    bgeu s1, a3, .LBB180_1
23652; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23653; RV32I-NEXT:    # in Loop: Header=BB180_2 Depth=1
23654; RV32I-NEXT:    mv a2, s1
23655; RV32I-NEXT:    j .LBB180_1
23656; RV32I-NEXT:  .LBB180_4: # %atomicrmw.end
23657; RV32I-NEXT:    mv a0, a3
23658; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23659; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23660; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23661; RV32I-NEXT:    addi sp, sp, 16
23662; RV32I-NEXT:    ret
23663;
23664; RV32IA-LABEL: atomicrmw_umin_i32_monotonic:
23665; RV32IA:       # %bb.0:
23666; RV32IA-NEXT:    amominu.w a0, a1, (a0)
23667; RV32IA-NEXT:    ret
23668;
23669; RV64I-LABEL: atomicrmw_umin_i32_monotonic:
23670; RV64I:       # %bb.0:
23671; RV64I-NEXT:    addi sp, sp, -48
23672; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23673; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23674; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23675; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23676; RV64I-NEXT:    mv s0, a0
23677; RV64I-NEXT:    lw a3, 0(a0)
23678; RV64I-NEXT:    mv s1, a1
23679; RV64I-NEXT:    sext.w s2, a1
23680; RV64I-NEXT:    j .LBB180_2
23681; RV64I-NEXT:  .LBB180_1: # %atomicrmw.start
23682; RV64I-NEXT:    # in Loop: Header=BB180_2 Depth=1
23683; RV64I-NEXT:    sw a3, 12(sp)
23684; RV64I-NEXT:    addi a1, sp, 12
23685; RV64I-NEXT:    mv a0, s0
23686; RV64I-NEXT:    li a3, 0
23687; RV64I-NEXT:    li a4, 0
23688; RV64I-NEXT:    call __atomic_compare_exchange_4
23689; RV64I-NEXT:    lw a3, 12(sp)
23690; RV64I-NEXT:    bnez a0, .LBB180_4
23691; RV64I-NEXT:  .LBB180_2: # %atomicrmw.start
23692; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23693; RV64I-NEXT:    mv a2, a3
23694; RV64I-NEXT:    bgeu s2, a3, .LBB180_1
23695; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23696; RV64I-NEXT:    # in Loop: Header=BB180_2 Depth=1
23697; RV64I-NEXT:    mv a2, s1
23698; RV64I-NEXT:    j .LBB180_1
23699; RV64I-NEXT:  .LBB180_4: # %atomicrmw.end
23700; RV64I-NEXT:    mv a0, a3
23701; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23702; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23703; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23704; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23705; RV64I-NEXT:    addi sp, sp, 48
23706; RV64I-NEXT:    ret
23707;
23708; RV64IA-LABEL: atomicrmw_umin_i32_monotonic:
23709; RV64IA:       # %bb.0:
23710; RV64IA-NEXT:    amominu.w a0, a1, (a0)
23711; RV64IA-NEXT:    ret
23712  %1 = atomicrmw umin ptr %a, i32 %b monotonic
23713  ret i32 %1
23714}
23715
23716define i32 @atomicrmw_umin_i32_acquire(ptr %a, i32 %b) nounwind {
23717; RV32I-LABEL: atomicrmw_umin_i32_acquire:
23718; RV32I:       # %bb.0:
23719; RV32I-NEXT:    addi sp, sp, -16
23720; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23721; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23722; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23723; RV32I-NEXT:    mv s0, a0
23724; RV32I-NEXT:    lw a3, 0(a0)
23725; RV32I-NEXT:    mv s1, a1
23726; RV32I-NEXT:    j .LBB181_2
23727; RV32I-NEXT:  .LBB181_1: # %atomicrmw.start
23728; RV32I-NEXT:    # in Loop: Header=BB181_2 Depth=1
23729; RV32I-NEXT:    sw a3, 0(sp)
23730; RV32I-NEXT:    mv a1, sp
23731; RV32I-NEXT:    li a3, 2
23732; RV32I-NEXT:    li a4, 2
23733; RV32I-NEXT:    mv a0, s0
23734; RV32I-NEXT:    call __atomic_compare_exchange_4
23735; RV32I-NEXT:    lw a3, 0(sp)
23736; RV32I-NEXT:    bnez a0, .LBB181_4
23737; RV32I-NEXT:  .LBB181_2: # %atomicrmw.start
23738; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23739; RV32I-NEXT:    mv a2, a3
23740; RV32I-NEXT:    bgeu s1, a3, .LBB181_1
23741; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23742; RV32I-NEXT:    # in Loop: Header=BB181_2 Depth=1
23743; RV32I-NEXT:    mv a2, s1
23744; RV32I-NEXT:    j .LBB181_1
23745; RV32I-NEXT:  .LBB181_4: # %atomicrmw.end
23746; RV32I-NEXT:    mv a0, a3
23747; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23748; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23749; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23750; RV32I-NEXT:    addi sp, sp, 16
23751; RV32I-NEXT:    ret
23752;
23753; RV32IA-WMO-LABEL: atomicrmw_umin_i32_acquire:
23754; RV32IA-WMO:       # %bb.0:
23755; RV32IA-WMO-NEXT:    amominu.w.aq a0, a1, (a0)
23756; RV32IA-WMO-NEXT:    ret
23757;
23758; RV32IA-TSO-LABEL: atomicrmw_umin_i32_acquire:
23759; RV32IA-TSO:       # %bb.0:
23760; RV32IA-TSO-NEXT:    amominu.w a0, a1, (a0)
23761; RV32IA-TSO-NEXT:    ret
23762;
23763; RV64I-LABEL: atomicrmw_umin_i32_acquire:
23764; RV64I:       # %bb.0:
23765; RV64I-NEXT:    addi sp, sp, -48
23766; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23767; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23768; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23769; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23770; RV64I-NEXT:    mv s0, a0
23771; RV64I-NEXT:    lw a3, 0(a0)
23772; RV64I-NEXT:    mv s1, a1
23773; RV64I-NEXT:    sext.w s2, a1
23774; RV64I-NEXT:    j .LBB181_2
23775; RV64I-NEXT:  .LBB181_1: # %atomicrmw.start
23776; RV64I-NEXT:    # in Loop: Header=BB181_2 Depth=1
23777; RV64I-NEXT:    sw a3, 12(sp)
23778; RV64I-NEXT:    addi a1, sp, 12
23779; RV64I-NEXT:    li a3, 2
23780; RV64I-NEXT:    li a4, 2
23781; RV64I-NEXT:    mv a0, s0
23782; RV64I-NEXT:    call __atomic_compare_exchange_4
23783; RV64I-NEXT:    lw a3, 12(sp)
23784; RV64I-NEXT:    bnez a0, .LBB181_4
23785; RV64I-NEXT:  .LBB181_2: # %atomicrmw.start
23786; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23787; RV64I-NEXT:    mv a2, a3
23788; RV64I-NEXT:    bgeu s2, a3, .LBB181_1
23789; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23790; RV64I-NEXT:    # in Loop: Header=BB181_2 Depth=1
23791; RV64I-NEXT:    mv a2, s1
23792; RV64I-NEXT:    j .LBB181_1
23793; RV64I-NEXT:  .LBB181_4: # %atomicrmw.end
23794; RV64I-NEXT:    mv a0, a3
23795; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23796; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23797; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23798; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23799; RV64I-NEXT:    addi sp, sp, 48
23800; RV64I-NEXT:    ret
23801;
23802; RV64IA-WMO-LABEL: atomicrmw_umin_i32_acquire:
23803; RV64IA-WMO:       # %bb.0:
23804; RV64IA-WMO-NEXT:    amominu.w.aq a0, a1, (a0)
23805; RV64IA-WMO-NEXT:    ret
23806;
23807; RV64IA-TSO-LABEL: atomicrmw_umin_i32_acquire:
23808; RV64IA-TSO:       # %bb.0:
23809; RV64IA-TSO-NEXT:    amominu.w a0, a1, (a0)
23810; RV64IA-TSO-NEXT:    ret
23811  %1 = atomicrmw umin ptr %a, i32 %b acquire
23812  ret i32 %1
23813}
23814
23815define i32 @atomicrmw_umin_i32_release(ptr %a, i32 %b) nounwind {
23816; RV32I-LABEL: atomicrmw_umin_i32_release:
23817; RV32I:       # %bb.0:
23818; RV32I-NEXT:    addi sp, sp, -16
23819; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23820; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23821; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23822; RV32I-NEXT:    mv s0, a0
23823; RV32I-NEXT:    lw a3, 0(a0)
23824; RV32I-NEXT:    mv s1, a1
23825; RV32I-NEXT:    j .LBB182_2
23826; RV32I-NEXT:  .LBB182_1: # %atomicrmw.start
23827; RV32I-NEXT:    # in Loop: Header=BB182_2 Depth=1
23828; RV32I-NEXT:    sw a3, 0(sp)
23829; RV32I-NEXT:    mv a1, sp
23830; RV32I-NEXT:    li a3, 3
23831; RV32I-NEXT:    mv a0, s0
23832; RV32I-NEXT:    li a4, 0
23833; RV32I-NEXT:    call __atomic_compare_exchange_4
23834; RV32I-NEXT:    lw a3, 0(sp)
23835; RV32I-NEXT:    bnez a0, .LBB182_4
23836; RV32I-NEXT:  .LBB182_2: # %atomicrmw.start
23837; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23838; RV32I-NEXT:    mv a2, a3
23839; RV32I-NEXT:    bgeu s1, a3, .LBB182_1
23840; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23841; RV32I-NEXT:    # in Loop: Header=BB182_2 Depth=1
23842; RV32I-NEXT:    mv a2, s1
23843; RV32I-NEXT:    j .LBB182_1
23844; RV32I-NEXT:  .LBB182_4: # %atomicrmw.end
23845; RV32I-NEXT:    mv a0, a3
23846; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23847; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23848; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23849; RV32I-NEXT:    addi sp, sp, 16
23850; RV32I-NEXT:    ret
23851;
23852; RV32IA-WMO-LABEL: atomicrmw_umin_i32_release:
23853; RV32IA-WMO:       # %bb.0:
23854; RV32IA-WMO-NEXT:    amominu.w.rl a0, a1, (a0)
23855; RV32IA-WMO-NEXT:    ret
23856;
23857; RV32IA-TSO-LABEL: atomicrmw_umin_i32_release:
23858; RV32IA-TSO:       # %bb.0:
23859; RV32IA-TSO-NEXT:    amominu.w a0, a1, (a0)
23860; RV32IA-TSO-NEXT:    ret
23861;
23862; RV64I-LABEL: atomicrmw_umin_i32_release:
23863; RV64I:       # %bb.0:
23864; RV64I-NEXT:    addi sp, sp, -48
23865; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23866; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23867; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23868; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23869; RV64I-NEXT:    mv s0, a0
23870; RV64I-NEXT:    lw a3, 0(a0)
23871; RV64I-NEXT:    mv s1, a1
23872; RV64I-NEXT:    sext.w s2, a1
23873; RV64I-NEXT:    j .LBB182_2
23874; RV64I-NEXT:  .LBB182_1: # %atomicrmw.start
23875; RV64I-NEXT:    # in Loop: Header=BB182_2 Depth=1
23876; RV64I-NEXT:    sw a3, 12(sp)
23877; RV64I-NEXT:    addi a1, sp, 12
23878; RV64I-NEXT:    li a3, 3
23879; RV64I-NEXT:    mv a0, s0
23880; RV64I-NEXT:    li a4, 0
23881; RV64I-NEXT:    call __atomic_compare_exchange_4
23882; RV64I-NEXT:    lw a3, 12(sp)
23883; RV64I-NEXT:    bnez a0, .LBB182_4
23884; RV64I-NEXT:  .LBB182_2: # %atomicrmw.start
23885; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23886; RV64I-NEXT:    mv a2, a3
23887; RV64I-NEXT:    bgeu s2, a3, .LBB182_1
23888; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23889; RV64I-NEXT:    # in Loop: Header=BB182_2 Depth=1
23890; RV64I-NEXT:    mv a2, s1
23891; RV64I-NEXT:    j .LBB182_1
23892; RV64I-NEXT:  .LBB182_4: # %atomicrmw.end
23893; RV64I-NEXT:    mv a0, a3
23894; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23895; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23896; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23897; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23898; RV64I-NEXT:    addi sp, sp, 48
23899; RV64I-NEXT:    ret
23900;
23901; RV64IA-WMO-LABEL: atomicrmw_umin_i32_release:
23902; RV64IA-WMO:       # %bb.0:
23903; RV64IA-WMO-NEXT:    amominu.w.rl a0, a1, (a0)
23904; RV64IA-WMO-NEXT:    ret
23905;
23906; RV64IA-TSO-LABEL: atomicrmw_umin_i32_release:
23907; RV64IA-TSO:       # %bb.0:
23908; RV64IA-TSO-NEXT:    amominu.w a0, a1, (a0)
23909; RV64IA-TSO-NEXT:    ret
23910  %1 = atomicrmw umin ptr %a, i32 %b release
23911  ret i32 %1
23912}
23913
23914define i32 @atomicrmw_umin_i32_acq_rel(ptr %a, i32 %b) nounwind {
23915; RV32I-LABEL: atomicrmw_umin_i32_acq_rel:
23916; RV32I:       # %bb.0:
23917; RV32I-NEXT:    addi sp, sp, -16
23918; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
23919; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
23920; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
23921; RV32I-NEXT:    mv s0, a0
23922; RV32I-NEXT:    lw a3, 0(a0)
23923; RV32I-NEXT:    mv s1, a1
23924; RV32I-NEXT:    j .LBB183_2
23925; RV32I-NEXT:  .LBB183_1: # %atomicrmw.start
23926; RV32I-NEXT:    # in Loop: Header=BB183_2 Depth=1
23927; RV32I-NEXT:    sw a3, 0(sp)
23928; RV32I-NEXT:    mv a1, sp
23929; RV32I-NEXT:    li a3, 4
23930; RV32I-NEXT:    li a4, 2
23931; RV32I-NEXT:    mv a0, s0
23932; RV32I-NEXT:    call __atomic_compare_exchange_4
23933; RV32I-NEXT:    lw a3, 0(sp)
23934; RV32I-NEXT:    bnez a0, .LBB183_4
23935; RV32I-NEXT:  .LBB183_2: # %atomicrmw.start
23936; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
23937; RV32I-NEXT:    mv a2, a3
23938; RV32I-NEXT:    bgeu s1, a3, .LBB183_1
23939; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
23940; RV32I-NEXT:    # in Loop: Header=BB183_2 Depth=1
23941; RV32I-NEXT:    mv a2, s1
23942; RV32I-NEXT:    j .LBB183_1
23943; RV32I-NEXT:  .LBB183_4: # %atomicrmw.end
23944; RV32I-NEXT:    mv a0, a3
23945; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23946; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
23947; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
23948; RV32I-NEXT:    addi sp, sp, 16
23949; RV32I-NEXT:    ret
23950;
23951; RV32IA-WMO-LABEL: atomicrmw_umin_i32_acq_rel:
23952; RV32IA-WMO:       # %bb.0:
23953; RV32IA-WMO-NEXT:    amominu.w.aqrl a0, a1, (a0)
23954; RV32IA-WMO-NEXT:    ret
23955;
23956; RV32IA-TSO-LABEL: atomicrmw_umin_i32_acq_rel:
23957; RV32IA-TSO:       # %bb.0:
23958; RV32IA-TSO-NEXT:    amominu.w a0, a1, (a0)
23959; RV32IA-TSO-NEXT:    ret
23960;
23961; RV64I-LABEL: atomicrmw_umin_i32_acq_rel:
23962; RV64I:       # %bb.0:
23963; RV64I-NEXT:    addi sp, sp, -48
23964; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
23965; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
23966; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
23967; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
23968; RV64I-NEXT:    mv s0, a0
23969; RV64I-NEXT:    lw a3, 0(a0)
23970; RV64I-NEXT:    mv s1, a1
23971; RV64I-NEXT:    sext.w s2, a1
23972; RV64I-NEXT:    j .LBB183_2
23973; RV64I-NEXT:  .LBB183_1: # %atomicrmw.start
23974; RV64I-NEXT:    # in Loop: Header=BB183_2 Depth=1
23975; RV64I-NEXT:    sw a3, 12(sp)
23976; RV64I-NEXT:    addi a1, sp, 12
23977; RV64I-NEXT:    li a3, 4
23978; RV64I-NEXT:    li a4, 2
23979; RV64I-NEXT:    mv a0, s0
23980; RV64I-NEXT:    call __atomic_compare_exchange_4
23981; RV64I-NEXT:    lw a3, 12(sp)
23982; RV64I-NEXT:    bnez a0, .LBB183_4
23983; RV64I-NEXT:  .LBB183_2: # %atomicrmw.start
23984; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
23985; RV64I-NEXT:    mv a2, a3
23986; RV64I-NEXT:    bgeu s2, a3, .LBB183_1
23987; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
23988; RV64I-NEXT:    # in Loop: Header=BB183_2 Depth=1
23989; RV64I-NEXT:    mv a2, s1
23990; RV64I-NEXT:    j .LBB183_1
23991; RV64I-NEXT:  .LBB183_4: # %atomicrmw.end
23992; RV64I-NEXT:    mv a0, a3
23993; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
23994; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
23995; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
23996; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
23997; RV64I-NEXT:    addi sp, sp, 48
23998; RV64I-NEXT:    ret
23999;
24000; RV64IA-WMO-LABEL: atomicrmw_umin_i32_acq_rel:
24001; RV64IA-WMO:       # %bb.0:
24002; RV64IA-WMO-NEXT:    amominu.w.aqrl a0, a1, (a0)
24003; RV64IA-WMO-NEXT:    ret
24004;
24005; RV64IA-TSO-LABEL: atomicrmw_umin_i32_acq_rel:
24006; RV64IA-TSO:       # %bb.0:
24007; RV64IA-TSO-NEXT:    amominu.w a0, a1, (a0)
24008; RV64IA-TSO-NEXT:    ret
24009  %1 = atomicrmw umin ptr %a, i32 %b acq_rel
24010  ret i32 %1
24011}
24012
24013define i32 @atomicrmw_umin_i32_seq_cst(ptr %a, i32 %b) nounwind {
24014; RV32I-LABEL: atomicrmw_umin_i32_seq_cst:
24015; RV32I:       # %bb.0:
24016; RV32I-NEXT:    addi sp, sp, -16
24017; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24018; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
24019; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
24020; RV32I-NEXT:    mv s0, a0
24021; RV32I-NEXT:    lw a3, 0(a0)
24022; RV32I-NEXT:    mv s1, a1
24023; RV32I-NEXT:    j .LBB184_2
24024; RV32I-NEXT:  .LBB184_1: # %atomicrmw.start
24025; RV32I-NEXT:    # in Loop: Header=BB184_2 Depth=1
24026; RV32I-NEXT:    sw a3, 0(sp)
24027; RV32I-NEXT:    mv a1, sp
24028; RV32I-NEXT:    li a3, 5
24029; RV32I-NEXT:    li a4, 5
24030; RV32I-NEXT:    mv a0, s0
24031; RV32I-NEXT:    call __atomic_compare_exchange_4
24032; RV32I-NEXT:    lw a3, 0(sp)
24033; RV32I-NEXT:    bnez a0, .LBB184_4
24034; RV32I-NEXT:  .LBB184_2: # %atomicrmw.start
24035; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
24036; RV32I-NEXT:    mv a2, a3
24037; RV32I-NEXT:    bgeu s1, a3, .LBB184_1
24038; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
24039; RV32I-NEXT:    # in Loop: Header=BB184_2 Depth=1
24040; RV32I-NEXT:    mv a2, s1
24041; RV32I-NEXT:    j .LBB184_1
24042; RV32I-NEXT:  .LBB184_4: # %atomicrmw.end
24043; RV32I-NEXT:    mv a0, a3
24044; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24045; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
24046; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
24047; RV32I-NEXT:    addi sp, sp, 16
24048; RV32I-NEXT:    ret
24049;
24050; RV32IA-WMO-LABEL: atomicrmw_umin_i32_seq_cst:
24051; RV32IA-WMO:       # %bb.0:
24052; RV32IA-WMO-NEXT:    amominu.w.aqrl a0, a1, (a0)
24053; RV32IA-WMO-NEXT:    ret
24054;
24055; RV32IA-TSO-LABEL: atomicrmw_umin_i32_seq_cst:
24056; RV32IA-TSO:       # %bb.0:
24057; RV32IA-TSO-NEXT:    amominu.w a0, a1, (a0)
24058; RV32IA-TSO-NEXT:    ret
24059;
24060; RV64I-LABEL: atomicrmw_umin_i32_seq_cst:
24061; RV64I:       # %bb.0:
24062; RV64I-NEXT:    addi sp, sp, -48
24063; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
24064; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
24065; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
24066; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
24067; RV64I-NEXT:    mv s0, a0
24068; RV64I-NEXT:    lw a3, 0(a0)
24069; RV64I-NEXT:    mv s1, a1
24070; RV64I-NEXT:    sext.w s2, a1
24071; RV64I-NEXT:    j .LBB184_2
24072; RV64I-NEXT:  .LBB184_1: # %atomicrmw.start
24073; RV64I-NEXT:    # in Loop: Header=BB184_2 Depth=1
24074; RV64I-NEXT:    sw a3, 12(sp)
24075; RV64I-NEXT:    addi a1, sp, 12
24076; RV64I-NEXT:    li a3, 5
24077; RV64I-NEXT:    li a4, 5
24078; RV64I-NEXT:    mv a0, s0
24079; RV64I-NEXT:    call __atomic_compare_exchange_4
24080; RV64I-NEXT:    lw a3, 12(sp)
24081; RV64I-NEXT:    bnez a0, .LBB184_4
24082; RV64I-NEXT:  .LBB184_2: # %atomicrmw.start
24083; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
24084; RV64I-NEXT:    mv a2, a3
24085; RV64I-NEXT:    bgeu s2, a3, .LBB184_1
24086; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
24087; RV64I-NEXT:    # in Loop: Header=BB184_2 Depth=1
24088; RV64I-NEXT:    mv a2, s1
24089; RV64I-NEXT:    j .LBB184_1
24090; RV64I-NEXT:  .LBB184_4: # %atomicrmw.end
24091; RV64I-NEXT:    mv a0, a3
24092; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
24093; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
24094; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
24095; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
24096; RV64I-NEXT:    addi sp, sp, 48
24097; RV64I-NEXT:    ret
24098;
24099; RV64IA-WMO-LABEL: atomicrmw_umin_i32_seq_cst:
24100; RV64IA-WMO:       # %bb.0:
24101; RV64IA-WMO-NEXT:    amominu.w.aqrl a0, a1, (a0)
24102; RV64IA-WMO-NEXT:    ret
24103;
24104; RV64IA-TSO-LABEL: atomicrmw_umin_i32_seq_cst:
24105; RV64IA-TSO:       # %bb.0:
24106; RV64IA-TSO-NEXT:    amominu.w a0, a1, (a0)
24107; RV64IA-TSO-NEXT:    ret
24108  %1 = atomicrmw umin ptr %a, i32 %b seq_cst
24109  ret i32 %1
24110}
24111
24112define i64 @atomicrmw_xchg_i64_monotonic(ptr %a, i64 %b) nounwind {
24113; RV32I-LABEL: atomicrmw_xchg_i64_monotonic:
24114; RV32I:       # %bb.0:
24115; RV32I-NEXT:    addi sp, sp, -16
24116; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24117; RV32I-NEXT:    li a3, 0
24118; RV32I-NEXT:    call __atomic_exchange_8
24119; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24120; RV32I-NEXT:    addi sp, sp, 16
24121; RV32I-NEXT:    ret
24122;
24123; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic:
24124; RV32IA:       # %bb.0:
24125; RV32IA-NEXT:    addi sp, sp, -16
24126; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24127; RV32IA-NEXT:    li a3, 0
24128; RV32IA-NEXT:    call __atomic_exchange_8
24129; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24130; RV32IA-NEXT:    addi sp, sp, 16
24131; RV32IA-NEXT:    ret
24132;
24133; RV64I-LABEL: atomicrmw_xchg_i64_monotonic:
24134; RV64I:       # %bb.0:
24135; RV64I-NEXT:    addi sp, sp, -16
24136; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24137; RV64I-NEXT:    li a2, 0
24138; RV64I-NEXT:    call __atomic_exchange_8
24139; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24140; RV64I-NEXT:    addi sp, sp, 16
24141; RV64I-NEXT:    ret
24142;
24143; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic:
24144; RV64IA:       # %bb.0:
24145; RV64IA-NEXT:    amoswap.d a0, a1, (a0)
24146; RV64IA-NEXT:    ret
24147  %1 = atomicrmw xchg ptr %a, i64 %b monotonic
24148  ret i64 %1
24149}
24150
24151define i64 @atomicrmw_xchg_i64_acquire(ptr %a, i64 %b) nounwind {
24152; RV32I-LABEL: atomicrmw_xchg_i64_acquire:
24153; RV32I:       # %bb.0:
24154; RV32I-NEXT:    addi sp, sp, -16
24155; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24156; RV32I-NEXT:    li a3, 2
24157; RV32I-NEXT:    call __atomic_exchange_8
24158; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24159; RV32I-NEXT:    addi sp, sp, 16
24160; RV32I-NEXT:    ret
24161;
24162; RV32IA-LABEL: atomicrmw_xchg_i64_acquire:
24163; RV32IA:       # %bb.0:
24164; RV32IA-NEXT:    addi sp, sp, -16
24165; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24166; RV32IA-NEXT:    li a3, 2
24167; RV32IA-NEXT:    call __atomic_exchange_8
24168; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24169; RV32IA-NEXT:    addi sp, sp, 16
24170; RV32IA-NEXT:    ret
24171;
24172; RV64I-LABEL: atomicrmw_xchg_i64_acquire:
24173; RV64I:       # %bb.0:
24174; RV64I-NEXT:    addi sp, sp, -16
24175; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24176; RV64I-NEXT:    li a2, 2
24177; RV64I-NEXT:    call __atomic_exchange_8
24178; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24179; RV64I-NEXT:    addi sp, sp, 16
24180; RV64I-NEXT:    ret
24181;
24182; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_acquire:
24183; RV64IA-WMO:       # %bb.0:
24184; RV64IA-WMO-NEXT:    amoswap.d.aq a0, a1, (a0)
24185; RV64IA-WMO-NEXT:    ret
24186;
24187; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_acquire:
24188; RV64IA-TSO:       # %bb.0:
24189; RV64IA-TSO-NEXT:    amoswap.d a0, a1, (a0)
24190; RV64IA-TSO-NEXT:    ret
24191  %1 = atomicrmw xchg ptr %a, i64 %b acquire
24192  ret i64 %1
24193}
24194
24195define i64 @atomicrmw_xchg_i64_release(ptr %a, i64 %b) nounwind {
24196; RV32I-LABEL: atomicrmw_xchg_i64_release:
24197; RV32I:       # %bb.0:
24198; RV32I-NEXT:    addi sp, sp, -16
24199; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24200; RV32I-NEXT:    li a3, 3
24201; RV32I-NEXT:    call __atomic_exchange_8
24202; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24203; RV32I-NEXT:    addi sp, sp, 16
24204; RV32I-NEXT:    ret
24205;
24206; RV32IA-LABEL: atomicrmw_xchg_i64_release:
24207; RV32IA:       # %bb.0:
24208; RV32IA-NEXT:    addi sp, sp, -16
24209; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24210; RV32IA-NEXT:    li a3, 3
24211; RV32IA-NEXT:    call __atomic_exchange_8
24212; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24213; RV32IA-NEXT:    addi sp, sp, 16
24214; RV32IA-NEXT:    ret
24215;
24216; RV64I-LABEL: atomicrmw_xchg_i64_release:
24217; RV64I:       # %bb.0:
24218; RV64I-NEXT:    addi sp, sp, -16
24219; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24220; RV64I-NEXT:    li a2, 3
24221; RV64I-NEXT:    call __atomic_exchange_8
24222; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24223; RV64I-NEXT:    addi sp, sp, 16
24224; RV64I-NEXT:    ret
24225;
24226; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_release:
24227; RV64IA-WMO:       # %bb.0:
24228; RV64IA-WMO-NEXT:    amoswap.d.rl a0, a1, (a0)
24229; RV64IA-WMO-NEXT:    ret
24230;
24231; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_release:
24232; RV64IA-TSO:       # %bb.0:
24233; RV64IA-TSO-NEXT:    amoswap.d a0, a1, (a0)
24234; RV64IA-TSO-NEXT:    ret
24235  %1 = atomicrmw xchg ptr %a, i64 %b release
24236  ret i64 %1
24237}
24238
24239define i64 @atomicrmw_xchg_i64_acq_rel(ptr %a, i64 %b) nounwind {
24240; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel:
24241; RV32I:       # %bb.0:
24242; RV32I-NEXT:    addi sp, sp, -16
24243; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24244; RV32I-NEXT:    li a3, 4
24245; RV32I-NEXT:    call __atomic_exchange_8
24246; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24247; RV32I-NEXT:    addi sp, sp, 16
24248; RV32I-NEXT:    ret
24249;
24250; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel:
24251; RV32IA:       # %bb.0:
24252; RV32IA-NEXT:    addi sp, sp, -16
24253; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24254; RV32IA-NEXT:    li a3, 4
24255; RV32IA-NEXT:    call __atomic_exchange_8
24256; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24257; RV32IA-NEXT:    addi sp, sp, 16
24258; RV32IA-NEXT:    ret
24259;
24260; RV64I-LABEL: atomicrmw_xchg_i64_acq_rel:
24261; RV64I:       # %bb.0:
24262; RV64I-NEXT:    addi sp, sp, -16
24263; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24264; RV64I-NEXT:    li a2, 4
24265; RV64I-NEXT:    call __atomic_exchange_8
24266; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24267; RV64I-NEXT:    addi sp, sp, 16
24268; RV64I-NEXT:    ret
24269;
24270; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_acq_rel:
24271; RV64IA-WMO:       # %bb.0:
24272; RV64IA-WMO-NEXT:    amoswap.d.aqrl a0, a1, (a0)
24273; RV64IA-WMO-NEXT:    ret
24274;
24275; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_acq_rel:
24276; RV64IA-TSO:       # %bb.0:
24277; RV64IA-TSO-NEXT:    amoswap.d a0, a1, (a0)
24278; RV64IA-TSO-NEXT:    ret
24279  %1 = atomicrmw xchg ptr %a, i64 %b acq_rel
24280  ret i64 %1
24281}
24282
24283define i64 @atomicrmw_xchg_i64_seq_cst(ptr %a, i64 %b) nounwind {
24284; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst:
24285; RV32I:       # %bb.0:
24286; RV32I-NEXT:    addi sp, sp, -16
24287; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24288; RV32I-NEXT:    li a3, 5
24289; RV32I-NEXT:    call __atomic_exchange_8
24290; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24291; RV32I-NEXT:    addi sp, sp, 16
24292; RV32I-NEXT:    ret
24293;
24294; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst:
24295; RV32IA:       # %bb.0:
24296; RV32IA-NEXT:    addi sp, sp, -16
24297; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24298; RV32IA-NEXT:    li a3, 5
24299; RV32IA-NEXT:    call __atomic_exchange_8
24300; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24301; RV32IA-NEXT:    addi sp, sp, 16
24302; RV32IA-NEXT:    ret
24303;
24304; RV64I-LABEL: atomicrmw_xchg_i64_seq_cst:
24305; RV64I:       # %bb.0:
24306; RV64I-NEXT:    addi sp, sp, -16
24307; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24308; RV64I-NEXT:    li a2, 5
24309; RV64I-NEXT:    call __atomic_exchange_8
24310; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24311; RV64I-NEXT:    addi sp, sp, 16
24312; RV64I-NEXT:    ret
24313;
24314; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_seq_cst:
24315; RV64IA-WMO:       # %bb.0:
24316; RV64IA-WMO-NEXT:    amoswap.d.aqrl a0, a1, (a0)
24317; RV64IA-WMO-NEXT:    ret
24318;
24319; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_seq_cst:
24320; RV64IA-TSO:       # %bb.0:
24321; RV64IA-TSO-NEXT:    amoswap.d a0, a1, (a0)
24322; RV64IA-TSO-NEXT:    ret
24323  %1 = atomicrmw xchg ptr %a, i64 %b seq_cst
24324  ret i64 %1
24325}
24326
24327define i64 @atomicrmw_add_i64_monotonic(ptr %a, i64 %b) nounwind {
24328; RV32I-LABEL: atomicrmw_add_i64_monotonic:
24329; RV32I:       # %bb.0:
24330; RV32I-NEXT:    addi sp, sp, -16
24331; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24332; RV32I-NEXT:    li a3, 0
24333; RV32I-NEXT:    call __atomic_fetch_add_8
24334; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24335; RV32I-NEXT:    addi sp, sp, 16
24336; RV32I-NEXT:    ret
24337;
24338; RV32IA-LABEL: atomicrmw_add_i64_monotonic:
24339; RV32IA:       # %bb.0:
24340; RV32IA-NEXT:    addi sp, sp, -16
24341; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24342; RV32IA-NEXT:    li a3, 0
24343; RV32IA-NEXT:    call __atomic_fetch_add_8
24344; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24345; RV32IA-NEXT:    addi sp, sp, 16
24346; RV32IA-NEXT:    ret
24347;
24348; RV64I-LABEL: atomicrmw_add_i64_monotonic:
24349; RV64I:       # %bb.0:
24350; RV64I-NEXT:    addi sp, sp, -16
24351; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24352; RV64I-NEXT:    li a2, 0
24353; RV64I-NEXT:    call __atomic_fetch_add_8
24354; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24355; RV64I-NEXT:    addi sp, sp, 16
24356; RV64I-NEXT:    ret
24357;
24358; RV64IA-LABEL: atomicrmw_add_i64_monotonic:
24359; RV64IA:       # %bb.0:
24360; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
24361; RV64IA-NEXT:    ret
24362  %1 = atomicrmw add ptr %a, i64 %b monotonic
24363  ret i64 %1
24364}
24365
24366define i64 @atomicrmw_add_i64_acquire(ptr %a, i64 %b) nounwind {
24367; RV32I-LABEL: atomicrmw_add_i64_acquire:
24368; RV32I:       # %bb.0:
24369; RV32I-NEXT:    addi sp, sp, -16
24370; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24371; RV32I-NEXT:    li a3, 2
24372; RV32I-NEXT:    call __atomic_fetch_add_8
24373; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24374; RV32I-NEXT:    addi sp, sp, 16
24375; RV32I-NEXT:    ret
24376;
24377; RV32IA-LABEL: atomicrmw_add_i64_acquire:
24378; RV32IA:       # %bb.0:
24379; RV32IA-NEXT:    addi sp, sp, -16
24380; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24381; RV32IA-NEXT:    li a3, 2
24382; RV32IA-NEXT:    call __atomic_fetch_add_8
24383; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24384; RV32IA-NEXT:    addi sp, sp, 16
24385; RV32IA-NEXT:    ret
24386;
24387; RV64I-LABEL: atomicrmw_add_i64_acquire:
24388; RV64I:       # %bb.0:
24389; RV64I-NEXT:    addi sp, sp, -16
24390; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24391; RV64I-NEXT:    li a2, 2
24392; RV64I-NEXT:    call __atomic_fetch_add_8
24393; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24394; RV64I-NEXT:    addi sp, sp, 16
24395; RV64I-NEXT:    ret
24396;
24397; RV64IA-WMO-LABEL: atomicrmw_add_i64_acquire:
24398; RV64IA-WMO:       # %bb.0:
24399; RV64IA-WMO-NEXT:    amoadd.d.aq a0, a1, (a0)
24400; RV64IA-WMO-NEXT:    ret
24401;
24402; RV64IA-TSO-LABEL: atomicrmw_add_i64_acquire:
24403; RV64IA-TSO:       # %bb.0:
24404; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24405; RV64IA-TSO-NEXT:    ret
24406  %1 = atomicrmw add ptr %a, i64 %b acquire
24407  ret i64 %1
24408}
24409
24410define i64 @atomicrmw_add_i64_release(ptr %a, i64 %b) nounwind {
24411; RV32I-LABEL: atomicrmw_add_i64_release:
24412; RV32I:       # %bb.0:
24413; RV32I-NEXT:    addi sp, sp, -16
24414; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24415; RV32I-NEXT:    li a3, 3
24416; RV32I-NEXT:    call __atomic_fetch_add_8
24417; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24418; RV32I-NEXT:    addi sp, sp, 16
24419; RV32I-NEXT:    ret
24420;
24421; RV32IA-LABEL: atomicrmw_add_i64_release:
24422; RV32IA:       # %bb.0:
24423; RV32IA-NEXT:    addi sp, sp, -16
24424; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24425; RV32IA-NEXT:    li a3, 3
24426; RV32IA-NEXT:    call __atomic_fetch_add_8
24427; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24428; RV32IA-NEXT:    addi sp, sp, 16
24429; RV32IA-NEXT:    ret
24430;
24431; RV64I-LABEL: atomicrmw_add_i64_release:
24432; RV64I:       # %bb.0:
24433; RV64I-NEXT:    addi sp, sp, -16
24434; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24435; RV64I-NEXT:    li a2, 3
24436; RV64I-NEXT:    call __atomic_fetch_add_8
24437; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24438; RV64I-NEXT:    addi sp, sp, 16
24439; RV64I-NEXT:    ret
24440;
24441; RV64IA-WMO-LABEL: atomicrmw_add_i64_release:
24442; RV64IA-WMO:       # %bb.0:
24443; RV64IA-WMO-NEXT:    amoadd.d.rl a0, a1, (a0)
24444; RV64IA-WMO-NEXT:    ret
24445;
24446; RV64IA-TSO-LABEL: atomicrmw_add_i64_release:
24447; RV64IA-TSO:       # %bb.0:
24448; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24449; RV64IA-TSO-NEXT:    ret
24450  %1 = atomicrmw add ptr %a, i64 %b release
24451  ret i64 %1
24452}
24453
24454define i64 @atomicrmw_add_i64_acq_rel(ptr %a, i64 %b) nounwind {
24455; RV32I-LABEL: atomicrmw_add_i64_acq_rel:
24456; RV32I:       # %bb.0:
24457; RV32I-NEXT:    addi sp, sp, -16
24458; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24459; RV32I-NEXT:    li a3, 4
24460; RV32I-NEXT:    call __atomic_fetch_add_8
24461; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24462; RV32I-NEXT:    addi sp, sp, 16
24463; RV32I-NEXT:    ret
24464;
24465; RV32IA-LABEL: atomicrmw_add_i64_acq_rel:
24466; RV32IA:       # %bb.0:
24467; RV32IA-NEXT:    addi sp, sp, -16
24468; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24469; RV32IA-NEXT:    li a3, 4
24470; RV32IA-NEXT:    call __atomic_fetch_add_8
24471; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24472; RV32IA-NEXT:    addi sp, sp, 16
24473; RV32IA-NEXT:    ret
24474;
24475; RV64I-LABEL: atomicrmw_add_i64_acq_rel:
24476; RV64I:       # %bb.0:
24477; RV64I-NEXT:    addi sp, sp, -16
24478; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24479; RV64I-NEXT:    li a2, 4
24480; RV64I-NEXT:    call __atomic_fetch_add_8
24481; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24482; RV64I-NEXT:    addi sp, sp, 16
24483; RV64I-NEXT:    ret
24484;
24485; RV64IA-WMO-LABEL: atomicrmw_add_i64_acq_rel:
24486; RV64IA-WMO:       # %bb.0:
24487; RV64IA-WMO-NEXT:    amoadd.d.aqrl a0, a1, (a0)
24488; RV64IA-WMO-NEXT:    ret
24489;
24490; RV64IA-TSO-LABEL: atomicrmw_add_i64_acq_rel:
24491; RV64IA-TSO:       # %bb.0:
24492; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24493; RV64IA-TSO-NEXT:    ret
24494  %1 = atomicrmw add ptr %a, i64 %b acq_rel
24495  ret i64 %1
24496}
24497
24498define i64 @atomicrmw_add_i64_seq_cst(ptr %a, i64 %b) nounwind {
24499; RV32I-LABEL: atomicrmw_add_i64_seq_cst:
24500; RV32I:       # %bb.0:
24501; RV32I-NEXT:    addi sp, sp, -16
24502; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24503; RV32I-NEXT:    li a3, 5
24504; RV32I-NEXT:    call __atomic_fetch_add_8
24505; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24506; RV32I-NEXT:    addi sp, sp, 16
24507; RV32I-NEXT:    ret
24508;
24509; RV32IA-LABEL: atomicrmw_add_i64_seq_cst:
24510; RV32IA:       # %bb.0:
24511; RV32IA-NEXT:    addi sp, sp, -16
24512; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24513; RV32IA-NEXT:    li a3, 5
24514; RV32IA-NEXT:    call __atomic_fetch_add_8
24515; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24516; RV32IA-NEXT:    addi sp, sp, 16
24517; RV32IA-NEXT:    ret
24518;
24519; RV64I-LABEL: atomicrmw_add_i64_seq_cst:
24520; RV64I:       # %bb.0:
24521; RV64I-NEXT:    addi sp, sp, -16
24522; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24523; RV64I-NEXT:    li a2, 5
24524; RV64I-NEXT:    call __atomic_fetch_add_8
24525; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24526; RV64I-NEXT:    addi sp, sp, 16
24527; RV64I-NEXT:    ret
24528;
24529; RV64IA-WMO-LABEL: atomicrmw_add_i64_seq_cst:
24530; RV64IA-WMO:       # %bb.0:
24531; RV64IA-WMO-NEXT:    amoadd.d.aqrl a0, a1, (a0)
24532; RV64IA-WMO-NEXT:    ret
24533;
24534; RV64IA-TSO-LABEL: atomicrmw_add_i64_seq_cst:
24535; RV64IA-TSO:       # %bb.0:
24536; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24537; RV64IA-TSO-NEXT:    ret
24538  %1 = atomicrmw add ptr %a, i64 %b seq_cst
24539  ret i64 %1
24540}
24541
24542define i64 @atomicrmw_sub_i64_monotonic(ptr %a, i64 %b) nounwind {
24543; RV32I-LABEL: atomicrmw_sub_i64_monotonic:
24544; RV32I:       # %bb.0:
24545; RV32I-NEXT:    addi sp, sp, -16
24546; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24547; RV32I-NEXT:    li a3, 0
24548; RV32I-NEXT:    call __atomic_fetch_sub_8
24549; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24550; RV32I-NEXT:    addi sp, sp, 16
24551; RV32I-NEXT:    ret
24552;
24553; RV32IA-LABEL: atomicrmw_sub_i64_monotonic:
24554; RV32IA:       # %bb.0:
24555; RV32IA-NEXT:    addi sp, sp, -16
24556; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24557; RV32IA-NEXT:    li a3, 0
24558; RV32IA-NEXT:    call __atomic_fetch_sub_8
24559; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24560; RV32IA-NEXT:    addi sp, sp, 16
24561; RV32IA-NEXT:    ret
24562;
24563; RV64I-LABEL: atomicrmw_sub_i64_monotonic:
24564; RV64I:       # %bb.0:
24565; RV64I-NEXT:    addi sp, sp, -16
24566; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24567; RV64I-NEXT:    li a2, 0
24568; RV64I-NEXT:    call __atomic_fetch_sub_8
24569; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24570; RV64I-NEXT:    addi sp, sp, 16
24571; RV64I-NEXT:    ret
24572;
24573; RV64IA-LABEL: atomicrmw_sub_i64_monotonic:
24574; RV64IA:       # %bb.0:
24575; RV64IA-NEXT:    neg a1, a1
24576; RV64IA-NEXT:    amoadd.d a0, a1, (a0)
24577; RV64IA-NEXT:    ret
24578  %1 = atomicrmw sub ptr %a, i64 %b monotonic
24579  ret i64 %1
24580}
24581
24582define i64 @atomicrmw_sub_i64_acquire(ptr %a, i64 %b) nounwind {
24583; RV32I-LABEL: atomicrmw_sub_i64_acquire:
24584; RV32I:       # %bb.0:
24585; RV32I-NEXT:    addi sp, sp, -16
24586; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24587; RV32I-NEXT:    li a3, 2
24588; RV32I-NEXT:    call __atomic_fetch_sub_8
24589; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24590; RV32I-NEXT:    addi sp, sp, 16
24591; RV32I-NEXT:    ret
24592;
24593; RV32IA-LABEL: atomicrmw_sub_i64_acquire:
24594; RV32IA:       # %bb.0:
24595; RV32IA-NEXT:    addi sp, sp, -16
24596; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24597; RV32IA-NEXT:    li a3, 2
24598; RV32IA-NEXT:    call __atomic_fetch_sub_8
24599; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24600; RV32IA-NEXT:    addi sp, sp, 16
24601; RV32IA-NEXT:    ret
24602;
24603; RV64I-LABEL: atomicrmw_sub_i64_acquire:
24604; RV64I:       # %bb.0:
24605; RV64I-NEXT:    addi sp, sp, -16
24606; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24607; RV64I-NEXT:    li a2, 2
24608; RV64I-NEXT:    call __atomic_fetch_sub_8
24609; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24610; RV64I-NEXT:    addi sp, sp, 16
24611; RV64I-NEXT:    ret
24612;
24613; RV64IA-WMO-LABEL: atomicrmw_sub_i64_acquire:
24614; RV64IA-WMO:       # %bb.0:
24615; RV64IA-WMO-NEXT:    neg a1, a1
24616; RV64IA-WMO-NEXT:    amoadd.d.aq a0, a1, (a0)
24617; RV64IA-WMO-NEXT:    ret
24618;
24619; RV64IA-TSO-LABEL: atomicrmw_sub_i64_acquire:
24620; RV64IA-TSO:       # %bb.0:
24621; RV64IA-TSO-NEXT:    neg a1, a1
24622; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24623; RV64IA-TSO-NEXT:    ret
24624  %1 = atomicrmw sub ptr %a, i64 %b acquire
24625  ret i64 %1
24626}
24627
24628define i64 @atomicrmw_sub_i64_release(ptr %a, i64 %b) nounwind {
24629; RV32I-LABEL: atomicrmw_sub_i64_release:
24630; RV32I:       # %bb.0:
24631; RV32I-NEXT:    addi sp, sp, -16
24632; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24633; RV32I-NEXT:    li a3, 3
24634; RV32I-NEXT:    call __atomic_fetch_sub_8
24635; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24636; RV32I-NEXT:    addi sp, sp, 16
24637; RV32I-NEXT:    ret
24638;
24639; RV32IA-LABEL: atomicrmw_sub_i64_release:
24640; RV32IA:       # %bb.0:
24641; RV32IA-NEXT:    addi sp, sp, -16
24642; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24643; RV32IA-NEXT:    li a3, 3
24644; RV32IA-NEXT:    call __atomic_fetch_sub_8
24645; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24646; RV32IA-NEXT:    addi sp, sp, 16
24647; RV32IA-NEXT:    ret
24648;
24649; RV64I-LABEL: atomicrmw_sub_i64_release:
24650; RV64I:       # %bb.0:
24651; RV64I-NEXT:    addi sp, sp, -16
24652; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24653; RV64I-NEXT:    li a2, 3
24654; RV64I-NEXT:    call __atomic_fetch_sub_8
24655; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24656; RV64I-NEXT:    addi sp, sp, 16
24657; RV64I-NEXT:    ret
24658;
24659; RV64IA-WMO-LABEL: atomicrmw_sub_i64_release:
24660; RV64IA-WMO:       # %bb.0:
24661; RV64IA-WMO-NEXT:    neg a1, a1
24662; RV64IA-WMO-NEXT:    amoadd.d.rl a0, a1, (a0)
24663; RV64IA-WMO-NEXT:    ret
24664;
24665; RV64IA-TSO-LABEL: atomicrmw_sub_i64_release:
24666; RV64IA-TSO:       # %bb.0:
24667; RV64IA-TSO-NEXT:    neg a1, a1
24668; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24669; RV64IA-TSO-NEXT:    ret
24670  %1 = atomicrmw sub ptr %a, i64 %b release
24671  ret i64 %1
24672}
24673
24674define i64 @atomicrmw_sub_i64_acq_rel(ptr %a, i64 %b) nounwind {
24675; RV32I-LABEL: atomicrmw_sub_i64_acq_rel:
24676; RV32I:       # %bb.0:
24677; RV32I-NEXT:    addi sp, sp, -16
24678; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24679; RV32I-NEXT:    li a3, 4
24680; RV32I-NEXT:    call __atomic_fetch_sub_8
24681; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24682; RV32I-NEXT:    addi sp, sp, 16
24683; RV32I-NEXT:    ret
24684;
24685; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel:
24686; RV32IA:       # %bb.0:
24687; RV32IA-NEXT:    addi sp, sp, -16
24688; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24689; RV32IA-NEXT:    li a3, 4
24690; RV32IA-NEXT:    call __atomic_fetch_sub_8
24691; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24692; RV32IA-NEXT:    addi sp, sp, 16
24693; RV32IA-NEXT:    ret
24694;
24695; RV64I-LABEL: atomicrmw_sub_i64_acq_rel:
24696; RV64I:       # %bb.0:
24697; RV64I-NEXT:    addi sp, sp, -16
24698; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24699; RV64I-NEXT:    li a2, 4
24700; RV64I-NEXT:    call __atomic_fetch_sub_8
24701; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24702; RV64I-NEXT:    addi sp, sp, 16
24703; RV64I-NEXT:    ret
24704;
24705; RV64IA-WMO-LABEL: atomicrmw_sub_i64_acq_rel:
24706; RV64IA-WMO:       # %bb.0:
24707; RV64IA-WMO-NEXT:    neg a1, a1
24708; RV64IA-WMO-NEXT:    amoadd.d.aqrl a0, a1, (a0)
24709; RV64IA-WMO-NEXT:    ret
24710;
24711; RV64IA-TSO-LABEL: atomicrmw_sub_i64_acq_rel:
24712; RV64IA-TSO:       # %bb.0:
24713; RV64IA-TSO-NEXT:    neg a1, a1
24714; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24715; RV64IA-TSO-NEXT:    ret
24716  %1 = atomicrmw sub ptr %a, i64 %b acq_rel
24717  ret i64 %1
24718}
24719
24720define i64 @atomicrmw_sub_i64_seq_cst(ptr %a, i64 %b) nounwind {
24721; RV32I-LABEL: atomicrmw_sub_i64_seq_cst:
24722; RV32I:       # %bb.0:
24723; RV32I-NEXT:    addi sp, sp, -16
24724; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24725; RV32I-NEXT:    li a3, 5
24726; RV32I-NEXT:    call __atomic_fetch_sub_8
24727; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24728; RV32I-NEXT:    addi sp, sp, 16
24729; RV32I-NEXT:    ret
24730;
24731; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst:
24732; RV32IA:       # %bb.0:
24733; RV32IA-NEXT:    addi sp, sp, -16
24734; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24735; RV32IA-NEXT:    li a3, 5
24736; RV32IA-NEXT:    call __atomic_fetch_sub_8
24737; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24738; RV32IA-NEXT:    addi sp, sp, 16
24739; RV32IA-NEXT:    ret
24740;
24741; RV64I-LABEL: atomicrmw_sub_i64_seq_cst:
24742; RV64I:       # %bb.0:
24743; RV64I-NEXT:    addi sp, sp, -16
24744; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24745; RV64I-NEXT:    li a2, 5
24746; RV64I-NEXT:    call __atomic_fetch_sub_8
24747; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24748; RV64I-NEXT:    addi sp, sp, 16
24749; RV64I-NEXT:    ret
24750;
24751; RV64IA-WMO-LABEL: atomicrmw_sub_i64_seq_cst:
24752; RV64IA-WMO:       # %bb.0:
24753; RV64IA-WMO-NEXT:    neg a1, a1
24754; RV64IA-WMO-NEXT:    amoadd.d.aqrl a0, a1, (a0)
24755; RV64IA-WMO-NEXT:    ret
24756;
24757; RV64IA-TSO-LABEL: atomicrmw_sub_i64_seq_cst:
24758; RV64IA-TSO:       # %bb.0:
24759; RV64IA-TSO-NEXT:    neg a1, a1
24760; RV64IA-TSO-NEXT:    amoadd.d a0, a1, (a0)
24761; RV64IA-TSO-NEXT:    ret
24762  %1 = atomicrmw sub ptr %a, i64 %b seq_cst
24763  ret i64 %1
24764}
24765
24766define i64 @atomicrmw_and_i64_monotonic(ptr %a, i64 %b) nounwind {
24767; RV32I-LABEL: atomicrmw_and_i64_monotonic:
24768; RV32I:       # %bb.0:
24769; RV32I-NEXT:    addi sp, sp, -16
24770; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24771; RV32I-NEXT:    li a3, 0
24772; RV32I-NEXT:    call __atomic_fetch_and_8
24773; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24774; RV32I-NEXT:    addi sp, sp, 16
24775; RV32I-NEXT:    ret
24776;
24777; RV32IA-LABEL: atomicrmw_and_i64_monotonic:
24778; RV32IA:       # %bb.0:
24779; RV32IA-NEXT:    addi sp, sp, -16
24780; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24781; RV32IA-NEXT:    li a3, 0
24782; RV32IA-NEXT:    call __atomic_fetch_and_8
24783; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24784; RV32IA-NEXT:    addi sp, sp, 16
24785; RV32IA-NEXT:    ret
24786;
24787; RV64I-LABEL: atomicrmw_and_i64_monotonic:
24788; RV64I:       # %bb.0:
24789; RV64I-NEXT:    addi sp, sp, -16
24790; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24791; RV64I-NEXT:    li a2, 0
24792; RV64I-NEXT:    call __atomic_fetch_and_8
24793; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24794; RV64I-NEXT:    addi sp, sp, 16
24795; RV64I-NEXT:    ret
24796;
24797; RV64IA-LABEL: atomicrmw_and_i64_monotonic:
24798; RV64IA:       # %bb.0:
24799; RV64IA-NEXT:    amoand.d a0, a1, (a0)
24800; RV64IA-NEXT:    ret
24801  %1 = atomicrmw and ptr %a, i64 %b monotonic
24802  ret i64 %1
24803}
24804
24805define i64 @atomicrmw_and_i64_acquire(ptr %a, i64 %b) nounwind {
24806; RV32I-LABEL: atomicrmw_and_i64_acquire:
24807; RV32I:       # %bb.0:
24808; RV32I-NEXT:    addi sp, sp, -16
24809; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24810; RV32I-NEXT:    li a3, 2
24811; RV32I-NEXT:    call __atomic_fetch_and_8
24812; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24813; RV32I-NEXT:    addi sp, sp, 16
24814; RV32I-NEXT:    ret
24815;
24816; RV32IA-LABEL: atomicrmw_and_i64_acquire:
24817; RV32IA:       # %bb.0:
24818; RV32IA-NEXT:    addi sp, sp, -16
24819; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24820; RV32IA-NEXT:    li a3, 2
24821; RV32IA-NEXT:    call __atomic_fetch_and_8
24822; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24823; RV32IA-NEXT:    addi sp, sp, 16
24824; RV32IA-NEXT:    ret
24825;
24826; RV64I-LABEL: atomicrmw_and_i64_acquire:
24827; RV64I:       # %bb.0:
24828; RV64I-NEXT:    addi sp, sp, -16
24829; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24830; RV64I-NEXT:    li a2, 2
24831; RV64I-NEXT:    call __atomic_fetch_and_8
24832; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24833; RV64I-NEXT:    addi sp, sp, 16
24834; RV64I-NEXT:    ret
24835;
24836; RV64IA-WMO-LABEL: atomicrmw_and_i64_acquire:
24837; RV64IA-WMO:       # %bb.0:
24838; RV64IA-WMO-NEXT:    amoand.d.aq a0, a1, (a0)
24839; RV64IA-WMO-NEXT:    ret
24840;
24841; RV64IA-TSO-LABEL: atomicrmw_and_i64_acquire:
24842; RV64IA-TSO:       # %bb.0:
24843; RV64IA-TSO-NEXT:    amoand.d a0, a1, (a0)
24844; RV64IA-TSO-NEXT:    ret
24845  %1 = atomicrmw and ptr %a, i64 %b acquire
24846  ret i64 %1
24847}
24848
24849define i64 @atomicrmw_and_i64_release(ptr %a, i64 %b) nounwind {
24850; RV32I-LABEL: atomicrmw_and_i64_release:
24851; RV32I:       # %bb.0:
24852; RV32I-NEXT:    addi sp, sp, -16
24853; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24854; RV32I-NEXT:    li a3, 3
24855; RV32I-NEXT:    call __atomic_fetch_and_8
24856; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24857; RV32I-NEXT:    addi sp, sp, 16
24858; RV32I-NEXT:    ret
24859;
24860; RV32IA-LABEL: atomicrmw_and_i64_release:
24861; RV32IA:       # %bb.0:
24862; RV32IA-NEXT:    addi sp, sp, -16
24863; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24864; RV32IA-NEXT:    li a3, 3
24865; RV32IA-NEXT:    call __atomic_fetch_and_8
24866; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24867; RV32IA-NEXT:    addi sp, sp, 16
24868; RV32IA-NEXT:    ret
24869;
24870; RV64I-LABEL: atomicrmw_and_i64_release:
24871; RV64I:       # %bb.0:
24872; RV64I-NEXT:    addi sp, sp, -16
24873; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24874; RV64I-NEXT:    li a2, 3
24875; RV64I-NEXT:    call __atomic_fetch_and_8
24876; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24877; RV64I-NEXT:    addi sp, sp, 16
24878; RV64I-NEXT:    ret
24879;
24880; RV64IA-WMO-LABEL: atomicrmw_and_i64_release:
24881; RV64IA-WMO:       # %bb.0:
24882; RV64IA-WMO-NEXT:    amoand.d.rl a0, a1, (a0)
24883; RV64IA-WMO-NEXT:    ret
24884;
24885; RV64IA-TSO-LABEL: atomicrmw_and_i64_release:
24886; RV64IA-TSO:       # %bb.0:
24887; RV64IA-TSO-NEXT:    amoand.d a0, a1, (a0)
24888; RV64IA-TSO-NEXT:    ret
24889  %1 = atomicrmw and ptr %a, i64 %b release
24890  ret i64 %1
24891}
24892
24893define i64 @atomicrmw_and_i64_acq_rel(ptr %a, i64 %b) nounwind {
24894; RV32I-LABEL: atomicrmw_and_i64_acq_rel:
24895; RV32I:       # %bb.0:
24896; RV32I-NEXT:    addi sp, sp, -16
24897; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24898; RV32I-NEXT:    li a3, 4
24899; RV32I-NEXT:    call __atomic_fetch_and_8
24900; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24901; RV32I-NEXT:    addi sp, sp, 16
24902; RV32I-NEXT:    ret
24903;
24904; RV32IA-LABEL: atomicrmw_and_i64_acq_rel:
24905; RV32IA:       # %bb.0:
24906; RV32IA-NEXT:    addi sp, sp, -16
24907; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24908; RV32IA-NEXT:    li a3, 4
24909; RV32IA-NEXT:    call __atomic_fetch_and_8
24910; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24911; RV32IA-NEXT:    addi sp, sp, 16
24912; RV32IA-NEXT:    ret
24913;
24914; RV64I-LABEL: atomicrmw_and_i64_acq_rel:
24915; RV64I:       # %bb.0:
24916; RV64I-NEXT:    addi sp, sp, -16
24917; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24918; RV64I-NEXT:    li a2, 4
24919; RV64I-NEXT:    call __atomic_fetch_and_8
24920; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24921; RV64I-NEXT:    addi sp, sp, 16
24922; RV64I-NEXT:    ret
24923;
24924; RV64IA-WMO-LABEL: atomicrmw_and_i64_acq_rel:
24925; RV64IA-WMO:       # %bb.0:
24926; RV64IA-WMO-NEXT:    amoand.d.aqrl a0, a1, (a0)
24927; RV64IA-WMO-NEXT:    ret
24928;
24929; RV64IA-TSO-LABEL: atomicrmw_and_i64_acq_rel:
24930; RV64IA-TSO:       # %bb.0:
24931; RV64IA-TSO-NEXT:    amoand.d a0, a1, (a0)
24932; RV64IA-TSO-NEXT:    ret
24933  %1 = atomicrmw and ptr %a, i64 %b acq_rel
24934  ret i64 %1
24935}
24936
24937define i64 @atomicrmw_and_i64_seq_cst(ptr %a, i64 %b) nounwind {
24938; RV32I-LABEL: atomicrmw_and_i64_seq_cst:
24939; RV32I:       # %bb.0:
24940; RV32I-NEXT:    addi sp, sp, -16
24941; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24942; RV32I-NEXT:    li a3, 5
24943; RV32I-NEXT:    call __atomic_fetch_and_8
24944; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24945; RV32I-NEXT:    addi sp, sp, 16
24946; RV32I-NEXT:    ret
24947;
24948; RV32IA-LABEL: atomicrmw_and_i64_seq_cst:
24949; RV32IA:       # %bb.0:
24950; RV32IA-NEXT:    addi sp, sp, -16
24951; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24952; RV32IA-NEXT:    li a3, 5
24953; RV32IA-NEXT:    call __atomic_fetch_and_8
24954; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24955; RV32IA-NEXT:    addi sp, sp, 16
24956; RV32IA-NEXT:    ret
24957;
24958; RV64I-LABEL: atomicrmw_and_i64_seq_cst:
24959; RV64I:       # %bb.0:
24960; RV64I-NEXT:    addi sp, sp, -16
24961; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
24962; RV64I-NEXT:    li a2, 5
24963; RV64I-NEXT:    call __atomic_fetch_and_8
24964; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
24965; RV64I-NEXT:    addi sp, sp, 16
24966; RV64I-NEXT:    ret
24967;
24968; RV64IA-WMO-LABEL: atomicrmw_and_i64_seq_cst:
24969; RV64IA-WMO:       # %bb.0:
24970; RV64IA-WMO-NEXT:    amoand.d.aqrl a0, a1, (a0)
24971; RV64IA-WMO-NEXT:    ret
24972;
24973; RV64IA-TSO-LABEL: atomicrmw_and_i64_seq_cst:
24974; RV64IA-TSO:       # %bb.0:
24975; RV64IA-TSO-NEXT:    amoand.d a0, a1, (a0)
24976; RV64IA-TSO-NEXT:    ret
24977  %1 = atomicrmw and ptr %a, i64 %b seq_cst
24978  ret i64 %1
24979}
24980
24981define i64 @atomicrmw_nand_i64_monotonic(ptr %a, i64 %b) nounwind {
24982; RV32I-LABEL: atomicrmw_nand_i64_monotonic:
24983; RV32I:       # %bb.0:
24984; RV32I-NEXT:    addi sp, sp, -16
24985; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24986; RV32I-NEXT:    li a3, 0
24987; RV32I-NEXT:    call __atomic_fetch_nand_8
24988; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24989; RV32I-NEXT:    addi sp, sp, 16
24990; RV32I-NEXT:    ret
24991;
24992; RV32IA-LABEL: atomicrmw_nand_i64_monotonic:
24993; RV32IA:       # %bb.0:
24994; RV32IA-NEXT:    addi sp, sp, -16
24995; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
24996; RV32IA-NEXT:    li a3, 0
24997; RV32IA-NEXT:    call __atomic_fetch_nand_8
24998; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24999; RV32IA-NEXT:    addi sp, sp, 16
25000; RV32IA-NEXT:    ret
25001;
25002; RV64I-LABEL: atomicrmw_nand_i64_monotonic:
25003; RV64I:       # %bb.0:
25004; RV64I-NEXT:    addi sp, sp, -16
25005; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25006; RV64I-NEXT:    li a2, 0
25007; RV64I-NEXT:    call __atomic_fetch_nand_8
25008; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25009; RV64I-NEXT:    addi sp, sp, 16
25010; RV64I-NEXT:    ret
25011;
25012; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic:
25013; RV64IA-NOZACAS:       # %bb.0:
25014; RV64IA-NOZACAS-NEXT:  .LBB205_1: # =>This Inner Loop Header: Depth=1
25015; RV64IA-NOZACAS-NEXT:    lr.d a2, (a0)
25016; RV64IA-NOZACAS-NEXT:    and a3, a2, a1
25017; RV64IA-NOZACAS-NEXT:    not a3, a3
25018; RV64IA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25019; RV64IA-NOZACAS-NEXT:    bnez a3, .LBB205_1
25020; RV64IA-NOZACAS-NEXT:  # %bb.2:
25021; RV64IA-NOZACAS-NEXT:    mv a0, a2
25022; RV64IA-NOZACAS-NEXT:    ret
25023;
25024; RV64IA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic:
25025; RV64IA-ZACAS:       # %bb.0:
25026; RV64IA-ZACAS-NEXT:    mv a2, a0
25027; RV64IA-ZACAS-NEXT:    ld a0, 0(a0)
25028; RV64IA-ZACAS-NEXT:  .LBB205_1: # %atomicrmw.start
25029; RV64IA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25030; RV64IA-ZACAS-NEXT:    mv a3, a0
25031; RV64IA-ZACAS-NEXT:    and a4, a0, a1
25032; RV64IA-ZACAS-NEXT:    not a4, a4
25033; RV64IA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25034; RV64IA-ZACAS-NEXT:    bne a0, a3, .LBB205_1
25035; RV64IA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25036; RV64IA-ZACAS-NEXT:    ret
25037;
25038; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic:
25039; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
25040; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB205_1: # =>This Inner Loop Header: Depth=1
25041; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.d a2, (a0)
25042; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25043; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
25044; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25045; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB205_1
25046; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25047; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25048; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
25049;
25050; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic:
25051; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
25052; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB205_1: # =>This Inner Loop Header: Depth=1
25053; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.d a2, (a0)
25054; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25055; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
25056; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25057; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB205_1
25058; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25059; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25060; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
25061;
25062; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic:
25063; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
25064; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
25065; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25066; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB205_1: # %atomicrmw.start
25067; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25068; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
25069; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25070; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
25071; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25072; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB205_1
25073; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25074; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
25075;
25076; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic:
25077; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
25078; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
25079; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25080; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB205_1: # %atomicrmw.start
25081; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25082; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
25083; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25084; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
25085; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25086; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB205_1
25087; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25088; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
25089  %1 = atomicrmw nand ptr %a, i64 %b monotonic
25090  ret i64 %1
25091}
25092
25093define i64 @atomicrmw_nand_i64_acquire(ptr %a, i64 %b) nounwind {
25094; RV32I-LABEL: atomicrmw_nand_i64_acquire:
25095; RV32I:       # %bb.0:
25096; RV32I-NEXT:    addi sp, sp, -16
25097; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25098; RV32I-NEXT:    li a3, 2
25099; RV32I-NEXT:    call __atomic_fetch_nand_8
25100; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25101; RV32I-NEXT:    addi sp, sp, 16
25102; RV32I-NEXT:    ret
25103;
25104; RV32IA-LABEL: atomicrmw_nand_i64_acquire:
25105; RV32IA:       # %bb.0:
25106; RV32IA-NEXT:    addi sp, sp, -16
25107; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25108; RV32IA-NEXT:    li a3, 2
25109; RV32IA-NEXT:    call __atomic_fetch_nand_8
25110; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25111; RV32IA-NEXT:    addi sp, sp, 16
25112; RV32IA-NEXT:    ret
25113;
25114; RV64I-LABEL: atomicrmw_nand_i64_acquire:
25115; RV64I:       # %bb.0:
25116; RV64I-NEXT:    addi sp, sp, -16
25117; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25118; RV64I-NEXT:    li a2, 2
25119; RV64I-NEXT:    call __atomic_fetch_nand_8
25120; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25121; RV64I-NEXT:    addi sp, sp, 16
25122; RV64I-NEXT:    ret
25123;
25124; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
25125; RV64IA-WMO-NOZACAS:       # %bb.0:
25126; RV64IA-WMO-NOZACAS-NEXT:  .LBB206_1: # =>This Inner Loop Header: Depth=1
25127; RV64IA-WMO-NOZACAS-NEXT:    lr.d.aq a2, (a0)
25128; RV64IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
25129; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
25130; RV64IA-WMO-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25131; RV64IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB206_1
25132; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
25133; RV64IA-WMO-NOZACAS-NEXT:    mv a0, a2
25134; RV64IA-WMO-NOZACAS-NEXT:    ret
25135;
25136; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
25137; RV64IA-TSO-NOZACAS:       # %bb.0:
25138; RV64IA-TSO-NOZACAS-NEXT:  .LBB206_1: # =>This Inner Loop Header: Depth=1
25139; RV64IA-TSO-NOZACAS-NEXT:    lr.d a2, (a0)
25140; RV64IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
25141; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
25142; RV64IA-TSO-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25143; RV64IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB206_1
25144; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
25145; RV64IA-TSO-NOZACAS-NEXT:    mv a0, a2
25146; RV64IA-TSO-NOZACAS-NEXT:    ret
25147;
25148; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
25149; RV64IA-WMO-ZACAS:       # %bb.0:
25150; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
25151; RV64IA-WMO-ZACAS-NEXT:    ld a0, 0(a0)
25152; RV64IA-WMO-ZACAS-NEXT:  .LBB206_1: # %atomicrmw.start
25153; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25154; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
25155; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
25156; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
25157; RV64IA-WMO-ZACAS-NEXT:    amocas.d.aq a0, a4, (a2)
25158; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB206_1
25159; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25160; RV64IA-WMO-ZACAS-NEXT:    ret
25161;
25162; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
25163; RV64IA-TSO-ZACAS:       # %bb.0:
25164; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
25165; RV64IA-TSO-ZACAS-NEXT:    ld a0, 0(a0)
25166; RV64IA-TSO-ZACAS-NEXT:  .LBB206_1: # %atomicrmw.start
25167; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25168; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
25169; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
25170; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
25171; RV64IA-TSO-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25172; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB206_1
25173; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25174; RV64IA-TSO-ZACAS-NEXT:    ret
25175;
25176; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
25177; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
25178; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB206_1: # =>This Inner Loop Header: Depth=1
25179; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.d.aq a2, (a0)
25180; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25181; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
25182; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25183; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB206_1
25184; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25185; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25186; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
25187;
25188; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
25189; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
25190; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB206_1: # =>This Inner Loop Header: Depth=1
25191; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.d a2, (a0)
25192; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25193; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
25194; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25195; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB206_1
25196; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25197; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25198; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
25199;
25200; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
25201; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
25202; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
25203; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25204; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB206_1: # %atomicrmw.start
25205; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25206; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
25207; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25208; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
25209; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.d.aq a0, a4, (a2)
25210; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB206_1
25211; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25212; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
25213;
25214; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
25215; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
25216; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
25217; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25218; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB206_1: # %atomicrmw.start
25219; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25220; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
25221; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25222; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
25223; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25224; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB206_1
25225; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25226; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
25227  %1 = atomicrmw nand ptr %a, i64 %b acquire
25228  ret i64 %1
25229}
25230
25231define i64 @atomicrmw_nand_i64_release(ptr %a, i64 %b) nounwind {
25232; RV32I-LABEL: atomicrmw_nand_i64_release:
25233; RV32I:       # %bb.0:
25234; RV32I-NEXT:    addi sp, sp, -16
25235; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25236; RV32I-NEXT:    li a3, 3
25237; RV32I-NEXT:    call __atomic_fetch_nand_8
25238; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25239; RV32I-NEXT:    addi sp, sp, 16
25240; RV32I-NEXT:    ret
25241;
25242; RV32IA-LABEL: atomicrmw_nand_i64_release:
25243; RV32IA:       # %bb.0:
25244; RV32IA-NEXT:    addi sp, sp, -16
25245; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25246; RV32IA-NEXT:    li a3, 3
25247; RV32IA-NEXT:    call __atomic_fetch_nand_8
25248; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25249; RV32IA-NEXT:    addi sp, sp, 16
25250; RV32IA-NEXT:    ret
25251;
25252; RV64I-LABEL: atomicrmw_nand_i64_release:
25253; RV64I:       # %bb.0:
25254; RV64I-NEXT:    addi sp, sp, -16
25255; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25256; RV64I-NEXT:    li a2, 3
25257; RV64I-NEXT:    call __atomic_fetch_nand_8
25258; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25259; RV64I-NEXT:    addi sp, sp, 16
25260; RV64I-NEXT:    ret
25261;
25262; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_release:
25263; RV64IA-WMO-NOZACAS:       # %bb.0:
25264; RV64IA-WMO-NOZACAS-NEXT:  .LBB207_1: # =>This Inner Loop Header: Depth=1
25265; RV64IA-WMO-NOZACAS-NEXT:    lr.d a2, (a0)
25266; RV64IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
25267; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
25268; RV64IA-WMO-NOZACAS-NEXT:    sc.d.rl a3, a3, (a0)
25269; RV64IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB207_1
25270; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
25271; RV64IA-WMO-NOZACAS-NEXT:    mv a0, a2
25272; RV64IA-WMO-NOZACAS-NEXT:    ret
25273;
25274; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_release:
25275; RV64IA-TSO-NOZACAS:       # %bb.0:
25276; RV64IA-TSO-NOZACAS-NEXT:  .LBB207_1: # =>This Inner Loop Header: Depth=1
25277; RV64IA-TSO-NOZACAS-NEXT:    lr.d a2, (a0)
25278; RV64IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
25279; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
25280; RV64IA-TSO-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25281; RV64IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB207_1
25282; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
25283; RV64IA-TSO-NOZACAS-NEXT:    mv a0, a2
25284; RV64IA-TSO-NOZACAS-NEXT:    ret
25285;
25286; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_release:
25287; RV64IA-WMO-ZACAS:       # %bb.0:
25288; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
25289; RV64IA-WMO-ZACAS-NEXT:    ld a0, 0(a0)
25290; RV64IA-WMO-ZACAS-NEXT:  .LBB207_1: # %atomicrmw.start
25291; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25292; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
25293; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
25294; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
25295; RV64IA-WMO-ZACAS-NEXT:    amocas.d.rl a0, a4, (a2)
25296; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB207_1
25297; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25298; RV64IA-WMO-ZACAS-NEXT:    ret
25299;
25300; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_release:
25301; RV64IA-TSO-ZACAS:       # %bb.0:
25302; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
25303; RV64IA-TSO-ZACAS-NEXT:    ld a0, 0(a0)
25304; RV64IA-TSO-ZACAS-NEXT:  .LBB207_1: # %atomicrmw.start
25305; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25306; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
25307; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
25308; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
25309; RV64IA-TSO-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25310; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB207_1
25311; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25312; RV64IA-TSO-ZACAS-NEXT:    ret
25313;
25314; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_release:
25315; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
25316; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB207_1: # =>This Inner Loop Header: Depth=1
25317; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.d a2, (a0)
25318; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25319; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
25320; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.d.rl a3, a3, (a0)
25321; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB207_1
25322; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25323; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25324; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
25325;
25326; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_release:
25327; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
25328; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB207_1: # =>This Inner Loop Header: Depth=1
25329; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.d a2, (a0)
25330; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25331; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
25332; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25333; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB207_1
25334; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25335; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25336; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
25337;
25338; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_release:
25339; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
25340; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
25341; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25342; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB207_1: # %atomicrmw.start
25343; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25344; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
25345; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25346; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
25347; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.d.rl a0, a4, (a2)
25348; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB207_1
25349; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25350; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
25351;
25352; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_release:
25353; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
25354; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
25355; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25356; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB207_1: # %atomicrmw.start
25357; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25358; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
25359; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25360; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
25361; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25362; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB207_1
25363; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25364; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
25365  %1 = atomicrmw nand ptr %a, i64 %b release
25366  ret i64 %1
25367}
25368
25369define i64 @atomicrmw_nand_i64_acq_rel(ptr %a, i64 %b) nounwind {
25370; RV32I-LABEL: atomicrmw_nand_i64_acq_rel:
25371; RV32I:       # %bb.0:
25372; RV32I-NEXT:    addi sp, sp, -16
25373; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25374; RV32I-NEXT:    li a3, 4
25375; RV32I-NEXT:    call __atomic_fetch_nand_8
25376; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25377; RV32I-NEXT:    addi sp, sp, 16
25378; RV32I-NEXT:    ret
25379;
25380; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel:
25381; RV32IA:       # %bb.0:
25382; RV32IA-NEXT:    addi sp, sp, -16
25383; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25384; RV32IA-NEXT:    li a3, 4
25385; RV32IA-NEXT:    call __atomic_fetch_nand_8
25386; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25387; RV32IA-NEXT:    addi sp, sp, 16
25388; RV32IA-NEXT:    ret
25389;
25390; RV64I-LABEL: atomicrmw_nand_i64_acq_rel:
25391; RV64I:       # %bb.0:
25392; RV64I-NEXT:    addi sp, sp, -16
25393; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25394; RV64I-NEXT:    li a2, 4
25395; RV64I-NEXT:    call __atomic_fetch_nand_8
25396; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25397; RV64I-NEXT:    addi sp, sp, 16
25398; RV64I-NEXT:    ret
25399;
25400; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25401; RV64IA-WMO-NOZACAS:       # %bb.0:
25402; RV64IA-WMO-NOZACAS-NEXT:  .LBB208_1: # =>This Inner Loop Header: Depth=1
25403; RV64IA-WMO-NOZACAS-NEXT:    lr.d.aq a2, (a0)
25404; RV64IA-WMO-NOZACAS-NEXT:    and a3, a2, a1
25405; RV64IA-WMO-NOZACAS-NEXT:    not a3, a3
25406; RV64IA-WMO-NOZACAS-NEXT:    sc.d.rl a3, a3, (a0)
25407; RV64IA-WMO-NOZACAS-NEXT:    bnez a3, .LBB208_1
25408; RV64IA-WMO-NOZACAS-NEXT:  # %bb.2:
25409; RV64IA-WMO-NOZACAS-NEXT:    mv a0, a2
25410; RV64IA-WMO-NOZACAS-NEXT:    ret
25411;
25412; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25413; RV64IA-TSO-NOZACAS:       # %bb.0:
25414; RV64IA-TSO-NOZACAS-NEXT:  .LBB208_1: # =>This Inner Loop Header: Depth=1
25415; RV64IA-TSO-NOZACAS-NEXT:    lr.d a2, (a0)
25416; RV64IA-TSO-NOZACAS-NEXT:    and a3, a2, a1
25417; RV64IA-TSO-NOZACAS-NEXT:    not a3, a3
25418; RV64IA-TSO-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25419; RV64IA-TSO-NOZACAS-NEXT:    bnez a3, .LBB208_1
25420; RV64IA-TSO-NOZACAS-NEXT:  # %bb.2:
25421; RV64IA-TSO-NOZACAS-NEXT:    mv a0, a2
25422; RV64IA-TSO-NOZACAS-NEXT:    ret
25423;
25424; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25425; RV64IA-WMO-ZACAS:       # %bb.0:
25426; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
25427; RV64IA-WMO-ZACAS-NEXT:    ld a0, 0(a0)
25428; RV64IA-WMO-ZACAS-NEXT:  .LBB208_1: # %atomicrmw.start
25429; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25430; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
25431; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
25432; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
25433; RV64IA-WMO-ZACAS-NEXT:    amocas.d.aqrl a0, a4, (a2)
25434; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB208_1
25435; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25436; RV64IA-WMO-ZACAS-NEXT:    ret
25437;
25438; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25439; RV64IA-TSO-ZACAS:       # %bb.0:
25440; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
25441; RV64IA-TSO-ZACAS-NEXT:    ld a0, 0(a0)
25442; RV64IA-TSO-ZACAS-NEXT:  .LBB208_1: # %atomicrmw.start
25443; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25444; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
25445; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
25446; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
25447; RV64IA-TSO-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25448; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB208_1
25449; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25450; RV64IA-TSO-ZACAS-NEXT:    ret
25451;
25452; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25453; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
25454; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB208_1: # =>This Inner Loop Header: Depth=1
25455; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.d.aq a2, (a0)
25456; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25457; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
25458; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.d.rl a3, a3, (a0)
25459; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB208_1
25460; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25461; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25462; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
25463;
25464; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25465; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
25466; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB208_1: # =>This Inner Loop Header: Depth=1
25467; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.d a2, (a0)
25468; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25469; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
25470; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.d a3, a3, (a0)
25471; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB208_1
25472; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25473; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25474; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
25475;
25476; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25477; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
25478; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
25479; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25480; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB208_1: # %atomicrmw.start
25481; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25482; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
25483; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25484; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
25485; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.d.aqrl a0, a4, (a2)
25486; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB208_1
25487; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25488; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
25489;
25490; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
25491; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
25492; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
25493; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25494; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB208_1: # %atomicrmw.start
25495; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25496; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
25497; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25498; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
25499; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25500; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB208_1
25501; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25502; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
25503  %1 = atomicrmw nand ptr %a, i64 %b acq_rel
25504  ret i64 %1
25505}
25506
25507define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {
25508; RV32I-LABEL: atomicrmw_nand_i64_seq_cst:
25509; RV32I:       # %bb.0:
25510; RV32I-NEXT:    addi sp, sp, -16
25511; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25512; RV32I-NEXT:    li a3, 5
25513; RV32I-NEXT:    call __atomic_fetch_nand_8
25514; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25515; RV32I-NEXT:    addi sp, sp, 16
25516; RV32I-NEXT:    ret
25517;
25518; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst:
25519; RV32IA:       # %bb.0:
25520; RV32IA-NEXT:    addi sp, sp, -16
25521; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25522; RV32IA-NEXT:    li a3, 5
25523; RV32IA-NEXT:    call __atomic_fetch_nand_8
25524; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25525; RV32IA-NEXT:    addi sp, sp, 16
25526; RV32IA-NEXT:    ret
25527;
25528; RV64I-LABEL: atomicrmw_nand_i64_seq_cst:
25529; RV64I:       # %bb.0:
25530; RV64I-NEXT:    addi sp, sp, -16
25531; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25532; RV64I-NEXT:    li a2, 5
25533; RV64I-NEXT:    call __atomic_fetch_nand_8
25534; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25535; RV64I-NEXT:    addi sp, sp, 16
25536; RV64I-NEXT:    ret
25537;
25538; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
25539; RV64IA-NOZACAS:       # %bb.0:
25540; RV64IA-NOZACAS-NEXT:  .LBB209_1: # =>This Inner Loop Header: Depth=1
25541; RV64IA-NOZACAS-NEXT:    lr.d.aqrl a2, (a0)
25542; RV64IA-NOZACAS-NEXT:    and a3, a2, a1
25543; RV64IA-NOZACAS-NEXT:    not a3, a3
25544; RV64IA-NOZACAS-NEXT:    sc.d.rl a3, a3, (a0)
25545; RV64IA-NOZACAS-NEXT:    bnez a3, .LBB209_1
25546; RV64IA-NOZACAS-NEXT:  # %bb.2:
25547; RV64IA-NOZACAS-NEXT:    mv a0, a2
25548; RV64IA-NOZACAS-NEXT:    ret
25549;
25550; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
25551; RV64IA-WMO-ZACAS:       # %bb.0:
25552; RV64IA-WMO-ZACAS-NEXT:    mv a2, a0
25553; RV64IA-WMO-ZACAS-NEXT:    ld a0, 0(a0)
25554; RV64IA-WMO-ZACAS-NEXT:  .LBB209_1: # %atomicrmw.start
25555; RV64IA-WMO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25556; RV64IA-WMO-ZACAS-NEXT:    mv a3, a0
25557; RV64IA-WMO-ZACAS-NEXT:    and a4, a0, a1
25558; RV64IA-WMO-ZACAS-NEXT:    not a4, a4
25559; RV64IA-WMO-ZACAS-NEXT:    fence rw, rw
25560; RV64IA-WMO-ZACAS-NEXT:    amocas.d.aqrl a0, a4, (a2)
25561; RV64IA-WMO-ZACAS-NEXT:    bne a0, a3, .LBB209_1
25562; RV64IA-WMO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25563; RV64IA-WMO-ZACAS-NEXT:    ret
25564;
25565; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
25566; RV64IA-TSO-ZACAS:       # %bb.0:
25567; RV64IA-TSO-ZACAS-NEXT:    mv a2, a0
25568; RV64IA-TSO-ZACAS-NEXT:    ld a0, 0(a0)
25569; RV64IA-TSO-ZACAS-NEXT:  .LBB209_1: # %atomicrmw.start
25570; RV64IA-TSO-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25571; RV64IA-TSO-ZACAS-NEXT:    mv a3, a0
25572; RV64IA-TSO-ZACAS-NEXT:    and a4, a0, a1
25573; RV64IA-TSO-ZACAS-NEXT:    not a4, a4
25574; RV64IA-TSO-ZACAS-NEXT:    fence rw, rw
25575; RV64IA-TSO-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25576; RV64IA-TSO-ZACAS-NEXT:    bne a0, a3, .LBB209_1
25577; RV64IA-TSO-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25578; RV64IA-TSO-ZACAS-NEXT:    ret
25579;
25580; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
25581; RV64IA-WMO-ZABHA-NOZACAS:       # %bb.0:
25582; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  .LBB209_1: # =>This Inner Loop Header: Depth=1
25583; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    lr.d.aqrl a2, (a0)
25584; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25585; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    not a3, a3
25586; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    sc.d.rl a3, a3, (a0)
25587; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB209_1
25588; RV64IA-WMO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25589; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25590; RV64IA-WMO-ZABHA-NOZACAS-NEXT:    ret
25591;
25592; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
25593; RV64IA-TSO-ZABHA-NOZACAS:       # %bb.0:
25594; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  .LBB209_1: # =>This Inner Loop Header: Depth=1
25595; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    lr.d.aqrl a2, (a0)
25596; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    and a3, a2, a1
25597; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    not a3, a3
25598; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    sc.d.rl a3, a3, (a0)
25599; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    bnez a3, .LBB209_1
25600; RV64IA-TSO-ZABHA-NOZACAS-NEXT:  # %bb.2:
25601; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    mv a0, a2
25602; RV64IA-TSO-ZABHA-NOZACAS-NEXT:    ret
25603;
25604; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
25605; RV64IA-WMO-ZABHA-ZACAS:       # %bb.0:
25606; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a2, a0
25607; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25608; RV64IA-WMO-ZABHA-ZACAS-NEXT:  .LBB209_1: # %atomicrmw.start
25609; RV64IA-WMO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25610; RV64IA-WMO-ZABHA-ZACAS-NEXT:    mv a3, a0
25611; RV64IA-WMO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25612; RV64IA-WMO-ZABHA-ZACAS-NEXT:    not a4, a4
25613; RV64IA-WMO-ZABHA-ZACAS-NEXT:    fence rw, rw
25614; RV64IA-WMO-ZABHA-ZACAS-NEXT:    amocas.d.aqrl a0, a4, (a2)
25615; RV64IA-WMO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB209_1
25616; RV64IA-WMO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25617; RV64IA-WMO-ZABHA-ZACAS-NEXT:    ret
25618;
25619; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
25620; RV64IA-TSO-ZABHA-ZACAS:       # %bb.0:
25621; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a2, a0
25622; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ld a0, 0(a0)
25623; RV64IA-TSO-ZABHA-ZACAS-NEXT:  .LBB209_1: # %atomicrmw.start
25624; RV64IA-TSO-ZABHA-ZACAS-NEXT:    # =>This Inner Loop Header: Depth=1
25625; RV64IA-TSO-ZABHA-ZACAS-NEXT:    mv a3, a0
25626; RV64IA-TSO-ZABHA-ZACAS-NEXT:    and a4, a0, a1
25627; RV64IA-TSO-ZABHA-ZACAS-NEXT:    not a4, a4
25628; RV64IA-TSO-ZABHA-ZACAS-NEXT:    fence rw, rw
25629; RV64IA-TSO-ZABHA-ZACAS-NEXT:    amocas.d a0, a4, (a2)
25630; RV64IA-TSO-ZABHA-ZACAS-NEXT:    bne a0, a3, .LBB209_1
25631; RV64IA-TSO-ZABHA-ZACAS-NEXT:  # %bb.2: # %atomicrmw.end
25632; RV64IA-TSO-ZABHA-ZACAS-NEXT:    ret
25633  %1 = atomicrmw nand ptr %a, i64 %b seq_cst
25634  ret i64 %1
25635}
25636
25637define i64 @atomicrmw_or_i64_monotonic(ptr %a, i64 %b) nounwind {
25638; RV32I-LABEL: atomicrmw_or_i64_monotonic:
25639; RV32I:       # %bb.0:
25640; RV32I-NEXT:    addi sp, sp, -16
25641; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25642; RV32I-NEXT:    li a3, 0
25643; RV32I-NEXT:    call __atomic_fetch_or_8
25644; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25645; RV32I-NEXT:    addi sp, sp, 16
25646; RV32I-NEXT:    ret
25647;
25648; RV32IA-LABEL: atomicrmw_or_i64_monotonic:
25649; RV32IA:       # %bb.0:
25650; RV32IA-NEXT:    addi sp, sp, -16
25651; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25652; RV32IA-NEXT:    li a3, 0
25653; RV32IA-NEXT:    call __atomic_fetch_or_8
25654; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25655; RV32IA-NEXT:    addi sp, sp, 16
25656; RV32IA-NEXT:    ret
25657;
25658; RV64I-LABEL: atomicrmw_or_i64_monotonic:
25659; RV64I:       # %bb.0:
25660; RV64I-NEXT:    addi sp, sp, -16
25661; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25662; RV64I-NEXT:    li a2, 0
25663; RV64I-NEXT:    call __atomic_fetch_or_8
25664; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25665; RV64I-NEXT:    addi sp, sp, 16
25666; RV64I-NEXT:    ret
25667;
25668; RV64IA-LABEL: atomicrmw_or_i64_monotonic:
25669; RV64IA:       # %bb.0:
25670; RV64IA-NEXT:    amoor.d a0, a1, (a0)
25671; RV64IA-NEXT:    ret
25672  %1 = atomicrmw or ptr %a, i64 %b monotonic
25673  ret i64 %1
25674}
25675
25676define i64 @atomicrmw_or_i64_acquire(ptr %a, i64 %b) nounwind {
25677; RV32I-LABEL: atomicrmw_or_i64_acquire:
25678; RV32I:       # %bb.0:
25679; RV32I-NEXT:    addi sp, sp, -16
25680; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25681; RV32I-NEXT:    li a3, 2
25682; RV32I-NEXT:    call __atomic_fetch_or_8
25683; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25684; RV32I-NEXT:    addi sp, sp, 16
25685; RV32I-NEXT:    ret
25686;
25687; RV32IA-LABEL: atomicrmw_or_i64_acquire:
25688; RV32IA:       # %bb.0:
25689; RV32IA-NEXT:    addi sp, sp, -16
25690; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25691; RV32IA-NEXT:    li a3, 2
25692; RV32IA-NEXT:    call __atomic_fetch_or_8
25693; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25694; RV32IA-NEXT:    addi sp, sp, 16
25695; RV32IA-NEXT:    ret
25696;
25697; RV64I-LABEL: atomicrmw_or_i64_acquire:
25698; RV64I:       # %bb.0:
25699; RV64I-NEXT:    addi sp, sp, -16
25700; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25701; RV64I-NEXT:    li a2, 2
25702; RV64I-NEXT:    call __atomic_fetch_or_8
25703; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25704; RV64I-NEXT:    addi sp, sp, 16
25705; RV64I-NEXT:    ret
25706;
25707; RV64IA-WMO-LABEL: atomicrmw_or_i64_acquire:
25708; RV64IA-WMO:       # %bb.0:
25709; RV64IA-WMO-NEXT:    amoor.d.aq a0, a1, (a0)
25710; RV64IA-WMO-NEXT:    ret
25711;
25712; RV64IA-TSO-LABEL: atomicrmw_or_i64_acquire:
25713; RV64IA-TSO:       # %bb.0:
25714; RV64IA-TSO-NEXT:    amoor.d a0, a1, (a0)
25715; RV64IA-TSO-NEXT:    ret
25716  %1 = atomicrmw or ptr %a, i64 %b acquire
25717  ret i64 %1
25718}
25719
25720define i64 @atomicrmw_or_i64_release(ptr %a, i64 %b) nounwind {
25721; RV32I-LABEL: atomicrmw_or_i64_release:
25722; RV32I:       # %bb.0:
25723; RV32I-NEXT:    addi sp, sp, -16
25724; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25725; RV32I-NEXT:    li a3, 3
25726; RV32I-NEXT:    call __atomic_fetch_or_8
25727; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25728; RV32I-NEXT:    addi sp, sp, 16
25729; RV32I-NEXT:    ret
25730;
25731; RV32IA-LABEL: atomicrmw_or_i64_release:
25732; RV32IA:       # %bb.0:
25733; RV32IA-NEXT:    addi sp, sp, -16
25734; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25735; RV32IA-NEXT:    li a3, 3
25736; RV32IA-NEXT:    call __atomic_fetch_or_8
25737; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25738; RV32IA-NEXT:    addi sp, sp, 16
25739; RV32IA-NEXT:    ret
25740;
25741; RV64I-LABEL: atomicrmw_or_i64_release:
25742; RV64I:       # %bb.0:
25743; RV64I-NEXT:    addi sp, sp, -16
25744; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25745; RV64I-NEXT:    li a2, 3
25746; RV64I-NEXT:    call __atomic_fetch_or_8
25747; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25748; RV64I-NEXT:    addi sp, sp, 16
25749; RV64I-NEXT:    ret
25750;
25751; RV64IA-WMO-LABEL: atomicrmw_or_i64_release:
25752; RV64IA-WMO:       # %bb.0:
25753; RV64IA-WMO-NEXT:    amoor.d.rl a0, a1, (a0)
25754; RV64IA-WMO-NEXT:    ret
25755;
25756; RV64IA-TSO-LABEL: atomicrmw_or_i64_release:
25757; RV64IA-TSO:       # %bb.0:
25758; RV64IA-TSO-NEXT:    amoor.d a0, a1, (a0)
25759; RV64IA-TSO-NEXT:    ret
25760  %1 = atomicrmw or ptr %a, i64 %b release
25761  ret i64 %1
25762}
25763
25764define i64 @atomicrmw_or_i64_acq_rel(ptr %a, i64 %b) nounwind {
25765; RV32I-LABEL: atomicrmw_or_i64_acq_rel:
25766; RV32I:       # %bb.0:
25767; RV32I-NEXT:    addi sp, sp, -16
25768; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25769; RV32I-NEXT:    li a3, 4
25770; RV32I-NEXT:    call __atomic_fetch_or_8
25771; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25772; RV32I-NEXT:    addi sp, sp, 16
25773; RV32I-NEXT:    ret
25774;
25775; RV32IA-LABEL: atomicrmw_or_i64_acq_rel:
25776; RV32IA:       # %bb.0:
25777; RV32IA-NEXT:    addi sp, sp, -16
25778; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25779; RV32IA-NEXT:    li a3, 4
25780; RV32IA-NEXT:    call __atomic_fetch_or_8
25781; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25782; RV32IA-NEXT:    addi sp, sp, 16
25783; RV32IA-NEXT:    ret
25784;
25785; RV64I-LABEL: atomicrmw_or_i64_acq_rel:
25786; RV64I:       # %bb.0:
25787; RV64I-NEXT:    addi sp, sp, -16
25788; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25789; RV64I-NEXT:    li a2, 4
25790; RV64I-NEXT:    call __atomic_fetch_or_8
25791; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25792; RV64I-NEXT:    addi sp, sp, 16
25793; RV64I-NEXT:    ret
25794;
25795; RV64IA-WMO-LABEL: atomicrmw_or_i64_acq_rel:
25796; RV64IA-WMO:       # %bb.0:
25797; RV64IA-WMO-NEXT:    amoor.d.aqrl a0, a1, (a0)
25798; RV64IA-WMO-NEXT:    ret
25799;
25800; RV64IA-TSO-LABEL: atomicrmw_or_i64_acq_rel:
25801; RV64IA-TSO:       # %bb.0:
25802; RV64IA-TSO-NEXT:    amoor.d a0, a1, (a0)
25803; RV64IA-TSO-NEXT:    ret
25804  %1 = atomicrmw or ptr %a, i64 %b acq_rel
25805  ret i64 %1
25806}
25807
25808define i64 @atomicrmw_or_i64_seq_cst(ptr %a, i64 %b) nounwind {
25809; RV32I-LABEL: atomicrmw_or_i64_seq_cst:
25810; RV32I:       # %bb.0:
25811; RV32I-NEXT:    addi sp, sp, -16
25812; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25813; RV32I-NEXT:    li a3, 5
25814; RV32I-NEXT:    call __atomic_fetch_or_8
25815; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25816; RV32I-NEXT:    addi sp, sp, 16
25817; RV32I-NEXT:    ret
25818;
25819; RV32IA-LABEL: atomicrmw_or_i64_seq_cst:
25820; RV32IA:       # %bb.0:
25821; RV32IA-NEXT:    addi sp, sp, -16
25822; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25823; RV32IA-NEXT:    li a3, 5
25824; RV32IA-NEXT:    call __atomic_fetch_or_8
25825; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25826; RV32IA-NEXT:    addi sp, sp, 16
25827; RV32IA-NEXT:    ret
25828;
25829; RV64I-LABEL: atomicrmw_or_i64_seq_cst:
25830; RV64I:       # %bb.0:
25831; RV64I-NEXT:    addi sp, sp, -16
25832; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25833; RV64I-NEXT:    li a2, 5
25834; RV64I-NEXT:    call __atomic_fetch_or_8
25835; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25836; RV64I-NEXT:    addi sp, sp, 16
25837; RV64I-NEXT:    ret
25838;
25839; RV64IA-WMO-LABEL: atomicrmw_or_i64_seq_cst:
25840; RV64IA-WMO:       # %bb.0:
25841; RV64IA-WMO-NEXT:    amoor.d.aqrl a0, a1, (a0)
25842; RV64IA-WMO-NEXT:    ret
25843;
25844; RV64IA-TSO-LABEL: atomicrmw_or_i64_seq_cst:
25845; RV64IA-TSO:       # %bb.0:
25846; RV64IA-TSO-NEXT:    amoor.d a0, a1, (a0)
25847; RV64IA-TSO-NEXT:    ret
25848  %1 = atomicrmw or ptr %a, i64 %b seq_cst
25849  ret i64 %1
25850}
25851
25852define i64 @atomicrmw_xor_i64_monotonic(ptr %a, i64 %b) nounwind {
25853; RV32I-LABEL: atomicrmw_xor_i64_monotonic:
25854; RV32I:       # %bb.0:
25855; RV32I-NEXT:    addi sp, sp, -16
25856; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25857; RV32I-NEXT:    li a3, 0
25858; RV32I-NEXT:    call __atomic_fetch_xor_8
25859; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25860; RV32I-NEXT:    addi sp, sp, 16
25861; RV32I-NEXT:    ret
25862;
25863; RV32IA-LABEL: atomicrmw_xor_i64_monotonic:
25864; RV32IA:       # %bb.0:
25865; RV32IA-NEXT:    addi sp, sp, -16
25866; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25867; RV32IA-NEXT:    li a3, 0
25868; RV32IA-NEXT:    call __atomic_fetch_xor_8
25869; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25870; RV32IA-NEXT:    addi sp, sp, 16
25871; RV32IA-NEXT:    ret
25872;
25873; RV64I-LABEL: atomicrmw_xor_i64_monotonic:
25874; RV64I:       # %bb.0:
25875; RV64I-NEXT:    addi sp, sp, -16
25876; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25877; RV64I-NEXT:    li a2, 0
25878; RV64I-NEXT:    call __atomic_fetch_xor_8
25879; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25880; RV64I-NEXT:    addi sp, sp, 16
25881; RV64I-NEXT:    ret
25882;
25883; RV64IA-LABEL: atomicrmw_xor_i64_monotonic:
25884; RV64IA:       # %bb.0:
25885; RV64IA-NEXT:    amoxor.d a0, a1, (a0)
25886; RV64IA-NEXT:    ret
25887  %1 = atomicrmw xor ptr %a, i64 %b monotonic
25888  ret i64 %1
25889}
25890
25891define i64 @atomicrmw_xor_i64_acquire(ptr %a, i64 %b) nounwind {
25892; RV32I-LABEL: atomicrmw_xor_i64_acquire:
25893; RV32I:       # %bb.0:
25894; RV32I-NEXT:    addi sp, sp, -16
25895; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25896; RV32I-NEXT:    li a3, 2
25897; RV32I-NEXT:    call __atomic_fetch_xor_8
25898; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25899; RV32I-NEXT:    addi sp, sp, 16
25900; RV32I-NEXT:    ret
25901;
25902; RV32IA-LABEL: atomicrmw_xor_i64_acquire:
25903; RV32IA:       # %bb.0:
25904; RV32IA-NEXT:    addi sp, sp, -16
25905; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25906; RV32IA-NEXT:    li a3, 2
25907; RV32IA-NEXT:    call __atomic_fetch_xor_8
25908; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25909; RV32IA-NEXT:    addi sp, sp, 16
25910; RV32IA-NEXT:    ret
25911;
25912; RV64I-LABEL: atomicrmw_xor_i64_acquire:
25913; RV64I:       # %bb.0:
25914; RV64I-NEXT:    addi sp, sp, -16
25915; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25916; RV64I-NEXT:    li a2, 2
25917; RV64I-NEXT:    call __atomic_fetch_xor_8
25918; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25919; RV64I-NEXT:    addi sp, sp, 16
25920; RV64I-NEXT:    ret
25921;
25922; RV64IA-WMO-LABEL: atomicrmw_xor_i64_acquire:
25923; RV64IA-WMO:       # %bb.0:
25924; RV64IA-WMO-NEXT:    amoxor.d.aq a0, a1, (a0)
25925; RV64IA-WMO-NEXT:    ret
25926;
25927; RV64IA-TSO-LABEL: atomicrmw_xor_i64_acquire:
25928; RV64IA-TSO:       # %bb.0:
25929; RV64IA-TSO-NEXT:    amoxor.d a0, a1, (a0)
25930; RV64IA-TSO-NEXT:    ret
25931  %1 = atomicrmw xor ptr %a, i64 %b acquire
25932  ret i64 %1
25933}
25934
25935define i64 @atomicrmw_xor_i64_release(ptr %a, i64 %b) nounwind {
25936; RV32I-LABEL: atomicrmw_xor_i64_release:
25937; RV32I:       # %bb.0:
25938; RV32I-NEXT:    addi sp, sp, -16
25939; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25940; RV32I-NEXT:    li a3, 3
25941; RV32I-NEXT:    call __atomic_fetch_xor_8
25942; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25943; RV32I-NEXT:    addi sp, sp, 16
25944; RV32I-NEXT:    ret
25945;
25946; RV32IA-LABEL: atomicrmw_xor_i64_release:
25947; RV32IA:       # %bb.0:
25948; RV32IA-NEXT:    addi sp, sp, -16
25949; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25950; RV32IA-NEXT:    li a3, 3
25951; RV32IA-NEXT:    call __atomic_fetch_xor_8
25952; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25953; RV32IA-NEXT:    addi sp, sp, 16
25954; RV32IA-NEXT:    ret
25955;
25956; RV64I-LABEL: atomicrmw_xor_i64_release:
25957; RV64I:       # %bb.0:
25958; RV64I-NEXT:    addi sp, sp, -16
25959; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25960; RV64I-NEXT:    li a2, 3
25961; RV64I-NEXT:    call __atomic_fetch_xor_8
25962; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25963; RV64I-NEXT:    addi sp, sp, 16
25964; RV64I-NEXT:    ret
25965;
25966; RV64IA-WMO-LABEL: atomicrmw_xor_i64_release:
25967; RV64IA-WMO:       # %bb.0:
25968; RV64IA-WMO-NEXT:    amoxor.d.rl a0, a1, (a0)
25969; RV64IA-WMO-NEXT:    ret
25970;
25971; RV64IA-TSO-LABEL: atomicrmw_xor_i64_release:
25972; RV64IA-TSO:       # %bb.0:
25973; RV64IA-TSO-NEXT:    amoxor.d a0, a1, (a0)
25974; RV64IA-TSO-NEXT:    ret
25975  %1 = atomicrmw xor ptr %a, i64 %b release
25976  ret i64 %1
25977}
25978
25979define i64 @atomicrmw_xor_i64_acq_rel(ptr %a, i64 %b) nounwind {
25980; RV32I-LABEL: atomicrmw_xor_i64_acq_rel:
25981; RV32I:       # %bb.0:
25982; RV32I-NEXT:    addi sp, sp, -16
25983; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25984; RV32I-NEXT:    li a3, 4
25985; RV32I-NEXT:    call __atomic_fetch_xor_8
25986; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25987; RV32I-NEXT:    addi sp, sp, 16
25988; RV32I-NEXT:    ret
25989;
25990; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel:
25991; RV32IA:       # %bb.0:
25992; RV32IA-NEXT:    addi sp, sp, -16
25993; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
25994; RV32IA-NEXT:    li a3, 4
25995; RV32IA-NEXT:    call __atomic_fetch_xor_8
25996; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25997; RV32IA-NEXT:    addi sp, sp, 16
25998; RV32IA-NEXT:    ret
25999;
26000; RV64I-LABEL: atomicrmw_xor_i64_acq_rel:
26001; RV64I:       # %bb.0:
26002; RV64I-NEXT:    addi sp, sp, -16
26003; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
26004; RV64I-NEXT:    li a2, 4
26005; RV64I-NEXT:    call __atomic_fetch_xor_8
26006; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
26007; RV64I-NEXT:    addi sp, sp, 16
26008; RV64I-NEXT:    ret
26009;
26010; RV64IA-WMO-LABEL: atomicrmw_xor_i64_acq_rel:
26011; RV64IA-WMO:       # %bb.0:
26012; RV64IA-WMO-NEXT:    amoxor.d.aqrl a0, a1, (a0)
26013; RV64IA-WMO-NEXT:    ret
26014;
26015; RV64IA-TSO-LABEL: atomicrmw_xor_i64_acq_rel:
26016; RV64IA-TSO:       # %bb.0:
26017; RV64IA-TSO-NEXT:    amoxor.d a0, a1, (a0)
26018; RV64IA-TSO-NEXT:    ret
26019  %1 = atomicrmw xor ptr %a, i64 %b acq_rel
26020  ret i64 %1
26021}
26022
26023define i64 @atomicrmw_xor_i64_seq_cst(ptr %a, i64 %b) nounwind {
26024; RV32I-LABEL: atomicrmw_xor_i64_seq_cst:
26025; RV32I:       # %bb.0:
26026; RV32I-NEXT:    addi sp, sp, -16
26027; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
26028; RV32I-NEXT:    li a3, 5
26029; RV32I-NEXT:    call __atomic_fetch_xor_8
26030; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
26031; RV32I-NEXT:    addi sp, sp, 16
26032; RV32I-NEXT:    ret
26033;
26034; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst:
26035; RV32IA:       # %bb.0:
26036; RV32IA-NEXT:    addi sp, sp, -16
26037; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
26038; RV32IA-NEXT:    li a3, 5
26039; RV32IA-NEXT:    call __atomic_fetch_xor_8
26040; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
26041; RV32IA-NEXT:    addi sp, sp, 16
26042; RV32IA-NEXT:    ret
26043;
26044; RV64I-LABEL: atomicrmw_xor_i64_seq_cst:
26045; RV64I:       # %bb.0:
26046; RV64I-NEXT:    addi sp, sp, -16
26047; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
26048; RV64I-NEXT:    li a2, 5
26049; RV64I-NEXT:    call __atomic_fetch_xor_8
26050; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
26051; RV64I-NEXT:    addi sp, sp, 16
26052; RV64I-NEXT:    ret
26053;
26054; RV64IA-WMO-LABEL: atomicrmw_xor_i64_seq_cst:
26055; RV64IA-WMO:       # %bb.0:
26056; RV64IA-WMO-NEXT:    amoxor.d.aqrl a0, a1, (a0)
26057; RV64IA-WMO-NEXT:    ret
26058;
26059; RV64IA-TSO-LABEL: atomicrmw_xor_i64_seq_cst:
26060; RV64IA-TSO:       # %bb.0:
26061; RV64IA-TSO-NEXT:    amoxor.d a0, a1, (a0)
26062; RV64IA-TSO-NEXT:    ret
26063  %1 = atomicrmw xor ptr %a, i64 %b seq_cst
26064  ret i64 %1
26065}
26066
26067define i64 @atomicrmw_max_i64_monotonic(ptr %a, i64 %b) nounwind {
26068; RV32I-LABEL: atomicrmw_max_i64_monotonic:
26069; RV32I:       # %bb.0:
26070; RV32I-NEXT:    addi sp, sp, -32
26071; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26072; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26073; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26074; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26075; RV32I-NEXT:    mv s0, a2
26076; RV32I-NEXT:    mv s1, a0
26077; RV32I-NEXT:    lw a4, 0(a0)
26078; RV32I-NEXT:    lw a5, 4(a0)
26079; RV32I-NEXT:    mv s2, a1
26080; RV32I-NEXT:    j .LBB220_2
26081; RV32I-NEXT:  .LBB220_1: # %atomicrmw.start
26082; RV32I-NEXT:    # in Loop: Header=BB220_2 Depth=1
26083; RV32I-NEXT:    sw a4, 8(sp)
26084; RV32I-NEXT:    sw a5, 12(sp)
26085; RV32I-NEXT:    addi a1, sp, 8
26086; RV32I-NEXT:    mv a0, s1
26087; RV32I-NEXT:    li a4, 0
26088; RV32I-NEXT:    li a5, 0
26089; RV32I-NEXT:    call __atomic_compare_exchange_8
26090; RV32I-NEXT:    lw a4, 8(sp)
26091; RV32I-NEXT:    lw a5, 12(sp)
26092; RV32I-NEXT:    bnez a0, .LBB220_7
26093; RV32I-NEXT:  .LBB220_2: # %atomicrmw.start
26094; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
26095; RV32I-NEXT:    beq a5, s0, .LBB220_4
26096; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
26097; RV32I-NEXT:    # in Loop: Header=BB220_2 Depth=1
26098; RV32I-NEXT:    slt a0, s0, a5
26099; RV32I-NEXT:    j .LBB220_5
26100; RV32I-NEXT:  .LBB220_4: # in Loop: Header=BB220_2 Depth=1
26101; RV32I-NEXT:    sltu a0, s2, a4
26102; RV32I-NEXT:  .LBB220_5: # %atomicrmw.start
26103; RV32I-NEXT:    # in Loop: Header=BB220_2 Depth=1
26104; RV32I-NEXT:    mv a2, a4
26105; RV32I-NEXT:    mv a3, a5
26106; RV32I-NEXT:    bnez a0, .LBB220_1
26107; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
26108; RV32I-NEXT:    # in Loop: Header=BB220_2 Depth=1
26109; RV32I-NEXT:    mv a2, s2
26110; RV32I-NEXT:    mv a3, s0
26111; RV32I-NEXT:    j .LBB220_1
26112; RV32I-NEXT:  .LBB220_7: # %atomicrmw.end
26113; RV32I-NEXT:    mv a0, a4
26114; RV32I-NEXT:    mv a1, a5
26115; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26116; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26117; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26118; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26119; RV32I-NEXT:    addi sp, sp, 32
26120; RV32I-NEXT:    ret
26121;
26122; RV32IA-LABEL: atomicrmw_max_i64_monotonic:
26123; RV32IA:       # %bb.0:
26124; RV32IA-NEXT:    addi sp, sp, -32
26125; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26126; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26127; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26128; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26129; RV32IA-NEXT:    mv s0, a2
26130; RV32IA-NEXT:    mv s1, a0
26131; RV32IA-NEXT:    lw a4, 0(a0)
26132; RV32IA-NEXT:    lw a5, 4(a0)
26133; RV32IA-NEXT:    mv s2, a1
26134; RV32IA-NEXT:    j .LBB220_2
26135; RV32IA-NEXT:  .LBB220_1: # %atomicrmw.start
26136; RV32IA-NEXT:    # in Loop: Header=BB220_2 Depth=1
26137; RV32IA-NEXT:    sw a4, 8(sp)
26138; RV32IA-NEXT:    sw a5, 12(sp)
26139; RV32IA-NEXT:    addi a1, sp, 8
26140; RV32IA-NEXT:    mv a0, s1
26141; RV32IA-NEXT:    li a4, 0
26142; RV32IA-NEXT:    li a5, 0
26143; RV32IA-NEXT:    call __atomic_compare_exchange_8
26144; RV32IA-NEXT:    lw a4, 8(sp)
26145; RV32IA-NEXT:    lw a5, 12(sp)
26146; RV32IA-NEXT:    bnez a0, .LBB220_7
26147; RV32IA-NEXT:  .LBB220_2: # %atomicrmw.start
26148; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
26149; RV32IA-NEXT:    beq a5, s0, .LBB220_4
26150; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
26151; RV32IA-NEXT:    # in Loop: Header=BB220_2 Depth=1
26152; RV32IA-NEXT:    slt a0, s0, a5
26153; RV32IA-NEXT:    j .LBB220_5
26154; RV32IA-NEXT:  .LBB220_4: # in Loop: Header=BB220_2 Depth=1
26155; RV32IA-NEXT:    sltu a0, s2, a4
26156; RV32IA-NEXT:  .LBB220_5: # %atomicrmw.start
26157; RV32IA-NEXT:    # in Loop: Header=BB220_2 Depth=1
26158; RV32IA-NEXT:    mv a2, a4
26159; RV32IA-NEXT:    mv a3, a5
26160; RV32IA-NEXT:    bnez a0, .LBB220_1
26161; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
26162; RV32IA-NEXT:    # in Loop: Header=BB220_2 Depth=1
26163; RV32IA-NEXT:    mv a2, s2
26164; RV32IA-NEXT:    mv a3, s0
26165; RV32IA-NEXT:    j .LBB220_1
26166; RV32IA-NEXT:  .LBB220_7: # %atomicrmw.end
26167; RV32IA-NEXT:    mv a0, a4
26168; RV32IA-NEXT:    mv a1, a5
26169; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26170; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26171; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26172; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26173; RV32IA-NEXT:    addi sp, sp, 32
26174; RV32IA-NEXT:    ret
26175;
26176; RV64I-LABEL: atomicrmw_max_i64_monotonic:
26177; RV64I:       # %bb.0:
26178; RV64I-NEXT:    addi sp, sp, -32
26179; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
26180; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
26181; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
26182; RV64I-NEXT:    mv s0, a0
26183; RV64I-NEXT:    ld a3, 0(a0)
26184; RV64I-NEXT:    mv s1, a1
26185; RV64I-NEXT:    j .LBB220_2
26186; RV64I-NEXT:  .LBB220_1: # %atomicrmw.start
26187; RV64I-NEXT:    # in Loop: Header=BB220_2 Depth=1
26188; RV64I-NEXT:    sd a3, 0(sp)
26189; RV64I-NEXT:    mv a1, sp
26190; RV64I-NEXT:    mv a0, s0
26191; RV64I-NEXT:    li a3, 0
26192; RV64I-NEXT:    li a4, 0
26193; RV64I-NEXT:    call __atomic_compare_exchange_8
26194; RV64I-NEXT:    ld a3, 0(sp)
26195; RV64I-NEXT:    bnez a0, .LBB220_4
26196; RV64I-NEXT:  .LBB220_2: # %atomicrmw.start
26197; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
26198; RV64I-NEXT:    mv a2, a3
26199; RV64I-NEXT:    blt s1, a3, .LBB220_1
26200; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
26201; RV64I-NEXT:    # in Loop: Header=BB220_2 Depth=1
26202; RV64I-NEXT:    mv a2, s1
26203; RV64I-NEXT:    j .LBB220_1
26204; RV64I-NEXT:  .LBB220_4: # %atomicrmw.end
26205; RV64I-NEXT:    mv a0, a3
26206; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
26207; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
26208; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
26209; RV64I-NEXT:    addi sp, sp, 32
26210; RV64I-NEXT:    ret
26211;
26212; RV64IA-LABEL: atomicrmw_max_i64_monotonic:
26213; RV64IA:       # %bb.0:
26214; RV64IA-NEXT:    amomax.d a0, a1, (a0)
26215; RV64IA-NEXT:    ret
26216  %1 = atomicrmw max ptr %a, i64 %b monotonic
26217  ret i64 %1
26218}
26219
26220define i64 @atomicrmw_max_i64_acquire(ptr %a, i64 %b) nounwind {
26221; RV32I-LABEL: atomicrmw_max_i64_acquire:
26222; RV32I:       # %bb.0:
26223; RV32I-NEXT:    addi sp, sp, -32
26224; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26225; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26226; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26227; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26228; RV32I-NEXT:    mv s0, a2
26229; RV32I-NEXT:    mv s1, a0
26230; RV32I-NEXT:    lw a4, 0(a0)
26231; RV32I-NEXT:    lw a5, 4(a0)
26232; RV32I-NEXT:    mv s2, a1
26233; RV32I-NEXT:    j .LBB221_2
26234; RV32I-NEXT:  .LBB221_1: # %atomicrmw.start
26235; RV32I-NEXT:    # in Loop: Header=BB221_2 Depth=1
26236; RV32I-NEXT:    sw a4, 8(sp)
26237; RV32I-NEXT:    sw a5, 12(sp)
26238; RV32I-NEXT:    addi a1, sp, 8
26239; RV32I-NEXT:    li a4, 2
26240; RV32I-NEXT:    li a5, 2
26241; RV32I-NEXT:    mv a0, s1
26242; RV32I-NEXT:    call __atomic_compare_exchange_8
26243; RV32I-NEXT:    lw a4, 8(sp)
26244; RV32I-NEXT:    lw a5, 12(sp)
26245; RV32I-NEXT:    bnez a0, .LBB221_7
26246; RV32I-NEXT:  .LBB221_2: # %atomicrmw.start
26247; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
26248; RV32I-NEXT:    beq a5, s0, .LBB221_4
26249; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
26250; RV32I-NEXT:    # in Loop: Header=BB221_2 Depth=1
26251; RV32I-NEXT:    slt a0, s0, a5
26252; RV32I-NEXT:    j .LBB221_5
26253; RV32I-NEXT:  .LBB221_4: # in Loop: Header=BB221_2 Depth=1
26254; RV32I-NEXT:    sltu a0, s2, a4
26255; RV32I-NEXT:  .LBB221_5: # %atomicrmw.start
26256; RV32I-NEXT:    # in Loop: Header=BB221_2 Depth=1
26257; RV32I-NEXT:    mv a2, a4
26258; RV32I-NEXT:    mv a3, a5
26259; RV32I-NEXT:    bnez a0, .LBB221_1
26260; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
26261; RV32I-NEXT:    # in Loop: Header=BB221_2 Depth=1
26262; RV32I-NEXT:    mv a2, s2
26263; RV32I-NEXT:    mv a3, s0
26264; RV32I-NEXT:    j .LBB221_1
26265; RV32I-NEXT:  .LBB221_7: # %atomicrmw.end
26266; RV32I-NEXT:    mv a0, a4
26267; RV32I-NEXT:    mv a1, a5
26268; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26269; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26270; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26271; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26272; RV32I-NEXT:    addi sp, sp, 32
26273; RV32I-NEXT:    ret
26274;
26275; RV32IA-LABEL: atomicrmw_max_i64_acquire:
26276; RV32IA:       # %bb.0:
26277; RV32IA-NEXT:    addi sp, sp, -32
26278; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26279; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26280; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26281; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26282; RV32IA-NEXT:    mv s0, a2
26283; RV32IA-NEXT:    mv s1, a0
26284; RV32IA-NEXT:    lw a4, 0(a0)
26285; RV32IA-NEXT:    lw a5, 4(a0)
26286; RV32IA-NEXT:    mv s2, a1
26287; RV32IA-NEXT:    j .LBB221_2
26288; RV32IA-NEXT:  .LBB221_1: # %atomicrmw.start
26289; RV32IA-NEXT:    # in Loop: Header=BB221_2 Depth=1
26290; RV32IA-NEXT:    sw a4, 8(sp)
26291; RV32IA-NEXT:    sw a5, 12(sp)
26292; RV32IA-NEXT:    addi a1, sp, 8
26293; RV32IA-NEXT:    li a4, 2
26294; RV32IA-NEXT:    li a5, 2
26295; RV32IA-NEXT:    mv a0, s1
26296; RV32IA-NEXT:    call __atomic_compare_exchange_8
26297; RV32IA-NEXT:    lw a4, 8(sp)
26298; RV32IA-NEXT:    lw a5, 12(sp)
26299; RV32IA-NEXT:    bnez a0, .LBB221_7
26300; RV32IA-NEXT:  .LBB221_2: # %atomicrmw.start
26301; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
26302; RV32IA-NEXT:    beq a5, s0, .LBB221_4
26303; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
26304; RV32IA-NEXT:    # in Loop: Header=BB221_2 Depth=1
26305; RV32IA-NEXT:    slt a0, s0, a5
26306; RV32IA-NEXT:    j .LBB221_5
26307; RV32IA-NEXT:  .LBB221_4: # in Loop: Header=BB221_2 Depth=1
26308; RV32IA-NEXT:    sltu a0, s2, a4
26309; RV32IA-NEXT:  .LBB221_5: # %atomicrmw.start
26310; RV32IA-NEXT:    # in Loop: Header=BB221_2 Depth=1
26311; RV32IA-NEXT:    mv a2, a4
26312; RV32IA-NEXT:    mv a3, a5
26313; RV32IA-NEXT:    bnez a0, .LBB221_1
26314; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
26315; RV32IA-NEXT:    # in Loop: Header=BB221_2 Depth=1
26316; RV32IA-NEXT:    mv a2, s2
26317; RV32IA-NEXT:    mv a3, s0
26318; RV32IA-NEXT:    j .LBB221_1
26319; RV32IA-NEXT:  .LBB221_7: # %atomicrmw.end
26320; RV32IA-NEXT:    mv a0, a4
26321; RV32IA-NEXT:    mv a1, a5
26322; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26323; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26324; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26325; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26326; RV32IA-NEXT:    addi sp, sp, 32
26327; RV32IA-NEXT:    ret
26328;
26329; RV64I-LABEL: atomicrmw_max_i64_acquire:
26330; RV64I:       # %bb.0:
26331; RV64I-NEXT:    addi sp, sp, -32
26332; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
26333; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
26334; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
26335; RV64I-NEXT:    mv s0, a0
26336; RV64I-NEXT:    ld a3, 0(a0)
26337; RV64I-NEXT:    mv s1, a1
26338; RV64I-NEXT:    j .LBB221_2
26339; RV64I-NEXT:  .LBB221_1: # %atomicrmw.start
26340; RV64I-NEXT:    # in Loop: Header=BB221_2 Depth=1
26341; RV64I-NEXT:    sd a3, 0(sp)
26342; RV64I-NEXT:    mv a1, sp
26343; RV64I-NEXT:    li a3, 2
26344; RV64I-NEXT:    li a4, 2
26345; RV64I-NEXT:    mv a0, s0
26346; RV64I-NEXT:    call __atomic_compare_exchange_8
26347; RV64I-NEXT:    ld a3, 0(sp)
26348; RV64I-NEXT:    bnez a0, .LBB221_4
26349; RV64I-NEXT:  .LBB221_2: # %atomicrmw.start
26350; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
26351; RV64I-NEXT:    mv a2, a3
26352; RV64I-NEXT:    blt s1, a3, .LBB221_1
26353; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
26354; RV64I-NEXT:    # in Loop: Header=BB221_2 Depth=1
26355; RV64I-NEXT:    mv a2, s1
26356; RV64I-NEXT:    j .LBB221_1
26357; RV64I-NEXT:  .LBB221_4: # %atomicrmw.end
26358; RV64I-NEXT:    mv a0, a3
26359; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
26360; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
26361; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
26362; RV64I-NEXT:    addi sp, sp, 32
26363; RV64I-NEXT:    ret
26364;
26365; RV64IA-WMO-LABEL: atomicrmw_max_i64_acquire:
26366; RV64IA-WMO:       # %bb.0:
26367; RV64IA-WMO-NEXT:    amomax.d.aq a0, a1, (a0)
26368; RV64IA-WMO-NEXT:    ret
26369;
26370; RV64IA-TSO-LABEL: atomicrmw_max_i64_acquire:
26371; RV64IA-TSO:       # %bb.0:
26372; RV64IA-TSO-NEXT:    amomax.d a0, a1, (a0)
26373; RV64IA-TSO-NEXT:    ret
26374  %1 = atomicrmw max ptr %a, i64 %b acquire
26375  ret i64 %1
26376}
26377
26378define i64 @atomicrmw_max_i64_release(ptr %a, i64 %b) nounwind {
26379; RV32I-LABEL: atomicrmw_max_i64_release:
26380; RV32I:       # %bb.0:
26381; RV32I-NEXT:    addi sp, sp, -32
26382; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26383; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26384; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26385; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26386; RV32I-NEXT:    mv s0, a2
26387; RV32I-NEXT:    mv s1, a0
26388; RV32I-NEXT:    lw a4, 0(a0)
26389; RV32I-NEXT:    lw a5, 4(a0)
26390; RV32I-NEXT:    mv s2, a1
26391; RV32I-NEXT:    j .LBB222_2
26392; RV32I-NEXT:  .LBB222_1: # %atomicrmw.start
26393; RV32I-NEXT:    # in Loop: Header=BB222_2 Depth=1
26394; RV32I-NEXT:    sw a4, 8(sp)
26395; RV32I-NEXT:    sw a5, 12(sp)
26396; RV32I-NEXT:    addi a1, sp, 8
26397; RV32I-NEXT:    li a4, 3
26398; RV32I-NEXT:    mv a0, s1
26399; RV32I-NEXT:    li a5, 0
26400; RV32I-NEXT:    call __atomic_compare_exchange_8
26401; RV32I-NEXT:    lw a4, 8(sp)
26402; RV32I-NEXT:    lw a5, 12(sp)
26403; RV32I-NEXT:    bnez a0, .LBB222_7
26404; RV32I-NEXT:  .LBB222_2: # %atomicrmw.start
26405; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
26406; RV32I-NEXT:    beq a5, s0, .LBB222_4
26407; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
26408; RV32I-NEXT:    # in Loop: Header=BB222_2 Depth=1
26409; RV32I-NEXT:    slt a0, s0, a5
26410; RV32I-NEXT:    j .LBB222_5
26411; RV32I-NEXT:  .LBB222_4: # in Loop: Header=BB222_2 Depth=1
26412; RV32I-NEXT:    sltu a0, s2, a4
26413; RV32I-NEXT:  .LBB222_5: # %atomicrmw.start
26414; RV32I-NEXT:    # in Loop: Header=BB222_2 Depth=1
26415; RV32I-NEXT:    mv a2, a4
26416; RV32I-NEXT:    mv a3, a5
26417; RV32I-NEXT:    bnez a0, .LBB222_1
26418; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
26419; RV32I-NEXT:    # in Loop: Header=BB222_2 Depth=1
26420; RV32I-NEXT:    mv a2, s2
26421; RV32I-NEXT:    mv a3, s0
26422; RV32I-NEXT:    j .LBB222_1
26423; RV32I-NEXT:  .LBB222_7: # %atomicrmw.end
26424; RV32I-NEXT:    mv a0, a4
26425; RV32I-NEXT:    mv a1, a5
26426; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26427; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26428; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26429; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26430; RV32I-NEXT:    addi sp, sp, 32
26431; RV32I-NEXT:    ret
26432;
26433; RV32IA-LABEL: atomicrmw_max_i64_release:
26434; RV32IA:       # %bb.0:
26435; RV32IA-NEXT:    addi sp, sp, -32
26436; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26437; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26438; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26439; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26440; RV32IA-NEXT:    mv s0, a2
26441; RV32IA-NEXT:    mv s1, a0
26442; RV32IA-NEXT:    lw a4, 0(a0)
26443; RV32IA-NEXT:    lw a5, 4(a0)
26444; RV32IA-NEXT:    mv s2, a1
26445; RV32IA-NEXT:    j .LBB222_2
26446; RV32IA-NEXT:  .LBB222_1: # %atomicrmw.start
26447; RV32IA-NEXT:    # in Loop: Header=BB222_2 Depth=1
26448; RV32IA-NEXT:    sw a4, 8(sp)
26449; RV32IA-NEXT:    sw a5, 12(sp)
26450; RV32IA-NEXT:    addi a1, sp, 8
26451; RV32IA-NEXT:    li a4, 3
26452; RV32IA-NEXT:    mv a0, s1
26453; RV32IA-NEXT:    li a5, 0
26454; RV32IA-NEXT:    call __atomic_compare_exchange_8
26455; RV32IA-NEXT:    lw a4, 8(sp)
26456; RV32IA-NEXT:    lw a5, 12(sp)
26457; RV32IA-NEXT:    bnez a0, .LBB222_7
26458; RV32IA-NEXT:  .LBB222_2: # %atomicrmw.start
26459; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
26460; RV32IA-NEXT:    beq a5, s0, .LBB222_4
26461; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
26462; RV32IA-NEXT:    # in Loop: Header=BB222_2 Depth=1
26463; RV32IA-NEXT:    slt a0, s0, a5
26464; RV32IA-NEXT:    j .LBB222_5
26465; RV32IA-NEXT:  .LBB222_4: # in Loop: Header=BB222_2 Depth=1
26466; RV32IA-NEXT:    sltu a0, s2, a4
26467; RV32IA-NEXT:  .LBB222_5: # %atomicrmw.start
26468; RV32IA-NEXT:    # in Loop: Header=BB222_2 Depth=1
26469; RV32IA-NEXT:    mv a2, a4
26470; RV32IA-NEXT:    mv a3, a5
26471; RV32IA-NEXT:    bnez a0, .LBB222_1
26472; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
26473; RV32IA-NEXT:    # in Loop: Header=BB222_2 Depth=1
26474; RV32IA-NEXT:    mv a2, s2
26475; RV32IA-NEXT:    mv a3, s0
26476; RV32IA-NEXT:    j .LBB222_1
26477; RV32IA-NEXT:  .LBB222_7: # %atomicrmw.end
26478; RV32IA-NEXT:    mv a0, a4
26479; RV32IA-NEXT:    mv a1, a5
26480; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26481; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26482; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26483; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26484; RV32IA-NEXT:    addi sp, sp, 32
26485; RV32IA-NEXT:    ret
26486;
26487; RV64I-LABEL: atomicrmw_max_i64_release:
26488; RV64I:       # %bb.0:
26489; RV64I-NEXT:    addi sp, sp, -32
26490; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
26491; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
26492; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
26493; RV64I-NEXT:    mv s0, a0
26494; RV64I-NEXT:    ld a3, 0(a0)
26495; RV64I-NEXT:    mv s1, a1
26496; RV64I-NEXT:    j .LBB222_2
26497; RV64I-NEXT:  .LBB222_1: # %atomicrmw.start
26498; RV64I-NEXT:    # in Loop: Header=BB222_2 Depth=1
26499; RV64I-NEXT:    sd a3, 0(sp)
26500; RV64I-NEXT:    mv a1, sp
26501; RV64I-NEXT:    li a3, 3
26502; RV64I-NEXT:    mv a0, s0
26503; RV64I-NEXT:    li a4, 0
26504; RV64I-NEXT:    call __atomic_compare_exchange_8
26505; RV64I-NEXT:    ld a3, 0(sp)
26506; RV64I-NEXT:    bnez a0, .LBB222_4
26507; RV64I-NEXT:  .LBB222_2: # %atomicrmw.start
26508; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
26509; RV64I-NEXT:    mv a2, a3
26510; RV64I-NEXT:    blt s1, a3, .LBB222_1
26511; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
26512; RV64I-NEXT:    # in Loop: Header=BB222_2 Depth=1
26513; RV64I-NEXT:    mv a2, s1
26514; RV64I-NEXT:    j .LBB222_1
26515; RV64I-NEXT:  .LBB222_4: # %atomicrmw.end
26516; RV64I-NEXT:    mv a0, a3
26517; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
26518; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
26519; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
26520; RV64I-NEXT:    addi sp, sp, 32
26521; RV64I-NEXT:    ret
26522;
26523; RV64IA-WMO-LABEL: atomicrmw_max_i64_release:
26524; RV64IA-WMO:       # %bb.0:
26525; RV64IA-WMO-NEXT:    amomax.d.rl a0, a1, (a0)
26526; RV64IA-WMO-NEXT:    ret
26527;
26528; RV64IA-TSO-LABEL: atomicrmw_max_i64_release:
26529; RV64IA-TSO:       # %bb.0:
26530; RV64IA-TSO-NEXT:    amomax.d a0, a1, (a0)
26531; RV64IA-TSO-NEXT:    ret
26532  %1 = atomicrmw max ptr %a, i64 %b release
26533  ret i64 %1
26534}
26535
26536define i64 @atomicrmw_max_i64_acq_rel(ptr %a, i64 %b) nounwind {
26537; RV32I-LABEL: atomicrmw_max_i64_acq_rel:
26538; RV32I:       # %bb.0:
26539; RV32I-NEXT:    addi sp, sp, -32
26540; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26541; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26542; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26543; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26544; RV32I-NEXT:    mv s0, a2
26545; RV32I-NEXT:    mv s1, a0
26546; RV32I-NEXT:    lw a4, 0(a0)
26547; RV32I-NEXT:    lw a5, 4(a0)
26548; RV32I-NEXT:    mv s2, a1
26549; RV32I-NEXT:    j .LBB223_2
26550; RV32I-NEXT:  .LBB223_1: # %atomicrmw.start
26551; RV32I-NEXT:    # in Loop: Header=BB223_2 Depth=1
26552; RV32I-NEXT:    sw a4, 8(sp)
26553; RV32I-NEXT:    sw a5, 12(sp)
26554; RV32I-NEXT:    addi a1, sp, 8
26555; RV32I-NEXT:    li a4, 4
26556; RV32I-NEXT:    li a5, 2
26557; RV32I-NEXT:    mv a0, s1
26558; RV32I-NEXT:    call __atomic_compare_exchange_8
26559; RV32I-NEXT:    lw a4, 8(sp)
26560; RV32I-NEXT:    lw a5, 12(sp)
26561; RV32I-NEXT:    bnez a0, .LBB223_7
26562; RV32I-NEXT:  .LBB223_2: # %atomicrmw.start
26563; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
26564; RV32I-NEXT:    beq a5, s0, .LBB223_4
26565; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
26566; RV32I-NEXT:    # in Loop: Header=BB223_2 Depth=1
26567; RV32I-NEXT:    slt a0, s0, a5
26568; RV32I-NEXT:    j .LBB223_5
26569; RV32I-NEXT:  .LBB223_4: # in Loop: Header=BB223_2 Depth=1
26570; RV32I-NEXT:    sltu a0, s2, a4
26571; RV32I-NEXT:  .LBB223_5: # %atomicrmw.start
26572; RV32I-NEXT:    # in Loop: Header=BB223_2 Depth=1
26573; RV32I-NEXT:    mv a2, a4
26574; RV32I-NEXT:    mv a3, a5
26575; RV32I-NEXT:    bnez a0, .LBB223_1
26576; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
26577; RV32I-NEXT:    # in Loop: Header=BB223_2 Depth=1
26578; RV32I-NEXT:    mv a2, s2
26579; RV32I-NEXT:    mv a3, s0
26580; RV32I-NEXT:    j .LBB223_1
26581; RV32I-NEXT:  .LBB223_7: # %atomicrmw.end
26582; RV32I-NEXT:    mv a0, a4
26583; RV32I-NEXT:    mv a1, a5
26584; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26585; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26586; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26587; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26588; RV32I-NEXT:    addi sp, sp, 32
26589; RV32I-NEXT:    ret
26590;
26591; RV32IA-LABEL: atomicrmw_max_i64_acq_rel:
26592; RV32IA:       # %bb.0:
26593; RV32IA-NEXT:    addi sp, sp, -32
26594; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26595; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26596; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26597; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26598; RV32IA-NEXT:    mv s0, a2
26599; RV32IA-NEXT:    mv s1, a0
26600; RV32IA-NEXT:    lw a4, 0(a0)
26601; RV32IA-NEXT:    lw a5, 4(a0)
26602; RV32IA-NEXT:    mv s2, a1
26603; RV32IA-NEXT:    j .LBB223_2
26604; RV32IA-NEXT:  .LBB223_1: # %atomicrmw.start
26605; RV32IA-NEXT:    # in Loop: Header=BB223_2 Depth=1
26606; RV32IA-NEXT:    sw a4, 8(sp)
26607; RV32IA-NEXT:    sw a5, 12(sp)
26608; RV32IA-NEXT:    addi a1, sp, 8
26609; RV32IA-NEXT:    li a4, 4
26610; RV32IA-NEXT:    li a5, 2
26611; RV32IA-NEXT:    mv a0, s1
26612; RV32IA-NEXT:    call __atomic_compare_exchange_8
26613; RV32IA-NEXT:    lw a4, 8(sp)
26614; RV32IA-NEXT:    lw a5, 12(sp)
26615; RV32IA-NEXT:    bnez a0, .LBB223_7
26616; RV32IA-NEXT:  .LBB223_2: # %atomicrmw.start
26617; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
26618; RV32IA-NEXT:    beq a5, s0, .LBB223_4
26619; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
26620; RV32IA-NEXT:    # in Loop: Header=BB223_2 Depth=1
26621; RV32IA-NEXT:    slt a0, s0, a5
26622; RV32IA-NEXT:    j .LBB223_5
26623; RV32IA-NEXT:  .LBB223_4: # in Loop: Header=BB223_2 Depth=1
26624; RV32IA-NEXT:    sltu a0, s2, a4
26625; RV32IA-NEXT:  .LBB223_5: # %atomicrmw.start
26626; RV32IA-NEXT:    # in Loop: Header=BB223_2 Depth=1
26627; RV32IA-NEXT:    mv a2, a4
26628; RV32IA-NEXT:    mv a3, a5
26629; RV32IA-NEXT:    bnez a0, .LBB223_1
26630; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
26631; RV32IA-NEXT:    # in Loop: Header=BB223_2 Depth=1
26632; RV32IA-NEXT:    mv a2, s2
26633; RV32IA-NEXT:    mv a3, s0
26634; RV32IA-NEXT:    j .LBB223_1
26635; RV32IA-NEXT:  .LBB223_7: # %atomicrmw.end
26636; RV32IA-NEXT:    mv a0, a4
26637; RV32IA-NEXT:    mv a1, a5
26638; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26639; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26640; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26641; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26642; RV32IA-NEXT:    addi sp, sp, 32
26643; RV32IA-NEXT:    ret
26644;
26645; RV64I-LABEL: atomicrmw_max_i64_acq_rel:
26646; RV64I:       # %bb.0:
26647; RV64I-NEXT:    addi sp, sp, -32
26648; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
26649; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
26650; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
26651; RV64I-NEXT:    mv s0, a0
26652; RV64I-NEXT:    ld a3, 0(a0)
26653; RV64I-NEXT:    mv s1, a1
26654; RV64I-NEXT:    j .LBB223_2
26655; RV64I-NEXT:  .LBB223_1: # %atomicrmw.start
26656; RV64I-NEXT:    # in Loop: Header=BB223_2 Depth=1
26657; RV64I-NEXT:    sd a3, 0(sp)
26658; RV64I-NEXT:    mv a1, sp
26659; RV64I-NEXT:    li a3, 4
26660; RV64I-NEXT:    li a4, 2
26661; RV64I-NEXT:    mv a0, s0
26662; RV64I-NEXT:    call __atomic_compare_exchange_8
26663; RV64I-NEXT:    ld a3, 0(sp)
26664; RV64I-NEXT:    bnez a0, .LBB223_4
26665; RV64I-NEXT:  .LBB223_2: # %atomicrmw.start
26666; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
26667; RV64I-NEXT:    mv a2, a3
26668; RV64I-NEXT:    blt s1, a3, .LBB223_1
26669; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
26670; RV64I-NEXT:    # in Loop: Header=BB223_2 Depth=1
26671; RV64I-NEXT:    mv a2, s1
26672; RV64I-NEXT:    j .LBB223_1
26673; RV64I-NEXT:  .LBB223_4: # %atomicrmw.end
26674; RV64I-NEXT:    mv a0, a3
26675; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
26676; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
26677; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
26678; RV64I-NEXT:    addi sp, sp, 32
26679; RV64I-NEXT:    ret
26680;
26681; RV64IA-WMO-LABEL: atomicrmw_max_i64_acq_rel:
26682; RV64IA-WMO:       # %bb.0:
26683; RV64IA-WMO-NEXT:    amomax.d.aqrl a0, a1, (a0)
26684; RV64IA-WMO-NEXT:    ret
26685;
26686; RV64IA-TSO-LABEL: atomicrmw_max_i64_acq_rel:
26687; RV64IA-TSO:       # %bb.0:
26688; RV64IA-TSO-NEXT:    amomax.d a0, a1, (a0)
26689; RV64IA-TSO-NEXT:    ret
26690  %1 = atomicrmw max ptr %a, i64 %b acq_rel
26691  ret i64 %1
26692}
26693
26694define i64 @atomicrmw_max_i64_seq_cst(ptr %a, i64 %b) nounwind {
26695; RV32I-LABEL: atomicrmw_max_i64_seq_cst:
26696; RV32I:       # %bb.0:
26697; RV32I-NEXT:    addi sp, sp, -32
26698; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26699; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26700; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26701; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26702; RV32I-NEXT:    mv s0, a2
26703; RV32I-NEXT:    mv s1, a0
26704; RV32I-NEXT:    lw a4, 0(a0)
26705; RV32I-NEXT:    lw a5, 4(a0)
26706; RV32I-NEXT:    mv s2, a1
26707; RV32I-NEXT:    j .LBB224_2
26708; RV32I-NEXT:  .LBB224_1: # %atomicrmw.start
26709; RV32I-NEXT:    # in Loop: Header=BB224_2 Depth=1
26710; RV32I-NEXT:    sw a4, 8(sp)
26711; RV32I-NEXT:    sw a5, 12(sp)
26712; RV32I-NEXT:    addi a1, sp, 8
26713; RV32I-NEXT:    li a4, 5
26714; RV32I-NEXT:    li a5, 5
26715; RV32I-NEXT:    mv a0, s1
26716; RV32I-NEXT:    call __atomic_compare_exchange_8
26717; RV32I-NEXT:    lw a4, 8(sp)
26718; RV32I-NEXT:    lw a5, 12(sp)
26719; RV32I-NEXT:    bnez a0, .LBB224_7
26720; RV32I-NEXT:  .LBB224_2: # %atomicrmw.start
26721; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
26722; RV32I-NEXT:    beq a5, s0, .LBB224_4
26723; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
26724; RV32I-NEXT:    # in Loop: Header=BB224_2 Depth=1
26725; RV32I-NEXT:    slt a0, s0, a5
26726; RV32I-NEXT:    j .LBB224_5
26727; RV32I-NEXT:  .LBB224_4: # in Loop: Header=BB224_2 Depth=1
26728; RV32I-NEXT:    sltu a0, s2, a4
26729; RV32I-NEXT:  .LBB224_5: # %atomicrmw.start
26730; RV32I-NEXT:    # in Loop: Header=BB224_2 Depth=1
26731; RV32I-NEXT:    mv a2, a4
26732; RV32I-NEXT:    mv a3, a5
26733; RV32I-NEXT:    bnez a0, .LBB224_1
26734; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
26735; RV32I-NEXT:    # in Loop: Header=BB224_2 Depth=1
26736; RV32I-NEXT:    mv a2, s2
26737; RV32I-NEXT:    mv a3, s0
26738; RV32I-NEXT:    j .LBB224_1
26739; RV32I-NEXT:  .LBB224_7: # %atomicrmw.end
26740; RV32I-NEXT:    mv a0, a4
26741; RV32I-NEXT:    mv a1, a5
26742; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26743; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26744; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26745; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26746; RV32I-NEXT:    addi sp, sp, 32
26747; RV32I-NEXT:    ret
26748;
26749; RV32IA-LABEL: atomicrmw_max_i64_seq_cst:
26750; RV32IA:       # %bb.0:
26751; RV32IA-NEXT:    addi sp, sp, -32
26752; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26753; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26754; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26755; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26756; RV32IA-NEXT:    mv s0, a2
26757; RV32IA-NEXT:    mv s1, a0
26758; RV32IA-NEXT:    lw a4, 0(a0)
26759; RV32IA-NEXT:    lw a5, 4(a0)
26760; RV32IA-NEXT:    mv s2, a1
26761; RV32IA-NEXT:    j .LBB224_2
26762; RV32IA-NEXT:  .LBB224_1: # %atomicrmw.start
26763; RV32IA-NEXT:    # in Loop: Header=BB224_2 Depth=1
26764; RV32IA-NEXT:    sw a4, 8(sp)
26765; RV32IA-NEXT:    sw a5, 12(sp)
26766; RV32IA-NEXT:    addi a1, sp, 8
26767; RV32IA-NEXT:    li a4, 5
26768; RV32IA-NEXT:    li a5, 5
26769; RV32IA-NEXT:    mv a0, s1
26770; RV32IA-NEXT:    call __atomic_compare_exchange_8
26771; RV32IA-NEXT:    lw a4, 8(sp)
26772; RV32IA-NEXT:    lw a5, 12(sp)
26773; RV32IA-NEXT:    bnez a0, .LBB224_7
26774; RV32IA-NEXT:  .LBB224_2: # %atomicrmw.start
26775; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
26776; RV32IA-NEXT:    beq a5, s0, .LBB224_4
26777; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
26778; RV32IA-NEXT:    # in Loop: Header=BB224_2 Depth=1
26779; RV32IA-NEXT:    slt a0, s0, a5
26780; RV32IA-NEXT:    j .LBB224_5
26781; RV32IA-NEXT:  .LBB224_4: # in Loop: Header=BB224_2 Depth=1
26782; RV32IA-NEXT:    sltu a0, s2, a4
26783; RV32IA-NEXT:  .LBB224_5: # %atomicrmw.start
26784; RV32IA-NEXT:    # in Loop: Header=BB224_2 Depth=1
26785; RV32IA-NEXT:    mv a2, a4
26786; RV32IA-NEXT:    mv a3, a5
26787; RV32IA-NEXT:    bnez a0, .LBB224_1
26788; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
26789; RV32IA-NEXT:    # in Loop: Header=BB224_2 Depth=1
26790; RV32IA-NEXT:    mv a2, s2
26791; RV32IA-NEXT:    mv a3, s0
26792; RV32IA-NEXT:    j .LBB224_1
26793; RV32IA-NEXT:  .LBB224_7: # %atomicrmw.end
26794; RV32IA-NEXT:    mv a0, a4
26795; RV32IA-NEXT:    mv a1, a5
26796; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26797; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26798; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26799; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26800; RV32IA-NEXT:    addi sp, sp, 32
26801; RV32IA-NEXT:    ret
26802;
26803; RV64I-LABEL: atomicrmw_max_i64_seq_cst:
26804; RV64I:       # %bb.0:
26805; RV64I-NEXT:    addi sp, sp, -32
26806; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
26807; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
26808; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
26809; RV64I-NEXT:    mv s0, a0
26810; RV64I-NEXT:    ld a3, 0(a0)
26811; RV64I-NEXT:    mv s1, a1
26812; RV64I-NEXT:    j .LBB224_2
26813; RV64I-NEXT:  .LBB224_1: # %atomicrmw.start
26814; RV64I-NEXT:    # in Loop: Header=BB224_2 Depth=1
26815; RV64I-NEXT:    sd a3, 0(sp)
26816; RV64I-NEXT:    mv a1, sp
26817; RV64I-NEXT:    li a3, 5
26818; RV64I-NEXT:    li a4, 5
26819; RV64I-NEXT:    mv a0, s0
26820; RV64I-NEXT:    call __atomic_compare_exchange_8
26821; RV64I-NEXT:    ld a3, 0(sp)
26822; RV64I-NEXT:    bnez a0, .LBB224_4
26823; RV64I-NEXT:  .LBB224_2: # %atomicrmw.start
26824; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
26825; RV64I-NEXT:    mv a2, a3
26826; RV64I-NEXT:    blt s1, a3, .LBB224_1
26827; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
26828; RV64I-NEXT:    # in Loop: Header=BB224_2 Depth=1
26829; RV64I-NEXT:    mv a2, s1
26830; RV64I-NEXT:    j .LBB224_1
26831; RV64I-NEXT:  .LBB224_4: # %atomicrmw.end
26832; RV64I-NEXT:    mv a0, a3
26833; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
26834; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
26835; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
26836; RV64I-NEXT:    addi sp, sp, 32
26837; RV64I-NEXT:    ret
26838;
26839; RV64IA-WMO-LABEL: atomicrmw_max_i64_seq_cst:
26840; RV64IA-WMO:       # %bb.0:
26841; RV64IA-WMO-NEXT:    amomax.d.aqrl a0, a1, (a0)
26842; RV64IA-WMO-NEXT:    ret
26843;
26844; RV64IA-TSO-LABEL: atomicrmw_max_i64_seq_cst:
26845; RV64IA-TSO:       # %bb.0:
26846; RV64IA-TSO-NEXT:    amomax.d a0, a1, (a0)
26847; RV64IA-TSO-NEXT:    ret
26848  %1 = atomicrmw max ptr %a, i64 %b seq_cst
26849  ret i64 %1
26850}
26851
26852define i64 @atomicrmw_min_i64_monotonic(ptr %a, i64 %b) nounwind {
26853; RV32I-LABEL: atomicrmw_min_i64_monotonic:
26854; RV32I:       # %bb.0:
26855; RV32I-NEXT:    addi sp, sp, -32
26856; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26857; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26858; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26859; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26860; RV32I-NEXT:    mv s0, a2
26861; RV32I-NEXT:    mv s1, a0
26862; RV32I-NEXT:    lw a4, 0(a0)
26863; RV32I-NEXT:    lw a5, 4(a0)
26864; RV32I-NEXT:    mv s2, a1
26865; RV32I-NEXT:    j .LBB225_2
26866; RV32I-NEXT:  .LBB225_1: # %atomicrmw.start
26867; RV32I-NEXT:    # in Loop: Header=BB225_2 Depth=1
26868; RV32I-NEXT:    sw a4, 8(sp)
26869; RV32I-NEXT:    sw a5, 12(sp)
26870; RV32I-NEXT:    addi a1, sp, 8
26871; RV32I-NEXT:    mv a0, s1
26872; RV32I-NEXT:    li a4, 0
26873; RV32I-NEXT:    li a5, 0
26874; RV32I-NEXT:    call __atomic_compare_exchange_8
26875; RV32I-NEXT:    lw a4, 8(sp)
26876; RV32I-NEXT:    lw a5, 12(sp)
26877; RV32I-NEXT:    bnez a0, .LBB225_7
26878; RV32I-NEXT:  .LBB225_2: # %atomicrmw.start
26879; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
26880; RV32I-NEXT:    beq a5, s0, .LBB225_4
26881; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
26882; RV32I-NEXT:    # in Loop: Header=BB225_2 Depth=1
26883; RV32I-NEXT:    slt a0, s0, a5
26884; RV32I-NEXT:    j .LBB225_5
26885; RV32I-NEXT:  .LBB225_4: # in Loop: Header=BB225_2 Depth=1
26886; RV32I-NEXT:    sltu a0, s2, a4
26887; RV32I-NEXT:  .LBB225_5: # %atomicrmw.start
26888; RV32I-NEXT:    # in Loop: Header=BB225_2 Depth=1
26889; RV32I-NEXT:    mv a2, a4
26890; RV32I-NEXT:    mv a3, a5
26891; RV32I-NEXT:    beqz a0, .LBB225_1
26892; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
26893; RV32I-NEXT:    # in Loop: Header=BB225_2 Depth=1
26894; RV32I-NEXT:    mv a2, s2
26895; RV32I-NEXT:    mv a3, s0
26896; RV32I-NEXT:    j .LBB225_1
26897; RV32I-NEXT:  .LBB225_7: # %atomicrmw.end
26898; RV32I-NEXT:    mv a0, a4
26899; RV32I-NEXT:    mv a1, a5
26900; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26901; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26902; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26903; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26904; RV32I-NEXT:    addi sp, sp, 32
26905; RV32I-NEXT:    ret
26906;
26907; RV32IA-LABEL: atomicrmw_min_i64_monotonic:
26908; RV32IA:       # %bb.0:
26909; RV32IA-NEXT:    addi sp, sp, -32
26910; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
26911; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
26912; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
26913; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
26914; RV32IA-NEXT:    mv s0, a2
26915; RV32IA-NEXT:    mv s1, a0
26916; RV32IA-NEXT:    lw a4, 0(a0)
26917; RV32IA-NEXT:    lw a5, 4(a0)
26918; RV32IA-NEXT:    mv s2, a1
26919; RV32IA-NEXT:    j .LBB225_2
26920; RV32IA-NEXT:  .LBB225_1: # %atomicrmw.start
26921; RV32IA-NEXT:    # in Loop: Header=BB225_2 Depth=1
26922; RV32IA-NEXT:    sw a4, 8(sp)
26923; RV32IA-NEXT:    sw a5, 12(sp)
26924; RV32IA-NEXT:    addi a1, sp, 8
26925; RV32IA-NEXT:    mv a0, s1
26926; RV32IA-NEXT:    li a4, 0
26927; RV32IA-NEXT:    li a5, 0
26928; RV32IA-NEXT:    call __atomic_compare_exchange_8
26929; RV32IA-NEXT:    lw a4, 8(sp)
26930; RV32IA-NEXT:    lw a5, 12(sp)
26931; RV32IA-NEXT:    bnez a0, .LBB225_7
26932; RV32IA-NEXT:  .LBB225_2: # %atomicrmw.start
26933; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
26934; RV32IA-NEXT:    beq a5, s0, .LBB225_4
26935; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
26936; RV32IA-NEXT:    # in Loop: Header=BB225_2 Depth=1
26937; RV32IA-NEXT:    slt a0, s0, a5
26938; RV32IA-NEXT:    j .LBB225_5
26939; RV32IA-NEXT:  .LBB225_4: # in Loop: Header=BB225_2 Depth=1
26940; RV32IA-NEXT:    sltu a0, s2, a4
26941; RV32IA-NEXT:  .LBB225_5: # %atomicrmw.start
26942; RV32IA-NEXT:    # in Loop: Header=BB225_2 Depth=1
26943; RV32IA-NEXT:    mv a2, a4
26944; RV32IA-NEXT:    mv a3, a5
26945; RV32IA-NEXT:    beqz a0, .LBB225_1
26946; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
26947; RV32IA-NEXT:    # in Loop: Header=BB225_2 Depth=1
26948; RV32IA-NEXT:    mv a2, s2
26949; RV32IA-NEXT:    mv a3, s0
26950; RV32IA-NEXT:    j .LBB225_1
26951; RV32IA-NEXT:  .LBB225_7: # %atomicrmw.end
26952; RV32IA-NEXT:    mv a0, a4
26953; RV32IA-NEXT:    mv a1, a5
26954; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
26955; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
26956; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
26957; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
26958; RV32IA-NEXT:    addi sp, sp, 32
26959; RV32IA-NEXT:    ret
26960;
26961; RV64I-LABEL: atomicrmw_min_i64_monotonic:
26962; RV64I:       # %bb.0:
26963; RV64I-NEXT:    addi sp, sp, -32
26964; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
26965; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
26966; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
26967; RV64I-NEXT:    mv s0, a0
26968; RV64I-NEXT:    ld a3, 0(a0)
26969; RV64I-NEXT:    mv s1, a1
26970; RV64I-NEXT:    j .LBB225_2
26971; RV64I-NEXT:  .LBB225_1: # %atomicrmw.start
26972; RV64I-NEXT:    # in Loop: Header=BB225_2 Depth=1
26973; RV64I-NEXT:    sd a3, 0(sp)
26974; RV64I-NEXT:    mv a1, sp
26975; RV64I-NEXT:    mv a0, s0
26976; RV64I-NEXT:    li a3, 0
26977; RV64I-NEXT:    li a4, 0
26978; RV64I-NEXT:    call __atomic_compare_exchange_8
26979; RV64I-NEXT:    ld a3, 0(sp)
26980; RV64I-NEXT:    bnez a0, .LBB225_4
26981; RV64I-NEXT:  .LBB225_2: # %atomicrmw.start
26982; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
26983; RV64I-NEXT:    mv a2, a3
26984; RV64I-NEXT:    bge s1, a3, .LBB225_1
26985; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
26986; RV64I-NEXT:    # in Loop: Header=BB225_2 Depth=1
26987; RV64I-NEXT:    mv a2, s1
26988; RV64I-NEXT:    j .LBB225_1
26989; RV64I-NEXT:  .LBB225_4: # %atomicrmw.end
26990; RV64I-NEXT:    mv a0, a3
26991; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
26992; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
26993; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
26994; RV64I-NEXT:    addi sp, sp, 32
26995; RV64I-NEXT:    ret
26996;
26997; RV64IA-LABEL: atomicrmw_min_i64_monotonic:
26998; RV64IA:       # %bb.0:
26999; RV64IA-NEXT:    amomin.d a0, a1, (a0)
27000; RV64IA-NEXT:    ret
27001  %1 = atomicrmw min ptr %a, i64 %b monotonic
27002  ret i64 %1
27003}
27004
27005define i64 @atomicrmw_min_i64_acquire(ptr %a, i64 %b) nounwind {
27006; RV32I-LABEL: atomicrmw_min_i64_acquire:
27007; RV32I:       # %bb.0:
27008; RV32I-NEXT:    addi sp, sp, -32
27009; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27010; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27011; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27012; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27013; RV32I-NEXT:    mv s0, a2
27014; RV32I-NEXT:    mv s1, a0
27015; RV32I-NEXT:    lw a4, 0(a0)
27016; RV32I-NEXT:    lw a5, 4(a0)
27017; RV32I-NEXT:    mv s2, a1
27018; RV32I-NEXT:    j .LBB226_2
27019; RV32I-NEXT:  .LBB226_1: # %atomicrmw.start
27020; RV32I-NEXT:    # in Loop: Header=BB226_2 Depth=1
27021; RV32I-NEXT:    sw a4, 8(sp)
27022; RV32I-NEXT:    sw a5, 12(sp)
27023; RV32I-NEXT:    addi a1, sp, 8
27024; RV32I-NEXT:    li a4, 2
27025; RV32I-NEXT:    li a5, 2
27026; RV32I-NEXT:    mv a0, s1
27027; RV32I-NEXT:    call __atomic_compare_exchange_8
27028; RV32I-NEXT:    lw a4, 8(sp)
27029; RV32I-NEXT:    lw a5, 12(sp)
27030; RV32I-NEXT:    bnez a0, .LBB226_7
27031; RV32I-NEXT:  .LBB226_2: # %atomicrmw.start
27032; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
27033; RV32I-NEXT:    beq a5, s0, .LBB226_4
27034; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
27035; RV32I-NEXT:    # in Loop: Header=BB226_2 Depth=1
27036; RV32I-NEXT:    slt a0, s0, a5
27037; RV32I-NEXT:    j .LBB226_5
27038; RV32I-NEXT:  .LBB226_4: # in Loop: Header=BB226_2 Depth=1
27039; RV32I-NEXT:    sltu a0, s2, a4
27040; RV32I-NEXT:  .LBB226_5: # %atomicrmw.start
27041; RV32I-NEXT:    # in Loop: Header=BB226_2 Depth=1
27042; RV32I-NEXT:    mv a2, a4
27043; RV32I-NEXT:    mv a3, a5
27044; RV32I-NEXT:    beqz a0, .LBB226_1
27045; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
27046; RV32I-NEXT:    # in Loop: Header=BB226_2 Depth=1
27047; RV32I-NEXT:    mv a2, s2
27048; RV32I-NEXT:    mv a3, s0
27049; RV32I-NEXT:    j .LBB226_1
27050; RV32I-NEXT:  .LBB226_7: # %atomicrmw.end
27051; RV32I-NEXT:    mv a0, a4
27052; RV32I-NEXT:    mv a1, a5
27053; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27054; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27055; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27056; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27057; RV32I-NEXT:    addi sp, sp, 32
27058; RV32I-NEXT:    ret
27059;
27060; RV32IA-LABEL: atomicrmw_min_i64_acquire:
27061; RV32IA:       # %bb.0:
27062; RV32IA-NEXT:    addi sp, sp, -32
27063; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27064; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27065; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27066; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27067; RV32IA-NEXT:    mv s0, a2
27068; RV32IA-NEXT:    mv s1, a0
27069; RV32IA-NEXT:    lw a4, 0(a0)
27070; RV32IA-NEXT:    lw a5, 4(a0)
27071; RV32IA-NEXT:    mv s2, a1
27072; RV32IA-NEXT:    j .LBB226_2
27073; RV32IA-NEXT:  .LBB226_1: # %atomicrmw.start
27074; RV32IA-NEXT:    # in Loop: Header=BB226_2 Depth=1
27075; RV32IA-NEXT:    sw a4, 8(sp)
27076; RV32IA-NEXT:    sw a5, 12(sp)
27077; RV32IA-NEXT:    addi a1, sp, 8
27078; RV32IA-NEXT:    li a4, 2
27079; RV32IA-NEXT:    li a5, 2
27080; RV32IA-NEXT:    mv a0, s1
27081; RV32IA-NEXT:    call __atomic_compare_exchange_8
27082; RV32IA-NEXT:    lw a4, 8(sp)
27083; RV32IA-NEXT:    lw a5, 12(sp)
27084; RV32IA-NEXT:    bnez a0, .LBB226_7
27085; RV32IA-NEXT:  .LBB226_2: # %atomicrmw.start
27086; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
27087; RV32IA-NEXT:    beq a5, s0, .LBB226_4
27088; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
27089; RV32IA-NEXT:    # in Loop: Header=BB226_2 Depth=1
27090; RV32IA-NEXT:    slt a0, s0, a5
27091; RV32IA-NEXT:    j .LBB226_5
27092; RV32IA-NEXT:  .LBB226_4: # in Loop: Header=BB226_2 Depth=1
27093; RV32IA-NEXT:    sltu a0, s2, a4
27094; RV32IA-NEXT:  .LBB226_5: # %atomicrmw.start
27095; RV32IA-NEXT:    # in Loop: Header=BB226_2 Depth=1
27096; RV32IA-NEXT:    mv a2, a4
27097; RV32IA-NEXT:    mv a3, a5
27098; RV32IA-NEXT:    beqz a0, .LBB226_1
27099; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
27100; RV32IA-NEXT:    # in Loop: Header=BB226_2 Depth=1
27101; RV32IA-NEXT:    mv a2, s2
27102; RV32IA-NEXT:    mv a3, s0
27103; RV32IA-NEXT:    j .LBB226_1
27104; RV32IA-NEXT:  .LBB226_7: # %atomicrmw.end
27105; RV32IA-NEXT:    mv a0, a4
27106; RV32IA-NEXT:    mv a1, a5
27107; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27108; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27109; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27110; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27111; RV32IA-NEXT:    addi sp, sp, 32
27112; RV32IA-NEXT:    ret
27113;
27114; RV64I-LABEL: atomicrmw_min_i64_acquire:
27115; RV64I:       # %bb.0:
27116; RV64I-NEXT:    addi sp, sp, -32
27117; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
27118; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
27119; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
27120; RV64I-NEXT:    mv s0, a0
27121; RV64I-NEXT:    ld a3, 0(a0)
27122; RV64I-NEXT:    mv s1, a1
27123; RV64I-NEXT:    j .LBB226_2
27124; RV64I-NEXT:  .LBB226_1: # %atomicrmw.start
27125; RV64I-NEXT:    # in Loop: Header=BB226_2 Depth=1
27126; RV64I-NEXT:    sd a3, 0(sp)
27127; RV64I-NEXT:    mv a1, sp
27128; RV64I-NEXT:    li a3, 2
27129; RV64I-NEXT:    li a4, 2
27130; RV64I-NEXT:    mv a0, s0
27131; RV64I-NEXT:    call __atomic_compare_exchange_8
27132; RV64I-NEXT:    ld a3, 0(sp)
27133; RV64I-NEXT:    bnez a0, .LBB226_4
27134; RV64I-NEXT:  .LBB226_2: # %atomicrmw.start
27135; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
27136; RV64I-NEXT:    mv a2, a3
27137; RV64I-NEXT:    bge s1, a3, .LBB226_1
27138; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
27139; RV64I-NEXT:    # in Loop: Header=BB226_2 Depth=1
27140; RV64I-NEXT:    mv a2, s1
27141; RV64I-NEXT:    j .LBB226_1
27142; RV64I-NEXT:  .LBB226_4: # %atomicrmw.end
27143; RV64I-NEXT:    mv a0, a3
27144; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
27145; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
27146; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
27147; RV64I-NEXT:    addi sp, sp, 32
27148; RV64I-NEXT:    ret
27149;
27150; RV64IA-WMO-LABEL: atomicrmw_min_i64_acquire:
27151; RV64IA-WMO:       # %bb.0:
27152; RV64IA-WMO-NEXT:    amomin.d.aq a0, a1, (a0)
27153; RV64IA-WMO-NEXT:    ret
27154;
27155; RV64IA-TSO-LABEL: atomicrmw_min_i64_acquire:
27156; RV64IA-TSO:       # %bb.0:
27157; RV64IA-TSO-NEXT:    amomin.d a0, a1, (a0)
27158; RV64IA-TSO-NEXT:    ret
27159  %1 = atomicrmw min ptr %a, i64 %b acquire
27160  ret i64 %1
27161}
27162
27163define i64 @atomicrmw_min_i64_release(ptr %a, i64 %b) nounwind {
27164; RV32I-LABEL: atomicrmw_min_i64_release:
27165; RV32I:       # %bb.0:
27166; RV32I-NEXT:    addi sp, sp, -32
27167; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27168; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27169; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27170; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27171; RV32I-NEXT:    mv s0, a2
27172; RV32I-NEXT:    mv s1, a0
27173; RV32I-NEXT:    lw a4, 0(a0)
27174; RV32I-NEXT:    lw a5, 4(a0)
27175; RV32I-NEXT:    mv s2, a1
27176; RV32I-NEXT:    j .LBB227_2
27177; RV32I-NEXT:  .LBB227_1: # %atomicrmw.start
27178; RV32I-NEXT:    # in Loop: Header=BB227_2 Depth=1
27179; RV32I-NEXT:    sw a4, 8(sp)
27180; RV32I-NEXT:    sw a5, 12(sp)
27181; RV32I-NEXT:    addi a1, sp, 8
27182; RV32I-NEXT:    li a4, 3
27183; RV32I-NEXT:    mv a0, s1
27184; RV32I-NEXT:    li a5, 0
27185; RV32I-NEXT:    call __atomic_compare_exchange_8
27186; RV32I-NEXT:    lw a4, 8(sp)
27187; RV32I-NEXT:    lw a5, 12(sp)
27188; RV32I-NEXT:    bnez a0, .LBB227_7
27189; RV32I-NEXT:  .LBB227_2: # %atomicrmw.start
27190; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
27191; RV32I-NEXT:    beq a5, s0, .LBB227_4
27192; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
27193; RV32I-NEXT:    # in Loop: Header=BB227_2 Depth=1
27194; RV32I-NEXT:    slt a0, s0, a5
27195; RV32I-NEXT:    j .LBB227_5
27196; RV32I-NEXT:  .LBB227_4: # in Loop: Header=BB227_2 Depth=1
27197; RV32I-NEXT:    sltu a0, s2, a4
27198; RV32I-NEXT:  .LBB227_5: # %atomicrmw.start
27199; RV32I-NEXT:    # in Loop: Header=BB227_2 Depth=1
27200; RV32I-NEXT:    mv a2, a4
27201; RV32I-NEXT:    mv a3, a5
27202; RV32I-NEXT:    beqz a0, .LBB227_1
27203; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
27204; RV32I-NEXT:    # in Loop: Header=BB227_2 Depth=1
27205; RV32I-NEXT:    mv a2, s2
27206; RV32I-NEXT:    mv a3, s0
27207; RV32I-NEXT:    j .LBB227_1
27208; RV32I-NEXT:  .LBB227_7: # %atomicrmw.end
27209; RV32I-NEXT:    mv a0, a4
27210; RV32I-NEXT:    mv a1, a5
27211; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27212; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27213; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27214; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27215; RV32I-NEXT:    addi sp, sp, 32
27216; RV32I-NEXT:    ret
27217;
27218; RV32IA-LABEL: atomicrmw_min_i64_release:
27219; RV32IA:       # %bb.0:
27220; RV32IA-NEXT:    addi sp, sp, -32
27221; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27222; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27223; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27224; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27225; RV32IA-NEXT:    mv s0, a2
27226; RV32IA-NEXT:    mv s1, a0
27227; RV32IA-NEXT:    lw a4, 0(a0)
27228; RV32IA-NEXT:    lw a5, 4(a0)
27229; RV32IA-NEXT:    mv s2, a1
27230; RV32IA-NEXT:    j .LBB227_2
27231; RV32IA-NEXT:  .LBB227_1: # %atomicrmw.start
27232; RV32IA-NEXT:    # in Loop: Header=BB227_2 Depth=1
27233; RV32IA-NEXT:    sw a4, 8(sp)
27234; RV32IA-NEXT:    sw a5, 12(sp)
27235; RV32IA-NEXT:    addi a1, sp, 8
27236; RV32IA-NEXT:    li a4, 3
27237; RV32IA-NEXT:    mv a0, s1
27238; RV32IA-NEXT:    li a5, 0
27239; RV32IA-NEXT:    call __atomic_compare_exchange_8
27240; RV32IA-NEXT:    lw a4, 8(sp)
27241; RV32IA-NEXT:    lw a5, 12(sp)
27242; RV32IA-NEXT:    bnez a0, .LBB227_7
27243; RV32IA-NEXT:  .LBB227_2: # %atomicrmw.start
27244; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
27245; RV32IA-NEXT:    beq a5, s0, .LBB227_4
27246; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
27247; RV32IA-NEXT:    # in Loop: Header=BB227_2 Depth=1
27248; RV32IA-NEXT:    slt a0, s0, a5
27249; RV32IA-NEXT:    j .LBB227_5
27250; RV32IA-NEXT:  .LBB227_4: # in Loop: Header=BB227_2 Depth=1
27251; RV32IA-NEXT:    sltu a0, s2, a4
27252; RV32IA-NEXT:  .LBB227_5: # %atomicrmw.start
27253; RV32IA-NEXT:    # in Loop: Header=BB227_2 Depth=1
27254; RV32IA-NEXT:    mv a2, a4
27255; RV32IA-NEXT:    mv a3, a5
27256; RV32IA-NEXT:    beqz a0, .LBB227_1
27257; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
27258; RV32IA-NEXT:    # in Loop: Header=BB227_2 Depth=1
27259; RV32IA-NEXT:    mv a2, s2
27260; RV32IA-NEXT:    mv a3, s0
27261; RV32IA-NEXT:    j .LBB227_1
27262; RV32IA-NEXT:  .LBB227_7: # %atomicrmw.end
27263; RV32IA-NEXT:    mv a0, a4
27264; RV32IA-NEXT:    mv a1, a5
27265; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27266; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27267; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27268; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27269; RV32IA-NEXT:    addi sp, sp, 32
27270; RV32IA-NEXT:    ret
27271;
27272; RV64I-LABEL: atomicrmw_min_i64_release:
27273; RV64I:       # %bb.0:
27274; RV64I-NEXT:    addi sp, sp, -32
27275; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
27276; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
27277; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
27278; RV64I-NEXT:    mv s0, a0
27279; RV64I-NEXT:    ld a3, 0(a0)
27280; RV64I-NEXT:    mv s1, a1
27281; RV64I-NEXT:    j .LBB227_2
27282; RV64I-NEXT:  .LBB227_1: # %atomicrmw.start
27283; RV64I-NEXT:    # in Loop: Header=BB227_2 Depth=1
27284; RV64I-NEXT:    sd a3, 0(sp)
27285; RV64I-NEXT:    mv a1, sp
27286; RV64I-NEXT:    li a3, 3
27287; RV64I-NEXT:    mv a0, s0
27288; RV64I-NEXT:    li a4, 0
27289; RV64I-NEXT:    call __atomic_compare_exchange_8
27290; RV64I-NEXT:    ld a3, 0(sp)
27291; RV64I-NEXT:    bnez a0, .LBB227_4
27292; RV64I-NEXT:  .LBB227_2: # %atomicrmw.start
27293; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
27294; RV64I-NEXT:    mv a2, a3
27295; RV64I-NEXT:    bge s1, a3, .LBB227_1
27296; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
27297; RV64I-NEXT:    # in Loop: Header=BB227_2 Depth=1
27298; RV64I-NEXT:    mv a2, s1
27299; RV64I-NEXT:    j .LBB227_1
27300; RV64I-NEXT:  .LBB227_4: # %atomicrmw.end
27301; RV64I-NEXT:    mv a0, a3
27302; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
27303; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
27304; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
27305; RV64I-NEXT:    addi sp, sp, 32
27306; RV64I-NEXT:    ret
27307;
27308; RV64IA-WMO-LABEL: atomicrmw_min_i64_release:
27309; RV64IA-WMO:       # %bb.0:
27310; RV64IA-WMO-NEXT:    amomin.d.rl a0, a1, (a0)
27311; RV64IA-WMO-NEXT:    ret
27312;
27313; RV64IA-TSO-LABEL: atomicrmw_min_i64_release:
27314; RV64IA-TSO:       # %bb.0:
27315; RV64IA-TSO-NEXT:    amomin.d a0, a1, (a0)
27316; RV64IA-TSO-NEXT:    ret
27317  %1 = atomicrmw min ptr %a, i64 %b release
27318  ret i64 %1
27319}
27320
27321define i64 @atomicrmw_min_i64_acq_rel(ptr %a, i64 %b) nounwind {
27322; RV32I-LABEL: atomicrmw_min_i64_acq_rel:
27323; RV32I:       # %bb.0:
27324; RV32I-NEXT:    addi sp, sp, -32
27325; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27326; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27327; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27328; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27329; RV32I-NEXT:    mv s0, a2
27330; RV32I-NEXT:    mv s1, a0
27331; RV32I-NEXT:    lw a4, 0(a0)
27332; RV32I-NEXT:    lw a5, 4(a0)
27333; RV32I-NEXT:    mv s2, a1
27334; RV32I-NEXT:    j .LBB228_2
27335; RV32I-NEXT:  .LBB228_1: # %atomicrmw.start
27336; RV32I-NEXT:    # in Loop: Header=BB228_2 Depth=1
27337; RV32I-NEXT:    sw a4, 8(sp)
27338; RV32I-NEXT:    sw a5, 12(sp)
27339; RV32I-NEXT:    addi a1, sp, 8
27340; RV32I-NEXT:    li a4, 4
27341; RV32I-NEXT:    li a5, 2
27342; RV32I-NEXT:    mv a0, s1
27343; RV32I-NEXT:    call __atomic_compare_exchange_8
27344; RV32I-NEXT:    lw a4, 8(sp)
27345; RV32I-NEXT:    lw a5, 12(sp)
27346; RV32I-NEXT:    bnez a0, .LBB228_7
27347; RV32I-NEXT:  .LBB228_2: # %atomicrmw.start
27348; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
27349; RV32I-NEXT:    beq a5, s0, .LBB228_4
27350; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
27351; RV32I-NEXT:    # in Loop: Header=BB228_2 Depth=1
27352; RV32I-NEXT:    slt a0, s0, a5
27353; RV32I-NEXT:    j .LBB228_5
27354; RV32I-NEXT:  .LBB228_4: # in Loop: Header=BB228_2 Depth=1
27355; RV32I-NEXT:    sltu a0, s2, a4
27356; RV32I-NEXT:  .LBB228_5: # %atomicrmw.start
27357; RV32I-NEXT:    # in Loop: Header=BB228_2 Depth=1
27358; RV32I-NEXT:    mv a2, a4
27359; RV32I-NEXT:    mv a3, a5
27360; RV32I-NEXT:    beqz a0, .LBB228_1
27361; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
27362; RV32I-NEXT:    # in Loop: Header=BB228_2 Depth=1
27363; RV32I-NEXT:    mv a2, s2
27364; RV32I-NEXT:    mv a3, s0
27365; RV32I-NEXT:    j .LBB228_1
27366; RV32I-NEXT:  .LBB228_7: # %atomicrmw.end
27367; RV32I-NEXT:    mv a0, a4
27368; RV32I-NEXT:    mv a1, a5
27369; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27370; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27371; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27372; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27373; RV32I-NEXT:    addi sp, sp, 32
27374; RV32I-NEXT:    ret
27375;
27376; RV32IA-LABEL: atomicrmw_min_i64_acq_rel:
27377; RV32IA:       # %bb.0:
27378; RV32IA-NEXT:    addi sp, sp, -32
27379; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27380; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27381; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27382; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27383; RV32IA-NEXT:    mv s0, a2
27384; RV32IA-NEXT:    mv s1, a0
27385; RV32IA-NEXT:    lw a4, 0(a0)
27386; RV32IA-NEXT:    lw a5, 4(a0)
27387; RV32IA-NEXT:    mv s2, a1
27388; RV32IA-NEXT:    j .LBB228_2
27389; RV32IA-NEXT:  .LBB228_1: # %atomicrmw.start
27390; RV32IA-NEXT:    # in Loop: Header=BB228_2 Depth=1
27391; RV32IA-NEXT:    sw a4, 8(sp)
27392; RV32IA-NEXT:    sw a5, 12(sp)
27393; RV32IA-NEXT:    addi a1, sp, 8
27394; RV32IA-NEXT:    li a4, 4
27395; RV32IA-NEXT:    li a5, 2
27396; RV32IA-NEXT:    mv a0, s1
27397; RV32IA-NEXT:    call __atomic_compare_exchange_8
27398; RV32IA-NEXT:    lw a4, 8(sp)
27399; RV32IA-NEXT:    lw a5, 12(sp)
27400; RV32IA-NEXT:    bnez a0, .LBB228_7
27401; RV32IA-NEXT:  .LBB228_2: # %atomicrmw.start
27402; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
27403; RV32IA-NEXT:    beq a5, s0, .LBB228_4
27404; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
27405; RV32IA-NEXT:    # in Loop: Header=BB228_2 Depth=1
27406; RV32IA-NEXT:    slt a0, s0, a5
27407; RV32IA-NEXT:    j .LBB228_5
27408; RV32IA-NEXT:  .LBB228_4: # in Loop: Header=BB228_2 Depth=1
27409; RV32IA-NEXT:    sltu a0, s2, a4
27410; RV32IA-NEXT:  .LBB228_5: # %atomicrmw.start
27411; RV32IA-NEXT:    # in Loop: Header=BB228_2 Depth=1
27412; RV32IA-NEXT:    mv a2, a4
27413; RV32IA-NEXT:    mv a3, a5
27414; RV32IA-NEXT:    beqz a0, .LBB228_1
27415; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
27416; RV32IA-NEXT:    # in Loop: Header=BB228_2 Depth=1
27417; RV32IA-NEXT:    mv a2, s2
27418; RV32IA-NEXT:    mv a3, s0
27419; RV32IA-NEXT:    j .LBB228_1
27420; RV32IA-NEXT:  .LBB228_7: # %atomicrmw.end
27421; RV32IA-NEXT:    mv a0, a4
27422; RV32IA-NEXT:    mv a1, a5
27423; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27424; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27425; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27426; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27427; RV32IA-NEXT:    addi sp, sp, 32
27428; RV32IA-NEXT:    ret
27429;
27430; RV64I-LABEL: atomicrmw_min_i64_acq_rel:
27431; RV64I:       # %bb.0:
27432; RV64I-NEXT:    addi sp, sp, -32
27433; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
27434; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
27435; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
27436; RV64I-NEXT:    mv s0, a0
27437; RV64I-NEXT:    ld a3, 0(a0)
27438; RV64I-NEXT:    mv s1, a1
27439; RV64I-NEXT:    j .LBB228_2
27440; RV64I-NEXT:  .LBB228_1: # %atomicrmw.start
27441; RV64I-NEXT:    # in Loop: Header=BB228_2 Depth=1
27442; RV64I-NEXT:    sd a3, 0(sp)
27443; RV64I-NEXT:    mv a1, sp
27444; RV64I-NEXT:    li a3, 4
27445; RV64I-NEXT:    li a4, 2
27446; RV64I-NEXT:    mv a0, s0
27447; RV64I-NEXT:    call __atomic_compare_exchange_8
27448; RV64I-NEXT:    ld a3, 0(sp)
27449; RV64I-NEXT:    bnez a0, .LBB228_4
27450; RV64I-NEXT:  .LBB228_2: # %atomicrmw.start
27451; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
27452; RV64I-NEXT:    mv a2, a3
27453; RV64I-NEXT:    bge s1, a3, .LBB228_1
27454; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
27455; RV64I-NEXT:    # in Loop: Header=BB228_2 Depth=1
27456; RV64I-NEXT:    mv a2, s1
27457; RV64I-NEXT:    j .LBB228_1
27458; RV64I-NEXT:  .LBB228_4: # %atomicrmw.end
27459; RV64I-NEXT:    mv a0, a3
27460; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
27461; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
27462; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
27463; RV64I-NEXT:    addi sp, sp, 32
27464; RV64I-NEXT:    ret
27465;
27466; RV64IA-WMO-LABEL: atomicrmw_min_i64_acq_rel:
27467; RV64IA-WMO:       # %bb.0:
27468; RV64IA-WMO-NEXT:    amomin.d.aqrl a0, a1, (a0)
27469; RV64IA-WMO-NEXT:    ret
27470;
27471; RV64IA-TSO-LABEL: atomicrmw_min_i64_acq_rel:
27472; RV64IA-TSO:       # %bb.0:
27473; RV64IA-TSO-NEXT:    amomin.d a0, a1, (a0)
27474; RV64IA-TSO-NEXT:    ret
27475  %1 = atomicrmw min ptr %a, i64 %b acq_rel
27476  ret i64 %1
27477}
27478
27479define i64 @atomicrmw_min_i64_seq_cst(ptr %a, i64 %b) nounwind {
27480; RV32I-LABEL: atomicrmw_min_i64_seq_cst:
27481; RV32I:       # %bb.0:
27482; RV32I-NEXT:    addi sp, sp, -32
27483; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27484; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27485; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27486; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27487; RV32I-NEXT:    mv s0, a2
27488; RV32I-NEXT:    mv s1, a0
27489; RV32I-NEXT:    lw a4, 0(a0)
27490; RV32I-NEXT:    lw a5, 4(a0)
27491; RV32I-NEXT:    mv s2, a1
27492; RV32I-NEXT:    j .LBB229_2
27493; RV32I-NEXT:  .LBB229_1: # %atomicrmw.start
27494; RV32I-NEXT:    # in Loop: Header=BB229_2 Depth=1
27495; RV32I-NEXT:    sw a4, 8(sp)
27496; RV32I-NEXT:    sw a5, 12(sp)
27497; RV32I-NEXT:    addi a1, sp, 8
27498; RV32I-NEXT:    li a4, 5
27499; RV32I-NEXT:    li a5, 5
27500; RV32I-NEXT:    mv a0, s1
27501; RV32I-NEXT:    call __atomic_compare_exchange_8
27502; RV32I-NEXT:    lw a4, 8(sp)
27503; RV32I-NEXT:    lw a5, 12(sp)
27504; RV32I-NEXT:    bnez a0, .LBB229_7
27505; RV32I-NEXT:  .LBB229_2: # %atomicrmw.start
27506; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
27507; RV32I-NEXT:    beq a5, s0, .LBB229_4
27508; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
27509; RV32I-NEXT:    # in Loop: Header=BB229_2 Depth=1
27510; RV32I-NEXT:    slt a0, s0, a5
27511; RV32I-NEXT:    j .LBB229_5
27512; RV32I-NEXT:  .LBB229_4: # in Loop: Header=BB229_2 Depth=1
27513; RV32I-NEXT:    sltu a0, s2, a4
27514; RV32I-NEXT:  .LBB229_5: # %atomicrmw.start
27515; RV32I-NEXT:    # in Loop: Header=BB229_2 Depth=1
27516; RV32I-NEXT:    mv a2, a4
27517; RV32I-NEXT:    mv a3, a5
27518; RV32I-NEXT:    beqz a0, .LBB229_1
27519; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
27520; RV32I-NEXT:    # in Loop: Header=BB229_2 Depth=1
27521; RV32I-NEXT:    mv a2, s2
27522; RV32I-NEXT:    mv a3, s0
27523; RV32I-NEXT:    j .LBB229_1
27524; RV32I-NEXT:  .LBB229_7: # %atomicrmw.end
27525; RV32I-NEXT:    mv a0, a4
27526; RV32I-NEXT:    mv a1, a5
27527; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27528; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27529; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27530; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27531; RV32I-NEXT:    addi sp, sp, 32
27532; RV32I-NEXT:    ret
27533;
27534; RV32IA-LABEL: atomicrmw_min_i64_seq_cst:
27535; RV32IA:       # %bb.0:
27536; RV32IA-NEXT:    addi sp, sp, -32
27537; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27538; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27539; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27540; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27541; RV32IA-NEXT:    mv s0, a2
27542; RV32IA-NEXT:    mv s1, a0
27543; RV32IA-NEXT:    lw a4, 0(a0)
27544; RV32IA-NEXT:    lw a5, 4(a0)
27545; RV32IA-NEXT:    mv s2, a1
27546; RV32IA-NEXT:    j .LBB229_2
27547; RV32IA-NEXT:  .LBB229_1: # %atomicrmw.start
27548; RV32IA-NEXT:    # in Loop: Header=BB229_2 Depth=1
27549; RV32IA-NEXT:    sw a4, 8(sp)
27550; RV32IA-NEXT:    sw a5, 12(sp)
27551; RV32IA-NEXT:    addi a1, sp, 8
27552; RV32IA-NEXT:    li a4, 5
27553; RV32IA-NEXT:    li a5, 5
27554; RV32IA-NEXT:    mv a0, s1
27555; RV32IA-NEXT:    call __atomic_compare_exchange_8
27556; RV32IA-NEXT:    lw a4, 8(sp)
27557; RV32IA-NEXT:    lw a5, 12(sp)
27558; RV32IA-NEXT:    bnez a0, .LBB229_7
27559; RV32IA-NEXT:  .LBB229_2: # %atomicrmw.start
27560; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
27561; RV32IA-NEXT:    beq a5, s0, .LBB229_4
27562; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
27563; RV32IA-NEXT:    # in Loop: Header=BB229_2 Depth=1
27564; RV32IA-NEXT:    slt a0, s0, a5
27565; RV32IA-NEXT:    j .LBB229_5
27566; RV32IA-NEXT:  .LBB229_4: # in Loop: Header=BB229_2 Depth=1
27567; RV32IA-NEXT:    sltu a0, s2, a4
27568; RV32IA-NEXT:  .LBB229_5: # %atomicrmw.start
27569; RV32IA-NEXT:    # in Loop: Header=BB229_2 Depth=1
27570; RV32IA-NEXT:    mv a2, a4
27571; RV32IA-NEXT:    mv a3, a5
27572; RV32IA-NEXT:    beqz a0, .LBB229_1
27573; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
27574; RV32IA-NEXT:    # in Loop: Header=BB229_2 Depth=1
27575; RV32IA-NEXT:    mv a2, s2
27576; RV32IA-NEXT:    mv a3, s0
27577; RV32IA-NEXT:    j .LBB229_1
27578; RV32IA-NEXT:  .LBB229_7: # %atomicrmw.end
27579; RV32IA-NEXT:    mv a0, a4
27580; RV32IA-NEXT:    mv a1, a5
27581; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27582; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27583; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27584; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27585; RV32IA-NEXT:    addi sp, sp, 32
27586; RV32IA-NEXT:    ret
27587;
27588; RV64I-LABEL: atomicrmw_min_i64_seq_cst:
27589; RV64I:       # %bb.0:
27590; RV64I-NEXT:    addi sp, sp, -32
27591; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
27592; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
27593; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
27594; RV64I-NEXT:    mv s0, a0
27595; RV64I-NEXT:    ld a3, 0(a0)
27596; RV64I-NEXT:    mv s1, a1
27597; RV64I-NEXT:    j .LBB229_2
27598; RV64I-NEXT:  .LBB229_1: # %atomicrmw.start
27599; RV64I-NEXT:    # in Loop: Header=BB229_2 Depth=1
27600; RV64I-NEXT:    sd a3, 0(sp)
27601; RV64I-NEXT:    mv a1, sp
27602; RV64I-NEXT:    li a3, 5
27603; RV64I-NEXT:    li a4, 5
27604; RV64I-NEXT:    mv a0, s0
27605; RV64I-NEXT:    call __atomic_compare_exchange_8
27606; RV64I-NEXT:    ld a3, 0(sp)
27607; RV64I-NEXT:    bnez a0, .LBB229_4
27608; RV64I-NEXT:  .LBB229_2: # %atomicrmw.start
27609; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
27610; RV64I-NEXT:    mv a2, a3
27611; RV64I-NEXT:    bge s1, a3, .LBB229_1
27612; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
27613; RV64I-NEXT:    # in Loop: Header=BB229_2 Depth=1
27614; RV64I-NEXT:    mv a2, s1
27615; RV64I-NEXT:    j .LBB229_1
27616; RV64I-NEXT:  .LBB229_4: # %atomicrmw.end
27617; RV64I-NEXT:    mv a0, a3
27618; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
27619; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
27620; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
27621; RV64I-NEXT:    addi sp, sp, 32
27622; RV64I-NEXT:    ret
27623;
27624; RV64IA-WMO-LABEL: atomicrmw_min_i64_seq_cst:
27625; RV64IA-WMO:       # %bb.0:
27626; RV64IA-WMO-NEXT:    amomin.d.aqrl a0, a1, (a0)
27627; RV64IA-WMO-NEXT:    ret
27628;
27629; RV64IA-TSO-LABEL: atomicrmw_min_i64_seq_cst:
27630; RV64IA-TSO:       # %bb.0:
27631; RV64IA-TSO-NEXT:    amomin.d a0, a1, (a0)
27632; RV64IA-TSO-NEXT:    ret
27633  %1 = atomicrmw min ptr %a, i64 %b seq_cst
27634  ret i64 %1
27635}
27636
27637define i64 @atomicrmw_umax_i64_monotonic(ptr %a, i64 %b) nounwind {
27638; RV32I-LABEL: atomicrmw_umax_i64_monotonic:
27639; RV32I:       # %bb.0:
27640; RV32I-NEXT:    addi sp, sp, -32
27641; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27642; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27643; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27644; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27645; RV32I-NEXT:    mv s0, a2
27646; RV32I-NEXT:    mv s1, a0
27647; RV32I-NEXT:    lw a4, 0(a0)
27648; RV32I-NEXT:    lw a5, 4(a0)
27649; RV32I-NEXT:    mv s2, a1
27650; RV32I-NEXT:    j .LBB230_2
27651; RV32I-NEXT:  .LBB230_1: # %atomicrmw.start
27652; RV32I-NEXT:    # in Loop: Header=BB230_2 Depth=1
27653; RV32I-NEXT:    sw a4, 8(sp)
27654; RV32I-NEXT:    sw a5, 12(sp)
27655; RV32I-NEXT:    addi a1, sp, 8
27656; RV32I-NEXT:    mv a0, s1
27657; RV32I-NEXT:    li a4, 0
27658; RV32I-NEXT:    li a5, 0
27659; RV32I-NEXT:    call __atomic_compare_exchange_8
27660; RV32I-NEXT:    lw a4, 8(sp)
27661; RV32I-NEXT:    lw a5, 12(sp)
27662; RV32I-NEXT:    bnez a0, .LBB230_7
27663; RV32I-NEXT:  .LBB230_2: # %atomicrmw.start
27664; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
27665; RV32I-NEXT:    beq a5, s0, .LBB230_4
27666; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
27667; RV32I-NEXT:    # in Loop: Header=BB230_2 Depth=1
27668; RV32I-NEXT:    sltu a0, s0, a5
27669; RV32I-NEXT:    j .LBB230_5
27670; RV32I-NEXT:  .LBB230_4: # in Loop: Header=BB230_2 Depth=1
27671; RV32I-NEXT:    sltu a0, s2, a4
27672; RV32I-NEXT:  .LBB230_5: # %atomicrmw.start
27673; RV32I-NEXT:    # in Loop: Header=BB230_2 Depth=1
27674; RV32I-NEXT:    mv a2, a4
27675; RV32I-NEXT:    mv a3, a5
27676; RV32I-NEXT:    bnez a0, .LBB230_1
27677; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
27678; RV32I-NEXT:    # in Loop: Header=BB230_2 Depth=1
27679; RV32I-NEXT:    mv a2, s2
27680; RV32I-NEXT:    mv a3, s0
27681; RV32I-NEXT:    j .LBB230_1
27682; RV32I-NEXT:  .LBB230_7: # %atomicrmw.end
27683; RV32I-NEXT:    mv a0, a4
27684; RV32I-NEXT:    mv a1, a5
27685; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27686; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27687; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27688; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27689; RV32I-NEXT:    addi sp, sp, 32
27690; RV32I-NEXT:    ret
27691;
27692; RV32IA-LABEL: atomicrmw_umax_i64_monotonic:
27693; RV32IA:       # %bb.0:
27694; RV32IA-NEXT:    addi sp, sp, -32
27695; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27696; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27697; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27698; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27699; RV32IA-NEXT:    mv s0, a2
27700; RV32IA-NEXT:    mv s1, a0
27701; RV32IA-NEXT:    lw a4, 0(a0)
27702; RV32IA-NEXT:    lw a5, 4(a0)
27703; RV32IA-NEXT:    mv s2, a1
27704; RV32IA-NEXT:    j .LBB230_2
27705; RV32IA-NEXT:  .LBB230_1: # %atomicrmw.start
27706; RV32IA-NEXT:    # in Loop: Header=BB230_2 Depth=1
27707; RV32IA-NEXT:    sw a4, 8(sp)
27708; RV32IA-NEXT:    sw a5, 12(sp)
27709; RV32IA-NEXT:    addi a1, sp, 8
27710; RV32IA-NEXT:    mv a0, s1
27711; RV32IA-NEXT:    li a4, 0
27712; RV32IA-NEXT:    li a5, 0
27713; RV32IA-NEXT:    call __atomic_compare_exchange_8
27714; RV32IA-NEXT:    lw a4, 8(sp)
27715; RV32IA-NEXT:    lw a5, 12(sp)
27716; RV32IA-NEXT:    bnez a0, .LBB230_7
27717; RV32IA-NEXT:  .LBB230_2: # %atomicrmw.start
27718; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
27719; RV32IA-NEXT:    beq a5, s0, .LBB230_4
27720; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
27721; RV32IA-NEXT:    # in Loop: Header=BB230_2 Depth=1
27722; RV32IA-NEXT:    sltu a0, s0, a5
27723; RV32IA-NEXT:    j .LBB230_5
27724; RV32IA-NEXT:  .LBB230_4: # in Loop: Header=BB230_2 Depth=1
27725; RV32IA-NEXT:    sltu a0, s2, a4
27726; RV32IA-NEXT:  .LBB230_5: # %atomicrmw.start
27727; RV32IA-NEXT:    # in Loop: Header=BB230_2 Depth=1
27728; RV32IA-NEXT:    mv a2, a4
27729; RV32IA-NEXT:    mv a3, a5
27730; RV32IA-NEXT:    bnez a0, .LBB230_1
27731; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
27732; RV32IA-NEXT:    # in Loop: Header=BB230_2 Depth=1
27733; RV32IA-NEXT:    mv a2, s2
27734; RV32IA-NEXT:    mv a3, s0
27735; RV32IA-NEXT:    j .LBB230_1
27736; RV32IA-NEXT:  .LBB230_7: # %atomicrmw.end
27737; RV32IA-NEXT:    mv a0, a4
27738; RV32IA-NEXT:    mv a1, a5
27739; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27740; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27741; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27742; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27743; RV32IA-NEXT:    addi sp, sp, 32
27744; RV32IA-NEXT:    ret
27745;
27746; RV64I-LABEL: atomicrmw_umax_i64_monotonic:
27747; RV64I:       # %bb.0:
27748; RV64I-NEXT:    addi sp, sp, -32
27749; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
27750; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
27751; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
27752; RV64I-NEXT:    mv s0, a0
27753; RV64I-NEXT:    ld a3, 0(a0)
27754; RV64I-NEXT:    mv s1, a1
27755; RV64I-NEXT:    j .LBB230_2
27756; RV64I-NEXT:  .LBB230_1: # %atomicrmw.start
27757; RV64I-NEXT:    # in Loop: Header=BB230_2 Depth=1
27758; RV64I-NEXT:    sd a3, 0(sp)
27759; RV64I-NEXT:    mv a1, sp
27760; RV64I-NEXT:    mv a0, s0
27761; RV64I-NEXT:    li a3, 0
27762; RV64I-NEXT:    li a4, 0
27763; RV64I-NEXT:    call __atomic_compare_exchange_8
27764; RV64I-NEXT:    ld a3, 0(sp)
27765; RV64I-NEXT:    bnez a0, .LBB230_4
27766; RV64I-NEXT:  .LBB230_2: # %atomicrmw.start
27767; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
27768; RV64I-NEXT:    mv a2, a3
27769; RV64I-NEXT:    bltu s1, a3, .LBB230_1
27770; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
27771; RV64I-NEXT:    # in Loop: Header=BB230_2 Depth=1
27772; RV64I-NEXT:    mv a2, s1
27773; RV64I-NEXT:    j .LBB230_1
27774; RV64I-NEXT:  .LBB230_4: # %atomicrmw.end
27775; RV64I-NEXT:    mv a0, a3
27776; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
27777; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
27778; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
27779; RV64I-NEXT:    addi sp, sp, 32
27780; RV64I-NEXT:    ret
27781;
27782; RV64IA-LABEL: atomicrmw_umax_i64_monotonic:
27783; RV64IA:       # %bb.0:
27784; RV64IA-NEXT:    amomaxu.d a0, a1, (a0)
27785; RV64IA-NEXT:    ret
27786  %1 = atomicrmw umax ptr %a, i64 %b monotonic
27787  ret i64 %1
27788}
27789
27790define i64 @atomicrmw_umax_i64_acquire(ptr %a, i64 %b) nounwind {
27791; RV32I-LABEL: atomicrmw_umax_i64_acquire:
27792; RV32I:       # %bb.0:
27793; RV32I-NEXT:    addi sp, sp, -32
27794; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27795; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27796; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27797; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27798; RV32I-NEXT:    mv s0, a2
27799; RV32I-NEXT:    mv s1, a0
27800; RV32I-NEXT:    lw a4, 0(a0)
27801; RV32I-NEXT:    lw a5, 4(a0)
27802; RV32I-NEXT:    mv s2, a1
27803; RV32I-NEXT:    j .LBB231_2
27804; RV32I-NEXT:  .LBB231_1: # %atomicrmw.start
27805; RV32I-NEXT:    # in Loop: Header=BB231_2 Depth=1
27806; RV32I-NEXT:    sw a4, 8(sp)
27807; RV32I-NEXT:    sw a5, 12(sp)
27808; RV32I-NEXT:    addi a1, sp, 8
27809; RV32I-NEXT:    li a4, 2
27810; RV32I-NEXT:    li a5, 2
27811; RV32I-NEXT:    mv a0, s1
27812; RV32I-NEXT:    call __atomic_compare_exchange_8
27813; RV32I-NEXT:    lw a4, 8(sp)
27814; RV32I-NEXT:    lw a5, 12(sp)
27815; RV32I-NEXT:    bnez a0, .LBB231_7
27816; RV32I-NEXT:  .LBB231_2: # %atomicrmw.start
27817; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
27818; RV32I-NEXT:    beq a5, s0, .LBB231_4
27819; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
27820; RV32I-NEXT:    # in Loop: Header=BB231_2 Depth=1
27821; RV32I-NEXT:    sltu a0, s0, a5
27822; RV32I-NEXT:    j .LBB231_5
27823; RV32I-NEXT:  .LBB231_4: # in Loop: Header=BB231_2 Depth=1
27824; RV32I-NEXT:    sltu a0, s2, a4
27825; RV32I-NEXT:  .LBB231_5: # %atomicrmw.start
27826; RV32I-NEXT:    # in Loop: Header=BB231_2 Depth=1
27827; RV32I-NEXT:    mv a2, a4
27828; RV32I-NEXT:    mv a3, a5
27829; RV32I-NEXT:    bnez a0, .LBB231_1
27830; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
27831; RV32I-NEXT:    # in Loop: Header=BB231_2 Depth=1
27832; RV32I-NEXT:    mv a2, s2
27833; RV32I-NEXT:    mv a3, s0
27834; RV32I-NEXT:    j .LBB231_1
27835; RV32I-NEXT:  .LBB231_7: # %atomicrmw.end
27836; RV32I-NEXT:    mv a0, a4
27837; RV32I-NEXT:    mv a1, a5
27838; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27839; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27840; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27841; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27842; RV32I-NEXT:    addi sp, sp, 32
27843; RV32I-NEXT:    ret
27844;
27845; RV32IA-LABEL: atomicrmw_umax_i64_acquire:
27846; RV32IA:       # %bb.0:
27847; RV32IA-NEXT:    addi sp, sp, -32
27848; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27849; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27850; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27851; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27852; RV32IA-NEXT:    mv s0, a2
27853; RV32IA-NEXT:    mv s1, a0
27854; RV32IA-NEXT:    lw a4, 0(a0)
27855; RV32IA-NEXT:    lw a5, 4(a0)
27856; RV32IA-NEXT:    mv s2, a1
27857; RV32IA-NEXT:    j .LBB231_2
27858; RV32IA-NEXT:  .LBB231_1: # %atomicrmw.start
27859; RV32IA-NEXT:    # in Loop: Header=BB231_2 Depth=1
27860; RV32IA-NEXT:    sw a4, 8(sp)
27861; RV32IA-NEXT:    sw a5, 12(sp)
27862; RV32IA-NEXT:    addi a1, sp, 8
27863; RV32IA-NEXT:    li a4, 2
27864; RV32IA-NEXT:    li a5, 2
27865; RV32IA-NEXT:    mv a0, s1
27866; RV32IA-NEXT:    call __atomic_compare_exchange_8
27867; RV32IA-NEXT:    lw a4, 8(sp)
27868; RV32IA-NEXT:    lw a5, 12(sp)
27869; RV32IA-NEXT:    bnez a0, .LBB231_7
27870; RV32IA-NEXT:  .LBB231_2: # %atomicrmw.start
27871; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
27872; RV32IA-NEXT:    beq a5, s0, .LBB231_4
27873; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
27874; RV32IA-NEXT:    # in Loop: Header=BB231_2 Depth=1
27875; RV32IA-NEXT:    sltu a0, s0, a5
27876; RV32IA-NEXT:    j .LBB231_5
27877; RV32IA-NEXT:  .LBB231_4: # in Loop: Header=BB231_2 Depth=1
27878; RV32IA-NEXT:    sltu a0, s2, a4
27879; RV32IA-NEXT:  .LBB231_5: # %atomicrmw.start
27880; RV32IA-NEXT:    # in Loop: Header=BB231_2 Depth=1
27881; RV32IA-NEXT:    mv a2, a4
27882; RV32IA-NEXT:    mv a3, a5
27883; RV32IA-NEXT:    bnez a0, .LBB231_1
27884; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
27885; RV32IA-NEXT:    # in Loop: Header=BB231_2 Depth=1
27886; RV32IA-NEXT:    mv a2, s2
27887; RV32IA-NEXT:    mv a3, s0
27888; RV32IA-NEXT:    j .LBB231_1
27889; RV32IA-NEXT:  .LBB231_7: # %atomicrmw.end
27890; RV32IA-NEXT:    mv a0, a4
27891; RV32IA-NEXT:    mv a1, a5
27892; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27893; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27894; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27895; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
27896; RV32IA-NEXT:    addi sp, sp, 32
27897; RV32IA-NEXT:    ret
27898;
27899; RV64I-LABEL: atomicrmw_umax_i64_acquire:
27900; RV64I:       # %bb.0:
27901; RV64I-NEXT:    addi sp, sp, -32
27902; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
27903; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
27904; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
27905; RV64I-NEXT:    mv s0, a0
27906; RV64I-NEXT:    ld a3, 0(a0)
27907; RV64I-NEXT:    mv s1, a1
27908; RV64I-NEXT:    j .LBB231_2
27909; RV64I-NEXT:  .LBB231_1: # %atomicrmw.start
27910; RV64I-NEXT:    # in Loop: Header=BB231_2 Depth=1
27911; RV64I-NEXT:    sd a3, 0(sp)
27912; RV64I-NEXT:    mv a1, sp
27913; RV64I-NEXT:    li a3, 2
27914; RV64I-NEXT:    li a4, 2
27915; RV64I-NEXT:    mv a0, s0
27916; RV64I-NEXT:    call __atomic_compare_exchange_8
27917; RV64I-NEXT:    ld a3, 0(sp)
27918; RV64I-NEXT:    bnez a0, .LBB231_4
27919; RV64I-NEXT:  .LBB231_2: # %atomicrmw.start
27920; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
27921; RV64I-NEXT:    mv a2, a3
27922; RV64I-NEXT:    bltu s1, a3, .LBB231_1
27923; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
27924; RV64I-NEXT:    # in Loop: Header=BB231_2 Depth=1
27925; RV64I-NEXT:    mv a2, s1
27926; RV64I-NEXT:    j .LBB231_1
27927; RV64I-NEXT:  .LBB231_4: # %atomicrmw.end
27928; RV64I-NEXT:    mv a0, a3
27929; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
27930; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
27931; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
27932; RV64I-NEXT:    addi sp, sp, 32
27933; RV64I-NEXT:    ret
27934;
27935; RV64IA-WMO-LABEL: atomicrmw_umax_i64_acquire:
27936; RV64IA-WMO:       # %bb.0:
27937; RV64IA-WMO-NEXT:    amomaxu.d.aq a0, a1, (a0)
27938; RV64IA-WMO-NEXT:    ret
27939;
27940; RV64IA-TSO-LABEL: atomicrmw_umax_i64_acquire:
27941; RV64IA-TSO:       # %bb.0:
27942; RV64IA-TSO-NEXT:    amomaxu.d a0, a1, (a0)
27943; RV64IA-TSO-NEXT:    ret
27944  %1 = atomicrmw umax ptr %a, i64 %b acquire
27945  ret i64 %1
27946}
27947
27948define i64 @atomicrmw_umax_i64_release(ptr %a, i64 %b) nounwind {
27949; RV32I-LABEL: atomicrmw_umax_i64_release:
27950; RV32I:       # %bb.0:
27951; RV32I-NEXT:    addi sp, sp, -32
27952; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
27953; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
27954; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
27955; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
27956; RV32I-NEXT:    mv s0, a2
27957; RV32I-NEXT:    mv s1, a0
27958; RV32I-NEXT:    lw a4, 0(a0)
27959; RV32I-NEXT:    lw a5, 4(a0)
27960; RV32I-NEXT:    mv s2, a1
27961; RV32I-NEXT:    j .LBB232_2
27962; RV32I-NEXT:  .LBB232_1: # %atomicrmw.start
27963; RV32I-NEXT:    # in Loop: Header=BB232_2 Depth=1
27964; RV32I-NEXT:    sw a4, 8(sp)
27965; RV32I-NEXT:    sw a5, 12(sp)
27966; RV32I-NEXT:    addi a1, sp, 8
27967; RV32I-NEXT:    li a4, 3
27968; RV32I-NEXT:    mv a0, s1
27969; RV32I-NEXT:    li a5, 0
27970; RV32I-NEXT:    call __atomic_compare_exchange_8
27971; RV32I-NEXT:    lw a4, 8(sp)
27972; RV32I-NEXT:    lw a5, 12(sp)
27973; RV32I-NEXT:    bnez a0, .LBB232_7
27974; RV32I-NEXT:  .LBB232_2: # %atomicrmw.start
27975; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
27976; RV32I-NEXT:    beq a5, s0, .LBB232_4
27977; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
27978; RV32I-NEXT:    # in Loop: Header=BB232_2 Depth=1
27979; RV32I-NEXT:    sltu a0, s0, a5
27980; RV32I-NEXT:    j .LBB232_5
27981; RV32I-NEXT:  .LBB232_4: # in Loop: Header=BB232_2 Depth=1
27982; RV32I-NEXT:    sltu a0, s2, a4
27983; RV32I-NEXT:  .LBB232_5: # %atomicrmw.start
27984; RV32I-NEXT:    # in Loop: Header=BB232_2 Depth=1
27985; RV32I-NEXT:    mv a2, a4
27986; RV32I-NEXT:    mv a3, a5
27987; RV32I-NEXT:    bnez a0, .LBB232_1
27988; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
27989; RV32I-NEXT:    # in Loop: Header=BB232_2 Depth=1
27990; RV32I-NEXT:    mv a2, s2
27991; RV32I-NEXT:    mv a3, s0
27992; RV32I-NEXT:    j .LBB232_1
27993; RV32I-NEXT:  .LBB232_7: # %atomicrmw.end
27994; RV32I-NEXT:    mv a0, a4
27995; RV32I-NEXT:    mv a1, a5
27996; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
27997; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
27998; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
27999; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28000; RV32I-NEXT:    addi sp, sp, 32
28001; RV32I-NEXT:    ret
28002;
28003; RV32IA-LABEL: atomicrmw_umax_i64_release:
28004; RV32IA:       # %bb.0:
28005; RV32IA-NEXT:    addi sp, sp, -32
28006; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28007; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28008; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28009; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28010; RV32IA-NEXT:    mv s0, a2
28011; RV32IA-NEXT:    mv s1, a0
28012; RV32IA-NEXT:    lw a4, 0(a0)
28013; RV32IA-NEXT:    lw a5, 4(a0)
28014; RV32IA-NEXT:    mv s2, a1
28015; RV32IA-NEXT:    j .LBB232_2
28016; RV32IA-NEXT:  .LBB232_1: # %atomicrmw.start
28017; RV32IA-NEXT:    # in Loop: Header=BB232_2 Depth=1
28018; RV32IA-NEXT:    sw a4, 8(sp)
28019; RV32IA-NEXT:    sw a5, 12(sp)
28020; RV32IA-NEXT:    addi a1, sp, 8
28021; RV32IA-NEXT:    li a4, 3
28022; RV32IA-NEXT:    mv a0, s1
28023; RV32IA-NEXT:    li a5, 0
28024; RV32IA-NEXT:    call __atomic_compare_exchange_8
28025; RV32IA-NEXT:    lw a4, 8(sp)
28026; RV32IA-NEXT:    lw a5, 12(sp)
28027; RV32IA-NEXT:    bnez a0, .LBB232_7
28028; RV32IA-NEXT:  .LBB232_2: # %atomicrmw.start
28029; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
28030; RV32IA-NEXT:    beq a5, s0, .LBB232_4
28031; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
28032; RV32IA-NEXT:    # in Loop: Header=BB232_2 Depth=1
28033; RV32IA-NEXT:    sltu a0, s0, a5
28034; RV32IA-NEXT:    j .LBB232_5
28035; RV32IA-NEXT:  .LBB232_4: # in Loop: Header=BB232_2 Depth=1
28036; RV32IA-NEXT:    sltu a0, s2, a4
28037; RV32IA-NEXT:  .LBB232_5: # %atomicrmw.start
28038; RV32IA-NEXT:    # in Loop: Header=BB232_2 Depth=1
28039; RV32IA-NEXT:    mv a2, a4
28040; RV32IA-NEXT:    mv a3, a5
28041; RV32IA-NEXT:    bnez a0, .LBB232_1
28042; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
28043; RV32IA-NEXT:    # in Loop: Header=BB232_2 Depth=1
28044; RV32IA-NEXT:    mv a2, s2
28045; RV32IA-NEXT:    mv a3, s0
28046; RV32IA-NEXT:    j .LBB232_1
28047; RV32IA-NEXT:  .LBB232_7: # %atomicrmw.end
28048; RV32IA-NEXT:    mv a0, a4
28049; RV32IA-NEXT:    mv a1, a5
28050; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28051; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28052; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28053; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28054; RV32IA-NEXT:    addi sp, sp, 32
28055; RV32IA-NEXT:    ret
28056;
28057; RV64I-LABEL: atomicrmw_umax_i64_release:
28058; RV64I:       # %bb.0:
28059; RV64I-NEXT:    addi sp, sp, -32
28060; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
28061; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
28062; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
28063; RV64I-NEXT:    mv s0, a0
28064; RV64I-NEXT:    ld a3, 0(a0)
28065; RV64I-NEXT:    mv s1, a1
28066; RV64I-NEXT:    j .LBB232_2
28067; RV64I-NEXT:  .LBB232_1: # %atomicrmw.start
28068; RV64I-NEXT:    # in Loop: Header=BB232_2 Depth=1
28069; RV64I-NEXT:    sd a3, 0(sp)
28070; RV64I-NEXT:    mv a1, sp
28071; RV64I-NEXT:    li a3, 3
28072; RV64I-NEXT:    mv a0, s0
28073; RV64I-NEXT:    li a4, 0
28074; RV64I-NEXT:    call __atomic_compare_exchange_8
28075; RV64I-NEXT:    ld a3, 0(sp)
28076; RV64I-NEXT:    bnez a0, .LBB232_4
28077; RV64I-NEXT:  .LBB232_2: # %atomicrmw.start
28078; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
28079; RV64I-NEXT:    mv a2, a3
28080; RV64I-NEXT:    bltu s1, a3, .LBB232_1
28081; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
28082; RV64I-NEXT:    # in Loop: Header=BB232_2 Depth=1
28083; RV64I-NEXT:    mv a2, s1
28084; RV64I-NEXT:    j .LBB232_1
28085; RV64I-NEXT:  .LBB232_4: # %atomicrmw.end
28086; RV64I-NEXT:    mv a0, a3
28087; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
28088; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
28089; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
28090; RV64I-NEXT:    addi sp, sp, 32
28091; RV64I-NEXT:    ret
28092;
28093; RV64IA-WMO-LABEL: atomicrmw_umax_i64_release:
28094; RV64IA-WMO:       # %bb.0:
28095; RV64IA-WMO-NEXT:    amomaxu.d.rl a0, a1, (a0)
28096; RV64IA-WMO-NEXT:    ret
28097;
28098; RV64IA-TSO-LABEL: atomicrmw_umax_i64_release:
28099; RV64IA-TSO:       # %bb.0:
28100; RV64IA-TSO-NEXT:    amomaxu.d a0, a1, (a0)
28101; RV64IA-TSO-NEXT:    ret
28102  %1 = atomicrmw umax ptr %a, i64 %b release
28103  ret i64 %1
28104}
28105
28106define i64 @atomicrmw_umax_i64_acq_rel(ptr %a, i64 %b) nounwind {
28107; RV32I-LABEL: atomicrmw_umax_i64_acq_rel:
28108; RV32I:       # %bb.0:
28109; RV32I-NEXT:    addi sp, sp, -32
28110; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28111; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28112; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28113; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28114; RV32I-NEXT:    mv s0, a2
28115; RV32I-NEXT:    mv s1, a0
28116; RV32I-NEXT:    lw a4, 0(a0)
28117; RV32I-NEXT:    lw a5, 4(a0)
28118; RV32I-NEXT:    mv s2, a1
28119; RV32I-NEXT:    j .LBB233_2
28120; RV32I-NEXT:  .LBB233_1: # %atomicrmw.start
28121; RV32I-NEXT:    # in Loop: Header=BB233_2 Depth=1
28122; RV32I-NEXT:    sw a4, 8(sp)
28123; RV32I-NEXT:    sw a5, 12(sp)
28124; RV32I-NEXT:    addi a1, sp, 8
28125; RV32I-NEXT:    li a4, 4
28126; RV32I-NEXT:    li a5, 2
28127; RV32I-NEXT:    mv a0, s1
28128; RV32I-NEXT:    call __atomic_compare_exchange_8
28129; RV32I-NEXT:    lw a4, 8(sp)
28130; RV32I-NEXT:    lw a5, 12(sp)
28131; RV32I-NEXT:    bnez a0, .LBB233_7
28132; RV32I-NEXT:  .LBB233_2: # %atomicrmw.start
28133; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
28134; RV32I-NEXT:    beq a5, s0, .LBB233_4
28135; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
28136; RV32I-NEXT:    # in Loop: Header=BB233_2 Depth=1
28137; RV32I-NEXT:    sltu a0, s0, a5
28138; RV32I-NEXT:    j .LBB233_5
28139; RV32I-NEXT:  .LBB233_4: # in Loop: Header=BB233_2 Depth=1
28140; RV32I-NEXT:    sltu a0, s2, a4
28141; RV32I-NEXT:  .LBB233_5: # %atomicrmw.start
28142; RV32I-NEXT:    # in Loop: Header=BB233_2 Depth=1
28143; RV32I-NEXT:    mv a2, a4
28144; RV32I-NEXT:    mv a3, a5
28145; RV32I-NEXT:    bnez a0, .LBB233_1
28146; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
28147; RV32I-NEXT:    # in Loop: Header=BB233_2 Depth=1
28148; RV32I-NEXT:    mv a2, s2
28149; RV32I-NEXT:    mv a3, s0
28150; RV32I-NEXT:    j .LBB233_1
28151; RV32I-NEXT:  .LBB233_7: # %atomicrmw.end
28152; RV32I-NEXT:    mv a0, a4
28153; RV32I-NEXT:    mv a1, a5
28154; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28155; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28156; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28157; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28158; RV32I-NEXT:    addi sp, sp, 32
28159; RV32I-NEXT:    ret
28160;
28161; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel:
28162; RV32IA:       # %bb.0:
28163; RV32IA-NEXT:    addi sp, sp, -32
28164; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28165; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28166; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28167; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28168; RV32IA-NEXT:    mv s0, a2
28169; RV32IA-NEXT:    mv s1, a0
28170; RV32IA-NEXT:    lw a4, 0(a0)
28171; RV32IA-NEXT:    lw a5, 4(a0)
28172; RV32IA-NEXT:    mv s2, a1
28173; RV32IA-NEXT:    j .LBB233_2
28174; RV32IA-NEXT:  .LBB233_1: # %atomicrmw.start
28175; RV32IA-NEXT:    # in Loop: Header=BB233_2 Depth=1
28176; RV32IA-NEXT:    sw a4, 8(sp)
28177; RV32IA-NEXT:    sw a5, 12(sp)
28178; RV32IA-NEXT:    addi a1, sp, 8
28179; RV32IA-NEXT:    li a4, 4
28180; RV32IA-NEXT:    li a5, 2
28181; RV32IA-NEXT:    mv a0, s1
28182; RV32IA-NEXT:    call __atomic_compare_exchange_8
28183; RV32IA-NEXT:    lw a4, 8(sp)
28184; RV32IA-NEXT:    lw a5, 12(sp)
28185; RV32IA-NEXT:    bnez a0, .LBB233_7
28186; RV32IA-NEXT:  .LBB233_2: # %atomicrmw.start
28187; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
28188; RV32IA-NEXT:    beq a5, s0, .LBB233_4
28189; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
28190; RV32IA-NEXT:    # in Loop: Header=BB233_2 Depth=1
28191; RV32IA-NEXT:    sltu a0, s0, a5
28192; RV32IA-NEXT:    j .LBB233_5
28193; RV32IA-NEXT:  .LBB233_4: # in Loop: Header=BB233_2 Depth=1
28194; RV32IA-NEXT:    sltu a0, s2, a4
28195; RV32IA-NEXT:  .LBB233_5: # %atomicrmw.start
28196; RV32IA-NEXT:    # in Loop: Header=BB233_2 Depth=1
28197; RV32IA-NEXT:    mv a2, a4
28198; RV32IA-NEXT:    mv a3, a5
28199; RV32IA-NEXT:    bnez a0, .LBB233_1
28200; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
28201; RV32IA-NEXT:    # in Loop: Header=BB233_2 Depth=1
28202; RV32IA-NEXT:    mv a2, s2
28203; RV32IA-NEXT:    mv a3, s0
28204; RV32IA-NEXT:    j .LBB233_1
28205; RV32IA-NEXT:  .LBB233_7: # %atomicrmw.end
28206; RV32IA-NEXT:    mv a0, a4
28207; RV32IA-NEXT:    mv a1, a5
28208; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28209; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28210; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28211; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28212; RV32IA-NEXT:    addi sp, sp, 32
28213; RV32IA-NEXT:    ret
28214;
28215; RV64I-LABEL: atomicrmw_umax_i64_acq_rel:
28216; RV64I:       # %bb.0:
28217; RV64I-NEXT:    addi sp, sp, -32
28218; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
28219; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
28220; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
28221; RV64I-NEXT:    mv s0, a0
28222; RV64I-NEXT:    ld a3, 0(a0)
28223; RV64I-NEXT:    mv s1, a1
28224; RV64I-NEXT:    j .LBB233_2
28225; RV64I-NEXT:  .LBB233_1: # %atomicrmw.start
28226; RV64I-NEXT:    # in Loop: Header=BB233_2 Depth=1
28227; RV64I-NEXT:    sd a3, 0(sp)
28228; RV64I-NEXT:    mv a1, sp
28229; RV64I-NEXT:    li a3, 4
28230; RV64I-NEXT:    li a4, 2
28231; RV64I-NEXT:    mv a0, s0
28232; RV64I-NEXT:    call __atomic_compare_exchange_8
28233; RV64I-NEXT:    ld a3, 0(sp)
28234; RV64I-NEXT:    bnez a0, .LBB233_4
28235; RV64I-NEXT:  .LBB233_2: # %atomicrmw.start
28236; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
28237; RV64I-NEXT:    mv a2, a3
28238; RV64I-NEXT:    bltu s1, a3, .LBB233_1
28239; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
28240; RV64I-NEXT:    # in Loop: Header=BB233_2 Depth=1
28241; RV64I-NEXT:    mv a2, s1
28242; RV64I-NEXT:    j .LBB233_1
28243; RV64I-NEXT:  .LBB233_4: # %atomicrmw.end
28244; RV64I-NEXT:    mv a0, a3
28245; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
28246; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
28247; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
28248; RV64I-NEXT:    addi sp, sp, 32
28249; RV64I-NEXT:    ret
28250;
28251; RV64IA-WMO-LABEL: atomicrmw_umax_i64_acq_rel:
28252; RV64IA-WMO:       # %bb.0:
28253; RV64IA-WMO-NEXT:    amomaxu.d.aqrl a0, a1, (a0)
28254; RV64IA-WMO-NEXT:    ret
28255;
28256; RV64IA-TSO-LABEL: atomicrmw_umax_i64_acq_rel:
28257; RV64IA-TSO:       # %bb.0:
28258; RV64IA-TSO-NEXT:    amomaxu.d a0, a1, (a0)
28259; RV64IA-TSO-NEXT:    ret
28260  %1 = atomicrmw umax ptr %a, i64 %b acq_rel
28261  ret i64 %1
28262}
28263
28264define i64 @atomicrmw_umax_i64_seq_cst(ptr %a, i64 %b) nounwind {
28265; RV32I-LABEL: atomicrmw_umax_i64_seq_cst:
28266; RV32I:       # %bb.0:
28267; RV32I-NEXT:    addi sp, sp, -32
28268; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28269; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28270; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28271; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28272; RV32I-NEXT:    mv s0, a2
28273; RV32I-NEXT:    mv s1, a0
28274; RV32I-NEXT:    lw a4, 0(a0)
28275; RV32I-NEXT:    lw a5, 4(a0)
28276; RV32I-NEXT:    mv s2, a1
28277; RV32I-NEXT:    j .LBB234_2
28278; RV32I-NEXT:  .LBB234_1: # %atomicrmw.start
28279; RV32I-NEXT:    # in Loop: Header=BB234_2 Depth=1
28280; RV32I-NEXT:    sw a4, 8(sp)
28281; RV32I-NEXT:    sw a5, 12(sp)
28282; RV32I-NEXT:    addi a1, sp, 8
28283; RV32I-NEXT:    li a4, 5
28284; RV32I-NEXT:    li a5, 5
28285; RV32I-NEXT:    mv a0, s1
28286; RV32I-NEXT:    call __atomic_compare_exchange_8
28287; RV32I-NEXT:    lw a4, 8(sp)
28288; RV32I-NEXT:    lw a5, 12(sp)
28289; RV32I-NEXT:    bnez a0, .LBB234_7
28290; RV32I-NEXT:  .LBB234_2: # %atomicrmw.start
28291; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
28292; RV32I-NEXT:    beq a5, s0, .LBB234_4
28293; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
28294; RV32I-NEXT:    # in Loop: Header=BB234_2 Depth=1
28295; RV32I-NEXT:    sltu a0, s0, a5
28296; RV32I-NEXT:    j .LBB234_5
28297; RV32I-NEXT:  .LBB234_4: # in Loop: Header=BB234_2 Depth=1
28298; RV32I-NEXT:    sltu a0, s2, a4
28299; RV32I-NEXT:  .LBB234_5: # %atomicrmw.start
28300; RV32I-NEXT:    # in Loop: Header=BB234_2 Depth=1
28301; RV32I-NEXT:    mv a2, a4
28302; RV32I-NEXT:    mv a3, a5
28303; RV32I-NEXT:    bnez a0, .LBB234_1
28304; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
28305; RV32I-NEXT:    # in Loop: Header=BB234_2 Depth=1
28306; RV32I-NEXT:    mv a2, s2
28307; RV32I-NEXT:    mv a3, s0
28308; RV32I-NEXT:    j .LBB234_1
28309; RV32I-NEXT:  .LBB234_7: # %atomicrmw.end
28310; RV32I-NEXT:    mv a0, a4
28311; RV32I-NEXT:    mv a1, a5
28312; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28313; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28314; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28315; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28316; RV32I-NEXT:    addi sp, sp, 32
28317; RV32I-NEXT:    ret
28318;
28319; RV32IA-LABEL: atomicrmw_umax_i64_seq_cst:
28320; RV32IA:       # %bb.0:
28321; RV32IA-NEXT:    addi sp, sp, -32
28322; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28323; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28324; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28325; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28326; RV32IA-NEXT:    mv s0, a2
28327; RV32IA-NEXT:    mv s1, a0
28328; RV32IA-NEXT:    lw a4, 0(a0)
28329; RV32IA-NEXT:    lw a5, 4(a0)
28330; RV32IA-NEXT:    mv s2, a1
28331; RV32IA-NEXT:    j .LBB234_2
28332; RV32IA-NEXT:  .LBB234_1: # %atomicrmw.start
28333; RV32IA-NEXT:    # in Loop: Header=BB234_2 Depth=1
28334; RV32IA-NEXT:    sw a4, 8(sp)
28335; RV32IA-NEXT:    sw a5, 12(sp)
28336; RV32IA-NEXT:    addi a1, sp, 8
28337; RV32IA-NEXT:    li a4, 5
28338; RV32IA-NEXT:    li a5, 5
28339; RV32IA-NEXT:    mv a0, s1
28340; RV32IA-NEXT:    call __atomic_compare_exchange_8
28341; RV32IA-NEXT:    lw a4, 8(sp)
28342; RV32IA-NEXT:    lw a5, 12(sp)
28343; RV32IA-NEXT:    bnez a0, .LBB234_7
28344; RV32IA-NEXT:  .LBB234_2: # %atomicrmw.start
28345; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
28346; RV32IA-NEXT:    beq a5, s0, .LBB234_4
28347; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
28348; RV32IA-NEXT:    # in Loop: Header=BB234_2 Depth=1
28349; RV32IA-NEXT:    sltu a0, s0, a5
28350; RV32IA-NEXT:    j .LBB234_5
28351; RV32IA-NEXT:  .LBB234_4: # in Loop: Header=BB234_2 Depth=1
28352; RV32IA-NEXT:    sltu a0, s2, a4
28353; RV32IA-NEXT:  .LBB234_5: # %atomicrmw.start
28354; RV32IA-NEXT:    # in Loop: Header=BB234_2 Depth=1
28355; RV32IA-NEXT:    mv a2, a4
28356; RV32IA-NEXT:    mv a3, a5
28357; RV32IA-NEXT:    bnez a0, .LBB234_1
28358; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
28359; RV32IA-NEXT:    # in Loop: Header=BB234_2 Depth=1
28360; RV32IA-NEXT:    mv a2, s2
28361; RV32IA-NEXT:    mv a3, s0
28362; RV32IA-NEXT:    j .LBB234_1
28363; RV32IA-NEXT:  .LBB234_7: # %atomicrmw.end
28364; RV32IA-NEXT:    mv a0, a4
28365; RV32IA-NEXT:    mv a1, a5
28366; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28367; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28368; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28369; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28370; RV32IA-NEXT:    addi sp, sp, 32
28371; RV32IA-NEXT:    ret
28372;
28373; RV64I-LABEL: atomicrmw_umax_i64_seq_cst:
28374; RV64I:       # %bb.0:
28375; RV64I-NEXT:    addi sp, sp, -32
28376; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
28377; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
28378; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
28379; RV64I-NEXT:    mv s0, a0
28380; RV64I-NEXT:    ld a3, 0(a0)
28381; RV64I-NEXT:    mv s1, a1
28382; RV64I-NEXT:    j .LBB234_2
28383; RV64I-NEXT:  .LBB234_1: # %atomicrmw.start
28384; RV64I-NEXT:    # in Loop: Header=BB234_2 Depth=1
28385; RV64I-NEXT:    sd a3, 0(sp)
28386; RV64I-NEXT:    mv a1, sp
28387; RV64I-NEXT:    li a3, 5
28388; RV64I-NEXT:    li a4, 5
28389; RV64I-NEXT:    mv a0, s0
28390; RV64I-NEXT:    call __atomic_compare_exchange_8
28391; RV64I-NEXT:    ld a3, 0(sp)
28392; RV64I-NEXT:    bnez a0, .LBB234_4
28393; RV64I-NEXT:  .LBB234_2: # %atomicrmw.start
28394; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
28395; RV64I-NEXT:    mv a2, a3
28396; RV64I-NEXT:    bltu s1, a3, .LBB234_1
28397; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
28398; RV64I-NEXT:    # in Loop: Header=BB234_2 Depth=1
28399; RV64I-NEXT:    mv a2, s1
28400; RV64I-NEXT:    j .LBB234_1
28401; RV64I-NEXT:  .LBB234_4: # %atomicrmw.end
28402; RV64I-NEXT:    mv a0, a3
28403; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
28404; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
28405; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
28406; RV64I-NEXT:    addi sp, sp, 32
28407; RV64I-NEXT:    ret
28408;
28409; RV64IA-WMO-LABEL: atomicrmw_umax_i64_seq_cst:
28410; RV64IA-WMO:       # %bb.0:
28411; RV64IA-WMO-NEXT:    amomaxu.d.aqrl a0, a1, (a0)
28412; RV64IA-WMO-NEXT:    ret
28413;
28414; RV64IA-TSO-LABEL: atomicrmw_umax_i64_seq_cst:
28415; RV64IA-TSO:       # %bb.0:
28416; RV64IA-TSO-NEXT:    amomaxu.d a0, a1, (a0)
28417; RV64IA-TSO-NEXT:    ret
28418  %1 = atomicrmw umax ptr %a, i64 %b seq_cst
28419  ret i64 %1
28420}
28421
28422define i64 @atomicrmw_umin_i64_monotonic(ptr %a, i64 %b) nounwind {
28423; RV32I-LABEL: atomicrmw_umin_i64_monotonic:
28424; RV32I:       # %bb.0:
28425; RV32I-NEXT:    addi sp, sp, -32
28426; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28427; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28428; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28429; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28430; RV32I-NEXT:    mv s0, a2
28431; RV32I-NEXT:    mv s1, a0
28432; RV32I-NEXT:    lw a4, 0(a0)
28433; RV32I-NEXT:    lw a5, 4(a0)
28434; RV32I-NEXT:    mv s2, a1
28435; RV32I-NEXT:    j .LBB235_2
28436; RV32I-NEXT:  .LBB235_1: # %atomicrmw.start
28437; RV32I-NEXT:    # in Loop: Header=BB235_2 Depth=1
28438; RV32I-NEXT:    sw a4, 8(sp)
28439; RV32I-NEXT:    sw a5, 12(sp)
28440; RV32I-NEXT:    addi a1, sp, 8
28441; RV32I-NEXT:    mv a0, s1
28442; RV32I-NEXT:    li a4, 0
28443; RV32I-NEXT:    li a5, 0
28444; RV32I-NEXT:    call __atomic_compare_exchange_8
28445; RV32I-NEXT:    lw a4, 8(sp)
28446; RV32I-NEXT:    lw a5, 12(sp)
28447; RV32I-NEXT:    bnez a0, .LBB235_7
28448; RV32I-NEXT:  .LBB235_2: # %atomicrmw.start
28449; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
28450; RV32I-NEXT:    beq a5, s0, .LBB235_4
28451; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
28452; RV32I-NEXT:    # in Loop: Header=BB235_2 Depth=1
28453; RV32I-NEXT:    sltu a0, s0, a5
28454; RV32I-NEXT:    j .LBB235_5
28455; RV32I-NEXT:  .LBB235_4: # in Loop: Header=BB235_2 Depth=1
28456; RV32I-NEXT:    sltu a0, s2, a4
28457; RV32I-NEXT:  .LBB235_5: # %atomicrmw.start
28458; RV32I-NEXT:    # in Loop: Header=BB235_2 Depth=1
28459; RV32I-NEXT:    mv a2, a4
28460; RV32I-NEXT:    mv a3, a5
28461; RV32I-NEXT:    beqz a0, .LBB235_1
28462; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
28463; RV32I-NEXT:    # in Loop: Header=BB235_2 Depth=1
28464; RV32I-NEXT:    mv a2, s2
28465; RV32I-NEXT:    mv a3, s0
28466; RV32I-NEXT:    j .LBB235_1
28467; RV32I-NEXT:  .LBB235_7: # %atomicrmw.end
28468; RV32I-NEXT:    mv a0, a4
28469; RV32I-NEXT:    mv a1, a5
28470; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28471; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28472; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28473; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28474; RV32I-NEXT:    addi sp, sp, 32
28475; RV32I-NEXT:    ret
28476;
28477; RV32IA-LABEL: atomicrmw_umin_i64_monotonic:
28478; RV32IA:       # %bb.0:
28479; RV32IA-NEXT:    addi sp, sp, -32
28480; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28481; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28482; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28483; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28484; RV32IA-NEXT:    mv s0, a2
28485; RV32IA-NEXT:    mv s1, a0
28486; RV32IA-NEXT:    lw a4, 0(a0)
28487; RV32IA-NEXT:    lw a5, 4(a0)
28488; RV32IA-NEXT:    mv s2, a1
28489; RV32IA-NEXT:    j .LBB235_2
28490; RV32IA-NEXT:  .LBB235_1: # %atomicrmw.start
28491; RV32IA-NEXT:    # in Loop: Header=BB235_2 Depth=1
28492; RV32IA-NEXT:    sw a4, 8(sp)
28493; RV32IA-NEXT:    sw a5, 12(sp)
28494; RV32IA-NEXT:    addi a1, sp, 8
28495; RV32IA-NEXT:    mv a0, s1
28496; RV32IA-NEXT:    li a4, 0
28497; RV32IA-NEXT:    li a5, 0
28498; RV32IA-NEXT:    call __atomic_compare_exchange_8
28499; RV32IA-NEXT:    lw a4, 8(sp)
28500; RV32IA-NEXT:    lw a5, 12(sp)
28501; RV32IA-NEXT:    bnez a0, .LBB235_7
28502; RV32IA-NEXT:  .LBB235_2: # %atomicrmw.start
28503; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
28504; RV32IA-NEXT:    beq a5, s0, .LBB235_4
28505; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
28506; RV32IA-NEXT:    # in Loop: Header=BB235_2 Depth=1
28507; RV32IA-NEXT:    sltu a0, s0, a5
28508; RV32IA-NEXT:    j .LBB235_5
28509; RV32IA-NEXT:  .LBB235_4: # in Loop: Header=BB235_2 Depth=1
28510; RV32IA-NEXT:    sltu a0, s2, a4
28511; RV32IA-NEXT:  .LBB235_5: # %atomicrmw.start
28512; RV32IA-NEXT:    # in Loop: Header=BB235_2 Depth=1
28513; RV32IA-NEXT:    mv a2, a4
28514; RV32IA-NEXT:    mv a3, a5
28515; RV32IA-NEXT:    beqz a0, .LBB235_1
28516; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
28517; RV32IA-NEXT:    # in Loop: Header=BB235_2 Depth=1
28518; RV32IA-NEXT:    mv a2, s2
28519; RV32IA-NEXT:    mv a3, s0
28520; RV32IA-NEXT:    j .LBB235_1
28521; RV32IA-NEXT:  .LBB235_7: # %atomicrmw.end
28522; RV32IA-NEXT:    mv a0, a4
28523; RV32IA-NEXT:    mv a1, a5
28524; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28525; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28526; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28527; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28528; RV32IA-NEXT:    addi sp, sp, 32
28529; RV32IA-NEXT:    ret
28530;
28531; RV64I-LABEL: atomicrmw_umin_i64_monotonic:
28532; RV64I:       # %bb.0:
28533; RV64I-NEXT:    addi sp, sp, -32
28534; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
28535; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
28536; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
28537; RV64I-NEXT:    mv s0, a0
28538; RV64I-NEXT:    ld a3, 0(a0)
28539; RV64I-NEXT:    mv s1, a1
28540; RV64I-NEXT:    j .LBB235_2
28541; RV64I-NEXT:  .LBB235_1: # %atomicrmw.start
28542; RV64I-NEXT:    # in Loop: Header=BB235_2 Depth=1
28543; RV64I-NEXT:    sd a3, 0(sp)
28544; RV64I-NEXT:    mv a1, sp
28545; RV64I-NEXT:    mv a0, s0
28546; RV64I-NEXT:    li a3, 0
28547; RV64I-NEXT:    li a4, 0
28548; RV64I-NEXT:    call __atomic_compare_exchange_8
28549; RV64I-NEXT:    ld a3, 0(sp)
28550; RV64I-NEXT:    bnez a0, .LBB235_4
28551; RV64I-NEXT:  .LBB235_2: # %atomicrmw.start
28552; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
28553; RV64I-NEXT:    mv a2, a3
28554; RV64I-NEXT:    bgeu s1, a3, .LBB235_1
28555; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
28556; RV64I-NEXT:    # in Loop: Header=BB235_2 Depth=1
28557; RV64I-NEXT:    mv a2, s1
28558; RV64I-NEXT:    j .LBB235_1
28559; RV64I-NEXT:  .LBB235_4: # %atomicrmw.end
28560; RV64I-NEXT:    mv a0, a3
28561; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
28562; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
28563; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
28564; RV64I-NEXT:    addi sp, sp, 32
28565; RV64I-NEXT:    ret
28566;
28567; RV64IA-LABEL: atomicrmw_umin_i64_monotonic:
28568; RV64IA:       # %bb.0:
28569; RV64IA-NEXT:    amominu.d a0, a1, (a0)
28570; RV64IA-NEXT:    ret
28571  %1 = atomicrmw umin ptr %a, i64 %b monotonic
28572  ret i64 %1
28573}
28574
28575define i64 @atomicrmw_umin_i64_acquire(ptr %a, i64 %b) nounwind {
28576; RV32I-LABEL: atomicrmw_umin_i64_acquire:
28577; RV32I:       # %bb.0:
28578; RV32I-NEXT:    addi sp, sp, -32
28579; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28580; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28581; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28582; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28583; RV32I-NEXT:    mv s0, a2
28584; RV32I-NEXT:    mv s1, a0
28585; RV32I-NEXT:    lw a4, 0(a0)
28586; RV32I-NEXT:    lw a5, 4(a0)
28587; RV32I-NEXT:    mv s2, a1
28588; RV32I-NEXT:    j .LBB236_2
28589; RV32I-NEXT:  .LBB236_1: # %atomicrmw.start
28590; RV32I-NEXT:    # in Loop: Header=BB236_2 Depth=1
28591; RV32I-NEXT:    sw a4, 8(sp)
28592; RV32I-NEXT:    sw a5, 12(sp)
28593; RV32I-NEXT:    addi a1, sp, 8
28594; RV32I-NEXT:    li a4, 2
28595; RV32I-NEXT:    li a5, 2
28596; RV32I-NEXT:    mv a0, s1
28597; RV32I-NEXT:    call __atomic_compare_exchange_8
28598; RV32I-NEXT:    lw a4, 8(sp)
28599; RV32I-NEXT:    lw a5, 12(sp)
28600; RV32I-NEXT:    bnez a0, .LBB236_7
28601; RV32I-NEXT:  .LBB236_2: # %atomicrmw.start
28602; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
28603; RV32I-NEXT:    beq a5, s0, .LBB236_4
28604; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
28605; RV32I-NEXT:    # in Loop: Header=BB236_2 Depth=1
28606; RV32I-NEXT:    sltu a0, s0, a5
28607; RV32I-NEXT:    j .LBB236_5
28608; RV32I-NEXT:  .LBB236_4: # in Loop: Header=BB236_2 Depth=1
28609; RV32I-NEXT:    sltu a0, s2, a4
28610; RV32I-NEXT:  .LBB236_5: # %atomicrmw.start
28611; RV32I-NEXT:    # in Loop: Header=BB236_2 Depth=1
28612; RV32I-NEXT:    mv a2, a4
28613; RV32I-NEXT:    mv a3, a5
28614; RV32I-NEXT:    beqz a0, .LBB236_1
28615; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
28616; RV32I-NEXT:    # in Loop: Header=BB236_2 Depth=1
28617; RV32I-NEXT:    mv a2, s2
28618; RV32I-NEXT:    mv a3, s0
28619; RV32I-NEXT:    j .LBB236_1
28620; RV32I-NEXT:  .LBB236_7: # %atomicrmw.end
28621; RV32I-NEXT:    mv a0, a4
28622; RV32I-NEXT:    mv a1, a5
28623; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28624; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28625; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28626; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28627; RV32I-NEXT:    addi sp, sp, 32
28628; RV32I-NEXT:    ret
28629;
28630; RV32IA-LABEL: atomicrmw_umin_i64_acquire:
28631; RV32IA:       # %bb.0:
28632; RV32IA-NEXT:    addi sp, sp, -32
28633; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28634; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28635; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28636; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28637; RV32IA-NEXT:    mv s0, a2
28638; RV32IA-NEXT:    mv s1, a0
28639; RV32IA-NEXT:    lw a4, 0(a0)
28640; RV32IA-NEXT:    lw a5, 4(a0)
28641; RV32IA-NEXT:    mv s2, a1
28642; RV32IA-NEXT:    j .LBB236_2
28643; RV32IA-NEXT:  .LBB236_1: # %atomicrmw.start
28644; RV32IA-NEXT:    # in Loop: Header=BB236_2 Depth=1
28645; RV32IA-NEXT:    sw a4, 8(sp)
28646; RV32IA-NEXT:    sw a5, 12(sp)
28647; RV32IA-NEXT:    addi a1, sp, 8
28648; RV32IA-NEXT:    li a4, 2
28649; RV32IA-NEXT:    li a5, 2
28650; RV32IA-NEXT:    mv a0, s1
28651; RV32IA-NEXT:    call __atomic_compare_exchange_8
28652; RV32IA-NEXT:    lw a4, 8(sp)
28653; RV32IA-NEXT:    lw a5, 12(sp)
28654; RV32IA-NEXT:    bnez a0, .LBB236_7
28655; RV32IA-NEXT:  .LBB236_2: # %atomicrmw.start
28656; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
28657; RV32IA-NEXT:    beq a5, s0, .LBB236_4
28658; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
28659; RV32IA-NEXT:    # in Loop: Header=BB236_2 Depth=1
28660; RV32IA-NEXT:    sltu a0, s0, a5
28661; RV32IA-NEXT:    j .LBB236_5
28662; RV32IA-NEXT:  .LBB236_4: # in Loop: Header=BB236_2 Depth=1
28663; RV32IA-NEXT:    sltu a0, s2, a4
28664; RV32IA-NEXT:  .LBB236_5: # %atomicrmw.start
28665; RV32IA-NEXT:    # in Loop: Header=BB236_2 Depth=1
28666; RV32IA-NEXT:    mv a2, a4
28667; RV32IA-NEXT:    mv a3, a5
28668; RV32IA-NEXT:    beqz a0, .LBB236_1
28669; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
28670; RV32IA-NEXT:    # in Loop: Header=BB236_2 Depth=1
28671; RV32IA-NEXT:    mv a2, s2
28672; RV32IA-NEXT:    mv a3, s0
28673; RV32IA-NEXT:    j .LBB236_1
28674; RV32IA-NEXT:  .LBB236_7: # %atomicrmw.end
28675; RV32IA-NEXT:    mv a0, a4
28676; RV32IA-NEXT:    mv a1, a5
28677; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28678; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28679; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28680; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28681; RV32IA-NEXT:    addi sp, sp, 32
28682; RV32IA-NEXT:    ret
28683;
28684; RV64I-LABEL: atomicrmw_umin_i64_acquire:
28685; RV64I:       # %bb.0:
28686; RV64I-NEXT:    addi sp, sp, -32
28687; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
28688; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
28689; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
28690; RV64I-NEXT:    mv s0, a0
28691; RV64I-NEXT:    ld a3, 0(a0)
28692; RV64I-NEXT:    mv s1, a1
28693; RV64I-NEXT:    j .LBB236_2
28694; RV64I-NEXT:  .LBB236_1: # %atomicrmw.start
28695; RV64I-NEXT:    # in Loop: Header=BB236_2 Depth=1
28696; RV64I-NEXT:    sd a3, 0(sp)
28697; RV64I-NEXT:    mv a1, sp
28698; RV64I-NEXT:    li a3, 2
28699; RV64I-NEXT:    li a4, 2
28700; RV64I-NEXT:    mv a0, s0
28701; RV64I-NEXT:    call __atomic_compare_exchange_8
28702; RV64I-NEXT:    ld a3, 0(sp)
28703; RV64I-NEXT:    bnez a0, .LBB236_4
28704; RV64I-NEXT:  .LBB236_2: # %atomicrmw.start
28705; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
28706; RV64I-NEXT:    mv a2, a3
28707; RV64I-NEXT:    bgeu s1, a3, .LBB236_1
28708; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
28709; RV64I-NEXT:    # in Loop: Header=BB236_2 Depth=1
28710; RV64I-NEXT:    mv a2, s1
28711; RV64I-NEXT:    j .LBB236_1
28712; RV64I-NEXT:  .LBB236_4: # %atomicrmw.end
28713; RV64I-NEXT:    mv a0, a3
28714; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
28715; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
28716; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
28717; RV64I-NEXT:    addi sp, sp, 32
28718; RV64I-NEXT:    ret
28719;
28720; RV64IA-WMO-LABEL: atomicrmw_umin_i64_acquire:
28721; RV64IA-WMO:       # %bb.0:
28722; RV64IA-WMO-NEXT:    amominu.d.aq a0, a1, (a0)
28723; RV64IA-WMO-NEXT:    ret
28724;
28725; RV64IA-TSO-LABEL: atomicrmw_umin_i64_acquire:
28726; RV64IA-TSO:       # %bb.0:
28727; RV64IA-TSO-NEXT:    amominu.d a0, a1, (a0)
28728; RV64IA-TSO-NEXT:    ret
28729  %1 = atomicrmw umin ptr %a, i64 %b acquire
28730  ret i64 %1
28731}
28732
28733define i64 @atomicrmw_umin_i64_release(ptr %a, i64 %b) nounwind {
28734; RV32I-LABEL: atomicrmw_umin_i64_release:
28735; RV32I:       # %bb.0:
28736; RV32I-NEXT:    addi sp, sp, -32
28737; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28738; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28739; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28740; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28741; RV32I-NEXT:    mv s0, a2
28742; RV32I-NEXT:    mv s1, a0
28743; RV32I-NEXT:    lw a4, 0(a0)
28744; RV32I-NEXT:    lw a5, 4(a0)
28745; RV32I-NEXT:    mv s2, a1
28746; RV32I-NEXT:    j .LBB237_2
28747; RV32I-NEXT:  .LBB237_1: # %atomicrmw.start
28748; RV32I-NEXT:    # in Loop: Header=BB237_2 Depth=1
28749; RV32I-NEXT:    sw a4, 8(sp)
28750; RV32I-NEXT:    sw a5, 12(sp)
28751; RV32I-NEXT:    addi a1, sp, 8
28752; RV32I-NEXT:    li a4, 3
28753; RV32I-NEXT:    mv a0, s1
28754; RV32I-NEXT:    li a5, 0
28755; RV32I-NEXT:    call __atomic_compare_exchange_8
28756; RV32I-NEXT:    lw a4, 8(sp)
28757; RV32I-NEXT:    lw a5, 12(sp)
28758; RV32I-NEXT:    bnez a0, .LBB237_7
28759; RV32I-NEXT:  .LBB237_2: # %atomicrmw.start
28760; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
28761; RV32I-NEXT:    beq a5, s0, .LBB237_4
28762; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
28763; RV32I-NEXT:    # in Loop: Header=BB237_2 Depth=1
28764; RV32I-NEXT:    sltu a0, s0, a5
28765; RV32I-NEXT:    j .LBB237_5
28766; RV32I-NEXT:  .LBB237_4: # in Loop: Header=BB237_2 Depth=1
28767; RV32I-NEXT:    sltu a0, s2, a4
28768; RV32I-NEXT:  .LBB237_5: # %atomicrmw.start
28769; RV32I-NEXT:    # in Loop: Header=BB237_2 Depth=1
28770; RV32I-NEXT:    mv a2, a4
28771; RV32I-NEXT:    mv a3, a5
28772; RV32I-NEXT:    beqz a0, .LBB237_1
28773; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
28774; RV32I-NEXT:    # in Loop: Header=BB237_2 Depth=1
28775; RV32I-NEXT:    mv a2, s2
28776; RV32I-NEXT:    mv a3, s0
28777; RV32I-NEXT:    j .LBB237_1
28778; RV32I-NEXT:  .LBB237_7: # %atomicrmw.end
28779; RV32I-NEXT:    mv a0, a4
28780; RV32I-NEXT:    mv a1, a5
28781; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28782; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28783; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28784; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28785; RV32I-NEXT:    addi sp, sp, 32
28786; RV32I-NEXT:    ret
28787;
28788; RV32IA-LABEL: atomicrmw_umin_i64_release:
28789; RV32IA:       # %bb.0:
28790; RV32IA-NEXT:    addi sp, sp, -32
28791; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28792; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28793; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28794; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28795; RV32IA-NEXT:    mv s0, a2
28796; RV32IA-NEXT:    mv s1, a0
28797; RV32IA-NEXT:    lw a4, 0(a0)
28798; RV32IA-NEXT:    lw a5, 4(a0)
28799; RV32IA-NEXT:    mv s2, a1
28800; RV32IA-NEXT:    j .LBB237_2
28801; RV32IA-NEXT:  .LBB237_1: # %atomicrmw.start
28802; RV32IA-NEXT:    # in Loop: Header=BB237_2 Depth=1
28803; RV32IA-NEXT:    sw a4, 8(sp)
28804; RV32IA-NEXT:    sw a5, 12(sp)
28805; RV32IA-NEXT:    addi a1, sp, 8
28806; RV32IA-NEXT:    li a4, 3
28807; RV32IA-NEXT:    mv a0, s1
28808; RV32IA-NEXT:    li a5, 0
28809; RV32IA-NEXT:    call __atomic_compare_exchange_8
28810; RV32IA-NEXT:    lw a4, 8(sp)
28811; RV32IA-NEXT:    lw a5, 12(sp)
28812; RV32IA-NEXT:    bnez a0, .LBB237_7
28813; RV32IA-NEXT:  .LBB237_2: # %atomicrmw.start
28814; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
28815; RV32IA-NEXT:    beq a5, s0, .LBB237_4
28816; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
28817; RV32IA-NEXT:    # in Loop: Header=BB237_2 Depth=1
28818; RV32IA-NEXT:    sltu a0, s0, a5
28819; RV32IA-NEXT:    j .LBB237_5
28820; RV32IA-NEXT:  .LBB237_4: # in Loop: Header=BB237_2 Depth=1
28821; RV32IA-NEXT:    sltu a0, s2, a4
28822; RV32IA-NEXT:  .LBB237_5: # %atomicrmw.start
28823; RV32IA-NEXT:    # in Loop: Header=BB237_2 Depth=1
28824; RV32IA-NEXT:    mv a2, a4
28825; RV32IA-NEXT:    mv a3, a5
28826; RV32IA-NEXT:    beqz a0, .LBB237_1
28827; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
28828; RV32IA-NEXT:    # in Loop: Header=BB237_2 Depth=1
28829; RV32IA-NEXT:    mv a2, s2
28830; RV32IA-NEXT:    mv a3, s0
28831; RV32IA-NEXT:    j .LBB237_1
28832; RV32IA-NEXT:  .LBB237_7: # %atomicrmw.end
28833; RV32IA-NEXT:    mv a0, a4
28834; RV32IA-NEXT:    mv a1, a5
28835; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28836; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28837; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28838; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28839; RV32IA-NEXT:    addi sp, sp, 32
28840; RV32IA-NEXT:    ret
28841;
28842; RV64I-LABEL: atomicrmw_umin_i64_release:
28843; RV64I:       # %bb.0:
28844; RV64I-NEXT:    addi sp, sp, -32
28845; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
28846; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
28847; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
28848; RV64I-NEXT:    mv s0, a0
28849; RV64I-NEXT:    ld a3, 0(a0)
28850; RV64I-NEXT:    mv s1, a1
28851; RV64I-NEXT:    j .LBB237_2
28852; RV64I-NEXT:  .LBB237_1: # %atomicrmw.start
28853; RV64I-NEXT:    # in Loop: Header=BB237_2 Depth=1
28854; RV64I-NEXT:    sd a3, 0(sp)
28855; RV64I-NEXT:    mv a1, sp
28856; RV64I-NEXT:    li a3, 3
28857; RV64I-NEXT:    mv a0, s0
28858; RV64I-NEXT:    li a4, 0
28859; RV64I-NEXT:    call __atomic_compare_exchange_8
28860; RV64I-NEXT:    ld a3, 0(sp)
28861; RV64I-NEXT:    bnez a0, .LBB237_4
28862; RV64I-NEXT:  .LBB237_2: # %atomicrmw.start
28863; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
28864; RV64I-NEXT:    mv a2, a3
28865; RV64I-NEXT:    bgeu s1, a3, .LBB237_1
28866; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
28867; RV64I-NEXT:    # in Loop: Header=BB237_2 Depth=1
28868; RV64I-NEXT:    mv a2, s1
28869; RV64I-NEXT:    j .LBB237_1
28870; RV64I-NEXT:  .LBB237_4: # %atomicrmw.end
28871; RV64I-NEXT:    mv a0, a3
28872; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
28873; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
28874; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
28875; RV64I-NEXT:    addi sp, sp, 32
28876; RV64I-NEXT:    ret
28877;
28878; RV64IA-WMO-LABEL: atomicrmw_umin_i64_release:
28879; RV64IA-WMO:       # %bb.0:
28880; RV64IA-WMO-NEXT:    amominu.d.rl a0, a1, (a0)
28881; RV64IA-WMO-NEXT:    ret
28882;
28883; RV64IA-TSO-LABEL: atomicrmw_umin_i64_release:
28884; RV64IA-TSO:       # %bb.0:
28885; RV64IA-TSO-NEXT:    amominu.d a0, a1, (a0)
28886; RV64IA-TSO-NEXT:    ret
28887  %1 = atomicrmw umin ptr %a, i64 %b release
28888  ret i64 %1
28889}
28890
28891define i64 @atomicrmw_umin_i64_acq_rel(ptr %a, i64 %b) nounwind {
28892; RV32I-LABEL: atomicrmw_umin_i64_acq_rel:
28893; RV32I:       # %bb.0:
28894; RV32I-NEXT:    addi sp, sp, -32
28895; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28896; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28897; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28898; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28899; RV32I-NEXT:    mv s0, a2
28900; RV32I-NEXT:    mv s1, a0
28901; RV32I-NEXT:    lw a4, 0(a0)
28902; RV32I-NEXT:    lw a5, 4(a0)
28903; RV32I-NEXT:    mv s2, a1
28904; RV32I-NEXT:    j .LBB238_2
28905; RV32I-NEXT:  .LBB238_1: # %atomicrmw.start
28906; RV32I-NEXT:    # in Loop: Header=BB238_2 Depth=1
28907; RV32I-NEXT:    sw a4, 8(sp)
28908; RV32I-NEXT:    sw a5, 12(sp)
28909; RV32I-NEXT:    addi a1, sp, 8
28910; RV32I-NEXT:    li a4, 4
28911; RV32I-NEXT:    li a5, 2
28912; RV32I-NEXT:    mv a0, s1
28913; RV32I-NEXT:    call __atomic_compare_exchange_8
28914; RV32I-NEXT:    lw a4, 8(sp)
28915; RV32I-NEXT:    lw a5, 12(sp)
28916; RV32I-NEXT:    bnez a0, .LBB238_7
28917; RV32I-NEXT:  .LBB238_2: # %atomicrmw.start
28918; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
28919; RV32I-NEXT:    beq a5, s0, .LBB238_4
28920; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
28921; RV32I-NEXT:    # in Loop: Header=BB238_2 Depth=1
28922; RV32I-NEXT:    sltu a0, s0, a5
28923; RV32I-NEXT:    j .LBB238_5
28924; RV32I-NEXT:  .LBB238_4: # in Loop: Header=BB238_2 Depth=1
28925; RV32I-NEXT:    sltu a0, s2, a4
28926; RV32I-NEXT:  .LBB238_5: # %atomicrmw.start
28927; RV32I-NEXT:    # in Loop: Header=BB238_2 Depth=1
28928; RV32I-NEXT:    mv a2, a4
28929; RV32I-NEXT:    mv a3, a5
28930; RV32I-NEXT:    beqz a0, .LBB238_1
28931; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
28932; RV32I-NEXT:    # in Loop: Header=BB238_2 Depth=1
28933; RV32I-NEXT:    mv a2, s2
28934; RV32I-NEXT:    mv a3, s0
28935; RV32I-NEXT:    j .LBB238_1
28936; RV32I-NEXT:  .LBB238_7: # %atomicrmw.end
28937; RV32I-NEXT:    mv a0, a4
28938; RV32I-NEXT:    mv a1, a5
28939; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28940; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28941; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28942; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28943; RV32I-NEXT:    addi sp, sp, 32
28944; RV32I-NEXT:    ret
28945;
28946; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel:
28947; RV32IA:       # %bb.0:
28948; RV32IA-NEXT:    addi sp, sp, -32
28949; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
28950; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
28951; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
28952; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
28953; RV32IA-NEXT:    mv s0, a2
28954; RV32IA-NEXT:    mv s1, a0
28955; RV32IA-NEXT:    lw a4, 0(a0)
28956; RV32IA-NEXT:    lw a5, 4(a0)
28957; RV32IA-NEXT:    mv s2, a1
28958; RV32IA-NEXT:    j .LBB238_2
28959; RV32IA-NEXT:  .LBB238_1: # %atomicrmw.start
28960; RV32IA-NEXT:    # in Loop: Header=BB238_2 Depth=1
28961; RV32IA-NEXT:    sw a4, 8(sp)
28962; RV32IA-NEXT:    sw a5, 12(sp)
28963; RV32IA-NEXT:    addi a1, sp, 8
28964; RV32IA-NEXT:    li a4, 4
28965; RV32IA-NEXT:    li a5, 2
28966; RV32IA-NEXT:    mv a0, s1
28967; RV32IA-NEXT:    call __atomic_compare_exchange_8
28968; RV32IA-NEXT:    lw a4, 8(sp)
28969; RV32IA-NEXT:    lw a5, 12(sp)
28970; RV32IA-NEXT:    bnez a0, .LBB238_7
28971; RV32IA-NEXT:  .LBB238_2: # %atomicrmw.start
28972; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
28973; RV32IA-NEXT:    beq a5, s0, .LBB238_4
28974; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
28975; RV32IA-NEXT:    # in Loop: Header=BB238_2 Depth=1
28976; RV32IA-NEXT:    sltu a0, s0, a5
28977; RV32IA-NEXT:    j .LBB238_5
28978; RV32IA-NEXT:  .LBB238_4: # in Loop: Header=BB238_2 Depth=1
28979; RV32IA-NEXT:    sltu a0, s2, a4
28980; RV32IA-NEXT:  .LBB238_5: # %atomicrmw.start
28981; RV32IA-NEXT:    # in Loop: Header=BB238_2 Depth=1
28982; RV32IA-NEXT:    mv a2, a4
28983; RV32IA-NEXT:    mv a3, a5
28984; RV32IA-NEXT:    beqz a0, .LBB238_1
28985; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
28986; RV32IA-NEXT:    # in Loop: Header=BB238_2 Depth=1
28987; RV32IA-NEXT:    mv a2, s2
28988; RV32IA-NEXT:    mv a3, s0
28989; RV32IA-NEXT:    j .LBB238_1
28990; RV32IA-NEXT:  .LBB238_7: # %atomicrmw.end
28991; RV32IA-NEXT:    mv a0, a4
28992; RV32IA-NEXT:    mv a1, a5
28993; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
28994; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
28995; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
28996; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
28997; RV32IA-NEXT:    addi sp, sp, 32
28998; RV32IA-NEXT:    ret
28999;
29000; RV64I-LABEL: atomicrmw_umin_i64_acq_rel:
29001; RV64I:       # %bb.0:
29002; RV64I-NEXT:    addi sp, sp, -32
29003; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
29004; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
29005; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
29006; RV64I-NEXT:    mv s0, a0
29007; RV64I-NEXT:    ld a3, 0(a0)
29008; RV64I-NEXT:    mv s1, a1
29009; RV64I-NEXT:    j .LBB238_2
29010; RV64I-NEXT:  .LBB238_1: # %atomicrmw.start
29011; RV64I-NEXT:    # in Loop: Header=BB238_2 Depth=1
29012; RV64I-NEXT:    sd a3, 0(sp)
29013; RV64I-NEXT:    mv a1, sp
29014; RV64I-NEXT:    li a3, 4
29015; RV64I-NEXT:    li a4, 2
29016; RV64I-NEXT:    mv a0, s0
29017; RV64I-NEXT:    call __atomic_compare_exchange_8
29018; RV64I-NEXT:    ld a3, 0(sp)
29019; RV64I-NEXT:    bnez a0, .LBB238_4
29020; RV64I-NEXT:  .LBB238_2: # %atomicrmw.start
29021; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
29022; RV64I-NEXT:    mv a2, a3
29023; RV64I-NEXT:    bgeu s1, a3, .LBB238_1
29024; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
29025; RV64I-NEXT:    # in Loop: Header=BB238_2 Depth=1
29026; RV64I-NEXT:    mv a2, s1
29027; RV64I-NEXT:    j .LBB238_1
29028; RV64I-NEXT:  .LBB238_4: # %atomicrmw.end
29029; RV64I-NEXT:    mv a0, a3
29030; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
29031; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
29032; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
29033; RV64I-NEXT:    addi sp, sp, 32
29034; RV64I-NEXT:    ret
29035;
29036; RV64IA-WMO-LABEL: atomicrmw_umin_i64_acq_rel:
29037; RV64IA-WMO:       # %bb.0:
29038; RV64IA-WMO-NEXT:    amominu.d.aqrl a0, a1, (a0)
29039; RV64IA-WMO-NEXT:    ret
29040;
29041; RV64IA-TSO-LABEL: atomicrmw_umin_i64_acq_rel:
29042; RV64IA-TSO:       # %bb.0:
29043; RV64IA-TSO-NEXT:    amominu.d a0, a1, (a0)
29044; RV64IA-TSO-NEXT:    ret
29045  %1 = atomicrmw umin ptr %a, i64 %b acq_rel
29046  ret i64 %1
29047}
29048
29049define i64 @atomicrmw_umin_i64_seq_cst(ptr %a, i64 %b) nounwind {
29050; RV32I-LABEL: atomicrmw_umin_i64_seq_cst:
29051; RV32I:       # %bb.0:
29052; RV32I-NEXT:    addi sp, sp, -32
29053; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
29054; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
29055; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
29056; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
29057; RV32I-NEXT:    mv s0, a2
29058; RV32I-NEXT:    mv s1, a0
29059; RV32I-NEXT:    lw a4, 0(a0)
29060; RV32I-NEXT:    lw a5, 4(a0)
29061; RV32I-NEXT:    mv s2, a1
29062; RV32I-NEXT:    j .LBB239_2
29063; RV32I-NEXT:  .LBB239_1: # %atomicrmw.start
29064; RV32I-NEXT:    # in Loop: Header=BB239_2 Depth=1
29065; RV32I-NEXT:    sw a4, 8(sp)
29066; RV32I-NEXT:    sw a5, 12(sp)
29067; RV32I-NEXT:    addi a1, sp, 8
29068; RV32I-NEXT:    li a4, 5
29069; RV32I-NEXT:    li a5, 5
29070; RV32I-NEXT:    mv a0, s1
29071; RV32I-NEXT:    call __atomic_compare_exchange_8
29072; RV32I-NEXT:    lw a4, 8(sp)
29073; RV32I-NEXT:    lw a5, 12(sp)
29074; RV32I-NEXT:    bnez a0, .LBB239_7
29075; RV32I-NEXT:  .LBB239_2: # %atomicrmw.start
29076; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
29077; RV32I-NEXT:    beq a5, s0, .LBB239_4
29078; RV32I-NEXT:  # %bb.3: # %atomicrmw.start
29079; RV32I-NEXT:    # in Loop: Header=BB239_2 Depth=1
29080; RV32I-NEXT:    sltu a0, s0, a5
29081; RV32I-NEXT:    j .LBB239_5
29082; RV32I-NEXT:  .LBB239_4: # in Loop: Header=BB239_2 Depth=1
29083; RV32I-NEXT:    sltu a0, s2, a4
29084; RV32I-NEXT:  .LBB239_5: # %atomicrmw.start
29085; RV32I-NEXT:    # in Loop: Header=BB239_2 Depth=1
29086; RV32I-NEXT:    mv a2, a4
29087; RV32I-NEXT:    mv a3, a5
29088; RV32I-NEXT:    beqz a0, .LBB239_1
29089; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
29090; RV32I-NEXT:    # in Loop: Header=BB239_2 Depth=1
29091; RV32I-NEXT:    mv a2, s2
29092; RV32I-NEXT:    mv a3, s0
29093; RV32I-NEXT:    j .LBB239_1
29094; RV32I-NEXT:  .LBB239_7: # %atomicrmw.end
29095; RV32I-NEXT:    mv a0, a4
29096; RV32I-NEXT:    mv a1, a5
29097; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
29098; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
29099; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
29100; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
29101; RV32I-NEXT:    addi sp, sp, 32
29102; RV32I-NEXT:    ret
29103;
29104; RV32IA-LABEL: atomicrmw_umin_i64_seq_cst:
29105; RV32IA:       # %bb.0:
29106; RV32IA-NEXT:    addi sp, sp, -32
29107; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
29108; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
29109; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
29110; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
29111; RV32IA-NEXT:    mv s0, a2
29112; RV32IA-NEXT:    mv s1, a0
29113; RV32IA-NEXT:    lw a4, 0(a0)
29114; RV32IA-NEXT:    lw a5, 4(a0)
29115; RV32IA-NEXT:    mv s2, a1
29116; RV32IA-NEXT:    j .LBB239_2
29117; RV32IA-NEXT:  .LBB239_1: # %atomicrmw.start
29118; RV32IA-NEXT:    # in Loop: Header=BB239_2 Depth=1
29119; RV32IA-NEXT:    sw a4, 8(sp)
29120; RV32IA-NEXT:    sw a5, 12(sp)
29121; RV32IA-NEXT:    addi a1, sp, 8
29122; RV32IA-NEXT:    li a4, 5
29123; RV32IA-NEXT:    li a5, 5
29124; RV32IA-NEXT:    mv a0, s1
29125; RV32IA-NEXT:    call __atomic_compare_exchange_8
29126; RV32IA-NEXT:    lw a4, 8(sp)
29127; RV32IA-NEXT:    lw a5, 12(sp)
29128; RV32IA-NEXT:    bnez a0, .LBB239_7
29129; RV32IA-NEXT:  .LBB239_2: # %atomicrmw.start
29130; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
29131; RV32IA-NEXT:    beq a5, s0, .LBB239_4
29132; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start
29133; RV32IA-NEXT:    # in Loop: Header=BB239_2 Depth=1
29134; RV32IA-NEXT:    sltu a0, s0, a5
29135; RV32IA-NEXT:    j .LBB239_5
29136; RV32IA-NEXT:  .LBB239_4: # in Loop: Header=BB239_2 Depth=1
29137; RV32IA-NEXT:    sltu a0, s2, a4
29138; RV32IA-NEXT:  .LBB239_5: # %atomicrmw.start
29139; RV32IA-NEXT:    # in Loop: Header=BB239_2 Depth=1
29140; RV32IA-NEXT:    mv a2, a4
29141; RV32IA-NEXT:    mv a3, a5
29142; RV32IA-NEXT:    beqz a0, .LBB239_1
29143; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
29144; RV32IA-NEXT:    # in Loop: Header=BB239_2 Depth=1
29145; RV32IA-NEXT:    mv a2, s2
29146; RV32IA-NEXT:    mv a3, s0
29147; RV32IA-NEXT:    j .LBB239_1
29148; RV32IA-NEXT:  .LBB239_7: # %atomicrmw.end
29149; RV32IA-NEXT:    mv a0, a4
29150; RV32IA-NEXT:    mv a1, a5
29151; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
29152; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
29153; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
29154; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
29155; RV32IA-NEXT:    addi sp, sp, 32
29156; RV32IA-NEXT:    ret
29157;
29158; RV64I-LABEL: atomicrmw_umin_i64_seq_cst:
29159; RV64I:       # %bb.0:
29160; RV64I-NEXT:    addi sp, sp, -32
29161; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
29162; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
29163; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
29164; RV64I-NEXT:    mv s0, a0
29165; RV64I-NEXT:    ld a3, 0(a0)
29166; RV64I-NEXT:    mv s1, a1
29167; RV64I-NEXT:    j .LBB239_2
29168; RV64I-NEXT:  .LBB239_1: # %atomicrmw.start
29169; RV64I-NEXT:    # in Loop: Header=BB239_2 Depth=1
29170; RV64I-NEXT:    sd a3, 0(sp)
29171; RV64I-NEXT:    mv a1, sp
29172; RV64I-NEXT:    li a3, 5
29173; RV64I-NEXT:    li a4, 5
29174; RV64I-NEXT:    mv a0, s0
29175; RV64I-NEXT:    call __atomic_compare_exchange_8
29176; RV64I-NEXT:    ld a3, 0(sp)
29177; RV64I-NEXT:    bnez a0, .LBB239_4
29178; RV64I-NEXT:  .LBB239_2: # %atomicrmw.start
29179; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
29180; RV64I-NEXT:    mv a2, a3
29181; RV64I-NEXT:    bgeu s1, a3, .LBB239_1
29182; RV64I-NEXT:  # %bb.3: # %atomicrmw.start
29183; RV64I-NEXT:    # in Loop: Header=BB239_2 Depth=1
29184; RV64I-NEXT:    mv a2, s1
29185; RV64I-NEXT:    j .LBB239_1
29186; RV64I-NEXT:  .LBB239_4: # %atomicrmw.end
29187; RV64I-NEXT:    mv a0, a3
29188; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
29189; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
29190; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
29191; RV64I-NEXT:    addi sp, sp, 32
29192; RV64I-NEXT:    ret
29193;
29194; RV64IA-WMO-LABEL: atomicrmw_umin_i64_seq_cst:
29195; RV64IA-WMO:       # %bb.0:
29196; RV64IA-WMO-NEXT:    amominu.d.aqrl a0, a1, (a0)
29197; RV64IA-WMO-NEXT:    ret
29198;
29199; RV64IA-TSO-LABEL: atomicrmw_umin_i64_seq_cst:
29200; RV64IA-TSO:       # %bb.0:
29201; RV64IA-TSO-NEXT:    amominu.d a0, a1, (a0)
29202; RV64IA-TSO-NEXT:    ret
29203  %1 = atomicrmw umin ptr %a, i64 %b seq_cst
29204  ret i64 %1
29205}
29206