xref: /llvm-project/llvm/test/CodeGen/X86/atomic32.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
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  ptr @sc32, i32 1 acquire
30  %t2 = atomicrmw add  ptr @sc32, i32 3 acquire
31  %t3 = atomicrmw add  ptr @sc32, i32 5 acquire
32  %t4 = atomicrmw add  ptr @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  ptr @sc32, i32 1 acquire
55  %t2 = atomicrmw sub  ptr @sc32, i32 3 acquire
56  %t3 = atomicrmw sub  ptr @sc32, i32 5 acquire
57  %t4 = atomicrmw sub  ptr @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  ptr @sc32, i32 3 acquire
108  %t2 = atomicrmw and  ptr @sc32, i32 5 acquire
109  %t3 = atomicrmw and  ptr @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   ptr @sc32, i32 3 acquire
160  %t2 = atomicrmw or   ptr @sc32, i32 5 acquire
161  %t3 = atomicrmw or   ptr @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  ptr @sc32, i32 3 acquire
212  %t2 = atomicrmw xor  ptr @sc32, i32 5 acquire
213  %t3 = atomicrmw xor  ptr @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:    notl %ecx
230; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
231; X64-NEXT:    sete %cl
232; X64-NEXT:    testb $1, %cl
233; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
234; X64-NEXT:    jne .LBB5_2
235; X64-NEXT:    jmp .LBB5_1
236; X64-NEXT:  .LBB5_2: # %atomicrmw.end
237; X64-NEXT:    retq
238;
239; X86-LABEL: atomic_fetch_nand32:
240; X86:       # %bb.0:
241; X86-NEXT:    subl $8, %esp
242; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
243; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
244; X86-NEXT:    movl sc32, %eax
245; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
246; X86-NEXT:  .LBB5_1: # %atomicrmw.start
247; X86-NEXT:    # =>This Inner Loop Header: Depth=1
248; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
249; X86-NEXT:    movl (%esp), %edx # 4-byte Reload
250; X86-NEXT:    movl %eax, %ecx
251; X86-NEXT:    andl %edx, %ecx
252; X86-NEXT:    notl %ecx
253; X86-NEXT:    lock cmpxchgl %ecx, sc32
254; X86-NEXT:    sete %cl
255; X86-NEXT:    testb $1, %cl
256; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
257; X86-NEXT:    jne .LBB5_2
258; X86-NEXT:    jmp .LBB5_1
259; X86-NEXT:  .LBB5_2: # %atomicrmw.end
260; X86-NEXT:    addl $8, %esp
261; X86-NEXT:    retl
262  %t1 = atomicrmw nand ptr @sc32, i32 %x acquire
263  ret void
264}
265
266define void @atomic_fetch_max32(i32 %x) nounwind {
267; X64-LABEL: atomic_fetch_max32:
268; X64:       # %bb.0:
269; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
270; X64-NEXT:    movl sc32, %eax
271; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
272; X64-NEXT:  .LBB6_1: # %atomicrmw.start
273; X64-NEXT:    # =>This Inner Loop Header: Depth=1
274; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
275; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
276; X64-NEXT:    movl %eax, %edx
277; X64-NEXT:    subl %ecx, %edx
278; X64-NEXT:    cmovgl %eax, %ecx
279; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
280; X64-NEXT:    sete %cl
281; X64-NEXT:    testb $1, %cl
282; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
283; X64-NEXT:    jne .LBB6_2
284; X64-NEXT:    jmp .LBB6_1
285; X64-NEXT:  .LBB6_2: # %atomicrmw.end
286; X64-NEXT:    retq
287;
288; X86-CMOV-LABEL: atomic_fetch_max32:
289; X86-CMOV:       # %bb.0:
290; X86-CMOV-NEXT:    subl $8, %esp
291; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
292; X86-CMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
293; X86-CMOV-NEXT:    movl sc32, %eax
294; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
295; X86-CMOV-NEXT:  .LBB6_1: # %atomicrmw.start
296; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
297; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
298; X86-CMOV-NEXT:    movl (%esp), %ecx # 4-byte Reload
299; X86-CMOV-NEXT:    movl %eax, %edx
300; X86-CMOV-NEXT:    subl %ecx, %edx
301; X86-CMOV-NEXT:    cmovgl %eax, %ecx
302; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
303; X86-CMOV-NEXT:    sete %cl
304; X86-CMOV-NEXT:    testb $1, %cl
305; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
306; X86-CMOV-NEXT:    jne .LBB6_2
307; X86-CMOV-NEXT:    jmp .LBB6_1
308; X86-CMOV-NEXT:  .LBB6_2: # %atomicrmw.end
309; X86-CMOV-NEXT:    addl $8, %esp
310; X86-CMOV-NEXT:    retl
311;
312; X86-NOCMOV-LABEL: atomic_fetch_max32:
313; X86-NOCMOV:       # %bb.0:
314; X86-NOCMOV-NEXT:    subl $16, %esp
315; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
316; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
317; X86-NOCMOV-NEXT:    movl sc32, %eax
318; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
319; X86-NOCMOV-NEXT:  .LBB6_1: # %atomicrmw.start
320; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
321; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
322; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
323; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
324; X86-NOCMOV-NEXT:    movl %eax, %ecx
325; X86-NOCMOV-NEXT:    subl %edx, %ecx
326; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
327; X86-NOCMOV-NEXT:    jg .LBB6_4
328; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
329; X86-NOCMOV-NEXT:    # in Loop: Header=BB6_1 Depth=1
330; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
331; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
332; X86-NOCMOV-NEXT:  .LBB6_4: # %atomicrmw.start
333; X86-NOCMOV-NEXT:    # in Loop: Header=BB6_1 Depth=1
334; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
335; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
336; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
337; X86-NOCMOV-NEXT:    sete %cl
338; X86-NOCMOV-NEXT:    testb $1, %cl
339; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
340; X86-NOCMOV-NEXT:    jne .LBB6_2
341; X86-NOCMOV-NEXT:    jmp .LBB6_1
342; X86-NOCMOV-NEXT:  .LBB6_2: # %atomicrmw.end
343; X86-NOCMOV-NEXT:    addl $16, %esp
344; X86-NOCMOV-NEXT:    retl
345;
346; X86-NOX87-LABEL: atomic_fetch_max32:
347; X86-NOX87:       # %bb.0:
348; X86-NOX87-NEXT:    subl $16, %esp
349; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
350; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
351; X86-NOX87-NEXT:    movl sc32, %eax
352; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
353; X86-NOX87-NEXT:  .LBB6_1: # %atomicrmw.start
354; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
355; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
356; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
357; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
358; X86-NOX87-NEXT:    movl %eax, %ecx
359; X86-NOX87-NEXT:    subl %edx, %ecx
360; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
361; X86-NOX87-NEXT:    jg .LBB6_4
362; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
363; X86-NOX87-NEXT:    # in Loop: Header=BB6_1 Depth=1
364; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
365; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
366; X86-NOX87-NEXT:  .LBB6_4: # %atomicrmw.start
367; X86-NOX87-NEXT:    # in Loop: Header=BB6_1 Depth=1
368; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
369; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
370; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
371; X86-NOX87-NEXT:    sete %cl
372; X86-NOX87-NEXT:    testb $1, %cl
373; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
374; X86-NOX87-NEXT:    jne .LBB6_2
375; X86-NOX87-NEXT:    jmp .LBB6_1
376; X86-NOX87-NEXT:  .LBB6_2: # %atomicrmw.end
377; X86-NOX87-NEXT:    addl $16, %esp
378; X86-NOX87-NEXT:    retl
379  %t1 = atomicrmw max  ptr @sc32, i32 %x acquire
380  ret void
381}
382
383define void @atomic_fetch_min32(i32 %x) nounwind {
384; X64-LABEL: atomic_fetch_min32:
385; X64:       # %bb.0:
386; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
387; X64-NEXT:    movl sc32, %eax
388; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
389; X64-NEXT:  .LBB7_1: # %atomicrmw.start
390; X64-NEXT:    # =>This Inner Loop Header: Depth=1
391; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
392; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
393; X64-NEXT:    movl %eax, %edx
394; X64-NEXT:    subl %ecx, %edx
395; X64-NEXT:    cmovlel %eax, %ecx
396; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
397; X64-NEXT:    sete %cl
398; X64-NEXT:    testb $1, %cl
399; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
400; X64-NEXT:    jne .LBB7_2
401; X64-NEXT:    jmp .LBB7_1
402; X64-NEXT:  .LBB7_2: # %atomicrmw.end
403; X64-NEXT:    retq
404;
405; X86-CMOV-LABEL: atomic_fetch_min32:
406; X86-CMOV:       # %bb.0:
407; X86-CMOV-NEXT:    subl $8, %esp
408; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
409; X86-CMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
410; X86-CMOV-NEXT:    movl sc32, %eax
411; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
412; X86-CMOV-NEXT:  .LBB7_1: # %atomicrmw.start
413; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
414; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
415; X86-CMOV-NEXT:    movl (%esp), %ecx # 4-byte Reload
416; X86-CMOV-NEXT:    movl %eax, %edx
417; X86-CMOV-NEXT:    subl %ecx, %edx
418; X86-CMOV-NEXT:    cmovlel %eax, %ecx
419; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
420; X86-CMOV-NEXT:    sete %cl
421; X86-CMOV-NEXT:    testb $1, %cl
422; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
423; X86-CMOV-NEXT:    jne .LBB7_2
424; X86-CMOV-NEXT:    jmp .LBB7_1
425; X86-CMOV-NEXT:  .LBB7_2: # %atomicrmw.end
426; X86-CMOV-NEXT:    addl $8, %esp
427; X86-CMOV-NEXT:    retl
428;
429; X86-NOCMOV-LABEL: atomic_fetch_min32:
430; X86-NOCMOV:       # %bb.0:
431; X86-NOCMOV-NEXT:    subl $16, %esp
432; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
433; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
434; X86-NOCMOV-NEXT:    movl sc32, %eax
435; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
436; X86-NOCMOV-NEXT:  .LBB7_1: # %atomicrmw.start
437; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
438; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
439; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
440; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
441; X86-NOCMOV-NEXT:    movl %eax, %ecx
442; X86-NOCMOV-NEXT:    subl %edx, %ecx
443; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
444; X86-NOCMOV-NEXT:    jle .LBB7_4
445; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
446; X86-NOCMOV-NEXT:    # in Loop: Header=BB7_1 Depth=1
447; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
448; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
449; X86-NOCMOV-NEXT:  .LBB7_4: # %atomicrmw.start
450; X86-NOCMOV-NEXT:    # in Loop: Header=BB7_1 Depth=1
451; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
452; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
453; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
454; X86-NOCMOV-NEXT:    sete %cl
455; X86-NOCMOV-NEXT:    testb $1, %cl
456; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
457; X86-NOCMOV-NEXT:    jne .LBB7_2
458; X86-NOCMOV-NEXT:    jmp .LBB7_1
459; X86-NOCMOV-NEXT:  .LBB7_2: # %atomicrmw.end
460; X86-NOCMOV-NEXT:    addl $16, %esp
461; X86-NOCMOV-NEXT:    retl
462;
463; X86-NOX87-LABEL: atomic_fetch_min32:
464; X86-NOX87:       # %bb.0:
465; X86-NOX87-NEXT:    subl $16, %esp
466; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
467; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
468; X86-NOX87-NEXT:    movl sc32, %eax
469; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
470; X86-NOX87-NEXT:  .LBB7_1: # %atomicrmw.start
471; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
472; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
473; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
474; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
475; X86-NOX87-NEXT:    movl %eax, %ecx
476; X86-NOX87-NEXT:    subl %edx, %ecx
477; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
478; X86-NOX87-NEXT:    jle .LBB7_4
479; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
480; X86-NOX87-NEXT:    # in Loop: Header=BB7_1 Depth=1
481; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
482; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
483; X86-NOX87-NEXT:  .LBB7_4: # %atomicrmw.start
484; X86-NOX87-NEXT:    # in Loop: Header=BB7_1 Depth=1
485; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
486; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
487; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
488; X86-NOX87-NEXT:    sete %cl
489; X86-NOX87-NEXT:    testb $1, %cl
490; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
491; X86-NOX87-NEXT:    jne .LBB7_2
492; X86-NOX87-NEXT:    jmp .LBB7_1
493; X86-NOX87-NEXT:  .LBB7_2: # %atomicrmw.end
494; X86-NOX87-NEXT:    addl $16, %esp
495; X86-NOX87-NEXT:    retl
496  %t1 = atomicrmw min  ptr @sc32, i32 %x acquire
497  ret void
498}
499
500define void @atomic_fetch_umax32(i32 %x) nounwind {
501; X64-LABEL: atomic_fetch_umax32:
502; X64:       # %bb.0:
503; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
504; X64-NEXT:    movl sc32, %eax
505; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
506; X64-NEXT:  .LBB8_1: # %atomicrmw.start
507; X64-NEXT:    # =>This Inner Loop Header: Depth=1
508; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
509; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
510; X64-NEXT:    movl %eax, %edx
511; X64-NEXT:    subl %ecx, %edx
512; X64-NEXT:    cmoval %eax, %ecx
513; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
514; X64-NEXT:    sete %cl
515; X64-NEXT:    testb $1, %cl
516; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
517; X64-NEXT:    jne .LBB8_2
518; X64-NEXT:    jmp .LBB8_1
519; X64-NEXT:  .LBB8_2: # %atomicrmw.end
520; X64-NEXT:    retq
521;
522; X86-CMOV-LABEL: atomic_fetch_umax32:
523; X86-CMOV:       # %bb.0:
524; X86-CMOV-NEXT:    subl $8, %esp
525; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
526; X86-CMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
527; X86-CMOV-NEXT:    movl sc32, %eax
528; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
529; X86-CMOV-NEXT:  .LBB8_1: # %atomicrmw.start
530; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
531; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
532; X86-CMOV-NEXT:    movl (%esp), %ecx # 4-byte Reload
533; X86-CMOV-NEXT:    movl %eax, %edx
534; X86-CMOV-NEXT:    subl %ecx, %edx
535; X86-CMOV-NEXT:    cmoval %eax, %ecx
536; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
537; X86-CMOV-NEXT:    sete %cl
538; X86-CMOV-NEXT:    testb $1, %cl
539; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
540; X86-CMOV-NEXT:    jne .LBB8_2
541; X86-CMOV-NEXT:    jmp .LBB8_1
542; X86-CMOV-NEXT:  .LBB8_2: # %atomicrmw.end
543; X86-CMOV-NEXT:    addl $8, %esp
544; X86-CMOV-NEXT:    retl
545;
546; X86-NOCMOV-LABEL: atomic_fetch_umax32:
547; X86-NOCMOV:       # %bb.0:
548; X86-NOCMOV-NEXT:    subl $16, %esp
549; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
550; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
551; X86-NOCMOV-NEXT:    movl sc32, %eax
552; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
553; X86-NOCMOV-NEXT:  .LBB8_1: # %atomicrmw.start
554; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
555; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
556; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
557; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
558; X86-NOCMOV-NEXT:    movl %eax, %ecx
559; X86-NOCMOV-NEXT:    subl %edx, %ecx
560; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
561; X86-NOCMOV-NEXT:    ja .LBB8_4
562; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
563; X86-NOCMOV-NEXT:    # in Loop: Header=BB8_1 Depth=1
564; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
565; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
566; X86-NOCMOV-NEXT:  .LBB8_4: # %atomicrmw.start
567; X86-NOCMOV-NEXT:    # in Loop: Header=BB8_1 Depth=1
568; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
569; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
570; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
571; X86-NOCMOV-NEXT:    sete %cl
572; X86-NOCMOV-NEXT:    testb $1, %cl
573; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
574; X86-NOCMOV-NEXT:    jne .LBB8_2
575; X86-NOCMOV-NEXT:    jmp .LBB8_1
576; X86-NOCMOV-NEXT:  .LBB8_2: # %atomicrmw.end
577; X86-NOCMOV-NEXT:    addl $16, %esp
578; X86-NOCMOV-NEXT:    retl
579;
580; X86-NOX87-LABEL: atomic_fetch_umax32:
581; X86-NOX87:       # %bb.0:
582; X86-NOX87-NEXT:    subl $16, %esp
583; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
584; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
585; X86-NOX87-NEXT:    movl sc32, %eax
586; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
587; X86-NOX87-NEXT:  .LBB8_1: # %atomicrmw.start
588; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
589; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
590; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
591; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
592; X86-NOX87-NEXT:    movl %eax, %ecx
593; X86-NOX87-NEXT:    subl %edx, %ecx
594; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
595; X86-NOX87-NEXT:    ja .LBB8_4
596; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
597; X86-NOX87-NEXT:    # in Loop: Header=BB8_1 Depth=1
598; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
599; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
600; X86-NOX87-NEXT:  .LBB8_4: # %atomicrmw.start
601; X86-NOX87-NEXT:    # in Loop: Header=BB8_1 Depth=1
602; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
603; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
604; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
605; X86-NOX87-NEXT:    sete %cl
606; X86-NOX87-NEXT:    testb $1, %cl
607; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
608; X86-NOX87-NEXT:    jne .LBB8_2
609; X86-NOX87-NEXT:    jmp .LBB8_1
610; X86-NOX87-NEXT:  .LBB8_2: # %atomicrmw.end
611; X86-NOX87-NEXT:    addl $16, %esp
612; X86-NOX87-NEXT:    retl
613  %t1 = atomicrmw umax ptr @sc32, i32 %x acquire
614  ret void
615}
616
617define void @atomic_fetch_umin32(i32 %x) nounwind {
618; X64-LABEL: atomic_fetch_umin32:
619; X64:       # %bb.0:
620; X64-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
621; X64-NEXT:    movl sc32, %eax
622; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
623; X64-NEXT:  .LBB9_1: # %atomicrmw.start
624; X64-NEXT:    # =>This Inner Loop Header: Depth=1
625; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
626; X64-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
627; X64-NEXT:    movl %eax, %edx
628; X64-NEXT:    subl %ecx, %edx
629; X64-NEXT:    cmovbel %eax, %ecx
630; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
631; X64-NEXT:    sete %cl
632; X64-NEXT:    testb $1, %cl
633; X64-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
634; X64-NEXT:    jne .LBB9_2
635; X64-NEXT:    jmp .LBB9_1
636; X64-NEXT:  .LBB9_2: # %atomicrmw.end
637; X64-NEXT:    retq
638;
639; X86-CMOV-LABEL: atomic_fetch_umin32:
640; X86-CMOV:       # %bb.0:
641; X86-CMOV-NEXT:    subl $8, %esp
642; X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
643; X86-CMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
644; X86-CMOV-NEXT:    movl sc32, %eax
645; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
646; X86-CMOV-NEXT:  .LBB9_1: # %atomicrmw.start
647; X86-CMOV-NEXT:    # =>This Inner Loop Header: Depth=1
648; X86-CMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
649; X86-CMOV-NEXT:    movl (%esp), %ecx # 4-byte Reload
650; X86-CMOV-NEXT:    movl %eax, %edx
651; X86-CMOV-NEXT:    subl %ecx, %edx
652; X86-CMOV-NEXT:    cmovbel %eax, %ecx
653; X86-CMOV-NEXT:    lock cmpxchgl %ecx, sc32
654; X86-CMOV-NEXT:    sete %cl
655; X86-CMOV-NEXT:    testb $1, %cl
656; X86-CMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
657; X86-CMOV-NEXT:    jne .LBB9_2
658; X86-CMOV-NEXT:    jmp .LBB9_1
659; X86-CMOV-NEXT:  .LBB9_2: # %atomicrmw.end
660; X86-CMOV-NEXT:    addl $8, %esp
661; X86-CMOV-NEXT:    retl
662;
663; X86-NOCMOV-LABEL: atomic_fetch_umin32:
664; X86-NOCMOV:       # %bb.0:
665; X86-NOCMOV-NEXT:    subl $16, %esp
666; X86-NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
667; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
668; X86-NOCMOV-NEXT:    movl sc32, %eax
669; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
670; X86-NOCMOV-NEXT:  .LBB9_1: # %atomicrmw.start
671; X86-NOCMOV-NEXT:    # =>This Inner Loop Header: Depth=1
672; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
673; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
674; X86-NOCMOV-NEXT:    movl %eax, (%esp) # 4-byte Spill
675; X86-NOCMOV-NEXT:    movl %eax, %ecx
676; X86-NOCMOV-NEXT:    subl %edx, %ecx
677; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
678; X86-NOCMOV-NEXT:    jbe .LBB9_4
679; X86-NOCMOV-NEXT:  # %bb.3: # %atomicrmw.start
680; X86-NOCMOV-NEXT:    # in Loop: Header=BB9_1 Depth=1
681; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
682; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
683; X86-NOCMOV-NEXT:  .LBB9_4: # %atomicrmw.start
684; X86-NOCMOV-NEXT:    # in Loop: Header=BB9_1 Depth=1
685; X86-NOCMOV-NEXT:    movl (%esp), %eax # 4-byte Reload
686; X86-NOCMOV-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
687; X86-NOCMOV-NEXT:    lock cmpxchgl %ecx, sc32
688; X86-NOCMOV-NEXT:    sete %cl
689; X86-NOCMOV-NEXT:    testb $1, %cl
690; X86-NOCMOV-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
691; X86-NOCMOV-NEXT:    jne .LBB9_2
692; X86-NOCMOV-NEXT:    jmp .LBB9_1
693; X86-NOCMOV-NEXT:  .LBB9_2: # %atomicrmw.end
694; X86-NOCMOV-NEXT:    addl $16, %esp
695; X86-NOCMOV-NEXT:    retl
696;
697; X86-NOX87-LABEL: atomic_fetch_umin32:
698; X86-NOX87:       # %bb.0:
699; X86-NOX87-NEXT:    subl $16, %esp
700; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
701; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
702; X86-NOX87-NEXT:    movl sc32, %eax
703; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
704; X86-NOX87-NEXT:  .LBB9_1: # %atomicrmw.start
705; X86-NOX87-NEXT:    # =>This Inner Loop Header: Depth=1
706; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
707; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
708; X86-NOX87-NEXT:    movl %eax, (%esp) # 4-byte Spill
709; X86-NOX87-NEXT:    movl %eax, %ecx
710; X86-NOX87-NEXT:    subl %edx, %ecx
711; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
712; X86-NOX87-NEXT:    jbe .LBB9_4
713; X86-NOX87-NEXT:  # %bb.3: # %atomicrmw.start
714; X86-NOX87-NEXT:    # in Loop: Header=BB9_1 Depth=1
715; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
716; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
717; X86-NOX87-NEXT:  .LBB9_4: # %atomicrmw.start
718; X86-NOX87-NEXT:    # in Loop: Header=BB9_1 Depth=1
719; X86-NOX87-NEXT:    movl (%esp), %eax # 4-byte Reload
720; X86-NOX87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
721; X86-NOX87-NEXT:    lock cmpxchgl %ecx, sc32
722; X86-NOX87-NEXT:    sete %cl
723; X86-NOX87-NEXT:    testb $1, %cl
724; X86-NOX87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
725; X86-NOX87-NEXT:    jne .LBB9_2
726; X86-NOX87-NEXT:    jmp .LBB9_1
727; X86-NOX87-NEXT:  .LBB9_2: # %atomicrmw.end
728; X86-NOX87-NEXT:    addl $16, %esp
729; X86-NOX87-NEXT:    retl
730  %t1 = atomicrmw umin ptr @sc32, i32 %x acquire
731  ret void
732}
733
734define void @atomic_fetch_cmpxchg32() nounwind {
735; X64-LABEL: atomic_fetch_cmpxchg32:
736; X64:       # %bb.0:
737; X64-NEXT:    xorl %eax, %eax
738; X64-NEXT:    movl $1, %ecx
739; X64-NEXT:    lock cmpxchgl %ecx, sc32(%rip)
740; X64-NEXT:    retq
741;
742; X86-LABEL: atomic_fetch_cmpxchg32:
743; X86:       # %bb.0:
744; X86-NEXT:    xorl %eax, %eax
745; X86-NEXT:    movl $1, %ecx
746; X86-NEXT:    lock cmpxchgl %ecx, sc32
747; X86-NEXT:    retl
748  %t1 = cmpxchg ptr @sc32, i32 0, i32 1 acquire acquire
749  ret void
750}
751
752define void @atomic_fetch_store32(i32 %x) nounwind {
753; X64-LABEL: atomic_fetch_store32:
754; X64:       # %bb.0:
755; X64-NEXT:    movl %edi, sc32(%rip)
756; X64-NEXT:    retq
757;
758; X86-LABEL: atomic_fetch_store32:
759; X86:       # %bb.0:
760; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
761; X86-NEXT:    movl %eax, sc32
762; X86-NEXT:    retl
763  store atomic i32 %x, ptr @sc32 release, align 4
764  ret void
765}
766
767define void @atomic_fetch_swap32(i32 %x) nounwind {
768; X64-LABEL: atomic_fetch_swap32:
769; X64:       # %bb.0:
770; X64-NEXT:    xchgl %edi, sc32(%rip)
771; X64-NEXT:    retq
772;
773; X86-LABEL: atomic_fetch_swap32:
774; X86:       # %bb.0:
775; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
776; X86-NEXT:    xchgl %eax, sc32
777; X86-NEXT:    retl
778  %t1 = atomicrmw xchg ptr @sc32, i32 %x acquire
779  ret void
780}
781
782define void @atomic_fetch_swapf32(float %x) nounwind {
783; X64-LABEL: atomic_fetch_swapf32:
784; X64:       # %bb.0:
785; X64-NEXT:    movd %xmm0, %eax
786; X64-NEXT:    xchgl %eax, fsc32(%rip)
787; X64-NEXT:    retq
788;
789; X86-CMOV-LABEL: atomic_fetch_swapf32:
790; X86-CMOV:       # %bb.0:
791; X86-CMOV-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
792; X86-CMOV-NEXT:    movd %xmm0, %eax
793; X86-CMOV-NEXT:    xchgl %eax, fsc32
794; X86-CMOV-NEXT:    retl
795;
796; X86-NOCMOV-LABEL: atomic_fetch_swapf32:
797; X86-NOCMOV:       # %bb.0:
798; X86-NOCMOV-NEXT:    pushl %eax
799; X86-NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)
800; X86-NOCMOV-NEXT:    fstps (%esp)
801; X86-NOCMOV-NEXT:    movl (%esp), %eax
802; X86-NOCMOV-NEXT:    xchgl %eax, fsc32
803; X86-NOCMOV-NEXT:    popl %eax
804; X86-NOCMOV-NEXT:    retl
805;
806; X86-NOX87-LABEL: atomic_fetch_swapf32:
807; X86-NOX87:       # %bb.0:
808; X86-NOX87-NEXT:    movl {{[0-9]+}}(%esp), %eax
809; X86-NOX87-NEXT:    xchgl %eax, fsc32
810; X86-NOX87-NEXT:    retl
811  %t1 = atomicrmw xchg ptr @fsc32, float %x acquire
812  ret void
813}
814