xref: /llvm-project/llvm/test/CodeGen/X86/vsplit-and.ll (revision db50b77ed470d98e68fe8dc03d23b044545dbc82)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-linux -mcpu=penryn |  FileCheck %s
3
4define void @t0(ptr %dst, <2 x i64> %src1, <2 x i64> %src2) nounwind readonly {
5; CHECK-LABEL: t0:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    pxor %xmm2, %xmm2
8; CHECK-NEXT:    pcmpeqq %xmm2, %xmm0
9; CHECK-NEXT:    pcmpeqq %xmm2, %xmm1
10; CHECK-NEXT:    por %xmm0, %xmm1
11; CHECK-NEXT:    pcmpeqd %xmm0, %xmm0
12; CHECK-NEXT:    pxor %xmm1, %xmm0
13; CHECK-NEXT:    movdqa %xmm0, (%rdi)
14; CHECK-NEXT:    retq
15  %cmp1 = icmp ne <2 x i64> %src1, zeroinitializer
16  %cmp2 = icmp ne <2 x i64> %src2, zeroinitializer
17  %t1 = and <2 x i1> %cmp1, %cmp2
18  %t2 = sext <2 x i1> %t1 to <2 x i64>
19  store <2 x i64> %t2, ptr %dst
20  ret void
21}
22
23define void @t2(ptr %dst, <3 x i64> %src1, <3 x i64> %src2) nounwind readonly {
24; CHECK-LABEL: t2:
25; CHECK:       # %bb.0:
26; CHECK-NEXT:    movq %r9, %xmm0
27; CHECK-NEXT:    movq %r8, %xmm1
28; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
29; CHECK-NEXT:    movq %rdx, %xmm0
30; CHECK-NEXT:    movq %rsi, %xmm2
31; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
32; CHECK-NEXT:    movq %rcx, %xmm0
33; CHECK-NEXT:    movq {{.*#+}} xmm3 = mem[0],zero
34; CHECK-NEXT:    pxor %xmm4, %xmm4
35; CHECK-NEXT:    pcmpeqq %xmm4, %xmm2
36; CHECK-NEXT:    pcmpeqq %xmm4, %xmm0
37; CHECK-NEXT:    pcmpeqd %xmm5, %xmm5
38; CHECK-NEXT:    pcmpeqq %xmm4, %xmm1
39; CHECK-NEXT:    por %xmm2, %xmm1
40; CHECK-NEXT:    pcmpeqq %xmm4, %xmm3
41; CHECK-NEXT:    por %xmm0, %xmm3
42; CHECK-NEXT:    packssdw %xmm3, %xmm1
43; CHECK-NEXT:    pxor %xmm5, %xmm1
44; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,2,2,2]
45; CHECK-NEXT:    pslld $31, %xmm0
46; CHECK-NEXT:    psrad $31, %xmm0
47; CHECK-NEXT:    pmovsxdq %xmm1, %xmm1
48; CHECK-NEXT:    movdqa %xmm1, (%rdi)
49; CHECK-NEXT:    movq %xmm0, 16(%rdi)
50; CHECK-NEXT:    retq
51  %cmp1 = icmp ne <3 x i64> %src1, zeroinitializer
52  %cmp2 = icmp ne <3 x i64> %src2, zeroinitializer
53  %t1 = and <3 x i1> %cmp1, %cmp2
54  %t2 = sext <3 x i1> %t1 to <3 x i64>
55  store <3 x i64> %t2, ptr %dst
56  ret void
57}
58