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