blob: 4f2cbe0ce2d38f339c10182efb5f648bb7c72893 [file] [log] [blame]
Michael Liaoda22b302013-03-06 00:17:04 +00001; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64
2; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32
Michael Liaod5cac372013-03-07 01:01:29 +00003; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -mattr=-cmov -verify-machineinstrs | FileCheck %s --check-prefix NOCMOV
Michael Liao32376622012-09-20 03:06:15 +00004
5@sc32 = external global i32
6
7define void @atomic_fetch_add32() nounwind {
Tim Northover277066a2014-07-01 18:53:31 +00008; X64-LABEL: atomic_fetch_add32:
9; X32-LABEL: atomic_fetch_add32:
Michael Liao32376622012-09-20 03:06:15 +000010entry:
11; 32-bit
12 %t1 = atomicrmw add i32* @sc32, i32 1 acquire
13; X64: lock
14; X64: incl
15; X32: lock
16; X32: incl
17 %t2 = atomicrmw add i32* @sc32, i32 3 acquire
18; X64: lock
19; X64: addl $3
20; X32: lock
21; X32: addl $3
22 %t3 = atomicrmw add i32* @sc32, i32 5 acquire
23; X64: lock
24; X64: xaddl
25; X32: lock
26; X32: xaddl
27 %t4 = atomicrmw add i32* @sc32, i32 %t3 acquire
28; X64: lock
29; X64: addl
30; X32: lock
31; X32: addl
32 ret void
33; X64: ret
34; X32: ret
35}
36
37define void @atomic_fetch_sub32() nounwind {
Tim Northover277066a2014-07-01 18:53:31 +000038; X64-LABEL: atomic_fetch_sub32:
39; X32-LABEL: atomic_fetch_sub32:
Michael Liao32376622012-09-20 03:06:15 +000040 %t1 = atomicrmw sub i32* @sc32, i32 1 acquire
41; X64: lock
42; X64: decl
43; X32: lock
44; X32: decl
45 %t2 = atomicrmw sub i32* @sc32, i32 3 acquire
46; X64: lock
47; X64: subl $3
48; X32: lock
49; X32: subl $3
50 %t3 = atomicrmw sub i32* @sc32, i32 5 acquire
51; X64: lock
52; X64: xaddl
53; X32: lock
54; X32: xaddl
55 %t4 = atomicrmw sub i32* @sc32, i32 %t3 acquire
56; X64: lock
57; X64: subl
58; X32: lock
59; X32: subl
60 ret void
61; X64: ret
62; X32: ret
63}
64
65define void @atomic_fetch_and32() nounwind {
Tim Northover277066a2014-07-01 18:53:31 +000066; X64-LABEL: atomic_fetch_and32:
67; X32-LABEL: atomic_fetch_and32:
Michael Liao32376622012-09-20 03:06:15 +000068 %t1 = atomicrmw and i32* @sc32, i32 3 acquire
69; X64: lock
70; X64: andl $3
71; X32: lock
72; X32: andl $3
73 %t2 = atomicrmw and i32* @sc32, i32 5 acquire
74; X64: andl
75; X64: lock
76; X64: cmpxchgl
77; X32: andl
78; X32: lock
79; X32: cmpxchgl
80 %t3 = atomicrmw and i32* @sc32, i32 %t2 acquire
81; X64: lock
82; X64: andl
83; X32: lock
84; X32: andl
85 ret void
86; X64: ret
87; X32: ret
88}
89
90define void @atomic_fetch_or32() nounwind {
Tim Northover277066a2014-07-01 18:53:31 +000091; X64-LABEL: atomic_fetch_or32:
92; X32-LABEL: atomic_fetch_or32:
Michael Liao32376622012-09-20 03:06:15 +000093 %t1 = atomicrmw or i32* @sc32, i32 3 acquire
94; X64: lock
95; X64: orl $3
96; X32: lock
97; X32: orl $3
98 %t2 = atomicrmw or i32* @sc32, i32 5 acquire
99; X64: orl
100; X64: lock
101; X64: cmpxchgl
102; X32: orl
103; X32: lock
104; X32: cmpxchgl
105 %t3 = atomicrmw or i32* @sc32, i32 %t2 acquire
106; X64: lock
107; X64: orl
108; X32: lock
109; X32: orl
110 ret void
111; X64: ret
112; X32: ret
113}
114
115define void @atomic_fetch_xor32() nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000116; X64-LABEL: atomic_fetch_xor32:
117; X32-LABEL: atomic_fetch_xor32:
Michael Liao32376622012-09-20 03:06:15 +0000118 %t1 = atomicrmw xor i32* @sc32, i32 3 acquire
119; X64: lock
120; X64: xorl $3
121; X32: lock
122; X32: xorl $3
123 %t2 = atomicrmw xor i32* @sc32, i32 5 acquire
124; X64: xorl
125; X64: lock
126; X64: cmpxchgl
127; X32: xorl
128; X32: lock
129; X32: cmpxchgl
130 %t3 = atomicrmw xor i32* @sc32, i32 %t2 acquire
131; X64: lock
132; X64: xorl
133; X32: lock
134; X32: xorl
135 ret void
136; X64: ret
137; X32: ret
138}
139
140define void @atomic_fetch_nand32(i32 %x) nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000141; X64-LABEL: atomic_fetch_nand32:
142; X32-LABEL: atomic_fetch_nand32:
Michael Liao32376622012-09-20 03:06:15 +0000143 %t1 = atomicrmw nand i32* @sc32, i32 %x acquire
144; X64: andl
145; X64: notl
146; X64: lock
147; X64: cmpxchgl
148; X32: andl
149; X32: notl
150; X32: lock
151; X32: cmpxchgl
152 ret void
153; X64: ret
154; X32: ret
155}
156
157define void @atomic_fetch_max32(i32 %x) nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000158; X64-LABEL: atomic_fetch_max32:
159; X32-LABEL: atomic_fetch_max32:
160
Michael Liao32376622012-09-20 03:06:15 +0000161 %t1 = atomicrmw max i32* @sc32, i32 %x acquire
Tim Northover277066a2014-07-01 18:53:31 +0000162; X64: subl
Michael Liao32376622012-09-20 03:06:15 +0000163; X64: cmov
164; X64: lock
165; X64: cmpxchgl
166
Tim Northover277066a2014-07-01 18:53:31 +0000167; X32: subl
Michael Liao32376622012-09-20 03:06:15 +0000168; X32: cmov
169; X32: lock
170; X32: cmpxchgl
Michael Liaod5cac372013-03-07 01:01:29 +0000171
Tim Northover277066a2014-07-01 18:53:31 +0000172; NOCMOV: subl
173; NOCMOV: jge
Michael Liaod5cac372013-03-07 01:01:29 +0000174; NOCMOV: lock
175; NOCMOV: cmpxchgl
Michael Liao32376622012-09-20 03:06:15 +0000176 ret void
177; X64: ret
178; X32: ret
Michael Liaod5cac372013-03-07 01:01:29 +0000179; NOCMOV: ret
Michael Liao32376622012-09-20 03:06:15 +0000180}
181
182define void @atomic_fetch_min32(i32 %x) nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000183; X64-LABEL: atomic_fetch_min32:
184; X32-LABEL: atomic_fetch_min32:
185; NOCMOV-LABEL: atomic_fetch_min32:
186
Michael Liao32376622012-09-20 03:06:15 +0000187 %t1 = atomicrmw min i32* @sc32, i32 %x acquire
Tim Northover277066a2014-07-01 18:53:31 +0000188; X64: subl
Michael Liao32376622012-09-20 03:06:15 +0000189; X64: cmov
190; X64: lock
191; X64: cmpxchgl
192
Tim Northover277066a2014-07-01 18:53:31 +0000193; X32: subl
Michael Liao32376622012-09-20 03:06:15 +0000194; X32: cmov
195; X32: lock
196; X32: cmpxchgl
Michael Liaod5cac372013-03-07 01:01:29 +0000197
Tim Northover277066a2014-07-01 18:53:31 +0000198; NOCMOV: subl
199; NOCMOV: jle
Michael Liaod5cac372013-03-07 01:01:29 +0000200; NOCMOV: lock
201; NOCMOV: cmpxchgl
Michael Liao32376622012-09-20 03:06:15 +0000202 ret void
203; X64: ret
204; X32: ret
Michael Liaod5cac372013-03-07 01:01:29 +0000205; NOCMOV: ret
Michael Liao32376622012-09-20 03:06:15 +0000206}
207
208define void @atomic_fetch_umax32(i32 %x) nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000209; X64-LABEL: atomic_fetch_umax32:
210; X32-LABEL: atomic_fetch_umax32:
211; NOCMOV-LABEL: atomic_fetch_umax32:
212
Michael Liao32376622012-09-20 03:06:15 +0000213 %t1 = atomicrmw umax i32* @sc32, i32 %x acquire
Tim Northover277066a2014-07-01 18:53:31 +0000214; X64: subl
Michael Liao32376622012-09-20 03:06:15 +0000215; X64: cmov
216; X64: lock
217; X64: cmpxchgl
218
Tim Northover277066a2014-07-01 18:53:31 +0000219; X32: subl
Michael Liao32376622012-09-20 03:06:15 +0000220; X32: cmov
221; X32: lock
222; X32: cmpxchgl
Michael Liaod5cac372013-03-07 01:01:29 +0000223
Tim Northover277066a2014-07-01 18:53:31 +0000224; NOCMOV: subl
Michael Liaod5cac372013-03-07 01:01:29 +0000225; NOCMOV: ja
226; NOCMOV: lock
227; NOCMOV: cmpxchgl
Michael Liao32376622012-09-20 03:06:15 +0000228 ret void
229; X64: ret
230; X32: ret
Michael Liaod5cac372013-03-07 01:01:29 +0000231; NOCMOV: ret
Michael Liao32376622012-09-20 03:06:15 +0000232}
233
Tim Northover277066a2014-07-01 18:53:31 +0000234define void @atomic_fetch_umin32(i32 %x) nounwind {
235; X64-LABEL: atomic_fetch_umin32:
236; X32-LABEL: atomic_fetch_umin32:
237; NOCMOV-LABEL: atomic_fetch_umin32:
238
239 %t1 = atomicrmw umin i32* @sc32, i32 %x acquire
240; X64: subl
241; X64: cmov
242; X64: lock
243; X64: cmpxchgl
244
245; X32: subl
246; X32: cmov
247; X32: lock
248; X32: cmpxchgl
249
250; NOCMOV: subl
251; NOCMOV: jb
252; NOCMOV: lock
253; NOCMOV: cmpxchgl
254 ret void
255; X64: ret
256; X32: ret
257; NOCMOV: ret
258}
259
Michael Liao32376622012-09-20 03:06:15 +0000260define void @atomic_fetch_cmpxchg32() nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000261; X64-LABEL: atomic_fetch_cmpxchg32:
262; X32-LABEL: atomic_fetch_cmpxchg32:
263
Tim Northovere94a5182014-03-11 10:48:52 +0000264 %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire acquire
Michael Liao32376622012-09-20 03:06:15 +0000265; X64: lock
266; X64: cmpxchgl
267; X32: lock
268; X32: cmpxchgl
269 ret void
270; X64: ret
271; X32: ret
272}
273
274define void @atomic_fetch_store32(i32 %x) nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000275; X64-LABEL: atomic_fetch_store32:
276; X32-LABEL: atomic_fetch_store32:
277
Michael Liao32376622012-09-20 03:06:15 +0000278 store atomic i32 %x, i32* @sc32 release, align 4
279; X64-NOT: lock
280; X64: movl
281; X32-NOT: lock
282; X32: movl
283 ret void
284; X64: ret
285; X32: ret
286}
287
288define void @atomic_fetch_swap32(i32 %x) nounwind {
Tim Northover277066a2014-07-01 18:53:31 +0000289; X64-LABEL: atomic_fetch_swap32:
290; X32-LABEL: atomic_fetch_swap32:
291
Michael Liao32376622012-09-20 03:06:15 +0000292 %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire
293; X64-NOT: lock
294; X64: xchgl
295; X32-NOT: lock
296; X32: xchgl
297 ret void
298; X64: ret
299; X32: ret
300}