OSDN Git Service

[X86] Move VPTESTM matching from the isel table to custom code in X86ISelDAGToDAG.
[android-x86/external-llvm.git] / test / CodeGen / X86 / vector-fshr-512.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512,AVX512VBMI2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLVBMI2
8
9 declare <8 x i64> @llvm.fshr.v8i64(<8 x i64>, <8 x i64>, <8 x i64>)
10 declare <16 x i32> @llvm.fshr.v16i32(<16 x i32>, <16 x i32>, <16 x i32>)
11 declare <32 x i16> @llvm.fshr.v32i16(<32 x i16>, <32 x i16>, <32 x i16>)
12 declare <64 x i8> @llvm.fshr.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)
13
14 ;
15 ; Variable Shifts
16 ;
17
18 define <8 x i64> @var_funnnel_v8i64(<8 x i64> %x, <8 x i64> %y, <8 x i64> %amt) nounwind {
19 ; AVX512F-LABEL: var_funnnel_v8i64:
20 ; AVX512F:       # %bb.0:
21 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
22 ; AVX512F-NEXT:    vpsrlvq %zmm2, %zmm1, %zmm3
23 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [64,64,64,64,64,64,64,64]
24 ; AVX512F-NEXT:    vpsubq %zmm2, %zmm4, %zmm4
25 ; AVX512F-NEXT:    vpsllvq %zmm4, %zmm0, %zmm0
26 ; AVX512F-NEXT:    vporq %zmm3, %zmm0, %zmm0
27 ; AVX512F-NEXT:    vptestnmq %zmm2, %zmm2, %k1
28 ; AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
29 ; AVX512F-NEXT:    retq
30 ;
31 ; AVX512VL-LABEL: var_funnnel_v8i64:
32 ; AVX512VL:       # %bb.0:
33 ; AVX512VL-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
34 ; AVX512VL-NEXT:    vpsrlvq %zmm2, %zmm1, %zmm3
35 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [64,64,64,64,64,64,64,64]
36 ; AVX512VL-NEXT:    vpsubq %zmm2, %zmm4, %zmm4
37 ; AVX512VL-NEXT:    vpsllvq %zmm4, %zmm0, %zmm0
38 ; AVX512VL-NEXT:    vporq %zmm3, %zmm0, %zmm0
39 ; AVX512VL-NEXT:    vptestnmq %zmm2, %zmm2, %k1
40 ; AVX512VL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
41 ; AVX512VL-NEXT:    retq
42 ;
43 ; AVX512BW-LABEL: var_funnnel_v8i64:
44 ; AVX512BW:       # %bb.0:
45 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
46 ; AVX512BW-NEXT:    vpsrlvq %zmm2, %zmm1, %zmm3
47 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [64,64,64,64,64,64,64,64]
48 ; AVX512BW-NEXT:    vpsubq %zmm2, %zmm4, %zmm4
49 ; AVX512BW-NEXT:    vpsllvq %zmm4, %zmm0, %zmm0
50 ; AVX512BW-NEXT:    vporq %zmm3, %zmm0, %zmm0
51 ; AVX512BW-NEXT:    vptestnmq %zmm2, %zmm2, %k1
52 ; AVX512BW-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
53 ; AVX512BW-NEXT:    retq
54 ;
55 ; AVX512VBMI2-LABEL: var_funnnel_v8i64:
56 ; AVX512VBMI2:       # %bb.0:
57 ; AVX512VBMI2-NEXT:    vpshrdvq %zmm2, %zmm0, %zmm1
58 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
59 ; AVX512VBMI2-NEXT:    retq
60 ;
61 ; AVX512VLBW-LABEL: var_funnnel_v8i64:
62 ; AVX512VLBW:       # %bb.0:
63 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
64 ; AVX512VLBW-NEXT:    vpsrlvq %zmm2, %zmm1, %zmm3
65 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [64,64,64,64,64,64,64,64]
66 ; AVX512VLBW-NEXT:    vpsubq %zmm2, %zmm4, %zmm4
67 ; AVX512VLBW-NEXT:    vpsllvq %zmm4, %zmm0, %zmm0
68 ; AVX512VLBW-NEXT:    vporq %zmm3, %zmm0, %zmm0
69 ; AVX512VLBW-NEXT:    vptestnmq %zmm2, %zmm2, %k1
70 ; AVX512VLBW-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
71 ; AVX512VLBW-NEXT:    retq
72 ;
73 ; AVX512VLVBMI2-LABEL: var_funnnel_v8i64:
74 ; AVX512VLVBMI2:       # %bb.0:
75 ; AVX512VLVBMI2-NEXT:    vpshrdvq %zmm2, %zmm0, %zmm1
76 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
77 ; AVX512VLVBMI2-NEXT:    retq
78   %res = call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %x, <8 x i64> %y, <8 x i64> %amt)
79   ret <8 x i64> %res
80 }
81
82 define <16 x i32> @var_funnnel_v16i32(<16 x i32> %x, <16 x i32> %y, <16 x i32> %amt) nounwind {
83 ; AVX512F-LABEL: var_funnnel_v16i32:
84 ; AVX512F:       # %bb.0:
85 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
86 ; AVX512F-NEXT:    vpsrlvd %zmm2, %zmm1, %zmm3
87 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} zmm4 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
88 ; AVX512F-NEXT:    vpsubd %zmm2, %zmm4, %zmm4
89 ; AVX512F-NEXT:    vpsllvd %zmm4, %zmm0, %zmm0
90 ; AVX512F-NEXT:    vpord %zmm3, %zmm0, %zmm0
91 ; AVX512F-NEXT:    vptestnmd %zmm2, %zmm2, %k1
92 ; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
93 ; AVX512F-NEXT:    retq
94 ;
95 ; AVX512VL-LABEL: var_funnnel_v16i32:
96 ; AVX512VL:       # %bb.0:
97 ; AVX512VL-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
98 ; AVX512VL-NEXT:    vpsrlvd %zmm2, %zmm1, %zmm3
99 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} zmm4 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
100 ; AVX512VL-NEXT:    vpsubd %zmm2, %zmm4, %zmm4
101 ; AVX512VL-NEXT:    vpsllvd %zmm4, %zmm0, %zmm0
102 ; AVX512VL-NEXT:    vpord %zmm3, %zmm0, %zmm0
103 ; AVX512VL-NEXT:    vptestnmd %zmm2, %zmm2, %k1
104 ; AVX512VL-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
105 ; AVX512VL-NEXT:    retq
106 ;
107 ; AVX512BW-LABEL: var_funnnel_v16i32:
108 ; AVX512BW:       # %bb.0:
109 ; AVX512BW-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
110 ; AVX512BW-NEXT:    vpsrlvd %zmm2, %zmm1, %zmm3
111 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} zmm4 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
112 ; AVX512BW-NEXT:    vpsubd %zmm2, %zmm4, %zmm4
113 ; AVX512BW-NEXT:    vpsllvd %zmm4, %zmm0, %zmm0
114 ; AVX512BW-NEXT:    vpord %zmm3, %zmm0, %zmm0
115 ; AVX512BW-NEXT:    vptestnmd %zmm2, %zmm2, %k1
116 ; AVX512BW-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
117 ; AVX512BW-NEXT:    retq
118 ;
119 ; AVX512VBMI2-LABEL: var_funnnel_v16i32:
120 ; AVX512VBMI2:       # %bb.0:
121 ; AVX512VBMI2-NEXT:    vpshrdvd %zmm2, %zmm0, %zmm1
122 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
123 ; AVX512VBMI2-NEXT:    retq
124 ;
125 ; AVX512VLBW-LABEL: var_funnnel_v16i32:
126 ; AVX512VLBW:       # %bb.0:
127 ; AVX512VLBW-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
128 ; AVX512VLBW-NEXT:    vpsrlvd %zmm2, %zmm1, %zmm3
129 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} zmm4 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
130 ; AVX512VLBW-NEXT:    vpsubd %zmm2, %zmm4, %zmm4
131 ; AVX512VLBW-NEXT:    vpsllvd %zmm4, %zmm0, %zmm0
132 ; AVX512VLBW-NEXT:    vpord %zmm3, %zmm0, %zmm0
133 ; AVX512VLBW-NEXT:    vptestnmd %zmm2, %zmm2, %k1
134 ; AVX512VLBW-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
135 ; AVX512VLBW-NEXT:    retq
136 ;
137 ; AVX512VLVBMI2-LABEL: var_funnnel_v16i32:
138 ; AVX512VLVBMI2:       # %bb.0:
139 ; AVX512VLVBMI2-NEXT:    vpshrdvd %zmm2, %zmm0, %zmm1
140 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
141 ; AVX512VLVBMI2-NEXT:    retq
142   %res = call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %x, <16 x i32> %y, <16 x i32> %amt)
143   ret <16 x i32> %res
144 }
145
146 define <32 x i16> @var_funnnel_v32i16(<32 x i16> %x, <32 x i16> %y, <32 x i16> %amt) nounwind {
147 ; AVX512F-LABEL: var_funnnel_v32i16:
148 ; AVX512F:       # %bb.0:
149 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
150 ; AVX512F-NEXT:    vpand %ymm6, %ymm4, %ymm4
151 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm7 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero
152 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm8 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
153 ; AVX512F-NEXT:    vpsrlvd %zmm7, %zmm8, %zmm7
154 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
155 ; AVX512F-NEXT:    vpsubw %ymm4, %ymm8, %ymm9
156 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm9 = ymm9[0],zero,ymm9[1],zero,ymm9[2],zero,ymm9[3],zero,ymm9[4],zero,ymm9[5],zero,ymm9[6],zero,ymm9[7],zero,ymm9[8],zero,ymm9[9],zero,ymm9[10],zero,ymm9[11],zero,ymm9[12],zero,ymm9[13],zero,ymm9[14],zero,ymm9[15],zero
157 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
158 ; AVX512F-NEXT:    vpsllvd %zmm9, %zmm0, %zmm0
159 ; AVX512F-NEXT:    vpord %zmm7, %zmm0, %zmm0
160 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
161 ; AVX512F-NEXT:    vpxor %xmm7, %xmm7, %xmm7
162 ; AVX512F-NEXT:    vpcmpeqw %ymm7, %ymm4, %ymm4
163 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
164 ; AVX512F-NEXT:    vpand %ymm6, %ymm5, %ymm2
165 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
166 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm5 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
167 ; AVX512F-NEXT:    vpsrlvd %zmm4, %zmm5, %zmm4
168 ; AVX512F-NEXT:    vpsubw %ymm2, %ymm8, %ymm5
169 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm5 = ymm5[0],zero,ymm5[1],zero,ymm5[2],zero,ymm5[3],zero,ymm5[4],zero,ymm5[5],zero,ymm5[6],zero,ymm5[7],zero,ymm5[8],zero,ymm5[9],zero,ymm5[10],zero,ymm5[11],zero,ymm5[12],zero,ymm5[13],zero,ymm5[14],zero,ymm5[15],zero
170 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
171 ; AVX512F-NEXT:    vpsllvd %zmm5, %zmm1, %zmm1
172 ; AVX512F-NEXT:    vpord %zmm4, %zmm1, %zmm1
173 ; AVX512F-NEXT:    vpmovdw %zmm1, %ymm1
174 ; AVX512F-NEXT:    vpcmpeqw %ymm7, %ymm2, %ymm2
175 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
176 ; AVX512F-NEXT:    retq
177 ;
178 ; AVX512VL-LABEL: var_funnnel_v32i16:
179 ; AVX512VL:       # %bb.0:
180 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
181 ; AVX512VL-NEXT:    vpand %ymm6, %ymm4, %ymm4
182 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm7 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero
183 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm8 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
184 ; AVX512VL-NEXT:    vpsrlvd %zmm7, %zmm8, %zmm7
185 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
186 ; AVX512VL-NEXT:    vpsubw %ymm4, %ymm8, %ymm9
187 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm9 = ymm9[0],zero,ymm9[1],zero,ymm9[2],zero,ymm9[3],zero,ymm9[4],zero,ymm9[5],zero,ymm9[6],zero,ymm9[7],zero,ymm9[8],zero,ymm9[9],zero,ymm9[10],zero,ymm9[11],zero,ymm9[12],zero,ymm9[13],zero,ymm9[14],zero,ymm9[15],zero
188 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
189 ; AVX512VL-NEXT:    vpsllvd %zmm9, %zmm0, %zmm0
190 ; AVX512VL-NEXT:    vpord %zmm7, %zmm0, %zmm0
191 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
192 ; AVX512VL-NEXT:    vpxor %xmm7, %xmm7, %xmm7
193 ; AVX512VL-NEXT:    vpcmpeqw %ymm7, %ymm4, %ymm4
194 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
195 ; AVX512VL-NEXT:    vpand %ymm6, %ymm5, %ymm2
196 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
197 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm5 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
198 ; AVX512VL-NEXT:    vpsrlvd %zmm4, %zmm5, %zmm4
199 ; AVX512VL-NEXT:    vpsubw %ymm2, %ymm8, %ymm5
200 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm5 = ymm5[0],zero,ymm5[1],zero,ymm5[2],zero,ymm5[3],zero,ymm5[4],zero,ymm5[5],zero,ymm5[6],zero,ymm5[7],zero,ymm5[8],zero,ymm5[9],zero,ymm5[10],zero,ymm5[11],zero,ymm5[12],zero,ymm5[13],zero,ymm5[14],zero,ymm5[15],zero
201 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
202 ; AVX512VL-NEXT:    vpsllvd %zmm5, %zmm1, %zmm1
203 ; AVX512VL-NEXT:    vpord %zmm4, %zmm1, %zmm1
204 ; AVX512VL-NEXT:    vpmovdw %zmm1, %ymm1
205 ; AVX512VL-NEXT:    vpcmpeqw %ymm7, %ymm2, %ymm2
206 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
207 ; AVX512VL-NEXT:    retq
208 ;
209 ; AVX512BW-LABEL: var_funnnel_v32i16:
210 ; AVX512BW:       # %bb.0:
211 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
212 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm3
213 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
214 ; AVX512BW-NEXT:    vpsubw %zmm2, %zmm4, %zmm4
215 ; AVX512BW-NEXT:    vpsllvw %zmm4, %zmm0, %zmm0
216 ; AVX512BW-NEXT:    vporq %zmm3, %zmm0, %zmm0
217 ; AVX512BW-NEXT:    vptestnmw %zmm2, %zmm2, %k1
218 ; AVX512BW-NEXT:    vmovdqu16 %zmm1, %zmm0 {%k1}
219 ; AVX512BW-NEXT:    retq
220 ;
221 ; AVX512VBMI2-LABEL: var_funnnel_v32i16:
222 ; AVX512VBMI2:       # %bb.0:
223 ; AVX512VBMI2-NEXT:    vpshrdvw %zmm2, %zmm0, %zmm1
224 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
225 ; AVX512VBMI2-NEXT:    retq
226 ;
227 ; AVX512VLBW-LABEL: var_funnnel_v32i16:
228 ; AVX512VLBW:       # %bb.0:
229 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
230 ; AVX512VLBW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm3
231 ; AVX512VLBW-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
232 ; AVX512VLBW-NEXT:    vpsubw %zmm2, %zmm4, %zmm4
233 ; AVX512VLBW-NEXT:    vpsllvw %zmm4, %zmm0, %zmm0
234 ; AVX512VLBW-NEXT:    vporq %zmm3, %zmm0, %zmm0
235 ; AVX512VLBW-NEXT:    vptestnmw %zmm2, %zmm2, %k1
236 ; AVX512VLBW-NEXT:    vmovdqu16 %zmm1, %zmm0 {%k1}
237 ; AVX512VLBW-NEXT:    retq
238 ;
239 ; AVX512VLVBMI2-LABEL: var_funnnel_v32i16:
240 ; AVX512VLVBMI2:       # %bb.0:
241 ; AVX512VLVBMI2-NEXT:    vpshrdvw %zmm2, %zmm0, %zmm1
242 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
243 ; AVX512VLVBMI2-NEXT:    retq
244   %res = call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %x, <32 x i16> %y, <32 x i16> %amt)
245   ret <32 x i16> %res
246 }
247
248 define <64 x i8> @var_funnnel_v64i8(<64 x i8> %x, <64 x i8> %y, <64 x i8> %amt) nounwind {
249 ; AVX512F-LABEL: var_funnnel_v64i8:
250 ; AVX512F:       # %bb.0:
251 ; AVX512F-NEXT:    vpsrlw $4, %ymm2, %ymm7
252 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
253 ; AVX512F-NEXT:    vpand %ymm6, %ymm7, %ymm8
254 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm7 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
255 ; AVX512F-NEXT:    vpand %ymm7, %ymm4, %ymm9
256 ; AVX512F-NEXT:    vpsllw $5, %ymm9, %ymm10
257 ; AVX512F-NEXT:    vpblendvb %ymm10, %ymm8, %ymm2, %ymm8
258 ; AVX512F-NEXT:    vpsrlw $2, %ymm8, %ymm11
259 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
260 ; AVX512F-NEXT:    vpand %ymm4, %ymm11, %ymm11
261 ; AVX512F-NEXT:    vpaddb %ymm10, %ymm10, %ymm10
262 ; AVX512F-NEXT:    vpblendvb %ymm10, %ymm11, %ymm8, %ymm11
263 ; AVX512F-NEXT:    vpsrlw $1, %ymm11, %ymm12
264 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm8 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
265 ; AVX512F-NEXT:    vpand %ymm8, %ymm12, %ymm12
266 ; AVX512F-NEXT:    vpaddb %ymm10, %ymm10, %ymm10
267 ; AVX512F-NEXT:    vpblendvb %ymm10, %ymm12, %ymm11, %ymm10
268 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm11
269 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm12 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
270 ; AVX512F-NEXT:    vpand %ymm12, %ymm11, %ymm11
271 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
272 ; AVX512F-NEXT:    vpsubb %ymm9, %ymm13, %ymm14
273 ; AVX512F-NEXT:    vpsllw $5, %ymm14, %ymm14
274 ; AVX512F-NEXT:    vpblendvb %ymm14, %ymm11, %ymm0, %ymm0
275 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm11
276 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm15 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
277 ; AVX512F-NEXT:    vpand %ymm15, %ymm11, %ymm11
278 ; AVX512F-NEXT:    vpaddb %ymm14, %ymm14, %ymm14
279 ; AVX512F-NEXT:    vpblendvb %ymm14, %ymm11, %ymm0, %ymm0
280 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm11
281 ; AVX512F-NEXT:    vpaddb %ymm14, %ymm14, %ymm14
282 ; AVX512F-NEXT:    vpblendvb %ymm14, %ymm11, %ymm0, %ymm0
283 ; AVX512F-NEXT:    vpor %ymm10, %ymm0, %ymm0
284 ; AVX512F-NEXT:    vpxor %xmm10, %xmm10, %xmm10
285 ; AVX512F-NEXT:    vpcmpeqb %ymm10, %ymm9, %ymm9
286 ; AVX512F-NEXT:    vpblendvb %ymm9, %ymm2, %ymm0, %ymm0
287 ; AVX512F-NEXT:    vpsrlw $4, %ymm3, %ymm2
288 ; AVX512F-NEXT:    vpand %ymm6, %ymm2, %ymm2
289 ; AVX512F-NEXT:    vpand %ymm7, %ymm5, %ymm5
290 ; AVX512F-NEXT:    vpsllw $5, %ymm5, %ymm6
291 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm2, %ymm3, %ymm2
292 ; AVX512F-NEXT:    vpsrlw $2, %ymm2, %ymm7
293 ; AVX512F-NEXT:    vpand %ymm4, %ymm7, %ymm4
294 ; AVX512F-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
295 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm4, %ymm2, %ymm2
296 ; AVX512F-NEXT:    vpsrlw $1, %ymm2, %ymm4
297 ; AVX512F-NEXT:    vpand %ymm8, %ymm4, %ymm4
298 ; AVX512F-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
299 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm4, %ymm2, %ymm2
300 ; AVX512F-NEXT:    vpsllw $4, %ymm1, %ymm4
301 ; AVX512F-NEXT:    vpand %ymm12, %ymm4, %ymm4
302 ; AVX512F-NEXT:    vpsubb %ymm5, %ymm13, %ymm6
303 ; AVX512F-NEXT:    vpsllw $5, %ymm6, %ymm6
304 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm4, %ymm1, %ymm1
305 ; AVX512F-NEXT:    vpsllw $2, %ymm1, %ymm4
306 ; AVX512F-NEXT:    vpand %ymm15, %ymm4, %ymm4
307 ; AVX512F-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
308 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm4, %ymm1, %ymm1
309 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm4
310 ; AVX512F-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
311 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm4, %ymm1, %ymm1
312 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
313 ; AVX512F-NEXT:    vpcmpeqb %ymm10, %ymm5, %ymm2
314 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
315 ; AVX512F-NEXT:    retq
316 ;
317 ; AVX512VL-LABEL: var_funnnel_v64i8:
318 ; AVX512VL:       # %bb.0:
319 ; AVX512VL-NEXT:    vpsrlw $4, %ymm2, %ymm6
320 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm7 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
321 ; AVX512VL-NEXT:    vpand %ymm7, %ymm6, %ymm6
322 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm8 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
323 ; AVX512VL-NEXT:    vpand %ymm8, %ymm4, %ymm4
324 ; AVX512VL-NEXT:    vpsllw $5, %ymm4, %ymm9
325 ; AVX512VL-NEXT:    vpblendvb %ymm9, %ymm6, %ymm2, %ymm6
326 ; AVX512VL-NEXT:    vpsrlw $2, %ymm6, %ymm10
327 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
328 ; AVX512VL-NEXT:    vpand %ymm11, %ymm10, %ymm10
329 ; AVX512VL-NEXT:    vpaddb %ymm9, %ymm9, %ymm9
330 ; AVX512VL-NEXT:    vpblendvb %ymm9, %ymm10, %ymm6, %ymm6
331 ; AVX512VL-NEXT:    vpsrlw $1, %ymm6, %ymm10
332 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
333 ; AVX512VL-NEXT:    vpand %ymm12, %ymm10, %ymm10
334 ; AVX512VL-NEXT:    vpaddb %ymm9, %ymm9, %ymm9
335 ; AVX512VL-NEXT:    vpblendvb %ymm9, %ymm10, %ymm6, %ymm6
336 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm9
337 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm10 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
338 ; AVX512VL-NEXT:    vpand %ymm10, %ymm9, %ymm9
339 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
340 ; AVX512VL-NEXT:    vpsubb %ymm4, %ymm13, %ymm14
341 ; AVX512VL-NEXT:    vpsllw $5, %ymm14, %ymm14
342 ; AVX512VL-NEXT:    vpblendvb %ymm14, %ymm9, %ymm0, %ymm0
343 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm9
344 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm15 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
345 ; AVX512VL-NEXT:    vpand %ymm15, %ymm9, %ymm9
346 ; AVX512VL-NEXT:    vpaddb %ymm14, %ymm14, %ymm14
347 ; AVX512VL-NEXT:    vpblendvb %ymm14, %ymm9, %ymm0, %ymm0
348 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm9
349 ; AVX512VL-NEXT:    vpaddb %ymm14, %ymm14, %ymm14
350 ; AVX512VL-NEXT:    vpblendvb %ymm14, %ymm9, %ymm0, %ymm0
351 ; AVX512VL-NEXT:    vpor %ymm6, %ymm0, %ymm0
352 ; AVX512VL-NEXT:    vpxor %xmm6, %xmm6, %xmm6
353 ; AVX512VL-NEXT:    vpcmpeqb %ymm6, %ymm4, %ymm4
354 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
355 ; AVX512VL-NEXT:    vpsrlw $4, %ymm3, %ymm2
356 ; AVX512VL-NEXT:    vpand %ymm7, %ymm2, %ymm2
357 ; AVX512VL-NEXT:    vpand %ymm8, %ymm5, %ymm4
358 ; AVX512VL-NEXT:    vpsllw $5, %ymm4, %ymm5
359 ; AVX512VL-NEXT:    vpblendvb %ymm5, %ymm2, %ymm3, %ymm2
360 ; AVX512VL-NEXT:    vpsrlw $2, %ymm2, %ymm7
361 ; AVX512VL-NEXT:    vpand %ymm11, %ymm7, %ymm7
362 ; AVX512VL-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
363 ; AVX512VL-NEXT:    vpblendvb %ymm5, %ymm7, %ymm2, %ymm2
364 ; AVX512VL-NEXT:    vpsrlw $1, %ymm2, %ymm7
365 ; AVX512VL-NEXT:    vpand %ymm12, %ymm7, %ymm7
366 ; AVX512VL-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
367 ; AVX512VL-NEXT:    vpblendvb %ymm5, %ymm7, %ymm2, %ymm2
368 ; AVX512VL-NEXT:    vpsllw $4, %ymm1, %ymm5
369 ; AVX512VL-NEXT:    vpand %ymm10, %ymm5, %ymm5
370 ; AVX512VL-NEXT:    vpsubb %ymm4, %ymm13, %ymm7
371 ; AVX512VL-NEXT:    vpsllw $5, %ymm7, %ymm7
372 ; AVX512VL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm1, %ymm1
373 ; AVX512VL-NEXT:    vpsllw $2, %ymm1, %ymm5
374 ; AVX512VL-NEXT:    vpand %ymm15, %ymm5, %ymm5
375 ; AVX512VL-NEXT:    vpaddb %ymm7, %ymm7, %ymm7
376 ; AVX512VL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm1, %ymm1
377 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm5
378 ; AVX512VL-NEXT:    vpaddb %ymm7, %ymm7, %ymm7
379 ; AVX512VL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm1, %ymm1
380 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
381 ; AVX512VL-NEXT:    vpcmpeqb %ymm6, %ymm4, %ymm2
382 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
383 ; AVX512VL-NEXT:    retq
384 ;
385 ; AVX512BW-LABEL: var_funnnel_v64i8:
386 ; AVX512BW:       # %bb.0:
387 ; AVX512BW-NEXT:    vpsrlw $4, %zmm1, %zmm3
388 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
389 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
390 ; AVX512BW-NEXT:    vpsllw $5, %zmm2, %zmm4
391 ; AVX512BW-NEXT:    vpmovb2m %zmm4, %k1
392 ; AVX512BW-NEXT:    vpblendmb %zmm3, %zmm1, %zmm3 {%k1}
393 ; AVX512BW-NEXT:    vpsrlw $2, %zmm3, %zmm5
394 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
395 ; AVX512BW-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
396 ; AVX512BW-NEXT:    vpmovb2m %zmm4, %k1
397 ; AVX512BW-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
398 ; AVX512BW-NEXT:    vpsrlw $1, %zmm3, %zmm5
399 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
400 ; AVX512BW-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
401 ; AVX512BW-NEXT:    vpmovb2m %zmm4, %k1
402 ; AVX512BW-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
403 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
404 ; AVX512BW-NEXT:    vpsubb %zmm2, %zmm4, %zmm4
405 ; AVX512BW-NEXT:    vpsllw $5, %zmm4, %zmm4
406 ; AVX512BW-NEXT:    vpaddb %zmm4, %zmm4, %zmm5
407 ; AVX512BW-NEXT:    vpmovb2m %zmm5, %k1
408 ; AVX512BW-NEXT:    vpmovb2m %zmm4, %k2
409 ; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm4
410 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
411 ; AVX512BW-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k2}
412 ; AVX512BW-NEXT:    vpsllw $2, %zmm0, %zmm4
413 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
414 ; AVX512BW-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k1}
415 ; AVX512BW-NEXT:    vpaddb %zmm5, %zmm5, %zmm4
416 ; AVX512BW-NEXT:    vpmovb2m %zmm4, %k1
417 ; AVX512BW-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
418 ; AVX512BW-NEXT:    vporq %zmm3, %zmm0, %zmm0
419 ; AVX512BW-NEXT:    vptestnmb %zmm2, %zmm2, %k1
420 ; AVX512BW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
421 ; AVX512BW-NEXT:    retq
422 ;
423 ; AVX512VBMI2-LABEL: var_funnnel_v64i8:
424 ; AVX512VBMI2:       # %bb.0:
425 ; AVX512VBMI2-NEXT:    vpsrlw $4, %zmm1, %zmm3
426 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
427 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
428 ; AVX512VBMI2-NEXT:    vpsllw $5, %zmm2, %zmm4
429 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm4, %k1
430 ; AVX512VBMI2-NEXT:    vpblendmb %zmm3, %zmm1, %zmm3 {%k1}
431 ; AVX512VBMI2-NEXT:    vpsrlw $2, %zmm3, %zmm5
432 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
433 ; AVX512VBMI2-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
434 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm4, %k1
435 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
436 ; AVX512VBMI2-NEXT:    vpsrlw $1, %zmm3, %zmm5
437 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
438 ; AVX512VBMI2-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
439 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm4, %k1
440 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
441 ; AVX512VBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
442 ; AVX512VBMI2-NEXT:    vpsubb %zmm2, %zmm4, %zmm4
443 ; AVX512VBMI2-NEXT:    vpsllw $5, %zmm4, %zmm4
444 ; AVX512VBMI2-NEXT:    vpaddb %zmm4, %zmm4, %zmm5
445 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm5, %k1
446 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm4, %k2
447 ; AVX512VBMI2-NEXT:    vpsllw $4, %zmm0, %zmm4
448 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
449 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k2}
450 ; AVX512VBMI2-NEXT:    vpsllw $2, %zmm0, %zmm4
451 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
452 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k1}
453 ; AVX512VBMI2-NEXT:    vpaddb %zmm5, %zmm5, %zmm4
454 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm4, %k1
455 ; AVX512VBMI2-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
456 ; AVX512VBMI2-NEXT:    vporq %zmm3, %zmm0, %zmm0
457 ; AVX512VBMI2-NEXT:    vptestnmb %zmm2, %zmm2, %k1
458 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
459 ; AVX512VBMI2-NEXT:    retq
460 ;
461 ; AVX512VLBW-LABEL: var_funnnel_v64i8:
462 ; AVX512VLBW:       # %bb.0:
463 ; AVX512VLBW-NEXT:    vpsrlw $4, %zmm1, %zmm3
464 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
465 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
466 ; AVX512VLBW-NEXT:    vpsllw $5, %zmm2, %zmm4
467 ; AVX512VLBW-NEXT:    vpmovb2m %zmm4, %k1
468 ; AVX512VLBW-NEXT:    vpblendmb %zmm3, %zmm1, %zmm3 {%k1}
469 ; AVX512VLBW-NEXT:    vpsrlw $2, %zmm3, %zmm5
470 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
471 ; AVX512VLBW-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
472 ; AVX512VLBW-NEXT:    vpmovb2m %zmm4, %k1
473 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
474 ; AVX512VLBW-NEXT:    vpsrlw $1, %zmm3, %zmm5
475 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
476 ; AVX512VLBW-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
477 ; AVX512VLBW-NEXT:    vpmovb2m %zmm4, %k1
478 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
479 ; AVX512VLBW-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
480 ; AVX512VLBW-NEXT:    vpsubb %zmm2, %zmm4, %zmm4
481 ; AVX512VLBW-NEXT:    vpsllw $5, %zmm4, %zmm4
482 ; AVX512VLBW-NEXT:    vpaddb %zmm4, %zmm4, %zmm5
483 ; AVX512VLBW-NEXT:    vpmovb2m %zmm5, %k1
484 ; AVX512VLBW-NEXT:    vpmovb2m %zmm4, %k2
485 ; AVX512VLBW-NEXT:    vpsllw $4, %zmm0, %zmm4
486 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
487 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k2}
488 ; AVX512VLBW-NEXT:    vpsllw $2, %zmm0, %zmm4
489 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
490 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k1}
491 ; AVX512VLBW-NEXT:    vpaddb %zmm5, %zmm5, %zmm4
492 ; AVX512VLBW-NEXT:    vpmovb2m %zmm4, %k1
493 ; AVX512VLBW-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
494 ; AVX512VLBW-NEXT:    vporq %zmm3, %zmm0, %zmm0
495 ; AVX512VLBW-NEXT:    vptestnmb %zmm2, %zmm2, %k1
496 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
497 ; AVX512VLBW-NEXT:    retq
498 ;
499 ; AVX512VLVBMI2-LABEL: var_funnnel_v64i8:
500 ; AVX512VLVBMI2:       # %bb.0:
501 ; AVX512VLVBMI2-NEXT:    vpsrlw $4, %zmm1, %zmm3
502 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
503 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
504 ; AVX512VLVBMI2-NEXT:    vpsllw $5, %zmm2, %zmm4
505 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm4, %k1
506 ; AVX512VLVBMI2-NEXT:    vpblendmb %zmm3, %zmm1, %zmm3 {%k1}
507 ; AVX512VLVBMI2-NEXT:    vpsrlw $2, %zmm3, %zmm5
508 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
509 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
510 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm4, %k1
511 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
512 ; AVX512VLVBMI2-NEXT:    vpsrlw $1, %zmm3, %zmm5
513 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
514 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
515 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm4, %k1
516 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm5, %zmm3 {%k1}
517 ; AVX512VLVBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
518 ; AVX512VLVBMI2-NEXT:    vpsubb %zmm2, %zmm4, %zmm4
519 ; AVX512VLVBMI2-NEXT:    vpsllw $5, %zmm4, %zmm4
520 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm4, %zmm4, %zmm5
521 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm5, %k1
522 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm4, %k2
523 ; AVX512VLVBMI2-NEXT:    vpsllw $4, %zmm0, %zmm4
524 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
525 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k2}
526 ; AVX512VLVBMI2-NEXT:    vpsllw $2, %zmm0, %zmm4
527 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm4, %zmm4
528 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm4, %zmm0 {%k1}
529 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm5, %zmm5, %zmm4
530 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm4, %k1
531 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
532 ; AVX512VLVBMI2-NEXT:    vporq %zmm3, %zmm0, %zmm0
533 ; AVX512VLVBMI2-NEXT:    vptestnmb %zmm2, %zmm2, %k1
534 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
535 ; AVX512VLVBMI2-NEXT:    retq
536   %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %x, <64 x i8> %y, <64 x i8> %amt)
537   ret <64 x i8> %res
538 }
539
540 ;
541 ; Uniform Variable Shifts
542 ;
543
544 define <8 x i64> @splatvar_funnnel_v8i64(<8 x i64> %x, <8 x i64> %y, <8 x i64> %amt) nounwind {
545 ; AVX512F-LABEL: splatvar_funnnel_v8i64:
546 ; AVX512F:       # %bb.0:
547 ; AVX512F-NEXT:    vpbroadcastq %xmm2, %zmm2
548 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
549 ; AVX512F-NEXT:    vpsrlq %xmm2, %zmm1, %zmm3
550 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
551 ; AVX512F-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
552 ; AVX512F-NEXT:    vpsllq %xmm4, %zmm0, %zmm0
553 ; AVX512F-NEXT:    vporq %zmm3, %zmm0, %zmm0
554 ; AVX512F-NEXT:    vptestnmq %zmm2, %zmm2, %k1
555 ; AVX512F-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
556 ; AVX512F-NEXT:    retq
557 ;
558 ; AVX512VL-LABEL: splatvar_funnnel_v8i64:
559 ; AVX512VL:       # %bb.0:
560 ; AVX512VL-NEXT:    vpbroadcastq %xmm2, %zmm2
561 ; AVX512VL-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
562 ; AVX512VL-NEXT:    vpsrlq %xmm2, %zmm1, %zmm3
563 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
564 ; AVX512VL-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
565 ; AVX512VL-NEXT:    vpsllq %xmm4, %zmm0, %zmm0
566 ; AVX512VL-NEXT:    vporq %zmm3, %zmm0, %zmm0
567 ; AVX512VL-NEXT:    vptestnmq %zmm2, %zmm2, %k1
568 ; AVX512VL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
569 ; AVX512VL-NEXT:    retq
570 ;
571 ; AVX512BW-LABEL: splatvar_funnnel_v8i64:
572 ; AVX512BW:       # %bb.0:
573 ; AVX512BW-NEXT:    vpbroadcastq %xmm2, %zmm2
574 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
575 ; AVX512BW-NEXT:    vpsrlq %xmm2, %zmm1, %zmm3
576 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
577 ; AVX512BW-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
578 ; AVX512BW-NEXT:    vpsllq %xmm4, %zmm0, %zmm0
579 ; AVX512BW-NEXT:    vporq %zmm3, %zmm0, %zmm0
580 ; AVX512BW-NEXT:    vptestnmq %zmm2, %zmm2, %k1
581 ; AVX512BW-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
582 ; AVX512BW-NEXT:    retq
583 ;
584 ; AVX512VBMI2-LABEL: splatvar_funnnel_v8i64:
585 ; AVX512VBMI2:       # %bb.0:
586 ; AVX512VBMI2-NEXT:    vpbroadcastq %xmm2, %zmm2
587 ; AVX512VBMI2-NEXT:    vpshrdvq %zmm2, %zmm0, %zmm1
588 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
589 ; AVX512VBMI2-NEXT:    retq
590 ;
591 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i64:
592 ; AVX512VLBW:       # %bb.0:
593 ; AVX512VLBW-NEXT:    vpbroadcastq %xmm2, %zmm2
594 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
595 ; AVX512VLBW-NEXT:    vpsrlq %xmm2, %zmm1, %zmm3
596 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
597 ; AVX512VLBW-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
598 ; AVX512VLBW-NEXT:    vpsllq %xmm4, %zmm0, %zmm0
599 ; AVX512VLBW-NEXT:    vporq %zmm3, %zmm0, %zmm0
600 ; AVX512VLBW-NEXT:    vptestnmq %zmm2, %zmm2, %k1
601 ; AVX512VLBW-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
602 ; AVX512VLBW-NEXT:    retq
603 ;
604 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i64:
605 ; AVX512VLVBMI2:       # %bb.0:
606 ; AVX512VLVBMI2-NEXT:    vpbroadcastq %xmm2, %zmm2
607 ; AVX512VLVBMI2-NEXT:    vpshrdvq %zmm2, %zmm0, %zmm1
608 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
609 ; AVX512VLVBMI2-NEXT:    retq
610   %splat = shufflevector <8 x i64> %amt, <8 x i64> undef, <8 x i32> zeroinitializer
611   %res = call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %x, <8 x i64> %y, <8 x i64> %splat)
612   ret <8 x i64> %res
613 }
614
615 define <16 x i32> @splatvar_funnnel_v16i32(<16 x i32> %x, <16 x i32> %y, <16 x i32> %amt) nounwind {
616 ; AVX512F-LABEL: splatvar_funnnel_v16i32:
617 ; AVX512F:       # %bb.0:
618 ; AVX512F-NEXT:    vpbroadcastd %xmm2, %zmm2
619 ; AVX512F-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
620 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
621 ; AVX512F-NEXT:    vpsrld %xmm3, %zmm1, %zmm3
622 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
623 ; AVX512F-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
624 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
625 ; AVX512F-NEXT:    vpslld %xmm4, %zmm0, %zmm0
626 ; AVX512F-NEXT:    vpord %zmm3, %zmm0, %zmm0
627 ; AVX512F-NEXT:    vptestnmd %zmm2, %zmm2, %k1
628 ; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
629 ; AVX512F-NEXT:    retq
630 ;
631 ; AVX512VL-LABEL: splatvar_funnnel_v16i32:
632 ; AVX512VL:       # %bb.0:
633 ; AVX512VL-NEXT:    vpbroadcastd %xmm2, %zmm2
634 ; AVX512VL-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
635 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
636 ; AVX512VL-NEXT:    vpsrld %xmm3, %zmm1, %zmm3
637 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
638 ; AVX512VL-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
639 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
640 ; AVX512VL-NEXT:    vpslld %xmm4, %zmm0, %zmm0
641 ; AVX512VL-NEXT:    vpord %zmm3, %zmm0, %zmm0
642 ; AVX512VL-NEXT:    vptestnmd %zmm2, %zmm2, %k1
643 ; AVX512VL-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
644 ; AVX512VL-NEXT:    retq
645 ;
646 ; AVX512BW-LABEL: splatvar_funnnel_v16i32:
647 ; AVX512BW:       # %bb.0:
648 ; AVX512BW-NEXT:    vpbroadcastd %xmm2, %zmm2
649 ; AVX512BW-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
650 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
651 ; AVX512BW-NEXT:    vpsrld %xmm3, %zmm1, %zmm3
652 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
653 ; AVX512BW-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
654 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
655 ; AVX512BW-NEXT:    vpslld %xmm4, %zmm0, %zmm0
656 ; AVX512BW-NEXT:    vpord %zmm3, %zmm0, %zmm0
657 ; AVX512BW-NEXT:    vptestnmd %zmm2, %zmm2, %k1
658 ; AVX512BW-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
659 ; AVX512BW-NEXT:    retq
660 ;
661 ; AVX512VBMI2-LABEL: splatvar_funnnel_v16i32:
662 ; AVX512VBMI2:       # %bb.0:
663 ; AVX512VBMI2-NEXT:    vpbroadcastd %xmm2, %zmm2
664 ; AVX512VBMI2-NEXT:    vpshrdvd %zmm2, %zmm0, %zmm1
665 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
666 ; AVX512VBMI2-NEXT:    retq
667 ;
668 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i32:
669 ; AVX512VLBW:       # %bb.0:
670 ; AVX512VLBW-NEXT:    vpbroadcastd %xmm2, %zmm2
671 ; AVX512VLBW-NEXT:    vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2
672 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
673 ; AVX512VLBW-NEXT:    vpsrld %xmm3, %zmm1, %zmm3
674 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
675 ; AVX512VLBW-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
676 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
677 ; AVX512VLBW-NEXT:    vpslld %xmm4, %zmm0, %zmm0
678 ; AVX512VLBW-NEXT:    vpord %zmm3, %zmm0, %zmm0
679 ; AVX512VLBW-NEXT:    vptestnmd %zmm2, %zmm2, %k1
680 ; AVX512VLBW-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
681 ; AVX512VLBW-NEXT:    retq
682 ;
683 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i32:
684 ; AVX512VLVBMI2:       # %bb.0:
685 ; AVX512VLVBMI2-NEXT:    vpbroadcastd %xmm2, %zmm2
686 ; AVX512VLVBMI2-NEXT:    vpshrdvd %zmm2, %zmm0, %zmm1
687 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
688 ; AVX512VLVBMI2-NEXT:    retq
689   %splat = shufflevector <16 x i32> %amt, <16 x i32> undef, <16 x i32> zeroinitializer
690   %res = call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %x, <16 x i32> %y, <16 x i32> %splat)
691   ret <16 x i32> %res
692 }
693
694 define <32 x i16> @splatvar_funnnel_v32i16(<32 x i16> %x, <32 x i16> %y, <32 x i16> %amt) nounwind {
695 ; AVX512F-LABEL: splatvar_funnnel_v32i16:
696 ; AVX512F:       # %bb.0:
697 ; AVX512F-NEXT:    vpbroadcastw %xmm4, %ymm4
698 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
699 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
700 ; AVX512F-NEXT:    vpsrlw %xmm5, %ymm2, %ymm6
701 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm7 = [16,16,16,16,16,16,16,16]
702 ; AVX512F-NEXT:    vpsubw %xmm4, %xmm7, %xmm7
703 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero
704 ; AVX512F-NEXT:    vpsllw %xmm7, %ymm0, %ymm0
705 ; AVX512F-NEXT:    vpor %ymm6, %ymm0, %ymm0
706 ; AVX512F-NEXT:    vpxor %xmm6, %xmm6, %xmm6
707 ; AVX512F-NEXT:    vpcmpeqw %ymm6, %ymm4, %ymm4
708 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
709 ; AVX512F-NEXT:    vpsrlw %xmm5, %ymm3, %ymm2
710 ; AVX512F-NEXT:    vpsllw %xmm7, %ymm1, %ymm1
711 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
712 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm3, %ymm1, %ymm1
713 ; AVX512F-NEXT:    retq
714 ;
715 ; AVX512VL-LABEL: splatvar_funnnel_v32i16:
716 ; AVX512VL:       # %bb.0:
717 ; AVX512VL-NEXT:    vpbroadcastw %xmm4, %ymm4
718 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
719 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
720 ; AVX512VL-NEXT:    vpsrlw %xmm5, %ymm2, %ymm6
721 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm7 = [16,16,16,16,16,16,16,16]
722 ; AVX512VL-NEXT:    vpsubw %xmm4, %xmm7, %xmm7
723 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero
724 ; AVX512VL-NEXT:    vpsllw %xmm7, %ymm0, %ymm0
725 ; AVX512VL-NEXT:    vpor %ymm6, %ymm0, %ymm0
726 ; AVX512VL-NEXT:    vpxor %xmm6, %xmm6, %xmm6
727 ; AVX512VL-NEXT:    vpcmpeqw %ymm6, %ymm4, %ymm4
728 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
729 ; AVX512VL-NEXT:    vpsrlw %xmm5, %ymm3, %ymm2
730 ; AVX512VL-NEXT:    vpsllw %xmm7, %ymm1, %ymm1
731 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
732 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm3, %ymm1, %ymm1
733 ; AVX512VL-NEXT:    retq
734 ;
735 ; AVX512BW-LABEL: splatvar_funnnel_v32i16:
736 ; AVX512BW:       # %bb.0:
737 ; AVX512BW-NEXT:    vpbroadcastw %xmm2, %zmm2
738 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
739 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
740 ; AVX512BW-NEXT:    vpsrlw %xmm3, %zmm1, %zmm3
741 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
742 ; AVX512BW-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
743 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
744 ; AVX512BW-NEXT:    vpsllw %xmm4, %zmm0, %zmm0
745 ; AVX512BW-NEXT:    vporq %zmm3, %zmm0, %zmm0
746 ; AVX512BW-NEXT:    vptestnmw %zmm2, %zmm2, %k1
747 ; AVX512BW-NEXT:    vmovdqu16 %zmm1, %zmm0 {%k1}
748 ; AVX512BW-NEXT:    retq
749 ;
750 ; AVX512VBMI2-LABEL: splatvar_funnnel_v32i16:
751 ; AVX512VBMI2:       # %bb.0:
752 ; AVX512VBMI2-NEXT:    vpbroadcastw %xmm2, %zmm2
753 ; AVX512VBMI2-NEXT:    vpshrdvw %zmm2, %zmm0, %zmm1
754 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
755 ; AVX512VBMI2-NEXT:    retq
756 ;
757 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i16:
758 ; AVX512VLBW:       # %bb.0:
759 ; AVX512VLBW-NEXT:    vpbroadcastw %xmm2, %zmm2
760 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
761 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
762 ; AVX512VLBW-NEXT:    vpsrlw %xmm3, %zmm1, %zmm3
763 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
764 ; AVX512VLBW-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
765 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
766 ; AVX512VLBW-NEXT:    vpsllw %xmm4, %zmm0, %zmm0
767 ; AVX512VLBW-NEXT:    vporq %zmm3, %zmm0, %zmm0
768 ; AVX512VLBW-NEXT:    vptestnmw %zmm2, %zmm2, %k1
769 ; AVX512VLBW-NEXT:    vmovdqu16 %zmm1, %zmm0 {%k1}
770 ; AVX512VLBW-NEXT:    retq
771 ;
772 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v32i16:
773 ; AVX512VLVBMI2:       # %bb.0:
774 ; AVX512VLVBMI2-NEXT:    vpbroadcastw %xmm2, %zmm2
775 ; AVX512VLVBMI2-NEXT:    vpshrdvw %zmm2, %zmm0, %zmm1
776 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
777 ; AVX512VLVBMI2-NEXT:    retq
778   %splat = shufflevector <32 x i16> %amt, <32 x i16> undef, <32 x i32> zeroinitializer
779   %res = call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %x, <32 x i16> %y, <32 x i16> %splat)
780   ret <32 x i16> %res
781 }
782
783 define <64 x i8> @splatvar_funnnel_v64i8(<64 x i8> %x, <64 x i8> %y, <64 x i8> %amt) nounwind {
784 ; AVX512F-LABEL: splatvar_funnnel_v64i8:
785 ; AVX512F:       # %bb.0:
786 ; AVX512F-NEXT:    vpbroadcastb %xmm4, %ymm4
787 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
788 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
789 ; AVX512F-NEXT:    vpsrlw %xmm5, %ymm2, %ymm6
790 ; AVX512F-NEXT:    vpcmpeqd %ymm9, %ymm9, %ymm9
791 ; AVX512F-NEXT:    vpsrlw %xmm5, %ymm9, %ymm8
792 ; AVX512F-NEXT:    vpsrlw $8, %ymm8, %ymm8
793 ; AVX512F-NEXT:    vpbroadcastb %xmm8, %ymm8
794 ; AVX512F-NEXT:    vpand %ymm8, %ymm6, %ymm6
795 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm7 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
796 ; AVX512F-NEXT:    vpsubb %xmm4, %xmm7, %xmm7
797 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,zero,zero,zero,zero,xmm7[1],zero,zero,zero,zero,zero,zero,zero
798 ; AVX512F-NEXT:    vpsllw %xmm7, %ymm0, %ymm0
799 ; AVX512F-NEXT:    vpsllw %xmm7, %ymm9, %ymm9
800 ; AVX512F-NEXT:    vpbroadcastb %xmm9, %ymm9
801 ; AVX512F-NEXT:    vpand %ymm9, %ymm0, %ymm0
802 ; AVX512F-NEXT:    vpor %ymm6, %ymm0, %ymm0
803 ; AVX512F-NEXT:    vpxor %xmm6, %xmm6, %xmm6
804 ; AVX512F-NEXT:    vpcmpeqb %ymm6, %ymm4, %ymm4
805 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
806 ; AVX512F-NEXT:    vpsrlw %xmm5, %ymm3, %ymm2
807 ; AVX512F-NEXT:    vpand %ymm8, %ymm2, %ymm2
808 ; AVX512F-NEXT:    vpsllw %xmm7, %ymm1, %ymm1
809 ; AVX512F-NEXT:    vpand %ymm9, %ymm1, %ymm1
810 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
811 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm3, %ymm1, %ymm1
812 ; AVX512F-NEXT:    retq
813 ;
814 ; AVX512VL-LABEL: splatvar_funnnel_v64i8:
815 ; AVX512VL:       # %bb.0:
816 ; AVX512VL-NEXT:    vpbroadcastb %xmm4, %ymm4
817 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
818 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
819 ; AVX512VL-NEXT:    vpsrlw %xmm5, %ymm2, %ymm6
820 ; AVX512VL-NEXT:    vpcmpeqd %ymm9, %ymm9, %ymm9
821 ; AVX512VL-NEXT:    vpsrlw %xmm5, %ymm9, %ymm8
822 ; AVX512VL-NEXT:    vpsrlw $8, %ymm8, %ymm8
823 ; AVX512VL-NEXT:    vpbroadcastb %xmm8, %ymm8
824 ; AVX512VL-NEXT:    vpand %ymm8, %ymm6, %ymm6
825 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm7 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
826 ; AVX512VL-NEXT:    vpsubb %xmm4, %xmm7, %xmm7
827 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,zero,zero,zero,zero,xmm7[1],zero,zero,zero,zero,zero,zero,zero
828 ; AVX512VL-NEXT:    vpsllw %xmm7, %ymm0, %ymm0
829 ; AVX512VL-NEXT:    vpsllw %xmm7, %ymm9, %ymm9
830 ; AVX512VL-NEXT:    vpbroadcastb %xmm9, %ymm9
831 ; AVX512VL-NEXT:    vpand %ymm9, %ymm0, %ymm0
832 ; AVX512VL-NEXT:    vpor %ymm6, %ymm0, %ymm0
833 ; AVX512VL-NEXT:    vpxor %xmm6, %xmm6, %xmm6
834 ; AVX512VL-NEXT:    vpcmpeqb %ymm6, %ymm4, %ymm4
835 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
836 ; AVX512VL-NEXT:    vpsrlw %xmm5, %ymm3, %ymm2
837 ; AVX512VL-NEXT:    vpand %ymm8, %ymm2, %ymm2
838 ; AVX512VL-NEXT:    vpsllw %xmm7, %ymm1, %ymm1
839 ; AVX512VL-NEXT:    vpand %ymm9, %ymm1, %ymm1
840 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
841 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm3, %ymm1, %ymm1
842 ; AVX512VL-NEXT:    retq
843 ;
844 ; AVX512BW-LABEL: splatvar_funnnel_v64i8:
845 ; AVX512BW:       # %bb.0:
846 ; AVX512BW-NEXT:    vpbroadcastb %xmm2, %zmm2
847 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
848 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
849 ; AVX512BW-NEXT:    vpsrlw %xmm3, %zmm1, %zmm4
850 ; AVX512BW-NEXT:    vpternlogd $255, %zmm5, %zmm5, %zmm5
851 ; AVX512BW-NEXT:    vpsrlw %xmm3, %zmm5, %zmm3
852 ; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3
853 ; AVX512BW-NEXT:    vpbroadcastb %xmm3, %zmm3
854 ; AVX512BW-NEXT:    vpandq %zmm3, %zmm4, %zmm3
855 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
856 ; AVX512BW-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
857 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
858 ; AVX512BW-NEXT:    vpsllw %xmm4, %zmm0, %zmm0
859 ; AVX512BW-NEXT:    vpsllw %xmm4, %zmm5, %zmm4
860 ; AVX512BW-NEXT:    vpbroadcastb %xmm4, %zmm4
861 ; AVX512BW-NEXT:    vpandq %zmm4, %zmm0, %zmm0
862 ; AVX512BW-NEXT:    vporq %zmm3, %zmm0, %zmm0
863 ; AVX512BW-NEXT:    vptestnmb %zmm2, %zmm2, %k1
864 ; AVX512BW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
865 ; AVX512BW-NEXT:    retq
866 ;
867 ; AVX512VBMI2-LABEL: splatvar_funnnel_v64i8:
868 ; AVX512VBMI2:       # %bb.0:
869 ; AVX512VBMI2-NEXT:    vpbroadcastb %xmm2, %zmm2
870 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
871 ; AVX512VBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
872 ; AVX512VBMI2-NEXT:    vpsrlw %xmm3, %zmm1, %zmm4
873 ; AVX512VBMI2-NEXT:    vpternlogd $255, %zmm5, %zmm5, %zmm5
874 ; AVX512VBMI2-NEXT:    vpsrlw %xmm3, %zmm5, %zmm3
875 ; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3
876 ; AVX512VBMI2-NEXT:    vpbroadcastb %xmm3, %zmm3
877 ; AVX512VBMI2-NEXT:    vpandq %zmm3, %zmm4, %zmm3
878 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
879 ; AVX512VBMI2-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
880 ; AVX512VBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
881 ; AVX512VBMI2-NEXT:    vpsllw %xmm4, %zmm0, %zmm0
882 ; AVX512VBMI2-NEXT:    vpsllw %xmm4, %zmm5, %zmm4
883 ; AVX512VBMI2-NEXT:    vpbroadcastb %xmm4, %zmm4
884 ; AVX512VBMI2-NEXT:    vpandq %zmm4, %zmm0, %zmm0
885 ; AVX512VBMI2-NEXT:    vporq %zmm3, %zmm0, %zmm0
886 ; AVX512VBMI2-NEXT:    vptestnmb %zmm2, %zmm2, %k1
887 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
888 ; AVX512VBMI2-NEXT:    retq
889 ;
890 ; AVX512VLBW-LABEL: splatvar_funnnel_v64i8:
891 ; AVX512VLBW:       # %bb.0:
892 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm2, %zmm2
893 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
894 ; AVX512VLBW-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
895 ; AVX512VLBW-NEXT:    vpsrlw %xmm3, %zmm1, %zmm4
896 ; AVX512VLBW-NEXT:    vpternlogd $255, %zmm5, %zmm5, %zmm5
897 ; AVX512VLBW-NEXT:    vpsrlw %xmm3, %zmm5, %zmm3
898 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm3, %zmm3
899 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm3, %zmm3
900 ; AVX512VLBW-NEXT:    vpandq %zmm3, %zmm4, %zmm3
901 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
902 ; AVX512VLBW-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
903 ; AVX512VLBW-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
904 ; AVX512VLBW-NEXT:    vpsllw %xmm4, %zmm0, %zmm0
905 ; AVX512VLBW-NEXT:    vpsllw %xmm4, %zmm5, %zmm4
906 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm4, %zmm4
907 ; AVX512VLBW-NEXT:    vpandq %zmm4, %zmm0, %zmm0
908 ; AVX512VLBW-NEXT:    vporq %zmm3, %zmm0, %zmm0
909 ; AVX512VLBW-NEXT:    vptestnmb %zmm2, %zmm2, %k1
910 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
911 ; AVX512VLBW-NEXT:    retq
912 ;
913 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v64i8:
914 ; AVX512VLVBMI2:       # %bb.0:
915 ; AVX512VLVBMI2-NEXT:    vpbroadcastb %xmm2, %zmm2
916 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
917 ; AVX512VLVBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
918 ; AVX512VLVBMI2-NEXT:    vpsrlw %xmm3, %zmm1, %zmm4
919 ; AVX512VLVBMI2-NEXT:    vpternlogd $255, %zmm5, %zmm5, %zmm5
920 ; AVX512VLVBMI2-NEXT:    vpsrlw %xmm3, %zmm5, %zmm3
921 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3
922 ; AVX512VLVBMI2-NEXT:    vpbroadcastb %xmm3, %zmm3
923 ; AVX512VLVBMI2-NEXT:    vpandq %zmm3, %zmm4, %zmm3
924 ; AVX512VLVBMI2-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
925 ; AVX512VLVBMI2-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
926 ; AVX512VLVBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
927 ; AVX512VLVBMI2-NEXT:    vpsllw %xmm4, %zmm0, %zmm0
928 ; AVX512VLVBMI2-NEXT:    vpsllw %xmm4, %zmm5, %zmm4
929 ; AVX512VLVBMI2-NEXT:    vpbroadcastb %xmm4, %zmm4
930 ; AVX512VLVBMI2-NEXT:    vpandq %zmm4, %zmm0, %zmm0
931 ; AVX512VLVBMI2-NEXT:    vporq %zmm3, %zmm0, %zmm0
932 ; AVX512VLVBMI2-NEXT:    vptestnmb %zmm2, %zmm2, %k1
933 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
934 ; AVX512VLVBMI2-NEXT:    retq
935   %splat = shufflevector <64 x i8> %amt, <64 x i8> undef, <64 x i32> zeroinitializer
936   %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %x, <64 x i8> %y, <64 x i8> %splat)
937   ret <64 x i8> %res
938 }
939
940 ;
941 ; Constant Shifts
942 ;
943
944 define <8 x i64> @constant_funnnel_v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
945 ; AVX512F-LABEL: constant_funnnel_v8i64:
946 ; AVX512F:       # %bb.0:
947 ; AVX512F-NEXT:    vpsrlvq {{.*}}(%rip), %zmm1, %zmm1
948 ; AVX512F-NEXT:    vpsllvq {{.*}}(%rip), %zmm0, %zmm0
949 ; AVX512F-NEXT:    vporq %zmm1, %zmm0, %zmm0
950 ; AVX512F-NEXT:    retq
951 ;
952 ; AVX512VL-LABEL: constant_funnnel_v8i64:
953 ; AVX512VL:       # %bb.0:
954 ; AVX512VL-NEXT:    vpsrlvq {{.*}}(%rip), %zmm1, %zmm1
955 ; AVX512VL-NEXT:    vpsllvq {{.*}}(%rip), %zmm0, %zmm0
956 ; AVX512VL-NEXT:    vporq %zmm1, %zmm0, %zmm0
957 ; AVX512VL-NEXT:    retq
958 ;
959 ; AVX512BW-LABEL: constant_funnnel_v8i64:
960 ; AVX512BW:       # %bb.0:
961 ; AVX512BW-NEXT:    vpsrlvq {{.*}}(%rip), %zmm1, %zmm1
962 ; AVX512BW-NEXT:    vpsllvq {{.*}}(%rip), %zmm0, %zmm0
963 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
964 ; AVX512BW-NEXT:    retq
965 ;
966 ; AVX512VBMI2-LABEL: constant_funnnel_v8i64:
967 ; AVX512VBMI2:       # %bb.0:
968 ; AVX512VBMI2-NEXT:    vpshrdvq {{.*}}(%rip), %zmm0, %zmm1
969 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
970 ; AVX512VBMI2-NEXT:    retq
971 ;
972 ; AVX512VLBW-LABEL: constant_funnnel_v8i64:
973 ; AVX512VLBW:       # %bb.0:
974 ; AVX512VLBW-NEXT:    vpsrlvq {{.*}}(%rip), %zmm1, %zmm1
975 ; AVX512VLBW-NEXT:    vpsllvq {{.*}}(%rip), %zmm0, %zmm0
976 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
977 ; AVX512VLBW-NEXT:    retq
978 ;
979 ; AVX512VLVBMI2-LABEL: constant_funnnel_v8i64:
980 ; AVX512VLVBMI2:       # %bb.0:
981 ; AVX512VLVBMI2-NEXT:    vpshrdvq {{.*}}(%rip), %zmm0, %zmm1
982 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
983 ; AVX512VLVBMI2-NEXT:    retq
984   %res = call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %x, <8 x i64> %y, <8 x i64> <i64 4, i64 14, i64 50, i64 60, i64 4, i64 14, i64 50, i64 60>)
985   ret <8 x i64> %res
986 }
987
988 define <16 x i32> @constant_funnnel_v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
989 ; AVX512F-LABEL: constant_funnnel_v16i32:
990 ; AVX512F:       # %bb.0:
991 ; AVX512F-NEXT:    vpsrlvd {{.*}}(%rip), %zmm1, %zmm1
992 ; AVX512F-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
993 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
994 ; AVX512F-NEXT:    retq
995 ;
996 ; AVX512VL-LABEL: constant_funnnel_v16i32:
997 ; AVX512VL:       # %bb.0:
998 ; AVX512VL-NEXT:    vpsrlvd {{.*}}(%rip), %zmm1, %zmm1
999 ; AVX512VL-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
1000 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
1001 ; AVX512VL-NEXT:    retq
1002 ;
1003 ; AVX512BW-LABEL: constant_funnnel_v16i32:
1004 ; AVX512BW:       # %bb.0:
1005 ; AVX512BW-NEXT:    vpsrlvd {{.*}}(%rip), %zmm1, %zmm1
1006 ; AVX512BW-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
1007 ; AVX512BW-NEXT:    vpord %zmm1, %zmm0, %zmm0
1008 ; AVX512BW-NEXT:    retq
1009 ;
1010 ; AVX512VBMI2-LABEL: constant_funnnel_v16i32:
1011 ; AVX512VBMI2:       # %bb.0:
1012 ; AVX512VBMI2-NEXT:    vpshrdvd {{.*}}(%rip), %zmm0, %zmm1
1013 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
1014 ; AVX512VBMI2-NEXT:    retq
1015 ;
1016 ; AVX512VLBW-LABEL: constant_funnnel_v16i32:
1017 ; AVX512VLBW:       # %bb.0:
1018 ; AVX512VLBW-NEXT:    vpsrlvd {{.*}}(%rip), %zmm1, %zmm1
1019 ; AVX512VLBW-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
1020 ; AVX512VLBW-NEXT:    vpord %zmm1, %zmm0, %zmm0
1021 ; AVX512VLBW-NEXT:    retq
1022 ;
1023 ; AVX512VLVBMI2-LABEL: constant_funnnel_v16i32:
1024 ; AVX512VLVBMI2:       # %bb.0:
1025 ; AVX512VLVBMI2-NEXT:    vpshrdvd {{.*}}(%rip), %zmm0, %zmm1
1026 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
1027 ; AVX512VLVBMI2-NEXT:    retq
1028   %res = call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %x, <16 x i32> %y, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>)
1029   ret <16 x i32> %res
1030 }
1031
1032 define <32 x i16> @constant_funnnel_v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
1033 ; AVX512F-LABEL: constant_funnnel_v32i16:
1034 ; AVX512F:       # %bb.0:
1035 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = <u,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2>
1036 ; AVX512F-NEXT:    vpmulhuw %ymm4, %ymm2, %ymm5
1037 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm6 = ymm2[0],ymm5[1,2,3,4,5,6,7],ymm2[8],ymm5[9,10,11,12,13,14,15]
1038 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm5 = ymm6[0,1,2,3],ymm5[4,5,6,7]
1039 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
1040 ; AVX512F-NEXT:    vpor %ymm5, %ymm0, %ymm0
1041 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm2 = ymm2[0],ymm0[1,2,3,4,5,6,7],ymm2[8],ymm0[9,10,11,12,13,14,15]
1042 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
1043 ; AVX512F-NEXT:    vpmulhuw %ymm4, %ymm3, %ymm2
1044 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm5 = ymm3[0],ymm2[1,2,3,4,5,6,7],ymm3[8],ymm2[9,10,11,12,13,14,15]
1045 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm2 = ymm5[0,1,2,3],ymm2[4,5,6,7]
1046 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
1047 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
1048 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm2 = ymm3[0],ymm1[1,2,3,4,5,6,7],ymm3[8],ymm1[9,10,11,12,13,14,15]
1049 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1050 ; AVX512F-NEXT:    retq
1051 ;
1052 ; AVX512VL-LABEL: constant_funnnel_v32i16:
1053 ; AVX512VL:       # %bb.0:
1054 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = <u,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2>
1055 ; AVX512VL-NEXT:    vpmulhuw %ymm4, %ymm2, %ymm5
1056 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm6 = ymm2[0],ymm5[1,2,3,4,5,6,7],ymm2[8],ymm5[9,10,11,12,13,14,15]
1057 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm5 = ymm6[0,1,2,3],ymm5[4,5,6,7]
1058 ; AVX512VL-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
1059 ; AVX512VL-NEXT:    vpor %ymm5, %ymm0, %ymm0
1060 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm2 = ymm2[0],ymm0[1,2,3,4,5,6,7],ymm2[8],ymm0[9,10,11,12,13,14,15]
1061 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
1062 ; AVX512VL-NEXT:    vpmulhuw %ymm4, %ymm3, %ymm2
1063 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm5 = ymm3[0],ymm2[1,2,3,4,5,6,7],ymm3[8],ymm2[9,10,11,12,13,14,15]
1064 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm5[0,1,2,3],ymm2[4,5,6,7]
1065 ; AVX512VL-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
1066 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
1067 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm2 = ymm3[0],ymm1[1,2,3,4,5,6,7],ymm3[8],ymm1[9,10,11,12,13,14,15]
1068 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1069 ; AVX512VL-NEXT:    retq
1070 ;
1071 ; AVX512BW-LABEL: constant_funnnel_v32i16:
1072 ; AVX512BW:       # %bb.0:
1073 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm2
1074 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1075 ; AVX512BW-NEXT:    vporq %zmm2, %zmm0, %zmm0
1076 ; AVX512BW-NEXT:    movl $65537, %eax # imm = 0x10001
1077 ; AVX512BW-NEXT:    kmovd %eax, %k1
1078 ; AVX512BW-NEXT:    vmovdqu16 %zmm1, %zmm0 {%k1}
1079 ; AVX512BW-NEXT:    retq
1080 ;
1081 ; AVX512VBMI2-LABEL: constant_funnnel_v32i16:
1082 ; AVX512VBMI2:       # %bb.0:
1083 ; AVX512VBMI2-NEXT:    vpshrdvw {{.*}}(%rip), %zmm0, %zmm1
1084 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
1085 ; AVX512VBMI2-NEXT:    retq
1086 ;
1087 ; AVX512VLBW-LABEL: constant_funnnel_v32i16:
1088 ; AVX512VLBW:       # %bb.0:
1089 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm2
1090 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1091 ; AVX512VLBW-NEXT:    vporq %zmm2, %zmm0, %zmm0
1092 ; AVX512VLBW-NEXT:    movl $65537, %eax # imm = 0x10001
1093 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1094 ; AVX512VLBW-NEXT:    vmovdqu16 %zmm1, %zmm0 {%k1}
1095 ; AVX512VLBW-NEXT:    retq
1096 ;
1097 ; AVX512VLVBMI2-LABEL: constant_funnnel_v32i16:
1098 ; AVX512VLVBMI2:       # %bb.0:
1099 ; AVX512VLVBMI2-NEXT:    vpshrdvw {{.*}}(%rip), %zmm0, %zmm1
1100 ; AVX512VLVBMI2-NEXT:    vmovdqa64 %zmm1, %zmm0
1101 ; AVX512VLVBMI2-NEXT:    retq
1102   %res = call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %x, <32 x i16> %y, <32 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>)
1103   ret <32 x i16> %res
1104 }
1105
1106 define <64 x i8> @constant_funnnel_v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
1107 ; AVX512F-LABEL: constant_funnnel_v64i8:
1108 ; AVX512F:       # %bb.0:
1109 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm4
1110 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm5 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1111 ; AVX512F-NEXT:    vpand %ymm5, %ymm4, %ymm4
1112 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm6 = [57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536]
1113 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm4, %ymm0, %ymm0
1114 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm4
1115 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm7 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1116 ; AVX512F-NEXT:    vpand %ymm7, %ymm4, %ymm4
1117 ; AVX512F-NEXT:    vpaddb %ymm6, %ymm6, %ymm8
1118 ; AVX512F-NEXT:    vpblendvb %ymm8, %ymm4, %ymm0, %ymm0
1119 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm4
1120 ; AVX512F-NEXT:    vpaddb %ymm8, %ymm8, %ymm9
1121 ; AVX512F-NEXT:    vpblendvb %ymm9, %ymm4, %ymm0, %ymm0
1122 ; AVX512F-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1123 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm10 = ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15],ymm2[24],ymm4[24],ymm2[25],ymm4[25],ymm2[26],ymm4[26],ymm2[27],ymm4[27],ymm2[28],ymm4[28],ymm2[29],ymm4[29],ymm2[30],ymm4[30],ymm2[31],ymm4[31]
1124 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm11 = [256,2,4,8,16,32,64,128,256,2,4,8,16,32,64,128]
1125 ; AVX512F-NEXT:    # ymm11 = mem[0,1,0,1]
1126 ; AVX512F-NEXT:    vpmullw %ymm11, %ymm10, %ymm10
1127 ; AVX512F-NEXT:    vpsrlw $8, %ymm10, %ymm10
1128 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm12 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[16],ymm4[16],ymm2[17],ymm4[17],ymm2[18],ymm4[18],ymm2[19],ymm4[19],ymm2[20],ymm4[20],ymm2[21],ymm4[21],ymm2[22],ymm4[22],ymm2[23],ymm4[23]
1129 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm13 = [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]
1130 ; AVX512F-NEXT:    # ymm13 = mem[0,1,0,1]
1131 ; AVX512F-NEXT:    vpmullw %ymm13, %ymm12, %ymm12
1132 ; AVX512F-NEXT:    vpsrlw $8, %ymm12, %ymm12
1133 ; AVX512F-NEXT:    vpackuswb %ymm10, %ymm12, %ymm10
1134 ; AVX512F-NEXT:    vpor %ymm10, %ymm0, %ymm0
1135 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm10 = [18446744073709551360,18446744073709551360,18446744073709551360,18446744073709551360]
1136 ; AVX512F-NEXT:    vpblendvb %ymm10, %ymm0, %ymm2, %ymm0
1137 ; AVX512F-NEXT:    vpsllw $4, %ymm1, %ymm2
1138 ; AVX512F-NEXT:    vpand %ymm5, %ymm2, %ymm2
1139 ; AVX512F-NEXT:    vpblendvb %ymm6, %ymm2, %ymm1, %ymm1
1140 ; AVX512F-NEXT:    vpsllw $2, %ymm1, %ymm2
1141 ; AVX512F-NEXT:    vpand %ymm7, %ymm2, %ymm2
1142 ; AVX512F-NEXT:    vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
1143 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm2
1144 ; AVX512F-NEXT:    vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
1145 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15],ymm3[24],ymm4[24],ymm3[25],ymm4[25],ymm3[26],ymm4[26],ymm3[27],ymm4[27],ymm3[28],ymm4[28],ymm3[29],ymm4[29],ymm3[30],ymm4[30],ymm3[31],ymm4[31]
1146 ; AVX512F-NEXT:    vpmullw %ymm11, %ymm2, %ymm2
1147 ; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2
1148 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm4 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[16],ymm4[16],ymm3[17],ymm4[17],ymm3[18],ymm4[18],ymm3[19],ymm4[19],ymm3[20],ymm4[20],ymm3[21],ymm4[21],ymm3[22],ymm4[22],ymm3[23],ymm4[23]
1149 ; AVX512F-NEXT:    vpmullw %ymm13, %ymm4, %ymm4
1150 ; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4
1151 ; AVX512F-NEXT:    vpackuswb %ymm2, %ymm4, %ymm2
1152 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
1153 ; AVX512F-NEXT:    vpblendvb %ymm10, %ymm1, %ymm3, %ymm1
1154 ; AVX512F-NEXT:    retq
1155 ;
1156 ; AVX512VL-LABEL: constant_funnnel_v64i8:
1157 ; AVX512VL:       # %bb.0:
1158 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm4
1159 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm5 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1160 ; AVX512VL-NEXT:    vpand %ymm5, %ymm4, %ymm4
1161 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm6 = [57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536]
1162 ; AVX512VL-NEXT:    vpblendvb %ymm6, %ymm4, %ymm0, %ymm0
1163 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm4
1164 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm7 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1165 ; AVX512VL-NEXT:    vpand %ymm7, %ymm4, %ymm4
1166 ; AVX512VL-NEXT:    vpaddb %ymm6, %ymm6, %ymm8
1167 ; AVX512VL-NEXT:    vpblendvb %ymm8, %ymm4, %ymm0, %ymm0
1168 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm4
1169 ; AVX512VL-NEXT:    vpaddb %ymm8, %ymm8, %ymm9
1170 ; AVX512VL-NEXT:    vpblendvb %ymm9, %ymm4, %ymm0, %ymm0
1171 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1172 ; AVX512VL-NEXT:    vpsrlw $8, %ymm4, %ymm4
1173 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm10 = [256,2,4,8,16,32,64,128,256,2,4,8,16,32,64,128]
1174 ; AVX512VL-NEXT:    # ymm10 = mem[0,1,0,1]
1175 ; AVX512VL-NEXT:    vpmullw %ymm10, %ymm4, %ymm4
1176 ; AVX512VL-NEXT:    vpsrlw $8, %ymm4, %ymm4
1177 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm11 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1178 ; AVX512VL-NEXT:    vpsrlw $8, %ymm11, %ymm11
1179 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm12 = [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]
1180 ; AVX512VL-NEXT:    # ymm12 = mem[0,1,0,1]
1181 ; AVX512VL-NEXT:    vpmullw %ymm12, %ymm11, %ymm11
1182 ; AVX512VL-NEXT:    vpsrlw $8, %ymm11, %ymm11
1183 ; AVX512VL-NEXT:    vpackuswb %ymm4, %ymm11, %ymm4
1184 ; AVX512VL-NEXT:    vpor %ymm4, %ymm0, %ymm0
1185 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [18446744073709551360,18446744073709551360,18446744073709551360,18446744073709551360]
1186 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm0, %ymm2, %ymm0
1187 ; AVX512VL-NEXT:    vpsllw $4, %ymm1, %ymm2
1188 ; AVX512VL-NEXT:    vpand %ymm5, %ymm2, %ymm2
1189 ; AVX512VL-NEXT:    vpblendvb %ymm6, %ymm2, %ymm1, %ymm1
1190 ; AVX512VL-NEXT:    vpsllw $2, %ymm1, %ymm2
1191 ; AVX512VL-NEXT:    vpand %ymm7, %ymm2, %ymm2
1192 ; AVX512VL-NEXT:    vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
1193 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm2
1194 ; AVX512VL-NEXT:    vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
1195 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1196 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1197 ; AVX512VL-NEXT:    vpmullw %ymm10, %ymm2, %ymm2
1198 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1199 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm5 = ymm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1200 ; AVX512VL-NEXT:    vpsrlw $8, %ymm5, %ymm5
1201 ; AVX512VL-NEXT:    vpmullw %ymm12, %ymm5, %ymm5
1202 ; AVX512VL-NEXT:    vpsrlw $8, %ymm5, %ymm5
1203 ; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm5, %ymm2
1204 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
1205 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm1, %ymm3, %ymm1
1206 ; AVX512VL-NEXT:    retq
1207 ;
1208 ; AVX512BW-LABEL: constant_funnnel_v64i8:
1209 ; AVX512BW:       # %bb.0:
1210 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536]
1211 ; AVX512BW-NEXT:    vpmovb2m %zmm2, %k1
1212 ; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm3
1213 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1214 ; AVX512BW-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1215 ; AVX512BW-NEXT:    vpsllw $2, %zmm0, %zmm3
1216 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1217 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1218 ; AVX512BW-NEXT:    vpmovb2m %zmm2, %k1
1219 ; AVX512BW-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1220 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1221 ; AVX512BW-NEXT:    vpmovb2m %zmm2, %k1
1222 ; AVX512BW-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
1223 ; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1224 ; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2
1225 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
1226 ; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2
1227 ; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1228 ; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3
1229 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm3, %zmm3
1230 ; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3
1231 ; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm3, %zmm2
1232 ; AVX512BW-NEXT:    vporq %zmm2, %zmm0, %zmm0
1233 ; AVX512BW-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101
1234 ; AVX512BW-NEXT:    kmovq %rax, %k1
1235 ; AVX512BW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
1236 ; AVX512BW-NEXT:    retq
1237 ;
1238 ; AVX512VBMI2-LABEL: constant_funnnel_v64i8:
1239 ; AVX512VBMI2:       # %bb.0:
1240 ; AVX512VBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536]
1241 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm2, %k1
1242 ; AVX512VBMI2-NEXT:    vpsllw $4, %zmm0, %zmm3
1243 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1244 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1245 ; AVX512VBMI2-NEXT:    vpsllw $2, %zmm0, %zmm3
1246 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1247 ; AVX512VBMI2-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1248 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm2, %k1
1249 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1250 ; AVX512VBMI2-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1251 ; AVX512VBMI2-NEXT:    vpmovb2m %zmm2, %k1
1252 ; AVX512VBMI2-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
1253 ; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1254 ; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm2, %zmm2
1255 ; AVX512VBMI2-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
1256 ; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm2, %zmm2
1257 ; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1258 ; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3
1259 ; AVX512VBMI2-NEXT:    vpsllvw {{.*}}(%rip), %zmm3, %zmm3
1260 ; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3
1261 ; AVX512VBMI2-NEXT:    vpackuswb %zmm2, %zmm3, %zmm2
1262 ; AVX512VBMI2-NEXT:    vporq %zmm2, %zmm0, %zmm0
1263 ; AVX512VBMI2-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101
1264 ; AVX512VBMI2-NEXT:    kmovq %rax, %k1
1265 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
1266 ; AVX512VBMI2-NEXT:    retq
1267 ;
1268 ; AVX512VLBW-LABEL: constant_funnnel_v64i8:
1269 ; AVX512VLBW:       # %bb.0:
1270 ; AVX512VLBW-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536]
1271 ; AVX512VLBW-NEXT:    vpmovb2m %zmm2, %k1
1272 ; AVX512VLBW-NEXT:    vpsllw $4, %zmm0, %zmm3
1273 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1274 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1275 ; AVX512VLBW-NEXT:    vpsllw $2, %zmm0, %zmm3
1276 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1277 ; AVX512VLBW-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1278 ; AVX512VLBW-NEXT:    vpmovb2m %zmm2, %k1
1279 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1280 ; AVX512VLBW-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1281 ; AVX512VLBW-NEXT:    vpmovb2m %zmm2, %k1
1282 ; AVX512VLBW-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
1283 ; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1284 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm2, %zmm2
1285 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
1286 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm2, %zmm2
1287 ; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1288 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm3, %zmm3
1289 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm3, %zmm3
1290 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm3, %zmm3
1291 ; AVX512VLBW-NEXT:    vpackuswb %zmm2, %zmm3, %zmm2
1292 ; AVX512VLBW-NEXT:    vporq %zmm2, %zmm0, %zmm0
1293 ; AVX512VLBW-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101
1294 ; AVX512VLBW-NEXT:    kmovq %rax, %k1
1295 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
1296 ; AVX512VLBW-NEXT:    retq
1297 ;
1298 ; AVX512VLVBMI2-LABEL: constant_funnnel_v64i8:
1299 ; AVX512VLVBMI2:       # %bb.0:
1300 ; AVX512VLVBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536,57600,41152,24704,8256,8448,24640,41088,57536]
1301 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm2, %k1
1302 ; AVX512VLVBMI2-NEXT:    vpsllw $4, %zmm0, %zmm3
1303 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1304 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1305 ; AVX512VLVBMI2-NEXT:    vpsllw $2, %zmm0, %zmm3
1306 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
1307 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1308 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm2, %k1
1309 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm3, %zmm0 {%k1}
1310 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm2, %zmm2, %zmm2
1311 ; AVX512VLVBMI2-NEXT:    vpmovb2m %zmm2, %k1
1312 ; AVX512VLVBMI2-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
1313 ; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1314 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm2, %zmm2
1315 ; AVX512VLVBMI2-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
1316 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm2, %zmm2
1317 ; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1318 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3
1319 ; AVX512VLVBMI2-NEXT:    vpsllvw {{.*}}(%rip), %zmm3, %zmm3
1320 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm3, %zmm3
1321 ; AVX512VLVBMI2-NEXT:    vpackuswb %zmm2, %zmm3, %zmm2
1322 ; AVX512VLVBMI2-NEXT:    vporq %zmm2, %zmm0, %zmm0
1323 ; AVX512VLVBMI2-NEXT:    movabsq $72340172838076673, %rax # imm = 0x101010101010101
1324 ; AVX512VLVBMI2-NEXT:    kmovq %rax, %k1
1325 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
1326 ; AVX512VLVBMI2-NEXT:    retq
1327   %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %x, <64 x i8> %y, <64 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
1328   ret <64 x i8> %res
1329 }
1330
1331 ;
1332 ; Uniform Constant Shifts
1333 ;
1334
1335 define <8 x i64> @splatconstant_funnnel_v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1336 ; AVX512F-LABEL: splatconstant_funnnel_v8i64:
1337 ; AVX512F:       # %bb.0:
1338 ; AVX512F-NEXT:    vpsrlq $14, %zmm1, %zmm1
1339 ; AVX512F-NEXT:    vpsllq $50, %zmm0, %zmm0
1340 ; AVX512F-NEXT:    vporq %zmm1, %zmm0, %zmm0
1341 ; AVX512F-NEXT:    retq
1342 ;
1343 ; AVX512VL-LABEL: splatconstant_funnnel_v8i64:
1344 ; AVX512VL:       # %bb.0:
1345 ; AVX512VL-NEXT:    vpsrlq $14, %zmm1, %zmm1
1346 ; AVX512VL-NEXT:    vpsllq $50, %zmm0, %zmm0
1347 ; AVX512VL-NEXT:    vporq %zmm1, %zmm0, %zmm0
1348 ; AVX512VL-NEXT:    retq
1349 ;
1350 ; AVX512BW-LABEL: splatconstant_funnnel_v8i64:
1351 ; AVX512BW:       # %bb.0:
1352 ; AVX512BW-NEXT:    vpsrlq $14, %zmm1, %zmm1
1353 ; AVX512BW-NEXT:    vpsllq $50, %zmm0, %zmm0
1354 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1355 ; AVX512BW-NEXT:    retq
1356 ;
1357 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i64:
1358 ; AVX512VBMI2:       # %bb.0:
1359 ; AVX512VBMI2-NEXT:    vpshrdq $14, %zmm0, %zmm1, %zmm0
1360 ; AVX512VBMI2-NEXT:    retq
1361 ;
1362 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i64:
1363 ; AVX512VLBW:       # %bb.0:
1364 ; AVX512VLBW-NEXT:    vpsrlq $14, %zmm1, %zmm1
1365 ; AVX512VLBW-NEXT:    vpsllq $50, %zmm0, %zmm0
1366 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1367 ; AVX512VLBW-NEXT:    retq
1368 ;
1369 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i64:
1370 ; AVX512VLVBMI2:       # %bb.0:
1371 ; AVX512VLVBMI2-NEXT:    vpshrdq $14, %zmm0, %zmm1, %zmm0
1372 ; AVX512VLVBMI2-NEXT:    retq
1373   %res = call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %x, <8 x i64> %y, <8 x i64> <i64 14, i64 14, i64 14, i64 14, i64 14, i64 14, i64 14, i64 14>)
1374   ret <8 x i64> %res
1375 }
1376
1377 define <16 x i32> @splatconstant_funnnel_v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
1378 ; AVX512F-LABEL: splatconstant_funnnel_v16i32:
1379 ; AVX512F:       # %bb.0:
1380 ; AVX512F-NEXT:    vpsrld $4, %zmm1, %zmm1
1381 ; AVX512F-NEXT:    vpslld $28, %zmm0, %zmm0
1382 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
1383 ; AVX512F-NEXT:    retq
1384 ;
1385 ; AVX512VL-LABEL: splatconstant_funnnel_v16i32:
1386 ; AVX512VL:       # %bb.0:
1387 ; AVX512VL-NEXT:    vpsrld $4, %zmm1, %zmm1
1388 ; AVX512VL-NEXT:    vpslld $28, %zmm0, %zmm0
1389 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
1390 ; AVX512VL-NEXT:    retq
1391 ;
1392 ; AVX512BW-LABEL: splatconstant_funnnel_v16i32:
1393 ; AVX512BW:       # %bb.0:
1394 ; AVX512BW-NEXT:    vpsrld $4, %zmm1, %zmm1
1395 ; AVX512BW-NEXT:    vpslld $28, %zmm0, %zmm0
1396 ; AVX512BW-NEXT:    vpord %zmm1, %zmm0, %zmm0
1397 ; AVX512BW-NEXT:    retq
1398 ;
1399 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i32:
1400 ; AVX512VBMI2:       # %bb.0:
1401 ; AVX512VBMI2-NEXT:    vpshrdd $4, %zmm0, %zmm1, %zmm0
1402 ; AVX512VBMI2-NEXT:    retq
1403 ;
1404 ; AVX512VLBW-LABEL: splatconstant_funnnel_v16i32:
1405 ; AVX512VLBW:       # %bb.0:
1406 ; AVX512VLBW-NEXT:    vpsrld $4, %zmm1, %zmm1
1407 ; AVX512VLBW-NEXT:    vpslld $28, %zmm0, %zmm0
1408 ; AVX512VLBW-NEXT:    vpord %zmm1, %zmm0, %zmm0
1409 ; AVX512VLBW-NEXT:    retq
1410 ;
1411 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i32:
1412 ; AVX512VLVBMI2:       # %bb.0:
1413 ; AVX512VLVBMI2-NEXT:    vpshrdd $4, %zmm0, %zmm1, %zmm0
1414 ; AVX512VLVBMI2-NEXT:    retq
1415   %res = call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %x, <16 x i32> %y, <16 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>)
1416   ret <16 x i32> %res
1417 }
1418
1419 define <32 x i16> @splatconstant_funnnel_v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
1420 ; AVX512F-LABEL: splatconstant_funnnel_v32i16:
1421 ; AVX512F:       # %bb.0:
1422 ; AVX512F-NEXT:    vpsrlw $7, %ymm2, %ymm2
1423 ; AVX512F-NEXT:    vpsllw $9, %ymm0, %ymm0
1424 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
1425 ; AVX512F-NEXT:    vpsrlw $7, %ymm3, %ymm2
1426 ; AVX512F-NEXT:    vpsllw $9, %ymm1, %ymm1
1427 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
1428 ; AVX512F-NEXT:    retq
1429 ;
1430 ; AVX512VL-LABEL: splatconstant_funnnel_v32i16:
1431 ; AVX512VL:       # %bb.0:
1432 ; AVX512VL-NEXT:    vpsrlw $7, %ymm2, %ymm2
1433 ; AVX512VL-NEXT:    vpsllw $9, %ymm0, %ymm0
1434 ; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0
1435 ; AVX512VL-NEXT:    vpsrlw $7, %ymm3, %ymm2
1436 ; AVX512VL-NEXT:    vpsllw $9, %ymm1, %ymm1
1437 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
1438 ; AVX512VL-NEXT:    retq
1439 ;
1440 ; AVX512BW-LABEL: splatconstant_funnnel_v32i16:
1441 ; AVX512BW:       # %bb.0:
1442 ; AVX512BW-NEXT:    vpsrlw $7, %zmm1, %zmm1
1443 ; AVX512BW-NEXT:    vpsllw $9, %zmm0, %zmm0
1444 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1445 ; AVX512BW-NEXT:    retq
1446 ;
1447 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v32i16:
1448 ; AVX512VBMI2:       # %bb.0:
1449 ; AVX512VBMI2-NEXT:    vpshrdw $7, %zmm0, %zmm1, %zmm0
1450 ; AVX512VBMI2-NEXT:    retq
1451 ;
1452 ; AVX512VLBW-LABEL: splatconstant_funnnel_v32i16:
1453 ; AVX512VLBW:       # %bb.0:
1454 ; AVX512VLBW-NEXT:    vpsrlw $7, %zmm1, %zmm1
1455 ; AVX512VLBW-NEXT:    vpsllw $9, %zmm0, %zmm0
1456 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1457 ; AVX512VLBW-NEXT:    retq
1458 ;
1459 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v32i16:
1460 ; AVX512VLVBMI2:       # %bb.0:
1461 ; AVX512VLVBMI2-NEXT:    vpshrdw $7, %zmm0, %zmm1, %zmm0
1462 ; AVX512VLVBMI2-NEXT:    retq
1463   %res = call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %x, <32 x i16> %y, <32 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)
1464   ret <32 x i16> %res
1465 }
1466
1467 define <64 x i8> @splatconstant_funnnel_v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
1468 ; AVX512F-LABEL: splatconstant_funnnel_v64i8:
1469 ; AVX512F:       # %bb.0:
1470 ; AVX512F-NEXT:    vpsrlw $4, %ymm2, %ymm2
1471 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1472 ; AVX512F-NEXT:    vpandn %ymm2, %ymm4, %ymm2
1473 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm0
1474 ; AVX512F-NEXT:    vpand %ymm4, %ymm0, %ymm0
1475 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
1476 ; AVX512F-NEXT:    vpsrlw $4, %ymm3, %ymm2
1477 ; AVX512F-NEXT:    vpandn %ymm2, %ymm4, %ymm2
1478 ; AVX512F-NEXT:    vpsllw $4, %ymm1, %ymm1
1479 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
1480 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
1481 ; AVX512F-NEXT:    retq
1482 ;
1483 ; AVX512VL-LABEL: splatconstant_funnnel_v64i8:
1484 ; AVX512VL:       # %bb.0:
1485 ; AVX512VL-NEXT:    vpsrlw $4, %ymm2, %ymm2
1486 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1487 ; AVX512VL-NEXT:    vpandn %ymm2, %ymm4, %ymm2
1488 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm0
1489 ; AVX512VL-NEXT:    vpand %ymm4, %ymm0, %ymm0
1490 ; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0
1491 ; AVX512VL-NEXT:    vpsrlw $4, %ymm3, %ymm2
1492 ; AVX512VL-NEXT:    vpandn %ymm2, %ymm4, %ymm2
1493 ; AVX512VL-NEXT:    vpsllw $4, %ymm1, %ymm1
1494 ; AVX512VL-NEXT:    vpand %ymm4, %ymm1, %ymm1
1495 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
1496 ; AVX512VL-NEXT:    retq
1497 ;
1498 ; AVX512BW-LABEL: splatconstant_funnnel_v64i8:
1499 ; AVX512BW:       # %bb.0:
1500 ; AVX512BW-NEXT:    vpsrlw $4, %zmm1, %zmm1
1501 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
1502 ; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm0
1503 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
1504 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1505 ; AVX512BW-NEXT:    retq
1506 ;
1507 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v64i8:
1508 ; AVX512VBMI2:       # %bb.0:
1509 ; AVX512VBMI2-NEXT:    vpsrlw $4, %zmm1, %zmm1
1510 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
1511 ; AVX512VBMI2-NEXT:    vpsllw $4, %zmm0, %zmm0
1512 ; AVX512VBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
1513 ; AVX512VBMI2-NEXT:    vporq %zmm1, %zmm0, %zmm0
1514 ; AVX512VBMI2-NEXT:    retq
1515 ;
1516 ; AVX512VLBW-LABEL: splatconstant_funnnel_v64i8:
1517 ; AVX512VLBW:       # %bb.0:
1518 ; AVX512VLBW-NEXT:    vpsrlw $4, %zmm1, %zmm1
1519 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
1520 ; AVX512VLBW-NEXT:    vpsllw $4, %zmm0, %zmm0
1521 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
1522 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1523 ; AVX512VLBW-NEXT:    retq
1524 ;
1525 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v64i8:
1526 ; AVX512VLVBMI2:       # %bb.0:
1527 ; AVX512VLVBMI2-NEXT:    vpsrlw $4, %zmm1, %zmm1
1528 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
1529 ; AVX512VLVBMI2-NEXT:    vpsllw $4, %zmm0, %zmm0
1530 ; AVX512VLVBMI2-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
1531 ; AVX512VLVBMI2-NEXT:    vporq %zmm1, %zmm0, %zmm0
1532 ; AVX512VLVBMI2-NEXT:    retq
1533   %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %x, <64 x i8> %y, <64 x i8> <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>)
1534   ret <64 x i8> %res
1535 }