Hi All,

On x86, C2 currently implements vector count trailing zeros using following 
formula :-

`        ctz(x) = width - clz((x - 1) & ~x)
`
On targets supporting AVX-512 BITALG or AVX512_VPOPCNTDQ features , we can use 
following shorter identity:-

`       ctz(x) = popcount((x - 1) & ~x)
`
This will enable `vpopcntb/w` for byte/short lanes and `vpopcntd/q` for 
int/long lanes. Existing lowering should remain as the fallback when these CPU 
features are unavailable.

Following are the performance number of benchmark included with the patch.


System: AMD EPYC 9755 128-Core Processor (Turin) Fixed frequency 2.5Ghz

Baseline:-
----------
Benchmark                                           Mode  Cnt     Score   Error 
  Units
VectorCountTrailingZerosBenchmark.byteThroughput   thrpt    2   569.742         
 ops/us
VectorCountTrailingZerosBenchmark.intThroughput    thrpt    2  1378.783         
 ops/us
VectorCountTrailingZerosBenchmark.longThroughput   thrpt    2  1154.720         
 ops/us
VectorCountTrailingZerosBenchmark.shortThroughput  thrpt    2   717.462         
 ops/us
VectorCountTrailingZerosBenchmark.byteLatency       avgt    2     7.848         
  ns/op
VectorCountTrailingZerosBenchmark.intLatency        avgt    2     3.328         
  ns/op
VectorCountTrailingZerosBenchmark.longLatency       avgt    2     3.284         
  ns/op
VectorCountTrailingZerosBenchmark.shortLatency      avgt    2     5.017         
  ns/op

Withopt:-
----------
Benchmark                                           Mode  Cnt     Score   Error 
  Units
VectorCountTrailingZerosBenchmark.byteThroughput   thrpt    2  1174.785         
 ops/us
VectorCountTrailingZerosBenchmark.intThroughput    thrpt    2  1098.933         
 ops/us
VectorCountTrailingZerosBenchmark.longThroughput   thrpt    2  1396.755         
 ops/us
VectorCountTrailingZerosBenchmark.shortThroughput  thrpt    2  1193.041         
 ops/us
VectorCountTrailingZerosBenchmark.byteLatency       avgt    2     2.352         
  ns/op
VectorCountTrailingZerosBenchmark.intLatency        avgt    2     2.344         
  ns/op
VectorCountTrailingZerosBenchmark.longLatency       avgt    2     2.345         
  ns/op
VectorCountTrailingZerosBenchmark.shortLatency      avgt    2     2.338         
  ns/op


Kindly review and share your feedback.

Best Regards,
Jatin

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - Adding comments
 - 8393511: Optimize x86 vector count trailing zeros using popcount instructions

Changes: https://git.openjdk.org/jdk/pull/33863/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=33863&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8393511
  Stats: 235 lines in 4 files changed: 232 ins; 0 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/33863.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/33863/head:pull/33863

PR: https://git.openjdk.org/jdk/pull/33863

Reply via email to