| author | |
| committer | |
| log | 69cbe8ea3c54b181a42612973ae25aada7bd8b6e |
| tree | ed89e082054312a0e87b12e5f5ce8c350f6c23b3 |
| parent | 888014c83724008194b4234d96dc3af3c86dc38a |
| signature |
The changes were tested by running:
```
$ ./build/stage3/bin/zig build -p stage4 -Denable-llvm -Dno-lib
$ stage4/bin/zig build test-libc -Dlibc-test-path=<LIBC-TEST-PATH> -Dtest-filter=asin -fqemu -fwasmtime --summary line
Build Summary: 921/921 steps succeeded
```5 files changed, 5 insertions(+), 131 deletions(-)
lib/c/math.zig+5| ... | @@ -42,6 +42,7 @@ comptime { | ... | @@ -42,6 +42,7 @@ comptime { |
| 42 | if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { | 42 | if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { |
| 43 | symbol(&acos, "acos"); | 43 | symbol(&acos, "acos"); |
| 44 | symbol(&acosf, "acosf"); | 44 | symbol(&acosf, "acosf"); |
| 45 | symbol(&asin, "asin"); | ||
| 45 | symbol(&atan, "atan"); | 46 | symbol(&atan, "atan"); |
| 46 | symbol(&atanf, "atanf"); | 47 | symbol(&atanf, "atanf"); |
| 47 | symbol(&atanl, "atanl"); | 48 | symbol(&atanl, "atanl"); |
| ... | @@ -73,6 +74,10 @@ fn acosf(x: f32) callconv(.c) f32 { | ... | @@ -73,6 +74,10 @@ fn acosf(x: f32) callconv(.c) f32 { |
| 73 | return math.acos(x); | 74 | return math.acos(x); |
| 74 | } | 75 | } |
| 75 | 76 | ||
| 77 | fn asin(x: f64) callconv(.c) f64 { | ||
| 78 | return math.asin(x); | ||
| 79 | } | ||
| 80 | |||
| 76 | fn atan(x: f64) callconv(.c) f64 { | 81 | fn atan(x: f64) callconv(.c) f64 { |
| 77 | return math.atan(x); | 82 | return math.atan(x); |
| 78 | } | 83 | } |
lib/libc/musl/src/math/asin.c deleted-107| ... | @@ -1,107 +0,0 @@ | ||
| 1 | /* origin: FreeBSD /usr/src/lib/msun/src/e_asin.c */ | ||
| 2 | /* | ||
| 3 | * ==================================================== | ||
| 4 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | ||
| 5 | * | ||
| 6 | * Developed at SunSoft, a Sun Microsystems, Inc. business. | ||
| 7 | * Permission to use, copy, modify, and distribute this | ||
| 8 | * software is freely granted, provided that this notice | ||
| 9 | * is preserved. | ||
| 10 | * ==================================================== | ||
| 11 | */ | ||
| 12 | /* asin(x) | ||
| 13 | * Method : | ||
| 14 | * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ... | ||
| 15 | * we approximate asin(x) on [0,0.5] by | ||
| 16 | * asin(x) = x + x*x^2*R(x^2) | ||
| 17 | * where | ||
| 18 | * R(x^2) is a rational approximation of (asin(x)-x)/x^3 | ||
| 19 | * and its remez error is bounded by | ||
| 20 | * |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75) | ||
| 21 | * | ||
| 22 | * For x in [0.5,1] | ||
| 23 | * asin(x) = pi/2-2*asin(sqrt((1-x)/2)) | ||
| 24 | * Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2; | ||
| 25 | * then for x>0.98 | ||
| 26 | * asin(x) = pi/2 - 2*(s+s*z*R(z)) | ||
| 27 | * = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo) | ||
| 28 | * For x<=0.98, let pio4_hi = pio2_hi/2, then | ||
| 29 | * f = hi part of s; | ||
| 30 | * c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z) | ||
| 31 | * and | ||
| 32 | * asin(x) = pi/2 - 2*(s+s*z*R(z)) | ||
| 33 | * = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo) | ||
| 34 | * = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c)) | ||
| 35 | * | ||
| 36 | * Special cases: | ||
| 37 | * if x is NaN, return x itself; | ||
| 38 | * if |x|>1, return NaN with invalid signal. | ||
| 39 | * | ||
| 40 | */ | ||
| 41 | |||
| 42 | #include "libm.h" | ||
| 43 | |||
| 44 | static const double | ||
| 45 | pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ | ||
| 46 | pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ | ||
| 47 | /* coefficients for R(x^2) */ | ||
| 48 | pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ | ||
| 49 | pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ | ||
| 50 | pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ | ||
| 51 | pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ | ||
| 52 | pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ | ||
| 53 | pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ | ||
| 54 | qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ | ||
| 55 | qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ | ||
| 56 | qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ | ||
| 57 | qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ | ||
| 58 | |||
| 59 | static double R(double z) | ||
| 60 | { | ||
| 61 | 	double_t p, q; | ||
| 62 | 	p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); | ||
| 63 | 	q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*qS4))); | ||
| 64 | 	return p/q; | ||
| 65 | } | ||
| 66 | |||
| 67 | double asin(double x) | ||
| 68 | { | ||
| 69 | 	double z,r,s; | ||
| 70 | 	uint32_t hx,ix; | ||
| 71 | |||
| 72 | 	GET_HIGH_WORD(hx, x); | ||
| 73 | 	ix = hx & 0x7fffffff; | ||
| 74 | 	/* |x| >= 1 or nan */ | ||
| 75 | 	if (ix >= 0x3ff00000) { | ||
| 76 | 		uint32_t lx; | ||
| 77 | 		GET_LOW_WORD(lx, x); | ||
| 78 | 		if ((ix-0x3ff00000 | lx) == 0) | ||
| 79 | 			/* asin(1) = +-pi/2 with inexact */ | ||
| 80 | 			return x*pio2_hi + 0x1p-120f; | ||
| 81 | 		return 0/(x-x); | ||
| 82 | 	} | ||
| 83 | 	/* |x| < 0.5 */ | ||
| 84 | 	if (ix < 0x3fe00000) { | ||
| 85 | 		/* if 0x1p-1022 <= |x| < 0x1p-26, avoid raising underflow */ | ||
| 86 | 		if (ix < 0x3e500000 && ix >= 0x00100000) | ||
| 87 | 			return x; | ||
| 88 | 		return x + x*R(x*x); | ||
| 89 | 	} | ||
| 90 | 	/* 1 > |x| >= 0.5 */ | ||
| 91 | 	z = (1 - fabs(x))*0.5; | ||
| 92 | 	s = sqrt(z); | ||
| 93 | 	r = R(z); | ||
| 94 | 	if (ix >= 0x3fef3333) { /* if |x| > 0.975 */ | ||
| 95 | 		x = pio2_hi-(2*(s+s*r)-pio2_lo); | ||
| 96 | 	} else { | ||
| 97 | 		double f,c; | ||
| 98 | 		/* f+c = sqrt(z) */ | ||
| 99 | 		f = s; | ||
| 100 | 		SET_LOW_WORD(f,0); | ||
| 101 | 		c = (z-f*f)/(s+f); | ||
| 102 | 		x = 0.5*pio2_hi - (2*s*r - (pio2_lo-2*c) - (0.5*pio2_hi-2*f)); | ||
| 103 | 	} | ||
| 104 | 	if (hx >> 31) | ||
| 105 | 		return -x; | ||
| 106 | 	return x; | ||
| 107 | } | ||
lib/libc/musl/src/math/i386/asin.s deleted-21| ... | @@ -1,21 +0,0 @@ | ||
| 1 | .global asin | ||
| 2 | .type asin,@function | ||
| 3 | asin: | ||
| 4 | 	fldl 4(%esp) | ||
| 5 | 	mov 8(%esp),%eax | ||
| 6 | 	add %eax,%eax | ||
| 7 | 	cmp $0x00200000,%eax | ||
| 8 | 	jb 1f | ||
| 9 | 	fld %st(0) | ||
| 10 | 	fld1 | ||
| 11 | 	fsub %st(0),%st(1) | ||
| 12 | 	fadd %st(2) | ||
| 13 | 	fmulp | ||
| 14 | 	fsqrt | ||
| 15 | 	fpatan | ||
| 16 | 	fstpl 4(%esp) | ||
| 17 | 	fldl 4(%esp) | ||
| 18 | 	ret | ||
| 19 | 		# subnormal x, return x with underflow | ||
| 20 | 1:	fsts 4(%esp) | ||
| 21 | 	ret | ||
src/libs/musl.zig-2| ... | @@ -801,7 +801,6 @@ const src_files = [_][]const u8{ | ... | @@ -801,7 +801,6 @@ const src_files = [_][]const u8{ |
| 801 | "musl/src/math/acosl.c", | 801 | "musl/src/math/acosl.c", |
| 802 | "musl/src/math/arm/fma.c", | 802 | "musl/src/math/arm/fma.c", |
| 803 | "musl/src/math/arm/fmaf.c", | 803 | "musl/src/math/arm/fmaf.c", |
| 804 | "musl/src/math/asin.c", | ||
| 805 | "musl/src/math/asinf.c", | 804 | "musl/src/math/asinf.c", |
| 806 | "musl/src/math/asinh.c", | 805 | "musl/src/math/asinh.c", |
| 807 | "musl/src/math/asinhf.c", | 806 | "musl/src/math/asinhf.c", |
| ... | @@ -849,7 +848,6 @@ const src_files = [_][]const u8{ | ... | @@ -849,7 +848,6 @@ const src_files = [_][]const u8{ |
| 849 | "musl/src/math/i386/acosl.s", | 848 | "musl/src/math/i386/acosl.s", |
| 850 | "musl/src/math/i386/asinf.s", | 849 | "musl/src/math/i386/asinf.s", |
| 851 | "musl/src/math/i386/asinl.s", | 850 | "musl/src/math/i386/asinl.s", |
| 852 | "musl/src/math/i386/asin.s", | ||
| 853 | "musl/src/math/i386/atan2f.s", | 851 | "musl/src/math/i386/atan2f.s", |
| 854 | "musl/src/math/i386/atan2l.s", | 852 | "musl/src/math/i386/atan2l.s", |
| 855 | "musl/src/math/i386/atan2.s", | 853 | "musl/src/math/i386/atan2.s", |
src/libs/wasi_libc.zig-1| ... | @@ -668,7 +668,6 @@ const libc_top_half_src_files = [_][]const u8{ | ... | @@ -668,7 +668,6 @@ const libc_top_half_src_files = [_][]const u8{ |
| 668 | "musl/src/math/acoshf.c", | 668 | "musl/src/math/acoshf.c", |
| 669 | "musl/src/math/acoshl.c", | 669 | "musl/src/math/acoshl.c", |
| 670 | "musl/src/math/acosl.c", | 670 | "musl/src/math/acosl.c", |
| 671 | "musl/src/math/asin.c", | ||
| 672 | "musl/src/math/asinf.c", | 671 | "musl/src/math/asinf.c", |
| 673 | "musl/src/math/asinh.c", | 672 | "musl/src/math/asinh.c", |
| 674 | "musl/src/math/asinhf.c", | 673 | "musl/src/math/asinhf.c", |