[X86] Fix SLM uops/resources counts for XADD/XCHG reg-reg instructions
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 1 Jan 2023 13:11:51 +0000 (13:11 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 14 Jan 2023 18:34:18 +0000 (18:34 +0000)
The RMW instructions still need addressing, probably with a new 'WriteXCHGRMW' scheduler class.

Based off llvm-exegesis captures, confirmed with Agner + uops.info

llvm/lib/Target/X86/X86ScheduleSLM.td
llvm/test/tools/llvm-mca/X86/SLM/resources-x86_64.s

index c59853b..ff50c6d 100644 (file)
@@ -119,7 +119,7 @@ defm : X86WriteRes<WriteBSWAP32, [SLM_IEC_RSV01], 1, [1], 1>;
 defm : X86WriteRes<WriteBSWAP64, [SLM_IEC_RSV01], 1, [1], 1>;
 defm : X86WriteRes<WriteCMPXCHG, [SLM_IEC_RSV01], 6, [6], 5>;
 defm : X86WriteRes<WriteCMPXCHGRMW, [SLM_IEC_RSV01, SLM_MEC_RSV], 10, [6, 2], 8>;
-defm : X86WriteRes<WriteXCHG,      [SLM_IEC_RSV01], 1, [1], 1>;
+defm : X86WriteRes<WriteXCHG,    [SLM_IEC_RSV01], 3, [3], 3>;
 
 defm : SLMWriteResPair<WriteShift,    [SLM_IEC_RSV0],  1>;
 defm : SLMWriteResPair<WriteShiftCL,  [SLM_IEC_RSV0],  1>;
index 15441af..c65d7fa 100644 (file)
@@ -1878,31 +1878,31 @@ xorq (%rax), %rdi
 # CHECK-NEXT:  1      4     1.00    *                   testq  %rsi, (%rax)
 # CHECK-NEXT:  1      100   1.00    *             U     ud2
 # CHECK-NEXT:  1      100   1.00                  U     wrmsr
-# CHECK-NEXT:  1      1     0.50                        xaddb  %bl, %cl
+# CHECK-NEXT:  3      3     1.50                        xaddb  %bl, %cl
 # CHECK-NEXT:  1      4     2.00    *      *            xaddb  %bl, (%rcx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xaddb   %bl, (%rcx)
-# CHECK-NEXT:  1      1     0.50                        xaddw  %bx, %cx
+# CHECK-NEXT:  3      3     1.50                        xaddw  %bx, %cx
 # CHECK-NEXT:  1      4     2.00    *      *            xaddw  %ax, (%rbx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xaddw   %ax, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        xaddl  %ebx, %ecx
+# CHECK-NEXT:  3      3     1.50                        xaddl  %ebx, %ecx
 # CHECK-NEXT:  1      4     2.00    *      *            xaddl  %eax, (%rbx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xaddl   %eax, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        xaddq  %rbx, %rcx
+# CHECK-NEXT:  3      3     1.50                        xaddq  %rbx, %rcx
 # CHECK-NEXT:  1      4     2.00    *      *            xaddq  %rax, (%rbx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xaddq   %rax, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        xchgb  %bl, %cl
+# CHECK-NEXT:  3      3     1.50                        xchgb  %bl, %cl
 # CHECK-NEXT:  1      4     2.00    *      *            xchgb  %bl, (%rbx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xchgb   %bl, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        xchgw  %bx, %ax
-# CHECK-NEXT:  1      1     0.50                        xchgw  %bx, %cx
+# CHECK-NEXT:  3      3     1.50                        xchgw  %bx, %ax
+# CHECK-NEXT:  3      3     1.50                        xchgw  %bx, %cx
 # CHECK-NEXT:  1      4     2.00    *      *            xchgw  %ax, (%rbx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xchgw   %ax, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        xchgl  %ebx, %eax
-# CHECK-NEXT:  1      1     0.50                        xchgl  %ebx, %ecx
+# CHECK-NEXT:  3      3     1.50                        xchgl  %ebx, %eax
+# CHECK-NEXT:  3      3     1.50                        xchgl  %ebx, %ecx
 # CHECK-NEXT:  1      4     2.00    *      *            xchgl  %eax, (%rbx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xchgl   %eax, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        xchgq  %rbx, %rax
-# CHECK-NEXT:  1      1     0.50                        xchgq  %rbx, %rcx
+# CHECK-NEXT:  3      3     1.50                        xchgq  %rbx, %rax
+# CHECK-NEXT:  3      3     1.50                        xchgq  %rbx, %rcx
 # CHECK-NEXT:  1      4     2.00    *      *            xchgq  %rax, (%rbx)
 # CHECK-NEXT:  1      4     2.00    *      *            lock           xchgq   %rax, (%rbx)
 # CHECK-NEXT:  1      3     1.00    *                   xlatb
@@ -1960,7 +1960,7 @@ xorq (%rax), %rdi
 
 # CHECK:      Resource pressure per iteration:
 # CHECK-NEXT: [0]    [1]    [2]    [3]    [4]    [5]    [6]    [7]
-# CHECK-NEXT: 400.00  -      -     49.00   -     684.50 625.50 835.00
+# CHECK-NEXT: 400.00  -      -     49.00   -     695.50 636.50 835.00
 
 # CHECK:      Resource pressure by instruction:
 # CHECK-NEXT: [0]    [1]    [2]    [3]    [4]    [5]    [6]    [7]    Instructions:
@@ -2808,31 +2808,31 @@ xorq (%rax), %rdi
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   1.00   testq    %rsi, (%rax)
 # CHECK-NEXT:  -      -      -     1.00    -      -      -      -     ud2
 # CHECK-NEXT:  -      -      -     1.00    -      -      -      -     wrmsr
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xaddb    %bl, %cl
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xaddb    %bl, %cl
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xaddb    %bl, (%rcx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xaddb   %bl, (%rcx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xaddw    %bx, %cx
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xaddw    %bx, %cx
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xaddw    %ax, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xaddw   %ax, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xaddl    %ebx, %ecx
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xaddl    %ebx, %ecx
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xaddl    %eax, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xaddl   %eax, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xaddq    %rbx, %rcx
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xaddq    %rbx, %rcx
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xaddq    %rax, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xaddq   %rax, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xchgb    %bl, %cl
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xchgb    %bl, %cl
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xchgb    %bl, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xchgb   %bl, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xchgw    %bx, %ax
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xchgw    %bx, %cx
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xchgw    %bx, %ax
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xchgw    %bx, %cx
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xchgw    %ax, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xchgw   %ax, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xchgl    %ebx, %eax
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xchgl    %ebx, %ecx
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xchgl    %ebx, %eax
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xchgl    %ebx, %ecx
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xchgl    %eax, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xchgl   %eax, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xchgq    %rbx, %rax
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     xchgq    %rbx, %rcx
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xchgq    %rbx, %rax
+# CHECK-NEXT:  -      -      -      -      -     1.50   1.50    -     xchgq    %rbx, %rcx
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   xchgq    %rax, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             xchgq   %rax, (%rbx)
 # CHECK-NEXT:  -      -      -      -      -      -      -     1.00   xlatb