summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1997-04-16 17:33:04 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1997-04-16 17:33:04 +0000
commitf9b93da8b47ff7ea4d6573b75b6077f6efb8dbc6 (patch)
tree46e2747b2b8f04d36d530daad59481f4f79e3c00 /c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s
parentAdded --disable-tcpip option. (diff)
downloadrtems-f9b93da8b47ff7ea4d6573b75b6077f6efb8dbc6.tar.bz2
Added the MC68040 Floating Point Support Package. This was ported
to RTEMS by Eric Norum. It is freely distributable and was acquired from the Motorola WWW site. More info is in the FPSP README.
Diffstat (limited to 'c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s')
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s132
1 files changed, 132 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s b/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s
new file mode 100644
index 0000000000..cf603883be
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s
@@ -0,0 +1,132 @@
+//
+// scosh.sa 3.1 12/10/90
+//
+// The entry point sCosh computes the hyperbolic cosine of
+// an input argument; sCoshd does the same except for denormalized
+// input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value cosh(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 sCOSH takes approximately 250 cycles.
+//
+// Algorithm:
+//
+// COSH
+// 1. If |X| > 16380 log2, go to 3.
+//
+// 2. (|X| <= 16380 log2) Cosh(X) is obtained by the formulae
+// y = |X|, z = exp(Y), and
+// cosh(X) = (1/2)*( z + 1/z ).
+// Exit.
+//
+// 3. (|X| > 16380 log2). If |X| > 16480 log2, go to 5.
+//
+// 4. (16380 log2 < |X| <= 16480 log2)
+// cosh(X) = sign(X) * exp(|X|)/2.
+// However, invoking exp(|X|) may cause premature overflow.
+// Thus, we calculate sinh(X) as follows:
+// Y := |X|
+// Fact := 2**(16380)
+// Y' := Y - 16381 log2
+// cosh(X) := Fact * exp(Y').
+// Exit.
+//
+// 5. (|X| > 16480 log2) sinh(X) must overflow. Return
+// Huge*Huge to generate overflow and an infinity with
+// the appropriate sign. Huge is the largest finite number in
+// extended format. 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.
+
+//SCOSH idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ |xref t_ovfl
+ |xref t_frcinx
+ |xref setox
+
+T1: .long 0x40C62D38,0xD3D64634 // ... 16381 LOG2 LEAD
+T2: .long 0x3D6F90AE,0xB1E75CC7 // ... 16381 LOG2 TRAIL
+
+TWO16380: .long 0x7FFB0000,0x80000000,0x00000000,0x00000000
+
+ .global scoshd
+scoshd:
+//--COSH(X) = 1 FOR DENORMALIZED X
+
+ fmoves #0x3F800000,%fp0
+
+ fmovel %d1,%FPCR
+ fadds #0x00800000,%fp0
+ bra t_frcinx
+
+ .global scosh
+scosh:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ andil #0x7FFFFFFF,%d0
+ cmpil #0x400CB167,%d0
+ bgts COSHBIG
+
+//--THIS IS THE USUAL CASE, |X| < 16380 LOG2
+//--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) )
+
+ fabsx %fp0 // ...|X|
+
+ movel %d1,-(%sp)
+ clrl %d1
+ fmovemx %fp0-%fp0,(%a0) //pass parameter to setox
+ bsr setox // ...FP0 IS EXP(|X|)
+ fmuls #0x3F000000,%fp0 // ...(1/2)EXP(|X|)
+ movel (%sp)+,%d1
+
+ fmoves #0x3E800000,%fp1 // ...(1/4)
+ fdivx %fp0,%fp1 // ...1/(2 EXP(|X|))
+
+ fmovel %d1,%FPCR
+ faddx %fp1,%fp0
+
+ bra t_frcinx
+
+COSHBIG:
+ cmpil #0x400CB2B3,%d0
+ bgts COSHHUGE
+
+ fabsx %fp0
+ fsubd T1(%pc),%fp0 // ...(|X|-16381LOG2_LEAD)
+ fsubd T2(%pc),%fp0 // ...|X| - 16381 LOG2, ACCURATE
+
+ movel %d1,-(%sp)
+ clrl %d1
+ fmovemx %fp0-%fp0,(%a0)
+ bsr setox
+ fmovel (%sp)+,%fpcr
+
+ fmulx TWO16380(%pc),%fp0
+ bra t_frcinx
+
+COSHHUGE:
+ fmovel #0,%fpsr //clr N bit if set by source
+ bclrb #7,(%a0) //always return positive value
+ fmovemx (%a0),%fp0-%fp0
+ bra t_ovfl
+
+ |end