[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / vp2intersect_multiple_pairs.ll
blobafd213b53a02a618ae03673cecd9da899286b67e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512vp2intersect -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,X86
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vp2intersect -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,X64
5 ; Test with more than four live mask pairs
7 define void @test(<16 x i32> %a0, <16 x i32> %b0,
8                   <16 x i32> %a1, <16 x i32> %b1,
9                   <16 x i32> %a2, <16 x i32> %b2,
10                   <16 x i32> %a3, <16 x i32> %b3,
11                   <16 x i32> %a4, <16 x i32> %b4,
12                  i16* nocapture %m0, i16* nocapture %m1) {
13 ; X86-LABEL: test:
14 ; X86:       # %bb.0: # %entry
15 ; X86-NEXT:    pushl %ebp
16 ; X86-NEXT:    .cfi_def_cfa_offset 8
17 ; X86-NEXT:    .cfi_offset %ebp, -8
18 ; X86-NEXT:    movl %esp, %ebp
19 ; X86-NEXT:    .cfi_def_cfa_register %ebp
20 ; X86-NEXT:    pushl %edi
21 ; X86-NEXT:    pushl %esi
22 ; X86-NEXT:    andl $-64, %esp
23 ; X86-NEXT:    subl $64, %esp
24 ; X86-NEXT:    .cfi_offset %esi, -16
25 ; X86-NEXT:    .cfi_offset %edi, -12
26 ; X86-NEXT:    movl 456(%ebp), %esi
27 ; X86-NEXT:    vmovaps 328(%ebp), %zmm3
28 ; X86-NEXT:    vmovaps 200(%ebp), %zmm4
29 ; X86-NEXT:    vmovaps 72(%ebp), %zmm5
30 ; X86-NEXT:    vp2intersectd %zmm1, %zmm0, %k0
31 ; X86-NEXT:    kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
32 ; X86-NEXT:    kmovw %k1, {{[0-9]+}}(%esp)
33 ; X86-NEXT:    vp2intersectd 8(%ebp), %zmm2, %k0
34 ; X86-NEXT:    kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
35 ; X86-NEXT:    kmovw %k1, {{[0-9]+}}(%esp)
36 ; X86-NEXT:    vp2intersectd 136(%ebp), %zmm5, %k0
37 ; X86-NEXT:    kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
38 ; X86-NEXT:    kmovw %k1, {{[0-9]+}}(%esp)
39 ; X86-NEXT:    vp2intersectd 264(%ebp), %zmm4, %k0
40 ; X86-NEXT:    kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
41 ; X86-NEXT:    kmovw %k1, {{[0-9]+}}(%esp)
42 ; X86-NEXT:    vp2intersectd 392(%ebp), %zmm3, %k0
43 ; X86-NEXT:    kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
44 ; X86-NEXT:    kmovw %k1, {{[0-9]+}}(%esp)
45 ; X86-NEXT:    vzeroupper
46 ; X86-NEXT:    calll dummy
47 ; X86-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 4-byte Folded Reload
48 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
49 ; X86-NEXT:    kmovw %k0, %eax
50 ; X86-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 4-byte Folded Reload
51 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
52 ; X86-NEXT:    kmovw %k0, %ecx
53 ; X86-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 4-byte Folded Reload
54 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
55 ; X86-NEXT:    kmovw %k0, %edx
56 ; X86-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 4-byte Folded Reload
57 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
58 ; X86-NEXT:    kmovw %k0, %edi
59 ; X86-NEXT:    addl %edi, %eax
60 ; X86-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k2 # 4-byte Folded Reload
61 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k3
62 ; X86-NEXT:    kmovw %k2, %edi
63 ; X86-NEXT:    addl %ecx, %edx
64 ; X86-NEXT:    kmovw %k1, %ecx
66 ; X64-LABEL: test:
67 ; X64:       # %bb.0: # %entry
68 ; X64-NEXT:    pushq %rbp
69 ; X64-NEXT:    .cfi_def_cfa_offset 16
70 ; X64-NEXT:    .cfi_offset %rbp, -16
71 ; X64-NEXT:    movq %rsp, %rbp
72 ; X64-NEXT:    .cfi_def_cfa_register %rbp
73 ; X64-NEXT:    pushq %r14
74 ; X64-NEXT:    pushq %rbx
75 ; X64-NEXT:    andq $-64, %rsp
76 ; X64-NEXT:    subq $64, %rsp
77 ; X64-NEXT:    .cfi_offset %rbx, -32
78 ; X64-NEXT:    .cfi_offset %r14, -24
79 ; X64-NEXT:    movq %rdi, %r14
80 ; X64-NEXT:    vmovaps 16(%rbp), %zmm8
81 ; X64-NEXT:    vp2intersectd %zmm1, %zmm0, %k0
82 ; X64-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
83 ; X64-NEXT:    kmovw %k1, {{[0-9]+}}(%rsp)
84 ; X64-NEXT:    vp2intersectd %zmm3, %zmm2, %k0
85 ; X64-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
86 ; X64-NEXT:    kmovw %k1, {{[0-9]+}}(%rsp)
87 ; X64-NEXT:    vp2intersectd %zmm5, %zmm4, %k0
88 ; X64-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
89 ; X64-NEXT:    kmovw %k1, {{[0-9]+}}(%rsp)
90 ; X64-NEXT:    vp2intersectd %zmm7, %zmm6, %k0
91 ; X64-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
92 ; X64-NEXT:    kmovw %k1, {{[0-9]+}}(%rsp)
93 ; X64-NEXT:    vp2intersectd 80(%rbp), %zmm8, %k0
94 ; X64-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
95 ; X64-NEXT:    kmovw %k1, {{[0-9]+}}(%rsp)
96 ; X64-NEXT:    vzeroupper
97 ; X64-NEXT:    callq dummy
98 ; X64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 4-byte Folded Reload
99 ; X64-NEXT:    kmovw {{[0-9]+}}(%rsp), %k1
100 ; X64-NEXT:    kmovw %k0, %eax
101 ; X64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 4-byte Folded Reload
102 ; X64-NEXT:    kmovw {{[0-9]+}}(%rsp), %k1
103 ; X64-NEXT:    kmovw %k0, %ecx
104 ; X64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 4-byte Folded Reload
105 ; X64-NEXT:    kmovw {{[0-9]+}}(%rsp), %k1
106 ; X64-NEXT:    kmovw %k0, %edx
107 ; X64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 4-byte Folded Reload
108 ; X64-NEXT:    kmovw {{[0-9]+}}(%rsp), %k1
109 ; X64-NEXT:    kmovw %k0, %esi
110 ; X64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 4-byte Folded Reload
111 ; X64-NEXT:    kmovw {{[0-9]+}}(%rsp), %k1
112 ; X64-NEXT:    kmovw %k0, %edi
113 ; X64-NEXT:    kmovw %k1, %ebx
114 entry:
115   %0 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a0, <16 x i32> %b0)
116   %1 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a1, <16 x i32> %b1)
117   %2 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a2, <16 x i32> %b2)
118   %3 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a3, <16 x i32> %b3)
119   %4 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a4, <16 x i32> %b4)
121   %5 = extractvalue { <16 x i1>, <16 x i1> } %0, 0
122   %6 = extractvalue { <16 x i1>, <16 x i1> } %1, 0
123   %7 = extractvalue { <16 x i1>, <16 x i1> } %2, 0
124   %8 = extractvalue { <16 x i1>, <16 x i1> } %3, 0
125   %9 = extractvalue { <16 x i1>, <16 x i1> } %4, 0
126   %10 = extractvalue { <16 x i1>, <16 x i1> } %0, 1
127   %11 = extractvalue { <16 x i1>, <16 x i1> } %1, 1
129   call void @dummy()
131   %12 = bitcast <16 x i1> %5 to i16
132   %13 = bitcast <16 x i1> %6 to i16
133   %14 = bitcast <16 x i1> %7 to i16
134   %15 = bitcast <16 x i1> %8 to i16
135   %16 = bitcast <16 x i1> %9 to i16
136   %17 = bitcast <16 x i1> %10 to i16
137   %18 = bitcast <16 x i1> %11 to i16
139   %19 = add i16 %12, %13
140   %20 = add i16 %14, %15
141   %21 = add i16 %16, %17
142   %22 = add i16 %19, %21
143   %23 = add i16 %22, %20
145   store i16 %23, i16* %m0, align 16
146   ret void
149 declare { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32>, <16 x i32>)
150 declare void @dummy()