@@ -35,24 +35,23 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
35
35
36
36
// |x| <= 0x1p-1, |x| <= 0.5
37
37
if (x_abs <= 0x3800 ) {
38
+ // asinf16(+/-0) = +/-0
39
+ if (LIBC_UNLIKELY (x_abs == 0 ))
40
+ return x;
41
+
42
+ // Exhaustive tests show that,
43
+ // for |x| <= 0x1.878p-9, when:
44
+ // x > 0, and rounding upward, or
45
+ // x < 0, and rounding downward, then,
46
+ // asin(x) = x * 2^-11 + x
47
+ // else, in other rounding modes,
48
+ // asin(x) = x
38
49
if (LIBC_UNLIKELY (x_abs <= 0x1a1e )) {
39
- // asinf16(+/-0) = +/-0
40
- if (LIBC_UNLIKELY (x_abs == 0U )) {
41
- return x;
42
- }
43
-
44
- // Exhaustive tests show that, when:
45
- // x > 0, and rounding upward, or
46
- // x < 0, and rounding downward, then,
47
- // asin(x) = x * 2^-11 + x
48
- // else, in other rounding modes,
49
- // asin(x) = x
50
50
int rounding = fputil::quick_get_round ();
51
51
52
52
if ((xbits.is_pos () && rounding == FE_UPWARD) ||
53
- (xbits.is_neg () && rounding == FE_DOWNWARD)) {
53
+ (xbits.is_neg () && rounding == FE_DOWNWARD))
54
54
return fputil::cast<float16>(fputil::multiply_add (xf, 0x1 .0p-11f , xf));
55
- }
56
55
return x;
57
56
}
58
57
@@ -66,11 +65,8 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
66
65
67
66
// |x| > 1, asinf16(x) = NaN
68
67
if (LIBC_UNLIKELY (x_abs > 0x3c00 )) {
69
- // |x| <= +/-inf
70
- if (LIBC_UNLIKELY (x_abs <= 0x7c00 )) {
71
- fputil::set_errno_if_required (EDOM);
72
- fputil::raise_except_if_required (FE_INVALID);
73
- }
68
+ fputil::set_errno_if_required (EDOM);
69
+ fputil::raise_except_if_required (FE_INVALID);
74
70
75
71
return FPBits::quiet_nan ().get_val ();
76
72
}
@@ -91,13 +87,13 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
91
87
// sin(z/2) = sqrt((1 - x)/2)
92
88
// 7: Let u = (1 - x)/2
93
89
// 8: Therefore:
94
- // arcsin (sqrt(u)) = z/2
95
- // 2 * arcsin (sqrt(u)) = z
90
+ // asin (sqrt(u)) = z/2
91
+ // 2 * asin (sqrt(u)) = z
96
92
// 9: Recall [3], z = pi/2 - y. Therefore:
97
93
// y = pi/2 - z
98
94
// y = pi/2 - 2 * arcsin(sqrt(u))
99
95
// 10: Recall [1], y = asin(x). Therefore:
100
- // arcsin (x) = pi/2 - 2 * arcsin (sqrt(u))
96
+ // asin (x) = pi/2 - 2 * asin (sqrt(u))
101
97
//
102
98
// WHY?
103
99
// 11: Recall [7], u = (1 - x)/2
@@ -109,7 +105,7 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
109
105
110
106
// 0x1p-1 < |x| <= 0x1p0, 0.5 < |x| <= 1.0
111
107
float xf_abs = (xf < 0 ? -xf : xf);
112
- float sign = (( xbits.uintval () >> 15 ) == 1 ? -1.0 : 1.0 );
108
+ float sign = (xbits.uintval () >> 15 == 1 ? -1.0 : 1.0 );
113
109
float u = fputil::multiply_add (-0 .5f , xf_abs, 0 .5f );
114
110
float u_sqrt = fputil::sqrt <float >(u);
115
111
0 commit comments