/*
* Copyright 1996 1995 by Open Software Foundation, Inc.
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appears in all copies and
* that both the copyright notice and this permission notice appear in
* supporting documentation.
*
* OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
* NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* pmk1.1
*/
/*
* (c) Copyright 1986 HEWLETT-PACKARD COMPANY
*
* To anyone who acknowledges that this file is provided "AS IS"
* without any express or implied warranty:
* permission to use, copy, modify, and distribute this file
* for any purpose is hereby granted without fee, provided that
* the above copyright notice and this notice appears in all
* copies, and that the name of Hewlett-Packard Company not be
* used in advertising or publicity pertaining to distribution
* of the software without specific, written prior permission.
* Hewlett-Packard Company makes no representations about the
* suitability of this software for any purpose.
*/
#include <sys/cdefs.h>
/******************************
* Single precision functions *
******************************/
/* sgl_and_signs ands the sign bits of each argument and puts the result
* into the first argument. sgl_or_signs ors those same sign bits */
#define Sgl_and_signs( src1dst, src2) \
Sall(src1dst) = (Sall(src2)|~(1<<31)) & Sall(src1dst)
#define Sgl_or_signs( src1dst, src2) \
Sall(src1dst) = (Sall(src2)&(1<<31)) | Sall(src1dst)
/* The hidden bit is always the low bit of the exponent */
#define Sgl_clear_exponent_set_hidden(srcdst) Deposit_sexponent(srcdst,1)
#define Sgl_clear_signexponent_set_hidden(srcdst) \
Deposit_ssignexponent(srcdst,1)
#define Sgl_clear_sign(srcdst) Sall(srcdst) &= ~(1<<31)
#define Sgl_clear_signexponent(srcdst) Sall(srcdst) &= 0x007fffff
/* varamount must be less than 32 for the next three functions */
#define Sgl_rightshift(srcdst, varamount) \
Sall(srcdst) >>= varamount
#define Sgl_leftshift(srcdst, varamount) \
Sall(srcdst) <<= varamount
#define Sgl_rightshift_exponentmantissa(srcdst, varamount) \
Sall(srcdst) = \
(Sexponentmantissa(srcdst) >> (varamount)) | (Sall(srcdst) & (1<<31))
#define Sgl_copytoint_exponentmantissa(source,dest) \
dest = Sexponentmantissa(source)
/* A quiet NaN has the high mantissa bit clear and at least on other (in this
* case the adjacent bit) bit set. */
#define Sgl_set_quiet(sgl_value) Deposit_shigh2mantissa(sgl_value,1)
#define Sgl_set_exponent(sgl_value,exp) Deposit_sexponent(sgl_value,exp)
/* Use following macro for both overflow & underflow conditions */
#define ovfl -
#define unfl +
#define Sgl_setwrapped_exponent(sgl_value,exponent,op) \
Deposit_sexponent(sgl_value,(exponent op SGL_WRAP))
/* The high bit is always zero so arithmetic or logical shifts will work. */
#define Sgl_right_align(srcdst,shift,extent) \
/* sgl_floating_point srcdst; int shift; extension extent */ \
if (shift < 32) { \
Extall(extent) = Sall(srcdst) << (32-(shift)); \
Sall(srcdst) >>= shift; \
} \
else { \
Extall(extent) = Sall(srcdst); \
Sall(srcdst) = 0; \
}
#define Sgl_hiddenhigh3mantissa(sgl_value) Shiddenhigh3mantissa(sgl_value)
#define Sgl_hidden(sgl_value) Shidden(sgl_value)
#define Sgl_lowmantissa(sgl_value) Slow(sgl_value)
/* The left argument is never smaller than the right argument */
#define Sgl_subtract(sgl_left,sgl_right,sgl_result) \
Sall(sgl_result) = Sall(sgl_left) - Sall(sgl_right)
/* Subtract right augmented with extension from left augmented with zeros and
* store into result and extension. */
#define Sgl_subtract_withextension(left,right,extent,result) \
/* sgl_floating_point left,right,result; extension extent */ \
Sgl_subtract(left,right,result); \
if((Extall(extent) = 0-Extall(extent))) \
Sall(result) = Sall(result)-1
sgl_floating_point sgl_setoverflow(unsigned int);
int sgl_fadd(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
int sgl_fcmp(sgl_floating_point *, sgl_floating_point *, unsigned int, unsigned int *);
int sgl_fdiv(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
int sgl_fmpy(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
int sgl_frem(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
int sgl_fsqrt(sgl_floating_point *, sgl_floating_point *, unsigned int *);
int sgl_fsub(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
int sgl_frnd(sgl_floating_point *, sgl_floating_point *, unsigned int *);