@@ -31,10 +31,8 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
3131 uint16_t x_abs = x_u & 0x7fff ;
3232 float xf = x;
3333
34- float xsq = xf * xf;
35-
36- // |x| <= 0x1p-1, |x| <= 0.5
37- if (x_abs <= 0x3800 ) {
34+ // |x| > 0x1p0, |x| > 1, or x is NaN.
35+ if (LIBC_UNLIKELY (x_abs > 0x3c00 )) {
3836 // asinf16(NaN) = NaN
3937 if (xbits.is_nan ()) {
4038 if (xbits.is_signaling_nan ()) {
@@ -44,7 +42,18 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
4442
4543 return x;
4644 }
45+
46+ // 1 < |x| <= +/-inf
47+ fputil::raise_except_if_required (FE_INVALID);
48+ fputil::set_errno_if_required (EDOM);
49+
50+ return FPBits::quiet_nan ().get_val ();
51+ }
52+
53+ float xsq = xf * xf;
4754
55+ // |x| <= 0x1p-1, |x| <= 0.5
56+ if (x_abs <= 0x3800 ) {
4857 // asinf16(+/-0) = +/-0
4958 if (LIBC_UNLIKELY (x_abs == 0 ))
5059 return x;
@@ -73,17 +82,6 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
7382 return fputil::cast<float16>(xf * result);
7483 }
7584
76- // |x| > 1, asinf16(x) = NaN
77- if (LIBC_UNLIKELY (x_abs > 0x3c00 )) {
78- // |x| <= +/-inf
79- if (LIBC_UNLIKELY (x_abs <= 0x7c00 )) {
80- fputil::set_errno_if_required (EDOM);
81- fputil::raise_except_if_required (FE_INVALID);
82- }
83-
84- return FPBits::quiet_nan ().get_val ();
85- }
86-
8785 // When |x| > 0.5, assume that 0.5 < |x| <= 1,
8886 //
8987 // Step-by-step range-reduction proof:
0 commit comments