blob: 83af5016eff3357a4a3038ea78a91bc62fd7381d [file] [log] [blame]
Charles L. Dorianc3fa32c2010-02-18 23:33:15 -08001// Copyright 2010 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Rob Pike8bca1482014-08-12 17:04:45 -07005#include "textflag.h"
Keith Randall1f796632013-08-12 10:25:18 -07006
Charles L. Dorianc3fa32c2010-02-18 23:33:15 -08007// func Sincos(x float64) (sin, cos float64)
Keith Randall1f796632013-08-12 10:25:18 -07008TEXT ·Sincos(SB),NOSPLIT,$0
Charles L. Dorianc3fa32c2010-02-18 23:33:15 -08009 FMOVD x+0(FP), F0 // F0=x
10 FSINCOS // F0=cos(x), F1=sin(x) if -2**63 < x < 2**63
11 FSTSW AX // AX=status word
12 ANDW $0x0400, AX
13 JNE 4(PC) // jump if x outside range
Russ Cox85729502012-09-21 00:35:56 -040014 FMOVDP F0, cos+16(FP) // F0=sin(x)
15 FMOVDP F0, sin+8(FP)
Charles L. Dorianc3fa32c2010-02-18 23:33:15 -080016 RET
17 FLDPI // F0=Pi, F1=x
18 FADDD F0, F0 // F0=2*Pi, F1=x
19 FXCHD F0, F1 // F0=x, F1=2*Pi
20 FPREM1 // F0=reduced_x, F1=2*Pi
21 FSTSW AX // AX=status word
22 ANDW $0x0400, AX
23 JNE -3(PC) // jump if reduction incomplete
24 FMOVDP F0, F1 // F0=reduced_x
25 FSINCOS // F0=cos(reduced_x), F1=sin(reduced_x)
Russ Cox85729502012-09-21 00:35:56 -040026 FMOVDP F0, cos+16(FP) // F0=sin(reduced_x)
27 FMOVDP F0, sin+8(FP)
Charles L. Dorianc3fa32c2010-02-18 23:33:15 -080028 RET