xref: /llvm-project/llvm/test/CodeGen/M68k/Atomics/load-store.ll (revision 4cce10743d2275710d3d2e0de8013386a9799092)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 | FileCheck %s --check-prefix=NO-ATOMIC
3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 | FileCheck %s --check-prefix=NO-ATOMIC
4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 | FileCheck %s --check-prefix=ATOMIC
5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 | FileCheck %s --check-prefix=ATOMIC
6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 | FileCheck %s --check-prefix=ATOMIC
7
8define i8 @atomic_load_i8_unordered(ptr %a) nounwind {
9; NO-ATOMIC-LABEL: atomic_load_i8_unordered:
10; NO-ATOMIC:       ; %bb.0:
11; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
12; NO-ATOMIC-NEXT:    move.b (%a0), %d0
13; NO-ATOMIC-NEXT:    rts
14;
15; ATOMIC-LABEL: atomic_load_i8_unordered:
16; ATOMIC:       ; %bb.0:
17; ATOMIC-NEXT:    move.l (4,%sp), %a0
18; ATOMIC-NEXT:    move.b (%a0), %d0
19; ATOMIC-NEXT:    rts
20  %1 = load atomic i8, ptr %a unordered, align 1
21  ret i8 %1
22}
23
24define i8 @atomic_load_i8_monotonic(ptr %a) nounwind {
25; NO-ATOMIC-LABEL: atomic_load_i8_monotonic:
26; NO-ATOMIC:       ; %bb.0:
27; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
28; NO-ATOMIC-NEXT:    move.b (%a0), %d0
29; NO-ATOMIC-NEXT:    rts
30;
31; ATOMIC-LABEL: atomic_load_i8_monotonic:
32; ATOMIC:       ; %bb.0:
33; ATOMIC-NEXT:    move.l (4,%sp), %a0
34; ATOMIC-NEXT:    move.b (%a0), %d0
35; ATOMIC-NEXT:    rts
36  %1 = load atomic i8, ptr %a monotonic, align 1
37  ret i8 %1
38}
39
40define i8 @atomic_load_i8_acquire(ptr %a) nounwind {
41; NO-ATOMIC-LABEL: atomic_load_i8_acquire:
42; NO-ATOMIC:       ; %bb.0:
43; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
44; NO-ATOMIC-NEXT:    move.b (%a0), %d0
45; NO-ATOMIC-NEXT:    rts
46;
47; ATOMIC-LABEL: atomic_load_i8_acquire:
48; ATOMIC:       ; %bb.0:
49; ATOMIC-NEXT:    move.l (4,%sp), %a0
50; ATOMIC-NEXT:    move.b (%a0), %d0
51; ATOMIC-NEXT:    rts
52  %1 = load atomic i8, ptr %a acquire, align 1
53  ret i8 %1
54}
55
56define i8 @atomic_load_i8_seq_cst(ptr %a) nounwind {
57; NO-ATOMIC-LABEL: atomic_load_i8_seq_cst:
58; NO-ATOMIC:       ; %bb.0:
59; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
60; NO-ATOMIC-NEXT:    move.b (%a0), %d0
61; NO-ATOMIC-NEXT:    rts
62;
63; ATOMIC-LABEL: atomic_load_i8_seq_cst:
64; ATOMIC:       ; %bb.0:
65; ATOMIC-NEXT:    move.l (4,%sp), %a0
66; ATOMIC-NEXT:    move.b (%a0), %d0
67; ATOMIC-NEXT:    rts
68  %1 = load atomic i8, ptr %a seq_cst, align 1
69  ret i8 %1
70}
71
72define i16 @atomic_load_i16_unordered(ptr %a) nounwind {
73; NO-ATOMIC-LABEL: atomic_load_i16_unordered:
74; NO-ATOMIC:       ; %bb.0:
75; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
76; NO-ATOMIC-NEXT:    move.w (%a0), %d0
77; NO-ATOMIC-NEXT:    rts
78;
79; ATOMIC-LABEL: atomic_load_i16_unordered:
80; ATOMIC:       ; %bb.0:
81; ATOMIC-NEXT:    move.l (4,%sp), %a0
82; ATOMIC-NEXT:    move.w (%a0), %d0
83; ATOMIC-NEXT:    rts
84  %1 = load atomic i16, ptr %a unordered, align 2
85  ret i16 %1
86}
87
88define i16 @atomic_load_i16_monotonic(ptr %a) nounwind {
89; NO-ATOMIC-LABEL: atomic_load_i16_monotonic:
90; NO-ATOMIC:       ; %bb.0:
91; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
92; NO-ATOMIC-NEXT:    move.w (%a0), %d0
93; NO-ATOMIC-NEXT:    rts
94;
95; ATOMIC-LABEL: atomic_load_i16_monotonic:
96; ATOMIC:       ; %bb.0:
97; ATOMIC-NEXT:    move.l (4,%sp), %a0
98; ATOMIC-NEXT:    move.w (%a0), %d0
99; ATOMIC-NEXT:    rts
100  %1 = load atomic i16, ptr %a monotonic, align 2
101  ret i16 %1
102}
103
104define i16 @atomic_load_i16_acquire(ptr %a) nounwind {
105; NO-ATOMIC-LABEL: atomic_load_i16_acquire:
106; NO-ATOMIC:       ; %bb.0:
107; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
108; NO-ATOMIC-NEXT:    move.w (%a0), %d0
109; NO-ATOMIC-NEXT:    rts
110;
111; ATOMIC-LABEL: atomic_load_i16_acquire:
112; ATOMIC:       ; %bb.0:
113; ATOMIC-NEXT:    move.l (4,%sp), %a0
114; ATOMIC-NEXT:    move.w (%a0), %d0
115; ATOMIC-NEXT:    rts
116  %1 = load atomic i16, ptr %a acquire, align 2
117  ret i16 %1
118}
119
120define i16 @atomic_load_i16_seq_cst(ptr %a) nounwind {
121; NO-ATOMIC-LABEL: atomic_load_i16_seq_cst:
122; NO-ATOMIC:       ; %bb.0:
123; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
124; NO-ATOMIC-NEXT:    move.w (%a0), %d0
125; NO-ATOMIC-NEXT:    rts
126;
127; ATOMIC-LABEL: atomic_load_i16_seq_cst:
128; ATOMIC:       ; %bb.0:
129; ATOMIC-NEXT:    move.l (4,%sp), %a0
130; ATOMIC-NEXT:    move.w (%a0), %d0
131; ATOMIC-NEXT:    rts
132  %1 = load atomic i16, ptr %a seq_cst, align 2
133  ret i16 %1
134}
135
136define i32 @atomic_load_i32_unordered(ptr %a) nounwind {
137; NO-ATOMIC-LABEL: atomic_load_i32_unordered:
138; NO-ATOMIC:       ; %bb.0:
139; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
140; NO-ATOMIC-NEXT:    move.l (%a0), %d0
141; NO-ATOMIC-NEXT:    rts
142;
143; ATOMIC-LABEL: atomic_load_i32_unordered:
144; ATOMIC:       ; %bb.0:
145; ATOMIC-NEXT:    move.l (4,%sp), %a0
146; ATOMIC-NEXT:    move.l (%a0), %d0
147; ATOMIC-NEXT:    rts
148  %1 = load atomic i32, ptr %a unordered, align 4
149  ret i32 %1
150}
151
152define i32 @atomic_load_i32_monotonic(ptr %a) nounwind {
153; NO-ATOMIC-LABEL: atomic_load_i32_monotonic:
154; NO-ATOMIC:       ; %bb.0:
155; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
156; NO-ATOMIC-NEXT:    move.l (%a0), %d0
157; NO-ATOMIC-NEXT:    rts
158;
159; ATOMIC-LABEL: atomic_load_i32_monotonic:
160; ATOMIC:       ; %bb.0:
161; ATOMIC-NEXT:    move.l (4,%sp), %a0
162; ATOMIC-NEXT:    move.l (%a0), %d0
163; ATOMIC-NEXT:    rts
164  %1 = load atomic i32, ptr %a monotonic, align 4
165  ret i32 %1
166}
167
168define i32 @atomic_load_i32_acquire(ptr %a) nounwind {
169; NO-ATOMIC-LABEL: atomic_load_i32_acquire:
170; NO-ATOMIC:       ; %bb.0:
171; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
172; NO-ATOMIC-NEXT:    move.l (%a0), %d0
173; NO-ATOMIC-NEXT:    rts
174;
175; ATOMIC-LABEL: atomic_load_i32_acquire:
176; ATOMIC:       ; %bb.0:
177; ATOMIC-NEXT:    move.l (4,%sp), %a0
178; ATOMIC-NEXT:    move.l (%a0), %d0
179; ATOMIC-NEXT:    rts
180  %1 = load atomic i32, ptr %a acquire, align 4
181  ret i32 %1
182}
183
184define i32 @atomic_load_i32_seq_cst(ptr %a) nounwind {
185; NO-ATOMIC-LABEL: atomic_load_i32_seq_cst:
186; NO-ATOMIC:       ; %bb.0:
187; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
188; NO-ATOMIC-NEXT:    move.l (%a0), %d0
189; NO-ATOMIC-NEXT:    rts
190;
191; ATOMIC-LABEL: atomic_load_i32_seq_cst:
192; ATOMIC:       ; %bb.0:
193; ATOMIC-NEXT:    move.l (4,%sp), %a0
194; ATOMIC-NEXT:    move.l (%a0), %d0
195; ATOMIC-NEXT:    rts
196  %1 = load atomic i32, ptr %a seq_cst, align 4
197  ret i32 %1
198}
199
200define i64 @atomic_load_i64_unordered(ptr %a) nounwind {
201; NO-ATOMIC-LABEL: atomic_load_i64_unordered:
202; NO-ATOMIC:       ; %bb.0:
203; NO-ATOMIC-NEXT:    suba.l #12, %sp
204; NO-ATOMIC-NEXT:    move.l #0, (4,%sp)
205; NO-ATOMIC-NEXT:    move.l (16,%sp), (%sp)
206; NO-ATOMIC-NEXT:    jsr __atomic_load_8
207; NO-ATOMIC-NEXT:    adda.l #12, %sp
208; NO-ATOMIC-NEXT:    rts
209;
210; ATOMIC-LABEL: atomic_load_i64_unordered:
211; ATOMIC:       ; %bb.0:
212; ATOMIC-NEXT:    suba.l #12, %sp
213; ATOMIC-NEXT:    move.l #0, (4,%sp)
214; ATOMIC-NEXT:    move.l (16,%sp), (%sp)
215; ATOMIC-NEXT:    jsr __atomic_load_8
216; ATOMIC-NEXT:    adda.l #12, %sp
217; ATOMIC-NEXT:    rts
218  %1 = load atomic i64, ptr %a unordered, align 8
219  ret i64 %1
220}
221
222define i64 @atomic_load_i64_monotonic(ptr %a) nounwind {
223; NO-ATOMIC-LABEL: atomic_load_i64_monotonic:
224; NO-ATOMIC:       ; %bb.0:
225; NO-ATOMIC-NEXT:    suba.l #12, %sp
226; NO-ATOMIC-NEXT:    move.l #0, (4,%sp)
227; NO-ATOMIC-NEXT:    move.l (16,%sp), (%sp)
228; NO-ATOMIC-NEXT:    jsr __atomic_load_8
229; NO-ATOMIC-NEXT:    adda.l #12, %sp
230; NO-ATOMIC-NEXT:    rts
231;
232; ATOMIC-LABEL: atomic_load_i64_monotonic:
233; ATOMIC:       ; %bb.0:
234; ATOMIC-NEXT:    suba.l #12, %sp
235; ATOMIC-NEXT:    move.l #0, (4,%sp)
236; ATOMIC-NEXT:    move.l (16,%sp), (%sp)
237; ATOMIC-NEXT:    jsr __atomic_load_8
238; ATOMIC-NEXT:    adda.l #12, %sp
239; ATOMIC-NEXT:    rts
240  %1 = load atomic i64, ptr %a monotonic, align 8
241  ret i64 %1
242}
243
244define i64 @atomic_load_i64_acquire(ptr %a) nounwind {
245; NO-ATOMIC-LABEL: atomic_load_i64_acquire:
246; NO-ATOMIC:       ; %bb.0:
247; NO-ATOMIC-NEXT:    suba.l #12, %sp
248; NO-ATOMIC-NEXT:    move.l #2, (4,%sp)
249; NO-ATOMIC-NEXT:    move.l (16,%sp), (%sp)
250; NO-ATOMIC-NEXT:    jsr __atomic_load_8
251; NO-ATOMIC-NEXT:    adda.l #12, %sp
252; NO-ATOMIC-NEXT:    rts
253;
254; ATOMIC-LABEL: atomic_load_i64_acquire:
255; ATOMIC:       ; %bb.0:
256; ATOMIC-NEXT:    suba.l #12, %sp
257; ATOMIC-NEXT:    move.l #2, (4,%sp)
258; ATOMIC-NEXT:    move.l (16,%sp), (%sp)
259; ATOMIC-NEXT:    jsr __atomic_load_8
260; ATOMIC-NEXT:    adda.l #12, %sp
261; ATOMIC-NEXT:    rts
262  %1 = load atomic i64, ptr %a acquire, align 8
263  ret i64 %1
264}
265
266define i64 @atomic_load_i64_seq_cst(ptr %a) nounwind {
267; NO-ATOMIC-LABEL: atomic_load_i64_seq_cst:
268; NO-ATOMIC:       ; %bb.0:
269; NO-ATOMIC-NEXT:    suba.l #12, %sp
270; NO-ATOMIC-NEXT:    move.l #5, (4,%sp)
271; NO-ATOMIC-NEXT:    move.l (16,%sp), (%sp)
272; NO-ATOMIC-NEXT:    jsr __atomic_load_8
273; NO-ATOMIC-NEXT:    adda.l #12, %sp
274; NO-ATOMIC-NEXT:    rts
275;
276; ATOMIC-LABEL: atomic_load_i64_seq_cst:
277; ATOMIC:       ; %bb.0:
278; ATOMIC-NEXT:    suba.l #12, %sp
279; ATOMIC-NEXT:    move.l #5, (4,%sp)
280; ATOMIC-NEXT:    move.l (16,%sp), (%sp)
281; ATOMIC-NEXT:    jsr __atomic_load_8
282; ATOMIC-NEXT:    adda.l #12, %sp
283; ATOMIC-NEXT:    rts
284  %1 = load atomic i64, ptr %a seq_cst, align 8
285  ret i64 %1
286}
287
288define void @atomic_store_i8_unordered(ptr %a, i8 %val) nounwind {
289; NO-ATOMIC-LABEL: atomic_store_i8_unordered:
290; NO-ATOMIC:       ; %bb.0:
291; NO-ATOMIC-NEXT:    move.b (11,%sp), %d0
292; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
293; NO-ATOMIC-NEXT:    move.b %d0, (%a0)
294; NO-ATOMIC-NEXT:    rts
295;
296; ATOMIC-LABEL: atomic_store_i8_unordered:
297; ATOMIC:       ; %bb.0:
298; ATOMIC-NEXT:    move.b (11,%sp), %d0
299; ATOMIC-NEXT:    move.l (4,%sp), %a0
300; ATOMIC-NEXT:    move.b %d0, (%a0)
301; ATOMIC-NEXT:    rts
302  store atomic i8 %val, ptr %a unordered, align 1
303  ret void
304}
305
306define void @atomic_store_i8_monotonic(ptr %a, i8 %val) nounwind {
307; NO-ATOMIC-LABEL: atomic_store_i8_monotonic:
308; NO-ATOMIC:       ; %bb.0:
309; NO-ATOMIC-NEXT:    move.b (11,%sp), %d0
310; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
311; NO-ATOMIC-NEXT:    move.b %d0, (%a0)
312; NO-ATOMIC-NEXT:    rts
313;
314; ATOMIC-LABEL: atomic_store_i8_monotonic:
315; ATOMIC:       ; %bb.0:
316; ATOMIC-NEXT:    move.b (11,%sp), %d0
317; ATOMIC-NEXT:    move.l (4,%sp), %a0
318; ATOMIC-NEXT:    move.b %d0, (%a0)
319; ATOMIC-NEXT:    rts
320  store atomic i8 %val, ptr %a monotonic, align 1
321  ret void
322}
323
324define void @atomic_store_i8_release(ptr %a, i8 %val) nounwind {
325; NO-ATOMIC-LABEL: atomic_store_i8_release:
326; NO-ATOMIC:       ; %bb.0:
327; NO-ATOMIC-NEXT:    move.b (11,%sp), %d0
328; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
329; NO-ATOMIC-NEXT:    move.b %d0, (%a0)
330; NO-ATOMIC-NEXT:    rts
331;
332; ATOMIC-LABEL: atomic_store_i8_release:
333; ATOMIC:       ; %bb.0:
334; ATOMIC-NEXT:    move.b (11,%sp), %d0
335; ATOMIC-NEXT:    move.l (4,%sp), %a0
336; ATOMIC-NEXT:    move.b %d0, (%a0)
337; ATOMIC-NEXT:    rts
338  store atomic i8 %val, ptr %a release, align 1
339  ret void
340}
341
342define void @atomic_store_i8_seq_cst(ptr %a, i8 %val) nounwind {
343; NO-ATOMIC-LABEL: atomic_store_i8_seq_cst:
344; NO-ATOMIC:       ; %bb.0:
345; NO-ATOMIC-NEXT:    move.b (11,%sp), %d0
346; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
347; NO-ATOMIC-NEXT:    move.b %d0, (%a0)
348; NO-ATOMIC-NEXT:    rts
349;
350; ATOMIC-LABEL: atomic_store_i8_seq_cst:
351; ATOMIC:       ; %bb.0:
352; ATOMIC-NEXT:    move.b (11,%sp), %d0
353; ATOMIC-NEXT:    move.l (4,%sp), %a0
354; ATOMIC-NEXT:    move.b %d0, (%a0)
355; ATOMIC-NEXT:    rts
356  store atomic i8 %val, ptr %a seq_cst, align 1
357  ret void
358}
359
360define void @atomic_store_i16_unordered(ptr %a, i16 %val) nounwind {
361; NO-ATOMIC-LABEL: atomic_store_i16_unordered:
362; NO-ATOMIC:       ; %bb.0:
363; NO-ATOMIC-NEXT:    move.w (10,%sp), %d0
364; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
365; NO-ATOMIC-NEXT:    move.w %d0, (%a0)
366; NO-ATOMIC-NEXT:    rts
367;
368; ATOMIC-LABEL: atomic_store_i16_unordered:
369; ATOMIC:       ; %bb.0:
370; ATOMIC-NEXT:    move.w (10,%sp), %d0
371; ATOMIC-NEXT:    move.l (4,%sp), %a0
372; ATOMIC-NEXT:    move.w %d0, (%a0)
373; ATOMIC-NEXT:    rts
374  store atomic i16 %val, ptr %a unordered, align 2
375  ret void
376}
377
378define void @atomic_store_i16_monotonic(ptr %a, i16 %val) nounwind {
379; NO-ATOMIC-LABEL: atomic_store_i16_monotonic:
380; NO-ATOMIC:       ; %bb.0:
381; NO-ATOMIC-NEXT:    move.w (10,%sp), %d0
382; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
383; NO-ATOMIC-NEXT:    move.w %d0, (%a0)
384; NO-ATOMIC-NEXT:    rts
385;
386; ATOMIC-LABEL: atomic_store_i16_monotonic:
387; ATOMIC:       ; %bb.0:
388; ATOMIC-NEXT:    move.w (10,%sp), %d0
389; ATOMIC-NEXT:    move.l (4,%sp), %a0
390; ATOMIC-NEXT:    move.w %d0, (%a0)
391; ATOMIC-NEXT:    rts
392  store atomic i16 %val, ptr %a monotonic, align 2
393  ret void
394}
395
396define void @atomic_store_i16_release(ptr %a, i16 %val) nounwind {
397; NO-ATOMIC-LABEL: atomic_store_i16_release:
398; NO-ATOMIC:       ; %bb.0:
399; NO-ATOMIC-NEXT:    move.w (10,%sp), %d0
400; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
401; NO-ATOMIC-NEXT:    move.w %d0, (%a0)
402; NO-ATOMIC-NEXT:    rts
403;
404; ATOMIC-LABEL: atomic_store_i16_release:
405; ATOMIC:       ; %bb.0:
406; ATOMIC-NEXT:    move.w (10,%sp), %d0
407; ATOMIC-NEXT:    move.l (4,%sp), %a0
408; ATOMIC-NEXT:    move.w %d0, (%a0)
409; ATOMIC-NEXT:    rts
410  store atomic i16 %val, ptr %a release, align 2
411  ret void
412}
413
414define void @atomic_store_i16_seq_cst(ptr %a, i16 %val) nounwind {
415; NO-ATOMIC-LABEL: atomic_store_i16_seq_cst:
416; NO-ATOMIC:       ; %bb.0:
417; NO-ATOMIC-NEXT:    move.w (10,%sp), %d0
418; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
419; NO-ATOMIC-NEXT:    move.w %d0, (%a0)
420; NO-ATOMIC-NEXT:    rts
421;
422; ATOMIC-LABEL: atomic_store_i16_seq_cst:
423; ATOMIC:       ; %bb.0:
424; ATOMIC-NEXT:    move.w (10,%sp), %d0
425; ATOMIC-NEXT:    move.l (4,%sp), %a0
426; ATOMIC-NEXT:    move.w %d0, (%a0)
427; ATOMIC-NEXT:    rts
428  store atomic i16 %val, ptr %a seq_cst, align 2
429  ret void
430}
431
432define void @atomic_store_i32_unordered(ptr %a, i32 %val) nounwind {
433; NO-ATOMIC-LABEL: atomic_store_i32_unordered:
434; NO-ATOMIC:       ; %bb.0:
435; NO-ATOMIC-NEXT:    move.l (8,%sp), %d0
436; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
437; NO-ATOMIC-NEXT:    move.l %d0, (%a0)
438; NO-ATOMIC-NEXT:    rts
439;
440; ATOMIC-LABEL: atomic_store_i32_unordered:
441; ATOMIC:       ; %bb.0:
442; ATOMIC-NEXT:    move.l (8,%sp), %d0
443; ATOMIC-NEXT:    move.l (4,%sp), %a0
444; ATOMIC-NEXT:    move.l %d0, (%a0)
445; ATOMIC-NEXT:    rts
446  store atomic i32 %val, ptr %a unordered, align 4
447  ret void
448}
449
450define void @atomic_store_i32_monotonic(ptr %a, i32 %val) nounwind {
451; NO-ATOMIC-LABEL: atomic_store_i32_monotonic:
452; NO-ATOMIC:       ; %bb.0:
453; NO-ATOMIC-NEXT:    move.l (8,%sp), %d0
454; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
455; NO-ATOMIC-NEXT:    move.l %d0, (%a0)
456; NO-ATOMIC-NEXT:    rts
457;
458; ATOMIC-LABEL: atomic_store_i32_monotonic:
459; ATOMIC:       ; %bb.0:
460; ATOMIC-NEXT:    move.l (8,%sp), %d0
461; ATOMIC-NEXT:    move.l (4,%sp), %a0
462; ATOMIC-NEXT:    move.l %d0, (%a0)
463; ATOMIC-NEXT:    rts
464  store atomic i32 %val, ptr %a monotonic, align 4
465  ret void
466}
467
468define void @atomic_store_i32_release(ptr %a, i32 %val) nounwind {
469; NO-ATOMIC-LABEL: atomic_store_i32_release:
470; NO-ATOMIC:       ; %bb.0:
471; NO-ATOMIC-NEXT:    move.l (8,%sp), %d0
472; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
473; NO-ATOMIC-NEXT:    move.l %d0, (%a0)
474; NO-ATOMIC-NEXT:    rts
475;
476; ATOMIC-LABEL: atomic_store_i32_release:
477; ATOMIC:       ; %bb.0:
478; ATOMIC-NEXT:    move.l (8,%sp), %d0
479; ATOMIC-NEXT:    move.l (4,%sp), %a0
480; ATOMIC-NEXT:    move.l %d0, (%a0)
481; ATOMIC-NEXT:    rts
482  store atomic i32 %val, ptr %a release, align 4
483  ret void
484}
485
486define void @atomic_store_i32_seq_cst(ptr %a, i32 %val) nounwind {
487; NO-ATOMIC-LABEL: atomic_store_i32_seq_cst:
488; NO-ATOMIC:       ; %bb.0:
489; NO-ATOMIC-NEXT:    move.l (8,%sp), %d0
490; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
491; NO-ATOMIC-NEXT:    move.l %d0, (%a0)
492; NO-ATOMIC-NEXT:    rts
493;
494; ATOMIC-LABEL: atomic_store_i32_seq_cst:
495; ATOMIC:       ; %bb.0:
496; ATOMIC-NEXT:    move.l (8,%sp), %d0
497; ATOMIC-NEXT:    move.l (4,%sp), %a0
498; ATOMIC-NEXT:    move.l %d0, (%a0)
499; ATOMIC-NEXT:    rts
500  store atomic i32 %val, ptr %a seq_cst, align 4
501  ret void
502}
503
504define void @atomic_store_i64_unordered(ptr %a, i64 %val) nounwind {
505; NO-ATOMIC-LABEL: atomic_store_i64_unordered:
506; NO-ATOMIC:       ; %bb.0:
507; NO-ATOMIC-NEXT:    suba.l #20, %sp
508; NO-ATOMIC-NEXT:    move.l #0, (12,%sp)
509; NO-ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
510; NO-ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
511; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
512; NO-ATOMIC-NEXT:    jsr __atomic_store_8
513; NO-ATOMIC-NEXT:    adda.l #20, %sp
514; NO-ATOMIC-NEXT:    rts
515;
516; ATOMIC-LABEL: atomic_store_i64_unordered:
517; ATOMIC:       ; %bb.0:
518; ATOMIC-NEXT:    suba.l #20, %sp
519; ATOMIC-NEXT:    move.l #0, (12,%sp)
520; ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
521; ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
522; ATOMIC-NEXT:    move.l (24,%sp), (%sp)
523; ATOMIC-NEXT:    jsr __atomic_store_8
524; ATOMIC-NEXT:    adda.l #20, %sp
525; ATOMIC-NEXT:    rts
526  store atomic i64 %val, ptr %a unordered, align 8
527  ret void
528}
529
530define void @atomic_store_i64_monotonic(ptr %a, i64 %val) nounwind {
531; NO-ATOMIC-LABEL: atomic_store_i64_monotonic:
532; NO-ATOMIC:       ; %bb.0:
533; NO-ATOMIC-NEXT:    suba.l #20, %sp
534; NO-ATOMIC-NEXT:    move.l #0, (12,%sp)
535; NO-ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
536; NO-ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
537; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
538; NO-ATOMIC-NEXT:    jsr __atomic_store_8
539; NO-ATOMIC-NEXT:    adda.l #20, %sp
540; NO-ATOMIC-NEXT:    rts
541;
542; ATOMIC-LABEL: atomic_store_i64_monotonic:
543; ATOMIC:       ; %bb.0:
544; ATOMIC-NEXT:    suba.l #20, %sp
545; ATOMIC-NEXT:    move.l #0, (12,%sp)
546; ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
547; ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
548; ATOMIC-NEXT:    move.l (24,%sp), (%sp)
549; ATOMIC-NEXT:    jsr __atomic_store_8
550; ATOMIC-NEXT:    adda.l #20, %sp
551; ATOMIC-NEXT:    rts
552  store atomic i64 %val, ptr %a monotonic, align 8
553  ret void
554}
555
556define void @atomic_store_i64_release(ptr %a, i64 %val) nounwind {
557; NO-ATOMIC-LABEL: atomic_store_i64_release:
558; NO-ATOMIC:       ; %bb.0:
559; NO-ATOMIC-NEXT:    suba.l #20, %sp
560; NO-ATOMIC-NEXT:    move.l #3, (12,%sp)
561; NO-ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
562; NO-ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
563; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
564; NO-ATOMIC-NEXT:    jsr __atomic_store_8
565; NO-ATOMIC-NEXT:    adda.l #20, %sp
566; NO-ATOMIC-NEXT:    rts
567;
568; ATOMIC-LABEL: atomic_store_i64_release:
569; ATOMIC:       ; %bb.0:
570; ATOMIC-NEXT:    suba.l #20, %sp
571; ATOMIC-NEXT:    move.l #3, (12,%sp)
572; ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
573; ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
574; ATOMIC-NEXT:    move.l (24,%sp), (%sp)
575; ATOMIC-NEXT:    jsr __atomic_store_8
576; ATOMIC-NEXT:    adda.l #20, %sp
577; ATOMIC-NEXT:    rts
578  store atomic i64 %val, ptr %a release, align 8
579  ret void
580}
581
582define void @atomic_store_i64_seq_cst(ptr %a, i64 %val) nounwind {
583; NO-ATOMIC-LABEL: atomic_store_i64_seq_cst:
584; NO-ATOMIC:       ; %bb.0:
585; NO-ATOMIC-NEXT:    suba.l #20, %sp
586; NO-ATOMIC-NEXT:    move.l #5, (12,%sp)
587; NO-ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
588; NO-ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
589; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
590; NO-ATOMIC-NEXT:    jsr __atomic_store_8
591; NO-ATOMIC-NEXT:    adda.l #20, %sp
592; NO-ATOMIC-NEXT:    rts
593;
594; ATOMIC-LABEL: atomic_store_i64_seq_cst:
595; ATOMIC:       ; %bb.0:
596; ATOMIC-NEXT:    suba.l #20, %sp
597; ATOMIC-NEXT:    move.l #5, (12,%sp)
598; ATOMIC-NEXT:    move.l (32,%sp), (8,%sp)
599; ATOMIC-NEXT:    move.l (28,%sp), (4,%sp)
600; ATOMIC-NEXT:    move.l (24,%sp), (%sp)
601; ATOMIC-NEXT:    jsr __atomic_store_8
602; ATOMIC-NEXT:    adda.l #20, %sp
603; ATOMIC-NEXT:    rts
604  store atomic i64 %val, ptr %a seq_cst, align 8
605  ret void
606}
607
608define void @store_arid(ptr nonnull align 4 %a) {
609; NO-ATOMIC-LABEL: store_arid:
610; NO-ATOMIC:         .cfi_startproc
611; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
612; NO-ATOMIC-NEXT:    moveq #1, %d0
613; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
614; NO-ATOMIC-NEXT:    move.l %d0, (32,%a0)
615; NO-ATOMIC-NEXT:    rts
616;
617; ATOMIC-LABEL: store_arid:
618; ATOMIC:         .cfi_startproc
619; ATOMIC-NEXT:  ; %bb.0: ; %start
620; ATOMIC-NEXT:    moveq #1, %d0
621; ATOMIC-NEXT:    move.l (4,%sp), %a0
622; ATOMIC-NEXT:    move.l %d0, (32,%a0)
623; ATOMIC-NEXT:    rts
624start:
625  %1 = getelementptr inbounds i32, ptr %a, i32 8
626  store atomic i32 1, ptr %1 seq_cst, align 4
627  br label %exit
628
629exit:                                              ; preds = %start
630  ret void
631}
632
633define i32 @load_arid(ptr nonnull align 4 %a) {
634; NO-ATOMIC-LABEL: load_arid:
635; NO-ATOMIC:         .cfi_startproc
636; NO-ATOMIC-NEXT:  ; %bb.0: ; %start
637; NO-ATOMIC-NEXT:    move.l (4,%sp), %a0
638; NO-ATOMIC-NEXT:    move.l (32,%a0), %d0
639; NO-ATOMIC-NEXT:    rts
640;
641; ATOMIC-LABEL: load_arid:
642; ATOMIC:         .cfi_startproc
643; ATOMIC-NEXT:  ; %bb.0: ; %start
644; ATOMIC-NEXT:    move.l (4,%sp), %a0
645; ATOMIC-NEXT:    move.l (32,%a0), %d0
646; ATOMIC-NEXT:    rts
647start:
648  %1 = getelementptr inbounds i32, ptr %a, i32 8
649  %2 = load atomic i32, ptr %1 seq_cst, align 4
650  br label %exit
651
652exit:                                              ; preds = %start
653  ret i32 %2
654}
655