[llvm] [X86] Improve PDEP/PEXT instructions scheduling on znver1/znver2 models (PR #217304)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 27 01:47:03 PDT 2026
https://github.com/RKSimon updated https://github.com/llvm/llvm-project/pull/217304
>From 0ad9f225387a2412566b344c481ac9b419c3fbfd Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Wed, 19 Aug 2026 12:18:09 +0100
Subject: [PATCH 1/2] [X86] Improve PDEP/PEXT instructions scheduling on
znver1/znver2 models
znver1/znver2 have notoriously bad implementations of the PDEP/PEXT scalar instructions, just using the WriteMicrocoded tag isn't useful as it can't give any indication of the awful effect on ALU pipes or uops flooding (especially for the rm fold variants).
The measurements on uops.info/Agner are all over the place (and are very input dependent), so I've taken an average of the worse case to at least give the scheduler something to work with.
We've ignored these so far, but now we're close to generating llvm.pdep/pext intrinsics (and scalarizing vector implementations).
---
llvm/lib/Target/X86/X86ScheduleZnver1.td | 22 ++++++++++--
llvm/lib/Target/X86/X86ScheduleZnver2.td | 22 ++++++++++--
.../llvm-mca/X86/Znver1/resources-bmi2.s | 34 +++++++++----------
.../llvm-mca/X86/Znver2/resources-bmi2.s | 34 +++++++++----------
4 files changed, 74 insertions(+), 38 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td
index b7f14ccbacf93..aeb97d4e40640 100644
--- a/llvm/lib/Target/X86/X86ScheduleZnver1.td
+++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td
@@ -706,9 +706,27 @@ def : SchedAlias<WriteBitTestSetRegRMW, ZnWriteBTRSCm>;
// PDEP PEXT.
// r,r,r.
-def : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rr", "PEXT(32|64)rr")>;
+def ZnWritePDEPrr : SchedWriteRes<[ZnALU]> {
+ let Latency = 17;
+ let NumMicroOps = 6;
+ let ReleaseAtCycles = [72];
+}
+def : InstRW<[ZnWritePDEPrr], (instregex "PDEP(32|64)rr")>;
+
+def ZnWritePEXTrr : SchedWriteRes<[ZnALU]> {
+ let Latency = 17;
+ let NumMicroOps = 7;
+ let ReleaseAtCycles = [72];
+}
+def : InstRW<[ZnWritePEXTrr], (instregex "PEXT(32|64)rr")>;
+
// r,r,m.
-def : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>;
+def ZnWritePDEPrm : SchedWriteRes<[ZnALU, ZnAGU]> {
+ let Latency = 23;
+ let NumMicroOps = 100;
+ let ReleaseAtCycles = [177,1];
+}
+def : InstRW<[ZnWritePDEPrm], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>;
// RCR RCL.
// m,i.
diff --git a/llvm/lib/Target/X86/X86ScheduleZnver2.td b/llvm/lib/Target/X86/X86ScheduleZnver2.td
index a981a5eb3f1c1..a66e147f151b7 100644
--- a/llvm/lib/Target/X86/X86ScheduleZnver2.td
+++ b/llvm/lib/Target/X86/X86ScheduleZnver2.td
@@ -716,9 +716,27 @@ def : SchedAlias<WriteBitTestSetRegRMW, Zn2WriteBTRSCm>;
// PDEP PEXT.
// r,r,r.
-def : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rr", "PEXT(32|64)rr")>;
+def Zn2WritePDEPrr : SchedWriteRes<[Zn2ALU]> {
+ let Latency = 17;
+ let NumMicroOps = 6;
+ let ReleaseAtCycles = [72];
+}
+def : InstRW<[Zn2WritePDEPrr], (instregex "PDEP(32|64)rr")>;
+
+def Zn2WritePEXTrr : SchedWriteRes<[Zn2ALU]> {
+ let Latency = 17;
+ let NumMicroOps = 7;
+ let ReleaseAtCycles = [72];
+}
+def : InstRW<[Zn2WritePEXTrr], (instregex "PEXT(32|64)rr")>;
+
// r,r,m.
-def : InstRW<[WriteMicrocoded], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>;
+def Zn2WritePDEPrm : SchedWriteRes<[Zn2ALU, Zn2AGU]> {
+ let Latency = 23;
+ let NumMicroOps = 100;
+ let ReleaseAtCycles = [177,1];
+}
+def : InstRW<[Zn2WritePDEPrm], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>;
// RCR RCL.
// m,i.
diff --git a/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s b/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s
index 32785f92675d4..a3609e7982adc 100644
--- a/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s
+++ b/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s
@@ -66,14 +66,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 1 8 2.00 * mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: 1 3 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 1 8 2.00 * mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 * pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 * pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 pextl %eax, %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 * pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 pextq %rax, %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 * pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: 6 17 18.00 pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 100 23 44.25 * pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: 6 17 18.00 pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 100 23 44.25 * pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: 7 17 18.00 pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 100 23 44.25 * pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: 7 17 18.00 pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 100 23 44.25 * pextq (%rax), %rbx, %rcx
# CHECK-NEXT: 1 1 0.25 rorxl $1, %eax, %ecx
# CHECK-NEXT: 2 5 0.50 * rorxl $1, (%rax), %ecx
# CHECK-NEXT: 1 1 0.25 rorxq $1, %rax, %rcx
@@ -107,7 +107,7 @@ shrx %rax, (%rbx), %rcx
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
-# CHECK-NEXT: 6.00 6.00 5.00 9.00 5.00 5.00 - - - - - 8.00
+# CHECK-NEXT: 8.00 8.00 254.00 258.00 254.00 254.00 - - - - - 8.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] Instructions:
@@ -119,14 +119,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 0.50 0.50 - 1.00 - - - - - - - 2.00 mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: - - - 1.00 - - - - - - - 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 0.50 0.50 - 1.00 - - - - - - - 2.00 mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - pextl %eax, %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - pextq %rax, %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pextq (%rax), %rbx, %rcx
# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, %eax, %ecx
# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, (%rax), %ecx
# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - rorxq $1, %rax, %rcx
diff --git a/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s b/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s
index 1562e859a6b2a..d5ad64ec4573b 100644
--- a/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s
+++ b/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s
@@ -66,14 +66,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 1 7 2.00 * mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: 1 3 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 1 7 2.00 * mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 * pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 * pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 pextl %eax, %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 * pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: 1 100 0.25 pextq %rax, %rbx, %rcx
-# CHECK-NEXT: 1 100 0.25 * pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: 6 17 18.00 pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 100 23 44.25 * pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: 6 17 18.00 pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 100 23 44.25 * pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: 7 17 18.00 pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 100 23 44.25 * pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: 7 17 18.00 pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 100 23 44.25 * pextq (%rax), %rbx, %rcx
# CHECK-NEXT: 1 1 0.25 rorxl $1, %eax, %ecx
# CHECK-NEXT: 2 5 0.33 * rorxl $1, (%rax), %ecx
# CHECK-NEXT: 1 1 0.25 rorxq $1, %rax, %rcx
@@ -108,7 +108,7 @@ shrx %rax, (%rbx), %rcx
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
-# CHECK-NEXT: 4.00 4.00 4.00 5.00 9.00 5.00 5.00 - - - - - 8.00
+# CHECK-NEXT: 5.33 5.33 5.33 254.00 258.00 254.00 254.00 - - - - - 8.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] Instructions:
@@ -120,14 +120,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 0.33 0.33 0.33 - 1.00 - - - - - - - 2.00 mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: - - - - 1.00 - - - - - - - 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 0.33 0.33 0.33 - 1.00 - - - - - - - 2.00 mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - - pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - - pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - - pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - - pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - - pextl %eax, %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - - pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - - - - - - - - - - - - pextq %rax, %rbx, %rcx
-# CHECK-NEXT: - - - - - - - - - - - - - pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pextq (%rax), %rbx, %rcx
# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, %eax, %ecx
# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, (%rax), %ecx
# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - rorxq $1, %rax, %rcx
>From cbd8717d76ae9d6e4c3763f9437833b8311dd891 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Wed, 26 Aug 2026 17:41:31 +0100
Subject: [PATCH 2/2] Use worse of the average cases of each pdep/pext size
using stats from @222rohan
We can try to handle pdep/pext separately but given the incredible range of perf values, its a very limited value - any cost driven fold is going to be dominated by the magnitude of these numbers, not the accuracy.
---
llvm/lib/Target/X86/X86ScheduleZnver1.td | 39 +++++++++++--------
llvm/lib/Target/X86/X86ScheduleZnver2.td | 39 +++++++++++--------
.../llvm-mca/X86/Znver1/resources-bmi2.s | 34 ++++++++--------
.../llvm-mca/X86/Znver2/resources-bmi2.s | 34 ++++++++--------
4 files changed, 80 insertions(+), 66 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td
index aeb97d4e40640..7f6c743c2a5c8 100644
--- a/llvm/lib/Target/X86/X86ScheduleZnver1.td
+++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td
@@ -706,27 +706,34 @@ def : SchedAlias<WriteBitTestSetRegRMW, ZnWriteBTRSCm>;
// PDEP PEXT.
// r,r,r.
-def ZnWritePDEPrr : SchedWriteRes<[ZnALU]> {
- let Latency = 17;
- let NumMicroOps = 6;
- let ReleaseAtCycles = [72];
+// r,r,m.
+def ZnWritePDEP32rr : SchedWriteRes<[ZnALU, ZnMultiplier]> {
+ let Latency = 53;
+ let NumMicroOps = 95;
+ let ReleaseAtCycles = [1, 53];
}
-def : InstRW<[ZnWritePDEPrr], (instregex "PDEP(32|64)rr")>;
+def : InstRW<[ZnWritePDEP32rr], (instrs PDEP32rr, PEXT32rr)>;
-def ZnWritePEXTrr : SchedWriteRes<[ZnALU]> {
- let Latency = 17;
- let NumMicroOps = 7;
- let ReleaseAtCycles = [72];
+def ZnWritePDEP32rm : SchedWriteRes<[ZnALU, ZnMultiplier, ZnAGU]> {
+ let Latency = 56;
+ let NumMicroOps = 96;
+ let ReleaseAtCycles = [1, 55, 1];
}
-def : InstRW<[ZnWritePEXTrr], (instregex "PEXT(32|64)rr")>;
+def : InstRW<[ZnWritePDEP32rm], (instrs PDEP32rm, PEXT32rm)>;
-// r,r,m.
-def ZnWritePDEPrm : SchedWriteRes<[ZnALU, ZnAGU]> {
- let Latency = 23;
- let NumMicroOps = 100;
- let ReleaseAtCycles = [177,1];
+def ZnWritePDEP64rr : SchedWriteRes<[ZnALU, ZnMultiplier]> {
+ let Latency = 86;
+ let NumMicroOps = 165;
+ let ReleaseAtCycles = [1, 86];
+}
+def : InstRW<[ZnWritePDEP64rr], (instrs PDEP64rr, PEXT64rr)>;
+
+def ZnWritePDEP64rm : SchedWriteRes<[ZnALU, ZnMultiplier, ZnAGU]> {
+ let Latency = 89;
+ let NumMicroOps = 166;
+ let ReleaseAtCycles = [1, 89, 1];
}
-def : InstRW<[ZnWritePDEPrm], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>;
+def : InstRW<[ZnWritePDEP64rm], (instrs PDEP64rm, PEXT64rm)>;
// RCR RCL.
// m,i.
diff --git a/llvm/lib/Target/X86/X86ScheduleZnver2.td b/llvm/lib/Target/X86/X86ScheduleZnver2.td
index a66e147f151b7..cfcc496fa6f31 100644
--- a/llvm/lib/Target/X86/X86ScheduleZnver2.td
+++ b/llvm/lib/Target/X86/X86ScheduleZnver2.td
@@ -716,27 +716,34 @@ def : SchedAlias<WriteBitTestSetRegRMW, Zn2WriteBTRSCm>;
// PDEP PEXT.
// r,r,r.
-def Zn2WritePDEPrr : SchedWriteRes<[Zn2ALU]> {
- let Latency = 17;
- let NumMicroOps = 6;
- let ReleaseAtCycles = [72];
+// r,r,m.
+def Zn2WritePDEP32rr : SchedWriteRes<[Zn2ALU, Zn2Multiplier]> {
+ let Latency = 53;
+ let NumMicroOps = 95;
+ let ReleaseAtCycles = [1, 53];
}
-def : InstRW<[Zn2WritePDEPrr], (instregex "PDEP(32|64)rr")>;
+def : InstRW<[Zn2WritePDEP32rr], (instrs PDEP32rr, PEXT32rr)>;
-def Zn2WritePEXTrr : SchedWriteRes<[Zn2ALU]> {
- let Latency = 17;
- let NumMicroOps = 7;
- let ReleaseAtCycles = [72];
+def Zn2WritePDEP32rm : SchedWriteRes<[Zn2ALU, Zn2Multiplier, Zn2AGU]> {
+ let Latency = 56;
+ let NumMicroOps = 96;
+ let ReleaseAtCycles = [1, 55, 1];
}
-def : InstRW<[Zn2WritePEXTrr], (instregex "PEXT(32|64)rr")>;
+def : InstRW<[Zn2WritePDEP32rm], (instrs PDEP32rm, PEXT32rm)>;
-// r,r,m.
-def Zn2WritePDEPrm : SchedWriteRes<[Zn2ALU, Zn2AGU]> {
- let Latency = 23;
- let NumMicroOps = 100;
- let ReleaseAtCycles = [177,1];
+def Zn2WritePDEP64rr : SchedWriteRes<[Zn2ALU, Zn2Multiplier]> {
+ let Latency = 86;
+ let NumMicroOps = 165;
+ let ReleaseAtCycles = [1, 86];
+}
+def : InstRW<[Zn2WritePDEP64rr], (instrs PDEP64rr, PEXT64rr)>;
+
+def Zn2WritePDEP64rm : SchedWriteRes<[Zn2ALU, Zn2Multiplier, Zn2AGU]> {
+ let Latency = 89;
+ let NumMicroOps = 166;
+ let ReleaseAtCycles = [1, 89, 1];
}
-def : InstRW<[Zn2WritePDEPrm], (instregex "PDEP(32|64)rm", "PEXT(32|64)rm")>;
+def : InstRW<[Zn2WritePDEP64rm], (instrs PDEP64rm, PEXT64rm)>;
// RCR RCL.
// m,i.
diff --git a/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s b/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s
index a3609e7982adc..17cac2bac2267 100644
--- a/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s
+++ b/llvm/test/tools/llvm-mca/X86/Znver1/resources-bmi2.s
@@ -66,14 +66,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 1 8 2.00 * mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: 1 3 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 1 8 2.00 * mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: 6 17 18.00 pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: 100 23 44.25 * pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: 6 17 18.00 pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: 100 23 44.25 * pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: 7 17 18.00 pextl %eax, %ebx, %ecx
-# CHECK-NEXT: 100 23 44.25 * pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: 7 17 18.00 pextq %rax, %rbx, %rcx
-# CHECK-NEXT: 100 23 44.25 * pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: 95 53 53.00 pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 96 56 55.00 * pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: 165 86 86.00 pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 166 89 89.00 * pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: 95 53 53.00 pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 96 56 55.00 * pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: 165 86 86.00 pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 166 89 89.00 * pextq (%rax), %rbx, %rcx
# CHECK-NEXT: 1 1 0.25 rorxl $1, %eax, %ecx
# CHECK-NEXT: 2 5 0.50 * rorxl $1, (%rax), %ecx
# CHECK-NEXT: 1 1 0.25 rorxq $1, %rax, %rcx
@@ -107,7 +107,7 @@ shrx %rax, (%rbx), %rcx
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
-# CHECK-NEXT: 8.00 8.00 254.00 258.00 254.00 254.00 - - - - - 8.00
+# CHECK-NEXT: 8.00 8.00 7.00 11.00 7.00 7.00 - - - - - 574.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] Instructions:
@@ -119,14 +119,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 0.50 0.50 - 1.00 - - - - - - - 2.00 mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: - - - 1.00 - - - - - - - 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 0.50 0.50 - 1.00 - - - - - - - 2.00 mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pextl %eax, %ebx, %ecx
-# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - 18.00 18.00 18.00 18.00 - - - - - - pextq %rax, %rbx, %rcx
-# CHECK-NEXT: 0.50 0.50 44.25 44.25 44.25 44.25 - - - - - - pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - 53.00 pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - 55.00 pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - 86.00 pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - 89.00 pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - 53.00 pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - 55.00 pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - 86.00 pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - 89.00 pextq (%rax), %rbx, %rcx
# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, %eax, %ecx
# CHECK-NEXT: 0.50 0.50 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, (%rax), %ecx
# CHECK-NEXT: - - 0.25 0.25 0.25 0.25 - - - - - - rorxq $1, %rax, %rcx
diff --git a/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s b/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s
index d5ad64ec4573b..959f8128dc698 100644
--- a/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s
+++ b/llvm/test/tools/llvm-mca/X86/Znver2/resources-bmi2.s
@@ -66,14 +66,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 1 7 2.00 * mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: 1 3 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 1 7 2.00 * mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: 6 17 18.00 pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: 100 23 44.25 * pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: 6 17 18.00 pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: 100 23 44.25 * pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: 7 17 18.00 pextl %eax, %ebx, %ecx
-# CHECK-NEXT: 100 23 44.25 * pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: 7 17 18.00 pextq %rax, %rbx, %rcx
-# CHECK-NEXT: 100 23 44.25 * pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: 95 53 53.00 pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 96 56 55.00 * pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: 165 86 86.00 pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 166 89 89.00 * pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: 95 53 53.00 pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 96 56 55.00 * pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: 165 86 86.00 pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 166 89 89.00 * pextq (%rax), %rbx, %rcx
# CHECK-NEXT: 1 1 0.25 rorxl $1, %eax, %ecx
# CHECK-NEXT: 2 5 0.33 * rorxl $1, (%rax), %ecx
# CHECK-NEXT: 1 1 0.25 rorxq $1, %rax, %rcx
@@ -108,7 +108,7 @@ shrx %rax, (%rbx), %rcx
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
-# CHECK-NEXT: 5.33 5.33 5.33 254.00 258.00 254.00 254.00 - - - - - 8.00
+# CHECK-NEXT: 5.33 5.33 5.33 7.00 11.00 7.00 7.00 - - - - - 574.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] Instructions:
@@ -120,14 +120,14 @@ shrx %rax, (%rbx), %rcx
# CHECK-NEXT: 0.33 0.33 0.33 - 1.00 - - - - - - - 2.00 mulxl (%rax), %ebx, %ecx
# CHECK-NEXT: - - - - 1.00 - - - - - - - 2.00 mulxq %rax, %rbx, %rcx
# CHECK-NEXT: 0.33 0.33 0.33 - 1.00 - - - - - - - 2.00 mulxq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pdepl %eax, %ebx, %ecx
-# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pdepl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pdepq %rax, %rbx, %rcx
-# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pdepq (%rax), %rbx, %rcx
-# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pextl %eax, %ebx, %ecx
-# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pextl (%rax), %ebx, %ecx
-# CHECK-NEXT: - - - 18.00 18.00 18.00 18.00 - - - - - - pextq %rax, %rbx, %rcx
-# CHECK-NEXT: 0.33 0.33 0.33 44.25 44.25 44.25 44.25 - - - - - - pextq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - 53.00 pdepl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - 55.00 pdepl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - 86.00 pdepq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - 89.00 pdepq (%rax), %rbx, %rcx
+# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - 53.00 pextl %eax, %ebx, %ecx
+# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - 55.00 pextl (%rax), %ebx, %ecx
+# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - 86.00 pextq %rax, %rbx, %rcx
+# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - 89.00 pextq (%rax), %rbx, %rcx
# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, %eax, %ecx
# CHECK-NEXT: 0.33 0.33 0.33 0.25 0.25 0.25 0.25 - - - - - - rorxl $1, (%rax), %ecx
# CHECK-NEXT: - - - 0.25 0.25 0.25 0.25 - - - - - - rorxq $1, %rax, %rcx
More information about the llvm-commits
mailing list