File: cmpxchg.ll

package info (click to toggle)
llvm-toolchain-16 1%3A16.0.6-15~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,634,792 kB
  • sloc: cpp: 6,179,261; ansic: 1,216,205; asm: 741,319; python: 196,614; objc: 75,325; f90: 49,640; lisp: 32,396; pascal: 12,286; sh: 9,394; perl: 7,442; ml: 5,494; awk: 3,523; makefile: 2,723; javascript: 1,206; xml: 886; fortran: 581; cs: 573
file content (136 lines) | stat: -rw-r--r-- 5,355 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 | FileCheck %s --check-prefix=NO-ATOMIC
; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 | FileCheck %s --check-prefix=NO-ATOMIC
; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 | FileCheck %s --check-prefix=ATOMIC
; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 | FileCheck %s --check-prefix=ATOMIC
; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 | FileCheck %s --check-prefix=ATOMIC

define i1 @cmpxchg_i8_monotonic_monotonic(i8 %cmp, i8 %new, ptr %mem) nounwind {
; NO-ATOMIC-LABEL: cmpxchg_i8_monotonic_monotonic:
; NO-ATOMIC:       ; %bb.0:
; NO-ATOMIC-NEXT:    suba.l #20, %sp
; NO-ATOMIC-NEXT:    movem.l %d2, (16,%sp) ; 8-byte Folded Spill
; NO-ATOMIC-NEXT:    move.b (31,%sp), %d0
; NO-ATOMIC-NEXT:    and.l #255, %d0
; NO-ATOMIC-NEXT:    move.l %d0, (8,%sp)
; NO-ATOMIC-NEXT:    move.b (27,%sp), %d2
; NO-ATOMIC-NEXT:    move.l %d2, %d0
; NO-ATOMIC-NEXT:    and.l #255, %d0
; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
; NO-ATOMIC-NEXT:    move.l (32,%sp), (%sp)
; NO-ATOMIC-NEXT:    jsr __sync_val_compare_and_swap_1@PLT
; NO-ATOMIC-NEXT:    sub.b %d2, %d0
; NO-ATOMIC-NEXT:    seq %d0
; NO-ATOMIC-NEXT:    movem.l (16,%sp), %d2 ; 8-byte Folded Reload
; NO-ATOMIC-NEXT:    adda.l #20, %sp
; NO-ATOMIC-NEXT:    rts
;
; ATOMIC-LABEL: cmpxchg_i8_monotonic_monotonic:
; ATOMIC:       ; %bb.0:
; ATOMIC-NEXT:    suba.l #4, %sp
; ATOMIC-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
; ATOMIC-NEXT:    move.l (16,%sp), %a0
; ATOMIC-NEXT:    move.b (15,%sp), %d0
; ATOMIC-NEXT:    move.b (11,%sp), %d1
; ATOMIC-NEXT:    move.b %d1, %d2
; ATOMIC-NEXT:    cas.b %d2, %d0, (%a0)
; ATOMIC-NEXT:    sub.b %d1, %d2
; ATOMIC-NEXT:    seq %d0
; ATOMIC-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
; ATOMIC-NEXT:    adda.l #4, %sp
; ATOMIC-NEXT:    rts
  %res = cmpxchg ptr %mem, i8 %cmp, i8 %new monotonic monotonic
  %val = extractvalue {i8, i1} %res, 1
  ret i1 %val
}

define i16 @cmpxchg_i16_release_monotonic(i16 %cmp, i16 %new, ptr %mem) nounwind {
; NO-ATOMIC-LABEL: cmpxchg_i16_release_monotonic:
; NO-ATOMIC:       ; %bb.0:
; NO-ATOMIC-NEXT:    suba.l #12, %sp
; NO-ATOMIC-NEXT:    move.w (22,%sp), %d0
; NO-ATOMIC-NEXT:    and.l #65535, %d0
; NO-ATOMIC-NEXT:    move.l %d0, (8,%sp)
; NO-ATOMIC-NEXT:    move.w (18,%sp), %d0
; NO-ATOMIC-NEXT:    and.l #65535, %d0
; NO-ATOMIC-NEXT:    move.l %d0, (4,%sp)
; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
; NO-ATOMIC-NEXT:    jsr __sync_val_compare_and_swap_2@PLT
; NO-ATOMIC-NEXT:    adda.l #12, %sp
; NO-ATOMIC-NEXT:    rts
;
; ATOMIC-LABEL: cmpxchg_i16_release_monotonic:
; ATOMIC:       ; %bb.0:
; ATOMIC-NEXT:    move.l (12,%sp), %a0
; ATOMIC-NEXT:    move.w (10,%sp), %d1
; ATOMIC-NEXT:    move.w (6,%sp), %d0
; ATOMIC-NEXT:    cas.w %d0, %d1, (%a0)
; ATOMIC-NEXT:    rts
  %res = cmpxchg ptr %mem, i16 %cmp, i16 %new release monotonic
  %val = extractvalue {i16, i1} %res, 0
  ret i16 %val
}

define i32 @cmpxchg_i32_release_acquire(i32 %cmp, i32 %new, ptr %mem) nounwind {
; NO-ATOMIC-LABEL: cmpxchg_i32_release_acquire:
; NO-ATOMIC:       ; %bb.0:
; NO-ATOMIC-NEXT:    suba.l #12, %sp
; NO-ATOMIC-NEXT:    move.l (20,%sp), (8,%sp)
; NO-ATOMIC-NEXT:    move.l (16,%sp), (4,%sp)
; NO-ATOMIC-NEXT:    move.l (24,%sp), (%sp)
; NO-ATOMIC-NEXT:    jsr __sync_val_compare_and_swap_4@PLT
; NO-ATOMIC-NEXT:    adda.l #12, %sp
; NO-ATOMIC-NEXT:    rts
;
; ATOMIC-LABEL: cmpxchg_i32_release_acquire:
; ATOMIC:       ; %bb.0:
; ATOMIC-NEXT:    move.l (12,%sp), %a0
; ATOMIC-NEXT:    move.l (8,%sp), %d1
; ATOMIC-NEXT:    move.l (4,%sp), %d0
; ATOMIC-NEXT:    cas.l %d0, %d1, (%a0)
; ATOMIC-NEXT:    rts
  %res = cmpxchg ptr %mem, i32 %cmp, i32 %new release acquire
  %val = extractvalue {i32, i1} %res, 0
  ret i32 %val
}

define i64 @cmpxchg_i64_seqcst_seqcst(i64 %cmp, i64 %new, ptr %mem) nounwind {
; NO-ATOMIC-LABEL: cmpxchg_i64_seqcst_seqcst:
; NO-ATOMIC:       ; %bb.0:
; NO-ATOMIC-NEXT:    suba.l #36, %sp
; NO-ATOMIC-NEXT:    move.l (44,%sp), (28,%sp)
; NO-ATOMIC-NEXT:    move.l (40,%sp), (24,%sp)
; NO-ATOMIC-NEXT:    lea (24,%sp), %a0
; NO-ATOMIC-NEXT:    move.l %a0, (4,%sp)
; NO-ATOMIC-NEXT:    move.l #5, (20,%sp)
; NO-ATOMIC-NEXT:    move.l #5, (16,%sp)
; NO-ATOMIC-NEXT:    move.l (52,%sp), (12,%sp)
; NO-ATOMIC-NEXT:    move.l (48,%sp), (8,%sp)
; NO-ATOMIC-NEXT:    move.l (56,%sp), (%sp)
; NO-ATOMIC-NEXT:    jsr __atomic_compare_exchange_8@PLT
; NO-ATOMIC-NEXT:    move.l (28,%sp), %d1
; NO-ATOMIC-NEXT:    move.l (24,%sp), %d0
; NO-ATOMIC-NEXT:    adda.l #36, %sp
; NO-ATOMIC-NEXT:    rts
;
; ATOMIC-LABEL: cmpxchg_i64_seqcst_seqcst:
; ATOMIC:       ; %bb.0:
; ATOMIC-NEXT:    suba.l #36, %sp
; ATOMIC-NEXT:    move.l (44,%sp), (28,%sp)
; ATOMIC-NEXT:    move.l (40,%sp), (24,%sp)
; ATOMIC-NEXT:    lea (24,%sp), %a0
; ATOMIC-NEXT:    move.l %a0, (4,%sp)
; ATOMIC-NEXT:    move.l #5, (20,%sp)
; ATOMIC-NEXT:    move.l #5, (16,%sp)
; ATOMIC-NEXT:    move.l (52,%sp), (12,%sp)
; ATOMIC-NEXT:    move.l (48,%sp), (8,%sp)
; ATOMIC-NEXT:    move.l (56,%sp), (%sp)
; ATOMIC-NEXT:    jsr __atomic_compare_exchange_8@PLT
; ATOMIC-NEXT:    move.l (28,%sp), %d1
; ATOMIC-NEXT:    move.l (24,%sp), %d0
; ATOMIC-NEXT:    adda.l #36, %sp
; ATOMIC-NEXT:    rts
  %res = cmpxchg ptr %mem, i64 %cmp, i64 %new seq_cst seq_cst
  %val = extractvalue {i64, i1} %res, 0
  ret i64 %val
}