1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s
3
4define <8 x i32> @cmp00(<8 x float> %a, <8 x float> %b) nounwind {
5; CHECK-LABEL: cmp00:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    vcmpltps %ymm1, %ymm0, %ymm0
8; CHECK-NEXT:    retq
9  %bincmp = fcmp olt <8 x float> %a, %b
10  %s = sext <8 x i1> %bincmp to <8 x i32>
11  ret <8 x i32> %s
12}
13
14define <4 x i64> @cmp01(<4 x double> %a, <4 x double> %b) nounwind {
15; CHECK-LABEL: cmp01:
16; CHECK:       # %bb.0:
17; CHECK-NEXT:    vcmpltpd %ymm1, %ymm0, %ymm0
18; CHECK-NEXT:    retq
19  %bincmp = fcmp olt <4 x double> %a, %b
20  %s = sext <4 x i1> %bincmp to <4 x i64>
21  ret <4 x i64> %s
22}
23
24declare void @scale() nounwind
25
26define void @render(double %a0) nounwind {
27; CHECK-LABEL: render:
28; CHECK:       # %bb.0: # %entry
29; CHECK-NEXT:    pushq %rbp
30; CHECK-NEXT:    pushq %rbx
31; CHECK-NEXT:    pushq %rax
32; CHECK-NEXT:    vmovsd %xmm0, (%rsp) # 8-byte Spill
33; CHECK-NEXT:    xorl %eax, %eax
34; CHECK-NEXT:    testb %al, %al
35; CHECK-NEXT:    jne .LBB2_6
36; CHECK-NEXT:  # %bb.1: # %for.cond5.preheader
37; CHECK-NEXT:    xorl %ebx, %ebx
38; CHECK-NEXT:    movb $1, %bpl
39; CHECK-NEXT:    .p2align 4, 0x90
40; CHECK-NEXT:  .LBB2_2: # %for.cond5
41; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
42; CHECK-NEXT:    testb %bl, %bl
43; CHECK-NEXT:    jne .LBB2_2
44; CHECK-NEXT:  # %bb.3: # %for.cond5
45; CHECK-NEXT:    # in Loop: Header=BB2_2 Depth=1
46; CHECK-NEXT:    testb %bpl, %bpl
47; CHECK-NEXT:    jne .LBB2_2
48; CHECK-NEXT:  # %bb.4: # %for.body33.preheader
49; CHECK-NEXT:    # in Loop: Header=BB2_2 Depth=1
50; CHECK-NEXT:    vmovsd (%rsp), %xmm0 # 8-byte Reload
51; CHECK-NEXT:    # xmm0 = mem[0],zero
52; CHECK-NEXT:    vucomisd {{\.LCPI.*}}, %xmm0
53; CHECK-NEXT:    jne .LBB2_5
54; CHECK-NEXT:    jnp .LBB2_2
55; CHECK-NEXT:  .LBB2_5: # %if.then
56; CHECK-NEXT:    # in Loop: Header=BB2_2 Depth=1
57; CHECK-NEXT:    callq scale
58; CHECK-NEXT:    jmp .LBB2_2
59; CHECK-NEXT:  .LBB2_6: # %for.end52
60; CHECK-NEXT:    addq $8, %rsp
61; CHECK-NEXT:    popq %rbx
62; CHECK-NEXT:    popq %rbp
63; CHECK-NEXT:    retq
64entry:
65  br i1 undef, label %for.cond5, label %for.end52
66
67for.cond5:
68  %or.cond = and i1 undef, false
69  br i1 %or.cond, label %for.body33, label %for.cond5
70
71for.cond30:
72  br i1 false, label %for.body33, label %for.cond5
73
74for.body33:
75  %tobool = fcmp une double %a0, 0.000000e+00
76  br i1 %tobool, label %if.then, label %for.cond30
77
78if.then:
79  call void @scale()
80  br label %for.cond30
81
82for.end52:
83  ret void
84}
85
86define <8 x i32> @int256_cmp(<8 x i32> %i, <8 x i32> %j) nounwind {
87; CHECK-LABEL: int256_cmp:
88; CHECK:       # %bb.0:
89; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm2
90; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm3
91; CHECK-NEXT:    vpcmpgtd %xmm2, %xmm3, %xmm2
92; CHECK-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
93; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
94; CHECK-NEXT:    retq
95  %bincmp = icmp slt <8 x i32> %i, %j
96  %x = sext <8 x i1> %bincmp to <8 x i32>
97  ret <8 x i32> %x
98}
99
100define <4 x i64> @v4i64_cmp(<4 x i64> %i, <4 x i64> %j) nounwind {
101; CHECK-LABEL: v4i64_cmp:
102; CHECK:       # %bb.0:
103; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm2
104; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm3
105; CHECK-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
106; CHECK-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
107; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
108; CHECK-NEXT:    retq
109  %bincmp = icmp slt <4 x i64> %i, %j
110  %x = sext <4 x i1> %bincmp to <4 x i64>
111  ret <4 x i64> %x
112}
113
114define <16 x i16> @v16i16_cmp(<16 x i16> %i, <16 x i16> %j) nounwind {
115; CHECK-LABEL: v16i16_cmp:
116; CHECK:       # %bb.0:
117; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm2
118; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm3
119; CHECK-NEXT:    vpcmpgtw %xmm2, %xmm3, %xmm2
120; CHECK-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
121; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
122; CHECK-NEXT:    retq
123  %bincmp = icmp slt <16 x i16> %i, %j
124  %x = sext <16 x i1> %bincmp to <16 x i16>
125  ret <16 x i16> %x
126}
127
128define <32 x i8> @v32i8_cmp(<32 x i8> %i, <32 x i8> %j) nounwind {
129; CHECK-LABEL: v32i8_cmp:
130; CHECK:       # %bb.0:
131; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm2
132; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm3
133; CHECK-NEXT:    vpcmpgtb %xmm2, %xmm3, %xmm2
134; CHECK-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
135; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
136; CHECK-NEXT:    retq
137  %bincmp = icmp slt <32 x i8> %i, %j
138  %x = sext <32 x i1> %bincmp to <32 x i8>
139  ret <32 x i8> %x
140}
141
142define <8 x i32> @int256_cmpeq(<8 x i32> %i, <8 x i32> %j) nounwind {
143; CHECK-LABEL: int256_cmpeq:
144; CHECK:       # %bb.0:
145; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm2
146; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm3
147; CHECK-NEXT:    vpcmpeqd %xmm2, %xmm3, %xmm2
148; CHECK-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
149; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
150; CHECK-NEXT:    retq
151  %bincmp = icmp eq <8 x i32> %i, %j
152  %x = sext <8 x i1> %bincmp to <8 x i32>
153  ret <8 x i32> %x
154}
155
156define <4 x i64> @v4i64_cmpeq(<4 x i64> %i, <4 x i64> %j) nounwind {
157; CHECK-LABEL: v4i64_cmpeq:
158; CHECK:       # %bb.0:
159; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm2
160; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm3
161; CHECK-NEXT:    vpcmpeqq %xmm2, %xmm3, %xmm2
162; CHECK-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
163; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
164; CHECK-NEXT:    retq
165  %bincmp = icmp eq <4 x i64> %i, %j
166  %x = sext <4 x i1> %bincmp to <4 x i64>
167  ret <4 x i64> %x
168}
169
170define <16 x i16> @v16i16_cmpeq(<16 x i16> %i, <16 x i16> %j) nounwind {
171; CHECK-LABEL: v16i16_cmpeq:
172; CHECK:       # %bb.0:
173; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm2
174; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm3
175; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm3, %xmm2
176; CHECK-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
177; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
178; CHECK-NEXT:    retq
179  %bincmp = icmp eq <16 x i16> %i, %j
180  %x = sext <16 x i1> %bincmp to <16 x i16>
181  ret <16 x i16> %x
182}
183
184define <32 x i8> @v32i8_cmpeq(<32 x i8> %i, <32 x i8> %j) nounwind {
185; CHECK-LABEL: v32i8_cmpeq:
186; CHECK:       # %bb.0:
187; CHECK-NEXT:    vextractf128 $1, %ymm1, %xmm2
188; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm3
189; CHECK-NEXT:    vpcmpeqb %xmm2, %xmm3, %xmm2
190; CHECK-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
191; CHECK-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
192; CHECK-NEXT:    retq
193  %bincmp = icmp eq <32 x i8> %i, %j
194  %x = sext <32 x i1> %bincmp to <32 x i8>
195  ret <32 x i8> %x
196}
197
198;; Scalar comparison
199
200define i32 @scalarcmpA(double %a0) uwtable ssp {
201; CHECK-LABEL: scalarcmpA:
202; CHECK:       # %bb.0:
203; CHECK-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
204; CHECK-NEXT:    vcmpeqsd %xmm1, %xmm0, %xmm0
205; CHECK-NEXT:    vmovq %xmm0, %rax
206; CHECK-NEXT:    andl $1, %eax
207; CHECK-NEXT:    # kill: def $eax killed $eax killed $rax
208; CHECK-NEXT:    retq
209  %cmp29 = fcmp oeq double %a0, 0.000000e+00
210  %res = zext i1 %cmp29 to i32
211  ret i32 %res
212}
213
214define i32 @scalarcmpB(float %a0) uwtable ssp {
215; CHECK-LABEL: scalarcmpB:
216; CHECK:       # %bb.0:
217; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
218; CHECK-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0
219; CHECK-NEXT:    vmovd %xmm0, %eax
220; CHECK-NEXT:    andl $1, %eax
221; CHECK-NEXT:    retq
222  %cmp29 = fcmp oeq float %a0, 0.000000e+00
223  %res = zext i1 %cmp29 to i32
224  ret i32 %res
225}
226
227