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

📄 ssin.s

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 S
📖 第 1 页 / 共 2 页
字号:
||	ssin.sa 3.3 7/29/91||	The entry point sSIN computes the sine of an input argument|	sCOS computes the cosine, and sSINCOS computes both. The|	corresponding entry points with a "d" computes the same|	corresponding function values for denormalized inputs.||	Input: Double-extended number X in location pointed to|		by address register a0.||	Output: The function value sin(X) or cos(X) returned in Fp0 if SIN or|		COS is requested. Otherwise, for SINCOS, sin(X) is returned|		in Fp0, and cos(X) is returned in Fp1.||	Modifies: Fp0 for SIN or COS; both Fp0 and Fp1 for SINCOS.||	Accuracy and Monotonicity: The returned result is within 1 ulp in|		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the|		result is subsequently rounded to double precision. The|		result is provably monotonic in double precision.||	Speed: The programs sSIN and sCOS take approximately 150 cycles for|		input argument X such that |X| < 15Pi, which is the usual|		situation. The speed for sSINCOS is approximately 190 cycles.||	Algorithm:||	SIN and COS:|	1. If SIN is invoked, set AdjN := 0; otherwise, set AdjN := 1.||	2. If |X| >= 15Pi or |X| < 2**(-40), go to 7.||	3. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let|		k = N mod 4, so in particular, k = 0,1,2,or 3. Overwrite|		k by k := k + AdjN.||	4. If k is even, go to 6.||	5. (k is odd) Set j := (k-1)/2, sgn := (-1)**j. Return sgn*cos(r)|		where cos(r) is approximated by an even polynomial in r,|		1 + r*r*(B1+s*(B2+ ... + s*B8)),	s = r*r.|		Exit.||	6. (k is even) Set j := k/2, sgn := (-1)**j. Return sgn*sin(r)|		where sin(r) is approximated by an odd polynomial in r|		r + r*s*(A1+s*(A2+ ... + s*A7)),	s = r*r.|		Exit.||	7. If |X| > 1, go to 9.||	8. (|X|<2**(-40)) If SIN is invoked, return X; otherwise return 1.||	9. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 3.||	SINCOS:|	1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.||	2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let|		k = N mod 4, so in particular, k = 0,1,2,or 3.||	3. If k is even, go to 5.||	4. (k is odd) Set j1 := (k-1)/2, j2 := j1 (EOR) (k mod 2), i.e.|		j1 exclusive or with the l.s.b. of k.|		sgn1 := (-1)**j1, sgn2 := (-1)**j2.|		SIN(X) = sgn1 * cos(r) and COS(X) = sgn2*sin(r) where|		sin(r) and cos(r) are computed as odd and even polynomials|		in r, respectively. Exit||	5. (k is even) Set j1 := k/2, sgn1 := (-1)**j1.|		SIN(X) = sgn1 * sin(r) and COS(X) = sgn1*cos(r) where|		sin(r) and cos(r) are computed as odd and even polynomials|		in r, respectively. Exit||	6. If |X| > 1, go to 8.||	7. (|X|<2**(-40)) SIN(X) = X and COS(X) = 1. Exit.||	8. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 2.||		Copyright (C) Motorola, Inc. 1990|			All Rights Reserved||	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA |	The copyright notice above does not evidence any  |	actual or intended publication of such source code.|SSIN	idnt	2,1 | Motorola 040 Floating Point Software Package	|section	8	.include "fpsp.h"BOUNDS1:	.long 0x3FD78000,0x4004BC7ETWOBYPI:	.long 0x3FE45F30,0x6DC9C883SINA7:	.long 0xBD6AAA77,0xCCC994F5SINA6:	.long 0x3DE61209,0x7AAE8DA1SINA5:	.long 0xBE5AE645,0x2A118AE4SINA4:	.long 0x3EC71DE3,0xA5341531SINA3:	.long 0xBF2A01A0,0x1A018B59,0x00000000,0x00000000SINA2:	.long 0x3FF80000,0x88888888,0x888859AF,0x00000000SINA1:	.long 0xBFFC0000,0xAAAAAAAA,0xAAAAAA99,0x00000000COSB8:	.long 0x3D2AC4D0,0xD6011EE3COSB7:	.long 0xBDA9396F,0x9F45AC19COSB6:	.long 0x3E21EED9,0x0612C972COSB5:	.long 0xBE927E4F,0xB79D9FCFCOSB4:	.long 0x3EFA01A0,0x1A01D423,0x00000000,0x00000000COSB3:	.long 0xBFF50000,0xB60B60B6,0x0B61D438,0x00000000COSB2:	.long 0x3FFA0000,0xAAAAAAAA,0xAAAAAB5ECOSB1:	.long 0xBF000000INVTWOPI: .long 0x3FFC0000,0xA2F9836E,0x4E44152ATWOPI1:	.long 0x40010000,0xC90FDAA2,0x00000000,0x00000000TWOPI2:	.long 0x3FDF0000,0x85A308D4,0x00000000,0x00000000	|xref	PITBL	.set	INARG,FP_SCR4	.set	X,FP_SCR5	.set	XDCARE,X+2	.set	XFRAC,X+4	.set	RPRIME,FP_SCR1	.set	SPRIME,FP_SCR2	.set	POSNEG1,L_SCR1	.set	TWOTO63,L_SCR1	.set	ENDFLAG,L_SCR2	.set	N,L_SCR2	.set	ADJN,L_SCR3	| xref	t_frcinx	|xref	t_extdnrm	|xref	sto_cos	.global	ssindssind:|--SIN(X) = X FOR DENORMALIZED X	bra		t_extdnrm	.global	scosdscosd:|--COS(X) = 1 FOR DENORMALIZED X	fmoves		#0x3F800000,%fp0||	9D25B Fix: Sometimes the previous fmove.s sets fpsr bits|	fmovel		#0,%fpsr|	bra		t_frcinx	.global	ssinssin:|--SET ADJN TO 0	movel		#0,ADJN(%a6)	bras		SINBGN	.global	scosscos:|--SET ADJN TO 1	movel		#1,ADJN(%a6)SINBGN:|--SAVE FPCR, FP1. CHECK IF |X| IS TOO SMALL OR LARGE	fmovex		(%a0),%fp0	| ...LOAD INPUT	movel		(%a0),%d0	movew		4(%a0),%d0	fmovex		%fp0,X(%a6)	andil		#0x7FFFFFFF,%d0		| ...COMPACTIFY X	cmpil		#0x3FD78000,%d0		| ...|X| >= 2**(-40)?	bges		SOK1	bra		SINSMSOK1:	cmpil		#0x4004BC7E,%d0		| ...|X| < 15 PI?	blts		SINMAIN	bra		REDUCEXSINMAIN:|--THIS IS THE USUAL CASE, |X| <= 15 PI.|--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.	fmovex		%fp0,%fp1	fmuld		TWOBYPI,%fp1	| ...X*2/PI|--HIDE THE NEXT THREE INSTRUCTIONS	lea		PITBL+0x200,%a1 | ...TABLE OF N*PI/2, N = -32,...,32	|--FP1 IS NOW READY	fmovel		%fp1,N(%a6)		| ...CONVERT TO INTEGER	movel		N(%a6),%d0	asll		#4,%d0	addal		%d0,%a1	| ...A1 IS THE ADDRESS OF N*PIBY2|				...WHICH IS IN TWO PIECES Y1 & Y2	fsubx		(%a1)+,%fp0	| ...X-Y1|--HIDE THE NEXT ONE	fsubs		(%a1),%fp0	| ...FP0 IS R = (X-Y1)-Y2SINCONT:|--continuation from REDUCEX|--GET N+ADJN AND SEE IF SIN(R) OR COS(R) IS NEEDED	movel		N(%a6),%d0	addl		ADJN(%a6),%d0	| ...SEE IF D0 IS ODD OR EVEN	rorl		#1,%d0	| ...D0 WAS ODD IFF D0 IS NEGATIVE	cmpil		#0,%d0	blt		COSPOLYSINPOLY:|--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.|--THEN WE RETURN	SGN*SIN(R). SGN*SIN(R) IS COMPUTED BY|--R' + R'*S*(A1 + S(A2 + S(A3 + S(A4 + ... + SA7)))), WHERE|--R' = SGN*R, S=R*R. THIS CAN BE REWRITTEN AS|--R' + R'*S*( [A1+T(A3+T(A5+TA7))] + [S(A2+T(A4+TA6))])|--WHERE T=S*S.|--NOTE THAT A3 THROUGH A7 ARE STORED IN DOUBLE PRECISION|--WHILE A1 AND A2 ARE IN DOUBLE-EXTENDED FORMAT.	fmovex		%fp0,X(%a6)	| ...X IS R	fmulx		%fp0,%fp0	| ...FP0 IS S|---HIDE THE NEXT TWO WHILE WAITING FOR FP0	fmoved		SINA7,%fp3	fmoved		SINA6,%fp2|--FP0 IS NOW READY	fmovex		%fp0,%fp1	fmulx		%fp1,%fp1	| ...FP1 IS T|--HIDE THE NEXT TWO WHILE WAITING FOR FP1	rorl		#1,%d0	andil		#0x80000000,%d0|				...LEAST SIG. BIT OF D0 IN SIGN POSITION	eorl		%d0,X(%a6)	| ...X IS NOW R'= SGN*R	fmulx		%fp1,%fp3	| ...TA7	fmulx		%fp1,%fp2	| ...TA6	faddd		SINA5,%fp3 | ...A5+TA7	faddd		SINA4,%fp2 | ...A4+TA6	fmulx		%fp1,%fp3	| ...T(A5+TA7)	fmulx		%fp1,%fp2	| ...T(A4+TA6)	faddd		SINA3,%fp3 | ...A3+T(A5+TA7)	faddx		SINA2,%fp2 | ...A2+T(A4+TA6)	fmulx		%fp3,%fp1	| ...T(A3+T(A5+TA7))	fmulx		%fp0,%fp2	| ...S(A2+T(A4+TA6))	faddx		SINA1,%fp1 | ...A1+T(A3+T(A5+TA7))	fmulx		X(%a6),%fp0	| ...R'*S	faddx		%fp2,%fp1	| ...[A1+T(A3+T(A5+TA7))]+[S(A2+T(A4+TA6))]|--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING|--FP2 RELEASED, RESTORE NOW AND TAKE FULL ADVANTAGE OF HIDING		fmulx		%fp1,%fp0		| ...SIN(R')-R'|--FP1 RELEASED.	fmovel		%d1,%FPCR		|restore users exceptions	faddx		X(%a6),%fp0		|last inst - possible exception set	bra		t_frcinxCOSPOLY:|--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.|--THEN WE RETURN	SGN*COS(R). SGN*COS(R) IS COMPUTED BY|--SGN + S'*(B1 + S(B2 + S(B3 + S(B4 + ... + SB8)))), WHERE|--S=R*R AND S'=SGN*S. THIS CAN BE REWRITTEN AS|--SGN + S'*([B1+T(B3+T(B5+TB7))] + [S(B2+T(B4+T(B6+TB8)))])|--WHERE T=S*S.|--NOTE THAT B4 THROUGH B8 ARE STORED IN DOUBLE PRECISION|--WHILE B2 AND B3 ARE IN DOUBLE-EXTENDED FORMAT, B1 IS -1/2|--AND IS THEREFORE STORED AS SINGLE PRECISION.	fmulx		%fp0,%fp0	| ...FP0 IS S|---HIDE THE NEXT TWO WHILE WAITING FOR FP0	fmoved		COSB8,%fp2	fmoved		COSB7,%fp3|--FP0 IS NOW READY	fmovex		%fp0,%fp1	fmulx		%fp1,%fp1	| ...FP1 IS T|--HIDE THE NEXT TWO WHILE WAITING FOR FP1	fmovex		%fp0,X(%a6)	| ...X IS S	rorl		#1,%d0	andil		#0x80000000,%d0|			...LEAST SIG. BIT OF D0 IN SIGN POSITION	fmulx		%fp1,%fp2	| ...TB8|--HIDE THE NEXT TWO WHILE WAITING FOR THE XU	eorl		%d0,X(%a6)	| ...X IS NOW S'= SGN*S	andil		#0x80000000,%d0	fmulx		%fp1,%fp3	| ...TB7|--HIDE THE NEXT TWO WHILE WAITING FOR THE XU	oril		#0x3F800000,%d0	| ...D0 IS SGN IN SINGLE	movel		%d0,POSNEG1(%a6)	faddd		COSB6,%fp2 | ...B6+TB8	faddd		COSB5,%fp3 | ...B5+TB7	fmulx		%fp1,%fp2	| ...T(B6+TB8)	fmulx		%fp1,%fp3	| ...T(B5+TB7)	faddd		COSB4,%fp2 | ...B4+T(B6+TB8)	faddx		COSB3,%fp3 | ...B3+T(B5+TB7)	fmulx		%fp1,%fp2	| ...T(B4+T(B6+TB8))	fmulx		%fp3,%fp1	| ...T(B3+T(B5+TB7))	faddx		COSB2,%fp2 | ...B2+T(B4+T(B6+TB8))	fadds		COSB1,%fp1 | ...B1+T(B3+T(B5+TB7))	fmulx		%fp2,%fp0	| ...S(B2+T(B4+T(B6+TB8)))|--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING|--FP2 RELEASED.		faddx		%fp1,%fp0|--FP1 RELEASED	fmulx		X(%a6),%fp0	fmovel		%d1,%FPCR		|restore users exceptions	fadds		POSNEG1(%a6),%fp0	|last inst - possible exception set	bra		t_frcinxSINBORS:|--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.|--IF |X| < 2**(-40), RETURN X OR 1.	cmpil		#0x3FFF8000,%d0	bgts		REDUCEX        SINSM:	movel		ADJN(%a6),%d0	cmpil		#0,%d0	bgts		COSTINYSINTINY:	movew		#0x0000,XDCARE(%a6)	| ...JUST IN CASE	fmovel		%d1,%FPCR		|restore users exceptions	fmovex		X(%a6),%fp0		|last inst - possible exception set	bra		t_frcinxCOSTINY:	fmoves		#0x3F800000,%fp0	fmovel		%d1,%FPCR		|restore users exceptions	fsubs		#0x00800000,%fp0	|last inst - possible exception set	bra		t_frcinx

⌨️ 快捷键说明

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