.file "libm_frexp.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/20/00 Improved speed
// 06/01/00 Fixed bug when x a double-extended denormal
// 12/08/00 Corrected label on .endp
// 01/23/02 Added handling for int 32 or 64 bits
// 05/20/02 Cleaned up namespace and sf0 syntax
// 02/10/03 Reordered header: .section, .global, .proc, .align
//
// API
//==============================================================
// double __libm_frexp(double x, int* y, int int_type)
// input  floating point f8, pointer to y (r33), int int_type (r34)
// output floating point f8, returns the fraction of x, 0.5 <= fraction < 1.0
// output int* y, returns the true exponent of x
//
// int_type = 0 if int is 32 bits
// int_type = 1 if int is 64 bits
//
// int* y is returned as a 32 bit integer if int_type = 0
// int* y is returned as a 64 bit integer if int_type = 1
//
// Overview of operation
//==============================================================
// break a floating point x number into fraction and an exponent
// The fraction is returned as a double
// The exponent is returned as an integer pointed to by y
//    This is a true (not a biased exponent) but 0fffe is subtracted
//    as a bias instead of 0xffff. This is because the fraction returned
//    is between 0.5 and 1.0, not the expected IEEE range.
//
// The fraction is 0.5 <= fraction < 1.0
//
// Registers used
//==============================================================
//
// general registers:
// r14  exponent bias for x negative
// r15  exponent bias for x positive
// r16  signexp of x
// r17  exponent mask
// r18  exponent of x
// r19  exponent result
// r20  signexp of 2^64
// r32  on input contains the 64-bit IEEE double that is in f8
// r33  on input pointer to 32-bit or 64-bit integer for exponent
// r34  on input contains 0 if output int is 32 bits, else output int is 64 bits
//
// predicate registers:
// p6   set if x is Nan, zero, or infinity
// p7   set if x negative
// p8   set if x positive
// p9   set if x double-extended denormal
// p10  set if int_type = 0, 32-bit integer
// p11  set if int_type = 1, 64-bit integer
//
// floating-point registers:
// f8  input, output
// f9  normalized x
// f10 signexp for significand result for x positive
// f11 signexp for significand result for x negative
// f12 2^64

.section .text
GLOBAL_LIBM_ENTRY(__libm_frexp)

// Set signexp for significand result for x>0
// If x is a NaN, zero, or infinity, return it.
// Put 0 in the int pointer.
// x NAN, ZERO, INFINITY?
// Set signexp for significand result for x<0
{ .mfi
        mov         r15 = 0x0fffe
        fclass.m    p6,p7 = f8, 0xe7
        mov         r14 = 0x2fffe
}
// Form signexp of 2^64 in case x double-extended denormal
// Save the normalized value of input in f9
// The normalization also sets fault flags and takes faults if necessary
{ .mfi
        mov         r20 = 0x1003f
        fnorm.s0    f9 = f8
        nop.i 999 ;;
}

// Move signexp for significand result for x>0 to FP reg
// Form 2^64 in case x double-extended denormal
{ .mmi
        setf.exp    f10 = r15
        setf.exp    f12 = r20
        nop.i 999 ;;
}

// Move signexp for significand result for x<0 to FP reg
// p7 if x<0, else p8
// If x=0,nan,inf, set p10 if output int to be 32 bits, or set p11 if 64 bits
{ .mfi
        setf.exp    f11 = r14
(p7)    fcmp.lt.s0  p7,p8 = f8,f0
(p6)    cmp.eq.unc  p10,p11 = r34, r0 ;;
}

// If x NAN, ZERO, INFINITY, set *y=0 and exit
{ .mmb
(p10)   st4         [r33] = r0      // Store *y=0 as 32-bit integer
(p11)   st8         [r33] = r0      // Store *y=0 as 64-bit integer
(p6)    br.ret.spnt b0 ;;
}

// Form exponent mask
// Test for fnorm(x) denormal, means x double-extended denormal
{ .mfi
        mov         r17 = 0x1ffff
        fclass.m    p9,p0 = f9, 0x0b
        nop.i 999 ;;
}

// If x double-extended denormal add 64 to exponent bias for scaling
// If x double-extended denormal multiply x * 2^64 which is normal
// Set p10 if output int to be 32 bits, or set p11 if 64 bits
{ .mfi
(p9)    add         r15 = 64, r15
(p9)    fmpy.s0     f9 = f9, f12
        cmp.eq      p10,p11 = r34, r0 ;;
}

// true exponent stored to int pointer
// the bias is treated as 0xfffe instead of
// normal 0xffff because we want the significand
// to be in the range <=0.5 sig < 1.0
// Store the value of the exponent at the pointer in r33

// If x>0 form significand result
{ .mfi
        nop.m 999
(p8)    fmerge.se   f8 = f10,f9
        nop.i 999  ;;
}

// Get signexp of normalized x
// If x<0 form significand result
{ .mfi
        getf.exp    r16 = f9
(p7)    fmerge.se   f8 = f11,f9
        nop.i 999  ;;
}

// Get exp of normalized x
// Subtract off bias to get true exponent of x
{ .mmi
        and         r18 = r17,r16 ;;
        sub         r19 = r18,r15
        nop.i 999  ;;
}

// Store int *y as a 32-bit integer
// Make the value a double
{ .mfi
(p10)   st4         [r33] = r19        // Store *y as 32-bit integer
        fnorm.d.s0  f8 = f8
        nop.i 999
}
{ .mfb
(p11)   st8         [r33] = r19        // Store *y as 64-bit integer
        nop.f 999
        br.ret.sptk b0 ;;
}

GLOBAL_LIBM_END(__libm_frexp)
