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