.file "sincosl.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
// 07/30/01 Improved speed on all paths
// 08/20/01 Fixed bundling typo
// 05/13/02 Changed interface to __libm_pi_by_2_reduce
// 02/10/03 Reordered header: .section, .global, .proc, .align;
//          used data8 for long double table values
// 10/13/03 Corrected final .endp name to match .proc
// 10/26/04 Avoided using r14-31 as scratch so not clobbered by dynamic loader
//
//*********************************************************************
//
// Function:   Combined sinl(x) and cosl(x), where
//
//             sinl(x) = sine(x), for double-extended precision x values
//             cosl(x) = cosine(x), for double-extended precision x values
//
//*********************************************************************
//
// Resources Used:
//
//    Floating-Point Registers: f8 (Input and Return Value)
//                              f32-f99
//
//    General Purpose Registers:
//      r32-r58
//
//    Predicate Registers:      p6-p13
//
//*********************************************************************
//
//  IEEE Special Conditions:
//
//    Denormal  fault raised on denormal inputs
//    Overflow exceptions do not occur
//    Underflow exceptions raised when appropriate for sin
//    (No specialized error handling for this routine)
//    Inexact raised when appropriate by algorithm
//
//    sinl(SNaN) = QNaN
//    sinl(QNaN) = QNaN
//    sinl(inf) = QNaN
//    sinl(+/-0) = +/-0
//    cosl(inf) = QNaN
//    cosl(SNaN) = QNaN
//    cosl(QNaN) = QNaN
//    cosl(0) = 1
//
//*********************************************************************
//
//  Mathematical Description
//  ========================
//
//  The computation of FSIN and FCOS is best handled in one piece of
//  code. The main reason is that given any argument Arg, computation
//  of trigonometric functions first calculate N and an approximation
//  to alpha where
//
//  Arg = N pi/2 + alpha, |alpha| <= pi/4.
//
//  Since
//
//  cosl( Arg ) = sinl( (N+1) pi/2 + alpha ),
//
//  therefore, the code for computing sine will produce cosine as long
//  as 1 is added to N immediately after the argument reduction
//  process.
//
//  Let M = N if sine
//      N+1 if cosine.
//
//  Now, given
//
//  Arg = M pi/2  + alpha, |alpha| <= pi/4,
//
//  let I = M mod 4, or I be the two lsb of M when M is represented
//  as 2's complement. I = [i_0 i_1]. Then
//
//  sinl( Arg ) = (-1)^i_0  sinl( alpha )        if i_1 = 0,
//             = (-1)^i_0  cosl( alpha )     if i_1 = 1.
//
//  For example:
//       if M = -1, I = 11
//         sin ((-pi/2 + alpha) = (-1) cos (alpha)
//       if M = 0, I = 00
//         sin (alpha) = sin (alpha)
//       if M = 1, I = 01
//         sin (pi/2 + alpha) = cos (alpha)
//       if M = 2, I = 10
//         sin (pi + alpha) = (-1) sin (alpha)
//       if M = 3, I = 11
//         sin ((3/2)pi + alpha) = (-1) cos (alpha)
//
//  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, sinl(r+c) and cosl(r+c) can be
//  computed very easily by 2 or 3 terms of the Taylor series
//  expansion as follows:
//
//  Case 2:
//  -------
//
//  sinl(r + c) = r + c - r^3/6        accurately
//  cosl(r + c) = 1 - 2^(-67)        accurately
//
//  Case 4:
//  -------
//
//  sinl(r + c) = r + c - r^3/6 + r^5/120        accurately
//  cosl(r + c) = 1 - r^2/2 + r^4/24                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 required calculation is either
//
//  sinl(r + c)  =  sinl(r)  +  correction,  or
//  cosl(r + c)  =  cosl(r)  +  correction.
//
//  Specifically,
//
//        sinl(r + c) = sinl(r) + c sin'(r) + O(c^2)
//                   = sinl(r) + c cos (r) + O(c^2)
//                   = sinl(r) + c(1 - r^2/2)  accurately.
//  Similarly,
//
//        cosl(r + c) = cosl(r) - c sinl(r) + O(c^2)
//                   = cosl(r) - c(r - r^3/6)  accurately.
//
//  We therefore concentrate on accurately calculating sinl(r) and
//  cosl(r) for a working-precision number r, |r| <= pi/4 to within
//  0.1% or so.
//
//  The greatest challenge of this task is that the second terms of
//  the Taylor series
//
//        r - r^3/3! + r^r/5! - ...
//
//  and
//
//        1 - r^2/2! + r^4/4! - ...
//
//  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^-3, however, the second terms will be small
//  enough (6 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 sinl(r) and cosl(r), |r| <= pi/4.
//
//  Case small_r: |r| < 2^(-3)
//  --------------------------
//
//  Since Arg = M pi/4 + r + c accurately, and M mod 4 is [i_0 i_1],
//  we have
//
//        sinl(Arg) = (-1)^i_0 * sinl(r + c)        if i_1 = 0
//                 = (-1)^i_0 * cosl(r + c)         if i_1 = 1
//
//  can be accurately approximated by
//
//  sinl(Arg) = (-1)^i_0 * [sinl(r) + c]        if i_1 = 0
//           = (-1)^i_0 * [cosl(r) - c*r] if i_1 = 1
//
//  because |r| is small and thus the second terms in the correction
//  are unneccessary.
//
//  Finally, sinl(r) and cosl(r) are approximated by polynomials of
//  moderate lengths.
//
//  sinl(r) =  r + S_1 r^3 + S_2 r^5 + ... + S_5 r^11
//  cosl(r) =  1 + C_1 r^2 + C_2 r^4 + ... + C_5 r^10
//
//  We can make use of predicates to selectively calculate
//  sinl(r) or cosl(r) based on i_1.
//
//  Case normal_r: 2^(-3) <= |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]. Again,
//
//  sinl(Arg) = (-1)^i_0 * sinl(r + c)        if i_1 = 0
//           = (-1)^i_0 * cosl(r + c)         if i_1 = 1.
//
//  Because |r| is now larger, we need one extra term in the
//  correction. sinl(Arg) can be accurately approximated by
//
//  sinl(Arg) = (-1)^i_0 * [sinl(r) + c(1-r^2/2)]      if i_1 = 0
//           = (-1)^i_0 * [cosl(r) - c*r*(1 - r^2/6)]    i_1 = 1.
//
//  Finally, sinl(r) and cosl(r) are approximated by polynomials of
//  moderate lengths.
//
//        sinl(r) =  r + PP_1_hi r^3 + PP_1_lo r^3 +
//                      PP_2 r^5 + ... + PP_8 r^17
//
//        cosl(r) =  1 + QQ_1 r^2 + QQ_2 r^4 + ... + QQ_8 r^16
//
//  where PP_1_hi is only about 16 bits long and QQ_1 is -1/2.
//  The crux in accurate computation is to calculate
//
//  r + PP_1_hi r^3   or  1 + QQ_1 r^2
//
//  accurately as two pieces: U_hi and U_lo. The way to achieve this
//  is to obtain r_hi as a 10 sig. bit number that approximates r to
//  roughly 8 bits or so of accuracy. (One convenient way is
//
//  r_hi := frcpa( frcpa( r ) ).)
//
//  This way,
//
//        r + PP_1_hi r^3 =  r + PP_1_hi r_hi^3 +
//                                PP_1_hi (r^3 - r_hi^3)
//                        =  [r + PP_1_hi r_hi^3]  +
//                           [PP_1_hi (r - r_hi)
//                              (r^2 + r_hi r + r_hi^2) ]
//                        =  U_hi  +  U_lo
//
//  Since r_hi is only 10 bit long and PP_1_hi is only 16 bit long,
//  PP_1_hi * r_hi^3 is only at most 46 bit long and thus computed
//  exactly. Furthermore, r and PP_1_hi r_hi^3 are of opposite sign
//  and that there is no more than 8 bit shift off between r and
//  PP_1_hi * r_hi^3. Hence the sum, U_hi, is representable and thus
//  calculated without any error. Finally, the fact that
//
//        |U_lo| <= 2^(-8) |U_hi|
//
//  says that U_hi + U_lo is approximating r + PP_1_hi r^3 to roughly
//  8 extra bits of accuracy.
//
//  Similarly,
//
//        1 + QQ_1 r^2  =  [1 + QQ_1 r_hi^2]  +
//                            [QQ_1 (r - r_hi)(r + r_hi)]
//                      =  U_hi  +  U_lo.
//
//  Summarizing, we calculate r_hi = frcpa( frcpa( r ) ).
//
//  If i_1 = 0, then
//
//    U_hi := r + PP_1_hi * r_hi^3
//    U_lo := PP_1_hi * (r - r_hi) * (r^2 + r*r_hi + r_hi^2)
//    poly := PP_1_lo r^3 + PP_2 r^5 + ... + PP_8 r^17
//    correction := c * ( 1 + C_1 r^2 )
//
//  Else ...i_1 = 1
//
//    U_hi := 1 + QQ_1 * r_hi * r_hi
//    U_lo := QQ_1 * (r - r_hi) * (r + r_hi)
//    poly := QQ_2 * r^4 + QQ_3 * r^6 + ... + QQ_8 r^16
//    correction := -c * r * (1 + S_1 * r^2)
//
//  End
//
//  Finally,
//
//        V := poly + ( U_lo + correction )
//
//                 /    U_hi  +  V         if i_0 = 0
//        result := |
//                 \  (-U_hi) -  V         if i_0 = 1
//
//  It is important that in the last step, negation of U_hi is
//  performed prior to the subtraction which is to be performed in
//  the user-set rounding mode.
//
//
//  Algorithmic Description
//  =======================
//
//  The argument reduction algorithm is tightly integrated into FSIN
//  and FCOS which share the same code. The following is complete and
//  self-contained. The argument reduction description given
//  previously is repeated below.
//
//
//  Step 0. Initialization.
//
//   If FSIN is invoked, set N_inc := 0; else if FCOS is invoked,
//   set N_inc := 1.
//
//  Step 1. Check for exceptional and special cases.
//
//   * If Arg is +-0, +-inf, NaN, NaT, go to Step 10 for special
//     handling.
//   * If |Arg| < 2^24, go to Step 2 for reduction of moderate
//     arguments. This is the most likely case.
//   * If |Arg| < 2^63, go to Step 8 for pre-reduction of large
//     arguments.
//   * If |Arg| >= 2^63, go to Step 10 for special handling.
//
//  Step 2. Reduction of moderate arguments.
//
//  If |Arg| < pi/4         ...quick branch
//     N_fix := N_inc        (integer)
//     r     := Arg
//     c     := 0.0
//     Branch to Step 4, Case_1_complete
//  Else                 ...cf. argument reduction
//     N     := Arg * two_by_PI        (fp)
//     N_fix := fcvt.fx( N )        (int)
//     N     := fcvt.xf( N_fix )
//     N_fix := N_fix + N_inc
//     s     := Arg - N * P_1        (first piece of pi/2)
//     w     := -N * P_2        (second piece of pi/2)
//
//     If |s| >= 2^(-33)
//        go to Step 3, Case_1_reduce
//     Else
//        go to Step 7, Case_2_reduce
//     Endif
//  Endif
//
//  Step 3. Case_1_reduce.
//
//  r := s + w
//  c := (s - r) + w        ...observe order
//
//  Step 4. Case_1_complete
//
//  ...At this point, the reduced argument alpha is
//  ...accurately represented as r + c.
//  If |r| < 2^(-3), go to Step 6, small_r.
//
//  Step 5. Normal_r.
//
//  Let [i_0 i_1] by the 2 lsb of N_fix.
//  FR_rsq  := r * r
//  r_hi := frcpa( frcpa( r ) )
//  r_lo := r - r_hi
//
//  If i_1 = 0, then
//    poly := r*FR_rsq*(PP_1_lo + FR_rsq*(PP_2 + ... FR_rsq*PP_8))
//    U_hi := r + PP_1_hi*r_hi*r_hi*r_hi        ...any order
//    U_lo := PP_1_hi*r_lo*(r*r + r*r_hi + r_hi*r_hi)
//    correction := c + c*C_1*FR_rsq                ...any order
//  Else
//    poly := FR_rsq*FR_rsq*(QQ_2 + FR_rsq*(QQ_3 + ... + FR_rsq*QQ_8))
//    U_hi := 1 + QQ_1 * r_hi * r_hi                ...any order
//    U_lo := QQ_1 * r_lo * (r + r_hi)
//    correction := -c*(r + S_1*FR_rsq*r)        ...any order
//  Endif
//
//  V := poly + (U_lo + correction)        ...observe order
//
//  result := (i_0 == 0?   1.0 : -1.0)
//
//  Last instruction in user-set rounding mode
//
//  result := (i_0 == 0?   result*U_hi + V :
//                        result*U_hi - V)
//
//  Return
//
//  Step 6. Small_r.
//
//  ...Use flush to zero mode without causing exception
//    Let [i_0 i_1] be the two lsb of N_fix.
//
//  FR_rsq := r * r
//
//  If i_1 = 0 then
//     z := FR_rsq*FR_rsq; z := FR_rsq*z *r
//     poly_lo := S_3 + FR_rsq*(S_4 + FR_rsq*S_5)
//     poly_hi := r*FR_rsq*(S_1 + FR_rsq*S_2)
//     correction := c
//     result := r
//  Else
//     z := FR_rsq*FR_rsq; z := FR_rsq*z
//     poly_lo := C_3 + FR_rsq*(C_4 + FR_rsq*C_5)
//     poly_hi := FR_rsq*(C_1 + FR_rsq*C_2)
//     correction := -c*r
//     result := 1
//  Endif
//
//  poly := poly_hi + (z * poly_lo + correction)
//
//  If i_0 = 1, result := -result
//
//  Last operation. Perform in user-set rounding mode
//
//  result := (i_0 == 0?     result + poly :
//                          result - poly )
//  Return
//
//  Step 7. Case_2_reduce.
//
//  ...Refer to the write up for argument reduction for
//  ...rationale. The reduction algorithm below is taken from
//  ...argument reduction description and integrated this.
//
//  w := N*P_3
//  U_1 := N*P_2 + w                ...FMA
//  U_2 := (N*P_2 - U_1) + w        ...2 FMA
//  ...U_1 + U_2 is  N*(P_2+P_3) accurately
//
//  r := s - U_1
//  c := ( (s - r) - U_1 ) - U_2
//
//  ...The mathematical sum r + c approximates the reduced
//  ...argument accurately. Note that although compared to
//  ...Case 1, this case requires much more work to reduce
//  ...the argument, the subsequent calculation needed for
//  ...any of the trigonometric function is very little because
//  ...|alpha| < 1.01*2^(-33) and thus two terms of the
//  ...Taylor series expansion suffices.
//
//  If i_1 = 0 then
//     poly := c + S_1 * r * r * r        ...any order
//     result := r
//  Else
//     poly := -2^(-67)
//     result := 1.0
//  Endif
//
//  If i_0 = 1, result := -result
//
//  Last operation. Perform in user-set rounding mode
//
//  result := (i_0 == 0?     result + poly :
//                           result - poly )
//
//  Return
//
//
//  Step 8. Pre-reduction of large arguments.
//
//  ...Again, the following reduction procedure was described
//  ...in the separate write up for argument reduction, which
//  ...is tightly integrated here.

//  N_0 := Arg * Inv_P_0
//  N_0_fix := fcvt.fx( N_0 )
//  N_0 := fcvt.xf( N_0_fix)

//  Arg' := Arg - N_0 * P_0
//  w := N_0 * d_1
//  N := Arg' * two_by_PI
//  N_fix := fcvt.fx( N )
//  N := fcvt.xf( N_fix )
//  N_fix := N_fix + N_inc
//
//  s := Arg' - N * P_1
//  w := w - N * P_2
//
//  If |s| >= 2^(-14)
//     go to Step 3
//  Else
//     go to Step 9
//  Endif
//
//  Step 9. Case_4_reduce.
//
//    ...first obtain N_0*d_1 and -N*P_2 accurately
//   U_hi := N_0 * d_1                V_hi := -N*P_2
//   U_lo := N_0 * d_1 - U_hi        V_lo := -N*P_2 - U_hi        ...FMAs
//
//   ...compute the contribution from N_0*d_1 and -N*P_3
//   w := -N*P_3
//   w := w + N_0*d_2
//   t := U_lo + V_lo + w                ...any order
//
//   ...at this point, the mathematical value
//   ...s + U_hi + V_hi  + t approximates the true reduced argument
//   ...accurately. Just need to compute this accurately.
//
//   ...Calculate U_hi + V_hi accurately:
//   A := U_hi + V_hi
//   if |U_hi| >= |V_hi| then
//      a := (U_hi - A) + V_hi
//   else
//      a := (V_hi - A) + U_hi
//   endif
//   ...order in computing "a" must be observed. This branch is
//   ...best implemented by predicates.
//   ...A + a  is U_hi + V_hi accurately. Moreover, "a" is
//   ...much smaller than A: |a| <= (1/2)ulp(A).
//
//   ...Just need to calculate   s + A + a + t
//   C_hi := s + A                t := t + a
//   C_lo := (s - C_hi) + A
//   C_lo := C_lo + t
//
//   ...Final steps for reduction
//   r := C_hi + C_lo
//   c := (C_hi - r) + C_lo
//
//   ...At this point, we have r and c
//   ...And all we need is a couple of terms of the corresponding
//   ...Taylor series.
//
//   If i_1 = 0
//      poly := c + r*FR_rsq*(S_1 + FR_rsq*S_2)
//      result := r
//   Else
//      poly := FR_rsq*(C_1 + FR_rsq*C_2)
//      result := 1
//   Endif
//
//   If i_0 = 1, result := -result
//
//   Last operation. Perform in user-set rounding mode
//
//   result := (i_0 == 0?     result + poly :
//                            result - poly )
//   Return
//
//   Large Arguments: For arguments above 2**63, a Payne-Hanek
//   style argument reduction is used and pi_by_2 reduce is called.
//


RODATA
.align 16

LOCAL_OBJECT_START(FSINCOSL_CONSTANTS)

sincosl_table_p:
data8 0xA2F9836E4E44152A, 0x00003FFE // Inv_pi_by_2
data8 0xC84D32B0CE81B9F1, 0x00004016 // P_0
data8 0xC90FDAA22168C235, 0x00003FFF // P_1
data8 0xECE675D1FC8F8CBB, 0x0000BFBD // P_2
data8 0xB7ED8FBBACC19C60, 0x0000BF7C // P_3
data8 0x8D848E89DBD171A1, 0x0000BFBF // d_1
data8 0xD5394C3618A66F8E, 0x0000BF7C // d_2
LOCAL_OBJECT_END(FSINCOSL_CONSTANTS)

LOCAL_OBJECT_START(sincosl_table_d)
data8 0xC90FDAA22168C234, 0x00003FFE // pi_by_4
data8 0xA397E5046EC6B45A, 0x00003FE7 // Inv_P_0
data4 0x3E000000, 0xBE000000         // 2^-3 and -2^-3
data4 0x2F000000, 0xAF000000         // 2^-33 and -2^-33
data4 0x9E000000, 0x00000000         // -2^-67
data4 0x00000000, 0x00000000         // pad
LOCAL_OBJECT_END(sincosl_table_d)

LOCAL_OBJECT_START(sincosl_table_pp)
data8 0xCC8ABEBCA21C0BC9, 0x00003FCE // PP_8
data8 0xD7468A05720221DA, 0x0000BFD6 // PP_7
data8 0xB092382F640AD517, 0x00003FDE // PP_6
data8 0xD7322B47D1EB75A4, 0x0000BFE5 // PP_5
data8 0xFFFFFFFFFFFFFFFE, 0x0000BFFD // C_1
data8 0xAAAA000000000000, 0x0000BFFC // PP_1_hi
data8 0xB8EF1D2ABAF69EEA, 0x00003FEC // PP_4
data8 0xD00D00D00D03BB69, 0x0000BFF2 // PP_3
data8 0x8888888888888962, 0x00003FF8 // PP_2
data8 0xAAAAAAAAAAAB0000, 0x0000BFEC // PP_1_lo
LOCAL_OBJECT_END(sincosl_table_pp)

LOCAL_OBJECT_START(sincosl_table_qq)
data8 0xD56232EFC2B0FE52, 0x00003FD2 // QQ_8
data8 0xC9C99ABA2B48DCA6, 0x0000BFDA // QQ_7
data8 0x8F76C6509C716658, 0x00003FE2 // QQ_6
data8 0x93F27DBAFDA8D0FC, 0x0000BFE9 // QQ_5
data8 0xAAAAAAAAAAAAAAAA, 0x0000BFFC // S_1
data8 0x8000000000000000, 0x0000BFFE // QQ_1
data8 0xD00D00D00C6E5041, 0x00003FEF // QQ_4
data8 0xB60B60B60B607F60, 0x0000BFF5 // QQ_3
data8 0xAAAAAAAAAAAAAA9B, 0x00003FFA // QQ_2
LOCAL_OBJECT_END(sincosl_table_qq)

LOCAL_OBJECT_START(sincosl_table_c)
data8 0xFFFFFFFFFFFFFFFE, 0x0000BFFD // C_1
data8 0xAAAAAAAAAAAA719F, 0x00003FFA // C_2
data8 0xB60B60B60356F994, 0x0000BFF5 // C_3
data8 0xD00CFFD5B2385EA9, 0x00003FEF // C_4
data8 0x93E4BD18292A14CD, 0x0000BFE9 // C_5
LOCAL_OBJECT_END(sincosl_table_c)

LOCAL_OBJECT_START(sincosl_table_s)
data8 0xAAAAAAAAAAAAAAAA, 0x0000BFFC // S_1
data8 0x88888888888868DB, 0x00003FF8 // S_2
data8 0xD00D00D0055EFD4B, 0x0000BFF2 // S_3
data8 0xB8EF1C5D839730B9, 0x00003FEC // S_4
data8 0xD71EA3A4E5B3F492, 0x0000BFE5 // S_5
data4 0x38800000, 0xB8800000                        // two**-14 and -two**-14
LOCAL_OBJECT_END(sincosl_table_s)

FR_Input_X        = f8
FR_Result         = f8

FR_r              = f8
FR_c              = f9

FR_norm_x         = f9
FR_inv_pi_2to63   = f10
FR_rshf_2to64     = f11
FR_2tom64         = f12
FR_rshf           = f13
FR_N_float_signif = f14
FR_abs_x          = f15
FR_Pi_by_4        = f34
FR_Two_to_M14     = f35
FR_Neg_Two_to_M14 = f36
FR_Two_to_M33     = f37
FR_Neg_Two_to_M33 = f38
FR_Neg_Two_to_M67 = f39
FR_Inv_pi_by_2    = f40
FR_N_float        = f41
FR_N_fix          = f42
FR_P_1            = f43
FR_P_2            = f44
FR_P_3            = f45
FR_s              = f46
FR_w              = f47
FR_d_2            = f48
FR_tmp_result     = f49
FR_Z              = f50
FR_A              = f51
FR_a              = f52
FR_t              = f53
FR_U_1            = f54
FR_U_2            = f55
FR_C_1            = f56
FR_C_2            = f57
FR_C_3            = f58
FR_C_4            = f59
FR_C_5            = f60
FR_S_1            = f61
FR_S_2            = f62
FR_S_3            = f63
FR_S_4            = f64
FR_S_5            = f65
FR_poly_hi        = f66
FR_poly_lo        = f67
FR_r_hi           = f68
FR_r_lo           = f69
FR_rsq            = f70
FR_r_cubed        = f71
FR_C_hi           = f72
FR_N_0            = f73
FR_d_1            = f74
FR_V              = f75
FR_V_hi           = f75
FR_V_lo           = f76
FR_U_hi           = f77
FR_U_lo           = f78
FR_U_hiabs        = f79
FR_V_hiabs        = f80
FR_PP_8           = f81
FR_QQ_8           = f101
FR_PP_7           = f82
FR_QQ_7           = f102
FR_PP_6           = f83
FR_QQ_6           = f103
FR_PP_5           = f84
FR_QQ_5           = f104
FR_PP_4           = f85
FR_QQ_4           = f105
FR_PP_3           = f86
FR_QQ_3           = f106
FR_PP_2           = f87
FR_QQ_2           = f107
FR_QQ_1           = f108
FR_r_hi_sq        = f88
FR_N_0_fix        = f89
FR_Inv_P_0        = f90
FR_corr           = f91
FR_poly           = f92
FR_Neg_Two_to_M3  = f93
FR_Two_to_M3      = f94
FR_P_0            = f95
FR_C_lo           = f96
FR_PP_1           = f97
FR_PP_1_lo        = f98
FR_ArgPrime       = f99
FR_inexact        = f100

GR_exp_m2_to_m3= r36
GR_N_Inc       = r37
GR_Sin_or_Cos  = r38
GR_signexp_x   = r40
GR_exp_x       = r40
GR_exp_mask    = r41
GR_exp_2_to_63 = r42
GR_exp_2_to_m3 = r43
GR_exp_2_to_24 = r44

GR_sig_inv_pi  = r45
GR_rshf_2to64  = r46
GR_exp_2tom64  = r47
GR_rshf        = r48
GR_ad_p        = r49
GR_ad_d        = r50
GR_ad_pp       = r51
GR_ad_qq       = r52
GR_ad_c        = r53
GR_ad_s        = r54
GR_ad_ce       = r55
GR_ad_se       = r56
GR_ad_m14      = r57
GR_ad_s1       = r58

// Added for unwind support

GR_SAVE_B0     = r39
GR_SAVE_GP     = r40
GR_SAVE_PFS    = r41


.section .text

GLOBAL_IEEE754_ENTRY(sinl)
{ .mlx
      alloc r32 = ar.pfs,0,27,2,0
      movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
}
{ .mlx
      mov GR_Sin_or_Cos = 0x0
      movl GR_rshf_2to64 = 0x47e8000000000000 // 1.1000 2^(63+64)
}
;;

{ .mfi
      addl           GR_ad_p   = @ltoff(FSINCOSL_CONSTANTS#), gp
      fclass.m p6, p0 =  FR_Input_X, 0x1E3 // Test x natval, nan, inf
      mov GR_exp_2_to_m3 = 0xffff - 3      // Exponent of 2^-3
}
{ .mfb
      nop.m 999
      fnorm.s1 FR_norm_x = FR_Input_X      // Normalize x
      br.cond.sptk SINCOSL_CONTINUE
}
;;

GLOBAL_IEEE754_END(sinl)
libm_alias_ldouble_other (__sin, sin)

GLOBAL_IEEE754_ENTRY(cosl)
{ .mlx
      alloc r32 = ar.pfs,0,27,2,0
      movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi
}
{ .mlx
      mov GR_Sin_or_Cos = 0x1
      movl GR_rshf_2to64 = 0x47e8000000000000 // 1.1000 2^(63+64)
}
;;

{ .mfi
      addl           GR_ad_p   = @ltoff(FSINCOSL_CONSTANTS#), gp
      fclass.m p6, p0 =  FR_Input_X, 0x1E3 // Test x natval, nan, inf
      mov GR_exp_2_to_m3 = 0xffff - 3      // Exponent of 2^-3
}
{ .mfi
      nop.m 999
      fnorm.s1 FR_norm_x = FR_Input_X      // Normalize x
      nop.i 999
}
;;

SINCOSL_CONTINUE:
{ .mfi
      setf.sig FR_inv_pi_2to63 = GR_sig_inv_pi // Form 1/pi * 2^63
      nop.f 999
      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
}
;;

{ .mfi
      ld8 GR_ad_p = [GR_ad_p]              // Point to Inv_pi_by_2
      fclass.m p7, p0 = FR_Input_X, 0x0b   // Test x denormal
      nop.i 999
}
;;

{ .mfi
      getf.exp GR_signexp_x = FR_Input_X   // Get sign and exponent of x
      fclass.m p10, p0 = FR_Input_X, 0x007 // Test x zero
      nop.i 999
}
{ .mib
      mov GR_exp_mask = 0x1ffff            // Exponent mask
      nop.i 999
(p6)  br.cond.spnt SINCOSL_SPECIAL         // Branch if x natval, nan, inf
}
;;

{ .mfi
      setf.exp FR_2tom64 = GR_exp_2tom64   // Form 2^-64 for scaling N_float
      nop.f 0
      add GR_ad_d = 0x70, GR_ad_p          // Point to constant table d
}
{ .mib
      setf.d FR_rshf = GR_rshf         // Form right shift const 1.1000 * 2^63
      mov  GR_exp_m2_to_m3 = 0x2fffc       // Form -(2^-3)
(p7)  br.cond.spnt SINCOSL_DENORMAL        // Branch if x denormal
}
;;

SINCOSL_COMMON:
{ .mfi
      and GR_exp_x = GR_exp_mask, GR_signexp_x // Get exponent of x
      fclass.nm p8, p0 = FR_Input_X, 0x1FF // Test x unsupported type
      mov GR_exp_2_to_63 = 0xffff + 63     // Exponent of 2^63
}
{ .mib
      add GR_ad_pp = 0x40, GR_ad_d         // Point to constant table pp
      mov GR_exp_2_to_24 = 0xffff + 24     // Exponent of 2^24
(p10) br.cond.spnt SINCOSL_ZERO            // Branch if x zero
}
;;

{ .mfi
      ldfe FR_Inv_pi_by_2 = [GR_ad_p], 16  // Load 2/pi
      fcmp.eq.s0 p15, p0 = FR_Input_X, f0  // Dummy to set denormal
      add GR_ad_qq = 0xa0, GR_ad_pp        // Point to constant table qq
}
{ .mfi
      ldfe FR_Pi_by_4 = [GR_ad_d], 16      // Load pi/4 for range test
      nop.f 999
      cmp.ge p10,p0 = GR_exp_x, GR_exp_2_to_63   // Is |x| >= 2^63
}
;;

{ .mfi
      ldfe FR_P_0 = [GR_ad_p], 16          // Load P_0 for pi/4 <= |x| < 2^63
      fmerge.s FR_abs_x = f1, FR_norm_x    // |x|
      add GR_ad_c = 0x90, GR_ad_qq         // Point to constant table c
}
{ .mfi
      ldfe FR_Inv_P_0 = [GR_ad_d], 16      // Load 1/P_0 for pi/4 <= |x| < 2^63
      nop.f 999
      cmp.ge p7,p0 = GR_exp_x, GR_exp_2_to_24   // Is |x| >= 2^24
}
;;

{ .mfi
      ldfe FR_P_1 = [GR_ad_p], 16          // Load P_1 for pi/4 <= |x| < 2^63
      nop.f 999
      add GR_ad_s = 0x50, GR_ad_c          // Point to constant table s
}
{ .mfi
      ldfe FR_PP_8 = [GR_ad_pp], 16        // Load PP_8 for 2^-3 < |r| < pi/4
      nop.f 999
      nop.i 999
}
;;

{ .mfi
      ldfe FR_P_2 = [GR_ad_p], 16          // Load P_2 for pi/4 <= |x| < 2^63
      nop.f 999
      add GR_ad_ce = 0x40, GR_ad_c         // Point to end of constant table c
}
{ .mfi
      ldfe FR_QQ_8 = [GR_ad_qq], 16        // Load QQ_8 for 2^-3 < |r| < pi/4
      nop.f 999
      nop.i 999
}
;;

{ .mfi
      ldfe FR_QQ_7 = [GR_ad_qq], 16        // Load QQ_7 for 2^-3 < |r| < pi/4
      fma.s1        FR_N_float_signif = FR_Input_X, FR_inv_pi_2to63, FR_rshf_2to64
      add GR_ad_se = 0x40, GR_ad_s         // Point to end of constant table s
}
{ .mib
      ldfe FR_PP_7 = [GR_ad_pp], 16        // Load PP_7 for 2^-3 < |r| < pi/4
      mov GR_ad_s1 = GR_ad_s               // Save pointer to S_1
(p10) br.cond.spnt SINCOSL_ARG_TOO_LARGE   // Branch if |x| >= 2^63
                                           // Use Payne-Hanek Reduction
}
;;

{ .mfi
      ldfe FR_P_3 = [GR_ad_p], 16          // Load P_3 for pi/4 <= |x| < 2^63
      fmerge.se FR_r = FR_norm_x, FR_norm_x // r = x, in case |x| < pi/4
      add GR_ad_m14 = 0x50, GR_ad_s        // Point to constant table m14
}
{ .mfb
      ldfps FR_Two_to_M3, FR_Neg_Two_to_M3 = [GR_ad_d], 8
      fma.s1 FR_rsq = FR_norm_x, FR_norm_x, f0 // rsq = x*x, in case |x| < pi/4
(p7)  br.cond.spnt SINCOSL_LARGER_ARG      // Branch if 2^24 <= |x| < 2^63
                                           // Use pre-reduction
}
;;

{ .mmf
      ldfe FR_PP_6 = [GR_ad_pp], 16       // Load PP_6 for normal path
      ldfe FR_QQ_6 = [GR_ad_qq], 16       // Load QQ_6 for normal path
      fmerge.se FR_c = f0, f0             // c = 0 in case |x| < pi/4
}
;;

{ .mmf
      ldfe FR_PP_5 = [GR_ad_pp], 16       // Load PP_5 for normal path
      ldfe FR_QQ_5 = [GR_ad_qq], 16       // Load QQ_5 for normal path
      nop.f 999
}
;;

// Here if 0 < |x| < 2^24
{ .mfi
      ldfe FR_S_5 = [GR_ad_se], -16       // Load S_5 if i_1=0
      fcmp.lt.s1  p6, p7 = FR_abs_x, FR_Pi_by_4  // Test |x| < pi/4
      nop.i 999
}
{ .mfi
      ldfe FR_C_5 = [GR_ad_ce], -16       // Load C_5 if i_1=1
      fms.s1 FR_N_float = FR_N_float_signif, FR_2tom64, FR_rshf
      nop.i 999
}
;;

{ .mmi
      ldfe FR_S_4 = [GR_ad_se], -16       // Load S_4 if i_1=0
      ldfe FR_C_4 = [GR_ad_ce], -16       // Load C_4 if i_1=1
      nop.i 999
}
;;

//
//     N  = Arg * 2/pi
//     Check if Arg < pi/4
//
//
//     Case 2: Convert integer N_fix back to normalized floating-point value.
//     Case 1: p8 is only affected  when p6 is set
//
//
//     Grab the integer part of N and call it N_fix
//
{ .mfi
(p7)  ldfps FR_Two_to_M33, FR_Neg_Two_to_M33 = [GR_ad_d], 8
(p6)  fma.s1 FR_r_cubed = FR_r, FR_rsq, f0        // r^3 if |x| < pi/4
(p6)  mov GR_N_Inc = GR_Sin_or_Cos                // N_Inc if |x| < pi/4
}
;;

//     If |x| < pi/4, r = x and c = 0
//     lf |x| < pi/4, is x < 2**(-3).
//     r = Arg
//     c = 0
{ .mmi
(p7)  getf.sig        GR_N_Inc = FR_N_float_signif
(p6)  cmp.lt.unc p8,p0 = GR_exp_x, GR_exp_2_to_m3   // Is |x| < 2^-3
(p6)  tbit.z p9,p10 = GR_N_Inc, 0         // p9  if i_1=0, N mod 4 = 0,1
                                          // p10 if i_1=1, N mod 4 = 2,3
}
;;

//
//     lf |x| < pi/4, is -2**(-3)< x < 2**(-3) - set p8.
//     If |x| >= pi/4,
//     Create the right N for |x| < pi/4 and otherwise
//     Case 2: Place integer part of N in GP register
//


{ .mbb
      nop.m 999
(p8)  br.cond.spnt SINCOSL_SMALL_R_0    // Branch if 0 < |x| < 2^-3
(p6)  br.cond.spnt SINCOSL_NORMAL_R_0   // Branch if 2^-3 <= |x| < pi/4
}
;;

// Here if pi/4 <= |x| < 2^24
{ .mfi
      ldfs FR_Neg_Two_to_M67 = [GR_ad_d], 8     // Load -2^-67
      fnma.s1 FR_s = FR_N_float, FR_P_1, FR_Input_X // s = -N * P_1  + Arg
      add GR_N_Inc = GR_N_Inc, GR_Sin_or_Cos    // Adjust N_Inc for sin/cos
}
{ .mfi
      nop.m 999
      fma.s1 FR_w = FR_N_float, FR_P_2, f0      // w = N * P_2
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fms.s1 FR_r = FR_s, f1, FR_w        // r = s - w, assume |s| >= 2^-33
      tbit.z p9,p10 = GR_N_Inc, 0         // p9  if i_1=0, N mod 4 = 0,1
                                          // p10 if i_1=1, N mod 4 = 2,3
}
;;

{ .mfi
      nop.m 999
      fcmp.lt.s1 p7, p6 = FR_s, FR_Two_to_M33
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p7)  fcmp.gt.s1 p7, p6 = FR_s, FR_Neg_Two_to_M33 // p6 if |s| >= 2^-33, else p7
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fms.s1 FR_c = FR_s, f1, FR_r             // c = s - r, for |s| >= 2^-33
      nop.i 999
}
{ .mfi
      nop.m 999
      fma.s1 FR_rsq = FR_r, FR_r, f0           // rsq = r * r, for |s| >= 2^-33
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p7)  fma.s1 FR_w = FR_N_float, FR_P_3, f0
      nop.i 999
}
;;

{ .mmf
(p9)  ldfe FR_C_1 = [GR_ad_pp], 16     // Load C_1 if i_1=0
(p10) ldfe FR_S_1 = [GR_ad_qq], 16     // Load S_1 if i_1=1
      frcpa.s1 FR_r_hi, p15 = f1, FR_r  // r_hi = frcpa(r)
}
;;

{ .mfi
      nop.m 999
(p6)  fcmp.lt.unc.s1 p8, p13 = FR_r, FR_Two_to_M3 // If big s, test r with 2^-3
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p7)  fma.s1 FR_U_1 = FR_N_float, FR_P_2, FR_w
      nop.i 999
}
;;

//
//     For big s: r = s - w: No futher reduction is necessary
//     For small s: w = N * P_3 (change sign) More reduction
//
{ .mfi
        nop.m 999
(p8)   fcmp.gt.s1 p8, p13 = FR_r, FR_Neg_Two_to_M3 // If big s, p8 if |r| < 2^-3
        nop.i 999 ;;
}

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly = FR_rsq, FR_PP_8, FR_PP_7 // poly = rsq*PP_8+PP_7 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly = FR_rsq, FR_QQ_8, FR_QQ_7 // poly = rsq*QQ_8+QQ_7 if i_1=1
      nop.i 999
}
;;

{ .mfi
        nop.m 999
(p7)   fms.s1 FR_r = FR_s, f1, FR_U_1
        nop.i 999
}
;;

{ .mfi
      nop.m 999
(p6)  fma.s1 FR_r_cubed = FR_r, FR_rsq, f0  // rcubed = r * rsq
      nop.i 999
}
;;

{ .mfi
//
//     For big s: Is |r| < 2**(-3)?
//     For big s: c = S - r
//     For small s: U_1 = N * P_2 + w
//
//     If p8 is set, prepare to branch to Small_R.
//     If p9 is set, prepare to branch to Normal_R.
//     For big s,  r is complete here.
//
//
//     For big s: c = c + w (w has not been negated.)
//     For small s: r = S - U_1
//
      nop.m 999
(p6)  fms.s1 FR_c = FR_c, f1, FR_w
      nop.i 999
}
{ .mbb
      nop.m 999
(p8)  br.cond.spnt    SINCOSL_SMALL_R_1  // Branch if |s|>=2^-33, |r| < 2^-3,
                                         // and pi/4 <= |x| < 2^24
(p13) br.cond.sptk    SINCOSL_NORMAL_R_1 // Branch if |s|>=2^-33, |r| >= 2^-3,
                                         // and pi/4 <= |x| < 2^24
}
;;

SINCOSL_S_TINY:
//
// Here if |s| < 2^-33, and pi/4 <= |x| < 2^24
//
{ .mfi
       fms.s1 FR_U_2 = FR_N_float, FR_P_2, FR_U_1
//
//     c = S - U_1
//     r = S_1 * r
//
//
}
;;

{ .mmi
        nop.m 999
//
//     Get [i_0,i_1] - two lsb of N_fix_gr.
//     Do dummy fmpy so inexact is always set.
//
      tbit.z p9,p10 = GR_N_Inc, 0      // p9  if i_1=0, N mod 4 = 0,1
                                       // p10 if i_1=1, N mod 4 = 2,3
}
;;

//
//     For small s: U_2 = N * P_2 - U_1
//     S_1 stored constant - grab the one stored with the
//     coefficients.
//
{ .mfi
       ldfe FR_S_1 = [GR_ad_s1], 16
//
//     Check if i_1 and i_0  != 0
//
(p10)  fma.s1        FR_poly = f0, f1, FR_Neg_Two_to_M67
      tbit.z p11,p12 = GR_N_Inc, 1     // p11 if i_0=0, N mod 4 = 0,2
                                       // p12 if i_0=1, N mod 4 = 1,3
}
;;

{ .mfi
        nop.m 999
       fms.s1        FR_s = FR_s, f1, FR_r
        nop.i 999
}
{ .mfi
        nop.m 999
//
//     S = S - r
//     U_2 = U_2 + w
//     load S_1
//
       fma.s1        FR_rsq = FR_r, FR_r, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
       fma.s1        FR_U_2 = FR_U_2, f1, FR_w
        nop.i 999
}
{ .mfi
        nop.m 999
       fmerge.se FR_tmp_result = FR_r, FR_r
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p10)  fma.s1 FR_tmp_result = f0, f1, f1
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     FR_rsq = r * r
//     Save r as the result.
//
       fms.s1        FR_c = FR_s, f1, FR_U_1
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     if ( i_1 ==0) poly = c + S_1*r*r*r
//     else Result = 1
//
(p12)  fnma.s1 FR_tmp_result = FR_tmp_result, f1, f0
        nop.i 999
}
{ .mfi
        nop.m 999
       fma.s1        FR_r = FR_S_1, FR_r, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
       fma.s0        FR_S_1 = FR_S_1, FR_S_1, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     If i_1 != 0, poly = 2**(-67)
//
       fms.s1 FR_c = FR_c, f1, FR_U_2
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     c = c - U_2
//
(p9)   fma.s1 FR_poly = FR_r, FR_rsq, FR_c
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     i_0 != 0, so Result = -Result
//
(p11)  fma.s0 FR_Result = FR_tmp_result, f1, FR_poly
        nop.i 999 ;;
}
{ .mfb
        nop.m 999
(p12)  fms.s0 FR_Result = FR_tmp_result, f1, FR_poly
//
//     if (i_0 == 0),  Result = Result + poly
//     else            Result = Result - poly
//
        br.ret.sptk   b0         // Exit if |s| < 2^-33, and pi/4 <= |x| < 2^24
}
;;

SINCOSL_LARGER_ARG:
//
// Here if 2^24 <= |x| < 2^63
//
{ .mfi
      ldfe FR_d_1 = [GR_ad_p], 16          // Load d_1 for |x| >= 2^24 path
       fma.s1 FR_N_0 = FR_Input_X, FR_Inv_P_0, f0
        nop.i 999
}
;;

//
//     N_0 = Arg * Inv_P_0
//
//     Load values 2**(-14) and -2**(-14)
{ .mmi
       ldfps FR_Two_to_M14, FR_Neg_Two_to_M14 = [GR_ad_m14]
        nop.i 999 ;;
}
{ .mfi
      ldfe FR_d_2 = [GR_ad_p], 16          // Load d_2 for |x| >= 2^24 path
        nop.f 999
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//
       fcvt.fx.s1 FR_N_0_fix = FR_N_0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     N_0_fix  = integer part of N_0
//
       fcvt.xf FR_N_0 = FR_N_0_fix
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     Make N_0 the integer part
//
       fnma.s1 FR_ArgPrime = FR_N_0, FR_P_0, FR_Input_X
        nop.i 999
}
{ .mfi
        nop.m 999
       fma.s1 FR_w = FR_N_0, FR_d_1, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     Arg' = -N_0 * P_0 + Arg
//     w  = N_0 * d_1
//
       fma.s1 FR_N_float = FR_ArgPrime, FR_Inv_pi_by_2, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     N = A' * 2/pi
//
       fcvt.fx.s1 FR_N_fix = FR_N_float
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     N_fix is the integer part
//
       fcvt.xf FR_N_float = FR_N_fix
        nop.i 999 ;;
}
{ .mfi
       getf.sig GR_N_Inc = FR_N_fix
        nop.f 999
        nop.i 999 ;;
}
{ .mii
        nop.m 999
        nop.i 999 ;;
       add GR_N_Inc = GR_N_Inc, GR_Sin_or_Cos ;;
}
{ .mfi
        nop.m 999
//
//     N is the integer part of the reduced-reduced argument.
//     Put the integer in a GP register
//
       fnma.s1 FR_s = FR_N_float, FR_P_1, FR_ArgPrime
        nop.i 999
}
{ .mfi
        nop.m 999
       fnma.s1 FR_w = FR_N_float, FR_P_2, FR_w
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     s = -N*P_1 + Arg'
//     w = -N*P_2 + w
//     N_fix_gr = N_fix_gr + N_inc
//
       fcmp.lt.unc.s1 p9, p8 = FR_s, FR_Two_to_M14
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p9)   fcmp.gt.s1 p9, p8 = FR_s, FR_Neg_Two_to_M14  // p9 if |s| < 2^-14
        nop.i 999 ;;
}

{ .mfi
        nop.m 999
//
//     For |s|  > 2**(-14) r = S + w (r complete)
//     Else       U_hi = N_0 * d_1
//
(p9)   fma.s1 FR_V_hi = FR_N_float, FR_P_2, f0
        nop.i 999
}
{ .mfi
        nop.m 999
(p9)   fma.s1 FR_U_hi = FR_N_0, FR_d_1, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     Either S <= -2**(-14) or S >= 2**(-14)
//     or -2**(-14) < s < 2**(-14)
//
(p8)   fma.s1 FR_r = FR_s, f1, FR_w
        nop.i 999
}
{ .mfi
        nop.m 999
(p9)   fma.s1 FR_w = FR_N_float, FR_P_3, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     We need abs of both U_hi and V_hi - don't
//     worry about switched sign of V_hi.
//
(p9)   fms.s1 FR_A = FR_U_hi, f1, FR_V_hi
        nop.i 999
}
{ .mfi
        nop.m 999
//
//     Big s: finish up c = (S - r) + w (c complete)
//     Case 4: A =  U_hi + V_hi
//     Note: Worry about switched sign of V_hi, so subtract instead of add.
//
(p9)   fnma.s1 FR_V_lo = FR_N_float, FR_P_2, FR_V_hi
        nop.i 999 ;;
}
{ .mmf
        nop.m 999
        nop.m 999
(p9)   fms.s1 FR_U_lo = FR_N_0, FR_d_1, FR_U_hi
}
{ .mfi
        nop.m 999
(p9)   fmerge.s FR_V_hiabs = f0, FR_V_hi
        nop.i 999 ;;
}
//{ .mfb
//(p9)   fmerge.s f8= FR_V_lo,FR_V_lo
//(p9)   br.ret.sptk b0
//}
//;;
{ .mfi
        nop.m 999
//     For big s: c = S - r
//     For small s do more work: U_lo = N_0 * d_1 - U_hi
//
(p9)   fmerge.s FR_U_hiabs = f0, FR_U_hi
        nop.i 999
}
{ .mfi
        nop.m 999
//
//     For big s: Is |r| < 2**(-3)
//     For big s: if p12 set, prepare to branch to Small_R.
//     For big s: If p13 set, prepare to branch to Normal_R.
//
(p8)   fms.s1 FR_c = FR_s, f1, FR_r
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     For small S: V_hi = N * P_2
//                  w = N * P_3
//     Note the product does not include the (-) as in the writeup
//     so (-) missing for V_hi and w.
//
(p8)   fcmp.lt.unc.s1 p12, p13 = FR_r, FR_Two_to_M3
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p12)  fcmp.gt.s1 p12, p13 = FR_r, FR_Neg_Two_to_M3
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p8)   fma.s1 FR_c = FR_c, f1, FR_w
        nop.i 999
}
{ .mfb
        nop.m 999
(p9)   fms.s1 FR_w = FR_N_0, FR_d_2, FR_w
(p12)  br.cond.spnt SINCOSL_SMALL_R      // Branch if |r| < 2^-3
                                         // and 2^24 <= |x| < 2^63
}
;;

{ .mib
        nop.m 999
        nop.i 999
(p13)  br.cond.sptk SINCOSL_NORMAL_R     // Branch if |r| >= 2^-3
                                         // and 2^24 <= |x| < 2^63
}
;;

SINCOSL_LARGER_S_TINY:
//
// Here if |s| < 2^-14, and 2^24 <= |x| < 2^63
//
{ .mfi
        nop.m 999
//
//     Big s: Vector off when |r| < 2**(-3).  Recall that p8 will be true.
//     The remaining stuff is for Case 4.
//     Small s: V_lo = N * P_2 + U_hi (U_hi is in place of V_hi in writeup)
//     Note: the (-) is still missing for V_lo.
//     Small s: w = w + N_0 * d_2
//     Note: the (-) is now incorporated in w.
//
       fcmp.ge.unc.s1 p7, p8 = FR_U_hiabs, FR_V_hiabs
}
{ .mfi
        nop.m 999
//
//     C_hi = S + A
//
       fma.s1 FR_t = FR_U_lo, f1, FR_V_lo
}
;;

{ .mfi
        nop.m 999
//
//     t = U_lo + V_lo
//
//
(p7)  fms.s1 FR_a = FR_U_hi, f1, FR_A
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p8)  fma.s1 FR_a = FR_V_hi, f1, FR_A
        nop.i 999
}
;;

{ .mfi
//
//     Is U_hiabs >= V_hiabs?
//
        nop.m 999
       fma.s1 FR_C_hi = FR_s, f1, FR_A
        nop.i 999 ;;
}
{ .mmi
       ldfe FR_C_1 = [GR_ad_c], 16 ;;
       ldfe FR_C_2 = [GR_ad_c], 64
        nop.i 999 ;;
}
//
//     c = c + C_lo  finished.
//     Load  C_2
//
{ .mfi
       ldfe        FR_S_1 = [GR_ad_s], 16
//
//     C_lo = S - C_hi
//
       fma.s1 FR_t = FR_t, f1, FR_w
        nop.i 999 ;;
}
//
//     r and c have been computed.
//     Make sure ftz mode is set - should be automatic when using wre
//     |r| < 2**(-3)
//     Get [i_0,i_1] - two lsb of N_fix.
//     Load S_1
//
{ .mfi
       ldfe FR_S_2 = [GR_ad_s], 64
//
//     t = t + w
//
(p7)  fms.s1 FR_a = FR_a, f1, FR_V_hi
      tbit.z p9,p10 = GR_N_Inc, 0      // p9  if i_1=0, N mod 4 = 0,1
                                       // p10 if i_1=1, N mod 4 = 2,3
}
;;
{ .mfi
        nop.m 999
//
//     For larger u than v: a = U_hi - A
//     Else a = V_hi - A (do an add to account for missing (-) on V_hi
//
       fms.s1 FR_C_lo = FR_s, f1, FR_C_hi
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p8)  fms.s1 FR_a = FR_U_hi, f1, FR_a
      tbit.z p11,p12 = GR_N_Inc, 1     // p11 if i_0=0, N mod 4 = 0,2
                                       // p12 if i_0=1, N mod 4 = 1,3
}
;;

{ .mfi
        nop.m 999
//
//     If u > v: a = (U_hi - A)  + V_hi
//     Else      a = (V_hi - A)  + U_hi
//     In each case account for negative missing from V_hi.
//
       fma.s1 FR_C_lo = FR_C_lo, f1, FR_A
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     C_lo = (S - C_hi) + A
//
       fma.s1 FR_t = FR_t, f1, FR_a
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     t = t + a
//
       fma.s1 FR_C_lo = FR_C_lo, f1, FR_t
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     C_lo = C_lo + t
//
       fma.s1 FR_r = FR_C_hi, f1, FR_C_lo
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     Load S_2
//
       fma.s1 FR_rsq = FR_r, FR_r, f0
        nop.i 999
}
{ .mfi
        nop.m 999
//
//     r = C_hi + C_lo
//
       fms.s1 FR_c = FR_C_hi, f1, FR_r
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     if i_1 ==0: poly = S_2 * FR_rsq + S_1
//     else        poly = C_2 * FR_rsq + C_1
//
(p9)  fma.s1 FR_tmp_result = f0, f1, FR_r
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p10)  fma.s1 FR_tmp_result = f0, f1, f1
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     Compute r_cube = FR_rsq * r
//
(p9)  fma.s1 FR_poly = FR_rsq, FR_S_2, FR_S_1
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p10)  fma.s1 FR_poly = FR_rsq, FR_C_2, FR_C_1
        nop.i 999
}
{ .mfi
        nop.m 999
//
//     Compute FR_rsq = r * r
//     Is i_1 == 0 ?
//
       fma.s1 FR_r_cubed = FR_rsq, FR_r, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     c = C_hi - r
//     Load  C_1
//
       fma.s1 FR_c = FR_c, f1, FR_C_lo
        nop.i 999
}
{ .mfi
        nop.m 999
//
//     if i_1 ==0: poly = r_cube * poly + c
//     else        poly = FR_rsq * poly
//
(p12)  fms.s1 FR_tmp_result = f0, f1, FR_tmp_result
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     if i_1 ==0: Result = r
//     else        Result = 1.0
//
(p9)  fma.s1 FR_poly = FR_r_cubed, FR_poly, FR_c
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
(p10)  fma.s1 FR_poly = FR_rsq, FR_poly, f0
        nop.i 999 ;;
}
{ .mfi
        nop.m 999
//
//     if i_0 !=0: Result = -Result
//
(p11)   fma.s0 FR_Result = FR_tmp_result, f1, FR_poly
        nop.i 999 ;;
}
{ .mfb
        nop.m 999
(p12)  fms.s0 FR_Result = FR_tmp_result, f1, FR_poly
//
//     if i_0 == 0: Result = Result + poly
//     else         Result = Result - poly
//
      br.ret.sptk   b0         // Exit for |s| < 2^-14, and 2^24 <= |x| < 2^63
}
;;


SINCOSL_SMALL_R:
//
// Here if |r| < 2^-3
//
// Enter with r, c, and N_Inc computed
//
//      Compare both i_1 and i_0 with 0.
//      if i_1 == 0, set p9.
//      if i_0 == 0, set p11.
//

{ .mfi
      nop.m 999
      fma.s1 FR_rsq = FR_r, FR_r, f0   // rsq = r * r
      tbit.z p9,p10 = GR_N_Inc, 0      // p9  if i_1=0, N mod 4 = 0,1
                                       // p10 if i_1=1, N mod 4 = 2,3
}
;;

{ .mmi
(p9)  ldfe FR_S_5 = [GR_ad_se], -16    // Load S_5 if i_1=0
(p10) ldfe FR_C_5 = [GR_ad_ce], -16    // Load C_5 if i_1=1
      nop.i 999
}
;;

{ .mmi
(p9)  ldfe FR_S_4 = [GR_ad_se], -16    // Load S_4 if i_1=0
(p10) ldfe FR_C_4 = [GR_ad_ce], -16    // Load C_4 if i_1=1
      nop.i 999
}
;;

SINCOSL_SMALL_R_0:
// Entry point for 2^-3 < |x| < pi/4
.pred.rel "mutex",p9,p10
SINCOSL_SMALL_R_1:
// Entry point for pi/4 < |x| < 2^24 and |r| < 2^-3
.pred.rel "mutex",p9,p10
{ .mfi
(p9)  ldfe FR_S_3 = [GR_ad_se], -16    // Load S_3 if i_1=0
      fma.s1 FR_Z = FR_rsq, FR_rsq, f0 // Z = rsq * rsq
      nop.i 999
}
{ .mfi
(p10) ldfe FR_C_3 = [GR_ad_ce], -16    // Load C_3 if i_1=1
(p10) fnma.s1 FR_c = FR_c, FR_r, f0    // c = -c * r if i_1=0
      nop.i 999
}
;;

{ .mmf
(p9)  ldfe FR_S_2 = [GR_ad_se], -16    // Load S_2 if i_1=0
(p10) ldfe FR_C_2 = [GR_ad_ce], -16    // Load C_2 if i_1=1
(p10) fmerge.s FR_r = f1, f1
}
;;

{ .mmi
(p9)  ldfe FR_S_1 = [GR_ad_se], -16    // Load S_1 if i_1=0
(p10) ldfe FR_C_1 = [GR_ad_ce], -16    // Load C_1 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_Z = FR_Z, FR_r, f0     // Z = Z * r if i_1=0
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly_lo = FR_rsq, FR_S_5, FR_S_4 // poly_lo=rsq*S_5+S_4 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly_lo = FR_rsq, FR_C_5, FR_C_4 // poly_lo=rsq*C_5+C_4 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly_hi = FR_rsq, FR_S_2, FR_S_1 // poly_hi=rsq*S_2+S_1 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly_hi = FR_rsq, FR_C_2, FR_C_1 // poly_hi=rsq*C_2+C_1 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fma.s1 FR_Z = FR_Z, FR_rsq, f0             // Z = Z * rsq
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly_lo = FR_rsq, FR_poly_lo, FR_S_3 // p_lo=p_lo*rsq+S_3, i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly_lo = FR_rsq, FR_poly_lo, FR_C_3 // p_lo=p_lo*rsq+C_3, i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s0 FR_inexact = FR_S_4, FR_S_4, f0     // Dummy op to set inexact
      tbit.z p11,p12 = GR_N_Inc, 1     // p11 if i_0=0, N mod 4 = 0,2
                                       // p12 if i_0=1, N mod 4 = 1,3
}
{ .mfi
      nop.m 999
(p10) fma.s0 FR_inexact = FR_C_1, FR_C_1, f0     // Dummy op to set inexact
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly_hi = FR_poly_hi, FR_rsq, f0     // p_hi=p_hi*rsq if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly_hi = FR_poly_hi, FR_rsq, f0     // p_hi=p_hi*rsq if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fma.s1 FR_poly = FR_Z, FR_poly_lo, FR_c        // poly=Z*poly_lo+c
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly_hi = FR_r, FR_poly_hi, f0       // p_hi=r*p_hi if i_1=0
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p12) fms.s1 FR_r = f0, f1, FR_r                     // r = -r if i_0=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fma.s1 FR_poly = FR_poly, f1, FR_poly_hi       // poly=poly+poly_hi
      nop.i 999
}
;;

//
//      if (i_0 == 0) Result = r + poly
//      if (i_0 != 0) Result = r - poly
//
{ .mfi
      nop.m 999
(p11) fma.s0 FR_Result = FR_r, f1, FR_poly
      nop.i 999
}
{ .mfb
      nop.m 999
(p12) fms.s0 FR_Result = FR_r, f1, FR_poly
      br.ret.sptk   b0                               // Exit for |r| < 2^-3
}
;;


SINCOSL_NORMAL_R:
//
// Here if 2^-3 <= |r| < pi/4
// THIS IS THE MAIN PATH
//
// Enter with r, c, and N_Inc having been computed
//
{ .mfi
      ldfe FR_PP_6 = [GR_ad_pp], 16    // Load PP_6
      fma.s1 FR_rsq = FR_r, FR_r, f0   // rsq = r * r
      tbit.z p9,p10 = GR_N_Inc, 0      // p9  if i_1=0, N mod 4 = 0,1
                                       // p10 if i_1=1, N mod 4 = 2,3
}
{ .mfi
      ldfe FR_QQ_6 = [GR_ad_qq], 16    // Load QQ_6
      nop.f 999
      nop.i 999
}
;;

{ .mmi
(p9)  ldfe FR_PP_5 = [GR_ad_pp], 16    // Load PP_5 if i_1=0
(p10) ldfe FR_QQ_5 = [GR_ad_qq], 16    // Load QQ_5 if i_1=1
      nop.i 999
}
;;

SINCOSL_NORMAL_R_0:
// Entry for 2^-3 < |x| < pi/4
.pred.rel "mutex",p9,p10
{ .mmf
(p9)  ldfe FR_C_1 = [GR_ad_pp], 16     // Load C_1 if i_1=0
(p10) ldfe FR_S_1 = [GR_ad_qq], 16     // Load S_1 if i_1=1
      frcpa.s1 FR_r_hi, p6 = f1, FR_r  // r_hi = frcpa(r)
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly = FR_rsq, FR_PP_8, FR_PP_7 // poly = rsq*PP_8+PP_7 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly = FR_rsq, FR_QQ_8, FR_QQ_7 // poly = rsq*QQ_8+QQ_7 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fma.s1 FR_r_cubed = FR_r, FR_rsq, f0  // rcubed = r * rsq
      nop.i 999
}
;;


SINCOSL_NORMAL_R_1:
// Entry for pi/4 <= |x| < 2^24
.pred.rel "mutex",p9,p10
{ .mmf
(p9)  ldfe FR_PP_1 = [GR_ad_pp], 16             // Load PP_1_hi if i_1=0
(p10) ldfe FR_QQ_1 = [GR_ad_qq], 16             // Load QQ_1    if i_1=1
      frcpa.s1 FR_r_hi, p6 = f1, FR_r_hi        // r_hi = frpca(frcpa(r))
}
;;

{ .mfi
(p9)  ldfe FR_PP_4 = [GR_ad_pp], 16             // Load PP_4 if i_1=0
(p9)  fma.s1 FR_poly = FR_rsq, FR_poly, FR_PP_6 // poly = rsq*poly+PP_6 if i_1=0
      nop.i 999
}
{ .mfi
(p10) ldfe FR_QQ_4 = [GR_ad_qq], 16             // Load QQ_4 if i_1=1
(p10) fma.s1 FR_poly = FR_rsq, FR_poly, FR_QQ_6 // poly = rsq*poly+QQ_6 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_corr = FR_C_1, FR_rsq, f0       // corr = C_1 * rsq if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_corr = FR_S_1, FR_r_cubed, FR_r // corr = S_1 * r^3 + r if i_1=1
      nop.i 999
}
;;

{ .mfi
(p9)  ldfe FR_PP_3 = [GR_ad_pp], 16             // Load PP_3 if i_1=0
      fma.s1 FR_r_hi_sq = FR_r_hi, FR_r_hi, f0  // r_hi_sq = r_hi * r_hi
      nop.i 999
}
{ .mfi
(p10) ldfe FR_QQ_3 = [GR_ad_qq], 16             // Load QQ_3 if i_1=1
      fms.s1 FR_r_lo = FR_r, f1, FR_r_hi        // r_lo = r - r_hi
      nop.i 999
}
;;

{ .mfi
(p9)  ldfe FR_PP_2 = [GR_ad_pp], 16             // Load PP_2 if i_1=0
(p9)  fma.s1 FR_poly = FR_rsq, FR_poly, FR_PP_5 // poly = rsq*poly+PP_5 if i_1=0
      nop.i 999
}
{ .mfi
(p10) ldfe FR_QQ_2 = [GR_ad_qq], 16             // Load QQ_2 if i_1=1
(p10) fma.s1 FR_poly = FR_rsq, FR_poly, FR_QQ_5 // poly = rsq*poly+QQ_5 if i_1=1
      nop.i 999
}
;;

{ .mfi
(p9)  ldfe FR_PP_1_lo = [GR_ad_pp], 16          // Load PP_1_lo if i_1=0
(p9)  fma.s1 FR_corr = FR_corr, FR_c, FR_c      // corr = corr * c + c if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fnma.s1 FR_corr = FR_corr, FR_c, f0       // corr = -corr * c if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_U_lo = FR_r, FR_r_hi, FR_r_hi_sq // U_lo = r*r_hi+r_hi_sq, i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_U_lo = FR_r_hi, f1, FR_r        // U_lo = r_hi + r if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_U_hi = FR_r_hi, FR_r_hi_sq, f0  // U_hi = r_hi*r_hi_sq if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_U_hi = FR_QQ_1, FR_r_hi_sq, f1  // U_hi = QQ_1*r_hi_sq+1, i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly = FR_rsq, FR_poly, FR_PP_4 // poly = poly*rsq+PP_4 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly = FR_rsq, FR_poly, FR_QQ_4 // poly = poly*rsq+QQ_4 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_U_lo = FR_r, FR_r, FR_U_lo      // U_lo = r * r + U_lo if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_U_lo = FR_r_lo, FR_U_lo, f0     // U_lo = r_lo * U_lo if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_U_hi = FR_PP_1, FR_U_hi, f0     // U_hi = PP_1 * U_hi if i_1=0
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly = FR_rsq, FR_poly, FR_PP_3 // poly = poly*rsq+PP_3 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly = FR_rsq, FR_poly, FR_QQ_3 // poly = poly*rsq+QQ_3 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_U_lo = FR_r_lo, FR_U_lo, f0     // U_lo = r_lo * U_lo if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_U_lo = FR_QQ_1,FR_U_lo, f0      // U_lo = QQ_1 * U_lo if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_U_hi = FR_r, f1, FR_U_hi        // U_hi = r + U_hi if i_1=0
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly = FR_rsq, FR_poly, FR_PP_2 // poly = poly*rsq+PP_2 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly = FR_rsq, FR_poly, FR_QQ_2 // poly = poly*rsq+QQ_2 if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_U_lo = FR_PP_1, FR_U_lo, f0     // U_lo = PP_1 * U_lo if i_1=0
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly = FR_rsq, FR_poly, FR_PP_1_lo // poly =poly*rsq+PP1lo i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly = FR_rsq, FR_poly, f0      // poly = poly*rsq if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fma.s1 FR_V = FR_U_lo, f1, FR_corr        // V = U_lo + corr
      tbit.z p11,p12 = GR_N_Inc, 1              // p11 if i_0=0, N mod 4 = 0,2
                                                // p12 if i_0=1, N mod 4 = 1,3
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s0 FR_inexact = FR_PP_5, FR_PP_4, f0  // Dummy op to set inexact
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s0 FR_inexact = FR_QQ_5, FR_QQ_5, f0  // Dummy op to set inexact
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fma.s1 FR_poly = FR_r_cubed, FR_poly, f0  // poly = poly*r^3 if i_1=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p10) fma.s1 FR_poly = FR_rsq, FR_poly, f0      // poly = poly*rsq if i_1=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p11) fma.s1 FR_tmp_result = f0, f1, f1// tmp_result=+1.0 if i_0=0
      nop.i 999
}
{ .mfi
      nop.m 999
(p12) fms.s1 FR_tmp_result = f0, f1, f1// tmp_result=-1.0 if i_0=1
      nop.i 999
}
;;

{ .mfi
      nop.m 999
      fma.s1 FR_V = FR_poly, f1, FR_V           // V = poly + V
      nop.i 999
}
;;

// If i_0 = 0  Result =  U_hi + V
// If i_0 = 1  Result = -U_hi - V
{ .mfi
        nop.m 999
(p11)        fma.s0 FR_Result = FR_tmp_result, FR_U_hi, FR_V
        nop.i 999
}
{ .mfb
        nop.m 999
(p12)        fms.s0 FR_Result = FR_tmp_result, FR_U_hi, FR_V
        br.ret.sptk   b0                     // Exit for 2^-3 <= |r| < pi/4
}
;;

SINCOSL_ZERO:
// Here if x = 0
{ .mfi
      cmp.eq.unc p6, p7 = 0x1, GR_Sin_or_Cos
      nop.f 999
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p7)  fmerge.s FR_Result = FR_Input_X, FR_Input_X // If sin, result = input
      nop.i 999
}
{ .mfb
      nop.m 999
(p6)  fma.s0 FR_Result = f1, f1, f0    // If cos, result=1.0
      br.ret.sptk   b0                  // Exit for x=0
}
;;


SINCOSL_DENORMAL:
{ .mmb
      getf.exp GR_signexp_x = FR_norm_x   // Get sign and exponent of x
      nop.m 999
      br.cond.sptk  SINCOSL_COMMON        // Return to common code
}
;;

SINCOSL_SPECIAL:
{ .mfb
        nop.m 999
//
//      Path for Arg = +/- QNaN, SNaN, Inf
//      Invalid can be raised. SNaNs
//      become QNaNs
//
        fmpy.s0 FR_Result = FR_Input_X, f0
        br.ret.sptk   b0 ;;
}

GLOBAL_IEEE754_END(cosl)
libm_alias_ldouble_other (__cos, cos)

// *******************************************************************
// *******************************************************************
// *******************************************************************
//
//     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
//     Be sure to allocate at least 2 GP registers as output registers for
//     __libm_pi_by_2_reduce.  This routine uses r59-60. These are used as
//     scratch registers within the __libm_pi_by_2_reduce routine (for speed).
//
//     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)
SINCOSL_ARG_TOO_LARGE:
.prologue
{ .mfi
        nop.f 0
.save   ar.pfs,GR_SAVE_PFS
        mov  GR_SAVE_PFS=ar.pfs                 // Save ar.pfs
};;

{ .mmi
        setf.exp FR_Two_to_M3 = GR_exp_2_to_m3  // Form 2^-3
        mov GR_SAVE_GP=gp                       // Save gp
.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.exp FR_Neg_Two_to_M3 = GR_exp_m2_to_m3 // Form -(2^-3)
        nop.i 0
        br.call.sptk b0=__libm_pi_by_2_reduce#
};;

{ .mfi
        add   GR_N_Inc = GR_Sin_or_Cos,r8
        fcmp.lt.unc.s1        p6, p0 = FR_r, FR_Two_to_M3
        mov   b0 = GR_SAVE_B0                  // Restore return address
};;

{ .mfi
        mov   gp = GR_SAVE_GP                  // Restore gp
(p6)    fcmp.gt.unc.s1        p6, p0 = FR_r, FR_Neg_Two_to_M3
        mov   ar.pfs = GR_SAVE_PFS             // Restore ar.pfs
};;

{ .mbb
        nop.m 999
(p6)    br.cond.spnt SINCOSL_SMALL_R     // Branch if |r|< 2^-3 for |x| >= 2^63
        br.cond.sptk SINCOSL_NORMAL_R    // Branch if |r|>=2^-3 for |x| >= 2^63
};;

LOCAL_LIBM_END(__libm_callout)
.type   __libm_pi_by_2_reduce#,@function
.global __libm_pi_by_2_reduce#
