^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) | ssinh.sa 3.1 12/10/90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) | The entry point sSinh computes the hyperbolic sine of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) | an input argument; sSinhd does the same except for denormalized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) | input.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) | Input: Double-extended number X in location pointed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) | by address register a0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) | Output: The value sinh(X) returned in floating-point register Fp0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) | Accuracy and Monotonicity: The returned result is within 3 ulps in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) | 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) | result is subsequently rounded to double precision. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) | result is provably monotonic in double precision.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) | Speed: The program sSINH takes approximately 280 cycles.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) | Algorithm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) | SINH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) | 1. If |X| > 16380 log2, go to 3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) | 2. (|X| <= 16380 log2) Sinh(X) is obtained by the formulae
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) | y = |X|, sgn = sign(X), and z = expm1(Y),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) | sinh(X) = sgn*(1/2)*( z + z/(1+z) ).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) | Exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) | 3. If |X| > 16480 log2, go to 5.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) | 4. (16380 log2 < |X| <= 16480 log2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) | sinh(X) = sign(X) * exp(|X|)/2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) | However, invoking exp(|X|) may cause premature overflow.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) | Thus, we calculate sinh(X) as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) | Y := |X|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) | sgn := sign(X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) | sgnFact := sgn * 2**(16380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) | Y' := Y - 16381 log2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) | sinh(X) := sgnFact * exp(Y').
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) | Exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) | 5. (|X| > 16480 log2) sinh(X) must overflow. Return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) | sign(X)*Huge*Huge to generate overflow and an infinity with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) | the appropriate sign. Huge is the largest finite number in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) | extended format. Exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) | Copyright (C) Motorola, Inc. 1990
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) | All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) | For details on the license for this file, please see the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) | file, README, in this same directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) |SSINH idnt 2,1 | Motorola 040 Floating Point Software Package
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) |section 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) T1: .long 0x40C62D38,0xD3D64634 | ... 16381 LOG2 LEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) T2: .long 0x3D6F90AE,0xB1E75CC7 | ... 16381 LOG2 TRAIL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) |xref t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) |xref t_ovfl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) |xref t_extdnrm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) |xref setox
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) |xref setoxm1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .global ssinhd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) ssinhd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) |--SINH(X) = X FOR DENORMALIZED X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) bra t_extdnrm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .global ssinh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ssinh:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) fmovex (%a0),%fp0 | ...LOAD INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) movel (%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) movew 4(%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) movel %d0,%a1 | save a copy of original (compacted) operand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) andl #0x7FFFFFFF,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) cmpl #0x400CB167,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) bgts SINHBIG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) |--THIS IS THE USUAL CASE, |X| < 16380 LOG2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) |--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*(1/2)*( Z + Z/(1+Z) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) fabsx %fp0 | ...Y = |X|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) moveml %a1/%d1,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) fmovemx %fp0-%fp0,(%a0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) clrl %d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) bsr setoxm1 | ...FP0 IS Z = EXPM1(Y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) fmovel #0,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) moveml (%sp)+,%a1/%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) fmovex %fp0,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) fadds #0x3F800000,%fp1 | ...1+Z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) fmovex %fp0,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) fdivx %fp1,%fp0 | ...Z/(1+Z)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) movel %a1,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) andl #0x80000000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) orl #0x3F000000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) faddx (%sp)+,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) movel %d0,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) fmovel %d1,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) fmuls (%sp)+,%fp0 |last fp inst - possible exceptions set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) bra t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) SINHBIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) cmpl #0x400CB2B3,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) bgt t_ovfl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) fabsx %fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) fsubd T1(%pc),%fp0 | ...(|X|-16381LOG2_LEAD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) movel #0,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) movel #0x80000000,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) movel %a1,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) andl #0x80000000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) orl #0x7FFB0000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) movel %d0,-(%sp) | ...EXTENDED FMT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) fsubd T2(%pc),%fp0 | ...|X| - 16381 LOG2, ACCURATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) movel %d1,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) clrl %d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) fmovemx %fp0-%fp0,(%a0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) bsr setox
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) fmovel (%sp)+,%fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) fmulx (%sp)+,%fp0 |possible exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) bra t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) |end