Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions src/hotspot/share/classfile/vmIntrinsics.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -939,21 +939,21 @@ class methodHandle;
do_intrinsic(_getAndSetReference, jdk_internal_misc_Unsafe, getAndSetReference_name, getAndSetReference_signature, F_R) \
do_name( getAndSetReference_name, "getAndSetReference") \
do_signature(getAndSetReference_signature, "(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;" ) \
\
/* Float16Math API intrinsification support */ \
/* Float16 signatures */ \
do_signature(float16_unary_math_op_sig, "(Ljava/lang/Class;" \
"Ljava/lang/Object;" \
"Ljdk/internal/vm/vector/Float16Math$Float16UnaryMathOp;)" \
"Ljava/lang/Object;") \
do_signature(float16_ternary_math_op_sig, "(Ljava/lang/Class;" \
"Ljava/lang/Object;" \
"Ljava/lang/Object;" \
"Ljava/lang/Object;" \
"Ljdk/internal/vm/vector/Float16Math$Float16TernaryMathOp;)" \
"Ljava/lang/Object;") \
do_intrinsic(_sqrt_float16, jdk_internal_vm_vector_Float16Math, sqrt_name, float16_unary_math_op_sig, F_S) \
do_intrinsic(_fma_float16, jdk_internal_vm_vector_Float16Math, fma_name, float16_ternary_math_op_sig, F_S) \
\
/* Float16Math API intrinsification support */ \
/* Float16 signatures */ \
do_signature(float16_unary_math_op_sig, "(Ljava/lang/Class;" \
"Ljava/lang/Object;" \
"Ljava/util/function/UnaryOperator;)" \
"Ljava/lang/Object;") \
do_signature(float16_ternary_math_op_sig, "(Ljava/lang/Class;" \
"Ljava/lang/Object;" \
"Ljava/lang/Object;" \
"Ljava/lang/Object;" \
"Ljdk/internal/vm/vector/Float16Math$TernaryOperator;)" \
"Ljava/lang/Object;") \
do_intrinsic(_sqrt_float16, jdk_internal_vm_vector_Float16Math, sqrt_name, float16_unary_math_op_sig, F_S) \
do_intrinsic(_fma_float16, jdk_internal_vm_vector_Float16Math, fma_name, float16_ternary_math_op_sig, F_S) \
\
/* Vector API intrinsification support */ \
\
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,32 +25,23 @@
package jdk.internal.vm.vector;

import jdk.internal.vm.annotation.IntrinsicCandidate;
import java.util.function.UnaryOperator;

/**
* The class {@code Float16Math} constains intrinsic entry points corresponding
* to scalar numeric operations defined in Float16 class.
* @since 25
*/
public final class Float16Math {
private Float16Math() {
}

public interface Float16UnaryMathOp {
Object apply(Object a);
}
public class Float16Math {

public interface Float16TernaryMathOp {
Object apply(Object a, Object b, Object c);
@FunctionalInterface
public interface TernaryOperator<T> {
T apply(T a, T b, T c);
}

@IntrinsicCandidate
public static Object sqrt(Class<?> box_class, Object oa, Float16UnaryMathOp defaultImpl) {
public static <T> T sqrt(Class<T> box_class, T oa, UnaryOperator<T> defaultImpl) {
assert isNonCapturingLambda(defaultImpl) : defaultImpl;
return defaultImpl.apply(oa);
}

@IntrinsicCandidate
public static Object fma(Class<?> box_class, Object oa, Object ob, Object oc, Float16TernaryMathOp defaultImpl) {
public static <T> T fma(Class<T> box_class, T oa, T ob, T oc, TernaryOperator<T> defaultImpl) {
assert isNonCapturingLambda(defaultImpl) : defaultImpl;
return defaultImpl.apply(oa, ob, oc);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1199,14 +1199,14 @@ public static Float16 divide(Float16 dividend, Float16 divisor) {
* @see Math#sqrt(double)
*/
public static Float16 sqrt(Float16 radicand) {
return (Float16) Float16Math.sqrt(Float16.class, radicand,
return Float16Math.sqrt(Float16.class, radicand,
(_radicand) -> {
// Rounding path of sqrt(Float16 -> double) -> Float16 is fine
// for preserving the correct final value. The conversion
// Float16 -> double preserves the exact numerical value. The
// conversion of double -> Float16 also benefits from the
// 2p+2 property of IEEE 754 arithmetic.
return valueOf(Math.sqrt(((Float16)(_radicand)).doubleValue()));
return valueOf(Math.sqrt(_radicand.doubleValue()));
}
);
}
Expand Down Expand Up @@ -1410,13 +1410,13 @@ public static Float16 fma(Float16 a, Float16 b, Float16 c) {
* harmless.
*/

return (Float16) Float16Math.fma(Float16.class, a, b, c,
return Float16Math.fma(Float16.class, a, b, c,
(_a, _b, _c) -> {
// product is numerically exact in float before the cast to
// double; not necessary to widen to double before the
// multiply.
double product = (double)(((Float16)_a).floatValue() * ((Float16)_b).floatValue());
return valueOf(product + ((Float16)_c).doubleValue());
double product = (double)(_a.floatValue() * _b.floatValue());
return valueOf(product + _c.doubleValue());
});
}

Expand Down