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 63 satanhd: 64 |--ATANH(X) = X FOR DENORMALIZED X 65 66 bra t_extdnrm 67 68 .global satanh 69 satanh: 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 98 ATANHBIG: 99 fabsx (%a0),%fp0 | ...|X| 100 fcmps #0x3F800000,%fp0 101 fbgt t_operr 102 bra t_dz 103 104 |end