about summary refs log tree commit diff
path: root/sysdeps/ia64/fpu/s_tanl.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/ia64/fpu/s_tanl.S')
-rw-r--r--sysdeps/ia64/fpu/s_tanl.S3248
1 files changed, 0 insertions, 3248 deletions
diff --git a/sysdeps/ia64/fpu/s_tanl.S b/sysdeps/ia64/fpu/s_tanl.S
deleted file mode 100644
index 607a271545..0000000000
--- a/sysdeps/ia64/fpu/s_tanl.S
+++ /dev/null
@@ -1,3248 +0,0 @@
-.file "tancotl.s"
-
-
-// Copyright (c) 2000 - 2004, Intel Corporation
-// All rights reserved.
-//
-// Contributed 2000 by the Intel Numerics Group, Intel Corporation
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-//
-// * The name of Intel Corporation may not be used to endorse or promote
-// products derived from this software without specific prior written
-// permission.
-
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS 
-// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
-// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
-// 
-// Intel Corporation is the author of this code, and requests that all
-// problem reports or change requests be submitted to it directly at 
-// http://www.intel.com/software/products/opensource/libraries/num.htm.
-//
-//*********************************************************************
-//
-// History: 
-//
-// 02/02/00 (hand-optimized)
-// 04/04/00 Unwind support added
-// 12/28/00 Fixed false invalid flags
-// 02/06/02 Improved speed
-// 05/07/02 Changed interface to __libm_pi_by_2_reduce
-// 05/30/02 Added cotl
-// 02/10/03 Reordered header: .section, .global, .proc, .align;
-//          used data8 for long double table values
-// 05/15/03 Reformatted data tables
-// 10/26/04 Avoided using r14-31 as scratch so not clobbered by dynamic loader
-//
-//*********************************************************************
-//
-// Functions:   tanl(x) = tangent(x), for double-extended precision x values
-//              cotl(x) = cotangent(x), for double-extended precision x values
-//
-//*********************************************************************
-//
-// Resources Used:
-//
-//    Floating-Point Registers: f8 (Input and Return Value)
-//                              f9-f15
-//                              f32-f121
-//
-//    General Purpose Registers:
-//      r32-r70
-//
-//    Predicate Registers:      p6-p15
-//
-//*********************************************************************
-//
-// IEEE Special Conditions for tanl:
-//
-//    Denormal  fault raised on denormal inputs
-//    Overflow exceptions do not occur
-//    Underflow exceptions raised when appropriate for tan
-//    (No specialized error handling for this routine)
-//    Inexact raised when appropriate by algorithm
-//
-//    tanl(SNaN) = QNaN
-//    tanl(QNaN) = QNaN
-//    tanl(inf) = QNaN
-//    tanl(+/-0) = +/-0
-//
-//*********************************************************************
-//
-// IEEE Special Conditions for cotl:
-//
-//    Denormal  fault raised on denormal inputs
-//    Overflow exceptions occur at zero and near zero
-//    Underflow exceptions do not occur
-//    Inexact raised when appropriate by algorithm
-//
-//    cotl(SNaN) = QNaN
-//    cotl(QNaN) = QNaN
-//    cotl(inf) = QNaN
-//    cotl(+/-0) = +/-Inf and error handling is called
-//
-//*********************************************************************
-//
-//    Below are mathematical and algorithmic descriptions for tanl.
-//    For cotl we use next identity cot(x) = -tan(x + Pi/2).
-//    So, to compute cot(x) we just need to increment N (N = N + 1)
-//    and invert sign of the computed result.
-//
-//*********************************************************************
-//
-// Mathematical Description
-//
-// We consider the computation of FPTANL of Arg. Now, given
-//
-//      Arg = N pi/2  + alpha,          |alpha| <= pi/4,
-//
-// basic mathematical relationship shows that
-//
-//      tan( Arg ) =  tan( alpha )     if N is even;
-//                 = -cot( alpha )      otherwise.
-//
-// The value of alpha is obtained by argument reduction and
-// represented by two working precision numbers r and c where
-//
-//      alpha =  r  +  c     accurately.
-//
-// The reduction method is described in a previous write up.
-// The argument reduction scheme identifies 4 cases. For Cases 2
-// and 4, because |alpha| is small, tan(r+c) and -cot(r+c) can be
-// computed very easily by 2 or 3 terms of the Taylor series
-// expansion as follows:
-//
-// Case 2:
-// -------
-//
-//      tan(r + c) = r + c + r^3/3          ...accurately
-//     -cot(r + c) = -1/(r+c) + r/3          ...accurately
-//
-// Case 4:
-// -------
-//
-//      tan(r + c) = r + c + r^3/3 + 2r^5/15     ...accurately
-//     -cot(r + c) = -1/(r+c) + r/3 + r^3/45     ...accurately
-//
-//
-// The only cases left are Cases 1 and 3 of the argument reduction
-// procedure. These two cases will be merged since after the
-// argument is reduced in either cases, we have the reduced argument
-// represented as r + c and that the magnitude |r + c| is not small
-// enough to allow the usage of a very short approximation.
-//
-// The greatest challenge of this task is that the second terms of
-// the Taylor series for tan(r) and -cot(r)
-//
-//      r + r^3/3 + 2 r^5/15 + ...
-//
-// and
-//
-//      -1/r + r/3 + r^3/45 + ...
-//
-// are not very small when |r| is close to pi/4 and the rounding
-// errors will be a concern if simple polynomial accumulation is
-// used. When |r| < 2^(-2), however, the second terms will be small
-// enough (5 bits or so of right shift) that a normal Horner
-// recurrence suffices. Hence there are two cases that we consider
-// in the accurate computation of tan(r) and cot(r), |r| <= pi/4.
-//
-// Case small_r: |r| < 2^(-2)
-// --------------------------
-//
-// Since Arg = N pi/4 + r + c accurately, we have
-//
-//      tan(Arg) =  tan(r+c)            for N even,
-//               = -cot(r+c)            otherwise.
-//
-// Here for this case, both tan(r) and -cot(r) can be approximated
-// by simple polynomials:
-//
-//      tan(r) =    r + P1_1 r^3 + P1_2 r^5 + ... + P1_9 r^19
-//     -cot(r) = -1/r + Q1_1 r   + Q1_2 r^3 + ... + Q1_7 r^13
-//
-// accurately. Since |r| is relatively small, tan(r+c) and
-// -cot(r+c) can be accurately approximated by replacing r with
-// r+c only in the first two terms of the corresponding polynomials.
-//
-// Note that P1_1 (and Q1_1 for that matter) approximates 1/3 to
-// almost 64 sig. bits, thus
-//
-//      P1_1 (r+c)^3 =  P1_1 r^3 + c * r^2     accurately.
-//
-// Hence,
-//
-//      tan(r+c) =    r + P1_1 r^3 + P1_2 r^5 + ... + P1_9 r^19
-//                     + c*(1 + r^2)
-//
-//        -cot(r+c) = -1/(r+c) + Q1_1 r   + Q1_2 r^3 + ... + Q1_7 r^13
-//               + Q1_1*c
-//
-//
-// Case normal_r: 2^(-2) <= |r| <= pi/4
-// ------------------------------------
-//
-// This case is more likely than the previous one if one considers
-// r to be uniformly distributed in [-pi/4 pi/4].
-//
-// The required calculation is either
-//
-//      tan(r + c)  =  tan(r)  +  correction,  or
-//     -cot(r + c)  = -cot(r)  +  correction.
-//
-// Specifically,
-//
-//      tan(r + c) =  tan(r) + c tan'(r)  + O(c^2)
-//                 =  tan(r) + c sec^2(r) + O(c^2)
-//                 =  tan(r) + c SEC_sq     ...accurately
-//                as long as SEC_sq approximates sec^2(r)
-//                to, say, 5 bits or so.
-//
-// Similarly,
-//
-//     -cot(r + c) = -cot(r) - c cot'(r)  + O(c^2)
-//                 = -cot(r) + c csc^2(r) + O(c^2)
-//                 = -cot(r) + c CSC_sq     ...accurately
-//                as long as CSC_sq approximates csc^2(r)
-//                to, say, 5 bits or so.
-//
-// We therefore concentrate on accurately calculating tan(r) and
-// cot(r) for a working-precision number r, |r| <= pi/4 to within
-// 0.1% or so.
-//
-// We will employ a table-driven approach. Let
-//
-//      r = sgn_r * 2^k * 1.b_1 b_2 ... b_5 ... b_63
-//        = sgn_r * ( B + x )
-//
-// where
-//
-//      B = 2^k * 1.b_1 b_2 ... b_5 1
-//      x = |r| - B
-//
-// Now,
-//                   tan(B)  +   tan(x)
-//      tan( B + x ) =  ------------------------
-//                   1 -  tan(B)*tan(x)
-//
-//               /                         \
-//               |   tan(B)  +   tan(x)          |
-
-//      = tan(B) +  | ------------------------ - tan(B) |
-//               |     1 -  tan(B)*tan(x)          |
-//               \                         /
-//
-//                 sec^2(B) * tan(x)
-//      = tan(B) + ------------------------
-//                 1 -  tan(B)*tan(x)
-//
-//                (1/[sin(B)*cos(B)]) * tan(x)
-//      = tan(B) + --------------------------------
-//                      cot(B)  -  tan(x)
-//
-//
-// Clearly, the values of tan(B), cot(B) and 1/(sin(B)*cos(B)) are
-// calculated beforehand and stored in a table. Since
-//
-//      |x| <= 2^k * 2^(-6)  <= 2^(-7)  (because k = -1, -2)
-//
-// a very short polynomial will be sufficient to approximate tan(x)
-// accurately. The details involved in computing the last expression
-// will be given in the next section on algorithm description.
-//
-//
-// Now, we turn to the case where cot( B + x ) is needed.
-//
-//
-//                   1 - tan(B)*tan(x)
-//      cot( B + x ) =  ------------------------
-//                   tan(B)  +  tan(x)
-//
-//               /                           \
-//               |   1 - tan(B)*tan(x)              |
-
-//      = cot(B) +  | ----------------------- - cot(B) |
-//               |     tan(B)  +  tan(x)            |
-//               \                           /
-//
-//               [tan(B) + cot(B)] * tan(x)
-//      = cot(B) - ----------------------------
-//                   tan(B)  +  tan(x)
-//
-//                (1/[sin(B)*cos(B)]) * tan(x)
-//      = cot(B) - --------------------------------
-//                      tan(B)  +  tan(x)
-//
-//
-// Note that the values of tan(B), cot(B) and 1/(sin(B)*cos(B)) that
-// are needed are the same set of values needed in the previous
-// case.
-//
-// Finally, we can put all the ingredients together as follows:
-//
-//      Arg = N * pi/2 +  r + c          ...accurately
-//
-//      tan(Arg) =  tan(r) + correction    if N is even;
-//               = -cot(r) + correction    otherwise.
-//
-// For Cases 2 and 4,
-//
-//     Case 2:
-//     tan(Arg) =  tan(r + c) = r + c + r^3/3           N even
-//              = -cot(r + c) = -1/(r+c) + r/3           N odd
-//     Case 4:
-//     tan(Arg) =  tan(r + c) = r + c + r^3/3 + 2r^5/15  N even
-//              = -cot(r + c) = -1/(r+c) + r/3 + r^3/45  N odd
-//
-//
-// For Cases 1 and 3,
-//
-//     Case small_r: |r| < 2^(-2)
-//
-//      tan(Arg) =  r + P1_1 r^3 + P1_2 r^5 + ... + P1_9 r^19
-//                     + c*(1 + r^2)               N even
-//
-//               = -1/(r+c) + Q1_1 r   + Q1_2 r^3 + ... + Q1_7 r^13
-//                     + Q1_1*c                    N odd
-//
-//     Case normal_r: 2^(-2) <= |r| <= pi/4
-//
-//      tan(Arg) =  tan(r) + c * sec^2(r)     N even
-//               = -cot(r) + c * csc^2(r)     otherwise
-//
-//     For N even,
-//
-//      tan(Arg) = tan(r) + c*sec^2(r)
-//               = tan( sgn_r * (B+x) ) + c * sec^2(|r|)
-//               = sgn_r * ( tan(B+x)  + sgn_r*c*sec^2(|r|) )
-//               = sgn_r * ( tan(B+x)  + sgn_r*c*sec^2(B) )
-//
-// since B approximates |r| to 2^(-6) in relative accuracy.
-//
-//                 /            (1/[sin(B)*cos(B)]) * tan(x)
-//    tan(Arg) = sgn_r * | tan(B) + --------------------------------
-//                 \                     cot(B)  -  tan(x)
-//                                        \
-//                       + CORR  |
-
-//                                     /
-// where
-//
-//    CORR = sgn_r*c*tan(B)*SC_inv(B);  SC_inv(B) = 1/(sin(B)*cos(B)).
-//
-// For N odd,
-//
-//      tan(Arg) = -cot(r) + c*csc^2(r)
-//               = -cot( sgn_r * (B+x) ) + c * csc^2(|r|)
-//               = sgn_r * ( -cot(B+x)  + sgn_r*c*csc^2(|r|) )
-//               = sgn_r * ( -cot(B+x)  + sgn_r*c*csc^2(B) )
-//
-// since B approximates |r| to 2^(-6) in relative accuracy.
-//
-//                 /            (1/[sin(B)*cos(B)]) * tan(x)
-//    tan(Arg) = sgn_r * | -cot(B) + --------------------------------
-//                 \                     tan(B)  +  tan(x)
-//                                        \
-//                       + CORR  |
-
-//                                     /
-// where
-//
-//    CORR = sgn_r*c*cot(B)*SC_inv(B);  SC_inv(B) = 1/(sin(B)*cos(B)).
-//
-//
-// The actual algorithm prescribes how all the mathematical formulas
-// are calculated.
-//
-//
-// 2. Algorithmic Description
-// ==========================
-//
-// 2.1 Computation for Cases 2 and 4.
-// ----------------------------------
-//
-// For Case 2, we use two-term polynomials.
-//
-//    For N even,
-//
-//    rsq := r * r
-//    Poly := c + r * rsq * P1_1
-//    Result := r + Poly          ...in user-defined rounding
-//
-//    For N odd,
-//    S_hi  := -frcpa(r)               ...8 bits
-//    S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...16 bits
-//    S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...32 bits
-//    S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...64 bits
-//    S_lo  := S_hi*( (1 + S_hi*r) + S_hi*c )
-//    ...S_hi + S_lo is -1/(r+c) to extra precision
-//    S_lo  := S_lo + Q1_1*r
-//
-//    Result := S_hi + S_lo     ...in user-defined rounding
-//
-// For Case 4, we use three-term polynomials
-//
-//    For N even,
-//
-//    rsq := r * r
-//    Poly := c + r * rsq * (P1_1 + rsq * P1_2)
-//    Result := r + Poly          ...in user-defined rounding
-//
-//    For N odd,
-//    S_hi  := -frcpa(r)               ...8 bits
-//    S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...16 bits
-//    S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...32 bits
-//    S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...64 bits
-//    S_lo  := S_hi*( (1 + S_hi*r) + S_hi*c )
-//    ...S_hi + S_lo is -1/(r+c) to extra precision
-//    rsq   := r * r
-//    P      := Q1_1 + rsq*Q1_2
-//    S_lo  := S_lo + r*P
-//
-//    Result := S_hi + S_lo     ...in user-defined rounding
-//
-//
-// Note that the coefficients P1_1, P1_2, Q1_1, and Q1_2 are
-// the same as those used in the small_r case of Cases 1 and 3
-// below.
-//
-//
-// 2.2 Computation for Cases 1 and 3.
-// ----------------------------------
-// This is further divided into the case of small_r,
-// where |r| < 2^(-2), and the case of normal_r, where |r| lies between
-// 2^(-2) and pi/4.
-//
-// Algorithm for the case of small_r
-// ---------------------------------
-//
-// For N even,
-//      rsq   := r * r
-//      Poly1 := rsq*(P1_1 + rsq*(P1_2 + rsq*P1_3))
-//      r_to_the_8    := rsq * rsq
-//      r_to_the_8    := r_to_the_8 * r_to_the_8
-//      Poly2 := P1_4 + rsq*(P1_5 + rsq*(P1_6 + ... rsq*P1_9))
-//      CORR  := c * ( 1 + rsq )
-//      Poly  := Poly1 + r_to_the_8*Poly2
-//      Poly := r*Poly + CORR
-//      Result := r + Poly     ...in user-defined rounding
-//      ...note that Poly1 and r_to_the_8 can be computed in parallel
-//      ...with Poly2 (Poly1 is intentionally set to be much
-//      ...shorter than Poly2 so that r_to_the_8 and CORR can be hidden)
-//
-// For N odd,
-//      S_hi  := -frcpa(r)               ...8 bits
-//      S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...16 bits
-//      S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...32 bits
-//      S_hi  := S_hi + S_hi*(1 + S_hi*r)     ...64 bits
-//      S_lo  := S_hi*( (1 + S_hi*r) + S_hi*c )
-//      ...S_hi + S_lo is -1/(r+c) to extra precision
-//      S_lo  := S_lo + Q1_1*c
-//
-//      ...S_hi and S_lo are computed in parallel with
-//      ...the following
-//      rsq := r*r
-//      P   := Q1_1 + rsq*(Q1_2 + rsq*(Q1_3 + ... + rsq*Q1_7))
-//
-//      Poly :=  r*P + S_lo
-//      Result :=  S_hi  +  Poly      ...in user-defined rounding
-//
-//
-// Algorithm for the case of normal_r
-// ----------------------------------
-//
-// Here, we first consider the computation of tan( r + c ). As
-// presented in the previous section,
-//
-//      tan( r + c )  =  tan(r) + c * sec^2(r)
-//                 =  sgn_r * [ tan(B+x) + CORR ]
-//      CORR = sgn_r * c * tan(B) * 1/[sin(B)*cos(B)]
-//
-// because sec^2(r) = sec^(|r|), and B approximate |r| to 6.5 bits.
-//
-//      tan( r + c ) =
-//           /           (1/[sin(B)*cos(B)]) * tan(x)
-//      sgn_r * | tan(B) + --------------------------------  +
-//           \                     cot(B)  -  tan(x)
-//                                \
-//                          CORR  |
-
-//                                /
-//
-// The values of tan(B), cot(B) and 1/(sin(B)*cos(B)) are
-// calculated beforehand and stored in a table. Specifically,
-// the table values are
-//
-//      tan(B)             as  T_hi  +  T_lo;
-//      cot(B)             as  C_hi  +  C_lo;
-//      1/[sin(B)*cos(B)]  as  SC_inv
-//
-// T_hi, C_hi are in  double-precision  memory format;
-// T_lo, C_lo are in  single-precision  memory format;
-// SC_inv     is  in extended-precision memory format.
-//
-// The value of tan(x) will be approximated by a short polynomial of
-// the form
-//
-//      tan(x)  as  x  +  x * P, where
-//           P  =   x^2 * (P2_1 + x^2 * (P2_2 + x^2 * P2_3))
-//
-// Because |x| <= 2^(-7), cot(B) - x approximates cot(B) - tan(x)
-// to a relative accuracy better than 2^(-20). Thus, a good
-// initial guess of 1/( cot(B) - tan(x) ) to initiate the iterative
-// division is:
-//
-//      1/(cot(B) - tan(x))      is approximately
-//      1/(cot(B) -   x)         is
-//      tan(B)/(1 - x*tan(B))    is approximately
-//      T_hi / ( 1 - T_hi * x )  is approximately
-//
-//      T_hi * [ 1 + (Thi * x) + (T_hi * x)^2 ]
-//
-// The calculation of tan(r+c) therefore proceed as follows:
-//
-//      Tx     := T_hi * x
-//      xsq     := x * x
-//
-//      V_hi     := T_hi*(1 + Tx*(1 + Tx))
-//      P     := xsq * (P1_1 + xsq*(P1_2 + xsq*P1_3))
-//      ...V_hi serves as an initial guess of 1/(cot(B) - tan(x))
-//         ...good to about 20 bits of accuracy
-//
-//      tanx     := x + x*P
-//      D     := C_hi - tanx
-//      ...D is a double precision denominator: cot(B) - tan(x)
-//
-//      V_hi     := V_hi + V_hi*(1 - V_hi*D)
-//      ....V_hi approximates 1/(cot(B)-tan(x)) to 40 bits
-//
-//      V_lo     := V_hi * ( [ (1 - V_hi*C_hi) + V_hi*tanx ]
-//                           - V_hi*C_lo )   ...observe all order
-//         ...V_hi + V_lo approximates 1/(cot(B) - tan(x))
-//      ...to extra accuracy
-//
-//      ...               SC_inv(B) * (x + x*P)
-//      ...   tan(B) +      ------------------------- + CORR
-//         ...                cot(B) - (x + x*P)
-//      ...
-//      ... = tan(B) + SC_inv(B)*(x + x*P)*(V_hi + V_lo) + CORR
-//      ...
-//
-//      Sx     := SC_inv * x
-//      CORR     := sgn_r * c * SC_inv * T_hi
-//
-//      ...put the ingredients together to compute
-//      ...               SC_inv(B) * (x + x*P)
-//      ...   tan(B) +      ------------------------- + CORR
-//         ...                cot(B) - (x + x*P)
-//      ...
-//      ... = tan(B) + SC_inv(B)*(x + x*P)*(V_hi + V_lo) + CORR
-//      ...
-//      ... = T_hi + T_lo + CORR +
-//      ...    Sx * V_hi + Sx * V_lo + Sx * P *(V_hi + V_lo)
-//
-//      CORR := CORR + T_lo
-//      tail := V_lo + P*(V_hi + V_lo)
-//         tail := Sx * tail  +  CORR
-//      tail := Sx * V_hi  +  tail
-//         T_hi := sgn_r * T_hi
-//
-//         ...T_hi + sgn_r*tail  now approximate
-//      ...sgn_r*(tan(B+x) + CORR) accurately
-//
-//      Result :=  T_hi + sgn_r*tail  ...in user-defined
-//                           ...rounding control
-//      ...It is crucial that independent paths be fully
-//      ...exploited for performance's sake.
-//
-//
-// Next, we consider the computation of -cot( r + c ). As
-// presented in the previous section,
-//
-//        -cot( r + c )  =  -cot(r) + c * csc^2(r)
-//                 =  sgn_r * [ -cot(B+x) + CORR ]
-//      CORR = sgn_r * c * cot(B) * 1/[sin(B)*cos(B)]
-//
-// because csc^2(r) = csc^(|r|), and B approximate |r| to 6.5 bits.
-//
-//        -cot( r + c ) =
-//           /             (1/[sin(B)*cos(B)]) * tan(x)
-//      sgn_r * | -cot(B) + --------------------------------  +
-//           \                     tan(B)  +  tan(x)
-//                                \
-//                          CORR  |
-
-//                                /
-//
-// The values of tan(B), cot(B) and 1/(sin(B)*cos(B)) are
-// calculated beforehand and stored in a table. Specifically,
-// the table values are
-//
-//      tan(B)             as  T_hi  +  T_lo;
-//      cot(B)             as  C_hi  +  C_lo;
-//      1/[sin(B)*cos(B)]  as  SC_inv
-//
-// T_hi, C_hi are in  double-precision  memory format;
-// T_lo, C_lo are in  single-precision  memory format;
-// SC_inv     is  in extended-precision memory format.
-//
-// The value of tan(x) will be approximated by a short polynomial of
-// the form
-//
-//      tan(x)  as  x  +  x * P, where
-//           P  =   x^2 * (P2_1 + x^2 * (P2_2 + x^2 * P2_3))
-//
-// Because |x| <= 2^(-7), tan(B) + x approximates tan(B) + tan(x)
-// to a relative accuracy better than 2^(-18). Thus, a good
-// initial guess of 1/( tan(B) + tan(x) ) to initiate the iterative
-// division is:
-//
-//      1/(tan(B) + tan(x))      is approximately
-//      1/(tan(B) +   x)         is
-//      cot(B)/(1 + x*cot(B))    is approximately
-//      C_hi / ( 1 + C_hi * x )  is approximately
-//
-//      C_hi * [ 1 - (C_hi * x) + (C_hi * x)^2 ]
-//
-// The calculation of -cot(r+c) therefore proceed as follows:
-//
-//      Cx     := C_hi * x
-//      xsq     := x * x
-//
-//      V_hi     := C_hi*(1 - Cx*(1 - Cx))
-//      P     := xsq * (P1_1 + xsq*(P1_2 + xsq*P1_3))
-//      ...V_hi serves as an initial guess of 1/(tan(B) + tan(x))
-//         ...good to about 18 bits of accuracy
-//
-//      tanx     := x + x*P
-//      D     := T_hi + tanx
-//      ...D is a double precision denominator: tan(B) + tan(x)
-//
-//      V_hi     := V_hi + V_hi*(1 - V_hi*D)
-//      ....V_hi approximates 1/(tan(B)+tan(x)) to 40 bits
-//
-//      V_lo     := V_hi * ( [ (1 - V_hi*T_hi) - V_hi*tanx ]
-//                           - V_hi*T_lo )   ...observe all order
-//         ...V_hi + V_lo approximates 1/(tan(B) + tan(x))
-//      ...to extra accuracy
-//
-//      ...               SC_inv(B) * (x + x*P)
-//      ...  -cot(B) +      ------------------------- + CORR
-//         ...                tan(B) + (x + x*P)
-//      ...
-//      ... =-cot(B) + SC_inv(B)*(x + x*P)*(V_hi + V_lo) + CORR
-//      ...
-//
-//      Sx     := SC_inv * x
-//      CORR     := sgn_r * c * SC_inv * C_hi
-//
-//      ...put the ingredients together to compute
-//      ...               SC_inv(B) * (x + x*P)
-//      ...  -cot(B) +      ------------------------- + CORR
-//         ...                tan(B) + (x + x*P)
-//      ...
-//      ... =-cot(B) + SC_inv(B)*(x + x*P)*(V_hi + V_lo) + CORR
-//      ...
-//      ... =-C_hi - C_lo + CORR +
-//      ...    Sx * V_hi + Sx * V_lo + Sx * P *(V_hi + V_lo)
-//
-//      CORR := CORR - C_lo
-//      tail := V_lo + P*(V_hi + V_lo)
-//         tail := Sx * tail  +  CORR
-//      tail := Sx * V_hi  +  tail
-//         C_hi := -sgn_r * C_hi
-//
-//         ...C_hi + sgn_r*tail now approximates
-//      ...sgn_r*(-cot(B+x) + CORR) accurately
-//
-//      Result :=  C_hi + sgn_r*tail   in user-defined rounding control
-//      ...It is crucial that independent paths be fully
-//      ...exploited for performance's sake.
-//
-// 3. Implementation Notes
-// =======================
-//
-//   Table entries T_hi, T_lo; C_hi, C_lo; SC_inv
-//
-//   Recall that 2^(-2) <= |r| <= pi/4;
-//
-//      r = sgn_r * 2^k * 1.b_1 b_2 ... b_63
-//
-//   and
-//
-//        B = 2^k * 1.b_1 b_2 b_3 b_4 b_5 1
-//
-//   Thus, for k = -2, possible values of B are
-//
-//          B = 2^(-2) * ( 1 + index/32  +  1/64 ),
-//      index ranges from 0 to 31
-//
-//   For k = -1, however, since |r| <= pi/4 = 0.78...
-//   possible values of B are
-//
-//        B = 2^(-1) * ( 1 + index/32  +  1/64 )
-//      index ranges from 0 to 19.
-//
-//
-
-RODATA
-.align 16
-
-LOCAL_OBJECT_START(TANL_BASE_CONSTANTS)
-
-tanl_table_1:
-data8    0xA2F9836E4E44152A, 0x00003FFE // two_by_pi
-data8    0xC84D32B0CE81B9F1, 0x00004016 // P_0
-data8    0xC90FDAA22168C235, 0x00003FFF // P_1
-data8    0xECE675D1FC8F8CBB, 0x0000BFBD // P_2
-data8    0xB7ED8FBBACC19C60, 0x0000BF7C // P_3
-LOCAL_OBJECT_END(TANL_BASE_CONSTANTS)
-
-LOCAL_OBJECT_START(tanl_table_2)
-data8    0xC90FDAA22168C234, 0x00003FFE // PI_BY_4
-data8    0xA397E5046EC6B45A, 0x00003FE7 // Inv_P_0
-data8    0x8D848E89DBD171A1, 0x0000BFBF // d_1
-data8    0xD5394C3618A66F8E, 0x0000BF7C // d_2
-data4    0x3E800000 // two**-2
-data4    0xBE800000 // -two**-2
-data4    0x00000000 // pad
-data4    0x00000000 // pad
-LOCAL_OBJECT_END(tanl_table_2)
-
-LOCAL_OBJECT_START(tanl_table_p1)
-data8    0xAAAAAAAAAAAAAABD, 0x00003FFD // P1_1
-data8    0x8888888888882E6A, 0x00003FFC // P1_2
-data8    0xDD0DD0DD0F0177B6, 0x00003FFA // P1_3
-data8    0xB327A440646B8C6D, 0x00003FF9 // P1_4
-data8    0x91371B251D5F7D20, 0x00003FF8 // P1_5
-data8    0xEB69A5F161C67914, 0x00003FF6 // P1_6
-data8    0xBEDD37BE019318D2, 0x00003FF5 // P1_7
-data8    0x9979B1463C794015, 0x00003FF4 // P1_8
-data8    0x8EBD21A38C6EB58A, 0x00003FF3 // P1_9
-LOCAL_OBJECT_END(tanl_table_p1)
-
-LOCAL_OBJECT_START(tanl_table_q1)
-data8    0xAAAAAAAAAAAAAAB4, 0x00003FFD // Q1_1
-data8    0xB60B60B60B5FC93E, 0x00003FF9 // Q1_2
-data8    0x8AB355E00C9BBFBF, 0x00003FF6 // Q1_3
-data8    0xDDEBBC89CBEE3D4C, 0x00003FF2 // Q1_4
-data8    0xB3548A685F80BBB6, 0x00003FEF // Q1_5
-data8    0x913625604CED5BF1, 0x00003FEC // Q1_6
-data8    0xF189D95A8EE92A83, 0x00003FE8 // Q1_7
-LOCAL_OBJECT_END(tanl_table_q1)
-
-LOCAL_OBJECT_START(tanl_table_p2)
-data8    0xAAAAAAAAAAAB362F, 0x00003FFD // P2_1
-data8    0x88888886E97A6097, 0x00003FFC // P2_2
-data8    0xDD108EE025E716A1, 0x00003FFA // P2_3
-LOCAL_OBJECT_END(tanl_table_p2)
-
-LOCAL_OBJECT_START(tanl_table_tm2)
-//
-//  Entries T_hi   double-precision memory format
-//  Index = 0,1,...,31  B = 2^(-2)*(1+Index/32+1/64)
-//  Entries T_lo  single-precision memory format
-//  Index = 0,1,...,31  B = 2^(-2)*(1+Index/32+1/64)
-//
-data8 0x3FD09BC362400794
-data4 0x23A05C32, 0x00000000
-data8 0x3FD124A9DFFBC074
-data4 0x240078B2, 0x00000000
-data8 0x3FD1AE235BD4920F
-data4 0x23826B8E, 0x00000000
-data8 0x3FD2383515E2701D
-data4 0x22D31154, 0x00000000
-data8 0x3FD2C2E463739C2D
-data4 0x2265C9E2, 0x00000000
-data8 0x3FD34E36AFEEA48B
-data4 0x245C05EB, 0x00000000
-data8 0x3FD3DA317DBB35D1
-data4 0x24749F2D, 0x00000000
-data8 0x3FD466DA67321619
-data4 0x2462CECE, 0x00000000
-data8 0x3FD4F4371F94A4D5
-data4 0x246D0DF1, 0x00000000
-data8 0x3FD5824D740C3E6D
-data4 0x240A85B5, 0x00000000
-data8 0x3FD611234CB1E73D
-data4 0x23F96E33, 0x00000000
-data8 0x3FD6A0BEAD9EA64B
-data4 0x247C5393, 0x00000000
-data8 0x3FD73125B804FD01
-data4 0x241F3B29, 0x00000000
-data8 0x3FD7C25EAB53EE83
-data4 0x2479989B, 0x00000000
-data8 0x3FD8546FE6640EED
-data4 0x23B343BC, 0x00000000
-data8 0x3FD8E75FE8AF1892
-data4 0x241454D1, 0x00000000
-data8 0x3FD97B3553928BDA
-data4 0x238613D9, 0x00000000
-data8 0x3FDA0FF6EB9DE4DE
-data4 0x22859FA7, 0x00000000
-data8 0x3FDAA5AB99ECF92D
-data4 0x237A6D06, 0x00000000
-data8 0x3FDB3C5A6D8F1796
-data4 0x23952F6C, 0x00000000
-data8 0x3FDBD40A9CFB8BE4
-data4 0x2280FC95, 0x00000000
-data8 0x3FDC6CC387943100
-data4 0x245D2EC0, 0x00000000
-data8 0x3FDD068CB736C500
-data4 0x23C4AD7D, 0x00000000
-data8 0x3FDDA16DE1DDBC31
-data4 0x23D076E6, 0x00000000
-data8 0x3FDE3D6EEB515A93
-data4 0x244809A6, 0x00000000
-data8 0x3FDEDA97E6E9E5F1
-data4 0x220856C8, 0x00000000
-data8 0x3FDF78F11963CE69
-data4 0x244BE993, 0x00000000
-data8 0x3FE00C417D635BCE
-data4 0x23D21799, 0x00000000
-data8 0x3FE05CAB1C302CD3
-data4 0x248A1B1D, 0x00000000
-data8 0x3FE0ADB9DB6A1FA0
-data4 0x23D53E33, 0x00000000
-data8 0x3FE0FF724A20BA81
-data4 0x24DB9ED5, 0x00000000
-data8 0x3FE151D9153FA6F5
-data4 0x24E9E451, 0x00000000
-LOCAL_OBJECT_END(tanl_table_tm2)
-
-LOCAL_OBJECT_START(tanl_table_tm1)
-//
-//  Entries T_hi   double-precision memory format
-//  Index = 0,1,...,19  B = 2^(-1)*(1+Index/32+1/64)
-//  Entries T_lo  single-precision memory format
-//  Index = 0,1,...,19  B = 2^(-1)*(1+Index/32+1/64)
-//
-data8 0x3FE1CEC4BA1BE39E
-data4 0x24B60F9E, 0x00000000
-data8 0x3FE277E45ABD9B2D
-data4 0x248C2474, 0x00000000
-data8 0x3FE324180272B110
-data4 0x247B8311, 0x00000000
-data8 0x3FE3D38B890E2DF0
-data4 0x24C55751, 0x00000000
-data8 0x3FE4866D46236871
-data4 0x24E5BC34, 0x00000000
-data8 0x3FE53CEE45E044B0
-data4 0x24001BA4, 0x00000000
-data8 0x3FE5F74282EC06E4
-data4 0x24B973DC, 0x00000000
-data8 0x3FE6B5A125DF43F9
-data4 0x24895440, 0x00000000
-data8 0x3FE77844CAFD348C
-data4 0x240021CA, 0x00000000
-data8 0x3FE83F6BCEED6B92
-data4 0x24C45372, 0x00000000
-data8 0x3FE90B58A34F3665
-data4 0x240DAD33, 0x00000000
-data8 0x3FE9DC522C1E56B4
-data4 0x24F846CE, 0x00000000
-data8 0x3FEAB2A427041578
-data4 0x2323FB6E, 0x00000000
-data8 0x3FEB8E9F9DD8C373
-data4 0x24B3090B, 0x00000000
-data8 0x3FEC709B65C9AA7B
-data4 0x2449F611, 0x00000000
-data8 0x3FED58F4ACCF8435
-data4 0x23616A7E, 0x00000000
-data8 0x3FEE480F97635082
-data4 0x24C2FEAE, 0x00000000
-data8 0x3FEF3E57F0ACC544
-data4 0x242CE964, 0x00000000
-data8 0x3FF01E20F7E06E4B
-data4 0x2480D3EE, 0x00000000
-data8 0x3FF0A1258A798A69
-data4 0x24DB8967, 0x00000000
-LOCAL_OBJECT_END(tanl_table_tm1)
-
-LOCAL_OBJECT_START(tanl_table_cm2)
-//
-//  Entries C_hi   double-precision memory format
-//  Index = 0,1,...,31  B = 2^(-2)*(1+Index/32+1/64)
-//  Entries C_lo  single-precision memory format
-//  Index = 0,1,...,31  B = 2^(-2)*(1+Index/32+1/64)
-//
-data8 0x400ED3E2E63EFBD0
-data4 0x259D94D4, 0x00000000
-data8 0x400DDDB4C515DAB5
-data4 0x245F0537, 0x00000000
-data8 0x400CF57ABE19A79F
-data4 0x25D4EA9F, 0x00000000
-data8 0x400C1A06D15298ED
-data4 0x24AE40A0, 0x00000000
-data8 0x400B4A4C164B2708
-data4 0x25A5AAB6, 0x00000000
-data8 0x400A855A5285B068
-data4 0x25524F18, 0x00000000
-data8 0x4009CA5A3FFA549F
-data4 0x24C999C0, 0x00000000
-data8 0x4009188A646AF623
-data4 0x254FD801, 0x00000000
-data8 0x40086F3C6084D0E7
-data4 0x2560F5FD, 0x00000000
-data8 0x4007CDD2A29A76EE
-data4 0x255B9D19, 0x00000000
-data8 0x400733BE6C8ECA95
-data4 0x25CB021B, 0x00000000
-data8 0x4006A07E1F8DDC52
-data4 0x24AB4722, 0x00000000
-data8 0x4006139BC298AD58
-data4 0x252764E2, 0x00000000
-data8 0x40058CABBAD7164B
-data4 0x24DAF5DB, 0x00000000
-data8 0x40050B4BAE31A5D3
-data4 0x25EA20F4, 0x00000000
-data8 0x40048F2189F85A8A
-data4 0x2583A3E8, 0x00000000
-data8 0x400417DAA862380D
-data4 0x25DCC4CC, 0x00000000
-data8 0x4003A52B1088FCFE
-data4 0x2430A492, 0x00000000
-data8 0x400336CCCD3527D5
-data4 0x255F77CF, 0x00000000
-data8 0x4002CC7F5760766D
-data4 0x25DA0BDA, 0x00000000
-data8 0x4002660711CE02E3
-data4 0x256FF4A2, 0x00000000
-data8 0x4002032CD37BBE04
-data4 0x25208AED, 0x00000000
-data8 0x4001A3BD7F050775
-data4 0x24B72DD6, 0x00000000
-data8 0x40014789A554848A
-data4 0x24AB4DAA, 0x00000000
-data8 0x4000EE65323E81B7
-data4 0x2584C440, 0x00000000
-data8 0x4000982721CF1293
-data4 0x25C9428D, 0x00000000
-data8 0x400044A93D415EEB
-data4 0x25DC8482, 0x00000000
-data8 0x3FFFE78FBD72C577
-data4 0x257F5070, 0x00000000
-data8 0x3FFF4AC375EFD28E
-data4 0x23EBBF7A, 0x00000000
-data8 0x3FFEB2AF60B52DDE
-data4 0x22EECA07, 0x00000000
-data8 0x3FFE1F1935204180
-data4 0x24191079, 0x00000000
-data8 0x3FFD8FCA54F7E60A
-data4 0x248D3058, 0x00000000
-LOCAL_OBJECT_END(tanl_table_cm2)
-
-LOCAL_OBJECT_START(tanl_table_cm1)
-//
-//  Entries C_hi   double-precision memory format
-//  Index = 0,1,...,19  B = 2^(-1)*(1+Index/32+1/64)
-//  Entries C_lo  single-precision memory format
-//  Index = 0,1,...,19  B = 2^(-1)*(1+Index/32+1/64)
-//
-data8 0x3FFCC06A79F6FADE
-data4 0x239C7886, 0x00000000
-data8 0x3FFBB91F891662A6
-data4 0x250BD191, 0x00000000
-data8 0x3FFABFB6529F155D
-data4 0x256CC3E6, 0x00000000
-data8 0x3FF9D3002E964AE9
-data4 0x250843E3, 0x00000000
-data8 0x3FF8F1EF89DCB383
-data4 0x2277C87E, 0x00000000
-data8 0x3FF81B937C87DBD6
-data4 0x256DA6CF, 0x00000000
-data8 0x3FF74F141042EDE4
-data4 0x2573D28A, 0x00000000
-data8 0x3FF68BAF1784B360
-data4 0x242E489A, 0x00000000
-data8 0x3FF5D0B57C923C4C
-data4 0x2532D940, 0x00000000
-data8 0x3FF51D88F418EF20
-data4 0x253C7DD6, 0x00000000
-data8 0x3FF4719A02F88DAE
-data4 0x23DB59BF, 0x00000000
-data8 0x3FF3CC6649DA0788
-data4 0x252B4756, 0x00000000
-data8 0x3FF32D770B980DB8
-data4 0x23FE585F, 0x00000000
-data8 0x3FF2945FE56C987A
-data4 0x25378A63, 0x00000000
-data8 0x3FF200BDB16523F6
-data4 0x247BB2E0, 0x00000000
-data8 0x3FF172358CE27778
-data4 0x24446538, 0x00000000
-data8 0x3FF0E873FDEFE692
-data4 0x2514638F, 0x00000000
-data8 0x3FF0632C33154062
-data4 0x24A7FC27, 0x00000000
-data8 0x3FEFC42EB3EF115F
-data4 0x248FD0FE, 0x00000000
-data8 0x3FEEC9E8135D26F6
-data4 0x2385C719, 0x00000000
-LOCAL_OBJECT_END(tanl_table_cm1)
-
-LOCAL_OBJECT_START(tanl_table_scim2)
-//
-//  Entries SC_inv in Swapped IEEE format (extended)
-//  Index = 0,1,...,31  B = 2^(-2)*(1+Index/32+1/64)
-//
-data8    0x839D6D4A1BF30C9E, 0x00004001
-data8    0x80092804554B0EB0, 0x00004001
-data8    0xF959F94CA1CF0DE9, 0x00004000
-data8    0xF3086BA077378677, 0x00004000
-data8    0xED154515CCD4723C, 0x00004000
-data8    0xE77909441C27CF25, 0x00004000
-data8    0xE22D037D8DDACB88, 0x00004000
-data8    0xDD2B2D8A89C73522, 0x00004000
-data8    0xD86E1A23BB2C1171, 0x00004000
-data8    0xD3F0E288DFF5E0F9, 0x00004000
-data8    0xCFAF16B1283BEBD5, 0x00004000
-data8    0xCBA4AFAA0D88DD53, 0x00004000
-data8    0xC7CE03CCCA67C43D, 0x00004000
-data8    0xC427BC820CA0DDB0, 0x00004000
-data8    0xC0AECD57F13D8CAB, 0x00004000
-data8    0xBD606C3871ECE6B1, 0x00004000
-data8    0xBA3A0A96A44C4929, 0x00004000
-data8    0xB7394F6FE5CCCEC1, 0x00004000
-data8    0xB45C12039637D8BC, 0x00004000
-data8    0xB1A0552892CB051B, 0x00004000
-data8    0xAF04432B6BA2FFD0, 0x00004000
-data8    0xAC862A237221235F, 0x00004000
-data8    0xAA2478AF5F00A9D1, 0x00004000
-data8    0xA7DDBB0C81E082BF, 0x00004000
-data8    0xA5B0987D45684FEE, 0x00004000
-data8    0xA39BD0F5627A8F53, 0x00004000
-data8    0xA19E3B036EC5C8B0, 0x00004000
-data8    0x9FB6C1F091CD7C66, 0x00004000
-data8    0x9DE464101FA3DF8A, 0x00004000
-data8    0x9C263139A8F6B888, 0x00004000
-data8    0x9A7B4968C27B0450, 0x00004000
-data8    0x98E2DB7E5EE614EE, 0x00004000
-LOCAL_OBJECT_END(tanl_table_scim2)
-
-LOCAL_OBJECT_START(tanl_table_scim1)
-//
-//  Entries SC_inv in Swapped IEEE format (extended)
-//  Index = 0,1,...,19  B = 2^(-1)*(1+Index/32+1/64)
-//
-data8    0x969F335C13B2B5BA, 0x00004000
-data8    0x93D446D9D4C0F548, 0x00004000
-data8    0x9147094F61B798AF, 0x00004000
-data8    0x8EF317CC758787AC, 0x00004000
-data8    0x8CD498B3B99EEFDB, 0x00004000
-data8    0x8AE82A7DDFF8BC37, 0x00004000
-data8    0x892AD546E3C55D42, 0x00004000
-data8    0x8799FEA9D15573C1, 0x00004000
-data8    0x86335F88435A4B4C, 0x00004000
-data8    0x84F4FB6E3E93A87B, 0x00004000
-data8    0x83DD195280A382FB, 0x00004000
-data8    0x82EA3D7FA4CB8C9E, 0x00004000
-data8    0x821B247C6861D0A8, 0x00004000
-data8    0x816EBED163E8D244, 0x00004000
-data8    0x80E42D9127E4CFC6, 0x00004000
-data8    0x807ABF8D28E64AFD, 0x00004000
-data8    0x8031EF26863B4FD8, 0x00004000
-data8    0x800960ADAE8C11FD, 0x00004000
-data8    0x8000E1475FDBEC21, 0x00004000
-data8    0x80186650A07791FA, 0x00004000
-LOCAL_OBJECT_END(tanl_table_scim1)
-
-Arg                 = f8
-Save_Norm_Arg       = f8        // For input to reduction routine
-Result              = f8
-r                   = f8        // For output from reduction routine
-c                   = f9        // For output from reduction routine
-U_2                 = f10
-rsq                 = f11
-C_hi                = f12
-C_lo                = f13
-T_hi                = f14
-T_lo                = f15
-
-d_1                 = f33
-N_0                 = f34
-tail                = f35
-tanx                = f36
-Cx                  = f37
-Sx                  = f38
-sgn_r               = f39
-CORR                = f40
-P                   = f41
-D                   = f42
-ArgPrime            = f43
-P_0                 = f44
-
-P2_1                = f45
-P2_2                = f46
-P2_3                = f47
-
-P1_1                = f45
-P1_2                = f46
-P1_3                = f47
-
-P1_4                = f48
-P1_5                = f49
-P1_6                = f50
-P1_7                = f51
-P1_8                = f52
-P1_9                = f53
-
-x                   = f56
-xsq                 = f57
-Tx                  = f58
-Tx1                 = f59
-Set                 = f60
-poly1               = f61
-poly2               = f62
-Poly                = f63
-Poly1               = f64
-Poly2               = f65
-r_to_the_8          = f66
-B                   = f67
-SC_inv              = f68
-Pos_r               = f69
-N_0_fix             = f70
-d_2                 = f71
-PI_BY_4             = f72
-TWO_TO_NEG14        = f74
-TWO_TO_NEG33        = f75
-NEGTWO_TO_NEG14     = f76
-NEGTWO_TO_NEG33     = f77
-two_by_PI           = f78
-N                   = f79
-N_fix               = f80
-P_1                 = f81
-P_2                 = f82
-P_3                 = f83
-s_val               = f84
-w                   = f85
-B_mask1             = f86
-B_mask2             = f87
-w2                  = f88
-A                   = f89
-a                   = f90
-t                   = f91
-U_1                 = f92
-NEGTWO_TO_NEG2      = f93
-TWO_TO_NEG2         = f94
-Q1_1                = f95
-Q1_2                = f96
-Q1_3                = f97
-Q1_4                = f98
-Q1_5                = f99
-Q1_6                = f100
-Q1_7                = f101
-Q1_8                = f102
-S_hi                = f103
-S_lo                = f104
-V_hi                = f105
-V_lo                = f106
-U_hi                = f107
-U_lo                = f108
-U_hiabs             = f109
-V_hiabs             = f110
-V                   = f111
-Inv_P_0             = f112
-
-FR_inv_pi_2to63     = f113
-FR_rshf_2to64       = f114
-FR_2tom64           = f115
-FR_rshf             = f116
-Norm_Arg            = f117
-Abs_Arg             = f118
-TWO_TO_NEG65        = f119
-fp_tmp              = f120
-mOne                = f121
-
-GR_SAVE_B0     = r33
-GR_SAVE_GP     = r34
-GR_SAVE_PFS    = r35
-table_base     = r36
-table_ptr1     = r37
-table_ptr2     = r38
-table_ptr3     = r39
-lookup         = r40
-N_fix_gr       = r41
-GR_exp_2tom2   = r42
-GR_exp_2tom65  = r43
-exp_r          = r44
-sig_r          = r45
-bmask1         = r46
-table_offset   = r47
-bmask2         = r48
-gr_tmp         = r49
-cot_flag       = r50
-
-GR_sig_inv_pi  = r51
-GR_rshf_2to64  = r52
-GR_exp_2tom64  = r53
-GR_rshf        = r54
-GR_exp_2_to_63 = r55
-GR_exp_2_to_24 = r56
-GR_signexp_x   = r57
-GR_exp_x       = r58
-GR_exp_mask    = r59
-GR_exp_2tom14  = r60
-GR_exp_m2tom14 = r61
-GR_exp_2tom33  = r62
-GR_exp_m2tom33 = r63
-
-GR_SAVE_B0                  = r64
-GR_SAVE_PFS                 = r65
-GR_SAVE_GP                  = r66
-
-GR_Parameter_X              = r67
-GR_Parameter_Y              = r68
-GR_Parameter_RESULT         = r69
-GR_Parameter_Tag            = r70
-
-
-.section .text
-.global __libm_tanl#
-.global __libm_cotl#
-
-.proc __libm_cotl#
-__libm_cotl:
-.endp __libm_cotl#
-LOCAL_LIBM_ENTRY(cotl)
-
-{ .mlx
-      alloc r32 = ar.pfs, 0,35,4,0
-      movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
-}
-{ .mlx
-      mov GR_exp_mask = 0x1ffff            // Exponent mask
-      movl GR_rshf_2to64 = 0x47e8000000000000 // 1.1000 2^(63+64)
-}
-;;
-
-//     Check for NatVals, Infs , NaNs, and Zeros
-{ .mfi
-      getf.exp GR_signexp_x = Arg          // Get sign and exponent of x
-      fclass.m  p6,p0 = Arg, 0x1E7         // Test for natval, nan, inf, zero
-      mov cot_flag = 0x1
-}
-{ .mfb
-      addl table_base = @ltoff(TANL_BASE_CONSTANTS), gp // Pointer to table ptr
-      fnorm.s1 Norm_Arg = Arg              // Normalize x
-      br.cond.sptk COMMON_PATH
-};;
-
-LOCAL_LIBM_END(cotl)
-
-
-.proc __libm_tanl#
-__libm_tanl:
-.endp __libm_tanl#
-GLOBAL_IEEE754_ENTRY(tanl)
-
-{ .mlx
-      alloc r32 = ar.pfs, 0,35,4,0
-      movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
-}
-{ .mlx
-      mov GR_exp_mask = 0x1ffff            // Exponent mask
-      movl GR_rshf_2to64 = 0x47e8000000000000 // 1.1000 2^(63+64)
-}
-;;
-
-//     Check for NatVals, Infs , NaNs, and Zeros
-{ .mfi
-      getf.exp GR_signexp_x = Arg          // Get sign and exponent of x
-      fclass.m  p6,p0 = Arg, 0x1E7         // Test for natval, nan, inf, zero
-      mov cot_flag = 0x0
-}
-{ .mfi
-      addl table_base = @ltoff(TANL_BASE_CONSTANTS), gp // Pointer to table ptr
-      fnorm.s1 Norm_Arg = Arg              // Normalize x
-      nop.i 0
-};;
-
-// Common path for both tanl and cotl
-COMMON_PATH:
-{ .mfi
-      setf.sig FR_inv_pi_2to63 = GR_sig_inv_pi // Form 1/pi * 2^63
-      fclass.m p9, p0 = Arg, 0x0b          // Test x denormal
-      mov GR_exp_2tom64 = 0xffff - 64      // Scaling constant to compute N
-}
-{ .mlx
-      setf.d FR_rshf_2to64 = GR_rshf_2to64 // Form const 1.1000 * 2^(63+64)
-      movl GR_rshf = 0x43e8000000000000    // Form const 1.1000 * 2^63
-}
-;;
-
-// Check for everything - if false, then must be pseudo-zero or pseudo-nan.
-// Branch out to deal with special values.
-{ .mfi
-      addl gr_tmp = -1,r0
-      fclass.nm  p7,p0 = Arg, 0x1FF        // Test x unsupported
-      mov GR_exp_2_to_63 = 0xffff + 63     // Exponent of 2^63
-}
-{ .mfb
-      ld8 table_base = [table_base]        // Get pointer to constant table
-      fms.s1 mOne = f0, f0, f1
-(p6)  br.cond.spnt TANL_SPECIAL            // Branch if x natval, nan, inf, zero
-}
-;;
-
-{ .mmb
-      setf.sig fp_tmp = gr_tmp   // Make a constant so fmpy produces inexact
-      mov GR_exp_2_to_24 = 0xffff + 24     // Exponent of 2^24
-(p9)  br.cond.spnt TANL_DENORMAL           // Branch if x denormal
-}
-;;
-
-TANL_COMMON:
-// Return to here if x denormal
-//
-// Do fcmp to generate Denormal exception
-//  - can't do FNORM (will generate Underflow when U is unmasked!)
-// Branch out to deal with unsupporteds values.
-{ .mfi
-      setf.exp FR_2tom64 = GR_exp_2tom64 // Form 2^-64 for scaling N_float
-      fcmp.eq.s0 p0, p6 = Arg, f1        // Dummy to flag denormals
-      add table_ptr1 = 0, table_base     // Point to tanl_table_1
-}
-{ .mib
-      setf.d FR_rshf = GR_rshf           // Form right shift const 1.1000 * 2^63
-      add table_ptr2 = 80, table_base    // Point to tanl_table_2
-(p7)  br.cond.spnt TANL_UNSUPPORTED      // Branch if x unsupported type
-}
-;;
-
-{ .mfi
-      and GR_exp_x = GR_exp_mask, GR_signexp_x // Get exponent of x
-      fmpy.s1 Save_Norm_Arg = Norm_Arg, f1     // Save x if large arg reduction
-      dep.z bmask1 = 0x7c, 56, 8               // Form mask to get 5 msb of r
-                                               // bmask1 = 0x7c00000000000000
-}
-;;
-
-//
-//     Decide about the paths to take:
-//     Set PR_6 if |Arg| >= 2**63
-//     Set PR_9 if |Arg| < 2**24 - CASE 1 OR 2
-//     OTHERWISE Set PR_8 - CASE 3 OR 4
-//
-//     Branch out if the magnitude of the input argument is >= 2^63
-//     - do this branch before the next.
-{ .mfi
-      ldfe two_by_PI = [table_ptr1],16        // Load 2/pi
-      nop.f 999
-      dep.z bmask2 = 0x41, 57, 7              // Form mask to OR to produce B
-                                              // bmask2 = 0x8200000000000000
-}
-{ .mib
-      ldfe PI_BY_4 = [table_ptr2],16          // Load pi/4
-      cmp.ge p6,p0 = GR_exp_x, GR_exp_2_to_63 // Is |x| >= 2^63
-(p6)  br.cond.spnt TANL_ARG_TOO_LARGE         // Branch if |x| >= 2^63
-}
-;;
-
-{ .mmi
-      ldfe P_0 = [table_ptr1],16              // Load P_0
-      ldfe Inv_P_0 = [table_ptr2],16          // Load Inv_P_0
-      nop.i 999
-}
-;;
-
-{ .mfi
-      ldfe P_1 = [table_ptr1],16              // Load P_1
-      fmerge.s Abs_Arg = f0, Norm_Arg         // Get |x|
-      mov GR_exp_m2tom33 = 0x2ffff - 33       // Form signexp of -2^-33
-}
-{ .mfi
-      ldfe d_1 = [table_ptr2],16              // Load d_1 for 2^24 <= |x| < 2^63
-      nop.f 999
-      mov GR_exp_2tom33 = 0xffff - 33         // Form signexp of 2^-33
-}
-;;
-
-{ .mmi
-      ldfe P_2 = [table_ptr1],16              // Load P_2
-      ldfe d_2 = [table_ptr2],16              // Load d_2 for 2^24 <= |x| < 2^63
-      cmp.ge p8,p0 = GR_exp_x, GR_exp_2_to_24 // Is |x| >= 2^24
-}
-;;
-
-// Use special scaling to right shift so N=Arg * 2/pi is in rightmost bits
-// Branch to Cases 3 or 4 if Arg <= -2**24 or Arg >= 2**24
-{ .mfb
-      ldfe   P_3 = [table_ptr1],16            // Load P_3
-      fma.s1      N_fix = Norm_Arg, FR_inv_pi_2to63, FR_rshf_2to64
-(p8)  br.cond.spnt TANL_LARGER_ARG            // Branch if 2^24 <= |x| < 2^63
-}
-;;
-
-// Here if 0 < |x| < 2^24
-//     ARGUMENT REDUCTION CODE - CASE 1 and 2
-//
-{ .mmf
-      setf.exp TWO_TO_NEG33 = GR_exp_2tom33      // Form 2^-33
-      setf.exp NEGTWO_TO_NEG33 = GR_exp_m2tom33  // Form -2^-33
-      fmerge.s r = Norm_Arg,Norm_Arg          // Assume r=x, ok if |x| < pi/4
-}
-;;
-
-//
-// If |Arg| < pi/4,  set PR_8, else  pi/4 <=|Arg| < 2^24 - set PR_9.
-//
-//     Case 2: Convert integer N_fix back to normalized floating-point value.
-{ .mfi
-      getf.sig sig_r = Norm_Arg               // Get sig_r if 1/4 <= |x| < pi/4
-      fcmp.lt.s1 p8,p9= Abs_Arg,PI_BY_4       // Test |x| < pi/4
-      mov GR_exp_2tom2 = 0xffff - 2           // Form signexp of 2^-2
-}
-{ .mfi
-      ldfps TWO_TO_NEG2, NEGTWO_TO_NEG2 = [table_ptr2] // Load 2^-2, -2^-2
-      fms.s1 N = N_fix, FR_2tom64, FR_rshf    // Use scaling to get N floated
-      mov N_fix_gr = r0                       // Assume N=0, ok if |x| < pi/4
-}
-;;
-
-//
-//     Case 1: Is |r| < 2**(-2).
-//     Arg is the same as r in this case.
-//     r = Arg
-//     c = 0
-//
-//     Case 2: Place integer part of N in GP register.
-{ .mfi
-(p9)  getf.sig N_fix_gr = N_fix
-      fmerge.s c = f0, f0                     // Assume c=0, ok if |x| < pi/4
-      cmp.lt p10, p0 = GR_exp_x, GR_exp_2tom2 // Test if |x| < 1/4
-}
-;;
-
-{ .mfi
-      setf.sig B_mask1 = bmask1               // Form mask to get 5 msb of r
-      nop.f 999
-      mov exp_r = GR_exp_x                    // Get exp_r if 1/4 <= |x| < pi/4
-}
-{ .mbb
-      setf.sig B_mask2 = bmask2               // Form mask to form B from r
-(p10) br.cond.spnt TANL_SMALL_R               // Branch if 0 < |x| < 1/4
-(p8)  br.cond.spnt TANL_NORMAL_R              // Branch if 1/4 <= |x| < pi/4
-}
-;;
-
-// Here if pi/4 <= |x| < 2^24
-//
-//     Case 1: PR_3 is only affected  when PR_1 is set.
-//
-//
-//     Case 2: w = N * P_2
-//     Case 2: s_val = -N * P_1  + Arg
-//
-
-{ .mfi
-      nop.m 999
-      fnma.s1 s_val = N, P_1, Norm_Arg
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 w = N, P_2                     // w = N * P_2 for |s| >= 2^-33
-      nop.i 999
-}
-;;
-
-//     Case 2_reduce: w = N * P_3 (change sign)
-{ .mfi
-      nop.m 999
-      fmpy.s1 w2 = N, P_3                    // w = N * P_3 for |s| < 2^-33
-      nop.i 999
-}
-;;
-
-//     Case 1_reduce: r = s + w (change sign)
-{ .mfi
-      nop.m 999
-      fsub.s1 r = s_val, w                   // r = s_val - w for |s| >= 2^-33
-      nop.i 999
-}
-;;
-
-//     Case 2_reduce: U_1 = N * P_2 + w
-{ .mfi
-      nop.m 999
-      fma.s1  U_1 = N, P_2, w2              // U_1 = N * P_2 + w for |s| < 2^-33
-      nop.i 999
-}
-;;
-
-//
-//     Decide between case_1 and case_2 reduce:
-//     Case 1_reduce:  |s| >= 2**(-33)
-//     Case 2_reduce:  |s| < 2**(-33)
-//
-{ .mfi
-      nop.m 999
-      fcmp.lt.s1 p9, p8 = s_val, TWO_TO_NEG33
-      nop.i 999
-}
-;;
-
-{ .mfi
-      nop.m 999
-(p9)  fcmp.gt.s1 p9, p8 = s_val, NEGTWO_TO_NEG33
-      nop.i 999
-}
-;;
-
-//     Case 1_reduce: c = s - r
-{ .mfi
-      nop.m 999
-      fsub.s1 c = s_val, r                     // c = s_val - r for |s| >= 2^-33
-      nop.i 999
-}
-;;
-
-//     Case 2_reduce: r is complete here - continue to calculate c .
-//     r = s - U_1
-{ .mfi
-      nop.m 999
-(p9)  fsub.s1 r = s_val, U_1
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p9)  fms.s1 U_2 = N, P_2, U_1
-      nop.i 999
-}
-;;
-
-//
-//     Case 1_reduce: Is |r| < 2**(-2), if so set PR_10
-//     else set PR_13.
-//
-
-{ .mfi
-      nop.m 999
-      fand B = B_mask1, r
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p8)  fcmp.lt.unc.s1 p10, p13 = r, TWO_TO_NEG2
-      nop.i 999
-}
-;;
-
-{ .mfi
-(p8)  getf.sig sig_r = r               // Get signif of r if |s| >= 2^-33
-      nop.f 999
-      nop.i 999
-}
-;;
-
-{ .mfi
-(p8)  getf.exp exp_r = r               // Extract signexp of r if |s| >= 2^-33
-(p10) fcmp.gt.s1 p10, p13 = r, NEGTWO_TO_NEG2
-      nop.i 999
-}
-;;
-
-//     Case 1_reduce: c is complete here.
-//     Case 1: Branch to SMALL_R or NORMAL_R.
-//     c = c + w (w has not been negated.)
-{ .mfi
-      nop.m 999
-(p8)  fsub.s1 c = c, w                         // c = c - w for |s| >= 2^-33
-      nop.i 999
-}
-{ .mbb
-      nop.m 999
-(p10) br.cond.spnt TANL_SMALL_R     // Branch if pi/4 < |x| < 2^24 and |r|<1/4
-(p13) br.cond.sptk TANL_NORMAL_R_A  // Branch if pi/4 < |x| < 2^24 and |r|>=1/4
-}
-;;
-
-
-// Here if pi/4 < |x| < 2^24 and |s| < 2^-33
-//
-//     Is i_1 = lsb of N_fix_gr even or odd?
-//     if i_1 == 0, set p11, else set p12.
-//
-{ .mfi
-      nop.m 999
-      fsub.s1 s_val = s_val, r
-      add N_fix_gr = N_fix_gr, cot_flag // N = N + 1 (for cotl)
-}
-{ .mfi
-      nop.m 999
-//
-//     Case 2_reduce:
-//     U_2 = N * P_2 - U_1
-//     Not needed until later.
-//
-      fadd.s1 U_2 = U_2, w2
-//
-//     Case 2_reduce:
-//     s = s - r
-//     U_2 = U_2 + w
-//
-      nop.i 999
-}
-;;
-
-//
-//     Case 2_reduce:
-//     c = c - U_2
-//     c is complete here
-//     Argument reduction ends here.
-//
-{ .mfi
-      nop.m 999
-      fmpy.s1 rsq = r, r
-      tbit.z p11, p12 = N_fix_gr, 0 ;;    // Set p11 if N even, p12 if odd
-}
-
-{ .mfi
-      nop.m 999
-(p12) frcpa.s1 S_hi,p0 = f1, r
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fsub.s1 c = s_val, U_1
-      nop.i 999
-}
-;;
-
-{ .mmi
-      add table_ptr1 = 160, table_base ;;  // Point to tanl_table_p1
-      ldfe P1_1 = [table_ptr1],144
-      nop.i 999 ;;
-}
-//
-//     Load P1_1 and point to Q1_1 .
-//
-{ .mfi
-      ldfe Q1_1 = [table_ptr1]
-//
-//     N even: rsq = r * Z
-//     N odd:  S_hi = frcpa(r)
-//
-(p12) fmerge.ns S_hi = S_hi, S_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-//
-//     Case 2_reduce:
-//     c = s - U_1
-//
-(p9)  fsub.s1 c = c, U_2
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1  poly1 = S_hi, r, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  Change sign of S_hi
-//
-(p11) fmpy.s1 rsq = rsq, P1_1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 S_hi = S_hi, poly1, S_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N even: rsq = rsq * P1_1
-//     N odd:  poly1 =  1.0 +  S_hi * r    16 bits partial  account for necessary
-//
-(p11) fma.s1 Poly = r, rsq, c
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N even: Poly = c  + r * rsq
-//     N odd:  S_hi  = S_hi + S_hi*poly1  16 bits account for necessary
-//
-(p12) fma.s1 poly1 = S_hi, r, f1
-(p11) tbit.z.unc p14, p15 = cot_flag, 0 ;; // p14=1 for tanl; p15=1 for cotl
-}
-{ .mfi
-      nop.m 999
-//
-//     N even: Result = Poly + r
-//     N odd:  poly1  = 1.0 + S_hi * r        32 bits partial
-//
-(p14) fadd.s0 Result = r, Poly             // for tanl
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p15) fms.s0 Result = r, mOne, Poly        // for cotl
-      nop.i 999
-}
-;;
-
-{ .mfi
-      nop.m 999
-(p12) fma.s1  S_hi = S_hi, poly1, S_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N even: Result1 = Result + r
-//     N odd:   S_hi  = S_hi * poly1 + S_hi   32 bits
-//
-(p12) fma.s1 poly1 = S_hi, r, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  poly1  =  S_hi * r + 1.0       64 bits partial
-//
-(p12) fma.s1 S_hi = S_hi, poly1, S_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  poly1  =  S_hi * poly + 1.0    64 bits
-//
-(p12) fma.s1 poly1 = S_hi, r, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  poly1  =  S_hi * r + 1.0
-//
-(p12) fma.s1 poly1 = S_hi, c, poly1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  poly1  =  S_hi * c + poly1
-//
-(p12) fmpy.s1 S_lo = S_hi, poly1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  S_lo  =  S_hi *  poly1
-//
-(p12) fma.s1 S_lo = Q1_1, r, S_lo
-(p12) tbit.z.unc p14, p15 = cot_flag, 0 // p14=1 for tanl; p15=1 for cotl
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  Result =  S_hi + S_lo
-//
-      fmpy.s0 fp_tmp = fp_tmp, fp_tmp  // Dummy mult to set inexact
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//     N odd:  S_lo  =  S_lo + Q1_1 * r
-//
-(p14) fadd.s0 Result = S_hi, S_lo          // for tanl
-      nop.i 999
-}
-{ .mfb
-      nop.m 999
-(p15) fms.s0 Result = S_hi, mOne, S_lo     // for cotl
-      br.ret.sptk b0 ;;          // Exit for pi/4 <= |x| < 2^24 and |s| < 2^-33
-}
-
-
-TANL_LARGER_ARG:
-// Here if 2^24 <= |x| < 2^63
-//
-// ARGUMENT REDUCTION CODE - CASE 3 and 4
-//
-
-{ .mmf
-      mov GR_exp_2tom14 = 0xffff - 14          // Form signexp of 2^-14
-      mov GR_exp_m2tom14 = 0x2ffff - 14        // Form signexp of -2^-14
-      fmpy.s1 N_0 = Norm_Arg, Inv_P_0
-}
-;;
-
-{ .mmi
-      setf.exp TWO_TO_NEG14 = GR_exp_2tom14    // Form 2^-14
-      setf.exp NEGTWO_TO_NEG14 = GR_exp_m2tom14// Form -2^-14
-      nop.i 999
-}
-;;
-
-
-//
-//    Adjust table_ptr1 to beginning of table.
-//    N_0 = Arg * Inv_P_0
-//
-{ .mmi
-      add table_ptr2 = 144, table_base ;;     // Point to 2^-2
-      ldfps TWO_TO_NEG2, NEGTWO_TO_NEG2 = [table_ptr2]
-      nop.i 999
-}
-;;
-
-//
-//    N_0_fix  = integer part of N_0 .
-//
-//
-//    Make N_0 the integer part.
-//
-{ .mfi
-      nop.m 999
-      fcvt.fx.s1 N_0_fix = N_0
-      nop.i 999 ;;
-}
-{ .mfi
-      setf.sig B_mask1 = bmask1               // Form mask to get 5 msb of r
-      fcvt.xf N_0 = N_0_fix
-      nop.i 999 ;;
-}
-{ .mfi
-      setf.sig B_mask2 = bmask2               // Form mask to form B from r
-      fnma.s1 ArgPrime = N_0, P_0, Norm_Arg
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 w = N_0, d_1
-      nop.i 999 ;;
-}
-//
-//    ArgPrime = -N_0 * P_0 + Arg
-//    w  = N_0 * d_1
-//
-//
-//    N = ArgPrime * 2/pi
-//
-//      fcvt.fx.s1 N_fix = N
-// Use special scaling to right shift so N=Arg * 2/pi is in rightmost bits
-// Branch to Cases 3 or 4 if Arg <= -2**24 or Arg >= 2**24
-{ .mfi
-      nop.m 999
-      fma.s1      N_fix = ArgPrime, FR_inv_pi_2to63, FR_rshf_2to64
-
-      nop.i 999 ;;
-}
-//     Convert integer N_fix back to normalized floating-point value.
-{ .mfi
-      nop.m 999
-      fms.s1 N = N_fix, FR_2tom64, FR_rshf    // Use scaling to get N floated
-      nop.i 999
-}
-;;
-
-//
-//    N is the integer part of the reduced-reduced argument.
-//    Put the integer in a GP register.
-//
-{ .mfi
-      getf.sig N_fix_gr = N_fix
-      nop.f 999
-      nop.i 999
-}
-;;
-
-//
-//    s_val = -N*P_1 + ArgPrime
-//    w = -N*P_2 + w
-//
-{ .mfi
-      nop.m 999
-      fnma.s1 s_val = N, P_1, ArgPrime
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fnma.s1 w = N, P_2, w
-      nop.i 999
-}
-;;
-
-//    Case 4: V_hi = N * P_2
-//    Case 4: U_hi = N_0 * d_1
-{ .mfi
-      nop.m 999
-      fmpy.s1 V_hi = N, P_2               // V_hi = N * P_2 for |s| < 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 U_hi = N_0, d_1             // U_hi = N_0 * d_1 for |s| < 2^-14
-      nop.i 999
-}
-;;
-
-//    Case 3: r = s_val + w (Z complete)
-//    Case 4: w = N * P_3
-{ .mfi
-      nop.m 999
-      fadd.s1 r = s_val, w                // r = s_val + w for |s| >= 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 w2 = N, P_3                 // w = N * P_3 for |s| < 2^-14
-      nop.i 999
-}
-;;
-
-//    Case 4: A =  U_hi + V_hi
-//    Note: Worry about switched sign of V_hi, so subtract instead of add.
-//    Case 4: V_lo = -N * P_2 - V_hi (U_hi is in place of V_hi in writeup)
-//    Note: the (-) is still missing for V_hi.
-{ .mfi
-      nop.m 999
-      fsub.s1 A = U_hi, V_hi           // A = U_hi - V_hi for |s| < 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fnma.s1 V_lo = N, P_2, V_hi      // V_lo = V_hi - N * P_2 for |s| < 2^-14
-      nop.i 999
-}
-;;
-
-//    Decide between case 3 and 4:
-//    Case 3:  |s| >= 2**(-14)     Set p10
-//    Case 4:  |s| <  2**(-14)     Set p11
-//
-//    Case 4: U_lo = N_0 * d_1 - U_hi
-{ .mfi
-      nop.m 999
-      fms.s1 U_lo = N_0, d_1, U_hi     // U_lo = N_0*d_1 - U_hi for |s| < 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fcmp.lt.s1 p11, p10 = s_val, TWO_TO_NEG14
-      nop.i 999
-}
-;;
-
-//    Case 4: We need abs of both U_hi and V_hi - dont
-//    worry about switched sign of V_hi.
-{ .mfi
-      nop.m 999
-      fabs V_hiabs = V_hi              // |V_hi| for |s| < 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p11) fcmp.gt.s1 p11, p10 = s_val, NEGTWO_TO_NEG14
-      nop.i 999
-}
-;;
-
-//    Case 3: c = s_val - r
-{ .mfi
-      nop.m 999
-      fabs U_hiabs = U_hi              // |U_hi| for |s| < 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fsub.s1 c = s_val, r             // c = s_val - r    for |s| >= 2^-14
-      nop.i 999
-}
-;;
-
-// For Case 3, |s| >= 2^-14, determine if |r| < 1/4
-//
-//    Case 4: C_hi = s_val + A
-//
-{ .mfi
-      nop.m 999
-(p11) fadd.s1 C_hi = s_val, A              // C_hi = s_val + A for |s| < 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p10) fcmp.lt.unc.s1 p14, p15 = r, TWO_TO_NEG2
-      nop.i 999
-}
-;;
-
-{ .mfi
-      getf.sig sig_r = r               // Get signif of r if |s| >= 2^-33
-      fand B = B_mask1, r
-      nop.i 999
-}
-;;
-
-//    Case 4: t = U_lo + V_lo
-{ .mfi
-      getf.exp exp_r = r               // Extract signexp of r if |s| >= 2^-33
-(p11) fadd.s1 t = U_lo, V_lo               // t = U_lo + V_lo for |s| < 2^-14
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p14) fcmp.gt.s1 p14, p15 = r, NEGTWO_TO_NEG2
-      nop.i 999
-}
-;;
-
-//    Case 3: c = (s - r) + w (c complete)
-{ .mfi
-      nop.m 999
-(p10) fadd.s1 c = c, w              // c = c + w for |s| >= 2^-14
-      nop.i 999
-}
-{ .mbb
-      nop.m 999
-(p14) br.cond.spnt TANL_SMALL_R     // Branch if 2^24 <= |x| < 2^63 and |r|< 1/4
-(p15) br.cond.sptk TANL_NORMAL_R_A  // Branch if 2^24 <= |x| < 2^63 and |r|>=1/4
-}
-;;
-
-
-// Here if 2^24 <= |x| < 2^63 and |s| < 2^-14  >>>>>>>  Case 4.
-//
-//    Case 4: Set P_12 if U_hiabs >= V_hiabs
-//    Case 4: w = w + N_0 * d_2
-//    Note: the (-) is now incorporated in w .
-{ .mfi
-      add table_ptr1 = 160, table_base           // Point to tanl_table_p1
-      fcmp.ge.unc.s1 p12, p13 = U_hiabs, V_hiabs
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fms.s1 w2 = N_0, d_2, w2
-      nop.i 999
-}
-;;
-
-//    Case 4: C_lo = s_val - C_hi
-{ .mfi
-      ldfe P1_1 = [table_ptr1], 16               // Load P1_1
-      fsub.s1 C_lo = s_val, C_hi
-      nop.i 999
-}
-;;
-
-//
-//    Case 4: a = U_hi - A
-//            a = V_hi - A (do an add to account for missing (-) on V_hi
-//
-{ .mfi
-      ldfe P1_2 = [table_ptr1], 128              // Load P1_2
-(p12) fsub.s1 a = U_hi, A
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p13) fadd.s1 a = V_hi, A
-      nop.i 999
-}
-;;
-
-//    Case 4: t = U_lo + V_lo  + w
-{ .mfi
-      ldfe Q1_1 = [table_ptr1], 16               // Load Q1_1
-      fadd.s1 t = t, w2
-      nop.i 999
-}
-;;
-
-//    Case 4: a = (U_hi - A)  + V_hi
-//            a = (V_hi - A)  + U_hi
-//    In each case account for negative missing form V_hi .
-//
-{ .mfi
-      ldfe Q1_2 = [table_ptr1], 16               // Load Q1_2
-(p12) fsub.s1 a = a, V_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p13) fsub.s1 a = U_hi, a
-      nop.i 999
-}
-;;
-
-//
-//    Case 4: C_lo = (s_val - C_hi) + A
-//
-{ .mfi
-      nop.m 999
-      fadd.s1 C_lo = C_lo, A
-      nop.i 999 ;;
-}
-//
-//    Case 4: t = t + a
-//
-{ .mfi
-      nop.m 999
-      fadd.s1 t = t, a
-      nop.i 999
-}
-;;
-
-//    Case 4: C_lo = C_lo + t
-//    Case 4: r = C_hi + C_lo
-{ .mfi
-      nop.m 999
-      fadd.s1 C_lo = C_lo, t
-      nop.i 999
-}
-;;
-
-{ .mfi
-      nop.m 999
-      fadd.s1 r = C_hi, C_lo
-      nop.i 999
-}
-;;
-
-//
-//    Case 4: c = C_hi - r
-//
-{ .mfi
-      nop.m 999
-      fsub.s1 c = C_hi, r
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 rsq = r, r
-      add N_fix_gr = N_fix_gr, cot_flag // N = N + 1 (for cotl)
-}
-;;
-
-//    Case 4: c = c + C_lo  finished.
-//
-//    Is i_1 = lsb of N_fix_gr even or odd?
-//    if i_1 == 0, set PR_11, else set PR_12.
-//
-{ .mfi
-      nop.m 999
-      fadd.s1 c = c , C_lo
-      tbit.z p11, p12 =  N_fix_gr, 0
-}
-;;
-
-// r and c have been computed.
-{ .mfi
-      nop.m 999
-(p12) frcpa.s1 S_hi, p0 = f1, r
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd: Change sign of S_hi
-//
-(p11) fma.s1 Poly = rsq, P1_2, P1_1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 P = rsq, Q1_2, Q1_1
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:  Result  =  S_hi + S_lo      (User supplied rounding mode for C1)
-//
-       fmpy.s0 fp_tmp = fp_tmp, fp_tmp  // Dummy mult to set inexact
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: rsq = r * r
-//    N odd:  S_hi = frcpa(r)
-//
-(p12) fmerge.ns S_hi = S_hi, S_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: rsq = rsq * P1_2 + P1_1
-//    N odd:  poly1 =  1.0 +  S_hi * r    16 bits partial  account for necessary
-//
-(p11) fmpy.s1 Poly = rsq, Poly
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly1 = S_hi, r,f1
-(p11) tbit.z.unc p14, p15 = cot_flag, 0 // p14=1 for tanl; p15=1 for cotl
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: Poly =  Poly * rsq
-//    N odd:  S_hi  = S_hi + S_hi*poly1  16 bits account for necessary
-//
-(p11) fma.s1 Poly = r, Poly, c
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 S_hi = S_hi, poly1, S_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:   S_hi  = S_hi * poly1 + S_hi   32 bits
-//
-(p14) fadd.s0 Result = r, Poly          // for tanl
-      nop.i 999 ;;
-}
-
-.pred.rel "mutex",p15,p12
-{ .mfi
-      nop.m 999
-(p15) fms.s0 Result = r, mOne, Poly     // for cotl
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly1 =  S_hi, r, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: Poly = Poly * r + c
-//    N odd:  poly1  = 1.0 + S_hi * r        32 bits partial
-//
-(p12) fma.s1 S_hi = S_hi, poly1, S_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly1 = S_hi, r, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: Result = Poly + r  (Rounding mode S0)
-//    N odd:  poly1  =  S_hi * r + 1.0       64 bits partial
-//
-(p12) fma.s1 S_hi = S_hi, poly1, S_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:  poly1  =  S_hi * poly + S_hi    64 bits
-//
-(p12) fma.s1 poly1 = S_hi, r, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:  poly1  =  S_hi * r + 1.0
-//
-(p12) fma.s1 poly1 = S_hi, c, poly1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:  poly1  =  S_hi * c + poly1
-//
-(p12) fmpy.s1 S_lo = S_hi, poly1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:  S_lo  =  S_hi *  poly1
-//
-(p12) fma.s1 S_lo = P, r, S_lo
-(p12) tbit.z.unc p14, p15 = cot_flag, 0 ;; // p14=1 for tanl; p15=1 for cotl
-}
-
-{ .mfi
-      nop.m 999
-(p14) fadd.s0 Result = S_hi, S_lo           // for tanl
-      nop.i 999
-}
-{ .mfb
-      nop.m 999
-//
-//    N odd:  S_lo  =  S_lo + r * P
-//
-(p15) fms.s0 Result = S_hi, mOne, S_lo      // for cotl
-      br.ret.sptk b0 ;;      // Exit for 2^24 <= |x| < 2^63 and |s| < 2^-14
-}
-
-
-TANL_SMALL_R:
-// Here if |r| < 1/4
-// r and c have been computed.
-// *****************************************************************
-// *****************************************************************
-// *****************************************************************
-//    N odd:  S_hi = frcpa(r)
-//    Get [i_1] - lsb of N_fix_gr.  Set p11 if N even, p12 if N odd.
-//    N even: rsq = r * r
-{ .mfi
-      add table_ptr1 = 160, table_base    // Point to tanl_table_p1
-      frcpa.s1 S_hi, p0 = f1, r           // S_hi for N odd
-      add N_fix_gr = N_fix_gr, cot_flag   // N = N + 1 (for cotl)
-}
-{ .mfi
-      add table_ptr2 = 400, table_base    // Point to Q1_7
-      fmpy.s1 rsq = r, r
-      nop.i 999
-}
-;;
-
-{ .mmi
-      ldfe P1_1 = [table_ptr1], 16
-;;
-      ldfe P1_2 = [table_ptr1], 16
-      tbit.z p11, p12 = N_fix_gr, 0
-}
-;;
-
-
-{ .mfi
-      ldfe P1_3 = [table_ptr1], 96
-      nop.f 999
-      nop.i 999
-}
-;;
-
-{ .mfi
-(p11) ldfe P1_9 = [table_ptr1], -16
-(p12) fmerge.ns S_hi = S_hi, S_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p11) fmpy.s1 r_to_the_8 = rsq, rsq
-      nop.i 999
-}
-;;
-
-//
-//    N even: Poly2 = P1_7 + Poly2 * rsq
-//    N odd:  poly2 = Q1_5 + poly2 * rsq
-//
-{ .mfi
-(p11) ldfe P1_8 = [table_ptr1], -16
-(p11) fadd.s1 CORR = rsq, f1
-      nop.i 999
-}
-;;
-
-//
-//    N even: Poly1 = P1_2 + P1_3 * rsq
-//    N odd:  poly1 =  1.0 +  S_hi * r
-//    16 bits partial  account for necessary (-1)
-//
-{ .mmi
-(p11) ldfe P1_7 = [table_ptr1], -16
-;;
-(p11) ldfe P1_6 = [table_ptr1], -16
-      nop.i 999
-}
-;;
-
-//
-//    N even: Poly1 = P1_1 + Poly1 * rsq
-//    N odd:  S_hi  =  S_hi + S_hi * poly1)     16 bits account for necessary
-//
-//
-//    N even: Poly2 = P1_5 + Poly2 * rsq
-//    N odd:  poly2 = Q1_3 + poly2 * rsq
-//
-{ .mfi
-(p11) ldfe P1_5 = [table_ptr1], -16
-(p11) fmpy.s1 r_to_the_8 = r_to_the_8, r_to_the_8
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly1 =  S_hi, r, f1
-      nop.i 999
-}
-;;
-
-//
-//    N even: Poly1 =  Poly1 * rsq
-//    N odd:  poly1  = 1.0 + S_hi * r         32 bits partial
-//
-
-//
-//    N even: CORR =  CORR * c
-//    N odd:  S_hi  =  S_hi * poly1 + S_hi    32 bits
-//
-
-//
-//    N even: Poly2 = P1_6 + Poly2 * rsq
-//    N odd:  poly2 = Q1_4 + poly2 * rsq
-//
-
-{ .mmf
-(p11) ldfe P1_4 = [table_ptr1], -16
-      nop.m 999
-(p11) fmpy.s1 CORR =  CORR, c
-}
-;;
-
-{ .mfi
-      nop.m 999
-(p11) fma.s1 Poly1 = P1_3, rsq, P1_2
-      nop.i 999 ;;
-}
-{ .mfi
-(p12) ldfe Q1_7 = [table_ptr2], -16
-(p12) fma.s1 S_hi = S_hi, poly1, S_hi
-      nop.i 999 ;;
-}
-{ .mfi
-(p12) ldfe Q1_6 = [table_ptr2], -16
-(p11) fma.s1 Poly2 = P1_9, rsq, P1_8
-      nop.i 999 ;;
-}
-{ .mmi
-(p12) ldfe Q1_5 = [table_ptr2], -16 ;;
-(p12) ldfe Q1_4 = [table_ptr2], -16
-      nop.i 999 ;;
-}
-{ .mfi
-(p12) ldfe Q1_3 = [table_ptr2], -16
-//
-//    N even: Poly2 = P1_8 + P1_9 * rsq
-//    N odd:  poly2 = Q1_6 + Q1_7 * rsq
-//
-(p11) fma.s1 Poly1 = Poly1, rsq, P1_1
-      nop.i 999 ;;
-}
-{ .mfi
-(p12) ldfe Q1_2 = [table_ptr2], -16
-(p12) fma.s1 poly1 = S_hi, r, f1
-      nop.i 999 ;;
-}
-{ .mfi
-(p12) ldfe Q1_1 = [table_ptr2], -16
-(p11) fma.s1 Poly2 = Poly2, rsq, P1_7
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: CORR =  rsq + 1
-//    N even: r_to_the_8 =  rsq * rsq
-//
-(p11) fmpy.s1 Poly1 = Poly1, rsq
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 S_hi = S_hi, poly1, S_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly2 = Q1_7, rsq, Q1_6
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p11) fma.s1 Poly2 = Poly2, rsq, P1_6
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly1 = S_hi, r, f1
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly2 = poly2, rsq, Q1_5
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p11) fma.s1 Poly2= Poly2, rsq, P1_5
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 S_hi =  S_hi, poly1, S_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly2 = poly2, rsq, Q1_4
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: r_to_the_8 = r_to_the_8 * r_to_the_8
-//    N odd:  poly1  =  S_hi * r + 1.0       64 bits partial
-//
-(p11) fma.s1 Poly2 = Poly2, rsq, P1_4
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: Poly = CORR + Poly * r
-//    N odd:  P = Q1_1 + poly2 * rsq
-//
-(p12) fma.s1 poly1 = S_hi, r, f1
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly2 = poly2, rsq, Q1_3
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: Poly2 = P1_4 + Poly2 * rsq
-//    N odd:  poly2 = Q1_2 + poly2 * rsq
-//
-(p11) fma.s1 Poly = Poly2, r_to_the_8, Poly1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly1 = S_hi, c, poly1
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 poly2 = poly2, rsq, Q1_2
-      nop.i 999 ;;
-}
-
-{ .mfi
-      nop.m 999
-//
-//    N even: Poly = Poly1 + Poly2 * r_to_the_8
-//    N odd:  S_hi =  S_hi * poly1 + S_hi    64 bits
-//
-(p11) fma.s1 Poly = Poly, r, CORR
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: Result =  r + Poly  (User supplied rounding mode)
-//    N odd:  poly1  =  S_hi * c + poly1
-//
-(p12) fmpy.s1 S_lo = S_hi, poly1
-(p11) tbit.z.unc p14, p15 = cot_flag, 0 // p14=1 for tanl; p15=1 for cotl
-}
-{ .mfi
-      nop.m 999
-(p12) fma.s1 P = poly2, rsq, Q1_1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:  poly1  =  S_hi * r + 1.0
-//
-//
-//    N odd:  S_lo  =  S_hi *  poly1
-//
-(p14) fadd.s0 Result = Poly, r          // for tanl
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p15) fms.s0 Result = Poly, mOne, r     // for cotl
-      nop.i 999 ;;
-}
-
-{ .mfi
-      nop.m 999
-//
-//    N odd:  S_lo  =  Q1_1 * c + S_lo
-//
-(p12) fma.s1 S_lo = Q1_1, c, S_lo
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fmpy.s0 fp_tmp = fp_tmp, fp_tmp  // Dummy mult to set inexact
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd:  Result =  S_lo + r * P
-//
-(p12) fma.s1 Result = P, r, S_lo
-(p12) tbit.z.unc p14, p15 = cot_flag, 0 ;; // p14=1 for tanl; p15=1 for cotl
-}
-
-//
-//    N odd:  Result = Result + S_hi  (user supplied rounding mode)
-//
-{ .mfi
-      nop.m 999
-(p14) fadd.s0 Result = Result, S_hi         // for tanl
-      nop.i 999
-}
-{ .mfb
-      nop.m 999
-(p15) fms.s0 Result = Result, mOne, S_hi    // for cotl
-      br.ret.sptk b0 ;;              // Exit |r| < 1/4 path
-}
-
-
-TANL_NORMAL_R:
-// Here if 1/4 <= |x| < pi/4  or  if |x| >= 2^63 and |r| >= 1/4
-// *******************************************************************
-// *******************************************************************
-// *******************************************************************
-//
-//    r and c have been computed.
-//
-{ .mfi
-      nop.m 999
-      fand B = B_mask1, r
-      nop.i 999
-}
-;;
-
-TANL_NORMAL_R_A:
-// Enter here if pi/4 <= |x| < 2^63 and |r| >= 1/4
-//    Get the 5 bits or r for the lookup.   1.xxxxx ....
-{ .mmi
-      add table_ptr1 = 416, table_base     // Point to tanl_table_p2
-      mov GR_exp_2tom65 = 0xffff - 65      // Scaling constant for B
-      extr.u lookup = sig_r, 58, 5
-}
-;;
-
-{ .mmi
-      ldfe P2_1 = [table_ptr1], 16
-      setf.exp TWO_TO_NEG65 = GR_exp_2tom65  // 2^-65 for scaling B if exp_r=-2
-      add N_fix_gr = N_fix_gr, cot_flag      // N = N + 1 (for cotl)
-}
-;;
-
-.pred.rel "mutex",p11,p12
-//    B =  2^63 * 1.xxxxx 100...0
-{ .mfi
-      ldfe P2_2 = [table_ptr1], 16
-      for B = B_mask2, B
-      mov table_offset = 512               // Assume table offset is 512
-}
-;;
-
-{ .mfi
-      ldfe P2_3 = [table_ptr1], 16
-      fmerge.s  Pos_r = f1, r
-      tbit.nz p8,p9 = exp_r, 0
-}
-;;
-
-//    Is  B = 2** -2 or  B= 2** -1? If 2**-1, then
-//    we want an offset of 512 for table addressing.
-{ .mii
-      add table_ptr2 = 1296, table_base     // Point to tanl_table_cm2
-(p9)  shladd table_offset = lookup, 4, table_offset
-(p8)  shladd table_offset = lookup, 4, r0
-}
-;;
-
-{ .mmi
-      add table_ptr1 = table_ptr1, table_offset  // Point to T_hi
-      add table_ptr2 = table_ptr2, table_offset  // Point to C_hi
-      add table_ptr3 = 2128, table_base     // Point to tanl_table_scim2
-}
-;;
-
-{ .mmi
-      ldfd T_hi = [table_ptr1], 8                // Load T_hi
-;;
-      ldfd C_hi = [table_ptr2], 8                // Load C_hi
-      add table_ptr3 = table_ptr3, table_offset  // Point to SC_inv
-}
-;;
-
-//
-//    x = |r| - B
-//
-//   Convert B so it has the same exponent as Pos_r before subtracting
-{ .mfi
-      ldfs T_lo = [table_ptr1]                   // Load T_lo
-(p9)  fnma.s1 x = B, FR_2tom64, Pos_r
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p8)  fnma.s1 x = B, TWO_TO_NEG65, Pos_r
-      nop.i 999
-}
-;;
-
-{ .mfi
-      ldfs C_lo = [table_ptr2]                   // Load C_lo
-      nop.f 999
-      nop.i 999
-}
-;;
-
-{ .mfi
-      ldfe SC_inv = [table_ptr3]                 // Load SC_inv
-      fmerge.s  sgn_r = r, f1
-      tbit.z p11, p12 = N_fix_gr, 0              // p11 if N even, p12 if odd
-
-}
-;;
-
-//
-//    xsq = x * x
-//    N even: Tx = T_hi * x
-//
-//    N even: Tx1 = Tx + 1
-//    N odd:  Cx1 = 1 - Cx
-//
-
-{ .mfi
-      nop.m 999
-      fmpy.s1 xsq = x, x
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p11) fmpy.s1 Tx = T_hi, x
-      nop.i 999
-}
-;;
-
-//
-//    N odd: Cx = C_hi * x
-//
-{ .mfi
-      nop.m 999
-(p12) fmpy.s1 Cx = C_hi, x
-      nop.i 999
-}
-;;
-//
-//    N even and odd: P = P2_3 + P2_2 * xsq
-//
-{ .mfi
-      nop.m 999
-      fma.s1 P = P2_3, xsq, P2_2
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p11) fadd.s1 Tx1 = Tx, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: D = C_hi - tanx
-//    N odd: D = T_hi + tanx
-//
-(p11) fmpy.s1 CORR = SC_inv, T_hi
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 Sx = SC_inv, x
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fmpy.s1 CORR = SC_inv, C_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fsub.s1 V_hi = f1, Cx
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-      fma.s1 P = P, xsq, P2_1
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: P = P2_1 + P * xsq
-//
-(p11) fma.s1 V_hi = Tx, Tx1, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: Result  = sgn_r * tail + T_hi (user rounding mode for C1)
-//    N odd:  Result  = sgn_r * tail + C_hi (user rounding mode for C1)
-//
-      fmpy.s0 fp_tmp = fp_tmp, fp_tmp  // Dummy mult to set inexact
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 CORR = CORR, c
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fnma.s1 V_hi = Cx,V_hi,f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: V_hi = Tx * Tx1 + 1
-//    N odd: Cx1 = 1 - Cx * Cx1
-//
-      fmpy.s1 P = P, xsq
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: P = P * xsq
-//
-(p11) fmpy.s1 V_hi = V_hi, T_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: tail = P * tail + V_lo
-//
-(p11) fmpy.s1 T_hi = sgn_r, T_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-      fmpy.s1 CORR = CORR, sgn_r
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-(p12) fmpy.s1 V_hi = V_hi,C_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: V_hi = T_hi * V_hi
-//    N odd: V_hi  = C_hi * V_hi
-//
-      fma.s1 tanx = P, x, x
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fnmpy.s1 C_hi = sgn_r, C_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: V_lo = 1 - V_hi + C_hi
-//    N odd: V_lo = 1 - V_hi + T_hi
-//
-(p11) fadd.s1 CORR = CORR, T_lo
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fsub.s1 CORR = CORR, C_lo
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: tanx = x + x * P
-//    N even and odd: Sx = SC_inv * x
-//
-(p11) fsub.s1 D = C_hi, tanx
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fadd.s1 D = T_hi, tanx
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N odd: CORR = SC_inv * C_hi
-//    N even: CORR = SC_inv * T_hi
-//
-      fnma.s1 D = V_hi, D, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: D = 1 - V_hi * D
-//    N even and odd: CORR = CORR * c
-//
-      fma.s1 V_hi = V_hi, D, V_hi
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: V_hi = V_hi + V_hi * D
-//    N even and odd: CORR = sgn_r * CORR
-//
-(p11) fnma.s1 V_lo = V_hi, C_hi, f1
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fnma.s1 V_lo = V_hi, T_hi, f1
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: CORR = COOR + T_lo
-//    N odd: CORR = CORR - C_lo
-//
-(p11) fma.s1 V_lo = tanx, V_hi, V_lo
-      tbit.nz p15, p0 = cot_flag, 0       // p15=1 if we compute cotl
-}
-{ .mfi
-      nop.m 999
-(p12) fnma.s1 V_lo = tanx, V_hi, V_lo
-      nop.i 999 ;;
-}
-
-{ .mfi
-      nop.m 999
-(p15) fms.s1 T_hi = f0, f0, T_hi        // to correct result's sign for cotl
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p15) fms.s1 C_hi = f0, f0, C_hi        // to correct result's sign for cotl
-      nop.i 999
-};;
-
-{ .mfi
-      nop.m 999
-(p15) fms.s1 sgn_r = f0, f0, sgn_r      // to correct result's sign for cotl
-      nop.i 999
-};;
-
-{ .mfi
-      nop.m 999
-//
-//    N even: V_lo = V_lo + V_hi * tanx
-//    N odd: V_lo = V_lo - V_hi * tanx
-//
-(p11) fnma.s1 V_lo = C_lo, V_hi, V_lo
-      nop.i 999
-}
-{ .mfi
-      nop.m 999
-(p12) fnma.s1 V_lo = T_lo, V_hi, V_lo
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N  even: V_lo = V_lo - V_hi * C_lo
-//    N  odd: V_lo = V_lo - V_hi * T_lo
-//
-      fmpy.s1 V_lo = V_hi, V_lo
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: V_lo = V_lo * V_hi
-//
-      fadd.s1 tail = V_hi, V_lo
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: tail = V_hi + V_lo
-//
-      fma.s1 tail = tail, P, V_lo
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even: T_hi = sgn_r * T_hi
-//    N odd : C_hi = -sgn_r * C_hi
-//
-      fma.s1 tail = tail, Sx, CORR
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even and odd: tail = Sx * tail + CORR
-//
-      fma.s1 tail = V_hi, Sx, tail
-      nop.i 999 ;;
-}
-{ .mfi
-      nop.m 999
-//
-//    N even an odd: tail = Sx * V_hi + tail
-//
-(p11) fma.s0 Result = sgn_r, tail, T_hi
-      nop.i 999
-}
-{ .mfb
-      nop.m 999
-(p12) fma.s0 Result = sgn_r, tail, C_hi
-      br.ret.sptk b0 ;;                 // Exit for 1/4 <= |r| < pi/4
-}
-
-TANL_DENORMAL:
-// Here if x denormal
-{ .mfb
-      getf.exp GR_signexp_x = Norm_Arg          // Get sign and exponent of x
-      nop.f 999
-      br.cond.sptk TANL_COMMON                  // Return to common code
-}
-;;
-
-
-TANL_SPECIAL:
-TANL_UNSUPPORTED:
-//
-//     Code for NaNs, Unsupporteds, Infs, or +/- zero ?
-//     Invalid raised for Infs and SNaNs.
-//
-
-{ .mfi
-      nop.m 999
-      fmerge.s  f10 = f8, f8            // Save input for error call
-      tbit.nz p6, p7 = cot_flag, 0      // p6=1 if we compute cotl
-}
-;;
-
-{ .mfi
-      nop.m 999
-(p6)  fclass.m p6, p7 = f8, 0x7         // Test for zero (cotl only)
-      nop.i 999
-}
-;;
-
-.pred.rel "mutex", p6, p7
-{ .mfi
-(p6)  mov GR_Parameter_Tag = 225        // (cotl)
-(p6)  frcpa.s0  f8, p0 = f1, f8         // cotl(+-0) = +-Inf
-      nop.i 999
-}
-{ .mfb
-      nop.m 999
-(p7)  fmpy.s0 f8 = f8, f0
-(p7)  br.ret.sptk b0
-}
-;;
-
-GLOBAL_IEEE754_END(tanl)
-
-
-LOCAL_LIBM_ENTRY(__libm_error_region)
-.prologue
-
-// (1)
-{ .mfi
-      add           GR_Parameter_Y=-32,sp        // Parameter 2 value
-      nop.f         0
-.save   ar.pfs,GR_SAVE_PFS
-      mov           GR_SAVE_PFS=ar.pfs           // Save ar.pfs
-}
-{ .mfi
-.fframe 64
-      add sp=-64,sp                              // Create new stack
-      nop.f 0
-      mov GR_SAVE_GP=gp                          // Save gp
-};;
-
-// (2)
-{ .mmi
-      stfe [GR_Parameter_Y] = f1,16              // STORE Parameter 2 on stack
-      add GR_Parameter_X = 16,sp                 // Parameter 1 address
-.save   b0, GR_SAVE_B0
-      mov GR_SAVE_B0=b0                          // Save b0
-};;
-
-.body
-// (3)
-{ .mib
-      stfe [GR_Parameter_X] = f10                // STORE Parameter 1 on stack
-      add   GR_Parameter_RESULT = 0,GR_Parameter_Y  // Parameter 3 address
-      nop.b 0
-}
-{ .mib
-      stfe [GR_Parameter_Y] = f8                 // STORE Parameter 3 on stack
-      add   GR_Parameter_Y = -16,GR_Parameter_Y
-      br.call.sptk b0=__libm_error_support#      // Call error handling function
-};;
-{ .mmi
-      nop.m 0
-      nop.m 0
-      add   GR_Parameter_RESULT = 48,sp
-};;
-
-// (4)
-{ .mmi
-      ldfe  f8 = [GR_Parameter_RESULT]           // Get return result off stack
-.restore sp
-      add   sp = 64,sp                           // Restore stack pointer
-      mov   b0 = GR_SAVE_B0                      // Restore return address
-};;
-{ .mib
-      mov   gp = GR_SAVE_GP                      // Restore gp
-      mov   ar.pfs = GR_SAVE_PFS                 // Restore ar.pfs
-      br.ret.sptk     b0                         // Return
-};;
-
-LOCAL_LIBM_END(__libm_error_region)
-
-.type   __libm_error_support#,@function
-.global __libm_error_support#
-
-
-// *******************************************************************
-// *******************************************************************
-// *******************************************************************
-//
-//     Special Code to handle very large argument case.
-//     Call int __libm_pi_by_2_reduce(x,r,c) for |arguments| >= 2**63
-//     The interface is custom:
-//       On input:
-//         (Arg or x) is in f8
-//       On output:
-//         r is in f8
-//         c is in f9
-//         N is in r8
-//     We know also that __libm_pi_by_2_reduce preserves f10-15, f71-127.  We
-//     use this to eliminate save/restore of key fp registers in this calling
-//     function.
-//
-// *******************************************************************
-// *******************************************************************
-// *******************************************************************
-
-LOCAL_LIBM_ENTRY(__libm_callout)
-TANL_ARG_TOO_LARGE:
-.prologue
-{ .mfi
-      add table_ptr2 = 144, table_base        // Point to 2^-2
-      nop.f 999
-.save   ar.pfs,GR_SAVE_PFS
-      mov  GR_SAVE_PFS=ar.pfs                 // Save ar.pfs
-}
-;;
-
-//     Load 2^-2, -2^-2
-{ .mmi
-      ldfps  TWO_TO_NEG2, NEGTWO_TO_NEG2 = [table_ptr2]
-      setf.sig B_mask1 = bmask1               // Form mask to get 5 msb of r
-.save   b0, GR_SAVE_B0
-      mov GR_SAVE_B0=b0                       // Save b0
-};;
-
-.body
-//
-//     Call argument reduction with x in f8
-//     Returns with N in r8, r in f8, c in f9
-//     Assumes f71-127 are preserved across the call
-//
-{ .mib
-      setf.sig B_mask2 = bmask2               // Form mask to form B from r
-      mov GR_SAVE_GP=gp                       // Save gp
-      br.call.sptk b0=__libm_pi_by_2_reduce#
-}
-;;
-
-//
-//     Is |r| < 2**(-2)
-//
-{ .mfi
-      getf.sig sig_r = r                     // Extract significand of r
-      fcmp.lt.s1  p6, p0 = r, TWO_TO_NEG2
-      mov   gp = GR_SAVE_GP                  // Restore gp
-}
-;;
-
-{ .mfi
-      getf.exp exp_r = r                     // Extract signexp of r
-      nop.f 999
-      mov    b0 = GR_SAVE_B0                 // Restore return address
-}
-;;
-
-//
-//     Get N_fix_gr
-//
-{ .mfi
-      mov   N_fix_gr = r8
-(p6)  fcmp.gt.unc.s1  p6, p0 = r, NEGTWO_TO_NEG2
-      mov   ar.pfs = GR_SAVE_PFS             // Restore pfs
-}
-;;
-
-{ .mbb
-      nop.m 999
-(p6)  br.cond.spnt TANL_SMALL_R              // Branch if |r| < 1/4
-      br.cond.sptk TANL_NORMAL_R             // Branch if 1/4 <= |r| < pi/4
-}
-;;
-
-LOCAL_LIBM_END(__libm_callout)
-
-.type __libm_pi_by_2_reduce#,@function
-.global __libm_pi_by_2_reduce#