[X86][Atom] Fix integer shuffles uops, latency and throughput
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 17 Sep 2021 10:51:46 +0000 (11:51 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 17 Sep 2021 11:11:54 +0000 (12:11 +0100)
The MMX pack/unpck shuffles don't need an override - they have the same behaviour as other shuffles (Port0 only).
The SSE pslldq/psrldq shuffles don't need an override - they have the same behaviour as other shuffles (Port0 only).
The SSE pshufb shuffles use 4uops (+1 load).

Noticed the pslldq/psrldq issue while trying to improve reduction costs via the D103695 helper script, and fixed the others while reviewing. Confirmed with Intel AoM / Agner / InstLatX64.

llvm/lib/Target/X86/X86ScheduleAtom.td
llvm/test/tools/llvm-mca/X86/Atom/resources-mmx.s
llvm/test/tools/llvm-mca/X86/Atom/resources-sse2.s
llvm/test/tools/llvm-mca/X86/Atom/resources-ssse3.s

index 796baa2..e9020f5 100644 (file)
@@ -424,7 +424,7 @@ defm : AtomWriteResPair<WriteShuffleX,      [AtomPort0],  [AtomPort0], 1, 1>;
 defm : X86WriteResPairUnsupported<WriteShuffleY>;
 defm : X86WriteResPairUnsupported<WriteShuffleZ>;
 defm : AtomWriteResPair<WriteVarShuffle,    [AtomPort0],  [AtomPort0], 1, 1>;
-defm : AtomWriteResPair<WriteVarShuffleX,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 4, 5, [3,3], [4,4]>;
+defm : AtomWriteResPair<WriteVarShuffleX,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 4, 5, [3,3], [4,4], 4, 5>;
 defm : X86WriteResPairUnsupported<WriteVarShuffleY>;
 defm : X86WriteResPairUnsupported<WriteVarShuffleZ>;
 defm : X86WriteResPairUnsupported<WriteBlend>;
@@ -558,10 +558,7 @@ def AtomWrite01_1 : SchedWriteRes<[AtomPort01]> {
 def : InstRW<[AtomWrite01_1], (instrs FDECSTP, FFREE, FFREEP, FINCSTP, WAIT,
                                       LFENCE,
                                       STOSB, STOSL, STOSQ, STOSW,
-                                      MOVSSrr, MOVSSrr_REV,
-                                      PSLLDQri, PSRLDQri)>;
-def : InstRW<[AtomWrite01_1], (instregex "MMX_PACK(SSDW|SSWB|USWB)irr",
-                                         "MMX_PUNPCKH(BW|DQ|WD)irr")>;
+                                      MOVSSrr, MOVSSrr_REV)>;
 
 def AtomWrite01_2 : SchedWriteRes<[AtomPort01]> {
   let Latency = 2;
index 1bc1ab0..bc929e1 100644 (file)
@@ -173,11 +173,11 @@ pxor        (%rax), %mm2
 # CHECK-NEXT:  1      1     1.00    *                   movq   (%rax), %mm2
 # CHECK-NEXT:  1      3     3.00                        movq   %mm0, %rcx
 # CHECK-NEXT:  1      1     1.00           *            movq   %mm0, (%rax)
-# CHECK-NEXT:  1      1     0.50                        packsswb       %mm0, %mm2
+# CHECK-NEXT:  1      1     1.00                        packsswb       %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   packsswb       (%rax), %mm2
-# CHECK-NEXT:  1      1     0.50                        packssdw       %mm0, %mm2
+# CHECK-NEXT:  1      1     1.00                        packssdw       %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   packssdw       (%rax), %mm2
-# CHECK-NEXT:  1      1     0.50                        packuswb       %mm0, %mm2
+# CHECK-NEXT:  1      1     1.00                        packuswb       %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   packuswb       (%rax), %mm2
 # CHECK-NEXT:  1      1     0.50                        paddb  %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   paddb  (%rax), %mm2
@@ -255,11 +255,11 @@ pxor        (%rax), %mm2
 # CHECK-NEXT:  1      1     1.00    *                   psubusw        (%rax), %mm2
 # CHECK-NEXT:  1      1     0.50                        psubw  %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   psubw  (%rax), %mm2
-# CHECK-NEXT:  1      1     0.50                        punpckhbw      %mm0, %mm2
+# CHECK-NEXT:  1      1     1.00                        punpckhbw      %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   punpckhbw      (%rax), %mm2
-# CHECK-NEXT:  1      1     0.50                        punpckhdq      %mm0, %mm2
+# CHECK-NEXT:  1      1     1.00                        punpckhdq      %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   punpckhdq      (%rax), %mm2
-# CHECK-NEXT:  1      1     0.50                        punpckhwd      %mm0, %mm2
+# CHECK-NEXT:  1      1     1.00                        punpckhwd      %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   punpckhwd      (%rax), %mm2
 # CHECK-NEXT:  1      1     1.00                        punpcklbw      %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   punpcklbw      (%rax), %mm2
@@ -276,7 +276,7 @@ pxor        (%rax), %mm2
 
 # CHECK:      Resource pressure per iteration:
 # CHECK-NEXT: [0]    [1]
-# CHECK-NEXT: 103.50 41.50
+# CHECK-NEXT: 106.50 38.50
 
 # CHECK:      Resource pressure by instruction:
 # CHECK-NEXT: [0]    [1]    Instructions:
@@ -289,11 +289,11 @@ pxor        (%rax), %mm2
 # CHECK-NEXT: 1.00    -     movq       (%rax), %mm2
 # CHECK-NEXT: 3.00    -     movq       %mm0, %rcx
 # CHECK-NEXT: 1.00    -     movq       %mm0, (%rax)
-# CHECK-NEXT: 0.50   0.50   packsswb   %mm0, %mm2
+# CHECK-NEXT: 1.00    -     packsswb   %mm0, %mm2
 # CHECK-NEXT: 1.00    -     packsswb   (%rax), %mm2
-# CHECK-NEXT: 0.50   0.50   packssdw   %mm0, %mm2
+# CHECK-NEXT: 1.00    -     packssdw   %mm0, %mm2
 # CHECK-NEXT: 1.00    -     packssdw   (%rax), %mm2
-# CHECK-NEXT: 0.50   0.50   packuswb   %mm0, %mm2
+# CHECK-NEXT: 1.00    -     packuswb   %mm0, %mm2
 # CHECK-NEXT: 1.00    -     packuswb   (%rax), %mm2
 # CHECK-NEXT: 0.50   0.50   paddb      %mm0, %mm2
 # CHECK-NEXT: 1.00    -     paddb      (%rax), %mm2
@@ -371,11 +371,11 @@ pxor        (%rax), %mm2
 # CHECK-NEXT: 1.00    -     psubusw    (%rax), %mm2
 # CHECK-NEXT: 0.50   0.50   psubw      %mm0, %mm2
 # CHECK-NEXT: 1.00    -     psubw      (%rax), %mm2
-# CHECK-NEXT: 0.50   0.50   punpckhbw  %mm0, %mm2
+# CHECK-NEXT: 1.00    -     punpckhbw  %mm0, %mm2
 # CHECK-NEXT: 1.00    -     punpckhbw  (%rax), %mm2
-# CHECK-NEXT: 0.50   0.50   punpckhdq  %mm0, %mm2
+# CHECK-NEXT: 1.00    -     punpckhdq  %mm0, %mm2
 # CHECK-NEXT: 1.00    -     punpckhdq  (%rax), %mm2
-# CHECK-NEXT: 0.50   0.50   punpckhwd  %mm0, %mm2
+# CHECK-NEXT: 1.00    -     punpckhwd  %mm0, %mm2
 # CHECK-NEXT: 1.00    -     punpckhwd  (%rax), %mm2
 # CHECK-NEXT: 1.00    -     punpcklbw  %mm0, %mm2
 # CHECK-NEXT: 1.00    -     punpcklbw  (%rax), %mm2
index 4536b7f..2cd1d8d 100644 (file)
@@ -597,7 +597,7 @@ xorpd       (%rax), %xmm2
 # CHECK-NEXT:  1      1     1.00                        pslld  $1, %xmm2
 # CHECK-NEXT:  1      2     1.00                        pslld  %xmm0, %xmm2
 # CHECK-NEXT:  1      3     2.00    *                   pslld  (%rax), %xmm2
-# CHECK-NEXT:  1      1     0.50                        pslldq $1, %xmm2
+# CHECK-NEXT:  1      1     1.00                        pslldq $1, %xmm2
 # CHECK-NEXT:  1      1     1.00                        psllq  $1, %xmm2
 # CHECK-NEXT:  1      2     1.00                        psllq  %xmm0, %xmm2
 # CHECK-NEXT:  1      3     2.00    *                   psllq  (%rax), %xmm2
@@ -613,7 +613,7 @@ xorpd       (%rax), %xmm2
 # CHECK-NEXT:  1      1     1.00                        psrld  $1, %xmm2
 # CHECK-NEXT:  1      2     1.00                        psrld  %xmm0, %xmm2
 # CHECK-NEXT:  1      3     2.00    *                   psrld  (%rax), %xmm2
-# CHECK-NEXT:  1      1     0.50                        psrldq $1, %xmm2
+# CHECK-NEXT:  1      1     1.00                        psrldq $1, %xmm2
 # CHECK-NEXT:  1      1     1.00                        psrlq  $1, %xmm2
 # CHECK-NEXT:  1      2     1.00                        psrlq  %xmm0, %xmm2
 # CHECK-NEXT:  1      3     2.00    *                   psrlq  (%rax), %xmm2
@@ -681,7 +681,7 @@ xorpd       (%rax), %xmm2
 
 # CHECK:      Resource pressure per iteration:
 # CHECK-NEXT: [0]    [1]
-# CHECK-NEXT: 912.00 774.00
+# CHECK-NEXT: 913.00 773.00
 
 # CHECK:      Resource pressure by instruction:
 # CHECK-NEXT: [0]    [1]    Instructions:
@@ -875,7 +875,7 @@ xorpd       (%rax), %xmm2
 # CHECK-NEXT: 1.00    -     pslld      $1, %xmm2
 # CHECK-NEXT: 1.00   1.00   pslld      %xmm0, %xmm2
 # CHECK-NEXT: 2.00   2.00   pslld      (%rax), %xmm2
-# CHECK-NEXT: 0.50   0.50   pslldq     $1, %xmm2
+# CHECK-NEXT: 1.00    -     pslldq     $1, %xmm2
 # CHECK-NEXT: 1.00    -     psllq      $1, %xmm2
 # CHECK-NEXT: 1.00   1.00   psllq      %xmm0, %xmm2
 # CHECK-NEXT: 2.00   2.00   psllq      (%rax), %xmm2
@@ -891,7 +891,7 @@ xorpd       (%rax), %xmm2
 # CHECK-NEXT: 1.00    -     psrld      $1, %xmm2
 # CHECK-NEXT: 1.00   1.00   psrld      %xmm0, %xmm2
 # CHECK-NEXT: 2.00   2.00   psrld      (%rax), %xmm2
-# CHECK-NEXT: 0.50   0.50   psrldq     $1, %xmm2
+# CHECK-NEXT: 1.00    -     psrldq     $1, %xmm2
 # CHECK-NEXT: 1.00    -     psrlq      $1, %xmm2
 # CHECK-NEXT: 1.00   1.00   psrlq      %xmm0, %xmm2
 # CHECK-NEXT: 2.00   2.00   psrlq      (%rax), %xmm2
index dc2e41a..b04be1a 100644 (file)
@@ -156,8 +156,8 @@ psignw      (%rax), %xmm2
 # CHECK-NEXT:  1      5     2.00    *                   pmulhrsw       (%rax), %xmm2
 # CHECK-NEXT:  1      1     1.00                        pshufb %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   pshufb (%rax), %mm2
-# CHECK-NEXT:  1      4     3.00                        pshufb %xmm0, %xmm2
-# CHECK-NEXT:  1      5     4.00    *                   pshufb (%rax), %xmm2
+# CHECK-NEXT:  4      4     3.00                        pshufb %xmm0, %xmm2
+# CHECK-NEXT:  5      5     4.00    *                   pshufb (%rax), %xmm2
 # CHECK-NEXT:  1      1     0.50                        psignb %mm0, %mm2
 # CHECK-NEXT:  1      1     1.00    *                   psignb (%rax), %mm2
 # CHECK-NEXT:  1      1     0.50                        psignb %xmm0, %xmm2