.file "remainderl.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
// 03/02/00 New algorithm 
// 04/04/00 Unwind support added
// 07/21/00 Fixed quotient=2^{24*m+23}*1.q1...q23 1 bug
// 08/15/00 Bundle added after call to __libm_error_support to properly
//          set [the previously overwritten] GR_Parameter_RESULT.
// 11/29/00 Set FR_Y to f9
// 05/20/02 Cleaned up namespace and sf0 syntax
// 02/10/03 Reordered header: .section, .global, .proc, .align
//
// API
//====================================================================
// long double remainderl(long double,long double);   
//
// Overview of operation
//====================================================================
//  remainder(a,b)=a-i*b,
//  where i is an integer such that, if b!=0 and a is finite, 
//  |a/b-i|<=1/2. If |a/b-i|=1/2, i is even.
//
// Algorithm
//====================================================================
// a). eliminate special cases
// b). if |a/b|<0.25 (first quotient estimate), return a
// c). use single precision divide algorithm to get quotient q
//     rounded to 24 bits of precision 
// d). calculate partial remainders (using both q and q-ulp); 
//     select one and RZ(a/b) based on the sign of |a|-|b|*q   
// e). if the exponent difference (exponent(a)-exponent(b))
//     is less than 24 (quotient estimate<2^{24}-2), use RZ(a/b) 
//     and sticky bits to round to integer; exit loop and
//     calculate final remainder
// f). if exponent(a)-exponent(b)>=24, select new value of a as
//     the partial remainder calculated using RZ(a/b); 
//     repeat from c). 
//
// Special cases
//====================================================================
// a=+/- Inf, or b=+/-0: return NaN, call libm_error_support
// a=NaN or b=NaN: return NaN
//
// Registers used
//====================================================================
// Predicate registers: p6-p14
// General registers:   r2,r3,r28,r29,r32 (ar.pfs), r33-r39
// Floating point registers: f6-f15,f32
//

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             = f9
FR_RESULT        = f8


.section .text
GLOBAL_IEEE754_ENTRY(remainderl)

// inputs in f8, f9
// result in f8

{ .mfi
  alloc r32=ar.pfs,1,4,4,0
  // f13=|a|
  fmerge.s f13=f0,f8
  nop.i 0
}
  {.mfi
  getf.sig r29=f9
  // f14=|b|
  fmerge.s f14=f0,f9
  nop.i 0;;
}
 {.mlx
  mov r28=0x2ffdd
  // r2=2^{23}
  movl r3=0x4b000000;;
}


{.mmi
setf.exp f32=r28
nop.m 0
// y pseudo-zero ?
cmp.eq p11,p10=r29,r0;;
}

// Y +-NAN, +-inf, +-0?     p11
{ .mfi
      nop.m 999
(p10)  fclass.m  p11,p10 = f9, 0xe7           
      nop.i 999
}
// qnan snan inf norm     unorm 0 -+
// 1    1    1   0        0     0 11
// e                      3
// X +-NAN, +-inf, ?        p9
{ .mfi
      nop.m 999
      fclass.m.unc  p9,p8 = f8, 0xe3           
      nop.i 999;; 
}

{.mfi
  nop.m 0
  mov f12=f0
  nop.i 0
}
{ .mfi
  // set p7=1
  cmp.eq.unc p7,p0=r0,r0
  // Step (1)
  // y0 = 1 / b in f10
  frcpa.s1 f10,p6=f13,f14
  nop.i 0;;
} 
// Y +-NAN, +-inf, +-0?     p11
{ .mfi
      nop.m 999
	  // pseudo-NaN ?
(p10)  fclass.nm  p11,p0 = f9, 0xff           
      nop.i 999
}

// qnan snan inf norm     unorm 0 -+
// 1    1    1   0        0     0 11
// e                      3
// X +-NAN, +-inf, ?        p9

{ .mfi
      nop.m 999
(p8)  fclass.nm  p9,p0 = f8, 0xff          
      nop.i 999;;
}

{.bbb
  (p9) br.cond.spnt FREM_X_NAN_INF
  (p11) br.cond.spnt FREM_Y_NAN_INF_ZERO
  nop.b 0
}  {.mfi
   nop.m 0
   // set D flag if a (f8) is denormal
   fnma.s0 f6=f8,f1,f8
   nop.i 0;;
} 

remloop24: 
  { .mfi
  nop.m 0
  // Step (2)
  // q0 = a * y0 in f15
  (p6) fma.s1 f12=f13,f10,f0
  nop.i 0
} { .mfi
  nop.m 0
  // Step (3)
  // e0 = 1 - b * y0 in f7
  (p6) fnma.s1 f7=f14,f10,f1
  nop.i 0;;
}  {.mlx
  nop.m 0
  // r2=1.25*2^{-24}
  movl r2=0x33a00000;;
} 

{.mfi
  nop.m 0
  // q1=q0*(1+e0)
  (p6) fma.s1 f15=f12,f7,f12
  nop.i 0
}
{ .mfi
  nop.m 0
  // Step (4)
  // e1 = e0 * e0 + E in f7
  (p6) fma.s1 f7=f7,f7,f32
  nop.i 0;;
}
 {.mii
  (p7) getf.exp r29=f12
  (p7) mov r28=0xfffd
  nop.i 0;;
}

 { .mfi
  // f12=2^{23}
  setf.s f12=r3
  // Step (5)
  // q2 = q1 + e1 * q1 in f11
  (p6) fma.s.s1 f11=f7,f15,f15
  nop.i 0
} { .mfi
   nop.m 0
  // Step (6)
  // q2 = q1 + e1 * q1 in f6
  (p6) fma.s1 f6=f7,f15,f15
  nop.i 0;;
} 

 {.mmi
  // f15=1.25*2^{-24}
  setf.s f15=r2
  // q<1/4 ? (i.e. expon< -2) 
  (p7) cmp.gt p7,p0=r28,r29
  nop.i 0;;
}

{.mfb
  // r29= -32+bias
  mov r29=0xffdf
 // if |a/b|<1/4, set D flag before returning 
 (p7) fma.s0 f9=f9,f0,f8
  nop.b 0;;
}
 {.mfb
 nop.m 0
 // can be combined with bundle above if sign of 0 or
 // FTZ enabled are not important
 (p7) fmerge.s f8=f8,f9
 // return if |a|<4*|b| (estimated quotient < 1/4)
 (p7) br.ret.spnt b0;;
}
  {.mfi
  // f7=2^{-32}
  setf.exp f7=r29
  // set f8 to current a value | sign
  fmerge.s f8=f8,f13
  nop.i 0;;
} 
  {.mfi
  getf.exp r28=f6
  // last step ? (q<2^{23})
  fcmp.lt.unc.s1 p0,p12=f6,f12
  nop.i 0;;
}
  {.mfi
  nop.m 0
  // r=a-b*q
  fnma.s1 f6=f14,f11,f13
  nop.i 0
} {.mfi
  // r2=23+bias
  mov r2=0xffff+23
  // q'=q-q*(1.25*2^{-24})   (q'=q-ulp)
  fnma.s.s1 f15=f11,f15,f11
  nop.i 0;;
}
  {.mmi
  nop.m 0
  cmp.eq p11,p14=r2,r28
  nop.i 0;;
} 

.pred.rel "mutex",p11,p14
  {.mfi
  nop.m 0
  // if exp_q=2^23, then r=a-b*2^{23}
  (p11) fnma.s1 f13=f12,f14,f13
  nop.i 0
} 
{.mfi
  nop.m 0
  // r2=a-b*q'
  (p14) fnma.s1 f13=f14,f15,f13
  nop.i 0;;
}
  {.mfi
  nop.m 0
  // r>0 iff q=RZ(a/b) and inexact
  fcmp.gt.unc.s1 p8,p0=f6,f0
  nop.i 0
} {.mfi
  nop.m 0
  // r<0 iff q'=RZ(a/b) and inexact
  (p14) fcmp.lt.unc.s1 p9,p10=f6,f0
  nop.i 0;;
}

.pred.rel "mutex",p8,p9
  {.mfi
   nop.m 0 
  // (p8) Q=q+(last iteration ? sticky bits:0)
  // i.e. Q=q+q*x  (x=2^{-32} or 0)
  (p8) fma.s1 f11=f11,f7,f11
  nop.i 0
} {.mfi
  nop.m 0
  // (p9) Q=q'+(last iteration ? sticky bits:0)
  // i.e. Q=q'+q'*x  (x=2^{-32} or 0)
  (p9) fma.s1 f11=f15,f7,f15
  nop.i 0;;
}

  {.mfb
  nop.m 0
  //  (p9) set r=r2 (new a, if not last iteration)
  // (p10) new a =r
  (p10) mov f13=f6
  (p12) br.cond.sptk remloop24;;
} 

// last iteration
  {.mfi
  nop.m 0
  // set f9=|b|*sgn(a)
  fmerge.s f9=f8,f9
  nop.i 0
}
  {.mfi
  nop.m 0
  // round to integer
  fcvt.fx.s1 f11=f11
  nop.i 0;;
}
  {.mfi
  nop.m 0
  // save sign of a
  fmerge.s f7=f8,f8
  nop.i 0
} {.mfi 
  nop.m 0
  // normalize
  fcvt.xf f11=f11
  nop.i 0;;
} 
  {.mfi
  nop.m 0
  // This can be removed if sign of 0 is not important 
  // get remainder using sf1
  fnma.s1 f12=f9,f11,f8
  nop.i 0
}
  {.mfi
  nop.m 0
  // get remainder
  fnma.s0 f8=f9,f11,f8
  nop.i 0;;
}
  {.mfi
  nop.m 0
  // f12=0?
  // This can be removed if sign of 0 is not important 
  fcmp.eq.unc.s1 p8,p0=f12,f0
  nop.i 0;;
}
  {.mfb
  nop.m 0
  // if f8=0, set sign correctly
  // This can be removed if sign of 0 is not important 
  (p8) fmerge.s f8=f7,f8
  // return
  br.ret.sptk b0;;
}



FREM_X_NAN_INF: 

// Y zero ?
{.mfi 
  nop.m 0
  fma.s1 f10=f9,f1,f0
  nop.i 0;;
}
{.mfi
 nop.m 0
 fcmp.eq.unc.s1 p11,p0=f10,f0
 nop.i 0;;
}
{.mib
  nop.m 0
  nop.i 0
  // if Y zero
  (p11) br.cond.spnt FREM_Y_ZERO;;                        
}

// X infinity? Return QNAN indefinite
{ .mfi
      nop.m 999
      fclass.m.unc  p8,p0 = f8, 0x23 
      nop.i 999
}
// X infinity? Return QNAN indefinite
{ .mfi
      nop.m 999
      fclass.m.unc  p11,p0 = f8, 0x23 
      nop.i 999;; 
}
// Y NaN ?
{.mfi
	 nop.m 999
(p8) fclass.m.unc p0,p8=f9,0xc3
	 nop.i 0;;
}
{.mfi
	nop.m 999
	// also set Denormal flag if necessary
(p8) fnma.s0 f9=f9,f1,f9
    nop.i 0
} 
{ .mfi
      nop.m 999
(p8)  frcpa.s0 f8,p7 = f8,f8           
      nop.i 999 ;;
}

{.mfi
      nop.m 999
(p11) mov f10=f8
	  nop.i 0
}
{ .mfi
     nop.m 999
(p8) fma.s0 f8=f8,f1,f0                     
	 nop.i 0 ;;                        
}

{ .mfb
      nop.m 999
      frcpa.s0 f8,p7=f8,f9                     
	  (p11) br.cond.spnt EXP_ERROR_RETURN;;                        
}
{ .mib
	nop.m 0
	nop.i 0
	br.ret.spnt    b0 ;;                        
}


FREM_Y_NAN_INF_ZERO: 
// Y INF
{ .mfi
      nop.m 999
      fclass.m.unc  p7,p0 = f9, 0x23           
      nop.i 999 ;;
}

{ .mfb
      nop.m 999
(p7)  fma.s0 f8=f8,f1,f0                     
(p7)  br.ret.spnt    b0 ;;                        
}

// Y NAN?
{ .mfi
      nop.m 999
      fclass.m.unc  p9,p10 = f9, 0xc3           
      nop.i 999 ;;
}
{ .mfi
      nop.m 999
(p10)  fclass.nm  p9,p0 = f9, 0xff           
      nop.i 999 ;;
}

{ .mfb
      nop.m 999
(p9)  fma.s0 f8=f9,f1,f0                     
(p9)  br.ret.spnt    b0 ;;                        
}

FREM_Y_ZERO:
// Y zero? Must be zero at this point
// because it is the only choice left.
// Return QNAN indefinite

// X NAN?
{ .mfi
      nop.m 999
      fclass.m.unc  p9,p10 = f8, 0xc3           
      nop.i 999 ;;
}
{ .mfi
      nop.m 999
(p10)  fclass.nm  p9,p10 = f8, 0xff           
      nop.i 999 ;;
}

{.mfi
 nop.m 999
 (p9) frcpa.s0 f11,p7=f8,f0
 nop.i 0;;
}
{ .mfi
      nop.m 999
(p10)  frcpa.s0   f11,p7 = f0,f0           
	  nop.i 999;;
}

{ .mfi
      nop.m 999
      fmerge.s      f10 = f8, f8             
      nop.i 999
}

{ .mfi
      nop.m 999
      fma.s0 f8=f11,f1,f0                     
      nop.i 999;;
}

EXP_ERROR_RETURN: 

{ .mib
      mov   GR_Parameter_TAG = 123                                 
	  nop.i 999
      br.sptk __libm_error_region;; 
}

GLOBAL_IEEE754_END(remainderl)

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
        stfe [GR_Parameter_Y] = FR_Y,16         // Save 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
        stfe [GR_Parameter_X] = FR_X            // Store Parameter 1 on stack 
        add   GR_Parameter_RESULT = 0,GR_Parameter_Y  
	nop.b 0                                 // Parameter 3 address
}
{ .mib
        stfe [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
        nop.m 0
        nop.m 0
        add   GR_Parameter_RESULT = 48,sp
};;
{ .mmi
        ldfe  f8 = [GR_Parameter_RESULT]       // Get return result off stack
.restore sp
        add   sp = 64,sp                       // Restore stack pointer
        mov   b0 = GR_SAVE_B0                  // Restore return address
};;
{ .mib
        mov   gp = GR_SAVE_GP                  // Restore gp 
        mov   ar.pfs = GR_SAVE_PFS             // Restore ar.pfs
        br.ret.sptk     b0                     // Return
};; 

LOCAL_LIBM_END(__libm_error_region)


.type   __libm_error_support#,@function
.global __libm_error_support#




