.file "acosf.s"


// Copyright (c) 2000 - 2003, 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
// 06/28/00 Improved speed
// 06/31/00 Changed register allocation because of some duplicate macros
//          moved nan exit bundle up to gain a cycle.
// 08/15/00 Bundle added after call to __libm_error_support to properly
//          set [the previously overwritten] GR_Parameter_RESULT.
// 08/17/00 Changed predicate register macro-usage to direct predicate
//          names due to an assembler bug.
// 10/17/00 Improved speed of x=0 and x=1 paths, set D flag if x denormal.
// 03/13/01 Corrected sign of imm1 value in dep instruction.
// 05/20/02 Cleaned up namespace and sf0 syntax
// 02/06/03 Reordered header: .section, .global, .proc, .align
// 04/17/03 Moved mutex after label


// Description
//=========================================
// The acosf function computes the principle value of the arc sine of x.
// A doman error occurs for arguments not in the range [-1,+1].

// The acosf function returns the arc cosine in the range [0, +pi] radians.
// acos(1) returns +0
// acos(x) returns a Nan and raises the invalid exception for |x| >1 

// |x| <= sqrt(2)/2. get Ax and Bx

// poly_p1 = x p1
// poly_p3 = x2 p4 + p3
// poly_p1 = x2 (poly_p1) + x  = x2(x p1) + x
// poly_p2 = x2( poly_p3) + p2 = x2(x2 p4 + p3) + p2

// poly_Ax = x5(x2( poly_p3) + p2) + x2(x p1) + x
//         = x5(x2(x2 p4 + p3) + p2) + x2(x p1) + x

// poly_p7 = x2 p8 + p7
// poly_p5 = x2 p6 + p5

// poly_p7 = x4 p9 + (x2 p8 + p7)
// poly_Bx = x4 (x4 p9 + (x2 p8 + p7)) + x2 p6 + p5

// sinf1 = x11(x4 (x4 p9 + (x2 p8 + p7)) + x2 p6 + p5) + x5(x2(x2 p4 + p3) + p2) + x2(x p1) + x
//       = x19 p9 + x17 p8 + x15 p7 x13 p6 + x11 p5 + x9 p4 + x7 p3 + x5 p2 + x3 p1 + x
// answer1 = pi/2 - sinf1



// |x| >  sqrt(2)/2

// Get z = sqrt(1-x2)

// Get polynomial in t = 1-x2

// t2      = t t
// t4      = t2 t2

// poly_p4 = t p5 + p4
// poly_p1 = t p1 + 1

// poly_p6 = t p7 + p6
// poly_p2 = t p3 + p2

// poly_p8 = t p9 + p8

// poly_p4 = t2 poly_p6 + poly_p4
//         = t2 (t p7 + p6) + (t p5 + p4)

// poly_p2 = t2 poly_p2 + poly_p1
//         = t2 (t p3 + p2) + (t p1 + 1)

// poly_p4 = t4 poly_p8 + poly_p4
//         = t4 (t p9 + p8) + (t2 (t p7 + p6) + (t p5 + p4))

// P(t)    = poly_p2 + t4 poly_p8
//         = t2 (t p3 + p2) + (t p1 + 1) + t4 (t4 (t p9 + p8) + (t2 (t p7 + p6) + (t p5 + p4)))
//         = t3 p3 + t2 p2 + t p1 + 1 + t9 p9 + t8 p8 + t7 p7 + t6 p6 + t5 p5 + t4 p4


//  answer2 = sign(x) z P(t)       if x>0
//          = sign(x) z P(t) + pi  if x<0


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

// predicate registers
//acosf_pred_LEsqrt2by2            = p7
//acosf_pred_GTsqrt2by2            = p8

// integer registers
ACOSF_Addr1                      = r33
ACOSF_Addr2                      = r34
ACOSF_GR_1by2                    = r35

ACOSF_GR_3by2                    = r36
ACOSF_GR_5by2                    = r37

GR_SAVE_B0                    = r38
GR_SAVE_PFS                   = r39
GR_SAVE_GP                    = r40

GR_Parameter_X                = r41
GR_Parameter_Y                = r42
GR_Parameter_RESULT           = r43
GR_Parameter_TAG              = r44

// floating point registers

acosf_y                          = f32
acosf_abs_x                      = f33
acosf_x2                         = f34
acosf_sgn_x                      = f35

acosf_1by2                       = f36
acosf_3by2                       = f37
acosf_5by2                       = f38
acosf_coeff_P3                   = f39
acosf_coeff_P8                   = f40

acosf_coeff_P1                   = f41
acosf_coeff_P4                   = f42
acosf_coeff_P5                   = f43
acosf_coeff_P2                   = f44
acosf_coeff_P7                   = f45

acosf_coeff_P6                   = f46
acosf_coeff_P9                   = f47
acosf_x2                         = f48
acosf_x3                         = f49
acosf_x4                         = f50

acosf_x8                         = f51
acosf_x5                         = f52
acosf_const_piby2                = f53
acosf_const_sqrt2by2             = f54
acosf_x11                        = f55

acosf_poly_p1                    = f56
acosf_poly_p3                    = f57
acosf_sinf1                      = f58
acosf_poly_p2                    = f59
acosf_poly_Ax                    = f60

acosf_poly_p7                    = f61
acosf_poly_p5                    = f62
acosf_sgnx_t4                    = f63
acosf_poly_Bx                    = f64
acosf_t                          = f65

acosf_yby2                       = f66
acosf_B                          = f67
acosf_B2                         = f68
acosf_Az                         = f69
acosf_dz                         = f70

acosf_Sz                         = f71
acosf_d2z                        = f72
acosf_Fz                         = f73
acosf_z                          = f74
acosf_sgnx_z                     = f75

acosf_t2                         = f76
acosf_2poly_p4                   = f77
acosf_2poly_p6                   = f78
acosf_2poly_p1                   = f79
acosf_2poly_p2                   = f80

acosf_2poly_p8                   = f81
acosf_t4                         = f82
acosf_Pt                         = f83
acosf_sgnx_2poly_p2              = f84
acosf_sgn_x_piby2                = f85

acosf_poly_p7a                   = f86
acosf_2poly_p4a                  = f87
acosf_2poly_p4b                  = f88
acosf_2poly_p2a                  = f89
acosf_poly_p1a                   = f90





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

RODATA

.align 16

LOCAL_OBJECT_START(acosf_coeff_1_table)
data8 0x3FC5555607DCF816 // P1
data8 0x3F9CF81AD9BAB2C6 // P4
data8 0x3FC59E0975074DF3 // P7
data8 0xBFA6F4CC2780AA1D // P6
data8 0x3FC2DD45292E93CB // P9
data8 0x3fe6a09e667f3bcd // sqrt(2)/2
LOCAL_OBJECT_END(acosf_coeff_1_table)

LOCAL_OBJECT_START(acosf_coeff_2_table)
data8 0x3FA6F108E31EFBA6 // P3
data8 0xBFCA31BF175D82A0 // P8
data8 0x3FA30C0337F6418B // P5
data8 0x3FB332C9266CB1F9 // P2
data8 0x3ff921fb54442d18 // pi_by_2
LOCAL_OBJECT_END(acosf_coeff_2_table)


.section .text
GLOBAL_LIBM_ENTRY(acosf)
 
// Load the addresses of the two tables.
// Then, load the coefficients and other constants.

{     .mfi 
     alloc      r32            = ar.pfs,1,8,4,0
     fnma.s1   acosf_t        =    f8,f8,f1
     dep.z ACOSF_GR_1by2 =    0x3f,24,8    // 0x3f000000
} 
{     .mfi 
     addl ACOSF_Addr1    =    @ltoff(acosf_coeff_1_table),gp
     fma.s1    acosf_x2       =    f8,f8,f0
     addl      ACOSF_Addr2    =    @ltoff(acosf_coeff_2_table),gp ;;
}

 
{     .mfi 
     ld8       ACOSF_Addr1    =    [ACOSF_Addr1]
     fmerge.s  acosf_abs_x    =    f1,f8
     dep ACOSF_GR_3by2 =    -1,r0,22,8     // 0x3fc00000
} 
{     .mlx 
     nop.m                      999
     movl      ACOSF_GR_5by2  =    0x40200000;;
}

 

{     .mfi 
     setf.s    acosf_1by2     =    ACOSF_GR_1by2
     fmerge.s  acosf_sgn_x    =    f8,f1
     nop.i                      999
} 
{     .mfi 
     ld8       ACOSF_Addr2    =    [ACOSF_Addr2]
     nop.f 0
     nop.i                      999;;
}

 
{     .mfi 
     setf.s    acosf_5by2     =    ACOSF_GR_5by2
     fcmp.lt.s1 p11,p12 = f8,f0
     nop.i                      999;;
}

{ .mmf 
     ldfpd     acosf_coeff_P1,acosf_coeff_P4 =    [ACOSF_Addr1],16
     setf.s    acosf_3by2     =    ACOSF_GR_3by2
     fclass.m.unc p8,p0      = f8, 0xc3 ;;	//@qnan | @snan
}

 
{     .mfi 
     ldfpd     acosf_coeff_P7,acosf_coeff_P6 =    [ACOSF_Addr1],16
     fma.s1    acosf_t2                      =    acosf_t,acosf_t,f0
     nop.i                                     999
} 
{     .mfi 
     ldfpd     acosf_coeff_P3,acosf_coeff_P8 =    [ACOSF_Addr2],16
     fma.s1    acosf_x4                      =    acosf_x2,acosf_x2,f0
     nop.i                                     999;;
}

 
{     .mfi 
     ldfpd     acosf_coeff_P9,acosf_const_sqrt2by2     =    [ACOSF_Addr1]
     fclass.m.unc p10,p0      = f8, 0x07	//@zero
     nop.i                                     999
} 
{     .mfi 
     ldfpd     acosf_coeff_P5,acosf_coeff_P2 =    [ACOSF_Addr2],16
     fma.s1    acosf_x3  =    f8,acosf_x2,f0
     nop.i                                     999;;
}

 
{     .mfi 
     ldfd      acosf_const_piby2   =    [ACOSF_Addr2]
     frsqrta.s1     acosf_B,p0                   =    acosf_t
     nop.i                                               999
} 
{     .mfb 
     nop.m                                               999
(p8) fma.s.s0 f8                = f8,f1,f0
(p8) br.ret.spnt   b0 ;;  // Exit if x=nan
}

 
{     .mfb 
     nop.m                 999
     fcmp.eq.s1 p6,p0 = acosf_abs_x,f1
(p10) br.cond.spnt  ACOSF_ZERO ;;     // Branch if x=0
} 
 
{     .mfi 
     nop.m                 999
     fcmp.gt.s1 p9,p0 = acosf_abs_x,f1
     nop.i                 999;;
} 
 
{     .mfi 
     nop.m                 999
     fma.s1    acosf_x8  =    acosf_x4,acosf_x4,f0
     nop.i                 999
} 
{     .mfb 
     nop.m                      999
     fma.s1    acosf_t4  =    acosf_t2,acosf_t2,f0
(p6) br.cond.spnt  ACOSF_ABS_ONE ;;     // Branch if |x|=1
} 

{     .mfi 
     nop.m                 999
     fma.s1    acosf_x5  =    acosf_x2,acosf_x3,f0
     nop.i                 999
}
{     .mfb 
(p9) mov            GR_Parameter_TAG = 59
     fma.s1    acosf_yby2     =    acosf_t,acosf_1by2,f0
(p9) br.cond.spnt  __libm_error_region ;;    // Branch if |x|>1
}


{     .mfi 
     nop.m                 999
     fma.s1    acosf_Az  =    acosf_t,acosf_B,f0
     nop.i                 999
} 
{     .mfi 
     nop.m                 999
     fma.s1    acosf_B2  =    acosf_B,acosf_B,f0
     nop.i                 999;;
}
 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_poly_p1  =    f8,acosf_coeff_P1,f0
     nop.i                      999
} 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_2poly_p1 =    acosf_coeff_P1,acosf_t,f1
     nop.i                      999;;
}

{     .mfi 
     nop.m                      999
     fma.s1    acosf_poly_p3  =    acosf_coeff_P4,acosf_x2,acosf_coeff_P3
     nop.i                      999
} 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_2poly_p6 =    acosf_coeff_P7,acosf_t,acosf_coeff_P6
     nop.i                      999;;
} 

{     .mfi 
     nop.m                      999
     fma.s1    acosf_poly_p7  =    acosf_x2,acosf_coeff_P8,acosf_coeff_P7
     nop.i                      999
} 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_2poly_p2 =    acosf_coeff_P3,acosf_t,acosf_coeff_P2
     nop.i                      999;;
}

 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_poly_p5  =    acosf_x2,acosf_coeff_P6,acosf_coeff_P5
     nop.i                      999
} 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_2poly_p4 =    acosf_coeff_P5,acosf_t,acosf_coeff_P4
     nop.i                      999;;
}

 
{     .mfi 
     nop.m                 999
     fma.s1    acosf_x11 =    acosf_x8,acosf_x3,f0
     nop.i                 999
} 
{     .mfi 
     nop.m                 999
     fnma.s1   acosf_dz  =    acosf_B2,acosf_yby2,acosf_1by2
     nop.i                 999;;
}

 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_poly_p1a =    acosf_x2,acosf_poly_p1,f8
     nop.i                      999
}
{     .mfi 
     nop.m                      999
     fma.s1    acosf_2poly_p8 =    acosf_coeff_P9,acosf_t,acosf_coeff_P8
     nop.i                      999;;
}

 
// Get the absolute value of x and determine the region in which x lies

{     .mfi 
     nop.m                      999
     fcmp.le.s1     p7,p8 = acosf_abs_x,acosf_const_sqrt2by2
     nop.i                      999
} 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_poly_p2  =    acosf_x2,acosf_poly_p3,acosf_coeff_P2
     nop.i                      999;;
}

 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_poly_p7a =    acosf_x4,acosf_coeff_P9,acosf_poly_p7
     nop.i                      999
} 
{     .mfi 
     nop.m                      999
     fma.s1    acosf_2poly_p2a =    acosf_2poly_p2,acosf_t2,acosf_2poly_p1
     nop.i                      999;;
}

 
{     .mfi 
     nop.m                                                         999
(p8) fma.s1    acosf_sgnx_t4  =    acosf_sgn_x,acosf_t4,f0
     nop.i                                                         999
} 
{     .mfi 
     nop.m                      999
(p8) fma.s1    acosf_2poly_p4a =    acosf_2poly_p6,acosf_t2,acosf_2poly_p4
     nop.i                      999;;
}

 
{     .mfi 
     nop.m                 999
(p8) fma.s1    acosf_Sz  =    acosf_5by2,acosf_dz,acosf_3by2
     nop.i                 999
} 
{     .mfi 
     nop.m                 999
(p8) fma.s1    acosf_d2z =    acosf_dz,acosf_dz,f0
     nop.i                 999;;
}

 
{     .mfi 
     nop.m                           999
(p8) fnma.d.s1   acosf_sgn_x_piby2 =    acosf_sgn_x,acosf_const_piby2,acosf_const_piby2
     nop.i                           999
} 
{     .mfi 
     nop.m                      999
(p7) fma.s1    acosf_poly_Ax  =    acosf_x5,acosf_poly_p2,acosf_poly_p1a
     nop.i                 999;;
} 
 
{     .mfi 
     nop.m                      999
(p7) fma.s1    acosf_poly_Bx  =    acosf_x4,acosf_poly_p7a,acosf_poly_p5
     nop.i                      999
} 
{     .mfi 
     nop.m                           999
(p8) fma.s1    acosf_sgnx_2poly_p2 =    acosf_sgn_x,acosf_2poly_p2a,f0
     nop.i                           999;;
} 
 
{     .mfi 
     nop.m                      999
     fcmp.eq.s0 p6,p0 = f8,f0      // Only purpose is to set D if x denormal
     nop.i                      999
}
{     .mfi 
     nop.m                      999
(p8) fma.s1    acosf_2poly_p4b =    acosf_2poly_p8,acosf_t4,acosf_2poly_p4a
     nop.i                      999;;
}

 
{     .mfi 
     nop.m                      999
(p8) fma.s1    acosf_Fz  =    acosf_d2z,acosf_Sz,acosf_dz
     nop.i                 999;;
} 

 
{     .mfi 
     nop.m                 999
(p8) fma.d.s1  acosf_Pt  =    acosf_2poly_p4b,acosf_sgnx_t4,acosf_sgnx_2poly_p2
     nop.i                 999;;
} 
 
{     .mfi 
     nop.m                 999
(p8) fma.d.s1  acosf_z   =    acosf_Az,acosf_Fz,acosf_Az
     nop.i                 999 ;;
} 
 
{     .mfi 
     nop.m                      999
(p7) fma.d.s1  acosf_sinf1    =    acosf_x11,acosf_poly_Bx,acosf_poly_Ax
     nop.i                      999;;
} 
 
.pred.rel "mutex",p8,p7    //acosf_pred_GTsqrt2by2,acosf_pred_LEsqrt2by2
{     .mfi 
      nop.m            999
(p8)  fma.s.s0     f8   =    acosf_z,acosf_Pt,acosf_sgn_x_piby2
      nop.i            999
} 
 
{     .mfb 
      nop.m            999
(p7)  fms.s.s0     f8   =    acosf_const_piby2,f1,acosf_sinf1
      br.ret.sptk b0 ;;
} 

ACOSF_ZERO:
// Here if x=0
{     .mfb 
      nop.m                 999
      fma.s.s0    f8 =    acosf_const_piby2,f1,f0  // acosf(0)=pi/2
      br.ret.sptk b0 ;;
} 


ACOSF_ABS_ONE:
.pred.rel "mutex",p11,p12
// Here if |x|=1
{     .mfi 
      nop.m                 999
(p11) fma.s.s0    f8 =    acosf_const_piby2,f1,acosf_const_piby2 // acosf(-1)=pi
      nop.i                 999
} 
{     .mfb 
      nop.m                 999
(p12) fma.s.s0    f8 =    f1,f0,f0 // acosf(1)=0
      br.ret.sptk b0 ;;
} 

GLOBAL_LIBM_END(acosf)


// Stack operations when calling error support.
//       (1)               (2)
//   sp   -> +          psp -> +
//           |                 |
//           |                 | <- GR_Y
//           |                 |
//           | <-GR_Y      Y2->|
//           |                 |
//           |                 | <- GR_X
//           |                 |
//  sp-64 -> +          sp ->  +
//    save ar.pfs          save b0
//    save gp


// Stack operations when calling error support.
//     (3) (call)              (4)
//  psp -> +                   sp -> +
//         |                         |
//    R3 ->| <- GR_RESULT            | -> f8
//         |                         |
//    Y2 ->| <- GR_Y                 |
//         |                         |
//    X1 ->|                         |
//         |                         |
//  sp ->  +                         +
//                              restore gp
//                              restore ar.pfs


LOCAL_LIBM_ENTRY(__libm_error_region)
.prologue
{ .mfi
        add   GR_Parameter_Y=-32,sp             // Parameter 2 value
                nop.f 999
.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
        stfs [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
{ .mfi
        nop.m 0
        frcpa.s0 f9,p0 = f0,f0
        nop.i 0
};;

{ .mib
        stfs [GR_Parameter_X] = f8            // Store Parameter 1 on stack
        add   GR_Parameter_RESULT = 0,GR_Parameter_Y
        nop.b 0                                 // Parameter 3 address
}
{ .mib
        stfs [GR_Parameter_Y] = f9           // 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
};;

{ .mmi
        ldfs  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#
