On Mon, 21 Oct 2024 17:07:35 GMT, Joe Darcy <da...@openjdk.org> wrote:
>> Port of Float16 from java.lang in the lworld+fp16 branch to >> jdk.incubabor.vector. > > Joe Darcy has updated the pull request with a new target base due to a merge > or a rebase. The incremental webrev excludes the unrelated changes brought in > by the merge/rebase. The pull request contains seven additional commits since > the last revision: > > - Add @since tag, respond to review feedback. > - Merge branch 'master' into JDK-8341260 > - Remove comments for intrinsics per review feedback. > - Update with changes from lworld+fp16 Float16. > - Merge branch 'master' into JDK-8341260 > - Add support for BigDecimal -> Float16 conversion. > - JDK-8341260: Add Float16 to jdk.incubator.vector Looking good, although i am not expert on the floating point aspects. Some of the more substantive comments could be addressed if chosen to in subsequent PRs. src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java line 70: > 68: > 69: // Currently Float16 is a value based class but in future will be aligned > with > 70: // Enhanced Primitive Boxes described by JEP-402 > (https://openjdk.org/jeps/402) It will be aligned with JEP 401: Value Classes and Objects. `Float16` will eventually become a value class, it will not become a primitive type. JEP 402 is about treating (the existing) primitive types more like reference types. Note as per JEP 401 value class types are reference types. src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java line 72: > 70: // Enhanced Primitive Boxes described by JEP-402 > (https://openjdk.org/jeps/402) > 71: // @jdk.internal.MigratedValueClass > 72: //@jdk.internal.ValueBased We can modify the module info in `java.base` to export `jdk.internal` to `jdk.incubator.vector` then we can annotate `Float16` with `ValueBased`, and then we can get some diagnostic checking e.g., if there is an attempt to synchronize on it. src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java line 78: > 76: implements Comparable<Float16> { > 77: private final short value; > 78: private static final long serialVersionUID = 16; // Not needed for a > value class? Unsure if this field needed. Perhaps a wider question to be thought and answered about later is whether we should extend from `Number`. src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java line 89: > 87: * @param bits a short value. > 88: */ > 89: private Float16 (short bits ) { Suggestion: private Float16(short bits) { src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java line 690: > 688: // public int hashCode() > 689: // public static int hashCode(Float16 value) > 690: // public boolean equals(Object obj) I think we should add these methods in a subsequent PR. e.g., (although i may be ignorant of some details) @Override public int hashCode() { return Float16.hashCode(value); } public static int hashCode(float value) { return float16ToShortBits(value); } public static int float16ToShortBits(float value) { if (!isNaN(value)) { return float16ToRawShortBits(value); } return Float16.NaN; } public boolean equals(Object obj) { return (obj instanceof Float16) && (float16ToShortBits(((Float16)obj).value) == float16ToShortBits(value)); } src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java line 1198: > 1196: * > 1197: * @param f16 the value to be negated > 1198: * @jls 15.15.4 Unary Minus Operator {@code -} In prior binary operations it is just stated `* @jls 15.4 Floating-point Expressions` can we be consistent? src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16Consts.java line 92: > 90: ((EXP_BIT_MASK & SIGNIF_BIT_MASK) == 0)) && > 91: ((SIGN_BIT_MASK | MAG_BIT_MASK) == 0xFFFF)); > 92: } Consider moving this to a test, perhaps in a subsequent PR when addressing refactoring the Float16 tests out of `BigDecimal/DoubleFloatValueTests`. test/jdk/jdk/incubator/vector/BasicFloat16ArithTests.java line 34: > 32: import static jdk.incubator.vector.Float16.*; > 33: > 34: public class BasicFloat16ArithTests { Consider transforming this to a junit test, using asserts, and possibly data providers in some cases, and factoring out the FMA tests into a separate class e.g., in subsequent PR. It will then be clearer on what is tested, with what data, and what is asserted on. ------------- PR Review: https://git.openjdk.org/jdk/pull/21574#pullrequestreview-2386086446 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811280538 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811287099 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811290960 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811291449 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811308765 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811301176 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811260726 PR Review Comment: https://git.openjdk.org/jdk/pull/21574#discussion_r1811267765