[BACK]Return to frnd.c CVS log [TXT][DIR] Up to [local] / sys / arch / hppa / spmath

Annotation of sys/arch/hppa/spmath/frnd.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: frnd.c,v 1.8 2003/04/10 17:27:58 mickey Exp $ */
                      2: /*
                      3:   (c) Copyright 1986 HEWLETT-PACKARD COMPANY
                      4:   To anyone who acknowledges that this file is provided "AS IS"
                      5:   without any express or implied warranty:
                      6:       permission to use, copy, modify, and distribute this file
                      7:   for any purpose is hereby granted without fee, provided that
                      8:   the above copyright notice and this notice appears in all
                      9:   copies, and that the name of Hewlett-Packard Company not be
                     10:   used in advertising or publicity pertaining to distribution
                     11:   of the software without specific, written prior permission.
                     12:   Hewlett-Packard Company makes no representations about the
                     13:   suitability of this software for any purpose.
                     14: */
                     15: /* @(#)frnd.c: Revision: 2.7.88.1 Date: 93/12/07 15:06:24 */
                     16:
                     17: #include "float.h"
                     18: #include "sgl_float.h"
                     19: #include "dbl_float.h"
                     20: #include "quad_float.h"
                     21: #include "cnv_float.h"
                     22:
                     23: /*
                     24:  *  Single Floating-point Round to Integer
                     25:  */
                     26:
                     27: /*ARGSUSED*/
                     28: int
                     29: sgl_frnd(srcptr, null, dstptr, status)
                     30:        sgl_floating_point *srcptr, *null, *dstptr;
                     31:        unsigned int *status;
                     32: {
                     33:        register unsigned int src, result;
                     34:        register int src_exponent;
                     35:        register int inexact = FALSE;
                     36:
                     37:        src = *srcptr;
                     38:        /*
                     39:         * check source operand for NaN or infinity
                     40:         */
                     41:        if ((src_exponent = Sgl_exponent(src)) == SGL_INFINITY_EXPONENT) {
                     42:                /*
                     43:                 * is signaling NaN?
                     44:                 */
                     45:                if (Sgl_isone_signaling(src)) {
                     46:                        /* trap if INVALIDTRAP enabled */
                     47:                        if (Is_invalidtrap_enabled()) return(INVALIDEXCEPTION);
                     48:                        /* make NaN quiet */
                     49:                        Set_invalidflag();
                     50:                        Sgl_set_quiet(src);
                     51:                }
                     52:                /*
                     53:                 * return quiet NaN or infinity
                     54:                 */
                     55:                *dstptr = src;
                     56:                return(NOEXCEPTION);
                     57:        }
                     58:        /*
                     59:         * Need to round?
                     60:         */
                     61:        if ((src_exponent -= SGL_BIAS) >= SGL_P - 1) {
                     62:                *dstptr = src;
                     63:                return(NOEXCEPTION);
                     64:        }
                     65:        /*
                     66:         * Generate result
                     67:         */
                     68:        if (src_exponent >= 0) {
                     69:                Sgl_clear_exponent_set_hidden(src);
                     70:                result = src;
                     71:                Sgl_rightshift(result,(SGL_P-1) - (src_exponent));
                     72:                /* check for inexact */
                     73:                if (Sgl_isinexact_to_fix(src,src_exponent)) {
                     74:                        inexact = TRUE;
                     75:                        /*  round result  */
                     76:                        switch (Rounding_mode()) {
                     77:                        case ROUNDPLUS:
                     78:                             if (Sgl_iszero_sign(src)) Sgl_increment(result);
                     79:                             break;
                     80:                        case ROUNDMINUS:
                     81:                             if (Sgl_isone_sign(src)) Sgl_increment(result);
                     82:                             break;
                     83:                        case ROUNDNEAREST:
                     84:                             if (Sgl_isone_roundbit(src,src_exponent))
                     85:                                if (Sgl_isone_stickybit(src,src_exponent)
                     86:                                || (Sgl_isone_lowmantissa(result)))
                     87:                                        Sgl_increment(result);
                     88:                        }
                     89:                }
                     90:                Sgl_leftshift(result,(SGL_P-1) - (src_exponent));
                     91:                if (Sgl_isone_hiddenoverflow(result))
                     92:                        Sgl_set_exponent(result,src_exponent + (SGL_BIAS+1));
                     93:                else Sgl_set_exponent(result,src_exponent + SGL_BIAS);
                     94:        }
                     95:        else {
                     96:                result = src;           /* set sign */
                     97:                Sgl_setzero_exponentmantissa(result);
                     98:                /* check for inexact */
                     99:                if (Sgl_isnotzero_exponentmantissa(src)) {
                    100:                        inexact = TRUE;
                    101:                        /*  round result  */
                    102:                        switch (Rounding_mode()) {
                    103:                        case ROUNDPLUS:
                    104:                             if (Sgl_iszero_sign(src))
                    105:                                Sgl_set_exponent(result,SGL_BIAS);
                    106:                             break;
                    107:                        case ROUNDMINUS:
                    108:                             if (Sgl_isone_sign(src))
                    109:                                Sgl_set_exponent(result,SGL_BIAS);
                    110:                             break;
                    111:                        case ROUNDNEAREST:
                    112:                             if (src_exponent == -1)
                    113:                                if (Sgl_isnotzero_mantissa(src))
                    114:                                   Sgl_set_exponent(result,SGL_BIAS);
                    115:                        }
                    116:                }
                    117:        }
                    118:        *dstptr = result;
                    119:        if (inexact) {
                    120:                if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
                    121:                else Set_inexactflag();
                    122:        }
                    123:        return(NOEXCEPTION);
                    124: }
                    125:
                    126: /*
                    127:  *  Double Floating-point Round to Integer
                    128:  */
                    129:
                    130: /*ARGSUSED*/
                    131: int
                    132: dbl_frnd(srcptr, null, dstptr, status)
                    133:        dbl_floating_point *srcptr, *null, *dstptr;
                    134:        unsigned int *status;
                    135: {
                    136:        register unsigned int srcp1, srcp2, resultp1, resultp2;
                    137:        register int src_exponent;
                    138:        register int inexact = FALSE;
                    139:
                    140:        Dbl_copyfromptr(srcptr,srcp1,srcp2);
                    141:        /*
                    142:         * check source operand for NaN or infinity
                    143:         */
                    144:        if ((src_exponent = Dbl_exponent(srcp1)) == DBL_INFINITY_EXPONENT) {
                    145:                /*
                    146:                 * is signaling NaN?
                    147:                 */
                    148:                if (Dbl_isone_signaling(srcp1)) {
                    149:                        /* trap if INVALIDTRAP enabled */
                    150:                        if (Is_invalidtrap_enabled()) return(INVALIDEXCEPTION);
                    151:                        /* make NaN quiet */
                    152:                        Set_invalidflag();
                    153:                        Dbl_set_quiet(srcp1);
                    154:                }
                    155:                /*
                    156:                 * return quiet NaN or infinity
                    157:                 */
                    158:                Dbl_copytoptr(srcp1,srcp2,dstptr);
                    159:                return(NOEXCEPTION);
                    160:        }
                    161:        /*
                    162:         * Need to round?
                    163:         */
                    164:        if ((src_exponent -= DBL_BIAS) >= DBL_P - 1) {
                    165:                Dbl_copytoptr(srcp1,srcp2,dstptr);
                    166:                return(NOEXCEPTION);
                    167:        }
                    168:        /*
                    169:         * Generate result
                    170:         */
                    171:        if (src_exponent >= 0) {
                    172:                Dbl_clear_exponent_set_hidden(srcp1);
                    173:                resultp1 = srcp1;
                    174:                resultp2 = srcp2;
                    175:                Dbl_rightshift(resultp1,resultp2,(DBL_P-1) - (src_exponent));
                    176:                /* check for inexact */
                    177:                if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
                    178:                        inexact = TRUE;
                    179:                        /*  round result  */
                    180:                        switch (Rounding_mode()) {
                    181:                        case ROUNDPLUS:
                    182:                             if (Dbl_iszero_sign(srcp1))
                    183:                                Dbl_increment(resultp1,resultp2);
                    184:                             break;
                    185:                        case ROUNDMINUS:
                    186:                             if (Dbl_isone_sign(srcp1))
                    187:                                Dbl_increment(resultp1,resultp2);
                    188:                             break;
                    189:                        case ROUNDNEAREST:
                    190:                             if (Dbl_isone_roundbit(srcp1,srcp2,src_exponent))
                    191:                              if (Dbl_isone_stickybit(srcp1,srcp2,src_exponent)
                    192:                                  || (Dbl_isone_lowmantissap2(resultp2)))
                    193:                                        Dbl_increment(resultp1,resultp2);
                    194:                        }
                    195:                }
                    196:                Dbl_leftshift(resultp1,resultp2,(DBL_P-1) - (src_exponent));
                    197:                if (Dbl_isone_hiddenoverflow(resultp1))
                    198:                        Dbl_set_exponent(resultp1,src_exponent + (DBL_BIAS+1));
                    199:                else Dbl_set_exponent(resultp1,src_exponent + DBL_BIAS);
                    200:        }
                    201:        else {
                    202:                resultp1 = srcp1;  /* set sign */
                    203:                Dbl_setzero_exponentmantissa(resultp1,resultp2);
                    204:                /* check for inexact */
                    205:                if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
                    206:                        inexact = TRUE;
                    207:                        /*  round result  */
                    208:                        switch (Rounding_mode()) {
                    209:                        case ROUNDPLUS:
                    210:                             if (Dbl_iszero_sign(srcp1))
                    211:                                Dbl_set_exponent(resultp1,DBL_BIAS);
                    212:                             break;
                    213:                        case ROUNDMINUS:
                    214:                             if (Dbl_isone_sign(srcp1))
                    215:                                Dbl_set_exponent(resultp1,DBL_BIAS);
                    216:                             break;
                    217:                        case ROUNDNEAREST:
                    218:                             if (src_exponent == -1)
                    219:                                if (Dbl_isnotzero_mantissa(srcp1,srcp2))
                    220:                                   Dbl_set_exponent(resultp1,DBL_BIAS);
                    221:                        }
                    222:                }
                    223:        }
                    224:        Dbl_copytoptr(resultp1,resultp2,dstptr);
                    225:        if (inexact) {
                    226:                if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
                    227:                else Set_inexactflag();
                    228:        }
                    229:        return(NOEXCEPTION);
                    230: }
                    231:
                    232: /*ARGSUSED*/
                    233: int
                    234: quad_frnd(srcptr, null, dstptr, status)
                    235:        quad_floating_point *srcptr, *null, *dstptr;
                    236:        unsigned int *status;
                    237: {
                    238:        return(UNIMPLEMENTEDEXCEPTION);
                    239: }

CVSweb