xref: /openbmc/linux/arch/m68k/fpsp040/sasin.S (revision e00d82d0)
11da177e4SLinus Torvalds|
21da177e4SLinus Torvalds|	sasin.sa 3.3 12/19/90
31da177e4SLinus Torvalds|
41da177e4SLinus Torvalds|	Description: The entry point sAsin computes the inverse sine of
51da177e4SLinus Torvalds|		an input argument; sAsind does the same except for denormalized
61da177e4SLinus Torvalds|		input.
71da177e4SLinus Torvalds|
81da177e4SLinus Torvalds|	Input: Double-extended number X in location pointed to
91da177e4SLinus Torvalds|		by address register a0.
101da177e4SLinus Torvalds|
111da177e4SLinus Torvalds|	Output: The value arcsin(X) returned in floating-point register Fp0.
121da177e4SLinus Torvalds|
131da177e4SLinus Torvalds|	Accuracy and Monotonicity: The returned result is within 3 ulps in
141da177e4SLinus Torvalds|		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
151da177e4SLinus Torvalds|		result is subsequently rounded to double precision. The
161da177e4SLinus Torvalds|		result is provably monotonic in double precision.
171da177e4SLinus Torvalds|
181da177e4SLinus Torvalds|	Speed: The program sASIN takes approximately 310 cycles.
191da177e4SLinus Torvalds|
201da177e4SLinus Torvalds|	Algorithm:
211da177e4SLinus Torvalds|
221da177e4SLinus Torvalds|	ASIN
231da177e4SLinus Torvalds|	1. If |X| >= 1, go to 3.
241da177e4SLinus Torvalds|
251da177e4SLinus Torvalds|	2. (|X| < 1) Calculate asin(X) by
261da177e4SLinus Torvalds|		z := sqrt( [1-X][1+X] )
271da177e4SLinus Torvalds|		asin(X) = atan( x / z ).
281da177e4SLinus Torvalds|		Exit.
291da177e4SLinus Torvalds|
301da177e4SLinus Torvalds|	3. If |X| > 1, go to 5.
311da177e4SLinus Torvalds|
321da177e4SLinus Torvalds|	4. (|X| = 1) sgn := sign(X), return asin(X) := sgn * Pi/2. Exit.
331da177e4SLinus Torvalds|
341da177e4SLinus Torvalds|	5. (|X| > 1) Generate an invalid operation by 0 * infinity.
351da177e4SLinus Torvalds|		Exit.
361da177e4SLinus Torvalds|
371da177e4SLinus Torvalds
381da177e4SLinus Torvalds|		Copyright (C) Motorola, Inc. 1990
391da177e4SLinus Torvalds|			All Rights Reserved
401da177e4SLinus Torvalds|
41e00d82d0SMatt Waddel|       For details on the license for this file, please see the
42e00d82d0SMatt Waddel|       file, README, in this same directory.
431da177e4SLinus Torvalds
441da177e4SLinus Torvalds|SASIN	idnt	2,1 | Motorola 040 Floating Point Software Package
451da177e4SLinus Torvalds
461da177e4SLinus Torvalds	|section	8
471da177e4SLinus Torvalds
481da177e4SLinus TorvaldsPIBY2:	.long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
491da177e4SLinus Torvalds
501da177e4SLinus Torvalds	|xref	t_operr
511da177e4SLinus Torvalds	|xref	t_frcinx
521da177e4SLinus Torvalds	|xref	t_extdnrm
531da177e4SLinus Torvalds	|xref	satan
541da177e4SLinus Torvalds
551da177e4SLinus Torvalds	.global	sasind
561da177e4SLinus Torvaldssasind:
571da177e4SLinus Torvalds|--ASIN(X) = X FOR DENORMALIZED X
581da177e4SLinus Torvalds
591da177e4SLinus Torvalds	bra		t_extdnrm
601da177e4SLinus Torvalds
611da177e4SLinus Torvalds	.global	sasin
621da177e4SLinus Torvaldssasin:
631da177e4SLinus Torvalds	fmovex		(%a0),%fp0	| ...LOAD INPUT
641da177e4SLinus Torvalds
651da177e4SLinus Torvalds	movel		(%a0),%d0
661da177e4SLinus Torvalds	movew		4(%a0),%d0
671da177e4SLinus Torvalds	andil		#0x7FFFFFFF,%d0
681da177e4SLinus Torvalds	cmpil		#0x3FFF8000,%d0
691da177e4SLinus Torvalds	bges		asinbig
701da177e4SLinus Torvalds
711da177e4SLinus Torvalds|--THIS IS THE USUAL CASE, |X| < 1
721da177e4SLinus Torvalds|--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) )
731da177e4SLinus Torvalds
741da177e4SLinus Torvalds	fmoves		#0x3F800000,%fp1
751da177e4SLinus Torvalds	fsubx		%fp0,%fp1		| ...1-X
761da177e4SLinus Torvalds	fmovemx	%fp2-%fp2,-(%a7)
771da177e4SLinus Torvalds	fmoves		#0x3F800000,%fp2
781da177e4SLinus Torvalds	faddx		%fp0,%fp2		| ...1+X
791da177e4SLinus Torvalds	fmulx		%fp2,%fp1		| ...(1+X)(1-X)
801da177e4SLinus Torvalds	fmovemx	(%a7)+,%fp2-%fp2
811da177e4SLinus Torvalds	fsqrtx		%fp1		| ...SQRT([1-X][1+X])
821da177e4SLinus Torvalds	fdivx		%fp1,%fp0		| ...X/SQRT([1-X][1+X])
831da177e4SLinus Torvalds	fmovemx	%fp0-%fp0,(%a0)
841da177e4SLinus Torvalds	bsr		satan
851da177e4SLinus Torvalds	bra		t_frcinx
861da177e4SLinus Torvalds
871da177e4SLinus Torvaldsasinbig:
881da177e4SLinus Torvalds	fabsx		%fp0	 | ...|X|
891da177e4SLinus Torvalds	fcmps		#0x3F800000,%fp0
901da177e4SLinus Torvalds	fbgt		t_operr		|cause an operr exception
911da177e4SLinus Torvalds
921da177e4SLinus Torvalds|--|X| = 1, ASIN(X) = +- PI/2.
931da177e4SLinus Torvalds
941da177e4SLinus Torvalds	fmovex		PIBY2,%fp0
951da177e4SLinus Torvalds	movel		(%a0),%d0
961da177e4SLinus Torvalds	andil		#0x80000000,%d0	| ...SIGN BIT OF X
971da177e4SLinus Torvalds	oril		#0x3F800000,%d0	| ...+-1 IN SGL FORMAT
981da177e4SLinus Torvalds	movel		%d0,-(%sp)	| ...push SIGN(X) IN SGL-FMT
991da177e4SLinus Torvalds	fmovel		%d1,%FPCR
1001da177e4SLinus Torvalds	fmuls		(%sp)+,%fp0
1011da177e4SLinus Torvalds	bra		t_frcinx
1021da177e4SLinus Torvalds
1031da177e4SLinus Torvalds	|end
104