head     56.1;
access   ;
symbols  ;
locks    ; strict;
comment  @# @;


56.1
date     91.11.05.09.33.24;  author jwh;  state Exp;
branches ;
next     55.1;

55.1
date     91.08.25.10.11.42;  author jwh;  state Exp;
branches ;
next     54.2;

54.2
date     91.08.21.14.38.26;  author jwh;  state Exp;
branches ;
next     54.1;

54.1
date     91.03.18.15.18.52;  author jwh;  state Exp;
branches ;
next     53.1;

53.1
date     91.03.11.19.19.40;  author jwh;  state Exp;
branches ;
next     52.1;

52.1
date     91.02.19.09.04.25;  author jwh;  state Exp;
branches ;
next     51.1;

51.1
date     91.01.30.16.03.37;  author jwh;  state Exp;
branches ;
next     1.1;

1.1
date     91.01.17.09.27.44;  author jwh;  state Exp;
branches ;
next     ;


desc
@first version.
@


56.1
log
@Automatic bump of revision number for PWS version 3.25
@
text
@@


55.1
log
@Automatic bump of revision number for PWS version 3.25A
@
text
@@


54.2
log
@
pws2rcs automatic delta on Wed Aug 21 13:42:03 MDT 1991
@
text
@@


54.1
log
@Automatic bump of revision number for PWS version 3.24
@
text
@a0 121
*
*       sacos.sa 3.1 12/10/90
*
*       Description: The entry point sAcos computes the inverse cosine of
*               an input argument; sAcosd does the same except for denormalized
*               input.
*
*       Input: Double-extended number X in location pointed to
*               by address register a0.
*
*       Output: The value arccos(X) returned in floating-point register Fp0.
*
*       Accuracy and Monotonicity: The returned result is within 3 ulps 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 program sCOS takes approximately 310 cycles.
*
*       Algorithm:
*
*       ACOS
*       1. If |X| >= 1, go to 3.
*
*       2. (|X| < 1) Calculate acos(X) by
*               z := (1-X) / (1+X)
*               acos(X) = 2 * atan( sqrt(z) ).
*               Exit.
*
*       3. If |X| > 1, go to 5.
*
*       4. (|X| = 1) If X > 0, return 0. Otherwise, return Pi. Exit.
*
*       5. (|X| > 1) Generate an invalid operation by 0 * infinity.
*               Exit.
*

*               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.

* added to replace single-precision floating point immediates JWH 1/9/91
V3F800000  DC.L  $3F800000
V00000000  DC.L  $00000000
V00800000  DC.L  $00800000

PI      DC.L $40000000,$C90FDAA2,$2168C235,$00000000
PIBY2   DC.L $3FFF0000,$C90FDAA2,$2168C235,$00000000

	refr    t_operr
	refr    t_frcinx
	refr    satan

	def     sacosd
sacosd    equ    *
*--ACOS(X) = PI/2 FOR DENORMALIZED X
	fmove.l         d1,FPCONTROL            ...load user's rounding mode/precision
	FMOVE.X         PIBY2,FP0
	bra             t_frcinx

	def     sacos
sacos    equ    *
	FMOVE.X         (a0),FP0        ...LOAD INPUT

	move.l          (a0),d0         ...pack exponent with upper 16 fraction
	move.w          4(a0),d0
	ANDI.L          #$7FFFFFFF,D0
	CMPI.L          #$3FFF8000,D0
	BGE.B           ACOSBIG

*--THIS IS THE USUAL CASE, |X| < 1
*--ACOS(X) = 2 * ATAN(  SQRT( (1-X)/(1+X) )     )

*       FMOVE.S         #:3F800000,FP1
	FMOVE.S         V3F800000,FP1
	FADD.X          FP0,FP1         ...1+X
	FNEG.X          FP0             ... -X
*       FADD.S          #:3F800000,FP0  ...1-X
	FADD.S          V3F800000,FP0   ...1-X
	FDIV.X          FP1,FP0         ...(1-X)/(1+X)
	FSQRT.X         FP0             ...SQRT((1-X)/(1+X))
	fmovem.x        fp0,(a0)        ...overwrite input
	move.l          d1,-(sp)        ;save original users FPCONTROL
	clr.l           d1
	bsr             satan           ...ATAN(SQRT([1-X]/[1+X]))
	fMOVE.L         (sp)+,FPCONTROL ;restore users exceptions
	FADD.X          FP0,FP0         ...2 * ATAN( STUFF )
	bra             t_frcinx

ACOSBIG    equ    *
	FABS.X          FP0
*       FCMP.S          #:3F800000,FP0
	FCMP.S          V3F800000,FP0
	fbgt            t_operr         ;cause an operr exception

*--|X| = 1, ACOS(X) = 0 OR PI
	move.l          (a0),d0         ...pack exponent with upper 16 fraction
	move.w          4(a0),d0
	CMP.L           #0,D0           ;D0 has original exponent+fraction
	BGT.B           ACOSP1

*--X = -1
*Returns PI and inexact exception
	FMOVE.X         PI,FP0
	FMOVE.L         d1,FPCONTROL
*       FADD.S          #:00800000,FP0  ;cause an inexact exception to be put
	FADD.S          V00800000,FP0   ;cause an inexact exception to be put
*                                       ;into the 040 - will not trap until next
*                                       ;fp inst.
	bra             t_frcinx

ACOSP1    equ    *
	FMOVE.L         d1,FPCONTROL
*       FMOVE.S         #:00000000,FP0
	FMOVE.S         V00000000,FP0
	rts                             ;Facos of +1 is exact

	end
@


53.1
log
@Automatic bump of revision number for PWS version 3.24B
@
text
@@


52.1
log
@Automatic bump of revision number for PWS version 3.24A
@
text
@@


51.1
log
@Automatic bump of revision number for PWS version 3.24d
@
text
@@


1.1
log
@Initial revision
@
text
@@
