xref: /llvm-project/llvm/test/CodeGen/RISCV/atomic-load-store.ll (revision bfe8a21bad7e90629fb079217929a79e7377d8b3)
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,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \
5; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-WMO %s
6; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \
7; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-TSO %s
8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
9; RUN:   | FileCheck -check-prefix=RV64I %s
10; RUN: llc -mtriple=riscv64 -mattr=+a,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \
11; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-WMO %s
12; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \
13; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-TSO %s
14
15
16; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \
17; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-WMO-TRAILING-FENCE %s
18; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \
19; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-TSO-TRAILING-FENCE %s
20
21; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \
22; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-WMO-TRAILING-FENCE %s
23; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \
24; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-TSO-TRAILING-FENCE %s
25
26; RUN: llc -mtriple=riscv32 -mattr=+a,+experimental-zalasr -verify-machineinstrs < %s \
27; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-ZALASR,RV32IA-ZALASR-WMO %s
28; RUN: llc -mtriple=riscv32 -mattr=+a,+experimental-zalasr,+ztso -verify-machineinstrs < %s \
29; RUN:   | FileCheck -check-prefixes=RV32IA,RV32IA-ZALASR,RV32IA-ZALASR-TSO %s
30
31; RUN: llc -mtriple=riscv64 -mattr=+a,+experimental-zalasr -verify-machineinstrs < %s \
32; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-ZALASR,RV64IA-ZALASR-WMO %s
33; RUN: llc -mtriple=riscv64 -mattr=+a,+experimental-zalasr,+ztso -verify-machineinstrs < %s \
34; RUN:   | FileCheck -check-prefixes=RV64IA,RV64IA-ZALASR,RV64IA-ZALASR-TSO %s
35
36define i8 @atomic_load_i8_unordered(ptr %a) nounwind {
37; RV32I-LABEL: atomic_load_i8_unordered:
38; RV32I:       # %bb.0:
39; RV32I-NEXT:    addi sp, sp, -16
40; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
41; RV32I-NEXT:    li a1, 0
42; RV32I-NEXT:    call __atomic_load_1
43; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
44; RV32I-NEXT:    addi sp, sp, 16
45; RV32I-NEXT:    ret
46;
47; RV32IA-LABEL: atomic_load_i8_unordered:
48; RV32IA:       # %bb.0:
49; RV32IA-NEXT:    lb a0, 0(a0)
50; RV32IA-NEXT:    ret
51;
52; RV64I-LABEL: atomic_load_i8_unordered:
53; RV64I:       # %bb.0:
54; RV64I-NEXT:    addi sp, sp, -16
55; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
56; RV64I-NEXT:    li a1, 0
57; RV64I-NEXT:    call __atomic_load_1
58; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
59; RV64I-NEXT:    addi sp, sp, 16
60; RV64I-NEXT:    ret
61;
62; RV64IA-LABEL: atomic_load_i8_unordered:
63; RV64IA:       # %bb.0:
64; RV64IA-NEXT:    lb a0, 0(a0)
65; RV64IA-NEXT:    ret
66  %1 = load atomic i8, ptr %a unordered, align 1
67  ret i8 %1
68}
69
70define i8 @atomic_load_i8_monotonic(ptr %a) nounwind {
71; RV32I-LABEL: atomic_load_i8_monotonic:
72; RV32I:       # %bb.0:
73; RV32I-NEXT:    addi sp, sp, -16
74; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
75; RV32I-NEXT:    li a1, 0
76; RV32I-NEXT:    call __atomic_load_1
77; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
78; RV32I-NEXT:    addi sp, sp, 16
79; RV32I-NEXT:    ret
80;
81; RV32IA-LABEL: atomic_load_i8_monotonic:
82; RV32IA:       # %bb.0:
83; RV32IA-NEXT:    lb a0, 0(a0)
84; RV32IA-NEXT:    ret
85;
86; RV64I-LABEL: atomic_load_i8_monotonic:
87; RV64I:       # %bb.0:
88; RV64I-NEXT:    addi sp, sp, -16
89; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
90; RV64I-NEXT:    li a1, 0
91; RV64I-NEXT:    call __atomic_load_1
92; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
93; RV64I-NEXT:    addi sp, sp, 16
94; RV64I-NEXT:    ret
95;
96; RV64IA-LABEL: atomic_load_i8_monotonic:
97; RV64IA:       # %bb.0:
98; RV64IA-NEXT:    lb a0, 0(a0)
99; RV64IA-NEXT:    ret
100  %1 = load atomic i8, ptr %a monotonic, align 1
101  ret i8 %1
102}
103
104define i8 @atomic_load_i8_acquire(ptr %a) nounwind {
105; RV32I-LABEL: atomic_load_i8_acquire:
106; RV32I:       # %bb.0:
107; RV32I-NEXT:    addi sp, sp, -16
108; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
109; RV32I-NEXT:    li a1, 2
110; RV32I-NEXT:    call __atomic_load_1
111; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
112; RV32I-NEXT:    addi sp, sp, 16
113; RV32I-NEXT:    ret
114;
115; RV32IA-WMO-LABEL: atomic_load_i8_acquire:
116; RV32IA-WMO:       # %bb.0:
117; RV32IA-WMO-NEXT:    lb a0, 0(a0)
118; RV32IA-WMO-NEXT:    fence r, rw
119; RV32IA-WMO-NEXT:    ret
120;
121; RV32IA-TSO-LABEL: atomic_load_i8_acquire:
122; RV32IA-TSO:       # %bb.0:
123; RV32IA-TSO-NEXT:    lb a0, 0(a0)
124; RV32IA-TSO-NEXT:    ret
125;
126; RV64I-LABEL: atomic_load_i8_acquire:
127; RV64I:       # %bb.0:
128; RV64I-NEXT:    addi sp, sp, -16
129; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
130; RV64I-NEXT:    li a1, 2
131; RV64I-NEXT:    call __atomic_load_1
132; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
133; RV64I-NEXT:    addi sp, sp, 16
134; RV64I-NEXT:    ret
135;
136; RV64IA-WMO-LABEL: atomic_load_i8_acquire:
137; RV64IA-WMO:       # %bb.0:
138; RV64IA-WMO-NEXT:    lb a0, 0(a0)
139; RV64IA-WMO-NEXT:    fence r, rw
140; RV64IA-WMO-NEXT:    ret
141;
142; RV64IA-TSO-LABEL: atomic_load_i8_acquire:
143; RV64IA-TSO:       # %bb.0:
144; RV64IA-TSO-NEXT:    lb a0, 0(a0)
145; RV64IA-TSO-NEXT:    ret
146;
147; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
148; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
149; RV32IA-WMO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
150; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
151; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
152;
153; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
154; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
155; RV32IA-TSO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
156; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
157;
158; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
159; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
160; RV64IA-WMO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
161; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
162; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
163;
164; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
165; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
166; RV64IA-TSO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
167; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
168;
169; RV32IA-ZALASR-WMO-LABEL: atomic_load_i8_acquire:
170; RV32IA-ZALASR-WMO:       # %bb.0:
171; RV32IA-ZALASR-WMO-NEXT:    lb.aq a0, (a0)
172; RV32IA-ZALASR-WMO-NEXT:    ret
173;
174; RV32IA-ZALASR-TSO-LABEL: atomic_load_i8_acquire:
175; RV32IA-ZALASR-TSO:       # %bb.0:
176; RV32IA-ZALASR-TSO-NEXT:    lb a0, 0(a0)
177; RV32IA-ZALASR-TSO-NEXT:    ret
178;
179; RV64IA-ZALASR-WMO-LABEL: atomic_load_i8_acquire:
180; RV64IA-ZALASR-WMO:       # %bb.0:
181; RV64IA-ZALASR-WMO-NEXT:    lb.aq a0, (a0)
182; RV64IA-ZALASR-WMO-NEXT:    ret
183;
184; RV64IA-ZALASR-TSO-LABEL: atomic_load_i8_acquire:
185; RV64IA-ZALASR-TSO:       # %bb.0:
186; RV64IA-ZALASR-TSO-NEXT:    lb a0, 0(a0)
187; RV64IA-ZALASR-TSO-NEXT:    ret
188  %1 = load atomic i8, ptr %a acquire, align 1
189  ret i8 %1
190}
191
192define i8 @atomic_load_i8_seq_cst(ptr %a) nounwind {
193; RV32I-LABEL: atomic_load_i8_seq_cst:
194; RV32I:       # %bb.0:
195; RV32I-NEXT:    addi sp, sp, -16
196; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
197; RV32I-NEXT:    li a1, 5
198; RV32I-NEXT:    call __atomic_load_1
199; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
200; RV32I-NEXT:    addi sp, sp, 16
201; RV32I-NEXT:    ret
202;
203; RV32IA-WMO-LABEL: atomic_load_i8_seq_cst:
204; RV32IA-WMO:       # %bb.0:
205; RV32IA-WMO-NEXT:    fence rw, rw
206; RV32IA-WMO-NEXT:    lb a0, 0(a0)
207; RV32IA-WMO-NEXT:    fence r, rw
208; RV32IA-WMO-NEXT:    ret
209;
210; RV32IA-TSO-LABEL: atomic_load_i8_seq_cst:
211; RV32IA-TSO:       # %bb.0:
212; RV32IA-TSO-NEXT:    fence rw, rw
213; RV32IA-TSO-NEXT:    lb a0, 0(a0)
214; RV32IA-TSO-NEXT:    ret
215;
216; RV64I-LABEL: atomic_load_i8_seq_cst:
217; RV64I:       # %bb.0:
218; RV64I-NEXT:    addi sp, sp, -16
219; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
220; RV64I-NEXT:    li a1, 5
221; RV64I-NEXT:    call __atomic_load_1
222; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
223; RV64I-NEXT:    addi sp, sp, 16
224; RV64I-NEXT:    ret
225;
226; RV64IA-WMO-LABEL: atomic_load_i8_seq_cst:
227; RV64IA-WMO:       # %bb.0:
228; RV64IA-WMO-NEXT:    fence rw, rw
229; RV64IA-WMO-NEXT:    lb a0, 0(a0)
230; RV64IA-WMO-NEXT:    fence r, rw
231; RV64IA-WMO-NEXT:    ret
232;
233; RV64IA-TSO-LABEL: atomic_load_i8_seq_cst:
234; RV64IA-TSO:       # %bb.0:
235; RV64IA-TSO-NEXT:    fence rw, rw
236; RV64IA-TSO-NEXT:    lb a0, 0(a0)
237; RV64IA-TSO-NEXT:    ret
238;
239; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
240; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
241; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
242; RV32IA-WMO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
243; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
244; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
245;
246; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
247; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
248; RV32IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
249; RV32IA-TSO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
250; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
251;
252; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
253; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
254; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
255; RV64IA-WMO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
256; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
257; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
258;
259; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
260; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
261; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
262; RV64IA-TSO-TRAILING-FENCE-NEXT:    lb a0, 0(a0)
263; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
264;
265; RV32IA-ZALASR-LABEL: atomic_load_i8_seq_cst:
266; RV32IA-ZALASR:       # %bb.0:
267; RV32IA-ZALASR-NEXT:    lb.aq a0, (a0)
268; RV32IA-ZALASR-NEXT:    ret
269;
270; RV64IA-ZALASR-LABEL: atomic_load_i8_seq_cst:
271; RV64IA-ZALASR:       # %bb.0:
272; RV64IA-ZALASR-NEXT:    lb.aq a0, (a0)
273; RV64IA-ZALASR-NEXT:    ret
274  %1 = load atomic i8, ptr %a seq_cst, align 1
275  ret i8 %1
276}
277
278define i16 @atomic_load_i16_unordered(ptr %a) nounwind {
279; RV32I-LABEL: atomic_load_i16_unordered:
280; RV32I:       # %bb.0:
281; RV32I-NEXT:    addi sp, sp, -16
282; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
283; RV32I-NEXT:    li a1, 0
284; RV32I-NEXT:    call __atomic_load_2
285; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
286; RV32I-NEXT:    addi sp, sp, 16
287; RV32I-NEXT:    ret
288;
289; RV32IA-LABEL: atomic_load_i16_unordered:
290; RV32IA:       # %bb.0:
291; RV32IA-NEXT:    lh a0, 0(a0)
292; RV32IA-NEXT:    ret
293;
294; RV64I-LABEL: atomic_load_i16_unordered:
295; RV64I:       # %bb.0:
296; RV64I-NEXT:    addi sp, sp, -16
297; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
298; RV64I-NEXT:    li a1, 0
299; RV64I-NEXT:    call __atomic_load_2
300; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
301; RV64I-NEXT:    addi sp, sp, 16
302; RV64I-NEXT:    ret
303;
304; RV64IA-LABEL: atomic_load_i16_unordered:
305; RV64IA:       # %bb.0:
306; RV64IA-NEXT:    lh a0, 0(a0)
307; RV64IA-NEXT:    ret
308  %1 = load atomic i16, ptr %a unordered, align 2
309  ret i16 %1
310}
311
312define i16 @atomic_load_i16_monotonic(ptr %a) nounwind {
313; RV32I-LABEL: atomic_load_i16_monotonic:
314; RV32I:       # %bb.0:
315; RV32I-NEXT:    addi sp, sp, -16
316; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
317; RV32I-NEXT:    li a1, 0
318; RV32I-NEXT:    call __atomic_load_2
319; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
320; RV32I-NEXT:    addi sp, sp, 16
321; RV32I-NEXT:    ret
322;
323; RV32IA-LABEL: atomic_load_i16_monotonic:
324; RV32IA:       # %bb.0:
325; RV32IA-NEXT:    lh a0, 0(a0)
326; RV32IA-NEXT:    ret
327;
328; RV64I-LABEL: atomic_load_i16_monotonic:
329; RV64I:       # %bb.0:
330; RV64I-NEXT:    addi sp, sp, -16
331; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
332; RV64I-NEXT:    li a1, 0
333; RV64I-NEXT:    call __atomic_load_2
334; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
335; RV64I-NEXT:    addi sp, sp, 16
336; RV64I-NEXT:    ret
337;
338; RV64IA-LABEL: atomic_load_i16_monotonic:
339; RV64IA:       # %bb.0:
340; RV64IA-NEXT:    lh a0, 0(a0)
341; RV64IA-NEXT:    ret
342  %1 = load atomic i16, ptr %a monotonic, align 2
343  ret i16 %1
344}
345
346define i16 @atomic_load_i16_acquire(ptr %a) nounwind {
347; RV32I-LABEL: atomic_load_i16_acquire:
348; RV32I:       # %bb.0:
349; RV32I-NEXT:    addi sp, sp, -16
350; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
351; RV32I-NEXT:    li a1, 2
352; RV32I-NEXT:    call __atomic_load_2
353; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
354; RV32I-NEXT:    addi sp, sp, 16
355; RV32I-NEXT:    ret
356;
357; RV32IA-WMO-LABEL: atomic_load_i16_acquire:
358; RV32IA-WMO:       # %bb.0:
359; RV32IA-WMO-NEXT:    lh a0, 0(a0)
360; RV32IA-WMO-NEXT:    fence r, rw
361; RV32IA-WMO-NEXT:    ret
362;
363; RV32IA-TSO-LABEL: atomic_load_i16_acquire:
364; RV32IA-TSO:       # %bb.0:
365; RV32IA-TSO-NEXT:    lh a0, 0(a0)
366; RV32IA-TSO-NEXT:    ret
367;
368; RV64I-LABEL: atomic_load_i16_acquire:
369; RV64I:       # %bb.0:
370; RV64I-NEXT:    addi sp, sp, -16
371; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
372; RV64I-NEXT:    li a1, 2
373; RV64I-NEXT:    call __atomic_load_2
374; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
375; RV64I-NEXT:    addi sp, sp, 16
376; RV64I-NEXT:    ret
377;
378; RV64IA-WMO-LABEL: atomic_load_i16_acquire:
379; RV64IA-WMO:       # %bb.0:
380; RV64IA-WMO-NEXT:    lh a0, 0(a0)
381; RV64IA-WMO-NEXT:    fence r, rw
382; RV64IA-WMO-NEXT:    ret
383;
384; RV64IA-TSO-LABEL: atomic_load_i16_acquire:
385; RV64IA-TSO:       # %bb.0:
386; RV64IA-TSO-NEXT:    lh a0, 0(a0)
387; RV64IA-TSO-NEXT:    ret
388;
389; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
390; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
391; RV32IA-WMO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
392; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
393; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
394;
395; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
396; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
397; RV32IA-TSO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
398; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
399;
400; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
401; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
402; RV64IA-WMO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
403; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
404; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
405;
406; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
407; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
408; RV64IA-TSO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
409; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
410;
411; RV32IA-ZALASR-WMO-LABEL: atomic_load_i16_acquire:
412; RV32IA-ZALASR-WMO:       # %bb.0:
413; RV32IA-ZALASR-WMO-NEXT:    lh.aq a0, (a0)
414; RV32IA-ZALASR-WMO-NEXT:    ret
415;
416; RV32IA-ZALASR-TSO-LABEL: atomic_load_i16_acquire:
417; RV32IA-ZALASR-TSO:       # %bb.0:
418; RV32IA-ZALASR-TSO-NEXT:    lh a0, 0(a0)
419; RV32IA-ZALASR-TSO-NEXT:    ret
420;
421; RV64IA-ZALASR-WMO-LABEL: atomic_load_i16_acquire:
422; RV64IA-ZALASR-WMO:       # %bb.0:
423; RV64IA-ZALASR-WMO-NEXT:    lh.aq a0, (a0)
424; RV64IA-ZALASR-WMO-NEXT:    ret
425;
426; RV64IA-ZALASR-TSO-LABEL: atomic_load_i16_acquire:
427; RV64IA-ZALASR-TSO:       # %bb.0:
428; RV64IA-ZALASR-TSO-NEXT:    lh a0, 0(a0)
429; RV64IA-ZALASR-TSO-NEXT:    ret
430  %1 = load atomic i16, ptr %a acquire, align 2
431  ret i16 %1
432}
433
434define i16 @atomic_load_i16_seq_cst(ptr %a) nounwind {
435; RV32I-LABEL: atomic_load_i16_seq_cst:
436; RV32I:       # %bb.0:
437; RV32I-NEXT:    addi sp, sp, -16
438; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
439; RV32I-NEXT:    li a1, 5
440; RV32I-NEXT:    call __atomic_load_2
441; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
442; RV32I-NEXT:    addi sp, sp, 16
443; RV32I-NEXT:    ret
444;
445; RV32IA-WMO-LABEL: atomic_load_i16_seq_cst:
446; RV32IA-WMO:       # %bb.0:
447; RV32IA-WMO-NEXT:    fence rw, rw
448; RV32IA-WMO-NEXT:    lh a0, 0(a0)
449; RV32IA-WMO-NEXT:    fence r, rw
450; RV32IA-WMO-NEXT:    ret
451;
452; RV32IA-TSO-LABEL: atomic_load_i16_seq_cst:
453; RV32IA-TSO:       # %bb.0:
454; RV32IA-TSO-NEXT:    fence rw, rw
455; RV32IA-TSO-NEXT:    lh a0, 0(a0)
456; RV32IA-TSO-NEXT:    ret
457;
458; RV64I-LABEL: atomic_load_i16_seq_cst:
459; RV64I:       # %bb.0:
460; RV64I-NEXT:    addi sp, sp, -16
461; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
462; RV64I-NEXT:    li a1, 5
463; RV64I-NEXT:    call __atomic_load_2
464; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
465; RV64I-NEXT:    addi sp, sp, 16
466; RV64I-NEXT:    ret
467;
468; RV64IA-WMO-LABEL: atomic_load_i16_seq_cst:
469; RV64IA-WMO:       # %bb.0:
470; RV64IA-WMO-NEXT:    fence rw, rw
471; RV64IA-WMO-NEXT:    lh a0, 0(a0)
472; RV64IA-WMO-NEXT:    fence r, rw
473; RV64IA-WMO-NEXT:    ret
474;
475; RV64IA-TSO-LABEL: atomic_load_i16_seq_cst:
476; RV64IA-TSO:       # %bb.0:
477; RV64IA-TSO-NEXT:    fence rw, rw
478; RV64IA-TSO-NEXT:    lh a0, 0(a0)
479; RV64IA-TSO-NEXT:    ret
480;
481; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
482; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
483; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
484; RV32IA-WMO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
485; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
486; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
487;
488; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
489; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
490; RV32IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
491; RV32IA-TSO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
492; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
493;
494; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
495; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
496; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
497; RV64IA-WMO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
498; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
499; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
500;
501; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
502; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
503; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
504; RV64IA-TSO-TRAILING-FENCE-NEXT:    lh a0, 0(a0)
505; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
506;
507; RV32IA-ZALASR-LABEL: atomic_load_i16_seq_cst:
508; RV32IA-ZALASR:       # %bb.0:
509; RV32IA-ZALASR-NEXT:    lh.aq a0, (a0)
510; RV32IA-ZALASR-NEXT:    ret
511;
512; RV64IA-ZALASR-LABEL: atomic_load_i16_seq_cst:
513; RV64IA-ZALASR:       # %bb.0:
514; RV64IA-ZALASR-NEXT:    lh.aq a0, (a0)
515; RV64IA-ZALASR-NEXT:    ret
516  %1 = load atomic i16, ptr %a seq_cst, align 2
517  ret i16 %1
518}
519
520define i32 @atomic_load_i32_unordered(ptr %a) nounwind {
521; RV32I-LABEL: atomic_load_i32_unordered:
522; RV32I:       # %bb.0:
523; RV32I-NEXT:    addi sp, sp, -16
524; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
525; RV32I-NEXT:    li a1, 0
526; RV32I-NEXT:    call __atomic_load_4
527; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
528; RV32I-NEXT:    addi sp, sp, 16
529; RV32I-NEXT:    ret
530;
531; RV32IA-LABEL: atomic_load_i32_unordered:
532; RV32IA:       # %bb.0:
533; RV32IA-NEXT:    lw a0, 0(a0)
534; RV32IA-NEXT:    ret
535;
536; RV64I-LABEL: atomic_load_i32_unordered:
537; RV64I:       # %bb.0:
538; RV64I-NEXT:    addi sp, sp, -16
539; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
540; RV64I-NEXT:    li a1, 0
541; RV64I-NEXT:    call __atomic_load_4
542; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
543; RV64I-NEXT:    addi sp, sp, 16
544; RV64I-NEXT:    ret
545;
546; RV64IA-LABEL: atomic_load_i32_unordered:
547; RV64IA:       # %bb.0:
548; RV64IA-NEXT:    lw a0, 0(a0)
549; RV64IA-NEXT:    ret
550  %1 = load atomic i32, ptr %a unordered, align 4
551  ret i32 %1
552}
553
554define i32 @atomic_load_i32_monotonic(ptr %a) nounwind {
555; RV32I-LABEL: atomic_load_i32_monotonic:
556; RV32I:       # %bb.0:
557; RV32I-NEXT:    addi sp, sp, -16
558; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
559; RV32I-NEXT:    li a1, 0
560; RV32I-NEXT:    call __atomic_load_4
561; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
562; RV32I-NEXT:    addi sp, sp, 16
563; RV32I-NEXT:    ret
564;
565; RV32IA-LABEL: atomic_load_i32_monotonic:
566; RV32IA:       # %bb.0:
567; RV32IA-NEXT:    lw a0, 0(a0)
568; RV32IA-NEXT:    ret
569;
570; RV64I-LABEL: atomic_load_i32_monotonic:
571; RV64I:       # %bb.0:
572; RV64I-NEXT:    addi sp, sp, -16
573; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
574; RV64I-NEXT:    li a1, 0
575; RV64I-NEXT:    call __atomic_load_4
576; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
577; RV64I-NEXT:    addi sp, sp, 16
578; RV64I-NEXT:    ret
579;
580; RV64IA-LABEL: atomic_load_i32_monotonic:
581; RV64IA:       # %bb.0:
582; RV64IA-NEXT:    lw a0, 0(a0)
583; RV64IA-NEXT:    ret
584  %1 = load atomic i32, ptr %a monotonic, align 4
585  ret i32 %1
586}
587
588define i32 @atomic_load_i32_acquire(ptr %a) nounwind {
589; RV32I-LABEL: atomic_load_i32_acquire:
590; RV32I:       # %bb.0:
591; RV32I-NEXT:    addi sp, sp, -16
592; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
593; RV32I-NEXT:    li a1, 2
594; RV32I-NEXT:    call __atomic_load_4
595; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
596; RV32I-NEXT:    addi sp, sp, 16
597; RV32I-NEXT:    ret
598;
599; RV32IA-WMO-LABEL: atomic_load_i32_acquire:
600; RV32IA-WMO:       # %bb.0:
601; RV32IA-WMO-NEXT:    lw a0, 0(a0)
602; RV32IA-WMO-NEXT:    fence r, rw
603; RV32IA-WMO-NEXT:    ret
604;
605; RV32IA-TSO-LABEL: atomic_load_i32_acquire:
606; RV32IA-TSO:       # %bb.0:
607; RV32IA-TSO-NEXT:    lw a0, 0(a0)
608; RV32IA-TSO-NEXT:    ret
609;
610; RV64I-LABEL: atomic_load_i32_acquire:
611; RV64I:       # %bb.0:
612; RV64I-NEXT:    addi sp, sp, -16
613; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
614; RV64I-NEXT:    li a1, 2
615; RV64I-NEXT:    call __atomic_load_4
616; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
617; RV64I-NEXT:    addi sp, sp, 16
618; RV64I-NEXT:    ret
619;
620; RV64IA-WMO-LABEL: atomic_load_i32_acquire:
621; RV64IA-WMO:       # %bb.0:
622; RV64IA-WMO-NEXT:    lw a0, 0(a0)
623; RV64IA-WMO-NEXT:    fence r, rw
624; RV64IA-WMO-NEXT:    ret
625;
626; RV64IA-TSO-LABEL: atomic_load_i32_acquire:
627; RV64IA-TSO:       # %bb.0:
628; RV64IA-TSO-NEXT:    lw a0, 0(a0)
629; RV64IA-TSO-NEXT:    ret
630;
631; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
632; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
633; RV32IA-WMO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
634; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
635; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
636;
637; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
638; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
639; RV32IA-TSO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
640; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
641;
642; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
643; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
644; RV64IA-WMO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
645; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
646; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
647;
648; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
649; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
650; RV64IA-TSO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
651; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
652;
653; RV32IA-ZALASR-WMO-LABEL: atomic_load_i32_acquire:
654; RV32IA-ZALASR-WMO:       # %bb.0:
655; RV32IA-ZALASR-WMO-NEXT:    lw.aq a0, (a0)
656; RV32IA-ZALASR-WMO-NEXT:    ret
657;
658; RV32IA-ZALASR-TSO-LABEL: atomic_load_i32_acquire:
659; RV32IA-ZALASR-TSO:       # %bb.0:
660; RV32IA-ZALASR-TSO-NEXT:    lw a0, 0(a0)
661; RV32IA-ZALASR-TSO-NEXT:    ret
662;
663; RV64IA-ZALASR-WMO-LABEL: atomic_load_i32_acquire:
664; RV64IA-ZALASR-WMO:       # %bb.0:
665; RV64IA-ZALASR-WMO-NEXT:    lw.aq a0, (a0)
666; RV64IA-ZALASR-WMO-NEXT:    ret
667;
668; RV64IA-ZALASR-TSO-LABEL: atomic_load_i32_acquire:
669; RV64IA-ZALASR-TSO:       # %bb.0:
670; RV64IA-ZALASR-TSO-NEXT:    lw a0, 0(a0)
671; RV64IA-ZALASR-TSO-NEXT:    ret
672  %1 = load atomic i32, ptr %a acquire, align 4
673  ret i32 %1
674}
675
676define i32 @atomic_load_i32_seq_cst(ptr %a) nounwind {
677; RV32I-LABEL: atomic_load_i32_seq_cst:
678; RV32I:       # %bb.0:
679; RV32I-NEXT:    addi sp, sp, -16
680; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
681; RV32I-NEXT:    li a1, 5
682; RV32I-NEXT:    call __atomic_load_4
683; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
684; RV32I-NEXT:    addi sp, sp, 16
685; RV32I-NEXT:    ret
686;
687; RV32IA-WMO-LABEL: atomic_load_i32_seq_cst:
688; RV32IA-WMO:       # %bb.0:
689; RV32IA-WMO-NEXT:    fence rw, rw
690; RV32IA-WMO-NEXT:    lw a0, 0(a0)
691; RV32IA-WMO-NEXT:    fence r, rw
692; RV32IA-WMO-NEXT:    ret
693;
694; RV32IA-TSO-LABEL: atomic_load_i32_seq_cst:
695; RV32IA-TSO:       # %bb.0:
696; RV32IA-TSO-NEXT:    fence rw, rw
697; RV32IA-TSO-NEXT:    lw a0, 0(a0)
698; RV32IA-TSO-NEXT:    ret
699;
700; RV64I-LABEL: atomic_load_i32_seq_cst:
701; RV64I:       # %bb.0:
702; RV64I-NEXT:    addi sp, sp, -16
703; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
704; RV64I-NEXT:    li a1, 5
705; RV64I-NEXT:    call __atomic_load_4
706; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
707; RV64I-NEXT:    addi sp, sp, 16
708; RV64I-NEXT:    ret
709;
710; RV64IA-WMO-LABEL: atomic_load_i32_seq_cst:
711; RV64IA-WMO:       # %bb.0:
712; RV64IA-WMO-NEXT:    fence rw, rw
713; RV64IA-WMO-NEXT:    lw a0, 0(a0)
714; RV64IA-WMO-NEXT:    fence r, rw
715; RV64IA-WMO-NEXT:    ret
716;
717; RV64IA-TSO-LABEL: atomic_load_i32_seq_cst:
718; RV64IA-TSO:       # %bb.0:
719; RV64IA-TSO-NEXT:    fence rw, rw
720; RV64IA-TSO-NEXT:    lw a0, 0(a0)
721; RV64IA-TSO-NEXT:    ret
722;
723; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
724; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
725; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
726; RV32IA-WMO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
727; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
728; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
729;
730; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
731; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
732; RV32IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
733; RV32IA-TSO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
734; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
735;
736; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
737; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
738; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
739; RV64IA-WMO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
740; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
741; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
742;
743; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
744; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
745; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
746; RV64IA-TSO-TRAILING-FENCE-NEXT:    lw a0, 0(a0)
747; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
748;
749; RV32IA-ZALASR-LABEL: atomic_load_i32_seq_cst:
750; RV32IA-ZALASR:       # %bb.0:
751; RV32IA-ZALASR-NEXT:    lw.aq a0, (a0)
752; RV32IA-ZALASR-NEXT:    ret
753;
754; RV64IA-ZALASR-LABEL: atomic_load_i32_seq_cst:
755; RV64IA-ZALASR:       # %bb.0:
756; RV64IA-ZALASR-NEXT:    lw.aq a0, (a0)
757; RV64IA-ZALASR-NEXT:    ret
758  %1 = load atomic i32, ptr %a seq_cst, align 4
759  ret i32 %1
760}
761
762define i64 @atomic_load_i64_unordered(ptr %a) nounwind {
763; RV32I-LABEL: atomic_load_i64_unordered:
764; RV32I:       # %bb.0:
765; RV32I-NEXT:    addi sp, sp, -16
766; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
767; RV32I-NEXT:    li a1, 0
768; RV32I-NEXT:    call __atomic_load_8
769; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
770; RV32I-NEXT:    addi sp, sp, 16
771; RV32I-NEXT:    ret
772;
773; RV32IA-LABEL: atomic_load_i64_unordered:
774; RV32IA:       # %bb.0:
775; RV32IA-NEXT:    addi sp, sp, -16
776; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
777; RV32IA-NEXT:    li a1, 0
778; RV32IA-NEXT:    call __atomic_load_8
779; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
780; RV32IA-NEXT:    addi sp, sp, 16
781; RV32IA-NEXT:    ret
782;
783; RV64I-LABEL: atomic_load_i64_unordered:
784; RV64I:       # %bb.0:
785; RV64I-NEXT:    addi sp, sp, -16
786; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
787; RV64I-NEXT:    li a1, 0
788; RV64I-NEXT:    call __atomic_load_8
789; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
790; RV64I-NEXT:    addi sp, sp, 16
791; RV64I-NEXT:    ret
792;
793; RV64IA-LABEL: atomic_load_i64_unordered:
794; RV64IA:       # %bb.0:
795; RV64IA-NEXT:    ld a0, 0(a0)
796; RV64IA-NEXT:    ret
797  %1 = load atomic i64, ptr %a unordered, align 8
798  ret i64 %1
799}
800
801define i64 @atomic_load_i64_monotonic(ptr %a) nounwind {
802; RV32I-LABEL: atomic_load_i64_monotonic:
803; RV32I:       # %bb.0:
804; RV32I-NEXT:    addi sp, sp, -16
805; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
806; RV32I-NEXT:    li a1, 0
807; RV32I-NEXT:    call __atomic_load_8
808; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
809; RV32I-NEXT:    addi sp, sp, 16
810; RV32I-NEXT:    ret
811;
812; RV32IA-LABEL: atomic_load_i64_monotonic:
813; RV32IA:       # %bb.0:
814; RV32IA-NEXT:    addi sp, sp, -16
815; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
816; RV32IA-NEXT:    li a1, 0
817; RV32IA-NEXT:    call __atomic_load_8
818; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
819; RV32IA-NEXT:    addi sp, sp, 16
820; RV32IA-NEXT:    ret
821;
822; RV64I-LABEL: atomic_load_i64_monotonic:
823; RV64I:       # %bb.0:
824; RV64I-NEXT:    addi sp, sp, -16
825; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
826; RV64I-NEXT:    li a1, 0
827; RV64I-NEXT:    call __atomic_load_8
828; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
829; RV64I-NEXT:    addi sp, sp, 16
830; RV64I-NEXT:    ret
831;
832; RV64IA-LABEL: atomic_load_i64_monotonic:
833; RV64IA:       # %bb.0:
834; RV64IA-NEXT:    ld a0, 0(a0)
835; RV64IA-NEXT:    ret
836  %1 = load atomic i64, ptr %a monotonic, align 8
837  ret i64 %1
838}
839
840define i64 @atomic_load_i64_acquire(ptr %a) nounwind {
841; RV32I-LABEL: atomic_load_i64_acquire:
842; RV32I:       # %bb.0:
843; RV32I-NEXT:    addi sp, sp, -16
844; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
845; RV32I-NEXT:    li a1, 2
846; RV32I-NEXT:    call __atomic_load_8
847; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
848; RV32I-NEXT:    addi sp, sp, 16
849; RV32I-NEXT:    ret
850;
851; RV32IA-LABEL: atomic_load_i64_acquire:
852; RV32IA:       # %bb.0:
853; RV32IA-NEXT:    addi sp, sp, -16
854; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
855; RV32IA-NEXT:    li a1, 2
856; RV32IA-NEXT:    call __atomic_load_8
857; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
858; RV32IA-NEXT:    addi sp, sp, 16
859; RV32IA-NEXT:    ret
860;
861; RV64I-LABEL: atomic_load_i64_acquire:
862; RV64I:       # %bb.0:
863; RV64I-NEXT:    addi sp, sp, -16
864; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
865; RV64I-NEXT:    li a1, 2
866; RV64I-NEXT:    call __atomic_load_8
867; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
868; RV64I-NEXT:    addi sp, sp, 16
869; RV64I-NEXT:    ret
870;
871; RV64IA-WMO-LABEL: atomic_load_i64_acquire:
872; RV64IA-WMO:       # %bb.0:
873; RV64IA-WMO-NEXT:    ld a0, 0(a0)
874; RV64IA-WMO-NEXT:    fence r, rw
875; RV64IA-WMO-NEXT:    ret
876;
877; RV64IA-TSO-LABEL: atomic_load_i64_acquire:
878; RV64IA-TSO:       # %bb.0:
879; RV64IA-TSO-NEXT:    ld a0, 0(a0)
880; RV64IA-TSO-NEXT:    ret
881;
882; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i64_acquire:
883; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
884; RV64IA-WMO-TRAILING-FENCE-NEXT:    ld a0, 0(a0)
885; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
886; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
887;
888; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i64_acquire:
889; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
890; RV64IA-TSO-TRAILING-FENCE-NEXT:    ld a0, 0(a0)
891; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
892;
893; RV64IA-ZALASR-WMO-LABEL: atomic_load_i64_acquire:
894; RV64IA-ZALASR-WMO:       # %bb.0:
895; RV64IA-ZALASR-WMO-NEXT:    ld.aq a0, (a0)
896; RV64IA-ZALASR-WMO-NEXT:    ret
897;
898; RV64IA-ZALASR-TSO-LABEL: atomic_load_i64_acquire:
899; RV64IA-ZALASR-TSO:       # %bb.0:
900; RV64IA-ZALASR-TSO-NEXT:    ld a0, 0(a0)
901; RV64IA-ZALASR-TSO-NEXT:    ret
902  %1 = load atomic i64, ptr %a acquire, align 8
903  ret i64 %1
904}
905
906define i64 @atomic_load_i64_seq_cst(ptr %a) nounwind {
907; RV32I-LABEL: atomic_load_i64_seq_cst:
908; RV32I:       # %bb.0:
909; RV32I-NEXT:    addi sp, sp, -16
910; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
911; RV32I-NEXT:    li a1, 5
912; RV32I-NEXT:    call __atomic_load_8
913; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
914; RV32I-NEXT:    addi sp, sp, 16
915; RV32I-NEXT:    ret
916;
917; RV32IA-LABEL: atomic_load_i64_seq_cst:
918; RV32IA:       # %bb.0:
919; RV32IA-NEXT:    addi sp, sp, -16
920; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
921; RV32IA-NEXT:    li a1, 5
922; RV32IA-NEXT:    call __atomic_load_8
923; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
924; RV32IA-NEXT:    addi sp, sp, 16
925; RV32IA-NEXT:    ret
926;
927; RV64I-LABEL: atomic_load_i64_seq_cst:
928; RV64I:       # %bb.0:
929; RV64I-NEXT:    addi sp, sp, -16
930; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
931; RV64I-NEXT:    li a1, 5
932; RV64I-NEXT:    call __atomic_load_8
933; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
934; RV64I-NEXT:    addi sp, sp, 16
935; RV64I-NEXT:    ret
936;
937; RV64IA-WMO-LABEL: atomic_load_i64_seq_cst:
938; RV64IA-WMO:       # %bb.0:
939; RV64IA-WMO-NEXT:    fence rw, rw
940; RV64IA-WMO-NEXT:    ld a0, 0(a0)
941; RV64IA-WMO-NEXT:    fence r, rw
942; RV64IA-WMO-NEXT:    ret
943;
944; RV64IA-TSO-LABEL: atomic_load_i64_seq_cst:
945; RV64IA-TSO:       # %bb.0:
946; RV64IA-TSO-NEXT:    fence rw, rw
947; RV64IA-TSO-NEXT:    ld a0, 0(a0)
948; RV64IA-TSO-NEXT:    ret
949;
950; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i64_seq_cst:
951; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
952; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
953; RV64IA-WMO-TRAILING-FENCE-NEXT:    ld a0, 0(a0)
954; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence r, rw
955; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
956;
957; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i64_seq_cst:
958; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
959; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
960; RV64IA-TSO-TRAILING-FENCE-NEXT:    ld a0, 0(a0)
961; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
962;
963; RV64IA-ZALASR-LABEL: atomic_load_i64_seq_cst:
964; RV64IA-ZALASR:       # %bb.0:
965; RV64IA-ZALASR-NEXT:    ld.aq a0, (a0)
966; RV64IA-ZALASR-NEXT:    ret
967  %1 = load atomic i64, ptr %a seq_cst, align 8
968  ret i64 %1
969}
970
971define void @atomic_store_i8_unordered(ptr %a, i8 %b) nounwind {
972; RV32I-LABEL: atomic_store_i8_unordered:
973; RV32I:       # %bb.0:
974; RV32I-NEXT:    addi sp, sp, -16
975; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
976; RV32I-NEXT:    li a2, 0
977; RV32I-NEXT:    call __atomic_store_1
978; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
979; RV32I-NEXT:    addi sp, sp, 16
980; RV32I-NEXT:    ret
981;
982; RV32IA-LABEL: atomic_store_i8_unordered:
983; RV32IA:       # %bb.0:
984; RV32IA-NEXT:    sb a1, 0(a0)
985; RV32IA-NEXT:    ret
986;
987; RV64I-LABEL: atomic_store_i8_unordered:
988; RV64I:       # %bb.0:
989; RV64I-NEXT:    addi sp, sp, -16
990; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
991; RV64I-NEXT:    li a2, 0
992; RV64I-NEXT:    call __atomic_store_1
993; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
994; RV64I-NEXT:    addi sp, sp, 16
995; RV64I-NEXT:    ret
996;
997; RV64IA-LABEL: atomic_store_i8_unordered:
998; RV64IA:       # %bb.0:
999; RV64IA-NEXT:    sb a1, 0(a0)
1000; RV64IA-NEXT:    ret
1001  store atomic i8 %b, ptr %a unordered, align 1
1002  ret void
1003}
1004
1005define void @atomic_store_i8_monotonic(ptr %a, i8 %b) nounwind {
1006; RV32I-LABEL: atomic_store_i8_monotonic:
1007; RV32I:       # %bb.0:
1008; RV32I-NEXT:    addi sp, sp, -16
1009; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1010; RV32I-NEXT:    li a2, 0
1011; RV32I-NEXT:    call __atomic_store_1
1012; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1013; RV32I-NEXT:    addi sp, sp, 16
1014; RV32I-NEXT:    ret
1015;
1016; RV32IA-LABEL: atomic_store_i8_monotonic:
1017; RV32IA:       # %bb.0:
1018; RV32IA-NEXT:    sb a1, 0(a0)
1019; RV32IA-NEXT:    ret
1020;
1021; RV64I-LABEL: atomic_store_i8_monotonic:
1022; RV64I:       # %bb.0:
1023; RV64I-NEXT:    addi sp, sp, -16
1024; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1025; RV64I-NEXT:    li a2, 0
1026; RV64I-NEXT:    call __atomic_store_1
1027; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1028; RV64I-NEXT:    addi sp, sp, 16
1029; RV64I-NEXT:    ret
1030;
1031; RV64IA-LABEL: atomic_store_i8_monotonic:
1032; RV64IA:       # %bb.0:
1033; RV64IA-NEXT:    sb a1, 0(a0)
1034; RV64IA-NEXT:    ret
1035  store atomic i8 %b, ptr %a monotonic, align 1
1036  ret void
1037}
1038
1039define void @atomic_store_i8_release(ptr %a, i8 %b) nounwind {
1040; RV32I-LABEL: atomic_store_i8_release:
1041; RV32I:       # %bb.0:
1042; RV32I-NEXT:    addi sp, sp, -16
1043; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1044; RV32I-NEXT:    li a2, 3
1045; RV32I-NEXT:    call __atomic_store_1
1046; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1047; RV32I-NEXT:    addi sp, sp, 16
1048; RV32I-NEXT:    ret
1049;
1050; RV32IA-WMO-LABEL: atomic_store_i8_release:
1051; RV32IA-WMO:       # %bb.0:
1052; RV32IA-WMO-NEXT:    fence rw, w
1053; RV32IA-WMO-NEXT:    sb a1, 0(a0)
1054; RV32IA-WMO-NEXT:    ret
1055;
1056; RV32IA-TSO-LABEL: atomic_store_i8_release:
1057; RV32IA-TSO:       # %bb.0:
1058; RV32IA-TSO-NEXT:    sb a1, 0(a0)
1059; RV32IA-TSO-NEXT:    ret
1060;
1061; RV64I-LABEL: atomic_store_i8_release:
1062; RV64I:       # %bb.0:
1063; RV64I-NEXT:    addi sp, sp, -16
1064; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1065; RV64I-NEXT:    li a2, 3
1066; RV64I-NEXT:    call __atomic_store_1
1067; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1068; RV64I-NEXT:    addi sp, sp, 16
1069; RV64I-NEXT:    ret
1070;
1071; RV64IA-WMO-LABEL: atomic_store_i8_release:
1072; RV64IA-WMO:       # %bb.0:
1073; RV64IA-WMO-NEXT:    fence rw, w
1074; RV64IA-WMO-NEXT:    sb a1, 0(a0)
1075; RV64IA-WMO-NEXT:    ret
1076;
1077; RV64IA-TSO-LABEL: atomic_store_i8_release:
1078; RV64IA-TSO:       # %bb.0:
1079; RV64IA-TSO-NEXT:    sb a1, 0(a0)
1080; RV64IA-TSO-NEXT:    ret
1081;
1082; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
1083; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
1084; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1085; RV32IA-WMO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1086; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
1087;
1088; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
1089; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
1090; RV32IA-TSO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1091; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
1092;
1093; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
1094; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1095; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1096; RV64IA-WMO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1097; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1098;
1099; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
1100; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1101; RV64IA-TSO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1102; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1103;
1104; RV32IA-ZALASR-WMO-LABEL: atomic_store_i8_release:
1105; RV32IA-ZALASR-WMO:       # %bb.0:
1106; RV32IA-ZALASR-WMO-NEXT:    sb.rl a1, (a0)
1107; RV32IA-ZALASR-WMO-NEXT:    ret
1108;
1109; RV32IA-ZALASR-TSO-LABEL: atomic_store_i8_release:
1110; RV32IA-ZALASR-TSO:       # %bb.0:
1111; RV32IA-ZALASR-TSO-NEXT:    sb a1, 0(a0)
1112; RV32IA-ZALASR-TSO-NEXT:    ret
1113;
1114; RV64IA-ZALASR-WMO-LABEL: atomic_store_i8_release:
1115; RV64IA-ZALASR-WMO:       # %bb.0:
1116; RV64IA-ZALASR-WMO-NEXT:    sb.rl a1, (a0)
1117; RV64IA-ZALASR-WMO-NEXT:    ret
1118;
1119; RV64IA-ZALASR-TSO-LABEL: atomic_store_i8_release:
1120; RV64IA-ZALASR-TSO:       # %bb.0:
1121; RV64IA-ZALASR-TSO-NEXT:    sb a1, 0(a0)
1122; RV64IA-ZALASR-TSO-NEXT:    ret
1123  store atomic i8 %b, ptr %a release, align 1
1124  ret void
1125}
1126
1127define void @atomic_store_i8_seq_cst(ptr %a, i8 %b) nounwind {
1128; RV32I-LABEL: atomic_store_i8_seq_cst:
1129; RV32I:       # %bb.0:
1130; RV32I-NEXT:    addi sp, sp, -16
1131; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1132; RV32I-NEXT:    li a2, 5
1133; RV32I-NEXT:    call __atomic_store_1
1134; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1135; RV32I-NEXT:    addi sp, sp, 16
1136; RV32I-NEXT:    ret
1137;
1138; RV32IA-WMO-LABEL: atomic_store_i8_seq_cst:
1139; RV32IA-WMO:       # %bb.0:
1140; RV32IA-WMO-NEXT:    fence rw, w
1141; RV32IA-WMO-NEXT:    sb a1, 0(a0)
1142; RV32IA-WMO-NEXT:    ret
1143;
1144; RV32IA-TSO-LABEL: atomic_store_i8_seq_cst:
1145; RV32IA-TSO:       # %bb.0:
1146; RV32IA-TSO-NEXT:    sb a1, 0(a0)
1147; RV32IA-TSO-NEXT:    fence rw, rw
1148; RV32IA-TSO-NEXT:    ret
1149;
1150; RV64I-LABEL: atomic_store_i8_seq_cst:
1151; RV64I:       # %bb.0:
1152; RV64I-NEXT:    addi sp, sp, -16
1153; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1154; RV64I-NEXT:    li a2, 5
1155; RV64I-NEXT:    call __atomic_store_1
1156; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1157; RV64I-NEXT:    addi sp, sp, 16
1158; RV64I-NEXT:    ret
1159;
1160; RV64IA-WMO-LABEL: atomic_store_i8_seq_cst:
1161; RV64IA-WMO:       # %bb.0:
1162; RV64IA-WMO-NEXT:    fence rw, w
1163; RV64IA-WMO-NEXT:    sb a1, 0(a0)
1164; RV64IA-WMO-NEXT:    ret
1165;
1166; RV64IA-TSO-LABEL: atomic_store_i8_seq_cst:
1167; RV64IA-TSO:       # %bb.0:
1168; RV64IA-TSO-NEXT:    sb a1, 0(a0)
1169; RV64IA-TSO-NEXT:    fence rw, rw
1170; RV64IA-TSO-NEXT:    ret
1171;
1172; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
1173; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
1174; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1175; RV32IA-WMO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1176; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
1177; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
1178;
1179; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
1180; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
1181; RV32IA-TSO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1182; RV32IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
1183; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
1184;
1185; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
1186; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1187; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1188; RV64IA-WMO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1189; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
1190; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1191;
1192; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
1193; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1194; RV64IA-TSO-TRAILING-FENCE-NEXT:    sb a1, 0(a0)
1195; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
1196; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1197;
1198; RV32IA-ZALASR-LABEL: atomic_store_i8_seq_cst:
1199; RV32IA-ZALASR:       # %bb.0:
1200; RV32IA-ZALASR-NEXT:    sb.rl a1, (a0)
1201; RV32IA-ZALASR-NEXT:    ret
1202;
1203; RV64IA-ZALASR-LABEL: atomic_store_i8_seq_cst:
1204; RV64IA-ZALASR:       # %bb.0:
1205; RV64IA-ZALASR-NEXT:    sb.rl a1, (a0)
1206; RV64IA-ZALASR-NEXT:    ret
1207  store atomic i8 %b, ptr %a seq_cst, align 1
1208  ret void
1209}
1210
1211define void @atomic_store_i16_unordered(ptr %a, i16 %b) nounwind {
1212; RV32I-LABEL: atomic_store_i16_unordered:
1213; RV32I:       # %bb.0:
1214; RV32I-NEXT:    addi sp, sp, -16
1215; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1216; RV32I-NEXT:    li a2, 0
1217; RV32I-NEXT:    call __atomic_store_2
1218; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1219; RV32I-NEXT:    addi sp, sp, 16
1220; RV32I-NEXT:    ret
1221;
1222; RV32IA-LABEL: atomic_store_i16_unordered:
1223; RV32IA:       # %bb.0:
1224; RV32IA-NEXT:    sh a1, 0(a0)
1225; RV32IA-NEXT:    ret
1226;
1227; RV64I-LABEL: atomic_store_i16_unordered:
1228; RV64I:       # %bb.0:
1229; RV64I-NEXT:    addi sp, sp, -16
1230; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1231; RV64I-NEXT:    li a2, 0
1232; RV64I-NEXT:    call __atomic_store_2
1233; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1234; RV64I-NEXT:    addi sp, sp, 16
1235; RV64I-NEXT:    ret
1236;
1237; RV64IA-LABEL: atomic_store_i16_unordered:
1238; RV64IA:       # %bb.0:
1239; RV64IA-NEXT:    sh a1, 0(a0)
1240; RV64IA-NEXT:    ret
1241  store atomic i16 %b, ptr %a unordered, align 2
1242  ret void
1243}
1244
1245define void @atomic_store_i16_monotonic(ptr %a, i16 %b) nounwind {
1246; RV32I-LABEL: atomic_store_i16_monotonic:
1247; RV32I:       # %bb.0:
1248; RV32I-NEXT:    addi sp, sp, -16
1249; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1250; RV32I-NEXT:    li a2, 0
1251; RV32I-NEXT:    call __atomic_store_2
1252; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1253; RV32I-NEXT:    addi sp, sp, 16
1254; RV32I-NEXT:    ret
1255;
1256; RV32IA-LABEL: atomic_store_i16_monotonic:
1257; RV32IA:       # %bb.0:
1258; RV32IA-NEXT:    sh a1, 0(a0)
1259; RV32IA-NEXT:    ret
1260;
1261; RV64I-LABEL: atomic_store_i16_monotonic:
1262; RV64I:       # %bb.0:
1263; RV64I-NEXT:    addi sp, sp, -16
1264; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1265; RV64I-NEXT:    li a2, 0
1266; RV64I-NEXT:    call __atomic_store_2
1267; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1268; RV64I-NEXT:    addi sp, sp, 16
1269; RV64I-NEXT:    ret
1270;
1271; RV64IA-LABEL: atomic_store_i16_monotonic:
1272; RV64IA:       # %bb.0:
1273; RV64IA-NEXT:    sh a1, 0(a0)
1274; RV64IA-NEXT:    ret
1275  store atomic i16 %b, ptr %a monotonic, align 2
1276  ret void
1277}
1278
1279define void @atomic_store_i16_release(ptr %a, i16 %b) nounwind {
1280; RV32I-LABEL: atomic_store_i16_release:
1281; RV32I:       # %bb.0:
1282; RV32I-NEXT:    addi sp, sp, -16
1283; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1284; RV32I-NEXT:    li a2, 3
1285; RV32I-NEXT:    call __atomic_store_2
1286; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1287; RV32I-NEXT:    addi sp, sp, 16
1288; RV32I-NEXT:    ret
1289;
1290; RV32IA-WMO-LABEL: atomic_store_i16_release:
1291; RV32IA-WMO:       # %bb.0:
1292; RV32IA-WMO-NEXT:    fence rw, w
1293; RV32IA-WMO-NEXT:    sh a1, 0(a0)
1294; RV32IA-WMO-NEXT:    ret
1295;
1296; RV32IA-TSO-LABEL: atomic_store_i16_release:
1297; RV32IA-TSO:       # %bb.0:
1298; RV32IA-TSO-NEXT:    sh a1, 0(a0)
1299; RV32IA-TSO-NEXT:    ret
1300;
1301; RV64I-LABEL: atomic_store_i16_release:
1302; RV64I:       # %bb.0:
1303; RV64I-NEXT:    addi sp, sp, -16
1304; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1305; RV64I-NEXT:    li a2, 3
1306; RV64I-NEXT:    call __atomic_store_2
1307; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1308; RV64I-NEXT:    addi sp, sp, 16
1309; RV64I-NEXT:    ret
1310;
1311; RV64IA-WMO-LABEL: atomic_store_i16_release:
1312; RV64IA-WMO:       # %bb.0:
1313; RV64IA-WMO-NEXT:    fence rw, w
1314; RV64IA-WMO-NEXT:    sh a1, 0(a0)
1315; RV64IA-WMO-NEXT:    ret
1316;
1317; RV64IA-TSO-LABEL: atomic_store_i16_release:
1318; RV64IA-TSO:       # %bb.0:
1319; RV64IA-TSO-NEXT:    sh a1, 0(a0)
1320; RV64IA-TSO-NEXT:    ret
1321;
1322; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
1323; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
1324; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1325; RV32IA-WMO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1326; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
1327;
1328; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
1329; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
1330; RV32IA-TSO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1331; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
1332;
1333; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
1334; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1335; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1336; RV64IA-WMO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1337; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1338;
1339; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
1340; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1341; RV64IA-TSO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1342; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1343;
1344; RV32IA-ZALASR-WMO-LABEL: atomic_store_i16_release:
1345; RV32IA-ZALASR-WMO:       # %bb.0:
1346; RV32IA-ZALASR-WMO-NEXT:    sh.rl a1, (a0)
1347; RV32IA-ZALASR-WMO-NEXT:    ret
1348;
1349; RV32IA-ZALASR-TSO-LABEL: atomic_store_i16_release:
1350; RV32IA-ZALASR-TSO:       # %bb.0:
1351; RV32IA-ZALASR-TSO-NEXT:    sh a1, 0(a0)
1352; RV32IA-ZALASR-TSO-NEXT:    ret
1353;
1354; RV64IA-ZALASR-WMO-LABEL: atomic_store_i16_release:
1355; RV64IA-ZALASR-WMO:       # %bb.0:
1356; RV64IA-ZALASR-WMO-NEXT:    sh.rl a1, (a0)
1357; RV64IA-ZALASR-WMO-NEXT:    ret
1358;
1359; RV64IA-ZALASR-TSO-LABEL: atomic_store_i16_release:
1360; RV64IA-ZALASR-TSO:       # %bb.0:
1361; RV64IA-ZALASR-TSO-NEXT:    sh a1, 0(a0)
1362; RV64IA-ZALASR-TSO-NEXT:    ret
1363  store atomic i16 %b, ptr %a release, align 2
1364  ret void
1365}
1366
1367define void @atomic_store_i16_seq_cst(ptr %a, i16 %b) nounwind {
1368; RV32I-LABEL: atomic_store_i16_seq_cst:
1369; RV32I:       # %bb.0:
1370; RV32I-NEXT:    addi sp, sp, -16
1371; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1372; RV32I-NEXT:    li a2, 5
1373; RV32I-NEXT:    call __atomic_store_2
1374; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1375; RV32I-NEXT:    addi sp, sp, 16
1376; RV32I-NEXT:    ret
1377;
1378; RV32IA-WMO-LABEL: atomic_store_i16_seq_cst:
1379; RV32IA-WMO:       # %bb.0:
1380; RV32IA-WMO-NEXT:    fence rw, w
1381; RV32IA-WMO-NEXT:    sh a1, 0(a0)
1382; RV32IA-WMO-NEXT:    ret
1383;
1384; RV32IA-TSO-LABEL: atomic_store_i16_seq_cst:
1385; RV32IA-TSO:       # %bb.0:
1386; RV32IA-TSO-NEXT:    sh a1, 0(a0)
1387; RV32IA-TSO-NEXT:    fence rw, rw
1388; RV32IA-TSO-NEXT:    ret
1389;
1390; RV64I-LABEL: atomic_store_i16_seq_cst:
1391; RV64I:       # %bb.0:
1392; RV64I-NEXT:    addi sp, sp, -16
1393; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1394; RV64I-NEXT:    li a2, 5
1395; RV64I-NEXT:    call __atomic_store_2
1396; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1397; RV64I-NEXT:    addi sp, sp, 16
1398; RV64I-NEXT:    ret
1399;
1400; RV64IA-WMO-LABEL: atomic_store_i16_seq_cst:
1401; RV64IA-WMO:       # %bb.0:
1402; RV64IA-WMO-NEXT:    fence rw, w
1403; RV64IA-WMO-NEXT:    sh a1, 0(a0)
1404; RV64IA-WMO-NEXT:    ret
1405;
1406; RV64IA-TSO-LABEL: atomic_store_i16_seq_cst:
1407; RV64IA-TSO:       # %bb.0:
1408; RV64IA-TSO-NEXT:    sh a1, 0(a0)
1409; RV64IA-TSO-NEXT:    fence rw, rw
1410; RV64IA-TSO-NEXT:    ret
1411;
1412; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
1413; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
1414; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1415; RV32IA-WMO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1416; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
1417; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
1418;
1419; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
1420; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
1421; RV32IA-TSO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1422; RV32IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
1423; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
1424;
1425; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
1426; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1427; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1428; RV64IA-WMO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1429; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
1430; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1431;
1432; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
1433; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1434; RV64IA-TSO-TRAILING-FENCE-NEXT:    sh a1, 0(a0)
1435; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
1436; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1437;
1438; RV32IA-ZALASR-LABEL: atomic_store_i16_seq_cst:
1439; RV32IA-ZALASR:       # %bb.0:
1440; RV32IA-ZALASR-NEXT:    sh.rl a1, (a0)
1441; RV32IA-ZALASR-NEXT:    ret
1442;
1443; RV64IA-ZALASR-LABEL: atomic_store_i16_seq_cst:
1444; RV64IA-ZALASR:       # %bb.0:
1445; RV64IA-ZALASR-NEXT:    sh.rl a1, (a0)
1446; RV64IA-ZALASR-NEXT:    ret
1447  store atomic i16 %b, ptr %a seq_cst, align 2
1448  ret void
1449}
1450
1451define void @atomic_store_i32_unordered(ptr %a, i32 %b) nounwind {
1452; RV32I-LABEL: atomic_store_i32_unordered:
1453; RV32I:       # %bb.0:
1454; RV32I-NEXT:    addi sp, sp, -16
1455; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1456; RV32I-NEXT:    li a2, 0
1457; RV32I-NEXT:    call __atomic_store_4
1458; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1459; RV32I-NEXT:    addi sp, sp, 16
1460; RV32I-NEXT:    ret
1461;
1462; RV32IA-LABEL: atomic_store_i32_unordered:
1463; RV32IA:       # %bb.0:
1464; RV32IA-NEXT:    sw a1, 0(a0)
1465; RV32IA-NEXT:    ret
1466;
1467; RV64I-LABEL: atomic_store_i32_unordered:
1468; RV64I:       # %bb.0:
1469; RV64I-NEXT:    addi sp, sp, -16
1470; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1471; RV64I-NEXT:    li a2, 0
1472; RV64I-NEXT:    call __atomic_store_4
1473; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1474; RV64I-NEXT:    addi sp, sp, 16
1475; RV64I-NEXT:    ret
1476;
1477; RV64IA-LABEL: atomic_store_i32_unordered:
1478; RV64IA:       # %bb.0:
1479; RV64IA-NEXT:    sw a1, 0(a0)
1480; RV64IA-NEXT:    ret
1481  store atomic i32 %b, ptr %a unordered, align 4
1482  ret void
1483}
1484
1485define void @atomic_store_i32_monotonic(ptr %a, i32 %b) nounwind {
1486; RV32I-LABEL: atomic_store_i32_monotonic:
1487; RV32I:       # %bb.0:
1488; RV32I-NEXT:    addi sp, sp, -16
1489; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1490; RV32I-NEXT:    li a2, 0
1491; RV32I-NEXT:    call __atomic_store_4
1492; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1493; RV32I-NEXT:    addi sp, sp, 16
1494; RV32I-NEXT:    ret
1495;
1496; RV32IA-LABEL: atomic_store_i32_monotonic:
1497; RV32IA:       # %bb.0:
1498; RV32IA-NEXT:    sw a1, 0(a0)
1499; RV32IA-NEXT:    ret
1500;
1501; RV64I-LABEL: atomic_store_i32_monotonic:
1502; RV64I:       # %bb.0:
1503; RV64I-NEXT:    addi sp, sp, -16
1504; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1505; RV64I-NEXT:    li a2, 0
1506; RV64I-NEXT:    call __atomic_store_4
1507; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1508; RV64I-NEXT:    addi sp, sp, 16
1509; RV64I-NEXT:    ret
1510;
1511; RV64IA-LABEL: atomic_store_i32_monotonic:
1512; RV64IA:       # %bb.0:
1513; RV64IA-NEXT:    sw a1, 0(a0)
1514; RV64IA-NEXT:    ret
1515  store atomic i32 %b, ptr %a monotonic, align 4
1516  ret void
1517}
1518
1519define void @atomic_store_i32_release(ptr %a, i32 %b) nounwind {
1520; RV32I-LABEL: atomic_store_i32_release:
1521; RV32I:       # %bb.0:
1522; RV32I-NEXT:    addi sp, sp, -16
1523; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1524; RV32I-NEXT:    li a2, 3
1525; RV32I-NEXT:    call __atomic_store_4
1526; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1527; RV32I-NEXT:    addi sp, sp, 16
1528; RV32I-NEXT:    ret
1529;
1530; RV32IA-WMO-LABEL: atomic_store_i32_release:
1531; RV32IA-WMO:       # %bb.0:
1532; RV32IA-WMO-NEXT:    fence rw, w
1533; RV32IA-WMO-NEXT:    sw a1, 0(a0)
1534; RV32IA-WMO-NEXT:    ret
1535;
1536; RV32IA-TSO-LABEL: atomic_store_i32_release:
1537; RV32IA-TSO:       # %bb.0:
1538; RV32IA-TSO-NEXT:    sw a1, 0(a0)
1539; RV32IA-TSO-NEXT:    ret
1540;
1541; RV64I-LABEL: atomic_store_i32_release:
1542; RV64I:       # %bb.0:
1543; RV64I-NEXT:    addi sp, sp, -16
1544; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1545; RV64I-NEXT:    li a2, 3
1546; RV64I-NEXT:    call __atomic_store_4
1547; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1548; RV64I-NEXT:    addi sp, sp, 16
1549; RV64I-NEXT:    ret
1550;
1551; RV64IA-WMO-LABEL: atomic_store_i32_release:
1552; RV64IA-WMO:       # %bb.0:
1553; RV64IA-WMO-NEXT:    fence rw, w
1554; RV64IA-WMO-NEXT:    sw a1, 0(a0)
1555; RV64IA-WMO-NEXT:    ret
1556;
1557; RV64IA-TSO-LABEL: atomic_store_i32_release:
1558; RV64IA-TSO:       # %bb.0:
1559; RV64IA-TSO-NEXT:    sw a1, 0(a0)
1560; RV64IA-TSO-NEXT:    ret
1561;
1562; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
1563; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
1564; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1565; RV32IA-WMO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1566; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
1567;
1568; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
1569; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
1570; RV32IA-TSO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1571; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
1572;
1573; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
1574; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1575; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1576; RV64IA-WMO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1577; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1578;
1579; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
1580; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1581; RV64IA-TSO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1582; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1583;
1584; RV32IA-ZALASR-WMO-LABEL: atomic_store_i32_release:
1585; RV32IA-ZALASR-WMO:       # %bb.0:
1586; RV32IA-ZALASR-WMO-NEXT:    sw.rl a1, (a0)
1587; RV32IA-ZALASR-WMO-NEXT:    ret
1588;
1589; RV32IA-ZALASR-TSO-LABEL: atomic_store_i32_release:
1590; RV32IA-ZALASR-TSO:       # %bb.0:
1591; RV32IA-ZALASR-TSO-NEXT:    sw a1, 0(a0)
1592; RV32IA-ZALASR-TSO-NEXT:    ret
1593;
1594; RV64IA-ZALASR-WMO-LABEL: atomic_store_i32_release:
1595; RV64IA-ZALASR-WMO:       # %bb.0:
1596; RV64IA-ZALASR-WMO-NEXT:    sw.rl a1, (a0)
1597; RV64IA-ZALASR-WMO-NEXT:    ret
1598;
1599; RV64IA-ZALASR-TSO-LABEL: atomic_store_i32_release:
1600; RV64IA-ZALASR-TSO:       # %bb.0:
1601; RV64IA-ZALASR-TSO-NEXT:    sw a1, 0(a0)
1602; RV64IA-ZALASR-TSO-NEXT:    ret
1603  store atomic i32 %b, ptr %a release, align 4
1604  ret void
1605}
1606
1607define void @atomic_store_i32_seq_cst(ptr %a, i32 %b) nounwind {
1608; RV32I-LABEL: atomic_store_i32_seq_cst:
1609; RV32I:       # %bb.0:
1610; RV32I-NEXT:    addi sp, sp, -16
1611; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1612; RV32I-NEXT:    li a2, 5
1613; RV32I-NEXT:    call __atomic_store_4
1614; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1615; RV32I-NEXT:    addi sp, sp, 16
1616; RV32I-NEXT:    ret
1617;
1618; RV32IA-WMO-LABEL: atomic_store_i32_seq_cst:
1619; RV32IA-WMO:       # %bb.0:
1620; RV32IA-WMO-NEXT:    fence rw, w
1621; RV32IA-WMO-NEXT:    sw a1, 0(a0)
1622; RV32IA-WMO-NEXT:    ret
1623;
1624; RV32IA-TSO-LABEL: atomic_store_i32_seq_cst:
1625; RV32IA-TSO:       # %bb.0:
1626; RV32IA-TSO-NEXT:    sw a1, 0(a0)
1627; RV32IA-TSO-NEXT:    fence rw, rw
1628; RV32IA-TSO-NEXT:    ret
1629;
1630; RV64I-LABEL: atomic_store_i32_seq_cst:
1631; RV64I:       # %bb.0:
1632; RV64I-NEXT:    addi sp, sp, -16
1633; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1634; RV64I-NEXT:    li a2, 5
1635; RV64I-NEXT:    call __atomic_store_4
1636; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1637; RV64I-NEXT:    addi sp, sp, 16
1638; RV64I-NEXT:    ret
1639;
1640; RV64IA-WMO-LABEL: atomic_store_i32_seq_cst:
1641; RV64IA-WMO:       # %bb.0:
1642; RV64IA-WMO-NEXT:    fence rw, w
1643; RV64IA-WMO-NEXT:    sw a1, 0(a0)
1644; RV64IA-WMO-NEXT:    ret
1645;
1646; RV64IA-TSO-LABEL: atomic_store_i32_seq_cst:
1647; RV64IA-TSO:       # %bb.0:
1648; RV64IA-TSO-NEXT:    sw a1, 0(a0)
1649; RV64IA-TSO-NEXT:    fence rw, rw
1650; RV64IA-TSO-NEXT:    ret
1651;
1652; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
1653; RV32IA-WMO-TRAILING-FENCE:       # %bb.0:
1654; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1655; RV32IA-WMO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1656; RV32IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
1657; RV32IA-WMO-TRAILING-FENCE-NEXT:    ret
1658;
1659; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
1660; RV32IA-TSO-TRAILING-FENCE:       # %bb.0:
1661; RV32IA-TSO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1662; RV32IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
1663; RV32IA-TSO-TRAILING-FENCE-NEXT:    ret
1664;
1665; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
1666; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1667; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1668; RV64IA-WMO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1669; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
1670; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1671;
1672; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
1673; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1674; RV64IA-TSO-TRAILING-FENCE-NEXT:    sw a1, 0(a0)
1675; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
1676; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1677;
1678; RV32IA-ZALASR-LABEL: atomic_store_i32_seq_cst:
1679; RV32IA-ZALASR:       # %bb.0:
1680; RV32IA-ZALASR-NEXT:    sw.rl a1, (a0)
1681; RV32IA-ZALASR-NEXT:    ret
1682;
1683; RV64IA-ZALASR-LABEL: atomic_store_i32_seq_cst:
1684; RV64IA-ZALASR:       # %bb.0:
1685; RV64IA-ZALASR-NEXT:    sw.rl a1, (a0)
1686; RV64IA-ZALASR-NEXT:    ret
1687  store atomic i32 %b, ptr %a seq_cst, align 4
1688  ret void
1689}
1690
1691define void @atomic_store_i64_unordered(ptr %a, i64 %b) nounwind {
1692; RV32I-LABEL: atomic_store_i64_unordered:
1693; RV32I:       # %bb.0:
1694; RV32I-NEXT:    addi sp, sp, -16
1695; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1696; RV32I-NEXT:    li a3, 0
1697; RV32I-NEXT:    call __atomic_store_8
1698; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1699; RV32I-NEXT:    addi sp, sp, 16
1700; RV32I-NEXT:    ret
1701;
1702; RV32IA-LABEL: atomic_store_i64_unordered:
1703; RV32IA:       # %bb.0:
1704; RV32IA-NEXT:    addi sp, sp, -16
1705; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1706; RV32IA-NEXT:    li a3, 0
1707; RV32IA-NEXT:    call __atomic_store_8
1708; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1709; RV32IA-NEXT:    addi sp, sp, 16
1710; RV32IA-NEXT:    ret
1711;
1712; RV64I-LABEL: atomic_store_i64_unordered:
1713; RV64I:       # %bb.0:
1714; RV64I-NEXT:    addi sp, sp, -16
1715; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1716; RV64I-NEXT:    li a2, 0
1717; RV64I-NEXT:    call __atomic_store_8
1718; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1719; RV64I-NEXT:    addi sp, sp, 16
1720; RV64I-NEXT:    ret
1721;
1722; RV64IA-LABEL: atomic_store_i64_unordered:
1723; RV64IA:       # %bb.0:
1724; RV64IA-NEXT:    sd a1, 0(a0)
1725; RV64IA-NEXT:    ret
1726  store atomic i64 %b, ptr %a unordered, align 8
1727  ret void
1728}
1729
1730define void @atomic_store_i64_monotonic(ptr %a, i64 %b) nounwind {
1731; RV32I-LABEL: atomic_store_i64_monotonic:
1732; RV32I:       # %bb.0:
1733; RV32I-NEXT:    addi sp, sp, -16
1734; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1735; RV32I-NEXT:    li a3, 0
1736; RV32I-NEXT:    call __atomic_store_8
1737; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1738; RV32I-NEXT:    addi sp, sp, 16
1739; RV32I-NEXT:    ret
1740;
1741; RV32IA-LABEL: atomic_store_i64_monotonic:
1742; RV32IA:       # %bb.0:
1743; RV32IA-NEXT:    addi sp, sp, -16
1744; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1745; RV32IA-NEXT:    li a3, 0
1746; RV32IA-NEXT:    call __atomic_store_8
1747; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1748; RV32IA-NEXT:    addi sp, sp, 16
1749; RV32IA-NEXT:    ret
1750;
1751; RV64I-LABEL: atomic_store_i64_monotonic:
1752; RV64I:       # %bb.0:
1753; RV64I-NEXT:    addi sp, sp, -16
1754; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1755; RV64I-NEXT:    li a2, 0
1756; RV64I-NEXT:    call __atomic_store_8
1757; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1758; RV64I-NEXT:    addi sp, sp, 16
1759; RV64I-NEXT:    ret
1760;
1761; RV64IA-LABEL: atomic_store_i64_monotonic:
1762; RV64IA:       # %bb.0:
1763; RV64IA-NEXT:    sd a1, 0(a0)
1764; RV64IA-NEXT:    ret
1765  store atomic i64 %b, ptr %a monotonic, align 8
1766  ret void
1767}
1768
1769define void @atomic_store_i64_release(ptr %a, i64 %b) nounwind {
1770; RV32I-LABEL: atomic_store_i64_release:
1771; RV32I:       # %bb.0:
1772; RV32I-NEXT:    addi sp, sp, -16
1773; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1774; RV32I-NEXT:    li a3, 3
1775; RV32I-NEXT:    call __atomic_store_8
1776; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1777; RV32I-NEXT:    addi sp, sp, 16
1778; RV32I-NEXT:    ret
1779;
1780; RV32IA-LABEL: atomic_store_i64_release:
1781; RV32IA:       # %bb.0:
1782; RV32IA-NEXT:    addi sp, sp, -16
1783; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1784; RV32IA-NEXT:    li a3, 3
1785; RV32IA-NEXT:    call __atomic_store_8
1786; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1787; RV32IA-NEXT:    addi sp, sp, 16
1788; RV32IA-NEXT:    ret
1789;
1790; RV64I-LABEL: atomic_store_i64_release:
1791; RV64I:       # %bb.0:
1792; RV64I-NEXT:    addi sp, sp, -16
1793; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1794; RV64I-NEXT:    li a2, 3
1795; RV64I-NEXT:    call __atomic_store_8
1796; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1797; RV64I-NEXT:    addi sp, sp, 16
1798; RV64I-NEXT:    ret
1799;
1800; RV64IA-WMO-LABEL: atomic_store_i64_release:
1801; RV64IA-WMO:       # %bb.0:
1802; RV64IA-WMO-NEXT:    fence rw, w
1803; RV64IA-WMO-NEXT:    sd a1, 0(a0)
1804; RV64IA-WMO-NEXT:    ret
1805;
1806; RV64IA-TSO-LABEL: atomic_store_i64_release:
1807; RV64IA-TSO:       # %bb.0:
1808; RV64IA-TSO-NEXT:    sd a1, 0(a0)
1809; RV64IA-TSO-NEXT:    ret
1810;
1811; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i64_release:
1812; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1813; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1814; RV64IA-WMO-TRAILING-FENCE-NEXT:    sd a1, 0(a0)
1815; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1816;
1817; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i64_release:
1818; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1819; RV64IA-TSO-TRAILING-FENCE-NEXT:    sd a1, 0(a0)
1820; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1821;
1822; RV64IA-ZALASR-WMO-LABEL: atomic_store_i64_release:
1823; RV64IA-ZALASR-WMO:       # %bb.0:
1824; RV64IA-ZALASR-WMO-NEXT:    sd.rl a1, (a0)
1825; RV64IA-ZALASR-WMO-NEXT:    ret
1826;
1827; RV64IA-ZALASR-TSO-LABEL: atomic_store_i64_release:
1828; RV64IA-ZALASR-TSO:       # %bb.0:
1829; RV64IA-ZALASR-TSO-NEXT:    sd a1, 0(a0)
1830; RV64IA-ZALASR-TSO-NEXT:    ret
1831  store atomic i64 %b, ptr %a release, align 8
1832  ret void
1833}
1834
1835define void @atomic_store_i64_seq_cst(ptr %a, i64 %b) nounwind {
1836; RV32I-LABEL: atomic_store_i64_seq_cst:
1837; RV32I:       # %bb.0:
1838; RV32I-NEXT:    addi sp, sp, -16
1839; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1840; RV32I-NEXT:    li a3, 5
1841; RV32I-NEXT:    call __atomic_store_8
1842; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1843; RV32I-NEXT:    addi sp, sp, 16
1844; RV32I-NEXT:    ret
1845;
1846; RV32IA-LABEL: atomic_store_i64_seq_cst:
1847; RV32IA:       # %bb.0:
1848; RV32IA-NEXT:    addi sp, sp, -16
1849; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1850; RV32IA-NEXT:    li a3, 5
1851; RV32IA-NEXT:    call __atomic_store_8
1852; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1853; RV32IA-NEXT:    addi sp, sp, 16
1854; RV32IA-NEXT:    ret
1855;
1856; RV64I-LABEL: atomic_store_i64_seq_cst:
1857; RV64I:       # %bb.0:
1858; RV64I-NEXT:    addi sp, sp, -16
1859; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1860; RV64I-NEXT:    li a2, 5
1861; RV64I-NEXT:    call __atomic_store_8
1862; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1863; RV64I-NEXT:    addi sp, sp, 16
1864; RV64I-NEXT:    ret
1865;
1866; RV64IA-WMO-LABEL: atomic_store_i64_seq_cst:
1867; RV64IA-WMO:       # %bb.0:
1868; RV64IA-WMO-NEXT:    fence rw, w
1869; RV64IA-WMO-NEXT:    sd a1, 0(a0)
1870; RV64IA-WMO-NEXT:    ret
1871;
1872; RV64IA-TSO-LABEL: atomic_store_i64_seq_cst:
1873; RV64IA-TSO:       # %bb.0:
1874; RV64IA-TSO-NEXT:    sd a1, 0(a0)
1875; RV64IA-TSO-NEXT:    fence rw, rw
1876; RV64IA-TSO-NEXT:    ret
1877;
1878; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i64_seq_cst:
1879; RV64IA-WMO-TRAILING-FENCE:       # %bb.0:
1880; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, w
1881; RV64IA-WMO-TRAILING-FENCE-NEXT:    sd a1, 0(a0)
1882; RV64IA-WMO-TRAILING-FENCE-NEXT:    fence rw, rw
1883; RV64IA-WMO-TRAILING-FENCE-NEXT:    ret
1884;
1885; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i64_seq_cst:
1886; RV64IA-TSO-TRAILING-FENCE:       # %bb.0:
1887; RV64IA-TSO-TRAILING-FENCE-NEXT:    sd a1, 0(a0)
1888; RV64IA-TSO-TRAILING-FENCE-NEXT:    fence rw, rw
1889; RV64IA-TSO-TRAILING-FENCE-NEXT:    ret
1890;
1891; RV64IA-ZALASR-LABEL: atomic_store_i64_seq_cst:
1892; RV64IA-ZALASR:       # %bb.0:
1893; RV64IA-ZALASR-NEXT:    sd.rl a1, (a0)
1894; RV64IA-ZALASR-NEXT:    ret
1895  store atomic i64 %b, ptr %a seq_cst, align 8
1896  ret void
1897}
1898