[riscv-port] RFR: 8279292: riscv: Intrinsify multiplyToLen and squareToLen

Fei Yang fyang at openjdk.java.net
Mon Dec 27 11:39:43 UTC 2021


On Mon, 27 Dec 2021 08:25:22 GMT, Feilong Jiang <fjiang at openjdk.org> wrote:

> BigInteger intrinsic: MultiplyToLen and SquareToLen intrinsic are missed in current vm. They should be implemented.
> The JMH tests show that the MultiplyToLen intrinsic improve the performance by up to 2x ~ 3x and the SquareToLen intrinsic improve the performance by up to 1.8x ~ 2x when the length of BigInteger changed from 1 to 5000, compared with that of C2.
> 
> Full jtreg tests on qemu and hotspot/jdk tier1 test on Unmathced are passed without new failures.
> 
> JMH tests and results on D1 and Unmatched list as follows:
> [MyBenchmark.txt](https://github.com/openjdk/riscv-port/files/7779255/MyBenchmark.txt)
> 
> [squareToLen_unmatched.txt](https://github.com/openjdk/riscv-port/files/7779247/squareToLen_unmatched.txt)
> [squareToLen_d1.txt](https://github.com/openjdk/riscv-port/files/7779248/squareToLen_d1.txt)
> [multiplyToLen_unmatched.txt](https://github.com/openjdk/riscv-port/files/7779249/multiplyToLen_unmatched.txt)
> [multiplyToLen_d1.txt](https://github.com/openjdk/riscv-port/files/7779250/multiplyToLen_d1.txt)

Changes requested by fyang (Lead).

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp line 3249:

> 3247: 
> 3248: /**
> 3249:  * Multiply 128 bit by 128. Unrolled inner loop.

Should be: "Multiply 128 bit by 128 bit. Unrolled inner loop."

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp line 3381:

> 3379: 
> 3380: /**
> 3381:  * Code for BigInteger::multiplyToLen() instrinsic.

There is a typo here. Should be: ""Code for BigInteger::multiplyToLen() intrinsic."

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp line 3417:

> 3415:   mv(carry, zr); // carry = 0;
> 3416: 
> 3417:   Label L_multiply_64_or_128, L_done;

Suggestion: rename L_multiply_64_or_128 into L_multiply_64_x_64_loop

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp line 3424:

> 3422:   const Register jdx = tmp1;
> 3423: 
> 3424:   // if x and y are both 8 bytes aligend.

There is a typo here. Maybe "// Check if x and y are both 8-byte aligned."

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

PR: https://git.openjdk.java.net/riscv-port/pull/38


More information about the riscv-port-dev mailing list