#include "fp_private.h"
#if defined(BUILDING_FOR_CARBONCORE_LEGACY)
double fdim ( double x, double y )
{
if (unlikely((x != x) || (y != y)))
return ( x + y );
else if (x > y)
return ( x - y );
else
return 0.0;
}
#define __fmax(x, y) \
({ \
double __value, __argx = (x), __argy = (y); \
asm volatile ( \
"fcmpu cr0,%1,%2 ; /* Compare unordered */ \n \
blt cr0, 0f ; /* Order discerned? Then we have our answer */ \n \
bnu+ cr0, 1f ; /* Opposite order discerned? Then we have our answer */ \n \
fcmpu cr1,%2,%2 ; /* x, y or both are NAN. Is y NAN? */ \n \
bun- cr1, 1f ; /* If so, x is our answer */ \n \
0: fmr %0, %2; /* Else y is our answer */ \n \
b 2f \n \
1: fmr %0,%1; \n \
2: \n \
": "=f"(__value) : "f" (__argx), "f" (__argy)); \
__value; \
})
#if 0
double fmax ( double x, double y )
{
if (x != x)
return y;
else if (y != y)
return x;
else if (x < y)
return y;
else
return x;
}
#else
double fmax ( double x, double y )
{
return __fmax( x, y );
}
#endif
#define __fmin(x, y) \
({ \
double __value, __argx = (x), __argy = (y); \
asm volatile ( \
"fcmpu cr0,%1,%2 ; /* Compare unordered */ \n \
bgt cr0, 0f ; /* Order discerned? Then we have our answer */ \n \
bnu+ cr0, 1f ; /* Opposite order discerned? Then we have our answer */ \n \
fcmpu cr1,%2,%2 ; /* x, y or both are NAN. Is y NAN? */ \n \
bun- cr1, 1f ; /* If so, x is our answer */ \n \
0: fmr %0, %2; /* Else y is our answer */ \n \
b 2f \n \
1: fmr %0,%1; \n \
2: \n \
": "=f"(__value) : "f" (__argx), "f" (__argy)); \
__value; \
})
#if 0
double fmin ( double x, double y )
{
if (x != x)
return y;
else if (y != y)
return x;
else if (x > y)
return y;
else
return x;
}
#else
double fmin ( double x, double y )
{
return __fmin( x, y );
}
#endif
#else
float fdimf ( float x, float y )
{
if (unlikely((x != x) || (y != y)))
return ( x + y );
else if (x > y)
return ( x - y );
else
return 0.0;
}
#define __fmaxf(x, y) \
({ \
float __value, __argx = (x), __argy = (y); \
asm volatile ( \
"fcmpu cr0,%1,%2 ; /* Compare unordered */ \n \
blt cr0, 0f ; /* Order discerned? Then we have our answer */ \n \
bnu+ cr0, 1f ; /* Opposite order discerned? Then we have our answer */ \n \
fcmpu cr1,%2,%2 ; /* x, y or both are NAN. Is y NAN? */ \n \
bun- cr1, 1f ; /* If so, x is our answer */ \n \
0: fmr %0, %2; /* Else y is our answer */ \n \
b 2f \n \
1: fmr %0,%1; \n \
2: \n \
": "=f"(__value) : "f" (__argx), "f" (__argy)); \
__value; \
})
#if 0
float fmaxf ( float x, float y )
{
if (x != x)
return y;
else if (y != y)
return x;
else if (x < y)
return y;
else
return x;
}
#else
float fmaxf ( float x, float y )
{
return __fmaxf( x, y );
}
#endif
#define __fminf(x, y) \
({ \
float __value, __argx = (x), __argy = (y); \
asm volatile ( \
"fcmpu cr0,%1,%2 ; /* Compare unordered */ \n \
bgt cr0, 0f ; /* Order discerned? Then we have our answer */ \n \
bnu+ cr0, 1f ; /* Opposite order discerned? Then we have our answer */ \n \
fcmpu cr1,%2,%2 ; /* x, y or both are NAN. Is y NAN? */ \n \
bun- cr1, 1f ; /* If so, x is our answer */ \n \
0: fmr %0, %2; /* Else y is our answer */ \n \
b 2f \n \
1: fmr %0,%1; \n \
2: \n \
": "=f"(__value) : "f" (__argx), "f" (__argy)); \
__value; \
})
#if 0
float fminf ( float x, float y )
{
if (x != x)
return y;
else if (y != y)
return x;
else if (x > y)
return y;
else
return x;
}
#else
float fminf ( float x, float y )
{
return __fminf( x, y );
}
#endif
double fma ( double x, double y, double z )
{
return __FMADD(x, y, z);
}
float fmaf ( float x, float y, float z )
{
return __FMADDS(x, y, z);
}
#endif