1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix=X64
3; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefixes=X86,X86-CMOV
4; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOCMOV
5; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse,-x87 -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOX87
6
7@sc32 = external dso_local global i32
8@fsc32 = external dso_local global float
9
10define void @atomic_fetch_add32() nounwind {
11; X64-LABEL: atomic_fetch_add32:
12; X64:       # %bb.0: # %entry
13; X64-NEXT:    lock incl sc32(%rip)
14; X64-NEXT:    lock addl $3, sc32(%rip)
15; X64-NEXT:    movl $5, %eax
16; X64-NEXT:    lock xaddl %eax, sc32(%rip)
17; X64-NEXT:    lock addl %eax, sc32(%rip)
18; X64-NEXT:    retq
19;
20; X86-LABEL: atomic_fetch_add32:
21; X86:       # %bb.0: # %entry
22; X86-NEXT:    lock incl sc32
23; X86-NEXT:    lock addl $3, sc32
24; X86-NEXT:    movl $5, %eax
25; X86-NEXT:    lock xaddl %eax, sc32
26; X86-NEXT:    lock addl %eax, sc32
27; X86-NEXT:    retl
28entry:
29  %t1 = atomicrmw add  i32* @sc32, i32 1 acquire
30  %t2 = atomicrmw add  i32* @sc32, i32 3 acquire
31  %t3 = atomicrmw add  i32* @sc32, i32 5 acquire
32  %t4 = atomicrmw add  i32* @sc32, i32 %t3 acquire
33  ret void
34}
35
36define void @atomic_fetch_sub32() nounwind {
37; X64-LABEL: atomic_fetch_sub32:
38; X64:       # %bb.0:
39; X64-NEXT:    lock decl sc32(%rip)
40; X64-NEXT:    lock subl $3, sc32(%rip)
41; X64-NEXT:    movl $-5, %eax
42; X64-NEXT:    lock xaddl %eax, sc32(%rip)
43; X64-NEXT:    lock subl %eax, sc32(%rip)
44; X64-NEXT:    retq
45;
46; X86-LABEL: atomic_fetch_sub32:
47; X86:       # %bb.0:
48; X86-NEXT:    lock decl sc32
49; X86-NEXT:    lock subl $3, sc32
50; X86-NEXT:    movl $-5, %eax
51; X86-NEXT:    lock xaddl %eax, sc32
52; X86-NEXT:    lock subl %eax, sc32
53; X86-NEXT:    retl
54  %t1 = atomicrmw sub  i32* @sc32, i32 1 acquire
55  %t2 = atomicrmw sub  i32* @sc32, i32 3 acquire
56  %t3 = atomicrmw sub  i32* @sc32, i32 5 acquire
57  %t4 = atomicrmw sub  i32* @sc32, i32 %t3 acquire
58  ret void
59}
60
61define void @atomic_fetch_and32() nounwind {
62; X64-LABEL: atomic_fetch_and32:
63; X64:       # %bb.0:
64; X64-NEXT:    lock andl $3, sc32(%rip)
65; X64-NEXT:    movl sc32, %eax
66; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
67; X64-NEXT:  .LBB2_1: # %atomicrmw.start
68; X64-NEXT:    # =>This Inner Loop Header: Depth=1
69; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
70; X64-NEXT:    movl %eax, %ecx
71; X64-NEXT:    andl $5, %ecx
72; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
73; X64-NEXT:    sete %cl
74; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
75; X64-NEXT:    testb $1, %cl
76; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
77; X64-NEXT:    jne .LBB2_2
78; X64-NEXT:    jmp .LBB2_1
79; X64-NEXT:  .LBB2_2: # %atomicrmw.end
80; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
81; X64-NEXT:    lock andl %eax, sc32(%rip)
82; X64-NEXT:    retq
83;
84; X86-LABEL: atomic_fetch_and32:
85; X86:       # %bb.0:
86; X86-NEXT:    subl $8, %esp
87; X86-NEXT:    lock andl $3, sc32
88; X86-NEXT:    movl sc32, %eax
89; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
90; X86-NEXT:  .LBB2_1: # %atomicrmw.start
91; X86-NEXT:    # =>This Inner Loop Header: Depth=1
92; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
93; X86-NEXT:    movl %eax, %ecx
94; X86-NEXT:    andl $5, %ecx
95; X86-NEXT:    lock cmpxchgl %ecx, sc32
96; X86-NEXT:    sete %cl
97; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
98; X86-NEXT:    testb $1, %cl
99; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
100; X86-NEXT:    jne .LBB2_2
101; X86-NEXT:    jmp .LBB2_1
102; X86-NEXT:  .LBB2_2: # %atomicrmw.end
103; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
104; X86-NEXT:    lock andl %eax, sc32
105; X86-NEXT:    addl $8, %esp
106; X86-NEXT:    retl
107  %t1 = atomicrmw and  i32* @sc32, i32 3 acquire
108  %t2 = atomicrmw and  i32* @sc32, i32 5 acquire
109  %t3 = atomicrmw and  i32* @sc32, i32 %t2 acquire
110  ret void
111}
112
113define void @atomic_fetch_or32() nounwind {
114; X64-LABEL: atomic_fetch_or32:
115; X64:       # %bb.0:
116; X64-NEXT:    lock orl $3, sc32(%rip)
117; X64-NEXT:    movl sc32, %eax
118; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
119; X64-NEXT:  .LBB3_1: # %atomicrmw.start
120; X64-NEXT:    # =>This Inner Loop Header: Depth=1
121; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
122; X64-NEXT:    movl %eax, %ecx
123; X64-NEXT:    orl $5, %ecx
124; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
125; X64-NEXT:    sete %cl
126; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
127; X64-NEXT:    testb $1, %cl
128; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
129; X64-NEXT:    jne .LBB3_2
130; X64-NEXT:    jmp .LBB3_1
131; X64-NEXT:  .LBB3_2: # %atomicrmw.end
132; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
133; X64-NEXT:    lock orl %eax, sc32(%rip)
134; X64-NEXT:    retq
135;
136; X86-LABEL: atomic_fetch_or32:
137; X86:       # %bb.0:
138; X86-NEXT:    subl $8, %esp
139; X86-NEXT:    lock orl $3, sc32
140; X86-NEXT:    movl sc32, %eax
141; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
142; X86-NEXT:  .LBB3_1: # %atomicrmw.start
143; X86-NEXT:    # =>This Inner Loop Header: Depth=1
144; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
145; X86-NEXT:    movl %eax, %ecx
146; X86-NEXT:    orl $5, %ecx
147; X86-NEXT:    lock cmpxchgl %ecx, sc32
148; X86-NEXT:    sete %cl
149; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
150; X86-NEXT:    testb $1, %cl
151; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
152; X86-NEXT:    jne .LBB3_2
153; X86-NEXT:    jmp .LBB3_1
154; X86-NEXT:  .LBB3_2: # %atomicrmw.end
155; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
156; X86-NEXT:    lock orl %eax, sc32
157; X86-NEXT:    addl $8, %esp
158; X86-NEXT:    retl
159  %t1 = atomicrmw or   i32* @sc32, i32 3 acquire
160  %t2 = atomicrmw or   i32* @sc32, i32 5 acquire
161  %t3 = atomicrmw or   i32* @sc32, i32 %t2 acquire
162  ret void
163}
164
165define void @atomic_fetch_xor32() nounwind {
166; X64-LABEL: atomic_fetch_xor32:
167; X64:       # %bb.0:
168; X64-NEXT:    lock xorl $3, sc32(%rip)
169; X64-NEXT:    movl sc32, %eax
170; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
171; X64-NEXT:  .LBB4_1: # %atomicrmw.start
172; X64-NEXT:    # =>This Inner Loop Header: Depth=1
173; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
174; X64-NEXT:    movl %eax, %ecx
175; X64-NEXT:    xorl $5, %ecx
176; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
177; X64-NEXT:    sete %cl
178; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
179; X64-NEXT:    testb $1, %cl
180; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
181; X64-NEXT:    jne .LBB4_2
182; X64-NEXT:    jmp .LBB4_1
183; X64-NEXT:  .LBB4_2: # %atomicrmw.end
184; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
185; X64-NEXT:    lock xorl %eax, sc32(%rip)
186; X64-NEXT:    retq
187;
188; X86-LABEL: atomic_fetch_xor32:
189; X86:       # %bb.0:
190; X86-NEXT:    subl $8, %esp
191; X86-NEXT:    lock xorl $3, sc32
192; X86-NEXT:    movl sc32, %eax
193; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
194; X86-NEXT:  .LBB4_1: # %atomicrmw.start
195; X86-NEXT:    # =>This Inner Loop Header: Depth=1
196; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
197; X86-NEXT:    movl %eax, %ecx
198; X86-NEXT:    xorl $5, %ecx
199; X86-NEXT:    lock cmpxchgl %ecx, sc32
200; X86-NEXT:    sete %cl
201; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
202; X86-NEXT:    testb $1, %cl
203; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
204; X86-NEXT:    jne .LBB4_2
205; X86-NEXT:    jmp .LBB4_1
206; X86-NEXT:  .LBB4_2: # %atomicrmw.end
207; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
208; X86-NEXT:    lock xorl %eax, sc32
209; X86-NEXT:    addl $8, %esp
210; X86-NEXT:    retl
211  %t1 = atomicrmw xor  i32* @sc32, i32 3 acquire
212  %t2 = atomicrmw xor  i32* @sc32, i32 5 acquire
213  %t3 = atomicrmw xor  i32* @sc32, i32 %t2 acquire
214  ret void
215}
216
217define void @atomic_fetch_nand32(i32 %x) nounwind {
218; X64-LABEL: atomic_fetch_nand32:
219; X64:       # %bb.0:
220; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
221; X64-NEXT:    movl sc32, %eax
222; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
223; X64-NEXT:  .LBB5_1: # %atomicrmw.start
224; X64-NEXT:    # =>This Inner Loop Header: Depth=1
225; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
226; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Reload
227; X64-NEXT:    movl %eax, %ecx
228; X64-NEXT:    andl %edx, %ecx
229; X64-NEXT:    movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
230; X64-NEXT:    notl %ecx
231; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
232; X64-NEXT:    sete %cl
233; X64-NEXT:    testb $1, %cl
234; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
235; X64-NEXT:    jne .LBB5_2
236; X64-NEXT:    jmp .LBB5_1
237; X64-NEXT:  .LBB5_2: # %atomicrmw.end
238; X64-NEXT:    retq
239;
240; X86-LABEL: atomic_fetch_nand32:
241; X86:       # %bb.0:
242; X86-NEXT:    subl $12, %esp
243; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
244; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
245; X86-NEXT:    movl sc32, %eax
246; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
247; X86-NEXT:  .LBB5_1: # %atomicrmw.start
248; X86-NEXT:    # =>This Inner Loop Header: Depth=1
249; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
250; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
251; X86-NEXT:    movl %eax, %ecx
252; X86-NEXT:    andl %edx, %ecx
253; X86-NEXT:    movl %ecx, (%esp) # 4-byte Spill
254; X86-NEXT:    notl %ecx
255; X86-NEXT:    lock cmpxchgl %ecx, sc32
256; X86-NEXT:    sete %cl
257; X86-NEXT:    testb $1, %cl
258; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
259; X86-NEXT:    jne .LBB5_2
260; X86-NEXT:    jmp .LBB5_1
261; X86-NEXT:  .LBB5_2: # %atomicrmw.end
262; X86-NEXT:    addl $12, %esp
263; X86-NEXT:    retl
264  %t1 = atomicrmw nand i32* @sc32, i32 %x acquire
265  ret void
266}
267
268define void @atomic_fetch_max32(i32 %x) nounwind {
269; X64-LABEL: atomic_fetch_max32:
270; X64:       # %bb.0:
271; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
272; X64-NEXT:    movl sc32, %eax
273; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
274; X64-NEXT:  .LBB6_1: # %atomicrmw.start
275; X64-NEXT:    # =>This Inner Loop Header: Depth=1
276; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
277; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
278; X64-NEXT:    movl %eax, %edx
279; X64-NEXT:    subl %ecx, %edx
280; X64-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
281; X64-NEXT:    cmovgl %eax, %ecx
282; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
283; X64-NEXT:    sete %cl
284; X64-NEXT:    testb $1, %cl
285; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
286; X64-NEXT:    jne .LBB6_2
287; X64-NEXT:    jmp .LBB6_1
288; X64-NEXT:  .LBB6_2: # %atomicrmw.end
289; X64-NEXT:    retq
290;
291; X86-CMOV-LABEL: atomic_fetch_max32:
292; X86-CMOV:       # %bb.0:
293; X86-CMOV-NEXT:    subl $12, %esp
294; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
295; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
296; X86-CMOV-NEXT:    movl sc32, %eax
297; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
298; X86-CMOV-NEXT:  .LBB6_1: # %atomicrmw.start
299; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
300; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
301; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
302; X86-CMOV-NEXT:    movl %eax, %edx
303; X86-CMOV-NEXT:    subl %ecx, %edx
304; X86-CMOV-NEXT:    movl %edx, (%esp) # 4-byte Spill
305; X86-CMOV-NEXT:    cmovgl %eax, %ecx
306; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
307; X86-CMOV-NEXT:    sete %cl
308; X86-CMOV-NEXT:    testb $1, %cl
309; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
310; X86-CMOV-NEXT:    jne .LBB6_2
311; X86-CMOV-NEXT:    jmp .LBB6_1
312; X86-CMOV-NEXT:  .LBB6_2: # %atomicrmw.end
313; X86-CMOV-NEXT:    addl $12, %esp
314; X86-CMOV-NEXT:    retl
315;
316; X86-NOCMOV-LABEL: atomic_fetch_max32:
317; X86-NOCMOV:       # %bb.0:
318; X86-NOCMOV-NEXT:    subl $16, %esp
319; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
320; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
321; X86-NOCMOV-NEXT:    movl sc32, %eax
322; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
323; X86-NOCMOV-NEXT:  .LBB6_1: # %atomicrmw.start
324; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
325; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
326; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
327; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
328; X86-NOCMOV-NEXT:    movl %eax, %ecx
329; X86-NOCMOV-NEXT:    subl %edx, %ecx
330; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
331; X86-NOCMOV-NEXT:    jg .LBB6_4
332; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
333; X86-NOCMOV-NEXT:    # in Loop: Header=BB6_1 Depth=1
334; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
335; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
336; X86-NOCMOV-NEXT:  .LBB6_4: # %atomicrmw.start
337; X86-NOCMOV-NEXT:    # in Loop: Header=BB6_1 Depth=1
338; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
339; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
340; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
341; X86-NOCMOV-NEXT:    sete %cl
342; X86-NOCMOV-NEXT:    testb $1, %cl
343; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
344; X86-NOCMOV-NEXT:    jne .LBB6_2
345; X86-NOCMOV-NEXT:    jmp .LBB6_1
346; X86-NOCMOV-NEXT:  .LBB6_2: # %atomicrmw.end
347; X86-NOCMOV-NEXT:    addl $16, %esp
348; X86-NOCMOV-NEXT:    retl
349;
350; X86-NOX87-LABEL: atomic_fetch_max32:
351; X86-NOX87:       # %bb.0:
352; X86-NOX87-NEXT:    subl $16, %esp
353; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
354; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
355; X86-NOX87-NEXT:    movl sc32, %eax
356; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
357; X86-NOX87-NEXT:  .LBB6_1: # %atomicrmw.start
358; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
359; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
360; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
361; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
362; X86-NOX87-NEXT:    movl %eax, %ecx
363; X86-NOX87-NEXT:    subl %edx, %ecx
364; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
365; X86-NOX87-NEXT:    jg .LBB6_4
366; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
367; X86-NOX87-NEXT:    # in Loop: Header=BB6_1 Depth=1
368; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
369; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
370; X86-NOX87-NEXT:  .LBB6_4: # %atomicrmw.start
371; X86-NOX87-NEXT:    # in Loop: Header=BB6_1 Depth=1
372; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
373; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
374; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
375; X86-NOX87-NEXT:    sete %cl
376; X86-NOX87-NEXT:    testb $1, %cl
377; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
378; X86-NOX87-NEXT:    jne .LBB6_2
379; X86-NOX87-NEXT:    jmp .LBB6_1
380; X86-NOX87-NEXT:  .LBB6_2: # %atomicrmw.end
381; X86-NOX87-NEXT:    addl $16, %esp
382; X86-NOX87-NEXT:    retl
383  %t1 = atomicrmw max  i32* @sc32, i32 %x acquire
384  ret void
385}
386
387define void @atomic_fetch_min32(i32 %x) nounwind {
388; X64-LABEL: atomic_fetch_min32:
389; X64:       # %bb.0:
390; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
391; X64-NEXT:    movl sc32, %eax
392; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
393; X64-NEXT:  .LBB7_1: # %atomicrmw.start
394; X64-NEXT:    # =>This Inner Loop Header: Depth=1
395; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
396; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
397; X64-NEXT:    movl %eax, %edx
398; X64-NEXT:    subl %ecx, %edx
399; X64-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
400; X64-NEXT:    cmovlel %eax, %ecx
401; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
402; X64-NEXT:    sete %cl
403; X64-NEXT:    testb $1, %cl
404; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
405; X64-NEXT:    jne .LBB7_2
406; X64-NEXT:    jmp .LBB7_1
407; X64-NEXT:  .LBB7_2: # %atomicrmw.end
408; X64-NEXT:    retq
409;
410; X86-CMOV-LABEL: atomic_fetch_min32:
411; X86-CMOV:       # %bb.0:
412; X86-CMOV-NEXT:    subl $12, %esp
413; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
414; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
415; X86-CMOV-NEXT:    movl sc32, %eax
416; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
417; X86-CMOV-NEXT:  .LBB7_1: # %atomicrmw.start
418; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
419; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
420; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
421; X86-CMOV-NEXT:    movl %eax, %edx
422; X86-CMOV-NEXT:    subl %ecx, %edx
423; X86-CMOV-NEXT:    movl %edx, (%esp) # 4-byte Spill
424; X86-CMOV-NEXT:    cmovlel %eax, %ecx
425; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
426; X86-CMOV-NEXT:    sete %cl
427; X86-CMOV-NEXT:    testb $1, %cl
428; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
429; X86-CMOV-NEXT:    jne .LBB7_2
430; X86-CMOV-NEXT:    jmp .LBB7_1
431; X86-CMOV-NEXT:  .LBB7_2: # %atomicrmw.end
432; X86-CMOV-NEXT:    addl $12, %esp
433; X86-CMOV-NEXT:    retl
434;
435; X86-NOCMOV-LABEL: atomic_fetch_min32:
436; X86-NOCMOV:       # %bb.0:
437; X86-NOCMOV-NEXT:    subl $16, %esp
438; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
439; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
440; X86-NOCMOV-NEXT:    movl sc32, %eax
441; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
442; X86-NOCMOV-NEXT:  .LBB7_1: # %atomicrmw.start
443; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
444; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
445; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
446; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
447; X86-NOCMOV-NEXT:    movl %eax, %ecx
448; X86-NOCMOV-NEXT:    subl %edx, %ecx
449; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
450; X86-NOCMOV-NEXT:    jle .LBB7_4
451; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
452; X86-NOCMOV-NEXT:    # in Loop: Header=BB7_1 Depth=1
453; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
454; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
455; X86-NOCMOV-NEXT:  .LBB7_4: # %atomicrmw.start
456; X86-NOCMOV-NEXT:    # in Loop: Header=BB7_1 Depth=1
457; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
458; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
459; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
460; X86-NOCMOV-NEXT:    sete %cl
461; X86-NOCMOV-NEXT:    testb $1, %cl
462; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
463; X86-NOCMOV-NEXT:    jne .LBB7_2
464; X86-NOCMOV-NEXT:    jmp .LBB7_1
465; X86-NOCMOV-NEXT:  .LBB7_2: # %atomicrmw.end
466; X86-NOCMOV-NEXT:    addl $16, %esp
467; X86-NOCMOV-NEXT:    retl
468;
469; X86-NOX87-LABEL: atomic_fetch_min32:
470; X86-NOX87:       # %bb.0:
471; X86-NOX87-NEXT:    subl $16, %esp
472; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
473; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
474; X86-NOX87-NEXT:    movl sc32, %eax
475; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
476; X86-NOX87-NEXT:  .LBB7_1: # %atomicrmw.start
477; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
478; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
479; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
480; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
481; X86-NOX87-NEXT:    movl %eax, %ecx
482; X86-NOX87-NEXT:    subl %edx, %ecx
483; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
484; X86-NOX87-NEXT:    jle .LBB7_4
485; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
486; X86-NOX87-NEXT:    # in Loop: Header=BB7_1 Depth=1
487; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
488; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
489; X86-NOX87-NEXT:  .LBB7_4: # %atomicrmw.start
490; X86-NOX87-NEXT:    # in Loop: Header=BB7_1 Depth=1
491; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
492; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
493; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
494; X86-NOX87-NEXT:    sete %cl
495; X86-NOX87-NEXT:    testb $1, %cl
496; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
497; X86-NOX87-NEXT:    jne .LBB7_2
498; X86-NOX87-NEXT:    jmp .LBB7_1
499; X86-NOX87-NEXT:  .LBB7_2: # %atomicrmw.end
500; X86-NOX87-NEXT:    addl $16, %esp
501; X86-NOX87-NEXT:    retl
502  %t1 = atomicrmw min  i32* @sc32, i32 %x acquire
503  ret void
504}
505
506define void @atomic_fetch_umax32(i32 %x) nounwind {
507; X64-LABEL: atomic_fetch_umax32:
508; X64:       # %bb.0:
509; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
510; X64-NEXT:    movl sc32, %eax
511; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
512; X64-NEXT:  .LBB8_1: # %atomicrmw.start
513; X64-NEXT:    # =>This Inner Loop Header: Depth=1
514; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
515; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
516; X64-NEXT:    movl %eax, %edx
517; X64-NEXT:    subl %ecx, %edx
518; X64-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
519; X64-NEXT:    cmoval %eax, %ecx
520; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
521; X64-NEXT:    sete %cl
522; X64-NEXT:    testb $1, %cl
523; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
524; X64-NEXT:    jne .LBB8_2
525; X64-NEXT:    jmp .LBB8_1
526; X64-NEXT:  .LBB8_2: # %atomicrmw.end
527; X64-NEXT:    retq
528;
529; X86-CMOV-LABEL: atomic_fetch_umax32:
530; X86-CMOV:       # %bb.0:
531; X86-CMOV-NEXT:    subl $12, %esp
532; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
533; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
534; X86-CMOV-NEXT:    movl sc32, %eax
535; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
536; X86-CMOV-NEXT:  .LBB8_1: # %atomicrmw.start
537; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
538; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
539; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
540; X86-CMOV-NEXT:    movl %eax, %edx
541; X86-CMOV-NEXT:    subl %ecx, %edx
542; X86-CMOV-NEXT:    movl %edx, (%esp) # 4-byte Spill
543; X86-CMOV-NEXT:    cmoval %eax, %ecx
544; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
545; X86-CMOV-NEXT:    sete %cl
546; X86-CMOV-NEXT:    testb $1, %cl
547; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
548; X86-CMOV-NEXT:    jne .LBB8_2
549; X86-CMOV-NEXT:    jmp .LBB8_1
550; X86-CMOV-NEXT:  .LBB8_2: # %atomicrmw.end
551; X86-CMOV-NEXT:    addl $12, %esp
552; X86-CMOV-NEXT:    retl
553;
554; X86-NOCMOV-LABEL: atomic_fetch_umax32:
555; X86-NOCMOV:       # %bb.0:
556; X86-NOCMOV-NEXT:    subl $16, %esp
557; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
558; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
559; X86-NOCMOV-NEXT:    movl sc32, %eax
560; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
561; X86-NOCMOV-NEXT:  .LBB8_1: # %atomicrmw.start
562; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
563; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
564; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
565; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
566; X86-NOCMOV-NEXT:    movl %eax, %ecx
567; X86-NOCMOV-NEXT:    subl %edx, %ecx
568; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
569; X86-NOCMOV-NEXT:    ja .LBB8_4
570; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
571; X86-NOCMOV-NEXT:    # in Loop: Header=BB8_1 Depth=1
572; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
573; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
574; X86-NOCMOV-NEXT:  .LBB8_4: # %atomicrmw.start
575; X86-NOCMOV-NEXT:    # in Loop: Header=BB8_1 Depth=1
576; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
577; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
578; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
579; X86-NOCMOV-NEXT:    sete %cl
580; X86-NOCMOV-NEXT:    testb $1, %cl
581; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
582; X86-NOCMOV-NEXT:    jne .LBB8_2
583; X86-NOCMOV-NEXT:    jmp .LBB8_1
584; X86-NOCMOV-NEXT:  .LBB8_2: # %atomicrmw.end
585; X86-NOCMOV-NEXT:    addl $16, %esp
586; X86-NOCMOV-NEXT:    retl
587;
588; X86-NOX87-LABEL: atomic_fetch_umax32:
589; X86-NOX87:       # %bb.0:
590; X86-NOX87-NEXT:    subl $16, %esp
591; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
592; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
593; X86-NOX87-NEXT:    movl sc32, %eax
594; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
595; X86-NOX87-NEXT:  .LBB8_1: # %atomicrmw.start
596; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
597; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
598; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
599; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
600; X86-NOX87-NEXT:    movl %eax, %ecx
601; X86-NOX87-NEXT:    subl %edx, %ecx
602; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
603; X86-NOX87-NEXT:    ja .LBB8_4
604; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
605; X86-NOX87-NEXT:    # in Loop: Header=BB8_1 Depth=1
606; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
607; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
608; X86-NOX87-NEXT:  .LBB8_4: # %atomicrmw.start
609; X86-NOX87-NEXT:    # in Loop: Header=BB8_1 Depth=1
610; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
611; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
612; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
613; X86-NOX87-NEXT:    sete %cl
614; X86-NOX87-NEXT:    testb $1, %cl
615; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
616; X86-NOX87-NEXT:    jne .LBB8_2
617; X86-NOX87-NEXT:    jmp .LBB8_1
618; X86-NOX87-NEXT:  .LBB8_2: # %atomicrmw.end
619; X86-NOX87-NEXT:    addl $16, %esp
620; X86-NOX87-NEXT:    retl
621  %t1 = atomicrmw umax i32* @sc32, i32 %x acquire
622  ret void
623}
624
625define void @atomic_fetch_umin32(i32 %x) nounwind {
626; X64-LABEL: atomic_fetch_umin32:
627; X64:       # %bb.0:
628; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
629; X64-NEXT:    movl sc32, %eax
630; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
631; X64-NEXT:  .LBB9_1: # %atomicrmw.start
632; X64-NEXT:    # =>This Inner Loop Header: Depth=1
633; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
634; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
635; X64-NEXT:    movl %eax, %edx
636; X64-NEXT:    subl %ecx, %edx
637; X64-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
638; X64-NEXT:    cmovbel %eax, %ecx
639; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
640; X64-NEXT:    sete %cl
641; X64-NEXT:    testb $1, %cl
642; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
643; X64-NEXT:    jne .LBB9_2
644; X64-NEXT:    jmp .LBB9_1
645; X64-NEXT:  .LBB9_2: # %atomicrmw.end
646; X64-NEXT:    retq
647;
648; X86-CMOV-LABEL: atomic_fetch_umin32:
649; X86-CMOV:       # %bb.0:
650; X86-CMOV-NEXT:    subl $12, %esp
651; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
652; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
653; X86-CMOV-NEXT:    movl sc32, %eax
654; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
655; X86-CMOV-NEXT:  .LBB9_1: # %atomicrmw.start
656; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
657; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
658; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
659; X86-CMOV-NEXT:    movl %eax, %edx
660; X86-CMOV-NEXT:    subl %ecx, %edx
661; X86-CMOV-NEXT:    movl %edx, (%esp) # 4-byte Spill
662; X86-CMOV-NEXT:    cmovbel %eax, %ecx
663; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
664; X86-CMOV-NEXT:    sete %cl
665; X86-CMOV-NEXT:    testb $1, %cl
666; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
667; X86-CMOV-NEXT:    jne .LBB9_2
668; X86-CMOV-NEXT:    jmp .LBB9_1
669; X86-CMOV-NEXT:  .LBB9_2: # %atomicrmw.end
670; X86-CMOV-NEXT:    addl $12, %esp
671; X86-CMOV-NEXT:    retl
672;
673; X86-NOCMOV-LABEL: atomic_fetch_umin32:
674; X86-NOCMOV:       # %bb.0:
675; X86-NOCMOV-NEXT:    subl $16, %esp
676; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
677; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
678; X86-NOCMOV-NEXT:    movl sc32, %eax
679; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
680; X86-NOCMOV-NEXT:  .LBB9_1: # %atomicrmw.start
681; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
682; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
683; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
684; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
685; X86-NOCMOV-NEXT:    movl %eax, %ecx
686; X86-NOCMOV-NEXT:    subl %edx, %ecx
687; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
688; X86-NOCMOV-NEXT:    jbe .LBB9_4
689; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
690; X86-NOCMOV-NEXT:    # in Loop: Header=BB9_1 Depth=1
691; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
692; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
693; X86-NOCMOV-NEXT:  .LBB9_4: # %atomicrmw.start
694; X86-NOCMOV-NEXT:    # in Loop: Header=BB9_1 Depth=1
695; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
696; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
697; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
698; X86-NOCMOV-NEXT:    sete %cl
699; X86-NOCMOV-NEXT:    testb $1, %cl
700; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
701; X86-NOCMOV-NEXT:    jne .LBB9_2
702; X86-NOCMOV-NEXT:    jmp .LBB9_1
703; X86-NOCMOV-NEXT:  .LBB9_2: # %atomicrmw.end
704; X86-NOCMOV-NEXT:    addl $16, %esp
705; X86-NOCMOV-NEXT:    retl
706;
707; X86-NOX87-LABEL: atomic_fetch_umin32:
708; X86-NOX87:       # %bb.0:
709; X86-NOX87-NEXT:    subl $16, %esp
710; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
711; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
712; X86-NOX87-NEXT:    movl sc32, %eax
713; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
714; X86-NOX87-NEXT:  .LBB9_1: # %atomicrmw.start
715; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
716; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
717; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
718; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
719; X86-NOX87-NEXT:    movl %eax, %ecx
720; X86-NOX87-NEXT:    subl %edx, %ecx
721; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
722; X86-NOX87-NEXT:    jbe .LBB9_4
723; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
724; X86-NOX87-NEXT:    # in Loop: Header=BB9_1 Depth=1
725; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
726; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
727; X86-NOX87-NEXT:  .LBB9_4: # %atomicrmw.start
728; X86-NOX87-NEXT:    # in Loop: Header=BB9_1 Depth=1
729; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
730; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
731; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
732; X86-NOX87-NEXT:    sete %cl
733; X86-NOX87-NEXT:    testb $1, %cl
734; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
735; X86-NOX87-NEXT:    jne .LBB9_2
736; X86-NOX87-NEXT:    jmp .LBB9_1
737; X86-NOX87-NEXT:  .LBB9_2: # %atomicrmw.end
738; X86-NOX87-NEXT:    addl $16, %esp
739; X86-NOX87-NEXT:    retl
740  %t1 = atomicrmw umin i32* @sc32, i32 %x acquire
741  ret void
742}
743
744define void @atomic_fetch_cmpxchg32() nounwind {
745; X64-LABEL: atomic_fetch_cmpxchg32:
746; X64:       # %bb.0:
747; X64-NEXT:    xorl %eax, %eax
748; X64-NEXT:    movl $1, %ecx
749; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
750; X64-NEXT:    retq
751;
752; X86-LABEL: atomic_fetch_cmpxchg32:
753; X86:       # %bb.0:
754; X86-NEXT:    xorl %eax, %eax
755; X86-NEXT:    movl $1, %ecx
756; X86-NEXT:    lock cmpxchgl %ecx, sc32
757; X86-NEXT:    retl
758  %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire acquire
759  ret void
760}
761
762define void @atomic_fetch_store32(i32 %x) nounwind {
763; X64-LABEL: atomic_fetch_store32:
764; X64:       # %bb.0:
765; X64-NEXT:    movl %edi, sc32(%rip)
766; X64-NEXT:    retq
767;
768; X86-LABEL: atomic_fetch_store32:
769; X86:       # %bb.0:
770; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
771; X86-NEXT:    movl %eax, sc32
772; X86-NEXT:    retl
773  store atomic i32 %x, i32* @sc32 release, align 4
774  ret void
775}
776
777define void @atomic_fetch_swap32(i32 %x) nounwind {
778; X64-LABEL: atomic_fetch_swap32:
779; X64:       # %bb.0:
780; X64-NEXT:    xchgl %edi, sc32(%rip)
781; X64-NEXT:    retq
782;
783; X86-LABEL: atomic_fetch_swap32:
784; X86:       # %bb.0:
785; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
786; X86-NEXT:    xchgl %eax, sc32
787; X86-NEXT:    retl
788  %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire
789  ret void
790}
791
792define void @atomic_fetch_swapf32(float %x) nounwind {
793; X64-LABEL: atomic_fetch_swapf32:
794; X64:       # %bb.0:
795; X64-NEXT:    movd %xmm0, %eax
796; X64-NEXT:    xchgl %eax, fsc32(%rip)
797; X64-NEXT:    retq
798;
799; X86-CMOV-LABEL: atomic_fetch_swapf32:
800; X86-CMOV:       # %bb.0:
801; X86-CMOV-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
802; X86-CMOV-NEXT:    movd %xmm0, %eax
803; X86-CMOV-NEXT:    xchgl %eax, fsc32
804; X86-CMOV-NEXT:    retl
805;
806; X86-NOCMOV-LABEL: atomic_fetch_swapf32:
807; X86-NOCMOV:       # %bb.0:
808; X86-NOCMOV-NEXT:    pushl %eax
809; X86-NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)
810; X86-NOCMOV-NEXT:    fstps (%esp)
811; X86-NOCMOV-NEXT:    movl (%esp), %eax
812; X86-NOCMOV-NEXT:    xchgl %eax, fsc32
813; X86-NOCMOV-NEXT:    popl %eax
814; X86-NOCMOV-NEXT:    retl
815;
816; X86-NOX87-LABEL: atomic_fetch_swapf32:
817; X86-NOX87:       # %bb.0:
818; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
819; X86-NOX87-NEXT:    xchgl %eax, fsc32
820; X86-NOX87-NEXT:    retl
821  %t1 = atomicrmw xchg float* @fsc32, float %x acquire
822  ret void
823}
824