define <16 x i32> @test_mul_v16i32_v16i16(<16 x i16> %A) {
; SLM32-LABEL: test_mul_v16i32_v16i16:
; SLM32: # %bb.0:
-; SLM32-NEXT: movdqa %xmm0, %xmm4
-; SLM32-NEXT: movdqa {{.*#+}} xmm0 = [18778,18778,18778,18778,18778,18778,18778,18778]
; SLM32-NEXT: movdqa %xmm1, %xmm3
-; SLM32-NEXT: movdqa %xmm4, %xmm2
-; SLM32-NEXT: pmullw %xmm0, %xmm4
+; SLM32-NEXT: movdqa %xmm0, %xmm1
+; SLM32-NEXT: movdqa {{.*#+}} xmm0 = [18778,18778,18778,18778,18778,18778,18778,18778]
+; SLM32-NEXT: movdqa %xmm1, %xmm2
+; SLM32-NEXT: movdqa %xmm3, %xmm4
+; SLM32-NEXT: pmullw %xmm0, %xmm1
; SLM32-NEXT: pmulhuw %xmm0, %xmm2
; SLM32-NEXT: pmullw %xmm0, %xmm3
-; SLM32-NEXT: pmulhuw %xmm0, %xmm1
-; SLM32-NEXT: movdqa %xmm4, %xmm0
-; SLM32-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
+; SLM32-NEXT: pmulhuw %xmm0, %xmm4
+; SLM32-NEXT: movdqa %xmm1, %xmm0
+; SLM32-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
; SLM32-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
; SLM32-NEXT: movdqa %xmm3, %xmm2
-; SLM32-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
-; SLM32-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
-; SLM32-NEXT: movdqa %xmm4, %xmm1
+; SLM32-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
+; SLM32-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
; SLM32-NEXT: retl
;
; SLM64-LABEL: test_mul_v16i32_v16i16:
; SLM64: # %bb.0:
-; SLM64-NEXT: movdqa %xmm0, %xmm4
-; SLM64-NEXT: movdqa {{.*#+}} xmm0 = [18778,18778,18778,18778,18778,18778,18778,18778]
; SLM64-NEXT: movdqa %xmm1, %xmm3
-; SLM64-NEXT: movdqa %xmm4, %xmm2
-; SLM64-NEXT: pmullw %xmm0, %xmm4
+; SLM64-NEXT: movdqa %xmm0, %xmm1
+; SLM64-NEXT: movdqa {{.*#+}} xmm0 = [18778,18778,18778,18778,18778,18778,18778,18778]
+; SLM64-NEXT: movdqa %xmm1, %xmm2
+; SLM64-NEXT: movdqa %xmm3, %xmm4
+; SLM64-NEXT: pmullw %xmm0, %xmm1
; SLM64-NEXT: pmulhuw %xmm0, %xmm2
; SLM64-NEXT: pmullw %xmm0, %xmm3
-; SLM64-NEXT: pmulhuw %xmm0, %xmm1
-; SLM64-NEXT: movdqa %xmm4, %xmm0
-; SLM64-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
+; SLM64-NEXT: pmulhuw %xmm0, %xmm4
+; SLM64-NEXT: movdqa %xmm1, %xmm0
+; SLM64-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
; SLM64-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
; SLM64-NEXT: movdqa %xmm3, %xmm2
-; SLM64-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
-; SLM64-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
-; SLM64-NEXT: movdqa %xmm4, %xmm1
+; SLM64-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
+; SLM64-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
; SLM64-NEXT: retq
;
; SLOW32-LABEL: test_mul_v16i32_v16i16:
# CHECK-NEXT: 1 1 1.00 pextrw $1, %xmm0, %ecx
# CHECK-NEXT: 1 1 1.00 pinsrw $1, %eax, %xmm0
# CHECK-NEXT: 1 4 1.00 * pinsrw $1, (%rax), %xmm0
-# CHECK-NEXT: 2 5 2.00 pmaddwd %xmm0, %xmm2
-# CHECK-NEXT: 2 8 2.00 * pmaddwd (%rax), %xmm2
+# CHECK-NEXT: 1 5 2.00 pmaddwd %xmm0, %xmm2
+# CHECK-NEXT: 1 8 2.00 * pmaddwd (%rax), %xmm2
# CHECK-NEXT: 1 1 0.50 pmaxsw %xmm0, %xmm2
# CHECK-NEXT: 1 4 1.00 * pmaxsw (%rax), %xmm2
# CHECK-NEXT: 1 1 0.50 pmaxub %xmm0, %xmm2
# CHECK-NEXT: 1 1 0.50 pminub %xmm0, %xmm2
# CHECK-NEXT: 1 4 1.00 * pminub (%rax), %xmm2
# CHECK-NEXT: 1 4 1.00 pmovmskb %xmm0, %ecx
-# CHECK-NEXT: 2 5 2.00 pmulhuw %xmm0, %xmm2
-# CHECK-NEXT: 2 8 2.00 * pmulhuw (%rax), %xmm2
-# CHECK-NEXT: 2 5 2.00 pmulhw %xmm0, %xmm2
-# CHECK-NEXT: 2 8 2.00 * pmulhw (%rax), %xmm2
-# CHECK-NEXT: 2 5 2.00 pmullw %xmm0, %xmm2
-# CHECK-NEXT: 2 8 2.00 * pmullw (%rax), %xmm2
+# CHECK-NEXT: 1 5 2.00 pmulhuw %xmm0, %xmm2
+# CHECK-NEXT: 1 8 2.00 * pmulhuw (%rax), %xmm2
+# CHECK-NEXT: 1 5 2.00 pmulhw %xmm0, %xmm2
+# CHECK-NEXT: 1 8 2.00 * pmulhw (%rax), %xmm2
+# CHECK-NEXT: 1 5 2.00 pmullw %xmm0, %xmm2
+# CHECK-NEXT: 1 8 2.00 * pmullw (%rax), %xmm2
# CHECK-NEXT: 1 4 1.00 pmuludq %mm0, %mm2
# CHECK-NEXT: 1 7 1.00 * pmuludq (%rax), %mm2
-# CHECK-NEXT: 2 5 2.00 pmuludq %xmm0, %xmm2
-# CHECK-NEXT: 2 8 2.00 * pmuludq (%rax), %xmm2
+# CHECK-NEXT: 1 5 2.00 pmuludq %xmm0, %xmm2
+# CHECK-NEXT: 1 8 2.00 * pmuludq (%rax), %xmm2
# CHECK-NEXT: 1 1 0.50 por %xmm0, %xmm2
# CHECK-NEXT: 1 4 1.00 * por (%rax), %xmm2
# CHECK-NEXT: 1 4 1.00 psadbw %xmm0, %xmm2