URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [m68k/] [fpsp040/] [satanh.S] - Rev 1765
Compare with Previous | Blame | View Log
|| satanh.sa 3.3 12/19/90|| The entry point satanh computes the inverse| hyperbolic tangent of| an input argument; satanhd does the same except for denormalized| input.|| Input: Double-extended number X in location pointed to| by address register a0.|| Output: The value arctanh(X) returned in floating-point register Fp0.|| Accuracy and Monotonicity: The returned result is within 3 ulps in| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the| result is subsequently rounded to double precision. The| result is provably monotonic in double precision.|| Speed: The program satanh takes approximately 270 cycles.|| Algorithm:|| ATANH| 1. If |X| >= 1, go to 3.|| 2. (|X| < 1) Calculate atanh(X) by| sgn := sign(X)| y := |X|| z := 2y/(1-y)| atanh(X) := sgn * (1/2) * logp1(z)| Exit.|| 3. If |X| > 1, go to 5.|| 4. (|X| = 1) Generate infinity with an appropriate sign and| divide-by-zero by| sgn := sign(X)| atan(X) := sgn / (+0).| Exit.|| 5. (|X| > 1) Generate an invalid operation by 0 * infinity.| Exit.|| Copyright (C) Motorola, Inc. 1990| All Rights Reserved|| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA| The copyright notice above does not evidence any| actual or intended publication of such source code.|satanh idnt 2,1 | Motorola 040 Floating Point Software Package|section 8|xref t_dz|xref t_operr|xref t_frcinx|xref t_extdnrm|xref slognp1.global satanhdsatanhd:|--ATANH(X) = X FOR DENORMALIZED Xbra t_extdnrm.global satanhsatanh:movel (%a0),%d0movew 4(%a0),%d0andil #0x7FFFFFFF,%d0cmpil #0x3FFF8000,%d0bges ATANHBIG|--THIS IS THE USUAL CASE, |X| < 1|--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).fabsx (%a0),%fp0 | ...Y = |X|fmovex %fp0,%fp1fnegx %fp1 | ...-Yfaddx %fp0,%fp0 | ...2Yfadds #0x3F800000,%fp1 | ...1-Yfdivx %fp1,%fp0 | ...2Y/(1-Y)movel (%a0),%d0andil #0x80000000,%d0oril #0x3F000000,%d0 | ...SIGN(X)*HALFmovel %d0,-(%sp)fmovemx %fp0-%fp0,(%a0) | ...overwrite inputmovel %d1,-(%sp)clrl %d1bsr slognp1 | ...LOG1P(Z)fmovel (%sp)+,%fpcrfmuls (%sp)+,%fp0bra t_frcinxATANHBIG:fabsx (%a0),%fp0 | ...|X|fcmps #0x3F800000,%fp0fbgt t_operrbra t_dz|end
