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