.file "roundf.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
//==============================================================
// 10/25/00 Initial version
// 06/14/01 Changed cmp to an equivalent form
// 05/20/02 Cleaned up namespace and sf0 syntax
// 01/20/03 Improved performance and reduced code size
// 04/18/03 Eliminate possible WAW dependency warning
// 09/03/03 Improved performance
//==============================================================

// API
//==============================================================
// float roundf(float x)
//==============================================================

// general input registers:
// r14 - r18

rSignexp   = r14
rExp       = r15
rExpMask   = r16
rBigexp    = r17
rExpHalf   = r18

// floating-point registers:
// f8 - f13

fXtruncInt = f9
fNormX     = f10
fHalf      = f11
fInc       = f12
fRem       = f13

// predicate registers used:
// p6 - p10

// Overview of operation
//==============================================================
// float roundf(float x)
// Return an integer value (represented as a float) that is x
// rounded to nearest integer, halfway cases rounded away from
// zero.
//  if x>0   result = trunc(x+0.5)
//  if x<0   result = trunc(x-0.5)
//
//==============================================================

// double_extended
// if the exponent is > 1003e => 3F(true) = 63(decimal)
// we have a significand of 64 bits 1.63-bits.
// If we multiply by 2^63, we no longer have a fractional part
// So input is an integer value already.

// double
// if the exponent is >= 10033 => 34(true) = 52(decimal)
// 34 + 3ff = 433
// we have a significand of 53 bits 1.52-bits. (implicit 1)
// If we multiply by 2^52, we no longer have a fractional part
// So input is an integer value already.

// single
// if the exponent is > 10016 => 17(true) = 23(decimal)
// we have a significand of 24 bits 1.23-bits. (implicit 1)
// If we multiply by 2^23, we no longer have a fractional part
// So input is an integer value already.


.section .text
GLOBAL_LIBM_ENTRY(roundf)

{ .mfi
      getf.exp         rSignexp  = f8        // Get signexp, recompute if unorm
      fcvt.fx.trunc.s1 fXtruncInt  = f8      // Convert to int in significand
      addl             rBigexp = 0x10016, r0 // Set exponent at which is integer
}
{ .mfi
      mov              rExpHalf    = 0x0FFFE // Form sign and exponent of 0.5
      fnorm.s1         fNormX  = f8          // Normalize input
      mov              rExpMask    = 0x1FFFF // Form exponent mask
}
;;

{ .mfi
      setf.exp         fHalf = rExpHalf      // Form 0.5
      fclass.m         p7,p0 = f8, 0x0b      // Test x unorm
      nop.i            0
}
;;

{ .mfb
      nop.m            0
      fclass.m         p6,p0 = f8, 0x1e3     // Test x natval, nan, inf
(p7)  br.cond.spnt     ROUND_UNORM           // Branch if x unorm
}
;;

ROUND_COMMON:
// Return here from ROUND_UNORM
{ .mfb
      nop.m            0
      fcmp.lt.s1       p8,p9 = f8, f0        // Test if x < 0
(p6)  br.cond.spnt     ROUND_SPECIAL         // Exit if x natval, nan, inf
}
;;

{ .mfi
      nop.m            0
      fcvt.xf          f8 = fXtruncInt        // Pre-Result if 0.5 <= |x| < 2^23
      nop.i            0
}
;;

{ .mfi
      and              rExp = rSignexp, rExpMask // Get biased exponent
      fmerge.s         fInc = fNormX, f1      // Form increment if |rem| >= 0.5
      nop.i            0
}
;;

{ .mmi
      cmp.lt           p6,p0 = rExp, rExpHalf // Is |x| < 0.5?
      cmp.ge           p7,p0 = rExp, rBigexp  // Is |x| >= 2^23?
      cmp.lt           p10,p0 = rExp, rExpHalf // Is |x| < 0.5?
}
;;

// We must correct result if |x| < 0.5, or |x| >= 2^23
.pred.rel "mutex",p6,p7
{ .mfi
      nop.m            0
(p6)  fmerge.s         f8 = fNormX, f0        // If |x| < 0.5, result sgn(x)*0
      nop.i            0
}
{ .mfb
(p7)  cmp.eq           p10,p0 = r0, r0        // Also turn on p10 if |x| >= 2^23
(p7)  fma.s.s0         f8 = fNormX, f1, f0    // If |x| >= 2^23, result x
(p10) br.ret.spnt      b0                     // Exit |x| < 0.5 or |x| >= 2^23
}
;;

// Here if 0.5 <= |x| < 2^23
{ .mfi
      nop.m            0
(p9)  fms.s1           fRem = fNormX, f1, f8  // Get remainder = x - trunc(x)
      nop.i            0
}
{ .mfi
      nop.m            0
(p8)  fms.s1           fRem = f8, f1, fNormX  // Get remainder = trunc(x) - x
      nop.i            0
}
;;

{ .mfi
      nop.m            0
      fcmp.ge.s1       p9,p0 = fRem, fHalf    // Test |rem| >= 0.5
      nop.i            0
}
;;

// If x < 0 and remainder <= -0.5, then subtract 1 from result
// If x > 0 and remainder >= +0.5, then add 1 to result
{ .mfb
      nop.m            0
(p9)  fma.s.s0         f8 = f8, f1, fInc
      br.ret.sptk      b0
}
;;


ROUND_SPECIAL:
// Here if x natval, nan, inf
{ .mfb
      nop.m            0
      fma.s.s0         f8 = f8, f1, f0
      br.ret.sptk      b0
}
;;

ROUND_UNORM:
// Here if x unorm
{ .mfi
      getf.exp         rSignexp  = fNormX     // Get signexp, recompute if unorm
      fcmp.eq.s0       p7,p0 = f8, f0         // Dummy op to set denormal flag
      nop.i            0
}
{ .mfb
      nop.m            0
      fcvt.fx.trunc.s1 fXtruncInt  = fNormX   // Convert to int in significand
      br.cond.sptk     ROUND_COMMON           // Return to main path
}
;;

GLOBAL_LIBM_END(roundf)
libm_alias_float_other (round, round)
