xref: /llvm-project/llvm/test/CodeGen/X86/setcc-wide-types.ll (revision a21abc782a8e1cb718a10c471a3b634f3102fc1c)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2     | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1   | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx      | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2     | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX2
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f  | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512BW
8
9; Equality checks of 128/256-bit values can use PMOVMSK or PTEST to avoid scalarization.
10
11define i32 @ne_i128(<2 x i64> %x, <2 x i64> %y) {
12; SSE2-LABEL: ne_i128:
13; SSE2:       # %bb.0:
14; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
15; SSE2-NEXT:    pmovmskb %xmm0, %ecx
16; SSE2-NEXT:    xorl %eax, %eax
17; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
18; SSE2-NEXT:    setne %al
19; SSE2-NEXT:    retq
20;
21; SSE41-LABEL: ne_i128:
22; SSE41:       # %bb.0:
23; SSE41-NEXT:    pxor %xmm1, %xmm0
24; SSE41-NEXT:    xorl %eax, %eax
25; SSE41-NEXT:    ptest %xmm0, %xmm0
26; SSE41-NEXT:    setne %al
27; SSE41-NEXT:    retq
28;
29; AVXANY-LABEL: ne_i128:
30; AVXANY:       # %bb.0:
31; AVXANY-NEXT:    vpxor %xmm1, %xmm0, %xmm0
32; AVXANY-NEXT:    xorl %eax, %eax
33; AVXANY-NEXT:    vptest %xmm0, %xmm0
34; AVXANY-NEXT:    setne %al
35; AVXANY-NEXT:    retq
36  %bcx = bitcast <2 x i64> %x to i128
37  %bcy = bitcast <2 x i64> %y to i128
38  %cmp = icmp ne i128 %bcx, %bcy
39  %zext = zext i1 %cmp to i32
40  ret i32 %zext
41}
42
43define i32 @eq_i128(<2 x i64> %x, <2 x i64> %y) {
44; SSE2-LABEL: eq_i128:
45; SSE2:       # %bb.0:
46; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
47; SSE2-NEXT:    pmovmskb %xmm0, %ecx
48; SSE2-NEXT:    xorl %eax, %eax
49; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
50; SSE2-NEXT:    sete %al
51; SSE2-NEXT:    retq
52;
53; SSE41-LABEL: eq_i128:
54; SSE41:       # %bb.0:
55; SSE41-NEXT:    pxor %xmm1, %xmm0
56; SSE41-NEXT:    xorl %eax, %eax
57; SSE41-NEXT:    ptest %xmm0, %xmm0
58; SSE41-NEXT:    sete %al
59; SSE41-NEXT:    retq
60;
61; AVXANY-LABEL: eq_i128:
62; AVXANY:       # %bb.0:
63; AVXANY-NEXT:    vpxor %xmm1, %xmm0, %xmm0
64; AVXANY-NEXT:    xorl %eax, %eax
65; AVXANY-NEXT:    vptest %xmm0, %xmm0
66; AVXANY-NEXT:    sete %al
67; AVXANY-NEXT:    retq
68  %bcx = bitcast <2 x i64> %x to i128
69  %bcy = bitcast <2 x i64> %y to i128
70  %cmp = icmp eq i128 %bcx, %bcy
71  %zext = zext i1 %cmp to i32
72  ret i32 %zext
73}
74
75define i32 @ne_i256(<4 x i64> %x, <4 x i64> %y) {
76; SSE2-LABEL: ne_i256:
77; SSE2:       # %bb.0:
78; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]
79; SSE2-NEXT:    movq %xmm4, %rax
80; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]
81; SSE2-NEXT:    movq %xmm4, %rcx
82; SSE2-NEXT:    movq %xmm0, %rdx
83; SSE2-NEXT:    movq %xmm1, %rsi
84; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
85; SSE2-NEXT:    movq %xmm0, %rdi
86; SSE2-NEXT:    xorq %rax, %rdi
87; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
88; SSE2-NEXT:    movq %xmm0, %r8
89; SSE2-NEXT:    xorq %rcx, %r8
90; SSE2-NEXT:    orq %rdi, %r8
91; SSE2-NEXT:    movq %xmm2, %rax
92; SSE2-NEXT:    xorq %rdx, %rax
93; SSE2-NEXT:    movq %xmm3, %rcx
94; SSE2-NEXT:    xorq %rsi, %rcx
95; SSE2-NEXT:    orq %rax, %rcx
96; SSE2-NEXT:    xorl %eax, %eax
97; SSE2-NEXT:    orq %r8, %rcx
98; SSE2-NEXT:    setne %al
99; SSE2-NEXT:    retq
100;
101; SSE41-LABEL: ne_i256:
102; SSE41:       # %bb.0:
103; SSE41-NEXT:    movq %xmm0, %rax
104; SSE41-NEXT:    movq %xmm1, %rcx
105; SSE41-NEXT:    pextrq $1, %xmm0, %rdx
106; SSE41-NEXT:    pextrq $1, %xmm1, %rsi
107; SSE41-NEXT:    movq %xmm2, %rdi
108; SSE41-NEXT:    xorq %rax, %rdi
109; SSE41-NEXT:    movq %xmm3, %r8
110; SSE41-NEXT:    xorq %rcx, %r8
111; SSE41-NEXT:    orq %rdi, %r8
112; SSE41-NEXT:    pextrq $1, %xmm2, %rax
113; SSE41-NEXT:    xorq %rdx, %rax
114; SSE41-NEXT:    pextrq $1, %xmm3, %rcx
115; SSE41-NEXT:    xorq %rsi, %rcx
116; SSE41-NEXT:    orq %rax, %rcx
117; SSE41-NEXT:    xorl %eax, %eax
118; SSE41-NEXT:    orq %r8, %rcx
119; SSE41-NEXT:    setne %al
120; SSE41-NEXT:    retq
121;
122; AVX1-LABEL: ne_i256:
123; AVX1:       # %bb.0:
124; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
125; AVX1-NEXT:    xorl %eax, %eax
126; AVX1-NEXT:    vptest %ymm0, %ymm0
127; AVX1-NEXT:    setne %al
128; AVX1-NEXT:    vzeroupper
129; AVX1-NEXT:    retq
130;
131; AVX2-LABEL: ne_i256:
132; AVX2:       # %bb.0:
133; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
134; AVX2-NEXT:    xorl %eax, %eax
135; AVX2-NEXT:    vptest %ymm0, %ymm0
136; AVX2-NEXT:    setne %al
137; AVX2-NEXT:    vzeroupper
138; AVX2-NEXT:    retq
139;
140; AVX512-LABEL: ne_i256:
141; AVX512:       # %bb.0:
142; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
143; AVX512-NEXT:    xorl %eax, %eax
144; AVX512-NEXT:    vptest %ymm0, %ymm0
145; AVX512-NEXT:    setne %al
146; AVX512-NEXT:    vzeroupper
147; AVX512-NEXT:    retq
148  %bcx = bitcast <4 x i64> %x to i256
149  %bcy = bitcast <4 x i64> %y to i256
150  %cmp = icmp ne i256 %bcx, %bcy
151  %zext = zext i1 %cmp to i32
152  ret i32 %zext
153}
154
155define i32 @eq_i256(<4 x i64> %x, <4 x i64> %y) {
156; SSE2-LABEL: eq_i256:
157; SSE2:       # %bb.0:
158; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]
159; SSE2-NEXT:    movq %xmm4, %rax
160; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]
161; SSE2-NEXT:    movq %xmm4, %rcx
162; SSE2-NEXT:    movq %xmm0, %rdx
163; SSE2-NEXT:    movq %xmm1, %rsi
164; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
165; SSE2-NEXT:    movq %xmm0, %rdi
166; SSE2-NEXT:    xorq %rax, %rdi
167; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
168; SSE2-NEXT:    movq %xmm0, %r8
169; SSE2-NEXT:    xorq %rcx, %r8
170; SSE2-NEXT:    orq %rdi, %r8
171; SSE2-NEXT:    movq %xmm2, %rax
172; SSE2-NEXT:    xorq %rdx, %rax
173; SSE2-NEXT:    movq %xmm3, %rcx
174; SSE2-NEXT:    xorq %rsi, %rcx
175; SSE2-NEXT:    orq %rax, %rcx
176; SSE2-NEXT:    xorl %eax, %eax
177; SSE2-NEXT:    orq %r8, %rcx
178; SSE2-NEXT:    sete %al
179; SSE2-NEXT:    retq
180;
181; SSE41-LABEL: eq_i256:
182; SSE41:       # %bb.0:
183; SSE41-NEXT:    movq %xmm0, %rax
184; SSE41-NEXT:    movq %xmm1, %rcx
185; SSE41-NEXT:    pextrq $1, %xmm0, %rdx
186; SSE41-NEXT:    pextrq $1, %xmm1, %rsi
187; SSE41-NEXT:    movq %xmm2, %rdi
188; SSE41-NEXT:    xorq %rax, %rdi
189; SSE41-NEXT:    movq %xmm3, %r8
190; SSE41-NEXT:    xorq %rcx, %r8
191; SSE41-NEXT:    orq %rdi, %r8
192; SSE41-NEXT:    pextrq $1, %xmm2, %rax
193; SSE41-NEXT:    xorq %rdx, %rax
194; SSE41-NEXT:    pextrq $1, %xmm3, %rcx
195; SSE41-NEXT:    xorq %rsi, %rcx
196; SSE41-NEXT:    orq %rax, %rcx
197; SSE41-NEXT:    xorl %eax, %eax
198; SSE41-NEXT:    orq %r8, %rcx
199; SSE41-NEXT:    sete %al
200; SSE41-NEXT:    retq
201;
202; AVX1-LABEL: eq_i256:
203; AVX1:       # %bb.0:
204; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
205; AVX1-NEXT:    xorl %eax, %eax
206; AVX1-NEXT:    vptest %ymm0, %ymm0
207; AVX1-NEXT:    sete %al
208; AVX1-NEXT:    vzeroupper
209; AVX1-NEXT:    retq
210;
211; AVX2-LABEL: eq_i256:
212; AVX2:       # %bb.0:
213; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
214; AVX2-NEXT:    xorl %eax, %eax
215; AVX2-NEXT:    vptest %ymm0, %ymm0
216; AVX2-NEXT:    sete %al
217; AVX2-NEXT:    vzeroupper
218; AVX2-NEXT:    retq
219;
220; AVX512-LABEL: eq_i256:
221; AVX512:       # %bb.0:
222; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
223; AVX512-NEXT:    xorl %eax, %eax
224; AVX512-NEXT:    vptest %ymm0, %ymm0
225; AVX512-NEXT:    sete %al
226; AVX512-NEXT:    vzeroupper
227; AVX512-NEXT:    retq
228  %bcx = bitcast <4 x i64> %x to i256
229  %bcy = bitcast <4 x i64> %y to i256
230  %cmp = icmp eq i256 %bcx, %bcy
231  %zext = zext i1 %cmp to i32
232  ret i32 %zext
233}
234
235define i32 @ne_i512(<8 x i64> %x, <8 x i64> %y) {
236; SSE2-LABEL: ne_i512:
237; SSE2:       # %bb.0:
238; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
239; SSE2-NEXT:    movq %xmm8, %rdx
240; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[2,3,2,3]
241; SSE2-NEXT:    movq %xmm8, %rsi
242; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[2,3,2,3]
243; SSE2-NEXT:    movq %xmm8, %rdi
244; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[2,3,2,3]
245; SSE2-NEXT:    movq %xmm8, %r8
246; SSE2-NEXT:    movq %xmm0, %r9
247; SSE2-NEXT:    movq %xmm2, %r10
248; SSE2-NEXT:    movq %xmm1, %rcx
249; SSE2-NEXT:    movq %xmm3, %rax
250; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
251; SSE2-NEXT:    movq %xmm0, %r11
252; SSE2-NEXT:    xorq %rdx, %r11
253; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3]
254; SSE2-NEXT:    movq %xmm0, %rdx
255; SSE2-NEXT:    xorq %rsi, %rdx
256; SSE2-NEXT:    orq %r11, %rdx
257; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3]
258; SSE2-NEXT:    movq %xmm0, %rsi
259; SSE2-NEXT:    xorq %rdi, %rsi
260; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3]
261; SSE2-NEXT:    movq %xmm0, %rdi
262; SSE2-NEXT:    xorq %r8, %rdi
263; SSE2-NEXT:    orq %rsi, %rdi
264; SSE2-NEXT:    orq %rdx, %rdi
265; SSE2-NEXT:    movq %xmm4, %rdx
266; SSE2-NEXT:    xorq %r9, %rdx
267; SSE2-NEXT:    movq %xmm6, %rsi
268; SSE2-NEXT:    xorq %r10, %rsi
269; SSE2-NEXT:    orq %rdx, %rsi
270; SSE2-NEXT:    movq %xmm5, %rdx
271; SSE2-NEXT:    xorq %rcx, %rdx
272; SSE2-NEXT:    movq %xmm7, %rcx
273; SSE2-NEXT:    xorq %rax, %rcx
274; SSE2-NEXT:    orq %rdx, %rcx
275; SSE2-NEXT:    orq %rsi, %rcx
276; SSE2-NEXT:    xorl %eax, %eax
277; SSE2-NEXT:    orq %rdi, %rcx
278; SSE2-NEXT:    setne %al
279; SSE2-NEXT:    retq
280;
281; SSE41-LABEL: ne_i512:
282; SSE41:       # %bb.0:
283; SSE41-NEXT:    movq %xmm0, %rcx
284; SSE41-NEXT:    movq %xmm2, %rdx
285; SSE41-NEXT:    movq %xmm1, %rsi
286; SSE41-NEXT:    movq %xmm3, %rdi
287; SSE41-NEXT:    pextrq $1, %xmm0, %r8
288; SSE41-NEXT:    pextrq $1, %xmm2, %r9
289; SSE41-NEXT:    pextrq $1, %xmm1, %r10
290; SSE41-NEXT:    pextrq $1, %xmm3, %rax
291; SSE41-NEXT:    movq %xmm4, %r11
292; SSE41-NEXT:    xorq %rcx, %r11
293; SSE41-NEXT:    movq %xmm6, %rcx
294; SSE41-NEXT:    xorq %rdx, %rcx
295; SSE41-NEXT:    orq %r11, %rcx
296; SSE41-NEXT:    movq %xmm5, %rdx
297; SSE41-NEXT:    xorq %rsi, %rdx
298; SSE41-NEXT:    movq %xmm7, %rsi
299; SSE41-NEXT:    xorq %rdi, %rsi
300; SSE41-NEXT:    orq %rdx, %rsi
301; SSE41-NEXT:    orq %rcx, %rsi
302; SSE41-NEXT:    pextrq $1, %xmm4, %rcx
303; SSE41-NEXT:    xorq %r8, %rcx
304; SSE41-NEXT:    pextrq $1, %xmm6, %rdx
305; SSE41-NEXT:    xorq %r9, %rdx
306; SSE41-NEXT:    orq %rcx, %rdx
307; SSE41-NEXT:    pextrq $1, %xmm5, %rcx
308; SSE41-NEXT:    xorq %r10, %rcx
309; SSE41-NEXT:    pextrq $1, %xmm7, %rdi
310; SSE41-NEXT:    xorq %rax, %rdi
311; SSE41-NEXT:    orq %rcx, %rdi
312; SSE41-NEXT:    orq %rdx, %rdi
313; SSE41-NEXT:    xorl %eax, %eax
314; SSE41-NEXT:    orq %rsi, %rdi
315; SSE41-NEXT:    setne %al
316; SSE41-NEXT:    retq
317;
318; AVX1-LABEL: ne_i512:
319; AVX1:       # %bb.0:
320; AVX1-NEXT:    vmovq %xmm0, %rdx
321; AVX1-NEXT:    vmovq %xmm1, %rsi
322; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
323; AVX1-NEXT:    vmovq %xmm4, %rdi
324; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
325; AVX1-NEXT:    vmovq %xmm5, %r8
326; AVX1-NEXT:    vpextrq $1, %xmm0, %r9
327; AVX1-NEXT:    vpextrq $1, %xmm1, %r10
328; AVX1-NEXT:    vpextrq $1, %xmm4, %rcx
329; AVX1-NEXT:    vpextrq $1, %xmm5, %rax
330; AVX1-NEXT:    vmovq %xmm2, %r11
331; AVX1-NEXT:    xorq %rdx, %r11
332; AVX1-NEXT:    vmovq %xmm3, %rdx
333; AVX1-NEXT:    xorq %rsi, %rdx
334; AVX1-NEXT:    orq %r11, %rdx
335; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm0
336; AVX1-NEXT:    vmovq %xmm0, %rsi
337; AVX1-NEXT:    xorq %rdi, %rsi
338; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm1
339; AVX1-NEXT:    vmovq %xmm1, %rdi
340; AVX1-NEXT:    xorq %r8, %rdi
341; AVX1-NEXT:    orq %rsi, %rdi
342; AVX1-NEXT:    orq %rdx, %rdi
343; AVX1-NEXT:    vpextrq $1, %xmm2, %rdx
344; AVX1-NEXT:    xorq %r9, %rdx
345; AVX1-NEXT:    vpextrq $1, %xmm3, %rsi
346; AVX1-NEXT:    xorq %r10, %rsi
347; AVX1-NEXT:    orq %rdx, %rsi
348; AVX1-NEXT:    vpextrq $1, %xmm0, %rdx
349; AVX1-NEXT:    xorq %rcx, %rdx
350; AVX1-NEXT:    vpextrq $1, %xmm1, %rcx
351; AVX1-NEXT:    xorq %rax, %rcx
352; AVX1-NEXT:    orq %rdx, %rcx
353; AVX1-NEXT:    orq %rsi, %rcx
354; AVX1-NEXT:    xorl %eax, %eax
355; AVX1-NEXT:    orq %rdi, %rcx
356; AVX1-NEXT:    setne %al
357; AVX1-NEXT:    vzeroupper
358; AVX1-NEXT:    retq
359;
360; AVX2-LABEL: ne_i512:
361; AVX2:       # %bb.0:
362; AVX2-NEXT:    vmovq %xmm0, %rdx
363; AVX2-NEXT:    vmovq %xmm1, %rsi
364; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
365; AVX2-NEXT:    vmovq %xmm4, %rdi
366; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
367; AVX2-NEXT:    vmovq %xmm5, %r8
368; AVX2-NEXT:    vpextrq $1, %xmm0, %r9
369; AVX2-NEXT:    vpextrq $1, %xmm1, %r10
370; AVX2-NEXT:    vpextrq $1, %xmm4, %rcx
371; AVX2-NEXT:    vpextrq $1, %xmm5, %rax
372; AVX2-NEXT:    vmovq %xmm2, %r11
373; AVX2-NEXT:    xorq %rdx, %r11
374; AVX2-NEXT:    vmovq %xmm3, %rdx
375; AVX2-NEXT:    xorq %rsi, %rdx
376; AVX2-NEXT:    orq %r11, %rdx
377; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm0
378; AVX2-NEXT:    vmovq %xmm0, %rsi
379; AVX2-NEXT:    xorq %rdi, %rsi
380; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm1
381; AVX2-NEXT:    vmovq %xmm1, %rdi
382; AVX2-NEXT:    xorq %r8, %rdi
383; AVX2-NEXT:    orq %rsi, %rdi
384; AVX2-NEXT:    orq %rdx, %rdi
385; AVX2-NEXT:    vpextrq $1, %xmm2, %rdx
386; AVX2-NEXT:    xorq %r9, %rdx
387; AVX2-NEXT:    vpextrq $1, %xmm3, %rsi
388; AVX2-NEXT:    xorq %r10, %rsi
389; AVX2-NEXT:    orq %rdx, %rsi
390; AVX2-NEXT:    vpextrq $1, %xmm0, %rdx
391; AVX2-NEXT:    xorq %rcx, %rdx
392; AVX2-NEXT:    vpextrq $1, %xmm1, %rcx
393; AVX2-NEXT:    xorq %rax, %rcx
394; AVX2-NEXT:    orq %rdx, %rcx
395; AVX2-NEXT:    orq %rsi, %rcx
396; AVX2-NEXT:    xorl %eax, %eax
397; AVX2-NEXT:    orq %rdi, %rcx
398; AVX2-NEXT:    setne %al
399; AVX2-NEXT:    vzeroupper
400; AVX2-NEXT:    retq
401;
402; AVX512-LABEL: ne_i512:
403; AVX512:       # %bb.0:
404; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
405; AVX512-NEXT:    xorl %eax, %eax
406; AVX512-NEXT:    kortestw %k0, %k0
407; AVX512-NEXT:    setne %al
408; AVX512-NEXT:    vzeroupper
409; AVX512-NEXT:    retq
410  %bcx = bitcast <8 x i64> %x to i512
411  %bcy = bitcast <8 x i64> %y to i512
412  %cmp = icmp ne i512 %bcx, %bcy
413  %zext = zext i1 %cmp to i32
414  ret i32 %zext
415}
416
417define i32 @eq_i512(<8 x i64> %x, <8 x i64> %y) {
418; SSE2-LABEL: eq_i512:
419; SSE2:       # %bb.0:
420; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
421; SSE2-NEXT:    movq %xmm8, %rdx
422; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[2,3,2,3]
423; SSE2-NEXT:    movq %xmm8, %rsi
424; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[2,3,2,3]
425; SSE2-NEXT:    movq %xmm8, %rdi
426; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[2,3,2,3]
427; SSE2-NEXT:    movq %xmm8, %r8
428; SSE2-NEXT:    movq %xmm0, %r9
429; SSE2-NEXT:    movq %xmm2, %r10
430; SSE2-NEXT:    movq %xmm1, %rcx
431; SSE2-NEXT:    movq %xmm3, %rax
432; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
433; SSE2-NEXT:    movq %xmm0, %r11
434; SSE2-NEXT:    xorq %rdx, %r11
435; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3]
436; SSE2-NEXT:    movq %xmm0, %rdx
437; SSE2-NEXT:    xorq %rsi, %rdx
438; SSE2-NEXT:    orq %r11, %rdx
439; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3]
440; SSE2-NEXT:    movq %xmm0, %rsi
441; SSE2-NEXT:    xorq %rdi, %rsi
442; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3]
443; SSE2-NEXT:    movq %xmm0, %rdi
444; SSE2-NEXT:    xorq %r8, %rdi
445; SSE2-NEXT:    orq %rsi, %rdi
446; SSE2-NEXT:    orq %rdx, %rdi
447; SSE2-NEXT:    movq %xmm4, %rdx
448; SSE2-NEXT:    xorq %r9, %rdx
449; SSE2-NEXT:    movq %xmm6, %rsi
450; SSE2-NEXT:    xorq %r10, %rsi
451; SSE2-NEXT:    orq %rdx, %rsi
452; SSE2-NEXT:    movq %xmm5, %rdx
453; SSE2-NEXT:    xorq %rcx, %rdx
454; SSE2-NEXT:    movq %xmm7, %rcx
455; SSE2-NEXT:    xorq %rax, %rcx
456; SSE2-NEXT:    orq %rdx, %rcx
457; SSE2-NEXT:    orq %rsi, %rcx
458; SSE2-NEXT:    xorl %eax, %eax
459; SSE2-NEXT:    orq %rdi, %rcx
460; SSE2-NEXT:    sete %al
461; SSE2-NEXT:    retq
462;
463; SSE41-LABEL: eq_i512:
464; SSE41:       # %bb.0:
465; SSE41-NEXT:    movq %xmm0, %rcx
466; SSE41-NEXT:    movq %xmm2, %rdx
467; SSE41-NEXT:    movq %xmm1, %rsi
468; SSE41-NEXT:    movq %xmm3, %rdi
469; SSE41-NEXT:    pextrq $1, %xmm0, %r8
470; SSE41-NEXT:    pextrq $1, %xmm2, %r9
471; SSE41-NEXT:    pextrq $1, %xmm1, %r10
472; SSE41-NEXT:    pextrq $1, %xmm3, %rax
473; SSE41-NEXT:    movq %xmm4, %r11
474; SSE41-NEXT:    xorq %rcx, %r11
475; SSE41-NEXT:    movq %xmm6, %rcx
476; SSE41-NEXT:    xorq %rdx, %rcx
477; SSE41-NEXT:    orq %r11, %rcx
478; SSE41-NEXT:    movq %xmm5, %rdx
479; SSE41-NEXT:    xorq %rsi, %rdx
480; SSE41-NEXT:    movq %xmm7, %rsi
481; SSE41-NEXT:    xorq %rdi, %rsi
482; SSE41-NEXT:    orq %rdx, %rsi
483; SSE41-NEXT:    orq %rcx, %rsi
484; SSE41-NEXT:    pextrq $1, %xmm4, %rcx
485; SSE41-NEXT:    xorq %r8, %rcx
486; SSE41-NEXT:    pextrq $1, %xmm6, %rdx
487; SSE41-NEXT:    xorq %r9, %rdx
488; SSE41-NEXT:    orq %rcx, %rdx
489; SSE41-NEXT:    pextrq $1, %xmm5, %rcx
490; SSE41-NEXT:    xorq %r10, %rcx
491; SSE41-NEXT:    pextrq $1, %xmm7, %rdi
492; SSE41-NEXT:    xorq %rax, %rdi
493; SSE41-NEXT:    orq %rcx, %rdi
494; SSE41-NEXT:    orq %rdx, %rdi
495; SSE41-NEXT:    xorl %eax, %eax
496; SSE41-NEXT:    orq %rsi, %rdi
497; SSE41-NEXT:    sete %al
498; SSE41-NEXT:    retq
499;
500; AVX1-LABEL: eq_i512:
501; AVX1:       # %bb.0:
502; AVX1-NEXT:    vmovq %xmm0, %rdx
503; AVX1-NEXT:    vmovq %xmm1, %rsi
504; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
505; AVX1-NEXT:    vmovq %xmm4, %rdi
506; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
507; AVX1-NEXT:    vmovq %xmm5, %r8
508; AVX1-NEXT:    vpextrq $1, %xmm0, %r9
509; AVX1-NEXT:    vpextrq $1, %xmm1, %r10
510; AVX1-NEXT:    vpextrq $1, %xmm4, %rcx
511; AVX1-NEXT:    vpextrq $1, %xmm5, %rax
512; AVX1-NEXT:    vmovq %xmm2, %r11
513; AVX1-NEXT:    xorq %rdx, %r11
514; AVX1-NEXT:    vmovq %xmm3, %rdx
515; AVX1-NEXT:    xorq %rsi, %rdx
516; AVX1-NEXT:    orq %r11, %rdx
517; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm0
518; AVX1-NEXT:    vmovq %xmm0, %rsi
519; AVX1-NEXT:    xorq %rdi, %rsi
520; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm1
521; AVX1-NEXT:    vmovq %xmm1, %rdi
522; AVX1-NEXT:    xorq %r8, %rdi
523; AVX1-NEXT:    orq %rsi, %rdi
524; AVX1-NEXT:    orq %rdx, %rdi
525; AVX1-NEXT:    vpextrq $1, %xmm2, %rdx
526; AVX1-NEXT:    xorq %r9, %rdx
527; AVX1-NEXT:    vpextrq $1, %xmm3, %rsi
528; AVX1-NEXT:    xorq %r10, %rsi
529; AVX1-NEXT:    orq %rdx, %rsi
530; AVX1-NEXT:    vpextrq $1, %xmm0, %rdx
531; AVX1-NEXT:    xorq %rcx, %rdx
532; AVX1-NEXT:    vpextrq $1, %xmm1, %rcx
533; AVX1-NEXT:    xorq %rax, %rcx
534; AVX1-NEXT:    orq %rdx, %rcx
535; AVX1-NEXT:    orq %rsi, %rcx
536; AVX1-NEXT:    xorl %eax, %eax
537; AVX1-NEXT:    orq %rdi, %rcx
538; AVX1-NEXT:    sete %al
539; AVX1-NEXT:    vzeroupper
540; AVX1-NEXT:    retq
541;
542; AVX2-LABEL: eq_i512:
543; AVX2:       # %bb.0:
544; AVX2-NEXT:    vmovq %xmm0, %rdx
545; AVX2-NEXT:    vmovq %xmm1, %rsi
546; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
547; AVX2-NEXT:    vmovq %xmm4, %rdi
548; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
549; AVX2-NEXT:    vmovq %xmm5, %r8
550; AVX2-NEXT:    vpextrq $1, %xmm0, %r9
551; AVX2-NEXT:    vpextrq $1, %xmm1, %r10
552; AVX2-NEXT:    vpextrq $1, %xmm4, %rcx
553; AVX2-NEXT:    vpextrq $1, %xmm5, %rax
554; AVX2-NEXT:    vmovq %xmm2, %r11
555; AVX2-NEXT:    xorq %rdx, %r11
556; AVX2-NEXT:    vmovq %xmm3, %rdx
557; AVX2-NEXT:    xorq %rsi, %rdx
558; AVX2-NEXT:    orq %r11, %rdx
559; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm0
560; AVX2-NEXT:    vmovq %xmm0, %rsi
561; AVX2-NEXT:    xorq %rdi, %rsi
562; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm1
563; AVX2-NEXT:    vmovq %xmm1, %rdi
564; AVX2-NEXT:    xorq %r8, %rdi
565; AVX2-NEXT:    orq %rsi, %rdi
566; AVX2-NEXT:    orq %rdx, %rdi
567; AVX2-NEXT:    vpextrq $1, %xmm2, %rdx
568; AVX2-NEXT:    xorq %r9, %rdx
569; AVX2-NEXT:    vpextrq $1, %xmm3, %rsi
570; AVX2-NEXT:    xorq %r10, %rsi
571; AVX2-NEXT:    orq %rdx, %rsi
572; AVX2-NEXT:    vpextrq $1, %xmm0, %rdx
573; AVX2-NEXT:    xorq %rcx, %rdx
574; AVX2-NEXT:    vpextrq $1, %xmm1, %rcx
575; AVX2-NEXT:    xorq %rax, %rcx
576; AVX2-NEXT:    orq %rdx, %rcx
577; AVX2-NEXT:    orq %rsi, %rcx
578; AVX2-NEXT:    xorl %eax, %eax
579; AVX2-NEXT:    orq %rdi, %rcx
580; AVX2-NEXT:    sete %al
581; AVX2-NEXT:    vzeroupper
582; AVX2-NEXT:    retq
583;
584; AVX512-LABEL: eq_i512:
585; AVX512:       # %bb.0:
586; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
587; AVX512-NEXT:    xorl %eax, %eax
588; AVX512-NEXT:    kortestw %k0, %k0
589; AVX512-NEXT:    sete %al
590; AVX512-NEXT:    vzeroupper
591; AVX512-NEXT:    retq
592  %bcx = bitcast <8 x i64> %x to i512
593  %bcy = bitcast <8 x i64> %y to i512
594  %cmp = icmp eq i512 %bcx, %bcy
595  %zext = zext i1 %cmp to i32
596  ret i32 %zext
597}
598
599define i1 @ne_v4i256(<4 x i256> %a0) {
600; SSE2-LABEL: ne_v4i256:
601; SSE2:       # %bb.0:
602; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rax
603; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r10
604; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %r10
605; SSE2-NEXT:    movq %r10, %xmm0
606; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %rax
607; SSE2-NEXT:    movq %rax, %xmm1
608; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
609; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %rcx
610; SSE2-NEXT:    movq %rcx, %xmm0
611; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %rdx
612; SSE2-NEXT:    movq %rdx, %xmm2
613; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
614; SSE2-NEXT:    por %xmm1, %xmm2
615; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %r9
616; SSE2-NEXT:    movq %r9, %xmm0
617; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %r8
618; SSE2-NEXT:    movq %r8, %xmm1
619; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
620; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %rsi
621; SSE2-NEXT:    movq %rsi, %xmm0
622; SSE2-NEXT:    orq {{[0-9]+}}(%rsp), %rdi
623; SSE2-NEXT:    movq %rdi, %xmm3
624; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
625; SSE2-NEXT:    por %xmm1, %xmm3
626; SSE2-NEXT:    por %xmm2, %xmm3
627; SSE2-NEXT:    pxor %xmm0, %xmm0
628; SSE2-NEXT:    pcmpeqd %xmm3, %xmm0
629; SSE2-NEXT:    movmskps %xmm0, %eax
630; SSE2-NEXT:    xorl $15, %eax
631; SSE2-NEXT:    sete %al
632; SSE2-NEXT:    retq
633;
634; SSE41-LABEL: ne_v4i256:
635; SSE41:       # %bb.0:
636; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rax
637; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r10
638; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %r10
639; SSE41-NEXT:    movq %r10, %xmm0
640; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %rax
641; SSE41-NEXT:    movq %rax, %xmm1
642; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
643; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %rcx
644; SSE41-NEXT:    movq %rcx, %xmm0
645; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %rdx
646; SSE41-NEXT:    movq %rdx, %xmm2
647; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
648; SSE41-NEXT:    por %xmm1, %xmm2
649; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %r9
650; SSE41-NEXT:    movq %r9, %xmm0
651; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %r8
652; SSE41-NEXT:    movq %r8, %xmm1
653; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
654; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %rsi
655; SSE41-NEXT:    movq %rsi, %xmm0
656; SSE41-NEXT:    orq {{[0-9]+}}(%rsp), %rdi
657; SSE41-NEXT:    movq %rdi, %xmm3
658; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
659; SSE41-NEXT:    por %xmm1, %xmm3
660; SSE41-NEXT:    por %xmm2, %xmm3
661; SSE41-NEXT:    ptest %xmm3, %xmm3
662; SSE41-NEXT:    sete %al
663; SSE41-NEXT:    retq
664;
665; AVX1-LABEL: ne_v4i256:
666; AVX1:       # %bb.0:
667; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %rax
668; AVX1-NEXT:    movq {{[0-9]+}}(%rsp), %r10
669; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %r10
670; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %rcx
671; AVX1-NEXT:    orq %r10, %rcx
672; AVX1-NEXT:    vmovq %rcx, %xmm0
673; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %rax
674; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %rdx
675; AVX1-NEXT:    orq %rax, %rdx
676; AVX1-NEXT:    vmovq %rdx, %xmm1
677; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
678; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %r9
679; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %rsi
680; AVX1-NEXT:    orq %r9, %rsi
681; AVX1-NEXT:    vmovq %rsi, %xmm1
682; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %r8
683; AVX1-NEXT:    orq {{[0-9]+}}(%rsp), %rdi
684; AVX1-NEXT:    orq %r8, %rdi
685; AVX1-NEXT:    vmovq %rdi, %xmm2
686; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
687; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
688; AVX1-NEXT:    vptest %ymm0, %ymm0
689; AVX1-NEXT:    sete %al
690; AVX1-NEXT:    vzeroupper
691; AVX1-NEXT:    retq
692;
693; AVX2-LABEL: ne_v4i256:
694; AVX2:       # %bb.0:
695; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %rax
696; AVX2-NEXT:    movq {{[0-9]+}}(%rsp), %r10
697; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %r10
698; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %rcx
699; AVX2-NEXT:    orq %r10, %rcx
700; AVX2-NEXT:    vmovq %rcx, %xmm0
701; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %rax
702; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %rdx
703; AVX2-NEXT:    orq %rax, %rdx
704; AVX2-NEXT:    vmovq %rdx, %xmm1
705; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
706; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %r9
707; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %rsi
708; AVX2-NEXT:    orq %r9, %rsi
709; AVX2-NEXT:    vmovq %rsi, %xmm1
710; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %r8
711; AVX2-NEXT:    orq {{[0-9]+}}(%rsp), %rdi
712; AVX2-NEXT:    orq %r8, %rdi
713; AVX2-NEXT:    vmovq %rdi, %xmm2
714; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
715; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
716; AVX2-NEXT:    vptest %ymm0, %ymm0
717; AVX2-NEXT:    sete %al
718; AVX2-NEXT:    vzeroupper
719; AVX2-NEXT:    retq
720;
721; AVX512-LABEL: ne_v4i256:
722; AVX512:       # %bb.0:
723; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %rax
724; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %r10
725; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %rax
726; AVX512-NEXT:    vmovd %eax, %xmm0
727; AVX512-NEXT:    shrq $32, %rax
728; AVX512-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
729; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %r10
730; AVX512-NEXT:    vpinsrd $2, %r10d, %xmm0, %xmm0
731; AVX512-NEXT:    shrq $32, %r10
732; AVX512-NEXT:    vpinsrd $3, %r10d, %xmm0, %xmm0
733; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %r8
734; AVX512-NEXT:    vmovd %r8d, %xmm1
735; AVX512-NEXT:    shrq $32, %r8
736; AVX512-NEXT:    vpinsrd $1, %r8d, %xmm1, %xmm1
737; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %r9
738; AVX512-NEXT:    vpinsrd $2, %r9d, %xmm1, %xmm1
739; AVX512-NEXT:    shrq $32, %r9
740; AVX512-NEXT:    vpinsrd $3, %r9d, %xmm1, %xmm1
741; AVX512-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
742; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %rdx
743; AVX512-NEXT:    vmovd %edx, %xmm1
744; AVX512-NEXT:    shrq $32, %rdx
745; AVX512-NEXT:    vpinsrd $1, %edx, %xmm1, %xmm1
746; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %rcx
747; AVX512-NEXT:    vpinsrd $2, %ecx, %xmm1, %xmm1
748; AVX512-NEXT:    shrq $32, %rcx
749; AVX512-NEXT:    vpinsrd $3, %ecx, %xmm1, %xmm1
750; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %rdi
751; AVX512-NEXT:    vmovd %edi, %xmm2
752; AVX512-NEXT:    shrq $32, %rdi
753; AVX512-NEXT:    vpinsrd $1, %edi, %xmm2, %xmm2
754; AVX512-NEXT:    orq {{[0-9]+}}(%rsp), %rsi
755; AVX512-NEXT:    vpinsrd $2, %esi, %xmm2, %xmm2
756; AVX512-NEXT:    shrq $32, %rsi
757; AVX512-NEXT:    vpinsrd $3, %esi, %xmm2, %xmm2
758; AVX512-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
759; AVX512-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
760; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k0
761; AVX512-NEXT:    kortestw %k0, %k0
762; AVX512-NEXT:    sete %al
763; AVX512-NEXT:    vzeroupper
764; AVX512-NEXT:    retq
765  %c = icmp ne <4 x i256> %a0, zeroinitializer
766  %b = bitcast <4 x i1> %c to i4
767  %r = icmp eq i4 %b, 0
768  ret i1 %r
769}
770
771; This test models the expansion of 'memcmp(a, b, 32) != 0'
772; if we allowed 2 pairs of 16-byte loads per block.
773
774define i32 @ne_i128_pair(ptr %a, ptr %b) {
775; SSE2-LABEL: ne_i128_pair:
776; SSE2:       # %bb.0:
777; SSE2-NEXT:    movdqa (%rdi), %xmm0
778; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
779; SSE2-NEXT:    pcmpeqb 16(%rsi), %xmm1
780; SSE2-NEXT:    pcmpeqb (%rsi), %xmm0
781; SSE2-NEXT:    pand %xmm1, %xmm0
782; SSE2-NEXT:    pmovmskb %xmm0, %ecx
783; SSE2-NEXT:    xorl %eax, %eax
784; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
785; SSE2-NEXT:    setne %al
786; SSE2-NEXT:    retq
787;
788; SSE41-LABEL: ne_i128_pair:
789; SSE41:       # %bb.0:
790; SSE41-NEXT:    movdqa (%rdi), %xmm0
791; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
792; SSE41-NEXT:    pxor 16(%rsi), %xmm1
793; SSE41-NEXT:    pxor (%rsi), %xmm0
794; SSE41-NEXT:    por %xmm1, %xmm0
795; SSE41-NEXT:    xorl %eax, %eax
796; SSE41-NEXT:    ptest %xmm0, %xmm0
797; SSE41-NEXT:    setne %al
798; SSE41-NEXT:    retq
799;
800; AVXANY-LABEL: ne_i128_pair:
801; AVXANY:       # %bb.0:
802; AVXANY-NEXT:    vmovdqa (%rdi), %xmm0
803; AVXANY-NEXT:    vmovdqa 16(%rdi), %xmm1
804; AVXANY-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
805; AVXANY-NEXT:    vpxor (%rsi), %xmm0, %xmm0
806; AVXANY-NEXT:    vpor %xmm1, %xmm0, %xmm0
807; AVXANY-NEXT:    xorl %eax, %eax
808; AVXANY-NEXT:    vptest %xmm0, %xmm0
809; AVXANY-NEXT:    setne %al
810; AVXANY-NEXT:    retq
811  %a0 = load i128, ptr %a
812  %b0 = load i128, ptr %b
813  %xor1 = xor i128 %a0, %b0
814  %ap1 = getelementptr i128, ptr %a, i128 1
815  %bp1 = getelementptr i128, ptr %b, i128 1
816  %a1 = load i128, ptr %ap1
817  %b1 = load i128, ptr %bp1
818  %xor2 = xor i128 %a1, %b1
819  %or = or i128 %xor1, %xor2
820  %cmp = icmp ne i128 %or, 0
821  %z = zext i1 %cmp to i32
822  ret i32 %z
823}
824
825; This test models the expansion of 'memcmp(a, b, 32) == 0'
826; if we allowed 2 pairs of 16-byte loads per block.
827
828define i32 @eq_i128_pair(ptr %a, ptr %b) {
829; SSE2-LABEL: eq_i128_pair:
830; SSE2:       # %bb.0:
831; SSE2-NEXT:    movdqa (%rdi), %xmm0
832; SSE2-NEXT:    movdqa 16(%rdi), %xmm1
833; SSE2-NEXT:    pcmpeqb 16(%rsi), %xmm1
834; SSE2-NEXT:    pcmpeqb (%rsi), %xmm0
835; SSE2-NEXT:    pand %xmm1, %xmm0
836; SSE2-NEXT:    pmovmskb %xmm0, %ecx
837; SSE2-NEXT:    xorl %eax, %eax
838; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
839; SSE2-NEXT:    sete %al
840; SSE2-NEXT:    retq
841;
842; SSE41-LABEL: eq_i128_pair:
843; SSE41:       # %bb.0:
844; SSE41-NEXT:    movdqa (%rdi), %xmm0
845; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
846; SSE41-NEXT:    pxor 16(%rsi), %xmm1
847; SSE41-NEXT:    pxor (%rsi), %xmm0
848; SSE41-NEXT:    por %xmm1, %xmm0
849; SSE41-NEXT:    xorl %eax, %eax
850; SSE41-NEXT:    ptest %xmm0, %xmm0
851; SSE41-NEXT:    sete %al
852; SSE41-NEXT:    retq
853;
854; AVXANY-LABEL: eq_i128_pair:
855; AVXANY:       # %bb.0:
856; AVXANY-NEXT:    vmovdqa (%rdi), %xmm0
857; AVXANY-NEXT:    vmovdqa 16(%rdi), %xmm1
858; AVXANY-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
859; AVXANY-NEXT:    vpxor (%rsi), %xmm0, %xmm0
860; AVXANY-NEXT:    vpor %xmm1, %xmm0, %xmm0
861; AVXANY-NEXT:    xorl %eax, %eax
862; AVXANY-NEXT:    vptest %xmm0, %xmm0
863; AVXANY-NEXT:    sete %al
864; AVXANY-NEXT:    retq
865  %a0 = load i128, ptr %a
866  %b0 = load i128, ptr %b
867  %xor1 = xor i128 %a0, %b0
868  %ap1 = getelementptr i128, ptr %a, i128 1
869  %bp1 = getelementptr i128, ptr %b, i128 1
870  %a1 = load i128, ptr %ap1
871  %b1 = load i128, ptr %bp1
872  %xor2 = xor i128 %a1, %b1
873  %or = or i128 %xor1, %xor2
874  %cmp = icmp eq i128 %or, 0
875  %z = zext i1 %cmp to i32
876  ret i32 %z
877}
878
879; This test models the expansion of 'memcmp(a, b, 64) != 0'
880; if we allowed 2 pairs of 32-byte loads per block.
881
882define i32 @ne_i256_pair(ptr %a, ptr %b) {
883; SSE-LABEL: ne_i256_pair:
884; SSE:       # %bb.0:
885; SSE-NEXT:    movq 16(%rdi), %rax
886; SSE-NEXT:    movq 24(%rdi), %rcx
887; SSE-NEXT:    movq (%rdi), %rdx
888; SSE-NEXT:    movq 8(%rdi), %r8
889; SSE-NEXT:    xorq 8(%rsi), %r8
890; SSE-NEXT:    xorq 24(%rsi), %rcx
891; SSE-NEXT:    xorq (%rsi), %rdx
892; SSE-NEXT:    xorq 16(%rsi), %rax
893; SSE-NEXT:    movq 48(%rdi), %r9
894; SSE-NEXT:    movq 32(%rdi), %r10
895; SSE-NEXT:    movq 56(%rdi), %r11
896; SSE-NEXT:    movq 40(%rdi), %rdi
897; SSE-NEXT:    xorq 40(%rsi), %rdi
898; SSE-NEXT:    orq %r8, %rdi
899; SSE-NEXT:    xorq 56(%rsi), %r11
900; SSE-NEXT:    orq %rcx, %r11
901; SSE-NEXT:    orq %rdi, %r11
902; SSE-NEXT:    xorq 32(%rsi), %r10
903; SSE-NEXT:    orq %rdx, %r10
904; SSE-NEXT:    xorq 48(%rsi), %r9
905; SSE-NEXT:    orq %rax, %r9
906; SSE-NEXT:    orq %r10, %r9
907; SSE-NEXT:    xorl %eax, %eax
908; SSE-NEXT:    orq %r11, %r9
909; SSE-NEXT:    setne %al
910; SSE-NEXT:    retq
911;
912; AVX1-LABEL: ne_i256_pair:
913; AVX1:       # %bb.0:
914; AVX1-NEXT:    vmovups (%rdi), %ymm0
915; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
916; AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
917; AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
918; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
919; AVX1-NEXT:    xorl %eax, %eax
920; AVX1-NEXT:    vptest %ymm0, %ymm0
921; AVX1-NEXT:    setne %al
922; AVX1-NEXT:    vzeroupper
923; AVX1-NEXT:    retq
924;
925; AVX2-LABEL: ne_i256_pair:
926; AVX2:       # %bb.0:
927; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
928; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
929; AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
930; AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
931; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
932; AVX2-NEXT:    xorl %eax, %eax
933; AVX2-NEXT:    vptest %ymm0, %ymm0
934; AVX2-NEXT:    setne %al
935; AVX2-NEXT:    vzeroupper
936; AVX2-NEXT:    retq
937;
938; AVX512-LABEL: ne_i256_pair:
939; AVX512:       # %bb.0:
940; AVX512-NEXT:    vmovdqu (%rdi), %ymm0
941; AVX512-NEXT:    vmovdqu 32(%rdi), %ymm1
942; AVX512-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
943; AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
944; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
945; AVX512-NEXT:    xorl %eax, %eax
946; AVX512-NEXT:    vptest %ymm0, %ymm0
947; AVX512-NEXT:    setne %al
948; AVX512-NEXT:    vzeroupper
949; AVX512-NEXT:    retq
950  %a0 = load i256, ptr %a
951  %b0 = load i256, ptr %b
952  %xor1 = xor i256 %a0, %b0
953  %ap1 = getelementptr i256, ptr %a, i256 1
954  %bp1 = getelementptr i256, ptr %b, i256 1
955  %a1 = load i256, ptr %ap1
956  %b1 = load i256, ptr %bp1
957  %xor2 = xor i256 %a1, %b1
958  %or = or i256 %xor1, %xor2
959  %cmp = icmp ne i256 %or, 0
960  %z = zext i1 %cmp to i32
961  ret i32 %z
962}
963
964; This test models the expansion of 'memcmp(a, b, 64) == 0'
965; if we allowed 2 pairs of 32-byte loads per block.
966
967define i32 @eq_i256_pair(ptr %a, ptr %b) {
968; SSE-LABEL: eq_i256_pair:
969; SSE:       # %bb.0:
970; SSE-NEXT:    movq 16(%rdi), %rax
971; SSE-NEXT:    movq 24(%rdi), %rcx
972; SSE-NEXT:    movq (%rdi), %rdx
973; SSE-NEXT:    movq 8(%rdi), %r8
974; SSE-NEXT:    xorq 8(%rsi), %r8
975; SSE-NEXT:    xorq 24(%rsi), %rcx
976; SSE-NEXT:    xorq (%rsi), %rdx
977; SSE-NEXT:    xorq 16(%rsi), %rax
978; SSE-NEXT:    movq 48(%rdi), %r9
979; SSE-NEXT:    movq 32(%rdi), %r10
980; SSE-NEXT:    movq 56(%rdi), %r11
981; SSE-NEXT:    movq 40(%rdi), %rdi
982; SSE-NEXT:    xorq 40(%rsi), %rdi
983; SSE-NEXT:    orq %r8, %rdi
984; SSE-NEXT:    xorq 56(%rsi), %r11
985; SSE-NEXT:    orq %rcx, %r11
986; SSE-NEXT:    orq %rdi, %r11
987; SSE-NEXT:    xorq 32(%rsi), %r10
988; SSE-NEXT:    orq %rdx, %r10
989; SSE-NEXT:    xorq 48(%rsi), %r9
990; SSE-NEXT:    orq %rax, %r9
991; SSE-NEXT:    orq %r10, %r9
992; SSE-NEXT:    xorl %eax, %eax
993; SSE-NEXT:    orq %r11, %r9
994; SSE-NEXT:    sete %al
995; SSE-NEXT:    retq
996;
997; AVX1-LABEL: eq_i256_pair:
998; AVX1:       # %bb.0:
999; AVX1-NEXT:    vmovups (%rdi), %ymm0
1000; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
1001; AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
1002; AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1003; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1004; AVX1-NEXT:    xorl %eax, %eax
1005; AVX1-NEXT:    vptest %ymm0, %ymm0
1006; AVX1-NEXT:    sete %al
1007; AVX1-NEXT:    vzeroupper
1008; AVX1-NEXT:    retq
1009;
1010; AVX2-LABEL: eq_i256_pair:
1011; AVX2:       # %bb.0:
1012; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1013; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
1014; AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
1015; AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1016; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1017; AVX2-NEXT:    xorl %eax, %eax
1018; AVX2-NEXT:    vptest %ymm0, %ymm0
1019; AVX2-NEXT:    sete %al
1020; AVX2-NEXT:    vzeroupper
1021; AVX2-NEXT:    retq
1022;
1023; AVX512-LABEL: eq_i256_pair:
1024; AVX512:       # %bb.0:
1025; AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1026; AVX512-NEXT:    vmovdqu 32(%rdi), %ymm1
1027; AVX512-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
1028; AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1029; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1030; AVX512-NEXT:    xorl %eax, %eax
1031; AVX512-NEXT:    vptest %ymm0, %ymm0
1032; AVX512-NEXT:    sete %al
1033; AVX512-NEXT:    vzeroupper
1034; AVX512-NEXT:    retq
1035  %a0 = load i256, ptr %a
1036  %b0 = load i256, ptr %b
1037  %xor1 = xor i256 %a0, %b0
1038  %ap1 = getelementptr i256, ptr %a, i256 1
1039  %bp1 = getelementptr i256, ptr %b, i256 1
1040  %a1 = load i256, ptr %ap1
1041  %b1 = load i256, ptr %bp1
1042  %xor2 = xor i256 %a1, %b1
1043  %or = or i256 %xor1, %xor2
1044  %cmp = icmp eq i256 %or, 0
1045  %z = zext i1 %cmp to i32
1046  ret i32 %z
1047}
1048
1049; This test models the expansion of 'memcmp(a, b, 64) != 0'
1050; if we allowed 2 pairs of 64-byte loads per block.
1051
1052define i32 @ne_i512_pair(ptr %a, ptr %b) {
1053; NO512-LABEL: ne_i512_pair:
1054; NO512:       # %bb.0:
1055; NO512-NEXT:    movq 40(%rdi), %rax
1056; NO512-NEXT:    movq 56(%rdi), %rcx
1057; NO512-NEXT:    movq 24(%rdi), %rdx
1058; NO512-NEXT:    xorq 24(%rsi), %rdx
1059; NO512-NEXT:    xorq 56(%rsi), %rcx
1060; NO512-NEXT:    movq 88(%rdi), %r8
1061; NO512-NEXT:    xorq 88(%rsi), %r8
1062; NO512-NEXT:    orq %rdx, %r8
1063; NO512-NEXT:    movq 120(%rdi), %rdx
1064; NO512-NEXT:    xorq 120(%rsi), %rdx
1065; NO512-NEXT:    orq %rcx, %rdx
1066; NO512-NEXT:    movq 8(%rdi), %rcx
1067; NO512-NEXT:    xorq 8(%rsi), %rcx
1068; NO512-NEXT:    xorq 40(%rsi), %rax
1069; NO512-NEXT:    orq %r8, %rdx
1070; NO512-NEXT:    movq 72(%rdi), %r8
1071; NO512-NEXT:    xorq 72(%rsi), %r8
1072; NO512-NEXT:    orq %rcx, %r8
1073; NO512-NEXT:    movq 104(%rdi), %rcx
1074; NO512-NEXT:    xorq 104(%rsi), %rcx
1075; NO512-NEXT:    orq %rax, %rcx
1076; NO512-NEXT:    movq 48(%rdi), %rax
1077; NO512-NEXT:    orq %r8, %rcx
1078; NO512-NEXT:    movq 16(%rdi), %r8
1079; NO512-NEXT:    xorq 16(%rsi), %r8
1080; NO512-NEXT:    xorq 48(%rsi), %rax
1081; NO512-NEXT:    orq %rdx, %rcx
1082; NO512-NEXT:    movq 80(%rdi), %rdx
1083; NO512-NEXT:    xorq 80(%rsi), %rdx
1084; NO512-NEXT:    orq %r8, %rdx
1085; NO512-NEXT:    movq 112(%rdi), %r8
1086; NO512-NEXT:    xorq 112(%rsi), %r8
1087; NO512-NEXT:    orq %rax, %r8
1088; NO512-NEXT:    movq (%rdi), %rax
1089; NO512-NEXT:    xorq (%rsi), %rax
1090; NO512-NEXT:    orq %rdx, %r8
1091; NO512-NEXT:    movq 64(%rdi), %rdx
1092; NO512-NEXT:    xorq 64(%rsi), %rdx
1093; NO512-NEXT:    orq %rax, %rdx
1094; NO512-NEXT:    movq 32(%rdi), %rax
1095; NO512-NEXT:    xorq 32(%rsi), %rax
1096; NO512-NEXT:    movq 96(%rdi), %rdi
1097; NO512-NEXT:    xorq 96(%rsi), %rdi
1098; NO512-NEXT:    orq %rax, %rdi
1099; NO512-NEXT:    orq %rdx, %rdi
1100; NO512-NEXT:    orq %r8, %rdi
1101; NO512-NEXT:    xorl %eax, %eax
1102; NO512-NEXT:    orq %rcx, %rdi
1103; NO512-NEXT:    setne %al
1104; NO512-NEXT:    retq
1105;
1106; AVX512F-LABEL: ne_i512_pair:
1107; AVX512F:       # %bb.0:
1108; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
1109; AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
1110; AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
1111; AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
1112; AVX512F-NEXT:    xorl %eax, %eax
1113; AVX512F-NEXT:    kortestw %k0, %k1
1114; AVX512F-NEXT:    setne %al
1115; AVX512F-NEXT:    vzeroupper
1116; AVX512F-NEXT:    retq
1117;
1118; AVX512BW-LABEL: ne_i512_pair:
1119; AVX512BW:       # %bb.0:
1120; AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
1121; AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
1122; AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
1123; AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
1124; AVX512BW-NEXT:    xorl %eax, %eax
1125; AVX512BW-NEXT:    kortestq %k0, %k1
1126; AVX512BW-NEXT:    setne %al
1127; AVX512BW-NEXT:    vzeroupper
1128; AVX512BW-NEXT:    retq
1129  %a0 = load i512, ptr %a
1130  %b0 = load i512, ptr %b
1131  %xor1 = xor i512 %a0, %b0
1132  %ap1 = getelementptr i512, ptr %a, i512 1
1133  %bp1 = getelementptr i512, ptr %b, i512 1
1134  %a1 = load i512, ptr %ap1
1135  %b1 = load i512, ptr %bp1
1136  %xor2 = xor i512 %a1, %b1
1137  %or = or i512 %xor1, %xor2
1138  %cmp = icmp ne i512 %or, 0
1139  %z = zext i1 %cmp to i32
1140  ret i32 %z
1141}
1142
1143; This test models the expansion of 'memcmp(a, b, 64) == 0'
1144; if we allowed 2 pairs of 64-byte loads per block.
1145
1146define i32 @eq_i512_pair(ptr %a, ptr %b) {
1147; NO512-LABEL: eq_i512_pair:
1148; NO512:       # %bb.0:
1149; NO512-NEXT:    movq 40(%rdi), %rax
1150; NO512-NEXT:    movq 56(%rdi), %rcx
1151; NO512-NEXT:    movq 24(%rdi), %rdx
1152; NO512-NEXT:    xorq 24(%rsi), %rdx
1153; NO512-NEXT:    xorq 56(%rsi), %rcx
1154; NO512-NEXT:    movq 88(%rdi), %r8
1155; NO512-NEXT:    xorq 88(%rsi), %r8
1156; NO512-NEXT:    orq %rdx, %r8
1157; NO512-NEXT:    movq 120(%rdi), %rdx
1158; NO512-NEXT:    xorq 120(%rsi), %rdx
1159; NO512-NEXT:    orq %rcx, %rdx
1160; NO512-NEXT:    movq 8(%rdi), %rcx
1161; NO512-NEXT:    xorq 8(%rsi), %rcx
1162; NO512-NEXT:    xorq 40(%rsi), %rax
1163; NO512-NEXT:    orq %r8, %rdx
1164; NO512-NEXT:    movq 72(%rdi), %r8
1165; NO512-NEXT:    xorq 72(%rsi), %r8
1166; NO512-NEXT:    orq %rcx, %r8
1167; NO512-NEXT:    movq 104(%rdi), %rcx
1168; NO512-NEXT:    xorq 104(%rsi), %rcx
1169; NO512-NEXT:    orq %rax, %rcx
1170; NO512-NEXT:    movq 48(%rdi), %rax
1171; NO512-NEXT:    orq %r8, %rcx
1172; NO512-NEXT:    movq 16(%rdi), %r8
1173; NO512-NEXT:    xorq 16(%rsi), %r8
1174; NO512-NEXT:    xorq 48(%rsi), %rax
1175; NO512-NEXT:    orq %rdx, %rcx
1176; NO512-NEXT:    movq 80(%rdi), %rdx
1177; NO512-NEXT:    xorq 80(%rsi), %rdx
1178; NO512-NEXT:    orq %r8, %rdx
1179; NO512-NEXT:    movq 112(%rdi), %r8
1180; NO512-NEXT:    xorq 112(%rsi), %r8
1181; NO512-NEXT:    orq %rax, %r8
1182; NO512-NEXT:    movq (%rdi), %rax
1183; NO512-NEXT:    xorq (%rsi), %rax
1184; NO512-NEXT:    orq %rdx, %r8
1185; NO512-NEXT:    movq 64(%rdi), %rdx
1186; NO512-NEXT:    xorq 64(%rsi), %rdx
1187; NO512-NEXT:    orq %rax, %rdx
1188; NO512-NEXT:    movq 32(%rdi), %rax
1189; NO512-NEXT:    xorq 32(%rsi), %rax
1190; NO512-NEXT:    movq 96(%rdi), %rdi
1191; NO512-NEXT:    xorq 96(%rsi), %rdi
1192; NO512-NEXT:    orq %rax, %rdi
1193; NO512-NEXT:    orq %rdx, %rdi
1194; NO512-NEXT:    orq %r8, %rdi
1195; NO512-NEXT:    xorl %eax, %eax
1196; NO512-NEXT:    orq %rcx, %rdi
1197; NO512-NEXT:    sete %al
1198; NO512-NEXT:    retq
1199;
1200; AVX512F-LABEL: eq_i512_pair:
1201; AVX512F:       # %bb.0:
1202; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
1203; AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
1204; AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
1205; AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
1206; AVX512F-NEXT:    xorl %eax, %eax
1207; AVX512F-NEXT:    kortestw %k0, %k1
1208; AVX512F-NEXT:    sete %al
1209; AVX512F-NEXT:    vzeroupper
1210; AVX512F-NEXT:    retq
1211;
1212; AVX512BW-LABEL: eq_i512_pair:
1213; AVX512BW:       # %bb.0:
1214; AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
1215; AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
1216; AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
1217; AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
1218; AVX512BW-NEXT:    xorl %eax, %eax
1219; AVX512BW-NEXT:    kortestq %k0, %k1
1220; AVX512BW-NEXT:    sete %al
1221; AVX512BW-NEXT:    vzeroupper
1222; AVX512BW-NEXT:    retq
1223  %a0 = load i512, ptr %a
1224  %b0 = load i512, ptr %b
1225  %xor1 = xor i512 %a0, %b0
1226  %ap1 = getelementptr i512, ptr %a, i512 1
1227  %bp1 = getelementptr i512, ptr %b, i512 1
1228  %a1 = load i512, ptr %ap1
1229  %b1 = load i512, ptr %bp1
1230  %xor2 = xor i512 %a1, %b1
1231  %or = or i512 %xor1, %xor2
1232  %cmp = icmp eq i512 %or, 0
1233  %z = zext i1 %cmp to i32
1234  ret i32 %z
1235}
1236
1237; PR41971: Comparison using vector types is not favorable here.
1238define i1 @eq_i128_args(i128 %a, i128 %b) {
1239; ANY-LABEL: eq_i128_args:
1240; ANY:       # %bb.0:
1241; ANY-NEXT:    xorq %rcx, %rsi
1242; ANY-NEXT:    xorq %rdx, %rdi
1243; ANY-NEXT:    orq %rsi, %rdi
1244; ANY-NEXT:    sete %al
1245; ANY-NEXT:    retq
1246  %r = icmp eq i128 %a, %b
1247  ret i1 %r
1248}
1249
1250define i1 @eq_i256_args(i256 %a, i256 %b) {
1251; ANY-LABEL: eq_i256_args:
1252; ANY:       # %bb.0:
1253; ANY-NEXT:    xorq %r9, %rsi
1254; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1255; ANY-NEXT:    orq %rsi, %rcx
1256; ANY-NEXT:    xorq %r8, %rdi
1257; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1258; ANY-NEXT:    orq %rdi, %rdx
1259; ANY-NEXT:    orq %rcx, %rdx
1260; ANY-NEXT:    sete %al
1261; ANY-NEXT:    retq
1262  %r = icmp eq i256 %a, %b
1263  ret i1 %r
1264}
1265
1266define i1 @eq_i512_args(i512 %a, i512 %b) {
1267; ANY-LABEL: eq_i512_args:
1268; ANY:       # %bb.0:
1269; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1270; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1271; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1272; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1273; ANY-NEXT:    orq %r10, %rcx
1274; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r9
1275; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rsi
1276; ANY-NEXT:    orq %r9, %rsi
1277; ANY-NEXT:    orq %rcx, %rsi
1278; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1279; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1280; ANY-NEXT:    orq %rax, %rdx
1281; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r8
1282; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
1283; ANY-NEXT:    orq %r8, %rdi
1284; ANY-NEXT:    orq %rdx, %rdi
1285; ANY-NEXT:    orq %rsi, %rdi
1286; ANY-NEXT:    sete %al
1287; ANY-NEXT:    retq
1288  %r = icmp eq i512 %a, %b
1289  ret i1 %r
1290}
1291
1292define i1 @eq_i128_op(i128 %a, i128 %b) {
1293; ANY-LABEL: eq_i128_op:
1294; ANY:       # %bb.0:
1295; ANY-NEXT:    addq $1, %rdi
1296; ANY-NEXT:    adcq $0, %rsi
1297; ANY-NEXT:    xorq %rdx, %rdi
1298; ANY-NEXT:    xorq %rcx, %rsi
1299; ANY-NEXT:    orq %rdi, %rsi
1300; ANY-NEXT:    sete %al
1301; ANY-NEXT:    retq
1302  %a2 = add i128 %a, 1
1303  %r = icmp eq i128 %a2, %b
1304  ret i1 %r
1305}
1306
1307define i1 @eq_i256_op(i256 %a, i256 %b) {
1308; ANY-LABEL: eq_i256_op:
1309; ANY:       # %bb.0:
1310; ANY-NEXT:    addq $1, %rdi
1311; ANY-NEXT:    adcq $0, %rsi
1312; ANY-NEXT:    adcq $0, %rdx
1313; ANY-NEXT:    adcq $0, %rcx
1314; ANY-NEXT:    xorq %r8, %rdi
1315; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1316; ANY-NEXT:    orq %rdi, %rdx
1317; ANY-NEXT:    xorq %r9, %rsi
1318; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1319; ANY-NEXT:    orq %rsi, %rcx
1320; ANY-NEXT:    orq %rdx, %rcx
1321; ANY-NEXT:    sete %al
1322; ANY-NEXT:    retq
1323  %a2 = add i256 %a, 1
1324  %r = icmp eq i256 %a2, %b
1325  ret i1 %r
1326}
1327
1328define i1 @eq_i512_op(i512 %a, i512 %b) {
1329; SSE-LABEL: eq_i512_op:
1330; SSE:       # %bb.0:
1331; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1332; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1333; SSE-NEXT:    addq $1, %rdi
1334; SSE-NEXT:    adcq $0, %rsi
1335; SSE-NEXT:    adcq $0, %rdx
1336; SSE-NEXT:    adcq $0, %rcx
1337; SSE-NEXT:    adcq $0, %r8
1338; SSE-NEXT:    adcq $0, %r9
1339; SSE-NEXT:    adcq $0, %r10
1340; SSE-NEXT:    adcq $0, %rax
1341; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %rsi
1342; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %r9
1343; SSE-NEXT:    orq %rsi, %r9
1344; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1345; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1346; SSE-NEXT:    orq %rcx, %rax
1347; SSE-NEXT:    orq %r9, %rax
1348; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1349; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1350; SSE-NEXT:    orq %rdx, %r10
1351; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %r8
1352; SSE-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
1353; SSE-NEXT:    orq %r8, %rdi
1354; SSE-NEXT:    orq %r10, %rdi
1355; SSE-NEXT:    orq %rax, %rdi
1356; SSE-NEXT:    sete %al
1357; SSE-NEXT:    retq
1358;
1359; AVXANY-LABEL: eq_i512_op:
1360; AVXANY:       # %bb.0:
1361; AVXANY-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1362; AVXANY-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1363; AVXANY-NEXT:    addq $1, %rdi
1364; AVXANY-NEXT:    adcq $0, %rsi
1365; AVXANY-NEXT:    adcq $0, %rdx
1366; AVXANY-NEXT:    adcq $0, %rcx
1367; AVXANY-NEXT:    adcq $0, %r8
1368; AVXANY-NEXT:    adcq $0, %r9
1369; AVXANY-NEXT:    adcq $0, %r10
1370; AVXANY-NEXT:    adcq $0, %rax
1371; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rsi
1372; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r9
1373; AVXANY-NEXT:    orq %rsi, %r9
1374; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1375; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1376; AVXANY-NEXT:    orq %rcx, %rax
1377; AVXANY-NEXT:    orq %r9, %rax
1378; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1379; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1380; AVXANY-NEXT:    orq %rdx, %r10
1381; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r8
1382; AVXANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
1383; AVXANY-NEXT:    orq %r8, %rdi
1384; AVXANY-NEXT:    orq %r10, %rdi
1385; AVXANY-NEXT:    orq %rax, %rdi
1386; AVXANY-NEXT:    sete %al
1387; AVXANY-NEXT:    retq
1388  %a2 = add i512 %a, 1
1389  %r = icmp eq i512 %a2, %b
1390  ret i1 %r
1391}
1392
1393define i1 @eq_i128_load_arg(ptr%p, i128 %b) {
1394; ANY-LABEL: eq_i128_load_arg:
1395; ANY:       # %bb.0:
1396; ANY-NEXT:    xorq 8(%rdi), %rdx
1397; ANY-NEXT:    xorq (%rdi), %rsi
1398; ANY-NEXT:    orq %rdx, %rsi
1399; ANY-NEXT:    sete %al
1400; ANY-NEXT:    retq
1401  %a = load i128, ptr %p
1402  %r = icmp eq i128 %a, %b
1403  ret i1 %r
1404}
1405
1406define i1 @eq_i256_load_arg(ptr%p, i256 %b) {
1407; ANY-LABEL: eq_i256_load_arg:
1408; ANY:       # %bb.0:
1409; ANY-NEXT:    xorq 24(%rdi), %r8
1410; ANY-NEXT:    xorq 8(%rdi), %rdx
1411; ANY-NEXT:    orq %r8, %rdx
1412; ANY-NEXT:    xorq 16(%rdi), %rcx
1413; ANY-NEXT:    xorq (%rdi), %rsi
1414; ANY-NEXT:    orq %rcx, %rsi
1415; ANY-NEXT:    orq %rdx, %rsi
1416; ANY-NEXT:    sete %al
1417; ANY-NEXT:    retq
1418  %a = load i256, ptr %p
1419  %r = icmp eq i256 %a, %b
1420  ret i1 %r
1421}
1422
1423define i1 @eq_i512_load_arg(ptr%p, i512 %b) {
1424; ANY-LABEL: eq_i512_load_arg:
1425; ANY:       # %bb.0:
1426; ANY-NEXT:    movq 40(%rdi), %rax
1427; ANY-NEXT:    movq 48(%rdi), %r10
1428; ANY-NEXT:    movq 56(%rdi), %r11
1429; ANY-NEXT:    xorq 24(%rdi), %r8
1430; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r11
1431; ANY-NEXT:    orq %r8, %r11
1432; ANY-NEXT:    xorq 8(%rdi), %rdx
1433; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1434; ANY-NEXT:    orq %rdx, %rax
1435; ANY-NEXT:    orq %r11, %rax
1436; ANY-NEXT:    xorq 32(%rdi), %r9
1437; ANY-NEXT:    xorq (%rdi), %rsi
1438; ANY-NEXT:    orq %r9, %rsi
1439; ANY-NEXT:    xorq 16(%rdi), %rcx
1440; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1441; ANY-NEXT:    orq %rcx, %r10
1442; ANY-NEXT:    orq %rsi, %r10
1443; ANY-NEXT:    orq %rax, %r10
1444; ANY-NEXT:    sete %al
1445; ANY-NEXT:    retq
1446  %a = load i512, ptr %p
1447  %r = icmp eq i512 %a, %b
1448  ret i1 %r
1449}
1450