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| For details on the license for this file, please see the 49| file, README, in this same directory. 50 51|satanh idnt 2,1 | Motorola 040 Floating Point Software Package 52 53 |section 8 54 55 |xref t_dz 56 |xref t_operr 57 |xref t_frcinx 58 |xref t_extdnrm 59 |xref slognp1 60 61 .global satanhd 62satanhd: 63|--ATANH(X) = X FOR DENORMALIZED X 64 65 bra t_extdnrm 66 67 .global satanh 68satanh: 69 movel (%a0),%d0 70 movew 4(%a0),%d0 71 andil #0x7FFFFFFF,%d0 72 cmpil #0x3FFF8000,%d0 73 bges ATANHBIG 74 75|--THIS IS THE USUAL CASE, |X| < 1 76|--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z). 77 78 fabsx (%a0),%fp0 | ...Y = |X| 79 fmovex %fp0,%fp1 80 fnegx %fp1 | ...-Y 81 faddx %fp0,%fp0 | ...2Y 82 fadds #0x3F800000,%fp1 | ...1-Y 83 fdivx %fp1,%fp0 | ...2Y/(1-Y) 84 movel (%a0),%d0 85 andil #0x80000000,%d0 86 oril #0x3F000000,%d0 | ...SIGN(X)*HALF 87 movel %d0,-(%sp) 88 89 fmovemx %fp0-%fp0,(%a0) | ...overwrite input 90 movel %d1,-(%sp) 91 clrl %d1 92 bsr slognp1 | ...LOG1P(Z) 93 fmovel (%sp)+,%fpcr 94 fmuls (%sp)+,%fp0 95 bra t_frcinx 96 97ATANHBIG: 98 fabsx (%a0),%fp0 | ...|X| 99 fcmps #0x3F800000,%fp0 100 fbgt t_operr 101 bra t_dz 102 103 |end 104