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