@@ -2344,6 +2344,64 @@ define i8 @illegal_v8i8(i8 %a0, <8 x i8>* %a1) {
2344
2344
ret i8 %mul
2345
2345
}
2346
2346
2347
+ define i8 @PR51858 (i128 %arg ) {
2348
+ ; SSE2-LABEL: PR51858:
2349
+ ; SSE2: # %bb.0:
2350
+ ; SSE2-NEXT: movq %rdi, %xmm0
2351
+ ; SSE2-NEXT: movq %rsi, %xmm1
2352
+ ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2353
+ ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2354
+ ; SSE2-NEXT: pmullw %xmm1, %xmm0
2355
+ ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2356
+ ; SSE2-NEXT: pmullw %xmm0, %xmm1
2357
+ ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
2358
+ ; SSE2-NEXT: pmullw %xmm1, %xmm0
2359
+ ; SSE2-NEXT: movdqa %xmm0, %xmm1
2360
+ ; SSE2-NEXT: psrld $16, %xmm1
2361
+ ; SSE2-NEXT: pmullw %xmm0, %xmm1
2362
+ ; SSE2-NEXT: movd %xmm1, %eax
2363
+ ; SSE2-NEXT: # kill: def $al killed $al killed $eax
2364
+ ; SSE2-NEXT: retq
2365
+ ;
2366
+ ; SSE41-LABEL: PR51858:
2367
+ ; SSE41: # %bb.0:
2368
+ ; SSE41-NEXT: movq %rdi, %xmm0
2369
+ ; SSE41-NEXT: movq %rsi, %xmm1
2370
+ ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2371
+ ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2372
+ ; SSE41-NEXT: pmullw %xmm1, %xmm0
2373
+ ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2374
+ ; SSE41-NEXT: pmullw %xmm0, %xmm1
2375
+ ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
2376
+ ; SSE41-NEXT: pmullw %xmm1, %xmm0
2377
+ ; SSE41-NEXT: movdqa %xmm0, %xmm1
2378
+ ; SSE41-NEXT: psrld $16, %xmm1
2379
+ ; SSE41-NEXT: pmullw %xmm0, %xmm1
2380
+ ; SSE41-NEXT: movd %xmm1, %eax
2381
+ ; SSE41-NEXT: # kill: def $al killed $al killed $eax
2382
+ ; SSE41-NEXT: retq
2383
+ ;
2384
+ ; AVX-LABEL: PR51858:
2385
+ ; AVX: # %bb.0:
2386
+ ; AVX-NEXT: vmovq %rdi, %xmm0
2387
+ ; AVX-NEXT: vmovq %rsi, %xmm1
2388
+ ; AVX-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2389
+ ; AVX-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2390
+ ; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0
2391
+ ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2392
+ ; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0
2393
+ ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
2394
+ ; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0
2395
+ ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
2396
+ ; AVX-NEXT: vpmullw %xmm1, %xmm0, %xmm0
2397
+ ; AVX-NEXT: vmovd %xmm0, %eax
2398
+ ; AVX-NEXT: # kill: def $al killed $al killed $eax
2399
+ ; AVX-NEXT: retq
2400
+ %vec = bitcast i128 %arg to <16 x i8 >
2401
+ %red = tail call i8 @llvm.vector.reduce.mul.v16i8 (<16 x i8 > %vec )
2402
+ ret i8 %red
2403
+ }
2404
+
2347
2405
declare i64 @llvm.vector.reduce.mul.v2i64 (<2 x i64 >)
2348
2406
declare i64 @llvm.vector.reduce.mul.v4i64 (<4 x i64 >)
2349
2407
declare i64 @llvm.vector.reduce.mul.v8i64 (<8 x i64 >)
0 commit comments