> Hi all, please review this changes into risc-v floating point copysign and > signum intrinsics. > CopySign - returns first argument with the sign of second. On risc-v we have > `fsgnj.x` instruction, which can implement this intrinsic. > Signum - returns input value if it is +/- 0.0 or NaN, otherwise 1.0 with the > sign of input value returned. On risc-v we can use `fclass.x` to specify > type of input value and return appropriate value. > > Tests: > Performance tests on t-head board: > With intrinsics: > > Benchmark (seed) Mode Cnt Score Error Units > MathBench.copySignDouble 0 thrpt 8 34156.580 ± 76.272 ops/ms > MathBench.copySignFloat 0 thrpt 8 34181.731 ± 38.182 ops/ms > MathBench.signumDouble 0 thrpt 8 31977.258 ± 1122.327 ops/ms > MathBench.signumFloat 0 thrpt 8 31836.852 ± 56.013 ops/ms > > Intrinsics turned off (`-XX:+UnlockDiagnosticVMOptions > -XX:-UseCopySignIntrinsic -XX:-UseSignumIntrinsic`): > > Benchmark (seed) Mode Cnt Score Error Units > MathBench.copySignDouble 0 thrpt 8 31000.996 ± 943.094 ops/ms > MathBench.copySignFloat 0 thrpt 8 30678.016 ± 28.087 ops/ms > MathBench.signumDouble 0 thrpt 8 25435.010 ± 2047.085 ops/ms > MathBench.signumFloat 0 thrpt 8 25257.058 ± 79.175 ops/ms > > Regression tests: tier1, hotspot:tier2 on risc-v board. > > Also, changed name of one micro test: before we had: `sigNumDouble` and > `signumFloat` tests, they does not matches to `signum` or `sigNum`. Now we > have similar part: `signum`. > Performance tests has been changed a bit, to check intrinsics result better, > diff to modify tests: > > diff --git a/test/micro/org/openjdk/bench/java/lang/MathBench.java > b/test/micro/org/openjdk/bench/java/lang/MathBench.java > index 6cd1353907e..0bee25366bf 100644 > --- a/test/micro/org/openjdk/bench/java/lang/MathBench.java > +++ b/test/micro/org/openjdk/bench/java/lang/MathBench.java > @@ -143,12 +143,12 @@ public double ceilDouble() { > > @Benchmark > public double copySignDouble() { > - return Math.copySign(double81, doubleNegative12); > + return Math.copySign(double81, doubleNegative12) + > Math.copySign(double81, double2) + Math.copySign(double4Dot1, > doubleNegative12); > } > > @Benchmark > public float copySignFloat() { > - return Math.copySign(floatNegative99, float1); > + return Math.copySign(floatNegative99, float1) + > Math.copySign(eFloat, float1) + Math.copySign...
Ilya Gavrilin has updated the pull request incrementally with one additional commit since the last revision: Changed branch inside signum implementation ------------- Changes: - all: https://git.openjdk.org/jdk/pull/16186/files - new: https://git.openjdk.org/jdk/pull/16186/files/c0a2ab95..867d6e8e Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=16186&range=03 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=16186&range=02-03 Stats: 10 lines in 1 file changed: 3 ins; 5 del; 2 mod Patch: https://git.openjdk.org/jdk/pull/16186.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/16186/head:pull/16186 PR: https://git.openjdk.org/jdk/pull/16186