Annotation of sys/arch/hppa/spmath/frnd.c, Revision 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