1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1 7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2 8 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 9 ; 10 ; Just one 32-bit run to make sure we do reasonable things for i64 shifts. 11 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2 12 13 ; 14 ; Variable Shifts 15 ; 16 17 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 18 ; SSE2-LABEL: var_shift_v2i64: 19 ; SSE2: # BB#0: 20 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1] 21 ; SSE2-NEXT: movdqa %xmm0, %xmm2 22 ; SSE2-NEXT: psrlq %xmm3, %xmm2 23 ; SSE2-NEXT: psrlq %xmm1, %xmm0 24 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1] 25 ; SSE2-NEXT: movapd %xmm2, %xmm0 26 ; SSE2-NEXT: retq 27 ; 28 ; SSE41-LABEL: var_shift_v2i64: 29 ; SSE41: # BB#0: 30 ; SSE41-NEXT: movdqa %xmm0, %xmm2 31 ; SSE41-NEXT: psrlq %xmm1, %xmm2 32 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 33 ; SSE41-NEXT: psrlq %xmm1, %xmm0 34 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7] 35 ; SSE41-NEXT: retq 36 ; 37 ; AVX1-LABEL: var_shift_v2i64: 38 ; AVX1: # BB#0: 39 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm2 40 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 41 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 42 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7] 43 ; AVX1-NEXT: retq 44 ; 45 ; AVX2-LABEL: var_shift_v2i64: 46 ; AVX2: # BB#0: 47 ; AVX2-NEXT: vpsrlvq %xmm1, %xmm0, %xmm0 48 ; AVX2-NEXT: retq 49 ; 50 ; XOPAVX1-LABEL: var_shift_v2i64: 51 ; XOPAVX1: # BB#0: 52 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 53 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1 54 ; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm0 55 ; XOPAVX1-NEXT: retq 56 ; 57 ; XOPAVX2-LABEL: var_shift_v2i64: 58 ; XOPAVX2: # BB#0: 59 ; XOPAVX2-NEXT: vpsrlvq %xmm1, %xmm0, %xmm0 60 ; XOPAVX2-NEXT: retq 61 ; 62 ; AVX512-LABEL: var_shift_v2i64: 63 ; AVX512: ## BB#0: 64 ; AVX512-NEXT: vpsrlvq %xmm1, %xmm0, %xmm0 65 ; AVX512-NEXT: retq 66 ; 67 ; X32-SSE-LABEL: var_shift_v2i64: 68 ; X32-SSE: # BB#0: 69 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1] 70 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2 71 ; X32-SSE-NEXT: psrlq %xmm3, %xmm2 72 ; X32-SSE-NEXT: movq {{.*#+}} xmm1 = xmm1[0],zero 73 ; X32-SSE-NEXT: psrlq %xmm1, %xmm0 74 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1] 75 ; X32-SSE-NEXT: movapd %xmm2, %xmm0 76 ; X32-SSE-NEXT: retl 77 %shift = lshr <2 x i64> %a, %b 78 ret <2 x i64> %shift 79 } 80 81 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 82 ; SSE2-LABEL: var_shift_v4i32: 83 ; SSE2: # BB#0: 84 ; SSE2-NEXT: movdqa %xmm1, %xmm2 85 ; SSE2-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 86 ; SSE2-NEXT: movdqa %xmm0, %xmm3 87 ; SSE2-NEXT: psrld %xmm2, %xmm3 88 ; SSE2-NEXT: movdqa %xmm1, %xmm2 89 ; SSE2-NEXT: psrlq $32, %xmm2 90 ; SSE2-NEXT: movdqa %xmm0, %xmm4 91 ; SSE2-NEXT: psrld %xmm2, %xmm4 92 ; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1] 93 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3] 94 ; SSE2-NEXT: pxor %xmm3, %xmm3 95 ; SSE2-NEXT: movdqa %xmm1, %xmm4 96 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3] 97 ; SSE2-NEXT: movdqa %xmm0, %xmm5 98 ; SSE2-NEXT: psrld %xmm4, %xmm5 99 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 100 ; SSE2-NEXT: psrld %xmm1, %xmm0 101 ; SSE2-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1] 102 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3] 103 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 104 ; SSE2-NEXT: retq 105 ; 106 ; SSE41-LABEL: var_shift_v4i32: 107 ; SSE41: # BB#0: 108 ; SSE41-NEXT: movdqa %xmm1, %xmm2 109 ; SSE41-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 110 ; SSE41-NEXT: movdqa %xmm0, %xmm3 111 ; SSE41-NEXT: psrld %xmm2, %xmm3 112 ; SSE41-NEXT: movdqa %xmm1, %xmm2 113 ; SSE41-NEXT: psrlq $32, %xmm2 114 ; SSE41-NEXT: movdqa %xmm0, %xmm4 115 ; SSE41-NEXT: psrld %xmm2, %xmm4 116 ; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7] 117 ; SSE41-NEXT: pxor %xmm2, %xmm2 118 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero 119 ; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 120 ; SSE41-NEXT: movdqa %xmm0, %xmm2 121 ; SSE41-NEXT: psrld %xmm1, %xmm2 122 ; SSE41-NEXT: psrld %xmm3, %xmm0 123 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 124 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7] 125 ; SSE41-NEXT: retq 126 ; 127 ; AVX1-LABEL: var_shift_v4i32: 128 ; AVX1: # BB#0: 129 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 130 ; AVX1-NEXT: vpsrld %xmm2, %xmm0, %xmm2 131 ; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3 132 ; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3 133 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 134 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 135 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3] 136 ; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3 137 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 138 ; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0 139 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7] 140 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 141 ; AVX1-NEXT: retq 142 ; 143 ; AVX2-LABEL: var_shift_v4i32: 144 ; AVX2: # BB#0: 145 ; AVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0 146 ; AVX2-NEXT: retq 147 ; 148 ; XOPAVX1-LABEL: var_shift_v4i32: 149 ; XOPAVX1: # BB#0: 150 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 151 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1 152 ; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm0 153 ; XOPAVX1-NEXT: retq 154 ; 155 ; XOPAVX2-LABEL: var_shift_v4i32: 156 ; XOPAVX2: # BB#0: 157 ; XOPAVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0 158 ; XOPAVX2-NEXT: retq 159 ; 160 ; AVX512-LABEL: var_shift_v4i32: 161 ; AVX512: ## BB#0: 162 ; AVX512-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0 163 ; AVX512-NEXT: retq 164 ; 165 ; X32-SSE-LABEL: var_shift_v4i32: 166 ; X32-SSE: # BB#0: 167 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 168 ; X32-SSE-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 169 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 170 ; X32-SSE-NEXT: psrld %xmm2, %xmm3 171 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 172 ; X32-SSE-NEXT: psrlq $32, %xmm2 173 ; X32-SSE-NEXT: movdqa %xmm0, %xmm4 174 ; X32-SSE-NEXT: psrld %xmm2, %xmm4 175 ; X32-SSE-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1] 176 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3] 177 ; X32-SSE-NEXT: pxor %xmm3, %xmm3 178 ; X32-SSE-NEXT: movdqa %xmm1, %xmm4 179 ; X32-SSE-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3] 180 ; X32-SSE-NEXT: movdqa %xmm0, %xmm5 181 ; X32-SSE-NEXT: psrld %xmm4, %xmm5 182 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 183 ; X32-SSE-NEXT: psrld %xmm1, %xmm0 184 ; X32-SSE-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1] 185 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3] 186 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 187 ; X32-SSE-NEXT: retl 188 %shift = lshr <4 x i32> %a, %b 189 ret <4 x i32> %shift 190 } 191 192 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 193 ; SSE2-LABEL: var_shift_v8i16: 194 ; SSE2: # BB#0: 195 ; SSE2-NEXT: psllw $12, %xmm1 196 ; SSE2-NEXT: movdqa %xmm1, %xmm2 197 ; SSE2-NEXT: psraw $15, %xmm2 198 ; SSE2-NEXT: movdqa %xmm2, %xmm3 199 ; SSE2-NEXT: pandn %xmm0, %xmm3 200 ; SSE2-NEXT: psrlw $8, %xmm0 201 ; SSE2-NEXT: pand %xmm2, %xmm0 202 ; SSE2-NEXT: por %xmm3, %xmm0 203 ; SSE2-NEXT: paddw %xmm1, %xmm1 204 ; SSE2-NEXT: movdqa %xmm1, %xmm2 205 ; SSE2-NEXT: psraw $15, %xmm2 206 ; SSE2-NEXT: movdqa %xmm2, %xmm3 207 ; SSE2-NEXT: pandn %xmm0, %xmm3 208 ; SSE2-NEXT: psrlw $4, %xmm0 209 ; SSE2-NEXT: pand %xmm2, %xmm0 210 ; SSE2-NEXT: por %xmm3, %xmm0 211 ; SSE2-NEXT: paddw %xmm1, %xmm1 212 ; SSE2-NEXT: movdqa %xmm1, %xmm2 213 ; SSE2-NEXT: psraw $15, %xmm2 214 ; SSE2-NEXT: movdqa %xmm2, %xmm3 215 ; SSE2-NEXT: pandn %xmm0, %xmm3 216 ; SSE2-NEXT: psrlw $2, %xmm0 217 ; SSE2-NEXT: pand %xmm2, %xmm0 218 ; SSE2-NEXT: por %xmm3, %xmm0 219 ; SSE2-NEXT: paddw %xmm1, %xmm1 220 ; SSE2-NEXT: psraw $15, %xmm1 221 ; SSE2-NEXT: movdqa %xmm1, %xmm2 222 ; SSE2-NEXT: pandn %xmm0, %xmm2 223 ; SSE2-NEXT: psrlw $1, %xmm0 224 ; SSE2-NEXT: pand %xmm1, %xmm0 225 ; SSE2-NEXT: por %xmm2, %xmm0 226 ; SSE2-NEXT: retq 227 ; 228 ; SSE41-LABEL: var_shift_v8i16: 229 ; SSE41: # BB#0: 230 ; SSE41-NEXT: movdqa %xmm0, %xmm2 231 ; SSE41-NEXT: movdqa %xmm1, %xmm0 232 ; SSE41-NEXT: psllw $12, %xmm0 233 ; SSE41-NEXT: psllw $4, %xmm1 234 ; SSE41-NEXT: por %xmm0, %xmm1 235 ; SSE41-NEXT: movdqa %xmm1, %xmm3 236 ; SSE41-NEXT: paddw %xmm3, %xmm3 237 ; SSE41-NEXT: movdqa %xmm2, %xmm4 238 ; SSE41-NEXT: psrlw $8, %xmm4 239 ; SSE41-NEXT: movdqa %xmm1, %xmm0 240 ; SSE41-NEXT: pblendvb %xmm4, %xmm2 241 ; SSE41-NEXT: movdqa %xmm2, %xmm1 242 ; SSE41-NEXT: psrlw $4, %xmm1 243 ; SSE41-NEXT: movdqa %xmm3, %xmm0 244 ; SSE41-NEXT: pblendvb %xmm1, %xmm2 245 ; SSE41-NEXT: movdqa %xmm2, %xmm1 246 ; SSE41-NEXT: psrlw $2, %xmm1 247 ; SSE41-NEXT: paddw %xmm3, %xmm3 248 ; SSE41-NEXT: movdqa %xmm3, %xmm0 249 ; SSE41-NEXT: pblendvb %xmm1, %xmm2 250 ; SSE41-NEXT: movdqa %xmm2, %xmm1 251 ; SSE41-NEXT: psrlw $1, %xmm1 252 ; SSE41-NEXT: paddw %xmm3, %xmm3 253 ; SSE41-NEXT: movdqa %xmm3, %xmm0 254 ; SSE41-NEXT: pblendvb %xmm1, %xmm2 255 ; SSE41-NEXT: movdqa %xmm2, %xmm0 256 ; SSE41-NEXT: retq 257 ; 258 ; AVX1-LABEL: var_shift_v8i16: 259 ; AVX1: # BB#0: 260 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm2 261 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 262 ; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1 263 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm2 264 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm3 265 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 266 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm1 267 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0 268 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm1 269 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 270 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0 271 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm1 272 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 273 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0 274 ; AVX1-NEXT: retq 275 ; 276 ; AVX2-LABEL: var_shift_v8i16: 277 ; AVX2: # BB#0: 278 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 279 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 280 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 281 ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,20,21,24,25,28,29],zero,zero,zero,zero,zero,zero,zero,zero 282 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 283 ; AVX2-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 284 ; AVX2-NEXT: vzeroupper 285 ; AVX2-NEXT: retq 286 ; 287 ; XOP-LABEL: var_shift_v8i16: 288 ; XOP: # BB#0: 289 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2 290 ; XOP-NEXT: vpsubw %xmm1, %xmm2, %xmm1 291 ; XOP-NEXT: vpshlw %xmm1, %xmm0, %xmm0 292 ; XOP-NEXT: retq 293 ; 294 ; AVX512-LABEL: var_shift_v8i16: 295 ; AVX512: ## BB#0: 296 ; AVX512-NEXT: ## kill: %XMM1<def> %XMM1<kill> %ZMM1<def> 297 ; AVX512-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 298 ; AVX512-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0 299 ; AVX512-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 300 ; AVX512-NEXT: retq 301 ; 302 ; X32-SSE-LABEL: var_shift_v8i16: 303 ; X32-SSE: # BB#0: 304 ; X32-SSE-NEXT: psllw $12, %xmm1 305 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 306 ; X32-SSE-NEXT: psraw $15, %xmm2 307 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3 308 ; X32-SSE-NEXT: pandn %xmm0, %xmm3 309 ; X32-SSE-NEXT: psrlw $8, %xmm0 310 ; X32-SSE-NEXT: pand %xmm2, %xmm0 311 ; X32-SSE-NEXT: por %xmm3, %xmm0 312 ; X32-SSE-NEXT: paddw %xmm1, %xmm1 313 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 314 ; X32-SSE-NEXT: psraw $15, %xmm2 315 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3 316 ; X32-SSE-NEXT: pandn %xmm0, %xmm3 317 ; X32-SSE-NEXT: psrlw $4, %xmm0 318 ; X32-SSE-NEXT: pand %xmm2, %xmm0 319 ; X32-SSE-NEXT: por %xmm3, %xmm0 320 ; X32-SSE-NEXT: paddw %xmm1, %xmm1 321 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 322 ; X32-SSE-NEXT: psraw $15, %xmm2 323 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3 324 ; X32-SSE-NEXT: pandn %xmm0, %xmm3 325 ; X32-SSE-NEXT: psrlw $2, %xmm0 326 ; X32-SSE-NEXT: pand %xmm2, %xmm0 327 ; X32-SSE-NEXT: por %xmm3, %xmm0 328 ; X32-SSE-NEXT: paddw %xmm1, %xmm1 329 ; X32-SSE-NEXT: psraw $15, %xmm1 330 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 331 ; X32-SSE-NEXT: pandn %xmm0, %xmm2 332 ; X32-SSE-NEXT: psrlw $1, %xmm0 333 ; X32-SSE-NEXT: pand %xmm1, %xmm0 334 ; X32-SSE-NEXT: por %xmm2, %xmm0 335 ; X32-SSE-NEXT: retl 336 %shift = lshr <8 x i16> %a, %b 337 ret <8 x i16> %shift 338 } 339 340 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 341 ; SSE2-LABEL: var_shift_v16i8: 342 ; SSE2: # BB#0: 343 ; SSE2-NEXT: psllw $5, %xmm1 344 ; SSE2-NEXT: pxor %xmm2, %xmm2 345 ; SSE2-NEXT: pxor %xmm3, %xmm3 346 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3 347 ; SSE2-NEXT: movdqa %xmm3, %xmm4 348 ; SSE2-NEXT: pandn %xmm0, %xmm4 349 ; SSE2-NEXT: psrlw $4, %xmm0 350 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 351 ; SSE2-NEXT: pand %xmm3, %xmm0 352 ; SSE2-NEXT: por %xmm4, %xmm0 353 ; SSE2-NEXT: paddb %xmm1, %xmm1 354 ; SSE2-NEXT: pxor %xmm3, %xmm3 355 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3 356 ; SSE2-NEXT: movdqa %xmm3, %xmm4 357 ; SSE2-NEXT: pandn %xmm0, %xmm4 358 ; SSE2-NEXT: psrlw $2, %xmm0 359 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 360 ; SSE2-NEXT: pand %xmm3, %xmm0 361 ; SSE2-NEXT: por %xmm4, %xmm0 362 ; SSE2-NEXT: paddb %xmm1, %xmm1 363 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 364 ; SSE2-NEXT: movdqa %xmm2, %xmm1 365 ; SSE2-NEXT: pandn %xmm0, %xmm1 366 ; SSE2-NEXT: psrlw $1, %xmm0 367 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 368 ; SSE2-NEXT: pand %xmm2, %xmm0 369 ; SSE2-NEXT: por %xmm1, %xmm0 370 ; SSE2-NEXT: retq 371 ; 372 ; SSE41-LABEL: var_shift_v16i8: 373 ; SSE41: # BB#0: 374 ; SSE41-NEXT: movdqa %xmm0, %xmm2 375 ; SSE41-NEXT: psllw $5, %xmm1 376 ; SSE41-NEXT: movdqa %xmm2, %xmm3 377 ; SSE41-NEXT: psrlw $4, %xmm3 378 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3 379 ; SSE41-NEXT: movdqa %xmm1, %xmm0 380 ; SSE41-NEXT: pblendvb %xmm3, %xmm2 381 ; SSE41-NEXT: movdqa %xmm2, %xmm3 382 ; SSE41-NEXT: psrlw $2, %xmm3 383 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3 384 ; SSE41-NEXT: paddb %xmm1, %xmm1 385 ; SSE41-NEXT: movdqa %xmm1, %xmm0 386 ; SSE41-NEXT: pblendvb %xmm3, %xmm2 387 ; SSE41-NEXT: movdqa %xmm2, %xmm3 388 ; SSE41-NEXT: psrlw $1, %xmm3 389 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3 390 ; SSE41-NEXT: paddb %xmm1, %xmm1 391 ; SSE41-NEXT: movdqa %xmm1, %xmm0 392 ; SSE41-NEXT: pblendvb %xmm3, %xmm2 393 ; SSE41-NEXT: movdqa %xmm2, %xmm0 394 ; SSE41-NEXT: retq 395 ; 396 ; AVX-LABEL: var_shift_v16i8: 397 ; AVX: # BB#0: 398 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1 399 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2 400 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 401 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 402 ; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2 403 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 404 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1 405 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 406 ; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2 407 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 408 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1 409 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 410 ; AVX-NEXT: retq 411 ; 412 ; XOP-LABEL: var_shift_v16i8: 413 ; XOP: # BB#0: 414 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2 415 ; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1 416 ; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0 417 ; XOP-NEXT: retq 418 ; 419 ; AVX512-LABEL: var_shift_v16i8: 420 ; AVX512: ## BB#0: 421 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1 422 ; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm2 423 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 424 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 425 ; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm2 426 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 427 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1 428 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 429 ; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm2 430 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 431 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1 432 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 433 ; AVX512-NEXT: retq 434 ; 435 ; X32-SSE-LABEL: var_shift_v16i8: 436 ; X32-SSE: # BB#0: 437 ; X32-SSE-NEXT: psllw $5, %xmm1 438 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 439 ; X32-SSE-NEXT: pxor %xmm3, %xmm3 440 ; X32-SSE-NEXT: pcmpgtb %xmm1, %xmm3 441 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 442 ; X32-SSE-NEXT: pandn %xmm0, %xmm4 443 ; X32-SSE-NEXT: psrlw $4, %xmm0 444 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 445 ; X32-SSE-NEXT: pand %xmm3, %xmm0 446 ; X32-SSE-NEXT: por %xmm4, %xmm0 447 ; X32-SSE-NEXT: paddb %xmm1, %xmm1 448 ; X32-SSE-NEXT: pxor %xmm3, %xmm3 449 ; X32-SSE-NEXT: pcmpgtb %xmm1, %xmm3 450 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 451 ; X32-SSE-NEXT: pandn %xmm0, %xmm4 452 ; X32-SSE-NEXT: psrlw $2, %xmm0 453 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 454 ; X32-SSE-NEXT: pand %xmm3, %xmm0 455 ; X32-SSE-NEXT: por %xmm4, %xmm0 456 ; X32-SSE-NEXT: paddb %xmm1, %xmm1 457 ; X32-SSE-NEXT: pcmpgtb %xmm1, %xmm2 458 ; X32-SSE-NEXT: movdqa %xmm2, %xmm1 459 ; X32-SSE-NEXT: pandn %xmm0, %xmm1 460 ; X32-SSE-NEXT: psrlw $1, %xmm0 461 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 462 ; X32-SSE-NEXT: pand %xmm2, %xmm0 463 ; X32-SSE-NEXT: por %xmm1, %xmm0 464 ; X32-SSE-NEXT: retl 465 %shift = lshr <16 x i8> %a, %b 466 ret <16 x i8> %shift 467 } 468 469 ; 470 ; Uniform Variable Shifts 471 ; 472 473 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 474 ; SSE-LABEL: splatvar_shift_v2i64: 475 ; SSE: # BB#0: 476 ; SSE-NEXT: psrlq %xmm1, %xmm0 477 ; SSE-NEXT: retq 478 ; 479 ; AVX-LABEL: splatvar_shift_v2i64: 480 ; AVX: # BB#0: 481 ; AVX-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 482 ; AVX-NEXT: retq 483 ; 484 ; XOP-LABEL: splatvar_shift_v2i64: 485 ; XOP: # BB#0: 486 ; XOP-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 487 ; XOP-NEXT: retq 488 ; 489 ; AVX512-LABEL: splatvar_shift_v2i64: 490 ; AVX512: ## BB#0: 491 ; AVX512-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 492 ; AVX512-NEXT: retq 493 ; 494 ; X32-SSE-LABEL: splatvar_shift_v2i64: 495 ; X32-SSE: # BB#0: 496 ; X32-SSE-NEXT: movq {{.*#+}} xmm1 = xmm1[0],zero 497 ; X32-SSE-NEXT: psrlq %xmm1, %xmm0 498 ; X32-SSE-NEXT: retl 499 %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer 500 %shift = lshr <2 x i64> %a, %splat 501 ret <2 x i64> %shift 502 } 503 504 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 505 ; SSE2-LABEL: splatvar_shift_v4i32: 506 ; SSE2: # BB#0: 507 ; SSE2-NEXT: xorps %xmm2, %xmm2 508 ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 509 ; SSE2-NEXT: psrld %xmm2, %xmm0 510 ; SSE2-NEXT: retq 511 ; 512 ; SSE41-LABEL: splatvar_shift_v4i32: 513 ; SSE41: # BB#0: 514 ; SSE41-NEXT: pxor %xmm2, %xmm2 515 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7] 516 ; SSE41-NEXT: psrld %xmm2, %xmm0 517 ; SSE41-NEXT: retq 518 ; 519 ; AVX-LABEL: splatvar_shift_v4i32: 520 ; AVX: # BB#0: 521 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 522 ; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 523 ; AVX-NEXT: vpsrld %xmm1, %xmm0, %xmm0 524 ; AVX-NEXT: retq 525 ; 526 ; XOP-LABEL: splatvar_shift_v4i32: 527 ; XOP: # BB#0: 528 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2 529 ; XOP-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 530 ; XOP-NEXT: vpsrld %xmm1, %xmm0, %xmm0 531 ; XOP-NEXT: retq 532 ; 533 ; AVX512-LABEL: splatvar_shift_v4i32: 534 ; AVX512: ## BB#0: 535 ; AVX512-NEXT: vxorps %xmm2, %xmm2, %xmm2 536 ; AVX512-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] 537 ; AVX512-NEXT: vpsrld %xmm1, %xmm0, %xmm0 538 ; AVX512-NEXT: retq 539 ; 540 ; X32-SSE-LABEL: splatvar_shift_v4i32: 541 ; X32-SSE: # BB#0: 542 ; X32-SSE-NEXT: xorps %xmm2, %xmm2 543 ; X32-SSE-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 544 ; X32-SSE-NEXT: psrld %xmm2, %xmm0 545 ; X32-SSE-NEXT: retl 546 %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer 547 %shift = lshr <4 x i32> %a, %splat 548 ret <4 x i32> %shift 549 } 550 551 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 552 ; SSE2-LABEL: splatvar_shift_v8i16: 553 ; SSE2: # BB#0: 554 ; SSE2-NEXT: movd %xmm1, %eax 555 ; SSE2-NEXT: movzwl %ax, %eax 556 ; SSE2-NEXT: movd %eax, %xmm1 557 ; SSE2-NEXT: psrlw %xmm1, %xmm0 558 ; SSE2-NEXT: retq 559 ; 560 ; SSE41-LABEL: splatvar_shift_v8i16: 561 ; SSE41: # BB#0: 562 ; SSE41-NEXT: pxor %xmm2, %xmm2 563 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7] 564 ; SSE41-NEXT: psrlw %xmm2, %xmm0 565 ; SSE41-NEXT: retq 566 ; 567 ; AVX-LABEL: splatvar_shift_v8i16: 568 ; AVX: # BB#0: 569 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 570 ; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7] 571 ; AVX-NEXT: vpsrlw %xmm1, %xmm0, %xmm0 572 ; AVX-NEXT: retq 573 ; 574 ; XOP-LABEL: splatvar_shift_v8i16: 575 ; XOP: # BB#0: 576 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2 577 ; XOP-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7] 578 ; XOP-NEXT: vpsrlw %xmm1, %xmm0, %xmm0 579 ; XOP-NEXT: retq 580 ; 581 ; AVX512-LABEL: splatvar_shift_v8i16: 582 ; AVX512: ## BB#0: 583 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 584 ; AVX512-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7] 585 ; AVX512-NEXT: vpsrlw %xmm1, %xmm0, %xmm0 586 ; AVX512-NEXT: retq 587 ; 588 ; X32-SSE-LABEL: splatvar_shift_v8i16: 589 ; X32-SSE: # BB#0: 590 ; X32-SSE-NEXT: movd %xmm1, %eax 591 ; X32-SSE-NEXT: movzwl %ax, %eax 592 ; X32-SSE-NEXT: movd %eax, %xmm1 593 ; X32-SSE-NEXT: psrlw %xmm1, %xmm0 594 ; X32-SSE-NEXT: retl 595 %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer 596 %shift = lshr <8 x i16> %a, %splat 597 ret <8 x i16> %shift 598 } 599 600 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 601 ; SSE2-LABEL: splatvar_shift_v16i8: 602 ; SSE2: # BB#0: 603 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 604 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7] 605 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,1] 606 ; SSE2-NEXT: psllw $5, %xmm2 607 ; SSE2-NEXT: pxor %xmm1, %xmm1 608 ; SSE2-NEXT: pxor %xmm3, %xmm3 609 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3 610 ; SSE2-NEXT: movdqa %xmm3, %xmm4 611 ; SSE2-NEXT: pandn %xmm0, %xmm4 612 ; SSE2-NEXT: psrlw $4, %xmm0 613 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 614 ; SSE2-NEXT: pand %xmm3, %xmm0 615 ; SSE2-NEXT: por %xmm4, %xmm0 616 ; SSE2-NEXT: paddb %xmm2, %xmm2 617 ; SSE2-NEXT: pxor %xmm3, %xmm3 618 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3 619 ; SSE2-NEXT: movdqa %xmm3, %xmm4 620 ; SSE2-NEXT: pandn %xmm0, %xmm4 621 ; SSE2-NEXT: psrlw $2, %xmm0 622 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 623 ; SSE2-NEXT: pand %xmm3, %xmm0 624 ; SSE2-NEXT: por %xmm4, %xmm0 625 ; SSE2-NEXT: paddb %xmm2, %xmm2 626 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1 627 ; SSE2-NEXT: movdqa %xmm1, %xmm2 628 ; SSE2-NEXT: pandn %xmm0, %xmm2 629 ; SSE2-NEXT: psrlw $1, %xmm0 630 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 631 ; SSE2-NEXT: pand %xmm1, %xmm0 632 ; SSE2-NEXT: por %xmm2, %xmm0 633 ; SSE2-NEXT: retq 634 ; 635 ; SSE41-LABEL: splatvar_shift_v16i8: 636 ; SSE41: # BB#0: 637 ; SSE41-NEXT: movdqa %xmm0, %xmm2 638 ; SSE41-NEXT: pxor %xmm0, %xmm0 639 ; SSE41-NEXT: pshufb %xmm0, %xmm1 640 ; SSE41-NEXT: psllw $5, %xmm1 641 ; SSE41-NEXT: movdqa %xmm1, %xmm3 642 ; SSE41-NEXT: paddb %xmm3, %xmm3 643 ; SSE41-NEXT: movdqa %xmm2, %xmm4 644 ; SSE41-NEXT: psrlw $4, %xmm4 645 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm4 646 ; SSE41-NEXT: movdqa %xmm1, %xmm0 647 ; SSE41-NEXT: pblendvb %xmm4, %xmm2 648 ; SSE41-NEXT: movdqa %xmm2, %xmm1 649 ; SSE41-NEXT: psrlw $2, %xmm1 650 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm1 651 ; SSE41-NEXT: movdqa %xmm3, %xmm0 652 ; SSE41-NEXT: pblendvb %xmm1, %xmm2 653 ; SSE41-NEXT: movdqa %xmm2, %xmm1 654 ; SSE41-NEXT: psrlw $1, %xmm1 655 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm1 656 ; SSE41-NEXT: paddb %xmm3, %xmm3 657 ; SSE41-NEXT: movdqa %xmm3, %xmm0 658 ; SSE41-NEXT: pblendvb %xmm1, %xmm2 659 ; SSE41-NEXT: movdqa %xmm2, %xmm0 660 ; SSE41-NEXT: retq 661 ; 662 ; AVX1-LABEL: splatvar_shift_v16i8: 663 ; AVX1: # BB#0: 664 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 665 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 666 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 667 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm2 668 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3 669 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm3, %xmm3 670 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 671 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm1 672 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 673 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0 674 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm1 675 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 676 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm2 677 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0 678 ; AVX1-NEXT: retq 679 ; 680 ; AVX2-LABEL: splatvar_shift_v16i8: 681 ; AVX2: # BB#0: 682 ; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1 683 ; AVX2-NEXT: vpsllw $5, %xmm1, %xmm1 684 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm2 685 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 686 ; AVX2-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 687 ; AVX2-NEXT: vpsrlw $2, %xmm0, %xmm2 688 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 689 ; AVX2-NEXT: vpaddb %xmm1, %xmm1, %xmm1 690 ; AVX2-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 691 ; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm2 692 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 693 ; AVX2-NEXT: vpaddb %xmm1, %xmm1, %xmm1 694 ; AVX2-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 695 ; AVX2-NEXT: retq 696 ; 697 ; XOPAVX1-LABEL: splatvar_shift_v16i8: 698 ; XOPAVX1: # BB#0: 699 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 700 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 701 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 702 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0 703 ; XOPAVX1-NEXT: retq 704 ; 705 ; XOPAVX2-LABEL: splatvar_shift_v16i8: 706 ; XOPAVX2: # BB#0: 707 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1 708 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 709 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm1 710 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0 711 ; XOPAVX2-NEXT: retq 712 ; 713 ; AVX512-LABEL: splatvar_shift_v16i8: 714 ; AVX512: ## BB#0: 715 ; AVX512-NEXT: vpbroadcastb %xmm1, %xmm1 716 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1 717 ; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm2 718 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 719 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 720 ; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm2 721 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 722 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1 723 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 724 ; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm2 725 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 726 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1 727 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 728 ; AVX512-NEXT: retq 729 ; 730 ; X32-SSE-LABEL: splatvar_shift_v16i8: 731 ; X32-SSE: # BB#0: 732 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 733 ; X32-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7] 734 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,1] 735 ; X32-SSE-NEXT: psllw $5, %xmm2 736 ; X32-SSE-NEXT: pxor %xmm1, %xmm1 737 ; X32-SSE-NEXT: pxor %xmm3, %xmm3 738 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3 739 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 740 ; X32-SSE-NEXT: pandn %xmm0, %xmm4 741 ; X32-SSE-NEXT: psrlw $4, %xmm0 742 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 743 ; X32-SSE-NEXT: pand %xmm3, %xmm0 744 ; X32-SSE-NEXT: por %xmm4, %xmm0 745 ; X32-SSE-NEXT: paddb %xmm2, %xmm2 746 ; X32-SSE-NEXT: pxor %xmm3, %xmm3 747 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3 748 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 749 ; X32-SSE-NEXT: pandn %xmm0, %xmm4 750 ; X32-SSE-NEXT: psrlw $2, %xmm0 751 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 752 ; X32-SSE-NEXT: pand %xmm3, %xmm0 753 ; X32-SSE-NEXT: por %xmm4, %xmm0 754 ; X32-SSE-NEXT: paddb %xmm2, %xmm2 755 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm1 756 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 757 ; X32-SSE-NEXT: pandn %xmm0, %xmm2 758 ; X32-SSE-NEXT: psrlw $1, %xmm0 759 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 760 ; X32-SSE-NEXT: pand %xmm1, %xmm0 761 ; X32-SSE-NEXT: por %xmm2, %xmm0 762 ; X32-SSE-NEXT: retl 763 %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer 764 %shift = lshr <16 x i8> %a, %splat 765 ret <16 x i8> %shift 766 } 767 768 ; 769 ; Constant Shifts 770 ; 771 772 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind { 773 ; SSE2-LABEL: constant_shift_v2i64: 774 ; SSE2: # BB#0: 775 ; SSE2-NEXT: movdqa %xmm0, %xmm1 776 ; SSE2-NEXT: psrlq $7, %xmm1 777 ; SSE2-NEXT: psrlq $1, %xmm0 778 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 779 ; SSE2-NEXT: movapd %xmm1, %xmm0 780 ; SSE2-NEXT: retq 781 ; 782 ; SSE41-LABEL: constant_shift_v2i64: 783 ; SSE41: # BB#0: 784 ; SSE41-NEXT: movdqa %xmm0, %xmm1 785 ; SSE41-NEXT: psrlq $7, %xmm1 786 ; SSE41-NEXT: psrlq $1, %xmm0 787 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 788 ; SSE41-NEXT: retq 789 ; 790 ; AVX1-LABEL: constant_shift_v2i64: 791 ; AVX1: # BB#0: 792 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm1 793 ; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 794 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 795 ; AVX1-NEXT: retq 796 ; 797 ; AVX2-LABEL: constant_shift_v2i64: 798 ; AVX2: # BB#0: 799 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0 800 ; AVX2-NEXT: retq 801 ; 802 ; XOPAVX1-LABEL: constant_shift_v2i64: 803 ; XOPAVX1: # BB#0: 804 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 805 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1 806 ; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm0 807 ; XOPAVX1-NEXT: retq 808 ; 809 ; XOPAVX2-LABEL: constant_shift_v2i64: 810 ; XOPAVX2: # BB#0: 811 ; XOPAVX2-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0 812 ; XOPAVX2-NEXT: retq 813 ; 814 ; AVX512-LABEL: constant_shift_v2i64: 815 ; AVX512: ## BB#0: 816 ; AVX512-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0 817 ; AVX512-NEXT: retq 818 ; 819 ; X32-SSE-LABEL: constant_shift_v2i64: 820 ; X32-SSE: # BB#0: 821 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 822 ; X32-SSE-NEXT: psrlq $7, %xmm1 823 ; X32-SSE-NEXT: psrlq $1, %xmm0 824 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 825 ; X32-SSE-NEXT: movapd %xmm1, %xmm0 826 ; X32-SSE-NEXT: retl 827 %shift = lshr <2 x i64> %a, <i64 1, i64 7> 828 ret <2 x i64> %shift 829 } 830 831 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind { 832 ; SSE2-LABEL: constant_shift_v4i32: 833 ; SSE2: # BB#0: 834 ; SSE2-NEXT: movdqa %xmm0, %xmm1 835 ; SSE2-NEXT: psrld $7, %xmm1 836 ; SSE2-NEXT: movdqa %xmm0, %xmm2 837 ; SSE2-NEXT: psrld $5, %xmm2 838 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1] 839 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3] 840 ; SSE2-NEXT: movdqa %xmm0, %xmm2 841 ; SSE2-NEXT: psrld $6, %xmm2 842 ; SSE2-NEXT: psrld $4, %xmm0 843 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1] 844 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 845 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 846 ; SSE2-NEXT: retq 847 ; 848 ; SSE41-LABEL: constant_shift_v4i32: 849 ; SSE41: # BB#0: 850 ; SSE41-NEXT: movdqa %xmm0, %xmm1 851 ; SSE41-NEXT: psrld $7, %xmm1 852 ; SSE41-NEXT: movdqa %xmm0, %xmm2 853 ; SSE41-NEXT: psrld $5, %xmm2 854 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7] 855 ; SSE41-NEXT: movdqa %xmm0, %xmm1 856 ; SSE41-NEXT: psrld $6, %xmm1 857 ; SSE41-NEXT: psrld $4, %xmm0 858 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 859 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 860 ; SSE41-NEXT: retq 861 ; 862 ; AVX1-LABEL: constant_shift_v4i32: 863 ; AVX1: # BB#0: 864 ; AVX1-NEXT: vpsrld $7, %xmm0, %xmm1 865 ; AVX1-NEXT: vpsrld $5, %xmm0, %xmm2 866 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7] 867 ; AVX1-NEXT: vpsrld $6, %xmm0, %xmm2 868 ; AVX1-NEXT: vpsrld $4, %xmm0, %xmm0 869 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 870 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 871 ; AVX1-NEXT: retq 872 ; 873 ; AVX2-LABEL: constant_shift_v4i32: 874 ; AVX2: # BB#0: 875 ; AVX2-NEXT: vpsrlvd {{.*}}(%rip), %xmm0, %xmm0 876 ; AVX2-NEXT: retq 877 ; 878 ; XOPAVX1-LABEL: constant_shift_v4i32: 879 ; XOPAVX1: # BB#0: 880 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0 881 ; XOPAVX1-NEXT: retq 882 ; 883 ; XOPAVX2-LABEL: constant_shift_v4i32: 884 ; XOPAVX2: # BB#0: 885 ; XOPAVX2-NEXT: vpsrlvd {{.*}}(%rip), %xmm0, %xmm0 886 ; XOPAVX2-NEXT: retq 887 ; 888 ; AVX512-LABEL: constant_shift_v4i32: 889 ; AVX512: ## BB#0: 890 ; AVX512-NEXT: vpsrlvd {{.*}}(%rip), %xmm0, %xmm0 891 ; AVX512-NEXT: retq 892 ; 893 ; X32-SSE-LABEL: constant_shift_v4i32: 894 ; X32-SSE: # BB#0: 895 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 896 ; X32-SSE-NEXT: psrld $7, %xmm1 897 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2 898 ; X32-SSE-NEXT: psrld $5, %xmm2 899 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1] 900 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3] 901 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2 902 ; X32-SSE-NEXT: psrld $6, %xmm2 903 ; X32-SSE-NEXT: psrld $4, %xmm0 904 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1] 905 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 906 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 907 ; X32-SSE-NEXT: retl 908 %shift = lshr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7> 909 ret <4 x i32> %shift 910 } 911 912 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind { 913 ; SSE2-LABEL: constant_shift_v8i16: 914 ; SSE2: # BB#0: 915 ; SSE2-NEXT: movdqa %xmm0, %xmm1 916 ; SSE2-NEXT: psrlw $4, %xmm1 917 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 918 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3] 919 ; SSE2-NEXT: psrlw $2, %xmm1 920 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3] 921 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 922 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0] 923 ; SSE2-NEXT: movdqa %xmm2, %xmm1 924 ; SSE2-NEXT: pand %xmm0, %xmm1 925 ; SSE2-NEXT: psrlw $1, %xmm2 926 ; SSE2-NEXT: pandn %xmm2, %xmm0 927 ; SSE2-NEXT: por %xmm1, %xmm0 928 ; SSE2-NEXT: retq 929 ; 930 ; SSE41-LABEL: constant_shift_v8i16: 931 ; SSE41: # BB#0: 932 ; SSE41-NEXT: movdqa %xmm0, %xmm1 933 ; SSE41-NEXT: psrlw $4, %xmm1 934 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7] 935 ; SSE41-NEXT: movdqa %xmm1, %xmm2 936 ; SSE41-NEXT: psrlw $2, %xmm2 937 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 938 ; SSE41-NEXT: movdqa %xmm2, %xmm0 939 ; SSE41-NEXT: psrlw $1, %xmm0 940 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3],xmm2[4],xmm0[5],xmm2[6],xmm0[7] 941 ; SSE41-NEXT: retq 942 ; 943 ; AVX1-LABEL: constant_shift_v8i16: 944 ; AVX1: # BB#0: 945 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm1 946 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 947 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm1 948 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 949 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm1 950 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7] 951 ; AVX1-NEXT: retq 952 ; 953 ; AVX2-LABEL: constant_shift_v8i16: 954 ; AVX2: # BB#0: 955 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 956 ; AVX2-NEXT: vpsrlvd {{.*}}(%rip), %ymm0, %ymm0 957 ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,20,21,24,25,28,29],zero,zero,zero,zero,zero,zero,zero,zero 958 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 959 ; AVX2-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 960 ; AVX2-NEXT: vzeroupper 961 ; AVX2-NEXT: retq 962 ; 963 ; XOP-LABEL: constant_shift_v8i16: 964 ; XOP: # BB#0: 965 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1 966 ; XOP-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1 967 ; XOP-NEXT: vpshlw %xmm1, %xmm0, %xmm0 968 ; XOP-NEXT: retq 969 ; 970 ; AVX512-LABEL: constant_shift_v8i16: 971 ; AVX512: ## BB#0: 972 ; AVX512-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 973 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7] 974 ; AVX512-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0 975 ; AVX512-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 976 ; AVX512-NEXT: retq 977 ; 978 ; X32-SSE-LABEL: constant_shift_v8i16: 979 ; X32-SSE: # BB#0: 980 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 981 ; X32-SSE-NEXT: psrlw $4, %xmm1 982 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 983 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3] 984 ; X32-SSE-NEXT: psrlw $2, %xmm1 985 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3] 986 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 987 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0] 988 ; X32-SSE-NEXT: movdqa %xmm2, %xmm1 989 ; X32-SSE-NEXT: pand %xmm0, %xmm1 990 ; X32-SSE-NEXT: psrlw $1, %xmm2 991 ; X32-SSE-NEXT: pandn %xmm2, %xmm0 992 ; X32-SSE-NEXT: por %xmm1, %xmm0 993 ; X32-SSE-NEXT: retl 994 %shift = lshr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7> 995 ret <8 x i16> %shift 996 } 997 998 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind { 999 ; SSE2-LABEL: constant_shift_v16i8: 1000 ; SSE2: # BB#0: 1001 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1002 ; SSE2-NEXT: psllw $5, %xmm2 1003 ; SSE2-NEXT: pxor %xmm1, %xmm1 1004 ; SSE2-NEXT: pxor %xmm3, %xmm3 1005 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3 1006 ; SSE2-NEXT: movdqa %xmm3, %xmm4 1007 ; SSE2-NEXT: pandn %xmm0, %xmm4 1008 ; SSE2-NEXT: psrlw $4, %xmm0 1009 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1010 ; SSE2-NEXT: pand %xmm3, %xmm0 1011 ; SSE2-NEXT: por %xmm4, %xmm0 1012 ; SSE2-NEXT: paddb %xmm2, %xmm2 1013 ; SSE2-NEXT: pxor %xmm3, %xmm3 1014 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3 1015 ; SSE2-NEXT: movdqa %xmm3, %xmm4 1016 ; SSE2-NEXT: pandn %xmm0, %xmm4 1017 ; SSE2-NEXT: psrlw $2, %xmm0 1018 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1019 ; SSE2-NEXT: pand %xmm3, %xmm0 1020 ; SSE2-NEXT: por %xmm4, %xmm0 1021 ; SSE2-NEXT: paddb %xmm2, %xmm2 1022 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1 1023 ; SSE2-NEXT: movdqa %xmm1, %xmm2 1024 ; SSE2-NEXT: pandn %xmm0, %xmm2 1025 ; SSE2-NEXT: psrlw $1, %xmm0 1026 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1027 ; SSE2-NEXT: pand %xmm1, %xmm0 1028 ; SSE2-NEXT: por %xmm2, %xmm0 1029 ; SSE2-NEXT: retq 1030 ; 1031 ; SSE41-LABEL: constant_shift_v16i8: 1032 ; SSE41: # BB#0: 1033 ; SSE41-NEXT: movdqa %xmm0, %xmm1 1034 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1035 ; SSE41-NEXT: psllw $5, %xmm0 1036 ; SSE41-NEXT: movdqa %xmm1, %xmm2 1037 ; SSE41-NEXT: psrlw $4, %xmm2 1038 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm2 1039 ; SSE41-NEXT: pblendvb %xmm2, %xmm1 1040 ; SSE41-NEXT: movdqa %xmm1, %xmm2 1041 ; SSE41-NEXT: psrlw $2, %xmm2 1042 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm2 1043 ; SSE41-NEXT: paddb %xmm0, %xmm0 1044 ; SSE41-NEXT: pblendvb %xmm2, %xmm1 1045 ; SSE41-NEXT: movdqa %xmm1, %xmm2 1046 ; SSE41-NEXT: psrlw $1, %xmm2 1047 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm2 1048 ; SSE41-NEXT: paddb %xmm0, %xmm0 1049 ; SSE41-NEXT: pblendvb %xmm2, %xmm1 1050 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1051 ; SSE41-NEXT: retq 1052 ; 1053 ; AVX-LABEL: constant_shift_v16i8: 1054 ; AVX: # BB#0: 1055 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1056 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1 1057 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2 1058 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 1059 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 1060 ; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2 1061 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 1062 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1 1063 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 1064 ; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2 1065 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 1066 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1 1067 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 1068 ; AVX-NEXT: retq 1069 ; 1070 ; XOP-LABEL: constant_shift_v16i8: 1071 ; XOP: # BB#0: 1072 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1 1073 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 1074 ; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0 1075 ; XOP-NEXT: retq 1076 ; 1077 ; AVX512-LABEL: constant_shift_v16i8: 1078 ; AVX512: ## BB#0: 1079 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1080 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1 1081 ; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm2 1082 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 1083 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 1084 ; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm2 1085 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 1086 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1 1087 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 1088 ; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm2 1089 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 1090 ; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1 1091 ; AVX512-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0 1092 ; AVX512-NEXT: retq 1093 ; 1094 ; X32-SSE-LABEL: constant_shift_v16i8: 1095 ; X32-SSE: # BB#0: 1096 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1097 ; X32-SSE-NEXT: psllw $5, %xmm2 1098 ; X32-SSE-NEXT: pxor %xmm1, %xmm1 1099 ; X32-SSE-NEXT: pxor %xmm3, %xmm3 1100 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3 1101 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 1102 ; X32-SSE-NEXT: pandn %xmm0, %xmm4 1103 ; X32-SSE-NEXT: psrlw $4, %xmm0 1104 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 1105 ; X32-SSE-NEXT: pand %xmm3, %xmm0 1106 ; X32-SSE-NEXT: por %xmm4, %xmm0 1107 ; X32-SSE-NEXT: paddb %xmm2, %xmm2 1108 ; X32-SSE-NEXT: pxor %xmm3, %xmm3 1109 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3 1110 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 1111 ; X32-SSE-NEXT: pandn %xmm0, %xmm4 1112 ; X32-SSE-NEXT: psrlw $2, %xmm0 1113 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 1114 ; X32-SSE-NEXT: pand %xmm3, %xmm0 1115 ; X32-SSE-NEXT: por %xmm4, %xmm0 1116 ; X32-SSE-NEXT: paddb %xmm2, %xmm2 1117 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm1 1118 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2 1119 ; X32-SSE-NEXT: pandn %xmm0, %xmm2 1120 ; X32-SSE-NEXT: psrlw $1, %xmm0 1121 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 1122 ; X32-SSE-NEXT: pand %xmm1, %xmm0 1123 ; X32-SSE-NEXT: por %xmm2, %xmm0 1124 ; X32-SSE-NEXT: retl 1125 %shift = lshr <16 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> 1126 ret <16 x i8> %shift 1127 } 1128 1129 ; 1130 ; Uniform Constant Shifts 1131 ; 1132 1133 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind { 1134 ; SSE-LABEL: splatconstant_shift_v2i64: 1135 ; SSE: # BB#0: 1136 ; SSE-NEXT: psrlq $7, %xmm0 1137 ; SSE-NEXT: retq 1138 ; 1139 ; AVX-LABEL: splatconstant_shift_v2i64: 1140 ; AVX: # BB#0: 1141 ; AVX-NEXT: vpsrlq $7, %xmm0, %xmm0 1142 ; AVX-NEXT: retq 1143 ; 1144 ; XOP-LABEL: splatconstant_shift_v2i64: 1145 ; XOP: # BB#0: 1146 ; XOP-NEXT: vpsrlq $7, %xmm0, %xmm0 1147 ; XOP-NEXT: retq 1148 ; 1149 ; AVX512-LABEL: splatconstant_shift_v2i64: 1150 ; AVX512: ## BB#0: 1151 ; AVX512-NEXT: vpsrlq $7, %xmm0, %xmm0 1152 ; AVX512-NEXT: retq 1153 ; 1154 ; X32-SSE-LABEL: splatconstant_shift_v2i64: 1155 ; X32-SSE: # BB#0: 1156 ; X32-SSE-NEXT: psrlq $7, %xmm0 1157 ; X32-SSE-NEXT: retl 1158 %shift = lshr <2 x i64> %a, <i64 7, i64 7> 1159 ret <2 x i64> %shift 1160 } 1161 1162 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind { 1163 ; SSE-LABEL: splatconstant_shift_v4i32: 1164 ; SSE: # BB#0: 1165 ; SSE-NEXT: psrld $5, %xmm0 1166 ; SSE-NEXT: retq 1167 ; 1168 ; AVX-LABEL: splatconstant_shift_v4i32: 1169 ; AVX: # BB#0: 1170 ; AVX-NEXT: vpsrld $5, %xmm0, %xmm0 1171 ; AVX-NEXT: retq 1172 ; 1173 ; XOP-LABEL: splatconstant_shift_v4i32: 1174 ; XOP: # BB#0: 1175 ; XOP-NEXT: vpsrld $5, %xmm0, %xmm0 1176 ; XOP-NEXT: retq 1177 ; 1178 ; AVX512-LABEL: splatconstant_shift_v4i32: 1179 ; AVX512: ## BB#0: 1180 ; AVX512-NEXT: vpsrld $5, %xmm0, %xmm0 1181 ; AVX512-NEXT: retq 1182 ; 1183 ; X32-SSE-LABEL: splatconstant_shift_v4i32: 1184 ; X32-SSE: # BB#0: 1185 ; X32-SSE-NEXT: psrld $5, %xmm0 1186 ; X32-SSE-NEXT: retl 1187 %shift = lshr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5> 1188 ret <4 x i32> %shift 1189 } 1190 1191 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind { 1192 ; SSE-LABEL: splatconstant_shift_v8i16: 1193 ; SSE: # BB#0: 1194 ; SSE-NEXT: psrlw $3, %xmm0 1195 ; SSE-NEXT: retq 1196 ; 1197 ; AVX-LABEL: splatconstant_shift_v8i16: 1198 ; AVX: # BB#0: 1199 ; AVX-NEXT: vpsrlw $3, %xmm0, %xmm0 1200 ; AVX-NEXT: retq 1201 ; 1202 ; XOP-LABEL: splatconstant_shift_v8i16: 1203 ; XOP: # BB#0: 1204 ; XOP-NEXT: vpsrlw $3, %xmm0, %xmm0 1205 ; XOP-NEXT: retq 1206 ; 1207 ; AVX512-LABEL: splatconstant_shift_v8i16: 1208 ; AVX512: ## BB#0: 1209 ; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm0 1210 ; AVX512-NEXT: retq 1211 ; 1212 ; X32-SSE-LABEL: splatconstant_shift_v8i16: 1213 ; X32-SSE: # BB#0: 1214 ; X32-SSE-NEXT: psrlw $3, %xmm0 1215 ; X32-SSE-NEXT: retl 1216 %shift = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 1217 ret <8 x i16> %shift 1218 } 1219 1220 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind { 1221 ; SSE-LABEL: splatconstant_shift_v16i8: 1222 ; SSE: # BB#0: 1223 ; SSE-NEXT: psrlw $3, %xmm0 1224 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0 1225 ; SSE-NEXT: retq 1226 ; 1227 ; AVX-LABEL: splatconstant_shift_v16i8: 1228 ; AVX: # BB#0: 1229 ; AVX-NEXT: vpsrlw $3, %xmm0, %xmm0 1230 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 1231 ; AVX-NEXT: retq 1232 ; 1233 ; XOP-LABEL: splatconstant_shift_v16i8: 1234 ; XOP: # BB#0: 1235 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1 1236 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 1237 ; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0 1238 ; XOP-NEXT: retq 1239 ; 1240 ; AVX512-LABEL: splatconstant_shift_v16i8: 1241 ; AVX512: ## BB#0: 1242 ; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm0 1243 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 1244 ; AVX512-NEXT: retq 1245 ; 1246 ; X32-SSE-LABEL: splatconstant_shift_v16i8: 1247 ; X32-SSE: # BB#0: 1248 ; X32-SSE-NEXT: psrlw $3, %xmm0 1249 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0 1250 ; X32-SSE-NEXT: retl 1251 %shift = lshr <16 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> 1252 ret <16 x i8> %shift 1253 } 1254