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 105