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

4.104.114.84.95
Last change on this file since f9b93da was f9b93da, checked in by Joel Sherrill <joel.sherrill@…>, on 04/16/97 at 17:33:04

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: 2.3 KB
Line 
1//
2//      satanh.sa 3.3 12/19/90
3//
4//      The entry point satanh computes the inverse
5//      hyperbolic tangent of
6//      an input argument; satanhd does the same except for denormalized
7//      input.
8//
9//      Input: Double-extended number X in location pointed to
10//              by address register a0.
11//
12//      Output: The value arctanh(X) returned in floating-point register Fp0.
13//
14//      Accuracy and Monotonicity: The returned result is within 3 ulps in
15//              64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
16//              result is subsequently rounded to double precision. The
17//              result is provably monotonic in double precision.
18//
19//      Speed: The program satanh takes approximately 270 cycles.
20//
21//      Algorithm:
22//
23//      ATANH
24//      1. If |X| >= 1, go to 3.
25//
26//      2. (|X| < 1) Calculate atanh(X) by
27//              sgn := sign(X)
28//              y := |X|
29//              z := 2y/(1-y)
30//              atanh(X) := sgn * (1/2) * logp1(z)
31//              Exit.
32//
33//      3. If |X| > 1, go to 5.
34//
35//      4. (|X| = 1) Generate infinity with an appropriate sign and
36//              divide-by-zero by       
37//              sgn := sign(X)
38//              atan(X) := sgn / (+0).
39//              Exit.
40//
41//      5. (|X| > 1) Generate an invalid operation by 0 * infinity.
42//              Exit.
43//
44
45//              Copyright (C) Motorola, Inc. 1990
46//                      All Rights Reserved
47//
48//      THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
49//      The copyright notice above does not evidence any 
50//      actual or intended publication of such source code.
51
52//satanh        idnt    2,1 | Motorola 040 Floating Point Software Package
53
54        |section        8
55
56        |xref   t_dz
57        |xref   t_operr
58        |xref   t_frcinx
59        |xref   t_extdnrm
60        |xref   slognp1
61
62        .global satanhd
63satanhd:
64//--ATANH(X) = X FOR DENORMALIZED X
65
66        bra             t_extdnrm
67
68        .global satanh
69satanh:
70        movel           (%a0),%d0
71        movew           4(%a0),%d0
72        andil           #0x7FFFFFFF,%d0
73        cmpil           #0x3FFF8000,%d0
74        bges            ATANHBIG
75
76//--THIS IS THE USUAL CASE, |X| < 1
77//--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).
78
79        fabsx           (%a0),%fp0      // ...Y = |X|
80        fmovex          %fp0,%fp1
81        fnegx           %fp1            // ...-Y
82        faddx           %fp0,%fp0               // ...2Y
83        fadds           #0x3F800000,%fp1        // ...1-Y
84        fdivx           %fp1,%fp0               // ...2Y/(1-Y)
85        movel           (%a0),%d0
86        andil           #0x80000000,%d0
87        oril            #0x3F000000,%d0 // ...SIGN(X)*HALF
88        movel           %d0,-(%sp)
89
90        fmovemx %fp0-%fp0,(%a0) // ...overwrite input
91        movel           %d1,-(%sp)
92        clrl            %d1
93        bsr             slognp1         // ...LOG1P(Z)
94        fmovel          (%sp)+,%fpcr
95        fmuls           (%sp)+,%fp0
96        bra             t_frcinx
97
98ATANHBIG:
99        fabsx           (%a0),%fp0      // ...|X|
100        fcmps           #0x3F800000,%fp0
101        fbgt            t_operr
102        bra             t_dz
103
104        |end
Note: See TracBrowser for help on using the repository browser.