summaryrefslogtreecommitdiff
path: root/sys/src/libc/386/387/asin.s
blob: 6c91d1fe35861ff64f1097e8648bf8c606898960 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
TEXT	asin(SB), $0
	FMOVD	a+0(FP), F0	/* a */
	FMOVD	F0, F0		/* a,a */
	FMULD	F0, F0		/* a*a,a */
	FLD1			/* 1,a*a,a */
	FSUBRDP	F0, F1		/* 1-a*a,a */

	FTST
	WAIT
	FSTSW	AX
	SAHF
	JLO	bad

	FSQRT			/* sqrt(1-a*a),a */
	FPATAN			/* atan2(sqrt(1-a*a),a) */
	RET

TEXT	acos(SB), $0
	FMOVD	a+0(FP), F0
	FMOVD	F0, F0
	FMULD	F0, F0
	FLD1
	FSUBRDP	F0, F1

	FTST
	WAIT
	FSTSW	AX
	SAHF
	JLO	bad

	FSQRT
	FXCHD	F0, F1		/* identical except this */
	FPATAN
	RET

bad:
	FMOVDP	F0, F0
	FMOVDP	F0, F0
	CALL	NaN(SB)
	RET