.file "exp_m1.s"


// Copyright (c) 2000 - 2005, 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 Initial Version
// 04/04/00 Unwind support added
// 08/15/00 Bundle added after call to __libm_error_support to properly
//          set [the previously overwritten] GR_Parameter_RESULT.
// 07/07/01 Improved speed of all paths
// 05/20/02 Cleaned up namespace and sf0 syntax
// 11/20/02 Improved speed, algorithm based on exp
// 03/31/05 Reformatted delimiters between data tables

// API
//==============================================================
// double expm1(double)

// Overview of operation
//==============================================================
// 1. Inputs of Nan, Inf, Zero, NatVal handled with special paths
//
// 2. |x| < 2^-60
//    Result = x, computed by x + x*x to handle appropriate flags and rounding
//
// 3. 2^-60 <= |x| < 2^-2
//    Result determined by 13th order Taylor series polynomial
//    expm1f(x) = x + Q2*x^2 + ... + Q13*x^13
//
// 4. x < -48.0
//    Here we know result is essentially -1 + eps, where eps only affects
//    rounded result.  Set I.
//
// 5. x >= 709.7827
//    Result overflows.  Set I, O, and call error support
//
// 6. 2^-2 <= x < 709.7827  or  -48.0 <= x < -2^-2  
//    This is the main path.  The algorithm is described below:

// Take the input x. w is "how many log2/128 in x?"
//  w = x * 128/log2
//  n = int(w)
//  x = n log2/128 + r + delta

//  n = 128M + index_1 + 2^4 index_2
//  x = M log2 + (log2/128) index_1 + (log2/8) index_2 + r + delta

//  exp(x) = 2^M  2^(index_1/128)  2^(index_2/8) exp(r) exp(delta)
//       Construct 2^M
//       Get 2^(index_1/128) from table_1;
//       Get 2^(index_2/8)   from table_2;
//       Calculate exp(r) by series by 5th order polynomial
//          r = x - n (log2/128)_high
//          delta = - n (log2/128)_low
//       Calculate exp(delta) as 1 + delta


// Special values
//==============================================================
// expm1(+0)    = +0.0
// expm1(-0)    = -0.0

// expm1(+qnan) = +qnan
// expm1(-qnan) = -qnan
// expm1(+snan) = +qnan
// expm1(-snan) = -qnan

// expm1(-inf)  = -1.0
// expm1(+inf)  = +inf

// Overflow and Underflow
//=======================
// expm1(x) = largest double normal when
//     x = 709.7827 = 40862e42fefa39ef
//
// Underflow is handled as described in case 2 above.


// Registers used
//==============================================================
// Floating Point registers used:
// f8, input
// f9 -> f15,  f32 -> f75

// General registers used:
// r14 -> r40

// Predicate registers used:
// p6 -> p15

// Assembly macros
//==============================================================

rRshf                  = r14
rAD_TB1                = r15
rAD_T1                 = r15
rAD_TB2                = r16
rAD_T2                 = r16
rAD_Ln2_lo             = r17
rAD_P                  = r17

rN                     = r18
rIndex_1               = r19
rIndex_2_16            = r20

rM                     = r21
rBiased_M              = r21
rIndex_1_16            = r22
rSignexp_x             = r23
rExp_x                 = r24
rSig_inv_ln2           = r25

rAD_Q1                 = r26
rAD_Q2                 = r27
rTmp                   = r27
rExp_bias              = r28
rExp_mask              = r29
rRshf_2to56            = r30

rGt_ln                 = r31
rExp_2tom56            = r31


GR_SAVE_B0             = r33
GR_SAVE_PFS            = r34
GR_SAVE_GP             = r35
GR_SAVE_SP             = r36

GR_Parameter_X         = r37
GR_Parameter_Y         = r38
GR_Parameter_RESULT    = r39
GR_Parameter_TAG       = r40


FR_X                   = f10
FR_Y                   = f1
FR_RESULT              = f8

fRSHF_2TO56            = f6
fINV_LN2_2TO63         = f7
fW_2TO56_RSH           = f9
f2TOM56                = f11
fP5                    = f12
fP54                   = f50
fP5432                 = f50
fP4                    = f13
fP3                    = f14
fP32                   = f14
fP2                    = f15

fLn2_by_128_hi         = f33
fLn2_by_128_lo         = f34

fRSHF                  = f35
fNfloat                = f36
fW                     = f37
fR                     = f38
fF                     = f39

fRsq                   = f40
fRcube                 = f41

f2M                    = f42
fS1                    = f43
fT1                    = f44

fMIN_DBL_OFLOW_ARG     = f45
fMAX_DBL_MINUS_1_ARG   = f46
fMAX_DBL_NORM_ARG      = f47
fP_lo                  = f51
fP_hi                  = f52
fP                     = f53
fS                     = f54

fNormX                 = f56

fWre_urm_f8            = f57

fGt_pln                = f58
fTmp                   = f58

fS2                    = f59
fT2                    = f60
fSm1                   = f61

fXsq                   = f62
fX6                    = f63
fX4                    = f63
fQ7                    = f64
fQ76                   = f64
fQ7654                 = f64
fQ765432               = f64
fQ6                    = f65
fQ5                    = f66
fQ54                   = f66
fQ4                    = f67
fQ3                    = f68
fQ32                   = f68
fQ2                    = f69
fQD                    = f70
fQDC                   = f70
fQDCBA                 = f70
fQDCBA98               = f70
fQDCBA98765432         = f70
fQC                    = f71
fQB                    = f72
fQBA                   = f72
fQA                    = f73
fQ9                    = f74
fQ98                   = f74
fQ8                    = f75

// Data tables
//==============================================================

RODATA
.align 16

// ************* DO NOT CHANGE ORDER OF THESE TABLES ********************

// double-extended 1/ln(2)
// 3fff b8aa 3b29 5c17 f0bb be87fed0691d3e88
// 3fff b8aa 3b29 5c17 f0bc
// For speed the significand will be loaded directly with a movl and setf.sig
//   and the exponent will be bias+63 instead of bias+0.  Thus subsequent
//   computations need to scale appropriately.
// The constant 128/ln(2) is needed for the computation of w.  This is also
//   obtained by scaling the computations.
//
// Two shifting constants are loaded directly with movl and setf.d.
//   1. fRSHF_2TO56 = 1.1000..00 * 2^(63-7)
//        This constant is added to x*1/ln2 to shift the integer part of
//        x*128/ln2 into the rightmost bits of the significand.
//        The result of this fma is fW_2TO56_RSH.
//   2. fRSHF       = 1.1000..00 * 2^(63)
//        This constant is subtracted from fW_2TO56_RSH * 2^(-56) to give
//        the integer part of w, n, as a floating-point number.
//        The result of this fms is fNfloat.


LOCAL_OBJECT_START(exp_Table_1)
data8 0x40862e42fefa39f0 // smallest dbl overflow arg
data8 0xc048000000000000 // approx largest arg for minus one result
data8 0x40862e42fefa39ef // largest dbl arg to give normal dbl result
data8 0x0                // pad
data8 0xb17217f7d1cf79ab , 0x00003ff7 // ln2/128 hi
data8 0xc9e3b39803f2f6af , 0x00003fb7 // ln2/128 lo
//
// Table 1 is 2^(index_1/128) where
// index_1 goes from 0 to 15
//
data8 0x8000000000000000 , 0x00003FFF
data8 0x80B1ED4FD999AB6C , 0x00003FFF
data8 0x8164D1F3BC030773 , 0x00003FFF
data8 0x8218AF4373FC25EC , 0x00003FFF
data8 0x82CD8698AC2BA1D7 , 0x00003FFF
data8 0x8383594EEFB6EE37 , 0x00003FFF
data8 0x843A28C3ACDE4046 , 0x00003FFF
data8 0x84F1F656379C1A29 , 0x00003FFF
data8 0x85AAC367CC487B15 , 0x00003FFF
data8 0x8664915B923FBA04 , 0x00003FFF
data8 0x871F61969E8D1010 , 0x00003FFF
data8 0x87DB357FF698D792 , 0x00003FFF
data8 0x88980E8092DA8527 , 0x00003FFF
data8 0x8955EE03618E5FDD , 0x00003FFF
data8 0x8A14D575496EFD9A , 0x00003FFF
data8 0x8AD4C6452C728924 , 0x00003FFF
LOCAL_OBJECT_END(exp_Table_1)

// Table 2 is 2^(index_1/8) where
// index_2 goes from 0 to 7
LOCAL_OBJECT_START(exp_Table_2)
data8 0x8000000000000000 , 0x00003FFF
data8 0x8B95C1E3EA8BD6E7 , 0x00003FFF
data8 0x9837F0518DB8A96F , 0x00003FFF
data8 0xA5FED6A9B15138EA , 0x00003FFF
data8 0xB504F333F9DE6484 , 0x00003FFF
data8 0xC5672A115506DADD , 0x00003FFF
data8 0xD744FCCAD69D6AF4 , 0x00003FFF
data8 0xEAC0C6E7DD24392F , 0x00003FFF
LOCAL_OBJECT_END(exp_Table_2)


LOCAL_OBJECT_START(exp_p_table)
data8 0x3f8111116da21757 //P5
data8 0x3fa55555d787761c //P4
data8 0x3fc5555555555414 //P3
data8 0x3fdffffffffffd6a //P2
LOCAL_OBJECT_END(exp_p_table)

LOCAL_OBJECT_START(exp_Q1_table)
data8 0x3de6124613a86d09 // QD = 1/13!
data8 0x3e21eed8eff8d898 // QC = 1/12!
data8 0x3ec71de3a556c734 // Q9 = 1/9!
data8 0x3efa01a01a01a01a // Q8 = 1/8!
data8 0x8888888888888889,0x3ff8 // Q5 = 1/5!
data8 0xaaaaaaaaaaaaaaab,0x3ffc // Q3 = 1/3!
data8 0x0,0x0            // Pad to avoid bank conflicts
LOCAL_OBJECT_END(exp_Q1_table)

LOCAL_OBJECT_START(exp_Q2_table)
data8 0x3e5ae64567f544e4 // QB = 1/11!
data8 0x3e927e4fb7789f5c // QA = 1/10!
data8 0x3f2a01a01a01a01a // Q7 = 1/7!
data8 0x3f56c16c16c16c17 // Q6 = 1/6!
data8 0xaaaaaaaaaaaaaaab,0x3ffa // Q4 = 1/4!
data8 0x8000000000000000,0x3ffe // Q2 = 1/2!
LOCAL_OBJECT_END(exp_Q2_table)


.section .text
GLOBAL_IEEE754_ENTRY(expm1)

{ .mlx
      getf.exp        rSignexp_x = f8  // Must recompute if x unorm
      movl            rSig_inv_ln2 = 0xb8aa3b295c17f0bc  // signif of 1/ln2
}
{ .mlx
      addl            rAD_TB1    = @ltoff(exp_Table_1), gp
      movl            rRshf_2to56 = 0x4768000000000000   // 1.10000 2^(63+56)
}
;;

// We do this fnorm right at the beginning to normalize
// any input unnormals so that SWA is not taken.
{ .mfi
      ld8             rAD_TB1    = [rAD_TB1]
      fclass.m        p6,p0 = f8,0x0b  // Test for x=unorm
      mov             rExp_mask = 0x1ffff
}
{ .mfi
      mov             rExp_bias = 0xffff
      fnorm.s1        fNormX   = f8
      mov             rExp_2tom56 = 0xffff-56
}
;;

// Form two constants we need
//  1/ln2 * 2^63  to compute  w = x * 1/ln2 * 128
//  1.1000..000 * 2^(63+63-7) to right shift int(w) into the significand

{ .mfi
      setf.sig        fINV_LN2_2TO63 = rSig_inv_ln2 // form 1/ln2 * 2^63
      fclass.m        p8,p0 = f8,0x07  // Test for x=0
      nop.i           0
}
{ .mlx
      setf.d          fRSHF_2TO56 = rRshf_2to56 // Form 1.100 * 2^(63+56)
      movl            rRshf = 0x43e8000000000000   // 1.10000 2^63 for rshift
}
;;

{ .mfi
      setf.exp        f2TOM56 = rExp_2tom56 // form 2^-56 for scaling Nfloat
      fclass.m        p9,p0 = f8,0x22  // Test for x=-inf
      add             rAD_TB2 = 0x140, rAD_TB1 // Point to Table 2
}
{ .mib
      add             rAD_Q1 = 0x1e0, rAD_TB1 // Point to Q table for small path
      add             rAD_Ln2_lo = 0x30, rAD_TB1 // Point to ln2_by_128_lo
(p6)  br.cond.spnt    EXPM1_UNORM // Branch if x unorm
}
;;

EXPM1_COMMON:
{ .mfi
      ldfpd           fMIN_DBL_OFLOW_ARG, fMAX_DBL_MINUS_1_ARG = [rAD_TB1],16
      fclass.m        p10,p0 = f8,0x1e1  // Test for x=+inf, NaN, NaT
      add             rAD_Q2 = 0x50, rAD_Q1   // Point to Q table for small path
}
{ .mfb
      nop.m           0
      nop.f           0
(p8)  br.ret.spnt     b0                        // Exit for x=0, return x
}
;;

{ .mfi
      ldfd            fMAX_DBL_NORM_ARG = [rAD_TB1],16
      nop.f           0
      and             rExp_x = rExp_mask, rSignexp_x // Biased exponent of x
}
{ .mfb
      setf.d          fRSHF = rRshf // Form right shift const 1.100 * 2^63
(p9)  fms.d.s0        f8 = f0,f0,f1            // quick exit for x=-inf
(p9)  br.ret.spnt     b0
}
;;

{ .mfi
      ldfpd           fQD, fQC = [rAD_Q1], 16  // Load coeff for small path
      nop.f           0
      sub             rExp_x = rExp_x, rExp_bias // True exponent of x
}
{ .mfb
      ldfpd           fQB, fQA = [rAD_Q2], 16  // Load coeff for small path
(p10) fma.d.s0        f8 = f8, f1, f0          // For x=+inf, NaN, NaT
(p10) br.ret.spnt     b0                       // Exit for x=+inf, NaN, NaT
}
;;

{ .mfi
      ldfpd           fQ9, fQ8 = [rAD_Q1], 16  // Load coeff for small path
      fma.s1          fXsq = fNormX, fNormX, f0  // x*x for small path
      cmp.gt          p7, p8 = -2, rExp_x      // Test |x| < 2^(-2)
}
{ .mfi
      ldfpd           fQ7, fQ6 = [rAD_Q2], 16  // Load coeff for small path
      nop.f           0
      nop.i           0
}
;;

{ .mfi
      ldfe            fQ5 = [rAD_Q1], 16       // Load coeff for small path
      nop.f           0
      nop.i           0
}
{ .mib
      ldfe            fQ4 = [rAD_Q2], 16       // Load coeff for small path
(p7)  cmp.gt.unc      p6, p7 = -60, rExp_x     // Test |x| < 2^(-60)
(p7)  br.cond.spnt    EXPM1_SMALL              // Branch if 2^-60 <= |x| < 2^-2
}
;;

// W = X * Inv_log2_by_128
// By adding 1.10...0*2^63 we shift and get round_int(W) in significand.
// We actually add 1.10...0*2^56 to X * Inv_log2 to do the same thing.

{ .mfi
      ldfe            fLn2_by_128_hi  = [rAD_TB1],32
      fma.s1          fW_2TO56_RSH  = fNormX, fINV_LN2_2TO63, fRSHF_2TO56
      nop.i           0
}
{ .mfb
      ldfe            fLn2_by_128_lo  = [rAD_Ln2_lo]
(p6)  fma.d.s0        f8 = f8, f8, f8 // If x < 2^-60, result=x+x*x
(p6)  br.ret.spnt     b0              // Exit if x < 2^-60
}
;;

// Divide arguments into the following categories:
//  Certain minus one       p11 - -inf < x <= MAX_DBL_MINUS_1_ARG
//  Possible Overflow       p14 - MAX_DBL_NORM_ARG < x < MIN_DBL_OFLOW_ARG
//  Certain Overflow        p15 - MIN_DBL_OFLOW_ARG <= x < +inf
//
// If the input is really a double arg, then there will never be "Possible
// Overflow" arguments.
//

// After that last load, rAD_TB1 points to the beginning of table 1

{ .mfi
      nop.m           0
      fcmp.ge.s1      p15,p14 = fNormX,fMIN_DBL_OFLOW_ARG
      nop.i           0
}
;;

{ .mfi
      add             rAD_P = 0x80, rAD_TB2
      fcmp.le.s1      p11,p0 = fNormX,fMAX_DBL_MINUS_1_ARG
      nop.i           0
}
;;

{ .mfb
      ldfpd           fP5, fP4  = [rAD_P] ,16
(p14) fcmp.gt.unc.s1  p14,p0 = fNormX,fMAX_DBL_NORM_ARG
(p15) br.cond.spnt    EXPM1_CERTAIN_OVERFLOW
}
;;

// Nfloat = round_int(W)
// The signficand of fW_2TO56_RSH contains the rounded integer part of W,
// as a twos complement number in the lower bits (that is, it may be negative).
// That twos complement number (called N) is put into rN.

// Since fW_2TO56_RSH is scaled by 2^56, it must be multiplied by 2^-56
// before the shift constant 1.10000 * 2^63 is subtracted to yield fNfloat.
// Thus, fNfloat contains the floating point version of N

{ .mfb
      ldfpd           fP3, fP2  = [rAD_P]
      fms.s1          fNfloat = fW_2TO56_RSH, f2TOM56, fRSHF
(p11) br.cond.spnt    EXPM1_CERTAIN_MINUS_ONE
}
;;

{ .mfi
      getf.sig        rN = fW_2TO56_RSH
      nop.f           0
      nop.i           0
}
;;

// rIndex_1 has index_1
// rIndex_2_16 has index_2 * 16
// rBiased_M has M
// rIndex_1_16 has index_1 * 16

// r = x - Nfloat * ln2_by_128_hi
// f = 1 - Nfloat * ln2_by_128_lo
{ .mfi
      and             rIndex_1 = 0x0f, rN
      fnma.s1         fR   = fNfloat, fLn2_by_128_hi, fNormX
      shr             rM = rN,  0x7
}
{ .mfi
      and             rIndex_2_16 = 0x70, rN
      fnma.s1         fF   = fNfloat, fLn2_by_128_lo, f1
      nop.i           0
}
;;

// rAD_T1 has address of T1
// rAD_T2 has address if T2

{ .mmi
      add             rBiased_M = rExp_bias, rM
      add             rAD_T2 = rAD_TB2, rIndex_2_16
      shladd          rAD_T1 = rIndex_1, 4, rAD_TB1
}
;;

// Create Scale = 2^M
// Load T1 and T2
{ .mmi
      setf.exp        f2M = rBiased_M
      ldfe            fT2  = [rAD_T2]
      nop.i           0
}
;;

{ .mfi
      ldfe            fT1  = [rAD_T1]
      fmpy.s0         fTmp = fLn2_by_128_lo, fLn2_by_128_lo // Force inexact
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fP54 = fR, fP5, fP4
      nop.i           0
}
{ .mfi
      nop.m           0
      fma.s1          fP32 = fR, fP3, fP2
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fRsq = fR, fR, f0
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fP5432  = fRsq, fP54, fP32
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fS2  = fF,fT2,f0
      nop.i           0
}
{ .mfi
      nop.m           0
      fma.s1          fS1  = f2M,fT1,f0
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fP = fRsq, fP5432, fR
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fms.s1          fSm1 = fS1,fS2,f1    // S - 1.0
      nop.i           0
}
{ .mfb
      nop.m           0
      fma.s1          fS   = fS1,fS2,f0
(p14) br.cond.spnt    EXPM1_POSSIBLE_OVERFLOW
}
;;

{ .mfb
      nop.m           0
      fma.d.s0        f8 = fS, fP, fSm1
      br.ret.sptk     b0                // Normal path exit
}
;;

// Here if 2^-60 <= |x| <2^-2
// Compute 13th order polynomial
EXPM1_SMALL:
{ .mmf
      ldfe            fQ3 = [rAD_Q1], 16
      ldfe            fQ2 = [rAD_Q2], 16
      fma.s1          fX4 = fXsq, fXsq, f0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fQDC = fQD, fNormX, fQC
      nop.i           0
}
{ .mfi
      nop.m           0
      fma.s1          fQBA = fQB, fNormX, fQA
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fQ98 = fQ9, fNormX, fQ8
      nop.i           0
}
{ .mfi
      nop.m           0
      fma.s1          fQ76= fQ7, fNormX, fQ6
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fQ54 = fQ5, fNormX, fQ4
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fX6 = fX4, fXsq, f0
      nop.i           0
}
{ .mfi
      nop.m           0
      fma.s1          fQ32= fQ3, fNormX, fQ2
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fQDCBA = fQDC, fXsq, fQBA
      nop.i           0
}
{ .mfi
      nop.m           0
      fma.s1          fQ7654 = fQ76, fXsq, fQ54
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fQDCBA98 = fQDCBA, fXsq, fQ98
      nop.i           0
}
{ .mfi
      nop.m           0
      fma.s1          fQ765432 = fQ7654, fXsq, fQ32
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fma.s1          fQDCBA98765432 = fQDCBA98, fX6, fQ765432
      nop.i           0
}
;;

{ .mfb
      nop.m           0
      fma.d.s0        f8 = fQDCBA98765432, fXsq, fNormX
      br.ret.sptk     b0                   // Exit small branch
}
;;


EXPM1_POSSIBLE_OVERFLOW:

// Here if fMAX_DBL_NORM_ARG < x < fMIN_DBL_OFLOW_ARG
// This cannot happen if input is a double, only if input higher precision.
// Overflow is a possibility, not a certainty.

// Recompute result using status field 2 with user's rounding mode,
// and wre set.  If result is larger than largest double, then we have
// overflow

{ .mfi
      mov             rGt_ln  = 0x103ff // Exponent for largest dbl + 1 ulp
      fsetc.s2        0x7F,0x42         // Get user's round mode, set wre
      nop.i           0
}
;;

{ .mfi
      setf.exp        fGt_pln = rGt_ln  // Create largest double + 1 ulp
      fma.d.s2        fWre_urm_f8 = fS, fP, fSm1  // Result with wre set
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fsetc.s2        0x7F,0x40                   // Turn off wre in sf2
      nop.i           0
}
;;

{ .mfi
      nop.m           0
      fcmp.ge.s1      p6, p0 =  fWre_urm_f8, fGt_pln // Test for overflow
      nop.i           0
}
;;

{ .mfb
      nop.m           0
      nop.f           0
(p6)  br.cond.spnt    EXPM1_CERTAIN_OVERFLOW // Branch if overflow
}
;;

{ .mfb
      nop.m           0
      fma.d.s0        f8 = fS, fP, fSm1
      br.ret.sptk     b0                     // Exit if really no overflow
}
;;

EXPM1_CERTAIN_OVERFLOW:
{ .mmi
      sub             rTmp = rExp_mask, r0, 1
;;
      setf.exp        fTmp = rTmp
      nop.i           0
}
;;

{ .mfi
      alloc           r32=ar.pfs,1,4,4,0
      fmerge.s        FR_X = f8,f8
      nop.i           0
}
{ .mfb
      mov             GR_Parameter_TAG = 41
      fma.d.s0        FR_RESULT = fTmp, fTmp, f0    // Set I,O and +INF result
      br.cond.sptk    __libm_error_region
}
;;

// Here if x unorm
EXPM1_UNORM:
{ .mfb
      getf.exp        rSignexp_x = fNormX    // Must recompute if x unorm
      fcmp.eq.s0      p6, p0 = f8, f0        // Set D flag
      br.cond.sptk    EXPM1_COMMON
}
;;

// here if result will be -1 and inexact, x <= -48.0
EXPM1_CERTAIN_MINUS_ONE:
{ .mmi
      mov             rTmp = 1
;;
      setf.exp        fTmp = rTmp
      nop.i           0
}
;;

{ .mfb
      nop.m           0
      fms.d.s0        FR_RESULT = fTmp, fTmp, f1 // Set I, rounded -1+eps result
      br.ret.sptk     b0
}
;;

GLOBAL_IEEE754_END(expm1)


LOCAL_LIBM_ENTRY(__libm_error_region)
.prologue
{ .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
};;
{ .mmi
        stfd [GR_Parameter_Y] = FR_Y,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
{ .mib
        stfd [GR_Parameter_X] = FR_X            // STORE Parameter 1 on stack
        add   GR_Parameter_RESULT = 0,GR_Parameter_Y  // Parameter 3 address
	nop.b 0
}
{ .mib
        stfd [GR_Parameter_Y] = FR_RESULT       // 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
        add   GR_Parameter_RESULT = 48,sp
        nop.m 0
        nop.i 0
};;
{ .mmi
        ldfd  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#
