xref: /llvm-project/llvm/test/CodeGen/X86/isel-select-cmov.ll (revision 7ece560a50d09686bb384b309b8b05d8f63111e5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -verify-machineinstrs                                                   | FileCheck %s --check-prefix=SDAG-X64
3; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f                                   | FileCheck %s --check-prefix=SDAG-X64
4; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs                     | FileCheck %s --check-prefix=FAST-X64
5; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f     | FileCheck %s --check-prefix=FAST-X64
6; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs                 | FileCheck %s --check-prefix=GISEL-X64
7; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f | FileCheck %s --check-prefix=GISEL-X64
8
9; RUN: llc < %s -mtriple=i686-apple-darwin10 -verify-machineinstrs                                                | FileCheck %s --check-prefix=SDAG-X86
10; RUN: llc < %s -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov                                   | FileCheck %s --check-prefix=SDAG-X86-CMOV
11; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs                  | FileCheck %s --check-prefix=FAST-X86
12; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov     | FileCheck %s --check-prefix=FAST-X86-CMOV
13; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs              | FileCheck %s --check-prefix=GISEL-X86
14; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov | FileCheck %s --check-prefix=GISEL-X86-CMOV
15
16; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+ndd    | FileCheck %s --check-prefix=NDD
17
18; Test conditional move for the supported types (i16, i32, and i32) and
19; conditon input (argument or cmp).
20; When cmov is not available (i8 type or X86), the branch is expected.
21
22define zeroext i8 @select_cmov_i8(i1 zeroext %cond, i8 zeroext %a, i8 zeroext %b) {
23; SDAG-X64-LABEL: select_cmov_i8:
24; SDAG-X64:       ## %bb.0:
25; SDAG-X64-NEXT:    movl %esi, %eax
26; SDAG-X64-NEXT:    testl %edi, %edi
27; SDAG-X64-NEXT:    cmovel %edx, %eax
28; SDAG-X64-NEXT:    retq
29;
30; FAST-X64-LABEL: select_cmov_i8:
31; FAST-X64:       ## %bb.0:
32; FAST-X64-NEXT:    testb $1, %dil
33; FAST-X64-NEXT:    jne LBB0_2
34; FAST-X64-NEXT:  ## %bb.1:
35; FAST-X64-NEXT:    movl %edx, %esi
36; FAST-X64-NEXT:  LBB0_2:
37; FAST-X64-NEXT:    movzbl %sil, %eax
38; FAST-X64-NEXT:    retq
39;
40; GISEL-X64-LABEL: select_cmov_i8:
41; GISEL-X64:       ## %bb.0:
42; GISEL-X64-NEXT:    movl %edx, %eax
43; GISEL-X64-NEXT:    testl %edi, %edi
44; GISEL-X64-NEXT:    cmovnew %si, %ax
45; GISEL-X64-NEXT:    ## kill: def $al killed $al killed $eax
46; GISEL-X64-NEXT:    retq
47;
48; SDAG-X86-LABEL: select_cmov_i8:
49; SDAG-X86:       ## %bb.0:
50; SDAG-X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
51; SDAG-X86-NEXT:    jne LBB0_1
52; SDAG-X86-NEXT:  ## %bb.2:
53; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
54; SDAG-X86-NEXT:    movzbl (%eax), %eax
55; SDAG-X86-NEXT:    retl
56; SDAG-X86-NEXT:  LBB0_1:
57; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
58; SDAG-X86-NEXT:    movzbl (%eax), %eax
59; SDAG-X86-NEXT:    retl
60;
61; SDAG-X86-CMOV-LABEL: select_cmov_i8:
62; SDAG-X86-CMOV:       ## %bb.0:
63; SDAG-X86-CMOV-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
64; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax
65; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx
66; SDAG-X86-CMOV-NEXT:    cmovnel %eax, %ecx
67; SDAG-X86-CMOV-NEXT:    movzbl (%ecx), %eax
68; SDAG-X86-CMOV-NEXT:    retl
69;
70; FAST-X86-LABEL: select_cmov_i8:
71; FAST-X86:       ## %bb.0:
72; FAST-X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
73; FAST-X86-NEXT:    jne LBB0_1
74; FAST-X86-NEXT:  ## %bb.2:
75; FAST-X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
76; FAST-X86-NEXT:    movzbl %al, %eax
77; FAST-X86-NEXT:    retl
78; FAST-X86-NEXT:  LBB0_1:
79; FAST-X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
80; FAST-X86-NEXT:    movzbl %al, %eax
81; FAST-X86-NEXT:    retl
82;
83; FAST-X86-CMOV-LABEL: select_cmov_i8:
84; FAST-X86-CMOV:       ## %bb.0:
85; FAST-X86-CMOV-NEXT:    testb $1, {{[0-9]+}}(%esp)
86; FAST-X86-CMOV-NEXT:    jne LBB0_1
87; FAST-X86-CMOV-NEXT:  ## %bb.2:
88; FAST-X86-CMOV-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
89; FAST-X86-CMOV-NEXT:    movzbl %al, %eax
90; FAST-X86-CMOV-NEXT:    retl
91; FAST-X86-CMOV-NEXT:  LBB0_1:
92; FAST-X86-CMOV-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
93; FAST-X86-CMOV-NEXT:    movzbl %al, %eax
94; FAST-X86-CMOV-NEXT:    retl
95;
96; GISEL-X86-LABEL: select_cmov_i8:
97; GISEL-X86:       ## %bb.0:
98; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
99; GISEL-X86-NEXT:    testl %eax, %eax
100; GISEL-X86-NEXT:    je LBB0_1
101; GISEL-X86-NEXT:  ## %bb.2:
102; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
103; GISEL-X86-NEXT:    ## kill: def $al killed $al killed $eax
104; GISEL-X86-NEXT:    retl
105; GISEL-X86-NEXT:  LBB0_1:
106; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
107; GISEL-X86-NEXT:    ## kill: def $al killed $al killed $eax
108; GISEL-X86-NEXT:    retl
109;
110; GISEL-X86-CMOV-LABEL: select_cmov_i8:
111; GISEL-X86-CMOV:       ## %bb.0:
112; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
113; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edx
114; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
115; GISEL-X86-CMOV-NEXT:    testl %ecx, %ecx
116; GISEL-X86-CMOV-NEXT:    cmovnew %dx, %ax
117; GISEL-X86-CMOV-NEXT:    ## kill: def $al killed $al killed $eax
118; GISEL-X86-CMOV-NEXT:    retl
119;
120; NDD-LABEL: select_cmov_i8:
121; NDD:       ## %bb.0:
122; NDD-NEXT:    testb $1, %dil
123; NDD-NEXT:    jne LBB0_2
124; NDD-NEXT:  ## %bb.1:
125; NDD-NEXT:    movl %edx, %esi
126; NDD-NEXT:  LBB0_2:
127; NDD-NEXT:    movzbl %sil, %eax
128; NDD-NEXT:    retq
129  %1 = select i1 %cond, i8 %a, i8 %b
130  ret i8 %1
131}
132
133define zeroext i16 @select_cmov_i16(i1 zeroext %cond, i16 zeroext %a, i16 zeroext %b) {
134; SDAG-X64-LABEL: select_cmov_i16:
135; SDAG-X64:       ## %bb.0:
136; SDAG-X64-NEXT:    movl %esi, %eax
137; SDAG-X64-NEXT:    testl %edi, %edi
138; SDAG-X64-NEXT:    cmovel %edx, %eax
139; SDAG-X64-NEXT:    retq
140;
141; FAST-X64-LABEL: select_cmov_i16:
142; FAST-X64:       ## %bb.0:
143; FAST-X64-NEXT:    testb $1, %dil
144; FAST-X64-NEXT:    cmovew %dx, %si
145; FAST-X64-NEXT:    movzwl %si, %eax
146; FAST-X64-NEXT:    retq
147;
148; GISEL-X64-LABEL: select_cmov_i16:
149; GISEL-X64:       ## %bb.0:
150; GISEL-X64-NEXT:    movl %edx, %eax
151; GISEL-X64-NEXT:    testl %edi, %edi
152; GISEL-X64-NEXT:    cmovnew %si, %ax
153; GISEL-X64-NEXT:    ## kill: def $ax killed $ax killed $eax
154; GISEL-X64-NEXT:    retq
155;
156; SDAG-X86-LABEL: select_cmov_i16:
157; SDAG-X86:       ## %bb.0:
158; SDAG-X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
159; SDAG-X86-NEXT:    jne LBB1_1
160; SDAG-X86-NEXT:  ## %bb.2:
161; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
162; SDAG-X86-NEXT:    movzwl (%eax), %eax
163; SDAG-X86-NEXT:    retl
164; SDAG-X86-NEXT:  LBB1_1:
165; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
166; SDAG-X86-NEXT:    movzwl (%eax), %eax
167; SDAG-X86-NEXT:    retl
168;
169; SDAG-X86-CMOV-LABEL: select_cmov_i16:
170; SDAG-X86-CMOV:       ## %bb.0:
171; SDAG-X86-CMOV-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
172; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax
173; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx
174; SDAG-X86-CMOV-NEXT:    cmovnel %eax, %ecx
175; SDAG-X86-CMOV-NEXT:    movzwl (%ecx), %eax
176; SDAG-X86-CMOV-NEXT:    retl
177;
178; FAST-X86-LABEL: select_cmov_i16:
179; FAST-X86:       ## %bb.0:
180; FAST-X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
181; FAST-X86-NEXT:    jne LBB1_1
182; FAST-X86-NEXT:  ## %bb.2:
183; FAST-X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
184; FAST-X86-NEXT:    movzwl %ax, %eax
185; FAST-X86-NEXT:    retl
186; FAST-X86-NEXT:  LBB1_1:
187; FAST-X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
188; FAST-X86-NEXT:    movzwl %ax, %eax
189; FAST-X86-NEXT:    retl
190;
191; FAST-X86-CMOV-LABEL: select_cmov_i16:
192; FAST-X86-CMOV:       ## %bb.0:
193; FAST-X86-CMOV-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
194; FAST-X86-CMOV-NEXT:    testb $1, {{[0-9]+}}(%esp)
195; FAST-X86-CMOV-NEXT:    cmovew {{[0-9]+}}(%esp), %ax
196; FAST-X86-CMOV-NEXT:    movzwl %ax, %eax
197; FAST-X86-CMOV-NEXT:    retl
198;
199; GISEL-X86-LABEL: select_cmov_i16:
200; GISEL-X86:       ## %bb.0:
201; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
202; GISEL-X86-NEXT:    testl %eax, %eax
203; GISEL-X86-NEXT:    je LBB1_1
204; GISEL-X86-NEXT:  ## %bb.2:
205; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
206; GISEL-X86-NEXT:    ## kill: def $ax killed $ax killed $eax
207; GISEL-X86-NEXT:    retl
208; GISEL-X86-NEXT:  LBB1_1:
209; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
210; GISEL-X86-NEXT:    ## kill: def $ax killed $ax killed $eax
211; GISEL-X86-NEXT:    retl
212;
213; GISEL-X86-CMOV-LABEL: select_cmov_i16:
214; GISEL-X86-CMOV:       ## %bb.0:
215; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
216; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edx
217; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
218; GISEL-X86-CMOV-NEXT:    testl %ecx, %ecx
219; GISEL-X86-CMOV-NEXT:    cmovnew %dx, %ax
220; GISEL-X86-CMOV-NEXT:    ## kill: def $ax killed $ax killed $eax
221; GISEL-X86-CMOV-NEXT:    retl
222;
223; NDD-LABEL: select_cmov_i16:
224; NDD:       ## %bb.0:
225; NDD-NEXT:    testb $1, %dil
226; NDD-NEXT:    cmovnew %si, %dx, %ax
227; NDD-NEXT:    movzwl %ax, %eax
228; NDD-NEXT:    retq
229  %1 = select i1 %cond, i16 %a, i16 %b
230  ret i16 %1
231}
232
233define zeroext i16 @select_cmp_cmov_i16(i16 zeroext %a, i16 zeroext %b) {
234; SDAG-X64-LABEL: select_cmp_cmov_i16:
235; SDAG-X64:       ## %bb.0:
236; SDAG-X64-NEXT:    movl %esi, %eax
237; SDAG-X64-NEXT:    cmpw %ax, %di
238; SDAG-X64-NEXT:    cmovbl %edi, %eax
239; SDAG-X64-NEXT:    retq
240;
241; FAST-X64-LABEL: select_cmp_cmov_i16:
242; FAST-X64:       ## %bb.0:
243; FAST-X64-NEXT:    cmpw %si, %di
244; FAST-X64-NEXT:    cmovbw %di, %si
245; FAST-X64-NEXT:    movzwl %si, %eax
246; FAST-X64-NEXT:    retq
247;
248; GISEL-X64-LABEL: select_cmp_cmov_i16:
249; GISEL-X64:       ## %bb.0:
250; GISEL-X64-NEXT:    movl %edi, %eax
251; GISEL-X64-NEXT:    xorl %ecx, %ecx
252; GISEL-X64-NEXT:    cmpw %si, %ax
253; GISEL-X64-NEXT:    setb %cl
254; GISEL-X64-NEXT:    andl $1, %ecx
255; GISEL-X64-NEXT:    cmovew %si, %ax
256; GISEL-X64-NEXT:    ## kill: def $ax killed $ax killed $eax
257; GISEL-X64-NEXT:    retq
258;
259; SDAG-X86-LABEL: select_cmp_cmov_i16:
260; SDAG-X86:       ## %bb.0:
261; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
262; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
263; SDAG-X86-NEXT:    cmpw %cx, %ax
264; SDAG-X86-NEXT:    jb LBB2_2
265; SDAG-X86-NEXT:  ## %bb.1:
266; SDAG-X86-NEXT:    movl %ecx, %eax
267; SDAG-X86-NEXT:  LBB2_2:
268; SDAG-X86-NEXT:    movzwl %ax, %eax
269; SDAG-X86-NEXT:    retl
270;
271; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i16:
272; SDAG-X86-CMOV:       ## %bb.0:
273; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
274; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
275; SDAG-X86-CMOV-NEXT:    cmpw %ax, %cx
276; SDAG-X86-CMOV-NEXT:    cmovbl %ecx, %eax
277; SDAG-X86-CMOV-NEXT:    movzwl %ax, %eax
278; SDAG-X86-CMOV-NEXT:    retl
279;
280; FAST-X86-LABEL: select_cmp_cmov_i16:
281; FAST-X86:       ## %bb.0:
282; FAST-X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
283; FAST-X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
284; FAST-X86-NEXT:    cmpw %cx, %ax
285; FAST-X86-NEXT:    jb LBB2_2
286; FAST-X86-NEXT:  ## %bb.1:
287; FAST-X86-NEXT:    movl %ecx, %eax
288; FAST-X86-NEXT:  LBB2_2:
289; FAST-X86-NEXT:    movzwl %ax, %eax
290; FAST-X86-NEXT:    retl
291;
292; FAST-X86-CMOV-LABEL: select_cmp_cmov_i16:
293; FAST-X86-CMOV:       ## %bb.0:
294; FAST-X86-CMOV-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
295; FAST-X86-CMOV-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
296; FAST-X86-CMOV-NEXT:    cmpw %ax, %cx
297; FAST-X86-CMOV-NEXT:    cmovbw %cx, %ax
298; FAST-X86-CMOV-NEXT:    movzwl %ax, %eax
299; FAST-X86-CMOV-NEXT:    retl
300;
301; GISEL-X86-LABEL: select_cmp_cmov_i16:
302; GISEL-X86:       ## %bb.0:
303; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
304; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
305; GISEL-X86-NEXT:    xorl %edx, %edx
306; GISEL-X86-NEXT:    cmpw %ax, %cx
307; GISEL-X86-NEXT:    setb %dl
308; GISEL-X86-NEXT:    andl $1, %edx
309; GISEL-X86-NEXT:    je LBB2_2
310; GISEL-X86-NEXT:  ## %bb.1:
311; GISEL-X86-NEXT:    movl %ecx, %eax
312; GISEL-X86-NEXT:  LBB2_2:
313; GISEL-X86-NEXT:    ## kill: def $ax killed $ax killed $eax
314; GISEL-X86-NEXT:    retl
315;
316; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i16:
317; GISEL-X86-CMOV:       ## %bb.0:
318; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
319; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
320; GISEL-X86-CMOV-NEXT:    xorl %edx, %edx
321; GISEL-X86-CMOV-NEXT:    cmpw %cx, %ax
322; GISEL-X86-CMOV-NEXT:    setb %dl
323; GISEL-X86-CMOV-NEXT:    andl $1, %edx
324; GISEL-X86-CMOV-NEXT:    cmovew %cx, %ax
325; GISEL-X86-CMOV-NEXT:    ## kill: def $ax killed $ax killed $eax
326; GISEL-X86-CMOV-NEXT:    retl
327;
328; NDD-LABEL: select_cmp_cmov_i16:
329; NDD:       ## %bb.0:
330; NDD-NEXT:    cmpw %si, %di
331; NDD-NEXT:    cmovbw %di, %si, %ax
332; NDD-NEXT:    movzwl %ax, %eax
333; NDD-NEXT:    retq
334  %1 = icmp ult i16 %a, %b
335  %2 = select i1 %1, i16 %a, i16 %b
336  ret i16 %2
337}
338
339define i32 @select_cmov_i32(i1 zeroext %cond, i32 %a, i32 %b) {
340; SDAG-X64-LABEL: select_cmov_i32:
341; SDAG-X64:       ## %bb.0:
342; SDAG-X64-NEXT:    movl %esi, %eax
343; SDAG-X64-NEXT:    testl %edi, %edi
344; SDAG-X64-NEXT:    cmovel %edx, %eax
345; SDAG-X64-NEXT:    retq
346;
347; FAST-X64-LABEL: select_cmov_i32:
348; FAST-X64:       ## %bb.0:
349; FAST-X64-NEXT:    movl %esi, %eax
350; FAST-X64-NEXT:    testb $1, %dil
351; FAST-X64-NEXT:    cmovel %edx, %eax
352; FAST-X64-NEXT:    retq
353;
354; GISEL-X64-LABEL: select_cmov_i32:
355; GISEL-X64:       ## %bb.0:
356; GISEL-X64-NEXT:    movl %edx, %eax
357; GISEL-X64-NEXT:    testl %edi, %edi
358; GISEL-X64-NEXT:    cmovnel %esi, %eax
359; GISEL-X64-NEXT:    retq
360;
361; SDAG-X86-LABEL: select_cmov_i32:
362; SDAG-X86:       ## %bb.0:
363; SDAG-X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
364; SDAG-X86-NEXT:    jne LBB3_1
365; SDAG-X86-NEXT:  ## %bb.2:
366; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
367; SDAG-X86-NEXT:    movl (%eax), %eax
368; SDAG-X86-NEXT:    retl
369; SDAG-X86-NEXT:  LBB3_1:
370; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
371; SDAG-X86-NEXT:    movl (%eax), %eax
372; SDAG-X86-NEXT:    retl
373;
374; SDAG-X86-CMOV-LABEL: select_cmov_i32:
375; SDAG-X86-CMOV:       ## %bb.0:
376; SDAG-X86-CMOV-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
377; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax
378; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx
379; SDAG-X86-CMOV-NEXT:    cmovnel %eax, %ecx
380; SDAG-X86-CMOV-NEXT:    movl (%ecx), %eax
381; SDAG-X86-CMOV-NEXT:    retl
382;
383; FAST-X86-LABEL: select_cmov_i32:
384; FAST-X86:       ## %bb.0:
385; FAST-X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
386; FAST-X86-NEXT:    jne LBB3_1
387; FAST-X86-NEXT:  ## %bb.2:
388; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
389; FAST-X86-NEXT:    retl
390; FAST-X86-NEXT:  LBB3_1:
391; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
392; FAST-X86-NEXT:    retl
393;
394; FAST-X86-CMOV-LABEL: select_cmov_i32:
395; FAST-X86-CMOV:       ## %bb.0:
396; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
397; FAST-X86-CMOV-NEXT:    testb $1, {{[0-9]+}}(%esp)
398; FAST-X86-CMOV-NEXT:    cmovel {{[0-9]+}}(%esp), %eax
399; FAST-X86-CMOV-NEXT:    retl
400;
401; GISEL-X86-LABEL: select_cmov_i32:
402; GISEL-X86:       ## %bb.0:
403; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
404; GISEL-X86-NEXT:    testl %eax, %eax
405; GISEL-X86-NEXT:    je LBB3_1
406; GISEL-X86-NEXT:  ## %bb.2:
407; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
408; GISEL-X86-NEXT:    retl
409; GISEL-X86-NEXT:  LBB3_1:
410; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
411; GISEL-X86-NEXT:    retl
412;
413; GISEL-X86-CMOV-LABEL: select_cmov_i32:
414; GISEL-X86-CMOV:       ## %bb.0:
415; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
416; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
417; GISEL-X86-CMOV-NEXT:    testl %ecx, %ecx
418; GISEL-X86-CMOV-NEXT:    cmovnel {{[0-9]+}}(%esp), %eax
419; GISEL-X86-CMOV-NEXT:    retl
420;
421; NDD-LABEL: select_cmov_i32:
422; NDD:       ## %bb.0:
423; NDD-NEXT:    testb $1, %dil
424; NDD-NEXT:    cmovnel %esi, %edx, %eax
425; NDD-NEXT:    retq
426  %1 = select i1 %cond, i32 %a, i32 %b
427  ret i32 %1
428}
429
430define i32 @select_cmp_cmov_i32(i32 %a, i32 %b) {
431; SDAG-X64-LABEL: select_cmp_cmov_i32:
432; SDAG-X64:       ## %bb.0:
433; SDAG-X64-NEXT:    movl %esi, %eax
434; SDAG-X64-NEXT:    cmpl %esi, %edi
435; SDAG-X64-NEXT:    cmovbl %edi, %eax
436; SDAG-X64-NEXT:    retq
437;
438; FAST-X64-LABEL: select_cmp_cmov_i32:
439; FAST-X64:       ## %bb.0:
440; FAST-X64-NEXT:    movl %esi, %eax
441; FAST-X64-NEXT:    cmpl %esi, %edi
442; FAST-X64-NEXT:    cmovbl %edi, %eax
443; FAST-X64-NEXT:    retq
444;
445; GISEL-X64-LABEL: select_cmp_cmov_i32:
446; GISEL-X64:       ## %bb.0:
447; GISEL-X64-NEXT:    movl %edi, %eax
448; GISEL-X64-NEXT:    xorl %ecx, %ecx
449; GISEL-X64-NEXT:    cmpl %esi, %edi
450; GISEL-X64-NEXT:    setb %cl
451; GISEL-X64-NEXT:    andl $1, %ecx
452; GISEL-X64-NEXT:    cmovel %esi, %eax
453; GISEL-X64-NEXT:    retq
454;
455; SDAG-X86-LABEL: select_cmp_cmov_i32:
456; SDAG-X86:       ## %bb.0:
457; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
458; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
459; SDAG-X86-NEXT:    cmpl %ecx, %eax
460; SDAG-X86-NEXT:    jb LBB4_2
461; SDAG-X86-NEXT:  ## %bb.1:
462; SDAG-X86-NEXT:    movl %ecx, %eax
463; SDAG-X86-NEXT:  LBB4_2:
464; SDAG-X86-NEXT:    retl
465;
466; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i32:
467; SDAG-X86-CMOV:       ## %bb.0:
468; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
469; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
470; SDAG-X86-CMOV-NEXT:    cmpl %eax, %ecx
471; SDAG-X86-CMOV-NEXT:    cmovbl %ecx, %eax
472; SDAG-X86-CMOV-NEXT:    retl
473;
474; FAST-X86-LABEL: select_cmp_cmov_i32:
475; FAST-X86:       ## %bb.0:
476; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
477; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
478; FAST-X86-NEXT:    cmpl %ecx, %eax
479; FAST-X86-NEXT:    jb LBB4_2
480; FAST-X86-NEXT:  ## %bb.1:
481; FAST-X86-NEXT:    movl %ecx, %eax
482; FAST-X86-NEXT:  LBB4_2:
483; FAST-X86-NEXT:    retl
484;
485; FAST-X86-CMOV-LABEL: select_cmp_cmov_i32:
486; FAST-X86-CMOV:       ## %bb.0:
487; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
488; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
489; FAST-X86-CMOV-NEXT:    cmpl %eax, %ecx
490; FAST-X86-CMOV-NEXT:    cmovbl %ecx, %eax
491; FAST-X86-CMOV-NEXT:    retl
492;
493; GISEL-X86-LABEL: select_cmp_cmov_i32:
494; GISEL-X86:       ## %bb.0:
495; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
496; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
497; GISEL-X86-NEXT:    xorl %edx, %edx
498; GISEL-X86-NEXT:    cmpl %eax, %ecx
499; GISEL-X86-NEXT:    setb %dl
500; GISEL-X86-NEXT:    andl $1, %edx
501; GISEL-X86-NEXT:    je LBB4_2
502; GISEL-X86-NEXT:  ## %bb.1:
503; GISEL-X86-NEXT:    movl %ecx, %eax
504; GISEL-X86-NEXT:  LBB4_2:
505; GISEL-X86-NEXT:    retl
506;
507; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i32:
508; GISEL-X86-CMOV:       ## %bb.0:
509; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
510; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
511; GISEL-X86-CMOV-NEXT:    xorl %edx, %edx
512; GISEL-X86-CMOV-NEXT:    cmpl %ecx, %eax
513; GISEL-X86-CMOV-NEXT:    setb %dl
514; GISEL-X86-CMOV-NEXT:    andl $1, %edx
515; GISEL-X86-CMOV-NEXT:    cmovel %ecx, %eax
516; GISEL-X86-CMOV-NEXT:    retl
517;
518; NDD-LABEL: select_cmp_cmov_i32:
519; NDD:       ## %bb.0:
520; NDD-NEXT:    cmpl %esi, %edi
521; NDD-NEXT:    cmovbl %edi, %esi, %eax
522; NDD-NEXT:    retq
523  %1 = icmp ult i32 %a, %b
524  %2 = select i1 %1, i32 %a, i32 %b
525  ret i32 %2
526}
527
528define i64 @select_cmov_i64(i1 zeroext %cond, i64 %a, i64 %b) {
529; SDAG-X64-LABEL: select_cmov_i64:
530; SDAG-X64:       ## %bb.0:
531; SDAG-X64-NEXT:    movq %rsi, %rax
532; SDAG-X64-NEXT:    testl %edi, %edi
533; SDAG-X64-NEXT:    cmoveq %rdx, %rax
534; SDAG-X64-NEXT:    retq
535;
536; FAST-X64-LABEL: select_cmov_i64:
537; FAST-X64:       ## %bb.0:
538; FAST-X64-NEXT:    movq %rsi, %rax
539; FAST-X64-NEXT:    testb $1, %dil
540; FAST-X64-NEXT:    cmoveq %rdx, %rax
541; FAST-X64-NEXT:    retq
542;
543; GISEL-X64-LABEL: select_cmov_i64:
544; GISEL-X64:       ## %bb.0:
545; GISEL-X64-NEXT:    movq %rdx, %rax
546; GISEL-X64-NEXT:    testl %edi, %edi
547; GISEL-X64-NEXT:    cmovneq %rsi, %rax
548; GISEL-X64-NEXT:    retq
549;
550; SDAG-X86-LABEL: select_cmov_i64:
551; SDAG-X86:       ## %bb.0:
552; SDAG-X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
553; SDAG-X86-NEXT:    jne LBB5_1
554; SDAG-X86-NEXT:  ## %bb.2:
555; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %ecx
556; SDAG-X86-NEXT:    jmp LBB5_3
557; SDAG-X86-NEXT:  LBB5_1:
558; SDAG-X86-NEXT:    leal {{[0-9]+}}(%esp), %ecx
559; SDAG-X86-NEXT:  LBB5_3:
560; SDAG-X86-NEXT:    movl (%ecx), %eax
561; SDAG-X86-NEXT:    movl 4(%ecx), %edx
562; SDAG-X86-NEXT:    retl
563;
564; SDAG-X86-CMOV-LABEL: select_cmov_i64:
565; SDAG-X86-CMOV:       ## %bb.0:
566; SDAG-X86-CMOV-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
567; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax
568; SDAG-X86-CMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx
569; SDAG-X86-CMOV-NEXT:    cmovnel %eax, %ecx
570; SDAG-X86-CMOV-NEXT:    movl (%ecx), %eax
571; SDAG-X86-CMOV-NEXT:    movl 4(%ecx), %edx
572; SDAG-X86-CMOV-NEXT:    retl
573;
574; FAST-X86-LABEL: select_cmov_i64:
575; FAST-X86:       ## %bb.0:
576; FAST-X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
577; FAST-X86-NEXT:    jne LBB5_1
578; FAST-X86-NEXT:  ## %bb.2:
579; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
580; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
581; FAST-X86-NEXT:    retl
582; FAST-X86-NEXT:  LBB5_1:
583; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
584; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
585; FAST-X86-NEXT:    retl
586;
587; FAST-X86-CMOV-LABEL: select_cmov_i64:
588; FAST-X86-CMOV:       ## %bb.0:
589; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edx
590; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
591; FAST-X86-CMOV-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
592; FAST-X86-CMOV-NEXT:    cmovel {{[0-9]+}}(%esp), %eax
593; FAST-X86-CMOV-NEXT:    cmovel {{[0-9]+}}(%esp), %edx
594; FAST-X86-CMOV-NEXT:    retl
595;
596; GISEL-X86-LABEL: select_cmov_i64:
597; GISEL-X86:       ## %bb.0:
598; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
599; GISEL-X86-NEXT:    testl %ecx, %ecx
600; GISEL-X86-NEXT:    je LBB5_1
601; GISEL-X86-NEXT:  ## %bb.2:
602; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
603; GISEL-X86-NEXT:    testl %ecx, %ecx
604; GISEL-X86-NEXT:    jne LBB5_5
605; GISEL-X86-NEXT:  LBB5_4:
606; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
607; GISEL-X86-NEXT:    retl
608; GISEL-X86-NEXT:  LBB5_1:
609; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
610; GISEL-X86-NEXT:    testl %ecx, %ecx
611; GISEL-X86-NEXT:    je LBB5_4
612; GISEL-X86-NEXT:  LBB5_5:
613; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
614; GISEL-X86-NEXT:    retl
615;
616; GISEL-X86-CMOV-LABEL: select_cmov_i64:
617; GISEL-X86-CMOV:       ## %bb.0:
618; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
619; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
620; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edx
621; GISEL-X86-CMOV-NEXT:    testl %ecx, %ecx
622; GISEL-X86-CMOV-NEXT:    cmovnel {{[0-9]+}}(%esp), %eax
623; GISEL-X86-CMOV-NEXT:    cmovnel {{[0-9]+}}(%esp), %edx
624; GISEL-X86-CMOV-NEXT:    retl
625;
626; NDD-LABEL: select_cmov_i64:
627; NDD:       ## %bb.0:
628; NDD-NEXT:    testb $1, %dil
629; NDD-NEXT:    cmovneq %rsi, %rdx, %rax
630; NDD-NEXT:    retq
631  %1 = select i1 %cond, i64 %a, i64 %b
632  ret i64 %1
633}
634
635define i64 @select_cmp_cmov_i64(i64 %a, i64 %b) nounwind {
636; SDAG-X64-LABEL: select_cmp_cmov_i64:
637; SDAG-X64:       ## %bb.0:
638; SDAG-X64-NEXT:    movq %rsi, %rax
639; SDAG-X64-NEXT:    cmpq %rsi, %rdi
640; SDAG-X64-NEXT:    cmovbq %rdi, %rax
641; SDAG-X64-NEXT:    retq
642;
643; FAST-X64-LABEL: select_cmp_cmov_i64:
644; FAST-X64:       ## %bb.0:
645; FAST-X64-NEXT:    movq %rsi, %rax
646; FAST-X64-NEXT:    cmpq %rsi, %rdi
647; FAST-X64-NEXT:    cmovbq %rdi, %rax
648; FAST-X64-NEXT:    retq
649;
650; GISEL-X64-LABEL: select_cmp_cmov_i64:
651; GISEL-X64:       ## %bb.0:
652; GISEL-X64-NEXT:    movq %rdi, %rax
653; GISEL-X64-NEXT:    xorl %ecx, %ecx
654; GISEL-X64-NEXT:    cmpq %rsi, %rdi
655; GISEL-X64-NEXT:    setb %cl
656; GISEL-X64-NEXT:    andl $1, %ecx
657; GISEL-X64-NEXT:    cmoveq %rsi, %rax
658; GISEL-X64-NEXT:    retq
659;
660; SDAG-X86-LABEL: select_cmp_cmov_i64:
661; SDAG-X86:       ## %bb.0:
662; SDAG-X86-NEXT:    pushl %edi
663; SDAG-X86-NEXT:    pushl %esi
664; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
665; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
666; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
667; SDAG-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
668; SDAG-X86-NEXT:    cmpl %ecx, %eax
669; SDAG-X86-NEXT:    movl %edx, %edi
670; SDAG-X86-NEXT:    sbbl %esi, %edi
671; SDAG-X86-NEXT:    jb LBB6_2
672; SDAG-X86-NEXT:  ## %bb.1:
673; SDAG-X86-NEXT:    movl %ecx, %eax
674; SDAG-X86-NEXT:    movl %esi, %edx
675; SDAG-X86-NEXT:  LBB6_2:
676; SDAG-X86-NEXT:    popl %esi
677; SDAG-X86-NEXT:    popl %edi
678; SDAG-X86-NEXT:    retl
679;
680; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i64:
681; SDAG-X86-CMOV:       ## %bb.0:
682; SDAG-X86-CMOV-NEXT:    pushl %edi
683; SDAG-X86-CMOV-NEXT:    pushl %esi
684; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
685; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edx
686; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
687; SDAG-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %esi
688; SDAG-X86-CMOV-NEXT:    cmpl %eax, %ecx
689; SDAG-X86-CMOV-NEXT:    movl %esi, %edi
690; SDAG-X86-CMOV-NEXT:    sbbl %edx, %edi
691; SDAG-X86-CMOV-NEXT:    cmovbl %ecx, %eax
692; SDAG-X86-CMOV-NEXT:    cmovbl %esi, %edx
693; SDAG-X86-CMOV-NEXT:    popl %esi
694; SDAG-X86-CMOV-NEXT:    popl %edi
695; SDAG-X86-CMOV-NEXT:    retl
696;
697; FAST-X86-LABEL: select_cmp_cmov_i64:
698; FAST-X86:       ## %bb.0:
699; FAST-X86-NEXT:    pushl %edi
700; FAST-X86-NEXT:    pushl %esi
701; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
702; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
703; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
704; FAST-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
705; FAST-X86-NEXT:    cmpl %esi, %eax
706; FAST-X86-NEXT:    movl %edx, %edi
707; FAST-X86-NEXT:    sbbl %ecx, %edi
708; FAST-X86-NEXT:    jb LBB6_2
709; FAST-X86-NEXT:  ## %bb.1:
710; FAST-X86-NEXT:    movl %esi, %eax
711; FAST-X86-NEXT:    movl %ecx, %edx
712; FAST-X86-NEXT:  LBB6_2:
713; FAST-X86-NEXT:    popl %esi
714; FAST-X86-NEXT:    popl %edi
715; FAST-X86-NEXT:    retl
716;
717; FAST-X86-CMOV-LABEL: select_cmp_cmov_i64:
718; FAST-X86-CMOV:       ## %bb.0:
719; FAST-X86-CMOV-NEXT:    pushl %edi
720; FAST-X86-CMOV-NEXT:    pushl %esi
721; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edx
722; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax
723; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ecx
724; FAST-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %esi
725; FAST-X86-CMOV-NEXT:    cmpl %eax, %esi
726; FAST-X86-CMOV-NEXT:    movl %ecx, %edi
727; FAST-X86-CMOV-NEXT:    sbbl %edx, %edi
728; FAST-X86-CMOV-NEXT:    cmovbl %esi, %eax
729; FAST-X86-CMOV-NEXT:    cmovbl %ecx, %edx
730; FAST-X86-CMOV-NEXT:    popl %esi
731; FAST-X86-CMOV-NEXT:    popl %edi
732; FAST-X86-CMOV-NEXT:    retl
733;
734; GISEL-X86-LABEL: select_cmp_cmov_i64:
735; GISEL-X86:       ## %bb.0:
736; GISEL-X86-NEXT:    pushl %ebp
737; GISEL-X86-NEXT:    pushl %ebx
738; GISEL-X86-NEXT:    pushl %edi
739; GISEL-X86-NEXT:    pushl %esi
740; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
741; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
742; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
743; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
744; GISEL-X86-NEXT:    cmpl %eax, %esi
745; GISEL-X86-NEXT:    setb %bl
746; GISEL-X86-NEXT:    xorl %ecx, %ecx
747; GISEL-X86-NEXT:    cmpl %edx, %ebp
748; GISEL-X86-NEXT:    setb %bh
749; GISEL-X86-NEXT:    sete %cl
750; GISEL-X86-NEXT:    testl %ecx, %ecx
751; GISEL-X86-NEXT:    je LBB6_2
752; GISEL-X86-NEXT:  ## %bb.1:
753; GISEL-X86-NEXT:    movb %bl, %bh
754; GISEL-X86-NEXT:  LBB6_2:
755; GISEL-X86-NEXT:    movzbl %bh, %edi
756; GISEL-X86-NEXT:    andl $1, %edi
757; GISEL-X86-NEXT:    je LBB6_4
758; GISEL-X86-NEXT:  ## %bb.3:
759; GISEL-X86-NEXT:    movl %esi, %eax
760; GISEL-X86-NEXT:  LBB6_4:
761; GISEL-X86-NEXT:    testl %edi, %edi
762; GISEL-X86-NEXT:    je LBB6_6
763; GISEL-X86-NEXT:  ## %bb.5:
764; GISEL-X86-NEXT:    movl %ebp, %edx
765; GISEL-X86-NEXT:  LBB6_6:
766; GISEL-X86-NEXT:    popl %esi
767; GISEL-X86-NEXT:    popl %edi
768; GISEL-X86-NEXT:    popl %ebx
769; GISEL-X86-NEXT:    popl %ebp
770; GISEL-X86-NEXT:    retl
771;
772; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i64:
773; GISEL-X86-CMOV:       ## %bb.0:
774; GISEL-X86-CMOV-NEXT:    pushl %ebp
775; GISEL-X86-CMOV-NEXT:    pushl %ebx
776; GISEL-X86-CMOV-NEXT:    pushl %edi
777; GISEL-X86-CMOV-NEXT:    pushl %esi
778; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %ebp
779; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edx
780; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %esi
781; GISEL-X86-CMOV-NEXT:    movl {{[0-9]+}}(%esp), %edi
782; GISEL-X86-CMOV-NEXT:    xorl %ecx, %ecx
783; GISEL-X86-CMOV-NEXT:    cmpl %esi, %ebp
784; GISEL-X86-CMOV-NEXT:    setb %cl
785; GISEL-X86-CMOV-NEXT:    xorl %ebx, %ebx
786; GISEL-X86-CMOV-NEXT:    xorl %eax, %eax
787; GISEL-X86-CMOV-NEXT:    cmpl %edi, %edx
788; GISEL-X86-CMOV-NEXT:    setb %bl
789; GISEL-X86-CMOV-NEXT:    sete %al
790; GISEL-X86-CMOV-NEXT:    testl %eax, %eax
791; GISEL-X86-CMOV-NEXT:    cmovnew %cx, %bx
792; GISEL-X86-CMOV-NEXT:    andl $1, %ebx
793; GISEL-X86-CMOV-NEXT:    cmovel %esi, %ebp
794; GISEL-X86-CMOV-NEXT:    cmovel %edi, %edx
795; GISEL-X86-CMOV-NEXT:    movl %ebp, %eax
796; GISEL-X86-CMOV-NEXT:    popl %esi
797; GISEL-X86-CMOV-NEXT:    popl %edi
798; GISEL-X86-CMOV-NEXT:    popl %ebx
799; GISEL-X86-CMOV-NEXT:    popl %ebp
800; GISEL-X86-CMOV-NEXT:    retl
801;
802; NDD-LABEL: select_cmp_cmov_i64:
803; NDD:       ## %bb.0:
804; NDD-NEXT:    cmpq %rsi, %rdi
805; NDD-NEXT:    cmovbq %rdi, %rsi, %rax
806; NDD-NEXT:    retq
807  %1 = icmp ult i64 %a, %b
808  %2 = select i1 %1, i64 %a, i64 %b
809  ret i64 %2
810}
811
812