162306a36Sopenharmony_ci| 262306a36Sopenharmony_ci| ssinh.sa 3.1 12/10/90 362306a36Sopenharmony_ci| 462306a36Sopenharmony_ci| The entry point sSinh computes the hyperbolic sine of 562306a36Sopenharmony_ci| an input argument; sSinhd does the same except for denormalized 662306a36Sopenharmony_ci| input. 762306a36Sopenharmony_ci| 862306a36Sopenharmony_ci| Input: Double-extended number X in location pointed to 962306a36Sopenharmony_ci| by address register a0. 1062306a36Sopenharmony_ci| 1162306a36Sopenharmony_ci| Output: The value sinh(X) returned in floating-point register Fp0. 1262306a36Sopenharmony_ci| 1362306a36Sopenharmony_ci| Accuracy and Monotonicity: The returned result is within 3 ulps in 1462306a36Sopenharmony_ci| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the 1562306a36Sopenharmony_ci| result is subsequently rounded to double precision. The 1662306a36Sopenharmony_ci| result is provably monotonic in double precision. 1762306a36Sopenharmony_ci| 1862306a36Sopenharmony_ci| Speed: The program sSINH takes approximately 280 cycles. 1962306a36Sopenharmony_ci| 2062306a36Sopenharmony_ci| Algorithm: 2162306a36Sopenharmony_ci| 2262306a36Sopenharmony_ci| SINH 2362306a36Sopenharmony_ci| 1. If |X| > 16380 log2, go to 3. 2462306a36Sopenharmony_ci| 2562306a36Sopenharmony_ci| 2. (|X| <= 16380 log2) Sinh(X) is obtained by the formulae 2662306a36Sopenharmony_ci| y = |X|, sgn = sign(X), and z = expm1(Y), 2762306a36Sopenharmony_ci| sinh(X) = sgn*(1/2)*( z + z/(1+z) ). 2862306a36Sopenharmony_ci| Exit. 2962306a36Sopenharmony_ci| 3062306a36Sopenharmony_ci| 3. If |X| > 16480 log2, go to 5. 3162306a36Sopenharmony_ci| 3262306a36Sopenharmony_ci| 4. (16380 log2 < |X| <= 16480 log2) 3362306a36Sopenharmony_ci| sinh(X) = sign(X) * exp(|X|)/2. 3462306a36Sopenharmony_ci| However, invoking exp(|X|) may cause premature overflow. 3562306a36Sopenharmony_ci| Thus, we calculate sinh(X) as follows: 3662306a36Sopenharmony_ci| Y := |X| 3762306a36Sopenharmony_ci| sgn := sign(X) 3862306a36Sopenharmony_ci| sgnFact := sgn * 2**(16380) 3962306a36Sopenharmony_ci| Y' := Y - 16381 log2 4062306a36Sopenharmony_ci| sinh(X) := sgnFact * exp(Y'). 4162306a36Sopenharmony_ci| Exit. 4262306a36Sopenharmony_ci| 4362306a36Sopenharmony_ci| 5. (|X| > 16480 log2) sinh(X) must overflow. Return 4462306a36Sopenharmony_ci| sign(X)*Huge*Huge to generate overflow and an infinity with 4562306a36Sopenharmony_ci| the appropriate sign. Huge is the largest finite number in 4662306a36Sopenharmony_ci| extended format. Exit. 4762306a36Sopenharmony_ci| 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci| Copyright (C) Motorola, Inc. 1990 5062306a36Sopenharmony_ci| All Rights Reserved 5162306a36Sopenharmony_ci| 5262306a36Sopenharmony_ci| For details on the license for this file, please see the 5362306a36Sopenharmony_ci| file, README, in this same directory. 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci|SSINH idnt 2,1 | Motorola 040 Floating Point Software Package 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci |section 8 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciT1: .long 0x40C62D38,0xD3D64634 | ... 16381 LOG2 LEAD 6062306a36Sopenharmony_ciT2: .long 0x3D6F90AE,0xB1E75CC7 | ... 16381 LOG2 TRAIL 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci |xref t_frcinx 6362306a36Sopenharmony_ci |xref t_ovfl 6462306a36Sopenharmony_ci |xref t_extdnrm 6562306a36Sopenharmony_ci |xref setox 6662306a36Sopenharmony_ci |xref setoxm1 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci .global ssinhd 6962306a36Sopenharmony_cissinhd: 7062306a36Sopenharmony_ci|--SINH(X) = X FOR DENORMALIZED X 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci bra t_extdnrm 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci .global ssinh 7562306a36Sopenharmony_cissinh: 7662306a36Sopenharmony_ci fmovex (%a0),%fp0 | ...LOAD INPUT 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci movel (%a0),%d0 7962306a36Sopenharmony_ci movew 4(%a0),%d0 8062306a36Sopenharmony_ci movel %d0,%a1 | save a copy of original (compacted) operand 8162306a36Sopenharmony_ci andl #0x7FFFFFFF,%d0 8262306a36Sopenharmony_ci cmpl #0x400CB167,%d0 8362306a36Sopenharmony_ci bgts SINHBIG 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci|--THIS IS THE USUAL CASE, |X| < 16380 LOG2 8662306a36Sopenharmony_ci|--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*(1/2)*( Z + Z/(1+Z) ) 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci fabsx %fp0 | ...Y = |X| 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci moveml %a1/%d1,-(%sp) 9162306a36Sopenharmony_ci fmovemx %fp0-%fp0,(%a0) 9262306a36Sopenharmony_ci clrl %d1 9362306a36Sopenharmony_ci bsr setoxm1 | ...FP0 IS Z = EXPM1(Y) 9462306a36Sopenharmony_ci fmovel #0,%fpcr 9562306a36Sopenharmony_ci moveml (%sp)+,%a1/%d1 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci fmovex %fp0,%fp1 9862306a36Sopenharmony_ci fadds #0x3F800000,%fp1 | ...1+Z 9962306a36Sopenharmony_ci fmovex %fp0,-(%sp) 10062306a36Sopenharmony_ci fdivx %fp1,%fp0 | ...Z/(1+Z) 10162306a36Sopenharmony_ci movel %a1,%d0 10262306a36Sopenharmony_ci andl #0x80000000,%d0 10362306a36Sopenharmony_ci orl #0x3F000000,%d0 10462306a36Sopenharmony_ci faddx (%sp)+,%fp0 10562306a36Sopenharmony_ci movel %d0,-(%sp) 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci fmovel %d1,%fpcr 10862306a36Sopenharmony_ci fmuls (%sp)+,%fp0 |last fp inst - possible exceptions set 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci bra t_frcinx 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ciSINHBIG: 11362306a36Sopenharmony_ci cmpl #0x400CB2B3,%d0 11462306a36Sopenharmony_ci bgt t_ovfl 11562306a36Sopenharmony_ci fabsx %fp0 11662306a36Sopenharmony_ci fsubd T1(%pc),%fp0 | ...(|X|-16381LOG2_LEAD) 11762306a36Sopenharmony_ci movel #0,-(%sp) 11862306a36Sopenharmony_ci movel #0x80000000,-(%sp) 11962306a36Sopenharmony_ci movel %a1,%d0 12062306a36Sopenharmony_ci andl #0x80000000,%d0 12162306a36Sopenharmony_ci orl #0x7FFB0000,%d0 12262306a36Sopenharmony_ci movel %d0,-(%sp) | ...EXTENDED FMT 12362306a36Sopenharmony_ci fsubd T2(%pc),%fp0 | ...|X| - 16381 LOG2, ACCURATE 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci movel %d1,-(%sp) 12662306a36Sopenharmony_ci clrl %d1 12762306a36Sopenharmony_ci fmovemx %fp0-%fp0,(%a0) 12862306a36Sopenharmony_ci bsr setox 12962306a36Sopenharmony_ci fmovel (%sp)+,%fpcr 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci fmulx (%sp)+,%fp0 |possible exception 13262306a36Sopenharmony_ci bra t_frcinx 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci |end 135