⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trig.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
📖 第 1 页 / 共 3 页
字号:
 	.seg	"data"	.asciz	"@(#)trig.S 1.1 92/07/30 SMI"#define LOCORE#include <machine/asm_linkage.h>! Copyright (c) 1988 by Sun Microsystems, Inc.!! double sin(x), cos(x), tan(x), sincos(x)! IEEE Double precision trig functions on Sunrise!! Algorithm: see libm/C/trig.c!	.seg	"text"	ENTRY(sin)	ba	trig	mov	0,%o4	ENTRY(cos)	ba	trig	mov	1,%o4	ENTRY(tan)	ba	trig	mov	2,%o4	ENTRY(sincos)	ba	trig	mov	3,%o4! trig()	.seg	"data"	.global	_fp_pi	.align	4_fp_pi:	.word	1		! initialize fp_pi = 1 = fp_pi_66        .align 8constant:thresh1	= 0x0	.word   0x3fe0b70c,0x6d604dd5thresh2	= 0x8	.word   0x3fd0584c,0x22231902invpio2	= 0x10	.word   0x3fe45f30,0x6dc9c883pio4	= 0x18	.word   0x3fe921fb,0x54442d18pio2	= 0x20	.word   0x3ff921fb,0x54442d18pio2_1	= 0x28	.word   0x3ff921fb,0x54400000pio2_1t	= 0x30	.word   0x3dd0b461,0x1a626331pio2_1t5= 0x38	.word   0x3dd0b460,0x0pio2_2	= 0x40	.word   0x3dd0b461,0x1a600000pio2_2t	= 0x48	.word   0x3ba3198a,0x2e037073pio2_3	= 0x50	.word   0x3ba3198a,0x2e000000pio2_3t	= 0x58	.word   0x397b839a,0x252049c1medium	= 0x60	.double	0r1647099.0tiny	= 0x68	.double	0r1.0e-10big	= 0x70	.double	0r1.0e10zero	= 0x78	.double	0r0one	= 0x80	.double	0r1.0half	= 0x88	.double	0r0.5c5_8	= 0x90	.double	0r0.625c3_8	= 0x98	.double	0r0.375c13_16	= 0xa0	.double	0r0.8125c3_16	= 0xa8	.double	0r0.1875c002246	= 0xb0	.double	0r0.002246c000085	= 0xb8	.double	0r0.000085c1_3	= 0xc0	.double	0r0.33333333333333333333c1_6	= 0xc8	.double	0r0.16666666666666666666c2_15	= 0xd0	.double	0r0.13333333333333333333c1_24	= 0xd8	.double	0r0.041666666666666666666c1_120	= 0xe0	.double	0r0.0083333333333333333333ctiny1	= 0xe8	.double	0r0.00390625ctiny2	= 0xf0	.double	0r9.094947e-13C:	! C_inf	.double 0r4.16666666666666019E-2, 0r-1.38888888888744744E-3	.double 0r2.48015872896717822E-5, 0r-2.75573144009911252E-7	.double 0r2.08757292566166689E-9, 0r-1.13599319556004135E-11	.double 0r0,0r0	! C_66 = C_inf	.double 0r4.16666666666666019E-2, 0r-1.38888888888744744E-3	.double 0r2.48015872896717822E-5, 0r-2.75573144009911252E-7	.double 0r2.08757292566166689E-9, 0r-1.13599319556004135E-11	.double 0r0,0r0	! C_53	.double 0r4.1666666666666504759E-2, 0r-1.3888888888865301516E-3	.double 0r2.4801587269650015769E-5, 0r-2.7557304623183959811E-7	.double 0r2.0873958177697780076E-9, 0r-1.1250289076471311557E-11	.double 0r0,0r0S:	! S_inf	.double 0r1.66666666666666796E-1, 0r-8.33333333333178931E-3	.double 0r1.98412698361250482E-4, 0r-2.75573156035895542E-6	.double 0r2.50510254394993115E-8, 0r-1.59108690260756780E-10	.double 0r0,0r0	! S_66 = S_inf	.double 0r1.66666666666666796E-1, 0r-8.33333333333178931E-3	.double 0r1.98412698361250482E-4, 0r-2.75573156035895542E-6	.double 0r2.50510254394993115E-8, 0r-1.59108690260756780E-10	.double 0r0,0r0	! S_53	.double 0r1.6666666666666463126E-1, 0r-8.3333333332992771264E-3	.double 0r1.9841269816180999116E-4, 0r-2.7557309793219876880E-6	.double 0r2.5050225177523807003E-8, 0r-1.5868926979889205164E-10	.double 0r0,0r0! temporary variable using fp pointerx	= -0x8y1	= -0x10y2	= -0x18t	= -0x20z	= -0x28n	= -0x30! local register variable! i0 = high x, 			input, will be changed to high |x|! i1 = low x			input! i2 = *s			input from sincos! i3 = *c			input from sincos! i4 = k			input 0-sin,1-cos,2-tan,3-sincos! i5 = signx			local! l0 = address of constant	local! l1 = j			indicator of whether y2=0! l2 = n!! f0 = x			local! f12= x*x			local! f22= y1! f24= y2	.seg	"text"trig:		save	%sp,-0xc0,%sp	set	constant,%l0		! l0 = address of constant	st	%i0,[%fp+x]	st	%i1,[%fp+4+x]	sethi	%hi(0x80000000),%l5	and	%i0,%l5,%i5		! i5 = signx	andn	%i0,%l5,%i0		! i0 = high |x|    ! if(!finite(x)) return NaN	sethi	%hi(0x7ff00000),%l5	and	%l5,%i0,%l4	cmp	%l5,%l4	bne	T1	ldd	[%fp+x],%f0		! set f0 = x	fsubd	%f0,%f0,%f0	cmp	%i4,3	bne	Treturn	nop	st	%f0,[%i2]	st	%f1,[%i2+4]	st	%f0,[%i3]	ba	Treturn	st	%f1,[%i3+4]T1:    ! if(t<0.002246) then ...	ld	[%l0+c002246],%l5	cmp	%i0,%l5	bge	T2	mov	0,%l1			! set j=0    !     if(t<tiny) then ...	ld	[%l0+tiny],%l5	cmp	%i0,%l5	bge	1f	nop	ldd	[%l0+big],%f2	faddd	%f0,%f2,%f2		! create inexact flag	cmp	%i4,3	bne	2f	nop	ldd	[%l0+one],%f4		! k=3	st	%f0,[%i2]	st	%f1,[%i2+4]	st	%f4,[%i3]	ba	Treturn	st	%f5,[%i3+4]2:	cmp	%i4,1				bne	Treturn			! k=0,2 sin(x)=tan(x)=x	nop	ba	Treturn	ldd	[%l0+one],%f0		! k=1	cos(x)=11:	fmuld	%f0,%f0,%f12		! f12 = z = x*x;    !     if(t<0.000085) then ...	ld	[%l0+c000085],%l5	cmp	%i0,%l5	bge	1f	cmp	%i4,1	bg	2f	nop	be	3f	nop	fmuld	%f0,%f12,%f10		! k = 0	ldd	[%l0+c1_6],%f2	fmuld	%f10,%f2,%f2	ba	Treturn	fsubd	%f0,%f2,%f03:	ldd	[%l0+half],%f2		! k = 1	fmuld	%f2,%f12,%f10	ldd	[%l0+one],%f0	ba	Treturn	fsubd	%f0,%f10,%f02:	cmp	%i4,3	be	4f	fmuld	%f0,%f12,%f10		! k = 2	ldd	[%l0+c1_3],%f2	fmuld	%f2,%f10,%f10	ba	Treturn	faddd	%f0,%f10,%f04:	ldd	[%l0+half],%f4		! k = 3	fmuld	%f12,%f4,%f4		! z*0.5	ldd	[%l0+one],%f6	fsubd	%f6,%f4,%f4		! 1-z*0.5	ldd	[%l0+c1_6],%f8	fmuld	%f10,%f8,%f8		! x*z*1/6	fsubd	%f0,%f8,%f8		! x - x*z*1/6	st	%f4,[%i3]	st	%f5,[%i3+4]	st	%f8,[%i2]	ba	Treturn	st	%f9,[%i2+4]1:   ! now 0.002246 <= |x| < 0.00085	bg	2f	nop	be	3f	nop	fmuld	%f0,%f12,%f10		! k = 0	ldd	[%l0+c1_120],%f2	fmuld	%f12,%f2,%f2	ldd	[%l0+c1_6],%f4	fsubd	%f4,%f2,%f2	fmuld	%f10,%f2,%f2	ba	Treturn	fsubd	%f0,%f2,%f03:	ldd	[%l0+c1_24],%f2		! k = 1	fmuld	%f12,%f2,%f2	ldd	[%l0+half],%f4	fsubd	%f4,%f2,%f2	fmuld	%f12,%f2,%f2	ldd	[%l0+one],%f0	ba	Treturn	fsubd	%f0,%f2,%f02:	cmp	%i4,3	be	4f	fmuld	%f12,%f0,%f10		! k = 2, f10 = x*z	ldd	[%l0+c2_15],%f2	fmuld	%f12,%f2,%f2	ldd	[%l0+c1_3],%f4	faddd	%f4,%f2,%f2	fmuld	%f10,%f2,%f2	ba	Treturn	faddd	%f0,%f2,%f04:	ldd	[%l0+c1_120],%f2	! k = 3	ldd	[%l0+c1_24],%f4	fmuld	%f12,%f2,%f2		! f2 = z/120	ldd	[%l0+c1_6],%f6	fsubd	%f6,%f2,%f2	fmuld	%f10,%f2,%f2	fsubd	%f0,%f2,%f2		! f2 = sin(x)	fmuld	%f12,%f4,%f4	ldd	[%l0+half],%f6	fsubd	%f6,%f4,%f4	fmuld	%f12,%f4,%f4	ldd	[%l0+one],%f0	st	%f2,[%i2]	st	%f3,[%i2+4]	fsubd	%f0,%f4,%f4		! f4 = cos(x)	st	%f4,[%i3]	ba	Treturn	st	%f5,[%i3+4]T2:	mov	0,%l2			! set n = 0	ldd	[%fp+x],%f22		! y1 = x    ! if (t>pio4) then ...	ld	[%l0+pio4],%l5	cmp	%i0,%l5	bl	T3	nop	bg	1f	nop	ld	[%l0+pio4+4],%l5	cmp	%i1,%l5	bleu	T3	nop1:	set	base,%l4	set	_fp_pi,%l3	ld	[%l3],%l3	sll	%l3,3,%l3		! l3 = (_fp_pi)<<3	jmp	%l4+%l3	nopbase:	ba	pi_inf	nop	ba	pi_66	nop	ba	pi_53	noppi_inf:	mov	1,%l1			! j = 1	ld	[%l0+pio2],%l5	cmp	%i0,%l5	bg	pi_inf_1	fabss	%f0,%f0			! now f0 = |x|	bl	1f	nop	ld	[%l0+pio2+4],%l5	cmp	%i1,%l5	bgu	pi_inf_1	nop1:	ldd	[%l0+pio2_1],%f2	fsubd	%f0,%f2,%f4		! z  = |x| - pio2_1	ldd	[%l0+pio2_1t],%f6	! f6 = pio2_1t	mov	1,%l2			! n = 1	ld	[%l0+ctiny1],%l4	fsubd	%f4,%f6,%f22		! y1 = z - pio2_1t	st	%f4,[%fp+t]	ld	[%fp+t],%l5	sethi	%hi(0x80000000),%l3	andn	%l5,%l3,%l5	cmp	%l5,%l4	ble	2f	nop	fsubd	%f4,%f22,%f8	ba	4f	fsubd	%f8,%f6,%f24		! y2 = (z-y1)-pio2_1t2:	ldd	[%l0+pio2_2],%f8	fsubd	%f4,%f8,%f4		! z -= pio2_2	ldd	[%l0+pio2_2t],%f6	! f6 = pio2_2t	fsubd	%f4,%f6,%f22	st	%f4,[%fp+t]	ld	[%fp+t],%l5	ld	[%l0+ctiny2],%l4	andn	%l5,%l3,%l5	cmp	%l5,%l4	ble	3f	nop	fsubd	%f4,%f22,%f8	ba	4f	fsubd	%f8,%f6,%f24		! y2 = (z-y1)-pio2_2t3:	ldd	[%l0+pio2_3],%f8	fsubd	%f4,%f8,%f4		! z -= pio2_3	ldd	[%l0+pio2_3t],%f6	fsubd	%f4,%f6,%f22		! y1 = z - pio2_3t	fsubd	%f4,%f22,%f8	fsubd	%f8,%f6,%f24		! y2 = (z-y1) -pio2_3t4:	tst	%i5	be	T3	nop	mov	-1,%l2			! n = -1	fnegs	%f22,%f22	ba	T3	fnegs	%f24,%f24pi_inf_1:		ld	[%l0+medium],%l5	cmp	%i0,%l5	ble	1f	nop	or	%i0,%i5,%o0		! call argred for huge argument	mov	%i1,%o1	add	%fp,y1,%o2	call	argred	add	%fp,y2,%o3	mov	%o0,%l2	ldd	[%fp+y1],%f22	ba	T3	ldd	[%fp+y2],%f241:    ! 	else if(t<=medium) then ...	ldd	[%l0+invpio2],%f2	fmuld	%f0,%f2,%f2	ldd	[%l0+half],%f4	faddd	%f4,%f2,%f2	fdtoi	%f2,%f2	fitod	%f2,%f4			! f4 = double n	st	%f2,[%fp+n]	ld	[%fp+n],%l2	ldd	[%l0+pio2_1],%f6	fmuld	%f4,%f6,%f6	fsubd	%f0,%f6,%f6		! f6 = z = |x|-n*pio2_1	ldd	[%l0+pio2_1t],%f8	fmuld	%f4,%f8,%f8		! f8 = w = n*pio2_1t	sethi	%hi(0x80000000),%l3	ld	[%l0+ctiny1],%l5	fsubd	%f6,%f8,%f22		! y1 = z - w	st	%f6,[%fp+t]	ld	[%fp+t],%l4	andn	%l4,%l3,%l4	cmp	%l4,%l5	ble	2f	nop	fsubd	%f6,%f22,%f24	ba	4f	fsubd	%f24,%f8,%f242:	ldd	[%l0+pio2_2],%f10	fmuld	%f4,%f10,%f10	fsubd	%f6,%f10,%f6		! f6 = z -= n*pio2_2	ldd	[%l0+pio2_2t],%f8	fmuld	%f4,%f8,%f8		! f8 = w  = n*pio2_2t	ld	[%l0+ctiny2],%l5	fsubd	%f6,%f8,%f22		! y1 = z - w	st	%f6,[%fp+t]	ld	[%fp+t],%l4	andn	%l4,%l3,%l4	cmp	%l4,%l5	ble	3f	nop	fsubd	%f6,%f22,%f24	ba	4f	fsubd	%f24,%f8,%f243:	ldd	[%l0+pio2_3],%f10	fmuld	%f4,%f10,%f10	fsubd	%f6,%f10,%f6		! f6 = z -= n*pio2_3	ldd	[%l0+pio2_3t],%f8	fmuld	%f4,%f8,%f8		! f8 = w  = n*pio2_3t	fsubd	%f6,%f8,%f22		! y1 = z - w	fsubd	%f6,%f22,%f24	fsubd	%f24,%f8,%f244:	tst	%i5	be	T3	nop	sub	%g0,%l2,%l2		! n = -n	fnegs	%f22,%f22	ba	T3	fnegs	%f24,%f24pi_66:	mov	1,%l1			! j = 1	ld	[%l0+pio2],%l5	cmp	%i0,%l5	bg	pi_66_1	fabss	%f0,%f0			! now f0 = |x|	bl	1f	nop	ld	[%l0+pio2+4],%l5	cmp	%i1,%l5	bgu	pi_66_1	nop1:	ldd	[%l0+pio2_1],%f2	fsubd	%f0,%f2,%f4		! z  = |x| - pio2_1	ldd	[%l0+pio2_2],%f6	! f6 = pio2_2	mov	1,%l2			! n = 1	fsubd	%f4,%f6,%f22		! y1 = z - pio2_2	fsubd	%f4,%f22,%f24	fsubd	%f24,%f6,%f24		! y2 = (z-y1)-pio2_2;	tst	%i5	be	T3	nop	fnegs	%f22,%f22	mov	-1,%l2			! n = -1	ba	T3	fnegs	%f24,%f24pi_66_1:	ld	[%l0+medium],%l5	cmp	%i0,%l5	ble	1f	nop	or	%i0,%i5,%o0		! call argred for huge argument	mov	%i1,%o1	add	%fp,y1,%o2	call	argred	add	%fp,y2,%o3	mov	%o0,%l2	ldd	[%fp+y1],%f22	ba	T3	ldd	[%fp+y2],%f241:    ! 	else if(t<=medium) then ...	ldd	[%l0+invpio2],%f2	fmuld	%f0,%f2,%f2	ldd	[%l0+half],%f4	faddd	%f4,%f2,%f2	fdtoi	%f2,%f2	fitod	%f2,%f4			! f4 = double n	st	%f2,[%fp+n]	ld	[%fp+n],%l2	ldd	[%l0+pio2_1],%f6	fmuld	%f4,%f6,%f6	fsubd	%f0,%f6,%f6		! f6 = z = |x|-n*pio2_1	ldd	[%l0+pio2_2],%f8	fmuld	%f4,%f8,%f8		! f8 = w = n*pio2_2	fsubd	%f6,%f8,%f22		! y1 = z - w	fsubd	%f6,%f22,%f24	fsubd	%f24,%f8,%f24	tst	%i5	be	T3	nop	fnegs	%f22,%f22	sub	%g0,%l2,%l2		! n = -n	ba	T3	fnegs	%f24,%f24pi_53:	ld	[%l0+pio2],%l5	cmp	%i0,%l5	bg	pi_53_1	fabss	%f0,%f0			! now f0 = |x|	bl	1f	nop	ld	[%l0+pio2+4],%l5	cmp	%i1,%l5	bgu	pi_53_1	nop1:	ldd	[%l0+pio2],%f2	fsubd	%f0,%f2,%f22		! y1  = |x| - pio2	tst	%i5	be	T3	mov	1,%l2	mov	-1,%l2	ba	T3	fnegs	%f22,%f22pi_53_1:	ld	[%l0+medium],%l5	cmp	%i0,%l5	ble	1f	nop	or	%i0,%i5,%o0		! call argred for huge argument	mov	%i1,%o1	mov	1,%l1			! set j=1	add	%fp,y1,%o2	call	argred	add	%fp,y2,%o3	mov	%o0,%l2	ldd	[%fp+y1],%f22	ba	T3	ldd	[%fp+y2],%f241:    ! 	else if(t<=medium) then ...	ldd	[%l0+invpio2],%f2	fmuld	%f0,%f2,%f2	ldd	[%l0+half],%f4	faddd	%f4,%f2,%f2	fdtoi	%f2,%f2	fitod	%f2,%f4			! f4 = double n	st	%f2,[%fp+n]	ld	[%fp+n],%l2	ldd	[%l0+pio2_1],%f6	fmuld	%f4,%f6,%f6	fsubd	%f0,%f6,%f6		! f6 = z = |x|-n*pio2_1	ldd	[%l0+pio2_1t5],%f8	fmuld	%f4,%f8,%f8		! f8 = w = n*pio2_1t5	fsubd	%f6,%f8,%f22		! y1 = z - w	tst	%i5	be	T3	nop	fnegs	%f22,%f22	sub	%g0,%l2,%l2		! n = -n	fnegs	%f24,%f24T3:    ! redefine local variable:    ! f12 = z = y1*y1    ! l5  = _fp_pi<<6	fmuld	%f22,%f22,%f12	set	_fp_pi,%l5	ld	[%l5],%l5	sll	%l5,6,%l5		! l5 = (_fp_pi)<<6    ! if(k<2) then ...	(sin,cos)	cmp	%i4,2	bge	T4	nop	add	%l2,%i4,%l2		! n += k;    !     if ((n&1)==0) then ... (sin)	andcc	%l2,1,%g0	bne	T3_cos	nop	fmuld	%f22,%f12,%f8		! f8 = t = y1*z;	set	S,%l4			! l4 = S	add	%l4,%l5,%l4		! l4 = &S[m]	ldd	[%l4+40],%f4		! f4 = S[m+5]	fmuld	%f12,%f4,%f4		! f4 = z*S[m+5]	ldd	[%l4+32],%f6		! f6 = S[m+4]	faddd	%f6,%f4,%f4		! f4 = S[m+4]+z*S[m+5]	fmuld	%f12,%f4,%f4	ldd	[%l4+24],%f2		! f2 = S[m+3]	faddd	%f2,%f4,%f4	fmuld	%f12,%f4,%f4	ldd	[%l4+16],%f6	faddd	%f6,%f4,%f4	fmuld	%f12,%f4,%f4	ldd	[%l4+8],%f2	faddd	%f2,%f4,%f4	fmuld	%f12,%f4,%f4	ldd	[%l4],%f6	faddd	%f6,%f4,%f4		! f4 = ss = S[m]+ ...	tst	%l1	bne	1f	nop    !	    j==0	fmuld	%f8,%f4,%f4	ba	2f	fsubd	%f22,%f4,%f01:    !	    j!=0	fmuld	%f24,%f12,%f0	ldd	[%l0+half],%f2	fmuld	%f2,%f0,%f0	fsubd	%f24,%f0,%f0	fmuld	%f8,%f4,%f4	fsubd	%f4,%f0,%f0	fsubd	%f22,%f0,%f02:	andcc	%l2,2,%g0	be	Treturn	nop	ba	Treturn	fnegs	%f0,%f0T3_cos:	fmuld	%f12,%f12,%f8		! f8 = z*z	set	C,%l4	add	%l5,%l4,%l4		! l4 = &C[m]	ldd	[%l4+40],%f4		! f4 = C[m+5]	fmuld	%f12,%f4,%f4		! f4 = z*C[m+5]	ldd	[%l4+32],%f6		! f6 = C[m+4]	faddd	%f6,%f4,%f4		! f4 = C[m+4]+z*C[m+5]	fmuld	%f12,%f4,%f4	ldd	[%l4+24],%f2		! f2 = C[m+3]	faddd	%f2,%f4,%f4	fmuld	%f12,%f4,%f4	ldd	[%l4+16],%f6	faddd	%f6,%f4,%f4	fmuld	%f12,%f4,%f4	ldd	[%l4+8],%f2	faddd	%f2,%f4,%f4	fmuld	%f12,%f4,%f4	ldd	[%l4],%f6	faddd	%f6,%f4,%f4		! f4 = C[m] + ...	fmuld	%f8,%f4,%f4		! f4 = cc = (z*z)*(C[m]+...)	ldd	[%l0+half],%f2	fmuld	%f12,%f2,%f2		! f2 = half*z	tst	%l1	be	1f	nop	fmuld	%f22,%f24,%f26	fsubd	%f4,%f26,%f4		! f4 = cc -= y1*y21:	std	%f12,[%fp+z]	ld	[%l0+thresh1],%l3	ld	[%fp+z],%l4    !		if(z>=thresh1) then ...	cmp	%l4,%l3	bl	3f	nop	bg	2f	ld	[%l0+thresh1+4],%l3	ld	[%fp+z+4],%l4	cmp	%l4,%l3	blu	3f	nop2:	ldd	[%l0+c3_8],%f6	fsubd	%f2,%f6,%f6	fsubd	%f6,%f4,%f4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -