xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/vector-shift-shl-512.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker;
6*9880d681SAndroid Build Coastguard Worker; Variable Shifts
7*9880d681SAndroid Build Coastguard Worker;
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
10*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: var_shift_v8i64:
11*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
12*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0
13*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
14*9880d681SAndroid Build Coastguard Worker  %shift = shl <8 x i64> %a, %b
15*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %shift
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @var_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
19*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: var_shift_v16i32:
20*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
21*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
22*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
23*9880d681SAndroid Build Coastguard Worker  %shift = shl <16 x i32> %a, %b
24*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %shift
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
28*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: var_shift_v32i16:
29*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
30*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpxor %ymm4, %ymm4, %ymm4
31*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
32*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpckhwd {{.*#+}} ymm6 = ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15]
33*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllvd %ymm5, %ymm6, %ymm5
34*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsrld $16, %ymm5, %ymm5
35*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
36*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11]
37*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
38*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsrld $16, %ymm0, %ymm0
39*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpackusdw %ymm5, %ymm0, %ymm0
40*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15]
41*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15]
42*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllvd %ymm2, %ymm5, %ymm2
43*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsrld $16, %ymm2, %ymm2
44*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11]
45*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11]
46*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllvd %ymm3, %ymm1, %ymm1
47*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsrld $16, %ymm1, %ymm1
48*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpackusdw %ymm2, %ymm1, %ymm1
49*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
50*9880d681SAndroid Build Coastguard Worker;
51*9880d681SAndroid Build Coastguard Worker; AVX512BW-LABEL: var_shift_v32i16:
52*9880d681SAndroid Build Coastguard Worker; AVX512BW:       ## BB#0:
53*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
54*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    retq
55*9880d681SAndroid Build Coastguard Worker  %shift = shl <32 x i16> %a, %b
56*9880d681SAndroid Build Coastguard Worker  ret <32 x i16> %shift
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
60*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: var_shift_v64i8:
61*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
62*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $4, %ymm0, %ymm4
63*9880d681SAndroid Build Coastguard Worker; AVX512DQ-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]
64*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm5, %ymm4, %ymm4
65*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $5, %ymm2, %ymm2
66*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
67*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $2, %ymm0, %ymm4
68*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm6 = [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]
69*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm6, %ymm4, %ymm4
70*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
71*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
72*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm0, %ymm0, %ymm4
73*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
74*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
75*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $4, %ymm1, %ymm2
76*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm5, %ymm2, %ymm2
77*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $5, %ymm3, %ymm3
78*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
79*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $2, %ymm1, %ymm2
80*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm6, %ymm2, %ymm2
81*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
82*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
83*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm1, %ymm1, %ymm2
84*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
85*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
86*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
87*9880d681SAndroid Build Coastguard Worker  %shift = shl <64 x i8> %a, %b
88*9880d681SAndroid Build Coastguard Worker  ret <64 x i8> %shift
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker;
92*9880d681SAndroid Build Coastguard Worker; Uniform Variable Shifts
93*9880d681SAndroid Build Coastguard Worker;
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @splatvar_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
96*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: splatvar_shift_v8i64:
97*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
98*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpsllq %xmm1, %zmm0, %zmm0
99*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
100*9880d681SAndroid Build Coastguard Worker  %splat = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
101*9880d681SAndroid Build Coastguard Worker  %shift = shl <8 x i64> %a, %splat
102*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %shift
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @splatvar_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
106*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: splatvar_shift_v16i32:
107*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
108*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vxorps %xmm2, %xmm2, %xmm2
109*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3]
110*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpslld %xmm1, %zmm0, %zmm0
111*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
112*9880d681SAndroid Build Coastguard Worker  %splat = shufflevector <16 x i32> %b, <16 x i32> undef, <16 x i32> zeroinitializer
113*9880d681SAndroid Build Coastguard Worker  %shift = shl <16 x i32> %a, %splat
114*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %shift
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
118*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: splatvar_shift_v32i16:
119*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
120*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovd %xmm2, %eax
121*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    movzwl %ax, %eax
122*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovd %eax, %xmm2
123*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
124*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw %xmm2, %ymm1, %ymm1
125*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
126*9880d681SAndroid Build Coastguard Worker;
127*9880d681SAndroid Build Coastguard Worker; AVX512BW-LABEL: splatvar_shift_v32i16:
128*9880d681SAndroid Build Coastguard Worker; AVX512BW:       ## BB#0:
129*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vmovd %xmm1, %eax
130*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    movzwl %ax, %eax
131*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vmovd %eax, %xmm1
132*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0
133*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    retq
134*9880d681SAndroid Build Coastguard Worker  %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer
135*9880d681SAndroid Build Coastguard Worker  %shift = shl <32 x i16> %a, %splat
136*9880d681SAndroid Build Coastguard Worker  ret <32 x i16> %shift
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
140*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: splatvar_shift_v64i8:
141*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
142*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpbroadcastb %xmm2, %ymm2
143*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $4, %ymm0, %ymm3
144*9880d681SAndroid Build Coastguard Worker; AVX512DQ-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]
145*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm4, %ymm3, %ymm3
146*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $5, %ymm2, %ymm2
147*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm3, %ymm0, %ymm0
148*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $2, %ymm0, %ymm3
149*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm5 = [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]
150*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm5, %ymm3, %ymm3
151*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm2, %ymm2, %ymm6
152*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm6, %ymm3, %ymm0, %ymm0
153*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm0, %ymm0, %ymm3
154*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm6, %ymm6, %ymm7
155*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm7, %ymm3, %ymm0, %ymm0
156*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $4, %ymm1, %ymm3
157*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm4, %ymm3, %ymm3
158*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
159*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $2, %ymm1, %ymm2
160*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm5, %ymm2, %ymm2
161*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm6, %ymm2, %ymm1, %ymm1
162*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm1, %ymm1, %ymm2
163*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm7, %ymm2, %ymm1, %ymm1
164*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker  %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer
167*9880d681SAndroid Build Coastguard Worker  %shift = shl <64 x i8> %a, %splat
168*9880d681SAndroid Build Coastguard Worker  ret <64 x i8> %shift
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker;
172*9880d681SAndroid Build Coastguard Worker; Constant Shifts
173*9880d681SAndroid Build Coastguard Worker;
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @constant_shift_v8i64(<8 x i64> %a) nounwind {
176*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constant_shift_v8i64:
177*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
178*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpsllvq {{.*}}(%rip), %zmm0, %zmm0
179*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
180*9880d681SAndroid Build Coastguard Worker  %shift = shl <8 x i64> %a, <i64 1, i64 7, i64 31, i64 62, i64 1, i64 7, i64 31, i64 62>
181*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %shift
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @constant_shift_v16i32(<16 x i32> %a) nounwind {
185*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constant_shift_v16i32:
186*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
187*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
188*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
189*9880d681SAndroid Build Coastguard Worker  %shift = shl <16 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
190*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %shift
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workerdefine <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind {
194*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: constant_shift_v32i16:
195*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
196*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
197*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
198*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
199*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
200*9880d681SAndroid Build Coastguard Worker;
201*9880d681SAndroid Build Coastguard Worker; AVX512BW-LABEL: constant_shift_v32i16:
202*9880d681SAndroid Build Coastguard Worker; AVX512BW:       ## BB#0:
203*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
204*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    retq
205*9880d681SAndroid Build Coastguard Worker  %shift = shl <32 x i16> %a, <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>
206*9880d681SAndroid Build Coastguard Worker  ret <32 x i16> %shift
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind {
210*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: constant_shift_v64i8:
211*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
212*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $4, %ymm0, %ymm2
213*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm3 = [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]
214*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm3, %ymm2, %ymm2
215*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
216*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $5, %ymm4, %ymm4
217*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm0
218*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $2, %ymm0, %ymm2
219*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm5 = [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]
220*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm5, %ymm2, %ymm2
221*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm4, %ymm4, %ymm6
222*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm6, %ymm2, %ymm0, %ymm0
223*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
224*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm6, %ymm6, %ymm7
225*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm7, %ymm2, %ymm0, %ymm0
226*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $4, %ymm1, %ymm2
227*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm3, %ymm2, %ymm2
228*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm4, %ymm2, %ymm1, %ymm1
229*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $2, %ymm1, %ymm2
230*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm5, %ymm2, %ymm2
231*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm6, %ymm2, %ymm1, %ymm1
232*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpaddb %ymm1, %ymm1, %ymm2
233*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpblendvb %ymm7, %ymm2, %ymm1, %ymm1
234*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
235*9880d681SAndroid Build Coastguard Worker  %shift = shl <64 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>
236*9880d681SAndroid Build Coastguard Worker  ret <64 x i8> %shift
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker;
240*9880d681SAndroid Build Coastguard Worker; Uniform Constant Shifts
241*9880d681SAndroid Build Coastguard Worker;
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @splatconstant_shift_v8i64(<8 x i64> %a) nounwind {
244*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: splatconstant_shift_v8i64:
245*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
246*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpsllq $7, %zmm0, %zmm0
247*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
248*9880d681SAndroid Build Coastguard Worker  %shift = shl <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7>
249*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %shift
250*9880d681SAndroid Build Coastguard Worker}
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @splatconstant_shift_v16i32(<16 x i32> %a) nounwind {
253*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: splatconstant_shift_v16i32:
254*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
255*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpslld $5, %zmm0, %zmm0
256*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
257*9880d681SAndroid Build Coastguard Worker  %shift = shl <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
258*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %shift
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Workerdefine <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind {
262*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: splatconstant_shift_v32i16:
263*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
264*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $3, %ymm0, %ymm0
265*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $3, %ymm1, %ymm1
266*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
267*9880d681SAndroid Build Coastguard Worker;
268*9880d681SAndroid Build Coastguard Worker; AVX512BW-LABEL: splatconstant_shift_v32i16:
269*9880d681SAndroid Build Coastguard Worker; AVX512BW:       ## BB#0:
270*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vpsllw $3, %zmm0, %zmm0
271*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    retq
272*9880d681SAndroid Build Coastguard Worker  %shift = shl <32 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
273*9880d681SAndroid Build Coastguard Worker  ret <32 x i16> %shift
274*9880d681SAndroid Build Coastguard Worker}
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Workerdefine <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind {
277*9880d681SAndroid Build Coastguard Worker; AVX512DQ-LABEL: splatconstant_shift_v64i8:
278*9880d681SAndroid Build Coastguard Worker; AVX512DQ:       ## BB#0:
279*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $3, %ymm0, %ymm0
280*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
281*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
282*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpsllw $3, %ymm1, %ymm1
283*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    vpand %ymm2, %ymm1, %ymm1
284*9880d681SAndroid Build Coastguard Worker; AVX512DQ-NEXT:    retq
285*9880d681SAndroid Build Coastguard Worker;
286*9880d681SAndroid Build Coastguard Worker; AVX512BW-LABEL: splatconstant_shift_v64i8:
287*9880d681SAndroid Build Coastguard Worker; AVX512BW:       ## BB#0:
288*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vpsllw $3, %zmm0, %zmm0
289*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
290*9880d681SAndroid Build Coastguard Worker; AVX512BW-NEXT:    retq
291*9880d681SAndroid Build Coastguard Worker  %shift = shl <64 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
292*9880d681SAndroid Build Coastguard Worker  ret <64 x i8> %shift
293*9880d681SAndroid Build Coastguard Worker}
294