[llvm] [X86] Improve PDEP/PEXT instructions scheduling on znver1/znver2 models (PR #217304)

Rohan Shenoy via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 21 04:36:30 PDT 2026


222rohan wrote:

> CC @222rohan

I measured PEXT/PDEP on a Zen+ Machine with various masks and here is a report generated,
_assisted by Claude Code_

<details>
<summary> Report </summary>

  **PDEP32**

  | # set bits | rr Lat | rr Tpt | rr Uop | rm Lat | rm Tpt | rm Uop |
  |---:|---:|---:|---:|---:|---:|---:|
  | 0 | 18.11 | 18.10 | 6.01 | 22.12 | 22.11 | 7.01 |
  | 1 | 20.25 | 20.22 | 14.01 | 23.26 | 23.25 | 15.01 |
  | 2 | 22.26 | 22.23 | 22.01 | 26.15 | 26.13 | 23.02 |
  | 8 | 36.68 | 35.92 | 70.02 | 42.63 | 38.69 | 71.02 |
  | 16 | 69.19 | 69.16 | 134.03 | 71.80 | 71.64 | 135.03 |
  | 32 | 142.75 | 143.42 | 262.06 | 145.33 | 146.77 | 263.06 |
  | **avg** | **51.54** | **51.51** | **84.69** | **55.21** | **54.77** | **85.69** |

  **PDEP64**

  | # set bits | rr Lat | rr Tpt | rr Uop | rm Lat | rm Tpt | rm Uop |
  |---:|---:|---:|---:|---:|---:|---:|
  | 0 | 18.13 | 18.12 | 6.02 | 22.14 | 22.15 | 7.01 |
  | 1 | 20.25 | 20.26 | 14.01 | 23.28 | 23.28 | 15.02 |
  | 2 | 22.28 | 22.30 | 22.02 | 26.17 | 26.16 | 23.02 |
  | 8 | 36.65 | 35.81 | 70.02 | 39.16 | 38.78 | 71.03 |
  | 16 | 69.22 | 69.23 | 134.03 | 71.94 | 71.68 | 135.04 |
  | 32 | 142.29 | 143.79 | 262.07 | 145.46 | 146.21 | 263.08 |
  | 64 | 289.63 | 291.55 | 518.12 | 292.13 | 294.13 | 519.16 |
  | **avg** | **85.49** | **85.87** | **146.61** | **88.61** | **88.91** | **147.62** |

  **PEXT32**

  | # set bits | rr Lat | rr Tpt | rr Uop | rm Lat | rm Tpt | rm Uop |
  |---:|---:|---:|---:|---:|---:|---:|
  | 0 | 18.13 | 18.09 | 7.01 | 22.14 | 22.12 | 7.01 |
  | 1 | 20.41 | 20.36 | 16.01 | 24.25 | 24.30 | 16.01 |
  | 2 | 27.17 | 27.13 | 25.02 | 27.32 | 27.33 | 25.01 |
  | 8 | 42.84 | 43.19 | 79.02 | 46.71 | 46.62 | 79.02 |
  | 16 | 70.57 | 70.42 | 151.03 | 72.57 | 72.50 | 151.03 |
  | 32 | 136.04 | 136.42 | 295.06 | 139.03 | 138.55 | 295.06 |
  | **avg** | **52.53** | **52.60** | **95.53** | **55.34** | **55.24** | **95.52** |

  **PEXT64**

  | # set bits | rr Lat | rr Tpt | rr Uop | rm Lat | rm Tpt | rm Uop |
  |---:|---:|---:|---:|---:|---:|---:|
  | 0 | 18.14 | 18.13 | 7.01 | 22.13 | 22.10 | 7.01 |
  | 1 | 20.62 | 20.40 | 16.01 | 24.30 | 24.24 | 16.02 |
  | 2 | 27.21 | 27.19 | 25.01 | 27.28 | 27.24 | 25.02 |
  | 8 | 43.05 | 43.30 | 79.02 | 46.64 | 46.57 | 79.02 |
  | 16 | 70.69 | 70.57 | 151.04 | 72.59 | 72.44 | 151.04 |
  | 32 | 136.38 | 136.52 | 295.06 | 139.54 | 138.50 | 295.07 |
  | 64 | 270.98 | 270.86 | 583.13 | 272.91 | 273.78 | 583.15 |
  | **avg** | **83.87** | **83.85** | **165.18** | **86.48** | **86.41** | **165.19** |

**Exact masks used** (each `# set bits` row with two entries below is the average of two independent random draws at that bit count):

  *64-bit (`Masks[]`):*
  | bits | value(s) |
  |---:|---|
  | 0 | `0x0000000000000000` |
  | 1 | `0x0000000000000001`, `0x8000000000000000` |
  | 2 | `0x8000000000000001` |
  | 8 | `0x40000400240E0004` (random) |
  | 16 | `0x5003002A8040269A` (random) |
  | 32 | `0x7D2F9EA1E0408AE7`, `0x1C4B4E6F606A9337` (random) |
  | 64 | `0xFFFFFFFFFFFFFFFF` |

  *32-bit (`Masks32[]`):*
  | bits | value(s) |
  |---:|---|
  | 0 | `0x00000000` |
  | 1 | `0x00000001`, `0x80000000` |
  | 2 | `0x80000001` |
  | 8 | `0x2D019008` (random) |
  | 16 | `0x130CDF36`, `0x2F89E32C` (random) |
  | 32 | `0xFFFFFFFF` |

  The 1-bit and 2-bit masks are deliberately placed at register extremes (low bit, high bit, or both) rather than randomized, since there's little room for "randomness" at that count; everything at 8/16/32 bits uses randomly-placed bits (fixed seed,
  reproducible) specifically to avoid a periodic pattern like `0xAAAA...` coinciding with however the microcode batches bits internally.

</details>

https://github.com/llvm/llvm-project/pull/217304


More information about the llvm-commits mailing list