[X86][Atom] Specific uops for all IMUL/IDIV instructions
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 19 Sep 2021 15:58:40 +0000 (16:58 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 19 Sep 2021 15:58:52 +0000 (16:58 +0100)
Based off a mixture of llvm-exegesis captures (PR36895) and Intel AoM / Agner / InstLatX64 reports.

llvm/lib/Target/X86/X86ScheduleAtom.td
llvm/test/tools/llvm-mca/X86/Atom/resources-x86_64.s

index 4c6a939..1087fda 100644 (file)
@@ -84,16 +84,16 @@ def : WriteRes<WriteRMW, [AtomPort0]>;
 defm : AtomWriteResPair<WriteALU,    [AtomPort01], [AtomPort0]>;
 defm : AtomWriteResPair<WriteADC,    [AtomPort01], [AtomPort0]>;
 
-defm : AtomWriteResPair<WriteIMul8,     [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  7,  7,  [7,7],  [7,7]>;
-defm : AtomWriteResPair<WriteIMul16,    [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  7,  8,  [7,7],  [8,8]>;
-defm : AtomWriteResPair<WriteIMul16Imm, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  6,  7,  [6,6],  [7,7]>;
-defm : AtomWriteResPair<WriteIMul16Reg, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  6,  7,  [6,6],  [7,7]>;
-defm : AtomWriteResPair<WriteIMul32,    [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  6,  7,  [6,6],  [7,7]>;
+defm : AtomWriteResPair<WriteIMul8,     [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  7,  7,  [7,7],  [7,7], 3, 3>;
+defm : AtomWriteResPair<WriteIMul16,    [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  7,  8,  [7,7],  [8,8], 4, 5>;
+defm : AtomWriteResPair<WriteIMul16Imm, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  6,  7,  [6,6],  [7,7], 2, 3>;
+defm : AtomWriteResPair<WriteIMul16Reg, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  6,  7,  [6,6],  [7,7], 2, 3>;
+defm : AtomWriteResPair<WriteIMul32,    [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],  6,  7,  [6,6],  [7,7], 3, 4>;
 defm : AtomWriteResPair<WriteIMul32Imm, [AtomPort0],  [AtomPort0],   5,  5,  [5],  [5]>;
 defm : AtomWriteResPair<WriteIMul32Reg, [AtomPort0],  [AtomPort0],   5,  5,  [5],  [5]>;
-defm : AtomWriteResPair<WriteIMul64,    [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 12, 12, [12,12], [12,12]>;
-defm : AtomWriteResPair<WriteIMul64Imm, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 14, 14, [14,14], [14,14]>;
-defm : AtomWriteResPair<WriteIMul64Reg, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 12, 12, [12,12], [12,12]>;
+defm : AtomWriteResPair<WriteIMul64,    [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 12, 12, [12,12], [12,12], 8, 8>;
+defm : AtomWriteResPair<WriteIMul64Imm, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 14, 14, [14,14], [14,14], 7, 7>;
+defm : AtomWriteResPair<WriteIMul64Reg, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 12, 12, [12,12], [12,12], 6, 6>;
 defm : X86WriteResUnsupported<WriteIMulH>;
 defm : X86WriteResUnsupported<WriteIMulHLd>;
 defm : X86WriteResPairUnsupported<WriteMULX32>;
@@ -105,14 +105,14 @@ defm : X86WriteRes<WriteBSWAP64,     [AtomPort0], 1, [1], 1>;
 defm : AtomWriteResPair<WriteCMPXCHG, [AtomPort01], [AtomPort01], 15, 15, [15]>;
 defm : X86WriteRes<WriteCMPXCHGRMW,   [AtomPort01, AtomPort0], 1, [1, 1], 1>;
 
-defm : AtomWriteResPair<WriteDiv8,   [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 68, [50,50], [68,68]>;
-defm : AtomWriteResPair<WriteDiv16,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 50, [50,50], [50,50]>;
-defm : AtomWriteResPair<WriteDiv32,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 50, [50,50], [50,50]>;
-defm : AtomWriteResPair<WriteDiv64,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],130,130,[130,130],[130,130]>;
-defm : AtomWriteResPair<WriteIDiv8,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62]>;
-defm : AtomWriteResPair<WriteIDiv16, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62]>;
-defm : AtomWriteResPair<WriteIDiv32, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62]>;
-defm : AtomWriteResPair<WriteIDiv64, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],130,130,[130,130],[130,130]>;
+defm : AtomWriteResPair<WriteDiv8,   [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 68, [50,50], [68,68],  9,  9>;
+defm : AtomWriteResPair<WriteDiv16,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 50, [50,50], [50,50], 12, 12>;
+defm : AtomWriteResPair<WriteDiv32,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 50, 50, [50,50], [50,50], 12, 12>;
+defm : AtomWriteResPair<WriteDiv64,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],130,130,[130,130],[130,130], 38, 38>;
+defm : AtomWriteResPair<WriteIDiv8,  [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 26, 26>;
+defm : AtomWriteResPair<WriteIDiv16, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 29, 29>;
+defm : AtomWriteResPair<WriteIDiv32, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1], 62, 62, [62,62], [62,62], 29, 29>;
+defm : AtomWriteResPair<WriteIDiv64, [AtomPort0,AtomPort1], [AtomPort0,AtomPort1],130,130,[130,130],[130,130], 60, 60>;
 
 defm : X86WriteResPairUnsupported<WriteCRC32>;
 
index 574cb2b..cad85f1 100644 (file)
@@ -1317,49 +1317,49 @@ xorq (%rax), %rdi
 # CHECK-NEXT:  1      1     0.50                        decq   %rdi
 # CHECK-NEXT:  1      1     1.00    *      *            decq   (%rax)
 # CHECK-NEXT:  1      1     1.00    *      *            lock           decq    (%rax)
-# CHECK-NEXT:  1      50    50.00                 U     divb   %dil
-# CHECK-NEXT:  1      68    68.00   *             U     divb   (%rax)
-# CHECK-NEXT:  1      50    50.00                 U     divw   %si
-# CHECK-NEXT:  1      50    50.00   *             U     divw   (%rax)
-# CHECK-NEXT:  1      50    50.00                 U     divl   %edx
-# CHECK-NEXT:  1      50    50.00   *             U     divl   (%rax)
-# CHECK-NEXT:       130   130.00                U     divq   %rcx
-# CHECK-NEXT:       130   130.00  *             U     divq   (%rax)
+# CHECK-NEXT:  9      50    50.00                 U     divb   %dil
+# CHECK-NEXT:  9      68    68.00   *             U     divb   (%rax)
+# CHECK-NEXT:  12     50    50.00                 U     divw   %si
+# CHECK-NEXT:  12     50    50.00   *             U     divw   (%rax)
+# CHECK-NEXT:  12     50    50.00                 U     divl   %edx
+# CHECK-NEXT:  12     50    50.00   *             U     divl   (%rax)
+# CHECK-NEXT:  38     130   130.00                U     divq   %rcx
+# CHECK-NEXT:  38     130   130.00  *             U     divq   (%rax)
 # CHECK-NEXT:  1      32    16.00                 U     enter  $7, $4095
-# CHECK-NEXT:       62    62.00                 U     idivb  %dil
-# CHECK-NEXT:       62    62.00   *             U     idivb  (%rax)
-# CHECK-NEXT:       62    62.00                 U     idivw  %si
-# CHECK-NEXT:       62    62.00   *             U     idivw  (%rax)
-# CHECK-NEXT:       62    62.00                 U     idivl  %edx
-# CHECK-NEXT:       62    62.00   *             U     idivl  (%rax)
-# CHECK-NEXT:       130   130.00                U     idivq  %rcx
-# CHECK-NEXT:       130   130.00  *             U     idivq  (%rax)
-# CHECK-NEXT:  1      7     7.00                        imulb  %dil
-# CHECK-NEXT:  1      7     7.00    *                   imulb  (%rax)
-# CHECK-NEXT:  1      7     7.00                        imulw  %di
-# CHECK-NEXT:  1      8     8.00    *                   imulw  (%rax)
-# CHECK-NEXT:  1      6     6.00                        imulw  %si, %di
-# CHECK-NEXT:  1      7     7.00    *                   imulw  (%rax), %di
-# CHECK-NEXT:  1      6     6.00                        imulw  $511, %si, %di
-# CHECK-NEXT:  1      7     7.00    *                   imulw  $511, (%rax), %di
-# CHECK-NEXT:  1      6     6.00                        imulw  $7, %si, %di
-# CHECK-NEXT:  1      7     7.00    *                   imulw  $7, (%rax), %di
-# CHECK-NEXT:  1      6     6.00                        imull  %edi
-# CHECK-NEXT:  1      7     7.00    *                   imull  (%rax)
+# CHECK-NEXT:  26     62    62.00                 U     idivb  %dil
+# CHECK-NEXT:  26     62    62.00   *             U     idivb  (%rax)
+# CHECK-NEXT:  29     62    62.00                 U     idivw  %si
+# CHECK-NEXT:  29     62    62.00   *             U     idivw  (%rax)
+# CHECK-NEXT:  29     62    62.00                 U     idivl  %edx
+# CHECK-NEXT:  29     62    62.00   *             U     idivl  (%rax)
+# CHECK-NEXT:  60     130   130.00                U     idivq  %rcx
+# CHECK-NEXT:  60     130   130.00  *             U     idivq  (%rax)
+# CHECK-NEXT:  3      7     7.00                        imulb  %dil
+# CHECK-NEXT:  3      7     7.00    *                   imulb  (%rax)
+# CHECK-NEXT:  4      7     7.00                        imulw  %di
+# CHECK-NEXT:  5      8     8.00    *                   imulw  (%rax)
+# CHECK-NEXT:  2      6     6.00                        imulw  %si, %di
+# CHECK-NEXT:  3      7     7.00    *                   imulw  (%rax), %di
+# CHECK-NEXT:  2      6     6.00                        imulw  $511, %si, %di
+# CHECK-NEXT:  3      7     7.00    *                   imulw  $511, (%rax), %di
+# CHECK-NEXT:  2      6     6.00                        imulw  $7, %si, %di
+# CHECK-NEXT:  3      7     7.00    *                   imulw  $7, (%rax), %di
+# CHECK-NEXT:  3      6     6.00                        imull  %edi
+# CHECK-NEXT:  4      7     7.00    *                   imull  (%rax)
 # CHECK-NEXT:  1      5     5.00                        imull  %esi, %edi
 # CHECK-NEXT:  1      5     5.00    *                   imull  (%rax), %edi
 # CHECK-NEXT:  1      5     5.00                        imull  $665536, %esi, %edi
 # CHECK-NEXT:  1      5     5.00    *                   imull  $665536, (%rax), %edi
 # CHECK-NEXT:  1      5     5.00                        imull  $7, %esi, %edi
 # CHECK-NEXT:  1      5     5.00    *                   imull  $7, (%rax), %edi
-# CHECK-NEXT:  1      12    12.00                       imulq  %rdi
-# CHECK-NEXT:  1      12    12.00   *                   imulq  (%rax)
-# CHECK-NEXT:  1      12    12.00                       imulq  %rsi, %rdi
-# CHECK-NEXT:  1      12    12.00   *                   imulq  (%rax), %rdi
-# CHECK-NEXT:  1      14    14.00                       imulq  $665536, %rsi, %rdi
-# CHECK-NEXT:  1      14    14.00   *                   imulq  $665536, (%rax), %rdi
-# CHECK-NEXT:  1      14    14.00                       imulq  $7, %rsi, %rdi
-# CHECK-NEXT:  1      14    14.00   *                   imulq  $7, (%rax), %rdi
+# CHECK-NEXT:  8      12    12.00                       imulq  %rdi
+# CHECK-NEXT:  8      12    12.00   *                   imulq  (%rax)
+# CHECK-NEXT:  6      12    12.00                       imulq  %rsi, %rdi
+# CHECK-NEXT:  6      12    12.00   *                   imulq  (%rax), %rdi
+# CHECK-NEXT:  7      14    14.00                       imulq  $665536, %rsi, %rdi
+# CHECK-NEXT:  7      14    14.00   *                   imulq  $665536, (%rax), %rdi
+# CHECK-NEXT:  7      14    14.00                       imulq  $7, %rsi, %rdi
+# CHECK-NEXT:  7      14    14.00   *                   imulq  $7, (%rax), %rdi
 # CHECK-NEXT:  1      92    46.00                 U     inb    $7, %al
 # CHECK-NEXT:  1      94    47.00                 U     inb    %dx, %al
 # CHECK-NEXT:  1      92    46.00                 U     inw    $7, %ax
@@ -1416,14 +1416,14 @@ xorq (%rax), %rdi
 # CHECK-NEXT:  1      1     1.00    *                   movzwq (%rax), %rdi
 # CHECK-NEXT:  1      1     1.00                        movslq %eax, %rdi
 # CHECK-NEXT:  1      1     1.00    *                   movslq (%rax), %rdi
-# CHECK-NEXT:  1      7     7.00                        mulb   %dil
-# CHECK-NEXT:  1      7     7.00    *                   mulb   (%rax)
-# CHECK-NEXT:  1      7     7.00                        mulw   %si
-# CHECK-NEXT:  1      8     8.00    *                   mulw   (%rax)
-# CHECK-NEXT:  1      6     6.00                        mull   %edx
-# CHECK-NEXT:  1      7     7.00    *                   mull   (%rax)
-# CHECK-NEXT:  1      12    12.00                       mulq   %rcx
-# CHECK-NEXT:  1      12    12.00   *                   mulq   (%rax)
+# CHECK-NEXT:  3      7     7.00                        mulb   %dil
+# CHECK-NEXT:  3      7     7.00    *                   mulb   (%rax)
+# CHECK-NEXT:  4      7     7.00                        mulw   %si
+# CHECK-NEXT:  5      8     8.00    *                   mulw   (%rax)
+# CHECK-NEXT:  3      6     6.00                        mull   %edx
+# CHECK-NEXT:  4      7     7.00    *                   mull   (%rax)
+# CHECK-NEXT:  8      12    12.00                       mulq   %rcx
+# CHECK-NEXT:  8      12    12.00   *                   mulq   (%rax)
 # CHECK-NEXT:  1      1     0.50                        negb   %dil
 # CHECK-NEXT:  1      1     1.00    *      *            negb   (%r8)
 # CHECK-NEXT:  1      1     1.00    *      *            lock           negb    (%r8)