comparison test/CodeGen/X86/vector-shift-ashr-512.ll @ 100:7d135dc70f03 LLVM 3.9

LLVM 3.9
author Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
date Tue, 26 Jan 2016 22:53:40 +0900
parents afa8332a0e37
children 1172e4bd9c6f
comparison
equal deleted inserted replaced
96:6418606d0ead 100:7d135dc70f03
1 ; TODO: Add AVX512BW shift support 1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ 2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
3 3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
4 ; 4 ;
5 ; Variable Shifts 5 ; Variable Shifts
6 ; 6 ;
7 7
8 define <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind { 8 define <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
22 %shift = ashr <16 x i32> %a, %b 22 %shift = ashr <16 x i32> %a, %b
23 ret <16 x i32> %shift 23 ret <16 x i32> %shift
24 } 24 }
25 25
26 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind { 26 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
27 ; ALL-LABEL: var_shift_v32i16: 27 ; AVX512DQ-LABEL: var_shift_v32i16:
28 ; ALL: ## BB#0: 28 ; AVX512DQ: ## BB#0:
29 ; ALL-NEXT: vpxor %ymm4, %ymm4, %ymm4 29 ; AVX512DQ-NEXT: vpxor %ymm4, %ymm4, %ymm4
30 ; ALL-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] 30 ; 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]
31 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm6 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 31 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm6 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
32 ; ALL-NEXT: vpsravd %ymm5, %ymm6, %ymm5 32 ; AVX512DQ-NEXT: vpsravd %ymm5, %ymm6, %ymm5
33 ; ALL-NEXT: vpsrld $16, %ymm5, %ymm5 33 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5
34 ; ALL-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] 34 ; 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]
35 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 35 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
36 ; ALL-NEXT: vpsravd %ymm2, %ymm0, %ymm0 36 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm0, %ymm0
37 ; ALL-NEXT: vpsrld $16, %ymm0, %ymm0 37 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
38 ; ALL-NEXT: vpackusdw %ymm5, %ymm0, %ymm0 38 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0
39 ; ALL-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] 39 ; 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]
40 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 40 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
41 ; ALL-NEXT: vpsravd %ymm2, %ymm5, %ymm2 41 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm5, %ymm2
42 ; ALL-NEXT: vpsrld $16, %ymm2, %ymm2 42 ; AVX512DQ-NEXT: vpsrld $16, %ymm2, %ymm2
43 ; ALL-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] 43 ; 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]
44 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 44 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
45 ; ALL-NEXT: vpsravd %ymm3, %ymm1, %ymm1 45 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm1, %ymm1
46 ; ALL-NEXT: vpsrld $16, %ymm1, %ymm1 46 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1
47 ; ALL-NEXT: vpackusdw %ymm2, %ymm1, %ymm1 47 ; AVX512DQ-NEXT: vpackusdw %ymm2, %ymm1, %ymm1
48 ; ALL-NEXT: retq 48 ; AVX512DQ-NEXT: retq
49 ;
50 ; AVX512BW-LABEL: var_shift_v32i16:
51 ; AVX512BW: ## BB#0:
52 ; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0
53 ; AVX512BW-NEXT: retq
49 %shift = ashr <32 x i16> %a, %b 54 %shift = ashr <32 x i16> %a, %b
50 ret <32 x i16> %shift 55 ret <32 x i16> %shift
51 } 56 }
52 57
53 define <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind { 58 define <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
54 ; ALL-LABEL: var_shift_v64i8: 59 ; AVX512DQ-LABEL: var_shift_v64i8:
55 ; ALL: ## BB#0: 60 ; AVX512DQ: ## BB#0:
56 ; ALL-NEXT: vpsllw $5, %ymm2, %ymm2 61 ; AVX512DQ-NEXT: vpsllw $5, %ymm2, %ymm2
57 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 62 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
58 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm0[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] 63 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm0[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]
59 ; ALL-NEXT: vpsraw $4, %ymm5, %ymm6 64 ; AVX512DQ-NEXT: vpsraw $4, %ymm5, %ymm6
60 ; ALL-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm5 65 ; AVX512DQ-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm5
61 ; ALL-NEXT: vpsraw $2, %ymm5, %ymm6 66 ; AVX512DQ-NEXT: vpsraw $2, %ymm5, %ymm6
62 ; ALL-NEXT: vpaddw %ymm4, %ymm4, %ymm4 67 ; AVX512DQ-NEXT: vpaddw %ymm4, %ymm4, %ymm4
63 ; ALL-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm5 68 ; AVX512DQ-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm5
64 ; ALL-NEXT: vpsraw $1, %ymm5, %ymm6 69 ; AVX512DQ-NEXT: vpsraw $1, %ymm5, %ymm6
65 ; ALL-NEXT: vpaddw %ymm4, %ymm4, %ymm4 70 ; AVX512DQ-NEXT: vpaddw %ymm4, %ymm4, %ymm4
66 ; ALL-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm4 71 ; AVX512DQ-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm4
67 ; ALL-NEXT: vpsrlw $8, %ymm4, %ymm4 72 ; AVX512DQ-NEXT: vpsrlw $8, %ymm4, %ymm4
68 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 73 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
69 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[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] 74 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[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]
70 ; ALL-NEXT: vpsraw $4, %ymm0, %ymm5 75 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm5
71 ; ALL-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 76 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
72 ; ALL-NEXT: vpsraw $2, %ymm0, %ymm5 77 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm5
73 ; ALL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 78 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
74 ; ALL-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 79 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
75 ; ALL-NEXT: vpsraw $1, %ymm0, %ymm5 80 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm5
76 ; ALL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 81 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
77 ; ALL-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 82 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
78 ; ALL-NEXT: vpsrlw $8, %ymm0, %ymm0 83 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0
79 ; ALL-NEXT: vpackuswb %ymm4, %ymm0, %ymm0 84 ; AVX512DQ-NEXT: vpackuswb %ymm4, %ymm0, %ymm0
80 ; ALL-NEXT: vpsllw $5, %ymm3, %ymm2 85 ; AVX512DQ-NEXT: vpsllw $5, %ymm3, %ymm2
81 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 86 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
82 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 87 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
83 ; ALL-NEXT: vpsraw $4, %ymm4, %ymm5 88 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5
84 ; ALL-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 89 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
85 ; ALL-NEXT: vpsraw $2, %ymm4, %ymm5 90 ; AVX512DQ-NEXT: vpsraw $2, %ymm4, %ymm5
86 ; ALL-NEXT: vpaddw %ymm3, %ymm3, %ymm3 91 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm3
87 ; ALL-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 92 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
88 ; ALL-NEXT: vpsraw $1, %ymm4, %ymm5 93 ; AVX512DQ-NEXT: vpsraw $1, %ymm4, %ymm5
89 ; ALL-NEXT: vpaddw %ymm3, %ymm3, %ymm3 94 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm3
90 ; ALL-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3 95 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
91 ; ALL-NEXT: vpsrlw $8, %ymm3, %ymm3 96 ; AVX512DQ-NEXT: vpsrlw $8, %ymm3, %ymm3
92 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 97 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
93 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 98 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
94 ; ALL-NEXT: vpsraw $4, %ymm1, %ymm4 99 ; AVX512DQ-NEXT: vpsraw $4, %ymm1, %ymm4
95 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 100 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
96 ; ALL-NEXT: vpsraw $2, %ymm1, %ymm4 101 ; AVX512DQ-NEXT: vpsraw $2, %ymm1, %ymm4
97 ; ALL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 102 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
98 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 103 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
99 ; ALL-NEXT: vpsraw $1, %ymm1, %ymm4 104 ; AVX512DQ-NEXT: vpsraw $1, %ymm1, %ymm4
100 ; ALL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 105 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2
101 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 106 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
102 ; ALL-NEXT: vpsrlw $8, %ymm1, %ymm1 107 ; AVX512DQ-NEXT: vpsrlw $8, %ymm1, %ymm1
103 ; ALL-NEXT: vpackuswb %ymm3, %ymm1, %ymm1 108 ; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm1, %ymm1
104 ; ALL-NEXT: retq 109 ; AVX512DQ-NEXT: retq
105 %shift = ashr <64 x i8> %a, %b 110 %shift = ashr <64 x i8> %a, %b
106 ret <64 x i8> %shift 111 ret <64 x i8> %shift
107 } 112 }
108 113
109 ; 114 ;
131 %shift = ashr <16 x i32> %a, %splat 136 %shift = ashr <16 x i32> %a, %splat
132 ret <16 x i32> %shift 137 ret <16 x i32> %shift
133 } 138 }
134 139
135 define <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind { 140 define <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
136 ; ALL-LABEL: splatvar_shift_v32i16: 141 ; AVX512DQ-LABEL: splatvar_shift_v32i16:
137 ; ALL: ## BB#0: 142 ; AVX512DQ: ## BB#0:
138 ; ALL-NEXT: vmovd %xmm2, %eax 143 ; AVX512DQ-NEXT: vmovd %xmm2, %eax
139 ; ALL-NEXT: movzwl %ax, %eax 144 ; AVX512DQ-NEXT: movzwl %ax, %eax
140 ; ALL-NEXT: vmovd %eax, %xmm2 145 ; AVX512DQ-NEXT: vmovd %eax, %xmm2
141 ; ALL-NEXT: vpsraw %xmm2, %ymm0, %ymm0 146 ; AVX512DQ-NEXT: vpsraw %xmm2, %ymm0, %ymm0
142 ; ALL-NEXT: vpsraw %xmm2, %ymm1, %ymm1 147 ; AVX512DQ-NEXT: vpsraw %xmm2, %ymm1, %ymm1
143 ; ALL-NEXT: retq 148 ; AVX512DQ-NEXT: retq
149 ;
150 ; AVX512BW-LABEL: splatvar_shift_v32i16:
151 ; AVX512BW: ## BB#0:
152 ; AVX512BW-NEXT: vmovd %xmm1, %eax
153 ; AVX512BW-NEXT: movzwl %ax, %eax
154 ; AVX512BW-NEXT: vmovd %eax, %xmm1
155 ; AVX512BW-NEXT: vpsraw %xmm1, %zmm0, %zmm0
156 ; AVX512BW-NEXT: retq
144 %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer 157 %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer
145 %shift = ashr <32 x i16> %a, %splat 158 %shift = ashr <32 x i16> %a, %splat
146 ret <32 x i16> %shift 159 ret <32 x i16> %shift
147 } 160 }
148 161
149 define <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind { 162 define <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
150 ; ALL-LABEL: splatvar_shift_v64i8: 163 ; AVX512DQ-LABEL: splatvar_shift_v64i8:
151 ; ALL: ## BB#0: 164 ; AVX512DQ: ## BB#0:
152 ; ALL-NEXT: vpbroadcastb %xmm2, %ymm2 165 ; AVX512DQ-NEXT: vpbroadcastb %xmm2, %ymm2
153 ; ALL-NEXT: vpsllw $5, %ymm2, %ymm2 166 ; AVX512DQ-NEXT: vpsllw $5, %ymm2, %ymm2
154 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 167 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
155 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[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] 168 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[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]
156 ; ALL-NEXT: vpsraw $4, %ymm4, %ymm5 169 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5
157 ; ALL-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 170 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
158 ; ALL-NEXT: vpsraw $2, %ymm4, %ymm5 171 ; AVX512DQ-NEXT: vpsraw $2, %ymm4, %ymm5
159 ; ALL-NEXT: vpaddw %ymm3, %ymm3, %ymm6 172 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm6
160 ; ALL-NEXT: vpblendvb %ymm6, %ymm5, %ymm4, %ymm4 173 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm5, %ymm4, %ymm4
161 ; ALL-NEXT: vpsraw $1, %ymm4, %ymm5 174 ; AVX512DQ-NEXT: vpsraw $1, %ymm4, %ymm5
162 ; ALL-NEXT: vpaddw %ymm6, %ymm6, %ymm7 175 ; AVX512DQ-NEXT: vpaddw %ymm6, %ymm6, %ymm7
163 ; ALL-NEXT: vpblendvb %ymm7, %ymm5, %ymm4, %ymm4 176 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm5, %ymm4, %ymm4
164 ; ALL-NEXT: vpsrlw $8, %ymm4, %ymm4 177 ; AVX512DQ-NEXT: vpsrlw $8, %ymm4, %ymm4
165 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 178 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
166 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[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] 179 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[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]
167 ; ALL-NEXT: vpsraw $4, %ymm0, %ymm5 180 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm5
168 ; ALL-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 181 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
169 ; ALL-NEXT: vpsraw $2, %ymm0, %ymm5 182 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm5
170 ; ALL-NEXT: vpaddw %ymm2, %ymm2, %ymm8 183 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm8
171 ; ALL-NEXT: vpblendvb %ymm8, %ymm5, %ymm0, %ymm0 184 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm5, %ymm0, %ymm0
172 ; ALL-NEXT: vpsraw $1, %ymm0, %ymm5 185 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm5
173 ; ALL-NEXT: vpaddw %ymm8, %ymm8, %ymm9 186 ; AVX512DQ-NEXT: vpaddw %ymm8, %ymm8, %ymm9
174 ; ALL-NEXT: vpblendvb %ymm9, %ymm5, %ymm0, %ymm0 187 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm5, %ymm0, %ymm0
175 ; ALL-NEXT: vpsrlw $8, %ymm0, %ymm0 188 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0
176 ; ALL-NEXT: vpackuswb %ymm4, %ymm0, %ymm0 189 ; AVX512DQ-NEXT: vpackuswb %ymm4, %ymm0, %ymm0
177 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 190 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
178 ; ALL-NEXT: vpsraw $4, %ymm4, %ymm5 191 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5
179 ; ALL-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3 192 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
180 ; ALL-NEXT: vpsraw $2, %ymm3, %ymm4 193 ; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4
181 ; ALL-NEXT: vpblendvb %ymm6, %ymm4, %ymm3, %ymm3 194 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm4, %ymm3, %ymm3
182 ; ALL-NEXT: vpsraw $1, %ymm3, %ymm4 195 ; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4
183 ; ALL-NEXT: vpblendvb %ymm7, %ymm4, %ymm3, %ymm3 196 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm4, %ymm3, %ymm3
184 ; ALL-NEXT: vpsrlw $8, %ymm3, %ymm3 197 ; AVX512DQ-NEXT: vpsrlw $8, %ymm3, %ymm3
185 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 198 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
186 ; ALL-NEXT: vpsraw $4, %ymm1, %ymm4 199 ; AVX512DQ-NEXT: vpsraw $4, %ymm1, %ymm4
187 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 200 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
188 ; ALL-NEXT: vpsraw $2, %ymm1, %ymm2 201 ; AVX512DQ-NEXT: vpsraw $2, %ymm1, %ymm2
189 ; ALL-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1 202 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
190 ; ALL-NEXT: vpsraw $1, %ymm1, %ymm2 203 ; AVX512DQ-NEXT: vpsraw $1, %ymm1, %ymm2
191 ; ALL-NEXT: vpblendvb %ymm9, %ymm2, %ymm1, %ymm1 204 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
192 ; ALL-NEXT: vpsrlw $8, %ymm1, %ymm1 205 ; AVX512DQ-NEXT: vpsrlw $8, %ymm1, %ymm1
193 ; ALL-NEXT: vpackuswb %ymm3, %ymm1, %ymm1 206 ; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm1, %ymm1
194 ; ALL-NEXT: retq 207 ; AVX512DQ-NEXT: retq
195 %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer 208 %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer
196 %shift = ashr <64 x i8> %a, %splat 209 %shift = ashr <64 x i8> %a, %splat
197 ret <64 x i8> %shift 210 ret <64 x i8> %shift
198 } 211 }
199 212
218 %shift = ashr <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> 231 %shift = ashr <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>
219 ret <16 x i32> %shift 232 ret <16 x i32> %shift
220 } 233 }
221 234
222 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind { 235 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind {
223 ; ALL-LABEL: constant_shift_v32i16: 236 ; AVX512DQ-LABEL: constant_shift_v32i16:
224 ; ALL: ## BB#0: 237 ; AVX512DQ: ## BB#0:
225 ; ALL-NEXT: vpxor %ymm2, %ymm2, %ymm2 238 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2
226 ; ALL-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 239 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
227 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15] 240 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15]
228 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 241 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
229 ; ALL-NEXT: vpsravd %ymm4, %ymm5, %ymm5 242 ; AVX512DQ-NEXT: vpsravd %ymm4, %ymm5, %ymm5
230 ; ALL-NEXT: vpsrld $16, %ymm5, %ymm5 243 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5
231 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11] 244 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11]
232 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 245 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
233 ; ALL-NEXT: vpsravd %ymm2, %ymm0, %ymm0 246 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm0, %ymm0
234 ; ALL-NEXT: vpsrld $16, %ymm0, %ymm0 247 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
235 ; ALL-NEXT: vpackusdw %ymm5, %ymm0, %ymm0 248 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0
236 ; ALL-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15] 249 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
237 ; ALL-NEXT: vpsravd %ymm4, %ymm3, %ymm3 250 ; AVX512DQ-NEXT: vpsravd %ymm4, %ymm3, %ymm3
238 ; ALL-NEXT: vpsrld $16, %ymm3, %ymm3 251 ; AVX512DQ-NEXT: vpsrld $16, %ymm3, %ymm3
239 ; ALL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11] 252 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
240 ; ALL-NEXT: vpsravd %ymm2, %ymm1, %ymm1 253 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm1, %ymm1
241 ; ALL-NEXT: vpsrld $16, %ymm1, %ymm1 254 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1
242 ; ALL-NEXT: vpackusdw %ymm3, %ymm1, %ymm1 255 ; AVX512DQ-NEXT: vpackusdw %ymm3, %ymm1, %ymm1
243 ; ALL-NEXT: retq 256 ; AVX512DQ-NEXT: retq
257 ;
258 ; AVX512BW-LABEL: constant_shift_v32i16:
259 ; AVX512BW: ## BB#0:
260 ; AVX512BW-NEXT: vpsravw {{.*}}(%rip), %zmm0, %zmm0
261 ; AVX512BW-NEXT: retq
244 %shift = ashr <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> 262 %shift = ashr <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>
245 ret <32 x i16> %shift 263 ret <32 x i16> %shift
246 } 264 }
247 265
248 define <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind { 266 define <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind {
249 ; ALL-LABEL: constant_shift_v64i8: 267 ; AVX512DQ-LABEL: constant_shift_v64i8:
250 ; ALL: ## BB#0: 268 ; AVX512DQ: ## BB#0:
251 ; ALL-NEXT: vmovdqa {{.*#+}} ymm2 = [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] 269 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [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]
252 ; ALL-NEXT: vpsllw $5, %ymm2, %ymm2 270 ; AVX512DQ-NEXT: vpsllw $5, %ymm2, %ymm2
253 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 271 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
254 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[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] 272 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[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]
255 ; ALL-NEXT: vpsraw $4, %ymm4, %ymm5 273 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5
256 ; ALL-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 274 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
257 ; ALL-NEXT: vpsraw $2, %ymm4, %ymm5 275 ; AVX512DQ-NEXT: vpsraw $2, %ymm4, %ymm5
258 ; ALL-NEXT: vpaddw %ymm3, %ymm3, %ymm6 276 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm6
259 ; ALL-NEXT: vpblendvb %ymm6, %ymm5, %ymm4, %ymm4 277 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm5, %ymm4, %ymm4
260 ; ALL-NEXT: vpsraw $1, %ymm4, %ymm5 278 ; AVX512DQ-NEXT: vpsraw $1, %ymm4, %ymm5
261 ; ALL-NEXT: vpaddw %ymm6, %ymm6, %ymm7 279 ; AVX512DQ-NEXT: vpaddw %ymm6, %ymm6, %ymm7
262 ; ALL-NEXT: vpblendvb %ymm7, %ymm5, %ymm4, %ymm4 280 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm5, %ymm4, %ymm4
263 ; ALL-NEXT: vpsrlw $8, %ymm4, %ymm4 281 ; AVX512DQ-NEXT: vpsrlw $8, %ymm4, %ymm4
264 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 282 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
265 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[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] 283 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[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]
266 ; ALL-NEXT: vpsraw $4, %ymm0, %ymm5 284 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm5
267 ; ALL-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 285 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
268 ; ALL-NEXT: vpsraw $2, %ymm0, %ymm5 286 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm5
269 ; ALL-NEXT: vpaddw %ymm2, %ymm2, %ymm8 287 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm8
270 ; ALL-NEXT: vpblendvb %ymm8, %ymm5, %ymm0, %ymm0 288 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm5, %ymm0, %ymm0
271 ; ALL-NEXT: vpsraw $1, %ymm0, %ymm5 289 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm5
272 ; ALL-NEXT: vpaddw %ymm8, %ymm8, %ymm9 290 ; AVX512DQ-NEXT: vpaddw %ymm8, %ymm8, %ymm9
273 ; ALL-NEXT: vpblendvb %ymm9, %ymm5, %ymm0, %ymm0 291 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm5, %ymm0, %ymm0
274 ; ALL-NEXT: vpsrlw $8, %ymm0, %ymm0 292 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0
275 ; ALL-NEXT: vpackuswb %ymm4, %ymm0, %ymm0 293 ; AVX512DQ-NEXT: vpackuswb %ymm4, %ymm0, %ymm0
276 ; ALL-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 294 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
277 ; ALL-NEXT: vpsraw $4, %ymm4, %ymm5 295 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5
278 ; ALL-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3 296 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
279 ; ALL-NEXT: vpsraw $2, %ymm3, %ymm4 297 ; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4
280 ; ALL-NEXT: vpblendvb %ymm6, %ymm4, %ymm3, %ymm3 298 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm4, %ymm3, %ymm3
281 ; ALL-NEXT: vpsraw $1, %ymm3, %ymm4 299 ; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4
282 ; ALL-NEXT: vpblendvb %ymm7, %ymm4, %ymm3, %ymm3 300 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm4, %ymm3, %ymm3
283 ; ALL-NEXT: vpsrlw $8, %ymm3, %ymm3 301 ; AVX512DQ-NEXT: vpsrlw $8, %ymm3, %ymm3
284 ; ALL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 302 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
285 ; ALL-NEXT: vpsraw $4, %ymm1, %ymm4 303 ; AVX512DQ-NEXT: vpsraw $4, %ymm1, %ymm4
286 ; ALL-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 304 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
287 ; ALL-NEXT: vpsraw $2, %ymm1, %ymm2 305 ; AVX512DQ-NEXT: vpsraw $2, %ymm1, %ymm2
288 ; ALL-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1 306 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
289 ; ALL-NEXT: vpsraw $1, %ymm1, %ymm2 307 ; AVX512DQ-NEXT: vpsraw $1, %ymm1, %ymm2
290 ; ALL-NEXT: vpblendvb %ymm9, %ymm2, %ymm1, %ymm1 308 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
291 ; ALL-NEXT: vpsrlw $8, %ymm1, %ymm1 309 ; AVX512DQ-NEXT: vpsrlw $8, %ymm1, %ymm1
292 ; ALL-NEXT: vpackuswb %ymm3, %ymm1, %ymm1 310 ; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm1, %ymm1
293 ; ALL-NEXT: retq 311 ; AVX512DQ-NEXT: retq
294 %shift = ashr <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> 312 %shift = ashr <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>
295 ret <64 x i8> %shift 313 ret <64 x i8> %shift
296 } 314 }
297 315
298 ; 316 ;
316 %shift = ashr <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> 334 %shift = ashr <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>
317 ret <16 x i32> %shift 335 ret <16 x i32> %shift
318 } 336 }
319 337
320 define <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind { 338 define <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind {
321 ; ALL-LABEL: splatconstant_shift_v32i16: 339 ; AVX512DQ-LABEL: splatconstant_shift_v32i16:
322 ; ALL: ## BB#0: 340 ; AVX512DQ: ## BB#0:
323 ; ALL-NEXT: vpsraw $3, %ymm0, %ymm0 341 ; AVX512DQ-NEXT: vpsraw $3, %ymm0, %ymm0
324 ; ALL-NEXT: vpsraw $3, %ymm1, %ymm1 342 ; AVX512DQ-NEXT: vpsraw $3, %ymm1, %ymm1
325 ; ALL-NEXT: retq 343 ; AVX512DQ-NEXT: retq
344 ;
345 ; AVX512BW-LABEL: splatconstant_shift_v32i16:
346 ; AVX512BW: ## BB#0:
347 ; AVX512BW-NEXT: vpsraw $3, %zmm0, %zmm0
348 ; AVX512BW-NEXT: retq
326 %shift = ashr <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> 349 %shift = ashr <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>
327 ret <32 x i16> %shift 350 ret <32 x i16> %shift
328 } 351 }
329 352
330 define <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind { 353 define <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind {
331 ; ALL-LABEL: splatconstant_shift_v64i8: 354 ; AVX512DQ-LABEL: splatconstant_shift_v64i8:
332 ; ALL: ## BB#0: 355 ; AVX512DQ: ## BB#0:
333 ; ALL-NEXT: vpsrlw $3, %ymm0, %ymm0 356 ; AVX512DQ-NEXT: vpsrlw $3, %ymm0, %ymm0
334 ; ALL-NEXT: vmovdqa {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31] 357 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
335 ; ALL-NEXT: vpand %ymm2, %ymm0, %ymm0 358 ; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0
336 ; ALL-NEXT: vmovdqa {{.*#+}} ymm3 = [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] 359 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm3 = [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]
337 ; ALL-NEXT: vpxor %ymm3, %ymm0, %ymm0 360 ; AVX512DQ-NEXT: vpxor %ymm3, %ymm0, %ymm0
338 ; ALL-NEXT: vpsubb %ymm3, %ymm0, %ymm0 361 ; AVX512DQ-NEXT: vpsubb %ymm3, %ymm0, %ymm0
339 ; ALL-NEXT: vpsrlw $3, %ymm1, %ymm1 362 ; AVX512DQ-NEXT: vpsrlw $3, %ymm1, %ymm1
340 ; ALL-NEXT: vpand %ymm2, %ymm1, %ymm1 363 ; AVX512DQ-NEXT: vpand %ymm2, %ymm1, %ymm1
341 ; ALL-NEXT: vpxor %ymm3, %ymm1, %ymm1 364 ; AVX512DQ-NEXT: vpxor %ymm3, %ymm1, %ymm1
342 ; ALL-NEXT: vpsubb %ymm3, %ymm1, %ymm1 365 ; AVX512DQ-NEXT: vpsubb %ymm3, %ymm1, %ymm1
343 ; ALL-NEXT: retq 366 ; AVX512DQ-NEXT: retq
367 ;
368 ; AVX512BW-LABEL: splatconstant_shift_v64i8:
369 ; AVX512BW: ## BB#0:
370 ; AVX512BW-NEXT: vpsrlw $3, %zmm0, %zmm0
371 ; AVX512BW-NEXT: vpandq {{.*}}(%rip), %zmm0, %zmm0
372 ; AVX512BW-NEXT: vmovdqu8 {{.*#+}} zmm1 = [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,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]
373 ; AVX512BW-NEXT: vpxorq %zmm1, %zmm0, %zmm0
374 ; AVX512BW-NEXT: vpsubb %zmm1, %zmm0, %zmm0
375 ; AVX512BW-NEXT: retq
344 %shift = ashr <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> 376 %shift = ashr <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>
345 ret <64 x i8> %shift 377 ret <64 x i8> %shift
346 } 378 }