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 62 satanhd: 63 |--ATANH(X) = X FOR DENORMALIZED X 64 65 bra t_extdnrm 66 67 .global satanh 68 satanh: 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 97 ATANHBIG: 98 fabsx (%a0),%fp0 | ...|X| 99 fcmps #0x3F800000,%fp0 100 fbgt t_operr 101 bra t_dz 102 103 |end
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.