/***********************************************************************************/
/** MIT License **/
/** ----------- **/
/** **/  
/** Copyright (c) 2002-2019 Advanced Micro Devices, Inc. **/
/** **/
/** Permission is hereby granted, free of charge, to any person obtaining a copy **/
/** of this Software and associated documentaon files (the "Software"), to deal **/
/** in the Software without restriction, including without limitation the rights **/
/** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell **/
/** copies of the Software, and to permit persons to whom the Software is **/
/** furnished to do so, subject to the following conditions: **/
/** **/ 
/** The above copyright notice and this permission notice shall be included in **/
/** all copies or substantial portions of the Software. **/
/** **/
/** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR **/
/** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, **/
/** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE **/
/** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER **/
/** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, **/
/** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN **/
/** THE SOFTWARE. **/
/***********************************************************************************/

#ifndef __LIBM_NEW_H__
#define __LIBM_NEW_H__

// Defines, protos, etc for *new* math funcs updated by AMD 11/2008
// Old files will continue to include libm_util.h, libm.h, libm_inlines.h
// until such time as these have all been refreshed w/ new versions.

typedef float F32;
typedef unsigned int U32;

typedef double F64;
typedef unsigned long long U64;

union UT32_ 
{
    F32 f32;
    U32 u32;
};

union UT64_ 
{
    F64 f64;
    U64 u64;
    
    F32 f32[2];
    U32 u32[2];
};

typedef union UT32_ UT32;
typedef union UT64_ UT64;

#define SIGN_MASK_32        0x80000000
#define MANTISSA_MASK_32    0x007fffff
#define EXPONENT_MASK_32    0x7f800000
#define QNAN_MASK_32        0x00400000

#define INF_POS_32          0x7f800000
#define INF_NEG_32          0xff800000
#define QNAN_POS_32         0x7fc00000
#define QNAN_NEG_32         0xffc00000
#define IND_32              0xffc00000

#define EXPONENT_FULL_32    0x7f800000
#define SIGN_SET_32         0x80000000
#define QNAN_SET_32         0x00400000

#define INF_POS_64          0x7ff0000000000000
#define INF_NEG_64          0xfff0000000000000

#define MANTISSA_MASK_64    0x000fffffffffffff
#define SIGN_MASK_64        0x8000000000000000
#define IND_64              0xfff8000000000000
#define QNAN_MASK_64        0x0008000000000000

// constants for 'flags' argument of _handle_error and _handle_errorf
#define AMD_F_INEXACT     0x00000010
#define AMD_F_OVERFLOW    0x00000001
#define AMD_F_UNDERFLOW   0x00000002
#define AMD_F_DIVBYZERO   0x00000004
#define AMD_F_INVALID     0x00000008

// define the Microsoft specific error handling routine

// Note to mainainers: 
// These prototypes may appear, at first glance, to differ from the versions
// declared in libm_inlines.h and defined in libm_error.c.  The third 
// parameter appears to have changed type from unsigned long to unsigned long
// long.  In fact they are the same because in both of the aforementioned 
// files, long has been #defined to __int64 in a most cowardly fashion.  This
// disgusts me.  The buck stops here. - MAS

double _handle_error(
        char *fname,
        int opcode,
        unsigned long long value,
        int type,
        int flags,
        int error,
        double arg1,
        double arg2,
        int nargs
        );
float _handle_errorf(
        char *fname,
        int opcode,
        unsigned long long value,
        int type,
        int flags,
        int error,
        float arg1,
        float arg2,
        int nargs
        );

#endif // __LIBM_NEW_H