RFR: 8322179: RISC-V: Implement SHA-1 intrinsic [v13]

Antonios Printezis tonyp at openjdk.org
Fri Feb 23 22:35:04 UTC 2024


On Fri, 23 Feb 2024 11:30:07 GMT, Hamlin Li <mli at openjdk.org> wrote:

>> Hi,
>> Can you review this patch to implement SHA-1 intrinsic for riscv?
>> Thanks!
>> 
>> 
>> ## Test
>> 
>> ### Functionality
>> 
>> tests under `test/hotspot/jtreg/compiler/intrinsics/sha`
>> tests found via `find test/jdk -iname "*SHA1*.java"`
>> 
>> ### Performance
>> 
>> tested on `T-HEAD Light Lichee Pi 4A`
>> 
>> JMH_PARAMS="-f 1 -wi 10 -i 20" // for every loop of jmh test
>> 
>> benchmark tests `MessageDigests.java GetMessageDigest.java MessageDigestBench.java MacBench.java` which are under `test/micro/org/openjdk/bench/`, more spcifically `TESTS="MessageDigests.digest MessageDigests.getAndDigest MessageDigestBench.digest"`
>> 
>> 
>> // After
>> o.o.b.java.security.MessageDigests.digest                   N/A         N/A           SHA-1        64     DEFAULT  avgt   20      1845.446 ?     27.052  ns/op
>> o.o.b.java.security.MessageDigests.digest                   N/A         N/A           SHA-1     16384     DEFAULT  avgt   20    181455.350 ?    532.258  ns/op
>> o.o.b.java.security.MessageDigests.getAndDigest             N/A         N/A           SHA-1        64     DEFAULT  avgt   20      2447.674 ?     10.239  ns/op
>> o.o.b.java.security.MessageDigests.getAndDigest             N/A         N/A           SHA-1     16384     DEFAULT  avgt   20    182896.083 ?   1242.774  ns/op
>> o.o.b.javax.crypto.small.MessageDigestBench.digest         SHA1     1048576             N/A       N/A              avgt   20  11599227.792 ? 121442.390  ns/op
>> // Before
>> o.o.b.java.security.MessageDigests.digest                   N/A         N/A           SHA-1        64     DEFAULT  avgt   20      2352.475 ?    11.198  ns/op
>> o.o.b.java.security.MessageDigests.digest                   N/A         N/A           SHA-1     16384     DEFAULT  avgt   20    188495.684 ?  1467.942  ns/op
>> o.o.b.java.security.MessageDigests.getAndDigest             N/A         N/A           SHA-1        64     DEFAULT  avgt   20      2437.347 ?     6.398  ns/op
>> o.o.b.java.security.MessageDigests.getAndDigest             N/A         N/A           SHA-1     16384     DEFAULT  avgt   20    196086.570 ?  1140.998  ns/op
>> o.o.b.javax.crypto.small.MessageDigestBench.digest         SHA1     1048576             N/A       N/A              avgt   20  12362160.119 ? 38788.109  ns/op
>> 
>> 
>> **getAndDigest when size == 64**
>> The data is not stable for test getAndDigest when size == 64, which I think is introduced by  j.s.MessageDigest.getInstance itself, which we don't touch in this patch.
>> Check more details at [1](ht...
>
> Hamlin Li has updated the pull request incrementally with one additional commit since the last revision:
> 
>   assert register; move round param

Overall, pretty good! Only a few minor suggestions for your consideration!

src/hotspot/cpu/riscv/stubGenerator_riscv.cpp line 4856:

> 4854:     if (round == 16) {
> 4855:       int64_t block_bytes = round * 4;
> 4856:       __ addi(buf, buf, block_bytes);

Does `buf` need to be incremented here? And why at `round == 16` and not after all the rounds are done? Maybe you can do this in the loop in `generate_sha1_implCompress` to have the code that initializes and increments it in the same function? Also, does it need to be incremented if `!multi_block`?

src/hotspot/cpu/riscv/stubGenerator_riscv.cpp line 4884:

> 4882:     int idx = 17;
> 4883:     // W't = ROTL'1(W't-3 ^ W't-8 ^ W't-14 ^ W't-16),  16 <= t <= 79
> 4884:     __ srli(t0, ws[(idx-3)/2], 32);

I would use `t1` here for the `srli` result (similar to lines 4862-4863).

src/hotspot/cpu/riscv/stubGenerator_riscv.cpp line 4950:

> 4948:     // so, we can reuse it as a temp register here.
> 4949:     Register tmp2 = cur_w;
> 4950:     {

Why is this in a nested block?

src/hotspot/cpu/riscv/stubGenerator_riscv.cpp line 5024:

> 5022:   //   c_rarg3: int     limit
> 5023:   //
> 5024:   // Outpus:

Outputs

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

PR Review: https://git.openjdk.org/jdk/pull/17130#pullrequestreview-1896303312
PR Review Comment: https://git.openjdk.org/jdk/pull/17130#discussion_r1501227559
PR Review Comment: https://git.openjdk.org/jdk/pull/17130#discussion_r1500699344
PR Review Comment: https://git.openjdk.org/jdk/pull/17130#discussion_r1501235344
PR Review Comment: https://git.openjdk.org/jdk/pull/17130#discussion_r1501218177


More information about the hotspot-dev mailing list