defm : SLMWriteResPair<WriteVecIMulX, [SLM_FPC_RSV0], 5, [2]>;
defm : SLMWriteResPair<WriteVecIMulY, [SLM_FPC_RSV0], 5, [2]>;
defm : X86WriteResPairUnsupported<WriteVecIMulZ>;
-// FIXME: The below is closer to correct, but caused some perf regressions.
-//defm : SLMWriteResPair<WritePMULLD, [SLM_FPC_RSV0], 11, [11], 7>;
-defm : SLMWriteResPair<WritePMULLD, [SLM_FPC_RSV0], 4>;
-defm : SLMWriteResPair<WritePMULLDY, [SLM_FPC_RSV0], 4>;
+defm : SLMWriteResPair<WritePMULLD, [SLM_FPC_RSV0], 11, [11], 7>;
+defm : X86WriteResPairUnsupported<WritePMULLDY>;
defm : X86WriteResPairUnsupported<WritePMULLDZ>;
defm : SLMWriteResPair<WriteShuffle, [SLM_FPC_RSV0], 1>;
defm : SLMWriteResPair<WriteShuffleY, [SLM_FPC_RSV0], 1>;
define <8 x i32> @test_mul_v8i32_v8i16_minsize(<8 x i16> %A) minsize {
; SLM-LABEL: test_mul_v8i32_v8i16_minsize:
; SLM: # %bb.0:
-; SLM-NEXT: pxor %xmm1, %xmm1
-; SLM-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
-; SLM-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
; SLM-NEXT: movdqa {{.*#+}} xmm1 = [18778,18778,18778,18778]
+; SLM-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
+; SLM-NEXT: pxor %xmm3, %xmm3
+; SLM-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
; SLM-NEXT: pmulld %xmm1, %xmm2
; SLM-NEXT: pmulld %xmm0, %xmm1
; SLM-NEXT: movdqa %xmm2, %xmm0
define <16 x i32> @test_mul_v16i32_v16i16_minsize(<16 x i16> %A) minsize {
; SLM-LABEL: test_mul_v16i32_v16i16_minsize:
; SLM: # %bb.0:
+; SLM-NEXT: movdqa {{.*#+}} xmm3 = [18778,18778,18778,18778]
; SLM-NEXT: movdqa %xmm0, %xmm4
-; SLM-NEXT: pxor %xmm3, %xmm3
+; SLM-NEXT: pxor %xmm5, %xmm5
; SLM-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
; SLM-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
-; SLM-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
-; SLM-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
-; SLM-NEXT: movdqa {{.*#+}} xmm3 = [18778,18778,18778,18778]
+; SLM-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]
+; SLM-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm5[4],xmm1[5],xmm5[5],xmm1[6],xmm5[6],xmm1[7],xmm5[7]
; SLM-NEXT: pmulld %xmm3, %xmm4
; SLM-NEXT: pmulld %xmm3, %xmm0
; SLM-NEXT: pmulld %xmm3, %xmm2
# CHECK-NEXT: 1 4 1.00 * pmovzxwq (%rax), %xmm2
# CHECK-NEXT: 1 5 2.00 pmuldq %xmm0, %xmm2
# CHECK-NEXT: 1 8 2.00 * pmuldq (%rax), %xmm2
-# CHECK-NEXT: 1 4 1.00 pmulld %xmm0, %xmm2
-# CHECK-NEXT: 1 7 1.00 * pmulld (%rax), %xmm2
+# CHECK-NEXT: 7 11 11.00 pmulld %xmm0, %xmm2
+# CHECK-NEXT: 7 14 11.00 * pmulld (%rax), %xmm2
# CHECK-NEXT: 1 1 0.50 ptest %xmm0, %xmm1
# CHECK-NEXT: 1 4 1.00 * ptest (%rax), %xmm1
# CHECK-NEXT: 1 3 1.00 roundpd $1, %xmm0, %xmm2
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7]
-# CHECK-NEXT: - - - 108.00 65.00 - - 54.00
+# CHECK-NEXT: - - - 128.00 65.00 - - 54.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] Instructions:
# CHECK-NEXT: - - - 1.00 - - - 1.00 pmovzxwq (%rax), %xmm2
# CHECK-NEXT: - - - 2.00 - - - - pmuldq %xmm0, %xmm2
# CHECK-NEXT: - - - 2.00 - - - 1.00 pmuldq (%rax), %xmm2
-# CHECK-NEXT: - - - 1.00 - - - - pmulld %xmm0, %xmm2
-# CHECK-NEXT: - - - 1.00 - - - 1.00 pmulld (%rax), %xmm2
+# CHECK-NEXT: - - - 11.00 - - - - pmulld %xmm0, %xmm2
+# CHECK-NEXT: - - - 11.00 - - - 1.00 pmulld (%rax), %xmm2
# CHECK-NEXT: - - - 0.50 0.50 - - - ptest %xmm0, %xmm1
# CHECK-NEXT: - - - 0.50 0.50 - - 1.00 ptest (%rax), %xmm1
# CHECK-NEXT: - - - - 1.00 - - - roundpd $1, %xmm0, %xmm2