125c28e83SPiotr Jasiukajtis/*
225c28e83SPiotr Jasiukajtis * CDDL HEADER START
325c28e83SPiotr Jasiukajtis *
425c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the
525c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License").
625c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License.
725c28e83SPiotr Jasiukajtis *
825c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
925c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
1025c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions
1125c28e83SPiotr Jasiukajtis * and limitations under the License.
1225c28e83SPiotr Jasiukajtis *
1325c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
1425c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1525c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
1625c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
1725c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
1825c28e83SPiotr Jasiukajtis *
1925c28e83SPiotr Jasiukajtis * CDDL HEADER END
2025c28e83SPiotr Jasiukajtis */
2125c28e83SPiotr Jasiukajtis/*
2225c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
2325c28e83SPiotr Jasiukajtis */
2425c28e83SPiotr Jasiukajtis/*
2525c28e83SPiotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
2625c28e83SPiotr Jasiukajtis * Use is subject to license terms.
2725c28e83SPiotr Jasiukajtis */
2825c28e83SPiotr Jasiukajtis
2925c28e83SPiotr Jasiukajtis	.file	"__vsincos.S"
3025c28e83SPiotr Jasiukajtis
3125c28e83SPiotr Jasiukajtis#include "libm.h"
3225c28e83SPiotr Jasiukajtis
3325c28e83SPiotr Jasiukajtis	RO_DATA
3425c28e83SPiotr Jasiukajtis	.align	64
3525c28e83SPiotr Jasiukajtisconstants:
3625c28e83SPiotr Jasiukajtis	.word	0x42c80000,0x00000000	! 3 * 2^44
3725c28e83SPiotr Jasiukajtis	.word	0x43380000,0x00000000	! 3 * 2^51
3825c28e83SPiotr Jasiukajtis	.word	0x3fe45f30,0x6dc9c883	! invpio2
3925c28e83SPiotr Jasiukajtis	.word	0x3ff921fb,0x54442c00	! pio2_1
4025c28e83SPiotr Jasiukajtis	.word	0x3d318469,0x898cc400	! pio2_2
4125c28e83SPiotr Jasiukajtis	.word	0x3a71701b,0x839a2520	! pio2_3
4225c28e83SPiotr Jasiukajtis	.word	0xbfc55555,0x55555533	! pp1
4325c28e83SPiotr Jasiukajtis	.word	0x3f811111,0x10e7d53b	! pp2
4425c28e83SPiotr Jasiukajtis	.word	0xbf2a0167,0xe6b3cf9b	! pp3
4525c28e83SPiotr Jasiukajtis	.word	0xbfdfffff,0xffffff65	! qq1
4625c28e83SPiotr Jasiukajtis	.word	0x3fa55555,0x54f88ed0	! qq2
4725c28e83SPiotr Jasiukajtis	.word	0xbf56c12c,0xdd185f60	! qq3
4825c28e83SPiotr Jasiukajtis
4925c28e83SPiotr Jasiukajtis! local storage indices
5025c28e83SPiotr Jasiukajtis
5125c28e83SPiotr Jasiukajtis#define xsave		STACK_BIAS-0x8
5225c28e83SPiotr Jasiukajtis#define ssave		STACK_BIAS-0x10
5325c28e83SPiotr Jasiukajtis#define csave		STACK_BIAS-0x18
5425c28e83SPiotr Jasiukajtis#define nsave		STACK_BIAS-0x1c
5525c28e83SPiotr Jasiukajtis#define sxsave		STACK_BIAS-0x20
5625c28e83SPiotr Jasiukajtis#define sssave		STACK_BIAS-0x24
5725c28e83SPiotr Jasiukajtis#define biguns		STACK_BIAS-0x28
5825c28e83SPiotr Jasiukajtis#define junk		STACK_BIAS-0x30
5925c28e83SPiotr Jasiukajtis#define nk2		STACK_BIAS-0x38
6025c28e83SPiotr Jasiukajtis#define nk1		STACK_BIAS-0x3c
6125c28e83SPiotr Jasiukajtis#define nk0		STACK_BIAS-0x40
6225c28e83SPiotr Jasiukajtis! sizeof temp storage - must be a multiple of 16 for V9
6325c28e83SPiotr Jasiukajtis#define tmps		0x40
6425c28e83SPiotr Jasiukajtis
6525c28e83SPiotr Jasiukajtis! register use
6625c28e83SPiotr Jasiukajtis
6725c28e83SPiotr Jasiukajtis! i0  n
6825c28e83SPiotr Jasiukajtis! i1  x
6925c28e83SPiotr Jasiukajtis! i2  stridex
7025c28e83SPiotr Jasiukajtis! i3  s
7125c28e83SPiotr Jasiukajtis! i4  strides
7225c28e83SPiotr Jasiukajtis! i5  0x80000000,n0
7325c28e83SPiotr Jasiukajtis
7425c28e83SPiotr Jasiukajtis! l0  hx0,k0
7525c28e83SPiotr Jasiukajtis! l1  hx1,k1
7625c28e83SPiotr Jasiukajtis! l2  hx2,k2
7725c28e83SPiotr Jasiukajtis! l3  c
7825c28e83SPiotr Jasiukajtis! l4  pc0
7925c28e83SPiotr Jasiukajtis! l5  pc1
8025c28e83SPiotr Jasiukajtis! l6  pc2
8125c28e83SPiotr Jasiukajtis! l7  stridec
8225c28e83SPiotr Jasiukajtis
8325c28e83SPiotr Jasiukajtis! the following are 64-bit registers in both V8+ and V9
8425c28e83SPiotr Jasiukajtis
8525c28e83SPiotr Jasiukajtis! g1  __vlibm_TBL_sincos2
8625c28e83SPiotr Jasiukajtis! g5  scratch,n1
8725c28e83SPiotr Jasiukajtis
8825c28e83SPiotr Jasiukajtis! o0  ps0
8925c28e83SPiotr Jasiukajtis! o1  ps1
9025c28e83SPiotr Jasiukajtis! o2  ps2
9125c28e83SPiotr Jasiukajtis! o3  0x3fe921fb
9225c28e83SPiotr Jasiukajtis! o4  0x3e400000
9325c28e83SPiotr Jasiukajtis! o5  0x4099251e
9425c28e83SPiotr Jasiukajtis! o7  scratch,n2
9525c28e83SPiotr Jasiukajtis
9625c28e83SPiotr Jasiukajtis! f0  x0,z0
9725c28e83SPiotr Jasiukajtis! f2  abs(x0)
98*55fea89dSDan Cross! f4
99*55fea89dSDan Cross! f6
100*55fea89dSDan Cross! f8
10125c28e83SPiotr Jasiukajtis! f10 x1,z1
10225c28e83SPiotr Jasiukajtis! f12 abs(x1)
103*55fea89dSDan Cross! f14
104*55fea89dSDan Cross! f16
105*55fea89dSDan Cross! f18
10625c28e83SPiotr Jasiukajtis! f20 x2,z2
10725c28e83SPiotr Jasiukajtis! f22 abs(x2)
108*55fea89dSDan Cross! f24
109*55fea89dSDan Cross! f26
110*55fea89dSDan Cross! f28
111*55fea89dSDan Cross! f30
112*55fea89dSDan Cross! f32
113*55fea89dSDan Cross! f34
11425c28e83SPiotr Jasiukajtis! f36
11525c28e83SPiotr Jasiukajtis! f38
11625c28e83SPiotr Jasiukajtis
11725c28e83SPiotr Jasiukajtis#define c3two44	%f40
11825c28e83SPiotr Jasiukajtis#define c3two51	%f42
11925c28e83SPiotr Jasiukajtis#define invpio2	%f44
12025c28e83SPiotr Jasiukajtis#define pio2_1	%f46
12125c28e83SPiotr Jasiukajtis#define pio2_2	%f48
12225c28e83SPiotr Jasiukajtis#define pio2_3	%f50
12325c28e83SPiotr Jasiukajtis#define pp1	%f52
12425c28e83SPiotr Jasiukajtis#define pp2	%f54
12525c28e83SPiotr Jasiukajtis#define pp3	%f56
12625c28e83SPiotr Jasiukajtis#define qq1	%f58
12725c28e83SPiotr Jasiukajtis#define qq2	%f60
12825c28e83SPiotr Jasiukajtis#define qq3	%f62
12925c28e83SPiotr Jasiukajtis
13025c28e83SPiotr Jasiukajtis	ENTRY(__vsincos)
13125c28e83SPiotr Jasiukajtis	save	%sp,-SA(MINFRAME)-tmps,%sp
13225c28e83SPiotr Jasiukajtis	PIC_SETUP(l7)
13325c28e83SPiotr Jasiukajtis	PIC_SET(l7,constants,o0)
13425c28e83SPiotr Jasiukajtis	PIC_SET(l7,__vlibm_TBL_sincos2,o1)
13525c28e83SPiotr Jasiukajtis	mov	%o1,%g1
13625c28e83SPiotr Jasiukajtis	wr	%g0,0x82,%asi		! set %asi for non-faulting loads
13725c28e83SPiotr Jasiukajtis#ifdef __sparcv9
13825c28e83SPiotr Jasiukajtis	stx	%i1,[%fp+xsave]		! save arguments
13925c28e83SPiotr Jasiukajtis	stx	%i3,[%fp+ssave]
14025c28e83SPiotr Jasiukajtis	stx	%i5,[%fp+csave]
14125c28e83SPiotr Jasiukajtis	ldx	[%fp+STACK_BIAS+0xb0],%l7
14225c28e83SPiotr Jasiukajtis#else
14325c28e83SPiotr Jasiukajtis	st	%i1,[%fp+xsave]		! save arguments
14425c28e83SPiotr Jasiukajtis	st	%i3,[%fp+ssave]
14525c28e83SPiotr Jasiukajtis	st	%i5,[%fp+csave]
14625c28e83SPiotr Jasiukajtis	ld	[%fp+0x5c],%l7
14725c28e83SPiotr Jasiukajtis#endif
14825c28e83SPiotr Jasiukajtis	st	%i0,[%fp+nsave]
14925c28e83SPiotr Jasiukajtis	st	%i2,[%fp+sxsave]
15025c28e83SPiotr Jasiukajtis	st	%i4,[%fp+sssave]
15125c28e83SPiotr Jasiukajtis	mov	%i5,%l3
15225c28e83SPiotr Jasiukajtis	st	%g0,[%fp+biguns]	! biguns = 0
15325c28e83SPiotr Jasiukajtis	ldd	[%o0+0x00],c3two44	! load/set up constants
15425c28e83SPiotr Jasiukajtis	ldd	[%o0+0x08],c3two51
15525c28e83SPiotr Jasiukajtis	ldd	[%o0+0x10],invpio2
15625c28e83SPiotr Jasiukajtis	ldd	[%o0+0x18],pio2_1
15725c28e83SPiotr Jasiukajtis	ldd	[%o0+0x20],pio2_2
15825c28e83SPiotr Jasiukajtis	ldd	[%o0+0x28],pio2_3
15925c28e83SPiotr Jasiukajtis	ldd	[%o0+0x30],pp1
16025c28e83SPiotr Jasiukajtis	ldd	[%o0+0x38],pp2
16125c28e83SPiotr Jasiukajtis	ldd	[%o0+0x40],pp3
16225c28e83SPiotr Jasiukajtis	ldd	[%o0+0x48],qq1
16325c28e83SPiotr Jasiukajtis	ldd	[%o0+0x50],qq2
16425c28e83SPiotr Jasiukajtis	ldd	[%o0+0x58],qq3
16525c28e83SPiotr Jasiukajtis	sethi	%hi(0x80000000),%i5
16625c28e83SPiotr Jasiukajtis	sethi	%hi(0x3e400000),%o4
16725c28e83SPiotr Jasiukajtis	sethi	%hi(0x3fe921fb),%o3
16825c28e83SPiotr Jasiukajtis	or	%o3,%lo(0x3fe921fb),%o3
16925c28e83SPiotr Jasiukajtis	sethi	%hi(0x4099251e),%o5
17025c28e83SPiotr Jasiukajtis	or	%o5,%lo(0x4099251e),%o5
17125c28e83SPiotr Jasiukajtis	sll	%i2,3,%i2		! scale strides
17225c28e83SPiotr Jasiukajtis	sll	%i4,3,%i4
17325c28e83SPiotr Jasiukajtis	sll	%l7,3,%l7
17425c28e83SPiotr Jasiukajtis	add	%fp,junk,%o0		! loop prologue
17525c28e83SPiotr Jasiukajtis	add	%fp,junk,%o1
17625c28e83SPiotr Jasiukajtis	add	%fp,junk,%o2
17725c28e83SPiotr Jasiukajtis	ld	[%i1],%l0		! *x
17825c28e83SPiotr Jasiukajtis	ld	[%i1],%f0
17925c28e83SPiotr Jasiukajtis	ld	[%i1+4],%f3
18025c28e83SPiotr Jasiukajtis	andn	%l0,%i5,%l0		! mask off sign
18125c28e83SPiotr Jasiukajtis	ba	.loop0
18225c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1		! x += stridex
18325c28e83SPiotr Jasiukajtis
18425c28e83SPiotr Jasiukajtis! 16-byte aligned
18525c28e83SPiotr Jasiukajtis	.align	16
18625c28e83SPiotr Jasiukajtis.loop0:
18725c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%l1		! preload next argument
18825c28e83SPiotr Jasiukajtis	sub	%l0,%o4,%g5
18925c28e83SPiotr Jasiukajtis	sub	%o5,%l0,%o7
19025c28e83SPiotr Jasiukajtis	fabss	%f0,%f2
19125c28e83SPiotr Jasiukajtis
19225c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%f10
19325c28e83SPiotr Jasiukajtis	orcc	%o7,%g5,%g0
19425c28e83SPiotr Jasiukajtis	mov	%i3,%o0			! ps0 = s
19525c28e83SPiotr Jasiukajtis	bl,pn	%icc,.range0		! hx < 0x3e400000 or hx > 0x4099251e
19625c28e83SPiotr Jasiukajtis
19725c28e83SPiotr Jasiukajtis! delay slot
19825c28e83SPiotr Jasiukajtis	lda	[%i1+4]%asi,%f13
19925c28e83SPiotr Jasiukajtis	addcc	%i0,-1,%i0
20025c28e83SPiotr Jasiukajtis	add	%i3,%i4,%i3		! s += strides
20125c28e83SPiotr Jasiukajtis
20225c28e83SPiotr Jasiukajtis	mov	%l3,%l4			! pc0 = c
20325c28e83SPiotr Jasiukajtis	add	%l3,%l7,%l3		! c += stridec
20425c28e83SPiotr Jasiukajtis	ble,pn	%icc,.last1
20525c28e83SPiotr Jasiukajtis
20625c28e83SPiotr Jasiukajtis! delay slot
20725c28e83SPiotr Jasiukajtis	andn	%l1,%i5,%l1
20825c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1		! x += stridex
20925c28e83SPiotr Jasiukajtis	faddd	%f2,c3two44,%f4
21025c28e83SPiotr Jasiukajtis	st	%f17,[%o1+4]
21125c28e83SPiotr Jasiukajtis
21225c28e83SPiotr Jasiukajtis.loop1:
21325c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%l2		! preload next argument
21425c28e83SPiotr Jasiukajtis	sub	%l1,%o4,%g5
21525c28e83SPiotr Jasiukajtis	sub	%o5,%l1,%o7
21625c28e83SPiotr Jasiukajtis	fabss	%f10,%f12
21725c28e83SPiotr Jasiukajtis
21825c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%f20
21925c28e83SPiotr Jasiukajtis	orcc	%o7,%g5,%g0
22025c28e83SPiotr Jasiukajtis	mov	%i3,%o1			! ps1 = s
22125c28e83SPiotr Jasiukajtis	bl,pn	%icc,.range1		! hx < 0x3e400000 or hx > 0x4099251e
22225c28e83SPiotr Jasiukajtis
22325c28e83SPiotr Jasiukajtis! delay slot
22425c28e83SPiotr Jasiukajtis	lda	[%i1+4]%asi,%f23
22525c28e83SPiotr Jasiukajtis	addcc	%i0,-1,%i0
22625c28e83SPiotr Jasiukajtis	add	%i3,%i4,%i3		! s += strides
22725c28e83SPiotr Jasiukajtis
22825c28e83SPiotr Jasiukajtis	mov	%l3,%l5			! pc1 = c
22925c28e83SPiotr Jasiukajtis	add	%l3,%l7,%l3		! c += stridec
23025c28e83SPiotr Jasiukajtis	ble,pn	%icc,.last2
23125c28e83SPiotr Jasiukajtis
23225c28e83SPiotr Jasiukajtis! delay slot
23325c28e83SPiotr Jasiukajtis	andn	%l2,%i5,%l2
23425c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1		! x += stridex
23525c28e83SPiotr Jasiukajtis	faddd	%f12,c3two44,%f14
23625c28e83SPiotr Jasiukajtis	st	%f27,[%o2+4]
23725c28e83SPiotr Jasiukajtis
23825c28e83SPiotr Jasiukajtis.loop2:
23925c28e83SPiotr Jasiukajtis	sub	%l2,%o4,%g5
24025c28e83SPiotr Jasiukajtis	sub	%o5,%l2,%o7
24125c28e83SPiotr Jasiukajtis	fabss	%f20,%f22
24225c28e83SPiotr Jasiukajtis	st	%f5,[%fp+nk0]
24325c28e83SPiotr Jasiukajtis
24425c28e83SPiotr Jasiukajtis	orcc	%o7,%g5,%g0
24525c28e83SPiotr Jasiukajtis	mov	%i3,%o2			! ps2 = s
24625c28e83SPiotr Jasiukajtis	bl,pn	%icc,.range2		! hx < 0x3e400000 or hx > 0x4099251e
24725c28e83SPiotr Jasiukajtis! delay slot
24825c28e83SPiotr Jasiukajtis	st	%f15,[%fp+nk1]
24925c28e83SPiotr Jasiukajtis
25025c28e83SPiotr Jasiukajtis	mov	%l3,%l6			! pc2 = c
25125c28e83SPiotr Jasiukajtis
25225c28e83SPiotr Jasiukajtis.cont:
25325c28e83SPiotr Jasiukajtis	add	%i3,%i4,%i3		! s += strides
25425c28e83SPiotr Jasiukajtis	add	%l3,%l7,%l3		! c += stridec
25525c28e83SPiotr Jasiukajtis	faddd	%f22,c3two44,%f24
25625c28e83SPiotr Jasiukajtis	st	%f25,[%fp+nk2]
25725c28e83SPiotr Jasiukajtis
25825c28e83SPiotr Jasiukajtis	sub	%o3,%l0,%l0
25925c28e83SPiotr Jasiukajtis	sub	%o3,%l1,%l1
26025c28e83SPiotr Jasiukajtis	fmovs	%f3,%f1
26125c28e83SPiotr Jasiukajtis
26225c28e83SPiotr Jasiukajtis	sub	%o3,%l2,%l2
26325c28e83SPiotr Jasiukajtis	fmovs	%f13,%f11
26425c28e83SPiotr Jasiukajtis
26525c28e83SPiotr Jasiukajtis	or	%l0,%l1,%l0
26625c28e83SPiotr Jasiukajtis	orcc	%l0,%l2,%g0
26725c28e83SPiotr Jasiukajtis	fmovs	%f23,%f21
26825c28e83SPiotr Jasiukajtis
26925c28e83SPiotr Jasiukajtis	fmuld	%f0,invpio2,%f6		! x * invpio2, for medium range
27025c28e83SPiotr Jasiukajtis
27125c28e83SPiotr Jasiukajtis	fmuld	%f10,invpio2,%f16
27225c28e83SPiotr Jasiukajtis	ld	[%fp+nk0],%l0
27325c28e83SPiotr Jasiukajtis
27425c28e83SPiotr Jasiukajtis	fmuld	%f20,invpio2,%f26
27525c28e83SPiotr Jasiukajtis	ld	[%fp+nk1],%l1
27625c28e83SPiotr Jasiukajtis
27725c28e83SPiotr Jasiukajtis	bl,pn	%icc,.medium
27825c28e83SPiotr Jasiukajtis! delay slot
27925c28e83SPiotr Jasiukajtis	ld	[%fp+nk2],%l2
28025c28e83SPiotr Jasiukajtis
28125c28e83SPiotr Jasiukajtis	sll	%l0,5,%l0		! k
28225c28e83SPiotr Jasiukajtis	fcmpd	%fcc0,%f0,pio2_3	! x < pio2_3 iff x < 0
28325c28e83SPiotr Jasiukajtis
28425c28e83SPiotr Jasiukajtis	sll	%l1,5,%l1
28525c28e83SPiotr Jasiukajtis	ldd	[%l0+%g1],%f4
28625c28e83SPiotr Jasiukajtis	fcmpd	%fcc1,%f10,pio2_3
28725c28e83SPiotr Jasiukajtis
28825c28e83SPiotr Jasiukajtis	sll	%l2,5,%l2
28925c28e83SPiotr Jasiukajtis	ldd	[%l1+%g1],%f14
29025c28e83SPiotr Jasiukajtis	fcmpd	%fcc2,%f20,pio2_3
29125c28e83SPiotr Jasiukajtis
29225c28e83SPiotr Jasiukajtis	ldd	[%l2+%g1],%f24
29325c28e83SPiotr Jasiukajtis
29425c28e83SPiotr Jasiukajtis	fsubd	%f2,%f4,%f2		! x -= __vlibm_TBL_sincos2[k]
29525c28e83SPiotr Jasiukajtis
29625c28e83SPiotr Jasiukajtis	fsubd	%f12,%f14,%f12
29725c28e83SPiotr Jasiukajtis
29825c28e83SPiotr Jasiukajtis	fsubd	%f22,%f24,%f22
29925c28e83SPiotr Jasiukajtis
30025c28e83SPiotr Jasiukajtis	fmuld	%f2,%f2,%f0		! z = x * x
30125c28e83SPiotr Jasiukajtis
30225c28e83SPiotr Jasiukajtis	fmuld	%f12,%f12,%f10
30325c28e83SPiotr Jasiukajtis
30425c28e83SPiotr Jasiukajtis	fmuld	%f22,%f22,%f20
30525c28e83SPiotr Jasiukajtis
30625c28e83SPiotr Jasiukajtis	fmuld	%f0,pp3,%f6
30725c28e83SPiotr Jasiukajtis
30825c28e83SPiotr Jasiukajtis	fmuld	%f10,pp3,%f16
30925c28e83SPiotr Jasiukajtis
31025c28e83SPiotr Jasiukajtis	fmuld	%f20,pp3,%f26
31125c28e83SPiotr Jasiukajtis
31225c28e83SPiotr Jasiukajtis	faddd	%f6,pp2,%f6
31325c28e83SPiotr Jasiukajtis	fmuld	%f0,qq3,%f4
31425c28e83SPiotr Jasiukajtis
31525c28e83SPiotr Jasiukajtis	faddd	%f16,pp2,%f16
31625c28e83SPiotr Jasiukajtis	fmuld	%f10,qq3,%f14
31725c28e83SPiotr Jasiukajtis
31825c28e83SPiotr Jasiukajtis	faddd	%f26,pp2,%f26
31925c28e83SPiotr Jasiukajtis	fmuld	%f20,qq3,%f24
32025c28e83SPiotr Jasiukajtis
32125c28e83SPiotr Jasiukajtis	fmuld	%f0,%f6,%f6
32225c28e83SPiotr Jasiukajtis	faddd	%f4,qq2,%f4
32325c28e83SPiotr Jasiukajtis
32425c28e83SPiotr Jasiukajtis	fmuld	%f10,%f16,%f16
32525c28e83SPiotr Jasiukajtis	faddd	%f14,qq2,%f14
32625c28e83SPiotr Jasiukajtis
32725c28e83SPiotr Jasiukajtis	fmuld	%f20,%f26,%f26
32825c28e83SPiotr Jasiukajtis	faddd	%f24,qq2,%f24
32925c28e83SPiotr Jasiukajtis
33025c28e83SPiotr Jasiukajtis	faddd	%f6,pp1,%f6
33125c28e83SPiotr Jasiukajtis	fmuld	%f0,%f4,%f4
33225c28e83SPiotr Jasiukajtis	add	%l0,%g1,%l0
33325c28e83SPiotr Jasiukajtis
33425c28e83SPiotr Jasiukajtis	faddd	%f16,pp1,%f16
33525c28e83SPiotr Jasiukajtis	fmuld	%f10,%f14,%f14
33625c28e83SPiotr Jasiukajtis	add	%l1,%g1,%l1
33725c28e83SPiotr Jasiukajtis
33825c28e83SPiotr Jasiukajtis	faddd	%f26,pp1,%f26
33925c28e83SPiotr Jasiukajtis	fmuld	%f20,%f24,%f24
34025c28e83SPiotr Jasiukajtis	add	%l2,%g1,%l2
34125c28e83SPiotr Jasiukajtis
34225c28e83SPiotr Jasiukajtis	fmuld	%f0,%f6,%f6
34325c28e83SPiotr Jasiukajtis	faddd	%f4,qq1,%f4
34425c28e83SPiotr Jasiukajtis
34525c28e83SPiotr Jasiukajtis	fmuld	%f10,%f16,%f16
34625c28e83SPiotr Jasiukajtis	faddd	%f14,qq1,%f14
34725c28e83SPiotr Jasiukajtis
34825c28e83SPiotr Jasiukajtis	fmuld	%f20,%f26,%f26
34925c28e83SPiotr Jasiukajtis	faddd	%f24,qq1,%f24
35025c28e83SPiotr Jasiukajtis
35125c28e83SPiotr Jasiukajtis	fmuld	%f2,%f6,%f6
35225c28e83SPiotr Jasiukajtis	ldd	[%l0+8],%f8
35325c28e83SPiotr Jasiukajtis
35425c28e83SPiotr Jasiukajtis	fmuld	%f12,%f16,%f16
35525c28e83SPiotr Jasiukajtis	ldd	[%l1+8],%f18
35625c28e83SPiotr Jasiukajtis
35725c28e83SPiotr Jasiukajtis	fmuld	%f22,%f26,%f26
35825c28e83SPiotr Jasiukajtis	ldd	[%l2+8],%f28
35925c28e83SPiotr Jasiukajtis
36025c28e83SPiotr Jasiukajtis	faddd	%f6,%f2,%f6
36125c28e83SPiotr Jasiukajtis	fmuld	%f0,%f4,%f4
36225c28e83SPiotr Jasiukajtis	ldd	[%l0+16],%f30
36325c28e83SPiotr Jasiukajtis
36425c28e83SPiotr Jasiukajtis	faddd	%f16,%f12,%f16
36525c28e83SPiotr Jasiukajtis	fmuld	%f10,%f14,%f14
36625c28e83SPiotr Jasiukajtis	ldd	[%l1+16],%f32
36725c28e83SPiotr Jasiukajtis
36825c28e83SPiotr Jasiukajtis	faddd	%f26,%f22,%f26
36925c28e83SPiotr Jasiukajtis	fmuld	%f20,%f24,%f24
37025c28e83SPiotr Jasiukajtis	ldd	[%l2+16],%f34
37125c28e83SPiotr Jasiukajtis
37225c28e83SPiotr Jasiukajtis	fmuld	%f8,%f6,%f0		! s * spoly
37325c28e83SPiotr Jasiukajtis
37425c28e83SPiotr Jasiukajtis	fmuld	%f18,%f16,%f10
37525c28e83SPiotr Jasiukajtis
37625c28e83SPiotr Jasiukajtis	fmuld	%f28,%f26,%f20
37725c28e83SPiotr Jasiukajtis
37825c28e83SPiotr Jasiukajtis	fmuld	%f30,%f4,%f2		! c * cpoly
37925c28e83SPiotr Jasiukajtis
38025c28e83SPiotr Jasiukajtis	fmuld	%f32,%f14,%f12
38125c28e83SPiotr Jasiukajtis
38225c28e83SPiotr Jasiukajtis	fmuld	%f34,%f24,%f22
38325c28e83SPiotr Jasiukajtis
38425c28e83SPiotr Jasiukajtis	fmuld	%f30,%f6,%f6		! c * spoly
38525c28e83SPiotr Jasiukajtis	fsubd	%f2,%f0,%f2
38625c28e83SPiotr Jasiukajtis
38725c28e83SPiotr Jasiukajtis	fmuld	%f32,%f16,%f16
38825c28e83SPiotr Jasiukajtis	fsubd	%f12,%f10,%f12
38925c28e83SPiotr Jasiukajtis
39025c28e83SPiotr Jasiukajtis	fmuld	%f34,%f26,%f26
39125c28e83SPiotr Jasiukajtis	fsubd	%f22,%f20,%f22
39225c28e83SPiotr Jasiukajtis
39325c28e83SPiotr Jasiukajtis	fmuld	%f8,%f4,%f4		! s * cpoly
39425c28e83SPiotr Jasiukajtis	faddd	%f2,%f30,%f2
39525c28e83SPiotr Jasiukajtis	st	%f2,[%l4]
39625c28e83SPiotr Jasiukajtis
39725c28e83SPiotr Jasiukajtis	fmuld	%f18,%f14,%f14
39825c28e83SPiotr Jasiukajtis	faddd	%f12,%f32,%f12
39925c28e83SPiotr Jasiukajtis	st	%f3,[%l4+4]
40025c28e83SPiotr Jasiukajtis
40125c28e83SPiotr Jasiukajtis	fmuld	%f28,%f24,%f24
40225c28e83SPiotr Jasiukajtis	faddd	%f22,%f34,%f22
40325c28e83SPiotr Jasiukajtis	st	%f12,[%l5]
40425c28e83SPiotr Jasiukajtis
40525c28e83SPiotr Jasiukajtis	faddd	%f6,%f4,%f6
40625c28e83SPiotr Jasiukajtis	st	%f13,[%l5+4]
40725c28e83SPiotr Jasiukajtis
40825c28e83SPiotr Jasiukajtis	faddd	%f16,%f14,%f16
40925c28e83SPiotr Jasiukajtis	st	%f22,[%l6]
41025c28e83SPiotr Jasiukajtis
41125c28e83SPiotr Jasiukajtis	faddd	%f26,%f24,%f26
41225c28e83SPiotr Jasiukajtis	st	%f23,[%l6+4]
41325c28e83SPiotr Jasiukajtis
41425c28e83SPiotr Jasiukajtis	faddd	%f6,%f8,%f6
41525c28e83SPiotr Jasiukajtis
41625c28e83SPiotr Jasiukajtis	faddd	%f16,%f18,%f16
41725c28e83SPiotr Jasiukajtis
41825c28e83SPiotr Jasiukajtis	faddd	%f26,%f28,%f26
41925c28e83SPiotr Jasiukajtis
42025c28e83SPiotr Jasiukajtis	fnegd	%f6,%f4
42125c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%l0		! preload next argument
42225c28e83SPiotr Jasiukajtis
42325c28e83SPiotr Jasiukajtis	fnegd	%f16,%f14
42425c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%f0
42525c28e83SPiotr Jasiukajtis
42625c28e83SPiotr Jasiukajtis	fnegd	%f26,%f24
42725c28e83SPiotr Jasiukajtis	lda	[%i1+4]%asi,%f3
42825c28e83SPiotr Jasiukajtis	andn	%l0,%i5,%l0
42925c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1
43025c28e83SPiotr Jasiukajtis
43125c28e83SPiotr Jasiukajtis	fmovdl	%fcc0,%f4,%f6		! (hx < -0)? -s : s
43225c28e83SPiotr Jasiukajtis	st	%f6,[%o0]
43325c28e83SPiotr Jasiukajtis
43425c28e83SPiotr Jasiukajtis	fmovdl	%fcc1,%f14,%f16
43525c28e83SPiotr Jasiukajtis	st	%f16,[%o1]
43625c28e83SPiotr Jasiukajtis
43725c28e83SPiotr Jasiukajtis	fmovdl	%fcc2,%f24,%f26
43825c28e83SPiotr Jasiukajtis	st	%f26,[%o2]
43925c28e83SPiotr Jasiukajtis	addcc	%i0,-1,%i0
44025c28e83SPiotr Jasiukajtis
44125c28e83SPiotr Jasiukajtis	bg,pt	%icc,.loop0
44225c28e83SPiotr Jasiukajtis! delay slot
44325c28e83SPiotr Jasiukajtis	st	%f7,[%o0+4]
44425c28e83SPiotr Jasiukajtis
44525c28e83SPiotr Jasiukajtis	ba,pt	%icc,.end
44625c28e83SPiotr Jasiukajtis! delay slot
44725c28e83SPiotr Jasiukajtis	nop
44825c28e83SPiotr Jasiukajtis
44925c28e83SPiotr Jasiukajtis
45025c28e83SPiotr Jasiukajtis	.align	16
45125c28e83SPiotr Jasiukajtis.medium:
45225c28e83SPiotr Jasiukajtis	faddd	%f6,c3two51,%f4
45325c28e83SPiotr Jasiukajtis	st	%f5,[%fp+nk0]
45425c28e83SPiotr Jasiukajtis
45525c28e83SPiotr Jasiukajtis	faddd	%f16,c3two51,%f14
45625c28e83SPiotr Jasiukajtis	st	%f15,[%fp+nk1]
45725c28e83SPiotr Jasiukajtis
45825c28e83SPiotr Jasiukajtis	faddd	%f26,c3two51,%f24
45925c28e83SPiotr Jasiukajtis	st	%f25,[%fp+nk2]
46025c28e83SPiotr Jasiukajtis
46125c28e83SPiotr Jasiukajtis	fsubd	%f4,c3two51,%f6
46225c28e83SPiotr Jasiukajtis
46325c28e83SPiotr Jasiukajtis	fsubd	%f14,c3two51,%f16
46425c28e83SPiotr Jasiukajtis
46525c28e83SPiotr Jasiukajtis	fsubd	%f24,c3two51,%f26
46625c28e83SPiotr Jasiukajtis
46725c28e83SPiotr Jasiukajtis	fmuld	%f6,pio2_1,%f2
46825c28e83SPiotr Jasiukajtis	ld	[%fp+nk0],%i5		! n
46925c28e83SPiotr Jasiukajtis
47025c28e83SPiotr Jasiukajtis	fmuld	%f16,pio2_1,%f12
47125c28e83SPiotr Jasiukajtis	ld	[%fp+nk1],%g5
47225c28e83SPiotr Jasiukajtis
47325c28e83SPiotr Jasiukajtis	fmuld	%f26,pio2_1,%f22
47425c28e83SPiotr Jasiukajtis	ld	[%fp+nk2],%o7
47525c28e83SPiotr Jasiukajtis
47625c28e83SPiotr Jasiukajtis	fsubd	%f0,%f2,%f0
47725c28e83SPiotr Jasiukajtis	fmuld	%f6,pio2_2,%f4
47825c28e83SPiotr Jasiukajtis	mov	%o0,%o4			! if (n & 1) swap ps, pc
47925c28e83SPiotr Jasiukajtis	andcc	%i5,1,%g0
48025c28e83SPiotr Jasiukajtis
48125c28e83SPiotr Jasiukajtis	fsubd	%f10,%f12,%f10
48225c28e83SPiotr Jasiukajtis	fmuld	%f16,pio2_2,%f14
48325c28e83SPiotr Jasiukajtis	movnz	%icc,%l4,%o0
48425c28e83SPiotr Jasiukajtis	and	%i5,3,%i5
48525c28e83SPiotr Jasiukajtis
48625c28e83SPiotr Jasiukajtis	fsubd	%f20,%f22,%f20
48725c28e83SPiotr Jasiukajtis	fmuld	%f26,pio2_2,%f24
48825c28e83SPiotr Jasiukajtis	movnz	%icc,%o4,%l4
48925c28e83SPiotr Jasiukajtis
49025c28e83SPiotr Jasiukajtis	fsubd	%f0,%f4,%f30
49125c28e83SPiotr Jasiukajtis	mov	%o1,%o4
49225c28e83SPiotr Jasiukajtis	andcc	%g5,1,%g0
49325c28e83SPiotr Jasiukajtis
49425c28e83SPiotr Jasiukajtis	fsubd	%f10,%f14,%f32
49525c28e83SPiotr Jasiukajtis	movnz	%icc,%l5,%o1
49625c28e83SPiotr Jasiukajtis	and	%g5,3,%g5
49725c28e83SPiotr Jasiukajtis
49825c28e83SPiotr Jasiukajtis	fsubd	%f20,%f24,%f34
49925c28e83SPiotr Jasiukajtis	movnz	%icc,%o4,%l5
50025c28e83SPiotr Jasiukajtis
50125c28e83SPiotr Jasiukajtis	fsubd	%f0,%f30,%f0
50225c28e83SPiotr Jasiukajtis	fcmple32 %f30,pio2_3,%l0	! x <= pio2_3 iff x < 0
50325c28e83SPiotr Jasiukajtis	mov	%o2,%o4
50425c28e83SPiotr Jasiukajtis	andcc	%o7,1,%g0
50525c28e83SPiotr Jasiukajtis
50625c28e83SPiotr Jasiukajtis	fsubd	%f10,%f32,%f10
50725c28e83SPiotr Jasiukajtis	fcmple32 %f32,pio2_3,%l1
50825c28e83SPiotr Jasiukajtis	movnz	%icc,%l6,%o2
50925c28e83SPiotr Jasiukajtis	and	%o7,3,%o7
51025c28e83SPiotr Jasiukajtis
51125c28e83SPiotr Jasiukajtis	fsubd	%f20,%f34,%f20
51225c28e83SPiotr Jasiukajtis	fcmple32 %f34,pio2_3,%l2
51325c28e83SPiotr Jasiukajtis	movnz	%icc,%o4,%l6
51425c28e83SPiotr Jasiukajtis
51525c28e83SPiotr Jasiukajtis	fsubd	%f0,%f4,%f0
51625c28e83SPiotr Jasiukajtis	fmuld	%f6,pio2_3,%f6
51725c28e83SPiotr Jasiukajtis	add	%i5,1,%o4		! n = (n >> 1) | (((n + 1) ^ l) & 2)
51825c28e83SPiotr Jasiukajtis	srl	%i5,1,%i5
51925c28e83SPiotr Jasiukajtis
52025c28e83SPiotr Jasiukajtis	fsubd	%f10,%f14,%f10
52125c28e83SPiotr Jasiukajtis	fmuld	%f16,pio2_3,%f16
52225c28e83SPiotr Jasiukajtis	xor	%o4,%l0,%o4
52325c28e83SPiotr Jasiukajtis
52425c28e83SPiotr Jasiukajtis	fsubd	%f20,%f24,%f20
52525c28e83SPiotr Jasiukajtis	fmuld	%f26,pio2_3,%f26
52625c28e83SPiotr Jasiukajtis	and	%o4,2,%o4
52725c28e83SPiotr Jasiukajtis
52825c28e83SPiotr Jasiukajtis	fsubd	%f6,%f0,%f6
52925c28e83SPiotr Jasiukajtis	or	%i5,%o4,%i5
53025c28e83SPiotr Jasiukajtis
53125c28e83SPiotr Jasiukajtis	fsubd	%f16,%f10,%f16
53225c28e83SPiotr Jasiukajtis	add	%g5,1,%o4
53325c28e83SPiotr Jasiukajtis	srl	%g5,1,%g5
53425c28e83SPiotr Jasiukajtis
53525c28e83SPiotr Jasiukajtis	fsubd	%f26,%f20,%f26
53625c28e83SPiotr Jasiukajtis	xor	%o4,%l1,%o4
53725c28e83SPiotr Jasiukajtis
53825c28e83SPiotr Jasiukajtis	fsubd	%f30,%f6,%f0		! reduced x
53925c28e83SPiotr Jasiukajtis	and	%o4,2,%o4
54025c28e83SPiotr Jasiukajtis
54125c28e83SPiotr Jasiukajtis	fsubd	%f32,%f16,%f10
54225c28e83SPiotr Jasiukajtis	or	%g5,%o4,%g5
54325c28e83SPiotr Jasiukajtis
54425c28e83SPiotr Jasiukajtis	fsubd	%f34,%f26,%f20
54525c28e83SPiotr Jasiukajtis	add	%o7,1,%o4
54625c28e83SPiotr Jasiukajtis	srl	%o7,1,%o7
54725c28e83SPiotr Jasiukajtis
54825c28e83SPiotr Jasiukajtis	fzero	%f38
54925c28e83SPiotr Jasiukajtis	xor	%o4,%l2,%o4
55025c28e83SPiotr Jasiukajtis
55125c28e83SPiotr Jasiukajtis	fabsd	%f0,%f2
55225c28e83SPiotr Jasiukajtis	and	%o4,2,%o4
55325c28e83SPiotr Jasiukajtis
55425c28e83SPiotr Jasiukajtis	fabsd	%f10,%f12
55525c28e83SPiotr Jasiukajtis	or	%o7,%o4,%o7
55625c28e83SPiotr Jasiukajtis
55725c28e83SPiotr Jasiukajtis	fabsd	%f20,%f22
55825c28e83SPiotr Jasiukajtis	sethi	%hi(0x3e400000),%o4
55925c28e83SPiotr Jasiukajtis
56025c28e83SPiotr Jasiukajtis	fnegd	%f38,%f38
56125c28e83SPiotr Jasiukajtis
56225c28e83SPiotr Jasiukajtis	faddd	%f2,c3two44,%f4
56325c28e83SPiotr Jasiukajtis	st	%f5,[%fp+nk0]
56425c28e83SPiotr Jasiukajtis
56525c28e83SPiotr Jasiukajtis	faddd	%f12,c3two44,%f14
56625c28e83SPiotr Jasiukajtis	st	%f15,[%fp+nk1]
56725c28e83SPiotr Jasiukajtis
56825c28e83SPiotr Jasiukajtis	faddd	%f22,c3two44,%f24
56925c28e83SPiotr Jasiukajtis	st	%f25,[%fp+nk2]
57025c28e83SPiotr Jasiukajtis
57125c28e83SPiotr Jasiukajtis	fsubd	%f30,%f0,%f4
57225c28e83SPiotr Jasiukajtis
57325c28e83SPiotr Jasiukajtis	fsubd	%f32,%f10,%f14
57425c28e83SPiotr Jasiukajtis
57525c28e83SPiotr Jasiukajtis	fsubd	%f34,%f20,%f24
57625c28e83SPiotr Jasiukajtis
57725c28e83SPiotr Jasiukajtis	fsubd	%f4,%f6,%f6		! w
57825c28e83SPiotr Jasiukajtis	ld	[%fp+nk0],%l0
57925c28e83SPiotr Jasiukajtis
58025c28e83SPiotr Jasiukajtis	fsubd	%f14,%f16,%f16
58125c28e83SPiotr Jasiukajtis	ld	[%fp+nk1],%l1
58225c28e83SPiotr Jasiukajtis
58325c28e83SPiotr Jasiukajtis	fsubd	%f24,%f26,%f26
58425c28e83SPiotr Jasiukajtis	ld	[%fp+nk2],%l2
58525c28e83SPiotr Jasiukajtis	sll	%l0,5,%l0		! k
58625c28e83SPiotr Jasiukajtis
58725c28e83SPiotr Jasiukajtis	fand	%f0,%f38,%f30		! sign bit of x
58825c28e83SPiotr Jasiukajtis	ldd	[%l0+%g1],%f4
58925c28e83SPiotr Jasiukajtis	sll	%l1,5,%l1
59025c28e83SPiotr Jasiukajtis
59125c28e83SPiotr Jasiukajtis	fand	%f10,%f38,%f32
59225c28e83SPiotr Jasiukajtis	ldd	[%l1+%g1],%f14
59325c28e83SPiotr Jasiukajtis	sll	%l2,5,%l2
59425c28e83SPiotr Jasiukajtis
59525c28e83SPiotr Jasiukajtis	fand	%f20,%f38,%f34
59625c28e83SPiotr Jasiukajtis	ldd	[%l2+%g1],%f24
59725c28e83SPiotr Jasiukajtis
59825c28e83SPiotr Jasiukajtis	fsubd	%f2,%f4,%f2		! x -= __vlibm_TBL_sincos2[k]
59925c28e83SPiotr Jasiukajtis
60025c28e83SPiotr Jasiukajtis	fsubd	%f12,%f14,%f12
60125c28e83SPiotr Jasiukajtis
60225c28e83SPiotr Jasiukajtis	fsubd	%f22,%f24,%f22
60325c28e83SPiotr Jasiukajtis
60425c28e83SPiotr Jasiukajtis	fmuld	%f2,%f2,%f0		! z = x * x
60525c28e83SPiotr Jasiukajtis	fxor	%f6,%f30,%f30
60625c28e83SPiotr Jasiukajtis
60725c28e83SPiotr Jasiukajtis	fmuld	%f12,%f12,%f10
60825c28e83SPiotr Jasiukajtis	fxor	%f16,%f32,%f32
60925c28e83SPiotr Jasiukajtis
61025c28e83SPiotr Jasiukajtis	fmuld	%f22,%f22,%f20
61125c28e83SPiotr Jasiukajtis	fxor	%f26,%f34,%f34
61225c28e83SPiotr Jasiukajtis
61325c28e83SPiotr Jasiukajtis	fmuld	%f0,pp3,%f6
61425c28e83SPiotr Jasiukajtis
61525c28e83SPiotr Jasiukajtis	fmuld	%f10,pp3,%f16
61625c28e83SPiotr Jasiukajtis
61725c28e83SPiotr Jasiukajtis	fmuld	%f20,pp3,%f26
61825c28e83SPiotr Jasiukajtis
61925c28e83SPiotr Jasiukajtis	faddd	%f6,pp2,%f6
62025c28e83SPiotr Jasiukajtis	fmuld	%f0,qq3,%f4
62125c28e83SPiotr Jasiukajtis
62225c28e83SPiotr Jasiukajtis	faddd	%f16,pp2,%f16
62325c28e83SPiotr Jasiukajtis	fmuld	%f10,qq3,%f14
62425c28e83SPiotr Jasiukajtis
62525c28e83SPiotr Jasiukajtis	faddd	%f26,pp2,%f26
62625c28e83SPiotr Jasiukajtis	fmuld	%f20,qq3,%f24
62725c28e83SPiotr Jasiukajtis
62825c28e83SPiotr Jasiukajtis	fmuld	%f0,%f6,%f6
62925c28e83SPiotr Jasiukajtis	faddd	%f4,qq2,%f4
63025c28e83SPiotr Jasiukajtis
63125c28e83SPiotr Jasiukajtis	fmuld	%f10,%f16,%f16
63225c28e83SPiotr Jasiukajtis	faddd	%f14,qq2,%f14
63325c28e83SPiotr Jasiukajtis
63425c28e83SPiotr Jasiukajtis	fmuld	%f20,%f26,%f26
63525c28e83SPiotr Jasiukajtis	faddd	%f24,qq2,%f24
63625c28e83SPiotr Jasiukajtis
63725c28e83SPiotr Jasiukajtis	faddd	%f6,pp1,%f6
63825c28e83SPiotr Jasiukajtis	fmuld	%f0,%f4,%f4
63925c28e83SPiotr Jasiukajtis	add	%l0,%g1,%l0
64025c28e83SPiotr Jasiukajtis
64125c28e83SPiotr Jasiukajtis	faddd	%f16,pp1,%f16
64225c28e83SPiotr Jasiukajtis	fmuld	%f10,%f14,%f14
64325c28e83SPiotr Jasiukajtis	add	%l1,%g1,%l1
64425c28e83SPiotr Jasiukajtis
64525c28e83SPiotr Jasiukajtis	faddd	%f26,pp1,%f26
64625c28e83SPiotr Jasiukajtis	fmuld	%f20,%f24,%f24
64725c28e83SPiotr Jasiukajtis	add	%l2,%g1,%l2
64825c28e83SPiotr Jasiukajtis
64925c28e83SPiotr Jasiukajtis	fmuld	%f0,%f6,%f6
65025c28e83SPiotr Jasiukajtis	faddd	%f4,qq1,%f4
65125c28e83SPiotr Jasiukajtis
65225c28e83SPiotr Jasiukajtis	fmuld	%f10,%f16,%f16
65325c28e83SPiotr Jasiukajtis	faddd	%f14,qq1,%f14
65425c28e83SPiotr Jasiukajtis
65525c28e83SPiotr Jasiukajtis	fmuld	%f20,%f26,%f26
65625c28e83SPiotr Jasiukajtis	faddd	%f24,qq1,%f24
65725c28e83SPiotr Jasiukajtis
65825c28e83SPiotr Jasiukajtis	fmuld	%f2,%f6,%f6
65925c28e83SPiotr Jasiukajtis	ldd	[%l0+16],%f8
66025c28e83SPiotr Jasiukajtis
66125c28e83SPiotr Jasiukajtis	fmuld	%f12,%f16,%f16
66225c28e83SPiotr Jasiukajtis	ldd	[%l1+16],%f18
66325c28e83SPiotr Jasiukajtis
66425c28e83SPiotr Jasiukajtis	fmuld	%f22,%f26,%f26
66525c28e83SPiotr Jasiukajtis	ldd	[%l2+16],%f28
66625c28e83SPiotr Jasiukajtis
66725c28e83SPiotr Jasiukajtis	faddd	%f6,%f30,%f6
66825c28e83SPiotr Jasiukajtis	fmuld	%f0,%f4,%f4
66925c28e83SPiotr Jasiukajtis	ldd	[%l0+8],%f30
67025c28e83SPiotr Jasiukajtis
67125c28e83SPiotr Jasiukajtis	faddd	%f16,%f32,%f16
67225c28e83SPiotr Jasiukajtis	fmuld	%f10,%f14,%f14
67325c28e83SPiotr Jasiukajtis	ldd	[%l1+8],%f32
67425c28e83SPiotr Jasiukajtis
67525c28e83SPiotr Jasiukajtis	faddd	%f26,%f34,%f26
67625c28e83SPiotr Jasiukajtis	fmuld	%f20,%f24,%f24
67725c28e83SPiotr Jasiukajtis	ldd	[%l2+8],%f34
67825c28e83SPiotr Jasiukajtis
67925c28e83SPiotr Jasiukajtis	fmuld	%f8,%f4,%f0		! c * cpoly
68025c28e83SPiotr Jasiukajtis	faddd	%f6,%f2,%f6
68125c28e83SPiotr Jasiukajtis
68225c28e83SPiotr Jasiukajtis	fmuld	%f18,%f14,%f10
68325c28e83SPiotr Jasiukajtis	faddd	%f16,%f12,%f16
68425c28e83SPiotr Jasiukajtis
68525c28e83SPiotr Jasiukajtis	fmuld	%f28,%f24,%f20
68625c28e83SPiotr Jasiukajtis	faddd	%f26,%f22,%f26
68725c28e83SPiotr Jasiukajtis
68825c28e83SPiotr Jasiukajtis	fmuld	%f30,%f6,%f2		! s * spoly
68925c28e83SPiotr Jasiukajtis
69025c28e83SPiotr Jasiukajtis	fmuld	%f32,%f16,%f12
69125c28e83SPiotr Jasiukajtis
69225c28e83SPiotr Jasiukajtis	fmuld	%f34,%f26,%f22
69325c28e83SPiotr Jasiukajtis
69425c28e83SPiotr Jasiukajtis	fmuld	%f8,%f6,%f6		! c * spoly
69525c28e83SPiotr Jasiukajtis	fsubd	%f0,%f2,%f2
69625c28e83SPiotr Jasiukajtis
69725c28e83SPiotr Jasiukajtis	fmuld	%f18,%f16,%f16
69825c28e83SPiotr Jasiukajtis	fsubd	%f10,%f12,%f12
69925c28e83SPiotr Jasiukajtis
70025c28e83SPiotr Jasiukajtis	fmuld	%f28,%f26,%f26
70125c28e83SPiotr Jasiukajtis	fsubd	%f20,%f22,%f22
70225c28e83SPiotr Jasiukajtis
70325c28e83SPiotr Jasiukajtis	fmuld	%f30,%f4,%f4		! s * cpoly
70425c28e83SPiotr Jasiukajtis	faddd	%f8,%f2,%f8
70525c28e83SPiotr Jasiukajtis
70625c28e83SPiotr Jasiukajtis	fmuld	%f32,%f14,%f14
70725c28e83SPiotr Jasiukajtis	faddd	%f18,%f12,%f18
70825c28e83SPiotr Jasiukajtis
70925c28e83SPiotr Jasiukajtis	fmuld	%f34,%f24,%f24
71025c28e83SPiotr Jasiukajtis	faddd	%f28,%f22,%f28
71125c28e83SPiotr Jasiukajtis
71225c28e83SPiotr Jasiukajtis	faddd	%f4,%f6,%f6
71325c28e83SPiotr Jasiukajtis
71425c28e83SPiotr Jasiukajtis	faddd	%f14,%f16,%f16
71525c28e83SPiotr Jasiukajtis
71625c28e83SPiotr Jasiukajtis	faddd	%f24,%f26,%f26
71725c28e83SPiotr Jasiukajtis
71825c28e83SPiotr Jasiukajtis	faddd	%f30,%f6,%f6		! now %f6 = sin |x|, %f8 = cos |x|
71925c28e83SPiotr Jasiukajtis
72025c28e83SPiotr Jasiukajtis	faddd	%f32,%f16,%f16
72125c28e83SPiotr Jasiukajtis
72225c28e83SPiotr Jasiukajtis	faddd	%f34,%f26,%f26
72325c28e83SPiotr Jasiukajtis
72425c28e83SPiotr Jasiukajtis	fnegd	%f8,%f4			! if (n & 1) c = -c
72525c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%l0		! preload next argument
72625c28e83SPiotr Jasiukajtis	mov	%i5,%l1
72725c28e83SPiotr Jasiukajtis
72825c28e83SPiotr Jasiukajtis	fnegd	%f18,%f14
72925c28e83SPiotr Jasiukajtis	lda	[%i1]%asi,%f0
73025c28e83SPiotr Jasiukajtis	sethi	%hi(0x80000000),%i5
73125c28e83SPiotr Jasiukajtis
73225c28e83SPiotr Jasiukajtis	fnegd	%f28,%f24
73325c28e83SPiotr Jasiukajtis	lda	[%i1+4]%asi,%f3
73425c28e83SPiotr Jasiukajtis
73525c28e83SPiotr Jasiukajtis	andcc	%l1,1,%g0
73625c28e83SPiotr Jasiukajtis	fmovdnz	%icc,%f4,%f8
73725c28e83SPiotr Jasiukajtis	st	%f8,[%l4]
73825c28e83SPiotr Jasiukajtis
73925c28e83SPiotr Jasiukajtis	andcc	%g5,1,%g0
74025c28e83SPiotr Jasiukajtis	fmovdnz	%icc,%f14,%f18
74125c28e83SPiotr Jasiukajtis	st	%f9,[%l4+4]
74225c28e83SPiotr Jasiukajtis
74325c28e83SPiotr Jasiukajtis	andcc	%o7,1,%g0
74425c28e83SPiotr Jasiukajtis	fmovdnz	%icc,%f24,%f28
74525c28e83SPiotr Jasiukajtis	st	%f18,[%l5]
74625c28e83SPiotr Jasiukajtis
74725c28e83SPiotr Jasiukajtis	fnegd	%f6,%f4			! if (n & 2) s = -s
74825c28e83SPiotr Jasiukajtis	st	%f19,[%l5+4]
74925c28e83SPiotr Jasiukajtis	andn	%l0,%i5,%l0
75025c28e83SPiotr Jasiukajtis
75125c28e83SPiotr Jasiukajtis	fnegd	%f16,%f14
75225c28e83SPiotr Jasiukajtis	st	%f28,[%l6]
75325c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1
75425c28e83SPiotr Jasiukajtis
75525c28e83SPiotr Jasiukajtis	fnegd	%f26,%f24
75625c28e83SPiotr Jasiukajtis	st	%f29,[%l6+4]
75725c28e83SPiotr Jasiukajtis
75825c28e83SPiotr Jasiukajtis	andcc	%l1,2,%g0
75925c28e83SPiotr Jasiukajtis	fmovdnz	%icc,%f4,%f6
76025c28e83SPiotr Jasiukajtis	st	%f6,[%o0]
76125c28e83SPiotr Jasiukajtis
76225c28e83SPiotr Jasiukajtis	andcc	%g5,2,%g0
76325c28e83SPiotr Jasiukajtis	fmovdnz	%icc,%f14,%f16
76425c28e83SPiotr Jasiukajtis	st	%f16,[%o1]
76525c28e83SPiotr Jasiukajtis
76625c28e83SPiotr Jasiukajtis	andcc	%o7,2,%g0
76725c28e83SPiotr Jasiukajtis	fmovdnz	%icc,%f24,%f26
76825c28e83SPiotr Jasiukajtis	st	%f26,[%o2]
76925c28e83SPiotr Jasiukajtis
77025c28e83SPiotr Jasiukajtis	addcc	%i0,-1,%i0
77125c28e83SPiotr Jasiukajtis	bg,pt	%icc,.loop0
77225c28e83SPiotr Jasiukajtis! delay slot
77325c28e83SPiotr Jasiukajtis	st	%f7,[%o0+4]
77425c28e83SPiotr Jasiukajtis
77525c28e83SPiotr Jasiukajtis	ba,pt	%icc,.end
77625c28e83SPiotr Jasiukajtis! delay slot
77725c28e83SPiotr Jasiukajtis	nop
77825c28e83SPiotr Jasiukajtis
77925c28e83SPiotr Jasiukajtis
78025c28e83SPiotr Jasiukajtis	.align	16
78125c28e83SPiotr Jasiukajtis.end:
78225c28e83SPiotr Jasiukajtis	st	%f17,[%o1+4]
78325c28e83SPiotr Jasiukajtis	st	%f27,[%o2+4]
78425c28e83SPiotr Jasiukajtis	ld	[%fp+biguns],%i5
78525c28e83SPiotr Jasiukajtis	tst	%i5			! check for huge arguments remaining
78625c28e83SPiotr Jasiukajtis	be,pt	%icc,.exit
78725c28e83SPiotr Jasiukajtis! delay slot
78825c28e83SPiotr Jasiukajtis	nop
78925c28e83SPiotr Jasiukajtis#ifdef __sparcv9
79025c28e83SPiotr Jasiukajtis	stx	%o5,[%sp+STACK_BIAS+0xb8]
79125c28e83SPiotr Jasiukajtis	ldx	[%fp+xsave],%o1
79225c28e83SPiotr Jasiukajtis	ldx	[%fp+ssave],%o3
79325c28e83SPiotr Jasiukajtis	ldx	[%fp+csave],%o5
79425c28e83SPiotr Jasiukajtis	ldx	[%fp+STACK_BIAS+0xb0],%i5
79525c28e83SPiotr Jasiukajtis	stx	%i5,[%sp+STACK_BIAS+0xb0]
79625c28e83SPiotr Jasiukajtis#else
79725c28e83SPiotr Jasiukajtis	st	%o5,[%sp+0x60]
79825c28e83SPiotr Jasiukajtis	ld	[%fp+xsave],%o1
79925c28e83SPiotr Jasiukajtis	ld	[%fp+ssave],%o3
80025c28e83SPiotr Jasiukajtis	ld	[%fp+csave],%o5
80125c28e83SPiotr Jasiukajtis	ld	[%fp+0x5c],%i5
80225c28e83SPiotr Jasiukajtis	st	%i5,[%sp+0x5c]
80325c28e83SPiotr Jasiukajtis#endif
80425c28e83SPiotr Jasiukajtis	ld	[%fp+nsave],%o0
80525c28e83SPiotr Jasiukajtis	ld	[%fp+sxsave],%o2
80625c28e83SPiotr Jasiukajtis	ld	[%fp+sssave],%o4
80725c28e83SPiotr Jasiukajtis	sra	%o2,0,%o2		! sign-extend for V9
80825c28e83SPiotr Jasiukajtis	call	__vlibm_vsincos_big
80925c28e83SPiotr Jasiukajtis	sra	%o4,0,%o4		! delay slot
81025c28e83SPiotr Jasiukajtis
81125c28e83SPiotr Jasiukajtis.exit:
81225c28e83SPiotr Jasiukajtis	ret
81325c28e83SPiotr Jasiukajtis	restore
81425c28e83SPiotr Jasiukajtis
81525c28e83SPiotr Jasiukajtis
81625c28e83SPiotr Jasiukajtis	.align	16
81725c28e83SPiotr Jasiukajtis.last1:
81825c28e83SPiotr Jasiukajtis	faddd	%f2,c3two44,%f4
81925c28e83SPiotr Jasiukajtis	st	%f17,[%o1+4]
82025c28e83SPiotr Jasiukajtis.last1_from_range1:
82125c28e83SPiotr Jasiukajtis	mov	0,%l1
82225c28e83SPiotr Jasiukajtis	fzeros	%f10
82325c28e83SPiotr Jasiukajtis	fzero	%f12
82425c28e83SPiotr Jasiukajtis	add	%fp,junk,%o1
82525c28e83SPiotr Jasiukajtis	add	%fp,junk,%l5
82625c28e83SPiotr Jasiukajtis.last2:
82725c28e83SPiotr Jasiukajtis	faddd	%f12,c3two44,%f14
82825c28e83SPiotr Jasiukajtis	st	%f27,[%o2+4]
82925c28e83SPiotr Jasiukajtis	st	%f5,[%fp+nk0]
83025c28e83SPiotr Jasiukajtis	st	%f15,[%fp+nk1]
83125c28e83SPiotr Jasiukajtis.last2_from_range2:
83225c28e83SPiotr Jasiukajtis	mov	0,%l2
83325c28e83SPiotr Jasiukajtis	fzeros	%f20
83425c28e83SPiotr Jasiukajtis	fzero	%f22
83525c28e83SPiotr Jasiukajtis	add	%fp,junk,%o2
83625c28e83SPiotr Jasiukajtis	ba,pt	%icc,.cont
83725c28e83SPiotr Jasiukajtis! delay slot
83825c28e83SPiotr Jasiukajtis	add	%fp,junk,%l6
83925c28e83SPiotr Jasiukajtis
84025c28e83SPiotr Jasiukajtis
84125c28e83SPiotr Jasiukajtis	.align	16
84225c28e83SPiotr Jasiukajtis.range0:
84325c28e83SPiotr Jasiukajtis	cmp	%l0,%o4
84425c28e83SPiotr Jasiukajtis	bl,pt	%icc,1f			! hx < 0x3e400000
84525c28e83SPiotr Jasiukajtis! delay slot, harmless if branch taken
84625c28e83SPiotr Jasiukajtis	sethi	%hi(0x7ff00000),%o7
84725c28e83SPiotr Jasiukajtis	cmp	%l0,%o7
84825c28e83SPiotr Jasiukajtis	bl,a,pt	%icc,2f			! branch if finite
84925c28e83SPiotr Jasiukajtis! delay slot, squashed if branch not taken
85025c28e83SPiotr Jasiukajtis	st	%o4,[%fp+biguns]	! set biguns
85125c28e83SPiotr Jasiukajtis	fzero	%f0
85225c28e83SPiotr Jasiukajtis	fmuld	%f2,%f0,%f2
85325c28e83SPiotr Jasiukajtis	st	%f2,[%o0]
85425c28e83SPiotr Jasiukajtis	st	%f3,[%o0+4]
85525c28e83SPiotr Jasiukajtis	st	%f2,[%l3]
85625c28e83SPiotr Jasiukajtis	ba,pt	%icc,2f
85725c28e83SPiotr Jasiukajtis! delay slot
85825c28e83SPiotr Jasiukajtis	st	%f3,[%l3+4]
85925c28e83SPiotr Jasiukajtis1:
86025c28e83SPiotr Jasiukajtis	fdtoi	%f2,%f4			! raise inexact if not zero
86125c28e83SPiotr Jasiukajtis	st	%f0,[%o0]
86225c28e83SPiotr Jasiukajtis	st	%f3,[%o0+4]
86325c28e83SPiotr Jasiukajtis	sethi	%hi(0x3ff00000),%g5
86425c28e83SPiotr Jasiukajtis	st	%g5,[%l3]
86525c28e83SPiotr Jasiukajtis	st	%g0,[%l3+4]
86625c28e83SPiotr Jasiukajtis2:
86725c28e83SPiotr Jasiukajtis	addcc	%i0,-1,%i0
86825c28e83SPiotr Jasiukajtis	ble,pn	%icc,.end
86925c28e83SPiotr Jasiukajtis! delay slot, harmless if branch taken
87025c28e83SPiotr Jasiukajtis	add	%i3,%i4,%i3		! s += strides
87125c28e83SPiotr Jasiukajtis	add	%l3,%l7,%l3		! c += stridec
87225c28e83SPiotr Jasiukajtis	andn	%l1,%i5,%l0		! hx &= ~0x80000000
87325c28e83SPiotr Jasiukajtis	fmovs	%f10,%f0
87425c28e83SPiotr Jasiukajtis	fmovs	%f13,%f3
87525c28e83SPiotr Jasiukajtis	ba,pt	%icc,.loop0
87625c28e83SPiotr Jasiukajtis! delay slot
87725c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1		! x += stridex
87825c28e83SPiotr Jasiukajtis
87925c28e83SPiotr Jasiukajtis
88025c28e83SPiotr Jasiukajtis	.align	16
88125c28e83SPiotr Jasiukajtis.range1:
88225c28e83SPiotr Jasiukajtis	cmp	%l1,%o4
88325c28e83SPiotr Jasiukajtis	bl,pt	%icc,1f			! hx < 0x3e400000
88425c28e83SPiotr Jasiukajtis! delay slot, harmless if branch taken
88525c28e83SPiotr Jasiukajtis	sethi	%hi(0x7ff00000),%o7
88625c28e83SPiotr Jasiukajtis	cmp	%l1,%o7
88725c28e83SPiotr Jasiukajtis	bl,a,pt	%icc,2f			! branch if finite
88825c28e83SPiotr Jasiukajtis! delay slot, squashed if branch not taken
88925c28e83SPiotr Jasiukajtis	st	%o4,[%fp+biguns]	! set biguns
89025c28e83SPiotr Jasiukajtis	fzero	%f10
89125c28e83SPiotr Jasiukajtis	fmuld	%f12,%f10,%f12
89225c28e83SPiotr Jasiukajtis	st	%f12,[%o1]
89325c28e83SPiotr Jasiukajtis	st	%f13,[%o1+4]
89425c28e83SPiotr Jasiukajtis	st	%f12,[%l3]
89525c28e83SPiotr Jasiukajtis	ba,pt	%icc,2f
89625c28e83SPiotr Jasiukajtis! delay slot
89725c28e83SPiotr Jasiukajtis	st	%f13,[%l3+4]
89825c28e83SPiotr Jasiukajtis1:
89925c28e83SPiotr Jasiukajtis	fdtoi	%f12,%f14		! raise inexact if not zero
90025c28e83SPiotr Jasiukajtis	st	%f10,[%o1]
90125c28e83SPiotr Jasiukajtis	st	%f13,[%o1+4]
90225c28e83SPiotr Jasiukajtis	sethi	%hi(0x3ff00000),%g5
90325c28e83SPiotr Jasiukajtis	st	%g5,[%l3]
90425c28e83SPiotr Jasiukajtis	st	%g0,[%l3+4]
90525c28e83SPiotr Jasiukajtis2:
90625c28e83SPiotr Jasiukajtis	addcc	%i0,-1,%i0
90725c28e83SPiotr Jasiukajtis	ble,pn	%icc,.last1_from_range1
90825c28e83SPiotr Jasiukajtis! delay slot, harmless if branch taken
90925c28e83SPiotr Jasiukajtis	add	%i3,%i4,%i3		! s += strides
91025c28e83SPiotr Jasiukajtis	add	%l3,%l7,%l3		! c += stridec
91125c28e83SPiotr Jasiukajtis	andn	%l2,%i5,%l1		! hx &= ~0x80000000
91225c28e83SPiotr Jasiukajtis	fmovs	%f20,%f10
91325c28e83SPiotr Jasiukajtis	fmovs	%f23,%f13
91425c28e83SPiotr Jasiukajtis	ba,pt	%icc,.loop1
91525c28e83SPiotr Jasiukajtis! delay slot
91625c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1		! x += stridex
91725c28e83SPiotr Jasiukajtis
91825c28e83SPiotr Jasiukajtis
91925c28e83SPiotr Jasiukajtis	.align	16
92025c28e83SPiotr Jasiukajtis.range2:
92125c28e83SPiotr Jasiukajtis	cmp	%l2,%o4
92225c28e83SPiotr Jasiukajtis	bl,pt	%icc,1f			! hx < 0x3e400000
92325c28e83SPiotr Jasiukajtis! delay slot, harmless if branch taken
92425c28e83SPiotr Jasiukajtis	sethi	%hi(0x7ff00000),%o7
92525c28e83SPiotr Jasiukajtis	cmp	%l2,%o7
92625c28e83SPiotr Jasiukajtis	bl,a,pt	%icc,2f			! branch if finite
92725c28e83SPiotr Jasiukajtis! delay slot, squashed if branch not taken
92825c28e83SPiotr Jasiukajtis	st	%o4,[%fp+biguns]	! set biguns
92925c28e83SPiotr Jasiukajtis	fzero	%f20
93025c28e83SPiotr Jasiukajtis	fmuld	%f22,%f20,%f22
93125c28e83SPiotr Jasiukajtis	st	%f22,[%o2]
93225c28e83SPiotr Jasiukajtis	st	%f23,[%o2+4]
93325c28e83SPiotr Jasiukajtis	st	%f22,[%l3]
93425c28e83SPiotr Jasiukajtis	ba,pt	%icc,2f
93525c28e83SPiotr Jasiukajtis! delay slot
93625c28e83SPiotr Jasiukajtis	st	%f23,[%l3+4]
93725c28e83SPiotr Jasiukajtis1:
93825c28e83SPiotr Jasiukajtis	fdtoi	%f22,%f24		! raise inexact if not zero
93925c28e83SPiotr Jasiukajtis	st	%f20,[%o2]
94025c28e83SPiotr Jasiukajtis	st	%f23,[%o2+4]
94125c28e83SPiotr Jasiukajtis	sethi	%hi(0x3ff00000),%g5
94225c28e83SPiotr Jasiukajtis	st	%g5,[%l3]
94325c28e83SPiotr Jasiukajtis	st	%g0,[%l3+4]
94425c28e83SPiotr Jasiukajtis2:
94525c28e83SPiotr Jasiukajtis	addcc	%i0,-1,%i0
94625c28e83SPiotr Jasiukajtis	ble,pn	%icc,.last2_from_range2
94725c28e83SPiotr Jasiukajtis! delay slot, harmless if branch taken
94825c28e83SPiotr Jasiukajtis	add	%i3,%i4,%i3		! s += strides
94925c28e83SPiotr Jasiukajtis	add	%l3,%l7,%l3		! c += stridec
95025c28e83SPiotr Jasiukajtis	ld	[%i1],%l2
95125c28e83SPiotr Jasiukajtis	ld	[%i1],%f20
95225c28e83SPiotr Jasiukajtis	ld	[%i1+4],%f23
95325c28e83SPiotr Jasiukajtis	andn	%l2,%i5,%l2		! hx &= ~0x80000000
95425c28e83SPiotr Jasiukajtis	ba,pt	%icc,.loop2
95525c28e83SPiotr Jasiukajtis! delay slot
95625c28e83SPiotr Jasiukajtis	add	%i1,%i2,%i1		! x += stridex
95725c28e83SPiotr Jasiukajtis
95825c28e83SPiotr Jasiukajtis	SET_SIZE(__vsincos)
95925c28e83SPiotr Jasiukajtis
960