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