# source:rtems/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s@f9b93da

4.104.114.84.95
Last change on this file since f9b93da was f9b93da, checked in by Joel Sherrill <joel.sherrill@…>, on Apr 16, 1997 at 5:33:04 PM

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.

• Property mode set to `100644`
File size: 3.0 KB
Line
1//
2//      scosh.sa 3.1 12/10/90
3//
4//      The entry point sCosh computes the hyperbolic cosine of
5//      an input argument; sCoshd does the same except for denormalized
6//      input.
7//
8//      Input: Double-extended number X in location pointed to
9//              by address register a0.
10//
11//      Output: The value cosh(X) returned in floating-point register Fp0.
12//
13//      Accuracy and Monotonicity: The returned result is within 3 ulps in
14//              64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
15//              result is subsequently rounded to double precision. The
16//              result is provably monotonic in double precision.
17//
18//      Speed: The program sCOSH takes approximately 250 cycles.
19//
20//      Algorithm:
21//
22//      COSH
23//      1. If |X| > 16380 log2, go to 3.
24//
25//      2. (|X| <= 16380 log2) Cosh(X) is obtained by the formulae
26//              y = |X|, z = exp(Y), and
27//              cosh(X) = (1/2)*( z + 1/z ).
28//              Exit.
29//
30//      3. (|X| > 16380 log2). If |X| > 16480 log2, go to 5.
31//
32//      4. (16380 log2 < |X| <= 16480 log2)
33//              cosh(X) = sign(X) * exp(|X|)/2.
34//              However, invoking exp(|X|) may cause premature overflow.
35//              Thus, we calculate sinh(X) as follows:
36//              Y       := |X|
37//              Fact    :=      2**(16380)
38//              Y'      := Y - 16381 log2
39//              cosh(X) := Fact * exp(Y').
40//              Exit.
41//
42//      5. (|X| > 16480 log2) sinh(X) must overflow. Return
43//              Huge*Huge to generate overflow and an infinity with
44//              the appropriate sign. Huge is the largest finite number in
45//              extended format. Exit.
46//
47//
48
49//              Copyright (C) Motorola, Inc. 1990
50//                      All Rights Reserved
51//
52//      THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
53//      The copyright notice above does not evidence any
54//      actual or intended publication of such source code.
55
56//SCOSH idnt    2,1 | Motorola 040 Floating Point Software Package
57
58        |section        8
59
60        |xref   t_ovfl
61        |xref   t_frcinx
62        |xref   setox
63
64T1:     .long 0x40C62D38,0xD3D64634 // ... 16381 LOG2 LEAD
65T2:     .long 0x3D6F90AE,0xB1E75CC7 // ... 16381 LOG2 TRAIL
66
67TWO16380: .long 0x7FFB0000,0x80000000,0x00000000,0x00000000
68
69        .global scoshd
70scoshd:
71//--COSH(X) = 1 FOR DENORMALIZED X
72
73        fmoves          #0x3F800000,%fp0
74
75        fmovel          %d1,%FPCR
76        fadds           #0x00800000,%fp0
77        bra             t_frcinx
78
79        .global scosh
80scosh:
81        fmovex          (%a0),%fp0      // ...LOAD INPUT
82
83        movel           (%a0),%d0
84        movew           4(%a0),%d0
85        andil           #0x7FFFFFFF,%d0
86        cmpil           #0x400CB167,%d0
87        bgts            COSHBIG
88
89//--THIS IS THE USUAL CASE, |X| < 16380 LOG2
90//--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) )
91
92        fabsx           %fp0            // ...|X|
93
94        movel           %d1,-(%sp)
95        clrl            %d1
96        fmovemx %fp0-%fp0,(%a0) //pass parameter to setox
97        bsr             setox           // ...FP0 IS EXP(|X|)
98        fmuls           #0x3F000000,%fp0        // ...(1/2)EXP(|X|)
99        movel           (%sp)+,%d1
100
101        fmoves          #0x3E800000,%fp1        // ...(1/4)
102        fdivx           %fp0,%fp1               // ...1/(2 EXP(|X|))
103
104        fmovel          %d1,%FPCR
105        faddx           %fp1,%fp0
106
107        bra             t_frcinx
108
109COSHBIG:
110        cmpil           #0x400CB2B3,%d0
111        bgts            COSHHUGE
112
113        fabsx           %fp0
114        fsubd           T1(%pc),%fp0            // ...(|X|-16381LOG2_LEAD)
115        fsubd           T2(%pc),%fp0            // ...|X| - 16381 LOG2, ACCURATE
116
117        movel           %d1,-(%sp)
118        clrl            %d1
119        fmovemx %fp0-%fp0,(%a0)
120        bsr             setox
121        fmovel          (%sp)+,%fpcr
122
123        fmulx           TWO16380(%pc),%fp0
124        bra             t_frcinx
125
126COSHHUGE:
127        fmovel          #0,%fpsr                //clr N bit if set by source
128        bclrb           #7,(%a0)                //always return positive value
129        fmovemx (%a0),%fp0-%fp0
130        bra             t_ovfl
131
132        |end
Note: See TracBrowser for help on using the repository browser.